== SoC Bullet - Bullet Upgrade to 2.76 ==
[blender.git] / extern / bullet2 / BulletCollision / CollisionShapes / btConvexPointCloudShape.cpp
1 /*
2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2009 Erwin Coumans  http://bulletphysics.org
4
5 This software is provided 'as-is', without any express or implied warranty.
6 In no event will the authors be held liable for any damages arising from the use of this software.
7 Permission is granted to anyone to use this software for any purpose, 
8 including commercial applications, and to alter it and redistribute it freely, 
9 subject to the following restrictions:
10
11 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
13 3. This notice may not be removed or altered from any source distribution.
14 */
15
16 #include "btConvexPointCloudShape.h"
17 #include "BulletCollision/CollisionShapes/btCollisionMargin.h"
18
19 #include "LinearMath/btQuaternion.h"
20
21 void btConvexPointCloudShape::setLocalScaling(const btVector3& scaling)
22 {
23         m_localScaling = scaling;
24         recalcLocalAabb();
25 }
26
27 #ifndef __SPU__
28 btVector3       btConvexPointCloudShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0)const
29 {
30         btVector3 supVec(btScalar(0.),btScalar(0.),btScalar(0.));
31         btScalar newDot,maxDot = btScalar(-BT_LARGE_FLOAT);
32
33         btVector3 vec = vec0;
34         btScalar lenSqr = vec.length2();
35         if (lenSqr < btScalar(0.0001))
36         {
37                 vec.setValue(1,0,0);
38         } else
39         {
40                 btScalar rlen = btScalar(1.) / btSqrt(lenSqr );
41                 vec *= rlen;
42         }
43
44
45         for (int i=0;i<m_numPoints;i++)
46         {
47                 btVector3 vtx = getScaledPoint(i);
48
49                 newDot = vec.dot(vtx);
50                 if (newDot > maxDot)
51                 {
52                         maxDot = newDot;
53                         supVec = vtx;
54                 }
55         }
56         return supVec;
57 }
58
59 void    btConvexPointCloudShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
60 {
61         btScalar newDot;
62         //use 'w' component of supportVerticesOut?
63         {
64                 for (int i=0;i<numVectors;i++)
65                 {
66                         supportVerticesOut[i][3] = btScalar(-BT_LARGE_FLOAT);
67                 }
68         }
69         for (int i=0;i<m_numPoints;i++)
70         {
71                 btVector3 vtx = getScaledPoint(i);
72
73                 for (int j=0;j<numVectors;j++)
74                 {
75                         const btVector3& vec = vectors[j];
76                         
77                         newDot = vec.dot(vtx);
78                         if (newDot > supportVerticesOut[j][3])
79                         {
80                                 //WARNING: don't swap next lines, the w component would get overwritten!
81                                 supportVerticesOut[j] = vtx;
82                                 supportVerticesOut[j][3] = newDot;
83                         }
84                 }
85         }
86
87
88
89 }
90         
91
92
93 btVector3       btConvexPointCloudShape::localGetSupportingVertex(const btVector3& vec)const
94 {
95         btVector3 supVertex = localGetSupportingVertexWithoutMargin(vec);
96
97         if ( getMargin()!=btScalar(0.) )
98         {
99                 btVector3 vecnorm = vec;
100                 if (vecnorm .length2() < (SIMD_EPSILON*SIMD_EPSILON))
101                 {
102                         vecnorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.));
103                 } 
104                 vecnorm.normalize();
105                 supVertex+= getMargin() * vecnorm;
106         }
107         return supVertex;
108 }
109
110
111 #endif
112
113
114
115
116
117
118 //currently just for debugging (drawing), perhaps future support for algebraic continuous collision detection
119 //Please note that you can debug-draw btConvexHullShape with the Raytracer Demo
120 int     btConvexPointCloudShape::getNumVertices() const
121 {
122         return m_numPoints;
123 }
124
125 int btConvexPointCloudShape::getNumEdges() const
126 {
127         return 0;
128 }
129
130 void btConvexPointCloudShape::getEdge(int i,btVector3& pa,btVector3& pb) const
131 {
132         btAssert (0);
133 }
134
135 void btConvexPointCloudShape::getVertex(int i,btVector3& vtx) const
136 {
137         vtx = m_unscaledPoints[i]*m_localScaling;
138 }
139
140 int     btConvexPointCloudShape::getNumPlanes() const
141 {
142         return 0;
143 }
144
145 void btConvexPointCloudShape::getPlane(btVector3& ,btVector3& ,int ) const
146 {
147
148         btAssert(0);
149 }
150
151 //not yet
152 bool btConvexPointCloudShape::isInside(const btVector3& ,btScalar ) const
153 {
154         btAssert(0);
155         return false;
156 }
157