X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;ds=sidebyside;f=src%2Futil%2Fnumeric.h;h=32a6f4312b04abc975a96021912fff965f8502de;hb=e16a470d59069692d654f5c1529ab313a01ded67;hp=f09c4e9f5f95dc44a5561cc3d5c4879abdd70a1d;hpb=9d8cb510b3ad398c4fcb214704a2c3a42e944e34;p=minetest.git diff --git a/src/util/numeric.h b/src/util/numeric.h index f09c4e9f5..32a6f4312 100644 --- a/src/util/numeric.h +++ b/src/util/numeric.h @@ -20,10 +20,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once #include "basic_macros.h" -#include "../irrlichttypes.h" -#include "../irr_v2d.h" -#include "../irr_v3d.h" -#include "../irr_aabb3d.h" +#include "constants.h" +#include "irrlichttypes.h" +#include "irr_v2d.h" +#include "irr_v3d.h" +#include "irr_aabb3d.h" +#include "SColor.h" +#include #define rangelim(d, min, max) ((d) < (min) ? (min) : ((d) > (max) ? (max) : (d))) #define myfloor(x) ((x) < 0.0 ? (int)(x) - 1 : (int)(x)) @@ -34,6 +37,9 @@ with this program; if not, write to the Free Software Foundation, Inc., y = temp; \ } while (0) +// Maximum radius of a block. The magic number is +// sqrt(3.0) / 2.0 in literal form. +static constexpr const f32 BLOCK_MAX_RADIUS = 0.866025403784f * MAP_BLOCKSIZE * BS; inline s16 getContainerPos(s16 p, s16 d) { @@ -182,6 +188,23 @@ inline float wrapDegrees_0_360(float f) } +/** Returns \p v3f wrapped to the range [0, 360] + */ +inline v3f wrapDegrees_0_360_v3f(v3f v) +{ + v3f value_v3f; + value_v3f.X = modulo360f(v.X); + value_v3f.Y = modulo360f(v.Y); + value_v3f.Z = modulo360f(v.Z); + + // Now that values are wrapped, use to get values for certain ranges + value_v3f.X = value_v3f.X < 0 ? value_v3f.X + 360 : value_v3f.X; + value_v3f.Y = value_v3f.Y < 0 ? value_v3f.Y + 360 : value_v3f.Y; + value_v3f.Z = value_v3f.Z < 0 ? value_v3f.Z + 360 : value_v3f.Z; + return value_v3f; +} + + /** Returns \p f wrapped to the range [-180, 180] */ inline float wrapDegrees_180(float f) @@ -232,6 +255,8 @@ u64 murmur_hash_64_ua(const void *key, int len, unsigned int seed); bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir, f32 camera_fov, f32 range, f32 *distance_ptr=NULL); +s16 adjustDist(s16 dist, float zoom_fov); + /* Returns nearest 32-bit integer for given floating point number. and in VC++ don't provide round(). @@ -241,6 +266,11 @@ inline s32 myround(f32 f) return (s32)(f < 0.f ? (f - 0.5f) : (f + 0.5f)); } +inline constexpr f32 sqr(f32 f) +{ + return f * f; +} + /* Returns integer position of node in given floating point position */ @@ -252,6 +282,17 @@ inline v3s16 floatToInt(v3f p, f32 d) (p.Z + (p.Z > 0 ? d / 2 : -d / 2)) / d); } +/* + Returns integer position of node in given double precision position + */ +inline v3s16 doubleToInt(v3d p, double d) +{ + 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); +} + /* Returns floating point position of node in given integer position */ @@ -363,3 +404,45 @@ inline u32 npot2(u32 orig) { orig |= orig >> 16; return orig + 1; } + +// Gradual steps towards the target value in a wrapped (circular) system +// using the shorter of both ways +template +inline void wrappedApproachShortest(T ¤t, const T target, const T stepsize, + const T maximum) +{ + T delta = target - current; + if (delta < 0) + delta += maximum; + + if (delta > stepsize && maximum - delta > stepsize) { + current += (delta < maximum / 2) ? stepsize : -stepsize; + if (current >= maximum) + current -= maximum; + } else { + current = target; + } +} + +void setPitchYawRollRad(core::matrix4 &m, const v3f &rot); + +inline void setPitchYawRoll(core::matrix4 &m, const v3f &rot) +{ + setPitchYawRollRad(m, rot * core::DEGTORAD64); +} + +v3f getPitchYawRollRad(const core::matrix4 &m); + +inline v3f getPitchYawRoll(const core::matrix4 &m) +{ + return getPitchYawRollRad(m) * core::RADTODEG64; +} + +// Muliply the RGB value of a color linearly, and clamp to black/white +inline irr::video::SColor multiplyColorValue(const irr::video::SColor &color, float mod) +{ + return irr::video::SColor(color.getAlpha(), + core::clamp(color.getRed() * mod, 0, 255), + core::clamp(color.getGreen() * mod, 0, 255), + core::clamp(color.getBlue() * mod, 0, 255)); +}