Lua_api.txt: Add chat command params info
[oweals/minetest.git] / src / mesh.cpp
index d776f61855834bfee120f7c9449306a8994e0568..7fc7531f2e8b00dcd2c33710a3340721571efd69 100644 (file)
@@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <iostream>
 #include <IAnimatedMesh.h>
 #include <SAnimatedMesh.h>
+#include <IAnimatedMeshSceneNode.h>
 
 // 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<aabb3f> &boxes,
                buf->drop();
        }
 
-       video::SColor c(255,255,255,255);       
+       video::SColor c(255,255,255,255);
 
-       for (std::vector<aabb3f>::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<aabb3f> &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])