1 // Copyright (C) 2008-2012 Nikolaus Gebhardt 2 // This file is part of the "Irrlicht Engine". 3 // For conditions of distribution and use, see copyright notice in irrlicht.h 4 5 #ifndef __I_DYNAMIC_MESH_BUFFER_H_INCLUDED__ 6 #define __I_DYNAMIC_MESH_BUFFER_H_INCLUDED__ 7 8 #include "IMeshBuffer.h" 9 #include "IVertexBuffer.h" 10 #include "IIndexBuffer.h" 11 12 namespace irr 13 { 14 namespace scene 15 { 16 17 /** a dynamic meshBuffer */ 18 class IDynamicMeshBuffer : public IMeshBuffer 19 { 20 public: 21 virtual IVertexBuffer &getVertexBuffer() const =0; 22 virtual IIndexBuffer &getIndexBuffer() const =0; 23 24 virtual void setVertexBuffer(IVertexBuffer *vertexBuffer) =0; 25 virtual void setIndexBuffer(IIndexBuffer *indexBuffer) =0; 26 27 //! Get the material of this meshbuffer 28 /** \return Material of this buffer. */ 29 virtual video::SMaterial& getMaterial() =0; 30 31 //! Get the material of this meshbuffer 32 /** \return Material of this buffer. */ 33 virtual const video::SMaterial& getMaterial() const =0; 34 35 //! Get the axis aligned bounding box of this meshbuffer. 36 /** \return Axis aligned bounding box of this buffer. */ 37 virtual const core::aabbox3df& getBoundingBox() const =0; 38 39 //! Set axis aligned bounding box 40 /** \param box User defined axis aligned bounding box to use 41 for this buffer. */ 42 virtual void setBoundingBox(const core::aabbox3df& box) =0; 43 44 //! Recalculates the bounding box. Should be called if the mesh changed. 45 virtual void recalculateBoundingBox() =0; 46 47 //! Append the vertices and indices to the current buffer 48 /** Only works for compatible vertex types. 49 \param vertices Pointer to a vertex array. 50 \param numVertices Number of vertices in the array. 51 \param indices Pointer to index array. 52 \param numIndices Number of indices in array. */ append(const void * const vertices,u32 numVertices,const u16 * const indices,u32 numIndices)53 virtual void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices) 54 { 55 56 } 57 58 //! Append the meshbuffer to the current buffer 59 /** Only works for compatible vertex types 60 \param other Buffer to append to this one. */ append(const IMeshBuffer * const other)61 virtual void append(const IMeshBuffer* const other) 62 { 63 64 } 65 66 // ------------------- To be removed? ------------------- // 67 68 //! get the current hardware mapping hint getHardwareMappingHint_Vertex()69 virtual E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const 70 { 71 return getVertexBuffer().getHardwareMappingHint(); 72 } 73 74 //! get the current hardware mapping hint getHardwareMappingHint_Index()75 virtual E_HARDWARE_MAPPING getHardwareMappingHint_Index() const 76 { 77 return getIndexBuffer().getHardwareMappingHint(); 78 } 79 80 //! set the hardware mapping hint, for driver 81 virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint, E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX ) 82 { 83 if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_VERTEX) 84 getVertexBuffer().setHardwareMappingHint(NewMappingHint); 85 if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_INDEX) 86 getIndexBuffer().setHardwareMappingHint(NewMappingHint); 87 } 88 89 //! flags the mesh as changed, reloads hardware buffers 90 virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) 91 { 92 if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_VERTEX) 93 getVertexBuffer().setDirty(); 94 if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_INDEX) 95 getIndexBuffer().setDirty(); 96 } 97 getChangedID_Vertex()98 virtual u32 getChangedID_Vertex() const 99 { 100 return getVertexBuffer().getChangedID(); 101 } 102 getChangedID_Index()103 virtual u32 getChangedID_Index() const 104 { 105 return getIndexBuffer().getChangedID(); 106 } 107 108 // ------------------- Old interface ------------------- // 109 110 //! Get type of vertex data which is stored in this meshbuffer. 111 /** \return Vertex type of this buffer. */ getVertexType()112 virtual video::E_VERTEX_TYPE getVertexType() const 113 { 114 return getVertexBuffer().getType(); 115 } 116 117 //! Get access to vertex data. The data is an array of vertices. 118 /** Which vertex type is used can be determined by getVertexType(). 119 \return Pointer to array of vertices. */ getVertices()120 virtual const void* getVertices() const 121 { 122 return getVertexBuffer().getData(); 123 } 124 125 //! Get access to vertex data. The data is an array of vertices. 126 /** Which vertex type is used can be determined by getVertexType(). 127 \return Pointer to array of vertices. */ getVertices()128 virtual void* getVertices() 129 { 130 return getVertexBuffer().getData(); 131 } 132 133 //! Get amount of vertices in meshbuffer. 134 /** \return Number of vertices in this buffer. */ getVertexCount()135 virtual u32 getVertexCount() const 136 { 137 return getVertexBuffer().size(); 138 } 139 140 //! Get type of index data which is stored in this meshbuffer. 141 /** \return Index type of this buffer. */ getIndexType()142 virtual video::E_INDEX_TYPE getIndexType() const 143 { 144 return getIndexBuffer().getType(); 145 } 146 147 //! Get access to Indices. 148 /** \return Pointer to indices array. */ getIndices()149 virtual const u16* getIndices() const 150 { 151 return (u16*)getIndexBuffer().getData(); 152 } 153 154 //! Get access to Indices. 155 /** \return Pointer to indices array. */ getIndices()156 virtual u16* getIndices() 157 { 158 return (u16*)getIndexBuffer().getData(); 159 } 160 161 //! Get amount of indices in this meshbuffer. 162 /** \return Number of indices in this buffer. */ getIndexCount()163 virtual u32 getIndexCount() const 164 { 165 return getIndexBuffer().size(); 166 } 167 168 //! returns position of vertex i getPosition(u32 i)169 virtual const core::vector3df& getPosition(u32 i) const 170 { 171 return getVertexBuffer()[i].Pos; 172 } 173 174 //! returns position of vertex i getPosition(u32 i)175 virtual core::vector3df& getPosition(u32 i) 176 { 177 return getVertexBuffer()[i].Pos; 178 } 179 180 //! returns texture coords of vertex i getTCoords(u32 i)181 virtual const core::vector2df& getTCoords(u32 i) const 182 { 183 return getVertexBuffer()[i].TCoords; 184 } 185 186 //! returns texture coords of vertex i getTCoords(u32 i)187 virtual core::vector2df& getTCoords(u32 i) 188 { 189 return getVertexBuffer()[i].TCoords; 190 } 191 192 //! returns normal of vertex i getNormal(u32 i)193 virtual const core::vector3df& getNormal(u32 i) const 194 { 195 return getVertexBuffer()[i].Normal; 196 } 197 198 //! returns normal of vertex i getNormal(u32 i)199 virtual core::vector3df& getNormal(u32 i) 200 { 201 return getVertexBuffer()[i].Normal; 202 } 203 }; 204 205 206 } // end namespace scene 207 } // end namespace irr 208 209 #endif 210 211 212