A game about forced loneliness, made by TACStudios
at master 83 lines 2.6 kB view raw
1#ifndef GEO_UTILITIES_H 2#define GEO_UTILITIES_H 3 4#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" 5#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Packing.hlsl" 6 7struct CylinderBound 8{ 9 float3 center; 10 float3 axis; 11 float halfHeight; 12 float capRadius; 13}; 14 15struct SphereBound 16{ 17 float3 center; 18 float radius; 19}; 20 21float CompleteSinCos(float sinOrCos) 22{ 23 return sqrt(max(1.0f - sinOrCos*sinOrCos, 0.0f)); 24} 25 26float2 ProjectedHalfLengths(CylinderBound cylinder, float3 planeNormal) 27{ 28 float absCosTheta = abs(dot(planeNormal, cylinder.axis)); 29 float sinTheta = CompleteSinCos(absCosTheta); 30 31 float h = cylinder.halfHeight; 32 float r = cylinder.capRadius; 33 34 float halfLengthAlongNormal = absCosTheta * h + sinTheta * r; 35 float halfLengthInPlane = max(sinTheta * h + absCosTheta * r, r); // ellipse, so use max of two axis lengths 36 37 return float2(halfLengthInPlane, halfLengthAlongNormal); 38} 39 40struct BoundingObjectData 41{ 42 float3 frontCenterPosRWS; 43 float2 centerPosNDC; 44 float2 radialPosNDC; 45}; 46 47BoundingObjectData CalculateBoundingObjectData(SphereBound boundingSphere, 48 float4x4 viewProjMatrix, 49 float4 viewOriginWorldSpace, 50 float4 radialDirWorldSpace, 51 float4 facingDirWorldSpace) 52{ 53 const float3 centerPosRWS = boundingSphere.center - viewOriginWorldSpace.xyz; 54 55 const float3 radialVec = abs(boundingSphere.radius) * radialDirWorldSpace.xyz; 56 const float3 facingVec = abs(boundingSphere.radius) * facingDirWorldSpace.xyz; 57 58 BoundingObjectData data; 59 data.centerPosNDC = ComputeNormalizedDeviceCoordinates(centerPosRWS, viewProjMatrix); 60 data.radialPosNDC = ComputeNormalizedDeviceCoordinates(centerPosRWS + radialVec, viewProjMatrix); 61 data.frontCenterPosRWS = centerPosRWS + facingVec; 62 return data; 63} 64 65BoundingObjectData CalculateBoundingObjectData(CylinderBound cylinderBound, 66 float4x4 viewProjMatrix, 67 float4 viewOriginWorldSpace, 68 float4 radialDirWorldSpace, 69 float4 facingDirWorldSpace) 70{ 71 const float3 centerPosRWS = cylinderBound.center - viewOriginWorldSpace.xyz; 72 73 const float2 halfLengths = ProjectedHalfLengths(cylinderBound, facingDirWorldSpace.xyz); 74 const float3 radialVec = halfLengths.x * radialDirWorldSpace.xyz; 75 76 BoundingObjectData data; 77 data.centerPosNDC = ComputeNormalizedDeviceCoordinates(centerPosRWS, viewProjMatrix); 78 data.radialPosNDC = ComputeNormalizedDeviceCoordinates(centerPosRWS + radialVec, viewProjMatrix); 79 data.frontCenterPosRWS = centerPosRWS + halfLengths.y * facingDirWorldSpace.xyz; 80 return data; 81} 82 83#endif