44 template <
class T,
class...
Types>
45 concept AnyOf = (std::same_as<T, Types> || ...);
47 template<
class EncodedType_>
71 template <
size_t BitsPerAxis>
74 template <
size_t BitsPerAxis>
85 return 4.0 / (
static_cast<double>((1ULL <<
bitsPerAxis)) - 1.0);
97 template<Octahedron::CPrecision Precision>
98 class OctahedronEncoding;
109 template<Octahedron::CPrecision Precision>
117 using FloatType = std::conditional_t<(Precision::cBitsPerAxis > 23),
double,
float>;
157 template<std::
integral T>
162 template<std::
integral T>
167 template<std::
integral T>
171 template<std::
integral T>
226 return v.Normalize();
254#define JPL_OCTAHEDRON_SPECIAL_CASE_HANDLING 0
258 template<Octahedron::CPrecision Precision>
259 template<std::
integral T>
262 return x != cAxisMask &&
y != cAxisMask;
265 template<Octahedron::CPrecision Precision>
266 template<std::
integral T>
270 const auto y = (
static_cast<EncodedType>(
code) >> cBitsPerAxis) & cAxisMask;
271 return AreValidComponents(
x,
y);
274 template<Octahedron::CPrecision Precision>
275 template<std::
integral T>
278 return (std::min(
EncodedType(
y), cMaxComponentValue) << cBitsPerAxis) | std::min(
EncodedType(
x), cMaxComponentValue);
281 template<Octahedron::CPrecision Precision>
282 template<std::
integral T>
287 return static_cast<T
>((std::min(
y, cMaxComponentValue) << cBitsPerAxis) | std::min(
x, cMaxComponentValue));
290 template<Octahedron::CPrecision Precision>
308#if JPL_OCTAHEDRON_SPECIAL_CASE_HANDLING
342 return (
dy << cBitsPerAxis) |
dx;
345 template<Octahedron::CPrecision Precision>
385 return (
dy << cBitsPerAxis) |
dx;
388 template<Octahedron::CPrecision Precision>
398 dx = std::min(
dx, cMaxComponentValue);
399 dy = std::min(
dy, cMaxComponentValue);
401#if JPL_OCTAHEDRON_SPECIAL_CASE_HANDLING
430 return Normalized(Vec3{
437 template<Octahedron::CPrecision Precision>
495 static_assert(
Delta.X < EncoderType::cMaxComponentError &&
496 Delta.Y < EncoderType::cMaxComponentError &&
497 Delta.Z < EncoderType::cMaxComponentError);
501 template<
class VectorType>
#define JPL_ASSERT(inExpression,...)
Main assert macro, usage: JPL_ASSERT(condition, message) or JPL_ASSERT(condition)
Definition ErrorReporting.h:76
Forward declaration.
Definition DirectionEncoding.h:111
static constexpr EncodedType Encode(const Vec3 &direction)
Definition DirectionEncoding.h:292
static constexpr auto cMaxComponentError
Definition DirectionEncoding.h:124
static JPL_INLINE constexpr bool AreValidComponents(T x, T y) noexcept
Definition DirectionEncoding.h:260
static constexpr size_t cAxisRange
Definition DirectionEncoding.h:122
typename Precision::EncodedType EncodedType
Definition DirectionEncoding.h:113
static constexpr auto cBitsPerAxis
Definition DirectionEncoding.h:114
static constexpr EncodedType cAxisMask
Definition DirectionEncoding.h:119
static JPL_INLINE constexpr auto SanitizeCode(T code) noexcept
Alias the padding rim to the last real texel.
Definition DirectionEncoding.h:283
static constexpr auto cMaxVectorError
Definition DirectionEncoding.h:125
static JPL_INLINE constexpr bool IsValidCode(T code) noexcept
Definition DirectionEncoding.h:267
static constexpr Vec3 Decode(EncodedType encodedDirection)
Definition DirectionEncoding.h:390
static JPL_INLINE constexpr EncodedType CombineComponents(T x, T y) noexcept
Definition DirectionEncoding.h:276
std::conditional_t<(Precision::cBitsPerAxis > 23), double, float > FloatType
Definition DirectionEncoding.h:117
Constraint for valid precision types.
Definition DirectionEncoding.h:65
Definition DirectionEncoding.h:45
std::remove_cvref_t< decltype(GetX(std::declval< Vec3 >()))> FloatOf
Definition Vec3Math.h:36
JPL_INLINE constexpr T Floor(T value) noexcept
A constexpr implementation of floor.
Definition Math.h:96
JPL_INLINE constexpr T FMA(T a, T b, T c) noexcept
Inlined fuse multiply-add. Compiler in some circumstances is more eager to optimize this than std::fm...
Definition Math.h:186
JPL_INLINE constexpr T InvSqrt(T x) noexcept
Definition Math.h:283
JPL_INLINE constexpr bool IsNearlyZero(T value, T errorTolerance=JPL_FLOAT_EPS_V< T >) noexcept
Definition Math.h:146
JPL_INLINE constexpr auto Abs(const T &value) noexcept
Standard abs is not constexpr in C++20.
Definition Math.h:87
JPL_INLINE constexpr T Sign2(T value) noexcept
Sign2 returns -1 for negative values, 1 otherwise.
Definition Math.h:131
constexpr double cMaxComponentError
Definition DirectionEncoding.h:72
constexpr double cMaxVectorError
Definition DirectionEncoding.h:75
JPL_INLINE constexpr double MaxVectorError(size_t bitsPerAxis) noexcept
Run-time variant of 'cMaxVectorError'.
Definition DirectionEncoding.h:89
JPL_INLINE constexpr double MaxComponentError(size_t bitsPerAxis) noexcept
Run-time variant of 'cMaxComponentError'.
Definition DirectionEncoding.h:83
Definition AcousticMaterial.h:36
JPL_INLINE simd clamp(const simd &value, const simd &minV, const simd &maxV) noexcept
Element-wise clamp.
Definition SIMD.h:1838
constexpr Vec2 FromDiamond(float p) noexcept
Decode scalar [0, 1] to a 2D unit vector.
Definition DirectionEncoding.h:212
JPL_INLINE auto GetX(const Vec3Type &v) noexcept
Definition Vec3Traits.h:35
OctahedronEncoding< Octahedron::Precision8bits > Octahedron16Bit
Definition DirectionEncoding.h:103
JPL_INLINE constexpr uint32 ToOctahedron32(const Vec3 &direction)
Definition DirectionEncoding.h:181
JPL_INLINE constexpr Vec3 FromOctahedron32(uint32 encodedDirection)
Definition DirectionEncoding.h:189
JPL_INLINE auto GetZ(const Vec3Type &v) noexcept
Definition Vec3Traits.h:37
std::uint32_t uint32
Definition Core.h:311
JPL_INLINE simd floor(const simd &vec) noexcept
Element-wise floor.
Definition SIMD.h:1861
JPL_INLINE auto GetY(const Vec3Type &v) noexcept
Definition Vec3Traits.h:36
JPL_INLINE simd max(const simd &a, const simd &b) noexcept
Element-wise max.
Definition SIMD.h:1799
JPL_INLINE simd fma(const simd &mul1, const simd &mul2, const simd &addV) noexcept
Element-wise fused multiply-add.
Definition SIMD.h:1843
JPL_INLINE simd min(const simd &a, const simd &b) noexcept
Element-wise min.
Definition SIMD.h:1813
constexpr float ToDiamond(Vec2 dir) noexcept
"Diamond Encoding" of a 2D unit vector as per:
Definition DirectionEncoding.h:197
JPL_INLINE simd abs(const simd &vec) noexcept
Definition SIMD.h:1827
Definition MinimalVec3.h:37
Definition DirectionEncoding.h:49
EncodedType_ EncodedType
Definition DirectionEncoding.h:50
static constexpr auto cBitsPerAxis
Definition DirectionEncoding.h:51
Definition MinimalVec2.h:29
JPL_INLINE constexpr Vec2 & Normalize() noexcept
Definition MinimalVec2.h:37
Minimal 4-wide 32-bit float vector implementation for SIMD.
Definition SIMD.h:60
static JPL_INLINE simd c_1() noexcept
Definition SIMD.h:461
static JPL_INLINE simd c_0p5() noexcept
Definition SIMD.h:466
static JPL_INLINE simd zero() noexcept
Vector with all zeros.
Definition SIMD.h:541
static JPL_INLINE simd select(const simd_mask &mask, const simd &a, const simd &b) noexcept
Component-wise select, returns 'a' if mask is true, 'b' otherwise.
Definition SIMD.h:1034