@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
21
21
#include " debug.h"
22
22
#include " log.h"
23
23
#include " irrMap.h"
24
+ #include < cmath>
24
25
#include < iostream>
25
26
#include < IAnimatedMesh.h>
26
27
#include < SAnimatedMesh.h>
@@ -202,6 +203,20 @@ void setMeshColor(scene::IMesh *mesh, const video::SColor &color)
202
203
setMeshBufferColor (mesh->getMeshBuffer (j), color);
203
204
}
204
205
206
+ template <typename F>
207
+ static void applyToMesh (scene::IMesh *mesh, const F &fn)
208
+ {
209
+ u16 mc = mesh->getMeshBufferCount ();
210
+ for (u16 j = 0 ; j < mc; j++) {
211
+ scene::IMeshBuffer *buf = mesh->getMeshBuffer (j);
212
+ const u32 stride = getVertexPitchFromType (buf->getVertexType ());
213
+ u32 vertex_count = buf->getVertexCount ();
214
+ char *vertices = reinterpret_cast <char *>(buf->getVertices ());
215
+ for (u32 i = 0 ; i < vertex_count; i++)
216
+ fn (reinterpret_cast <video::S3DVertex *>(vertices + i * stride));
217
+ }
218
+ }
219
+
205
220
void colorizeMeshBuffer (scene::IMeshBuffer *buf, const video::SColor *buffercolor)
206
221
{
207
222
const u32 stride = getVertexPitchFromType (buf->getVertexType ());
@@ -222,161 +237,79 @@ void setMeshColorByNormalXYZ(scene::IMesh *mesh,
222
237
const video::SColor &colorY,
223
238
const video::SColor &colorZ)
224
239
{
225
- if (mesh == NULL )
240
+ if (! mesh)
226
241
return ;
227
-
228
- u16 mc = mesh->getMeshBufferCount ();
229
- for (u16 j = 0 ; j < mc; j++) {
230
- scene::IMeshBuffer *buf = mesh->getMeshBuffer (j);
231
- const u32 stride = getVertexPitchFromType (buf->getVertexType ());
232
- u32 vertex_count = buf->getVertexCount ();
233
- u8 *vertices = (u8 *)buf->getVertices ();
234
- for (u32 i = 0 ; i < vertex_count; i++) {
235
- video::S3DVertex *vertex = (video::S3DVertex *)(vertices + i * stride);
236
- f32 x = fabs (vertex->Normal .X );
237
- f32 y = fabs (vertex->Normal .Y );
238
- f32 z = fabs (vertex->Normal .Z );
239
- if (x >= y && x >= z)
240
- vertex->Color = colorX;
241
- else if (y >= z)
242
- vertex->Color = colorY;
243
- else
244
- vertex->Color = colorZ;
245
- }
246
- }
242
+ auto colorizator = [=] (video::S3DVertex *vertex) {
243
+ f32 x = fabs (vertex->Normal .X );
244
+ f32 y = fabs (vertex->Normal .Y );
245
+ f32 z = fabs (vertex->Normal .Z );
246
+ if (x >= y && x >= z)
247
+ vertex->Color = colorX;
248
+ else if (y >= z)
249
+ vertex->Color = colorY;
250
+ else
251
+ vertex->Color = colorZ;
252
+ };
253
+ applyToMesh (mesh, colorizator);
247
254
}
248
255
249
256
void setMeshColorByNormal (scene::IMesh *mesh, const v3f &normal ,
250
257
const video::SColor &color)
251
258
{
252
259
if (!mesh)
253
260
return ;
261
+ auto colorizator = [normal , color] (video::S3DVertex *vertex) {
262
+ if (vertex->Normal == normal )
263
+ vertex->Color = color;
264
+ };
265
+ applyToMesh (mesh, colorizator);
266
+ }
254
267
255
- u16 mc = mesh-> getMeshBufferCount ();
256
- for (u16 j = 0 ; j < mc; j++) {
257
- scene::IMeshBuffer *buf = mesh-> getMeshBuffer (j);
258
- const u32 stride = getVertexPitchFromType (buf-> getVertexType ()) ;
259
- u32 vertex_count = buf-> getVertexCount ( );
260
- u8 *vertices = (u8 *)buf-> getVertices ( );
261
- for (u32 i = 0 ; i < vertex_count; i++ ) {
262
- video::S3DVertex *vertex = (video::S3DVertex *)(vertices + i * stride) ;
263
- if ( normal == vertex->Normal ) {
264
- vertex->Color = color ;
265
- }
266
- }
267
- }
268
+ template < float v3f::*U, float v3f::*V>
269
+ static void rotateMesh (scene::IMesh *mesh, float degrees)
270
+ {
271
+ degrees *= M_PI / 180 . 0f ;
272
+ float c = std::cos (degrees );
273
+ float s = std::sin (degrees );
274
+ auto rotator = [c, s] (video::S3DVertex *vertex ) {
275
+ float u = vertex-> Pos .*U ;
276
+ float v = vertex->Pos .*V;
277
+ vertex->Pos .*U = c * u - s * v ;
278
+ vertex-> Pos .*V = s * u + c * v;
279
+ };
280
+ applyToMesh (mesh, rotator);
268
281
}
269
282
270
283
void rotateMeshXYby (scene::IMesh *mesh, f64 degrees)
271
284
{
272
- u16 mc = mesh->getMeshBufferCount ();
273
- for (u16 j = 0 ; j < mc; j++) {
274
- scene::IMeshBuffer *buf = mesh->getMeshBuffer (j);
275
- const u32 stride = getVertexPitchFromType (buf->getVertexType ());
276
- u32 vertex_count = buf->getVertexCount ();
277
- u8 *vertices = (u8 *)buf->getVertices ();
278
- for (u32 i = 0 ; i < vertex_count; i++)
279
- ((video::S3DVertex *)(vertices + i * stride))->Pos .rotateXYBy (degrees);
280
- }
285
+ rotateMesh<&v3f::X, &v3f::Y>(mesh, degrees);
281
286
}
282
287
283
288
void rotateMeshXZby (scene::IMesh *mesh, f64 degrees)
284
289
{
285
- u16 mc = mesh->getMeshBufferCount ();
286
- for (u16 j = 0 ; j < mc; j++) {
287
- scene::IMeshBuffer *buf = mesh->getMeshBuffer (j);
288
- const u32 stride = getVertexPitchFromType (buf->getVertexType ());
289
- u32 vertex_count = buf->getVertexCount ();
290
- u8 *vertices = (u8 *)buf->getVertices ();
291
- for (u32 i = 0 ; i < vertex_count; i++)
292
- ((video::S3DVertex *)(vertices + i * stride))->Pos .rotateXZBy (degrees);
293
- }
290
+ rotateMesh<&v3f::X, &v3f::Z>(mesh, degrees);
294
291
}
295
292
296
293
void rotateMeshYZby (scene::IMesh *mesh, f64 degrees)
297
294
{
298
- u16 mc = mesh->getMeshBufferCount ();
299
- for (u16 j = 0 ; j < mc; j++) {
300
- scene::IMeshBuffer *buf = mesh->getMeshBuffer (j);
301
- const u32 stride = getVertexPitchFromType (buf->getVertexType ());
302
- u32 vertex_count = buf->getVertexCount ();
303
- u8 *vertices = (u8 *)buf->getVertices ();
304
- for (u32 i = 0 ; i < vertex_count; i++)
305
- ((video::S3DVertex *)(vertices + i * stride))->Pos .rotateYZBy (degrees);
306
- }
295
+ rotateMesh<&v3f::Y, &v3f::Z>(mesh, degrees);
307
296
}
308
297
309
298
void rotateMeshBy6dFacedir (scene::IMesh *mesh, int facedir)
310
299
{
311
300
int axisdir = facedir >> 2 ;
312
301
facedir &= 0x03 ;
313
-
314
- u16 mc = mesh->getMeshBufferCount ();
315
- for (u16 j = 0 ; j < mc; j++) {
316
- scene::IMeshBuffer *buf = mesh->getMeshBuffer (j);
317
- const u32 stride = getVertexPitchFromType (buf->getVertexType ());
318
- u32 vertex_count = buf->getVertexCount ();
319
- u8 *vertices = (u8 *)buf->getVertices ();
320
- for (u32 i = 0 ; i < vertex_count; i++) {
321
- video::S3DVertex *vertex = (video::S3DVertex *)(vertices + i * stride);
322
- switch (axisdir) {
323
- case 0 :
324
- if (facedir == 1 )
325
- vertex->Pos .rotateXZBy (-90 );
326
- else if (facedir == 2 )
327
- vertex->Pos .rotateXZBy (180 );
328
- else if (facedir == 3 )
329
- vertex->Pos .rotateXZBy (90 );
330
- break ;
331
- case 1 : // z+
332
- vertex->Pos .rotateYZBy (90 );
333
- if (facedir == 1 )
334
- vertex->Pos .rotateXYBy (90 );
335
- else if (facedir == 2 )
336
- vertex->Pos .rotateXYBy (180 );
337
- else if (facedir == 3 )
338
- vertex->Pos .rotateXYBy (-90 );
339
- break ;
340
- case 2 : // z-
341
- vertex->Pos .rotateYZBy (-90 );
342
- if (facedir == 1 )
343
- vertex->Pos .rotateXYBy (-90 );
344
- else if (facedir == 2 )
345
- vertex->Pos .rotateXYBy (180 );
346
- else if (facedir == 3 )
347
- vertex->Pos .rotateXYBy (90 );
348
- break ;
349
- case 3 : // x+
350
- vertex->Pos .rotateXYBy (-90 );
351
- if (facedir == 1 )
352
- vertex->Pos .rotateYZBy (90 );
353
- else if (facedir == 2 )
354
- vertex->Pos .rotateYZBy (180 );
355
- else if (facedir == 3 )
356
- vertex->Pos .rotateYZBy (-90 );
357
- break ;
358
- case 4 : // x-
359
- vertex->Pos .rotateXYBy (90 );
360
- if (facedir == 1 )
361
- vertex->Pos .rotateYZBy (-90 );
362
- else if (facedir == 2 )
363
- vertex->Pos .rotateYZBy (180 );
364
- else if (facedir == 3 )
365
- vertex->Pos .rotateYZBy (90 );
366
- break ;
367
- case 5 :
368
- vertex->Pos .rotateXYBy (-180 );
369
- if (facedir == 1 )
370
- vertex->Pos .rotateXZBy (90 );
371
- else if (facedir == 2 )
372
- vertex->Pos .rotateXZBy (180 );
373
- else if (facedir == 3 )
374
- vertex->Pos .rotateXZBy (-90 );
375
- break ;
376
- default :
377
- break ;
378
- }
379
- }
302
+ switch (facedir) {
303
+ case 1 : rotateMeshXZby (mesh, -90 ); break ;
304
+ case 2 : rotateMeshXZby (mesh, 180 ); break ;
305
+ case 3 : rotateMeshXZby (mesh, 90 ); break ;
306
+ }
307
+ switch (axisdir) {
308
+ case 1 : rotateMeshYZby (mesh, 90 ); break ; // z+
309
+ case 2 : rotateMeshYZby (mesh, -90 ); break ; // z-
310
+ case 3 : rotateMeshXYby (mesh, -90 ); break ; // x+
311
+ case 4 : rotateMeshXYby (mesh, 90 ); break ; // x-
312
+ case 5 : rotateMeshXYby (mesh, -180 ); break ;
380
313
}
381
314
}
382
315
@@ -410,8 +343,8 @@ scene::IMeshBuffer* cloneMeshBuffer(scene::IMeshBuffer *mesh_buffer)
410
343
video::S3DVertex2TCoords *v =
411
344
(video::S3DVertex2TCoords *) mesh_buffer->getVertices ();
412
345
u16 *indices = mesh_buffer->getIndices ();
413
- scene::SMeshBufferTangents *cloned_buffer =
414
- new scene::SMeshBufferTangents ();
346
+ scene::SMeshBufferLightMap *cloned_buffer =
347
+ new scene::SMeshBufferLightMap ();
415
348
cloned_buffer->append (v, mesh_buffer->getVertexCount (), indices,
416
349
mesh_buffer->getIndexCount ());
417
350
return cloned_buffer;
0 commit comments