1
// Copyright (C) 2002-2011 Nikolaus Gebhardt
2
// This file is part of the "Irrlicht Engine".
3
// For conditions of distribution and use, see copyright notice in irrlicht.h
5
#include "CTriangleSelector.h"
6
#include "ISceneNode.h"
7
#include "IMeshBuffer.h"
8
#include "IAnimatedMeshSceneNode.h"
16
CTriangleSelector::CTriangleSelector(ISceneNode* node)
17
: SceneNode(node), AnimatedNode(0), LastMeshFrame(-1)
20
setDebugName("CTriangleSelector");
26
CTriangleSelector::CTriangleSelector(const IMesh* mesh, ISceneNode* node)
27
: SceneNode(node), AnimatedNode(0)
30
setDebugName("CTriangleSelector");
36
CTriangleSelector::CTriangleSelector(IAnimatedMeshSceneNode* node)
37
: SceneNode(reinterpret_cast<ISceneNode*>(node)), AnimatedNode(node)
40
setDebugName("CTriangleSelector");
46
IAnimatedMesh * animatedMesh = AnimatedNode->getMesh();
50
IMesh * mesh = animatedMesh->getMesh((s32)AnimatedNode->getFrameNr());
56
void CTriangleSelector::createFromMesh(const IMesh * mesh)
58
const u32 cnt = mesh->getMeshBufferCount();
59
u32 totalFaceCount = 0;
60
for (u32 j=0; j<cnt; ++j)
61
totalFaceCount += mesh->getMeshBuffer(j)->getIndexCount();
63
Triangles.reallocate(totalFaceCount);
65
for (u32 i=0; i<cnt; ++i)
67
const IMeshBuffer* buf = mesh->getMeshBuffer(i);
69
const u32 idxCnt = buf->getIndexCount();
70
const u16* const indices = buf->getIndices();
72
for (u32 j=0; j<idxCnt; j+=3)
74
Triangles.push_back(core::triangle3df(
75
buf->getPosition(indices[j+0]),
76
buf->getPosition(indices[j+1]),
77
buf->getPosition(indices[j+2])));
82
void CTriangleSelector::updateFromMesh(const IMesh* mesh) const
87
u32 meshBuffers = mesh->getMeshBufferCount();
88
u32 triangleCount = 0;
90
for (u32 i = 0; i < meshBuffers; ++i)
92
IMeshBuffer* buf = mesh->getMeshBuffer(i);
93
u32 idxCnt = buf->getIndexCount();
94
const u16* indices = buf->getIndices();
96
switch (buf->getVertexType())
98
case video::EVT_STANDARD:
100
video::S3DVertex* vtx = (video::S3DVertex*)buf->getVertices();
101
for (u32 index = 0; index < idxCnt; index += 3)
103
core::triangle3df & tri = Triangles[triangleCount++];
104
tri.pointA = vtx[indices[index + 0]].Pos;
105
tri.pointB = vtx[indices[index + 1]].Pos;
106
tri.pointC = vtx[indices[index + 2]].Pos;
110
case video::EVT_2TCOORDS:
112
video::S3DVertex2TCoords* vtx = (video::S3DVertex2TCoords*)buf->getVertices();
113
for (u32 index = 0; index < idxCnt; index += 3)
115
core::triangle3df & tri = Triangles[triangleCount++];
116
tri.pointA = vtx[indices[index + 0]].Pos;
117
tri.pointB = vtx[indices[index + 1]].Pos;
118
tri.pointC = vtx[indices[index + 2]].Pos;
122
case video::EVT_TANGENTS:
124
video::S3DVertexTangents* vtx = (video::S3DVertexTangents*)buf->getVertices();
125
for (u32 index = 0; index < idxCnt; index += 3)
127
core::triangle3df & tri = Triangles[triangleCount++];
128
tri.pointA = vtx[indices[index + 0]].Pos;
129
tri.pointB = vtx[indices[index + 1]].Pos;
130
tri.pointC = vtx[indices[index + 2]].Pos;
140
CTriangleSelector::CTriangleSelector(const core::aabbox3d<f32>& box, ISceneNode* node)
144
setDebugName("CTriangleSelector");
152
void CTriangleSelector::update(void) const
155
return; //< harmless no-op
157
s32 currentFrame = (s32)AnimatedNode->getFrameNr();
158
if (currentFrame == LastMeshFrame)
159
return; //< Nothing to do
161
LastMeshFrame = currentFrame;
162
IAnimatedMesh * animatedMesh = AnimatedNode->getMesh();
166
IMesh * mesh = animatedMesh->getMesh(LastMeshFrame);
169
updateFromMesh(mesh);
173
//! Gets all triangles.
174
void CTriangleSelector::getTriangles(core::triangle3df* triangles,
175
s32 arraySize, s32& outTriangleCount,
176
const core::matrix4* transform) const
178
// Update my triangles if necessary
181
s32 cnt = Triangles.size();
191
mat *= SceneNode->getAbsoluteTransformation();
193
for (s32 i=0; i<cnt; ++i)
195
mat.transformVect( triangles[i].pointA, Triangles[i].pointA );
196
mat.transformVect( triangles[i].pointB, Triangles[i].pointB );
197
mat.transformVect( triangles[i].pointC, Triangles[i].pointC );
200
outTriangleCount = cnt;
205
//! Gets all triangles which lie within a specific bounding box.
206
void CTriangleSelector::getTriangles(core::triangle3df* triangles,
207
s32 arraySize, s32& outTriangleCount,
208
const core::aabbox3d<f32>& box,
209
const core::matrix4* transform) const
211
// return all triangles
212
return getTriangles(triangles, arraySize, outTriangleCount, transform);
216
//! Gets all triangles which have or may have contact with a 3d line.
217
void CTriangleSelector::getTriangles(core::triangle3df* triangles,
218
s32 arraySize, s32& outTriangleCount,
219
const core::line3d<f32>& line,
220
const core::matrix4* transform) const
222
// return all triangles
223
return getTriangles(triangles, arraySize, outTriangleCount, transform);
227
//! Returns amount of all available triangles in this selector
228
s32 CTriangleSelector::getTriangleCount() const
230
return Triangles.size();
234
/* Get the number of TriangleSelectors that are part of this one.
235
Only useful for MetaTriangleSelector others return 1
237
u32 CTriangleSelector::getSelectorCount() const
243
/* Get the TriangleSelector based on index based on getSelectorCount.
244
Only useful for MetaTriangleSelector others return 'this' or 0
246
ITriangleSelector* CTriangleSelector::getSelector(u32 index)
255
/* Get the TriangleSelector based on index based on getSelectorCount.
256
Only useful for MetaTriangleSelector others return 'this' or 0
258
const ITriangleSelector* CTriangleSelector::getSelector(u32 index) const
267
} // end namespace scene
268
} // end namespace irr