| Irrlicht 3D Engine |

CMeshBuffer.h
Go to the documentation of this file.

    00001 // Copyright (C) 2002-2012 Nikolaus Gebhardt
    00002 // This file is part of the "Irrlicht Engine".
    00003 // For conditions of distribution and use, see copyright notice in irrlicht.h
    00004
    00005 #ifndef __T_MESH_BUFFER_H_INCLUDED__
    00006 #define __T_MESH_BUFFER_H_INCLUDED__
    00007
    00008 #include "irrArray.h"
    00009 #include "IMeshBuffer.h"
    00010
    00011 namespace irr
    00012 {
    00013 namespace scene
    00014 {
    00016     template <class T>
    00017     class CMeshBuffer : public IMeshBuffer
    00018     {
    00019     public:
    00021         CMeshBuffer():ChangedID_Vertex(1),ChangedID_Index(1),MappingHint_Vertex(EHM_NEVER), MappingHint_Index(EHM_NEVER)
    00022         {
    00023             #ifdef _DEBUG
    00024             setDebugName("SMeshBuffer");
    00025             #endif
    00026         }
    00027
    00028
    00030
    00031         virtual const video::SMaterial& getMaterial() const
    00032         {
    00033             return Material;
    00034         }
    00035
    00036
    00038
    00039         virtual video::SMaterial& getMaterial()
    00040         {
    00041             return Material;
    00042         }
    00043
    00044
    00046
    00047         virtual const void* getVertices() const
    00048         {
    00049             return Vertices.const_pointer();
    00050         }
    00051
    00052
    00054
    00055         virtual void* getVertices()
    00056         {
    00057             return Vertices.pointer();
    00058         }
    00059
    00060
    00062
    00063         virtual u32 getVertexCount() const
    00064         {
    00065             return Vertices.size();
    00066         }
    00067
    00069
    00070         virtual video::E_INDEX_TYPE getIndexType() const
    00071         {
    00072             return video::EIT_16BIT;
    00073         }
    00074
    00076
    00077         virtual const u16* getIndices() const
    00078         {
    00079             return Indices.const_pointer();
    00080         }
    00081
    00082
    00084
    00085         virtual u16* getIndices()
    00086         {
    00087             return Indices.pointer();
    00088         }
    00089
    00090
    00092
    00093         virtual u32 getIndexCount() const
    00094         {
    00095             return Indices.size();
    00096         }
    00097
    00098
    00100
    00101         virtual const core::aabbox3d<f32>& getBoundingBox() const
    00102         {
    00103             return BoundingBox;
    00104         }
    00105
    00106
    00108
    00109
    00110         virtual void setBoundingBox(const core::aabbox3df& box)
    00111         {
    00112             BoundingBox = box;
    00113         }
    00114
    00115
    00117
    00118         virtual void recalculateBoundingBox()
    00119         {
    00120             if (Vertices.empty())
    00121                 BoundingBox.reset(0,0,0);
    00122             else
    00123             {
    00124                 BoundingBox.reset(Vertices[0].Pos);
    00125                 for (u32 i=1; i<Vertices.size(); ++i)
    00126                     BoundingBox.addInternalPoint(Vertices[i].Pos);
    00127             }
    00128         }
    00129
    00130
    00132
    00133         virtual video::E_VERTEX_TYPE getVertexType() const
    00134         {
    00135             return T().getType();
    00136         }
    00137
    00139         virtual const core::vector3df& getPosition(u32 i) const
    00140         {
    00141             return Vertices[i].Pos;
    00142         }
    00143
    00145         virtual core::vector3df& getPosition(u32 i)
    00146         {
    00147             return Vertices[i].Pos;
    00148         }
    00149
    00151         virtual const core::vector3df& getNormal(u32 i) const
    00152         {
    00153             return Vertices[i].Normal;
    00154         }
    00155
    00157         virtual core::vector3df& getNormal(u32 i)
    00158         {
    00159             return Vertices[i].Normal;
    00160         }
    00161
    00163         virtual const core::vector2df& getTCoords(u32 i) const
    00164         {
    00165             return Vertices[i].TCoords;
    00166         }
    00167
    00169         virtual core::vector2df& getTCoords(u32 i)
    00170         {
    00171             return Vertices[i].TCoords;
    00172         }
    00173
    00174
    00176
    00180         virtual void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices)
    00181         {
    00182             if (vertices == getVertices())
    00183                 return;
    00184
    00185             const u32 vertexCount = getVertexCount();
    00186             u32 i;
    00187
    00188             Vertices.reallocate(vertexCount+numVertices);
    00189             for (i=0; i<numVertices; ++i)
    00190             {
    00191                 Vertices.push_back(reinterpret_cast<const T*>(vertices)[i]);
    00192                 BoundingBox.addInternalPoint(reinterpret_cast<const T*>(vertices)[i].Pos);
    00193             }
    00194
    00195             Indices.reallocate(getIndexCount()+numIndices);
    00196             for (i=0; i<numIndices; ++i)
    00197             {
    00198                 Indices.push_back(indices[i]+vertexCount);
    00199             }
    00200         }
    00201
    00202
    00204
    00209         virtual void append(const IMeshBuffer* const other)
    00210         {
    00211             /*
    00212             if (this==other)
    00213                 return;
    00214
    00215             const u32 vertexCount = getVertexCount();
    00216             u32 i;
    00217
    00218             Vertices.reallocate(vertexCount+other->getVertexCount());
    00219             for (i=0; i<other->getVertexCount(); ++i)
    00220             {
    00221                 Vertices.push_back(reinterpret_cast<const T*>(other->getVertices())[i]);
    00222             }
    00223
    00224             Indices.reallocate(getIndexCount()+other->getIndexCount());
    00225             for (i=0; i<other->getIndexCount(); ++i)
    00226             {
    00227                 Indices.push_back(other->getIndices()[i]+vertexCount);
    00228             }
    00229             BoundingBox.addInternalBox(other->getBoundingBox());
    00230             */
    00231         }
    00232
    00233
    00235         virtual E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const
    00236         {
    00237             return MappingHint_Vertex;
    00238         }
    00239
    00241         virtual E_HARDWARE_MAPPING getHardwareMappingHint_Index() const
    00242         {
    00243             return MappingHint_Index;
    00244         }
    00245
    00247         virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint, E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX )
    00248         {
    00249             if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_VERTEX)
    00250                 MappingHint_Vertex=NewMappingHint;
    00251             if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_INDEX)
    00252                 MappingHint_Index=NewMappingHint;
    00253         }
    00254
    00255
    00257         virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX)
    00258         {
    00259             if (Buffer==EBT_VERTEX_AND_INDEX ||Buffer==EBT_VERTEX)
    00260                 ++ChangedID_Vertex;
    00261             if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_INDEX)
    00262                 ++ChangedID_Index;
    00263         }
    00264
    00266
    00267         virtual u32 getChangedID_Vertex() const {return ChangedID_Vertex;}
    00268
    00270
    00271         virtual u32 getChangedID_Index() const {return ChangedID_Index;}
    00272
    00273         u32 ChangedID_Vertex;
    00274         u32 ChangedID_Index;
    00275
    00277         E_HARDWARE_MAPPING MappingHint_Vertex;
    00278         E_HARDWARE_MAPPING MappingHint_Index;
    00279
    00281         video::SMaterial Material;
    00283         core::array<T> Vertices;
    00285         core::array<u16> Indices;
    00287         core::aabbox3d<f32> BoundingBox;
    00288     };
    00289
    00291     typedef CMeshBuffer<video::S3DVertex> SMeshBuffer;
    00293     typedef CMeshBuffer<video::S3DVertex2TCoords> SMeshBufferLightMap;
    00295     typedef CMeshBuffer<video::S3DVertexTangents> SMeshBufferTangents;
    00296 } // end namespace scene
    00297 } // end namespace irr
    00298
    00299 #endif
    00300
    00301