Skip to content

Commit 93f7e10

Browse files
numberZeroparamat
authored andcommittedJun 28, 2019
Optimize and unify mesh processing (#7851)
1 parent 5e7004e commit 93f7e10

File tree

1 file changed

+63
-130
lines changed

1 file changed

+63
-130
lines changed
 

‎src/client/mesh.cpp

+63-130
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2121
#include "debug.h"
2222
#include "log.h"
2323
#include "irrMap.h"
24+
#include <cmath>
2425
#include <iostream>
2526
#include <IAnimatedMesh.h>
2627
#include <SAnimatedMesh.h>
@@ -202,6 +203,20 @@ void setMeshColor(scene::IMesh *mesh, const video::SColor &color)
202203
setMeshBufferColor(mesh->getMeshBuffer(j), color);
203204
}
204205

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+
205220
void colorizeMeshBuffer(scene::IMeshBuffer *buf, const video::SColor *buffercolor)
206221
{
207222
const u32 stride = getVertexPitchFromType(buf->getVertexType());
@@ -222,161 +237,79 @@ void setMeshColorByNormalXYZ(scene::IMesh *mesh,
222237
const video::SColor &colorY,
223238
const video::SColor &colorZ)
224239
{
225-
if (mesh == NULL)
240+
if (!mesh)
226241
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);
247254
}
248255

249256
void setMeshColorByNormal(scene::IMesh *mesh, const v3f &normal,
250257
const video::SColor &color)
251258
{
252259
if (!mesh)
253260
return;
261+
auto colorizator = [normal, color] (video::S3DVertex *vertex) {
262+
if (vertex->Normal == normal)
263+
vertex->Color = color;
264+
};
265+
applyToMesh(mesh, colorizator);
266+
}
254267

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);
268281
}
269282

270283
void rotateMeshXYby(scene::IMesh *mesh, f64 degrees)
271284
{
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);
281286
}
282287

283288
void rotateMeshXZby(scene::IMesh *mesh, f64 degrees)
284289
{
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);
294291
}
295292

296293
void rotateMeshYZby(scene::IMesh *mesh, f64 degrees)
297294
{
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);
307296
}
308297

309298
void rotateMeshBy6dFacedir(scene::IMesh *mesh, int facedir)
310299
{
311300
int axisdir = facedir >> 2;
312301
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;
380313
}
381314
}
382315

@@ -410,8 +343,8 @@ scene::IMeshBuffer* cloneMeshBuffer(scene::IMeshBuffer *mesh_buffer)
410343
video::S3DVertex2TCoords *v =
411344
(video::S3DVertex2TCoords *) mesh_buffer->getVertices();
412345
u16 *indices = mesh_buffer->getIndices();
413-
scene::SMeshBufferTangents *cloned_buffer =
414-
new scene::SMeshBufferTangents();
346+
scene::SMeshBufferLightMap *cloned_buffer =
347+
new scene::SMeshBufferLightMap();
415348
cloned_buffer->append(v, mesh_buffer->getVertexCount(), indices,
416349
mesh_buffer->getIndexCount());
417350
return cloned_buffer;

0 commit comments

Comments
 (0)
Please sign in to comment.