#include "nodedef.h"
#include "tile.h"
#include "gamedef.h"
+#include "util/numeric.h"
+#include "util/directiontables.h"
// Create a cuboid.
// collector - the MeshCollector for the resulting polygons
continue;
u16 l = getInteriorLight(n, 0, data);
- video::SColor c = MapBlock_LightColor(f.alpha, l);
+ video::SColor c = MapBlock_LightColor(f.alpha, l, decode_light(f.light_source));
video::S3DVertex vertices[4] =
{
// Otherwise use the light of this node (the liquid)
else
l = getInteriorLight(n, 0, data);
- video::SColor c = MapBlock_LightColor(f.alpha, l);
+ video::SColor c = MapBlock_LightColor(f.alpha, l, decode_light(f.light_source));
// Neighbor liquid levels (key = relative position)
// Includes current node
// -Z towards +Z, thus the direction is +Z.
// Rotate texture to make animation go in flow direction
// Positive if liquid moves towards +Z
- int dz = (corner_levels[side_corners[2][0]] +
- corner_levels[side_corners[2][1]] <
- corner_levels[side_corners[3][0]] +
- corner_levels[side_corners[3][1]]);
+ int dz = (corner_levels[side_corners[3][0]] +
+ corner_levels[side_corners[3][1]]) -
+ (corner_levels[side_corners[2][0]] +
+ corner_levels[side_corners[2][1]]);
// Positive if liquid moves towards +X
- int dx = (corner_levels[side_corners[0][0]] +
- corner_levels[side_corners[0][1]] <
- corner_levels[side_corners[1][0]] +
- corner_levels[side_corners[1][1]]);
+ int dx = (corner_levels[side_corners[1][0]] +
+ corner_levels[side_corners[1][1]]) -
+ (corner_levels[side_corners[0][0]] +
+ corner_levels[side_corners[0][1]]);
// -X
if(-dx >= abs(dz))
{
AtlasPointer ap = tile.texture;
u16 l = getInteriorLight(n, 1, data);
- video::SColor c = MapBlock_LightColor(255, l);
+ video::SColor c = MapBlock_LightColor(255, l, decode_light(f.light_source));
for(u32 j=0; j<6; j++)
{
AtlasPointer pa_leaves = tile_leaves.texture;
u16 l = getInteriorLight(n, 1, data);
- video::SColor c = MapBlock_LightColor(255, l);
+ video::SColor c = MapBlock_LightColor(255, l, decode_light(f.light_source));
v3f pos = intToFloat(p, BS);
aabb3f box(-BS/2,-BS/2,-BS/2,BS/2,BS/2,BS/2);
AtlasPointer ap = tile.texture;
- video::SColor c(255,255,255,255);
+ u16 l = getInteriorLight(n, 1, data);
+ video::SColor c = MapBlock_LightColor(255, l, decode_light(f.light_source));
// Wall at X+ of node
video::S3DVertex vertices[4] =
AtlasPointer ap = tile.texture;
u16 l = getInteriorLight(n, 0, data);
- video::SColor c = MapBlock_LightColor(255, l);
+ video::SColor c = MapBlock_LightColor(255, l, decode_light(f.light_source));
float d = (float)BS/16;
// Wall at X+ of node
AtlasPointer ap = tile.texture;
u16 l = getInteriorLight(n, 1, data);
- video::SColor c = MapBlock_LightColor(255, l);
+ video::SColor c = MapBlock_LightColor(255, l, decode_light(f.light_source));
for(u32 j=0; j<4; j++)
{
tile.texture.id) + "^[transformR90");
u16 l = getInteriorLight(n, 1, data);
- video::SColor c = MapBlock_LightColor(255, l);
+ video::SColor c = MapBlock_LightColor(255, l, decode_light(f.light_source));
const f32 post_rad=(f32)BS/8;
const f32 bar_rad=(f32)BS/16;
AtlasPointer ap = tile.texture;
u16 l = getInteriorLight(n, 0, data);
- video::SColor c = MapBlock_LightColor(255, l);
+ video::SColor c = MapBlock_LightColor(255, l, decode_light(f.light_source));
float d = (float)BS/64;
u16 indices[] = {0,1,2,2,3,0};
collector.append(tile, vertices, 4, indices, 6);
break;}
+ case NDT_NODEBOX:
+ {
+ static const v3s16 tile_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)
+ };
+
+ TileSpec tiles[6];
+ for(int i = 0; i < 6; i++)
+ {
+ // Handles facedir rotation for textures
+ tiles[i] = getNodeTile(n, p, tile_dirs[i], data);
+ }
+
+ u16 l = getInteriorLight(n, 0, data);
+ video::SColor c = MapBlock_LightColor(255, l, decode_light(f.light_source));
+
+ v3f pos = intToFloat(p, BS);
+
+ std::vector<aabb3f> boxes = n.getNodeBoxes(nodedef);
+ for(std::vector<aabb3f>::iterator
+ i = boxes.begin();
+ i != boxes.end(); i++)
+ {
+ aabb3f box = *i;
+ box.MinEdge += pos;
+ box.MaxEdge += pos;
+
+ // Compute texture coords
+ f32 tx1 = (i->MinEdge.X/BS)+0.5;
+ f32 ty1 = (i->MinEdge.Y/BS)+0.5;
+ f32 tz1 = (i->MinEdge.Z/BS)+0.5;
+ f32 tx2 = (i->MaxEdge.X/BS)+0.5;
+ f32 ty2 = (i->MaxEdge.Y/BS)+0.5;
+ f32 tz2 = (i->MaxEdge.Z/BS)+0.5;
+ f32 txc[24] = {
+ // up
+ tx1, 1-tz2, tx2, 1-tz1,
+ // down
+ tx1, tz1, tx2, tz2,
+ // right
+ tz1, 1-ty2, tz2, 1-ty1,
+ // left
+ 1-tz2, 1-ty2, 1-tz1, 1-ty1,
+ // back
+ 1-tx2, 1-ty2, 1-tx1, 1-ty1,
+ // front
+ tx1, 1-ty2, tx2, 1-ty1,
+ };
+
+ makeCuboid(&collector, box, tiles, 6, c, txc);
+ }
+ break;}
}
}
}