@@ -28,7 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
28
28
#include " mapnode.h"
29
29
#include < set>
30
30
#include < list>
31
- #include < map >
31
+ #include " util/basic_macros.h "
32
32
33
33
class INodeDefManager ;
34
34
@@ -62,15 +62,18 @@ class VoxelArea
62
62
// Starts as zero sized
63
63
VoxelArea () {}
64
64
65
- VoxelArea (v3s16 min_edge, v3s16 max_edge):
65
+ VoxelArea (const v3s16 & min_edge, const v3s16 & max_edge):
66
66
MinEdge (min_edge),
67
67
MaxEdge (max_edge)
68
68
{
69
+ cacheExtent ();
69
70
}
70
- VoxelArea (v3s16 p):
71
+
72
+ VoxelArea (const v3s16 &p):
71
73
MinEdge (p),
72
74
MaxEdge (p)
73
75
{
76
+ cacheExtent ();
74
77
}
75
78
76
79
/*
@@ -90,13 +93,16 @@ class VoxelArea
90
93
if (a.MaxEdge .X > MaxEdge.X ) MaxEdge.X = a.MaxEdge .X ;
91
94
if (a.MaxEdge .Y > MaxEdge.Y ) MaxEdge.Y = a.MaxEdge .Y ;
92
95
if (a.MaxEdge .Z > MaxEdge.Z ) MaxEdge.Z = a.MaxEdge .Z ;
96
+ cacheExtent ();
93
97
}
98
+
94
99
void addPoint (const v3s16 &p)
95
100
{
96
101
if (hasEmptyExtent ())
97
102
{
98
103
MinEdge = p;
99
104
MaxEdge = p;
105
+ cacheExtent ();
100
106
return ;
101
107
}
102
108
if (p.X < MinEdge.X ) MinEdge.X = p.X ;
@@ -105,6 +111,7 @@ class VoxelArea
105
111
if (p.X > MaxEdge.X ) MaxEdge.X = p.X ;
106
112
if (p.Y > MaxEdge.Y ) MaxEdge.Y = p.Y ;
107
113
if (p.Z > MaxEdge.Z ) MaxEdge.Z = p.Z ;
114
+ cacheExtent ();
108
115
}
109
116
110
117
// Pad with d nodes
@@ -114,25 +121,13 @@ class VoxelArea
114
121
MaxEdge += d;
115
122
}
116
123
117
- /* void operator+=(v3s16 off)
118
- {
119
- MinEdge += off;
120
- MaxEdge += off;
121
- }
122
-
123
- void operator-=(v3s16 off)
124
- {
125
- MinEdge -= off;
126
- MaxEdge -= off;
127
- }*/
128
-
129
124
/*
130
125
const methods
131
126
*/
132
127
133
- v3s16 getExtent () const
128
+ const v3s16 & getExtent () const
134
129
{
135
- return MaxEdge - MinEdge + v3s16 ( 1 , 1 , 1 ) ;
130
+ return m_cache_extent ;
136
131
}
137
132
138
133
/* Because MaxEdge and MinEdge are included in the voxel area an empty extent
@@ -145,9 +140,9 @@ class VoxelArea
145
140
146
141
s32 getVolume () const
147
142
{
148
- v3s16 e = getExtent ();
149
- return (s32)e.X * (s32)e.Y * (s32)e.Z ;
143
+ return (s32)m_cache_extent.X * (s32)m_cache_extent.Y * (s32)m_cache_extent.Z ;
150
144
}
145
+
151
146
bool contains (const VoxelArea &a) const
152
147
{
153
148
// No area contains an empty area
@@ -179,12 +174,12 @@ class VoxelArea
179
174
&& MaxEdge == other.MaxEdge );
180
175
}
181
176
182
- VoxelArea operator +(v3s16 off) const
177
+ VoxelArea operator +(const v3s16 & off) const
183
178
{
184
179
return VoxelArea (MinEdge+off, MaxEdge+off);
185
180
}
186
181
187
- VoxelArea operator -(v3s16 off) const
182
+ VoxelArea operator -(const v3s16 & off) const
188
183
{
189
184
return VoxelArea (MinEdge-off, MaxEdge-off);
190
185
}
@@ -273,10 +268,9 @@ class VoxelArea
273
268
*/
274
269
s32 index (s16 x, s16 y, s16 z) const
275
270
{
276
- v3s16 em = getExtent ();
277
- v3s16 off = MinEdge;
278
- s32 i = (s32)(z-off.Z )*em.Y *em.X + (y-off.Y )*em.X + (x-off.X );
279
- // dstream<<" i("<<x<<","<<y<<","<<z<<")="<<i<<" ";
271
+ s32 i = (s32)(z - MinEdge.Z ) * m_cache_extent.Y * m_cache_extent.X
272
+ + (y - MinEdge.Y ) * m_cache_extent.X
273
+ + (x - MinEdge.X );
280
274
return i;
281
275
}
282
276
s32 index (v3s16 p) const
@@ -310,20 +304,21 @@ class VoxelArea
310
304
*/
311
305
void print (std::ostream &o) const
312
306
{
313
- v3s16 e = getExtent ();
314
- o<<" (" <<MinEdge.X
315
- <<" ," <<MinEdge.Y
316
- <<" ," <<MinEdge.Z
317
- <<" )(" <<MaxEdge.X
318
- <<" ," <<MaxEdge.Y
319
- <<" ," <<MaxEdge.Z
320
- <<" )"
321
- <<" =" <<e.X <<" x" <<e.Y <<" x" <<e.Z <<" =" <<getVolume ();
307
+ o << PP (MinEdge) << PP (MaxEdge) << " ="
308
+ << m_cache_extent.X << " x" << m_cache_extent.Y << " x" << m_cache_extent.Z
309
+ << " =" << getVolume ();
322
310
}
323
311
324
312
// Edges are inclusive
325
313
v3s16 MinEdge = v3s16(1 ,1 ,1 );
326
314
v3s16 MaxEdge;
315
+ private:
316
+ void cacheExtent ()
317
+ {
318
+ m_cache_extent = MaxEdge - MinEdge + v3s16 (1 ,1 ,1 );
319
+ }
320
+
321
+ v3s16 m_cache_extent = v3s16(0 ,0 ,0 );
327
322
};
328
323
329
324
// unused
@@ -347,36 +342,22 @@ enum VoxelPrintMode
347
342
VOXELPRINT_LIGHT_DAY,
348
343
};
349
344
350
- class VoxelManipulator /* : public NodeContainer */
345
+ class VoxelManipulator
351
346
{
352
347
public:
353
348
VoxelManipulator ();
354
349
virtual ~VoxelManipulator ();
355
350
356
- /*
357
- Virtuals from NodeContainer
358
- */
359
- /* virtual u16 nodeContainerId() const
360
- {
361
- return NODECONTAINER_ID_VOXELMANIPULATOR;
362
- }
363
- bool isValidPosition(v3s16 p)
364
- {
365
- addArea(p);
366
- return !(m_flags[m_area.index(p)] & VOXELFLAG_NO_DATA);
367
- }*/
368
-
369
351
/*
370
352
These are a bit slow and shouldn't be used internally.
371
353
Use m_data[m_area.index(p)] instead.
372
354
*/
373
- MapNode getNode (v3s16 p)
355
+ MapNode getNode (const v3s16 & p)
374
356
{
375
357
VoxelArea voxel_area (p);
376
358
addArea (voxel_area);
377
359
378
- if (m_flags[m_area.index (p)] & VOXELFLAG_NO_DATA)
379
- {
360
+ if (m_flags[m_area.index (p)] & VOXELFLAG_NO_DATA) {
380
361
/* dstream<<"EXCEPT: VoxelManipulator::getNode(): "
381
362
<<"p=("<<p.X<<","<<p.Y<<","<<p.Z<<")"
382
363
<<", index="<<m_area.index(p)
@@ -388,23 +369,22 @@ class VoxelManipulator /*: public NodeContainer*/
388
369
389
370
return m_data[m_area.index (p)];
390
371
}
391
- MapNode getNodeNoEx (v3s16 p)
372
+ MapNode getNodeNoEx (const v3s16 & p)
392
373
{
393
374
VoxelArea voxel_area (p);
394
375
addArea (voxel_area);
395
376
396
- if (m_flags[m_area.index (p)] & VOXELFLAG_NO_DATA)
397
- {
377
+ if (m_flags[m_area.index (p)] & VOXELFLAG_NO_DATA) {
398
378
return MapNode (CONTENT_IGNORE);
399
379
}
400
380
401
381
return m_data[m_area.index (p)];
402
382
}
403
- MapNode getNodeNoExNoEmerge (v3s16 p)
383
+ MapNode getNodeNoExNoEmerge (const v3s16 & p)
404
384
{
405
- if ( m_area.contains (p) == false )
385
+ if (! m_area.contains (p))
406
386
return MapNode (CONTENT_IGNORE);
407
- if (m_flags[m_area.index (p)] & VOXELFLAG_NO_DATA)
387
+ if (m_flags[m_area.index (p)] & VOXELFLAG_NO_DATA)
408
388
return MapNode (CONTENT_IGNORE);
409
389
return m_data[m_area.index (p)];
410
390
}
@@ -425,32 +405,18 @@ class VoxelManipulator /*: public NodeContainer*/
425
405
return m_data[index ];
426
406
}
427
407
428
- u8 & getFlagsRefUnsafe (v3s16 p)
408
+ u8 & getFlagsRefUnsafe (const v3s16 & p)
429
409
{
430
410
return m_flags[m_area.index (p)];
431
411
}
432
- bool exists (v3s16 p)
412
+
413
+ bool exists (const v3s16 &p)
433
414
{
434
415
return m_area.contains (p) &&
435
416
!(getFlagsRefUnsafe (p) & VOXELFLAG_NO_DATA);
436
417
}
437
- MapNode & getNodeRef (v3s16 p)
438
- {
439
- VoxelArea voxel_area (p);
440
- addArea (voxel_area);
441
- if (getFlagsRefUnsafe (p) & VOXELFLAG_NO_DATA)
442
- {
443
- /* dstream<<"EXCEPT: VoxelManipulator::getNode(): "
444
- <<"p=("<<p.X<<","<<p.Y<<","<<p.Z<<")"
445
- <<", index="<<m_area.index(p)
446
- <<", flags="<<(int)getFlagsRefUnsafe(p)
447
- <<" is inexistent"<<std::endl;*/
448
- throw InvalidPositionException
449
- (" VoxelManipulator: getNode: inexistent" );
450
- }
451
- return getNodeRefUnsafe (p);
452
- }
453
- void setNode (v3s16 p, const MapNode &n)
418
+
419
+ void setNode (const v3s16 &p, const MapNode &n)
454
420
{
455
421
VoxelArea voxel_area (p);
456
422
addArea (voxel_area);
@@ -459,57 +425,24 @@ class VoxelManipulator /*: public NodeContainer*/
459
425
m_flags[m_area.index (p)] &= ~VOXELFLAG_NO_DATA;
460
426
}
461
427
// TODO: Should be removed and replaced with setNode
462
- void setNodeNoRef (v3s16 p, const MapNode &n)
428
+ void setNodeNoRef (const v3s16 & p, const MapNode &n)
463
429
{
464
430
setNode (p, n);
465
431
}
466
432
467
- /* void setExists(VoxelArea a)
468
- {
469
- addArea(a);
470
- for(s32 z=a.MinEdge.Z; z<=a.MaxEdge.Z; z++)
471
- for(s32 y=a.MinEdge.Y; y<=a.MaxEdge.Y; y++)
472
- for(s32 x=a.MinEdge.X; x<=a.MaxEdge.X; x++)
473
- {
474
- m_flags[m_area.index(x,y,z)] &= ~VOXELFLAG_NO_DATA;
475
- }
476
- }*/
477
-
478
- /* MapNode & operator[](v3s16 p)
479
- {
480
- //dstream<<"operator[] p=("<<p.X<<","<<p.Y<<","<<p.Z<<")"<<std::endl;
481
- if(isValidPosition(p) == false)
482
- addArea(VoxelArea(p));
483
-
484
- return m_data[m_area.index(p)];
485
- }*/
486
-
487
433
/*
488
434
Set stuff if available without an emerge.
489
435
Return false if failed.
490
436
This is convenient but slower than playing around directly
491
437
with the m_data table with indices.
492
438
*/
493
- bool setNodeNoEmerge (v3s16 p, MapNode n)
439
+ bool setNodeNoEmerge (const v3s16 & p, MapNode n)
494
440
{
495
- if (m_area.contains (p) == false )
441
+ if (! m_area.contains (p))
496
442
return false ;
497
443
m_data[m_area.index (p)] = n;
498
444
return true ;
499
445
}
500
- bool setNodeNoEmerge (s32 i, MapNode n)
501
- {
502
- if (m_area.contains (i) == false )
503
- return false ;
504
- m_data[i] = n;
505
- return true ;
506
- }
507
- /* bool setContentNoEmerge(v3s16 p, u8 c)
508
- {
509
- if(isValidPosition(p) == false)
510
- return false;
511
- m_data[m_area.index(p)].d = c;
512
- }*/
513
446
514
447
/*
515
448
Control
@@ -527,11 +460,11 @@ class VoxelManipulator /*: public NodeContainer*/
527
460
dst_area.getExtent() <= src_area.getExtent()
528
461
*/
529
462
void copyFrom (MapNode *src, const VoxelArea& src_area,
530
- v3s16 from_pos, v3s16 to_pos, v3s16 size);
463
+ v3s16 from_pos, v3s16 to_pos, const v3s16 & size);
531
464
532
465
// Copy data
533
466
void copyTo (MapNode *dst, const VoxelArea& dst_area,
534
- v3s16 dst_pos, v3s16 from_pos, v3s16 size);
467
+ v3s16 dst_pos, v3s16 from_pos, const v3s16 & size);
535
468
536
469
/*
537
470
Algorithms
@@ -543,18 +476,11 @@ class VoxelManipulator /*: public NodeContainer*/
543
476
544
477
void unspreadLight (enum LightBank bank, v3s16 p, u8 oldlight,
545
478
std::set<v3s16> & light_sources, INodeDefManager *nodemgr);
546
- void unspreadLight (enum LightBank bank,
547
- std::map<v3s16, u8> & from_nodes,
548
- std::set<v3s16> & light_sources, INodeDefManager *nodemgr);
549
479
550
480
void spreadLight (enum LightBank bank, v3s16 p, INodeDefManager *nodemgr);
551
481
void spreadLight (enum LightBank bank,
552
482
std::set<v3s16> & from_nodes, INodeDefManager *nodemgr);
553
483
554
- /*
555
- Virtual functions
556
- */
557
-
558
484
/*
559
485
Member variables
560
486
*/
0 commit comments