forked from LeenkxTeam/LNXSDK
HaxeJolt
This commit is contained in:
28
lib/haxejolt/JoltPhysics/Jolt/Shaders/ShaderVec3.h
Normal file
28
lib/haxejolt/JoltPhysics/Jolt/Shaders/ShaderVec3.h
Normal file
@ -0,0 +1,28 @@
|
||||
// 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;
|
||||
}
|
||||
Reference in New Issue
Block a user