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:
parent
b6f4a9c7e1
commit
77597c4ff3
17 changed files with 205 additions and 157 deletions
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue