//======================================================================== // Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved. // // File: AllWrappers.cpp // // Description: Implementation for AllWrappers class. // // History: Implemented --Devin [4/24/2002] //======================================================================== //======================================== // System Includes //======================================== //======================================== // Project Includes //======================================== #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //************************************************************************ // // Global Data, Local Data, Local Classes // //************************************************************************ AllWrappers* AllWrappers::mspInstance = NULL; static const int NUM_GLOBAL_ENTITIES = 32; //************************************************************************ // // Public Member Functions : AllWrappers Interface // //************************************************************************ //======================================================================== // AllWrappers::CreateInstance //======================================================================== // // Description: // // Parameters: None. // // Return: None. // // Constraints: None. // //======================================================================== AllWrappers* AllWrappers::CreateInstance() { MEMTRACK_PUSH_GROUP( "AllWrappers" ); rAssert(mspInstance == NULL); mspInstance = new(GMA_PERSISTENT) AllWrappers; MEMTRACK_POP_GROUP( "AllWrappers" ); return mspInstance; } //======================================================================== // AllWrappers::GetInstance //======================================================================== // // Description: // // Parameters: None. // // Return: None. // // Constraints: None. // //======================================================================== AllWrappers* AllWrappers::GetInstance() { rAssert(mspInstance != NULL); return mspInstance; } //======================================================================== // AllWrappers::DestroyInstance //======================================================================== // // Description: // // Parameters: None. // // Return: None. // // Constraints: None. // //======================================================================== void AllWrappers::DestroyInstance() { rAssert(mspInstance != NULL); delete mspInstance; } //======================================================================== // AllWrappers::mLoader( int iIndex ) //======================================================================== // // Description: Get iIndexth's element // // Parameters: None. // // Return: None. // // Constraints: None. // //======================================================================== IWrappedLoader& AllWrappers::mLoader( int iIndex ) { rAssert( iIndex < msNumWrappers); return *(mpLoaders[iIndex]); } //======================================================================== // AllWrappers::mpLoader( int iIndex ) //======================================================================== // // Description: Get iIndexth's element's ptr // // Parameters: None. // // Return: None. // // Constraints: None. // //======================================================================== IWrappedLoader* AllWrappers::mpLoader( int iIndex ) { rAssert( iIndex < msNumWrappers); return (mpLoaders[iIndex]); } //************************************************************************ // // Protected Member Functions : AllWrappers // //************************************************************************ void AllWrappers::CoupleAllLoaders() { MEMTRACK_PUSH_GROUP( "AllWrappers" ); IWrappedLoader* pWL = NULL; for( int i=msNumWrappers-1; i>-1; i-- ) { rAssert( mpLoaders[i] == NULL ); switch( i ) { case msGeometry: { pWL = new(GMA_PERSISTENT) GeometryWrappedLoader(); ((GeometryWrappedLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msStaticPhys: { pWL = new(GMA_PERSISTENT) StaticPhysLoader(); ((StaticPhysLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msStaticEntity: { pWL = new(GMA_PERSISTENT) StaticEntityLoader(); ((StaticEntityLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msTreeDSG: { pWL = new(GMA_PERSISTENT) TreeDSGLoader(); ((TreeDSGLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msFenceEntity: { pWL = new(GMA_PERSISTENT) FenceLoader(); ((FenceLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msIntersectDSG: { pWL = new(GMA_PERSISTENT) IntersectLoader(); ((IntersectLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msAnimCollEntity: { pWL = new(GMA_PERSISTENT) AnimCollLoader(); ((AnimCollLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msDynaPhys: { pWL = new(GMA_PERSISTENT) DynaPhysLoader(); ((DynaPhysLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msInstStatEntity: { pWL = new(GMA_PERSISTENT) InstStatEntityLoader(); ((InstStatEntityLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msInstStatPhys: { pWL = new(GMA_PERSISTENT) InstStatPhysLoader(); ((InstStatPhysLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msLocator: { pWL = new(GMA_PERSISTENT) LocatorLoader(); ((LocatorLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msWorldSphere: { pWL = new(GMA_PERSISTENT) WorldSphereLoader(); ((WorldSphereLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msRoadSegment: { pWL = new(GMA_PERSISTENT) RoadLoader(); ((RoadLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msPathSegment: { pWL = new(GMA_PERSISTENT) PathLoader(); ((PathLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msBillboard: { pWL = new(GMA_PERSISTENT) BillboardWrappedLoader(); ((BillboardWrappedLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msInstParticleSystem: { pWL = new (GMA_PERSISTENT) InstParticleSystemLoader(); ((InstParticleSystemLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msBreakableObject: { pWL = new (GMA_PERSISTENT) BreakableObjectLoader(); ((BreakableObjectLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msAnimEntity: { pWL = new (GMA_PERSISTENT) AnimDSGLoader(); ((AnimDSGLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msLensFlare: { pWL = new(GMA_PERSISTENT) LensFlareLoader(); ((LensFlareLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msAnimDynaPhys: { pWL = new(GMA_PERSISTENT) AnimDynaPhysLoader(); ((AnimDynaPhysLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; case msAnimDynaPhysWrapper: { pWL = new (GMA_PERSISTENT) AnimDynaPhysWrapperLoader(); ((AnimDynaPhysWrapperLoader*)pWL)->AddRef(); mpLoaders[i] = pWL; } break; default: rAssert(false); break; } } MEMTRACK_POP_GROUP( "AllWrappers" ); } void AllWrappers::AddGlobalEntity(tDrawable* Entity) { if( !Entity ) { return; } rAssert(mNumGlobalEntities < NUM_GLOBAL_ENTITIES); rAssert(GetGlobalEntity(Entity->GetUID()) == 0); mpGlobalEntities[mNumGlobalEntities] = Entity; mpGlobalEntities[mNumGlobalEntities]->AddRef(); ++mNumGlobalEntities; } tDrawable* AllWrappers::GetGlobalEntity(tUID EntityID) const { for(int i = 0; i < mNumGlobalEntities; ++i) { if(mpGlobalEntities[i]->GetUID() == EntityID ) { return mpGlobalEntities[i]; } } return 0; } void AllWrappers::ClearGlobalEntities(void) { for(int i = 0; i < mNumGlobalEntities; ++i) { tRefCounted::Release(mpGlobalEntities[i]); } mNumGlobalEntities = 0; } //************************************************************************ // // Private Member Functions : AllWrappers // //************************************************************************ //======================================================================== // AllWrappers::AllWrappers //======================================================================== // // Description: // // Parameters: None. // // Return: None. // // Constraints: None. // //======================================================================== AllWrappers::AllWrappers() { for( int i=msNumWrappers-1; i>-1; i--) { mpLoaders[i] = NULL; } CoupleAllLoaders(); mpGlobalEntities = new tDrawable* [NUM_GLOBAL_ENTITIES]; rAssert(mpGlobalEntities); mNumGlobalEntities = 0; } //======================================================================== // AllWrappers::~AllWrappers() //======================================================================== // // Description: // // Parameters: None. // // Return: None. // // Constraints: None. // //======================================================================== AllWrappers::~AllWrappers() { // this codeblock does not apply anymore because the inheritance tree // was changed.. leaving it in just in case. //for( int i=msNumWrappers-1; i>-1; i--) //{ // if( mpLoaders[i] != NULL ) // { // ( static_cast(mpLoaders[i]) )->Release(); // mpLoaders[i] = NULL; // } //} ClearGlobalEntities(); delete mpGlobalEntities; mpGlobalEntities = 0; }