From d5de0cbf71d65ce586b3ab2469f2061ccc4b506a Mon Sep 17 00:00:00 2001 From: sapier Date: Sun, 8 Jun 2014 14:16:48 +0200 Subject: [PATCH] Minor fix in check order --- src/mapblock_mesh.cpp | 100 +++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 49 deletions(-) diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp index 0ef0280f0..bcc4cba5c 100644 --- a/src/mapblock_mesh.cpp +++ b/src/mapblock_mesh.cpp @@ -59,7 +59,7 @@ void MeshMakeData::fill(MapBlock *block) m_blockpos = block->getPos(); v3s16 blockpos_nodes = m_blockpos*MAP_BLOCKSIZE; - + /* Copy data */ @@ -84,7 +84,7 @@ void MeshMakeData::fill(MapBlock *block) Copy neighbors. This is lightning fast. Copying only the borders would be *very* slow. */ - + // Get map Map *map = block->getParent(); @@ -102,7 +102,7 @@ void MeshMakeData::fill(MapBlock *block) void MeshMakeData::fillSingleNode(MapNode *node) { m_blockpos = v3s16(0,0,0); - + v3s16 blockpos_nodes = v3s16(0,0,0); VoxelArea area(blockpos_nodes-v3s16(1,1,1)*MAP_BLOCKSIZE, blockpos_nodes+v3s16(1,1,1)*MAP_BLOCKSIZE*2-v3s16(1,1,1)); @@ -257,6 +257,12 @@ static u8 getSmoothLight(enum LightBank bank, v3s16 p, MeshMakeData *data) for(u32 i=0; i<8; i++) { MapNode n = data->m_vmanip.getNodeNoEx(p - dirs8[i]); + + if (n.getContent() == CONTENT_IGNORE) { + ambient_occlusion++; + continue; + } + const ContentFeatures &f = ndef->get(n); if(f.light_source > light_source_max) light_source_max = f.light_source; @@ -267,15 +273,11 @@ static u8 getSmoothLight(enum LightBank bank, v3s16 p, MeshMakeData *data) light += decode_light(n.getLight(bank, ndef)); light_count++; } - else if(n.getContent() != CONTENT_IGNORE) - { - ambient_occlusion++; - } } if(light_count == 0) return 255; - + light /= light_count; // Boost brightness around light sources @@ -323,7 +325,7 @@ u16 getSmoothLight(v3s16 p, v3s16 corner, MeshMakeData *data) else assert(corner.Y == -1); if(corner.Z == 1) p.Z += 1; else assert(corner.Z == -1); - + return getSmoothLight(p, data); } @@ -630,16 +632,16 @@ static u8 face_contents(content_t m1, content_t m2, bool *equivalent, if(m1 == CONTENT_IGNORE || m2 == CONTENT_IGNORE) return 0; - + bool contents_differ = (m1 != m2); - + const ContentFeatures &f1 = ndef->get(m1); const ContentFeatures &f2 = ndef->get(m2); // Contents don't differ for different forms of same liquid if(f1.sameLiquid(f2)) contents_differ = false; - + u8 c1 = f1.solidness; u8 c2 = f2.solidness; @@ -648,12 +650,12 @@ static u8 face_contents(content_t m1, content_t m2, bool *equivalent, if(makes_face == false) return 0; - + if(c1 == 0) c1 = f1.visual_solidness; if(c2 == 0) c2 = f2.visual_solidness; - + if(c1 == c2){ *equivalent = true; // If same solidness, liquid takes precense @@ -662,7 +664,7 @@ static u8 face_contents(content_t m1, content_t m2, bool *equivalent, if(f2.isLiquid()) return 2; } - + if(c1 > c2) return 1; else @@ -712,7 +714,7 @@ TileSpec getNodeTile(MapNode mn, v3s16 p, v3s16 dir, MeshMakeData *data) facedir = 0; static const u16 dir_to_tile[24 * 16] = { - // 0 +X +Y +Z -Z -Y -X -> value=tile,rotation + // 0 +X +Y +Z -Z -Y -X -> value=tile,rotation 0,0, 2,0 , 0,0 , 4,0 , 0,0, 5,0 , 1,0 , 3,0 , // rotate around y+ 0 - 3 0,0, 4,0 , 0,3 , 3,0 , 0,0, 2,0 , 1,1 , 5,0 , 0,0, 3,0 , 0,2 , 5,0 , 0,0, 4,0 , 1,2 , 2,0 , @@ -733,15 +735,15 @@ TileSpec getNodeTile(MapNode mn, v3s16 p, v3s16 dir, MeshMakeData *data) 0,0, 0,1 , 2,3 , 5,1 , 0,0, 4,3 , 3,3 , 1,1 , 0,0, 0,0 , 4,3 , 2,1 , 0,0, 3,3 , 5,3 , 1,2 , - 0,0, 1,1 , 2,1 , 4,3 , 0,0, 5,1 , 3,1 , 0,1 , // rotate around x- 16 - 19 + 0,0, 1,1 , 2,1 , 4,3 , 0,0, 5,1 , 3,1 , 0,1 , // rotate around x- 16 - 19 0,0, 1,2 , 4,1 , 3,3 , 0,0, 2,1 , 5,1 , 0,0 , - 0,0, 1,3 , 3,1 , 5,3 , 0,0, 4,1 , 2,1 , 0,3 , - 0,0, 1,0 , 5,1 , 2,3 , 0,0, 3,1 , 4,1 , 0,2 , + 0,0, 1,3 , 3,1 , 5,3 , 0,0, 4,1 , 2,1 , 0,3 , + 0,0, 1,0 , 5,1 , 2,3 , 0,0, 3,1 , 4,1 , 0,2 , 0,0, 3,2 , 1,2 , 4,2 , 0,0, 5,2 , 0,2 , 2,2 , // rotate around y- 20 - 23 - 0,0, 5,2 , 1,3 , 3,2 , 0,0, 2,2 , 0,1 , 4,2 , - 0,0, 2,2 , 1,0 , 5,2 , 0,0, 4,2 , 0,0 , 3,2 , - 0,0, 4,2 , 1,1 , 2,2 , 0,0, 3,2 , 0,3 , 5,2 + 0,0, 5,2 , 1,3 , 3,2 , 0,0, 2,2 , 0,1 , 4,2 , + 0,0, 2,2 , 1,0 , 5,2 , 0,0, 4,2 , 0,0 , 3,2 , + 0,0, 4,2 , 1,1 , 2,2 , 0,0, 3,2 , 0,3 , 5,2 }; u16 tile_index=facedir*16 + dir_i; @@ -770,14 +772,14 @@ static void getTileInfo( v3s16 blockpos_nodes = data->m_blockpos * MAP_BLOCKSIZE; MapNode n0 = vmanip.getNodeNoEx(blockpos_nodes + p); - + // Don't even try to get n1 if n0 is already CONTENT_IGNORE if (n0.getContent() == CONTENT_IGNORE ) { makes_face = false; return; } MapNode n1 = vmanip.getNodeNoEx(blockpos_nodes + p + face_dir); - + // This is hackish bool equivalent = false; u8 mf = face_contents(n0.getContent(), n1.getContent(), @@ -790,7 +792,7 @@ static void getTileInfo( } makes_face = true; - + if(mf == 1) { tile = getNodeTile(n0, p, face_dir, data); @@ -805,7 +807,7 @@ static void getTileInfo( face_dir_corrected = -face_dir; light_source = ndef->get(n1).light_source; } - + // eg. water and glass if(equivalent) tile.material_flags |= MATERIAL_FLAG_BACKFACE_CULLING; @@ -826,7 +828,7 @@ static void getTileInfo( vertex_dirs[i], data); } } - + return; } @@ -845,16 +847,16 @@ static void updateFastFaceRow( std::vector &dest) { v3s16 p = startpos; - + u16 continuous_tiles_count = 0; - + bool makes_face = false; v3s16 p_corrected; v3s16 face_dir_corrected; u16 lights[4] = {0,0,0,0}; TileSpec tile; u8 light_source = 0; - getTileInfo(data, p, face_dir, + getTileInfo(data, p, face_dir, makes_face, p_corrected, face_dir_corrected, lights, tile, light_source); @@ -862,27 +864,27 @@ static void updateFastFaceRow( { // If tiling can be done, this is set to false in the next step bool next_is_different = true; - + v3s16 p_next; - + bool next_makes_face = false; v3s16 next_p_corrected; v3s16 next_face_dir_corrected; u16 next_lights[4] = {0,0,0,0}; TileSpec next_tile; u8 next_light_source = 0; - + // If at last position, there is nothing to compare to and // the face must be drawn anyway if(j != MAP_BLOCKSIZE - 1) { p_next = p + translate_dir; - + getTileInfo(data, p_next, face_dir, next_makes_face, next_p_corrected, next_face_dir_corrected, next_lights, next_tile, next_light_source); - + if(next_makes_face == makes_face && next_p_corrected == p_corrected + translate_dir && next_face_dir_corrected == face_dir_corrected @@ -922,7 +924,7 @@ static void updateFastFaceRow( } continuous_tiles_count++; - + if(next_is_different) { /* @@ -950,11 +952,11 @@ static void updateFastFaceRow( { scale.Z = continuous_tiles_count; } - + makeFastFace(tile, lights[0], lights[1], lights[2], lights[3], sp, face_dir_corrected, scale, light_source, dest); - + g_profiler->avg("Meshgen: faces drawn by tiling", 0); for(int i=1; iavg("Meshgen: faces drawn by tiling", 1); @@ -962,7 +964,7 @@ static void updateFastFaceRow( } continuous_tiles_count = 0; - + makes_face = next_makes_face; p_corrected = next_p_corrected; face_dir_corrected = next_face_dir_corrected; @@ -973,7 +975,7 @@ static void updateFastFaceRow( tile = next_tile; light_source = next_light_source; } - + p = p_next; } } @@ -1077,12 +1079,12 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): const u16 indices[] = {0,1,2,2,3,0}; const u16 indices_alternate[] = {0,1,3,2,3,1}; - + if(f.tile.texture == NULL) continue; const u16 *indices_p = indices; - + /* Revert triangles for nicer looking gradient if vertices 1 and 3 have same color or 0 and 2 have different color. @@ -1091,7 +1093,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): if(f.vertices[0].Color.getRed() != f.vertices[2].Color.getRed() || f.vertices[1].Color.getRed() == f.vertices[3].Color.getRed()) indices_p = indices_alternate; - + collector.append(f.tile, f.vertices, 4, indices_p, 6); } } @@ -1105,7 +1107,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): */ mapblock_mesh_generate_special(data, collector); - + /* Convert MeshCollector to SMesh @@ -1198,7 +1200,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): if (enable_shaders) { material.MaterialType = shdrsrc->getShaderInfo(p.tile.shader_id).material; - p.tile.applyMaterialOptionsWithShaders(material); + p.tile.applyMaterialOptionsWithShaders(material); material.setTexture(2, tsrc->getTexture("disable_img.png")); if (enable_bumpmapping || enable_parallax_occlusion) { if (tsrc->isKnownSourceImage("override_normal.png")){ @@ -1211,7 +1213,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): std::string fname_normal = fname_base.substr(0, pos) + normal_ext; if (tsrc->isKnownSourceImage(fname_normal)) { - // look for image extension and replace it + // look for image extension and replace it size_t i = 0; while ((i = fname_base.find(".", i)) != std::string::npos) { fname_base.replace(i, 4, normal_ext); @@ -1241,7 +1243,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): } m_camera_offset = camera_offset; - + /* Do some stuff to the mesh */ @@ -1267,7 +1269,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): the hardware buffer and then delete the mesh */ } - + //std::cout<<"added "<::iterator i = m_animation_tiles.begin();