]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/CMetaTriangleSelector.cpp
Merging r5975 through r6036 from trunk to ogl-es branch.
[irrlicht.git] / source / Irrlicht / CMetaTriangleSelector.cpp
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
4 \r
5 #include "CMetaTriangleSelector.h"\r
6 \r
7 namespace irr\r
8 {\r
9 namespace scene\r
10 {\r
11 \r
12 //! constructor\r
13 CMetaTriangleSelector::CMetaTriangleSelector()\r
14 {\r
15         #ifdef _DEBUG\r
16         setDebugName("CMetaTriangleSelector");\r
17         #endif\r
18 }\r
19 \r
20 \r
21 //! destructor\r
22 CMetaTriangleSelector::~CMetaTriangleSelector()\r
23 {\r
24         removeAllTriangleSelectors();\r
25 }\r
26 \r
27 \r
28 //! Returns amount of all available triangles in this selector\r
29 s32 CMetaTriangleSelector::getTriangleCount() const\r
30 {\r
31         s32 count = 0;\r
32         for (u32 i=0; i<TriangleSelectors.size(); ++i)\r
33                 count += TriangleSelectors[i]->getTriangleCount();\r
34 \r
35         return count;\r
36 }\r
37 \r
38 \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
43 {\r
44         s32 outWritten = 0;\r
45         irr::u32 outTriangleInfoSize = outTriangleInfo ? outTriangleInfo->size() : 0;\r
46         for (u32 i=0; i<TriangleSelectors.size(); ++i)\r
47         {\r
48                 s32 t = 0;\r
49                 TriangleSelectors[i]->getTriangles(triangles + outWritten,\r
50                                 arraySize - outWritten, t, transform, useNodeTransform, outTriangleInfo);\r
51 \r
52                 if ( outTriangleInfo )\r
53                 {\r
54                         irr::u32 newTriangleInfoSize = outTriangleInfo->size();\r
55                         for ( u32 ti=outTriangleInfoSize; ti<newTriangleInfoSize; ++ti )\r
56                         {\r
57                                 (*outTriangleInfo)[ti].RangeStart += outWritten;\r
58                         }\r
59                         outTriangleInfoSize = newTriangleInfoSize;\r
60                 }\r
61 \r
62                 outWritten += t;\r
63                 if (outWritten==arraySize)\r
64                         break;\r
65         }\r
66 \r
67         outTriangleCount = outWritten;\r
68 }\r
69 \r
70 \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
76 {\r
77         s32 outWritten = 0;\r
78         irr::u32 outTriangleInfoSize = outTriangleInfo ? outTriangleInfo->size() : 0;\r
79         for (u32 i=0; i<TriangleSelectors.size(); ++i)\r
80         {\r
81                 s32 t = 0;\r
82                 TriangleSelectors[i]->getTriangles(triangles + outWritten,\r
83                                 arraySize - outWritten, t, box, transform, useNodeTransform, outTriangleInfo);\r
84 \r
85                 if ( outTriangleInfo )\r
86                 {\r
87                         irr::u32 newTriangleInfoSize = outTriangleInfo->size();\r
88                         for ( u32 ti=outTriangleInfoSize; ti<newTriangleInfoSize; ++ti )\r
89                         {\r
90                                 (*outTriangleInfo)[ti].RangeStart += outWritten;\r
91                         }\r
92                         outTriangleInfoSize = newTriangleInfoSize;\r
93                 }\r
94 \r
95                 outWritten += t;\r
96                 if (outWritten==arraySize)\r
97                         break;\r
98         }\r
99 \r
100         outTriangleCount = outWritten;\r
101 }\r
102 \r
103 \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
109 {\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
113         {\r
114                 s32 t = 0;\r
115                 TriangleSelectors[i]->getTriangles(triangles + outWritten,\r
116                                 arraySize - outWritten, t, line, transform, useNodeTransform, outTriangleInfo);\r
117 \r
118                 if ( outTriangleInfo )\r
119                 {\r
120                         irr::u32 newTriangleInfoSize = outTriangleInfo->size();\r
121                         for ( u32 ti=outTriangleInfoSize; ti<newTriangleInfoSize; ++ti )\r
122                         {\r
123                                 (*outTriangleInfo)[ti].RangeStart += outWritten;\r
124                         }\r
125                         outTriangleInfoSize = newTriangleInfoSize;\r
126                 }\r
127 \r
128                 outWritten += t;\r
129                 if (outWritten==arraySize)\r
130                         break;\r
131         }\r
132 \r
133         outTriangleCount = outWritten;\r
134 }\r
135 \r
136 \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
140 {\r
141         if (!toAdd)\r
142                 return;\r
143 \r
144         TriangleSelectors.push_back(toAdd);\r
145         toAdd->grab();\r
146 }\r
147 \r
148 \r
149 //! Removes a specific triangle selector which was added before from the collection.\r
150 bool CMetaTriangleSelector::removeTriangleSelector(ITriangleSelector* toRemove)\r
151 {\r
152         for (u32 i=0; i<TriangleSelectors.size(); ++i)\r
153         {\r
154                 if (toRemove == TriangleSelectors[i])\r
155                 {\r
156                         TriangleSelectors[i]->drop();\r
157                         TriangleSelectors.erase(i);\r
158                         return true;\r
159                 }\r
160         }\r
161 \r
162         return false;\r
163 }\r
164 \r
165 \r
166 //! Removes all triangle selectors from the collection.\r
167 void CMetaTriangleSelector::removeAllTriangleSelectors()\r
168 {\r
169         for (u32 i=0; i<TriangleSelectors.size(); ++i)\r
170                 TriangleSelectors[i]->drop();\r
171 \r
172         TriangleSelectors.clear();\r
173 }\r
174 \r
175 \r
176 //! Return the scene node associated with a given triangle.\r
177 ISceneNode* CMetaTriangleSelector::getSceneNodeForTriangle(u32 triangleIndex) const\r
178 {\r
179         u32 totalTriangles = 0;\r
180 \r
181         for (u32 i=0; i<TriangleSelectors.size(); ++i)\r
182         {\r
183                 totalTriangles += TriangleSelectors[i]->getTriangleCount();\r
184 \r
185                 if(totalTriangles > triangleIndex)\r
186                         return TriangleSelectors[i]->getSceneNodeForTriangle(0);\r
187         }\r
188 \r
189         return 0;\r
190 }\r
191 \r
192 /* Return the number of TriangleSelectors that are inside this one,\r
193 Only useful for MetaTriangleSelector others return 1\r
194 */\r
195 u32 CMetaTriangleSelector::getSelectorCount() const\r
196 {\r
197         return TriangleSelectors.size();\r
198 }\r
199 \r
200 \r
201 /* Returns the TriangleSelector based on index based on getSelectorCount\r
202 Only useful for MetaTriangleSelector others return 'this'\r
203 */\r
204 ITriangleSelector* CMetaTriangleSelector::getSelector(u32 index)\r
205 {\r
206         if (index >= TriangleSelectors.size())\r
207                 return 0;\r
208         return TriangleSelectors[index];\r
209 }\r
210 \r
211 \r
212 /* Returns the TriangleSelector based on index based on getSelectorCount\r
213 Only useful for MetaTriangleSelector others return 'this'\r
214 */\r
215 const ITriangleSelector* CMetaTriangleSelector::getSelector(u32 index) const\r
216 {\r
217         if (index >= TriangleSelectors.size())\r
218                 return 0;\r
219         return TriangleSelectors[index];\r
220 }\r
221 \r
222 \r
223 } // end namespace scene\r
224 } // end namespace irr\r
225 \r