From f0d70d4e86ddeae33939744535f0732434ad422e Mon Sep 17 00:00:00 2001 From: RealBadAngel Date: Sun, 24 Feb 2013 02:26:25 +0100 Subject: [PATCH] Add seed parameter for default and L-system trees --- doc/lua_api.txt | 1 + src/content_abm.cpp | 2 +- src/mapgen.cpp | 7 ++++--- src/scriptapi.cpp | 1 + src/treegen.cpp | 50 ++++++++++++++++++++++----------------------- src/treegen.h | 8 +++++--- 6 files changed, 37 insertions(+), 32 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index af70a1047..005d7c010 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -1093,6 +1093,7 @@ treedef={ thin_branches, - boolean true -> use thin (1 node) branches fruit, - string fruit node name fruit_chance, - num chance (0-100) to replace leaves with fruit node + seed, - num random seed } Key for Special L-System Symbols used in Axioms diff --git a/src/content_abm.cpp b/src/content_abm.cpp index ce1751117..0dcf862fc 100644 --- a/src/content_abm.cpp +++ b/src/content_abm.cpp @@ -119,7 +119,7 @@ public: v3s16 tree_blockp = getNodeBlockPos(tree_p); vmanip.initialEmerge(tree_blockp - v3s16(1,1,1), tree_blockp + v3s16(1,1,1)); bool is_apple_tree = myrand()%4 == 0; - treegen::make_tree(vmanip, tree_p, is_apple_tree, ndef); + treegen::make_tree(vmanip, tree_p, is_apple_tree, ndef, myrand()); vmanip.blitBackAll(&modified_blocks); // update lighting diff --git a/src/mapgen.cpp b/src/mapgen.cpp index b19073e90..a2d920bbc 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -2251,6 +2251,7 @@ void make_block(BlockMakeData *data) */ assert(central_area_size.X == central_area_size.Z); { + PseudoRandom ps (blockseed); // Divide area into parts s16 div = 8; s16 sidelen = central_area_size.X / div; @@ -2278,8 +2279,8 @@ void make_block(BlockMakeData *data) // Put trees in random places on part of division for(u32 i=0; igetId(fruit); getintfield(L, 3, "fruit_chance",tree_def.fruit_chance); } + getintfield(L, 3, "seed", tree_def.seed); } else return 0; diff --git a/src/treegen.cpp b/src/treegen.cpp index 7530843d3..948716dcf 100644 --- a/src/treegen.cpp +++ b/src/treegen.cpp @@ -21,7 +21,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "util/numeric.h" #include "util/mathconstants.h" -#include "noise.h" #include "map.h" #include "environment.h" #include "nodedef.h" @@ -29,15 +28,15 @@ with this program; if not, write to the Free Software Foundation, Inc., namespace treegen { - void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0, - bool is_apple_tree, INodeDefManager *ndef) + bool is_apple_tree, INodeDefManager *ndef,int seed) { MapNode treenode(ndef->getId("mapgen_tree")); MapNode leavesnode(ndef->getId("mapgen_leaves")); MapNode applenode(ndef->getId("mapgen_apple")); - s16 trunk_h = myrand_range(4, 5); + PseudoRandom ps(seed); + s16 trunk_h = ps.range(4, 5); v3s16 p1 = p0; for(s16 ii=0; iigetId("mapgen_dirt")); + PseudoRandom ps(tree_definition.seed+14002); // chance of inserting abcd rules double prop_a = 9; double prop_b = 8; @@ -159,13 +159,13 @@ void make_ltree(ManualMapVoxelManipulator &vmanip, v3s16 p0, INodeDefManager *nd //randomize tree growth level, minimum=2 s16 iterations = tree_definition.iterations; if (tree_definition.iterations_random_level>0) - iterations -= myrand_range(0,tree_definition.iterations_random_level); + iterations -= ps.range(0,tree_definition.iterations_random_level); if (iterations<2) iterations=2; s16 MAX_ANGLE_OFFSET = 5; double angle_in_radians = (double)tree_definition.angle*M_PI/180; - double angleOffset_in_radians = (s16)(myrand_range(0,1)%MAX_ANGLE_OFFSET)*M_PI/180; + double angleOffset_in_radians = (s16)(ps.range(0,1)%MAX_ANGLE_OFFSET)*M_PI/180; //initialize rotation matrix, position and stacks for branches core::matrix4 rotation; @@ -200,19 +200,19 @@ void make_ltree(ManualMapVoxelManipulator &vmanip, v3s16 p0, INodeDefManager *nd temp+=tree_definition.rules_d; break; case 'a': - if (prop_a >= myrand_range(1,10)) + if (prop_a >= ps.range(1,10)) temp+=tree_definition.rules_a; break; case 'b': - if (prop_b >= myrand_range(1,10)) + if (prop_b >= ps.range(1,10)) temp+=tree_definition.rules_b; break; case 'c': - if (prop_c >= myrand_range(1,10)) + if (prop_c >= ps.range(1,10)) temp+=tree_definition.rules_c; break; case 'd': - if (prop_d >= myrand_range(1,10)) + if (prop_d >= ps.range(1,10)) temp+=tree_definition.rules_d; break; default: @@ -324,10 +324,10 @@ void make_ltree(ManualMapVoxelManipulator &vmanip, v3s16 p0, INodeDefManager *nd for(z=-size; z<=size; z++) if (abs(x) == size && abs(y) == size && abs(z) == size) { - tree_leaves_placement(vmanip,v3f(position.X+x+1,position.Y+y,position.Z+z),tree_definition); - tree_leaves_placement(vmanip,v3f(position.X+x-1,position.Y+y,position.Z+z),tree_definition); - tree_leaves_placement(vmanip,v3f(position.X+x,position.Y+y,position.Z+z+1),tree_definition); - tree_leaves_placement(vmanip,v3f(position.X+x,position.Y+y,position.Z+z-1),tree_definition); + tree_leaves_placement(vmanip,v3f(position.X+x+1,position.Y+y,position.Z+z),ps.next(), tree_definition); + tree_leaves_placement(vmanip,v3f(position.X+x-1,position.Y+y,position.Z+z),ps.next(), tree_definition); + tree_leaves_placement(vmanip,v3f(position.X+x,position.Y+y,position.Z+z+1),ps.next(), tree_definition); + tree_leaves_placement(vmanip,v3f(position.X+x,position.Y+y,position.Z+z-1),ps.next(), tree_definition); } } dir = v3f(1,0,0); @@ -335,7 +335,7 @@ void make_ltree(ManualMapVoxelManipulator &vmanip, v3s16 p0, INodeDefManager *nd position+=dir; break; case 'f': - tree_single_leaves_placement(vmanip,v3f(position.X,position.Y,position.Z),tree_definition); + tree_single_leaves_placement(vmanip,v3f(position.X,position.Y,position.Z),ps.next() ,tree_definition); dir = v3f(1,0,0); dir = transposeMatrix(rotation,dir); position+=dir; @@ -421,10 +421,10 @@ void tree_trunk_placement(ManualMapVoxelManipulator &vmanip, v3f p0, } void tree_leaves_placement(ManualMapVoxelManipulator &vmanip, v3f p0, - TreeDef &tree_definition) + PseudoRandom ps ,TreeDef &tree_definition) { MapNode leavesnode=tree_definition.leavesnode; - if (myrand_range(1,100) > 100-tree_definition.leaves2_chance) + if (ps.range(1,100) > 100-tree_definition.leaves2_chance) leavesnode=tree_definition.leaves2node; v3s16 p1 = v3s16(myround(p0.X),myround(p0.Y),myround(p0.Z)); if(vmanip.m_area.contains(p1) == false) @@ -435,20 +435,20 @@ void tree_leaves_placement(ManualMapVoxelManipulator &vmanip, v3f p0, return; if (tree_definition.fruit_chance>0) { - if (myrand_range(1,100) > 100-tree_definition.fruit_chance) + if (ps.range(1,100) > 100-tree_definition.fruit_chance) vmanip.m_data[vmanip.m_area.index(p1)] = tree_definition.fruitnode; else vmanip.m_data[vmanip.m_area.index(p1)] = leavesnode; } - else if (myrand_range(1,100) > 20) + else if (ps.range(1,100) > 20) vmanip.m_data[vmanip.m_area.index(p1)] = leavesnode; } void tree_single_leaves_placement(ManualMapVoxelManipulator &vmanip, v3f p0, - TreeDef &tree_definition) + PseudoRandom ps, TreeDef &tree_definition) { MapNode leavesnode=tree_definition.leavesnode; - if (myrand_range(1,100) > 100-tree_definition.leaves2_chance) + if (ps.range(1,100) > 100-tree_definition.leaves2_chance) leavesnode=tree_definition.leaves2node; v3s16 p1 = v3s16(myround(p0.X),myround(p0.Y),myround(p0.Z)); if(vmanip.m_area.contains(p1) == false) diff --git a/src/treegen.h b/src/treegen.h index cb365f4be..0068219dd 100644 --- a/src/treegen.h +++ b/src/treegen.h @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #define TREEGEN_HEADER #include +#include "noise.h" class ManualMapVoxelManipulator; class INodeDefManager; @@ -47,11 +48,12 @@ std::string trunk_type; bool thin_branches; MapNode fruitnode; int fruit_chance; +int seed; }; // Add default tree void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0, - bool is_apple_tree, INodeDefManager *ndef); + bool is_apple_tree, INodeDefManager *ndef,int seed); // Add L-Systems tree (used by engine) void make_ltree(ManualMapVoxelManipulator &vmanip, v3s16 p0, INodeDefManager *ndef, @@ -66,9 +68,9 @@ int fruit_chance; void tree_trunk_placement(ManualMapVoxelManipulator &vmanip, v3f p0, TreeDef &tree_definition); void tree_leaves_placement(ManualMapVoxelManipulator &vmanip, v3f p0, - TreeDef &tree_definition); + PseudoRandom ps, TreeDef &tree_definition); void tree_single_leaves_placement(ManualMapVoxelManipulator &vmanip, v3f p0, - TreeDef &tree_definition); + PseudoRandom ps, TreeDef &tree_definition); void tree_fruit_placement(ManualMapVoxelManipulator &vmanip, v3f p0, TreeDef &tree_definition); irr::core::matrix4 setRotationAxisRadians(irr::core::matrix4 M, double angle,v3f axis);