Files
LNXSDK/lib/haxejolt/JoltPhysics/Jolt/Shaders/ShaderVec3.h
2026-03-04 00:50:15 -08:00

29 lines
947 B
C

// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
// SPDX-FileCopyrightText: 2025 Jorrit Rouwe
// SPDX-License-Identifier: MIT
inline float3 JPH_Vec3DecompressUnit(uint inValue)
{
const float cOneOverSqrt2 = 0.70710678f;
const uint cNumBits = 14;
const uint cMask = (1u << cNumBits) - 1;
const uint cMaxValue = cMask - 1; // Need odd number of buckets to quantize to or else we can't encode 0
const float cScale = 2.0f * cOneOverSqrt2 / float(cMaxValue);
// Restore two components
float2 v2 = float2(float(inValue & cMask), float((inValue >> cNumBits) & cMask)) * cScale - float2(cOneOverSqrt2, cOneOverSqrt2);
// Restore the highest component
float3 v = float3(v2, sqrt(max(1.0f - dot(v2, v2), 0.0f)));
// Extract sign
if ((inValue & 0x80000000u) != 0)
v = -v;
// Swizzle the components in place
uint max_element = (inValue >> 29) & 3;
v = max_element == 0? v.zxy : (max_element == 1? v.xzy : v);
return v;
}