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 "CMetaTriangleSelector.h"
13
CMetaTriangleSelector::CMetaTriangleSelector()
16
setDebugName("CMetaTriangleSelector");
22
CMetaTriangleSelector::~CMetaTriangleSelector()
24
removeAllTriangleSelectors();
28
//! Returns amount of all available triangles in this selector
29
s32 CMetaTriangleSelector::getTriangleCount() const
32
for (u32 i=0; i<TriangleSelectors.size(); ++i)
33
count += TriangleSelectors[i]->getTriangleCount();
39
//! Gets all triangles.
40
void CMetaTriangleSelector::getTriangles(core::triangle3df* triangles, s32 arraySize,
41
s32& outTriangleCount, const core::matrix4* transform) const
44
for (u32 i=0; i<TriangleSelectors.size(); ++i)
47
TriangleSelectors[i]->getTriangles(triangles + outWritten,
48
arraySize - outWritten, t, transform);
50
if (outWritten==arraySize)
54
outTriangleCount = outWritten;
58
//! Gets all triangles which lie within a specific bounding box.
59
void CMetaTriangleSelector::getTriangles(core::triangle3df* triangles, s32 arraySize,
60
s32& outTriangleCount, const core::aabbox3d<f32>& box,
61
const core::matrix4* transform) const
64
for (u32 i=0; i<TriangleSelectors.size(); ++i)
67
TriangleSelectors[i]->getTriangles(triangles + outWritten,
68
arraySize - outWritten, t, box, transform);
70
if (outWritten==arraySize)
74
outTriangleCount = outWritten;
78
//! Gets all triangles which have or may have contact with a 3d line.
79
void CMetaTriangleSelector::getTriangles(core::triangle3df* triangles, s32 arraySize,
80
s32& outTriangleCount, const core::line3d<f32>& line,
81
const core::matrix4* transform) const
84
for (u32 i=0; i<TriangleSelectors.size(); ++i)
87
TriangleSelectors[i]->getTriangles(triangles + outWritten,
88
arraySize - outWritten, t, line, transform);
90
if (outWritten==arraySize)
94
outTriangleCount = outWritten;
98
//! Adds a triangle selector to the collection of triangle selectors
99
//! in this metaTriangleSelector.
100
void CMetaTriangleSelector::addTriangleSelector(ITriangleSelector* toAdd)
105
TriangleSelectors.push_back(toAdd);
110
//! Removes a specific triangle selector which was added before from the collection.
111
bool CMetaTriangleSelector::removeTriangleSelector(ITriangleSelector* toRemove)
113
for (u32 i=0; i<TriangleSelectors.size(); ++i)
115
if (toRemove == TriangleSelectors[i])
117
TriangleSelectors[i]->drop();
118
TriangleSelectors.erase(i);
127
//! Removes all triangle selectors from the collection.
128
void CMetaTriangleSelector::removeAllTriangleSelectors()
130
for (u32 i=0; i<TriangleSelectors.size(); ++i)
131
TriangleSelectors[i]->drop();
133
TriangleSelectors.clear();
137
//! Return the scene node associated with a given triangle.
138
ISceneNode* CMetaTriangleSelector::getSceneNodeForTriangle(u32 triangleIndex) const
140
u32 totalTriangles = 0;
142
for (u32 i=0; i<TriangleSelectors.size(); ++i)
144
totalTriangles += TriangleSelectors[i]->getTriangleCount();
146
if(totalTriangles > triangleIndex)
147
return TriangleSelectors[i]->getSceneNodeForTriangle(0);
150
// For lack of anything more sensible, return the first selector.
151
return TriangleSelectors[0]->getSceneNodeForTriangle(0);
155
/* Return the number of TriangleSelectors that are inside this one,
156
Only useful for MetaTriangleSelector others return 1
158
u32 CMetaTriangleSelector::getSelectorCount() const
160
return TriangleSelectors.size();
164
/* Returns the TriangleSelector based on index based on getSelectorCount
165
Only useful for MetaTriangleSelector others return 'this'
167
ITriangleSelector* CMetaTriangleSelector::getSelector(u32 index)
169
if (index >= TriangleSelectors.size())
171
return TriangleSelectors[index];
175
/* Returns the TriangleSelector based on index based on getSelectorCount
176
Only useful for MetaTriangleSelector others return 'this'
178
const ITriangleSelector* CMetaTriangleSelector::getSelector(u32 index) const
180
if (index >= TriangleSelectors.size())
182
return TriangleSelectors[index];
186
} // end namespace scene
187
} // end namespace irr