1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-07-17 17:08:39 +00:00

Clean up numeric.h and split FacePositionCache from it

I also optiized FacePositionCache a bit: I removed a map
lookup and vector copy from both branches of getFacePosition.
This commit is contained in:
ShadowNinja 2015-07-06 12:53:30 -04:00
parent b6f4a9c7e1
commit 77597c4ff3
17 changed files with 205 additions and 157 deletions

View file

@ -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;