3 cbuffer UpdateSoftBodiesCB : register( b0 )
\r
5 unsigned int numNodes;
\r
6 unsigned int startFace;
\r
7 unsigned int numFaces;
\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
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
23 [numthreads(128, 1, 1)]
\r
25 ResetNormalsAndAreasKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex )
\r
27 if( DTid.x < numNodes )
\r
29 g_vertexNormals[DTid.x] = float4(0.0f, 0.0f, 0.0f, 0.0f);
\r
30 g_vertexArea[DTid.x] = 0.0f;
\r
35 [numthreads(128, 1, 1)]
\r
37 UpdateSoftBodiesKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex )
\r
39 int faceID = DTid.x + startFace;
\r
40 if( DTid.x < numFaces )
\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
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
57 float3 vector0 = node1 - node0;
\r
58 float3 vector1 = node2 - node0;
\r
60 float3 faceNormal = cross(vector0.xyz, vector1.xyz);
\r
61 float triangleArea = length(faceNormal);
\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
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
81 [numthreads(128, 1, 1)]
\r
83 NormalizeNormalsAndAreasKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex )
\r
85 if( DTid.x < numNodes )
\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
91 float vectorLength = length(normal);
\r
93 g_vertexNormals[DTid.x] = normalize(normal);
\r
94 g_vertexArea[DTid.x] = area/float(numTriangles);
\r