3 float length3(float4 a)
\r
9 float4 normalize3(float4 a)
\r
12 return normalize(a);
\r
16 ResetNormalsAndAreasKernel(
\r
17 const unsigned int numNodes,
\r
18 __global float4 * g_vertexNormals,
\r
19 __global float * g_vertexArea GUID_ARG)
\r
21 if( get_global_id(0) < numNodes )
\r
23 g_vertexNormals[get_global_id(0)] = (float4)(0.0f, 0.0f, 0.0f, 0.0f);
\r
24 g_vertexArea[get_global_id(0)] = 0.0f;
\r
30 UpdateSoftBodiesKernel(
\r
31 const unsigned int startFace,
\r
32 const unsigned int numFaces,
\r
33 __global int4 * g_triangleVertexIndexSet,
\r
34 __global float4 * g_vertexPositions,
\r
35 __global float4 * g_vertexNormals,
\r
36 __global float * g_vertexArea,
\r
37 __global float4 * g_triangleNormals,
\r
38 __global float * g_triangleArea GUID_ARG)
\r
40 int faceID = get_global_id(0) + startFace;
\r
41 if( get_global_id(0) < numFaces )
\r
43 int4 triangleIndexSet = g_triangleVertexIndexSet[ faceID ];
\r
44 int nodeIndex0 = triangleIndexSet.x;
\r
45 int nodeIndex1 = triangleIndexSet.y;
\r
46 int nodeIndex2 = triangleIndexSet.z;
\r
48 float4 node0 = g_vertexPositions[nodeIndex0];
\r
49 float4 node1 = g_vertexPositions[nodeIndex1];
\r
50 float4 node2 = g_vertexPositions[nodeIndex2];
\r
51 float4 nodeNormal0 = g_vertexNormals[nodeIndex0];
\r
52 float4 nodeNormal1 = g_vertexNormals[nodeIndex1];
\r
53 float4 nodeNormal2 = g_vertexNormals[nodeIndex2];
\r
54 float vertexArea0 = g_vertexArea[nodeIndex0];
\r
55 float vertexArea1 = g_vertexArea[nodeIndex1];
\r
56 float vertexArea2 = g_vertexArea[nodeIndex2];
\r
58 float4 vector0 = node1 - node0;
\r
59 float4 vector1 = node2 - node0;
\r
61 float4 faceNormal = cross(vector0, vector1);
\r
62 float triangleArea = length(faceNormal);
\r
64 nodeNormal0 = nodeNormal0 + faceNormal;
\r
65 nodeNormal1 = nodeNormal1 + faceNormal;
\r
66 nodeNormal2 = nodeNormal2 + faceNormal;
\r
67 vertexArea0 = vertexArea0 + triangleArea;
\r
68 vertexArea1 = vertexArea1 + triangleArea;
\r
69 vertexArea2 = vertexArea2 + triangleArea;
\r
71 g_triangleNormals[faceID] = normalize3(faceNormal);
\r
72 g_vertexNormals[nodeIndex0] = nodeNormal0;
\r
73 g_vertexNormals[nodeIndex1] = nodeNormal1;
\r
74 g_vertexNormals[nodeIndex2] = nodeNormal2;
\r
75 g_triangleArea[faceID] = triangleArea;
\r
76 g_vertexArea[nodeIndex0] = vertexArea0;
\r
77 g_vertexArea[nodeIndex1] = vertexArea1;
\r
78 g_vertexArea[nodeIndex2] = vertexArea2;
\r
83 NormalizeNormalsAndAreasKernel(
\r
84 const unsigned int numNodes,
\r
85 __global int * g_vertexTriangleCount,
\r
86 __global float4 * g_vertexNormals,
\r
87 __global float * g_vertexArea GUID_ARG)
\r
89 if( get_global_id(0) < numNodes )
\r
91 float4 normal = g_vertexNormals[get_global_id(0)];
\r
92 float area = g_vertexArea[get_global_id(0)];
\r
93 int numTriangles = g_vertexTriangleCount[get_global_id(0)];
\r
95 float vectorLength = length3(normal);
\r
97 g_vertexNormals[get_global_id(0)] = normalize3(normal);
\r
98 g_vertexArea[get_global_id(0)] = area/(float)(numTriangles);
\r