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