/*
Signs on walls
*/
- else if(n.d == CONTENT_SIGN_WALL)
+ else if(n.getContent() == CONTENT_SIGN_WALL)
{
u8 l = decode_light(n.getLightBlend(data->m_daynight_ratio));
- video::SColor c(255,l,l,l);
+ video::SColor c = MapBlock_LightColor(255, l);
float d = (float)BS/16;
// Wall at X+ of node
/*
Add glass
*/
- else if(n.d == CONTENT_GLASS)
+ else if(n.getContent() == CONTENT_GLASS)
{
u8 l = decode_light(undiminish_light(n.getLightBlend(data->m_daynight_ratio)));
- video::SColor c(255,l,l,l);
+ video::SColor c = MapBlock_LightColor(255, l);
for(u32 j=0; j<6; j++)
{
/*
Add fence
*/
- else if(n.d == CONTENT_FENCE)
+ else if(n.getContent() == CONTENT_FENCE)
{
u8 l = decode_light(undiminish_light(n.getLightBlend(data->m_daynight_ratio)));
- video::SColor c(255,l,l,l);
+ video::SColor c = MapBlock_LightColor(255, l);
const f32 post_rad=(f32)BS/10;
const f32 bar_rad=(f32)BS/20;
}
}
#endif
- else if(n.d == CONTENT_PAPYRUS)
+ else if(n.getContent() == CONTENT_PAPYRUS)
{
u8 l = decode_light(undiminish_light(n.getLightBlend(data->m_daynight_ratio)));
- video::SColor c(255,l,l,l);
+ video::SColor c = MapBlock_LightColor(255, l);
for(u32 j=0; j<4; j++)
{
collector.append(material_papyrus, vertices, 4, indices, 6);
}
}
- else if(n.d == CONTENT_JUNGLEGRASS)
++ else if(n.getContent() == CONTENT_JUNGLEGRASS)
+ {
+ u8 l = decode_light(undiminish_light(n.getLightBlend(data->m_daynight_ratio)));
+ video::SColor c = MapBlock_LightColor(255, l);
+
+ for(u32 j=0; j<4; j++)
+ {
+ video::S3DVertex vertices[4] =
+ {
+ video::S3DVertex(-BS/2,-BS/2,0, 0,0,0, c,
+ pa_papyrus.x0(), pa_papyrus.y1()),
+ video::S3DVertex(BS/2,-BS/2,0, 0,0,0, c,
+ pa_papyrus.x1(), pa_papyrus.y1()),
+ video::S3DVertex(BS/2,BS/1,0, 0,0,0, c,
+ pa_papyrus.x1(), pa_papyrus.y0()),
+ video::S3DVertex(-BS/2,BS/1,0, 0,0,0, c,
+ pa_papyrus.x0(), pa_papyrus.y0()),
+ };
+
+ if(j == 0)
+ {
+ for(u16 i=0; i<4; i++)
+ vertices[i].Pos.rotateXZBy(45);
+ }
+ else if(j == 1)
+ {
+ for(u16 i=0; i<4; i++)
+ vertices[i].Pos.rotateXZBy(-45);
+ }
+ else if(j == 2)
+ {
+ for(u16 i=0; i<4; i++)
+ vertices[i].Pos.rotateXZBy(135);
+ }
+ else if(j == 3)
+ {
+ for(u16 i=0; i<4; i++)
+ vertices[i].Pos.rotateXZBy(-135);
+ }
+
+ for(u16 i=0; i<4; i++)
+ {
+ vertices[i].Pos *= 1.3;
+ vertices[i].Pos += intToFloat(p + blockpos_nodes, BS);
+ }
+
+ u16 indices[] = {0,1,2,2,3,0};
+ // Add to mesh collector
+ collector.append(material_junglegrass, vertices, 4, indices, 6);
+ }
+ }
- else if(n.d == CONTENT_RAIL)
+ else if(n.getContent() == CONTENT_RAIL)
{
u8 l = decode_light(n.getLightBlend(data->m_daynight_ratio));
- video::SColor c(255,l,l,l);
+ video::SColor c = MapBlock_LightColor(255, l);
bool is_rail_x [] = { false, false }; /* x-1, x+1 */
bool is_rail_z [] = { false, false }; /* z-1, z+1 */
#define CONTENT_SIGN_WALL 14
#define CONTENT_CHEST 15
#define CONTENT_FURNACE 16
-//#define CONTENT_WORKBENCH 17
-#define CONTENT_COBBLE 18
-#define CONTENT_STEEL 19
-#define CONTENT_GLASS 20
#define CONTENT_FENCE 21
-#define CONTENT_MOSSYCOBBLE 22
-#define CONTENT_GRAVEL 23
-#define CONTENT_SANDSTONE 24
-#define CONTENT_CACTUS 25
-#define CONTENT_BRICK 26
-#define CONTENT_CLAY 27
-#define CONTENT_PAPYRUS 28
-#define CONTENT_BOOKSHELF 29
#define CONTENT_RAIL 30
+ #define CONTENT_JUNGLETREE 31
+ #define CONTENT_JUNGLEGRASS 32
+// 0x800...0xfff (2048...4095): higher 4 bytes of param2 are not usable
+#define CONTENT_GRASS 0x800 //1
+#define CONTENT_TREE 0x801 //4
+#define CONTENT_LEAVES 0x802 //5
+#define CONTENT_GRASS_FOOTSTEPS 0x803 //6
+#define CONTENT_MESE 0x804 //7
+#define CONTENT_MUD 0x805 //8
+// Pretty much useless, clouds won't be drawn this way
+#define CONTENT_CLOUD 0x806 //10
+#define CONTENT_COALSTONE 0x807 //11
+#define CONTENT_WOOD 0x808 //12
+#define CONTENT_SAND 0x809 //13
+#define CONTENT_COBBLE 0x80a //18
+#define CONTENT_STEEL 0x80b //19
+#define CONTENT_GLASS 0x80c //20
+#define CONTENT_MOSSYCOBBLE 0x80d //22
+#define CONTENT_GRAVEL 0x80e //23
+#define CONTENT_SANDSTONE 0x80f //24
+#define CONTENT_CACTUS 0x810 //25
+#define CONTENT_BRICK 0x811 //26
+#define CONTENT_CLAY 0x812 //27
+#define CONTENT_PAPYRUS 0x813 //28
+#define CONTENT_BOOKSHELF 0x814 //29
+
+
#endif
}
}
- if(vmanip.m_data[vi].d != CONTENT_AIR
- && vmanip.m_data[vi].d != CONTENT_IGNORE)
+ static void make_jungletree(VoxelManipulator &vmanip, v3s16 p0)
+ {
+ MapNode treenode(CONTENT_JUNGLETREE);
+ MapNode leavesnode(CONTENT_LEAVES);
+
+ for(s16 x=-1; x<=1; x++)
+ for(s16 z=-1; z<=1; z++)
+ {
+ if(myrand_range(0, 2) == 0)
+ continue;
+ v3s16 p1 = p0 + v3s16(x,0,z);
+ v3s16 p2 = p0 + v3s16(x,-1,z);
+ if(vmanip.m_area.contains(p2)
+ && vmanip.m_data[vmanip.m_area.index(p2)] == CONTENT_AIR)
+ vmanip.m_data[vmanip.m_area.index(p2)] = treenode;
+ else if(vmanip.m_area.contains(p1))
+ vmanip.m_data[vmanip.m_area.index(p1)] = treenode;
+ }
+
+ s16 trunk_h = myrand_range(8, 12);
+ v3s16 p1 = p0;
+ for(s16 ii=0; ii<trunk_h; ii++)
+ {
+ if(vmanip.m_area.contains(p1))
+ vmanip.m_data[vmanip.m_area.index(p1)] = treenode;
+ p1.Y++;
+ }
+
+ // p1 is now the last piece of the trunk
+ p1.Y -= 1;
+
+ VoxelArea leaves_a(v3s16(-3,-2,-3), v3s16(3,2,3));
+ //SharedPtr<u8> leaves_d(new u8[leaves_a.getVolume()]);
+ Buffer<u8> leaves_d(leaves_a.getVolume());
+ for(s32 i=0; i<leaves_a.getVolume(); i++)
+ leaves_d[i] = 0;
+
+ // Force leaves at near the end of the trunk
+ {
+ s16 d = 1;
+ for(s16 z=-d; z<=d; z++)
+ for(s16 y=-d; y<=d; y++)
+ for(s16 x=-d; x<=d; x++)
+ {
+ leaves_d[leaves_a.index(v3s16(x,y,z))] = 1;
+ }
+ }
+
+ // Add leaves randomly
+ for(u32 iii=0; iii<30; iii++)
+ {
+ s16 d = 1;
+
+ v3s16 p(
+ myrand_range(leaves_a.MinEdge.X, leaves_a.MaxEdge.X-d),
+ myrand_range(leaves_a.MinEdge.Y, leaves_a.MaxEdge.Y-d),
+ myrand_range(leaves_a.MinEdge.Z, leaves_a.MaxEdge.Z-d)
+ );
+
+ for(s16 z=0; z<=d; z++)
+ for(s16 y=0; y<=d; y++)
+ for(s16 x=0; x<=d; x++)
+ {
+ leaves_d[leaves_a.index(p+v3s16(x,y,z))] = 1;
+ }
+ }
+
+ // Blit leaves to vmanip
+ for(s16 z=leaves_a.MinEdge.Z; z<=leaves_a.MaxEdge.Z; z++)
+ for(s16 y=leaves_a.MinEdge.Y; y<=leaves_a.MaxEdge.Y; y++)
+ for(s16 x=leaves_a.MinEdge.X; x<=leaves_a.MaxEdge.X; x++)
+ {
+ v3s16 p(x,y,z);
+ p += p1;
+ if(vmanip.m_area.contains(p) == false)
+ continue;
+ u32 vi = vmanip.m_area.index(p);
++ if(vmanip.m_data[vi].getContent() != CONTENT_AIR
++ && vmanip.m_data[vi].getContent() != CONTENT_IGNORE)
+ continue;
+ u32 i = leaves_a.index(x,y,z);
+ if(leaves_d[i] == 1)
+ vmanip.m_data[vi] = leavesnode;
+ }
+ }
+
void make_papyrus(VoxelManipulator &vmanip, v3s16 p0)
{
MapNode papyrusnode(CONTENT_PAPYRUS);
make_papyrus(vmanip, p);
}
// Trees grow only on mud and grass, on land
- else if((n->d == CONTENT_MUD || n->d == CONTENT_GRASS) && y > WATER_LEVEL + 2)
+ else if((n->getContent() == CONTENT_MUD || n->getContent() == CONTENT_GRASS) && y > WATER_LEVEL + 2)
{
p.Y++;
- make_tree(vmanip, p);
+ //if(surface_humidity_2d(data->seed, v2s16(x, y)) < 0.5)
+ if(is_jungle == false)
+ make_tree(vmanip, p);
+ else
+ make_jungletree(vmanip, p);
}
// Cactii grow only on sand, on land
- else if(n->d == CONTENT_SAND && y > WATER_LEVEL + 2)
+ else if(n->getContent() == CONTENT_SAND && y > WATER_LEVEL + 2)
{
p.Y++;
make_cactus(vmanip, p);
}
}
- if(content_features(n->d).is_ground_content
- || n->d == CONTENT_JUNGLETREE)
+ /*
+ Add jungle grass
+ */
+ if(is_jungle)
+ {
+ PseudoRandom grassrandom(blockseed);
+ for(u32 i=0; i<surface_humidity*5*tree_count; i++)
+ {
+ s16 x = grassrandom.range(node_min.X, node_max.X);
+ s16 z = grassrandom.range(node_min.Z, node_max.Z);
+ s16 y = find_ground_level_from_noise(data->seed, v2s16(x,z), 4);
+ if(y < WATER_LEVEL)
+ continue;
+ if(y < node_min.Y || y > node_max.Y)
+ continue;
+ /*
+ Find exact ground level
+ */
+ v3s16 p(x,y+6,z);
+ bool found = false;
+ for(; p.Y >= y-6; p.Y--)
+ {
+ u32 i = data->vmanip->m_area.index(p);
+ MapNode *n = &data->vmanip->m_data[i];
- if(vmanip.m_data[vmanip.m_area.index(p)].d != CONTENT_AIR)
++ if(content_features(*n).is_ground_content
++ || n->getContent() == CONTENT_JUNGLETREE)
+ {
+ found = true;
+ break;
+ }
+ }
+ // If not found, handle next one
+ if(found == false)
+ continue;
+ p.Y++;
+ if(vmanip.m_area.contains(p) == false)
+ continue;
++ if(vmanip.m_data[vmanip.m_area.index(p)].getContent() != CONTENT_AIR)
+ continue;
+ /*p.Y--;
+ if(vmanip.m_area.contains(p))
+ vmanip.m_data[vmanip.m_area.index(p)] = CONTENT_MUD;
+ p.Y++;*/
+ if(vmanip.m_area.contains(p))
+ vmanip.m_data[vmanip.m_area.index(p)] = CONTENT_JUNGLEGRASS;
+ }
+ }
+
#if 0
/*
Add some kind of random stones