Skip to content

Commit 1cb6ea6

Browse files
committed
Refactor decoration-related code
Split up ModApiMapgen::l_register_decoration() Define and make use of CONTAINS() and ARRLEN() macros
1 parent 7c6da2f commit 1cb6ea6

File tree

7 files changed

+152
-136
lines changed

7 files changed

+152
-136
lines changed

src/clouds.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ void Clouds::render()
189189
}
190190

191191
#define GETINDEX(x, z, radius) (((z)+(radius))*(radius)*2 + (x)+(radius))
192-
#define CONTAINS(x, z, radius) \
192+
#define INAREA(x, z, radius) \
193193
((x) >= -(radius) && (x) < (radius) && (z) >= -(radius) && (z) < (radius))
194194

195195
for(s16 zi0=-cloud_radius_i; zi0<cloud_radius_i; zi0++)
@@ -247,7 +247,7 @@ void Clouds::render()
247247
v[3].Pos.set( rx, ry,-rz);
248248
break;
249249
case 1: // back
250-
if(CONTAINS(xi, zi-1, cloud_radius_i)){
250+
if(INAREA(xi, zi-1, cloud_radius_i)){
251251
u32 j = GETINDEX(xi, zi-1, cloud_radius_i);
252252
if(grid[j])
253253
continue;
@@ -262,7 +262,7 @@ void Clouds::render()
262262
v[3].Pos.set(-rx,-ry,-rz);
263263
break;
264264
case 2: //right
265-
if(CONTAINS(xi+1, zi, cloud_radius_i)){
265+
if(INAREA(xi+1, zi, cloud_radius_i)){
266266
u32 j = GETINDEX(xi+1, zi, cloud_radius_i);
267267
if(grid[j])
268268
continue;
@@ -277,7 +277,7 @@ void Clouds::render()
277277
v[3].Pos.set( rx,-ry,-rz);
278278
break;
279279
case 3: // front
280-
if(CONTAINS(xi, zi+1, cloud_radius_i)){
280+
if(INAREA(xi, zi+1, cloud_radius_i)){
281281
u32 j = GETINDEX(xi, zi+1, cloud_radius_i);
282282
if(grid[j])
283283
continue;
@@ -292,7 +292,7 @@ void Clouds::render()
292292
v[3].Pos.set( rx,-ry, rz);
293293
break;
294294
case 4: // left
295-
if(CONTAINS(xi-1, zi, cloud_radius_i)){
295+
if(INAREA(xi-1, zi, cloud_radius_i)){
296296
u32 j = GETINDEX(xi-1, zi, cloud_radius_i);
297297
if(grid[j])
298298
continue;

src/mapgen.cpp

Lines changed: 51 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,10 @@ void OreScatter::generate(ManualMapVoxelManipulator *vm, int seed,
149149
continue;
150150

151151
u32 i = vm->m_area.index(x0 + x1, y0 + y1, z0 + z1);
152-
for (size_t ii = 0; ii < c_wherein.size(); ii++)
153-
if (vm->m_data[i].getContent() == c_wherein[ii])
154-
vm->m_data[i] = n_ore;
152+
if (!CONTAINS(c_wherein, vm->m_data[i].getContent()))
153+
continue;
154+
155+
vm->m_data[i] = n_ore;
155156
}
156157
}
157158
}
@@ -187,13 +188,10 @@ void OreSheet::generate(ManualMapVoxelManipulator *vm, int seed,
187188
u32 i = vm->m_area.index(x, y, z);
188189
if (!vm->m_area.contains(i))
189190
continue;
191+
if (!CONTAINS(c_wherein, vm->m_data[i].getContent()))
192+
continue;
190193

191-
for (size_t ii = 0; ii < c_wherein.size(); ii++) {
192-
if (vm->m_data[i].getContent() == c_wherein[ii]) {
193-
vm->m_data[i] = n_ore;
194-
break;
195-
}
196-
}
194+
vm->m_data[i] = n_ore;
197195
}
198196
}
199197
}
@@ -360,53 +358,56 @@ void Decoration::placeCutoffs(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
360358

361359
///////////////////////////////////////////////////////////////////////////////
362360

363-
364-
void DecoSimple::generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p) {
365-
ManualMapVoxelManipulator *vm = mg->vm;
361+
bool DecoSimple::canPlaceDecoration(ManualMapVoxelManipulator *vm, v3s16 p) {
362+
// Don't bother if there aren't any decorations to place
363+
if (c_decos.size() == 0)
364+
return false;
366365

367366
u32 vi = vm->m_area.index(p);
368-
content_t c = vm->m_data[vi].getContent();
369-
size_t idx;
370-
for (idx = 0; idx != c_place_on.size(); idx++) {
371-
if (c == c_place_on[idx])
372-
break;
373-
}
374-
if ((idx != 0) && (idx == c_place_on.size()))
375-
return;
376367

377-
if (nspawnby != -1) {
378-
int nneighs = 0;
379-
v3s16 dirs[8] = { // a Moore neighborhood
380-
v3s16( 0, 0, 1),
381-
v3s16( 0, 0, -1),
382-
v3s16( 1, 0, 0),
383-
v3s16(-1, 0, 0),
384-
v3s16( 1, 0, 1),
385-
v3s16(-1, 0, 1),
386-
v3s16(-1, 0, -1),
387-
v3s16( 1, 0, -1)
388-
};
389-
390-
for (int i = 0; i != 8; i++) {
391-
u32 index = vm->m_area.index(p + dirs[i]);
392-
if (!vm->m_area.contains(index))
393-
continue;
368+
// Check if the decoration can be placed on this node
369+
if (!CONTAINS(c_place_on, vm->m_data[vi].getContent()))
370+
return false;
394371

395-
content_t c = vm->m_data[index].getContent();
396-
for (size_t j = 0; j != c_spawnby.size(); j++) {
397-
if (c == c_spawnby[j]) {
398-
nneighs++;
399-
break;
400-
}
401-
}
402-
}
372+
// Don't continue if there are no spawnby constraints
373+
if (nspawnby == -1)
374+
return true;
375+
376+
int nneighs = 0;
377+
v3s16 dirs[8] = {
378+
v3s16( 0, 0, 1),
379+
v3s16( 0, 0, -1),
380+
v3s16( 1, 0, 0),
381+
v3s16(-1, 0, 0),
382+
v3s16( 1, 0, 1),
383+
v3s16(-1, 0, 1),
384+
v3s16(-1, 0, -1),
385+
v3s16( 1, 0, -1)
386+
};
387+
388+
// Check a Moore neighborhood if there are enough spawnby nodes
389+
for (size_t i = 0; i != ARRLEN(dirs); i++) {
390+
u32 index = vm->m_area.index(p + dirs[i]);
391+
if (!vm->m_area.contains(index))
392+
continue;
403393

404-
if (nneighs < nspawnby)
405-
return;
394+
if (CONTAINS(c_spawnby, vm->m_data[index].getContent()))
395+
nneighs++;
406396
}
407397

408-
if (c_decos.size() == 0)
398+
if (nneighs < nspawnby)
399+
return false;
400+
401+
return true;
402+
}
403+
404+
405+
void DecoSimple::generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p) {
406+
ManualMapVoxelManipulator *vm = mg->vm;
407+
408+
if (!canPlaceDecoration(vm, p))
409409
return;
410+
410411
content_t c_place = c_decos[pr->range(0, c_decos.size() - 1)];
411412

412413
s16 height = (deco_height_max > 0) ?
@@ -415,6 +416,7 @@ void DecoSimple::generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p) {
415416
height = MYMIN(height, max_y - p.Y);
416417

417418
v3s16 em = vm->m_area.getExtent();
419+
u32 vi = vm->m_area.index(p);
418420
for (int i = 0; i < height; i++) {
419421
vm->m_area.add_y(em, vi, 1);
420422

@@ -477,12 +479,7 @@ void DecoSchematic::generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p) {
477479

478480
u32 vi = vm->m_area.index(p);
479481
content_t c = vm->m_data[vi].getContent();
480-
size_t idx;
481-
for (idx = 0; idx != c_place_on.size(); idx++) {
482-
if (c == c_place_on[idx])
483-
break;
484-
}
485-
if ((idx != 0) && (idx == c_place_on.size()))
482+
if (!CONTAINS(c_place_on, c))
486483
return;
487484

488485
Rotation rot = (rotation == ROTATE_RAND) ?

src/mapgen.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ Ore *createOre(OreType type);
207207

208208

209209
enum DecorationType {
210-
DECO_SIMPLE = 1,
210+
DECO_SIMPLE,
211211
DECO_SCHEMATIC,
212212
DECO_LSYSTEM
213213
};
@@ -262,6 +262,7 @@ class DecoSimple : public Decoration {
262262

263263
~DecoSimple() {}
264264

265+
bool canPlaceDecoration(ManualMapVoxelManipulator *vm, v3s16 p);
265266
virtual void generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p);
266267
virtual int getHeight();
267268
virtual std::string getName();

src/nodedef.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ class NodeResolver {
350350
before the pending request had been satisfied, cancelNodeList() must be
351351
called.
352352
353-
@param nodename Name of node (or node group) to be resolved.
353+
@param nodename Name of node (or node group) to be resolved.
354354
@param content_vec Pointer to content_t vector onto which the results
355355
are added.
356356

0 commit comments

Comments
 (0)