aboutsummaryrefslogtreecommitdiff
path: root/src/voxel.cpp
diff options
context:
space:
mode:
authorElias Fleckenstein <54945686+EliasFleckenstein03@users.noreply.github.com>2020-11-04 16:44:42 +0100
committerGitHub <noreply@github.com>2020-11-04 16:44:42 +0100
commit5d9ae5a91c544fc7fbd475decf47cef7e09ef8fc (patch)
treec980d614fec4a5495798be3e79e033229062c3cd /src/voxel.cpp
parent28f6a79706b088c37268a59d90878220dc4ef9c7 (diff)
parent3af10766fd2b58b068e970266724d7eb10e9316b (diff)
downloaddragonfireclient-5d9ae5a91c544fc7fbd475decf47cef7e09ef8fc.tar.xz
Merge branch 'master' into master
Diffstat (limited to 'src/voxel.cpp')
-rw-r--r--src/voxel.cpp168
1 files changed, 77 insertions, 91 deletions
diff --git a/src/voxel.cpp b/src/voxel.cpp
index 1f1d25373..ffedbd583 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,81 +48,71 @@ 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;
}
}
@@ -133,7 +123,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);
@@ -141,13 +131,11 @@ 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);
}
@@ -172,17 +160,16 @@ 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
@@ -200,11 +187,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
@@ -233,9 +220,8 @@ void VoxelManipulator::copyFrom(MapNode *src, const VoxelArea& src_area,
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);
@@ -251,21 +237,22 @@ void VoxelManipulator::copyFrom(MapNode *src, const VoxelArea& src_area,
}
}
-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++;
+ }
}
- }
}
/*
@@ -278,13 +265,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++)
@@ -297,8 +284,7 @@ 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;
}
@@ -317,4 +303,4 @@ void VoxelManipulator::clearFlag(u8 flags)
const MapNode VoxelManipulator::ContentIgnoreNode = MapNode(CONTENT_IGNORE);
-//END
+// END