diff --git a/voxel-server/src/VoxelAgentData.cpp b/voxel-server/src/VoxelAgentData.cpp index 32526be383..07bf2a6593 100644 --- a/voxel-server/src/VoxelAgentData.cpp +++ b/voxel-server/src/VoxelAgentData.cpp @@ -50,3 +50,24 @@ VoxelAgentData::VoxelAgentData(const VoxelAgentData &otherAgentData) { VoxelAgentData* VoxelAgentData::clone() const { return new VoxelAgentData(*this); } + +void VoxelAgentData::updateViewFrustum() { + // save our currentViewFrustum into our lastKnownViewFrustum + lastKnownViewFrustum = currentViewFrustum; + + // get position and orientation details from the camera + currentViewFrustum.setPosition(getCameraPosition()); + currentViewFrustum.setOrientation(getCameraDirection(), getCameraUp(), getCameraRight()); + + // Also make sure it's got the correct lens details from the camera + currentViewFrustum.setFieldOfView(getCameraFov()); + currentViewFrustum.setAspectRatio(getCameraAspectRatio()); + currentViewFrustum.setNearClip(getCameraNearClip()); + currentViewFrustum.setFarClip(getCameraFarClip()); + + // if there has been a change, then recalculate + if (!lastKnownViewFrustum.matches(currentViewFrustum)) { + currentViewFrustum.calculate(); + } +} + diff --git a/voxel-server/src/VoxelAgentData.h b/voxel-server/src/VoxelAgentData.h index 74a402bb78..ee8b2dd660 100644 --- a/voxel-server/src/VoxelAgentData.h +++ b/voxel-server/src/VoxelAgentData.h @@ -40,6 +40,12 @@ public: void setMaxLevelReached(int maxLevelReached) { _maxLevelReachedInLastSearch = maxLevelReached; } VoxelNodeBag nodeBag; + + ViewFrustum currentViewFrustum; + ViewFrustum lastKnownViewFrustum; + + void updateViewFrustum(); + private: unsigned char* _voxelPacket; unsigned char* _voxelPacketAt; diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 29b211e44f..76941d9bc2 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -109,8 +109,6 @@ void resInVoxelDistributor(AgentList* agentList, AgentList::iterator& agent, VoxelAgentData* agentData, ViewFrustum& viewFrustum) { - - printf("resInVoxelDistributor()\n"); bool searchReset = false; int searchLoops = 0; int searchLevelWas = agentData->getMaxSearchLevel(); @@ -228,9 +226,6 @@ void deepestLevelVoxelDistributor(AgentList* agentList, AgentList::iterator& agent, VoxelAgentData* agentData, ViewFrustum& viewFrustum) { - - printf("deepestLevelVoxelDistributor()\n"); - int maxLevelReached = 0; double start = usecTimestampNow(); if (agentData->nodeBag.isEmpty()) { @@ -340,23 +335,12 @@ void *distributeVoxelsToListeners(void *args) { // Sometimes the agent data has not yet been linked, in which case we can't really do anything if (agentData) { - ViewFrustum viewFrustum; - // get position and orientation details from the camera - viewFrustum.setPosition(agentData->getCameraPosition()); - viewFrustum.setOrientation(agentData->getCameraDirection(), agentData->getCameraUp(), agentData->getCameraRight()); - - // Also make sure it's got the correct lens details from the camera - viewFrustum.setFieldOfView(agentData->getCameraFov()); - viewFrustum.setAspectRatio(agentData->getCameraAspectRatio()); - viewFrustum.setNearClip(agentData->getCameraNearClip()); - viewFrustum.setFarClip(agentData->getCameraFarClip()); - - viewFrustum.calculate(); + agentData->updateViewFrustum(); if (agentData->getWantResIn()) { - resInVoxelDistributor(agentList, agent, agentData, viewFrustum); + resInVoxelDistributor(agentList, agent, agentData, agentData->currentViewFrustum); } else { - deepestLevelVoxelDistributor(agentList, agent, agentData, viewFrustum); + deepestLevelVoxelDistributor(agentList, agent, agentData, agentData->currentViewFrustum); } } }