Blender V2.61 - r43446
|
00001 /* 00002 Bullet Continuous Collision Detection and Physics Library 00003 Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org 00004 00005 This software is provided 'as-is', without any express or implied warranty. 00006 In no event will the authors be held liable for any damages arising from the use of this software. 00007 Permission is granted to anyone to use this software for any purpose, 00008 including commercial applications, and to alter it and redistribute it freely, 00009 subject to the following restrictions: 00010 00011 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. 00012 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 00013 3. This notice may not be removed or altered from any source distribution. 00014 */ 00015 00016 #include "btTetrahedronShape.h" 00017 #include "LinearMath/btMatrix3x3.h" 00018 00019 btBU_Simplex1to4::btBU_Simplex1to4() : btPolyhedralConvexAabbCachingShape (), 00020 m_numVertices(0) 00021 { 00022 m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE; 00023 } 00024 00025 btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0) : btPolyhedralConvexAabbCachingShape (), 00026 m_numVertices(0) 00027 { 00028 m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE; 00029 addVertex(pt0); 00030 } 00031 00032 btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0,const btVector3& pt1) : btPolyhedralConvexAabbCachingShape (), 00033 m_numVertices(0) 00034 { 00035 m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE; 00036 addVertex(pt0); 00037 addVertex(pt1); 00038 } 00039 00040 btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0,const btVector3& pt1,const btVector3& pt2) : btPolyhedralConvexAabbCachingShape (), 00041 m_numVertices(0) 00042 { 00043 m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE; 00044 addVertex(pt0); 00045 addVertex(pt1); 00046 addVertex(pt2); 00047 } 00048 00049 btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0,const btVector3& pt1,const btVector3& pt2,const btVector3& pt3) : btPolyhedralConvexAabbCachingShape (), 00050 m_numVertices(0) 00051 { 00052 m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE; 00053 addVertex(pt0); 00054 addVertex(pt1); 00055 addVertex(pt2); 00056 addVertex(pt3); 00057 } 00058 00059 00060 void btBU_Simplex1to4::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const 00061 { 00062 #if 1 00063 btPolyhedralConvexAabbCachingShape::getAabb(t,aabbMin,aabbMax); 00064 #else 00065 aabbMin.setValue(BT_LARGE_FLOAT,BT_LARGE_FLOAT,BT_LARGE_FLOAT); 00066 aabbMax.setValue(-BT_LARGE_FLOAT,-BT_LARGE_FLOAT,-BT_LARGE_FLOAT); 00067 00068 //just transform the vertices in worldspace, and take their AABB 00069 for (int i=0;i<m_numVertices;i++) 00070 { 00071 btVector3 worldVertex = t(m_vertices[i]); 00072 aabbMin.setMin(worldVertex); 00073 aabbMax.setMax(worldVertex); 00074 } 00075 #endif 00076 } 00077 00078 00079 00080 00081 00082 void btBU_Simplex1to4::addVertex(const btVector3& pt) 00083 { 00084 m_vertices[m_numVertices++] = pt; 00085 recalcLocalAabb(); 00086 } 00087 00088 00089 int btBU_Simplex1to4::getNumVertices() const 00090 { 00091 return m_numVertices; 00092 } 00093 00094 int btBU_Simplex1to4::getNumEdges() const 00095 { 00096 //euler formula, F-E+V = 2, so E = F+V-2 00097 00098 switch (m_numVertices) 00099 { 00100 case 0: 00101 return 0; 00102 case 1: return 0; 00103 case 2: return 1; 00104 case 3: return 3; 00105 case 4: return 6; 00106 00107 00108 } 00109 00110 return 0; 00111 } 00112 00113 void btBU_Simplex1to4::getEdge(int i,btVector3& pa,btVector3& pb) const 00114 { 00115 00116 switch (m_numVertices) 00117 { 00118 00119 case 2: 00120 pa = m_vertices[0]; 00121 pb = m_vertices[1]; 00122 break; 00123 case 3: 00124 switch (i) 00125 { 00126 case 0: 00127 pa = m_vertices[0]; 00128 pb = m_vertices[1]; 00129 break; 00130 case 1: 00131 pa = m_vertices[1]; 00132 pb = m_vertices[2]; 00133 break; 00134 case 2: 00135 pa = m_vertices[2]; 00136 pb = m_vertices[0]; 00137 break; 00138 00139 } 00140 break; 00141 case 4: 00142 switch (i) 00143 { 00144 case 0: 00145 pa = m_vertices[0]; 00146 pb = m_vertices[1]; 00147 break; 00148 case 1: 00149 pa = m_vertices[1]; 00150 pb = m_vertices[2]; 00151 break; 00152 case 2: 00153 pa = m_vertices[2]; 00154 pb = m_vertices[0]; 00155 break; 00156 case 3: 00157 pa = m_vertices[0]; 00158 pb = m_vertices[3]; 00159 break; 00160 case 4: 00161 pa = m_vertices[1]; 00162 pb = m_vertices[3]; 00163 break; 00164 case 5: 00165 pa = m_vertices[2]; 00166 pb = m_vertices[3]; 00167 break; 00168 } 00169 00170 } 00171 00172 00173 00174 00175 } 00176 00177 void btBU_Simplex1to4::getVertex(int i,btVector3& vtx) const 00178 { 00179 vtx = m_vertices[i]; 00180 } 00181 00182 int btBU_Simplex1to4::getNumPlanes() const 00183 { 00184 switch (m_numVertices) 00185 { 00186 case 0: 00187 return 0; 00188 case 1: 00189 return 0; 00190 case 2: 00191 return 0; 00192 case 3: 00193 return 2; 00194 case 4: 00195 return 4; 00196 default: 00197 { 00198 } 00199 } 00200 return 0; 00201 } 00202 00203 00204 void btBU_Simplex1to4::getPlane(btVector3&, btVector3& ,int ) const 00205 { 00206 00207 } 00208 00209 int btBU_Simplex1to4::getIndex(int ) const 00210 { 00211 return 0; 00212 } 00213 00214 bool btBU_Simplex1to4::isInside(const btVector3& ,btScalar ) const 00215 { 00216 return false; 00217 } 00218