#pragma once #pragma warning( disable : 4786 ) #include "../../include/Caldron.h" namespace Caldron { namespace Scene { class CBaseMesh { public: CBaseMesh() { m_nLockCount = 0; } virtual ~CBaseMesh() { // m_nLockCount °¡ 0ÀÌ ¾Æ´Ò °æ¿ì °æ°í ¸Þ½ÃÁö¸¦ ¶ç¿öÁÙ ¼ö ÀÖ´Ù. } void Lock() { // thread safe code ÇÊ¿äÇÒÁöµµ? ++m_nLockCount; } void Unlock() { // thread safe code ÇÊ¿äÇÒÁöµµ? if( m_nLockCount > 0 ) { // À½¼ö lock count ¿¡ ´ëÇÑ °æ°í ¸Þ½ÃÁö Ãâ·ÂÇÒ¼ö ÀÖÀ»µí --m_nLockCount; } } bool IsLocked() { return (m_nLockCount>0); } // VB ·Î vertex ³»¿ë upload ½Ã »ç¿ë virtual void UploadVertexData( void* p ) = 0; // IB ·Î index ³»¿ë upload ½Ã »ç¿ë virtual void UploadIndexData( void* p ) = 0; // virtual int GetVertexCount() = 0; virtual int GetIndexCount() = 0; virtual int GetVertexSize() = 0; virtual DWORD GetFVF() = 0; bool IsIndexed() { return m_bIndexed; } protected: int m_nLockCount; bool m_bIndexed; }; template class CMesh : public CBaseMesh { public: CMesh() { } ~CMesh() { } // VB ·Î vertex ³»¿ë upload ½Ã »ç¿ë void UploadVertexData( void* p ) { if( 0 == m_vecVertexData.size() ) { return; } MoveMemory( p, &(m_vecVertexData[0]), sizeof(_T) * m_vecVertexData.size() ); } // IB ·Î index ³»¿ë upload ½Ã »ç¿ë void UploadIndexData( void* p ) { if( 0 == m_vecIndexData.size() ) { return; } MoveMemory( p, &(m_vecIndexData[0]), sizeof(_T) * m_vecIndexData.size() ); } // int GetVertexCount() { return m_vecVertexData.size(); } // int GetIndexCount() { return m_vecIndexData.size(); } int GetVertexSize() { return sizeof( _T ); } DWORD GetFVF() { return _T::GetFVF(); } // vertex °¹¼ö ¼³Á¤(°ø°£È®º¸) void SetVertexCount( int n ) { m_vecVertexData.resize( n ); } // ÇØ´ç index °¹¼ö ¼³Á¤(°ø°£ È®º¸) void SetIndexCount( int n ) { m_vecIndexData.resize( n ); if( 0 == n ) { m_bIndexed = false; } else { m_bIndexed = true; } } // _T* GetVertexWritePtr() { if( IsLocked() ) { return NULL; } if( 0 == m_vecVertexData.size() ) { return NULL; } return &(m_vecVertexData[0]); } WORD* GetIndexWritePtr() { if( IsLocked() ) { return NULL; } if( 0 == m_vecIndexData.size() ) { return NULL; } return &(m_vecIndexData[0]); } private: std::vector< _T > m_vecVertexData; std::vector< WORD > m_vecIndexData; }; } }