Irrlicht 3D Engine
SSharedMeshBuffer.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 __S_SHARED_MESH_BUFFER_H_INCLUDED__
00006 #define __S_SHARED_MESH_BUFFER_H_INCLUDED__
00007 
00008 #include "irrArray.h"
00009 #include "IMeshBuffer.h"
00010 
00011 namespace irr
00012 {
00013 namespace scene
00014 {
00016     struct SSharedMeshBuffer : public IMeshBuffer
00017     {
00019         SSharedMeshBuffer() : IMeshBuffer(), Vertices(0), ChangedID_Vertex(1), ChangedID_Index(1), MappingHintVertex(EHM_NEVER), MappingHintIndex(EHM_NEVER)
00020         {
00021             #ifdef _DEBUG
00022             setDebugName("SSharedMeshBuffer");
00023             #endif
00024         }
00025 
00027         SSharedMeshBuffer(core::array<video::S3DVertex> *vertices) : IMeshBuffer(), Vertices(vertices)
00028         {
00029             #ifdef _DEBUG
00030             setDebugName("SSharedMeshBuffer");
00031             #endif
00032         }
00033 
00035         virtual const video::SMaterial& getMaterial() const
00036         {
00037             return Material;
00038         }
00039 
00041         virtual video::SMaterial& getMaterial()
00042         {
00043             return Material;
00044         }
00045 
00047         virtual const void* getVertices() const
00048         {
00049             if (Vertices)
00050                 return Vertices->const_pointer();
00051             else
00052                 return 0;
00053         }
00054 
00056         virtual void* getVertices()
00057         {
00058             if (Vertices)
00059                 return Vertices->pointer();
00060             else
00061                 return 0;
00062         }
00063 
00065         virtual u32 getVertexCount() const
00066         {
00067             if (Vertices)
00068                 return Vertices->size();
00069             else
00070                 return 0;
00071         }
00072 
00074         virtual const u16* getIndices() const
00075         {
00076             return Indices.const_pointer();
00077         }
00078 
00080         virtual u16* getIndices()
00081         {
00082             return Indices.pointer();
00083         }
00084 
00086         virtual u32 getIndexCount() const
00087         {
00088             return Indices.size();
00089         }
00090 
00092         virtual video::E_INDEX_TYPE getIndexType() const
00093         {
00094             return video::EIT_16BIT;
00095         }
00096 
00098         virtual const core::aabbox3d<f32>& getBoundingBox() const
00099         {
00100             return BoundingBox;
00101         }
00102 
00104         virtual void setBoundingBox( const core::aabbox3df& box)
00105         {
00106             BoundingBox = box;
00107         }
00108 
00110         virtual video::E_VERTEX_TYPE getVertexType() const
00111         {
00112             return video::EVT_STANDARD;
00113         }
00114 
00116         virtual void recalculateBoundingBox()
00117         {
00118             if (!Vertices || Vertices->empty() || Indices.empty())
00119                 BoundingBox.reset(0,0,0);
00120             else
00121             {
00122                 BoundingBox.reset((*Vertices)[Indices[0]].Pos);
00123                 for (u32 i=1; i<Indices.size(); ++i)
00124                     BoundingBox.addInternalPoint((*Vertices)[Indices[i]].Pos);
00125             }
00126         }
00127 
00129         virtual const core::vector3df& getPosition(u32 i) const
00130         {
00131             _IRR_DEBUG_BREAK_IF(!Vertices);
00132             return (*Vertices)[Indices[i]].Pos;
00133         }
00134 
00136         virtual core::vector3df& getPosition(u32 i)
00137         {
00138             _IRR_DEBUG_BREAK_IF(!Vertices);
00139             return (*Vertices)[Indices[i]].Pos;
00140         }
00141 
00143         virtual const core::vector3df& getNormal(u32 i) const
00144         {
00145             _IRR_DEBUG_BREAK_IF(!Vertices);
00146             return (*Vertices)[Indices[i]].Normal;
00147         }
00148 
00150         virtual core::vector3df& getNormal(u32 i)
00151         {
00152             _IRR_DEBUG_BREAK_IF(!Vertices);
00153             return (*Vertices)[Indices[i]].Normal;
00154         }
00155 
00157         virtual const core::vector2df& getTCoords(u32 i) const
00158         {
00159             _IRR_DEBUG_BREAK_IF(!Vertices);
00160             return (*Vertices)[Indices[i]].TCoords;
00161         }
00162 
00164         virtual core::vector2df& getTCoords(u32 i)
00165         {
00166             _IRR_DEBUG_BREAK_IF(!Vertices);
00167             return (*Vertices)[Indices[i]].TCoords;
00168         }
00169 
00171         virtual void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices) {}
00172 
00174         virtual void append(const IMeshBuffer* const other) {}
00175 
00177         virtual E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const
00178         {
00179             return MappingHintVertex;
00180         }
00181 
00183         virtual E_HARDWARE_MAPPING getHardwareMappingHint_Index() const
00184         {
00185             return MappingHintIndex;
00186         }
00187 
00189         virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX )
00190         {
00191             if (buffer==EBT_VERTEX_AND_INDEX || buffer==EBT_VERTEX)
00192                 MappingHintVertex=NewMappingHint;
00193             if (buffer==EBT_VERTEX_AND_INDEX || buffer==EBT_INDEX)
00194                 MappingHintIndex=NewMappingHint;
00195         }
00196 
00198         virtual void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX)
00199         {
00200             if (buffer==EBT_VERTEX_AND_INDEX || buffer==EBT_VERTEX)
00201                 ++ChangedID_Vertex;
00202             if (buffer==EBT_VERTEX_AND_INDEX || buffer==EBT_INDEX)
00203                 ++ChangedID_Index;
00204         }
00205 
00207 
00208         virtual u32 getChangedID_Vertex() const {return ChangedID_Vertex;}
00209 
00211 
00212         virtual u32 getChangedID_Index() const {return ChangedID_Index;}
00213 
00215         video::SMaterial Material;
00216 
00218         core::array<video::S3DVertex> *Vertices;
00219 
00221         core::array<u16> Indices;
00222 
00224         u32 ChangedID_Vertex;
00225 
00227         u32 ChangedID_Index;
00228 
00230         core::aabbox3df BoundingBox;
00231 
00233         E_HARDWARE_MAPPING MappingHintVertex;
00234         E_HARDWARE_MAPPING MappingHintIndex;
00235     };
00236 
00237 
00238 } // end namespace scene
00239 } // end namespace irr
00240 
00241 #endif
00242