From: <vo...@us...> - 2009-01-13 14:21:19
|
Revision: 1105 http://opde.svn.sourceforge.net/opde/?rev=1105&view=rev Author: volca Date: 2009-01-13 14:21:05 +0000 (Tue, 13 Jan 2009) Log Message: ----------- MovableObject out of DrawSheet (can be attached to scene nodes now) Modified Paths: -------------- trunk/src/services/draw/DrawBuffer.cpp trunk/src/services/draw/DrawBuffer.h trunk/src/services/draw/DrawSheet.cpp trunk/src/services/draw/DrawSheet.h Modified: trunk/src/services/draw/DrawBuffer.cpp =================================================================== --- trunk/src/services/draw/DrawBuffer.cpp 2009-01-13 09:52:06 UTC (rev 1104) +++ trunk/src/services/draw/DrawBuffer.cpp 2009-01-13 14:21:05 UTC (rev 1105) @@ -43,23 +43,32 @@ mIsUpdating(false), mVertexData(NULL), mIndexData(NULL), - mQuadCount(0) { - mMaterial = Ogre::MaterialManager::getSingleton().create(materialName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); + mQuadCount(0), + mRenderQueueID(Ogre::RENDER_QUEUE_OVERLAY) { - // get the autocreated pass - Ogre::Pass* pass = mMaterial->getTechnique(0)->getPass(0); + // See if the material specified already exists or not. This allows the user to customize the behavior (Animated materials for example) - // order of rendering will influence the result - pass->setDepthCheckEnabled(true); - pass->setDepthWriteEnabled(true); - pass->setLightingEnabled(false); - pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA); + if (Ogre::MaterialManager::getSingleton().resourceExists(materialName)) { + mMaterial = Ogre::MaterialManager::getSingleton().getByName(materialName); + } else { + mMaterial = Ogre::MaterialManager::getSingleton().create(materialName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); + + // get the autocreated pass + Ogre::Pass* pass = mMaterial->getTechnique(0)->getPass(0); + + // order of rendering will influence the result + pass->setDepthCheckEnabled(true); + pass->setDepthWriteEnabled(true); + pass->setLightingEnabled(false); + pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA); + } }; //------------------------------------------------------ DrawBuffer::~DrawBuffer() { // destroy the material again // Ogre::MaterialManager::getSingleton().remove(mMaterial); + destroyBuffers(); }; //------------------------------------------------------ Modified: trunk/src/services/draw/DrawBuffer.h =================================================================== --- trunk/src/services/draw/DrawBuffer.h 2009-01-13 09:52:06 UTC (rev 1104) +++ trunk/src/services/draw/DrawBuffer.h 2009-01-13 14:21:05 UTC (rev 1105) @@ -30,13 +30,16 @@ #include <OgreRenderable.h> #include <OgreMaterial.h> +#include <OgreMovableObject.h> namespace Opde { /** A single renderable representing all drawn quads for particular rendered settings combination (DrawSheet stores N of these for N materials) */ class DrawBuffer : public Ogre::Renderable { public: - /// Constructor + /** Constructor + * @param materialName The name of the material to use for rendering. The constructor will look for the specified material and if it does not find it, it will create a new one + */ DrawBuffer(const Ogre::String& materialName); /// Destructor @@ -70,6 +73,9 @@ Ogre::Real getSquaredViewDepth(const Ogre::Camera*) const; const Ogre::LightList& getLights() const; + inline Ogre::uint8 getRenderQueueID() const { return mRenderQueueID; }; + + inline bool isDirty() { return mIsDirty; }; protected: /// (re)builds the VBO according to the mQuadList void buildBuffer(); @@ -89,6 +95,8 @@ Ogre::IndexData* mIndexData; size_t mQuadCount; + + Ogre::uint8 mRenderQueueID; }; /// Draw buffer map for all render op. combinations (currently, we index by image name, we could reindex with image ID later for performance) Modified: trunk/src/services/draw/DrawSheet.cpp =================================================================== --- trunk/src/services/draw/DrawSheet.cpp 2009-01-13 09:52:06 UTC (rev 1104) +++ trunk/src/services/draw/DrawSheet.cpp 2009-01-13 14:21:05 UTC (rev 1105) @@ -23,6 +23,8 @@ #include "DrawSheet.h" +#include <OgreRenderQueue.h> + namespace Opde { /*----------------------------------------------------*/ @@ -120,4 +122,45 @@ it->second->update(); } } + + //------------------------------------------------------ + const Ogre::String& DrawSheet::getMovableType() const { + static Ogre::String type = "DrawSheet"; + return type; + }; + + //------------------------------------------------------ + const Ogre::AxisAlignedBox& DrawSheet::getBoundingBox() const { + static Ogre::AxisAlignedBox box; + box.setInfinite(); + + return box; + }; + + //------------------------------------------------------ + Ogre::Real DrawSheet::getBoundingRadius() const { + return 1.0; // TODO: What radius is appropriate? + }; + + //------------------------------------------------------ + void DrawSheet::visitRenderables(Ogre::Renderable::Visitor* vis, bool debugRenderables) { + // visit all the renderables - all drawbuffers + for (DrawBufferMap::iterator it = mDrawBufferMap.begin(); it != mDrawBufferMap.end(); ++it) { + vis->visit(it->second, 0, debugRenderables); + } + }; + + //------------------------------------------------------ + void DrawSheet::_updateRenderQueue(Ogre::RenderQueue* queue) { + // do this for all the Buffers + for (DrawBufferMap::iterator it = mDrawBufferMap.begin(); it != mDrawBufferMap.end(); ++it) { + DrawBuffer* db = it->second; + + // could be done in Renderable::preRender hidden from the eyes + if (db->isDirty()) + db->update(); + + queue->addRenderable(db, db->getRenderQueueID(), OGRE_RENDERABLE_DEFAULT_PRIORITY); + } + }; }; Modified: trunk/src/services/draw/DrawSheet.h =================================================================== --- trunk/src/services/draw/DrawSheet.h 2009-01-13 09:52:06 UTC (rev 1104) +++ trunk/src/services/draw/DrawSheet.h 2009-01-13 14:21:05 UTC (rev 1105) @@ -33,7 +33,7 @@ /** A 2D rendering sheet. Represents one visible screen. * Stores rendering operations, can queue itself for rendering to ogre. * Uses DrawBuffer for render op. storage */ - class DrawSheet { + class DrawSheet : public Ogre::MovableObject { public: /// Constructor DrawSheet(); @@ -59,12 +59,20 @@ /// Will remove all Buffers with zero Draw operations void purge(); + //--- MovableObject mandatory --- + const Ogre::String& getMovableType() const; + const Ogre::AxisAlignedBox& getBoundingBox() const; + Ogre::Real getBoundingRadius() const; + void visitRenderables(Ogre::Renderable::Visitor* vis, bool debugRenderables); + protected: /// Called to ensure all the DrawBuffers are current and reflect the requested state void rebuildBuffers(); DrawBuffer* getBufferForOperation(DrawOperation* drawOp, bool autoCreate = false); + void _updateRenderQueue(Ogre::RenderQueue* queue); + /// All draw buffers for the sheet as map DrawBufferMap mDrawBufferMap; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |