aboutsummaryrefslogtreecommitdiff
path: root/src/voxel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/voxel.cpp')
-rw-r--r--src/voxel.cpp168
1 files changed, 91 insertions, 77 deletions
diff --git a/src/voxel.cpp b/src/voxel.cpp
index ffedbd583..1f1d25373 100644
--- a/src/voxel.cpp
+++ b/src/voxel.cpp
@@ -23,7 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "nodedef.h"
#include "util/directiontables.h"
#include "util/timetaker.h"
-#include <cstring> // memcpy, memset
+#include <cstring> // memcpy, memset
/*
Debug stuff
@@ -48,71 +48,81 @@ void VoxelManipulator::clear()
m_flags = nullptr;
}
-void VoxelManipulator::print(
- std::ostream &o, const NodeDefManager *ndef, VoxelPrintMode mode)
+void VoxelManipulator::print(std::ostream &o, const NodeDefManager *ndef,
+ VoxelPrintMode mode)
{
const v3s16 &em = m_area.getExtent();
v3s16 of = m_area.MinEdge;
- o << "size: " << em.X << "x" << em.Y << "x" << em.Z << " offset: (" << of.X << ","
- << of.Y << "," << of.Z << ")" << std::endl;
-
- for (s32 y = m_area.MaxEdge.Y; y >= m_area.MinEdge.Y; y--) {
- if (em.X >= 3 && em.Y >= 3) {
- if (y == m_area.MinEdge.Y + 2)
- o << "^ ";
- else if (y == m_area.MinEdge.Y + 1)
- o << "| ";
- else if (y == m_area.MinEdge.Y + 0)
- o << "y x-> ";
- else
- o << " ";
+ o<<"size: "<<em.X<<"x"<<em.Y<<"x"<<em.Z
+ <<" offset: ("<<of.X<<","<<of.Y<<","<<of.Z<<")"<<std::endl;
+
+ for(s32 y=m_area.MaxEdge.Y; y>=m_area.MinEdge.Y; y--)
+ {
+ if(em.X >= 3 && em.Y >= 3)
+ {
+ if (y==m_area.MinEdge.Y+2) o<<"^ ";
+ else if(y==m_area.MinEdge.Y+1) o<<"| ";
+ else if(y==m_area.MinEdge.Y+0) o<<"y x-> ";
+ else o<<" ";
}
- for (s32 z = m_area.MinEdge.Z; z <= m_area.MaxEdge.Z; z++) {
- for (s32 x = m_area.MinEdge.X; x <= m_area.MaxEdge.X; x++) {
- u8 f = m_flags[m_area.index(x, y, z)];
+ for(s32 z=m_area.MinEdge.Z; z<=m_area.MaxEdge.Z; z++)
+ {
+ for(s32 x=m_area.MinEdge.X; x<=m_area.MaxEdge.X; x++)
+ {
+ u8 f = m_flags[m_area.index(x,y,z)];
char c;
- if (f & VOXELFLAG_NO_DATA)
+ if(f & VOXELFLAG_NO_DATA)
c = 'N';
- else {
+ else
+ {
c = 'X';
- MapNode n = m_data[m_area.index(x, y, z)];
+ MapNode n = m_data[m_area.index(x,y,z)];
content_t m = n.getContent();
u8 pr = n.param2;
- if (mode == VOXELPRINT_MATERIAL) {
- if (m <= 9)
+ if(mode == VOXELPRINT_MATERIAL)
+ {
+ if(m <= 9)
c = m + '0';
- } else if (mode == VOXELPRINT_WATERPRESSURE) {
- if (ndef->get(m).isLiquid()) {
+ }
+ else if(mode == VOXELPRINT_WATERPRESSURE)
+ {
+ if(ndef->get(m).isLiquid())
+ {
c = 'w';
- if (pr <= 9)
+ if(pr <= 9)
c = pr + '0';
- } else if (m == CONTENT_AIR) {
+ }
+ else if(m == CONTENT_AIR)
+ {
c = ' ';
- } else {
+ }
+ else
+ {
c = '#';
}
- } else if (mode == VOXELPRINT_LIGHT_DAY) {
- if (ndef->get(m).light_source != 0)
+ }
+ else if(mode == VOXELPRINT_LIGHT_DAY)
+ {
+ if(ndef->get(m).light_source != 0)
c = 'S';
- else if (!ndef->get(m).light_propagates)
+ else if(!ndef->get(m).light_propagates)
c = 'X';
- else {
- u8 light = n.getLight(
- LIGHTBANK_DAY,
- ndef);
- if (light < 10)
+ else
+ {
+ u8 light = n.getLight(LIGHTBANK_DAY, ndef);
+ if(light < 10)
c = '0' + light;
else
- c = 'a' + (light - 10);
+ c = 'a' + (light-10);
}
}
}
- o << c;
+ o<<c;
}
- o << ' ';
+ o<<' ';
}
- o << std::endl;
+ o<<std::endl;
}
}
@@ -123,7 +133,7 @@ void VoxelManipulator::addArea(const VoxelArea &area)
return;
// Cancel if m_area already contains the requested area
- if (m_area.contains(area))
+ if(m_area.contains(area))
return;
TimeTaker timer("addArea", &addarea_time);
@@ -131,11 +141,13 @@ void VoxelManipulator::addArea(const VoxelArea &area)
// Calculate new area
VoxelArea new_area;
// New area is the requested area if m_area has zero volume
- if (m_area.hasEmptyExtent()) {
+ if(m_area.hasEmptyExtent())
+ {
new_area = area;
}
// Else add requested area to m_area
- else {
+ else
+ {
new_area = m_area;
new_area.addArea(area);
}
@@ -160,16 +172,17 @@ void VoxelManipulator::addArea(const VoxelArea &area)
// Copy old data
s32 old_x_width = m_area.MaxEdge.X - m_area.MinEdge.X + 1;
- for (s32 z = m_area.MinEdge.Z; z <= m_area.MaxEdge.Z; z++)
- for (s32 y = m_area.MinEdge.Y; y <= m_area.MaxEdge.Y; y++) {
- unsigned int old_index = m_area.index(m_area.MinEdge.X, y, z);
- unsigned int new_index = new_area.index(m_area.MinEdge.X, y, z);
-
- memcpy(&new_data[new_index], &m_data[old_index],
- old_x_width * sizeof(MapNode));
- memcpy(&new_flags[new_index], &m_flags[old_index],
- old_x_width * sizeof(u8));
- }
+ for(s32 z=m_area.MinEdge.Z; z<=m_area.MaxEdge.Z; z++)
+ for(s32 y=m_area.MinEdge.Y; y<=m_area.MaxEdge.Y; y++)
+ {
+ unsigned int old_index = m_area.index(m_area.MinEdge.X,y,z);
+ unsigned int new_index = new_area.index(m_area.MinEdge.X,y,z);
+
+ memcpy(&new_data[new_index], &m_data[old_index],
+ old_x_width * sizeof(MapNode));
+ memcpy(&new_flags[new_index], &m_flags[old_index],
+ old_x_width * sizeof(u8));
+ }
// Replace area, data and flags
@@ -187,11 +200,11 @@ void VoxelManipulator::addArea(const VoxelArea &area)
delete[] old_data;
delete[] old_flags;
- // dstream<<"addArea done"<<std::endl;
+ //dstream<<"addArea done"<<std::endl;
}
-void VoxelManipulator::copyFrom(MapNode *src, const VoxelArea &src_area, v3s16 from_pos,
- v3s16 to_pos, const v3s16 &size)
+void VoxelManipulator::copyFrom(MapNode *src, const VoxelArea& src_area,
+ v3s16 from_pos, v3s16 to_pos, const v3s16 &size)
{
/* The reason for this optimised code is that we're a member function
* and the data type/layout of m_data is know to us: it's stored as
@@ -220,8 +233,9 @@ void VoxelManipulator::copyFrom(MapNode *src, const VoxelArea &src_area, v3s16 f
s32 src_step = src_area.getExtent().X;
s32 dest_step = m_area.getExtent().X;
- s32 dest_mod = m_area.index(to_pos.X, to_pos.Y, to_pos.Z + 1) -
- m_area.index(to_pos.X, to_pos.Y, to_pos.Z) - dest_step * size.Y;
+ s32 dest_mod = m_area.index(to_pos.X, to_pos.Y, to_pos.Z + 1)
+ - m_area.index(to_pos.X, to_pos.Y, to_pos.Z)
+ - dest_step * size.Y;
s32 i_src = src_area.index(from_pos.X, from_pos.Y, from_pos.Z);
s32 i_local = m_area.index(to_pos.X, to_pos.Y, to_pos.Z);
@@ -237,22 +251,21 @@ void VoxelManipulator::copyFrom(MapNode *src, const VoxelArea &src_area, v3s16 f
}
}
-void VoxelManipulator::copyTo(MapNode *dst, const VoxelArea &dst_area, v3s16 dst_pos,
- v3s16 from_pos, const v3s16 &size)
+void VoxelManipulator::copyTo(MapNode *dst, const VoxelArea& dst_area,
+ v3s16 dst_pos, v3s16 from_pos, const v3s16 &size)
{
- for (s16 z = 0; z < size.Z; z++)
- for (s16 y = 0; y < size.Y; y++) {
- s32 i_dst = dst_area.index(
- dst_pos.X, dst_pos.Y + y, dst_pos.Z + z);
- s32 i_local = m_area.index(
- from_pos.X, from_pos.Y + y, from_pos.Z + z);
- for (s16 x = 0; x < size.X; x++) {
- if (m_data[i_local].getContent() != CONTENT_IGNORE)
- dst[i_dst] = m_data[i_local];
- i_dst++;
- i_local++;
- }
+ for(s16 z=0; z<size.Z; z++)
+ for(s16 y=0; y<size.Y; y++)
+ {
+ s32 i_dst = dst_area.index(dst_pos.X, dst_pos.Y+y, dst_pos.Z+z);
+ s32 i_local = m_area.index(from_pos.X, from_pos.Y+y, from_pos.Z+z);
+ for (s16 x = 0; x < size.X; x++) {
+ if (m_data[i_local].getContent() != CONTENT_IGNORE)
+ dst[i_dst] = m_data[i_local];
+ i_dst++;
+ i_local++;
}
+ }
}
/*
@@ -265,13 +278,13 @@ void VoxelManipulator::clearFlag(u8 flags)
// 0-1ms on moderate area
TimeTaker timer("clearFlag", &clearflag_time);
- // v3s16 s = m_area.getExtent();
+ //v3s16 s = m_area.getExtent();
/*dstream<<"clearFlag clearing area of size "
<<""<<s.X<<"x"<<s.Y<<"x"<<s.Z<<""
<<std::endl;*/
- // s32 count = 0;
+ //s32 count = 0;
/*for(s32 z=m_area.MinEdge.Z; z<=m_area.MaxEdge.Z; z++)
for(s32 y=m_area.MinEdge.Y; y<=m_area.MaxEdge.Y; y++)
@@ -284,7 +297,8 @@ void VoxelManipulator::clearFlag(u8 flags)
}*/
s32 volume = m_area.getVolume();
- for (s32 i = 0; i < volume; i++) {
+ for(s32 i=0; i<volume; i++)
+ {
m_flags[i] &= ~flags;
}
@@ -303,4 +317,4 @@ void VoxelManipulator::clearFlag(u8 flags)
const MapNode VoxelManipulator::ContentIgnoreNode = MapNode(CONTENT_IGNORE);
-// END
+//END