Skip to content

Commit 9bd76f2

Browse files
author
kwolekr
committedFeb 24, 2013
Merge pull request luanti-org#505 from RealBadAngel/master
Add seed parameter for default and L-system trees
2 parents 6b99066 + f0d70d4 commit 9bd76f2

File tree

6 files changed

+37
-32
lines changed

6 files changed

+37
-32
lines changed
 

‎doc/lua_api.txt

+1
Original file line numberDiff line numberDiff line change
@@ -1093,6 +1093,7 @@ treedef={
10931093
thin_branches, - boolean true -> use thin (1 node) branches
10941094
fruit, - string fruit node name
10951095
fruit_chance, - num chance (0-100) to replace leaves with fruit node
1096+
seed, - num random seed
10961097
}
10971098

10981099
Key for Special L-System Symbols used in Axioms

‎src/content_abm.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ class MakeTreesFromSaplingsABM : public ActiveBlockModifier
119119
v3s16 tree_blockp = getNodeBlockPos(tree_p);
120120
vmanip.initialEmerge(tree_blockp - v3s16(1,1,1), tree_blockp + v3s16(1,1,1));
121121
bool is_apple_tree = myrand()%4 == 0;
122-
treegen::make_tree(vmanip, tree_p, is_apple_tree, ndef);
122+
treegen::make_tree(vmanip, tree_p, is_apple_tree, ndef, myrand());
123123
vmanip.blitBackAll(&modified_blocks);
124124

125125
// update lighting

‎src/mapgen.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -2251,6 +2251,7 @@ void make_block(BlockMakeData *data)
22512251
*/
22522252
assert(central_area_size.X == central_area_size.Z);
22532253
{
2254+
PseudoRandom ps (blockseed);
22542255
// Divide area into parts
22552256
s16 div = 8;
22562257
s16 sidelen = central_area_size.X / div;
@@ -2278,8 +2279,8 @@ void make_block(BlockMakeData *data)
22782279
// Put trees in random places on part of division
22792280
for(u32 i=0; i<tree_count; i++)
22802281
{
2281-
s16 x = myrand_range(p2d_min.X, p2d_max.X);
2282-
s16 z = myrand_range(p2d_min.Y, p2d_max.Y);
2282+
s16 x = ps.range(p2d_min.X, p2d_max.X);
2283+
s16 z = ps.range(p2d_min.Y, p2d_max.Y);
22832284
s16 y = find_ground_level(vmanip, v2s16(x,z), ndef);
22842285
// Don't make a tree under water level
22852286
if(y < WATER_LEVEL)
@@ -2300,7 +2301,7 @@ void make_block(BlockMakeData *data)
23002301
}
23012302
p.Y++;
23022303
// Make a tree
2303-
treegen::make_tree(vmanip, p, false, ndef);
2304+
treegen::make_tree(vmanip, p, false, ndef, ps.next());
23042305
}
23052306
}
23062307
}

‎src/scriptapi.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -4254,6 +4254,7 @@ class EnvRef
42544254
tree_def.fruitnode=ndef->getId(fruit);
42554255
getintfield(L, 3, "fruit_chance",tree_def.fruit_chance);
42564256
}
4257+
getintfield(L, 3, "seed", tree_def.seed);
42574258
}
42584259
else
42594260
return 0;

‎src/treegen.cpp

+25-25
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,22 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2121
#include <stack>
2222
#include "util/numeric.h"
2323
#include "util/mathconstants.h"
24-
#include "noise.h"
2524
#include "map.h"
2625
#include "environment.h"
2726
#include "nodedef.h"
2827
#include "treegen.h"
2928

3029
namespace treegen
3130
{
32-
3331
void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0,
34-
bool is_apple_tree, INodeDefManager *ndef)
32+
bool is_apple_tree, INodeDefManager *ndef,int seed)
3533
{
3634
MapNode treenode(ndef->getId("mapgen_tree"));
3735
MapNode leavesnode(ndef->getId("mapgen_leaves"));
3836
MapNode applenode(ndef->getId("mapgen_apple"));
3937

40-
s16 trunk_h = myrand_range(4, 5);
38+
PseudoRandom ps(seed);
39+
s16 trunk_h = ps.range(4, 5);
4140
v3s16 p1 = p0;
4241
for(s16 ii=0; ii<trunk_h; ii++)
4342
{
@@ -73,9 +72,9 @@ void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0,
7372
s16 d = 1;
7473

7574
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)
7978
);
8079

