From: <vo...@us...> - 2008-05-28 15:01:46
|
Revision: 748 http://opde.svn.sourceforge.net/opde/?rev=748&view=rev Author: volca Date: 2008-05-28 08:01:54 -0700 (Wed, 28 May 2008) Log Message: ----------- DarkGeometry handling routines Modified Paths: -------------- trunk/src/scenemanager/DarkSceneManager.cpp trunk/src/scenemanager/DarkSceneManager.h Modified: trunk/src/scenemanager/DarkSceneManager.cpp =================================================================== --- trunk/src/scenemanager/DarkSceneManager.cpp 2008-05-28 15:01:22 UTC (rev 747) +++ trunk/src/scenemanager/DarkSceneManager.cpp 2008-05-28 15:01:54 UTC (rev 748) @@ -28,6 +28,7 @@ #include "DarkCamera.h" #include "DarkPortal.h" #include "DarkSceneNode.h" +#include "DarkGeometry.h" #include <OgreRoot.h> #include <OgreEntity.h> @@ -35,7 +36,7 @@ namespace Ogre { // ---------------------------------------------------------------------- - DarkSceneManager::DarkSceneManager(const String& instanceName) : SceneManager(instanceName), mFrameNum(1) { + DarkSceneManager::DarkSceneManager(const String& instanceName) : SceneManager(instanceName), mFrameNum(1), mActiveGeometry(NULL) { mBspTree = new BspTree(this); mDarkLightFactory = new DarkLightFactory(); @@ -75,6 +76,9 @@ // clear the BSP tree mBspTree->clear(); + + // clear all the geometries + destroyAllGeometries(); SceneManager::clearScene(); } @@ -255,6 +259,11 @@ } } } + + if (mActiveGeometry) { + mActiveGeometry->updateFromCamera(static_cast<DarkCamera*>(cam)); + mActiveGeometry->queueForRendering(mRenderQueue); + } } //----------------------------------------------------------------------- @@ -300,6 +309,20 @@ void DarkSceneManager::_queueLightForUpdate(Light* l) { mLightsForUpdate.insert(static_cast<DarkLight*>(l)); } + + //----------------------------------------------------------------------- + void DarkSceneManager::destroyAllGeometries(void) { + DarkGeometryMap::iterator it = mDarkGeometryMap.begin(); + + while (it != mDarkGeometryMap.end()) { + DarkGeometryMap::iterator it2 = it++; + + DarkGeometry* g = it2->second; + mDarkGeometryMap.erase(it2); + + delete g; + } + } //----------------------------------------------------------------------- @@ -506,7 +529,56 @@ } //----------------------------------------------------------------------- + DarkGeometry *DarkSceneManager::createGeometry(const String& geomName) { + DarkGeometryMap::iterator it = mDarkGeometryMap.find(geomName); + + if (it != mDarkGeometryMap.end()) { + return it->second; + } + + DarkGeometry* geom = new DarkGeometry(geomName, RENDER_QUEUE_WORLD_GEOMETRY_1); + + mDarkGeometryMap.insert(make_pair(geomName, geom)); + + return geom; + } + //----------------------------------------------------------------------- + void DarkSceneManager::destroyGeometry(const String& name) { + DarkGeometryMap::iterator it = mDarkGeometryMap.find(name); + + if (it != mDarkGeometryMap.end()) { + DarkGeometry* g = it->second; + mDarkGeometryMap.erase(it); + delete g; + } + } + + + //----------------------------------------------------------------------- + DarkGeometry *DarkSceneManager::getGeometry(const String& name) { + DarkGeometryMap::iterator it = mDarkGeometryMap.find(name); + + if (it != mDarkGeometryMap.end()) { + return it->second; + } + + // TODO: The damned NULL/Exception throw dilema all over again + return NULL; + } + + //----------------------------------------------------------------------- + void DarkSceneManager::setActiveGeometry(const String& name) { + mActiveGeometry = getGeometry(name); + } + + //----------------------------------------------------------------------- + void DarkSceneManager::setActiveGeometry(DarkGeometry* geom) { + mActiveGeometry = geom; + } + + //----------------------------------------------------------------------- + //----------------------------------------------------------------------- const String DarkSceneManagerFactory::FACTORY_TYPE_NAME = "DarkSceneManager"; //----------------------------------------------------------------------- void DarkSceneManagerFactory::initMetaData(void) const { Modified: trunk/src/scenemanager/DarkSceneManager.h =================================================================== --- trunk/src/scenemanager/DarkSceneManager.h 2008-05-28 15:01:22 UTC (rev 747) +++ trunk/src/scenemanager/DarkSceneManager.h 2008-05-28 15:01:54 UTC (rev 748) @@ -139,6 +139,22 @@ /** Overrided entity creation. Sets BspTree as the entity listener - this accelerates the population of the light lists */ virtual Entity *createEntity(const String &entityName, const String &meshName); + + // TODO: The DarkGeometry should probably have a factory + /** Creates an instance of static geometry */ + DarkGeometry *createGeometry(const String& geomName); + + /** destroys an instance of static geometry */ + void destroyGeometry(const String& name); + + /** retrieves a pointer to existing static geometry */ + DarkGeometry *getGeometry(const String& name); + + /** sets a geometry that will be active and rendered */ + void setActiveGeometry(const String& name); + + /** sets the active geometry (NULL means no geom) */ + void setActiveGeometry(DarkGeometry* g); protected: /// BSP Tree getter @@ -150,6 +166,9 @@ /// Internal method, which really queues the light void _queueLightForUpdate(Light* l); + /// destroys all static geometries + void destroyAllGeometries(void); + /// The BSP tree currently used BspTree* mBspTree; @@ -172,6 +191,13 @@ /** Factory for DarkLight objects */ DarkLightFactory *mDarkLightFactory; + + /** Map of dark geometry objects */ + typedef std::map<String, DarkGeometry*> DarkGeometryMap; + + DarkGeometryMap mDarkGeometryMap; + + DarkGeometry* mActiveGeometry; }; /// Factory for DarkSceneManager This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |