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/BoxShape.h')
-rw-r--r--extern/bullet/Bullet/CollisionShapes/BoxShape.h274
1 files changed, 274 insertions, 0 deletions
diff --git a/extern/bullet/Bullet/CollisionShapes/BoxShape.h b/extern/bullet/Bullet/CollisionShapes/BoxShape.h
new file mode 100644
index 00000000000..620ddd7e4f6
--- /dev/null
+++ b/extern/bullet/Bullet/CollisionShapes/BoxShape.h
@@ -0,0 +1,274 @@
+/*
+ * 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.
+ */
+
+#ifndef OBB_BOX_MINKOWSKI_H
+#define OBB_BOX_MINKOWSKI_H
+
+#include "PolyhedralConvexShape.h"
+#include "NarrowPhaseCollision/CollisionMargin.h"
+#include "BroadphaseCollision/BroadphaseProxy.h"
+#include "SimdPoint3.h"
+#include "SimdMinMax.h"
+
+///BoxShape implements both a feature based (vertex/edge/plane) and implicit (getSupportingVertex) Box
+class BoxShape: public PolyhedralConvexShape
+{
+
+ SimdVector3 m_boxHalfExtents1;
+
+
+public:
+
+ virtual ~BoxShape()
+ {
+
+ }
+
+ SimdVector3 GetHalfExtents() const{ return m_boxHalfExtents1 * m_localScaling;}
+ //const SimdVector3& GetHalfExtents() const{ return m_boxHalfExtents1;}
+
+
+
+ virtual int GetShapeType() const { return BOX_SHAPE_PROXYTYPE;}
+
+ virtual SimdVector3 LocalGetSupportingVertex(const SimdVector3& vec) const
+ {
+
+ SimdVector3 halfExtents = GetHalfExtents();
+
+ SimdVector3 supVertex;
+ supVertex = SimdPoint3(vec.x() < SimdScalar(0.0f) ? -halfExtents.x() : halfExtents.x(),
+ vec.y() < SimdScalar(0.0f) ? -halfExtents.y() : halfExtents.y(),
+ vec.z() < SimdScalar(0.0f) ? -halfExtents.z() : halfExtents.z());
+
+
+ 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;
+ }
+
+
+ virtual SimdVector3 LocalGetSupportingVertexWithoutMargin(const SimdVector3& vec)const
+ {
+ SimdVector3 halfExtents = GetHalfExtents();
+
+ return SimdVector3(vec.x() < SimdScalar(0.0f) ? -halfExtents.x() : halfExtents.x(),
+ vec.y() < SimdScalar(0.0f) ? -halfExtents.y() : halfExtents.y(),
+ vec.z() < SimdScalar(0.0f) ? -halfExtents.z() : halfExtents.z());
+ }
+
+
+ BoxShape( const SimdVector3& boxHalfExtents) : m_boxHalfExtents1(boxHalfExtents){};
+
+ virtual void GetAabb(const SimdTransform& t,SimdVector3& aabbMin,SimdVector3& aabbMax) const;
+
+
+
+ virtual void CalculateLocalInertia(SimdScalar mass,SimdVector3& inertia)
+ {
+ float margin = GetMargin();
+ SimdVector3 halfExtents = GetHalfExtents();
+
+ 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));
+
+// inertia.x() = scaledmass * (y2+z2);
+// inertia.y() = scaledmass * (x2+z2);
+// inertia.z() = scaledmass * (x2+y2);
+ }
+
+
+ virtual void GetPlane(SimdVector3& planeNormal,SimdPoint3& planeSupport,int i ) const
+ {
+ //this plane might not be aligned...
+ SimdVector4 plane ;
+ GetPlaneEquation(plane,i);
+ planeNormal = SimdVector3(plane.getX(),plane.getY(),plane.getZ());
+ planeSupport = LocalGetSupportingVertex(-planeNormal);
+ }
+
+
+ virtual int GetNumPlanes() const
+ {
+ return 6;
+ }
+
+ virtual int GetNumVertices() const
+ {
+ return 8;
+ }
+
+ virtual int GetNumEdges() const
+ {
+ return 12;
+ }
+
+
+ virtual void GetVertex(int i,SimdVector3& vtx) const
+ {
+ SimdVector3 halfExtents = GetHalfExtents();
+
+ vtx = SimdVector3(
+ halfExtents.x() * (1-(i&1)) - halfExtents.x() * (i&1),
+ halfExtents.y() * (1-((i&2)>>1)) - halfExtents.y() * ((i&2)>>1),
+ halfExtents.z() * (1-((i&4)>>2)) - halfExtents.z() * ((i&4)>>2));
+ }
+
+
+ virtual void GetPlaneEquation(SimdVector4& plane,int i) const
+ {
+ SimdVector3 halfExtents = GetHalfExtents();
+
+ switch (i)
+ {
+ case 0:
+ plane.setValue(1.f,0.f,0.f);
+ plane[3] = -halfExtents.x();
+ break;
+ case 1:
+ plane.setValue(-1.f,0.f,0.f);
+ plane[3] = -halfExtents.x();
+ break;
+ case 2:
+ plane.setValue(0.f,1.f,0.f);
+ plane[3] = -halfExtents.y();
+ break;
+ case 3:
+ plane.setValue(0.f,-1.f,0.f);
+ plane[3] = -halfExtents.y();
+ break;
+ case 4:
+ plane.setValue(0.f,0.f,1.f);
+ plane[3] = -halfExtents.z();
+ break;
+ case 5:
+ plane.setValue(0.f,0.f,-1.f);
+ plane[3] = -halfExtents.z();
+ break;
+ default:
+ assert(0);
+ }
+ }
+
+
+ virtual void GetEdge(int i,SimdPoint3& pa,SimdPoint3& pb) const
+ //virtual void GetEdge(int i,Edge& edge) const
+ {
+ int edgeVert0 = 0;
+ int edgeVert1 = 0;
+
+ switch (i)
+ {
+ case 0:
+ edgeVert0 = 0;
+ edgeVert1 = 1;
+ break;
+ case 1:
+ edgeVert0 = 0;
+ edgeVert1 = 2;
+ break;
+ case 2:
+ edgeVert0 = 1;
+ edgeVert1 = 3;
+
+ break;
+ case 3:
+ edgeVert0 = 2;
+ edgeVert1 = 3;
+ break;
+ case 4:
+ edgeVert0 = 0;
+ edgeVert1 = 4;
+ break;
+ case 5:
+ edgeVert0 = 1;
+ edgeVert1 = 5;
+
+ break;
+ case 6:
+ edgeVert0 = 2;
+ edgeVert1 = 6;
+ break;
+ case 7:
+ edgeVert0 = 3;
+ edgeVert1 = 7;
+ break;
+ case 8:
+ edgeVert0 = 4;
+ edgeVert1 = 5;
+ break;
+ case 9:
+ edgeVert0 = 4;
+ edgeVert1 = 6;
+ break;
+ case 10:
+ edgeVert0 = 5;
+ edgeVert1 = 7;
+ break;
+ case 11:
+ edgeVert0 = 6;
+ edgeVert1 = 7;
+ break;
+ default:
+ ASSERT(0);
+
+ }
+
+ GetVertex(edgeVert0,pa );
+ GetVertex(edgeVert1,pb );
+ }
+
+
+
+
+
+ virtual bool IsInside(const SimdPoint3& pt,SimdScalar tolerance) const
+ {
+ SimdVector3 halfExtents = GetHalfExtents();
+
+ //SimdScalar minDist = 2*tolerance;
+
+ bool result = (pt.x() <= (halfExtents.x()+tolerance)) &&
+ (pt.x() >= (-halfExtents.x()-tolerance)) &&
+ (pt.y() <= (halfExtents.y()+tolerance)) &&
+ (pt.y() >= (-halfExtents.y()-tolerance)) &&
+ (pt.z() <= (halfExtents.z()+tolerance)) &&
+ (pt.z() >= (-halfExtents.z()-tolerance));
+
+ return result;
+ }
+
+
+ //debugging
+ virtual char* GetName()const
+ {
+ return "Box";
+ }
+
+
+};
+
+#endif //OBB_BOX_MINKOWSKI_H