00001 #ifndef __NYTRO_GeometryBuffer_H
00002 #define __NYTRO_GeometryBuffer_H
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "system/nyCommon.h"
00012 #include "system/nyBase.h"
00013
00014 namespace Nytro
00015 {
00016 namespace Graphics
00017 {
00018 class GeometryBuffer;
00019 class GeometryVertexBuffer;
00020
00022 class NYTRO_API GeometryBufferRenderRange
00023 {
00024 public:
00025
00026 GeometryBufferRenderRange()
00027 {
00028 m_bActive = false;
00029 m_vertexOffset = m_indexOffset = m_vertexCount = m_indexCount = 0;
00030 }
00031
00032 bool m_bActive;
00033 uint32 m_vertexOffset, m_indexOffset, m_vertexCount, m_indexCount;
00034 };
00035
00038 class NYTRO_API GeometryInstanceBuffer : public Core::Base
00039 {
00040 public:
00041
00043 enum EInstanceAttribute
00044 {
00046 eInstanceAttribute_Translation = NYTRO_BIT(0),
00048 eInstanceAttribute_Rotation = NYTRO_BIT(1),
00050 eInstanceAttribute_Scale = NYTRO_BIT(2),
00052 eInstanceAttribute_Color = NYTRO_BIT(3),
00054 eInstanceAttribute_User1 = NYTRO_BIT(4),
00055 eInstanceAttribute_User2 = NYTRO_BIT(5),
00056 eInstanceAttribute_User3 = NYTRO_BIT(6),
00057 eInstanceAttribute_User4 = NYTRO_BIT(7),
00058 eInstanceAttribute_User5 = NYTRO_BIT(8),
00059 eInstanceAttribute_User6 = NYTRO_BIT(9),
00060 eInstanceAttribute_User7 = NYTRO_BIT(10),
00062 eInstanceAttribute_TransformMatrix1 = NYTRO_BIT(11),
00064 eInstanceAttribute_TransformMatrix2 = NYTRO_BIT(12)
00065 };
00066
00067 protected:
00068
00071 GeometryInstanceBuffer();
00072
00073 public:
00074
00075 virtual ~GeometryInstanceBuffer();
00076
00077 virtual EResult create( uint32 aAttrs, uint32 aCount, GeometryVertexBuffer* pGVB = NULL );
00078
00080 uint32 getInstanceCount();
00082 uint32 getInstanceElementSize();
00084 uint32 getInstanceDataBufferSize();
00086 GeometryVertexBuffer* getInstancedGeometryVertexBuffer();
00088 void setInstancedVertexBuffer( GeometryVertexBuffer* pGVB );
00090 void setInstanceCount( uint32 aCount );
00091
00094 uint8* getInstanceDataBuffer( bool bCreateIfNotExists = true );
00095 uint32 getInstanceAttributes();
00097 virtual bool uploadInstanceDataBuffer( uint32 aStartInstanceIndex = 0, uint32 aInstanceCount = 0 );
00099 void freeInstanceDataBuffer();
00101 bool isDataUploadPending();
00102 virtual void use();
00103
00104 protected:
00105
00106 uint32 m_instanceAttributes, m_instanceCount, m_instanceElementSize, m_instanceDataBufferSize;
00107 GeometryVertexBuffer* m_pInstancedVertexBuffer;
00108 uint8* m_pInstanceDataBuffer;
00109 volatile bool m_bPendingDataUpload;
00110 };
00111
00113 enum EGeometryPrimitive
00114 {
00115 eGeometryPrimitive_Point,
00116 eGeometryPrimitive_LineList,
00117 eGeometryPrimitive_LineStrip,
00118 eGeometryPrimitive_TriangleList,
00119 eGeometryPrimitive_TriangleStrip,
00120 eGeometryPrimitive_TriangleFan,
00121 };
00122
00124 enum EGeometryBufferUsage
00125 {
00126 eGeometryBufferUsage_Static = NYTRO_BIT(0),
00127 eGeometryBufferUsage_Dynamic = NYTRO_BIT(1)
00128 };
00129
00130 class NYTRO_API GeometryVertexBuffer : public Core::Base
00131 {
00132 public:
00133
00135 enum EVertexComponent
00136 {
00137 eVertexComponent_Position = NYTRO_BIT(0),
00138 eVertexComponent_JointWeights = NYTRO_BIT(1),
00139 eVertexComponent_JointIndices = NYTRO_BIT(2),
00140 eVertexComponent_Normal = NYTRO_BIT(3),
00141 eVertexComponent_Tangent = NYTRO_BIT(4),
00142 eVertexComponent_Binormal = NYTRO_BIT(5),
00143 eVertexComponent_Color = NYTRO_BIT(6),
00144 eVertexComponent_UV0 = NYTRO_BIT(7),
00145 eVertexComponent_UV1 = NYTRO_BIT(8),
00146 eVertexComponent_UV2 = NYTRO_BIT(9),
00147 eVertexComponent_UV3 = NYTRO_BIT(10),
00148 eVertexComponent_UV4 = NYTRO_BIT(11),
00149 eVertexComponent_UV5 = NYTRO_BIT(12),
00150 eVertexComponent_UV6 = NYTRO_BIT(13),
00151 eVertexComponent_UV7 = NYTRO_BIT(14),
00152 eVertexComponent_PointSize = NYTRO_BIT(15),
00153 eVertexComponent_TessellationFactor = NYTRO_BIT(16),
00154 eVertexComponent_Float = NYTRO_BIT(17)
00155 };
00156
00157 protected:
00158
00161 GeometryVertexBuffer();
00162
00163 public:
00164
00165 virtual ~GeometryVertexBuffer();
00166
00168 virtual EResult create( EGeometryBufferUsage aUsage, uint32 aComponents , uint32 aVertexCount );
00170 virtual EResult copy( GeometryVertexBuffer* pFrom );
00172 virtual Base* clone();
00173
00175 EGeometryBufferUsage getUsageType();
00177 uint32 getVertexComponents();
00179 uint32 getVertexCount();
00181 virtual uint32 getVertexDataBufferSize();
00183 virtual uint32 getVertexElementSize();
00185 uint32 getVertexComponentOffset( EVertexComponent aComp );
00186
00189 uint8* getVertexDataBuffer( bool bCreateIfNotExists = true );
00191 virtual bool adjustVertexCount( uint32 aNewCount, bool bForceReallocIfSmaller = false );
00194 virtual bool uploadVertexDataBuffer();
00197 void freeVertexDataBuffer();
00199 bool isDataUploadPending();
00200
00201 protected:
00202
00203 uint32 m_vertexCount;
00204 EGeometryBufferUsage m_usageType;
00205 uint32 m_vertexComponents;
00206 uint32 m_vertexElementSize;
00207 uint32 m_vertexDataBufferSize;
00208 uint8* m_pVertexDataBuffer;
00209 volatile bool m_bPendingDataUpload;
00210 };
00211
00212 class NYTRO_API GeometryIndexBuffer : public Core::Base
00213 {
00214 public:
00215
00216 protected:
00217
00220 GeometryIndexBuffer();
00221
00222 public:
00223
00224 virtual ~GeometryIndexBuffer();
00225
00227 virtual EResult create( EGeometryBufferUsage aUsage, EGeometryPrimitive aPrimType, uint32 aIndexCount );
00229 virtual EResult copy( GeometryIndexBuffer* pFrom );
00231 virtual Base* clone();
00233 EGeometryBufferUsage getUsageType();
00235 EGeometryPrimitive getPrimitiveType();
00237 uint32 getIndexCount();
00239 uint32 getPrimitiveCount();
00241 virtual uint32 getIndexDataBufferSize();
00242
00245 uint8* getIndexDataBuffer( bool bCreateIfNotExists = true );
00247 virtual bool adjustIndexCount( uint32 aNewCount, bool bForceReallocIfSmaller = false );
00250 virtual bool uploadIndexDataBuffer();
00253 void freeIndexDataBuffer();
00255 bool isDataUploadPending();
00256
00257 protected:
00258
00259 uint32 m_primitiveCount, m_indexCount, m_indexDataBufferSize;
00260 EGeometryBufferUsage m_usageType;
00261 EGeometryPrimitive m_primitiveType;
00262 uint8* m_pIndexDataBuffer;
00263 volatile bool m_bPendingDataUpload;
00264 };
00265
00267 class NYTRO_API GeometryBuffer : public Core::Base
00268 {
00269 public:
00270
00271 GeometryBuffer():
00272 m_pVertexBuffer( NULL ),
00273 m_pIndexBuffer( NULL ),
00274 m_bOwnsVbPtr( true ),
00275 m_bOwnsIbPtr( true )
00276 {
00277 }
00278
00279 virtual ~GeometryBuffer()
00280 {
00281 freeBuffers();
00282 }
00283
00284 virtual void create( bool bCreateVertexBuffer = true, bool bCreateIndexBuffer = true );
00285 virtual void freeBuffers();
00286 virtual Base* clone();
00287
00288 inline GeometryVertexBuffer* getVertexBuffer(){ return m_pVertexBuffer; };
00289 inline GeometryIndexBuffer* getIndexBuffer(){ return m_pIndexBuffer; };
00290 inline void setVertexBuffer( GeometryVertexBuffer* pBuf ){ m_pVertexBuffer = pBuf; m_bOwnsVbPtr = false; };
00291 inline void setIndexBuffer( GeometryIndexBuffer* pBuf ){ m_pIndexBuffer = pBuf; m_bOwnsIbPtr = false; };
00292
00293 protected:
00294
00295 GeometryVertexBuffer* m_pVertexBuffer;
00296 GeometryIndexBuffer* m_pIndexBuffer;
00297 bool m_bOwnsVbPtr, m_bOwnsIbPtr;
00298 };
00299 };
00300 };
00301
00302 #endif