+ v3f pos = intToFloat(p, BS);
+ aabb3f box(-BS/2,-BS/2,-BS/2,BS/2,BS/2,BS/2);
+ box.MinEdge += pos;
+ box.MaxEdge += pos;
+ makeCuboid(&collector, box, &tile_leaves, 1, c, NULL);
+ break;}
+ case NDT_ALLFACES_OPTIONAL:
+ // This is always pre-converted to something else
+ assert(0);
+ break;
+ case NDT_TORCHLIKE:
+ {
+ v3s16 dir = n.getWallMountedDir(nodedef);
+
+ u8 tileindex = 0;
+ if(dir == v3s16(0,-1,0)){
+ tileindex = 0; // floor
+ } else if(dir == v3s16(0,1,0)){
+ tileindex = 1; // ceiling
+ // For backwards compatibility
+ } else if(dir == v3s16(0,0,0)){
+ tileindex = 0; // floor
+ } else {
+ tileindex = 2; // side
+ }
+
+ TileSpec tile = getNodeTileN(n, p, tileindex, data);
+ tile.material_flags &= ~MATERIAL_FLAG_BACKFACE_CULLING;
+ tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY;
+
+ AtlasPointer ap = tile.texture;
+
+ video::SColor c(255,255,255,255);
+
+ // Wall at X+ of node
+ video::S3DVertex vertices[4] =
+ {
+ video::S3DVertex(-BS/2,-BS/2,0, 0,0,0, c,
+ ap.x0(), ap.y1()),
+ video::S3DVertex(BS/2,-BS/2,0, 0,0,0, c,
+ ap.x1(), ap.y1()),
+ video::S3DVertex(BS/2,BS/2,0, 0,0,0, c,
+ ap.x1(), ap.y0()),
+ video::S3DVertex(-BS/2,BS/2,0, 0,0,0, c,
+ ap.x0(), ap.y0()),
+ };
+
+ for(s32 i=0; i<4; i++)
+ {
+ if(dir == v3s16(1,0,0))
+ vertices[i].Pos.rotateXZBy(0);
+ if(dir == v3s16(-1,0,0))
+ vertices[i].Pos.rotateXZBy(180);
+ if(dir == v3s16(0,0,1))
+ vertices[i].Pos.rotateXZBy(90);
+ if(dir == v3s16(0,0,-1))
+ vertices[i].Pos.rotateXZBy(-90);
+ if(dir == v3s16(0,-1,0))
+ vertices[i].Pos.rotateXZBy(45);
+ if(dir == v3s16(0,1,0))
+ vertices[i].Pos.rotateXZBy(-45);
+
+ 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_SIGNLIKE:
+ {
+ TileSpec tile = getNodeTileN(n, p, 0, data);
+ tile.material_flags &= ~MATERIAL_FLAG_BACKFACE_CULLING;
+ tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY;
+ AtlasPointer ap = tile.texture;
+
+ u16 l = getInteriorLight(n, 0, data);
+ video::SColor c = MapBlock_LightColor(255, l);
+
+ float d = (float)BS/16;
+ // Wall at X+ of node
+ video::S3DVertex vertices[4] =
+ {
+ video::S3DVertex(BS/2-d,BS/2,BS/2, 0,0,0, c,
+ ap.x0(), ap.y0()),
+ video::S3DVertex(BS/2-d,BS/2,-BS/2, 0,0,0, c,
+ ap.x1(), ap.y0()),
+ video::S3DVertex(BS/2-d,-BS/2,-BS/2, 0,0,0, c,
+ ap.x1(), ap.y1()),
+ video::S3DVertex(BS/2-d,-BS/2,BS/2, 0,0,0, c,
+ ap.x0(), ap.y1()),
+ };
+
+ v3s16 dir = n.getWallMountedDir(nodedef);
+
+ for(s32 i=0; i<4; i++)
+ {
+ if(dir == v3s16(1,0,0))
+ vertices[i].Pos.rotateXZBy(0);
+ if(dir == v3s16(-1,0,0))
+ vertices[i].Pos.rotateXZBy(180);
+ if(dir == v3s16(0,0,1))
+ vertices[i].Pos.rotateXZBy(90);
+ if(dir == v3s16(0,0,-1))
+ vertices[i].Pos.rotateXZBy(-90);
+ if(dir == v3s16(0,-1,0))
+ vertices[i].Pos.rotateXYBy(-90);
+ if(dir == v3s16(0,1,0))
+ vertices[i].Pos.rotateXYBy(90);
+
+ 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_PLANTLIKE:
+ {
+ TileSpec tile = getNodeTileN(n, p, 0, data);
+ tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY;
+ AtlasPointer ap = tile.texture;
+
+ u16 l = getInteriorLight(n, 1, data);
+ video::SColor c = MapBlock_LightColor(255, l);
+
+ for(u32 j=0; j<4; j++)