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;
54 SHZ_FORCE_INLINE
vecN(CType other)
noexcept:
58 SHZ_FORCE_INLINE
static CppType
from(
const auto& raw)
noexcept {
59 return *
reinterpret_cast<
const CppType*>(&raw);
64 SHZ_FORCE_INLINE T
to()
const noexcept {
65 return *
reinterpret_cast<
const T*>(
this);
69 SHZ_FORCE_INLINE CppType&
deref(
const auto* raw)
noexcept {
70 return *
const_cast<CppType*>(
reinterpret_cast<
const CppType*>(raw));
74 SHZ_FORCE_INLINE
static CppType
lerp(CppType start, CppType end,
float t)
noexcept {
75 return shz_vec_lerp(start, end, t);
80 SHZ_FORCE_INLINE
static CppType
step(CppType vec, T edge)
noexcept {
81 return shz_vec_step(vec, edge);
86 SHZ_FORCE_INLINE
static CppType
smoothstep(CppType vec, T edge0, T edge1)
noexcept {
87 return shz_vec_smoothstep(vec, edge0, edge1);
92 SHZ_FORCE_INLINE
static CppType
smoothstep_safe(CppType vec, T edge0, T edge1)
noexcept {
93 return shz_vec_smoothstep_safe(vec, edge0, edge1);
124 friend auto operator==(CppType lhs, CppType rhs)
noexcept {
125 return shz_vec_equal(lhs, rhs);
134 SHZ_FORCE_INLINE CppType&
operator+=(CppType other)
noexcept {
135 *
static_cast<CppType*>(
this) = *
static_cast<CppType*>(
this) + other;
136 return *
static_cast<CppType*>(
this);
140 SHZ_FORCE_INLINE CppType&
operator-=(CppType other)
noexcept {
141 *
static_cast<CppType*>(
this) = *
static_cast<CppType*>(
this) - other;
142 return *
static_cast<CppType*>(
this);
146 SHZ_FORCE_INLINE CppType&
operator*=(CppType other)
noexcept {
147 *
static_cast<CppType*>(
this) = *
static_cast<CppType*>(
this) * other;
148 return *
static_cast<CppType*>(
this);
152 SHZ_FORCE_INLINE CppType&
operator/=(CppType other)
noexcept {
153 *
static_cast<CppType*>(
this) = *
static_cast<CppType*>(
this) / other;
154 return *
static_cast<CppType*>(
this);
158 SHZ_FORCE_INLINE CppType&
operator*=(
float other)
noexcept {
159 *
static_cast<CppType*>(
this) = *
static_cast<CppType*>(
this) * other;
160 return *
static_cast<CppType*>(
this);
164 SHZ_FORCE_INLINE CppType&
operator/=(
float other)
noexcept {
165 *
static_cast<CppType*>(
this) = *
static_cast<CppType*>(
this) / other;
166 return *
static_cast<CppType*>(
this);
170 template<
unsigned... Indices>
171 SHZ_FORCE_INLINE CppType
swizzle()
const noexcept {
172 return shz_vec_swizzle(*
static_cast<
const CppType*>(
this), Indices...);
176 SHZ_FORCE_INLINE CppType
abs()
const noexcept {
177 return shz_vec_abs(*
static_cast<
const CppType*>(
this));
181 SHZ_FORCE_INLINE CppType
neg()
const noexcept {
182 return shz_vec_neg(*
static_cast<
const CppType*>(
this));
186 SHZ_FORCE_INLINE CppType
inv()
const noexcept {
187 return shz_vec_inv(*
static_cast<
const CppType*>(
this));
191 SHZ_FORCE_INLINE
float max()
const noexcept {
192 return shz_vec_max(*
static_cast<
const CppType*>(
this));
196 SHZ_FORCE_INLINE
float min()
const noexcept {
197 return shz_vec_min(*
static_cast<
const CppType*>(
this));
201 SHZ_FORCE_INLINE CppType
clamp(
float min,
float max)
const noexcept {
202 return shz_vec_clamp(*
static_cast<
const CppType*>(
this), min, max);
206 SHZ_FORCE_INLINE CppType
floor()
const noexcept {
207 return shz_vec_floor(*
static_cast<
const CppType*>(
this));
211 SHZ_FORCE_INLINE CppType
ceil()
const noexcept {
212 return shz_vec_ceil(*
static_cast<
const CppType*>(
this));
216 SHZ_FORCE_INLINE CppType
round()
const noexcept {
217 return shz_vec_round(*
static_cast<
const CppType*>(
this));
221 SHZ_FORCE_INLINE CppType
fract()
const noexcept {
222 return shz_vec_fract(*
static_cast<
const CppType*>(
this));
226 SHZ_FORCE_INLINE CppType
sign()
const noexcept {
227 return shz_vec_sign(*
static_cast<
const CppType*>(
this));
231 SHZ_FORCE_INLINE CppType
saturate()
const noexcept {
232 return shz_vec_saturate(*
static_cast<
const CppType*>(
this));
236 SHZ_FORCE_INLINE CppType
minv(CppType other)
const noexcept {
237 return shz_vec_minv(*
static_cast<
const CppType*>(
this), other);
241 SHZ_FORCE_INLINE CppType
maxv(CppType other)
const noexcept {
242 return shz_vec_maxv(*
static_cast<
const CppType*>(
this), other);
246 SHZ_FORCE_INLINE
float dot(CppType other)
const noexcept {
247 return shz_vec_dot(*
static_cast<
const CppType*>(
this), other);
251 SHZ_FORCE_INLINE
vec2 dot(CppType v1, CppType v2)
const noexcept;
254 SHZ_FORCE_INLINE
vec3 dot(CppType v1, CppType v2, CppType v3)
const noexcept;
258 return shz_vec_magnitude(*
static_cast<
const CppType*>(
this));
263 return shz_vec_magnitude_sqr(*
static_cast<
const CppType*>(
this));
268 return shz_vec_magnitude_inv(*
static_cast<
const CppType*>(
this));
273 return shz_vec_normalize(*
static_cast<
const CppType*>(
this));
278 *
static_cast<CppType*>(
this) = shz_vec_normalize(*
static_cast<
const CppType*>(
this));
283 return shz_vec_normalize_safe(*
static_cast<
const CppType*>(
this));
288 *
static_cast<CppType*>(
this) = shz_vec_normalize_safe(*
static_cast<
const CppType*>(
this));
292 SHZ_FORCE_INLINE
float distance(
const CppType& other)
const noexcept {
293 return shz_vec_distance(*
static_cast<
const CppType*>(
this), other);
297 SHZ_FORCE_INLINE
float distance_sqr(
const CppType& other)
const noexcept {
298 return shz_vec_distance_sqr(*
static_cast<
const CppType*>(
this), other);
302 SHZ_FORCE_INLINE CppType
move(CppType target,
float maxdist)
const noexcept {
303 return shz_vec_move(*
static_cast<
const CppType*>(
this), target, maxdist);
307 SHZ_FORCE_INLINE CppType
reflect(CppType normal)
const noexcept {
308 return shz_vec_reflect(*
static_cast<
const CppType*>(
this), normal);
312 SHZ_FORCE_INLINE CppType
refract(CppType normal,
float eta)
const noexcept {
313 return shz_vec_refract(*
static_cast<
const CppType*>(
this), normal, eta);
317 SHZ_FORCE_INLINE CppType
project(CppType onto)
const noexcept {
318 return shz_vec_project(*
static_cast<
const CppType*>(
this), onto);
323 return shz_vec_project_safe(*
static_cast<
const CppType*>(
this), onto);
328 return shz_vec_angle_between(*
static_cast<
const CppType*>(
this), other);
332 SHZ_FORCE_INLINE
auto angles()
const noexcept {
333 return shz_vec_angles(*
static_cast<
const CppType*>(
this));
338template<
typename CRTP,
typename C, size_t R>
340 return shz_vec_add(lhs, rhs);
344template<
typename CRTP,
typename C, size_t R>
346 return shz_vec_sub(lhs, rhs);
350template<
typename CRTP,
typename C, size_t R>
352 return shz_vec_mul(lhs, rhs);
356template<
typename CRTP,
typename C, size_t R>
358 return shz_vec_div(lhs, rhs);
362template<
typename CRTP,
typename C, size_t R>
363SHZ_FORCE_INLINE CRTP
operator*(
vecN<CRTP, C, R> lhs,
float rhs)
noexcept {
364 return shz_vec_scale(lhs, rhs);
368template<
typename CRTP,
typename C, size_t R>
369SHZ_FORCE_INLINE CRTP
operator*(
float lhs,
vecN<CRTP, C, R> rhs)
noexcept {
370 return shz_vec_scale(rhs, lhs);
374template<
typename CRTP,
typename C, size_t R>
375SHZ_FORCE_INLINE CRTP
operator/(
vecN<CRTP, C, R> lhs,
float rhs)
noexcept {
380template<
typename CRTP,
typename C, size_t R>
381SHZ_FORCE_INLINE CRTP
operator/(
float lhs,
vecN<CRTP, C, R> rhs)
noexcept {
382 return shz_vec_div(CRTP(lhs), rhs);
386
387
388
389
390
402 SHZ_FORCE_INLINE
vec2(
float v)
noexcept:
406 SHZ_FORCE_INLINE
vec2(
float x,
float y)
noexcept:
424 SHZ_FORCE_INLINE
float cross(
vec2 other)
const noexcept {
425 return shz_vec2_cross(*
this, other);
430 return shz_vec2_rotate(*
this, radians);
438
439
440
441
442
454 SHZ_FORCE_INLINE
vec3(shz_vec3_t other)
noexcept:
458 SHZ_FORCE_INLINE
vec3(
float v)
noexcept:
462 SHZ_FORCE_INLINE
vec3(
float x,
float y,
float z)
noexcept:
480 shz_vec3_orthonormalize(in1, in2, &out1, &out2);
481 return std::make_pair(out1, out2);
486 shz_vec3_orthonormalize(in1, in2, out1, out2);
491 return shz_vec3_cubic_hermite(v1, tangent1, v2, tangent2, amount);
495 SHZ_FORCE_INLINE
vec2 xy()
const noexcept {
496 return shz_vec3_t::xy;
500 SHZ_FORCE_INLINE
static vec3 from_angles(
float azimuth_rads,
float elevation_rads)
noexcept {
511 return shz_vec3_cross(*
this, other);
516 return shz_vec3_triple(*
this, b, c);
521 return shz_vec3_perp(*
this);
526 return shz_vec3_reject(*
this, onto);
531 return shz_vec3_barycenter(*
this, a, b, c);
539
540
541
542
543
555 SHZ_FORCE_INLINE
vec4(shz_vec4_t other)
noexcept:
559 SHZ_FORCE_INLINE
vec4(
float v)
noexcept:
563 SHZ_FORCE_INLINE
vec4(
float x,
float y,
float z,
float w)
noexcept:
591 SHZ_FORCE_INLINE
vec2 xy()
const noexcept {
592 return shz_vec4_t::xy;
596 SHZ_FORCE_INLINE
vec2 zw()
const noexcept {
597 return shz_vec4_t::zw;
601 SHZ_FORCE_INLINE
vec3 xyz()
const noexcept {
602 return shz_vec4_t::xyz;
609template<
typename CRTP,
typename C, size_t R>
610SHZ_FORCE_INLINE
vec2 vecN<CRTP, C, R>::
dot(CppType v1, CppType v2)
const noexcept {
611 return shz_vec_dot2(*
static_cast<
const CRTP*>(
this), v1, v2);
614template<
typename CRTP,
typename C, size_t R>
615SHZ_FORCE_INLINE
vec3 vecN<CRTP, C, R>::
dot(CppType v1, CppType v2, CppType v3)
const noexcept {
616 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 each element of the given vector by ...
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(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(shz_vec3_t other) noexcept
C constructor: constructs a C++ vec3 from a C shz_vec3_t.
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(shz_vec4_t other) noexcept
C Constructor: initializes a C++ shz::vec4 from a C shz_vec4_t.
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(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 ...
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.
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....
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.
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.
vecN()=default
Default constructor, does nothing.
auto angles() const noexcept
Returns the angle(s) created between the given vector axis and the +X axis, in radians.
vecN(CType other) noexcept
Converting constructor from existing 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.
friend auto operator==(CppType lhs, CppType rhs) noexcept
Overloaded equality operator, for comparing vectors.
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.