X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fmesh.cpp;h=7fc7531f2e8b00dcd2c33710a3340721571efd69;hb=5e61f64ce259fe0b23cbb377b44e90a0fbc820d7;hp=d776f61855834bfee120f7c9449306a8994e0568;hpb=1ffb180868ffcec6812cd3aac8f56ffefb91c8bc;p=oweals%2Fminetest.git diff --git a/src/mesh.cpp b/src/mesh.cpp index d776f6185..7fc7531f2 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include +#include // In Irrlicht 1.8 the signature of ITexture::lock was changed from // (bool, u32) to (E_TEXTURE_LOCK_MODE, u32). @@ -175,6 +176,21 @@ void translateMesh(scene::IMesh *mesh, v3f vec) mesh->setBoundingBox(bbox); } +void setMeshBufferColor(scene::IMeshBuffer *buf, const video::SColor &color) +{ + 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))->Color = color; +} + +void setAnimatedMeshColor(scene::IAnimatedMeshSceneNode *node, const video::SColor &color) +{ + for (u32 i = 0; i < node->getMaterialCount(); ++i) { + node->getMaterial(i).EmissiveColor = color; + } +} void setMeshColor(scene::IMesh *mesh, const video::SColor &color) { @@ -182,14 +198,8 @@ void setMeshColor(scene::IMesh *mesh, const video::SColor &color) return; u32 mc = mesh->getMeshBufferCount(); - for (u32 j = 0; j < mc; j++) { - scene::IMeshBuffer *buf = mesh->getMeshBuffer(j); - 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))->Color = color; - } + for (u32 j = 0; j < mc; j++) + setMeshBufferColor(mesh->getMeshBuffer(j), color); } void colorizeMeshBuffer(scene::IMeshBuffer *buf, const video::SColor *buffercolor) @@ -387,37 +397,39 @@ void recalculateBoundingBox(scene::IMesh *src_mesh) scene::IMeshBuffer* cloneMeshBuffer(scene::IMeshBuffer *mesh_buffer) { - scene::IMeshBuffer *clone = NULL; switch (mesh_buffer->getVertexType()) { case video::EVT_STANDARD: { video::S3DVertex *v = (video::S3DVertex *) mesh_buffer->getVertices(); - u16 *indices = (u16*) mesh_buffer->getIndices(); - scene::SMeshBuffer *temp_buf = new scene::SMeshBuffer(); - temp_buf->append(v, mesh_buffer->getVertexCount(), indices, + u16 *indices = mesh_buffer->getIndices(); + scene::SMeshBuffer *cloned_buffer = new scene::SMeshBuffer(); + cloned_buffer->append(v, mesh_buffer->getVertexCount(), indices, mesh_buffer->getIndexCount()); - return temp_buf; - break; + return cloned_buffer; } case video::EVT_2TCOORDS: { video::S3DVertex2TCoords *v = (video::S3DVertex2TCoords *) mesh_buffer->getVertices(); - u16 *indices = (u16*) mesh_buffer->getIndices(); - scene::SMeshBufferTangents *temp_buf = new scene::SMeshBufferTangents(); - temp_buf->append(v, mesh_buffer->getVertexCount(), indices, + u16 *indices = mesh_buffer->getIndices(); + scene::SMeshBufferTangents *cloned_buffer = + new scene::SMeshBufferTangents(); + cloned_buffer->append(v, mesh_buffer->getVertexCount(), indices, mesh_buffer->getIndexCount()); - break; + return cloned_buffer; } case video::EVT_TANGENTS: { video::S3DVertexTangents *v = (video::S3DVertexTangents *) mesh_buffer->getVertices(); - u16 *indices = (u16*) mesh_buffer->getIndices(); - scene::SMeshBufferTangents *temp_buf = new scene::SMeshBufferTangents(); - temp_buf->append(v, mesh_buffer->getVertexCount(), indices, + u16 *indices = mesh_buffer->getIndices(); + scene::SMeshBufferTangents *cloned_buffer = + new scene::SMeshBufferTangents(); + cloned_buffer->append(v, mesh_buffer->getVertexCount(), indices, mesh_buffer->getIndexCount()); - break; + return cloned_buffer; } } - return clone; + // This should not happen. + sanity_check(false); + return NULL; } scene::SMesh* cloneMesh(scene::IMesh *src_mesh) @@ -447,13 +459,9 @@ scene::IMesh* convertNodeboxesToMesh(const std::vector &boxes, buf->drop(); } - video::SColor c(255,255,255,255); + video::SColor c(255,255,255,255); - for (std::vector::const_iterator - i = boxes.begin(); - i != boxes.end(); ++i) - { - aabb3f box = *i; + for (aabb3f box : boxes) { box.repair(); box.MinEdge.X -= expand; @@ -534,7 +542,7 @@ scene::IMesh* convertNodeboxesToMesh(const std::vector &boxes, buf->append(vertices + j, 4, indices, 6); } } - return dst_mesh; + return dst_mesh; } struct vcache @@ -610,9 +618,8 @@ class f_lru public: f_lru(vcache *v, tcache *t): vc(v), tc(t) { - for (u16 i = 0; i < cachesize; i++) - { - cache[i] = -1; + for (int &i : cache) { + i = -1; } } @@ -667,15 +674,14 @@ public: } // Update triangle scores - for (u16 i = 0; i < cachesize; i++) - { - if (cache[i] == -1) + for (int i : cache) { + if (i == -1) break; - const u16 trisize = vc[cache[i]].tris.size(); + const u16 trisize = vc[i].tris.size(); for (u16 t = 0; t < trisize; t++) { - tcache *tri = &tc[vc[cache[i]].tris[t]]; + tcache *tri = &tc[vc[i].tris[t]]; tri->score = vc[tri->ind[0]].score + @@ -685,7 +691,7 @@ public: if (tri->score > hiscore) { hiscore = tri->score; - highest = vc[cache[i]].tris[t]; + highest = vc[i].tris[t]; } } } @@ -872,9 +878,8 @@ scene::IMesh* createForsythOptimizedMesh(const scene::IMesh *mesh) tc[highest].drawn = true; - for (u16 j = 0; j < 3; j++) - { - vcache *vert = &vc[tc[highest].ind[j]]; + for (u16 j : tc[highest].ind) { + vcache *vert = &vc[j]; for (u16 t = 0; t < vert->tris.size(); t++) { if (highest == vert->tris[t]) @@ -984,9 +989,8 @@ scene::IMesh* createForsythOptimizedMesh(const scene::IMesh *mesh) tc[highest].drawn = true; - for (u16 j = 0; j < 3; j++) - { - vcache *vert = &vc[tc[highest].ind[j]]; + for (u16 j : tc[highest].ind) { + vcache *vert = &vc[j]; for (u16 t = 0; t < vert->tris.size(); t++) { if (highest == vert->tris[t]) @@ -1097,9 +1101,8 @@ scene::IMesh* createForsythOptimizedMesh(const scene::IMesh *mesh) tc[highest].drawn = true; - for (u16 j = 0; j < 3; j++) - { - vcache *vert = &vc[tc[highest].ind[j]]; + for (u16 j : tc[highest].ind) { + vcache *vert = &vc[j]; for (u16 t = 0; t < vert->tris.size(); t++) { if (highest == vert->tris[t])