Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'extern/bullet/Bullet/CollisionShapes/ConvexHullShape.cpp')
-rw-r--r--extern/bullet/Bullet/CollisionShapes/ConvexHullShape.cpp146
1 files changed, 146 insertions, 0 deletions
diff --git a/extern/bullet/Bullet/CollisionShapes/ConvexHullShape.cpp b/extern/bullet/Bullet/CollisionShapes/ConvexHullShape.cpp
new file mode 100644
index 00000000000..0206324fa04
--- /dev/null
+++ b/extern/bullet/Bullet/CollisionShapes/ConvexHullShape.cpp
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2005 Erwin Coumans http://www.erwincoumans.com
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies.
+ * Erwin Coumans makes no representations about the suitability
+ * of this software for any purpose.
+ * It is provided "as is" without express or implied warranty.
+ */
+
+#include "ConvexHullShape.h"
+#include "NarrowPhaseCollision/CollisionMargin.h"
+
+#include "SimdQuaternion.h"
+
+
+ConvexHullShape ::ConvexHullShape (SimdPoint3* points,int numPoints)
+{
+ m_points.resize(numPoints);
+ for (int i=0;i<numPoints;i++)
+ m_points[i] = points[i];
+}
+
+SimdVector3 ConvexHullShape::LocalGetSupportingVertexWithoutMargin(const SimdVector3& vec0)const
+{
+ SimdVector3 supVec(0.f,0.f,0.f);
+ SimdScalar newDot,maxDot = -1e30f;
+
+ SimdVector3 vec = vec0;
+ SimdScalar lenSqr = vec.length2();
+ if (lenSqr < 0.0001f)
+ {
+ vec.setValue(1,0,0);
+ } else
+ {
+ float rlen = 1.f / sqrtf(lenSqr );
+ vec *= rlen;
+ }
+
+
+ for (int i=0;i<m_points.size();i++)
+ {
+ SimdPoint3 vtx = m_points[i] * m_localScaling;
+
+ newDot = vec.dot(vtx);
+ if (newDot > maxDot)
+ {
+ maxDot = newDot;
+ supVec = vtx;
+ }
+ }
+ return supVec;
+}
+
+
+SimdVector3 ConvexHullShape::LocalGetSupportingVertex(const SimdVector3& vec)const
+{
+ SimdVector3 supVertex = LocalGetSupportingVertexWithoutMargin(vec);
+
+ if ( GetMargin()!=0.f )
+ {
+ SimdVector3 vecnorm = vec;
+ if (vecnorm .length2() == 0.f)
+ {
+ vecnorm.setValue(-1.f,-1.f,-1.f);
+ }
+ vecnorm.normalize();
+ supVertex+= GetMargin() * vecnorm;
+ }
+ return supVertex;
+}
+
+
+
+
+
+void ConvexHullShape::CalculateLocalInertia(SimdScalar mass,SimdVector3& inertia)
+{
+ //not yet, return box inertia
+
+ float margin = GetMargin();
+
+ SimdTransform ident;
+ ident.setIdentity();
+ SimdVector3 aabbMin,aabbMax;
+ GetAabb(ident,aabbMin,aabbMax);
+ SimdVector3 halfExtents = (aabbMax-aabbMin)*0.5f;
+
+ SimdScalar lx=2.f*(halfExtents.x()+margin);
+ SimdScalar ly=2.f*(halfExtents.y()+margin);
+ SimdScalar lz=2.f*(halfExtents.z()+margin);
+ const SimdScalar x2 = lx*lx;
+ const SimdScalar y2 = ly*ly;
+ const SimdScalar z2 = lz*lz;
+ const SimdScalar scaledmass = mass * 0.08333333f;
+
+ inertia = scaledmass * (SimdVector3(y2+z2,x2+z2,x2+y2));
+
+}
+
+
+
+//currently just for debugging (drawing), perhaps future support for algebraic continuous collision detection
+//Please note that you can debug-draw ConvexHullShape with the Raytracer Demo
+int ConvexHullShape::GetNumVertices() const
+{
+ return m_points.size();
+}
+
+int ConvexHullShape::GetNumEdges() const
+{
+ return m_points.size()*m_points.size();
+}
+
+void ConvexHullShape::GetEdge(int i,SimdPoint3& pa,SimdPoint3& pb) const
+{
+
+ int index0 = i%m_points.size();
+ int index1 = i/m_points.size();
+ pa = m_points[index0];
+ pb = m_points[index1];
+}
+
+void ConvexHullShape::GetVertex(int i,SimdPoint3& vtx) const
+{
+ vtx = m_points[i];
+}
+
+int ConvexHullShape::GetNumPlanes() const
+{
+ return 0;
+}
+
+void ConvexHullShape::GetPlane(SimdVector3& planeNormal,SimdPoint3& planeSupport,int i ) const
+{
+ assert(0);
+}
+
+//not yet
+bool ConvexHullShape::IsInside(const SimdPoint3& pt,SimdScalar tolerance) const
+{
+ assert(0);
+ return false;
+}
+