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