summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/clientenvironment.cpp1
-rw-r--r--src/clientiface.cpp2
-rw-r--r--src/content_cao.cpp1
-rw-r--r--src/face_position_cache.cpp110
-rw-r--r--src/face_position_cache.h44
-rw-r--r--src/mg_decoration.cpp2
-rw-r--r--src/mg_ore.cpp3
-rw-r--r--src/script/lua_api/l_env.cpp1
-rw-r--r--src/script/lua_api/l_server.cpp1
-rw-r--r--src/unittest/test_noderesolver.cpp2
-rw-r--r--src/util/basic_macros.h3
-rw-r--r--src/util/numeric.cpp93
-rw-r--r--src/util/numeric.h94
-rw-r--r--src/util/string.cpp1
15 files changed, 202 insertions, 157 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 4c705cec8..7c1a4eee0 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -388,6 +388,7 @@ set(common_SRCS
dungeongen.cpp
emerge.cpp
environment.cpp
+ face_position_cache.cpp
filesys.cpp
genericobject.cpp
gettext.cpp
diff --git a/src/clientenvironment.cpp b/src/clientenvironment.cpp
index 36e4437b6..47df49b84 100644
--- a/src/clientenvironment.cpp
+++ b/src/clientenvironment.cpp
@@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "raycast.h"
#include "voxelalgorithms.h"
#include "settings.h"
+#include <algorithm>
/*
ClientEnvironment
diff --git a/src/clientiface.cpp b/src/clientiface.cpp
index 7f476f0ea..78339055f 100644
--- a/src/clientiface.cpp
+++ b/src/clientiface.cpp
@@ -20,7 +20,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <sstream>
#include "clientiface.h"
-#include "util/numeric.h"
#include "remoteplayer.h"
#include "settings.h"
#include "mapblock.h"
@@ -32,6 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "log.h"
#include "network/serveropcodes.h"
#include "util/srp.h"
+#include "face_position_cache.h"
const char *ClientInterface::statenames[] = {
"Invalid",
diff --git a/src/content_cao.cpp b/src/content_cao.cpp
index d18a0233f..d0d3eb84f 100644
--- a/src/content_cao.cpp
+++ b/src/content_cao.cpp
@@ -44,6 +44,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "camera.h" // CameraModes
#include "wieldmesh.h"
#include "log.h"
+#include <algorithm>
class Settings;
struct ToolCapabilities;
diff --git a/src/face_position_cache.cpp b/src/face_position_cache.cpp
new file mode 100644
index 000000000..f57e75da9
--- /dev/null
+++ b/src/face_position_cache.cpp
@@ -0,0 +1,110 @@
+/*
+Minetest
+Copyright (C) 2015 Nerzhul, Loic Blot <loic.blot@unix-experience.fr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "face_position_cache.h"
+#include "threading/mutex_auto_lock.h"
+
+
+UNORDERED_MAP<u16, std::vector<v3s16> > FacePositionCache::cache;
+Mutex FacePositionCache::cache_mutex;
+
+// Calculate the borders of a "d-radius" cube
+const std::vector<v3s16> &FacePositionCache::getFacePositions(u16 d)
+{
+ MutexAutoLock lock(cache_mutex);
+ UNORDERED_MAP<u16, std::vector<v3s16> >::iterator it = cache.find(d);
+ if (it != cache.end())
+ return it->second;
+
+ return generateFacePosition(d);
+}
+
+const std::vector<v3s16> &FacePositionCache::generateFacePosition(u16 d)
+{
+ cache[d] = std::vector<v3s16>();
+ std::vector<v3s16> &c = cache[d];
+ if (d == 0) {
+ c.push_back(v3s16(0,0,0));
+ return c;
+ }
+ if (d == 1) {
+ // This is an optimized sequence of coordinates.
+ c.push_back(v3s16( 0, 1, 0)); // Top
+ c.push_back(v3s16( 0, 0, 1)); // Back
+ c.push_back(v3s16(-1, 0, 0)); // Left
+ c.push_back(v3s16( 1, 0, 0)); // Right
+ c.push_back(v3s16( 0, 0,-1)); // Front
+ c.push_back(v3s16( 0,-1, 0)); // Bottom
+ // 6
+ c.push_back(v3s16(-1, 0, 1)); // Back left
+ c.push_back(v3s16( 1, 0, 1)); // Back right
+ c.push_back(v3s16(-1, 0,-1)); // Front left
+ c.push_back(v3s16( 1, 0,-1)); // Front right
+ c.push_back(v3s16(-1,-1, 0)); // Bottom left
+ c.push_back(v3s16( 1,-1, 0)); // Bottom right
+ c.push_back(v3s16( 0,-1, 1)); // Bottom back
+ c.push_back(v3s16( 0,-1,-1)); // Bottom front
+ c.push_back(v3s16(-1, 1, 0)); // Top left
+ c.push_back(v3s16( 1, 1, 0)); // Top right
+ c.push_back(v3s16( 0, 1, 1)); // Top back
+ c.push_back(v3s16( 0, 1,-1)); // Top front
+ // 18
+ c.push_back(v3s16(-1, 1, 1)); // Top back-left
+ c.push_back(v3s16( 1, 1, 1)); // Top back-right
+ c.push_back(v3s16(-1, 1,-1)); // Top front-left
+ c.push_back(v3s16( 1, 1,-1)); // Top front-right
+ c.push_back(v3s16(-1,-1, 1)); // Bottom back-left
+ c.push_back(v3s16( 1,-1, 1)); // Bottom back-right
+ c.push_back(v3s16(-1,-1,-1)); // Bottom front-left
+ c.push_back(v3s16( 1,-1,-1)); // Bottom front-right
+ // 26
+ return c;
+ }
+
+ // Take blocks in all sides, starting from y=0 and going +-y
+ for (s16 y = 0; y <= d - 1; y++) {
+ // Left and right side, including borders
+ for (s16 z =- d; z <= d; z++) {
+ c.push_back(v3s16( d, y, z));
+ c.push_back(v3s16(-d, y, z));
+ if (y != 0) {
+ c.push_back(v3s16( d, -y, z));
+ c.push_back(v3s16(-d, -y, z));
+ }
+ }
+ // Back and front side, excluding borders
+ for (s16 x = -d + 1; x <= d - 1; x++) {
+ c.push_back(v3s16(x, y, d));
+ c.push_back(v3s16(x, y, -d));
+ if (y != 0) {
+ c.push_back(v3s16(x, -y, d));
+ c.push_back(v3s16(x, -y, -d));
+ }
+ }
+ }
+
+ // Take the bottom and top face with borders
+ // -d < x < d, y = +-d, -d < z < d
+ for (s16 x = -d; x <= d; x++)
+ for (s16 z = -d; z <= d; z++) {
+ c.push_back(v3s16(x, -d, z));
+ c.push_back(v3s16(x, d, z));
+ }
+ return c;
+}
diff --git a/src/face_position_cache.h b/src/face_position_cache.h
new file mode 100644
index 000000000..c1d2841c4
--- /dev/null
+++ b/src/face_position_cache.h
@@ -0,0 +1,44 @@
+/*
+Minetest
+Copyright (C) 2015 Nerzhul, Loic Blot <loic.blot@unix-experience.fr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef FACE_POSITION_CACHE_HEADER
+#define FACE_POSITION_CACHE_HEADER
+
+#include "irr_v3d.h"
+#include "threading/mutex.h"
+#include "util/cpp11_container.h"
+
+#include <map>
+#include <vector>
+
+/*
+ * This class permits caching getFacePosition call results.
+ * This reduces CPU usage and vector calls.
+ */
+class FacePositionCache {
+public:
+ static const std::vector<v3s16> &getFacePositions(u16 d);
+
+private:
+ static const std::vector<v3s16> &generateFacePosition(u16 d);
+ static UNORDERED_MAP<u16, std::vector<v3s16> > cache;
+ static Mutex cache_mutex;
+};
+
+#endif
diff --git a/src/mg_decoration.cpp b/src/mg_decoration.cpp
index 51e4fbbcc..ec31a9c01 100644
--- a/src/mg_decoration.cpp
+++ b/src/mg_decoration.cpp
@@ -24,6 +24,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "map.h"
#include "log.h"
#include "util/numeric.h"
+#include <algorithm>
+
FlagDesc flagdesc_deco[] = {
{"place_center_x", DECO_PLACE_CENTER_X},
diff --git a/src/mg_ore.cpp b/src/mg_ore.cpp
index d840d745a..c6c1c45a7 100644
--- a/src/mg_ore.cpp
+++ b/src/mg_ore.cpp
@@ -20,9 +20,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "mg_ore.h"
#include "mapgen.h"
#include "noise.h"
-#include "util/numeric.h"
#include "map.h"
#include "log.h"
+#include <algorithm>
+
FlagDesc flagdesc_ore[] = {
{"absheight", OREFLAG_ABSHEIGHT},
diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp
index 0ded12658..b8b6bc5ba 100644
--- a/src/script/lua_api/l_env.cpp
+++ b/src/script/lua_api/l_env.cpp
@@ -35,6 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "treegen.h"
#include "emerge.h"
#include "pathfinder.h"
+#include "face_position_cache.h"
struct EnumString ModApiEnvMod::es_ClearObjectsMode[] =
{
diff --git a/src/script/lua_api/l_server.cpp b/src/script/lua_api/l_server.cpp
index ea993d7b7..a0e475dec 100644
--- a/src/script/lua_api/l_server.cpp
+++ b/src/script/lua_api/l_server.cpp
@@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "environment.h"
#include "player.h"
#include "log.h"
+#include <algorithm>
// request_shutdown()
int ModApiServer::l_request_shutdown(lua_State *L)
diff --git a/src/unittest/test_noderesolver.cpp b/src/unittest/test_noderesolver.cpp
index 55acece6a..b009f5d2e 100644
--- a/src/unittest/test_noderesolver.cpp
+++ b/src/unittest/test_noderesolver.cpp
@@ -24,6 +24,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "gamedef.h"
#include "nodedef.h"
+#include <algorithm>
+
class TestNodeResolver : public TestBase {
public:
diff --git a/src/util/basic_macros.h b/src/util/basic_macros.h
index bd4b890eb..687d7cf85 100644
--- a/src/util/basic_macros.h
+++ b/src/util/basic_macros.h
@@ -20,14 +20,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#ifndef BASICMACROS_HEADER
#define BASICMACROS_HEADER
-#include <algorithm>
-
#define ARRLEN(x) (sizeof(x) / sizeof((x)[0]))
#define MYMIN(a, b) ((a) < (b) ? (a) : (b))
#define MYMAX(a, b) ((a) > (b) ? (a) : (b))
+// Requires <algorithm>
#define CONTAINS(c, v) (std::find((c).begin(), (c).end(), (v)) != (c).end())
// To disable copy constructors and assignment operations for some class
diff --git a/src/util/numeric.cpp b/src/util/numeric.cpp
index 87f1040ea..e6a9cb75e 100644
--- a/src/util/numeric.cpp
+++ b/src/util/numeric.cpp
@@ -24,100 +24,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "../noise.h" // PseudoRandom, PcgRandom
#include "../threading/mutex_auto_lock.h"
#include <string.h>
-#include <iostream>
-UNORDERED_MAP<u16, std::vector<v3s16> > FacePositionCache::m_cache;
-Mutex FacePositionCache::m_cache_mutex;
-// Calculate the borders of a "d-radius" cube
-// TODO: Make it work without mutex and data races, probably thread-local
-std::vector<v3s16> FacePositionCache::getFacePositions(u16 d)
-{
- MutexAutoLock cachelock(m_cache_mutex);
- if (m_cache.find(d) != m_cache.end())
- return m_cache[d];
-
- generateFacePosition(d);
- return m_cache[d];
-
-}
-
-void FacePositionCache::generateFacePosition(u16 d)
-{
- m_cache[d] = std::vector<v3s16>();
- if(d == 0) {
- m_cache[d].push_back(v3s16(0,0,0));
- return;
- }
- if(d == 1) {
- /*
- This is an optimized sequence of coordinates.
- */
- m_cache[d].push_back(v3s16( 0, 1, 0)); // top
- m_cache[d].push_back(v3s16( 0, 0, 1)); // back
- m_cache[d].push_back(v3s16(-1, 0, 0)); // left
- m_cache[d].push_back(v3s16( 1, 0, 0)); // right
- m_cache[d].push_back(v3s16( 0, 0,-1)); // front
- m_cache[d].push_back(v3s16( 0,-1, 0)); // bottom
- // 6
- m_cache[d].push_back(v3s16(-1, 0, 1)); // back left
- m_cache[d].push_back(v3s16( 1, 0, 1)); // back right
- m_cache[d].push_back(v3s16(-1, 0,-1)); // front left
- m_cache[d].push_back(v3s16( 1, 0,-1)); // front right
- m_cache[d].push_back(v3s16(-1,-1, 0)); // bottom left
- m_cache[d].push_back(v3s16( 1,-1, 0)); // bottom right
- m_cache[d].push_back(v3s16( 0,-1, 1)); // bottom back
- m_cache[d].push_back(v3s16( 0,-1,-1)); // bottom front
- m_cache[d].push_back(v3s16(-1, 1, 0)); // top left
- m_cache[d].push_back(v3s16( 1, 1, 0)); // top right
- m_cache[d].push_back(v3s16( 0, 1, 1)); // top back
- m_cache[d].push_back(v3s16( 0, 1,-1)); // top front
- // 18
- m_cache[d].push_back(v3s16(-1, 1, 1)); // top back-left
- m_cache[d].push_back(v3s16( 1, 1, 1)); // top back-right
- m_cache[d].push_back(v3s16(-1, 1,-1)); // top front-left
- m_cache[d].push_back(v3s16( 1, 1,-1)); // top front-right
- m_cache[d].push_back(v3s16(-1,-1, 1)); // bottom back-left
- m_cache[d].push_back(v3s16( 1,-1, 1)); // bottom back-right
- m_cache[d].push_back(v3s16(-1,-1,-1)); // bottom front-left
- m_cache[d].push_back(v3s16( 1,-1,-1)); // bottom front-right
- // 26
- return;
- }
- // Take blocks in all sides, starting from y=0 and going +-y
- for(s16 y=0; y<=d-1; y++) {
- // Left and right side, including borders
- for(s16 z=-d; z<=d; z++) {
- m_cache[d].push_back(v3s16(d,y,z));
- m_cache[d].push_back(v3s16(-d,y,z));
- if(y != 0) {
- m_cache[d].push_back(v3s16(d,-y,z));
- m_cache[d].push_back(v3s16(-d,-y,z));
- }
- }
- // Back and front side, excluding borders
- for(s16 x=-d+1; x<=d-1; x++) {
- m_cache[d].push_back(v3s16(x,y,d));
- m_cache[d].push_back(v3s16(x,y,-d));
- if(y != 0) {
- m_cache[d].push_back(v3s16(x,-y,d));
- m_cache[d].push_back(v3s16(x,-y,-d));
- }
- }
- }
-
- // Take the bottom and top face with borders
- // -d<x<d, y=+-d, -d<z<d
- for(s16 x=-d; x<=d; x++)
- for(s16 z=-d; z<=d; z++) {
- m_cache[d].push_back(v3s16(x,-d,z));
- m_cache[d].push_back(v3s16(x,d,z));
- }
-}
-
-/*
- myrand
-*/
+// myrand
PcgRandom g_pcgrand;
diff --git a/src/util/numeric.h b/src/util/numeric.h
index 760657171..0954b7151 100644
--- a/src/util/numeric.h
+++ b/src/util/numeric.h
@@ -26,28 +26,20 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "../irr_v3d.h"
#include "../irr_aabb3d.h"
#include "../threading/mutex.h"
-#include "cpp11_container.h"
-#include <list>
-#include <vector>
+#define rangelim(d, min, max) ((d) < (min) ? (min) : ((d) > (max) ? (max) : (d)))
+#define myfloor(x) ((x) > 0.0 ? (int)(x) : (int)(x) - 1)
+// The naive swap performs better than the xor version
+#define SWAP(t, x, y) do { \
+ t temp = x; \
+ x = y; \
+ y = temp; \
+} while (0)
-/*
- * This class permits to cache getFacePosition call results
- * This reduces CPU usage and vector calls
- */
-class FacePositionCache
-{
-public:
- static std::vector<v3s16> getFacePositions(u16 d);
-private:
- static void generateFacePosition(u16 d);
- static UNORDERED_MAP<u16, std::vector<v3s16> > m_cache;
- static Mutex m_cache_mutex;
-};
inline s16 getContainerPos(s16 p, s16 d)
{
- return (p>=0 ? p : p-d+1) / d;
+ return (p >= 0 ? p : p - d + 1) / d;
}
inline v2s16 getContainerPos(v2s16 p, s16 d)
@@ -130,16 +122,6 @@ inline bool isInArea(v3s16 p, v3s16 d)
);
}
-#define rangelim(d, min, max) ((d) < (min) ? (min) : ((d)>(max)?(max):(d)))
-#define myfloor(x) ((x) > 0.0 ? (int)(x) : (int)(x) - 1)
-
-// The naive swap performs better than the xor version
-#define SWAP(t, x, y) do { \
- t temp = x; \
- x = y; \
- y = temp; \
-} while (0)
-
inline void sortBoxVerticies(v3s16 &p1, v3s16 &p2) {
if (p1.X > p2.X)
SWAP(s16, p1.X, p2.X);
@@ -266,11 +248,10 @@ inline s32 myround(f32 f)
*/
inline v3s16 floatToInt(v3f p, f32 d)
{
- v3s16 p2(
- (p.X + (p.X>0 ? d/2 : -d/2))/d,
- (p.Y + (p.Y>0 ? d/2 : -d/2))/d,
- (p.Z + (p.Z>0 ? d/2 : -d/2))/d);
- return p2;
+ return v3s16(
+ (p.X + (p.X > 0 ? d / 2 : -d / 2)) / d,
+ (p.Y + (p.Y > 0 ? d / 2 : -d / 2)) / d,
+ (p.Z + (p.Z > 0 ? d / 2 : -d / 2)) / d);
}
/*
@@ -278,34 +259,31 @@ inline v3s16 floatToInt(v3f p, f32 d)
*/
inline v3f intToFloat(v3s16 p, f32 d)
{
- v3f p2(
+ return v3f(
(f32)p.X * d,
(f32)p.Y * d,
(f32)p.Z * d
);
- return p2;
}
// Random helper. Usually d=BS
inline aabb3f getNodeBox(v3s16 p, float d)
{
return aabb3f(
- (float)p.X * d - 0.5*d,
- (float)p.Y * d - 0.5*d,
- (float)p.Z * d - 0.5*d,
- (float)p.X * d + 0.5*d,
- (float)p.Y * d + 0.5*d,
- (float)p.Z * d + 0.5*d
+ (float)p.X * d - 0.5 * d,
+ (float)p.Y * d - 0.5 * d,
+ (float)p.Z * d - 0.5 * d,
+ (float)p.X * d + 0.5 * d,
+ (float)p.Y * d + 0.5 * d,
+ (float)p.Z * d + 0.5 * d
);
}
+
class IntervalLimiter
{
public:
- IntervalLimiter():
- m_accumulator(0)
- {
- }
+ IntervalLimiter() : m_accumulator(0) {}
/*
dtime: time from last call to this method
wanted_interval: interval wanted
@@ -316,15 +294,17 @@ public:
bool step(float dtime, float wanted_interval)
{
m_accumulator += dtime;
- if(m_accumulator < wanted_interval)
+ if (m_accumulator < wanted_interval)
return false;
m_accumulator -= wanted_interval;
return true;
}
-protected:
+
+private:
float m_accumulator;
};
+
/*
Splits a list into "pages". For example, the list [1,2,3,4,5] split
into two pages would be [1,2,3],[4,5]. This function computes the
@@ -340,29 +320,21 @@ protected:
*/
inline void paging(u32 length, u32 page, u32 pagecount, u32 &minindex, u32 &maxindex)
{
- if(length < 1 || pagecount < 1 || page < 1 || page > pagecount)
- {
+ if (length < 1 || pagecount < 1 || page < 1 || page > pagecount) {
// Special cases or invalid parameters
minindex = maxindex = 0;
- }
- else if(pagecount <= length)
- {
+ } else if(pagecount <= length) {
// Less pages than entries in the list:
// Each page contains at least one entry
minindex = (length * (page-1) + (pagecount-1)) / pagecount;
maxindex = (length * page + (pagecount-1)) / pagecount;
- }
- else
- {
+ } else {
// More pages than entries in the list:
// Make sure the empty pages are at the end
- if(page < length)
- {
+ if (page < length) {
minindex = page-1;
maxindex = page;
- }
- else
- {
+ } else {
minindex = 0;
maxindex = 0;
}
@@ -371,14 +343,14 @@ inline void paging(u32 length, u32 page, u32 pagecount, u32 &minindex, u32 &maxi
inline float cycle_shift(float value, float by = 0, float max = 1)
{
- if (value + by < 0) return max + by + value;
+ if (value + by < 0) return value + by + max;
if (value + by > max) return value + by - max;
return value + by;
}
inline bool is_power_of_two(u32 n)
{
- return n != 0 && (n & (n-1)) == 0;
+ return n != 0 && (n & (n - 1)) == 0;
}
// Compute next-higher power of 2 efficiently, e.g. for power-of-2 texture sizes.
diff --git a/src/util/string.cpp b/src/util/string.cpp
index 141068512..d41b91f24 100644
--- a/src/util/string.cpp
+++ b/src/util/string.cpp
@@ -25,6 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "hex.h"
#include "../porting.h"
+#include <algorithm>
#include <sstream>
#include <iomanip>
#include <map>