merged jungle and bluish shadows
authorPerttu Ahola <celeron55@gmail.com>
Sat, 23 Jul 2011 17:01:06 +0000 (20:01 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Sat, 23 Jul 2011 17:01:06 +0000 (20:01 +0300)
1  2 
src/content_mapblock.cpp
src/content_mapnode.cpp
src/content_mapnode.h
src/mapblock_mesh.cpp
src/mapgen.cpp
src/mapnode.h

index 4a9fa5e98cdfaf8c4c54f184e56854c9125b6244,e542cb3359ef7c5ec4bd0b982facd63415514c6b..3044c8b359102c8c55293d48ecd62fb1b1509b4f
@@@ -272,10 -284,10 +284,10 @@@ void mapblock_mesh_generate_special(Mes
                /*
                        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 */
Simple merge
index 02c604c60d3279971a6dbdafe14275b553d00e40,f7d3269ea1c14cf443817ab21c62c82ce01e9da2..51cf06496df1b3be76f3d3770e80189cd0e8e37b
@@@ -42,33 -38,27 +42,35 @@@ MapNode mapnode_translate_to_internal(M
  #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
  
Simple merge
diff --cc src/mapgen.cpp
index bc4f822808273ff7aace824cbc3a9dde4ca66622,0bb6560a8abc31d4b137dfe539090c59bcc1b698..0ba7f91abadb9d71178f0ed4bab29f84b04e553b
@@@ -152,6 -152,92 +152,92 @@@ static void make_tree(VoxelManipulator 
        }
  }
  
 -              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);
@@@ -1962,13 -2070,17 +2069,17 @@@ void make_block(BlockMakeData *data
                                        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
diff --cc src/mapnode.h
Simple merge