1 // Copyright (C) 2002-2012 Nikolaus Gebhardt
\r
2 // This file is part of the "Irrlicht Engine".
\r
3 // For conditions of distribution and use, see copyright notice in irrlicht.h
\r
5 #include "CMetaTriangleSelector.h"
\r
13 CMetaTriangleSelector::CMetaTriangleSelector()
\r
16 setDebugName("CMetaTriangleSelector");
\r
22 CMetaTriangleSelector::~CMetaTriangleSelector()
\r
24 removeAllTriangleSelectors();
\r
28 //! Returns amount of all available triangles in this selector
\r
29 s32 CMetaTriangleSelector::getTriangleCount() const
\r
32 for (u32 i=0; i<TriangleSelectors.size(); ++i)
\r
33 count += TriangleSelectors[i]->getTriangleCount();
\r
39 //! Gets all triangles.
\r
40 void CMetaTriangleSelector::getTriangles(core::triangle3df* triangles, s32 arraySize,
\r
41 s32& outTriangleCount, const core::matrix4* transform, bool useNodeTransform,
\r
42 irr::core::array<SCollisionTriangleRange>* outTriangleInfo) const
\r
45 irr::u32 outTriangleInfoSize = outTriangleInfo ? outTriangleInfo->size() : 0;
\r
46 for (u32 i=0; i<TriangleSelectors.size(); ++i)
\r
49 TriangleSelectors[i]->getTriangles(triangles + outWritten,
\r
50 arraySize - outWritten, t, transform, useNodeTransform, outTriangleInfo);
\r
52 if ( outTriangleInfo )
\r
54 irr::u32 newTriangleInfoSize = outTriangleInfo->size();
\r
55 for ( u32 ti=outTriangleInfoSize; ti<newTriangleInfoSize; ++ti )
\r
57 (*outTriangleInfo)[ti].RangeStart += outWritten;
\r
59 outTriangleInfoSize = newTriangleInfoSize;
\r
63 if (outWritten==arraySize)
\r
67 outTriangleCount = outWritten;
\r
71 //! Gets all triangles which lie within a specific bounding box.
\r
72 void CMetaTriangleSelector::getTriangles(core::triangle3df* triangles, s32 arraySize,
\r
73 s32& outTriangleCount, const core::aabbox3d<f32>& box,
\r
74 const core::matrix4* transform, bool useNodeTransform,
\r
75 irr::core::array<SCollisionTriangleRange>* outTriangleInfo) const
\r
78 irr::u32 outTriangleInfoSize = outTriangleInfo ? outTriangleInfo->size() : 0;
\r
79 for (u32 i=0; i<TriangleSelectors.size(); ++i)
\r
82 TriangleSelectors[i]->getTriangles(triangles + outWritten,
\r
83 arraySize - outWritten, t, box, transform, useNodeTransform, outTriangleInfo);
\r
85 if ( outTriangleInfo )
\r
87 irr::u32 newTriangleInfoSize = outTriangleInfo->size();
\r
88 for ( u32 ti=outTriangleInfoSize; ti<newTriangleInfoSize; ++ti )
\r
90 (*outTriangleInfo)[ti].RangeStart += outWritten;
\r
92 outTriangleInfoSize = newTriangleInfoSize;
\r
96 if (outWritten==arraySize)
\r
100 outTriangleCount = outWritten;
\r
104 //! Gets all triangles which have or may have contact with a 3d line.
\r
105 void CMetaTriangleSelector::getTriangles(core::triangle3df* triangles, s32 arraySize,
\r
106 s32& outTriangleCount, const core::line3d<f32>& line,
\r
107 const core::matrix4* transform, bool useNodeTransform,
\r
108 irr::core::array<SCollisionTriangleRange>* outTriangleInfo) const
\r
110 s32 outWritten = 0;
\r
111 irr::u32 outTriangleInfoSize = outTriangleInfo ? outTriangleInfo->size() : 0;
\r
112 for (u32 i=0; i<TriangleSelectors.size(); ++i)
\r
115 TriangleSelectors[i]->getTriangles(triangles + outWritten,
\r
116 arraySize - outWritten, t, line, transform, useNodeTransform, outTriangleInfo);
\r
118 if ( outTriangleInfo )
\r
120 irr::u32 newTriangleInfoSize = outTriangleInfo->size();
\r
121 for ( u32 ti=outTriangleInfoSize; ti<newTriangleInfoSize; ++ti )
\r
123 (*outTriangleInfo)[ti].RangeStart += outWritten;
\r
125 outTriangleInfoSize = newTriangleInfoSize;
\r
129 if (outWritten==arraySize)
\r
133 outTriangleCount = outWritten;
\r
137 //! Adds a triangle selector to the collection of triangle selectors
\r
138 //! in this metaTriangleSelector.
\r
139 void CMetaTriangleSelector::addTriangleSelector(ITriangleSelector* toAdd)
\r
144 TriangleSelectors.push_back(toAdd);
\r
149 //! Removes a specific triangle selector which was added before from the collection.
\r
150 bool CMetaTriangleSelector::removeTriangleSelector(ITriangleSelector* toRemove)
\r
152 for (u32 i=0; i<TriangleSelectors.size(); ++i)
\r
154 if (toRemove == TriangleSelectors[i])
\r
156 TriangleSelectors[i]->drop();
\r
157 TriangleSelectors.erase(i);
\r
166 //! Removes all triangle selectors from the collection.
\r
167 void CMetaTriangleSelector::removeAllTriangleSelectors()
\r
169 for (u32 i=0; i<TriangleSelectors.size(); ++i)
\r
170 TriangleSelectors[i]->drop();
\r
172 TriangleSelectors.clear();
\r
176 //! Return the scene node associated with a given triangle.
\r
177 ISceneNode* CMetaTriangleSelector::getSceneNodeForTriangle(u32 triangleIndex) const
\r
179 u32 totalTriangles = 0;
\r
181 for (u32 i=0; i<TriangleSelectors.size(); ++i)
\r
183 totalTriangles += TriangleSelectors[i]->getTriangleCount();
\r
185 if(totalTriangles > triangleIndex)
\r
186 return TriangleSelectors[i]->getSceneNodeForTriangle(0);
\r
192 /* Return the number of TriangleSelectors that are inside this one,
\r
193 Only useful for MetaTriangleSelector others return 1
\r
195 u32 CMetaTriangleSelector::getSelectorCount() const
\r
197 return TriangleSelectors.size();
\r
201 /* Returns the TriangleSelector based on index based on getSelectorCount
\r
202 Only useful for MetaTriangleSelector others return 'this'
\r
204 ITriangleSelector* CMetaTriangleSelector::getSelector(u32 index)
\r
206 if (index >= TriangleSelectors.size())
\r
208 return TriangleSelectors[index];
\r
212 /* Returns the TriangleSelector based on index based on getSelectorCount
\r
213 Only useful for MetaTriangleSelector others return 'this'
\r
215 const ITriangleSelector* CMetaTriangleSelector::getSelector(u32 index) const
\r
217 if (index >= TriangleSelectors.size())
\r
219 return TriangleSelectors[index];
\r
223 } // end namespace scene
\r
224 } // end namespace irr
\r