00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00023
00024 #ifndef H_SPK_IRRBUFFER
00025 #define H_SPK_IRRBUFFER
00026
00027 #include "RenderingAPIs/Irrlicht/SPK_IRR_DEF.h"
00028 #include "Core/SPK_Buffer.h"
00029
00030 namespace SPK
00031 {
00032 namespace IRR
00033 {
00039 enum E_IRRSPK_INDEXMODE
00040 {
00041 EII_16BITS = irr::video::EIT_16BIT,
00042 EII_32BITS = irr::video::EIT_32BIT,
00043 EII_AUTO,
00044 };
00045
00054 class SPK_IRR_PREFIX IRRBuffer : public Buffer
00055 {
00056 friend class IRRBufferCreator;
00057
00058 public:
00059
00061
00063
00071 void setVBOInitialized(bool init);
00072
00080 void setUsed(size_t nb);
00081
00082
00084
00086
00091 irr::scene::IVertexBuffer& getVertexBuffer();
00092
00097 irr::scene::IIndexBuffer& getIndexBuffer();
00098
00103 irr::scene::IDynamicMeshBuffer& getMeshBuffer();
00104
00112 bool areVBOInitialized() const;
00113
00114
00116
00118
00132 static void activateVBOHint(bool activate);
00133
00139 static bool isVBOHintActivated();
00140
00141 private:
00142
00143 irr::scene::CDynamicMeshBuffer meshBuffer;
00144
00145 irr::IrrlichtDevice* device;
00146
00147 size_t nbParticles;
00148 size_t particleVertexSize;
00149 size_t particleIndexSize;
00150
00151 bool VBOInitialized;
00152 static bool useVBO;
00153
00154 IRRBuffer(irr::IrrlichtDevice* device,size_t nbParticles,size_t particleVertexSize,size_t particleIndexSize,irr::video::E_INDEX_TYPE indexType);
00155 IRRBuffer(const IRRBuffer& buffer);
00156 virtual ~IRRBuffer();
00157
00158 virtual void swap(size_t index0,size_t index1);
00159
00160 void initInnerBuffers();
00161 };
00162
00163
00168 class SPK_IRR_PREFIX IRRBufferCreator : public BufferCreator
00169 {
00170 public:
00171
00179 IRRBufferCreator(irr::IrrlichtDevice* device,size_t particleVertexSize,size_t particleIndexSize,E_IRRSPK_INDEXMODE indexType = EII_AUTO);
00180
00181 private:
00182
00183 irr::IrrlichtDevice* device;
00184
00185 size_t particleVertexSize;
00186 size_t particleIndexSize;
00187 E_IRRSPK_INDEXMODE indexType;
00188
00189 virtual IRRBuffer* createBuffer(size_t nbParticles, const Group& group) const;
00190 };
00191
00192
00193 inline irr::scene::IVertexBuffer& IRRBuffer::getVertexBuffer()
00194 {
00195 return meshBuffer.getVertexBuffer();
00196 }
00197
00198 inline irr::scene::IIndexBuffer& IRRBuffer::getIndexBuffer()
00199 {
00200 return meshBuffer.getIndexBuffer();
00201 }
00202
00203 inline irr::scene::IDynamicMeshBuffer& IRRBuffer::getMeshBuffer()
00204 {
00205 return meshBuffer;
00206 }
00207
00208 inline void IRRBuffer::setUsed(size_t nb)
00209 {
00210 if (nb > nbParticles)
00211 nb = nbParticles;
00212
00213 getVertexBuffer().set_used(nb * particleVertexSize);
00214 getIndexBuffer().set_used(nb * particleIndexSize);
00215 }
00216
00217 inline bool IRRBuffer::areVBOInitialized() const
00218 {
00219 return VBOInitialized;
00220 }
00221
00222 inline void IRRBuffer::setVBOInitialized(bool init)
00223 {
00224 VBOInitialized = init;
00225 }
00226
00227 inline bool IRRBuffer::isVBOHintActivated()
00228 {
00229 return useVBO;
00230 }
00231 }}
00232
00233 #endif