| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
- // SPDX-FileCopyrightText: 2026 Jorrit Rouwe
- // SPDX-License-Identifier: MIT
- #include "ShaderMath.h"
- #include "ShaderMat44.h"
- #include "ShaderQuat.h"
- #include "ShaderPlane.h"
- #include "ShaderVec3.h"
- // The density and velocity fields are stored in fixed point while accumulating, this constant converts from float to fixed point.
- JPH_SHADER_CONSTANT(int, cFloatToFixed, 1 << 10)
- JPH_SHADER_CONSTANT(float, cFixedToFloat, 1.0f / float(cFloatToFixed))
- bool IsVertexFixed(JPH_SHADER_BUFFER(JPH_uint) inVertexFixed, uint inVertexIndex)
- {
- return (inVertexFixed[inVertexIndex >> 5] & (1u << (inVertexIndex & 31))) != 0;
- }
- float GetVertexInvMass(JPH_SHADER_BUFFER(JPH_uint) inVertexFixed, uint inVertexIndex)
- {
- return IsVertexFixed(inVertexFixed, inVertexIndex)? 0.0f : 1.0f;
- }
- float GetVertexStrandFraction(JPH_SHADER_BUFFER(JPH_uint) inStrandFractions, uint inVertexIndex)
- {
- return ((inStrandFractions[inVertexIndex >> 2] >> ((inVertexIndex & 3) << 3)) & 0xff) * (1.0f / 255.0f);
- }
- uint GetStrandVertexCount(JPH_SHADER_BUFFER(JPH_uint) inStrandVertexCounts, uint inStrandIndex)
- {
- return (inStrandVertexCounts[inStrandIndex >> 2] >> ((inStrandIndex & 3) << 3)) & 0xff;
- }
- uint GetStrandMaterialIndex(JPH_SHADER_BUFFER(JPH_uint) inStrandMaterialIndex, uint inStrandIndex)
- {
- return (inStrandMaterialIndex[inStrandIndex >> 2] >> ((inStrandIndex & 3) << 3)) & 0xff;
- }
- float GradientSamplerSample(float4 inSampler, float inStrandFraction)
- {
- return min(inSampler.w, max(inSampler.z, inSampler.y + inStrandFraction * inSampler.x));
- }
- void GridPositionToIndexAndFraction(float3 inPosition, JPH_OUT(uint3) outIndex, JPH_OUT(float3) outFraction)
- {
- // Get position in grid space
- float3 grid_pos = min(max(inPosition - cGridOffset, float3(0, 0, 0)) * cGridScale, cGridSizeMin1);
- outIndex = min(uint3(grid_pos), cGridSizeMin2);
- outFraction = grid_pos - float3(outIndex);
- }
- uint GridIndexToBufferIndex(uint3 inIndex)
- {
- return inIndex.x + inIndex.y * cGridStride.y + inIndex.z * cGridStride.z;
- }
|