diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 805b63f6..0cdca506 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -422,6 +422,7 @@ Look for examples in games/minimal or games/minetest_game. - torchlike - signlike - plantlike +- firelike - fencelike - raillike - nodebox -- See below. EXPERIMENTAL diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp index c94ff590..6d7a69bb 100644 --- a/src/content_mapblock.cpp +++ b/src/content_mapblock.cpp @@ -1187,6 +1187,168 @@ void mapblock_mesh_generate_special(MeshMakeData *data, collector.append(tile, vertices, 4, indices, 6); } break;} + case NDT_FIRELIKE: + { + TileSpec tile = getNodeTileN(n, p, 0, data); + tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY; + + u16 l = getInteriorLight(n, 1, nodedef); + video::SColor c = MapBlock_LightColor(255, l, f.light_source); + + float s = BS/2*f.visual_scale; + + content_t current = n.getContent(); + content_t n2c; + MapNode n2; + v3s16 n2p; + + static const v3s16 dirs[6] = { + v3s16( 0, 1, 0), + v3s16( 0,-1, 0), + v3s16( 1, 0, 0), + v3s16(-1, 0, 0), + v3s16( 0, 0, 1), + v3s16( 0, 0,-1) + }; + + int doDraw[6] = {0,0,0,0,0,0}; + + bool drawAllFaces = true; + + bool drawBottomFacesOnly = false; // Currently unused + + // Check for adjacent nodes + for(int i = 0; i < 6; i++) + { + n2p = blockpos_nodes + p + dirs[i]; + n2 = data->m_vmanip.getNodeNoEx(n2p); + n2c = n2.getContent(); + if (n2c != CONTENT_IGNORE && n2c != CONTENT_AIR && n2c != current) { + doDraw[i] = 1; + if(drawAllFaces) + drawAllFaces = false; + + } + } + + for(int j = 0; j < 6; j++) + { + int vOffset = 0; // Vertical offset of faces after rotation + int hOffset = 4; // Horizontal offset of faces to reach the edge + + video::S3DVertex vertices[4] = + { + video::S3DVertex(-s,-BS/2, 0, 0,0,0, c, 0,1), + video::S3DVertex( s,-BS/2, 0, 0,0,0, c, 1,1), + video::S3DVertex( s,-BS/2 + s*2,0, 0,0,0, c, 1,0), + video::S3DVertex(-s,-BS/2 + s*2,0, 0,0,0, c, 0,0), + }; + + // Calculate which faces should be drawn, (top or sides) + if(j == 0 && (drawAllFaces || (doDraw[3] == 1 || doDraw[1] == 1))) + { + for(int i = 0; i < 4; i++) { + vertices[i].Pos.rotateXZBy(90 + n.param2 * 2); + vertices[i].Pos.rotateXYBy(-10); + vertices[i].Pos.Y -= vOffset; + vertices[i].Pos.X -= hOffset; + } + } + else if(j == 1 && (drawAllFaces || (doDraw[5] == 1 || doDraw[1] == 1))) + { + for(int i = 0; i < 4; i++) { + vertices[i].Pos.rotateXZBy(180 + n.param2 * 2); + vertices[i].Pos.rotateYZBy(10); + vertices[i].Pos.Y -= vOffset; + vertices[i].Pos.Z -= hOffset; + } + } + else if(j == 2 && (drawAllFaces || (doDraw[2] == 1 || doDraw[1] == 1))) + { + for(int i = 0; i < 4; i++) { + vertices[i].Pos.rotateXZBy(270 + n.param2 * 2); + vertices[i].Pos.rotateXYBy(10); + vertices[i].Pos.Y -= vOffset; + vertices[i].Pos.X += hOffset; + } + } + else if(j == 3 && (drawAllFaces || (doDraw[4] == 1 || doDraw[1] == 1))) + { + for(int i = 0; i < 4; i++) { + vertices[i].Pos.rotateYZBy(-10); + vertices[i].Pos.Y -= vOffset; + vertices[i].Pos.Z += hOffset; + } + } + + // Center cross-flames + else if(j == 4 && (drawAllFaces || doDraw[1] == 1)) + { + for(int i=0; i<4; i++) { + vertices[i].Pos.rotateXZBy(45 + n.param2 * 2); + vertices[i].Pos.Y -= vOffset; + } + } + else if(j == 5 && (drawAllFaces || doDraw[1] == 1)) + { + for(int i=0; i<4; i++) { + vertices[i].Pos.rotateXZBy(-45 + n.param2 * 2); + vertices[i].Pos.Y -= vOffset; + } + } + + // Render flames on bottom + else if(j == 0 && (drawBottomFacesOnly || (doDraw[0] == 1 && doDraw[1] == 0))) + { + for(int i = 0; i < 4; i++) { + vertices[i].Pos.rotateYZBy(70); + vertices[i].Pos.rotateXZBy(90 + n.param2 * 2); + vertices[i].Pos.Y += 4.84; + vertices[i].Pos.X -= hOffset+0.7; + } + } + else if(j == 1 && (drawBottomFacesOnly || (doDraw[0] == 1 && doDraw[1] == 0))) + { + for(int i = 0; i < 4; i++) { + vertices[i].Pos.rotateYZBy(70); + vertices[i].Pos.rotateXZBy(180 + n.param2 * 2); + vertices[i].Pos.Y += 4.84; + vertices[i].Pos.Z -= hOffset+0.7; + } + } + else if(j == 2 && (drawBottomFacesOnly || (doDraw[0] == 1 && doDraw[1] == 0))) + { + for(int i = 0; i < 4; i++) { + vertices[i].Pos.rotateYZBy(70); + vertices[i].Pos.rotateXZBy(270 + n.param2 * 2); + vertices[i].Pos.Y += 4.84; + vertices[i].Pos.X += hOffset+0.7; + } + } + else if(j == 3 && (drawBottomFacesOnly || (doDraw[0] == 1 && doDraw[1] == 0))) + { + for(int i = 0; i < 4; i++) { + vertices[i].Pos.rotateYZBy(70); + vertices[i].Pos.Y += 4.84; + vertices[i].Pos.Z += hOffset+0.7; + } + } + else { + // Skip faces that aren't adjacent to a node + continue; + } + + for(int i=0; i<4; i++) + { + vertices[i].Pos *= f.visual_scale; + vertices[i].Pos += intToFloat(p, BS); + } + + u16 indices[] = {0,1,2,2,3,0}; + // Add to mesh collector + collector.append(tile, vertices, 4, indices, 6); + } + break;} case NDT_FENCELIKE: { TileSpec tile = getNodeTile(n, p, v3s16(0,0,0), data); diff --git a/src/nodedef.cpp b/src/nodedef.cpp index f14311fc..31156ce6 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -691,6 +691,8 @@ public: if (f->waving == 1) material_type = TILE_MATERIAL_WAVING_PLANTS; break; + case NDT_FIRELIKE: + f->backface_culling = false; case NDT_TORCHLIKE: case NDT_SIGNLIKE: case NDT_FENCELIKE: diff --git a/src/nodedef.h b/src/nodedef.h index 1f596e46..262f4bc4 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -149,6 +149,7 @@ enum NodeDrawType NDT_GLASSLIKE_FRAMED, // Glass-like, draw connected frames and all all // visible faces // uses 2 textures, one for frames, second for faces + NDT_FIRELIKE, // Draw faces slightly rotated and only on connecting nodes }; #define CF_SPECIAL_COUNT 6 diff --git a/src/script/cpp_api/s_node.cpp b/src/script/cpp_api/s_node.cpp index 5d51ebdd..2b8d02d7 100644 --- a/src/script/cpp_api/s_node.cpp +++ b/src/script/cpp_api/s_node.cpp @@ -40,6 +40,7 @@ struct EnumString ScriptApiNode::es_DrawType[] = {NDT_TORCHLIKE, "torchlike"}, {NDT_SIGNLIKE, "signlike"}, {NDT_PLANTLIKE, "plantlike"}, + {NDT_FIRELIKE, "firelike"}, {NDT_FENCELIKE, "fencelike"}, {NDT_RAILLIKE, "raillike"}, {NDT_NODEBOX, "nodebox"}, diff --git a/src/shader.cpp b/src/shader.cpp index 0ac54ec0..cf3bbd76 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -644,7 +644,8 @@ ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype, "NDT_FENCELIKE", "NDT_RAILLIKE", "NDT_NODEBOX", - "NDT_GLASSLIKE_FRAMED" + "NDT_GLASSLIKE_FRAMED", + "NDT_FIRELIKE" }; for (int i = 0; i < 14; i++){