"L. Spiro Engine"
|
00001 00019 #ifndef __LSG_VERTEXBUFFERBASE_H__ 00020 #define __LSG_VERTEXBUFFERBASE_H__ 00021 00022 #include "../LSGGraphicsLib.h" 00023 #include "Allocator/LSTLAllocator.h" 00024 00025 namespace lsg { 00026 00027 // == Enumerations. 00031 enum LSG_VERTEX_BUFFER_USAGE_TYPES { 00032 LSG_VBUT_SETONLY = (1 << 0), 00033 LSG_VBUT_STANDARD = (1 << 1), 00034 LSG_VBUT_DYNAMIC = (1 << 2), 00036 LSG_VBUT_MASK = (LSG_VBUT_SETONLY | LSG_VBUT_STANDARD | LSG_VBUT_DYNAMIC), 00037 LSG_VBUT_FORCE_DWORD = 0x7FFFFFFF 00038 }; 00039 00043 enum LSG_VERTEX_BUFFER_ACCESS_FLAGS { 00044 LSG_VBAF_READ_ONLY = (1 << 7), 00045 LSG_VBAF_READ_WRITE = (1 << 8), 00047 LSG_VBAF_MASK = (LSG_VBAF_READ_ONLY | LSG_VBAF_READ_WRITE), 00048 LSG_VBAF_FORCE_DWORD = 0x7FFFFFFF 00049 }; 00050 00054 enum LSG_VERTEX_BUFFER_PRIMITIVES { 00055 LSG_VBP_TRIANGLELIST = (1 << 9), 00056 LSG_VBP_TRIANGLESTRIP = (1 << 10), 00058 LSG_VBP_MASK = (LSG_VBP_TRIANGLELIST | LSG_VBP_TRIANGLESTRIP), 00059 LSG_VBP_FORCE_DWORD = 0x7FFFFFFF 00060 }; 00061 00065 enum LSG_VERTEX_ATTRIBUTES { 00066 LSG_VA_POSITION, 00067 LSG_VA_POSITIONW, 00068 LSG_VA_NORMAL, 00069 LSG_VA_COLOR, 00070 LSG_VA_ALPHA, 00071 LSG_VA_TEX, 00072 LSG_VA_FOGCOORD, 00073 LSG_VA_BINORMAL, 00074 LSG_VA_TANGENT, 00075 LSG_VA_BLENDWEIGHT, 00076 LSG_VA_BLENDINDICES, 00077 LSG_VA_1FLOAT_TEX, 00078 LSG_VA_3FLOAT_TEX, 00079 LSG_VA_4FLOAT_TEX, 00080 //LSG_VA_1INDEX_TEX, 00081 //LSG_VA_4INDEX_TEX, 00082 00083 LSG_VA_FORCE_DWORD = 0x7FFFFFFF 00084 }; 00085 00089 enum LSG_VERTEX_BUFFER_METRICS { 00090 LSG_VBM_MAX_ATTRIBUTES = 16, 00091 LSG_VBM_MAX_USAGES = 16, 00092 LSG_VBM_MAX_STREAMS = 16, 00093 }; 00094 00095 00096 // == Types. 00100 typedef struct LSG_VB_CONTENTS { 00104 LSUINT8 ui8Array[LSG_VBM_MAX_ATTRIBUTES]; 00105 00109 LSUINT32 ui32Total; 00110 00111 00112 // == Various constructors. 00113 LSE_CALL LSG_VB_CONTENTS(); 00114 LSE_CALL LSG_VB_CONTENTS( LSUINT8 _ui8Type, LSUINT8 _ui8Stream = 0 ); 00115 00116 // == Operators. 00123 LSG_VB_CONTENTS & LSE_CALL operator |= ( const LSG_VB_CONTENTS &_vcOther ); 00124 00131 LSG_VB_CONTENTS LSE_CALL operator | ( const LSG_VB_CONTENTS &_vcOther ) const; 00132 00139 LSUINT32 LSE_CALL operator [] ( LSUINT32 _ui32Index ) const; 00140 00147 LSUINT32 LSE_CALL operator () ( LSUINT32 _ui32Index ) const; 00148 00156 LSBOOL LSE_CALL operator () ( LSUINT32 _ui32Type, LSUINT32 _ui32Stream ) const; 00157 00164 LSBOOL LSE_CALL operator & ( LSUINT32 _ui32Attr ) const; 00165 } * LPLSG_VB_CONTENTS, * const LPCLSG_VB_CONTENTS; 00166 00167 00168 #ifdef _DEBUG 00169 #define LSG_VB_INTERFACE virtual 00170 #else // #ifdef _DEBUG 00171 #define LSG_VB_INTERFACE 00172 #endif // #ifdef _DEBUG 00173 00183 class CVertexBufferBase { 00184 // Rendering of the vertex buffer is handled by CFnd. This allows the foundation to update its render state 00185 // in preparation for the render. 00186 friend class CFnd; 00187 public : 00188 // == Various constructors. 00189 LSE_CALLCTOR CVertexBufferBase(); 00190 LSE_CALLCTOR ~CVertexBufferBase(); 00191 00192 00193 // == Functions. 00197 LSVOID LSE_CALL Reset(); 00198 00204 LSE_INLINE const LSG_VB_CONTENTS & LSE_CALL Contents() const; 00205 00206 protected : 00207 // == Members. 00211 LSG_VB_CONTENTS m_vcContents; 00212 00216 LSUINT32 m_ui32Lock; 00217 00221 LSBOOL m_bFinalized; 00222 00226 LSUINT16 m_ui16UsageAndAccess; 00227 00231 LSUINT16 m_ui16ElementSize; 00232 00236 LSUINT32 m_ui32Stride; 00237 00241 LSUINT32 m_ui32Elements; 00242 00246 LSUINT32 m_ui32PrimitiveCount; 00247 00251 LSUINT32 m_ui32Id; 00252 00256 CVectorPoD<LSUINT8, LSUINT32, 1024UL> m_vData; 00257 00261 CVectorPoD<LSUINT16, LSUINT8, 1UL> m_vAttributeOffsets[LSG_VBM_MAX_ATTRIBUTES]; 00262 00266 static LSUINT32 m_ui32VertIdCounter; 00267 00271 static CCriticalSection m_csCrit; 00272 00273 00274 // == Functions. 00275 }; 00276 00277 00278 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00279 // DEFINITIONS 00280 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00281 // == Functions. 00287 LSE_INLINE const LSG_VB_CONTENTS & LSE_CALL CVertexBufferBase::Contents() const { 00288 return m_vcContents; 00289 } 00290 00291 } // namespace lsg 00292 00293 #endif // __LSG_VERTEXBUFFERBASE_H__ 00294