sceneTracker.cpp
Engine/source/scene/sceneTracker.cpp
Detailed Description
1 2//----------------------------------------------------------------------------- 3// Copyright (c) 2012 GarageGames, LLC 4// 5// Permission is hereby granted, free of charge, to any person obtaining a copy 6// of this software and associated documentation files (the "Software"), to 7// deal in the Software without restriction, including without limitation the 8// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 9// sell copies of the Software, and to permit persons to whom the Software is 10// furnished to do so, subject to the following conditions: 11// 12// The above copyright notice and this permission notice shall be included in 13// all copies or substantial portions of the Software. 14// 15// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21// IN THE SOFTWARE. 22//----------------------------------------------------------------------------- 23 24#include "scene/sceneTracker.h" 25 26 27//============================================================================= 28// SceneObjectLink. 29//============================================================================= 30 31//----------------------------------------------------------------------------- 32 33SceneObjectLink::SceneObjectLink( SceneTracker* tracker, SceneObject* object ) 34 : mObject( object ), 35 mTracker( tracker ), 36 mNextLink( NULL ), 37 mPrevLink( NULL ) 38{ 39 if( object ) 40 { 41 mNextLink = object->mSceneObjectLinks; 42 if( mNextLink ) 43 mNextLink->mPrevLink = this; 44 object->mSceneObjectLinks = this; 45 } 46} 47 48//----------------------------------------------------------------------------- 49 50SceneObjectLink::~SceneObjectLink() 51{ 52 if( mObject ) 53 { 54 // Unlink from SceneObject's tracker list. 55 56 if( mNextLink ) 57 mNextLink->mPrevLink = mPrevLink; 58 if( mPrevLink ) 59 mPrevLink->mNextLink = mNextLink; 60 else 61 mObject->mSceneObjectLinks = mNextLink; 62 } 63} 64 65//----------------------------------------------------------------------------- 66 67void SceneObjectLink::update() 68{ 69 getTracker()->updateObject( this ); 70} 71 72//----------------------------------------------------------------------------- 73 74SceneObjectLink* SceneObjectLink::getLinkForTracker( SceneTracker* tracker, SceneObject* fromObject ) 75{ 76 for( SceneObjectLink* link = fromObject->mSceneObjectLinks; link != NULL; link = link->getNextLink() ) 77 if( link->getTracker() == tracker ) 78 return link; 79 80 return NULL; 81} 82 83//============================================================================= 84// SceneObjectLink. 85//============================================================================= 86 87//----------------------------------------------------------------------------- 88 89SceneTracker::SceneTracker( bool isClientTracker, U32 typeMask ) 90 : mIsClientTracker( isClientTracker ), 91 mObjectTypeMask( typeMask ) 92{ 93 // Hook up to SceneObject add/remove notifications. 94 95 SceneObject::smSceneObjectAdd.notify( this, &SceneTracker::registerObject ); 96 SceneObject::smSceneObjectRemove.notify( this, &SceneTracker::unregisterObject ); 97} 98 99//----------------------------------------------------------------------------- 100 101SceneTracker::~SceneTracker() 102{ 103 SceneObject::smSceneObjectAdd.remove( this, &SceneTracker::registerObject ); 104 SceneObject::smSceneObjectRemove.remove( this, &SceneTracker::unregisterObject ); 105} 106 107//----------------------------------------------------------------------------- 108 109void SceneTracker::init() 110{ 111 // Register existing scene graph objects. 112 113 SceneContainer* container; 114 if( isClientTracker() ) 115 container = &gClientContainer; 116 else 117 container = &gServerContainer; 118 119 container->findObjects( getObjectTypeMask(), 120 ( SceneContainer::FindCallback ) &_containerFindCallback, 121 this ); 122} 123 124//----------------------------------------------------------------------------- 125 126void SceneTracker::_containerFindCallback( SceneObject* object, SceneTracker* tracker ) 127{ 128 tracker->registerObject( object ); 129} 130