2
3
4
5
6
7
8
9
10
11
12
24
25
26
27
28
33
34
35
36
37
52
53
54
55
56
77
78
79
80
81
108
109
110
116SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_init(
float x,
float y,
float z) SHZ_NOEXCEPT;
119SHZ_FORCE_INLINE shz_vec4_t
shz_vec4_init(
float x,
float y,
float z,
float w) SHZ_NOEXCEPT;
133
134
135
183SHZ_FORCE_INLINE shz_vec2_t
shz_vec2_clamp(shz_vec2_t vec,
float min,
float max) SHZ_NOEXCEPT;
186SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_clamp(shz_vec3_t vec,
float min,
float max) SHZ_NOEXCEPT;
189SHZ_FORCE_INLINE shz_vec4_t
shz_vec4_clamp(shz_vec4_t vec,
float min,
float max) SHZ_NOEXCEPT;
246SHZ_FORCE_INLINE shz_vec2_t
shz_vec2_minv(shz_vec2_t a, shz_vec2_t b) SHZ_NOEXCEPT;
249SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_minv(shz_vec3_t a, shz_vec3_t b) SHZ_NOEXCEPT;
252SHZ_FORCE_INLINE shz_vec4_t
shz_vec4_minv(shz_vec4_t a, shz_vec4_t b) SHZ_NOEXCEPT;
255SHZ_FORCE_INLINE shz_vec2_t
shz_vec2_maxv(shz_vec2_t a, shz_vec2_t b) SHZ_NOEXCEPT;
258SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_maxv(shz_vec3_t a, shz_vec3_t b) SHZ_NOEXCEPT;
261SHZ_FORCE_INLINE shz_vec4_t
shz_vec4_maxv(shz_vec4_t a, shz_vec4_t b) SHZ_NOEXCEPT;
273SHZ_FORCE_INLINE shz_vec2_t
shz_vec2_stepv( shz_vec2_t vec, shz_vec2_t edge) SHZ_NOEXCEPT;
276SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_stepv(shz_vec3_t vec, shz_vec3_t edge) SHZ_NOEXCEPT;
279SHZ_FORCE_INLINE shz_vec4_t
shz_vec4_stepv(shz_vec4_t vec, shz_vec4_t edge) SHZ_NOEXCEPT;
282SHZ_FORCE_INLINE shz_vec2_t
shz_vec2_step(shz_vec2_t vec,
float edge) SHZ_NOEXCEPT;
285SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_step(shz_vec3_t vec,
float edge) SHZ_NOEXCEPT;
288SHZ_FORCE_INLINE shz_vec4_t
shz_vec4_step(shz_vec4_t vec,
float edge) SHZ_NOEXCEPT;
291SHZ_FORCE_INLINE shz_vec2_t
shz_vec2_smoothstepv(shz_vec2_t vec, shz_vec2_t edge0, shz_vec2_t edge1) SHZ_NOEXCEPT;
294SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_smoothstepv(shz_vec3_t vec, shz_vec3_t edge0, shz_vec3_t edge1) SHZ_NOEXCEPT;
297SHZ_FORCE_INLINE shz_vec4_t
shz_vec4_smoothstepv(shz_vec4_t vec, shz_vec4_t edge0, shz_vec4_t edge1) SHZ_NOEXCEPT;
311
312
313
316SHZ_FORCE_INLINE shz_vec2_t
shz_vec2_add(shz_vec2_t vec1, shz_vec2_t vec2) SHZ_NOEXCEPT;
319SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_add(shz_vec3_t vec1, shz_vec3_t vec2) SHZ_NOEXCEPT;
322SHZ_FORCE_INLINE shz_vec4_t
shz_vec4_add(shz_vec4_t vec1, shz_vec4_t vec2) SHZ_NOEXCEPT;
325SHZ_FORCE_INLINE shz_vec2_t
shz_vec2_sub(shz_vec2_t vec1, shz_vec2_t vec2) SHZ_NOEXCEPT;
328SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_sub(shz_vec3_t vec1, shz_vec3_t vec2) SHZ_NOEXCEPT;
331SHZ_FORCE_INLINE shz_vec4_t
shz_vec4_sub(shz_vec4_t vec1, shz_vec4_t vec2) SHZ_NOEXCEPT;
334SHZ_FORCE_INLINE shz_vec2_t
shz_vec2_mul(shz_vec2_t vec1, shz_vec2_t vec2) SHZ_NOEXCEPT;
337SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_mul(shz_vec3_t vec1, shz_vec3_t vec2) SHZ_NOEXCEPT;
340SHZ_FORCE_INLINE shz_vec4_t
shz_vec4_mul(shz_vec4_t vec1, shz_vec4_t vec2) SHZ_NOEXCEPT;
343SHZ_FORCE_INLINE shz_vec2_t
shz_vec2_div(shz_vec2_t vec1, shz_vec2_t vec2) SHZ_NOEXCEPT;
346SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_div(shz_vec3_t vec1, shz_vec3_t vec2) SHZ_NOEXCEPT;
349SHZ_FORCE_INLINE shz_vec4_t
shz_vec4_div(shz_vec4_t vec1, shz_vec4_t vec2) SHZ_NOEXCEPT;
352SHZ_FORCE_INLINE shz_vec2_t
shz_vec2_scale(shz_vec2_t vec,
float factor) SHZ_NOEXCEPT;
355SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_scale(shz_vec3_t vec,
float factor) SHZ_NOEXCEPT;
358SHZ_FORCE_INLINE shz_vec4_t
shz_vec4_scale(shz_vec4_t vec,
float factor) SHZ_NOEXCEPT;
363
364
365
404
405
406
410
411
412
416
417
418
424
425
426
429SHZ_FORCE_INLINE
float shz_vec2_dot(shz_vec2_t vec1, shz_vec2_t vec2) SHZ_NOEXCEPT;
432SHZ_FORCE_INLINE shz_vec2_t
shz_vec2_dot2(shz_vec2_t l, shz_vec2_t r1, shz_vec2_t r2) SHZ_NOEXCEPT;
435SHZ_FORCE_INLINE shz_vec3_t
shz_vec2_dot3(shz_vec2_t l, shz_vec2_t r1, shz_vec2_t r2, shz_vec2_t r3) SHZ_NOEXCEPT;
438SHZ_FORCE_INLINE
float shz_vec3_dot(shz_vec3_t vec1, shz_vec3_t vec2) SHZ_NOEXCEPT;
441SHZ_FORCE_INLINE shz_vec2_t
shz_vec3_dot2(shz_vec3_t l, shz_vec3_t r1, shz_vec3_t r2) SHZ_NOEXCEPT;
444SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_dot3(shz_vec3_t l, shz_vec3_t r1, shz_vec3_t r2, shz_vec3_t r3) SHZ_NOEXCEPT;
447SHZ_FORCE_INLINE
float shz_vec4_dot(shz_vec4_t vec1, shz_vec4_t vec2) SHZ_NOEXCEPT;
450SHZ_FORCE_INLINE shz_vec2_t
shz_vec4_dot2(shz_vec4_t l, shz_vec4_t r1, shz_vec4_t r2) SHZ_NOEXCEPT;
453SHZ_FORCE_INLINE shz_vec3_t
shz_vec4_dot3(shz_vec4_t l, shz_vec4_t r1, shz_vec4_t r2, shz_vec4_t r3) SHZ_NOEXCEPT;
474SHZ_FORCE_INLINE shz_vec2_t
shz_vec2_move(shz_vec2_t vec, shz_vec2_t target,
float max_distance) SHZ_NOEXCEPT;
477SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_move(shz_vec3_t vec, shz_vec3_t target,
float max_distance) SHZ_NOEXCEPT;
480SHZ_FORCE_INLINE shz_vec4_t
shz_vec4_move(shz_vec4_t vec, shz_vec4_t target,
float max_distance) SHZ_NOEXCEPT;
483SHZ_FORCE_INLINE shz_vec2_t
shz_vec2_lerp(shz_vec2_t a, shz_vec2_t b,
float t) SHZ_NOEXCEPT;
486SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_lerp(shz_vec3_t a, shz_vec3_t b,
float t) SHZ_NOEXCEPT;
489SHZ_FORCE_INLINE shz_vec4_t
shz_vec4_lerp(shz_vec4_t a, shz_vec4_t b,
float t) SHZ_NOEXCEPT;
492SHZ_FORCE_INLINE shz_vec2_t
shz_vec2_reflect(shz_vec2_t incidence, shz_vec2_t normal) SHZ_NOEXCEPT;
495SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_reflect(shz_vec3_t incidence, shz_vec3_t normal) SHZ_NOEXCEPT;
498SHZ_FORCE_INLINE shz_vec4_t
shz_vec4_reflect(shz_vec4_t incidence, shz_vec4_t normal) SHZ_NOEXCEPT;
501SHZ_INLINE shz_vec2_t
shz_vec2_refract(shz_vec2_t incidence, shz_vec2_t normal,
float eta) SHZ_NOEXCEPT;
504SHZ_INLINE shz_vec3_t
shz_vec3_refract(shz_vec3_t incidence, shz_vec3_t normal,
float eta) SHZ_NOEXCEPT;
507SHZ_INLINE shz_vec4_t
shz_vec4_refract(shz_vec4_t incidence, shz_vec4_t normal,
float eta) SHZ_NOEXCEPT;
510
511
512
513
514
515
516SHZ_FORCE_INLINE
float shz_vec2_cross(shz_vec2_t vec1, shz_vec2_t vec2) SHZ_NOEXCEPT;
519SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_cross(shz_vec3_t vec1, shz_vec3_t vec2) SHZ_NOEXCEPT;
531
532
533
534
538
539
540
541
545
546
547
548
552SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_reject(shz_vec3_t vec, shz_vec3_t onto) SHZ_NOEXCEPT;
557
558
559
562SHZ_INLINE
float shz_vec3_triple(shz_vec3_t a, shz_vec3_t b, shz_vec3_t c) SHZ_NOEXCEPT;
568SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_barycenter(shz_vec3_t p, shz_vec3_t a, shz_vec3_t b, shz_vec3_t c) SHZ_NOEXCEPT;
574SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_cubic_hermite(shz_vec3_t vec, shz_vec3_t tangent1, shz_vec3_t vec2, shz_vec3_t tangent2,
float amounht) SHZ_NOEXCEPT;
579
580
581
614SHZ_FORCE_INLINE shz_vec2_t
shz_vec2_rotate(shz_vec2_t vec,
float radians) SHZ_NOEXCEPT;
619
620
621
624SHZ_FORCE_INLINE shz_vec3_t
shz_vec2_vec3(shz_vec2_t vec,
float z) SHZ_NOEXCEPT;
627SHZ_FORCE_INLINE shz_vec4_t
shz_vec2_vec4(shz_vec2_t vec,
float z,
float w) SHZ_NOEXCEPT;
630SHZ_FORCE_INLINE shz_vec4_t
shz_vec3_vec4(shz_vec3_t vec,
float w) SHZ_NOEXCEPT;
635
636
637
640 SHZ_FORCE_INLINE shz_vec2_t
shz_vec2_swizzle(shz_vec2_t vec,
unsigned x_idx,
unsigned y_idx) SHZ_NOEXCEPT;
643 SHZ_FORCE_INLINE shz_vec3_t
shz_vec3_swizzle(shz_vec3_t vec,
unsigned x_idx,
unsigned y_idx,
unsigned z_idx) SHZ_NOEXCEPT;
646 SHZ_FORCE_INLINE shz_vec4_t
shz_vec4_swizzle(shz_vec4_t vec,
unsigned x_idx,
unsigned y_idx,
unsigned z_idx,
unsigned w_idx) SHZ_NOEXCEPT;
653
654
655
658#define shz_vec2_deref(ptr) (*((shz_vec2_t*)(ptr)))
661#define shz_vec3_deref(ptr) (*((shz_vec3_t*)(ptr)))
664#define shz_vec4_deref(ptr) (*((shz_vec4_t*)(ptr)))
667#define shz_vec2_from(value) SHZ_CONVERT
(shz_vec2_t, value)
670#define shz_vec3_from(value) SHZ_CONVERT
(shz_vec3_t, value)
673#define shz_vec4_from(value) SHZ_CONVERT
(shz_vec4_t, value)
676#define shz_vec2_to(type, vector) SHZ_CONVERT
(type, vector)
679#define shz_vec3_to(type, vector) SHZ_CONVERT
(type, vector)
682#define shz_vec4_to(type, vector) SHZ_CONVERT
(type, vector)
687
688
689
694# define shz_vec_abs(vec)
696 shz_vec2_t: shz_vec2_abs,
697 shz_vec3_t: shz_vec3_abs,
698 shz_vec4_t: shz_vec4_abs)(vec)
701# define shz_vec_neg(vec)
703 shz_vec2_t: shz_vec2_neg,
704 shz_vec3_t: shz_vec3_neg,
705 shz_vec4_t: shz_vec4_neg)(vec)
708# define shz_vec_inv(vec)
710 shz_vec2_t: shz_vec2_inv,
711 shz_vec3_t: shz_vec3_inv,
712 shz_vec4_t: shz_vec4_inv)(vec)
715# define shz_vec_max(vec)
717 shz_vec2_t: shz_vec2_max,
718 shz_vec3_t: shz_vec3_max,
719 shz_vec4_t: shz_vec4_max)(vec)
722# define shz_vec_min(vec)
724 shz_vec2_t: shz_vec2_min,
725 shz_vec3_t: shz_vec3_min,
726 shz_vec4_t: shz_vec4_min)(vec)
729# define shz_vec_clamp(vec, min, max)
731 shz_vec2_t: shz_vec2_clamp,
732 shz_vec3_t: shz_vec3_clamp,
733 shz_vec4_t: shz_vec4_clamp)(vec, min, max)
736# define shz_vec_equal(vec1, vec2)
738 shz_vec2_t: shz_vec2_equal,
739 shz_vec3_t: shz_vec3_equal,
740 shz_vec4_t: shz_vec4_equal)(vec1, vec2)
743# define shz_vec_add(vec1, vec2)
745 shz_vec2_t: shz_vec2_add,
746 shz_vec3_t: shz_vec3_add,
747 shz_vec4_t: shz_vec4_add)(vec1, vec2)
750# define shz_vec_sub(vec1, vec2)
752 shz_vec2_t: shz_vec2_sub,
753 shz_vec3_t: shz_vec3_sub,
754 shz_vec4_t: shz_vec4_sub)(vec1, vec2)
757# define shz_vec_mul(vec1, vec2)
759 shz_vec2_t: shz_vec2_mul,
760 shz_vec3_t: shz_vec3_mul,
761 shz_vec4_t: shz_vec4_mul)(vec1, vec2)
764# define shz_vec_div(vec1, vec2)
766 shz_vec2_t: shz_vec2_div,
767 shz_vec3_t: shz_vec3_div,
768 shz_vec4_t: shz_vec4_div)(vec1, vec2)
771# define shz_vec_scale(vec, factor)
773 shz_vec2_t: shz_vec2_scale,
774 shz_vec3_t: shz_vec3_scale,
775 shz_vec4_t: shz_vec4_scale)(vec, factor)
778# define shz_vec_dot(vec1, vec2)
780 shz_vec2_t: shz_vec2_dot,
781 shz_vec3_t: shz_vec3_dot,
782 shz_vec4_t: shz_vec4_dot)(vec1, vec2)
785# define shz_vec_dot2(l, r1, r2)
787 shz_vec2_t: shz_vec2_dot2,
788 shz_vec3_t: shz_vec3_dot2,
789 shz_vec4_t: shz_vec4_dot2)(l, r1, r2)
792# define shz_vec_dot3(l, r1, r2, r3)
794 shz_vec2_t: shz_vec2_dot3,
795 shz_vec3_t: shz_vec3_dot3,
796 shz_vec4_t: shz_vec4_dot3)(l, r1, r2, r3)
799# define shz_vec_magnitude_sqr(vec)
801 shz_vec2_t: shz_vec2_magnitude_sqr,
802 shz_vec3_t: shz_vec3_magnitude_sqr,
803 shz_vec4_t: shz_vec4_magnitude_sqr)(vec)
806# define shz_vec_magnitude(vec)
808 shz_vec2_t: shz_vec2_magnitude,
809 shz_vec3_t: shz_vec3_magnitude,
810 shz_vec4_t: shz_vec4_magnitude)(vec)
813# define shz_vec_magnitude_inv(vec)
815 shz_vec2_t: shz_vec2_magnitude_inv,
816 shz_vec3_t: shz_vec3_magnitude_inv,
817 shz_vec4_t: shz_vec4_magnitude_inv)(vec)
820# define shz_vec_normalize(vec)
822 shz_vec2_t: shz_vec2_normalize,
823 shz_vec3_t: shz_vec3_normalize,
824 shz_vec4_t: shz_vec4_normalize)(vec)
827# define shz_vec_normalize_safe(vec)
829 shz_vec2_t: shz_vec2_normalize_safe,
830 shz_vec3_t: shz_vec3_normalize_safe,
831 shz_vec4_t: shz_vec4_normalize_safe)(vec)
834# define shz_vec_distance(vec1, vec2)
836 shz_vec2_t: shz_vec2_distance,
837 shz_vec3_t: shz_vec3_distance,
838 shz_vec4_t: shz_vec4_distance)(vec1, vec2)
841# define shz_vec_move(vec, target, maxdist)
843 shz_vec2_t: shz_vec2_move,
844 shz_vec3_t: shz_vec3_move,
845 shz_vec4_t: shz_vec4_move)(vec, target, maxdist)
848# define shz_vec_distance_sqr(vec1, vec2)
850 shz_vec2_t: shz_vec2_distance_sqr,
851 shz_vec3_t: shz_vec3_distance_sqr,
852 shz_vec4_t: shz_vec4_distance_sqr)(vec1, vec2)
855# define shz_vec_lerp(vec1, vec2, t)
857 shz_vec2_t: shz_vec2_lerp,
858 shz_vec3_t: shz_vec3_lerp,
859 shz_vec4_t: shz_vec4_lerp)(vec1, vec2, t)
862# define shz_vec_reflect(incidence, normal)
863 _Generic((incidence),
864 shz_vec2_t: shz_vec2_reflect,
865 shz_vec3_t: shz_vec3_reflect,
866 shz_vec4_t: shz_vec4_reflect)(incidence, normal)
869# define shz_vec_refract(incidence, normal, eta)
870 _Generic((incidence),
871 shz_vec2_t: shz_vec2_refract,
872 shz_vec3_t: shz_vec3_refract,
873 shz_vec4_t: shz_vec4_refract)(incidence, normal, eta)
876# define shz_vec_cross(vec1, vec2)
878 shz_vec2_t: shz_vec2_cross,
879 shz_vec3_t: shz_vec3_cross)(vec1, vec2)
882# define shz_vec_project(vec1, vec2)
884 shz_vec2_t: shz_vec2_project,
885 shz_vec3_t: shz_vec3_project,
886 shz_vec4_t: shz_vec4_project)(vec1, vec2)
889# define shz_vec_project_safe(vec1, vec2)
891 shz_vec2_t: shz_vec2_project_safe,
892 shz_vec3_t: shz_vec3_project_safe,
893 shz_vec4_t: shz_vec4_project_safe)(vec1, vec2)
896# define shz_vec_angles(vec)
898 shz_vec2_t: shz_vec2_angle,
899 shz_vec3_t: shz_vec3_angles)(vec)
902# define shz_vec_angle_between(vec1, vec2)
904 shz_vec2_t: shz_vec2_angle_between,
905 shz_vec3_t: shz_vec3_angle_between)(vec1, vec2)
908# define shz_vec_swizzle(vec, ...)
910 shz_vec2_t: shz_vec2_swizzle,
911 shz_vec3_t: shz_vec3_swizzle,
912 shz_vec4_t: shz_vec4_swizzle)(vec, __VA_ARGS__)
915# define shz_vec_floor(vec)
917 shz_vec2_t: shz_vec2_floor,
918 shz_vec3_t: shz_vec3_floor,
919 shz_vec4_t: shz_vec4_floor)(vec)
922# define shz_vec_ceil(vec)
924 shz_vec2_t: shz_vec2_ceil,
925 shz_vec3_t: shz_vec3_ceil,
926 shz_vec4_t: shz_vec4_ceil)(vec)
929# define shz_vec_round(vec)
931 shz_vec2_t: shz_vec2_round,
932 shz_vec3_t: shz_vec3_round,
933 shz_vec4_t: shz_vec4_round)(vec)
936# define shz_vec_fract(vec)
938 shz_vec2_t: shz_vec2_fract,
939 shz_vec3_t: shz_vec3_fract,
940 shz_vec4_t: shz_vec4_fract)(vec)
943# define shz_vec_sign(vec)
945 shz_vec2_t: shz_vec2_sign,
946 shz_vec3_t: shz_vec3_sign,
947 shz_vec4_t: shz_vec4_sign)(vec)
950# define shz_vec_saturate(vec)
952 shz_vec2_t: shz_vec2_saturate,
953 shz_vec3_t: shz_vec3_saturate,
954 shz_vec4_t: shz_vec4_saturate)(vec)
957# define shz_vec_minv(a, b)
959 shz_vec2_t: shz_vec2_minv,
960 shz_vec3_t: shz_vec3_minv,
961 shz_vec4_t: shz_vec4_minv)(a, b)
964# define shz_vec_maxv(a, b)
966 shz_vec2_t: shz_vec2_maxv,
967 shz_vec3_t: shz_vec3_maxv,
968 shz_vec4_t: shz_vec4_maxv)(a, b)
971# define shz_vec_stepv(vec, edge)
973 shz_vec2_t: shz_vec2_stepv,
974 shz_vec3_t: shz_vec3_stepv,
975 shz_vec4_t: shz_vec4_stepv)(vec, edge)
978# define shz_vec_step(vec, edge)
980 shz_vec2_t: shz_vec2_step,
981 shz_vec3_t: shz_vec3_step,
982 shz_vec4_t: shz_vec4_step)(vec, edge)
985# define shz_vec_smoothstepv(vec, edge0, edge1)
987 shz_vec2_t: shz_vec2_smoothstepv,
988 shz_vec3_t: shz_vec3_smoothstepv,
989 shz_vec4_t: shz_vec4_smoothstepv)(vec, edge0, edge1)
992# define shz_vec_smoothstep(vec, edge0, edge1)
994 shz_vec2_t: shz_vec2_smoothstep,
995 shz_vec3_t: shz_vec3_smoothstep,
996 shz_vec4_t: shz_vec4_smoothstep)(vec, edge0, edge1)
999# define shz_vec_smoothstepv_safe(vec, edge0, edge1)
1001 shz_vec2_t: shz_vec2_smoothstepv_safe,
1002 shz_vec3_t: shz_vec3_smoothstepv_safe,
1003 shz_vec4_t: shz_vec4_smoothstepv_safe)(vec, edge0, edge1)
1006# define shz_vec_smoothstep_safe(vec, edge0, edge1)
1008 shz_vec2_t: shz_vec2_smoothstep_safe,
1009 shz_vec3_t: shz_vec3_smoothstep_safe,
1010 shz_vec4_t: shz_vec4_smoothstep_safe)(vec, edge0, edge1)
1017 template<
typename T>
1018 SHZ_FORCE_INLINE T shz_vec_abs(T vec) SHZ_NOEXCEPT {
1019 if constexpr(std::convertible_to<T, shz_vec2_t>)
1020 return shz_vec2_abs(vec);
1021 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1022 return shz_vec3_abs(vec);
1023 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1024 return shz_vec4_abs(vec);
1025 else static_assert(
false,
"Incompatible type!");
1029 template<
typename T>
1030 SHZ_FORCE_INLINE T shz_vec_neg(T vec) SHZ_NOEXCEPT {
1031 if constexpr(std::convertible_to<T, shz_vec2_t>)
1032 return shz_vec2_neg(vec);
1033 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1034 return shz_vec3_neg(vec);
1035 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1036 return shz_vec4_neg(vec);
1037 else static_assert(
false,
"Incompatible type!");
1041 template<
typename T>
1042 SHZ_FORCE_INLINE T shz_vec_inv(T vec) SHZ_NOEXCEPT {
1043 if constexpr(std::convertible_to<T, shz_vec2_t>)
1044 return shz_vec2_inv(vec);
1045 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1046 return shz_vec3_inv(vec);
1047 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1048 return shz_vec4_inv(vec);
1049 else static_assert(
false,
"Incompatible type!");
1053 template<
typename T>
1054 SHZ_FORCE_INLINE
float shz_vec_max(T vec) SHZ_NOEXCEPT {
1055 if constexpr(std::convertible_to<T, shz_vec2_t>)
1056 return shz_vec2_max(vec);
1057 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1058 return shz_vec3_max(vec);
1059 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1060 return shz_vec4_max(vec);
1061 else static_assert(
false,
"Incompatible type!");
1065 template<
typename T>
1066 SHZ_FORCE_INLINE
float shz_vec_min(T vec) SHZ_NOEXCEPT {
1067 if constexpr(std::convertible_to<T, shz_vec2_t>)
1068 return shz_vec2_min(vec);
1069 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1070 return shz_vec3_min(vec);
1071 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1072 return shz_vec4_min(vec);
1073 else static_assert(
false,
"Incompatible type!");
1077 template<
typename T>
1078 SHZ_FORCE_INLINE T shz_vec_clamp(T vec,
float min,
float max) SHZ_NOEXCEPT {
1079 if constexpr(std::convertible_to<T, shz_vec2_t>)
1080 return shz_vec2_clamp(vec, min, max);
1081 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1082 return shz_vec3_clamp(vec, min, max);
1083 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1084 return shz_vec4_clamp(vec, min, max);
1085 else static_assert(
false,
"Incompatible type!");
1089 template<
typename T>
1090 SHZ_FORCE_INLINE
bool shz_vec_equal(T vec1, T vec2) SHZ_NOEXCEPT {
1091 if constexpr(std::convertible_to<T, shz_vec2_t>)
1092 return shz_vec2_equal(vec1, vec2);
1093 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1094 return shz_vec3_equal(vec1, vec2);
1095 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1096 return shz_vec4_equal(vec1, vec2);
1097 else static_assert(
false,
"Incompatible type!");
1101 template<
typename T>
1102 SHZ_FORCE_INLINE T shz_vec_add(T vec1, T vec2) SHZ_NOEXCEPT {
1103 if constexpr(std::convertible_to<T, shz_vec2_t>)
1104 return shz_vec2_add(vec1, vec2);
1105 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1106 return shz_vec3_add(vec1, vec2);
1107 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1108 return shz_vec4_add(vec1, vec2);
1109 else static_assert(
false,
"Incompatible type!");
1113 template<
typename T>
1114 SHZ_FORCE_INLINE T shz_vec_sub(T vec1, T vec2) SHZ_NOEXCEPT {
1115 if constexpr(std::convertible_to<T, shz_vec2_t>)
1116 return shz_vec2_sub(vec1, vec2);
1117 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1118 return shz_vec3_sub(vec1, vec2);
1119 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1120 return shz_vec4_sub(vec1, vec2);
1121 else static_assert(
false,
"Incompatible type!");
1125 template<
typename T>
1126 SHZ_FORCE_INLINE T shz_vec_mul(T vec1, T vec2) SHZ_NOEXCEPT {
1127 if constexpr(std::convertible_to<T, shz_vec2_t>)
1128 return shz_vec2_mul(vec1, vec2);
1129 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1130 return shz_vec3_mul(vec1, vec2);
1131 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1132 return shz_vec4_mul(vec1, vec2);
1133 else static_assert(
false,
"Incompatible type!");
1137 template<
typename T>
1138 SHZ_FORCE_INLINE T shz_vec_div(T vec1, T vec2) SHZ_NOEXCEPT {
1139 if constexpr(std::convertible_to<T, shz_vec2_t>)
1140 return shz_vec2_div(vec1, vec2);
1141 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1142 return shz_vec3_div(vec1, vec2);
1143 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1144 return shz_vec4_div(vec1, vec2);
1145 else static_assert(
false,
"Incompatible type!");
1149 template<
typename T>
1150 SHZ_FORCE_INLINE T shz_vec_scale(T vec,
float factor) SHZ_NOEXCEPT {
1151 if constexpr(std::convertible_to<T, shz_vec2_t>)
1152 return shz_vec2_scale(vec, factor);
1153 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1154 return shz_vec3_scale(vec, factor);
1155 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1156 return shz_vec4_scale(vec, factor);
1157 else static_assert(
false,
"Incompatible type!");
1161 template<
typename T>
1162 SHZ_FORCE_INLINE
float shz_vec_dot(T vec1, T vec2) SHZ_NOEXCEPT {
1163 if constexpr(std::convertible_to<T, shz_vec2_t>)
1164 return shz_vec2_dot(vec1, vec2);
1165 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1166 return shz_vec3_dot(vec1, vec2);
1167 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1168 return shz_vec4_dot(vec1, vec2);
1169 else static_assert(
false,
"Incompatible type!");
1173 template<
typename T>
1174 SHZ_FORCE_INLINE shz_vec2_t shz_vec_dot2(T l, T r1, T r2) SHZ_NOEXCEPT {
1175 if constexpr(std::convertible_to<T, shz_vec2_t>)
1176 return shz_vec2_dot2(l, r1, r2);
1177 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1178 return shz_vec3_dot2(l, r1, r2);
1179 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1180 return shz_vec4_dot2(l, r1, r2);
1181 else static_assert(
false,
"Incompatible type!");
1185 template<
typename T>
1186 SHZ_FORCE_INLINE shz_vec3_t shz_vec_dot3(T l, T r1, T r2, T r3) SHZ_NOEXCEPT {
1187 if constexpr(std::convertible_to<T, shz_vec2_t>)
1188 return shz_vec2_dot3(l, r1, r2, r3);
1189 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1190 return shz_vec3_dot3(l, r1, r2, r3);
1191 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1192 return shz_vec4_dot3(l, r1, r2, r3);
1193 else static_assert(
false,
"Incompatible type!");
1197 SHZ_FORCE_INLINE
float shz_vec_magnitude_sqr(
auto vec) SHZ_NOEXCEPT {
1198 using T =
decltype(vec);
1199 if constexpr(std::convertible_to<T, shz_vec2_t>)
1200 return shz_vec2_magnitude_sqr(vec);
1201 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1202 return shz_vec3_magnitude_sqr(vec);
1203 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1204 return shz_vec4_magnitude_sqr(vec);
1205 else static_assert(
false,
"Incompatible type!");
1209 SHZ_FORCE_INLINE
float shz_vec_magnitude(
auto vec) SHZ_NOEXCEPT {
1210 using T =
decltype(vec);
1211 if constexpr(std::convertible_to<T, shz_vec2_t>)
1212 return shz_vec2_magnitude(vec);
1213 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1214 return shz_vec3_magnitude(vec);
1215 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1216 return shz_vec4_magnitude(vec);
1217 else static_assert(
false,
"Incompatible type!");
1221 SHZ_FORCE_INLINE
float shz_vec_magnitude_inv(
auto vec) SHZ_NOEXCEPT {
1222 using T =
decltype(vec);
1223 if constexpr(std::convertible_to<T, shz_vec2_t>)
1224 return shz_vec2_magnitude_inv(vec);
1225 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1226 return shz_vec3_magnitude_inv(vec);
1227 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1228 return shz_vec4_magnitude_inv(vec);
1229 else static_assert(
false,
"Incompatible type!");
1233 template<
typename T>
1234 SHZ_FORCE_INLINE T shz_vec_normalize(T vec) SHZ_NOEXCEPT {
1235 if constexpr(std::convertible_to<T, shz_vec2_t>)
1236 return shz_vec2_normalize(vec);
1237 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1238 return shz_vec3_normalize(vec);
1239 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1240 return shz_vec4_normalize(vec);
1241 else static_assert(
false,
"Incompatible type!");
1245 template<
typename T>
1246 SHZ_FORCE_INLINE T shz_vec_normalize_safe(T vec) SHZ_NOEXCEPT {
1247 if constexpr(std::convertible_to<T, shz_vec2_t>)
1248 return shz_vec2_normalize_safe(vec);
1249 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1250 return shz_vec3_normalize_safe(vec);
1251 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1252 return shz_vec4_normalize_safe(vec);
1253 else static_assert(
false,
"Incompatible type!");
1257 template<
typename T>
1258 SHZ_FORCE_INLINE
float shz_vec_distance(T vec1, T vec2) SHZ_NOEXCEPT {
1259 if constexpr(std::convertible_to<T, shz_vec2_t>)
1260 return shz_vec2_distance(vec1, vec2);
1261 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1262 return shz_vec3_distance(vec1, vec2);
1263 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1264 return shz_vec4_distance(vec1, vec2);
1265 else static_assert(
false,
"Incompatible type!");
1269 template<
typename T>
1270 SHZ_FORCE_INLINE
float shz_vec_distance_sqr(T vec1, T vec2) SHZ_NOEXCEPT {
1271 if constexpr(std::convertible_to<T, shz_vec2_t>)
1272 return shz_vec2_distance_sqr(vec1, vec2);
1273 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1274 return shz_vec3_distance_sqr(vec1, vec2);
1275 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1276 return shz_vec4_distance_sqr(vec1, vec2);
1277 else static_assert(
false,
"Incompatible type!");
1281 template<
typename T>
1282 SHZ_FORCE_INLINE T shz_vec_move(T vec, T target,
float maxdist) SHZ_NOEXCEPT {
1283 if constexpr(std::convertible_to<T, shz_vec2_t>)
1284 return shz_vec2_move(vec, target, maxdist);
1285 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1286 return shz_vec3_move(vec, target, maxdist);
1287 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1288 return shz_vec4_move(vec, target, maxdist);
1289 else static_assert(
false,
"Incompatible type!");
1293 template<
typename T>
1294 SHZ_FORCE_INLINE T shz_vec_lerp(T vec1, T vec2,
float t) SHZ_NOEXCEPT {
1295 if constexpr(std::convertible_to<T, shz_vec2_t>)
1296 return shz_vec2_lerp(vec1, vec2, t);
1297 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1298 return shz_vec3_lerp(vec1, vec2, t);
1299 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1300 return shz_vec4_lerp(vec1, vec2, t);
1301 else static_assert(
false,
"Incompatible type!");
1305 template<
typename T>
1306 SHZ_FORCE_INLINE T shz_vec_reflect(T incidence, T normal) SHZ_NOEXCEPT {
1307 if constexpr(std::convertible_to<T, shz_vec2_t>)
1308 return shz_vec2_reflect(incidence, normal);
1309 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1310 return shz_vec3_reflect(incidence, normal);
1311 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1312 return shz_vec4_reflect(incidence, normal);
1313 else static_assert(
false,
"Incompatible type!");
1317 template<
typename T>
1318 SHZ_FORCE_INLINE T shz_vec_refract(T incidence, T normal,
float eta) SHZ_NOEXCEPT {
1319 if constexpr(std::convertible_to<T, shz_vec2_t>)
1320 return shz_vec2_refract(incidence, normal, eta);
1321 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1322 return shz_vec3_refract(incidence, normal, eta);
1323 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1324 return shz_vec4_refract(incidence, normal, eta);
1325 else static_assert(
false,
"Incompatible type!");
1329 template<
typename T>
1330 SHZ_FORCE_INLINE
auto shz_vec_cross(T vec1, T vec2) SHZ_NOEXCEPT {
1331 if constexpr(std::convertible_to<T, shz_vec2_t>)
1332 return shz_vec2_cross(vec1, vec2);
1333 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1334 return shz_vec3_cross(vec1, vec2);
1335 else static_assert(
false,
"Incompatible type!");
1339 template<
typename T>
1340 SHZ_FORCE_INLINE T shz_vec_project(T vec1, T vec2) SHZ_NOEXCEPT {
1341 if constexpr(std::convertible_to<T, shz_vec2_t>)
1342 return shz_vec2_project(vec1, vec2);
1343 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1344 return shz_vec3_project(vec1, vec2);
1345 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1346 return shz_vec4_project(vec1, vec2);
1347 else static_assert(
false,
"Incompatible type!");
1351 template<
typename T>
1352 SHZ_FORCE_INLINE T shz_vec_project_safe(T vec1, T vec2) SHZ_NOEXCEPT {
1353 if constexpr(std::convertible_to<T, shz_vec2_t>)
1354 return shz_vec2_project_safe(vec1, vec2);
1355 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1356 return shz_vec3_project_safe(vec1, vec2);
1357 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1358 return shz_vec4_project_safe(vec1, vec2);
1359 else static_assert(
false,
"Incompatible type!");
1363 SHZ_FORCE_INLINE
auto shz_vec_angles(
auto vec) SHZ_NOEXCEPT {
1364 using T =
decltype(vec);
1365 if constexpr(std::convertible_to<T, shz_vec2_t>)
1366 return shz_vec2_angle(vec);
1367 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1368 return shz_vec3_angles(vec);
1369 else static_assert(
false,
"Incompatible type!");
1373 template<
typename T>
1374 SHZ_FORCE_INLINE
float shz_vec_angle_between(T vec1, T vec2) SHZ_NOEXCEPT {
1375 if constexpr(std::convertible_to<T, shz_vec2_t>)
1376 return shz_vec2_angle_between(vec1, vec2);
1377 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1378 return shz_vec3_angle_between(vec1, vec2);
1379 else static_assert(
false,
"Incompatible type!");
1383 SHZ_FORCE_INLINE shz_vec2_t shz_vec_swizzle(shz_vec2_t vec,
unsigned x_idx,
unsigned y_idx) SHZ_NOEXCEPT {
1388 SHZ_FORCE_INLINE shz_vec3_t shz_vec_swizzle(shz_vec3_t vec,
unsigned x_idx,
unsigned y_idx,
unsigned z_idx) SHZ_NOEXCEPT {
1393 SHZ_FORCE_INLINE shz_vec4_t shz_vec_swizzle(shz_vec4_t vec,
unsigned x_idx,
unsigned y_idx,
unsigned z_idx,
unsigned w_idx) SHZ_NOEXCEPT {
1398 template<
typename T>
1399 SHZ_FORCE_INLINE T shz_vec_floor(T vec) SHZ_NOEXCEPT {
1400 if constexpr(std::convertible_to<T, shz_vec2_t>)
1401 return shz_vec2_floor(vec);
1402 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1403 return shz_vec3_floor(vec);
1404 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1405 return shz_vec4_floor(vec);
1406 else static_assert(
false,
"Incompatible type!");
1410 template<
typename T>
1411 SHZ_FORCE_INLINE T shz_vec_ceil(T vec) SHZ_NOEXCEPT {
1412 if constexpr(std::convertible_to<T, shz_vec2_t>)
1413 return shz_vec2_ceil(vec);
1414 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1415 return shz_vec3_ceil(vec);
1416 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1417 return shz_vec4_ceil(vec);
1418 else static_assert(
false,
"Incompatible type!");
1422 template<
typename T>
1423 SHZ_FORCE_INLINE T shz_vec_round(T vec) SHZ_NOEXCEPT {
1424 if constexpr(std::convertible_to<T, shz_vec2_t>)
1425 return shz_vec2_round(vec);
1426 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1427 return shz_vec3_round(vec);
1428 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1429 return shz_vec4_round(vec);
1430 else static_assert(
false,
"Incompatible type!");
1434 template<
typename T>
1435 SHZ_FORCE_INLINE T shz_vec_fract(T vec) SHZ_NOEXCEPT {
1436 if constexpr(std::convertible_to<T, shz_vec2_t>)
1437 return shz_vec2_fract(vec);
1438 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1439 return shz_vec3_fract(vec);
1440 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1441 return shz_vec4_fract(vec);
1442 else static_assert(
false,
"Incompatible type!");
1446 template<
typename T>
1447 SHZ_FORCE_INLINE T shz_vec_sign(T vec) SHZ_NOEXCEPT {
1448 if constexpr(std::convertible_to<T, shz_vec2_t>)
1449 return shz_vec2_sign(vec);
1450 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1451 return shz_vec3_sign(vec);
1452 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1453 return shz_vec4_sign(vec);
1454 else static_assert(
false,
"Incompatible type!");
1458 template<
typename T>
1459 SHZ_FORCE_INLINE T shz_vec_saturate(T vec) SHZ_NOEXCEPT {
1460 if constexpr(std::convertible_to<T, shz_vec2_t>)
1461 return shz_vec2_saturate(vec);
1462 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1463 return shz_vec3_saturate(vec);
1464 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1465 return shz_vec4_saturate(vec);
1466 else static_assert(
false,
"Incompatible type!");
1470 template<
typename T>
1471 SHZ_FORCE_INLINE T shz_vec_minv(T a, T b) SHZ_NOEXCEPT {
1472 if constexpr(std::convertible_to<T, shz_vec2_t>)
1473 return shz_vec2_minv(a, b);
1474 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1475 return shz_vec3_minv(a, b);
1476 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1477 return shz_vec4_minv(a, b);
1478 else static_assert(
false,
"Incompatible type!");
1482 template<
typename T>
1483 SHZ_FORCE_INLINE T shz_vec_maxv(T a, T b) SHZ_NOEXCEPT {
1484 if constexpr(std::convertible_to<T, shz_vec2_t>)
1485 return shz_vec2_maxv(a, b);
1486 else if constexpr(std::convertible_to<T, shz_vec3_t>)
1487 return shz_vec3_maxv(a, b);
1488 else if constexpr(std::convertible_to<T, shz_vec4_t>)
1489 return shz_vec4_maxv(a, b);
1490 else static_assert(
false,
"Incompatible type!");
1494 template<
typename V,
typename T>
1495 SHZ_FORCE_INLINE V shz_vec_step(V vec, T edge) SHZ_NOEXCEPT {
1496 constexpr bool scalar = std::is_same_v<T,
float>;
1497 constexpr bool vector = std::is_same_v<T, V>;
1499 static_assert(scalar || vector,
"Incompatible type!");
1501 if constexpr(std::convertible_to<V, shz_vec2_t>) {
1502 if constexpr(scalar)
1503 return shz_vec2_step(vec, edge);
1505 return shz_vec2_stepv(vec, edge);
1506 }
else if constexpr(std::convertible_to<V, shz_vec3_t>) {
1507 if constexpr(scalar)
1508 return shz_vec3_step(vec, edge);
1510 return shz_vec3_stepv(vec, edge);
1511 }
else if constexpr(std::convertible_to<V, shz_vec4_t>) {
1512 if constexpr(scalar)
1513 return shz_vec4_step(vec, edge);
1515 return shz_vec4_stepv(vec, edge);
1516 }
else static_assert(
false,
"Incompatible type!");
1520 template<
typename V,
typename T>
1521 SHZ_FORCE_INLINE V shz_vec_smoothstep(V vec, T edge0, T edge1) SHZ_NOEXCEPT {
1522 constexpr bool scalar = std::is_same_v<T,
float>;
1523 constexpr bool vector = std::is_same_v<T, V>;
1525 static_assert(scalar || vector,
"Incompatible type!");
1527 if constexpr (std::convertible_to<V, shz_vec2_t>) {
1528 if constexpr (scalar)
1529 return shz_vec2_smoothstep(vec, edge0, edge1);
1531 return shz_vec2_smoothstepv(vec, edge0, edge1);
1532 }
else if constexpr (std::convertible_to<V, shz_vec3_t>) {
1533 if constexpr (scalar)
1534 return shz_vec3_smoothstep(vec, edge0, edge1);
1536 return shz_vec3_smoothstepv(vec, edge0, edge1);
1537 }
else if constexpr (std::convertible_to<V, shz_vec4_t>) {
1538 if constexpr (scalar)
1539 return shz_vec4_smoothstep(vec, edge0, edge1);
1541 return shz_vec4_smoothstepv(vec, edge0, edge1);
1542 }
else static_assert(
false,
"Incompatible type!");
1546 template<
typename V,
typename T>
1547 SHZ_FORCE_INLINE V shz_vec_smoothstep_safe(V vec, T edge0, T edge1) SHZ_NOEXCEPT {
1548 constexpr bool scalar = std::is_same_v<T,
float>;
1549 constexpr bool vector = std::is_same_v<T, V>;
1551 static_assert(scalar || vector,
"Incompatible type!");
1553 if constexpr (std::convertible_to<V, shz_vec2_t>) {
1554 if constexpr (scalar)
1555 return shz_vec2_smoothstep_safe(vec, edge0, edge1);
1557 return shz_vec2_smoothstepv_safe(vec, edge0, edge1);
1558 }
else if constexpr (std::convertible_to<V, shz_vec3_t>) {
1559 if constexpr (scalar)
1560 return shz_vec3_smoothstep_safe(vec, edge0, edge1);
1562 return shz_vec3_smoothstepv_safe(vec, edge0, edge1);
1563 }
else if constexpr (std::convertible_to<V, shz_vec4_t>) {
1564 if constexpr (scalar)
1565 return shz_vec4_smoothstep_safe(vec, edge0, edge1);
1567 return shz_vec4_smoothstepv_safe(vec, edge0, edge1);
1568 }
else static_assert(
false,
"Incompatible type!");
1573#include "inline/shz_vector.inl.h"
float shz_vec3_magnitude(shz_vec3_t vec) SHZ_NOEXCEPT
Returns the magnitude of the given 3D vector.
shz_vec4_t shz_vec4_sign(shz_vec4_t vec) SHZ_NOEXCEPT
Returns a 4D vector whose components are the signs (-1, 0, or 1) of the given vector's components.
shz_vec3_t shz_vec3_mul(shz_vec3_t vec1, shz_vec3_t vec2) SHZ_NOEXCEPT
Returns a 3D vector whose component values are those of vec1 times vec2.
shz_vec4_t shz_vec4_minv(shz_vec4_t a, shz_vec4_t b) SHZ_NOEXCEPT
Returns a 4D vector whose components are the pairwise minimums of the two given vectors' components.
shz_vec3_t shz_vec3_project_safe(shz_vec3_t vec, shz_vec3_t onto) SHZ_NOEXCEPT
Returns the resulting vector from projecting the given 3D vector along the given (unit) axis.
shz_vec4_t shz_vec4_sub(shz_vec4_t vec1, shz_vec4_t vec2) SHZ_NOEXCEPT
Returns a 4D vector whose components are equal to the values of vec1 minus vec2.
bool shz_vec4_equal(shz_vec4_t a, shz_vec4_t b) SHZ_NOEXCEPT
Returns true if the values of each element within the two 4D vectors are approximately equal based on...
shz_vec3_t shz_vec3_angles(shz_vec3_t vec) SHZ_NOEXCEPT
Returns the angles formed between the positive X axis and the given 3D vector, in radians.
shz_vec3_t shz_vec3_smoothstep(shz_vec3_t vec, float edge0, float edge1) SHZ_NOEXCEPT
For each component: returns 0.0f at/below edge0, 1.0f at/above edge1, smoothly varying in-between.
shz_vec2_t shz_vec2_saturate(shz_vec2_t vec) SHZ_NOEXCEPT
Returns a 2D vector whose components are saturated (clamped to [0, 1]) values of the given vector's c...
shz_vec2_t shz_vec2_from_angle(float radians) SHZ_NOEXCEPT
Returns the 2D unit vector representing a rotation from the positive X axis in radians.
shz_vec3_t shz_vec2_vec3(shz_vec2_t vec, float z) SHZ_NOEXCEPT
Extends a 2D vector to 3D, using z as the value of the Z component.
shz_vec3_t shz_vec3_cross(shz_vec3_t vec1, shz_vec3_t vec2) SHZ_NOEXCEPT
Returns the vector produced by taking the cross-product of the two given 3D vectors.
shz_vec2_t shz_vec2_div(shz_vec2_t vec1, shz_vec2_t vec2) SHZ_NOEXCEPT
Returns a 2D vector whose component values are those of vec1 divided by vec2.
float shz_vec3_dot(shz_vec3_t vec1, shz_vec3_t vec2) SHZ_NOEXCEPT
Returns the dot product between the two given 3D vectors.
shz_vec4_t shz_vec4_init(float x, float y, float z, float w) SHZ_NOEXCEPT
Returns a 4D vector with the given x, y, z, and w coordinates.
shz_vec3_t shz_vec3
Alternate typedef for the shz_vec3 struct for those who hate POSIX-style.
shz_vec3_t shz_vec3_saturate(shz_vec3_t vec) SHZ_NOEXCEPT
Returns a 3D vector whose components are saturated (clamped to [0, 1]) values of the given vector's c...
shz_vec3_t shz_vec3_sub(shz_vec3_t vec1, shz_vec3_t vec2) SHZ_NOEXCEPT
Returns a 3D vector whose components are equal to the values of vec1 minus vec2.
shz_vec2_t shz_vec2_smoothstepv(shz_vec2_t vec, shz_vec2_t edge0, shz_vec2_t edge1) SHZ_NOEXCEPT
For each component: returns 0.0f at/below edge0[i], 1.0f at/above edge1[i], smoothly varying in-betwe...
float shz_vec3_magnitude_sqr(shz_vec3_t vec) SHZ_NOEXCEPT
Returns the squared magnitude of the given 3D vector.
shz_vec4_t shz_vec4_floor(shz_vec4_t vec) SHZ_NOEXCEPT
Returns a 4D vector whose components are the floor of the given vector's components.
shz_vec2_t shz_vec2_abs(shz_vec2_t vec) SHZ_NOEXCEPT
Returns a 2D vector whose components are the absolute values of the given vector's components.
float shz_vec2_min(shz_vec2_t vec) SHZ_NOEXCEPT
Retuns the minimum value of both of the given vector's components.
float shz_vec4_min(shz_vec4_t vec) SHZ_NOEXCEPT
Returns the minimum value of the given vector's 4 components.
shz_vec2_t shz_vec2_normalize_safe(shz_vec2_t vec) SHZ_NOEXCEPT
SAFELY returns a normalized unit vector from the given 2D vector.
shz_vec3_t shz_vec3_fill(float v) SHZ_NOEXCEPT
Returns a 3D vector with the value of each compoonent equal to v.
shz_vec2_t shz_vec4_dot2(shz_vec4_t l, shz_vec4_t r1, shz_vec4_t r2) SHZ_NOEXCEPT
Returns the two dot products taken between the 4D vector l and 4D vectors r1 and r2.
shz_vec2_t shz_vec2_add(shz_vec2_t vec1, shz_vec2_t vec2) SHZ_NOEXCEPT
Returns a 2D vector whose components are the sums of the given vectors' components.
shz_vec4_t shz_vec4_round(shz_vec4_t vec) SHZ_NOEXCEPT
Returns a 4D vector whose components are the rounded values of the given vector's components.
shz_vec3_t shz_vec3_dot3(shz_vec3_t l, shz_vec3_t r1, shz_vec3_t r2, shz_vec3_t r3) SHZ_NOEXCEPT
Returns the three dot products taken between the 3D vector l and 3D vectors r1, r2,...
shz_vec4_t shz_vec4_stepv(shz_vec4_t vec, shz_vec4_t edge) SHZ_NOEXCEPT
For each component: returns 0.0f if vec[i] < edge[i], otherwise 1.0f.
shz_vec2_t shz_vec3_dot2(shz_vec3_t l, shz_vec3_t r1, shz_vec3_t r2) SHZ_NOEXCEPT
Returns the two dot products taken between the 3D vector l and 3D vectors r1 and r2.
shz_vec2_t shz_vec2_rotate(shz_vec2_t vec, float radians) SHZ_NOEXCEPT
Rotates the given 2D vector about the Z axis by the given angle in radians.
shz_vec4_t shz_vec4_maxv(shz_vec4_t a, shz_vec4_t b) SHZ_NOEXCEPT
Returns a 4D vector whose components are the pairwise maximums of the two given vectors' components.
shz_vec3_t shz_vec3_normalize_safe(shz_vec3_t vec) SHZ_NOEXCEPT
SAFELY returns a normalized unit vector from the given 3D vector.
shz_vec4_t shz_vec4_swizzle(shz_vec4_t vec, unsigned x_idx, unsigned y_idx, unsigned z_idx, unsigned w_idx) SHZ_NOEXCEPT
Returns a new 2D vector whose elements are equal to the source vector's values at the given indices.
float shz_vec3_distance_sqr(shz_vec3_t vec1, shz_vec3_t vec2) SHZ_NOEXCEPT
Returns the squared-distance between the two given 3D vectors.
shz_vec4_t shz_vec4_smoothstepv(shz_vec4_t vec, shz_vec4_t edge0, shz_vec4_t edge1) SHZ_NOEXCEPT
For each component i: returns 0.0f at/below edge0[i], 1.0f at/above edge1[i], smoothly varying in-bet...
shz_vec2_t shz_vec2_from_angle_deg(float degrees) SHZ_NOEXCEPT
Returns the 2D unit vector representing a rotation from the positive X axis in degrees.
shz_vec4_t shz_vec4_smoothstep(shz_vec4_t vec, float edge0, float edge1) SHZ_NOEXCEPT
For each component: returns 0.0f at/below edge0, 1.0f at/above edge1, smoothly varying in-between.
shz_vec3_t shz_vec3_round(shz_vec3_t vec) SHZ_NOEXCEPT
Returns a 3D vector whose components are the rounded values of the given vector's components.
float shz_vec4_max(shz_vec4_t vec) SHZ_NOEXCEPT
Returns the maximum value of the given vector's 4 componetns.
shz_vec2_t shz_vec2_neg(shz_vec2_t vec) SHZ_NOEXCEPT
Returns a 2D vector whose components are the negative values of the given vector's components.
shz_vec3_t shz_vec4_dot3(shz_vec4_t l, shz_vec4_t r1, shz_vec4_t r2, shz_vec4_t r3) SHZ_NOEXCEPT
Returns the three dot products taken between the 4D vector l and 4D vectors r1, r2,...
shz_vec4_t shz_vec4_refract(shz_vec4_t incidence, shz_vec4_t normal, float eta) SHZ_NOEXCEPT
Refracts the given 4D incidence vector against a surface with the given normal using the given refrac...
float shz_vec3_distance(shz_vec3_t vec1, shz_vec3_t vec2) SHZ_NOEXCEPT
Returns the distance between the two given 3D vectors.
float shz_vec4_magnitude(shz_vec4_t vec) SHZ_NOEXCEPT
Returns the magnitude of the given 4D vector.
shz_vec2_t shz_vec2_from_sincos(shz_sincos_t sincos) SHZ_NOEXCEPT
Returns the 2D unit vector representing a rotation from the positive X axis.
shz_vec4_t shz_vec4_mul(shz_vec4_t vec1, shz_vec4_t vec2) SHZ_NOEXCEPT
Returns a 4D vector whose component values are those of vec1 times vec2.
shz_vec3_t shz_vec3_floor(shz_vec3_t vec) SHZ_NOEXCEPT
Returns a 3D vector whose components are the floor of the given vector's components.
shz_vec3_t shz_vec3_neg(shz_vec3_t vec) SHZ_NOEXCEPT
Returns a 3D vector whose components are the negative values of the given vector's components.
shz_vec3_t shz_vec3_normalize(shz_vec3_t vec) SHZ_NOEXCEPT
Returns a normalized unit vector from the given 3D vector.
float shz_vec4_dot(shz_vec4_t vec1, shz_vec4_t vec2) SHZ_NOEXCEPT
Returns the dot product between the two given 4D vectors.
shz_vec3_t shz_vec3_maxv(shz_vec3_t a, shz_vec3_t b) SHZ_NOEXCEPT
Returns a 3D vector whose components are the pairwise maximums of the two given vectors' components.
shz_vec4_t shz_vec4_step(shz_vec4_t vec, float edge) SHZ_NOEXCEPT
For each component: returns 0.0f if vec[i] < edge, otherwise 1.0f.
shz_vec3_t shz_vec3_swizzle(shz_vec3_t vec, unsigned x_idx, unsigned y_idx, unsigned z_idx) SHZ_NOEXCEPT
Returns a 3D vector whose elements are equal to the source vector's values at the given indices.
float shz_vec4_distance(shz_vec4_t vec1, shz_vec4_t vec2) SHZ_NOEXCEPT
Returns the distance between the two given 4D vectors.
shz_vec4_t shz_vec4_abs(shz_vec4_t vec) SHZ_NOEXCEPT
Returns a 4D vector whose components are the absolute values of the given vector's components.
shz_vec2_t shz_vec2_scale(shz_vec2_t vec, float factor) SHZ_NOEXCEPT
Returns a 2D vector whose component values are those of the given vector multiplied by a factor.
float shz_vec2_angle(shz_vec2_t vec) SHZ_NOEXCEPT
Returns the angle formed between the positive X axis and the given 2D vector, in radians.
float shz_vec2_max(shz_vec2_t vec) SHZ_NOEXCEPT
Returns the maximum value of both of the given vector's components.
shz_vec4_t shz_vec4_normalize_safe(shz_vec4_t vec) SHZ_NOEXCEPT
SAFELY returns a normalized unit vector from the given 4D vector.
shz_vec3_t shz_vec3_from_angles_deg(float azimuth, float elevation) SHZ_NOEXCEPT
Returns the 3D unit vector representing the given rotation angles relative to the positive X axis in ...
shz_vec2_t shz_vec2_round(shz_vec2_t vec) SHZ_NOEXCEPT
Returns a 2D vector whose components are the rounded values of the given vector's components.
shz_vec3_t shz_vec3_add(shz_vec3_t vec1, shz_vec3_t vec2) SHZ_NOEXCEPT
Returns a 3D vector whose components are the sums of the given vectors' components.
shz_vec3_t shz_vec3_smoothstepv(shz_vec3_t vec, shz_vec3_t edge0, shz_vec3_t edge1) SHZ_NOEXCEPT
For each component i: returns 0.0f at/below edge0[i], 1.0f at/above edge1[i], smoothly varying in-bet...
shz_vec2_t shz_vec2_fract(shz_vec2_t vec) SHZ_NOEXCEPT
Returns a 2D vector whose components are the fractional parts of the given vector's components.
shz_vec2_t shz_vec2_maxv(shz_vec2_t a, shz_vec2_t b) SHZ_NOEXCEPT
Returns a 2D vector whose components are the pairwise maximums of the two given vectors' components.
shz_vec2_t shz_vec2_move(shz_vec2_t vec, shz_vec2_t target, float max_distance) SHZ_NOEXCEPT
Returns the given 2D vector, translated towards the target by the given max_distance.
shz_vec2_t shz_vec2_inv(shz_vec2_t vec) SHZ_NOEXCEPT
Returns the 4D vector whose components have been inverted or reciprocated.
shz_vec4_t shz_vec4_inv(shz_vec4_t vec) SHZ_NOEXCEPT
Returns the 4D vector whose components have been inverted or reciprocated.
shz_vec3_t shz_vec3_barycenter(shz_vec3_t p, shz_vec3_t a, shz_vec3_t b, shz_vec3_t c) SHZ_NOEXCEPT
Computes barycentric coordinates <u, v, w> for point p, within the plane of the triangle with vertice...
shz_vec2_t shz_vec2_clamp(shz_vec2_t vec, float min, float max) SHZ_NOEXCEPT
Clamps the values of the given 2D vec between min and max, returning a new vector.
shz_vec4_t shz_vec4_saturate(shz_vec4_t vec) SHZ_NOEXCEPT
Returns a 4D vector whose components are saturated (clamped to [0, 1]) values of the given vector's c...
shz_vec2_t shz_vec2_step(shz_vec2_t vec, float edge) SHZ_NOEXCEPT
For each component: returns 0.0f if vec[i] < edge, otherwise 1.0f.
shz_vec2_t shz_vec2_floor(shz_vec2_t vec) SHZ_NOEXCEPT
Returns a 2D vector whose components are the floor of the given vector's components.
float shz_vec2_angle_between(shz_vec2_t vec1, shz_vec2_t vec2) SHZ_NOEXCEPT
Returns the angle formed between the given 2D vectors in radians.
shz_vec4_t shz_vec4_div(shz_vec4_t vec1, shz_vec4_t vec2) SHZ_NOEXCEPT
Returns a 4D vector whose component values are those of vec1 divided by vec2.
shz_vec2_t shz_vec2_project_safe(shz_vec2_t vec, shz_vec2_t onto) SHZ_NOEXCEPT
Returns the resulting vector from projecting the given 2D vector along the given (unit) axis.
shz_vec2_t shz_vec2_normalize(shz_vec2_t vec) SHZ_NOEXCEPT
Returns a normalized unit vector from the given 2D vector.
shz_vec4_t shz_vec4_lerp(shz_vec4_t a, shz_vec4_t b, float t) SHZ_NOEXCEPT
Returns a 4D vector that is linearly interpolated from a to b by the given 0.0f-1....
shz_vec4_t shz_vec4_project_safe(shz_vec4_t vec, shz_vec4_t onto) SHZ_NOEXCEPT
Returns the resulting vector from projecting the given 4D vector along the given (unit) axis.
shz_vec4_t shz_vec4_move(shz_vec4_t vec, shz_vec4_t target, float max_distance) SHZ_NOEXCEPT
Returns the given 4D vector, translated towards the target by the given max_distance.
shz_vec4_t shz_vec4_fract(shz_vec4_t vec) SHZ_NOEXCEPT
Returns a 4D vector whose components are the fractional parts of the given vector's components.
shz_vec2_t shz_vec2_fill(float v) SHZ_NOEXCEPT
Returns a 2D vector with the value of each component equal to v.
float shz_vec3_magnitude_inv(shz_vec3_t vec) SHZ_NOEXCEPT
Returns the inverse magnitude of the given 3D vector.
float shz_vec3_triple(shz_vec3_t a, shz_vec3_t b, shz_vec3_t c) SHZ_NOEXCEPT
Returns the 3D vector "triple product" between vector's a, b, and c.
shz_vec3_t shz_vec3_init(float x, float y, float z) SHZ_NOEXCEPT
Returns a 3D vector with the given x, y, and z coordinates.
float shz_vec3_min(shz_vec3_t vec) SHZ_NOEXCEPT
Returns the minimum value of the given vector's 3 components.
bool shz_vec2_equal(shz_vec2_t a, shz_vec2_t b) SHZ_NOEXCEPT
Returns true if the values of each element within the two 2D vectors are approximately equal based on...
shz_vec4_t shz_vec4_reflect(shz_vec4_t incidence, shz_vec4_t normal) SHZ_NOEXCEPT
Reflects the given 4D incidence vector against a surface with the given normal, returning the result.
void shz_vec3_orthonormalize(shz_vec3_t in1, shz_vec3_t in2, shz_vec3_t *out1, shz_vec3_t *out2) SHZ_NOEXCEPT
Returns 2 3D vectors which are normalized and orthogonal to the two input vectors.
float shz_vec2_magnitude_inv(shz_vec2_t vec) SHZ_NOEXCEPT
Returns the inverse magnitude of the given 2D vector.
float shz_vec4_magnitude_sqr(shz_vec4_t vec) SHZ_NOEXCEPT
Returns the squared magnitude of the given 4D vector.
shz_vec3_t shz_vec3_lerp(shz_vec3_t a, shz_vec3_t b, float t) SHZ_NOEXCEPT
Returns a 3D vector that is linearly interpolated from a to b by the given 0.0f-1....
float shz_vec2_distance(shz_vec2_t vec1, shz_vec2_t vec2) SHZ_NOEXCEPT
Returns the distance between the two given 2D vectors.
shz_vec3_t shz_vec2_dot3(shz_vec2_t l, shz_vec2_t r1, shz_vec2_t r2, shz_vec2_t r3) SHZ_NOEXCEPT
Returns the three dot products taken between the 2D vector l and 2D vectors r1, r2,...
shz_vec3_t shz_vec3_from_sincos(shz_sincos_t azimuth, shz_sincos_t elevation) SHZ_NOEXCEPT
Returns the 3D unit vector representing the given rotation angles relative to the positive X axis.
shz_vec2_t shz_vec2_minv(shz_vec2_t a, shz_vec2_t b) SHZ_NOEXCEPT
Returns a 2D vector whose components are the pairwise minimums of the two given vectors' components.
shz_vec3_t shz_vec3_stepv(shz_vec3_t vec, shz_vec3_t edge) SHZ_NOEXCEPT
For each component: returns 0.0f if vec[i] < edge[i], otherwise 1.0f.
shz_vec3_t shz_vec3_ceil(shz_vec3_t vec) SHZ_NOEXCEPT
Returns a 3D vector whose components are the ceil of the given vector's components.
bool shz_vec3_equal(shz_vec3_t a, shz_vec3_t b) SHZ_NOEXCEPT
Returns true if the values of each element within the two 3D vectors are approximately equal based on...
shz_vec2_t shz_vec2_reflect(shz_vec2_t incidence, shz_vec2_t normal) SHZ_NOEXCEPT
Reflects the given 2D incidence vector against a surface with the given normal, returning the result.
shz_vec3_t shz_vec3_sign(shz_vec3_t vec) SHZ_NOEXCEPT
Returns a 3D vector whose components are the signs (-1, 0, or 1) of the given vector's components.
shz_vec3_t shz_vec3_step(shz_vec3_t vec, float edge) SHZ_NOEXCEPT
For each component: returns 0.0f if vec[i] < edge, otherwise 1.0f.
float shz_vec2_cross(shz_vec2_t vec1, shz_vec2_t vec2) SHZ_NOEXCEPT
Returns the cross product, as a scalar, between two 2D vectors.
float shz_vec4_distance_sqr(shz_vec4_t vec1, shz_vec4_t vec2) SHZ_NOEXCEPT
Returns the squared-distance between the two given 4D vectors.
shz_vec4_t shz_vec4_fill(float v) SHZ_NOEXCEPT
Returns a 4D vector with the value of each component equal to v.
shz_vec2_t shz_vec2_lerp(shz_vec2_t a, shz_vec2_t b, float t) SHZ_NOEXCEPT
Returns a 2D vector that is linearly interpolated from a to b by the given 0.0f-1....
shz_vec3_t shz_vec3_perp(shz_vec3_t vec) SHZ_NOEXCEPT
Returns a vector which is perpendicular to the given vector.
shz_vec4_t shz_vec4_scale(shz_vec4_t vec, float factor) SHZ_NOEXCEPT
Returns a 4D vector whose component values are those of the given vector multiplied by a factor.
shz_vec3_t shz_vec3_project(shz_vec3_t vec, shz_vec3_t onto) SHZ_NOEXCEPT
Returns the resulting vector from projecting the given 3D vector along the given (unit) axis.
shz_vec4_t shz_vec2_vec4(shz_vec2_t vec, float z, float w) SHZ_NOEXCEPT
Extends a 2D vector to 4D, using z and w as the values of the Z and W components.
shz_vec2_t shz_vec2_stepv(shz_vec2_t vec, shz_vec2_t edge) SHZ_NOEXCEPT
For each component: returns 0.0f if vec[i] < edge[i], otherwise 1.0f.
shz_vec3_t shz_vec3_reject(shz_vec3_t vec, shz_vec3_t onto) SHZ_NOEXCEPT
Returns the rejection of the given vector, vec, onto another vector, onto.
shz_vec4_t shz_vec4_project(shz_vec4_t vec, shz_vec4_t onto) SHZ_NOEXCEPT
Returns the resulting vector from projecting the given 4D vector along the given (unit) axis.
float shz_vec4_magnitude_inv(shz_vec4_t vec) SHZ_NOEXCEPT
Returns the inverse magnitude of the given 4D vector.
shz_vec3_t shz_vec3_scale(shz_vec3_t vec, float factor) SHZ_NOEXCEPT
Returns a 3D vector whose component values are those of the given vector multiplied by a factor.
shz_vec4_t shz_vec3_vec4(shz_vec3_t vec, float w) SHZ_NOEXCEPT
Extends a 3D vector to 4D, using w as the value of the W component.
shz_vec2_t shz_vec2_mul(shz_vec2_t vec1, shz_vec2_t vec2) SHZ_NOEXCEPT
Returns a 2D vector whose component values are those of vec1 times vec2.
float shz_vec2_distance_sqr(shz_vec2_t vec1, shz_vec2_t vec2) SHZ_NOEXCEPT
Returns the squared-distance between the two given 2D vectors.
shz_vec3_t shz_vec3_move(shz_vec3_t vec, shz_vec3_t target, float max_distance) SHZ_NOEXCEPT
Returns the given 3D vector, translated towards the target by the given max_distance.
shz_vec3_t shz_vec3_refract(shz_vec3_t incidence, shz_vec3_t normal, float eta) SHZ_NOEXCEPT
Refracts the given 3D incidence vector against a surface with the given normal using the given refrac...
shz_vec4_t shz_vec4_neg(shz_vec4_t vec) SHZ_NOEXCEPT
Returns a 4D vector whose components are the negative values of the given vector's components.
shz_vec2_t shz_vec2_swizzle(shz_vec2_t vec, unsigned x_idx, unsigned y_idx) SHZ_NOEXCEPT
Returns a 2D vector whose elements are equal to the source vector's values at the given indices.
float shz_vec3_angle_between(shz_vec3_t vec1, shz_vec3_t vec2) SHZ_NOEXCEPT
Returns the angle formed between the given 3D vectors in radians.
shz_vec3_t shz_vec3_inv(shz_vec3_t vec) SHZ_NOEXCEPT
Returns the 4D vector whose components have been inverted or reciprocated.
shz_vec3_t shz_vec3_reflect(shz_vec3_t incidence, shz_vec3_t normal) SHZ_NOEXCEPT
Reflects the given 3D incidence vector against a surface with the given normal, returning the result.
shz_vec2_t shz_vec2_refract(shz_vec2_t incidence, shz_vec2_t normal, float eta) SHZ_NOEXCEPT
Refracts the given 2D incidence vector against a surface with the given normal using the given refrac...
shz_vec2_t shz_vec2
Alternate typedef for the shz_vec2 struct for those who hate POSIX-style.
shz_vec3_t shz_vec3_abs(shz_vec3_t vec) SHZ_NOEXCEPT
Returns a 3D vector whose components are the absolute values of the given vector's components.
float shz_vec2_magnitude(shz_vec2_t vec) SHZ_NOEXCEPT
Returns the magnitude of the given 2D vector.
shz_vec3_t shz_vec3_cubic_hermite(shz_vec3_t vec, shz_vec3_t tangent1, shz_vec3_t vec2, shz_vec3_t tangent2, float amounht) SHZ_NOEXCEPT
Calculates the cubic hermite interpolation between two vectors and their tangents.
float shz_vec2_dot(shz_vec2_t vec1, shz_vec2_t vec2) SHZ_NOEXCEPT
Returns the dot product between the two given 2D vectors.
float shz_vec3_max(shz_vec3_t vec) SHZ_NOEXCEPT
Returns the maximum value of the given vector's 3 components.
shz_vec4_t shz_vec4_normalize(shz_vec4_t vec) SHZ_NOEXCEPT
Returns a normalized unit vector from the given 4D vector.
shz_vec2_t shz_vec2_ceil(shz_vec2_t vec) SHZ_NOEXCEPT
Returns a 2D vector whose components are the ceil of the given vector's components.
shz_vec3_t shz_vec3_clamp(shz_vec3_t vec, float min, float max) SHZ_NOEXCEPT
Clamps the values of the given 3D vec between min and max, returning a new vector.
shz_vec3_t shz_vec3_div(shz_vec3_t vec1, shz_vec3_t vec2) SHZ_NOEXCEPT
Returns a 3D vector whose component values are those of vec1 divided by vec2.
shz_vec3_t shz_vec3_minv(shz_vec3_t a, shz_vec3_t b) SHZ_NOEXCEPT
Returns a 3D vector whose components are the pairwise minimums of the two given vectors' components.
shz_vec2_t shz_vec2_dot2(shz_vec2_t l, shz_vec2_t r1, shz_vec2_t r2) SHZ_NOEXCEPT
Returns the two dot products taken between the 2D vector l and 2D vectors r1 and r2.
shz_vec3_t shz_vec3_from_angles(float azimuth, float elevation) SHZ_NOEXCEPT
Returns the 3D unit vector representing the given rotation angles relative to the positive X axis in ...
shz_vec4_t shz_vec4
Alternate typedef for the shz_vec4 struct for those who hate POSIX-style.
shz_vec2_t shz_vec2_sign(shz_vec2_t vec) SHZ_NOEXCEPT
Returns a 2D vector whose components are the signs (-1, 0, or 1) of the given vector's components.
shz_vec4_t shz_vec4_ceil(shz_vec4_t vec) SHZ_NOEXCEPT
Returns a 4D vector whose components are the ceil of the given vector's components.
shz_vec2_t shz_vec2_sub(shz_vec2_t vec1, shz_vec2_t vec2) SHZ_NOEXCEPT
Returns a 2D vector whose components are equal to the values of vec1 minus vec2.
shz_vec3_t shz_vec3_fract(shz_vec3_t vec) SHZ_NOEXCEPT
Returns a 3D vector whose components are the fractional parts of the given vector's components.
shz_vec2_t shz_vec2_smoothstep(shz_vec2_t vec, float edge0, float edge1) SHZ_NOEXCEPT
For each component: returns 0.0f at/below edge0, 1.0f at/above edge1, smoothly varying in-between.
float shz_vec2_magnitude_sqr(shz_vec2_t vec) SHZ_NOEXCEPT
Returns the squared magnitude of the given 2D vector.
shz_vec2_t shz_vec2_init(float x, float y) SHZ_NOEXCEPT
Returns a 2D vector with the given x, and y coordinates.
shz_vec2_t shz_vec2_project(shz_vec2_t vec, shz_vec2_t onto) SHZ_NOEXCEPT
Returns the resulting vector from projecting the given 2D vector along the given (unit) axis.
shz_vec4_t shz_vec4_add(shz_vec4_t vec1, shz_vec4_t vec2) SHZ_NOEXCEPT
Returns a 4D vector whose components are the sums of the given vectors' components.
shz_vec4_t shz_vec4_clamp(shz_vec4_t vec, float min, float max) SHZ_NOEXCEPT
Clamps the values of the given 4D vec between min and max, returning a new vector.
float e[2]
<X, Y> coordinates as an array
shz_vec2_t xy
Inner 2D vector containing <X, Y> coords.
float e[3]
<X, Y, Z> coordinates as an array
shz_vec2_t xy
<X, Y> coordinates as a 2D vector
float e[4]
<X, Y, Z, W> coordinates as an array.
shz_vec3_t xyz
<X, Y, Z> coordinates as a 3D vector
shz_vec2_t zw
<Z, W> coordinates as a 2D vector