diff options
Diffstat (limited to 'libraries/irrlicht-1.8/source/Irrlicht/CTerrainTriangleSelector.cpp')
-rw-r--r-- | libraries/irrlicht-1.8/source/Irrlicht/CTerrainTriangleSelector.cpp | 468 |
1 files changed, 234 insertions, 234 deletions
diff --git a/libraries/irrlicht-1.8/source/Irrlicht/CTerrainTriangleSelector.cpp b/libraries/irrlicht-1.8/source/Irrlicht/CTerrainTriangleSelector.cpp index 91820ce..7f90f60 100644 --- a/libraries/irrlicht-1.8/source/Irrlicht/CTerrainTriangleSelector.cpp +++ b/libraries/irrlicht-1.8/source/Irrlicht/CTerrainTriangleSelector.cpp | |||
@@ -1,234 +1,234 @@ | |||
1 | // Copyright (C) 2002-2012 Nikolaus Gebhardt | 1 | // Copyright (C) 2002-2012 Nikolaus Gebhardt |
2 | // This file is part of the "Irrlicht Engine". | 2 | // This file is part of the "Irrlicht Engine". |
3 | // For conditions of distribution and use, see copyright notice in irrlicht.h | 3 | // For conditions of distribution and use, see copyright notice in irrlicht.h |
4 | 4 | ||
5 | #include "CTerrainTriangleSelector.h" | 5 | #include "CTerrainTriangleSelector.h" |
6 | #include "CTerrainSceneNode.h" | 6 | #include "CTerrainSceneNode.h" |
7 | #include "os.h" | 7 | #include "os.h" |
8 | 8 | ||
9 | namespace irr | 9 | namespace irr |
10 | { | 10 | { |
11 | namespace scene | 11 | namespace scene |
12 | { | 12 | { |
13 | 13 | ||
14 | 14 | ||
15 | //! constructor | 15 | //! constructor |
16 | CTerrainTriangleSelector::CTerrainTriangleSelector ( ITerrainSceneNode* node, s32 LOD ) | 16 | CTerrainTriangleSelector::CTerrainTriangleSelector ( ITerrainSceneNode* node, s32 LOD ) |
17 | : SceneNode(node) | 17 | : SceneNode(node) |
18 | { | 18 | { |
19 | #ifdef _DEBUG | 19 | #ifdef _DEBUG |
20 | setDebugName ("CTerrainTriangleSelector"); | 20 | setDebugName ("CTerrainTriangleSelector"); |
21 | #endif | 21 | #endif |
22 | 22 | ||
23 | setTriangleData(node, LOD); | 23 | setTriangleData(node, LOD); |
24 | } | 24 | } |
25 | 25 | ||
26 | 26 | ||
27 | //! destructor | 27 | //! destructor |
28 | CTerrainTriangleSelector::~CTerrainTriangleSelector() | 28 | CTerrainTriangleSelector::~CTerrainTriangleSelector() |
29 | { | 29 | { |
30 | TrianglePatches.TrianglePatchArray.clear(); | 30 | TrianglePatches.TrianglePatchArray.clear(); |
31 | } | 31 | } |
32 | 32 | ||
33 | 33 | ||
34 | //! Clears and sets triangle data | 34 | //! Clears and sets triangle data |
35 | void CTerrainTriangleSelector::setTriangleData(ITerrainSceneNode* node, s32 LOD) | 35 | void CTerrainTriangleSelector::setTriangleData(ITerrainSceneNode* node, s32 LOD) |
36 | { | 36 | { |
37 | // Get pointer to the GeoMipMaps vertices | 37 | // Get pointer to the GeoMipMaps vertices |
38 | const video::S3DVertex2TCoords* vertices = static_cast<const video::S3DVertex2TCoords*>(node->getRenderBuffer()->getVertices()); | 38 | const video::S3DVertex2TCoords* vertices = static_cast<const video::S3DVertex2TCoords*>(node->getRenderBuffer()->getVertices()); |
39 | 39 | ||
40 | // Clear current data | 40 | // Clear current data |
41 | const s32 count = (static_cast<CTerrainSceneNode*>(node))->TerrainData.PatchCount; | 41 | const s32 count = (static_cast<CTerrainSceneNode*>(node))->TerrainData.PatchCount; |
42 | TrianglePatches.TotalTriangles = 0; | 42 | TrianglePatches.TotalTriangles = 0; |
43 | TrianglePatches.NumPatches = count*count; | 43 | TrianglePatches.NumPatches = count*count; |
44 | 44 | ||
45 | TrianglePatches.TrianglePatchArray.reallocate(TrianglePatches.NumPatches); | 45 | TrianglePatches.TrianglePatchArray.reallocate(TrianglePatches.NumPatches); |
46 | for (s32 o=0; o<TrianglePatches.NumPatches; ++o) | 46 | for (s32 o=0; o<TrianglePatches.NumPatches; ++o) |
47 | TrianglePatches.TrianglePatchArray.push_back(SGeoMipMapTrianglePatch()); | 47 | TrianglePatches.TrianglePatchArray.push_back(SGeoMipMapTrianglePatch()); |
48 | 48 | ||
49 | core::triangle3df tri; | 49 | core::triangle3df tri; |
50 | core::array<u32> indices; | 50 | core::array<u32> indices; |
51 | s32 tIndex = 0; | 51 | s32 tIndex = 0; |
52 | for(s32 x = 0; x < count; ++x ) | 52 | for(s32 x = 0; x < count; ++x ) |
53 | { | 53 | { |
54 | for(s32 z = 0; z < count; ++z ) | 54 | for(s32 z = 0; z < count; ++z ) |
55 | { | 55 | { |
56 | TrianglePatches.TrianglePatchArray[tIndex].NumTriangles = 0; | 56 | TrianglePatches.TrianglePatchArray[tIndex].NumTriangles = 0; |
57 | TrianglePatches.TrianglePatchArray[tIndex].Box = node->getBoundingBox( x, z ); | 57 | TrianglePatches.TrianglePatchArray[tIndex].Box = node->getBoundingBox( x, z ); |
58 | u32 indexCount = node->getIndicesForPatch( indices, x, z, LOD ); | 58 | u32 indexCount = node->getIndicesForPatch( indices, x, z, LOD ); |
59 | 59 | ||
60 | TrianglePatches.TrianglePatchArray[tIndex].Triangles.reallocate(indexCount/3); | 60 | TrianglePatches.TrianglePatchArray[tIndex].Triangles.reallocate(indexCount/3); |
61 | for(u32 i = 0; i < indexCount; i += 3 ) | 61 | for(u32 i = 0; i < indexCount; i += 3 ) |
62 | { | 62 | { |
63 | tri.pointA = vertices[indices[i+0]].Pos; | 63 | tri.pointA = vertices[indices[i+0]].Pos; |
64 | tri.pointB = vertices[indices[i+1]].Pos; | 64 | tri.pointB = vertices[indices[i+1]].Pos; |
65 | tri.pointC = vertices[indices[i+2]].Pos; | 65 | tri.pointC = vertices[indices[i+2]].Pos; |
66 | TrianglePatches.TrianglePatchArray[tIndex].Triangles.push_back(tri); | 66 | TrianglePatches.TrianglePatchArray[tIndex].Triangles.push_back(tri); |
67 | ++TrianglePatches.TrianglePatchArray[tIndex].NumTriangles; | 67 | ++TrianglePatches.TrianglePatchArray[tIndex].NumTriangles; |
68 | } | 68 | } |
69 | 69 | ||
70 | TrianglePatches.TotalTriangles += TrianglePatches.TrianglePatchArray[tIndex].NumTriangles; | 70 | TrianglePatches.TotalTriangles += TrianglePatches.TrianglePatchArray[tIndex].NumTriangles; |
71 | ++tIndex; | 71 | ++tIndex; |
72 | } | 72 | } |
73 | } | 73 | } |
74 | } | 74 | } |
75 | 75 | ||
76 | 76 | ||
77 | //! Gets all triangles. | 77 | //! Gets all triangles. |
78 | void CTerrainTriangleSelector::getTriangles(core::triangle3df* triangles, | 78 | void CTerrainTriangleSelector::getTriangles(core::triangle3df* triangles, |
79 | s32 arraySize, s32& outTriangleCount, | 79 | s32 arraySize, s32& outTriangleCount, |
80 | const core::matrix4* transform) const | 80 | const core::matrix4* transform) const |
81 | { | 81 | { |
82 | s32 count = TrianglePatches.TotalTriangles; | 82 | s32 count = TrianglePatches.TotalTriangles; |
83 | 83 | ||
84 | if (count > arraySize) | 84 | if (count > arraySize) |
85 | count = arraySize; | 85 | count = arraySize; |
86 | 86 | ||
87 | core::matrix4 mat; | 87 | core::matrix4 mat; |
88 | 88 | ||
89 | if (transform) | 89 | if (transform) |
90 | mat = (*transform); | 90 | mat = (*transform); |
91 | 91 | ||
92 | s32 tIndex = 0; | 92 | s32 tIndex = 0; |
93 | 93 | ||
94 | for (s32 i=0; i<TrianglePatches.NumPatches; ++i) | 94 | for (s32 i=0; i<TrianglePatches.NumPatches; ++i) |
95 | { | 95 | { |
96 | if (tIndex + TrianglePatches.TrianglePatchArray[i].NumTriangles <= count) | 96 | if (tIndex + TrianglePatches.TrianglePatchArray[i].NumTriangles <= count) |
97 | for (s32 j=0; j<TrianglePatches.TrianglePatchArray[i].NumTriangles; ++j) | 97 | for (s32 j=0; j<TrianglePatches.TrianglePatchArray[i].NumTriangles; ++j) |
98 | { | 98 | { |
99 | triangles[tIndex] = TrianglePatches.TrianglePatchArray[i].Triangles[j]; | 99 | triangles[tIndex] = TrianglePatches.TrianglePatchArray[i].Triangles[j]; |
100 | 100 | ||
101 | mat.transformVect(triangles[tIndex].pointA); | 101 | mat.transformVect(triangles[tIndex].pointA); |
102 | mat.transformVect(triangles[tIndex].pointB); | 102 | mat.transformVect(triangles[tIndex].pointB); |
103 | mat.transformVect(triangles[tIndex].pointC); | 103 | mat.transformVect(triangles[tIndex].pointC); |
104 | 104 | ||
105 | ++tIndex; | 105 | ++tIndex; |
106 | } | 106 | } |
107 | } | 107 | } |
108 | 108 | ||
109 | outTriangleCount = tIndex; | 109 | outTriangleCount = tIndex; |
110 | } | 110 | } |
111 | 111 | ||
112 | 112 | ||
113 | //! Gets all triangles which lie within a specific bounding box. | 113 | //! Gets all triangles which lie within a specific bounding box. |
114 | void CTerrainTriangleSelector::getTriangles(core::triangle3df* triangles, | 114 | void CTerrainTriangleSelector::getTriangles(core::triangle3df* triangles, |
115 | s32 arraySize, s32& outTriangleCount, | 115 | s32 arraySize, s32& outTriangleCount, |
116 | const core::aabbox3d<f32>& box, const core::matrix4* transform) const | 116 | const core::aabbox3d<f32>& box, const core::matrix4* transform) const |
117 | { | 117 | { |
118 | s32 count = TrianglePatches.TotalTriangles; | 118 | s32 count = TrianglePatches.TotalTriangles; |
119 | 119 | ||
120 | if (count > arraySize) | 120 | if (count > arraySize) |
121 | count = arraySize; | 121 | count = arraySize; |
122 | 122 | ||
123 | core::matrix4 mat; | 123 | core::matrix4 mat; |
124 | 124 | ||
125 | if (transform) | 125 | if (transform) |
126 | mat = (*transform); | 126 | mat = (*transform); |
127 | 127 | ||
128 | s32 tIndex = 0; | 128 | s32 tIndex = 0; |
129 | 129 | ||
130 | for (s32 i=0; i<TrianglePatches.NumPatches; ++i) | 130 | for (s32 i=0; i<TrianglePatches.NumPatches; ++i) |
131 | { | 131 | { |
132 | if (tIndex + TrianglePatches.TrianglePatchArray[i].NumTriangles <= count && | 132 | if (tIndex + TrianglePatches.TrianglePatchArray[i].NumTriangles <= count && |
133 | TrianglePatches.TrianglePatchArray[i].Box.intersectsWithBox(box)) | 133 | TrianglePatches.TrianglePatchArray[i].Box.intersectsWithBox(box)) |
134 | for (s32 j=0; j<TrianglePatches.TrianglePatchArray[i].NumTriangles; ++j) | 134 | for (s32 j=0; j<TrianglePatches.TrianglePatchArray[i].NumTriangles; ++j) |
135 | { | 135 | { |
136 | triangles[tIndex] = TrianglePatches.TrianglePatchArray[i].Triangles[j]; | 136 | triangles[tIndex] = TrianglePatches.TrianglePatchArray[i].Triangles[j]; |
137 | 137 | ||
138 | mat.transformVect(triangles[tIndex].pointA); | 138 | mat.transformVect(triangles[tIndex].pointA); |
139 | mat.transformVect(triangles[tIndex].pointB); | 139 | mat.transformVect(triangles[tIndex].pointB); |
140 | mat.transformVect(triangles[tIndex].pointC); | 140 | mat.transformVect(triangles[tIndex].pointC); |
141 | 141 | ||
142 | ++tIndex; | 142 | ++tIndex; |
143 | } | 143 | } |
144 | } | 144 | } |
145 | 145 | ||
146 | outTriangleCount = tIndex; | 146 | outTriangleCount = tIndex; |
147 | } | 147 | } |
148 | 148 | ||
149 | 149 | ||
150 | //! Gets all triangles which have or may have contact with a 3d line. | 150 | //! Gets all triangles which have or may have contact with a 3d line. |
151 | void CTerrainTriangleSelector::getTriangles(core::triangle3df* triangles, | 151 | void CTerrainTriangleSelector::getTriangles(core::triangle3df* triangles, |
152 | s32 arraySize, s32& outTriangleCount, const core::line3d<f32>& line, | 152 | s32 arraySize, s32& outTriangleCount, const core::line3d<f32>& line, |
153 | const core::matrix4* transform) const | 153 | const core::matrix4* transform) const |
154 | { | 154 | { |
155 | const s32 count = core::min_((s32)TrianglePatches.TotalTriangles, arraySize); | 155 | const s32 count = core::min_((s32)TrianglePatches.TotalTriangles, arraySize); |
156 | 156 | ||
157 | core::matrix4 mat; | 157 | core::matrix4 mat; |
158 | 158 | ||
159 | if (transform) | 159 | if (transform) |
160 | mat = (*transform); | 160 | mat = (*transform); |
161 | 161 | ||
162 | s32 tIndex = 0; | 162 | s32 tIndex = 0; |
163 | 163 | ||
164 | for (s32 i=0; i<TrianglePatches.NumPatches; ++i) | 164 | for (s32 i=0; i<TrianglePatches.NumPatches; ++i) |
165 | { | 165 | { |
166 | if (tIndex + TrianglePatches.TrianglePatchArray[i].NumTriangles <= count | 166 | if (tIndex + TrianglePatches.TrianglePatchArray[i].NumTriangles <= count |
167 | && TrianglePatches.TrianglePatchArray[i].Box.intersectsWithLine(line)) | 167 | && TrianglePatches.TrianglePatchArray[i].Box.intersectsWithLine(line)) |
168 | { | 168 | { |
169 | for (s32 j=0; j<TrianglePatches.TrianglePatchArray[i].NumTriangles; ++j) | 169 | for (s32 j=0; j<TrianglePatches.TrianglePatchArray[i].NumTriangles; ++j) |
170 | { | 170 | { |
171 | triangles[tIndex] = TrianglePatches.TrianglePatchArray[i].Triangles[j]; | 171 | triangles[tIndex] = TrianglePatches.TrianglePatchArray[i].Triangles[j]; |
172 | 172 | ||
173 | mat.transformVect(triangles[tIndex].pointA); | 173 | mat.transformVect(triangles[tIndex].pointA); |
174 | mat.transformVect(triangles[tIndex].pointB); | 174 | mat.transformVect(triangles[tIndex].pointB); |
175 | mat.transformVect(triangles[tIndex].pointC); | 175 | mat.transformVect(triangles[tIndex].pointC); |
176 | 176 | ||
177 | ++tIndex; | 177 | ++tIndex; |
178 | } | 178 | } |
179 | } | 179 | } |
180 | } | 180 | } |
181 | 181 | ||
182 | outTriangleCount = tIndex; | 182 | outTriangleCount = tIndex; |
183 | } | 183 | } |
184 | 184 | ||
185 | 185 | ||
186 | //! Returns amount of all available triangles in this selector | 186 | //! Returns amount of all available triangles in this selector |
187 | s32 CTerrainTriangleSelector::getTriangleCount() const | 187 | s32 CTerrainTriangleSelector::getTriangleCount() const |
188 | { | 188 | { |
189 | return TrianglePatches.TotalTriangles; | 189 | return TrianglePatches.TotalTriangles; |
190 | } | 190 | } |
191 | 191 | ||
192 | 192 | ||
193 | ISceneNode* CTerrainTriangleSelector::getSceneNodeForTriangle( | 193 | ISceneNode* CTerrainTriangleSelector::getSceneNodeForTriangle( |
194 | u32 triangleIndex) const | 194 | u32 triangleIndex) const |
195 | { | 195 | { |
196 | return SceneNode; | 196 | return SceneNode; |
197 | } | 197 | } |
198 | 198 | ||
199 | 199 | ||
200 | /* Get the number of TriangleSelectors that are part of this one. | 200 | /* Get the number of TriangleSelectors that are part of this one. |
201 | Only useful for MetaTriangleSelector others return 1 | 201 | Only useful for MetaTriangleSelector others return 1 |
202 | */ | 202 | */ |
203 | u32 CTerrainTriangleSelector::getSelectorCount() const | 203 | u32 CTerrainTriangleSelector::getSelectorCount() const |
204 | { | 204 | { |
205 | return 1; | 205 | return 1; |
206 | } | 206 | } |
207 | 207 | ||
208 | 208 | ||
209 | /* Get the TriangleSelector based on index based on getSelectorCount. | 209 | /* Get the TriangleSelector based on index based on getSelectorCount. |
210 | Only useful for MetaTriangleSelector others return 'this' or 0 | 210 | Only useful for MetaTriangleSelector others return 'this' or 0 |
211 | */ | 211 | */ |
212 | ITriangleSelector* CTerrainTriangleSelector::getSelector(u32 index) | 212 | ITriangleSelector* CTerrainTriangleSelector::getSelector(u32 index) |
213 | { | 213 | { |
214 | if (index) | 214 | if (index) |
215 | return 0; | 215 | return 0; |
216 | else | 216 | else |
217 | return this; | 217 | return this; |
218 | } | 218 | } |
219 | 219 | ||
220 | 220 | ||
221 | /* Get the TriangleSelector based on index based on getSelectorCount. | 221 | /* Get the TriangleSelector based on index based on getSelectorCount. |
222 | Only useful for MetaTriangleSelector others return 'this' or 0 | 222 | Only useful for MetaTriangleSelector others return 'this' or 0 |
223 | */ | 223 | */ |
224 | const ITriangleSelector* CTerrainTriangleSelector::getSelector(u32 index) const | 224 | const ITriangleSelector* CTerrainTriangleSelector::getSelector(u32 index) const |
225 | { | 225 | { |
226 | if (index) | 226 | if (index) |
227 | return 0; | 227 | return 0; |
228 | else | 228 | else |
229 | return this; | 229 | return this; |
230 | } | 230 | } |
231 | 231 | ||
232 | 232 | ||
233 | } // end namespace scene | 233 | } // end namespace scene |
234 | } // end namespace irr | 234 | } // end namespace irr |