@@ -21,23 +21,22 @@ with this program; if not, write to the Free Software Foundation, Inc.,
21
21
#include < stack>
22
22
#include " util/numeric.h"
23
23
#include " util/mathconstants.h"
24
- #include " noise.h"
25
24
#include " map.h"
26
25
#include " environment.h"
27
26
#include " nodedef.h"
28
27
#include " treegen.h"
29
28
30
29
namespace treegen
31
30
{
32
-
33
31
void make_tree (ManualMapVoxelManipulator &vmanip, v3s16 p0,
34
- bool is_apple_tree, INodeDefManager *ndef)
32
+ bool is_apple_tree, INodeDefManager *ndef, int seed )
35
33
{
36
34
MapNode treenode (ndef->getId (" mapgen_tree" ));
37
35
MapNode leavesnode (ndef->getId (" mapgen_leaves" ));
38
36
MapNode applenode (ndef->getId (" mapgen_apple" ));
39
37
40
- s16 trunk_h = myrand_range (4 , 5 );
38
+ PseudoRandom ps (seed);
39
+ s16 trunk_h = ps.range (4 , 5 );
41
40
v3s16 p1 = p0;
42
41
for (s16 ii=0 ; ii<trunk_h; ii++)
43
42
{
@@ -73,9 +72,9 @@ void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0,
73
72
s16 d = 1 ;
74
73
75
74
v3s16 p (
76
- myrand_range (leaves_a.MinEdge .X , leaves_a.MaxEdge .X -d),
77
- myrand_range (leaves_a.MinEdge .Y , leaves_a.MaxEdge .Y -d),
78
- myrand_range (leaves_a.MinEdge .Z , leaves_a.MaxEdge .Z -d)
75
+ ps. range (leaves_a.MinEdge .X , leaves_a.MaxEdge .X -d),
76
+ ps. range (leaves_a.MinEdge .Y , leaves_a.MaxEdge .Y -d),
77
+ ps. range (leaves_a.MinEdge .Z , leaves_a.MaxEdge .Z -d)
79
78
);
80
79
81
80
for (s16 z=0 ; z<=d; z++)
@@ -101,7 +100,7 @@ void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0,
101
100
continue ;
102
101
u32 i = leaves_a.index (x,y,z);
103
102
if (leaves_d[i] == 1 ) {
104
- bool is_apple = myrand_range (0 ,99 ) < 10 ;
103
+ bool is_apple = ps. range (0 ,99 ) < 10 ;
105
104
if (is_apple_tree && is_apple) {
106
105
vmanip.m_data [vi] = applenode;
107
106
} else {
@@ -150,6 +149,7 @@ void make_ltree(ManualMapVoxelManipulator &vmanip, v3s16 p0, INodeDefManager *nd
150
149
{
151
150
MapNode dirtnode (ndef->getId (" mapgen_dirt" ));
152
151
152
+ PseudoRandom ps (tree_definition.seed +14002 );
153
153
// chance of inserting abcd rules
154
154
double prop_a = 9 ;
155
155
double prop_b = 8 ;
@@ -159,13 +159,13 @@ void make_ltree(ManualMapVoxelManipulator &vmanip, v3s16 p0, INodeDefManager *nd
159
159
// randomize tree growth level, minimum=2
160
160
s16 iterations = tree_definition.iterations ;
161
161
if (tree_definition.iterations_random_level >0 )
162
- iterations -= myrand_range (0 ,tree_definition.iterations_random_level );
162
+ iterations -= ps. range (0 ,tree_definition.iterations_random_level );
163
163
if (iterations<2 )
164
164
iterations=2 ;
165
165
166
166
s16 MAX_ANGLE_OFFSET = 5 ;
167
167
double angle_in_radians = (double )tree_definition.angle *M_PI/180 ;
168
- double angleOffset_in_radians = (s16)(myrand_range (0 ,1 )%MAX_ANGLE_OFFSET)*M_PI/180 ;
168
+ double angleOffset_in_radians = (s16)(ps. range (0 ,1 )%MAX_ANGLE_OFFSET)*M_PI/180 ;
169
169
170
170
// initialize rotation matrix, position and stacks for branches
171
171
core::matrix4 rotation;
@@ -200,19 +200,19 @@ void make_ltree(ManualMapVoxelManipulator &vmanip, v3s16 p0, INodeDefManager *nd
200
200
temp+=tree_definition.rules_d ;
201
201
break ;
202
202
case ' a' :
203
- if (prop_a >= myrand_range (1 ,10 ))
203
+ if (prop_a >= ps. range (1 ,10 ))
204
204
temp+=tree_definition.rules_a ;
205
205
break ;
206
206
case ' b' :
207
- if (prop_b >= myrand_range (1 ,10 ))
207
+ if (prop_b >= ps. range (1 ,10 ))
208
208
temp+=tree_definition.rules_b ;
209
209
break ;
210
210
case ' c' :
211
- if (prop_c >= myrand_range (1 ,10 ))
211
+ if (prop_c >= ps. range (1 ,10 ))
212
212
temp+=tree_definition.rules_c ;
213
213
break ;
214
214
case ' d' :
215
- if (prop_d >= myrand_range (1 ,10 ))
215
+ if (prop_d >= ps. range (1 ,10 ))
216
216
temp+=tree_definition.rules_d ;
217
217
break ;
218
218
default :
@@ -324,18 +324,18 @@ void make_ltree(ManualMapVoxelManipulator &vmanip, v3s16 p0, INodeDefManager *nd
324
324
for (z=-size; z<=size; z++)
325
325
if (abs (x) == size && abs (y) == size && abs (z) == size)
326
326
{
327
- tree_leaves_placement (vmanip,v3f (position.X +x+1 ,position.Y +y,position.Z +z),tree_definition);
328
- tree_leaves_placement (vmanip,v3f (position.X +x-1 ,position.Y +y,position.Z +z),tree_definition);
329
- tree_leaves_placement (vmanip,v3f (position.X +x,position.Y +y,position.Z +z+1 ),tree_definition);
330
- tree_leaves_placement (vmanip,v3f (position.X +x,position.Y +y,position.Z +z-1 ),tree_definition);
327
+ tree_leaves_placement (vmanip,v3f (position.X +x+1 ,position.Y +y,position.Z +z),ps. next (), tree_definition);
328
+ tree_leaves_placement (vmanip,v3f (position.X +x-1 ,position.Y +y,position.Z +z),ps. next (), tree_definition);
329
+ tree_leaves_placement (vmanip,v3f (position.X +x,position.Y +y,position.Z +z+1 ),ps. next (), tree_definition);
330
+ tree_leaves_placement (vmanip,v3f (position.X +x,position.Y +y,position.Z +z-1 ),ps. next (), tree_definition);
331
331
}
332
332
}
333
333
dir = v3f (1 ,0 ,0 );
334
334
dir = transposeMatrix (rotation,dir);
335
335
position+=dir;
336
336
break ;
337
337
case ' f' :
338
- tree_single_leaves_placement (vmanip,v3f (position.X ,position.Y ,position.Z ),tree_definition);
338
+ tree_single_leaves_placement (vmanip,v3f (position.X ,position.Y ,position.Z ),ps. next () , tree_definition);
339
339
dir = v3f (1 ,0 ,0 );
340
340
dir = transposeMatrix (rotation,dir);
341
341
position+=dir;
@@ -421,10 +421,10 @@ void tree_trunk_placement(ManualMapVoxelManipulator &vmanip, v3f p0,
421
421
}
422
422
423
423
void tree_leaves_placement (ManualMapVoxelManipulator &vmanip, v3f p0,
424
- TreeDef &tree_definition)
424
+ PseudoRandom ps , TreeDef &tree_definition)
425
425
{
426
426
MapNode leavesnode=tree_definition.leavesnode ;
427
- if (myrand_range (1 ,100 ) > 100 -tree_definition.leaves2_chance )
427
+ if (ps. range (1 ,100 ) > 100 -tree_definition.leaves2_chance )
428
428
leavesnode=tree_definition.leaves2node ;
429
429
v3s16 p1 = v3s16 (myround (p0.X ),myround (p0.Y ),myround (p0.Z ));
430
430
if (vmanip.m_area .contains (p1) == false )
@@ -435,20 +435,20 @@ void tree_leaves_placement(ManualMapVoxelManipulator &vmanip, v3f p0,
435
435
return ;
436
436
if (tree_definition.fruit_chance >0 )
437
437
{
438
- if (myrand_range (1 ,100 ) > 100 -tree_definition.fruit_chance )
438
+ if (ps. range (1 ,100 ) > 100 -tree_definition.fruit_chance )
439
439
vmanip.m_data [vmanip.m_area .index (p1)] = tree_definition.fruitnode ;
440
440
else
441
441
vmanip.m_data [vmanip.m_area .index (p1)] = leavesnode;
442
442
}
443
- else if (myrand_range (1 ,100 ) > 20 )
443
+ else if (ps. range (1 ,100 ) > 20 )
444
444
vmanip.m_data [vmanip.m_area .index (p1)] = leavesnode;
445
445
}
446
446
447
447
void tree_single_leaves_placement (ManualMapVoxelManipulator &vmanip, v3f p0,
448
- TreeDef &tree_definition)
448
+ PseudoRandom ps, TreeDef &tree_definition)
449
449
{
450
450
MapNode leavesnode=tree_definition.leavesnode ;
451
- if (myrand_range (1 ,100 ) > 100 -tree_definition.leaves2_chance )
451
+ if (ps. range (1 ,100 ) > 100 -tree_definition.leaves2_chance )
452
452
leavesnode=tree_definition.leaves2node ;
453
453
v3s16 p1 = v3s16 (myround (p0.X ),myround (p0.Y ),myround (p0.Z ));
454
454
if (vmanip.m_area .contains (p1) == false )
0 commit comments