2
3
4
5
6
7
8
9
10
11
12
13
14
33
34
35
36
37
38
39
40
41
42template<
typename CRTP,
typename C, size_t R>
47 static constexpr size_t
Rows = R;
48 static constexpr size_t
Cols = 1;
57 SHZ_FORCE_INLINE
vecN(
const CType& other)
noexcept:
61 SHZ_FORCE_INLINE
vecN(
const volatile CType& other)
noexcept:
62 CType(
const_cast<
const CType&>(other)) {}
65 SHZ_FORCE_INLINE
static CppType
from(
const auto& raw)
noexcept {
66 return *
reinterpret_cast<
const CppType*>(&raw);
71 SHZ_FORCE_INLINE T
to()
const noexcept {
72 return *
reinterpret_cast<
const T*>(
this);
76 SHZ_FORCE_INLINE CppType&
deref(
const auto* raw)
noexcept {
77 return *
const_cast<CppType*>(
reinterpret_cast<
const CppType*>(raw));
81 SHZ_FORCE_INLINE
static CppType
lerp(CppType start, CppType end,
float t)
noexcept {
82 return shz_vec_lerp(start, end, t);
87 SHZ_FORCE_INLINE
static CppType
step(CppType vec, T edge)
noexcept {
88 return shz_vec_step(vec, edge);
93 SHZ_FORCE_INLINE
static CppType
smoothstep(CppType vec, T edge0, T edge1)
noexcept {
94 return shz_vec_smoothstep(vec, edge0, edge1);
99 SHZ_FORCE_INLINE
static CppType
smoothstep_safe(CppType vec, T edge0, T edge1)
noexcept {
100 return shz_vec_smoothstep_safe(vec, edge0, edge1);
131 friend bool operator==(CppType lhs, CppType rhs)
noexcept {
132 return shz_vec_equal(lhs, rhs);
141 volatile CppType&
operator=(
volatile CType other)
volatile noexcept {
142 *
static_cast<CppType*>(
const_cast<
vecN*>(
this)) = CppType(
const_cast<CType&>(other));
143 return *
static_cast<
volatile CppType*>(
this);
147 SHZ_FORCE_INLINE CppType&
operator+=(CppType other)
noexcept {
148 *
static_cast<CppType*>(
this) = *
static_cast<CppType*>(
this) + other;
149 return *
static_cast<CppType*>(
this);
153 SHZ_FORCE_INLINE CppType&
operator-=(CppType other)
noexcept {
154 *
static_cast<CppType*>(
this) = *
static_cast<CppType*>(
this) - other;
155 return *
static_cast<CppType*>(
this);
159 SHZ_FORCE_INLINE CppType&
operator*=(CppType other)
noexcept {
160 *
static_cast<CppType*>(
this) = *
static_cast<CppType*>(
this) * other;
161 return *
static_cast<CppType*>(
this);
165 SHZ_FORCE_INLINE CppType&
operator/=(CppType other)
noexcept {
166 *
static_cast<CppType*>(
this) = *
static_cast<CppType*>(
this) / other;
167 return *
static_cast<CppType*>(
this);
171 SHZ_FORCE_INLINE CppType&
operator*=(
float other)
noexcept {
172 *
static_cast<CppType*>(
this) = *
static_cast<CppType*>(
this) * other;
173 return *
static_cast<CppType*>(
this);
177 SHZ_FORCE_INLINE CppType&
operator/=(
float other)
noexcept {
178 *
static_cast<CppType*>(
this) = *
static_cast<CppType*>(
this) / other;
179 return *
static_cast<CppType*>(
this);
183 template<
unsigned... Indices>
184 SHZ_FORCE_INLINE CppType
swizzle()
const noexcept {
185 return shz_vec_swizzle(*
static_cast<
const CppType*>(
this), Indices...);
189 SHZ_FORCE_INLINE CppType
abs()
const noexcept {
190 return shz_vec_abs(*
static_cast<
const CppType*>(
this));
194 SHZ_FORCE_INLINE CppType
neg()
const noexcept {
195 return shz_vec_neg(*
static_cast<
const CppType*>(
this));
199 SHZ_FORCE_INLINE CppType
inv()
const noexcept {
200 return shz_vec_inv(*
static_cast<
const CppType*>(
this));
204 SHZ_FORCE_INLINE
float max()
const noexcept {
205 return shz_vec_max(*
static_cast<
const CppType*>(
this));
209 SHZ_FORCE_INLINE
float min()
const noexcept {
210 return shz_vec_min(*
static_cast<
const CppType*>(
this));
214 SHZ_FORCE_INLINE CppType
clamp(
float min,
float max)
const noexcept {
215 return shz_vec_clamp(*
static_cast<
const CppType*>(
this), min, max);
219 SHZ_FORCE_INLINE CppType
floor()
const noexcept {
220 return shz_vec_floor(*
static_cast<
const CppType*>(
this));
224 SHZ_FORCE_INLINE CppType
ceil()
const noexcept {
225 return shz_vec_ceil(*
static_cast<
const CppType*>(
this));
229 SHZ_FORCE_INLINE CppType
round()
const noexcept {
230 return shz_vec_round(*
static_cast<
const CppType*>(
this));
234 SHZ_FORCE_INLINE CppType
fract()
const noexcept {
235 return shz_vec_fract(*
static_cast<
const CppType*>(
this));
239 SHZ_FORCE_INLINE CppType
sign()
const noexcept {
240 return shz_vec_sign(*
static_cast<
const CppType*>(
this));
244 SHZ_FORCE_INLINE CppType
saturate()
const noexcept {
245 return shz_vec_saturate(*
static_cast<
const CppType*>(
this));
249 SHZ_FORCE_INLINE CppType
minv(CppType other)
const noexcept {
250 return shz_vec_minv(*
static_cast<
const CppType*>(
this), other);
254 SHZ_FORCE_INLINE CppType
maxv(CppType other)
const noexcept {
255 return shz_vec_maxv(*
static_cast<
const CppType*>(
this), other);
259 SHZ_FORCE_INLINE
float dot(CppType other)
const noexcept {
260 return shz_vec_dot(*
static_cast<
const CppType*>(
this), other);
264 SHZ_FORCE_INLINE
vec2 dot(CppType v1, CppType v2)
const noexcept;
267 SHZ_FORCE_INLINE
vec3 dot(CppType v1, CppType v2, CppType v3)
const noexcept;
271 return shz_vec_magnitude(*
static_cast<
const CppType*>(
this));
276 return shz_vec_magnitude_sqr(*
static_cast<
const CppType*>(
this));
281 return shz_vec_magnitude_inv(*
static_cast<
const CppType*>(
this));
286 return shz_vec_normalize(*
static_cast<
const CppType*>(
this));
291 *
static_cast<CppType*>(
this) = shz_vec_normalize(*
static_cast<
const CppType*>(
this));
296 return shz_vec_normalize_safe(*
static_cast<
const CppType*>(
this));
301 *
static_cast<CppType*>(
this) = shz_vec_normalize_safe(*
static_cast<
const CppType*>(
this));
305 SHZ_FORCE_INLINE
float distance(
const CppType& other)
const noexcept {
306 return shz_vec_distance(*
static_cast<
const CppType*>(
this), other);
310 SHZ_FORCE_INLINE
float distance_sqr(
const CppType& other)
const noexcept {
311 return shz_vec_distance_sqr(*
static_cast<
const CppType*>(
this), other);
315 SHZ_FORCE_INLINE CppType
move(CppType target,
float maxdist)
const noexcept {
316 return shz_vec_move(*
static_cast<
const CppType*>(
this), target, maxdist);
320 SHZ_FORCE_INLINE CppType
reflect(CppType normal)
const noexcept {
321 return shz_vec_reflect(*
static_cast<
const CppType*>(
this), normal);
325 SHZ_FORCE_INLINE CppType
refract(CppType normal,
float eta)
const noexcept {
326 return shz_vec_refract(*
static_cast<
const CppType*>(
this), normal, eta);
330 SHZ_FORCE_INLINE CppType
project(CppType onto)
const noexcept {
331 return shz_vec_project(*
static_cast<
const CppType*>(
this), onto);
336 return shz_vec_project_safe(*
static_cast<
const CppType*>(
this), onto);
341 return shz_vec_angle_between(*
static_cast<
const CppType*>(
this), other);
345 SHZ_FORCE_INLINE
auto angles()
const noexcept {
346 return shz_vec_angles(*
static_cast<
const CppType*>(
this));
351template<
typename CRTP,
typename C, size_t R>
353 return shz_vec_add(lhs, rhs);
357template<
typename CRTP,
typename C, size_t R>
359 return shz_vec_sub(lhs, rhs);
363template<
typename CRTP,
typename C, size_t R>
365 return shz_vec_mul(lhs, rhs);
369template<
typename CRTP,
typename C, size_t R>
371 return shz_vec_div(lhs, rhs);
375template<
typename CRTP,
typename C, size_t R>
376SHZ_FORCE_INLINE CRTP
operator*(
vecN<CRTP, C, R> lhs,
float rhs)
noexcept {
377 return shz_vec_scale(lhs, rhs);
381template<
typename CRTP,
typename C, size_t R>
382SHZ_FORCE_INLINE CRTP
operator*(
float lhs,
vecN<CRTP, C, R> rhs)
noexcept {
383 return shz_vec_scale(rhs, lhs);
387template<
typename CRTP,
typename C, size_t R>
388SHZ_FORCE_INLINE CRTP
operator/(
vecN<CRTP, C, R> lhs,
float rhs)
noexcept {
393template<
typename CRTP,
typename C, size_t R>
394SHZ_FORCE_INLINE CRTP
operator/(
float lhs,
vecN<CRTP, C, R> rhs)
noexcept {
395 return shz_vec_div(CRTP(lhs), rhs);
399
400
401
402
403
415 SHZ_FORCE_INLINE
vec2(
float v)
noexcept:
419 SHZ_FORCE_INLINE
vec2(
float x,
float y)
noexcept:
437 SHZ_FORCE_INLINE
float cross(
vec2 other)
const noexcept {
438 return shz_vec2_cross(*
this, other);
443 return shz_vec2_rotate(*
this, radians);
451
452
453
454
455
470 SHZ_FORCE_INLINE
vec3(
const shz_vec3_t& other)
noexcept:
474 SHZ_FORCE_INLINE
vec3(
float v)
noexcept:
478 SHZ_FORCE_INLINE
vec3(
float x,
float y,
float z)
noexcept:
496 shz_vec3_orthonormalize(in1, in2, &out1, &out2);
497 return std::make_pair(out1, out2);
502 shz_vec3_orthonormalize(in1, in2, out1, out2);
507 return shz_vec3_cubic_hermite(v1, tangent1, v2, tangent2, amount);
511 SHZ_FORCE_INLINE
vec2 xy()
const noexcept {
512 return shz_vec3_t::xy;
516 SHZ_FORCE_INLINE
static vec3 from_angles(
float azimuth_rads,
float elevation_rads)
noexcept {
527 return shz_vec3_cross(*
this, other);
532 return shz_vec3_triple(*
this, b, c);
537 return shz_vec3_perp(*
this);
542 return shz_vec3_reject(*
this, onto);
547 return shz_vec3_barycenter(*
this, a, b, c);
555
556
557
558
559
571 SHZ_FORCE_INLINE
vec4(
const shz_vec4_t& other)
noexcept:
575 SHZ_FORCE_INLINE
vec4(
float v)
noexcept:
579 SHZ_FORCE_INLINE
vec4(
float x,
float y,
float z,
float w)
noexcept:
607 SHZ_FORCE_INLINE
vec2 xy()
const noexcept {
608 return shz_vec4_t::xy;
612 SHZ_FORCE_INLINE
vec2 zw()
const noexcept {
613 return shz_vec4_t::zw;
617 SHZ_FORCE_INLINE
vec3 xyz()
const noexcept {
618 return shz_vec4_t::xyz;
625template<
typename CRTP,
typename C, size_t R>
626SHZ_FORCE_INLINE
vec2 vecN<CRTP, C, R>::
dot(CppType v1, CppType v2)
const noexcept {
627 return shz_vec_dot2(*
static_cast<
const CRTP*>(
this), v1, v2);
630template<
typename CRTP,
typename C, size_t R>
631SHZ_FORCE_INLINE
vec3 vecN<CRTP, C, R>::
dot(CppType v1, CppType v2, CppType v3)
const noexcept {
632 return shz_vec_dot3(*
static_cast<
const CRTP*>(
this), v1, v2, v3);
Namespace enclosing the SH4ZAM C++ API.
CRTP operator*(vecN< CRTP, C, R > lhs, vecN< CRTP, C, R > rhs) noexcept
Overloaded multiplication operator, performing element-wise multiplication between two vectors,...
CRTP operator/(float lhs, vecN< CRTP, C, R > rhs) noexcept
Reverse overloaded division operator for component-wise dividing a vector whose elements have all bee...
CRTP operator-(vecN< CRTP, C, R > lhs, vecN< CRTP, C, R > rhs) noexcept
Overloaded subtraction operator, subtracting one vector from another, returning the result.
CRTP operator+(vecN< CRTP, C, R > lhs, vecN< CRTP, C, R > rhs) noexcept
Overloaded addition operator, adding two vectors together and returning the result.
CRTP operator/(vecN< CRTP, C, R > lhs, vecN< CRTP, C, R > rhs) noexcept
Overloaded division operator, returning the resulting vector from component-wise dividing the element...
CRTP operator/(vecN< CRTP, C, R > lhs, float rhs) noexcept
Overloaded division operator for component-wise dividing each element of the given vector by the give...
constexpr auto invf
C++ alias for shz_invf().
CRTP operator*(float lhs, vecN< CRTP, C, R > rhs) noexcept
Reverse overloaded multiplication operator for scaling a vector by a scalar and returning the resulti...
CRTP operator*(vecN< CRTP, C, R > lhs, float rhs) noexcept
Overloaded multiplication operator for scaling a vector by a scalar and returning the resulting vecto...
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_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_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_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 ...
C++ sine/cosine approximation pairs.
vec2(float v) noexcept
Single-value constructor: sets both components equal to v.
vec2()=default
Default constructor: does nothing.
vec2(float x, float y) noexcept
Constructs a vec2 with the given values as components.
vec2(sincos pair) noexcept
Constructs a vec2 from the given angle of rotation from the +X axis.
float cross(vec2 other) const noexcept
C++ wrapper for shz_vec2_cross().
static vec2 from_angle_deg(float deg) noexcept
Constructs a vec2 from the given angle of rotation from the +X axis, in degrees.
vec2 rotate(float radians) const noexcept
C++ wrapper for shz_vec2_rotate().
static vec2 from_angle(float rads) noexcept
Constructs a vec2 from the given angle of rotation from the +X axis, in radians.
vec3 reject(vec3 onto) const noexcept
Returns the 3D reject vector of the given vector and another.
static void orthonormalize(vec3 in1, vec3 in2, vec3 *out1, vec3 *out2) noexcept
Returns 2 3D vectors which are normalized and orthogonal to the two input vectors via output pointers...
vec3(float x, float y, float z) noexcept
Value constructor: initializes each component to its given value.
vec3 cross(vec3 other) const noexcept
Returns a 3D vector which forms the given angles with the +X axis.
static vec3 from_angles_deg(float azimuth_deg, float elevation_deg) noexcept
Returns a 3D vector which forms the given angles with the +X axis, in degrees.
static auto orthonormalize(vec3 in1, vec3 in2) noexcept
Returns 2 3D vectors which are normalized and orthogonal to the two input vectors as a std::pair<>.
float triple(vec3 b, vec3 c) const noexcept
Returns the 3D vector "triple product" between the given vector and vectors a and b.
vec3 barycenter(vec3 a, vec3 b, vec3 c) const noexcept
Computes the barycentric coordinates <u, v, w> for the given 3D vector, within the plane of the trian...
vec3(float v) noexcept
Single-value constructor: initializes all components to v.
static vec3 cubic_hermite(vec3 v1, vec3 tangent1, vec3 v2, vec3 tangent2, float amount) noexcept
Calculates the cubic hermite interpolation between two vectors and their tangents.
vec3(const shz_vec3_t &other) noexcept
C constructor: constructs a C++ vec3 from a C shz_vec3_t.
vec3(shz::vec2 xy, float z) noexcept
Constructs a vec3 from a shz::vec2 and a scalar value for its z component.
vec3(sincos azimuth, sincos elevation) noexcept
Returns a 3D vector which forms the given angles with the +X axis.
vec3 perp() const noexcept
Returns a 3D vector which is perpendicular to this vector.
vec3(float x, shz::vec2 yz) noexcept
Constructs a vec3 from a scalar as its x component and a shz::vec2 as its Y and Z components.
vec3()=default
Default constructor: does nothing.
static vec3 from_angles(float azimuth_rads, float elevation_rads) noexcept
Returns a 3D vector which forms the given angles with the +X axis, in radians.
vec4(shz::vec2 xy, float z, float w) noexcept
Constructs a 4D vector with a 2D vector providing the X and Y coordinates and scalars providing Z and...
vec4(float x, shz::vec3 yzw) noexcept
Constructs a 4D vector with the X component given by a scalar and the Y, Z, and W components given by...
vec4(float v) noexcept
Single-value constructor: initializes each element to the given value.
vec4(shz::vec3 xyz, float w) noexcept
Constructs a 4D vector with the X, Y, and Z components given by a 3D vector and W given by a scalar.
vec4(const shz_vec4_t &other) noexcept
C Constructor: initializes a C++ shz::vec4 from a C shz_vec4_t.
vec4(float x, shz::vec2 yz, float w) noexcept
Constructs a 4D vector with scalars providing X and W coordinates and a 2D vector providing Y and Z.
vec4(shz::vec2 xy, shz::vec2 zw) noexcept
Constructs a 4D vector from the components provided by the given pair of 2D vectors.
vec4()=default
Default constructor: does nothing.
vec4(float x, float y, shz::vec2 zw) noexcept
Constructs a 4D vector with scalars providing X and Y coordinaets and a 2D vector providing Z and W.
vec4(float x, float y, float z, float w) noexcept
Value constructor: initializes each element to its corresponding parameter value.
Common C++ base structure inherited by all vector types.
float angle_between(CppType other) const noexcept
Returns the angle between the given vector and another, in radians.
float magnitude_inv() const noexcept
Returns the inverse magnitude of the given vector.
T to() const noexcept
Conversion operator for going from a SH4ZAM vector type to another layout-compatible type.
float max() const noexcept
Returns the maximum value of every element within the vector.
CppType & operator/=(CppType other) noexcept
Overloaded division assignment operator, divides the left vector by the right, assigning the left to ...
vecN(const vecN &other) noexcept=default
Default copy constructor.
CppType clamp(float min, float max) const noexcept
Returns a new vector whose values are the clamped components of the given vector.
CppType & operator*=(float other) noexcept
Overloaded multiplication assignment operator, multiplies and accumulates each vector component by th...
CppType & operator-=(CppType other) noexcept
Overloaded subtraction assignment operator, subtracts a vector from the left-hand vector.
float min() const noexcept
Returns the minimum value of every element within the vector.
CppType round() const noexcept
Returns a new vector with the component-wise rounding of the given vector.
static CppType from(const auto &raw) noexcept
Conversion operator for going from a layout-compatible vector type to a SH4ZAM vector type.
CppType maxv(CppType other) const noexcept
Returns a new vector with the component-wise maximum of two vectors.
CppType ceil() const noexcept
Returns a new vector with the component-wise ceil of the given vector.
friend CppType operator-(CppType vec) noexcept
Overloaded unary negation operator, returns the negated vector.
static constexpr size_t Rows
Number of rows.
float distance(const CppType &other) const noexcept
Returns the magnitude of the difference between two vectors as their distance.
CppType refract(CppType normal, float eta) const noexcept
Returns the vector create from refracting the given incidence vector over the normal of a surface,...
static CppType lerp(CppType start, CppType end, float t) noexcept
Returns the vector that is linearly interpolated between the two given vectors by the 0....
CppType project(CppType onto) const noexcept
Returns the vector created from projecting the given vector onto another.
CppType fract() const noexcept
Returns a new vector with the fractional part of each component.
volatile CppType & operator=(volatile CType other) volatile noexcept
Overloaded operator for assigning to volatile reference to base C type.
vec2 dot(CppType v1, CppType v2) const noexcept
Returns the dot product of the given vector against two others.
static CppType step(CppType vec, T edge) noexcept
Compares each component of the vector to the edge. 0 returned in that component if x[i] < edge....
vecN(const CType &other) noexcept
Converting constructor from existing C instance.
CppType reflect(CppType normal) const noexcept
Returns the vector created from reflecting the given vector over the normal of a surface.
CppType move(CppType target, float maxdist) const noexcept
Moves the given vector towards the target by the given maxdist.
CppType & operator+=(CppType other) noexcept
Overloaded operator for adding and accumulating a vector onto another.
static CppType smoothstep_safe(CppType vec, T edge0, T edge1) noexcept
Returns a vector where each component is smoothly interpolated from 0 to 1 between edge0 and edge1.
void normalize() noexcept
Normalizes the given vector.
CppType & deref(const auto *raw) noexcept
Conversion operator for accessing an existing pointer type as though it were a refrence to a SH4ZAM t...
static constexpr size_t Cols
Number of columns.
friend bool operator==(CppType lhs, CppType rhs) noexcept
Overloaded equality operator, for comparing vectors.
float distance_sqr(const CppType &other) const noexcept
Returns the value of the distance between two vectors squared (faster than actual distance)
CppType minv(CppType other) const noexcept
Returns a new vector with the component-wise minimum of two vectors.
static CppType smoothstep(CppType vec, T edge0, T edge1) noexcept
Returns a vector where each component is smoothly interpolated from 0 to 1 between edge0 and edge1.
CppType & operator/=(float other) noexcept
Overloaded division assignment operator, dividing and assigning each vector component by the given sc...
void normalize_safe() noexcept
Normalizes the given vector, safely protecting against division-by-zero.
CppType swizzle() const noexcept
Swizzle oeprator which takes a compile-time list of indices as non-type template arguments for the in...
CppType direction_safe() const noexcept
Returns the direction vector of a given vector, safely protecting against division-by-zero.
CppType saturate() const noexcept
Returns a new vector with each component clamped to [0, 1].
CppType floor() const noexcept
Returns a new vector with the component-wise floor of the given vector.
CppType & operator*=(CppType other) noexcept
Overloaded multiplication assignment operator, multiplies and accumulates a vector onto the left-hand...
vec3 dot(CppType v1, CppType v2, CppType v3) const noexcept
Returns the dot product of the given vector against three others.
float dot(CppType other) const noexcept
Returns the dot product of the given vector and another.
auto angles() const noexcept
Returns the angle(s) created between the given vector axis and the +X axis, in radians.
vecN(const volatile CType &other) noexcept
Converting constructor from existing volatile C instance.
CppType abs() const noexcept
Returns a new vector whose components are the absolute value of the given vector.
CppType direction() const noexcept
Returns the direction vector resulting from normalizing the given vector.
float magnitude_sqr() const noexcept
Returns the squared magnitude of the given vector.
CppType project_safe(CppType onto) const noexcept
Returns the vector created from projecting the given vector onto another, safely protecting against d...
CppType neg() const noexcept
Returns a new vector whose components are the negative values of the given vector.
vecN() noexcept=default
Default constructor, does nothing.
float magnitude() const noexcept
Returns the magnitude of the given vector.
CppType sign() const noexcept
Returns a new vector with the sign of each component (-1, 0, or 1).
CppType inv() const noexcept
Returns a new vector whose components are the reciprocal values of the given vector.