diff options
Diffstat (limited to 'thirdparty/bullet/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h')
| -rw-r--r-- | thirdparty/bullet/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h | 156 | 
1 files changed, 151 insertions, 5 deletions
diff --git a/thirdparty/bullet/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h b/thirdparty/bullet/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h index 7630385767..76b58a0378 100644 --- a/thirdparty/bullet/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h +++ b/thirdparty/bullet/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h @@ -46,10 +46,10 @@ class btDeformableMultiBodyDynamicsWorld : public btMultiBodyDynamicsWorld      bool m_drawClusterTree;      btSoftBodyWorldInfo m_sbi;      btScalar m_internalTime; -    int m_contact_iterations; +    int m_ccdIterations;      bool m_implicit;      bool m_lineSearch; -    bool m_selfCollision; +    bool m_useProjection;      DeformableBodyInplaceSolverIslandCallback* m_solverDeformableBodyIslandCallback;      typedef void (*btSolverCallback)(btScalar time, btDeformableMultiBodyDynamicsWorld* world); @@ -80,9 +80,7 @@ public:          m_solverCallback = cb;      } -    virtual ~btDeformableMultiBodyDynamicsWorld() -    { -    } +    virtual ~btDeformableMultiBodyDynamicsWorld();      virtual btMultiBodyDynamicsWorld* getMultiBodyDynamicsWorld()      { @@ -133,6 +131,8 @@ public:      void addForce(btSoftBody* psb, btDeformableLagrangianForce* force); +    void removeForce(btSoftBody* psb, btDeformableLagrangianForce* force); +          void removeSoftBody(btSoftBody* body);      void removeCollisionObject(btCollisionObject* collisionObject); @@ -142,6 +142,8 @@ public:      void setupConstraints(); +    void performDeformableCollisionDetection(); +          void solveMultiBodyConstraints();      void solveContactConstraints(); @@ -159,7 +161,151 @@ public:      {          m_lineSearch = lineSearch;      } +     +    void applyRepulsionForce(btScalar timeStep); +     +    void performGeometricCollisions(btScalar timeStep); +     +    struct btDeformableSingleRayCallback : public btBroadphaseRayCallback +    { +        btVector3 m_rayFromWorld; +        btVector3 m_rayToWorld; +        btTransform m_rayFromTrans; +        btTransform m_rayToTrans; +        btVector3 m_hitNormal; +         +        const btDeformableMultiBodyDynamicsWorld* m_world; +        btCollisionWorld::RayResultCallback& m_resultCallback; +         +        btDeformableSingleRayCallback(const btVector3& rayFromWorld, const btVector3& rayToWorld, const btDeformableMultiBodyDynamicsWorld* world, btCollisionWorld::RayResultCallback& resultCallback) +        : m_rayFromWorld(rayFromWorld), +        m_rayToWorld(rayToWorld), +        m_world(world), +        m_resultCallback(resultCallback) +        { +            m_rayFromTrans.setIdentity(); +            m_rayFromTrans.setOrigin(m_rayFromWorld); +            m_rayToTrans.setIdentity(); +            m_rayToTrans.setOrigin(m_rayToWorld); +             +            btVector3 rayDir = (rayToWorld - rayFromWorld); +             +            rayDir.normalize(); +            ///what about division by zero? --> just set rayDirection[i] to INF/1e30 +            m_rayDirectionInverse[0] = rayDir[0] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[0]; +            m_rayDirectionInverse[1] = rayDir[1] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[1]; +            m_rayDirectionInverse[2] = rayDir[2] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[2]; +            m_signs[0] = m_rayDirectionInverse[0] < 0.0; +            m_signs[1] = m_rayDirectionInverse[1] < 0.0; +            m_signs[2] = m_rayDirectionInverse[2] < 0.0; +             +            m_lambda_max = rayDir.dot(m_rayToWorld - m_rayFromWorld); +        } +         +        virtual bool process(const btBroadphaseProxy* proxy) +        { +            ///terminate further ray tests, once the closestHitFraction reached zero +            if (m_resultCallback.m_closestHitFraction == btScalar(0.f)) +                return false; +             +            btCollisionObject* collisionObject = (btCollisionObject*)proxy->m_clientObject; +             +            //only perform raycast if filterMask matches +            if (m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle())) +            { +                //RigidcollisionObject* collisionObject = ctrl->GetRigidcollisionObject(); +                //btVector3 collisionObjectAabbMin,collisionObjectAabbMax; +#if 0 +#ifdef RECALCULATE_AABB +                btVector3 collisionObjectAabbMin,collisionObjectAabbMax; +                collisionObject->getCollisionShape()->getAabb(collisionObject->getWorldTransform(),collisionObjectAabbMin,collisionObjectAabbMax); +#else +                //getBroadphase()->getAabb(collisionObject->getBroadphaseHandle(),collisionObjectAabbMin,collisionObjectAabbMax); +                const btVector3& collisionObjectAabbMin = collisionObject->getBroadphaseHandle()->m_aabbMin; +                const btVector3& collisionObjectAabbMax = collisionObject->getBroadphaseHandle()->m_aabbMax; +#endif +#endif +                //btScalar hitLambda = m_resultCallback.m_closestHitFraction; +                //culling already done by broadphase +                //if (btRayAabb(m_rayFromWorld,m_rayToWorld,collisionObjectAabbMin,collisionObjectAabbMax,hitLambda,m_hitNormal)) +                { +                    m_world->rayTestSingle(m_rayFromTrans, m_rayToTrans, +                                           collisionObject, +                                           collisionObject->getCollisionShape(), +                                           collisionObject->getWorldTransform(), +                                           m_resultCallback); +                } +            } +            return true; +        } +    }; +     +     +    void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const +    { +        BT_PROFILE("rayTest"); +        /// use the broadphase to accelerate the search for objects, based on their aabb +        /// and for each object with ray-aabb overlap, perform an exact ray test +        btDeformableSingleRayCallback rayCB(rayFromWorld, rayToWorld, this, resultCallback); +         +#ifndef USE_BRUTEFORCE_RAYBROADPHASE +        m_broadphasePairCache->rayTest(rayFromWorld, rayToWorld, rayCB); +#else +        for (int i = 0; i < this->getNumCollisionObjects(); i++) +        { +            rayCB.process(m_collisionObjects[i]->getBroadphaseHandle()); +        } +#endif  //USE_BRUTEFORCE_RAYBROADPHASE +    } +     +    void rayTestSingle(const btTransform& rayFromTrans, const btTransform& rayToTrans, +                                                     btCollisionObject* collisionObject, +                                                     const btCollisionShape* collisionShape, +                                                     const btTransform& colObjWorldTransform, +                                                     RayResultCallback& resultCallback) const +    { +        if (collisionShape->isSoftBody()) +        { +            btSoftBody* softBody = btSoftBody::upcast(collisionObject); +            if (softBody) +            { +                btSoftBody::sRayCast softResult; +                if (softBody->rayFaceTest(rayFromTrans.getOrigin(), rayToTrans.getOrigin(), softResult)) +                { +                    if (softResult.fraction <= resultCallback.m_closestHitFraction) +                    { +                        btCollisionWorld::LocalShapeInfo shapeInfo; +                        shapeInfo.m_shapePart = 0; +                        shapeInfo.m_triangleIndex = softResult.index; +                        // get the normal +                        btVector3 rayDir = rayToTrans.getOrigin() - rayFromTrans.getOrigin(); +                        btVector3 normal = -rayDir; +                        normal.normalize(); +                        { +                            normal = softBody->m_faces[softResult.index].m_normal; +                            if (normal.dot(rayDir) > 0) +                            { +                                // normal always point toward origin of the ray +                                normal = -normal; +                            } +                        } +                         +                        btCollisionWorld::LocalRayResult rayResult(collisionObject, +                                                                   &shapeInfo, +                                                                   normal, +                                                                   softResult.fraction); +                        bool normalInWorldSpace = true; +                        resultCallback.addSingleResult(rayResult, normalInWorldSpace); +                    } +                } +            } +        } +        else +        { +            btCollisionWorld::rayTestSingle(rayFromTrans, rayToTrans, collisionObject, collisionShape, colObjWorldTransform, resultCallback); +        } +    }  };  #endif  //BT_DEFORMABLE_MULTIBODY_DYNAMICS_WORLD_H  |