diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2022-03-09 21:15:53 +0100 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2022-03-09 21:45:47 +0100 |
commit | 3d7f1555865a981b7144becfc58d3f3f34362f5f (patch) | |
tree | d92912c6d700468b3330148b9179026b9f4efcb4 /thirdparty/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp | |
parent | 33c907f9f5b3ec1a43d0251d7cac80da49b5b658 (diff) |
Remove unused Bullet module and thirdparty code
It has been disabled in `master` since one year (#45852) and our plan
is for Bullet, and possibly other thirdparty physics engines, to be
implemented via GDExtension so that they can be selected by the users
who need them.
Diffstat (limited to 'thirdparty/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp')
-rw-r--r-- | thirdparty/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp | 866 |
1 files changed, 0 insertions, 866 deletions
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp deleted file mode 100644 index 73e3db1010..0000000000 --- a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp +++ /dev/null @@ -1,866 +0,0 @@ -/* -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2007 Francisco Leon Najera. C.C. 80087371. -email: projectileman@yahoo.com - - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -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. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ -/* -Author: Francisco Leon Najera -Concave-Concave Collision - -*/ - -#include "BulletCollision/CollisionDispatch/btManifoldResult.h" -#include "LinearMath/btIDebugDraw.h" -#include "BulletCollision/CollisionDispatch/btCollisionObject.h" -#include "BulletCollision/CollisionShapes/btBoxShape.h" -#include "btGImpactCollisionAlgorithm.h" -#include "btContactProcessing.h" -#include "LinearMath/btQuickprof.h" - -//! Class for accessing the plane equation -class btPlaneShape : public btStaticPlaneShape -{ -public: - btPlaneShape(const btVector3& v, float f) - : btStaticPlaneShape(v, f) - { - } - - void get_plane_equation(btVector4& equation) - { - equation[0] = m_planeNormal[0]; - equation[1] = m_planeNormal[1]; - equation[2] = m_planeNormal[2]; - equation[3] = m_planeConstant; - } - - void get_plane_equation_transformed(const btTransform& trans, btVector4& equation) const - { - const btVector3 normal = trans.getBasis() * m_planeNormal; - equation[0] = normal[0]; - equation[1] = normal[1]; - equation[2] = normal[2]; - equation[3] = normal.dot(trans * (m_planeConstant * m_planeNormal)); - } -}; - -////////////////////////////////////////////////////////////////////////////////////////////// -#ifdef TRI_COLLISION_PROFILING - -btClock g_triangle_clock; - -float g_accum_triangle_collision_time = 0; -int g_count_triangle_collision = 0; - -void bt_begin_gim02_tri_time() -{ - g_triangle_clock.reset(); -} - -void bt_end_gim02_tri_time() -{ - g_accum_triangle_collision_time += g_triangle_clock.getTimeMicroseconds(); - g_count_triangle_collision++; -} -#endif //TRI_COLLISION_PROFILING -//! Retrieving shapes shapes -/*! -Declared here due of insuficent space on Pool allocators -*/ -//!@{ -class GIM_ShapeRetriever -{ -public: - const btGImpactShapeInterface* m_gim_shape; - btTriangleShapeEx m_trishape; - btTetrahedronShapeEx m_tetrashape; - -public: - class ChildShapeRetriever - { - public: - GIM_ShapeRetriever* m_parent; - virtual const btCollisionShape* getChildShape(int index) - { - return m_parent->m_gim_shape->getChildShape(index); - } - virtual ~ChildShapeRetriever() {} - }; - - class TriangleShapeRetriever : public ChildShapeRetriever - { - public: - virtual btCollisionShape* getChildShape(int index) - { - m_parent->m_gim_shape->getBulletTriangle(index, m_parent->m_trishape); - return &m_parent->m_trishape; - } - virtual ~TriangleShapeRetriever() {} - }; - - class TetraShapeRetriever : public ChildShapeRetriever - { - public: - virtual btCollisionShape* getChildShape(int index) - { - m_parent->m_gim_shape->getBulletTetrahedron(index, m_parent->m_tetrashape); - return &m_parent->m_tetrashape; - } - }; - -public: - ChildShapeRetriever m_child_retriever; - TriangleShapeRetriever m_tri_retriever; - TetraShapeRetriever m_tetra_retriever; - ChildShapeRetriever* m_current_retriever; - - GIM_ShapeRetriever(const btGImpactShapeInterface* gim_shape) - { - m_gim_shape = gim_shape; - //select retriever - if (m_gim_shape->needsRetrieveTriangles()) - { - m_current_retriever = &m_tri_retriever; - } - else if (m_gim_shape->needsRetrieveTetrahedrons()) - { - m_current_retriever = &m_tetra_retriever; - } - else - { - m_current_retriever = &m_child_retriever; - } - - m_current_retriever->m_parent = this; - } - - const btCollisionShape* getChildShape(int index) - { - return m_current_retriever->getChildShape(index); - } -}; - -//!@} - -#ifdef TRI_COLLISION_PROFILING - -//! Gets the average time in miliseconds of tree collisions -float btGImpactCollisionAlgorithm::getAverageTreeCollisionTime() -{ - return btGImpactBoxSet::getAverageTreeCollisionTime(); -} - -//! Gets the average time in miliseconds of triangle collisions -float btGImpactCollisionAlgorithm::getAverageTriangleCollisionTime() -{ - if (g_count_triangle_collision == 0) return 0; - - float avgtime = g_accum_triangle_collision_time; - avgtime /= (float)g_count_triangle_collision; - - g_accum_triangle_collision_time = 0; - g_count_triangle_collision = 0; - - return avgtime; -} - -#endif //TRI_COLLISION_PROFILING - -btGImpactCollisionAlgorithm::btGImpactCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - : btActivatingCollisionAlgorithm(ci, body0Wrap, body1Wrap) -{ - m_manifoldPtr = NULL; - m_convex_algorithm = NULL; -} - -btGImpactCollisionAlgorithm::~btGImpactCollisionAlgorithm() -{ - clearCache(); -} - -void btGImpactCollisionAlgorithm::addContactPoint(const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btVector3& point, - const btVector3& normal, - btScalar distance) -{ - m_resultOut->setShapeIdentifiersA(m_part0, m_triface0); - m_resultOut->setShapeIdentifiersB(m_part1, m_triface1); - checkManifold(body0Wrap, body1Wrap); - m_resultOut->addContactPoint(normal, point, distance); -} - -void btGImpactCollisionAlgorithm::shape_vs_shape_collision( - const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btCollisionShape* shape0, - const btCollisionShape* shape1) -{ - { - btCollisionAlgorithm* algor = newAlgorithm(body0Wrap, body1Wrap); - // post : checkManifold is called - - m_resultOut->setShapeIdentifiersA(m_part0, m_triface0); - m_resultOut->setShapeIdentifiersB(m_part1, m_triface1); - - algor->processCollision(body0Wrap, body1Wrap, *m_dispatchInfo, m_resultOut); - - algor->~btCollisionAlgorithm(); - m_dispatcher->freeCollisionAlgorithm(algor); - } -} - -void btGImpactCollisionAlgorithm::convex_vs_convex_collision( - const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btCollisionShape* shape0, - const btCollisionShape* shape1) -{ - m_resultOut->setShapeIdentifiersA(m_part0, m_triface0); - m_resultOut->setShapeIdentifiersB(m_part1, m_triface1); - - btCollisionObjectWrapper ob0(body0Wrap, shape0, body0Wrap->getCollisionObject(), body0Wrap->getWorldTransform(), m_part0, m_triface0); - btCollisionObjectWrapper ob1(body1Wrap, shape1, body1Wrap->getCollisionObject(), body1Wrap->getWorldTransform(), m_part1, m_triface1); - checkConvexAlgorithm(&ob0, &ob1); - m_convex_algorithm->processCollision(&ob0, &ob1, *m_dispatchInfo, m_resultOut); -} - -void btGImpactCollisionAlgorithm::gimpact_vs_gimpact_find_pairs( - const btTransform& trans0, - const btTransform& trans1, - const btGImpactShapeInterface* shape0, - const btGImpactShapeInterface* shape1, btPairSet& pairset) -{ - if (shape0->hasBoxSet() && shape1->hasBoxSet()) - { - btGImpactBoxSet::find_collision(shape0->getBoxSet(), trans0, shape1->getBoxSet(), trans1, pairset); - } - else - { - btAABB boxshape0; - btAABB boxshape1; - int i = shape0->getNumChildShapes(); - - while (i--) - { - shape0->getChildAabb(i, trans0, boxshape0.m_min, boxshape0.m_max); - - int j = shape1->getNumChildShapes(); - while (j--) - { - shape1->getChildAabb(i, trans1, boxshape1.m_min, boxshape1.m_max); - - if (boxshape1.has_collision(boxshape0)) - { - pairset.push_pair(i, j); - } - } - } - } -} - -void btGImpactCollisionAlgorithm::gimpact_vs_shape_find_pairs( - const btTransform& trans0, - const btTransform& trans1, - const btGImpactShapeInterface* shape0, - const btCollisionShape* shape1, - btAlignedObjectArray<int>& collided_primitives) -{ - btAABB boxshape; - - if (shape0->hasBoxSet()) - { - btTransform trans1to0 = trans0.inverse(); - trans1to0 *= trans1; - - shape1->getAabb(trans1to0, boxshape.m_min, boxshape.m_max); - - shape0->getBoxSet()->boxQuery(boxshape, collided_primitives); - } - else - { - shape1->getAabb(trans1, boxshape.m_min, boxshape.m_max); - - btAABB boxshape0; - int i = shape0->getNumChildShapes(); - - while (i--) - { - shape0->getChildAabb(i, trans0, boxshape0.m_min, boxshape0.m_max); - - if (boxshape.has_collision(boxshape0)) - { - collided_primitives.push_back(i); - } - } - } -} - -void btGImpactCollisionAlgorithm::collide_gjk_triangles(const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btGImpactMeshShapePart* shape0, - const btGImpactMeshShapePart* shape1, - const int* pairs, int pair_count) -{ - btTriangleShapeEx tri0; - btTriangleShapeEx tri1; - - shape0->lockChildShapes(); - shape1->lockChildShapes(); - - const int* pair_pointer = pairs; - - while (pair_count--) - { - m_triface0 = *(pair_pointer); - m_triface1 = *(pair_pointer + 1); - pair_pointer += 2; - - shape0->getBulletTriangle(m_triface0, tri0); - shape1->getBulletTriangle(m_triface1, tri1); - - //collide two convex shapes - if (tri0.overlap_test_conservative(tri1)) - { - convex_vs_convex_collision(body0Wrap, body1Wrap, &tri0, &tri1); - } - } - - shape0->unlockChildShapes(); - shape1->unlockChildShapes(); -} - -void btGImpactCollisionAlgorithm::collide_sat_triangles(const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btGImpactMeshShapePart* shape0, - const btGImpactMeshShapePart* shape1, - const int* pairs, int pair_count) -{ - btTransform orgtrans0 = body0Wrap->getWorldTransform(); - btTransform orgtrans1 = body1Wrap->getWorldTransform(); - - btPrimitiveTriangle ptri0; - btPrimitiveTriangle ptri1; - GIM_TRIANGLE_CONTACT contact_data; - - shape0->lockChildShapes(); - shape1->lockChildShapes(); - - const int* pair_pointer = pairs; - - while (pair_count--) - { - m_triface0 = *(pair_pointer); - m_triface1 = *(pair_pointer + 1); - pair_pointer += 2; - - shape0->getPrimitiveTriangle(m_triface0, ptri0); - shape1->getPrimitiveTriangle(m_triface1, ptri1); - -#ifdef TRI_COLLISION_PROFILING - bt_begin_gim02_tri_time(); -#endif - - ptri0.applyTransform(orgtrans0); - ptri1.applyTransform(orgtrans1); - - //build planes - ptri0.buildTriPlane(); - ptri1.buildTriPlane(); - // test conservative - - if (ptri0.overlap_test_conservative(ptri1)) - { - if (ptri0.find_triangle_collision_clip_method(ptri1, contact_data)) - { - int j = contact_data.m_point_count; - while (j--) - { - addContactPoint(body0Wrap, body1Wrap, - contact_data.m_points[j], - contact_data.m_separating_normal, - -contact_data.m_penetration_depth); - } - } - } - -#ifdef TRI_COLLISION_PROFILING - bt_end_gim02_tri_time(); -#endif - } - - shape0->unlockChildShapes(); - shape1->unlockChildShapes(); -} - -void btGImpactCollisionAlgorithm::gimpact_vs_gimpact( - const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btGImpactShapeInterface* shape0, - const btGImpactShapeInterface* shape1) -{ - if (shape0->getGImpactShapeType() == CONST_GIMPACT_TRIMESH_SHAPE) - { - const btGImpactMeshShape* meshshape0 = static_cast<const btGImpactMeshShape*>(shape0); - m_part0 = meshshape0->getMeshPartCount(); - - while (m_part0--) - { - gimpact_vs_gimpact(body0Wrap, body1Wrap, meshshape0->getMeshPart(m_part0), shape1); - } - - return; - } - - if (shape1->getGImpactShapeType() == CONST_GIMPACT_TRIMESH_SHAPE) - { - const btGImpactMeshShape* meshshape1 = static_cast<const btGImpactMeshShape*>(shape1); - m_part1 = meshshape1->getMeshPartCount(); - - while (m_part1--) - { - gimpact_vs_gimpact(body0Wrap, body1Wrap, shape0, meshshape1->getMeshPart(m_part1)); - } - - return; - } - - btTransform orgtrans0 = body0Wrap->getWorldTransform(); - btTransform orgtrans1 = body1Wrap->getWorldTransform(); - - btPairSet pairset; - - gimpact_vs_gimpact_find_pairs(orgtrans0, orgtrans1, shape0, shape1, pairset); - - if (pairset.size() == 0) return; - - if (shape0->getGImpactShapeType() == CONST_GIMPACT_TRIMESH_SHAPE_PART && - shape1->getGImpactShapeType() == CONST_GIMPACT_TRIMESH_SHAPE_PART) - { - const btGImpactMeshShapePart* shapepart0 = static_cast<const btGImpactMeshShapePart*>(shape0); - const btGImpactMeshShapePart* shapepart1 = static_cast<const btGImpactMeshShapePart*>(shape1); -//specialized function -#ifdef BULLET_TRIANGLE_COLLISION - collide_gjk_triangles(body0Wrap, body1Wrap, shapepart0, shapepart1, &pairset[0].m_index1, pairset.size()); -#else - collide_sat_triangles(body0Wrap, body1Wrap, shapepart0, shapepart1, &pairset[0].m_index1, pairset.size()); -#endif - - return; - } - - //general function - - shape0->lockChildShapes(); - shape1->lockChildShapes(); - - GIM_ShapeRetriever retriever0(shape0); - GIM_ShapeRetriever retriever1(shape1); - - bool child_has_transform0 = shape0->childrenHasTransform(); - bool child_has_transform1 = shape1->childrenHasTransform(); - - int i = pairset.size(); - while (i--) - { - GIM_PAIR* pair = &pairset[i]; - m_triface0 = pair->m_index1; - m_triface1 = pair->m_index2; - const btCollisionShape* colshape0 = retriever0.getChildShape(m_triface0); - const btCollisionShape* colshape1 = retriever1.getChildShape(m_triface1); - - btTransform tr0 = body0Wrap->getWorldTransform(); - btTransform tr1 = body1Wrap->getWorldTransform(); - - if (child_has_transform0) - { - tr0 = orgtrans0 * shape0->getChildTransform(m_triface0); - } - - if (child_has_transform1) - { - tr1 = orgtrans1 * shape1->getChildTransform(m_triface1); - } - - btCollisionObjectWrapper ob0(body0Wrap, colshape0, body0Wrap->getCollisionObject(), tr0, m_part0, m_triface0); - btCollisionObjectWrapper ob1(body1Wrap, colshape1, body1Wrap->getCollisionObject(), tr1, m_part1, m_triface1); - - //collide two convex shapes - convex_vs_convex_collision(&ob0, &ob1, colshape0, colshape1); - } - - shape0->unlockChildShapes(); - shape1->unlockChildShapes(); -} - -void btGImpactCollisionAlgorithm::gimpact_vs_shape(const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btGImpactShapeInterface* shape0, - const btCollisionShape* shape1, bool swapped) -{ - if (shape0->getGImpactShapeType() == CONST_GIMPACT_TRIMESH_SHAPE) - { - const btGImpactMeshShape* meshshape0 = static_cast<const btGImpactMeshShape*>(shape0); - int& part = swapped ? m_part1 : m_part0; - part = meshshape0->getMeshPartCount(); - - while (part--) - { - gimpact_vs_shape(body0Wrap, - body1Wrap, - meshshape0->getMeshPart(part), - shape1, swapped); - } - - return; - } - -#ifdef GIMPACT_VS_PLANE_COLLISION - if (shape0->getGImpactShapeType() == CONST_GIMPACT_TRIMESH_SHAPE_PART && - shape1->getShapeType() == STATIC_PLANE_PROXYTYPE) - { - const btGImpactMeshShapePart* shapepart = static_cast<const btGImpactMeshShapePart*>(shape0); - const btStaticPlaneShape* planeshape = static_cast<const btStaticPlaneShape*>(shape1); - gimpacttrimeshpart_vs_plane_collision(body0Wrap, body1Wrap, shapepart, planeshape, swapped); - return; - } - -#endif - - if (shape1->isCompound()) - { - const btCompoundShape* compoundshape = static_cast<const btCompoundShape*>(shape1); - gimpact_vs_compoundshape(body0Wrap, body1Wrap, shape0, compoundshape, swapped); - return; - } - else if (shape1->isConcave()) - { - const btConcaveShape* concaveshape = static_cast<const btConcaveShape*>(shape1); - gimpact_vs_concave(body0Wrap, body1Wrap, shape0, concaveshape, swapped); - return; - } - - btTransform orgtrans0 = body0Wrap->getWorldTransform(); - - btTransform orgtrans1 = body1Wrap->getWorldTransform(); - - btAlignedObjectArray<int> collided_results; - - gimpact_vs_shape_find_pairs(orgtrans0, orgtrans1, shape0, shape1, collided_results); - - if (collided_results.size() == 0) return; - - shape0->lockChildShapes(); - - GIM_ShapeRetriever retriever0(shape0); - - bool child_has_transform0 = shape0->childrenHasTransform(); - - int i = collided_results.size(); - - while (i--) - { - int child_index = collided_results[i]; - if (swapped) - m_triface1 = child_index; - else - m_triface0 = child_index; - - const btCollisionShape* colshape0 = retriever0.getChildShape(child_index); - - btTransform tr0 = body0Wrap->getWorldTransform(); - - if (child_has_transform0) - { - tr0 = orgtrans0 * shape0->getChildTransform(child_index); - } - - btCollisionObjectWrapper ob0(body0Wrap, colshape0, body0Wrap->getCollisionObject(), body0Wrap->getWorldTransform(), m_part0, m_triface0); - const btCollisionObjectWrapper* prevObj; - - if (m_resultOut->getBody0Wrap()->getCollisionObject() == ob0.getCollisionObject()) - { - prevObj = m_resultOut->getBody0Wrap(); - m_resultOut->setBody0Wrap(&ob0); - } - else - { - prevObj = m_resultOut->getBody1Wrap(); - m_resultOut->setBody1Wrap(&ob0); - } - - //collide two shapes - if (swapped) - { - shape_vs_shape_collision(body1Wrap, &ob0, shape1, colshape0); - } - else - { - shape_vs_shape_collision(&ob0, body1Wrap, colshape0, shape1); - } - - if (m_resultOut->getBody0Wrap()->getCollisionObject() == ob0.getCollisionObject()) - { - m_resultOut->setBody0Wrap(prevObj); - } - else - { - m_resultOut->setBody1Wrap(prevObj); - } - } - - shape0->unlockChildShapes(); -} - -void btGImpactCollisionAlgorithm::gimpact_vs_compoundshape(const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btGImpactShapeInterface* shape0, - const btCompoundShape* shape1, bool swapped) -{ - btTransform orgtrans1 = body1Wrap->getWorldTransform(); - - int i = shape1->getNumChildShapes(); - while (i--) - { - const btCollisionShape* colshape1 = shape1->getChildShape(i); - btTransform childtrans1 = orgtrans1 * shape1->getChildTransform(i); - - btCollisionObjectWrapper ob1(body1Wrap, colshape1, body1Wrap->getCollisionObject(), childtrans1, -1, i); - - const btCollisionObjectWrapper* tmp = 0; - if (m_resultOut->getBody0Wrap()->getCollisionObject() == ob1.getCollisionObject()) - { - tmp = m_resultOut->getBody0Wrap(); - m_resultOut->setBody0Wrap(&ob1); - } - else - { - tmp = m_resultOut->getBody1Wrap(); - m_resultOut->setBody1Wrap(&ob1); - } - //collide child shape - gimpact_vs_shape(body0Wrap, &ob1, - shape0, colshape1, swapped); - - if (m_resultOut->getBody0Wrap()->getCollisionObject() == ob1.getCollisionObject()) - { - m_resultOut->setBody0Wrap(tmp); - } - else - { - m_resultOut->setBody1Wrap(tmp); - } - } -} - -void btGImpactCollisionAlgorithm::gimpacttrimeshpart_vs_plane_collision( - const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btGImpactMeshShapePart* shape0, - const btStaticPlaneShape* shape1, bool swapped) -{ - btTransform orgtrans0 = body0Wrap->getWorldTransform(); - btTransform orgtrans1 = body1Wrap->getWorldTransform(); - - const btPlaneShape* planeshape = static_cast<const btPlaneShape*>(shape1); - btVector4 plane; - planeshape->get_plane_equation_transformed(orgtrans1, plane); - - //test box against plane - - btAABB tribox; - shape0->getAabb(orgtrans0, tribox.m_min, tribox.m_max); - tribox.increment_margin(planeshape->getMargin()); - - if (tribox.plane_classify(plane) != BT_CONST_COLLIDE_PLANE) return; - - shape0->lockChildShapes(); - - btScalar margin = shape0->getMargin() + planeshape->getMargin(); - - btVector3 vertex; - int vi = shape0->getVertexCount(); - while (vi--) - { - shape0->getVertex(vi, vertex); - vertex = orgtrans0(vertex); - - btScalar distance = vertex.dot(plane) - plane[3] - margin; - - if (distance < 0.0) //add contact - { - if (swapped) - { - addContactPoint(body1Wrap, body0Wrap, - vertex, - -plane, - distance); - } - else - { - addContactPoint(body0Wrap, body1Wrap, - vertex, - plane, - distance); - } - } - } - - shape0->unlockChildShapes(); -} - -class btGImpactTriangleCallback : public btTriangleCallback -{ -public: - btGImpactCollisionAlgorithm* algorithm; - const btCollisionObjectWrapper* body0Wrap; - const btCollisionObjectWrapper* body1Wrap; - const btGImpactShapeInterface* gimpactshape0; - bool swapped; - btScalar margin; - - virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex) - { - btTriangleShapeEx tri1(triangle[0], triangle[1], triangle[2]); - tri1.setMargin(margin); - if (swapped) - { - algorithm->setPart0(partId); - algorithm->setFace0(triangleIndex); - } - else - { - algorithm->setPart1(partId); - algorithm->setFace1(triangleIndex); - } - - btCollisionObjectWrapper ob1Wrap(body1Wrap, &tri1, body1Wrap->getCollisionObject(), body1Wrap->getWorldTransform(), partId, triangleIndex); - const btCollisionObjectWrapper* tmp = 0; - - if (algorithm->internalGetResultOut()->getBody0Wrap()->getCollisionObject() == ob1Wrap.getCollisionObject()) - { - tmp = algorithm->internalGetResultOut()->getBody0Wrap(); - algorithm->internalGetResultOut()->setBody0Wrap(&ob1Wrap); - } - else - { - tmp = algorithm->internalGetResultOut()->getBody1Wrap(); - algorithm->internalGetResultOut()->setBody1Wrap(&ob1Wrap); - } - - algorithm->gimpact_vs_shape( - body0Wrap, &ob1Wrap, gimpactshape0, &tri1, swapped); - - if (algorithm->internalGetResultOut()->getBody0Wrap()->getCollisionObject() == ob1Wrap.getCollisionObject()) - { - algorithm->internalGetResultOut()->setBody0Wrap(tmp); - } - else - { - algorithm->internalGetResultOut()->setBody1Wrap(tmp); - } - } -}; - -void btGImpactCollisionAlgorithm::gimpact_vs_concave( - const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btGImpactShapeInterface* shape0, - const btConcaveShape* shape1, bool swapped) -{ - //create the callback - btGImpactTriangleCallback tricallback; - tricallback.algorithm = this; - tricallback.body0Wrap = body0Wrap; - tricallback.body1Wrap = body1Wrap; - tricallback.gimpactshape0 = shape0; - tricallback.swapped = swapped; - tricallback.margin = shape1->getMargin(); - - //getting the trimesh AABB - btTransform gimpactInConcaveSpace; - - gimpactInConcaveSpace = body1Wrap->getWorldTransform().inverse() * body0Wrap->getWorldTransform(); - - btVector3 minAABB, maxAABB; - shape0->getAabb(gimpactInConcaveSpace, minAABB, maxAABB); - - shape1->processAllTriangles(&tricallback, minAABB, maxAABB); -} - -void btGImpactCollisionAlgorithm::processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut) -{ - clearCache(); - - m_resultOut = resultOut; - m_dispatchInfo = &dispatchInfo; - const btGImpactShapeInterface* gimpactshape0; - const btGImpactShapeInterface* gimpactshape1; - - if (body0Wrap->getCollisionShape()->getShapeType() == GIMPACT_SHAPE_PROXYTYPE) - { - gimpactshape0 = static_cast<const btGImpactShapeInterface*>(body0Wrap->getCollisionShape()); - - if (body1Wrap->getCollisionShape()->getShapeType() == GIMPACT_SHAPE_PROXYTYPE) - { - gimpactshape1 = static_cast<const btGImpactShapeInterface*>(body1Wrap->getCollisionShape()); - - gimpact_vs_gimpact(body0Wrap, body1Wrap, gimpactshape0, gimpactshape1); - } - else - { - gimpact_vs_shape(body0Wrap, body1Wrap, gimpactshape0, body1Wrap->getCollisionShape(), false); - } - } - else if (body1Wrap->getCollisionShape()->getShapeType() == GIMPACT_SHAPE_PROXYTYPE) - { - gimpactshape1 = static_cast<const btGImpactShapeInterface*>(body1Wrap->getCollisionShape()); - - gimpact_vs_shape(body1Wrap, body0Wrap, gimpactshape1, body0Wrap->getCollisionShape(), true); - } - - // Ensure that gContactProcessedCallback is called for concave shapes. - if (getLastManifold()) - { - m_resultOut->refreshContactPoints(); - } -} - -btScalar btGImpactCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut) -{ - return 1.f; -} - -///////////////////////////////////// REGISTERING ALGORITHM ////////////////////////////////////////////// - -//! Use this function for register the algorithm externally -void btGImpactCollisionAlgorithm::registerAlgorithm(btCollisionDispatcher* dispatcher) -{ - static btGImpactCollisionAlgorithm::CreateFunc s_gimpact_cf; - - int i; - - for (i = 0; i < MAX_BROADPHASE_COLLISION_TYPES; i++) - { - dispatcher->registerCollisionCreateFunc(GIMPACT_SHAPE_PROXYTYPE, i, &s_gimpact_cf); - } - - for (i = 0; i < MAX_BROADPHASE_COLLISION_TYPES; i++) - { - dispatcher->registerCollisionCreateFunc(i, GIMPACT_SHAPE_PROXYTYPE, &s_gimpact_cf); - } -} |