summaryrefslogtreecommitdiff
path: root/src/treegen.cpp
diff options
context:
space:
mode:
authorRealBadAngel <mk@realbadangel.pl>2013-02-24 02:26:25 +0100
committerRealBadAngel <mk@realbadangel.pl>2013-02-24 02:26:25 +0100
commitf0d70d4e86ddeae33939744535f0732434ad422e (patch)
tree5adffffa74ca406fc36ec91df30bbd9f2d45186f /src/treegen.cpp
parent6b9906687b85fcefa28df572d92a3dea3118c0a3 (diff)
downloadminetest-f0d70d4e86ddeae33939744535f0732434ad422e.tar.gz
minetest-f0d70d4e86ddeae33939744535f0732434ad422e.tar.bz2
minetest-f0d70d4e86ddeae33939744535f0732434ad422e.zip
Add seed parameter for default and L-system trees
Diffstat (limited to 'src/treegen.cpp')
-rw-r--r--src/treegen.cpp50
1 files changed, 25 insertions, 25 deletions
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 <stack>
#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; ii<trunk_h; ii++)
{
@@ -73,9 +72,9 @@ void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0,
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)
+ ps.range(leaves_a.MinEdge.X, leaves_a.MaxEdge.X-d),
+ ps.range(leaves_a.MinEdge.Y, leaves_a.MaxEdge.Y-d),
+ ps.range(leaves_a.MinEdge.Z, leaves_a.MaxEdge.Z-d)
);
for(s16 z=0; z<=d; z++)
@@ -101,7 +100,7 @@ void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0,
continue;
u32 i = leaves_a.index(x,y,z);
if(leaves_d[i] == 1) {
- bool is_apple = myrand_range(0,99) < 10;
+ bool is_apple = ps.range(0,99) < 10;
if(is_apple_tree && is_apple) {
vmanip.m_data[vi] = applenode;
} else {
@@ -150,6 +149,7 @@ void make_ltree(ManualMapVoxelManipulator &vmanip, v3s16 p0, INodeDefManager *nd
{
MapNode dirtnode(ndef->getId("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)