From 03a5a6f4e09876b6e95563d1542de093c73976c6 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 7 Mar 2018 08:41:01 -0800 Subject: [PATCH] more correct proxy classification for multiple views --- libraries/workload/src/workload/Space.cpp | 27 ++++++----------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/libraries/workload/src/workload/Space.cpp b/libraries/workload/src/workload/Space.cpp index de3da5991e..7a9f90c5b8 100644 --- a/libraries/workload/src/workload/Space.cpp +++ b/libraries/workload/src/workload/Space.cpp @@ -62,10 +62,9 @@ void Space::copyViews(std::vector& copy) const { copy = _views; } -// TODO?: move this to an algorithm/job? void Space::categorizeAndGetChanges(std::vector& changes) { - uint32_t numProxies = (uint32_t)_proxies.size(); - uint32_t numViews = (uint32_t)_views.size(); + uint32_t numProxies = _proxies.size(); + uint32_t numViews = _views.size(); for (uint32_t i = 0; i < numProxies; ++i) { Proxy& proxy = _proxies[i]; if (proxy.region < Region::INVALID) { @@ -74,21 +73,11 @@ void Space::categorizeAndGetChanges(std::vector& changes) { uint8_t region = Region::UNKNOWN; for (uint32_t j = 0; j < numViews; ++j) { auto& view = _views[j]; - - glm::vec3 distance2(glm::distance2(proxyCenter, glm::vec3(view.regions[0])), glm::distance2(proxyCenter, glm::vec3(view.regions[1])), glm::distance2(proxyCenter, glm::vec3(view.regions[2]))); - glm::vec3 regionRadii2(view.regions[0].w + proxyRadius, view.regions[1].w + proxyRadius, view.regions[2].w + proxyRadius); - regionRadii2 *= regionRadii2; - auto touchTests = glm::lessThanEqual(distance2, regionRadii2); - - if (glm::any(touchTests)) { - if (touchTests.x) { - region = Region::R1; - break; - } else if (touchTests.y) { - region = Region::R2; - break; - } else { - region = Region::R3; + // for each 'view' we need only increment 'k' below the current value of 'region' + for (uint8_t k = 0; k < region; ++k) { + float touchDistance = proxyRadius + view.regions[k].w; + if (distance2(proxyCenter, glm::vec3(view.regions[k])) < touchDistance * touchDistance) { + region = k; break; } } @@ -124,10 +113,8 @@ void Space::deleteProxy(int32_t proxyId) { } uint32_t Space::copyProxyValues(Proxy* proxies, uint32_t numDestProxies) const { - auto numCopied = std::min(numDestProxies, (uint32_t)_proxies.size()); memcpy(proxies, _proxies.data(), numCopied * sizeof(Proxy)); - return numCopied; }