A game about forced loneliness, made by TACStudios
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