Imported Upstream version 2.81
[platform/upstream/libbullet.git] / src / BulletMultiThreaded / GpuSoftBodySolvers / DX11 / HLSL / UpdateNormals.hlsl
1 MSTRINGIFY(\r
2 \r
3 cbuffer UpdateSoftBodiesCB : register( b0 )\r
4 {\r
5         unsigned int numNodes;\r
6         unsigned int startFace;\r
7         unsigned int numFaces;\r
8         float epsilon;\r
9 };\r
10 \r
11 \r
12 // Node indices for each link\r
13 StructuredBuffer<int4> g_triangleVertexIndexSet : register( t0 );\r
14 StructuredBuffer<float4> g_vertexPositions : register( t1 );\r
15 StructuredBuffer<int> g_vertexTriangleCount : register( t2 );\r
16 \r
17 RWStructuredBuffer<float4> g_vertexNormals : register( u0 );\r
18 RWStructuredBuffer<float> g_vertexArea : register( u1 );\r
19 RWStructuredBuffer<float4> g_triangleNormals : register( u2 );\r
20 RWStructuredBuffer<float> g_triangleArea : register( u3 );\r
21 \r
22 \r
23 [numthreads(128, 1, 1)]\r
24 void \r
25 ResetNormalsAndAreasKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex )\r
26 {\r
27         if( DTid.x < numNodes )\r
28         {\r
29                 g_vertexNormals[DTid.x] = float4(0.0f, 0.0f, 0.0f, 0.0f);\r
30                 g_vertexArea[DTid.x] = 0.0f;\r
31         }\r
32 }\r
33 \r
34 \r
35 [numthreads(128, 1, 1)]\r
36 void \r
37 UpdateSoftBodiesKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex )\r
38 {\r
39         int faceID = DTid.x + startFace;\r
40         if( DTid.x < numFaces )\r
41         {               \r
42                 int4 triangleIndexSet = g_triangleVertexIndexSet[ faceID ];\r
43                 int nodeIndex0 = triangleIndexSet.x;\r
44                 int nodeIndex1 = triangleIndexSet.y;\r
45                 int nodeIndex2 = triangleIndexSet.z;\r
46 \r
47                 float3 node0 = g_vertexPositions[nodeIndex0].xyz;\r
48                 float3 node1 = g_vertexPositions[nodeIndex1].xyz;\r
49                 float3 node2 = g_vertexPositions[nodeIndex2].xyz;\r
50                 float3 nodeNormal0 = g_vertexNormals[nodeIndex0].xyz;\r
51                 float3 nodeNormal1 = g_vertexNormals[nodeIndex1].xyz;\r
52                 float3 nodeNormal2 = g_vertexNormals[nodeIndex2].xyz;\r
53                 float vertexArea0 = g_vertexArea[nodeIndex0];\r
54                 float vertexArea1 = g_vertexArea[nodeIndex1];\r
55                 float vertexArea2 = g_vertexArea[nodeIndex2];\r
56                 \r
57                 float3 vector0 = node1 - node0;\r
58                 float3 vector1 = node2 - node0;\r
59                 \r
60                 float3 faceNormal = cross(vector0.xyz, vector1.xyz);\r
61                 float triangleArea = length(faceNormal);\r
62 \r
63                 nodeNormal0 = nodeNormal0 + faceNormal;\r
64                 nodeNormal1 = nodeNormal1 + faceNormal;\r
65                 nodeNormal2 = nodeNormal2 + faceNormal;\r
66                 vertexArea0 = vertexArea0 + triangleArea;\r
67                 vertexArea1 = vertexArea1 + triangleArea;\r
68                 vertexArea2 = vertexArea2 + triangleArea;\r
69                 \r
70                 g_triangleNormals[faceID] = float4(normalize(faceNormal), 0.f);\r
71                 g_vertexNormals[nodeIndex0] = float4(nodeNormal0, 0.f);\r
72                 g_vertexNormals[nodeIndex1] = float4(nodeNormal1, 0.f);\r
73                 g_vertexNormals[nodeIndex2] = float4(nodeNormal2, 0.f);\r
74                 g_triangleArea[faceID] = triangleArea;\r
75                 g_vertexArea[nodeIndex0] = vertexArea0;\r
76                 g_vertexArea[nodeIndex1] = vertexArea1;\r
77                 g_vertexArea[nodeIndex2] = vertexArea2;\r
78         }\r
79 }\r
80 \r
81 [numthreads(128, 1, 1)]\r
82 void \r
83 NormalizeNormalsAndAreasKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex )\r
84 {\r
85         if( DTid.x < numNodes )\r
86         {\r
87                 float4 normal = g_vertexNormals[DTid.x];\r
88                 float area = g_vertexArea[DTid.x];\r
89                 int numTriangles = g_vertexTriangleCount[DTid.x];\r
90                 \r
91                 float vectorLength = length(normal);\r
92                 \r
93                 g_vertexNormals[DTid.x] = normalize(normal);\r
94                 g_vertexArea[DTid.x] = area/float(numTriangles);\r
95         }\r
96 }\r
97 \r
98 );