www.pudn.com > zfxcengine-0.1.0.zip > ceRenderObjectFactory_D3D9.cpp


#include  
#include  
#include "Core/ceDebug.h" 
#include "Core/ceExceptions.h" 
#include "Render/RenderD3D9/ceRenderObjectFactory_D3D9.h" 
#include "Core/ceMemManager.h" 
 
using std::cout; using std::endl; 
namespace ZFXCE { 
	namespace Render { 
		/////////////////////////////////////////////////////////////////////////// 
		ceRenderObjectFactoryD3D9::ceRenderObjectFactoryD3D9(void):m_pD3DDevice(NULL) 
		{ 
			PUSH_FUNCTION; 
		} 
		/////////////////////////////////////////////////////////////////////////// 
		ceRenderObjectFactoryD3D9::ceRenderObjectFactoryD3D9(LPDIRECT3DDEVICE9 D3DDevice):m_pD3DDevice(D3DDevice) 
		{ 
            PUSH_FUNCTION; 
		} 
		/////////////////////////////////////////////////////////////////////////// 
		ceRenderObjectFactoryD3D9::~ceRenderObjectFactoryD3D9(void) 
		{ 
			PUSH_FUNCTION; 
			m_pD3DDevice = NULL; 
            ReleaseAllObjects(); 
		} 
        /////////////////////////////////////////////////////////////////////////// 
        int ceRenderObjectFactoryD3D9::AddObject(void) 
        { 
            PUSH_FUNCTION; 
            int iIndex = -1; 
            if( !m_FreeIndices.empty() ) 
            { 
                iIndex = m_FreeIndices.top(); 
                m_FreeIndices.pop(); 
            } 
            else 
            { 
                iIndex = (int)m_RenderObjects.size(); 
                m_RenderObjects.resize(iIndex+1); 
            } 
            return iIndex; 
        } 
		/////////////////////////////////////////////////////////////////////////// 
		INT ceRenderObjectFactoryD3D9::CreateStaticVertexBuffer(const cePrimitive Primitive, ceVertexDescription& VertexDesc, const FLOAT* pVertices, const UINT uiNumOfVertices) 
		{ 
			PUSH_FUNCTION; 
			assert(m_pD3DDevice != NULL); 
 
            int iIndex = -1; 
 
			ceVertexBufferD3D9* pVB = NULL; 
            pVB = new ceVertexBufferD3D9(m_pD3DDevice); 
			if(!pVB) 
				CE_EXCEPTION("Konnte keinen VB erstellen!", CELS_ERROR); 
 
            pVB->CreateStatic(Primitive, VertexDesc, pVertices, uiNumOfVertices); 
 
      /*      std::pair objectpair(m_mapRenderObjects.size(), pVB); 
			m_mapRenderObjects.insert(objectpair);*/ 
 
            iIndex = AddObject(); 
            m_RenderObjects[iIndex] = pVB; 
 
			return iIndex; 
		} 
		/////////////////////////////////////////////////////////////////////////// 
		INT ceRenderObjectFactoryD3D9::CreateDynamicVertexBuffer(const cePrimitive Primitive, ceVertexDescription& VertexDesc, const FLOAT* pVertices, const UINT uiNumOfVertices) 
		{ 
			PUSH_FUNCTION; 
			assert(m_pD3DDevice != NULL); 
 
            int iIndex = -1; 
 
			ceVertexBufferD3D9* pVB = NULL; 
            pVB = new ceVertexBufferD3D9(m_pD3DDevice); 
			 
			if(!pVB) 
				CE_EXCEPTION("Konnte keinen VertexBuffer erstellen!", CELS_ERROR); 
 
			pVB->CreateDynamic(Primitive, VertexDesc, pVertices, uiNumOfVertices); 
 
		/*	std::pair objectpair(m_mapRenderObjects.size(),  pVB); 
			m_mapRenderObjects.insert(objectpair);*/ 
 
            iIndex = AddObject(); 
            m_RenderObjects[iIndex] = pVB; 
 
			return iIndex; 
		} 
		/////////////////////////////////////////////////////////////////////////// 
		INT ceRenderObjectFactoryD3D9::CreateStaticIndexBuffer(const cePrimitive Primitive, UINT uiNumOfIndices, const WORD *pIndices) 
		{ 
			PUSH_FUNCTION; 
			assert(m_pD3DDevice != NULL); 
 
            int iIndex = -1; 
 
			ceIndexBufferD3D9* pIB = new ceIndexBufferD3D9(m_pD3DDevice); 
 
			pIB->Create(Primitive, FALSE, uiNumOfIndices, pIndices); 
 
            iIndex = AddObject(); 
            m_RenderObjects[iIndex] = pIB; 
 
			return iIndex; 
 
		/*	std::pair objectpair(m_mapRenderObjects.size(), IB); 
			m_mapRenderObjects.insert(objectpair); 
 
			return ( (UINT) m_mapRenderObjects.size()-1);*/ 
		} 
		/////////////////////////////////////////////////////////////////////////// 
		INT ceRenderObjectFactoryD3D9::CreateStaticIndexBuffer(const cePrimitive Primitive, UINT uiNumOfIndices, const UINT *pIndices) 
		{ 
			PUSH_FUNCTION; 
			assert(m_pD3DDevice != NULL); 
 
            int iIndex = -1; 
 
			ceIndexBufferD3D9* pIB = new ceIndexBufferD3D9(m_pD3DDevice); 
 
			pIB->Create(Primitive, FALSE, uiNumOfIndices, pIndices); 
 
            iIndex = AddObject(); 
            m_RenderObjects[iIndex] = pIB; 
 
			return iIndex; 
 
		/*	std::pair objectpair(m_mapRenderObjects.size(), pIB); 
			m_mapRenderObjects.insert(objectpair); 
 
			return ( (UINT) m_mapRenderObjects.size()-1);*/ 
		} 
		/////////////////////////////////////////////////////////////////////////// 
		void ceRenderObjectFactoryD3D9::ReleaseAllObjects(void) 
		{ 
            RenderObjectIterator it = m_RenderObjects.begin(); 
			for(;it != m_RenderObjects.end(); it++) 
			{ 
                delete (*it); 
			} 
			m_RenderObjects.clear(); 
 
            while (!m_FreeIndices.empty()) 
                m_FreeIndices.pop(); 
 
		/*	RenderObjectMapIterator It = m_mapRenderObjects.begin(); 
			for(;It != m_mapRenderObjects.end(); It++) 
			{ 
				delete It->second; 
				m_mapRenderObjects.erase(It); 
			} 
			m_mapRenderObjects.clear();*/ 
		} 
		/////////////////////////////////////////////////////////////////////////// 
		void ceRenderObjectFactoryD3D9::ReleaseObject(INT ID) 
		{ 
            if(0 <= ID && ID < (int)m_RenderObjects.size()) 
			{ 
                delete m_RenderObjects[ID]; 
                m_FreeIndices.push(ID); 
			} 
		} 
		/////////////////////////////////////////////////////////////////////////// 
		ceRenderObject* ceRenderObjectFactoryD3D9::GetRenderObject(INT ID) 
		{ 
			assert(0 <= ID && ID < (int)m_RenderObjects.size()); 
 
			return m_RenderObjects[ID]; 
		} 
	}	// namespace Render 
}	// namespace ZFXCE