Files
Fishing2/Assets/KriptoFX/WaterSystem2/WaterResources/Shaders/Resources/Common/KWS_Instancing.cginc
2025-11-16 22:37:55 +08:00

92 lines
2.8 KiB
HLSL

#ifndef KWS_WATER_INSTANCING
#define KWS_WATER_INSTANCING
#if defined(KWS_USE_WATER_INSTANCING)
#ifndef KWS_WATER_VARIABLES
#include "..\Common\KWS_WaterVariables.cginc"
#endif
inline float GetFlag(uint value, uint bit)
{
return (value >> bit) & 0x01;
}
inline void UpdateInstanceSeamsAndSkirt(InstancedMeshDataStruct meshData, float2 uvData, inout float4 vertex)
{
float quadOffset = uvData.y;
uint mask = (uint)uvData.x;
vertex.x -= quadOffset * GetFlag(mask, 1) * meshData.downSeam;
vertex.z -= quadOffset * GetFlag(mask, 2) * meshData.leftSeam;
vertex.x += quadOffset * GetFlag(mask, 3) * meshData.topSeam;
vertex.z += quadOffset * GetFlag(mask, 4) * meshData.rightSeam;
float downSkirt = GetFlag(mask, 5);
float leftSkirt = GetFlag(mask, 6);
float topSkirt = GetFlag(mask, 7);
float rightSkirt = GetFlag(mask, 8);
#if defined(KWS_USE_OCEAN_RENDERING)
vertex.zy += 1000 * downSkirt * meshData.downInf * float2(-1, 0);
vertex.xy += 1000 * leftSkirt * meshData.leftInf * float2(-1, 0);
vertex.zy += 1000 * topSkirt * meshData.topInf * float2(1, 0);
vertex.xy += 1000 * rightSkirt * meshData.rightInf * float2(1, 0);
#endif
}
inline void UpdateInstaceRotation(inout float4 vertex, float4x4 matrixM, float4x4 matrixIM)
{
//if (KWS_MeshType == KWS_MESH_TYPE_FINITE_BOX) vertex.xyz = mul((float3x3)KWS_InstancingRotationMatrix, vertex.xyz);
}
inline void SetMatrixM(float3 position, float3 size, inout float4x4 matrixM)
{
position.y += 0.001;
matrixM._11_21_31_41 = float4(size.x, 0, 0, 0);
matrixM._12_22_32_42 = float4(0, size.y, 0, 0);
matrixM._13_23_33_43 = float4(0, 0, size.z, 0);
matrixM._14_24_34_44 = float4(position.xyz, 1);
}
inline void UpdateInstanceMatrixM(InstancedMeshDataStruct meshData, inout float4x4 matrixM)
{
SetMatrixM(meshData.position.xyz, meshData.size.xyz, matrixM);
matrixM = UpdateCameraRelativeMatrix(matrixM);
}
inline void UpdateAllInstanceMatrixes(InstancedMeshDataStruct meshData, inout float4x4 matrixM, inout float4x4 matrixIM)
{
SetMatrixM(meshData.position.xyz, meshData.size.xyz, matrixM);
matrixIM = matrixM;
matrixIM._14_24_34 *= -1;
matrixIM._11_22_33 = 1.0f / matrixIM._11_22_33;
matrixM = UpdateCameraRelativeMatrix(matrixM);
}
inline void UpdateAllInstanceMatrixes(uint instanceID, inout float4x4 matrixM, inout float4x4 matrixIM)
{
UpdateAllInstanceMatrixes(InstancedMeshData[instanceID], matrixM, matrixIM);
}
inline void UpdateInstanceData(uint instanceID, float2 uvData, inout float4 vertex, inout float4x4 matrixM, inout float4x4 matrixIM)
{
InstancedMeshDataStruct meshData = InstancedMeshData[instanceID];
UpdateInstanceSeamsAndSkirt(meshData, uvData, vertex);
UpdateInstaceRotation(vertex, matrixM, matrixIM);
UpdateAllInstanceMatrixes(meshData, matrixM, matrixIM);
}
#endif
#endif