X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Futil%2Fnumeric.cpp;h=cb984d8cb5b60879f7f11bb158c2162afca11848;hb=67a4cb7d8a4461fe7d5206189fd4e9539beb20b7;hp=a1f1fd0ab1d308cec13a6d6c94a18d6be3f13f30;hpb=3993093f51544d4eb44efb57c973e29107ea2f7a;p=minetest.git diff --git a/src/util/numeric.cpp b/src/util/numeric.cpp index a1f1fd0ab..cb984d8cb 100644 --- a/src/util/numeric.cpp +++ b/src/util/numeric.cpp @@ -18,103 +18,16 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "numeric.h" -#include "mathconstants.h" #include "log.h" -#include "../constants.h" // BS, MAP_BLOCKSIZE -#include "../noise.h" // PseudoRandom, PcgRandom -#include -#include - -std::map > FacePositionCache::m_cache; -// Calculate the borders of a "d-radius" cube -std::vector FacePositionCache::getFacePositions(u16 d) -{ - 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(); - 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; - } +#include "constants.h" // BS, MAP_BLOCKSIZE +#include "noise.h" // PseudoRandom, PcgRandom +#include "threading/mutex_auto_lock.h" +#include +#include - // 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 range) return false; - // Maximum radius of a block. The magic number is - // sqrt(3.0) / 2.0 in literal form. - f32 block_max_radius = 0.866025403784 * MAP_BLOCKSIZE * BS; - // If block is (nearly) touching the camera, don't // bother validating further (that is, render it anyway) - if(d < block_max_radius) + if(d == 0) return true; // Adjust camera position, for purposes of computing the angle, @@ -241,9 +154,24 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir, f32 cosangle = dforward / blockpos_adj.getLength(); // If block is not in the field of view, skip it - if(cosangle < cos(camera_fov / 2)) + // HOTFIX: use sligthly increased angle (+10%) to fix too agressive + // culling. Somebody have to find out whats wrong with the math here. + // Previous value: camera_fov / 2 + if(cosangle < cos(camera_fov * 0.55)) return false; return true; } +s16 adjustDist(s16 dist, float zoom_fov) +{ + // 1.775 ~= 72 * PI / 180 * 1.4, the default on the client + const float default_fov = 1.775f; + // heuristic cut-off for zooming + if (zoom_fov > default_fov / 2.0f) + return dist; + + // new_dist = dist * ((1 - cos(FOV / 2)) / (1-cos(zoomFOV /2))) ^ (1/3) + return round(dist * cbrt((1.0f - std::cos(default_fov / 2.0f)) / + (1.0f - std::cos(zoom_fov / 2.0f)))); +}