summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKahrl <kahrl@gmx.net>2016-01-15 02:16:21 +0100
committerKahrl <kahrl@gmx.net>2016-01-15 04:18:32 +0100
commitda686160c33069b77a7b4c31fd97da5fa5b59baa (patch)
treeeb09f1990688c228c964d627c1980a6dce7ff01b
parent3c6b2ffb10e053ad0b585347275034c4d889530d (diff)
downloadminetest-da686160c33069b77a7b4c31fd97da5fa5b59baa.tar.gz
minetest-da686160c33069b77a7b4c31fd97da5fa5b59baa.tar.bz2
minetest-da686160c33069b77a7b4c31fd97da5fa5b59baa.zip
Make all mesh manipulators in mesh.cpp work with any vertex type
cloneMesh() has to use a switch in order to create a different mesh buffer type depending on vertex type. (Credit: the new cloneMesh was written by RealBadAngel.) To avoid repetitive code, all other methods use getVertexPitchFromType() to automatically adapt the indexing to the vertex type at runtime.
-rw-r--r--src/mesh.cpp269
1 files changed, 145 insertions, 124 deletions
diff --git a/src/mesh.cpp b/src/mesh.cpp
index 329b93dc9..a800ddf1e 100644
--- a/src/mesh.cpp
+++ b/src/mesh.cpp
@@ -206,146 +206,139 @@ void setMeshColorByNormalXYZ(scene::IMesh *mesh,
const video::SColor &colorY,
const video::SColor &colorZ)
{
- if(mesh == NULL)
+ if (mesh == NULL)
return;
-
+
u16 mc = mesh->getMeshBufferCount();
- for(u16 j=0; j<mc; j++)
- {
+ for (u16 j = 0; j < mc; j++) {
scene::IMeshBuffer *buf = mesh->getMeshBuffer(j);
- video::S3DVertex *vertices = (video::S3DVertex*)buf->getVertices();
- u16 vc = buf->getVertexCount();
- for(u16 i=0; i<vc; i++)
- {
- f32 x = fabs(vertices[i].Normal.X);
- f32 y = fabs(vertices[i].Normal.Y);
- f32 z = fabs(vertices[i].Normal.Z);
- if(x >= y && x >= z)
- vertices[i].Color = colorX;
- else if(y >= z)
- vertices[i].Color = colorY;
+ const u32 stride = getVertexPitchFromType(buf->getVertexType());
+ u32 vertex_count = buf->getVertexCount();
+ u8 *vertices = (u8 *)buf->getVertices();
+ for (u32 i = 0; i < vertex_count; i++) {
+ video::S3DVertex *vertex = (video::S3DVertex *)(vertices + i * stride);
+ f32 x = fabs(vertex->Normal.X);
+ f32 y = fabs(vertex->Normal.Y);
+ f32 z = fabs(vertex->Normal.Z);
+ if (x >= y && x >= z)
+ vertex->Color = colorX;
+ else if (y >= z)
+ vertex->Color = colorY;
else
- vertices[i].Color = colorZ;
+ vertex->Color = colorZ;
}
}
}
-void rotateMeshXYby (scene::IMesh *mesh, f64 degrees)
-{
+void rotateMeshXYby(scene::IMesh *mesh, f64 degrees)
+{
u16 mc = mesh->getMeshBufferCount();
- for(u16 j = 0; j < mc; j++)
- {
+ for (u16 j = 0; j < mc; j++) {
scene::IMeshBuffer *buf = mesh->getMeshBuffer(j);
- video::S3DVertex *vertices = (video::S3DVertex*)buf->getVertices();
- u16 vc = buf->getVertexCount();
- for(u16 i = 0; i < vc; i++)
- {
- vertices[i].Pos.rotateXYBy(degrees);
- }
+ const u32 stride = getVertexPitchFromType(buf->getVertexType());
+ u32 vertex_count = buf->getVertexCount();
+ u8 *vertices = (u8 *)buf->getVertices();
+ for (u32 i = 0; i < vertex_count; i++)
+ ((video::S3DVertex *)(vertices + i * stride))->Pos.rotateXYBy(degrees);
}
}
-void rotateMeshXZby (scene::IMesh *mesh, f64 degrees)
-{
+void rotateMeshXZby(scene::IMesh *mesh, f64 degrees)
+{
u16 mc = mesh->getMeshBufferCount();
- for(u16 j = 0; j < mc; j++)
- {
+ for (u16 j = 0; j < mc; j++) {
scene::IMeshBuffer *buf = mesh->getMeshBuffer(j);
- video::S3DVertex *vertices = (video::S3DVertex*)buf->getVertices();
- u16 vc = buf->getVertexCount();
- for(u16 i = 0; i < vc; i++)
- {
- vertices[i].Pos.rotateXZBy(degrees);
- }
+ const u32 stride = getVertexPitchFromType(buf->getVertexType());
+ u32 vertex_count = buf->getVertexCount();
+ u8 *vertices = (u8 *)buf->getVertices();
+ for (u32 i = 0; i < vertex_count; i++)
+ ((video::S3DVertex *)(vertices + i * stride))->Pos.rotateXZBy(degrees);
}
}
-void rotateMeshYZby (scene::IMesh *mesh, f64 degrees)
-{
+void rotateMeshYZby(scene::IMesh *mesh, f64 degrees)
+{
u16 mc = mesh->getMeshBufferCount();
- for(u16 j = 0; j < mc; j++)
- {
+ for (u16 j = 0; j < mc; j++) {
scene::IMeshBuffer *buf = mesh->getMeshBuffer(j);
- video::S3DVertex *vertices = (video::S3DVertex*)buf->getVertices();
- u16 vc = buf->getVertexCount();
- for(u16 i = 0; i < vc; i++)
- {
- vertices[i].Pos.rotateYZBy(degrees);
- }
+ const u32 stride = getVertexPitchFromType(buf->getVertexType());
+ u32 vertex_count = buf->getVertexCount();
+ u8 *vertices = (u8 *)buf->getVertices();
+ for (u32 i = 0; i < vertex_count; i++)
+ ((video::S3DVertex *)(vertices + i * stride))->Pos.rotateYZBy(degrees);
}
}
void rotateMeshBy6dFacedir(scene::IMesh *mesh, int facedir)
-{
- int axisdir = facedir>>2;
+{
+ int axisdir = facedir >> 2;
facedir &= 0x03;
u16 mc = mesh->getMeshBufferCount();
- for(u16 j = 0; j < mc; j++)
- {
+ for (u16 j = 0; j < mc; j++) {
scene::IMeshBuffer *buf = mesh->getMeshBuffer(j);
- video::S3DVertex *vertices = (video::S3DVertex*)buf->getVertices();
- u16 vc = buf->getVertexCount();
- for(u16 i=0; i<vc; i++)
- {
- switch (axisdir)
- {
- case 0:
- if(facedir == 1)
- vertices[i].Pos.rotateXZBy(-90);
- else if(facedir == 2)
- vertices[i].Pos.rotateXZBy(180);
- else if(facedir == 3)
- vertices[i].Pos.rotateXZBy(90);
- break;
- case 1: // z+
- vertices[i].Pos.rotateYZBy(90);
- if(facedir == 1)
- vertices[i].Pos.rotateXYBy(90);
- else if(facedir == 2)
- vertices[i].Pos.rotateXYBy(180);
- else if(facedir == 3)
- vertices[i].Pos.rotateXYBy(-90);
- break;
- case 2: //z-
- vertices[i].Pos.rotateYZBy(-90);
- if(facedir == 1)
- vertices[i].Pos.rotateXYBy(-90);
- else if(facedir == 2)
- vertices[i].Pos.rotateXYBy(180);
- else if(facedir == 3)
- vertices[i].Pos.rotateXYBy(90);
- break;
- case 3: //x+
- vertices[i].Pos.rotateXYBy(-90);
- if(facedir == 1)
- vertices[i].Pos.rotateYZBy(90);
- else if(facedir == 2)
- vertices[i].Pos.rotateYZBy(180);
- else if(facedir == 3)
- vertices[i].Pos.rotateYZBy(-90);
- break;
- case 4: //x-
- vertices[i].Pos.rotateXYBy(90);
- if(facedir == 1)
- vertices[i].Pos.rotateYZBy(-90);
- else if(facedir == 2)
- vertices[i].Pos.rotateYZBy(180);
- else if(facedir == 3)
- vertices[i].Pos.rotateYZBy(90);
- break;
- case 5:
- vertices[i].Pos.rotateXYBy(-180);
- if(facedir == 1)
- vertices[i].Pos.rotateXZBy(90);
- else if(facedir == 2)
- vertices[i].Pos.rotateXZBy(180);
- else if(facedir == 3)
- vertices[i].Pos.rotateXZBy(-90);
- break;
- default:
- break;
+ const u32 stride = getVertexPitchFromType(buf->getVertexType());
+ u32 vertex_count = buf->getVertexCount();
+ u8 *vertices = (u8 *)buf->getVertices();
+ for (u32 i = 0; i < vertex_count; i++) {
+ video::S3DVertex *vertex = (video::S3DVertex *)(vertices + i * stride);
+ switch (axisdir) {
+ case 0:
+ if (facedir == 1)
+ vertex->Pos.rotateXZBy(-90);
+ else if (facedir == 2)
+ vertex->Pos.rotateXZBy(180);
+ else if (facedir == 3)
+ vertex->Pos.rotateXZBy(90);
+ break;
+ case 1: // z+
+ vertex->Pos.rotateYZBy(90);
+ if (facedir == 1)
+ vertex->Pos.rotateXYBy(90);
+ else if (facedir == 2)
+ vertex->Pos.rotateXYBy(180);
+ else if (facedir == 3)
+ vertex->Pos.rotateXYBy(-90);
+ break;
+ case 2: //z-
+ vertex->Pos.rotateYZBy(-90);
+ if (facedir == 1)
+ vertex->Pos.rotateXYBy(-90);
+ else if (facedir == 2)
+ vertex->Pos.rotateXYBy(180);
+ else if (facedir == 3)
+ vertex->Pos.rotateXYBy(90);
+ break;
+ case 3: //x+
+ vertex->Pos.rotateXYBy(-90);
+ if (facedir == 1)
+ vertex->Pos.rotateYZBy(90);
+ else if (facedir == 2)
+ vertex->Pos.rotateYZBy(180);
+ else if (facedir == 3)
+ vertex->Pos.rotateYZBy(-90);
+ break;
+ case 4: //x-
+ vertex->Pos.rotateXYBy(90);
+ if (facedir == 1)
+ vertex->Pos.rotateYZBy(-90);
+ else if (facedir == 2)
+ vertex->Pos.rotateYZBy(180);
+ else if (facedir == 3)
+ vertex->Pos.rotateYZBy(90);
+ break;
+ case 5:
+ vertex->Pos.rotateXYBy(-180);
+ if (facedir == 1)
+ vertex->Pos.rotateXZBy(90);
+ else if (facedir == 2)
+ vertex->Pos.rotateXZBy(180);
+ else if (facedir == 3)
+ vertex->Pos.rotateXZBy(-90);
+ break;
+ default:
+ break;
}
}
}
@@ -355,11 +348,10 @@ void recalculateBoundingBox(scene::IMesh *src_mesh)
{
core::aabbox3d<f32> bbox;
bbox.reset(0,0,0);
- for(u16 j = 0; j < src_mesh->getMeshBufferCount(); j++)
- {
+ for (u16 j = 0; j < src_mesh->getMeshBufferCount(); j++) {
scene::IMeshBuffer *buf = src_mesh->getMeshBuffer(j);
buf->recalculateBoundingBox();
- if(j == 0)
+ if (j == 0)
bbox = buf->getBoundingBox();
else
bbox.addInternalBox(buf->getBoundingBox());
@@ -370,18 +362,47 @@ void recalculateBoundingBox(scene::IMesh *src_mesh)
scene::IMesh* cloneMesh(scene::IMesh *src_mesh)
{
scene::SMesh* dst_mesh = new scene::SMesh();
- for(u16 j = 0; j < src_mesh->getMeshBufferCount(); j++)
- {
+ for (u16 j = 0; j < src_mesh->getMeshBufferCount(); j++) {
scene::IMeshBuffer *buf = src_mesh->getMeshBuffer(j);
- video::S3DVertex *vertices = (video::S3DVertex*)buf->getVertices();
- u16 *indices = (u16*)buf->getIndices();
- scene::SMeshBuffer *temp_buf = new scene::SMeshBuffer();
- temp_buf->append(vertices, buf->getVertexCount(),
- indices, buf->getIndexCount());
- dst_mesh->addMeshBuffer(temp_buf);
- temp_buf->drop();
+ switch (buf->getVertexType()) {
+ case video::EVT_STANDARD: {
+ video::S3DVertex *v =
+ (video::S3DVertex *) buf->getVertices();
+ u16 *indices = (u16*)buf->getIndices();
+ scene::SMeshBuffer *temp_buf = new scene::SMeshBuffer();
+ temp_buf->append(v, buf->getVertexCount(),
+ indices, buf->getIndexCount());
+ dst_mesh->addMeshBuffer(temp_buf);
+ temp_buf->drop();
+ break;
+ }
+ case video::EVT_2TCOORDS: {
+ video::S3DVertex2TCoords *v =
+ (video::S3DVertex2TCoords *) buf->getVertices();
+ u16 *indices = (u16*)buf->getIndices();
+ scene::SMeshBufferTangents *temp_buf =
+ new scene::SMeshBufferTangents();
+ temp_buf->append(v, buf->getVertexCount(),
+ indices, buf->getIndexCount());
+ dst_mesh->addMeshBuffer(temp_buf);
+ temp_buf->drop();
+ break;
+ }
+ case video::EVT_TANGENTS: {
+ video::S3DVertexTangents *v =
+ (video::S3DVertexTangents *) buf->getVertices();
+ u16 *indices = (u16*)buf->getIndices();
+ scene::SMeshBufferTangents *temp_buf =
+ new scene::SMeshBufferTangents();
+ temp_buf->append(v, buf->getVertexCount(),
+ indices, buf->getIndexCount());
+ dst_mesh->addMeshBuffer(temp_buf);
+ temp_buf->drop();
+ break;
+ }
+ }
}
- return dst_mesh;
+ return dst_mesh;
}
scene::IMesh* convertNodeboxNodeToMesh(ContentFeatures *f)