~ubuntu-branches/ubuntu/vivid/emscripten/vivid

« back to all changes in this revision

Viewing changes to tests/bullet/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/UpdateNormals.cl

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2013-05-02 13:11:51 UTC
  • Revision ID: package-import@ubuntu.com-20130502131151-q8dvteqr1ef2x7xz
Tags: upstream-1.4.1~20130504~adb56cb
ImportĀ upstreamĀ versionĀ 1.4.1~20130504~adb56cb

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
MSTRINGIFY(
 
2
 
 
3
//#define float3 float4
 
4
 
 
5
/*float length3(float3 a)
 
6
{
 
7
        a.w = 0;
 
8
        return length(a);
 
9
}
 
10
 
 
11
float normalize3(float3 a)
 
12
{
 
13
        a.w = 0;
 
14
        return normalize(a);
 
15
}*/
 
16
 
 
17
__kernel void 
 
18
ResetNormalsAndAreasKernel(
 
19
        const unsigned int numNodes,
 
20
        __global float4 * g_vertexNormals,
 
21
        __global float * g_vertexArea)
 
22
{
 
23
        if( get_global_id(0) < numNodes )
 
24
        {
 
25
                g_vertexNormals[get_global_id(0)] = (float4)(0.0f, 0.0f, 0.0f, 0.0f);
 
26
                g_vertexArea[get_global_id(0)]    = 0.0f;
 
27
        }
 
28
}
 
29
 
 
30
__kernel void 
 
31
UpdateSoftBodiesKernel(
 
32
        const unsigned int startFace,
 
33
        const unsigned int numFaces,
 
34
        __global int4 * g_triangleVertexIndexSet,
 
35
        __global float4 * g_vertexPositions,
 
36
        __global float4 * g_vertexNormals,
 
37
        __global float * g_vertexArea,
 
38
        __global float4 * g_triangleNormals,
 
39
        __global float * g_triangleArea)
 
40
{
 
41
        int faceID = get_global_id(0) + startFace;
 
42
        if( get_global_id(0) < numFaces )
 
43
        {               
 
44
                int4 triangleIndexSet = g_triangleVertexIndexSet[ faceID ];
 
45
                int nodeIndex0 = triangleIndexSet.x;
 
46
                int nodeIndex1 = triangleIndexSet.y;
 
47
                int nodeIndex2 = triangleIndexSet.z;
 
48
 
 
49
                float3 node0 = g_vertexPositions[nodeIndex0].xyz;
 
50
                float3 node1 = g_vertexPositions[nodeIndex1].xyz;
 
51
                float3 node2 = g_vertexPositions[nodeIndex2].xyz;
 
52
                float3 nodeNormal0 = g_vertexNormals[nodeIndex0].xyz;
 
53
                float3 nodeNormal1 = g_vertexNormals[nodeIndex1].xyz;
 
54
                float3 nodeNormal2 = g_vertexNormals[nodeIndex2].xyz;
 
55
                float vertexArea0 = g_vertexArea[nodeIndex0];
 
56
                float vertexArea1 = g_vertexArea[nodeIndex1];
 
57
                float vertexArea2 = g_vertexArea[nodeIndex2];
 
58
                
 
59
                float3 vector0 = node1 - node0;
 
60
                float3 vector1 = node2 - node0;
 
61
                
 
62
                float3 faceNormal = cross(vector0.xyz, vector1.xyz);
 
63
                float triangleArea = length(faceNormal);
 
64
 
 
65
                nodeNormal0 = nodeNormal0 + faceNormal;
 
66
                nodeNormal1 = nodeNormal1 + faceNormal;
 
67
                nodeNormal2 = nodeNormal2 + faceNormal;
 
68
                vertexArea0 = vertexArea0 + triangleArea;
 
69
                vertexArea1 = vertexArea1 + triangleArea;
 
70
                vertexArea2 = vertexArea2 + triangleArea;
 
71
                
 
72
                g_triangleNormals[faceID] = (float4)(normalize(faceNormal), 0.f);
 
73
                g_vertexNormals[nodeIndex0] = (float4)(nodeNormal0, 0.f);
 
74
                g_vertexNormals[nodeIndex1] = (float4)(nodeNormal1, 0.f);
 
75
                g_vertexNormals[nodeIndex2] = (float4)(nodeNormal2, 0.f);
 
76
                g_triangleArea[faceID] = triangleArea;
 
77
                g_vertexArea[nodeIndex0] = vertexArea0;
 
78
                g_vertexArea[nodeIndex1] = vertexArea1;
 
79
                g_vertexArea[nodeIndex2] = vertexArea2;
 
80
        }
 
81
}
 
82
 
 
83
__kernel void 
 
84
NormalizeNormalsAndAreasKernel( 
 
85
        const unsigned int numNodes,
 
86
        __global int * g_vertexTriangleCount,
 
87
        __global float4 * g_vertexNormals,
 
88
        __global float * g_vertexArea)
 
89
{
 
90
        if( get_global_id(0) < numNodes )
 
91
        {
 
92
                float4 normal = g_vertexNormals[get_global_id(0)];
 
93
                float area = g_vertexArea[get_global_id(0)];
 
94
                int numTriangles = g_vertexTriangleCount[get_global_id(0)];
 
95
                
 
96
                float vectorLength = length(normal);
 
97
                
 
98
                g_vertexNormals[get_global_id(0)] = normalize(normal);
 
99
                g_vertexArea[get_global_id(0)] = area/(float)(numTriangles);
 
100
        }
 
101
}
 
102
 
 
103
);
 
 
b'\\ No newline at end of file'