forked from Mirrorlandia_minetest/minetest
Add new ContentParamType2 "CPT2_DEGROTATE"
This might break some mods, but it is important for all uses of the param2 to be documented. This doesn't need a serialisation version or network protocol version change, as old clients will still work on new servers, and it is bearable to have new clients getting non rotated plants on old servers.
This commit is contained in:
parent
5130dbce7b
commit
b0523adc5f
@ -538,6 +538,10 @@ node definition:
|
|||||||
0 = y+ 1 = z+ 2 = z- 3 = x+ 4 = x- 5 = y-
|
0 = y+ 1 = z+ 2 = z- 3 = x+ 4 = x- 5 = y-
|
||||||
facedir's two less significant bits are rotation around the axis
|
facedir's two less significant bits are rotation around the axis
|
||||||
paramtype2 == "leveled"
|
paramtype2 == "leveled"
|
||||||
|
paramtype2 == "degrotate"
|
||||||
|
^ The rotation of this node is stored in param2. Plants are rotated this way.
|
||||||
|
Values range 0 - 179. The value stored in param2 is multiplied by two to
|
||||||
|
get the actual rotation of the node.
|
||||||
collision_box = {
|
collision_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = {
|
fixed = {
|
||||||
|
@ -50,9 +50,9 @@ void makeCuboid(MeshCollector *collector, const aabb3f &box,
|
|||||||
|
|
||||||
v3f min = box.MinEdge;
|
v3f min = box.MinEdge;
|
||||||
v3f max = box.MaxEdge;
|
v3f max = box.MaxEdge;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(txc == NULL) {
|
if(txc == NULL) {
|
||||||
static const f32 txc_default[24] = {
|
static const f32 txc_default[24] = {
|
||||||
0,0,1,1,
|
0,0,1,1,
|
||||||
@ -350,7 +350,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
*/
|
*/
|
||||||
if(top_is_same_liquid)
|
if(top_is_same_liquid)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
video::S3DVertex vertices[4] =
|
video::S3DVertex vertices[4] =
|
||||||
{
|
{
|
||||||
video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,1),
|
video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,1),
|
||||||
@ -383,7 +383,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
content_t c_source = nodedef->getId(f.liquid_alternative_source);
|
content_t c_source = nodedef->getId(f.liquid_alternative_source);
|
||||||
if(ntop.getContent() == c_flowing || ntop.getContent() == c_source)
|
if(ntop.getContent() == c_flowing || ntop.getContent() == c_source)
|
||||||
top_is_same_liquid = true;
|
top_is_same_liquid = true;
|
||||||
|
|
||||||
u16 l = 0;
|
u16 l = 0;
|
||||||
// If this liquid emits light and doesn't contain light, draw
|
// If this liquid emits light and doesn't contain light, draw
|
||||||
// it at what it emits, for an increased effect
|
// it at what it emits, for an increased effect
|
||||||
@ -399,7 +399,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
else
|
else
|
||||||
l = getInteriorLight(n, 0, nodedef);
|
l = getInteriorLight(n, 0, nodedef);
|
||||||
video::SColor c = MapBlock_LightColor(f.alpha, l, f.light_source);
|
video::SColor c = MapBlock_LightColor(f.alpha, l, f.light_source);
|
||||||
|
|
||||||
u8 range = rangelim(nodedef->get(c_flowing).liquid_range, 1, 8);
|
u8 range = rangelim(nodedef->get(c_flowing).liquid_range, 1, 8);
|
||||||
|
|
||||||
// Neighbor liquid levels (key = relative position)
|
// Neighbor liquid levels (key = relative position)
|
||||||
@ -451,7 +451,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
n2.getContent() == c_flowing)
|
n2.getContent() == c_flowing)
|
||||||
flags |= neighborflag_top_is_same_liquid;
|
flags |= neighborflag_top_is_same_liquid;
|
||||||
}
|
}
|
||||||
|
|
||||||
neighbor_levels[neighbor_dirs[i]] = level;
|
neighbor_levels[neighbor_dirs[i]] = level;
|
||||||
neighbor_contents[neighbor_dirs[i]] = content;
|
neighbor_contents[neighbor_dirs[i]] = content;
|
||||||
neighbor_flags[neighbor_dirs[i]] = flags;
|
neighbor_flags[neighbor_dirs[i]] = flags;
|
||||||
@ -459,7 +459,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
|
|
||||||
// Corner heights (average between four liquids)
|
// Corner heights (average between four liquids)
|
||||||
f32 corner_levels[4];
|
f32 corner_levels[4];
|
||||||
|
|
||||||
v3s16 halfdirs[4] = {
|
v3s16 halfdirs[4] = {
|
||||||
v3s16(0,0,0),
|
v3s16(0,0,0),
|
||||||
v3s16(1,0,0),
|
v3s16(1,0,0),
|
||||||
@ -539,14 +539,14 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
|
|
||||||
content_t neighbor_content = neighbor_contents[dir];
|
content_t neighbor_content = neighbor_contents[dir];
|
||||||
const ContentFeatures &n_feat = nodedef->get(neighbor_content);
|
const ContentFeatures &n_feat = nodedef->get(neighbor_content);
|
||||||
|
|
||||||
// Don't draw face if neighbor is blocking the view
|
// Don't draw face if neighbor is blocking the view
|
||||||
if(n_feat.solidness == 2)
|
if(n_feat.solidness == 2)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
bool neighbor_is_same_liquid = (neighbor_content == c_source
|
bool neighbor_is_same_liquid = (neighbor_content == c_source
|
||||||
|| neighbor_content == c_flowing);
|
|| neighbor_content == c_flowing);
|
||||||
|
|
||||||
// Don't draw any faces if neighbor same is liquid and top is
|
// Don't draw any faces if neighbor same is liquid and top is
|
||||||
// same liquid
|
// same liquid
|
||||||
if(neighbor_is_same_liquid == true
|
if(neighbor_is_same_liquid == true
|
||||||
@ -558,7 +558,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
const TileSpec *current_tile = &tile_liquid;
|
const TileSpec *current_tile = &tile_liquid;
|
||||||
if(n_feat.solidness != 0 || n_feat.visual_solidness != 0)
|
if(n_feat.solidness != 0 || n_feat.visual_solidness != 0)
|
||||||
current_tile = &tile_liquid_bfculled;
|
current_tile = &tile_liquid_bfculled;
|
||||||
|
|
||||||
video::S3DVertex vertices[4] =
|
video::S3DVertex vertices[4] =
|
||||||
{
|
{
|
||||||
video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,1),
|
video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,1),
|
||||||
@ -566,7 +566,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
video::S3DVertex(BS/2,0,BS/2, 0,0,0, c, 1,0),
|
video::S3DVertex(BS/2,0,BS/2, 0,0,0, c, 1,0),
|
||||||
video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,0),
|
video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,0),
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If our topside is liquid, set upper border of face
|
If our topside is liquid, set upper border of face
|
||||||
at upper border of node
|
at upper border of node
|
||||||
@ -584,7 +584,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
vertices[2].Pos.Y = corner_levels[side_corners[i][0]];
|
vertices[2].Pos.Y = corner_levels[side_corners[i][0]];
|
||||||
vertices[3].Pos.Y = corner_levels[side_corners[i][1]];
|
vertices[3].Pos.Y = corner_levels[side_corners[i][1]];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If neighbor is liquid, lower border of face is corner
|
If neighbor is liquid, lower border of face is corner
|
||||||
liquid levels
|
liquid levels
|
||||||
@ -603,7 +603,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
vertices[0].Pos.Y = -0.5*BS;
|
vertices[0].Pos.Y = -0.5*BS;
|
||||||
vertices[1].Pos.Y = -0.5*BS;
|
vertices[1].Pos.Y = -0.5*BS;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(s32 j=0; j<4; j++)
|
for(s32 j=0; j<4; j++)
|
||||||
{
|
{
|
||||||
if(dir == v3s16(0,0,1))
|
if(dir == v3s16(0,0,1))
|
||||||
@ -614,7 +614,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
vertices[j].Pos.rotateXZBy(90);
|
vertices[j].Pos.rotateXZBy(90);
|
||||||
if(dir == v3s16(1,0,-0))
|
if(dir == v3s16(1,0,-0))
|
||||||
vertices[j].Pos.rotateXZBy(-90);
|
vertices[j].Pos.rotateXZBy(-90);
|
||||||
|
|
||||||
// Do this to not cause glitches when two liquids are
|
// Do this to not cause glitches when two liquids are
|
||||||
// side-by-side
|
// side-by-side
|
||||||
/*if(neighbor_is_same_liquid == false){
|
/*if(neighbor_is_same_liquid == false){
|
||||||
@ -629,11 +629,11 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
// Add to mesh collector
|
// Add to mesh collector
|
||||||
collector.append(*current_tile, vertices, 4, indices, 6);
|
collector.append(*current_tile, vertices, 4, indices, 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Generate top side, if appropriate
|
Generate top side, if appropriate
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if(top_is_same_liquid == false)
|
if(top_is_same_liquid == false)
|
||||||
{
|
{
|
||||||
video::S3DVertex vertices[4] =
|
video::S3DVertex vertices[4] =
|
||||||
@ -643,7 +643,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
video::S3DVertex(BS/2,0,-BS/2, 0,0,0, c, 1,0),
|
video::S3DVertex(BS/2,0,-BS/2, 0,0,0, c, 1,0),
|
||||||
video::S3DVertex(-BS/2,0,-BS/2, 0,0,0, c, 0,0),
|
video::S3DVertex(-BS/2,0,-BS/2, 0,0,0, c, 0,0),
|
||||||
};
|
};
|
||||||
|
|
||||||
// To get backface culling right, the vertices need to go
|
// To get backface culling right, the vertices need to go
|
||||||
// clockwise around the front of the face. And we happened to
|
// clockwise around the front of the face. And we happened to
|
||||||
// calculate corner levels in exact reverse order.
|
// calculate corner levels in exact reverse order.
|
||||||
@ -657,8 +657,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
vertices[i].Pos.Y += corner_levels[j];
|
vertices[i].Pos.Y += corner_levels[j];
|
||||||
vertices[i].Pos += intToFloat(p, BS);
|
vertices[i].Pos += intToFloat(p, BS);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default downwards-flowing texture animation goes from
|
// Default downwards-flowing texture animation goes from
|
||||||
// -Z towards +Z, thus the direction is +Z.
|
// -Z towards +Z, thus the direction is +Z.
|
||||||
// Rotate texture to make animation go in flow direction
|
// Rotate texture to make animation go in flow direction
|
||||||
// Positive if liquid moves towards +Z
|
// Positive if liquid moves towards +Z
|
||||||
@ -721,7 +721,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
video::S3DVertex(BS/2,BS/2,BS/2, dir.X,dir.Y,dir.Z, c, 0,0),
|
video::S3DVertex(BS/2,BS/2,BS/2, dir.X,dir.Y,dir.Z, c, 0,0),
|
||||||
video::S3DVertex(-BS/2,BS/2,BS/2, dir.X,dir.Y,dir.Z, c, 1,0),
|
video::S3DVertex(-BS/2,BS/2,BS/2, dir.X,dir.Y,dir.Z, c, 1,0),
|
||||||
};
|
};
|
||||||
|
|
||||||
// Rotations in the g_6dirs format
|
// Rotations in the g_6dirs format
|
||||||
if(j == 0) // Z+
|
if(j == 0) // Z+
|
||||||
for(u16 i=0; i<4; i++)
|
for(u16 i=0; i<4; i++)
|
||||||
@ -770,7 +770,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
TileSpec tiles[6];
|
TileSpec tiles[6];
|
||||||
for (i = 0; i < 6; i++)
|
for (i = 0; i < 6; i++)
|
||||||
tiles[i] = getNodeTile(n, p, dirs[i], data);
|
tiles[i] = getNodeTile(n, p, dirs[i], data);
|
||||||
|
|
||||||
TileSpec glass_tiles[6];
|
TileSpec glass_tiles[6];
|
||||||
if (tiles[1].texture && tiles[2].texture && tiles[3].texture) {
|
if (tiles[1].texture && tiles[2].texture && tiles[3].texture) {
|
||||||
glass_tiles[0] = tiles[2];
|
glass_tiles[0] = tiles[2];
|
||||||
@ -781,21 +781,21 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
glass_tiles[5] = tiles[1];
|
glass_tiles[5] = tiles[1];
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; i < 6; i++)
|
for (i = 0; i < 6; i++)
|
||||||
glass_tiles[i] = tiles[1];
|
glass_tiles[i] = tiles[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 param2 = n.getParam2();
|
u8 param2 = n.getParam2();
|
||||||
bool H_merge = ! bool(param2 & 128);
|
bool H_merge = ! bool(param2 & 128);
|
||||||
bool V_merge = ! bool(param2 & 64);
|
bool V_merge = ! bool(param2 & 64);
|
||||||
param2 = param2 & 63;
|
param2 = param2 & 63;
|
||||||
|
|
||||||
u16 l = getInteriorLight(n, 1, nodedef);
|
u16 l = getInteriorLight(n, 1, nodedef);
|
||||||
video::SColor c = MapBlock_LightColor(255, l, f.light_source);
|
video::SColor c = MapBlock_LightColor(255, l, f.light_source);
|
||||||
v3f pos = intToFloat(p, BS);
|
v3f pos = intToFloat(p, BS);
|
||||||
static const float a = BS / 2;
|
static const float a = BS / 2;
|
||||||
static const float g = a - 0.003;
|
static const float g = a - 0.003;
|
||||||
static const float b = .876 * ( BS / 2 );
|
static const float b = .876 * ( BS / 2 );
|
||||||
|
|
||||||
static const aabb3f frame_edges[12] = {
|
static const aabb3f frame_edges[12] = {
|
||||||
aabb3f( b, b,-a, a, a, a), // y+
|
aabb3f( b, b,-a, a, a, a), // y+
|
||||||
aabb3f(-a, b,-a,-b, a, a), // y+
|
aabb3f(-a, b,-a,-b, a, a), // y+
|
||||||
@ -818,16 +818,16 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
aabb3f(-g,-g, g, g, g, g), // z+
|
aabb3f(-g,-g, g, g, g, g), // z+
|
||||||
aabb3f(-g,-g,-g, g, g,-g) // z-
|
aabb3f(-g,-g,-g, g, g,-g) // z-
|
||||||
};
|
};
|
||||||
|
|
||||||
// table of node visible faces, 0 = invisible
|
// table of node visible faces, 0 = invisible
|
||||||
int visible_faces[6] = {0,0,0,0,0,0};
|
int visible_faces[6] = {0,0,0,0,0,0};
|
||||||
|
|
||||||
// table of neighbours, 1 = same type, checked with g_26dirs
|
// table of neighbours, 1 = same type, checked with g_26dirs
|
||||||
int nb[18] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
int nb[18] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
||||||
|
|
||||||
// g_26dirs to check when only horizontal merge is allowed
|
// g_26dirs to check when only horizontal merge is allowed
|
||||||
int nb_H_dirs[8] = {0,2,3,5,10,11,12,13};
|
int nb_H_dirs[8] = {0,2,3,5,10,11,12,13};
|
||||||
|
|
||||||
content_t current = n.getContent();
|
content_t current = n.getContent();
|
||||||
content_t n2c;
|
content_t n2c;
|
||||||
MapNode n2;
|
MapNode n2;
|
||||||
@ -845,14 +845,14 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
n2 = data->m_vmanip.getNodeNoEx(n2p);
|
n2 = data->m_vmanip.getNodeNoEx(n2p);
|
||||||
n2c = n2.getContent();
|
n2c = n2.getContent();
|
||||||
if (n2c == current || n2c == CONTENT_IGNORE)
|
if (n2c == current || n2c == CONTENT_IGNORE)
|
||||||
nb[4] = 1;
|
nb[4] = 1;
|
||||||
} else if (H_merge && !V_merge) {
|
} else if (H_merge && !V_merge) {
|
||||||
for(i = 0; i < 8; i++) {
|
for(i = 0; i < 8; i++) {
|
||||||
n2p = blockpos_nodes + p + g_26dirs[nb_H_dirs[i]];
|
n2p = blockpos_nodes + p + g_26dirs[nb_H_dirs[i]];
|
||||||
n2 = data->m_vmanip.getNodeNoEx(n2p);
|
n2 = data->m_vmanip.getNodeNoEx(n2p);
|
||||||
n2c = n2.getContent();
|
n2c = n2.getContent();
|
||||||
if (n2c == current || n2c == CONTENT_IGNORE)
|
if (n2c == current || n2c == CONTENT_IGNORE)
|
||||||
nb[nb_H_dirs[i]] = 1;
|
nb[nb_H_dirs[i]] = 1;
|
||||||
}
|
}
|
||||||
} else if (H_merge && V_merge) {
|
} else if (H_merge && V_merge) {
|
||||||
for(i = 0; i < 18; i++) {
|
for(i = 0; i < 18; i++) {
|
||||||
@ -878,7 +878,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
visible_faces[i] = 1;
|
visible_faces[i] = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!H_merge) {
|
if (!H_merge) {
|
||||||
visible_faces[2] = 1;
|
visible_faces[2] = 1;
|
||||||
visible_faces[3] = 1;
|
visible_faces[3] = 1;
|
||||||
@ -893,7 +893,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
visible_faces[i] = 1;
|
visible_faces[i] = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const u8 nb_triplet[12*3] = {
|
static const u8 nb_triplet[12*3] = {
|
||||||
1,2, 7, 1,5, 6, 4,2,15, 4,5,14,
|
1,2, 7, 1,5, 6, 4,2,15, 4,5,14,
|
||||||
2,0,11, 2,3,13, 5,0,10, 5,3,12,
|
2,0,11, 2,3,13, 5,0,10, 5,3,12,
|
||||||
@ -1010,7 +1010,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
case NDT_TORCHLIKE:
|
case NDT_TORCHLIKE:
|
||||||
{
|
{
|
||||||
v3s16 dir = n.getWallMountedDir(nodedef);
|
v3s16 dir = n.getWallMountedDir(nodedef);
|
||||||
|
|
||||||
u8 tileindex = 0;
|
u8 tileindex = 0;
|
||||||
if(dir == v3s16(0,-1,0)){
|
if(dir == v3s16(0,-1,0)){
|
||||||
tileindex = 0; // floor
|
tileindex = 0; // floor
|
||||||
@ -1070,7 +1070,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
|
|
||||||
u16 l = getInteriorLight(n, 0, nodedef);
|
u16 l = getInteriorLight(n, 0, nodedef);
|
||||||
video::SColor c = MapBlock_LightColor(255, l, f.light_source);
|
video::SColor c = MapBlock_LightColor(255, l, f.light_source);
|
||||||
|
|
||||||
float d = (float)BS/16;
|
float d = (float)BS/16;
|
||||||
float s = BS/2*f.visual_scale;
|
float s = BS/2*f.visual_scale;
|
||||||
// Wall at X+ of node
|
// Wall at X+ of node
|
||||||
@ -1113,7 +1113,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
|
|
||||||
u16 l = getInteriorLight(n, 1, nodedef);
|
u16 l = getInteriorLight(n, 1, nodedef);
|
||||||
video::SColor c = MapBlock_LightColor(255, l, f.light_source);
|
video::SColor c = MapBlock_LightColor(255, l, f.light_source);
|
||||||
|
|
||||||
float s = BS / 2 * f.visual_scale;
|
float s = BS / 2 * f.visual_scale;
|
||||||
|
|
||||||
for (int j = 0; j < 2; j++)
|
for (int j = 0; j < 2; j++)
|
||||||
@ -1125,16 +1125,16 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
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, 1,0),
|
||||||
video::S3DVertex(-s,-BS/2 + s*2,0, 0,0,0, c, 0,0),
|
video::S3DVertex(-s,-BS/2 + s*2,0, 0,0,0, c, 0,0),
|
||||||
};
|
};
|
||||||
|
float rotate_degree = 0;
|
||||||
|
if (f.param_type_2 == CPT2_DEGROTATE)
|
||||||
|
rotate_degree = n.param2 * 2;
|
||||||
|
|
||||||
if(j == 0)
|
if (j == 0) {
|
||||||
{
|
|
||||||
for(u16 i = 0; i < 4; i++)
|
for(u16 i = 0; i < 4; i++)
|
||||||
vertices[i].Pos.rotateXZBy(46 + n.param2 * 2);
|
vertices[i].Pos.rotateXZBy(46 + rotate_degree);
|
||||||
}
|
} else if (j == 1) {
|
||||||
else if(j == 1)
|
|
||||||
{
|
|
||||||
for(u16 i = 0; i < 4; i++)
|
for(u16 i = 0; i < 4; i++)
|
||||||
vertices[i].Pos.rotateXZBy(-44 + n.param2 * 2);
|
vertices[i].Pos.rotateXZBy(-44 + rotate_degree);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
@ -1507,7 +1507,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
v3s16(0, 0, -1)
|
v3s16(0, 0, -1)
|
||||||
};
|
};
|
||||||
TileSpec tiles[6];
|
TileSpec tiles[6];
|
||||||
|
|
||||||
u16 l = getInteriorLight(n, 1, nodedef);
|
u16 l = getInteriorLight(n, 1, nodedef);
|
||||||
video::SColor c = MapBlock_LightColor(255, l, f.light_source);
|
video::SColor c = MapBlock_LightColor(255, l, f.light_source);
|
||||||
|
|
||||||
@ -1526,7 +1526,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
aabb3f box = *i;
|
aabb3f box = *i;
|
||||||
box.MinEdge += pos;
|
box.MinEdge += pos;
|
||||||
box.MaxEdge += pos;
|
box.MaxEdge += pos;
|
||||||
|
|
||||||
f32 temp;
|
f32 temp;
|
||||||
if (box.MinEdge.X > box.MaxEdge.X)
|
if (box.MinEdge.X > box.MaxEdge.X)
|
||||||
{
|
{
|
||||||
@ -1615,7 +1615,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
break;}
|
break;}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Caused by incorrect alpha blending, selection mesh needs to be created as
|
Caused by incorrect alpha blending, selection mesh needs to be created as
|
||||||
last element to ensure it gets blended correct over nodes with alpha channel
|
last element to ensure it gets blended correct over nodes with alpha channel
|
||||||
@ -1643,15 +1643,15 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
u16 l = 0;
|
u16 l = 0;
|
||||||
u16 l1 = 0;
|
u16 l1 = 0;
|
||||||
for (u8 i = 0; i < 7; i++) {
|
for (u8 i = 0; i < 7; i++) {
|
||||||
MapNode n1 = data->m_vmanip.getNodeNoEx(blockpos_nodes + p + dirs[i]);
|
MapNode n1 = data->m_vmanip.getNodeNoEx(blockpos_nodes + p + dirs[i]);
|
||||||
l1 = getInteriorLight(n1, -4, nodedef);
|
l1 = getInteriorLight(n1, -4, nodedef);
|
||||||
if (l1 > l)
|
if (l1 > l)
|
||||||
l = l1;
|
l = l1;
|
||||||
}
|
}
|
||||||
video::SColor c = MapBlock_LightColor(255, l, 0);
|
video::SColor c = MapBlock_LightColor(255, l, 0);
|
||||||
data->m_highlight_mesh_color = c;
|
data->m_highlight_mesh_color = c;
|
||||||
std::vector<aabb3f> boxes = n.getSelectionBoxes(nodedef);
|
std::vector<aabb3f> boxes = n.getSelectionBoxes(nodedef);
|
||||||
TileSpec h_tile;
|
TileSpec h_tile;
|
||||||
h_tile.material_flags |= MATERIAL_FLAG_HIGHLIGHTED;
|
h_tile.material_flags |= MATERIAL_FLAG_HIGHLIGHTED;
|
||||||
h_tile.texture = tsrc->getTextureForMesh("halo.png",&h_tile.texture_id);
|
h_tile.texture = tsrc->getTextureForMesh("halo.png",&h_tile.texture_id);
|
||||||
v3f pos = intToFloat(p, BS);
|
v3f pos = intToFloat(p, BS);
|
||||||
|
@ -63,6 +63,8 @@ enum ContentParamType2
|
|||||||
CPT2_WALLMOUNTED,
|
CPT2_WALLMOUNTED,
|
||||||
// Block level like FLOWINGLIQUID
|
// Block level like FLOWINGLIQUID
|
||||||
CPT2_LEVELED,
|
CPT2_LEVELED,
|
||||||
|
// 2D rotation for things like plants
|
||||||
|
CPT2_DEGROTATE,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum LiquidType
|
enum LiquidType
|
||||||
|
@ -57,6 +57,7 @@ struct EnumString ScriptApiNode::es_ContentParamType2[] =
|
|||||||
{CPT2_FACEDIR, "facedir"},
|
{CPT2_FACEDIR, "facedir"},
|
||||||
{CPT2_WALLMOUNTED, "wallmounted"},
|
{CPT2_WALLMOUNTED, "wallmounted"},
|
||||||
{CPT2_LEVELED, "leveled"},
|
{CPT2_LEVELED, "leveled"},
|
||||||
|
{CPT2_DEGROTATE, "degrotate"},
|
||||||
{0, NULL},
|
{0, NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user