Remove texture atlas / AtlasPointer, rename getTextureRaw to getTexture
[oweals/minetest.git] / src / mapblock_mesh.cpp
index f68a79e411c77f88ee5a41c9788e7af3dad31052..a9ed7532516d1ecfaeb6b8f9df6a4c4cadd211ba 100644 (file)
@@ -452,6 +452,11 @@ static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3,
        // Position is at the center of the cube.
        v3f pos = p * BS;
 
+       float x0 = 0.0;
+       float y0 = 0.0;
+       float w = 1.0;
+       float h = 1.0;
+
        v3f vertex_pos[4];
        v3s16 vertex_dirs[4];
        getNodeVertexDirs(dir, vertex_dirs);
@@ -488,8 +493,8 @@ static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3,
                vertex_dirs[3] = vertex_dirs[2];
                vertex_dirs[2] = vertex_dirs[1];
                vertex_dirs[1] = t;
-               tile.texture.pos.Y += tile.texture.size.Y;
-               tile.texture.size.Y *= -1;
+               y0 += h;
+               h *= -1;
                break;
        case 5: //FXR270
                t = vertex_dirs[0];
@@ -497,8 +502,8 @@ static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3,
                vertex_dirs[1] = vertex_dirs[2];
                vertex_dirs[2] = vertex_dirs[3];
                vertex_dirs[3] = t;
-               tile.texture.pos.Y += tile.texture.size.Y;
-               tile.texture.size.Y *= -1;
+               y0 += h;
+               h *= -1;
                break;
        case 6: //FYR90
                t = vertex_dirs[0];
@@ -506,8 +511,8 @@ static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3,
                vertex_dirs[3] = vertex_dirs[2];
                vertex_dirs[2] = vertex_dirs[1];
                vertex_dirs[1] = t;
-               tile.texture.pos.X += tile.texture.size.X;
-               tile.texture.size.X *= -1;
+               x0 += w;
+               w *= -1;
                break;
        case 7: //FYR270
                t = vertex_dirs[0];
@@ -515,16 +520,16 @@ static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3,
                vertex_dirs[1] = vertex_dirs[2];
                vertex_dirs[2] = vertex_dirs[3];
                vertex_dirs[3] = t;
-               tile.texture.pos.X += tile.texture.size.X;
-               tile.texture.size.X *= -1;
+               x0 += w;
+               w *= -1;
                break;
        case 8: //FX
-               tile.texture.pos.Y += tile.texture.size.Y;
-               tile.texture.size.Y *= -1;
+               y0 += h;
+               h *= -1;
                break;
        case 9: //FY
-               tile.texture.pos.X += tile.texture.size.X;
-               tile.texture.size.X *= -1;
+               x0 += w;
+               w *= -1;
                break;
        default:
                break;
@@ -555,11 +560,6 @@ static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3,
 
        u8 alpha = tile.alpha;
 
-       float x0 = tile.texture.pos.X;
-       float y0 = tile.texture.pos.Y;
-       float w = tile.texture.size.X;
-       float h = tile.texture.size.Y;
-
        face.vertices[0] = video::S3DVertex(vertex_pos[0], normal,
                        MapBlock_LightColor(alpha, li0, light_source),
                        core::vector2d<f32>(x0+w*abs_scale, y0+h));
@@ -645,12 +645,6 @@ TileSpec getNodeTileN(MapNode mn, v3s16 p, u8 tileindex, MeshMakeData *data)
        if(p == data->m_crack_pos_relative)
        {
                spec.material_flags |= MATERIAL_FLAG_CRACK;
-               spec.texture = data->m_gamedef->tsrc()->getTextureRawAP(spec.texture);
-       }
-       // If animated, replace tile texture with one without texture atlas
-       if(spec.material_flags & MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES)
-       {
-               spec.texture = data->m_gamedef->tsrc()->getTextureRawAP(spec.texture);
        }
        return spec;
 }
@@ -717,8 +711,7 @@ TileSpec getNodeTile(MapNode mn, v3s16 p, v3s16 dir, MeshMakeData *data)
        u16 tile_index=facedir*16 + dir_i;
        TileSpec spec = getNodeTileN(mn, p, dir_to_tile[tile_index], data);
        spec.rotation=dir_to_tile[tile_index + 1];
-       std::string name = data->m_gamedef->tsrc()->getTextureName(spec.texture.id);
-       spec.texture = data->m_gamedef->tsrc()->getTexture(name);
+       spec.texture = data->m_gamedef->tsrc()->getTexture(spec.texture_id);
        return spec;
 }
 