8180
for(s16 z=0; z<=d; z++)
@@ -101,7 +100,7 @@ void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0,
101100
continue;
102101
u32 i = leaves_a.index(x,y,z);
103102
if(leaves_d[i] == 1) {
104-
bool is_apple = myrand_range(0,99) < 10;
103+
bool is_apple = ps.range(0,99) < 10;
105104
if(is_apple_tree && is_apple) {
106105
vmanip.m_data[vi] = applenode;
107106
} else {
@@ -150,6 +149,7 @@ void make_ltree(ManualMapVoxelManipulator &vmanip, v3s16 p0, INodeDefManager *nd
150149
{
151150
MapNode dirtnode(ndef->getId("mapgen_dirt"));
152151

152+
PseudoRandom ps(tree_definition.seed+14002);
153153
// chance of inserting abcd rules
154154
double prop_a = 9;
155155
double prop_b = 8;
@@ -159,13 +159,13 @@ void make_ltree(ManualMapVoxelManipulator &vmanip, v3s16 p0, INodeDefManager *nd
159159
//randomize tree growth level, minimum=2
160160
s16 iterations = tree_definition.iterations;
161161
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);
163163
if (iterations<2)
164164
iterations=2;
165165

166166
s16 MAX_ANGLE_OFFSET = 5;
167167
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;
169169

170170
//initialize rotation matrix, position and stacks for branches
171171
core::matrix4 rotation;
@@ -200,19 +200,19 @@ void make_ltree(ManualMapVoxelManipulator &vmanip, v3s16 p0, INodeDefManager *nd
200200
temp+=tree_definition.rules_d;
201201
break;
202202
case 'a':
203-
if (prop_a >= myrand_range(1,10))
203+
if (prop_a >= ps.range(1,10))
204204
temp+=tree_definition.rules_a;
205205
break;
206206
case 'b':
207-
if (prop_b >= myrand_range(1,10))
207+
if (prop_b >= ps.range(1,10))
208208
temp+=tree_definition.rules_b;
209209
break;
210210
case 'c':
211-
if (prop_c >= myrand_range(1,10))
211+
if (prop_c >= ps.range(1,10))
212212
temp+=tree_definition.rules_c;
213213
break;
214214
case 'd':
215-
if (prop_d >= myrand_range(1,10))
215+
if (prop_d >= ps.range(1,10))
216216
temp+=tree_definition.rules_d;
217217
break;
218218
default:
@@ -324,18 +324,18 @@ void make_ltree(ManualMapVoxelManipulator &vmanip, v3s16 p0, INodeDefManager *nd
324324
for(z=-size; z<=size; z++)
325325
if (abs(x) == size && abs(y) == size && abs(z) == size)
326326
{
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);
331331
}
332332
}
333333
dir = v3f(1,0,0);
334334
dir = transposeMatrix(rotation,dir);
335335
position+=dir;
336336
break;
337337
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);
339339
dir = v3f(1,0,0);
340340
dir = transposeMatrix(rotation,dir);
341341
position+=dir;
@@ -421,10 +421,10 @@ void tree_trunk_placement(ManualMapVoxelManipulator &vmanip, v3f p0,
421421
}
422422

423423
void tree_leaves_placement(ManualMapVoxelManipulator &vmanip, v3f p0,
424-
TreeDef &tree_definition)
424+
PseudoRandom ps ,TreeDef &tree_definition)
425425
{
426426
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)
428428
leavesnode=tree_definition.leaves2node;
429429
v3s16 p1 = v3s16(myround(p0.X),myround(p0.Y),myround(p0.Z));
430430
if(vmanip.m_area.contains(p1) == false)
@@ -435,20 +435,20 @@ void tree_leaves_placement(ManualMapVoxelManipulator &vmanip, v3f p0,
435435
return;
436436
if (tree_definition.fruit_chance>0)
437437
{
438-
if (myrand_range(1,100) > 100-tree_definition.fruit_chance)
438+
if (ps.range(1,100) > 100-tree_definition.fruit_chance)
439439
vmanip.m_data[vmanip.m_area.index(p1)] = tree_definition.fruitnode;
440440
else
441441
vmanip.m_data[vmanip.m_area.index(p1)] = leavesnode;
442442
}
443-
else if (myrand_range(1,100) > 20)
443+
else if (ps.range(1,100) > 20)
444444
vmanip.m_data[vmanip.m_area.index(p1)] = leavesnode;
445445
}
446446

447447
void tree_single_leaves_placement(ManualMapVoxelManipulator &vmanip, v3f p0,
448-
TreeDef &tree_definition)
448+
PseudoRandom ps, TreeDef &tree_definition)
449449
{
450450
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)
452452
leavesnode=tree_definition.leaves2node;
453453
v3s16 p1 = v3s16(myround(p0.X),myround(p0.Y),myround(p0.Z));
454454
if(vmanip.m_area.contains(p1) == false)

‎src/treegen.h

+5-3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2121
#define TREEGEN_HEADER
2222

2323
#include <matrix4.h>
24+
#include "noise.h"
2425

2526
class ManualMapVoxelManipulator;
2627
class INodeDefManager;
@@ -47,11 +48,12 @@ std::string trunk_type;
4748
bool thin_branches;
4849
MapNode fruitnode;
4950
int fruit_chance;
51+
int seed;
5052
};
5153

5254
// Add default tree
5355
void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0,
54-
bool is_apple_tree, INodeDefManager *ndef);
56+
bool is_apple_tree, INodeDefManager *ndef,int seed);
5557

5658
// Add L-Systems tree (used by engine)
5759
void make_ltree(ManualMapVoxelManipulator &vmanip, v3s16 p0, INodeDefManager *ndef,
@@ -66,9 +68,9 @@ int fruit_chance;
6668
void tree_trunk_placement(ManualMapVoxelManipulator &vmanip, v3f p0,
6769
TreeDef &tree_definition);
6870
void tree_leaves_placement(ManualMapVoxelManipulator &vmanip, v3f p0,
69-
TreeDef &tree_definition);
71+
PseudoRandom ps, TreeDef &tree_definition);
7072
void tree_single_leaves_placement(ManualMapVoxelManipulator &vmanip, v3f p0,
71-
TreeDef &tree_definition);
73+
PseudoRandom ps, TreeDef &tree_definition);
7274
void tree_fruit_placement(ManualMapVoxelManipulator &vmanip, v3f p0,
7375
TreeDef &tree_definition);
7476
irr::core::matrix4 setRotationAxisRadians(irr::core::matrix4 M, double angle,v3f axis);

0 commit comments

Comments
 (0)
Please sign in to comment.