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/ConvexTriangleCallback.cpp')
-rw-r--r--extern/bullet/Bullet/CollisionShapes/ConvexTriangleCallback.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/extern/bullet/Bullet/CollisionShapes/ConvexTriangleCallback.cpp b/extern/bullet/Bullet/CollisionShapes/ConvexTriangleCallback.cpp
new file mode 100644
index 00000000000..dbaaaf243fa
--- /dev/null
+++ b/extern/bullet/Bullet/CollisionShapes/ConvexTriangleCallback.cpp
@@ -0,0 +1,86 @@
+#include "ConvexTriangleCallback.h"
+#include "NarrowPhaseCollision/PersistentManifold.h"
+#include "NarrowPhaseCollision/ManifoldContactAddResult.h"
+#include "NarrowPhaseCollision/GjkPairDetector.h"
+#include "NarrowPhaseCollision/MinkowskiPenetrationDepthSolver.h"
+
+
+
+#include "TriangleShape.h"
+
+//m_manifoldPtr = m_dispatcher->GetNewManifold(proxy0->m_clientObject,proxy1->m_clientObject);
+ //m_dispatcher->ReleaseManifold( m_manifoldPtr );
+
+ConvexTriangleCallback::ConvexTriangleCallback(PersistentManifold* manifold,ConvexShape* convexShape,const SimdTransform&convexTransform,const SimdTransform& triangleMeshTransform)
+:m_triangleMeshTransform(triangleMeshTransform),
+ m_convexTransform(convexTransform),
+ m_convexShape(convexShape),
+ m_manifoldPtr(manifold),
+ m_triangleCount(0)
+{
+}
+
+ConvexTriangleCallback::~ConvexTriangleCallback()
+{
+
+}
+
+
+void ConvexTriangleCallback::ClearCache()
+{
+ m_manifoldPtr->ClearManifold();
+};
+
+
+
+void ConvexTriangleCallback::ProcessTriangle(SimdVector3* triangle)
+{
+
+ //triangle, convex
+ TriangleShape tm(triangle[0],triangle[1],triangle[2]);
+ tm.SetMargin(m_collisionMarginTriangle);
+ GjkPairDetector::ClosestPointInput input;
+ input.m_transformA = m_triangleMeshTransform;
+ input.m_transformB = m_convexTransform;
+
+ ManifoldContactAddResult output(m_triangleMeshTransform,m_convexTransform,m_manifoldPtr);
+
+
+ VoronoiSimplexSolver simplexSolver;
+ MinkowskiPenetrationDepthSolver penetrationDepthSolver;
+
+ GjkPairDetector gjkDetector(&tm,m_convexShape,&simplexSolver,&penetrationDepthSolver);
+
+ gjkDetector.SetMinkowskiA(&tm);
+ gjkDetector.SetMinkowskiB(m_convexShape);
+ input.m_maximumDistanceSquared = tm.GetMargin()+ m_convexShape->GetMargin() + m_manifoldPtr->GetManifoldMargin();
+ input.m_maximumDistanceSquared*= input.m_maximumDistanceSquared;
+
+ input.m_maximumDistanceSquared = 1e30f;//?
+
+
+ gjkDetector.GetClosestPoints(input,output);
+
+
+}
+
+
+
+void ConvexTriangleCallback::Update(float collisionMarginTriangle)
+{
+ m_triangleCount = 0;
+ m_collisionMarginTriangle = collisionMarginTriangle;
+
+ SimdTransform boxInTriangleSpace;
+ boxInTriangleSpace = m_triangleMeshTransform.inverse() * m_convexTransform;
+
+ m_convexShape->GetAabb(boxInTriangleSpace,m_aabbMin,m_aabbMax);
+
+ float extraMargin = CONVEX_DISTANCE_MARGIN;
+
+ SimdVector3 extra(extraMargin,extraMargin,extraMargin);
+
+ m_aabbMax += extra;
+ m_aabbMin -= extra;
+
+}