Nebula
Loading...
Searching...
No Matches
scalar.h
Go to the documentation of this file.
1#pragma once
2//------------------------------------------------------------------------------
17
18
19
20namespace Math
21{
22#ifndef PI
23#define PI (3.1415926535897932384626433832795028841971693993751)
24#endif
25
26// the half circle
27#ifndef N_PI
28#define N_PI (Math::scalar(PI))
29#endif
30// the whole circle
31#ifndef N_PI_DOUBLE
32#define N_PI_DOUBLE (Math::scalar(6.283185307179586476925286766559))
33#endif
34// a quarter circle
35#ifndef N_PI_HALF
36#define N_PI_HALF (Math::scalar(1.5707963267948966192313216916398f))
37#endif
38// ---HOTFIXED
39
40#ifndef TINY
41#define TINY (0.0000001f)
42#endif
43#define N_TINY TINY
44
45typedef float scalar;
46typedef float float32;
47typedef double float64;
48
49#ifndef PI
50#define PI (3.1415926535897932384626433832795028841971693993751)
51#endif
52// the half circle
53#ifndef N_PI
54#define N_PI (Math::scalar(3.1415926535897932384626433832795028841971693993751))
55#endif
56
57struct float2
58{
59 union
60 {
61 struct { scalar x, y; };
63 };
64};
65
66struct float3
67{
68 union
69 {
70 struct { scalar x, y, z; };
72 };
73};
74
75struct float4
76{
77 union
78 {
79 struct { scalar x, y, z, w; };
81 };
82};
83
84struct int2
85{
86 union
87 {
88 struct { int x, y; };
89 int v[2];
90 };
91};
92
93struct int3
94{
95 union
96 {
97 struct { int x, y, z; };
98 int v[3];
99 };
100};
101
102struct int4
103{
104 union
105 {
106 struct { int x, y, z, w; };
107 int v[4];
108 };
109};
110
111struct uint2
112{
113 union
114 {
115 struct { unsigned int x, y; };
116 unsigned int v[2];
117 };
118};
119
120struct uint3
121{
122 union
123 {
124 struct { unsigned int x, y, z; };
125 unsigned int v[3];
126 };
127};
128
129struct uint4
130{
131 union
132 {
133 struct { unsigned int x, y, z, w; };
134 unsigned int v[4];
135 };
136};
137
138struct byte4u
139{
140 union
141 {
142 struct { ubyte x, y, z, w; };
143 unsigned int v;
144 };
145};
146
147struct byte4
148{
149 union
150 {
151 struct { byte x, y, z, w; };
152 unsigned int v;
153 };
154};
155
156//------------------------------------------------------------------------------
160__forceinline scalar
162{
163 return scalar(::rand()) / scalar(RAND_MAX);
164}
165
166//------------------------------------------------------------------------------
170__forceinline scalar
172{
173 scalar unit = scalar(::rand()) / RAND_MAX;
174 scalar diff = max - min;
175 return min + unit * diff;
176}
177
178//------------------------------------------------------------------------------
181__forceinline scalar
183{
184 return sinf(x);
185}
186
187//------------------------------------------------------------------------------
190__forceinline scalar
192{
193 return cosf(x);
194}
195
196//------------------------------------------------------------------------------
199__forceinline scalar
201{
202 return tanf(x);
203}
204
205//------------------------------------------------------------------------------
208__forceinline scalar
210{
211 return asinf(x);
212}
213
214//------------------------------------------------------------------------------
217__forceinline scalar
219{
220 return acosf(x);
221}
222
223//------------------------------------------------------------------------------
226__forceinline scalar
228{
229 return atanf(x);
230}
231
232//------------------------------------------------------------------------------
235__forceinline scalar
237{
238 return sqrtf(x);
239}
240
241//------------------------------------------------------------------------------
245__forceinline int
247{
249 return int(f);
250}
251
252//------------------------------------------------------------------------------
255__forceinline scalar
257{
258 return fmodf(x, y);
259}
260
261//------------------------------------------------------------------------------
264__forceinline scalar
266{
267 return x - (int)x;
268}
269
270//------------------------------------------------------------------------------
276__forceinline scalar
278{
279#if 0
280 static const scalar rev = scalar(6.283185307179586476925286766559);
281 return n_fmod(a,rev);
282#else
283 static const scalar REVOLUTION = scalar(6.283185307179586476925286766559);
284 a += N_PI;
285 scalar temp = fabsf(a);
286 temp = temp - floorf(temp/REVOLUTION) * REVOLUTION;
287 temp -= N_PI;
288 temp = a<0 ? -temp:temp;
289 if(temp < scalar(-N_PI)) temp += REVOLUTION;
290 if(temp >= scalar(N_PI)) temp -= REVOLUTION;
291 return temp;
292#endif
293}
294
295//------------------------------------------------------------------------------
299__forceinline scalar
301{
302 return log2f(f);
303}
304
305//------------------------------------------------------------------------------
308__forceinline scalar
310{
311 return exp2f(x);
312}
313
314//------------------------------------------------------------------------------
318__forceinline scalar
320{
321 return logf(x);
322}
323
324//------------------------------------------------------------------------------
327__forceinline scalar
329{
330 return expf(x);
331}
332
333//------------------------------------------------------------------------------
337__forceinline int
339{
340 return fchop(floorf(f + 0.5f));
341}
342
343//------------------------------------------------------------------------------
346__forceinline scalar
348{
349 return powf(x, y);
350}
351
352//------------------------------------------------------------------------------
356__forceinline bool
358{
359 scalar f = f0 - f1;
360 return ((f > (-tol)) && (f < tol));
361}
362
363//------------------------------------------------------------------------------
366template<typename TYPE>
367__forceinline TYPE
368max(TYPE a, TYPE b)
369{
370 return (a > b) ? a : b;
371}
372
373//------------------------------------------------------------------------------
376template<typename TYPE0, typename ...TYPEN>
377__forceinline TYPE0
378max(TYPE0 first, TYPE0 second, TYPEN... rest)
379{
380 return first > second ? max(first, std::forward<TYPEN>(rest)...) : max(second, std::forward<TYPEN>(rest)...);
381}
382
383//------------------------------------------------------------------------------
387template<>
388__forceinline unsigned int
389max(unsigned int a, unsigned int b)
390{
391 return a ^ ((a ^ b) & -(a < b));
392}
393
394//------------------------------------------------------------------------------
397template<typename TYPE>
398__forceinline TYPE
399min(TYPE a, TYPE b)
400{
401 return (a < b) ? a : b;
402}
403
404//------------------------------------------------------------------------------
407template<typename TYPEA, typename TYPEB>
408__forceinline TYPEA
409min(TYPEA a, TYPEB b)
410{
411 return (a < b) ? a : b;
412}
413
414//------------------------------------------------------------------------------
418template<>
419__forceinline unsigned int
420min(unsigned int a, unsigned int b)
421{
422 return b ^ ((a ^ b) & -(a < b));
423}
424
425//------------------------------------------------------------------------------
429template<>
430__forceinline uint16_t
431min(uint16_t a, uint16_t b)
432{
433 return b ^ ((a ^ b) & -(a < b));
434}
435
436//------------------------------------------------------------------------------
439template<typename TYPE0, typename ...TYPEN>
440__forceinline TYPE0
441min(TYPE0 first, TYPE0 second, TYPEN... rest)
442{
443 return first < second ? min(first, std::forward<TYPEN>(rest)...) : min(second, std::forward<TYPEN>(rest)...);
444}
445
446//------------------------------------------------------------------------------
449
450__forceinline scalar
452{
453 return (a < 0.0f) ? -a : a;
454}
455
456//------------------------------------------------------------------------------
459__forceinline double
460abs(double a)
461{
462 return (a < 0.0) ? -a : a;
463}
464
465//------------------------------------------------------------------------------
468__forceinline int
469abs(int a)
470{
471 return (a < 0) ? -a : a;
472}
473
474//------------------------------------------------------------------------------
477__forceinline scalar
479{
480 return (a < 0.0f) ? -1.0f : 1.0f;
481}
482
483//------------------------------------------------------------------------------
486__forceinline constexpr scalar
488{
489 return (scalar)((d * N_PI) / 180.0f);
490}
491
492//------------------------------------------------------------------------------
495__forceinline constexpr scalar
497{
498 return (scalar)((r * 180.0f) / N_PI);
499}
500
501//------------------------------------------------------------------------------
505__forceinline float
506clamp(float val, float minVal, float maxVal)
507{
508 if (val < minVal) return minVal;
509 else if (val > maxVal) return maxVal;
510 else return val;
511}
512
513//------------------------------------------------------------------------------
517__forceinline int64_t
518clamp(int64_t val, int64_t minVal, int64_t maxVal)
519{
520 if (val < minVal) return minVal;
521 else if (val > maxVal) return maxVal;
522 else return val;
523}
524
525//------------------------------------------------------------------------------
529__forceinline int32_t
530clamp(int32_t val, int32_t minVal, int32_t maxVal)
531{
532 if (val < minVal) return minVal;
533 else if (val > maxVal) return maxVal;
534 else return val;
535}
536
537//------------------------------------------------------------------------------
541__forceinline float
542ceil(float val)
543{
544 return ceilf(val);
545}
546
547//------------------------------------------------------------------------------
551__forceinline float
552floor(float val)
553{
554 return floorf(val);
555}
556
557//------------------------------------------------------------------------------
561__forceinline float
562round(float val)
563{
564 return roundf(val);
565}
566
567//------------------------------------------------------------------------------
571__forceinline bool
573{
574 return ((f0 - f1) < tol);
575}
576
577//------------------------------------------------------------------------------
581__forceinline bool
583{
584 return ((f0 - f1) > tol);
585}
586
587//------------------------------------------------------------------------------
591__forceinline scalar
593{
594 if (val < 0.0f) return 0.0f;
595 else if (val > 1.0f) return 1.0f;
596 else return val;
597}
598
599//------------------------------------------------------------------------------
603__forceinline double
604saturate(double val)
605{
606 if (val < 0.0) return 0.0;
607 else if (val > 1.0) return 1.0;
608 else return val;
609}
610
611//------------------------------------------------------------------------------
615__forceinline float
616lerp(float x, float y, float l)
617{
618 return x + l * (y - x);
619}
620
621//------------------------------------------------------------------------------
625__forceinline scalar
627{
628 scalar normFrom = modangle(from);
629 scalar normTo = modangle(to);
630 scalar dist = normTo - normFrom;
631 if (dist < deg2rad(-180.0f))
632 {
633 dist += deg2rad(360.0f);
634 }
635 else if (dist > deg2rad(180.0f))
636 {
637 dist -= deg2rad(360.0f);
638 }
639 return dist;
640}
641
642//------------------------------------------------------------------------------
646__forceinline bool
648{
649#if __GNUC__
650 union { scalar s; unsigned int u; } pun;
651 pun.s = s;
652 return ((pun.u&0x7f800000)==0);
653#else
654 return (((*(unsigned int*)&s)&0x7f800000)==0);
655#endif
656}
657
658//------------------------------------------------------------------------------
662__forceinline float
664{
665 if (isdenormal(s))
666 {
667 return 0.0f;
668 }
669 else
670 {
671 return s;
672 }
673}
674
675//------------------------------------------------------------------------------
679__forceinline bool
681{
682 return abs(a - b) <= epsilon;
683}
684
685//------------------------------------------------------------------------------
688__forceinline scalar
690{
691 return scalar(1.0) / tan(x);
692}
693
694//------------------------------------------------------------------------------
697__forceinline scalar
699{
700 // Scale, bias and saturate x to 0..1 range
701 x = saturate((x - edge0) / (edge1 - edge0));
702 // Evaluate polynomial
703 return x*x*(3-2*x);
704}
705
706//------------------------------------------------------------------------------
710__forceinline int
711irand(int min, int max)
712{
713 int range = max - min + 1;
714 int unit = ::rand() % range;
715 return min + unit;
716}
717
718//------------------------------------------------------------------------------
722__forceinline int
723mostsignificant(unsigned int val)
724{
725#ifdef WIN32
726 unsigned long ret;
727 bool res = _BitScanReverse(&ret, val);
728 ret = res ? ret : 0;
729 return ret + 1;
730#else
731 unsigned long ret;
732 ret = __builtin_clz(val);
733 return ret + 1;
734#endif
735}
736
737//------------------------------------------------------------------------------
740__forceinline unsigned int
741align(unsigned int alignant, unsigned int alignment)
742{
743 return (alignant + alignment - 1) & ~(alignment - 1);
744}
745
746//------------------------------------------------------------------------------
749__forceinline uintptr_t
750alignptr(uintptr_t alignant, uintptr_t alignment)
751{
752 return (alignant + alignment - 1) & ~(alignment - 1);
753}
754
755//------------------------------------------------------------------------------
758__forceinline unsigned int
759align_down(unsigned int alignant, unsigned int alignment)
760{
761 return (alignant / alignment * alignment);
762}
763
764//------------------------------------------------------------------------------
767__forceinline uintptr_t
768align_downptr(uintptr_t alignant, uintptr_t alignment)
769{
770 return (alignant / alignment * alignment);
771}
772
773//------------------------------------------------------------------------------
777__forceinline unsigned int
778divandroundup(unsigned int dividend, unsigned int divider)
779{
780 return (dividend % divider != 0) ? (dividend / divider + 1) : (dividend / divider);
781}
782
783//------------------------------------------------------------------------------
787__forceinline unsigned int
788roundtopow2(unsigned int val)
789{
790 val--;
791 val |= val >> 1;
792 val |= val >> 2;
793 val |= val >> 4;
794 val |= val >> 8;
795 val |= val >> 16;
796 val++;
797 return val;
798}
799
800//------------------------------------------------------------------------------
805{
806 uint64_t x[2];
807};
808
809__forceinline uint64_t
811{
812 uint64_t t = state.x[0];
813 uint64_t const s = state.x[1];
814 state.x[0] = s;
815 t ^= t << 23; // a
816 t ^= t >> 18; // b -- Again, the shifts and the multipliers are tunable
817 t ^= s ^ (s >> 5); // c
818 state.x[1] = t;
819 return t + s;
820}
821
822//------------------------------------------------------------------------------
826__forceinline uint32_t
827pointerhash(void* ptr)
828{
829 return (uint32_t) (((uintptr_t)(void *)ptr) % 4294967291u);
830}
831
832
833//------------------------------------------------------------------------------
837inline float
838normtofloat(uint16_t value)
839{
840 return (float)value / 65535.0f;
841}
842
843//------------------------------------------------------------------------------
847inline float
848normtofloat(int16_t value)
849{
850 return Math::max((float)value / 32767.0f, -1.0f);
851}
852
853//------------------------------------------------------------------------------
857inline float
858normtofloat(uint8_t value)
859{
860 return (float)value / 255.0f;
861}
862
863//------------------------------------------------------------------------------
867inline float
868normtofloat(int8_t value)
869{
870 return Math::max((float)value / 127.0f, -1.0f);
871}
872
873} // namespace Math
874
875//------------------------------------------------------------------------------
879inline long double
880operator"" _rad(long double deg)
881{
882 return Math::deg2rad(deg);
883}
884
885//------------------------------------------------------------------------------
888inline long double
889operator"" _rad(unsigned long long deg)
890{
891 return Math::deg2rad(deg);
892}
893
894//------------------------------------------------------------------------------
898inline long double
899operator"" _deg(long double rad)
900{
901 return Math::rad2deg(rad);
902}
903
904//------------------------------------------------------------------------------
907inline long double
908operator"" _deg(unsigned long long deg)
909{
910 return Math::rad2deg(deg);
911}
912
913//------------------------------------------------------------------------------
Different curves.
Definition angularpfeedbackloop.h:17
__forceinline uintptr_t alignptr(uintptr_t alignant, uintptr_t alignment)
Definition scalar.h:750
__forceinline float undenormalize(scalar s)
Returns 0 if scalar is denormal.
Definition scalar.h:663
__forceinline constexpr scalar rad2deg(scalar r)
Definition scalar.h:496
__forceinline int mostsignificant(unsigned int val)
Returns the position of the most significant bit of the number.
Definition scalar.h:723
__forceinline bool fequal(scalar f0, scalar f1, scalar tol)
A fuzzy floating point equality check.
Definition scalar.h:357
__forceinline scalar cot(scalar x)
Definition scalar.h:689
__forceinline scalar sqrt(scalar x)
Definition scalar.h:236
__forceinline scalar log(scalar x)
get logarithm of x
Definition scalar.h:319
__forceinline unsigned int align_down(unsigned int alignant, unsigned int alignment)
Definition scalar.h:759
__forceinline constexpr scalar deg2rad(scalar d)
Definition scalar.h:487
__forceinline scalar asin(scalar x)
Definition scalar.h:209
__forceinline scalar saturate(scalar val)
Saturate a value (clamps between 0.0f and 1.0f)
Definition scalar.h:592
__forceinline uint32_t pointerhash(void *ptr)
cheap pointer hash using modulo with a mersenne prime
Definition scalar.h:827
__forceinline scalar log2(scalar f)
log2() function.
Definition scalar.h:300
__forceinline int fchop(scalar f)
Chop float to int.
Definition scalar.h:246
float normtofloat(uint16_t value)
convert normalized uint16_t to float
Definition scalar.h:838
__forceinline int frnd(scalar f)
Round float to integer.
Definition scalar.h:338
__forceinline float round(float val)
Floating point rounding.
Definition scalar.h:562
__forceinline float ceil(float val)
Floating point ceiling.
Definition scalar.h:542
__forceinline float lerp(float x, float y, float l)
Linearly interpolate between 2 values: ret = x + l * (y - x)
Definition scalar.h:616
__forceinline scalar modangle(scalar a)
Normalize an angular value into the range rad(0) to rad(360).
Definition scalar.h:277
__forceinline int irand(int min, int max)
Return a pseudo integer random number between min and max.
Definition scalar.h:711
__forceinline scalar pow(scalar x, scalar y)
Definition scalar.h:347
__forceinline float clamp(float val, float minVal, float maxVal)
Float clamping.
Definition scalar.h:506
__forceinline unsigned int align(unsigned int alignant, unsigned int alignment)
Definition scalar.h:741
__forceinline scalar rand()
Return a pseudo random number between 0 and 1.
Definition scalar.h:161
__forceinline TYPE min(TYPE a, TYPE b)
Definition scalar.h:399
__forceinline scalar fract(scalar x)
Definition scalar.h:265
__forceinline bool isdenormal(scalar s)
Returns true if the input scalar is denormalized (#DEN)
Definition scalar.h:647
double float64
Definition scalar.h:47
__forceinline scalar smoothstep(scalar edge0, scalar edge1, scalar x)
Definition scalar.h:698
__forceinline scalar angulardistance(scalar from, scalar to)
Get angular distance.
Definition scalar.h:626
float scalar
Definition scalar.h:45
__forceinline uintptr_t align_downptr(uintptr_t alignant, uintptr_t alignment)
Definition scalar.h:768
__forceinline scalar exp(scalar x)
Definition scalar.h:328
__forceinline scalar exp2(scalar x)
Definition scalar.h:309
__forceinline uint64_t randxor(randxorstate &state)
Definition scalar.h:810
__forceinline TYPE max(TYPE a, TYPE b)
Definition scalar.h:368
__forceinline scalar sgn(scalar a)
Definition scalar.h:478
__forceinline scalar abs(scalar a)
Definition scalar.h:451
__forceinline scalar cos(scalar x)
Definition scalar.h:191
__forceinline unsigned int divandroundup(unsigned int dividend, unsigned int divider)
Integer division with rounding.
Definition scalar.h:778
__forceinline scalar acos(scalar x)
Definition scalar.h:218
__forceinline bool nearequal(const point &v0, const point &v1, float epsilon)
Definition point.h:485
__forceinline scalar sin(scalar x)
Definition scalar.h:182
__forceinline bool fless(scalar f0, scalar f1, scalar tol)
A fuzzy floating point less-then check.
Definition scalar.h:572
__forceinline bool fgreater(scalar f0, scalar f1, scalar tol)
A fuzzy floating point greater-then check.
Definition scalar.h:582
__forceinline unsigned int roundtopow2(unsigned int val)
Rounds up to next power of 2.
Definition scalar.h:788
__forceinline scalar atan(scalar x)
Definition scalar.h:227
__forceinline float floor(float val)
Floating point flooring.
Definition scalar.h:552
__forceinline scalar tan(scalar x)
Definition scalar.h:200
float float32
Definition scalar.h:46
__forceinline scalar fmod(scalar x, scalar y)
Definition scalar.h:256
#define N_PI
Definition scalar.h:28
Definition scalar.h:148
byte y
Definition scalar.h:151
byte w
Definition scalar.h:151
byte z
Definition scalar.h:151
unsigned int v
Definition scalar.h:152
byte x
Definition scalar.h:151
Definition scalar.h:139
ubyte x
Definition scalar.h:142
unsigned int v
Definition scalar.h:143
ubyte z
Definition scalar.h:142
ubyte w
Definition scalar.h:142
ubyte y
Definition scalar.h:142
Definition scalar.h:58
scalar x
Definition scalar.h:61
scalar v[2]
Definition scalar.h:62
scalar y
Definition scalar.h:61
Definition scalar.h:67
scalar x
Definition scalar.h:70
scalar y
Definition scalar.h:70
scalar v[3]
Definition scalar.h:71
scalar z
Definition scalar.h:70
Definition scalar.h:76
scalar x
Definition scalar.h:79
scalar v[4]
Definition scalar.h:80
scalar y
Definition scalar.h:79
scalar w
Definition scalar.h:79
scalar z
Definition scalar.h:79
Definition scalar.h:85
int v[2]
Definition scalar.h:89
int y
Definition scalar.h:88
int x
Definition scalar.h:88
Definition scalar.h:94
int x
Definition scalar.h:97
int z
Definition scalar.h:97
int v[3]
Definition scalar.h:98
int y
Definition scalar.h:97
Definition scalar.h:103
int z
Definition scalar.h:106
int w
Definition scalar.h:106
int x
Definition scalar.h:106
int y
Definition scalar.h:106
int v[4]
Definition scalar.h:107
fast random generator based on xorshift+
Definition scalar.h:805
uint64_t x[2]
Definition scalar.h:806
Definition scalar.h:112
unsigned int x
Definition scalar.h:115
unsigned int v[2]
Definition scalar.h:116
unsigned int y
Definition scalar.h:115
Definition scalar.h:121
unsigned int z
Definition scalar.h:124
unsigned int y
Definition scalar.h:124
unsigned int v[3]
Definition scalar.h:125
unsigned int x
Definition scalar.h:124
Definition scalar.h:130
unsigned int w
Definition scalar.h:133
unsigned int z
Definition scalar.h:133
unsigned int x
Definition scalar.h:133
unsigned int y
Definition scalar.h:133
unsigned int v[4]
Definition scalar.h:134
unsigned char ubyte
Definition types.h:36