move view frustum management to VoxelAgentData class

This commit is contained in:
ZappoMan 2013-05-13 15:40:27 -07:00
parent 12a5ab6ea2
commit 02d0dbbfba
3 changed files with 30 additions and 19 deletions

View file

@ -50,3 +50,24 @@ VoxelAgentData::VoxelAgentData(const VoxelAgentData &otherAgentData) {
VoxelAgentData* VoxelAgentData::clone() const { VoxelAgentData* VoxelAgentData::clone() const {
return new VoxelAgentData(*this); 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();
}
}

View file

@ -40,6 +40,12 @@ public:
void setMaxLevelReached(int maxLevelReached) { _maxLevelReachedInLastSearch = maxLevelReached; } void setMaxLevelReached(int maxLevelReached) { _maxLevelReachedInLastSearch = maxLevelReached; }
VoxelNodeBag nodeBag; VoxelNodeBag nodeBag;
ViewFrustum currentViewFrustum;
ViewFrustum lastKnownViewFrustum;
void updateViewFrustum();
private: private:
unsigned char* _voxelPacket; unsigned char* _voxelPacket;
unsigned char* _voxelPacketAt; unsigned char* _voxelPacketAt;

View file

@ -109,8 +109,6 @@ void resInVoxelDistributor(AgentList* agentList,
AgentList::iterator& agent, AgentList::iterator& agent,
VoxelAgentData* agentData, VoxelAgentData* agentData,
ViewFrustum& viewFrustum) { ViewFrustum& viewFrustum) {
printf("resInVoxelDistributor()\n");
bool searchReset = false; bool searchReset = false;
int searchLoops = 0; int searchLoops = 0;
int searchLevelWas = agentData->getMaxSearchLevel(); int searchLevelWas = agentData->getMaxSearchLevel();
@ -228,9 +226,6 @@ void deepestLevelVoxelDistributor(AgentList* agentList,
AgentList::iterator& agent, AgentList::iterator& agent,
VoxelAgentData* agentData, VoxelAgentData* agentData,
ViewFrustum& viewFrustum) { ViewFrustum& viewFrustum) {
printf("deepestLevelVoxelDistributor()\n");
int maxLevelReached = 0; int maxLevelReached = 0;
double start = usecTimestampNow(); double start = usecTimestampNow();
if (agentData->nodeBag.isEmpty()) { 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 // Sometimes the agent data has not yet been linked, in which case we can't really do anything
if (agentData) { if (agentData) {
ViewFrustum viewFrustum; agentData->updateViewFrustum();
// 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();
if (agentData->getWantResIn()) { if (agentData->getWantResIn()) {
resInVoxelDistributor(agentList, agent, agentData, viewFrustum); resInVoxelDistributor(agentList, agent, agentData, agentData->currentViewFrustum);
} else { } else {
deepestLevelVoxelDistributor(agentList, agent, agentData, viewFrustum); deepestLevelVoxelDistributor(agentList, agent, agentData, agentData->currentViewFrustum);
} }
} }
} }