@@ -890,23 +883,7 @@ static void updateFastFaceRow(
 
                continuous_tiles_count++;
                
-               // This is set to true if the texture doesn't allow more tiling
-               bool end_of_texture = false;
-               /*
-                       If there is no texture, it can be tiled infinitely.
-                       If tiled==0, it means the texture can be tiled infinitely.
-                       Otherwise check tiled agains continuous_tiles_count.
-               */
-               if(tile.texture.atlas != NULL && tile.texture.tiled != 0)
-               {
-                       if(tile.texture.tiled <= continuous_tiles_count)
-                               end_of_texture = true;
-               }
-               
-               // Do this to disable tiling textures
-               //end_of_texture = true; //DEBUG
-               
-               if(next_is_different || end_of_texture)
+               if(next_is_different)
                {
                        /*
                                Create a face if there should be one
@@ -1061,7 +1038,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
                        const u16 indices[] = {0,1,2,2,3,0};
                        const u16 indices_alternate[] = {0,1,3,2,3,1};
                        
-                       if(f.tile.texture.atlas == NULL)
+                       if(f.tile.texture == NULL)
                                continue;
 
                        const u16 *indices_p = indices;
@@ -1099,6 +1076,8 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
                        getShader("test_shader_1").material;
        video::E_MATERIAL_TYPE shadermat2 = m_gamedef->getShaderSource()->
                        getShader("test_shader_2").material;
+       video::E_MATERIAL_TYPE shadermat3 = m_gamedef->getShaderSource()->
+                       getShader("test_shader_3").material;
        for(u32 i = 0; i < collector.prebuffers.size(); i++)
        {
                PreMeshBuffer &p = collector.prebuffers[i];
@@ -1111,7 +1090,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
                if(p.tile.material_flags & MATERIAL_FLAG_CRACK)
                {
                        ITextureSource *tsrc = data->m_gamedef->tsrc();
-                       std::string crack_basename = tsrc->getTextureName(p.tile.texture.id);
+                       std::string crack_basename = tsrc->getTextureName(p.tile.texture_id);
                        if(p.tile.material_flags & MATERIAL_FLAG_CRACK_OVERLAY)
                                crack_basename += "^[cracko";
                        else
@@ -1136,9 +1115,11 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
                        }
                        // Replace tile texture with the first animation frame
                        std::ostringstream os(std::ios::binary);
-                       os<<tsrc->getTextureName(p.tile.texture.id);
+                       os<<tsrc->getTextureName(p.tile.texture_id);
                        os<<"^[verticalframe:"<<(int)p.tile.animation_frame_count<<":0";
-                       p.tile.texture = tsrc->getTexture(os.str());
+                       p.tile.texture = tsrc->getTexture(
+                                       os.str(),
+                                       &p.tile.texture_id);
                }
                // - Classic lighting (shaders handle this by themselves)
                if(!enable_shaders)
@@ -1172,9 +1153,9 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
                //material.setFlag(video::EMF_ANTI_ALIASING, video::EAAM_SIMPLE);
                material.MaterialType
                                = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
-               material.setTexture(0, p.tile.texture.atlas);
+               material.setTexture(0, p.tile.texture);
                if(enable_shaders)
-                       p.tile.applyMaterialOptionsWithShaders(material, shadermat1, shadermat2);
+                       p.tile.applyMaterialOptionsWithShaders(material, shadermat1, shadermat2, shadermat3);
                else
                        p.tile.applyMaterialOptions(material);
 
@@ -1198,7 +1179,6 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
        */
 
        translateMesh(m_mesh, intToFloat(data->m_blockpos * MAP_BLOCKSIZE, BS));
-       m_mesh->recalculateBoundingBox(); // translateMesh already does this
 
        if(m_mesh)
        {
@@ -1259,8 +1239,8 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
                        ITextureSource *tsrc = m_gamedef->getTextureSource();
                        std::ostringstream os;
                        os<<basename<<crack;
-                       AtlasPointer ap = tsrc->getTexture(os.str());
-                       buf->getMaterial().setTexture(0, ap.atlas);
+                       buf->getMaterial().setTexture(0,
+                                       tsrc->getTexture(os.str()));
                }
 
                m_last_crack = crack;
@@ -1287,11 +1267,10 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
 
                // Create new texture name from original
                std::ostringstream os(std::ios::binary);
-               os<<tsrc->getTextureName(tile.texture.id);
+               os<<tsrc->getTextureName(tile.texture_id);
                os<<"^[verticalframe:"<<(int)tile.animation_frame_count<<":"<<frame;
                // Set the texture
-               AtlasPointer ap = tsrc->getTexture(os.str());
-               buf->getMaterial().setTexture(0, ap.atlas);
+               buf->getMaterial().setTexture(0, tsrc->getTexture(os.str()));
        }
 
        // Day-night transition
@@ -1336,12 +1315,20 @@ void MeshCollector::append(const TileSpec &tile,
                const video::S3DVertex *vertices, u32 numVertices,
                const u16 *indices, u32 numIndices)
 {
+       if(numIndices > 65535)
+       {
+               dstream<<"FIXME: MeshCollector::append() called with numIndices="<<numIndices<<" (limit 65535)"<<std::endl;
+               return;
+       }
+
        PreMeshBuffer *p = NULL;
        for(u32 i=0; i<prebuffers.size(); i++)
        {
                PreMeshBuffer &pp = prebuffers[i];
                if(pp.tile != tile)
                        continue;
+               if(pp.indices.size() + numIndices > 65535)
+                       continue;
 
                p = &pp;
                break;
@@ -1359,11 +1346,6 @@ void MeshCollector::append(const TileSpec &tile,
        for(u32 i=0; i<numIndices; i++)
        {
                u32 j = indices[i] + vertex_count;
-               if(j > 65535)
-               {
-                       dstream<<"FIXME: Meshbuffer ran out of indices"<<std::endl;
-                       // NOTE: Fix is to just add an another MeshBuffer
-               }
                p->indices.push_back(j);
        }
        for(u32 i=0; i<numVertices; i++)