Skylicht Engine
Loading...
Searching...
No Matches
CMeshBuffer.h
1// Copyright (C) 2002-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 __T_MESH_BUFFER_H_INCLUDED__
6#define __T_MESH_BUFFER_H_INCLUDED__
7
8#include "IMeshBuffer.h"
9#include "IVertexDescriptor.h"
10
11namespace irr
12{
13namespace scene
14{
16 template <class T>
17 class CMeshBuffer : public IMeshBuffer
18 {
19 public:
21 CMeshBuffer(video::IVertexDescriptor* vertexDescriptor, video::E_INDEX_TYPE type = video::EIT_16BIT) : IMeshBuffer(vertexDescriptor)
22 {
23 #ifdef _DEBUG
24 setDebugName("CMeshBuffer");
25 #endif
26
28 {
29 VertexDescriptor->grab();
30
31 VertexBuffer.push_back(new CVertexBuffer<T>());
32
33 if (VertexDescriptor->getVertexSize(0) != VertexBuffer[0]->getVertexSize())
34 VertexBufferCompatible = false;
35 }
36 else
37 {
38 VertexBufferCompatible = false;
39 }
40
41 IndexBuffer = new CIndexBuffer(type);
42 }
43
44 // Copy constructor (due to problems with detect types a vertex and index buffers aren't duplicated, they are assigned like in assignment operator)
45 CMeshBuffer(const CMeshBuffer& meshBuffer) : IMeshBuffer(meshBuffer.VertexDescriptor)
46 {
49
50 Material = meshBuffer.Material;
51
52 const u32 vbCount = meshBuffer.VertexBuffer.size();
53
54 for (u32 i = 0; i < vbCount; ++i)
55 {
56 VertexBuffer.push_back(meshBuffer.VertexBuffer[i]);
57
58 if (VertexBuffer[i])
59 VertexBuffer[i]->grab();
60 }
61
62 IndexBuffer = meshBuffer.IndexBuffer;
63
64 if (IndexBuffer)
66
67 BoundingBox = meshBuffer.BoundingBox;
68 Transformation = meshBuffer.Transformation;
69 BoundingBoxNeedsRecalculated = meshBuffer.BoundingBoxNeedsRecalculated;
70 VertexBufferCompatible = meshBuffer.VertexBufferCompatible;
71 }
72
74 virtual ~CMeshBuffer()
75 {
76 const u32 vbCount = VertexBuffer.size();
77
78 for (u32 i = 0; i < vbCount; ++i)
79 {
80 if (VertexBuffer[i])
81 VertexBuffer[i]->drop();
82 }
83
84 if (IndexBuffer)
85 IndexBuffer->drop();
86
88 VertexDescriptor->drop();
89 }
90
91 virtual video::IVertexDescriptor* getVertexDescriptor() const
92 {
93 return VertexDescriptor;
94 }
95
96 virtual bool setVertexDescriptor(video::IVertexDescriptor* vertexDescriptor)
97 {
98 if (vertexDescriptor && vertexDescriptor != VertexDescriptor)
99 {
102
103 VertexDescriptor = vertexDescriptor;
105
106 bool vertexBufferCompatible = true;
107
108 for (u32 i = 0; i < VertexBuffer.size(); ++i)
109 {
110 if (VertexDescriptor->getVertexSize(i) != VertexBuffer[i]->getVertexSize())
111 {
112 vertexBufferCompatible = false;
113 break;
114 }
115 }
116
117 VertexBufferCompatible = vertexBufferCompatible;
118
119 return true;
120 }
121
122 return false;
123 }
124
125 virtual bool addVertexBuffer(IVertexBuffer* vertexBuffer)
126 {
127 bool status = false;
128
129 if (vertexBuffer && VertexDescriptor)
130 {
131 if (VertexDescriptor->getVertexSize(VertexBuffer.size()) != vertexBuffer->getVertexSize())
132 VertexBufferCompatible = false;
133
134 vertexBuffer->grab();
135 VertexBuffer.push_back(vertexBuffer);
136
137 status = true;
138 }
139
140 return status;
141 }
142
143 virtual IVertexBuffer* getVertexBuffer(u32 id = 0) const
144 {
145 IVertexBuffer* vb = 0;
146
147 if (id < VertexBuffer.size())
148 vb = VertexBuffer[id];
149
150 return vb;
151 }
152
153 virtual u32 getVertexBufferCount() const
154 {
155 return VertexBuffer.size();
156 }
157
158 virtual void removeVertexBuffer(u32 id)
159 {
160 if (id > 0 && id < VertexBuffer.size())
161 {
162 VertexBuffer[id]->drop();
163 VertexBuffer.erase(id);
164
165 bool vertexBufferCompatible = true;
166
168 {
169 for (u32 i = 0; i < VertexBuffer.size(); ++i)
170 {
171 if (VertexDescriptor->getVertexSize(i) != VertexBuffer[i]->getVertexSize())
172 {
173 vertexBufferCompatible = false;
174 break;
175 }
176 }
177 }
178 else
179 {
180 vertexBufferCompatible = false;
181 }
182
183 VertexBufferCompatible = vertexBufferCompatible;
184 }
185 }
186
187 virtual bool setVertexBuffer(IVertexBuffer* vertexBuffer, u32 id = 0)
188 {
189 if (id >= VertexBuffer.size() || !vertexBuffer || VertexBuffer[id] == vertexBuffer)
190 return false;
191
192 VertexBuffer[id]->drop();
193 vertexBuffer->grab();
194
195 VertexBuffer[id] = vertexBuffer;
196
197 bool vertexBufferCompatible = true;
198
200 {
201 for (u32 i = 0; i < VertexBuffer.size(); ++i)
202 {
203 if (VertexDescriptor->getVertexSize(i) != VertexBuffer[i]->getVertexSize())
204 {
205 vertexBufferCompatible = false;
206 break;
207 }
208 }
209 }
210 else
211 {
212 vertexBufferCompatible = false;
213 }
214
215 VertexBufferCompatible = vertexBufferCompatible;
216
217 return true;
218 }
219
220 virtual IIndexBuffer* getIndexBuffer() const
221 {
222 return IndexBuffer;
223 }
224
225 virtual bool setIndexBuffer(IIndexBuffer* indexBuffer)
226 {
227 if (!indexBuffer || IndexBuffer == indexBuffer)
228 return false;
229
230 IndexBuffer->drop();
231 indexBuffer->grab();
232
233 IndexBuffer = indexBuffer;
234
235 return true;
236 }
237
239
240 virtual const video::SMaterial& getMaterial() const
241 {
242 return Material;
243 }
244
246
248 {
249 return Material;
250 }
251
252 virtual video::E_VERTEX_TYPE getVertexType() const
253 {
255 }
256
258
259 virtual const core::aabbox3d<f32>& getBoundingBox() const
260 {
261 return BoundingBox;
262 }
263
265
267 {
268 return BoundingBox;
269 }
270
273 {
274 BoundingBoxNeedsRecalculated = true;
275 }
276
278
280 {
281 /*if(!BoundingBoxNeedsRecalculated)
282 return;*/
283
284 BoundingBoxNeedsRecalculated = false;
285
286 const video::IVertexAttribute* attribute = (VertexDescriptor && VertexBufferCompatible) ? VertexDescriptor->getAttributeBySemantic(video::EVAS_POSITION) : 0;
287
288 if (!attribute || attribute->getBufferID() >= VertexBuffer.size() || VertexBuffer[attribute->getBufferID()]->getVertexCount() == 0)
289 BoundingBox.reset(0,0,0);
290 else
291 {
292 const u32 bufferID = attribute->getBufferID();
293
294 u8* offset = static_cast<u8*>(VertexBuffer[bufferID]->getVertices());
295 offset += attribute->getOffset();
296
297 core::vector3df position(0.0f);
298
299 memcpy(&position, offset, sizeof(core::vector3df));
300
301 BoundingBox.reset(position);
302
303 const u32 vertexCount = VertexBuffer[bufferID]->getVertexCount();
304 const u32 vertexSize = VertexBuffer[bufferID]->getVertexSize();
305
306 for(u32 j = 1; j < vertexCount; ++j)
307 {
308 offset += vertexSize;
309 memcpy(&position, offset, sizeof(core::vector3df));
310 BoundingBox.addInternalPoint(position);
311 }
312 }
313 }
314
316
320 virtual void append(IVertexBuffer* vertexBuffer, u32 vertexBufferID, IIndexBuffer* indexBuffer)
321 {
322 if (vertexBufferID < VertexBuffer.size() && VertexDescriptor && vertexBuffer &&
323 vertexBuffer->getVertexSize() == VertexDescriptor->getVertexSize(vertexBufferID) &&
324 vertexBuffer->getVertexSize() == VertexBuffer[vertexBufferID]->getVertexSize())
325 {
326 const u32 vertexCount = vertexBuffer->getVertexCount();
327 const u32 vertexSize = vertexBuffer->getVertexSize();
328
329 VertexBuffer[vertexBufferID]->reallocate(VertexBuffer[vertexBufferID]->getVertexCount() + vertexCount);
330
331 video::IVertexAttribute* attribute = VertexDescriptor->getAttributeBySemantic(video::EVAS_POSITION);
332
333 u8* offset = static_cast<u8*>(vertexBuffer->getVertices());
334
335 const u32 attributeOffset = attribute ? attribute->getOffset() : 0;
336
337 for (u32 i = 0; i < vertexCount; ++i)
338 {
339 VertexBuffer[vertexBufferID]->addVertex(offset);
340
341 if (attribute)
342 {
343 u8* positionBuffer = offset + attributeOffset;
344
345 core::vector3df position(0.0f);
346 memcpy(&position, positionBuffer, sizeof(core::vector3df));
347 BoundingBox.addInternalPoint(position);
348 }
349
350 offset += vertexSize;
351 }
352 }
353
354 if (indexBuffer)
355 {
356 const u32 indexCount = indexBuffer->getIndexCount();
357
358 IndexBuffer->reallocate(IndexBuffer->getIndexCount() + indexCount);
359
360 for (u32 i = 0; i < indexCount; ++i)
361 IndexBuffer->addIndex(indexBuffer->getIndex(i));
362 }
363 }
364
366
371 virtual void append(IMeshBuffer* meshBuffer)
372 {
373 if (!meshBuffer || meshBuffer == this)
374 return;
375
376 append(meshBuffer->getVertexBuffer(0), 0, meshBuffer->getIndexBuffer());
377
378 const u32 bufferCount = meshBuffer->getVertexBufferCount();
379
380 for (u32 i = 1; i < bufferCount && i < VertexBuffer.size(); ++i)
381 append(meshBuffer->getVertexBuffer(i), i, 0);
382 }
383
386 {
387 return (id < VertexBuffer.size()) ? VertexBuffer[id]->getHardwareMappingHint() : EHM_NEVER;
388 }
389
392 {
393 return IndexBuffer->getHardwareMappingHint();
394 }
395
398 {
399 if((type == EBT_VERTEX_AND_INDEX || type == EBT_VERTEX) && id < VertexBuffer.size())
400 VertexBuffer[id]->setHardwareMappingHint(pMappingHint);
401
402 if(type == EBT_VERTEX_AND_INDEX || type == EBT_INDEX)
403 IndexBuffer->setHardwareMappingHint(pMappingHint);
404 }
405
407 virtual void setDirty(E_BUFFER_TYPE type = EBT_VERTEX_AND_INDEX, u32 id = 0)
408 {
409 if((type == EBT_VERTEX_AND_INDEX || type == EBT_VERTEX) && id < VertexBuffer.size())
410 VertexBuffer[id]->setDirty();
411
412 if(type == EBT_VERTEX_AND_INDEX || type == EBT_INDEX)
413 IndexBuffer->setDirty();
414 }
415
417
418 virtual u32 getChangedID_Vertex(u32 id = 0) const
419 {
420 return (id < VertexBuffer.size()) ? VertexBuffer[id]->getChangedID() : 0;
421 }
422
424
425 virtual u32 getChangedID_Index() const
426 {
427 return IndexBuffer->getChangedID();
428 }
429
430 virtual core::matrix4& getTransformation()
431 {
432 return Transformation;
433 }
434
435 virtual void setUseForHardwareInstancing(bool b)
436 {
437 UseForHardwareInstancing = b;
438 }
439
440 virtual bool useForHardwareInstancing()
441 {
442 return UseForHardwareInstancing;
443 }
444 };
445} // end namespace scene
446} // end namespace irr
447
448#endif
449
450
bool drop() const
Drops the object. Decrements the reference counter by one.
Definition IReferenceCounted.h:126
void grab() const
Grabs the object. Increments the reference counter by one.
Definition IReferenceCounted.h:96
void setDebugName(const c8 *newName)
Sets the debug name of the object.
Definition IReferenceCounted.h:163
Axis aligned bounding box in 3d dimensional space.
Definition aabbox3d.h:22
Definition CIndexBuffer.h:15
Implementation of the IMeshBuffer interface.
Definition CMeshBuffer.h:18
virtual const core::aabbox3d< f32 > & getBoundingBox() const
Get the axis aligned bounding box.
Definition CMeshBuffer.h:259
virtual void append(IVertexBuffer *vertexBuffer, u32 vertexBufferID, IIndexBuffer *indexBuffer)
Append the vertices and indices to the current buffer.
Definition CMeshBuffer.h:320
virtual u32 getChangedID_Vertex(u32 id=0) const
Get the currently used ID for identification of changes.
Definition CMeshBuffer.h:418
virtual E_HARDWARE_MAPPING getHardwareMappingHint_Index() const
get the current hardware mapping hint
Definition CMeshBuffer.h:391
CMeshBuffer(video::IVertexDescriptor *vertexDescriptor, video::E_INDEX_TYPE type=video::EIT_16BIT)
Constructor.
Definition CMeshBuffer.h:21
virtual core::aabbox3d< f32 > & getBoundingBox()
Get the axis aligned bounding box.
Definition CMeshBuffer.h:266
virtual void append(IMeshBuffer *meshBuffer)
Append the meshbuffer to the current buffer.
Definition CMeshBuffer.h:371
virtual ~CMeshBuffer()
Destructor.
Definition CMeshBuffer.h:74
virtual video::SMaterial & getMaterial()
Get material of this meshbuffer.
Definition CMeshBuffer.h:247
virtual void boundingBoxNeedsRecalculated()
Call this after changing the positions of any vertex.
Definition CMeshBuffer.h:272
virtual void setHardwareMappingHint(E_HARDWARE_MAPPING pMappingHint, E_BUFFER_TYPE type=EBT_VERTEX_AND_INDEX, u32 id=0)
set the hardware mapping hint, for driver
Definition CMeshBuffer.h:397
virtual void recalculateBoundingBox()
Recalculate the bounding box.
Definition CMeshBuffer.h:279
virtual const video::SMaterial & getMaterial() const
Get material of this meshbuffer.
Definition CMeshBuffer.h:240
virtual u32 getChangedID_Index() const
Get the currently used ID for identification of changes.
Definition CMeshBuffer.h:425
virtual void setDirty(E_BUFFER_TYPE type=EBT_VERTEX_AND_INDEX, u32 id=0)
flags the mesh as changed, reloads hardware buffers
Definition CMeshBuffer.h:407
virtual E_HARDWARE_MAPPING getHardwareMappingHint_Vertex(u32 id=0) const
get the current hardware mapping hint
Definition CMeshBuffer.h:385
Definition CVertexBuffer.h:17
Definition IIndexBuffer.h:25
Struct for holding a mesh with a single material.
Definition IMeshBuffer.h:42
core::array< scene::IVertexBuffer * > VertexBuffer
Vertex buffer array.
Definition IMeshBuffer.h:186
video::IVertexDescriptor * VertexDescriptor
Vertex descriptor.
Definition IMeshBuffer.h:180
core::aabbox3d< f32 > BoundingBox
Bounding box.
Definition IMeshBuffer.h:201
scene::IIndexBuffer * IndexBuffer
Index buffer.
Definition IMeshBuffer.h:189
video::SMaterial Material
Material.
Definition IMeshBuffer.h:195
Definition IVertexBuffer.h:17
Definition IVertexDescriptor.h:70
Definition IVertexDescriptor.h:154
Struct for holding parameters for a material renderer.
Definition SMaterial.h:255
vector3d< f32 > vector3df
Typedef for a f32 3d vector.
Definition vector3d.h:445
CMatrix4< f32 > matrix4
Typedef for f32 matrix.
Definition matrix4.h:2241
All scene management can be found in this namespace: Mesh loading, special scene nodes like octrees a...
Definition CIndexBuffer.h:13
E_BUFFER_TYPE
Definition EHardwareBufferFlags.h:29
@ EBT_VERTEX_AND_INDEX
Change both vertex and index mapping to the same value.
Definition EHardwareBufferFlags.h:37
@ EBT_INDEX
Change the index mapping.
Definition EHardwareBufferFlags.h:35
@ EBT_VERTEX
Change the vertex mapping.
Definition EHardwareBufferFlags.h:33
E_HARDWARE_MAPPING
Definition EHardwareBufferFlags.h:14
@ EHM_NEVER
Don't store on the hardware.
Definition EHardwareBufferFlags.h:16
E_VERTEX_TYPE
Enumeration for all vertex types there are.
Definition S3DVertex.h:19
Everything in the Irrlicht Engine can be found in this namespace.
Definition Skylicht.h:33
unsigned int u32
32 bit unsigned variable.
Definition irrTypes.h:58
unsigned char u8
8 bit unsigned variable.
Definition irrTypes.h:18