Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Feb 27, 2011, 7:43:24 AM (14 years ago)
Author:
rgrieder
Message:

Updated Bullet Physics Engine from v2.74 to v2.77

Location:
code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp

    r5781 r7983  
    9797        {
    9898               
    99                 btGjkPairDetector gjk(m_convexA,m_convexB,m_simplexSolver,m_penetrationDepthSolver);           
     99                btGjkPairDetector gjk(m_convexA,m_convexB,m_convexA->getShapeType(),m_convexB->getShapeType(),m_convexA->getMargin(),m_convexB->getMargin(),m_simplexSolver,m_penetrationDepthSolver);         
    100100                btGjkPairDetector::ClosestPointInput input;
    101101       
     
    122122                while (dist > radius)
    123123                {
     124                        if (result.m_debugDrawer)
     125                        {
     126                                result.m_debugDrawer->drawSphere(c,0.2f,btVector3(1,1,1));
     127                        }
    124128                        numIter++;
    125129                        if (numIter > maxIter)
     
    170174                        btTransformUtil::integrateTransform(fromB,linVelB,angVelB,lambda,interpolatedTransB);
    171175                        relativeTrans = interpolatedTransB.inverseTimes(interpolatedTransA);
     176
     177                        if (result.m_debugDrawer)
     178                        {
     179                                result.m_debugDrawer->drawSphere(interpolatedTransA.getOrigin(),0.2f,btVector3(1,0,0));
     180                        }
    172181
    173182                        result.DebugDraw( lambda );
     
    198207                                return false;
    199208                        }
     209                       
    200210
    201211                }
     
    225235
    226236}
    227 
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btConvexCast.h

    r5781 r7983  
    4242
    4343                CastResult()
    44                         :m_fraction(btScalar(1e30)),
     44                        :m_fraction(btScalar(BT_LARGE_FLOAT)),
    4545                        m_debugDrawer(0),
    4646                        m_allowedPenetration(btScalar(0))
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h

    r5781 r7983  
    1515
    1616
    17 #ifndef CONVEX_PENETRATION_DEPTH_H
    18 #define CONVEX_PENETRATION_DEPTH_H
     17#ifndef __CONVEX_PENETRATION_DEPTH_H
     18#define __CONVEX_PENETRATION_DEPTH_H
    1919
    2020class btStackAlloc;
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h

    r5781 r7983  
    3434                virtual ~Result(){}     
    3535
    36                 ///setShapeIdentifiers provides experimental support for per-triangle material / custom material combiner
    37                 virtual void setShapeIdentifiers(int partId0,int index0,        int partId1,int index1)=0;
     36                ///setShapeIdentifiersA/B provides experimental support for per-triangle material / custom material combiner
     37                virtual void setShapeIdentifiersA(int partId0,int index0)=0;
     38                virtual void setShapeIdentifiersB(int partId1,int index1)=0;
    3839                virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth)=0;
    3940        };
     
    4243        {
    4344                ClosestPointInput()
    44                         :m_maximumDistanceSquared(btScalar(1e30)),
     45                        :m_maximumDistanceSquared(btScalar(BT_LARGE_FLOAT)),
    4546                        m_stackAlloc(0)
    4647                {
     
    6970                btScalar        m_distance; //negative means penetration !
    7071
    71                 btStorageResult() : m_distance(btScalar(1e30))
     72                btStorageResult() : m_distance(btScalar(BT_LARGE_FLOAT))
    7273                {
    7374
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa2.cpp

    r5781 r7983  
    6969                btMatrix3x3                             m_toshape1;
    7070                btTransform                             m_toshape0;
     71#ifdef __SPU__
     72                bool                                    m_enableMargin;
     73#else
    7174                btVector3                               (btConvexShape::*Ls)(const btVector3&) const;
     75#endif//__SPU__
     76               
     77
     78                MinkowskiDiff()
     79                {
     80
     81                }
     82#ifdef __SPU__
     83                        void                                    EnableMargin(bool enable)
     84                {
     85                        m_enableMargin = enable;
     86                }       
     87                inline btVector3                Support0(const btVector3& d) const
     88                {
     89                        if (m_enableMargin)
     90                        {
     91                                return m_shapes[0]->localGetSupportVertexNonVirtual(d);
     92                        } else
     93                        {
     94                                return m_shapes[0]->localGetSupportVertexWithoutMarginNonVirtual(d);
     95                        }
     96                }
     97                inline btVector3                Support1(const btVector3& d) const
     98                {
     99                        if (m_enableMargin)
     100                        {
     101                                return m_toshape0*(m_shapes[1]->localGetSupportVertexNonVirtual(m_toshape1*d));
     102                        } else
     103                        {
     104                                return m_toshape0*(m_shapes[1]->localGetSupportVertexWithoutMarginNonVirtual(m_toshape1*d));
     105                        }
     106                }
     107#else
    72108                void                                    EnableMargin(bool enable)
    73109                {
     
    85121                        return(m_toshape0*((m_shapes[1])->*(Ls))(m_toshape1*d));
    86122                }
     123#endif //__SPU__
     124
    87125                inline btVector3                Support(const btVector3& d) const
    88126                {
     
    203241                                        }
    204242                                        /* Check for termination                                */
    205                                         const btScalar  omega=dot(m_ray,w)/rl;
     243                                        const btScalar  omega=btDot(m_ray,w)/rl;
    206244                                        alpha=btMax(omega,alpha);
    207245                                        if(((rl-alpha)-(GJK_ACCURARY*rl))<=0)
     
    260298                                case    eStatus::Valid:         m_distance=m_ray.length();break;
    261299                                case    eStatus::Inside:        m_distance=0;break;
     300                                default:
     301                                        {
     302                                        }
    262303                                }       
    263304                                return(m_status);
     
    289330                                                        btVector3               axis=btVector3(0,0,0);
    290331                                                        axis[i]=1;
    291                                                         const btVector3 p=cross(d,axis);
     332                                                        const btVector3 p=btCross(d,axis);
    292333                                                        if(p.length2()>0)
    293334                                                        {
     
    304345                                case    3:
    305346                                        {
    306                                                 const btVector3 n=cross(m_simplex->c[1]->w-m_simplex->c[0]->w,
     347                                                const btVector3 n=btCross(m_simplex->c[1]->w-m_simplex->c[0]->w,
    307348                                                        m_simplex->c[2]->w-m_simplex->c[0]->w);
    308349                                                if(n.length2()>0)
     
    358399                                if(l>GJK_SIMPLEX2_EPS)
    359400                                {
    360                                         const btScalar  t(l>0?-dot(a,d)/l:0);
     401                                        const btScalar  t(l>0?-btDot(a,d)/l:0);
    361402                                        if(t>=1)                { w[0]=0;w[1]=1;m=2;return(b.length2()); }
    362403                                        else if(t<=0)   { w[0]=1;w[1]=0;m=1;return(a.length2()); }
     
    373414                                const btVector3*        vt[]={&a,&b,&c};
    374415                                const btVector3         dl[]={a-b,b-c,c-a};
    375                                 const btVector3         n=cross(dl[0],dl[1]);
     416                                const btVector3         n=btCross(dl[0],dl[1]);
    376417                                const btScalar          l=n.length2();
    377418                                if(l>GJK_SIMPLEX3_EPS)
    378419                                {
    379420                                        btScalar        mindist=-1;
    380                                         btScalar        subw[2];
    381                                         U                       subm;
     421                                        btScalar        subw[2]={0.f,0.f};
     422                                        U                       subm(0);
    382423                                        for(U i=0;i<3;++i)
    383424                                        {
    384                                                 if(dot(*vt[i],cross(dl[i],n))>0)
     425                                                if(btDot(*vt[i],btCross(dl[i],n))>0)
    385426                                                {
    386427                                                        const U                 j=imd3[i];
     
    398439                                        if(mindist<0)
    399440                                        {
    400                                                 const btScalar  d=dot(a,n);     
     441                                                const btScalar  d=btDot(a,n);   
    401442                                                const btScalar  s=btSqrt(l);
    402443                                                const btVector3 p=n*(d/l);
    403444                                                mindist =       p.length2();
    404445                                                m               =       7;
    405                                                 w[0]    =       (cross(dl[1],b-p)).length()/s;
    406                                                 w[1]    =       (cross(dl[2],c-p)).length()/s;
     446                                                w[0]    =       (btCross(dl[1],b-p)).length()/s;
     447                                                w[1]    =       (btCross(dl[2],c-p)).length()/s;
    407448                                                w[2]    =       1-(w[0]+w[1]);
    408449                                        }
     
    421462                                const btVector3         dl[]={a-d,b-d,c-d};
    422463                                const btScalar          vl=det(dl[0],dl[1],dl[2]);
    423                                 const bool                      ng=(vl*dot(a,cross(b-c,a-b)))<=0;
     464                                const bool                      ng=(vl*btDot(a,btCross(b-c,a-b)))<=0;
    424465                                if(ng&&(btFabs(vl)>GJK_SIMPLEX4_EPS))
    425466                                {
    426467                                        btScalar        mindist=-1;
    427                                         btScalar        subw[3];
    428                                         U                       subm;
     468                                        btScalar        subw[3]={0.f,0.f,0.f};
     469                                        U                       subm(0);
    429470                                        for(U i=0;i<3;++i)
    430471                                        {
    431472                                                const U                 j=imd3[i];
    432                                                 const btScalar  s=vl*dot(d,cross(dl[i],dl[j]));
     473                                                const btScalar  s=vl*btDot(d,btCross(dl[i],dl[j]));
    433474                                                if(s>0)
    434475                                                {
     
    602643                                                                best->pass      =       (U1)(++pass);
    603644                                                                gjk.getsupport(best->n,*w);
    604                                                                 const btScalar  wdist=dot(best->n,w->w)-best->d;
     645                                                                const btScalar  wdist=btDot(best->n,w->w)-best->d;
    605646                                                                if(wdist>EPA_ACCURACY)
    606647                                                                {
     
    629670                                                m_result.c[1]   =       outer.c[1];
    630671                                                m_result.c[2]   =       outer.c[2];
    631                                                 m_result.p[0]   =       cross(  outer.c[1]->w-projection,
     672                                                m_result.p[0]   =       btCross(        outer.c[1]->w-projection,
    632673                                                        outer.c[2]->w-projection).length();
    633                                                 m_result.p[1]   =       cross(  outer.c[2]->w-projection,
     674                                                m_result.p[1]   =       btCross(        outer.c[2]->w-projection,
    634675                                                        outer.c[0]->w-projection).length();
    635                                                 m_result.p[2]   =       cross(  outer.c[0]->w-projection,
     676                                                m_result.p[2]   =       btCross(        outer.c[0]->w-projection,
    636677                                                        outer.c[1]->w-projection).length();
    637678                                                const btScalar  sum=m_result.p[0]+m_result.p[1]+m_result.p[2];
     
    667708                                        face->c[1]      =       b;
    668709                                        face->c[2]      =       c;
    669                                         face->n         =       cross(b->w-a->w,c->w-a->w);
     710                                        face->n         =       btCross(b->w-a->w,c->w-a->w);
    670711                                        const btScalar  l=face->n.length();
    671712                                        const bool              v=l>EPA_ACCURACY;
    672713                                        face->p         =       btMin(btMin(
    673                                                 dot(a->w,cross(face->n,a->w-b->w)),
    674                                                 dot(b->w,cross(face->n,b->w-c->w))),
    675                                                 dot(c->w,cross(face->n,c->w-a->w)))     /
     714                                                btDot(a->w,btCross(face->n,a->w-b->w)),
     715                                                btDot(b->w,btCross(face->n,b->w-c->w))),
     716                                                btDot(c->w,btCross(face->n,c->w-a->w))) /
    676717                                                (v?l:1);
    677718                                        face->p         =       face->p>=-EPA_INSIDE_EPS?0:face->p;
    678719                                        if(v)
    679720                                        {
    680                                                 face->d         =       dot(a->w,face->n)/l;
     721                                                face->d         =       btDot(a->w,face->n)/l;
    681722                                                face->n         /=      l;
    682723                                                if(forced||(face->d>=-EPA_PLANE_EPS))
     
    716757                                {
    717758                                        const U e1=i1m3[e];
    718                                         if((dot(f->n,w->w)-f->d)<-EPA_PLANE_EPS)
     759                                        if((btDot(f->n,w->w)-f->d)<-EPA_PLANE_EPS)
    719760                                        {
    720761                                                sFace*  nf=newface(f->c[e1],f->c[e],w,false);
     
    855896                results.status=sResults::GJK_Failed;
    856897                break;
     898                default:
     899                                        {
     900                                        }
    857901        }
    858902        return(false);
    859903}
    860904
     905#ifndef __SPU__
    861906//
    862907btScalar        btGjkEpaSolver2::SignedDistance(const btVector3& position,
     
    924969                return(true);
    925970}
     971#endif //__SPU__
    926972
    927973/* Symbols cleanup              */
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa2.h

    r5781 r7983  
    5656                                                        sResults& results,
    5757                                                        bool usemargins=true);
    58 
     58#ifndef __SPU__
    5959static btScalar SignedDistance( const btVector3& position,
    6060                                                                btScalar margin,
     
    6767                                                                const btVector3& guess,
    6868                                                                sResults& results);
     69#endif //__SPU__
     70
    6971};
    7072
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp

    r5781 r7983  
    3333        (void)simplexSolver;
    3434
    35         const btScalar                          radialmargin(btScalar(0.));
     35//      const btScalar                          radialmargin(btScalar(0.));
    3636       
    3737        btVector3       guessVector(transformA.getOrigin()-transformB.getOrigin());
    3838        btGjkEpaSolver2::sResults       results;
     39       
     40
    3941        if(btGjkEpaSolver2::Penetration(pConvexA,transformA,
    4042                                                                pConvexB,transformB,
     
    4648                wWitnessOnA = results.witnesses[0];
    4749                wWitnessOnB = results.witnesses[1];
     50                v = results.normal;
    4851                return true;           
     52                } else
     53        {
     54                if(btGjkEpaSolver2::Distance(pConvexA,transformA,pConvexB,transformB,guessVector,results))
     55                {
     56                        wWitnessOnA = results.witnesses[0];
     57                        wWitnessOnB = results.witnesses[1];
     58                        v = results.normal;
     59                        return false;
    4960                }
     61        }
    5062
    5163        return false;
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h

    r5781 r7983  
    2626        public :
    2727
     28                btGjkEpaPenetrationDepthSolver()
     29                {
     30                }
     31
    2832                bool                    calcPenDepth( btSimplexSolverInterface& simplexSolver,
    2933                                                                          const btConvexShape* pConvexA, const btConvexShape* pConvexB,
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp

    r5781 r7983  
    3939
    4040
    41 
    4241btGjkPairDetector::btGjkPairDetector(const btConvexShape* objectA,const btConvexShape* objectB,btSimplexSolverInterface* simplexSolver,btConvexPenetrationDepthSolver*  penetrationDepthSolver)
    43 :m_cachedSeparatingAxis(btScalar(0.),btScalar(0.),btScalar(1.)),
     42:m_cachedSeparatingAxis(btScalar(0.),btScalar(1.),btScalar(0.)),
    4443m_penetrationDepthSolver(penetrationDepthSolver),
    4544m_simplexSolver(simplexSolver),
    4645m_minkowskiA(objectA),
    4746m_minkowskiB(objectB),
     47m_shapeTypeA(objectA->getShapeType()),
     48m_shapeTypeB(objectB->getShapeType()),
     49m_marginA(objectA->getMargin()),
     50m_marginB(objectB->getMargin()),
    4851m_ignoreMargin(false),
    4952m_lastUsedMethod(-1),
     
    5154{
    5255}
    53 
    54 void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw,bool swapResults)
     56btGjkPairDetector::btGjkPairDetector(const btConvexShape* objectA,const btConvexShape* objectB,int shapeTypeA,int shapeTypeB,btScalar marginA, btScalar marginB, btSimplexSolverInterface* simplexSolver,btConvexPenetrationDepthSolver*        penetrationDepthSolver)
     57:m_cachedSeparatingAxis(btScalar(0.),btScalar(1.),btScalar(0.)),
     58m_penetrationDepthSolver(penetrationDepthSolver),
     59m_simplexSolver(simplexSolver),
     60m_minkowskiA(objectA),
     61m_minkowskiB(objectB),
     62m_shapeTypeA(shapeTypeA),
     63m_shapeTypeB(shapeTypeB),
     64m_marginA(marginA),
     65m_marginB(marginB),
     66m_ignoreMargin(false),
     67m_lastUsedMethod(-1),
     68m_catchDegeneracies(1)
     69{
     70}
     71
     72void    btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw,bool swapResults)
     73{
     74        (void)swapResults;
     75
     76        getClosestPointsNonVirtual(input,output,debugDraw);
     77}
     78
     79#ifdef __SPU__
     80void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw)
     81#else
     82void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw)
     83#endif
    5584{
    5685        m_cachedSeparatingDistance = 0.f;
     
    6594        localTransB.getOrigin() -= positionOffset;
    6695
    67 #ifdef __SPU__
    68         btScalar marginA = m_minkowskiA->getMarginNonVirtual();
    69         btScalar marginB = m_minkowskiB->getMarginNonVirtual();
    70 #else
    71         btScalar marginA = m_minkowskiA->getMargin();
    72         btScalar marginB = m_minkowskiB->getMargin();
    73 #ifdef TEST_NON_VIRTUAL
    74         btScalar marginAv = m_minkowskiA->getMarginNonVirtual();
    75         btScalar marginBv = m_minkowskiB->getMarginNonVirtual();
    76         btAssert(marginA == marginAv);
    77         btAssert(marginB == marginBv);
    78 #endif //TEST_NON_VIRTUAL
    79 #endif
    80        
    81 
     96        bool check2d = m_minkowskiA->isConvex2d() && m_minkowskiB->isConvex2d();
     97
     98        btScalar marginA = m_marginA;
     99        btScalar marginB = m_marginB;
    82100
    83101        gNumGjkChecks++;
     
    108126
    109127        {
    110                 btScalar squaredDistance = SIMD_INFINITY;
     128                btScalar squaredDistance = BT_LARGE_FLOAT;
    111129                btScalar delta = btScalar(0.);
    112130               
     
    124142                        btVector3 seperatingAxisInB = m_cachedSeparatingAxis* input.m_transformB.getBasis();
    125143
     144#if 1
     145
     146                        btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA);
     147                        btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInB);
     148
     149//                      btVector3 pInA  = localGetSupportingVertexWithoutMargin(m_shapeTypeA, m_minkowskiA, seperatingAxisInA,input.m_convexVertexData[0]);//, &featureIndexA);
     150//                      btVector3 qInB  = localGetSupportingVertexWithoutMargin(m_shapeTypeB, m_minkowskiB, seperatingAxisInB,input.m_convexVertexData[1]);//, &featureIndexB);
     151
     152#else
    126153#ifdef __SPU__
    127154                        btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA);
     
    137164#endif //
    138165#endif //__SPU__
     166#endif
     167
    139168
    140169                        btVector3  pWorld = localTransA(pInA); 
     
    145174#endif
    146175
     176                        if (check2d)
     177                        {
     178                                pWorld[2] = 0.f;
     179                                qWorld[2] = 0.f;
     180                        }
     181
    147182                        btVector3 w     = pWorld - qWorld;
    148183                        delta = m_cachedSeparatingAxis.dot(w);
     
    151186                        if ((delta > btScalar(0.0)) && (delta * delta > squaredDistance * input.m_maximumDistanceSquared))
    152187                        {
     188                                m_degenerateSimplex = 10;
    153189                                checkSimplex=true;
    154190                                //checkPenetration = false;
     
    172208                                {
    173209                                        m_degenerateSimplex = 2;
     210                                } else
     211                                {
     212                                        m_degenerateSimplex = 11;
    174213                                }
    175214                                checkSimplex = true;
     
    185224                spu_printf("addVertex 2\n");
    186225#endif
     226                        btVector3 newCachedSeparatingAxis;
     227
    187228                        //calculate the closest point to the origin (update vector v)
    188                         if (!m_simplexSolver->closest(m_cachedSeparatingAxis))
     229                        if (!m_simplexSolver->closest(newCachedSeparatingAxis))
    189230                        {
    190231                                m_degenerateSimplex = 3;
     
    193234                        }
    194235
    195                         if(m_cachedSeparatingAxis.length2()<REL_ERROR2)
     236                        if(newCachedSeparatingAxis.length2()<REL_ERROR2)
    196237            {
     238                                m_cachedSeparatingAxis = newCachedSeparatingAxis;
    197239                m_degenerateSimplex = 6;
    198240                checkSimplex = true;
     
    201243
    202244                        btScalar previousSquaredDistance = squaredDistance;
    203                         squaredDistance = m_cachedSeparatingAxis.length2();
     245                        squaredDistance = newCachedSeparatingAxis.length2();
     246#if 0
     247///warning: this termination condition leads to some problems in 2d test case see Bullet/Demos/Box2dDemo
     248                        if (squaredDistance>previousSquaredDistance)
     249                        {
     250                                m_degenerateSimplex = 7;
     251                                squaredDistance = previousSquaredDistance;
     252                checkSimplex = false;
     253                break;
     254                        }
     255#endif //
    204256                       
     257                        m_cachedSeparatingAxis = newCachedSeparatingAxis;
     258
    205259                        //redundant m_simplexSolver->compute_points(pointOnA, pointOnB);
    206260
     
    210264                                m_simplexSolver->backup_closest(m_cachedSeparatingAxis);
    211265                                checkSimplex = true;
     266                                m_degenerateSimplex = 12;
     267                               
    212268                                break;
    213269                        }
     
    240296                                //do we need this backup_closest here ?
    241297                                m_simplexSolver->backup_closest(m_cachedSeparatingAxis);
     298                                m_degenerateSimplex = 13;
    242299                                break;
    243300                        }
     
    248305                        m_simplexSolver->compute_points(pointOnA, pointOnB);
    249306                        normalInB = pointOnA-pointOnB;
    250                         btScalar lenSqr = m_cachedSeparatingAxis.length2();
     307                        btScalar lenSqr =m_cachedSeparatingAxis.length2();
     308                       
    251309                        //valid normal
    252310                        if (lenSqr < 0.0001)
     
    280338                {
    281339                        //penetration case
    282                
     340
    283341                        //if there is no way to handle penetrations, bail out
    284342                        if (m_penetrationDepthSolver)
     
    288346                               
    289347                                gNumDeepPenetrationChecks++;
     348                                m_cachedSeparatingAxis.setZero();
    290349
    291350                                bool isValid2 = m_penetrationDepthSolver->calcPenDepth(
     
    297356                                        );
    298357
     358
    299359                                if (isValid2)
    300360                                {
    301361                                        btVector3 tmpNormalInB = tmpPointOnB-tmpPointOnA;
    302362                                        btScalar lenSqr = tmpNormalInB.length2();
     363                                        if (lenSqr <= (SIMD_EPSILON*SIMD_EPSILON))
     364                                        {
     365                                                tmpNormalInB = m_cachedSeparatingAxis;
     366                                                lenSqr = m_cachedSeparatingAxis.length2();
     367                                        }
     368
    303369                                        if (lenSqr > (SIMD_EPSILON*SIMD_EPSILON))
    304370                                        {
     
    316382                                                } else
    317383                                                {
    318                                                        
     384                                                        m_lastUsedMethod = 8;
    319385                                                }
    320386                                        } else
    321387                                        {
    322                                                 //isValid = false;
    323                                                 m_lastUsedMethod = 4;
     388                                                m_lastUsedMethod = 9;
    324389                                        }
    325390                                } else
     391
    326392                                {
    327                                         m_lastUsedMethod = 5;
     393                                        ///this is another degenerate case, where the initial GJK calculation reports a degenerate case
     394                                        ///EPA reports no penetration, and the second GJK (using the supporting vector without margin)
     395                                        ///reports a valid positive distance. Use the results of the second GJK instead of failing.
     396                                        ///thanks to Jacob.Langford for the reproduction case
     397                                        ///http://code.google.com/p/bullet/issues/detail?id=250
     398
     399                               
     400                                        if (m_cachedSeparatingAxis.length2() > btScalar(0.))
     401                                        {
     402                                                btScalar distance2 = (tmpPointOnA-tmpPointOnB).length()-margin;
     403                                                //only replace valid distances when the distance is less
     404                                                if (!isValid || (distance2 < distance))
     405                                                {
     406                                                        distance = distance2;
     407                                                        pointOnA = tmpPointOnA;
     408                                                        pointOnB = tmpPointOnB;
     409                                                        pointOnA -= m_cachedSeparatingAxis * marginA ;
     410                                                        pointOnB += m_cachedSeparatingAxis * marginB ;
     411                                                        normalInB = m_cachedSeparatingAxis;
     412                                                        normalInB.normalize();
     413                                                        isValid = true;
     414                                                        m_lastUsedMethod = 6;
     415                                                } else
     416                                                {
     417                                                        m_lastUsedMethod = 5;
     418                                                }
     419                                        }
    328420                                }
    329421                               
    330422                        }
     423
    331424                }
    332425        }
    333426
    334         if (isValid)
     427       
     428
     429        if (isValid && ((distance < 0) || (distance*distance < input.m_maximumDistanceSquared)))
    335430        {
    336 #ifdef __SPU__
    337                 //spu_printf("distance\n");
    338 #endif //__CELLOS_LV2__
    339 
    340 
    341 #ifdef DEBUG_SPU_COLLISION_DETECTION
    342                 spu_printf("output 1\n");
    343 #endif
     431#if 0
     432///some debugging
     433//              if (check2d)
     434                {
     435                        printf("n = %2.3f,%2.3f,%2.3f. ",normalInB[0],normalInB[1],normalInB[2]);
     436                        printf("distance = %2.3f exit=%d deg=%d\n",distance,m_lastUsedMethod,m_degenerateSimplex);
     437                }
     438#endif
     439
    344440                m_cachedSeparatingAxis = normalInB;
    345441                m_cachedSeparatingDistance = distance;
     
    350446                        distance);
    351447
    352 #ifdef DEBUG_SPU_COLLISION_DETECTION
    353                 spu_printf("output 2\n");
    354 #endif
    355                 //printf("gjk add:%f",distance);
    356448        }
    357449
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h

    r5781 r7983  
    3737        const btConvexShape* m_minkowskiA;
    3838        const btConvexShape* m_minkowskiB;
     39        int     m_shapeTypeA;
     40        int m_shapeTypeB;
     41        btScalar        m_marginA;
     42        btScalar        m_marginB;
     43
    3944        bool            m_ignoreMargin;
    4045        btScalar        m_cachedSeparatingDistance;
     
    5156
    5257        btGjkPairDetector(const btConvexShape* objectA,const btConvexShape* objectB,btSimplexSolverInterface* simplexSolver,btConvexPenetrationDepthSolver*     penetrationDepthSolver);
     58        btGjkPairDetector(const btConvexShape* objectA,const btConvexShape* objectB,int shapeTypeA,int shapeTypeB,btScalar marginA, btScalar marginB, btSimplexSolverInterface* simplexSolver,btConvexPenetrationDepthSolver*   penetrationDepthSolver);
    5359        virtual ~btGjkPairDetector() {};
    5460
    5561        virtual void    getClosestPoints(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw,bool swapResults=false);
     62
     63        void    getClosestPointsNonVirtual(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw);
     64       
    5665
    5766        void setMinkowskiA(btConvexShape* minkA)
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h

    r5781 r7983  
    2020#include "LinearMath/btTransformUtil.h"
    2121
     22// Don't change following order of parameters
     23ATTRIBUTE_ALIGNED16(struct) PfxConstraintRow {
     24        btScalar mNormal[3];
     25        btScalar mRhs;
     26        btScalar mJacDiagInv;
     27        btScalar mLowerLimit;
     28        btScalar mUpperLimit;
     29        btScalar mAccumImpulse;
     30};
    2231
    2332
     
    3544                                m_appliedImpulseLateral1(0.f),
    3645                                m_appliedImpulseLateral2(0.f),
     46                                m_contactMotion1(0.f),
     47                                m_contactMotion2(0.f),
     48                                m_contactCFM1(0.f),
     49                                m_contactCFM2(0.f),
    3750                                m_lifeTime(0)
    3851                        {
     
    5366                                        m_appliedImpulseLateral1(0.f),
    5467                                        m_appliedImpulseLateral2(0.f),
     68                                        m_contactMotion1(0.f),
     69                                        m_contactMotion2(0.f),
     70                                        m_contactCFM1(0.f),
     71                                        m_contactCFM2(0.f),
    5572                                        m_lifeTime(0)
    5673                        {
    57                                
    58                                        
     74                                mConstraintRow[0].mAccumImpulse = 0.f;
     75                                mConstraintRow[1].mAccumImpulse = 0.f;
     76                                mConstraintRow[2].mAccumImpulse = 0.f;
    5977                        }
    6078
     
    84102                        btScalar                m_appliedImpulseLateral1;
    85103                        btScalar                m_appliedImpulseLateral2;
     104                        btScalar                m_contactMotion1;
     105                        btScalar                m_contactMotion2;
     106                        btScalar                m_contactCFM1;
     107                        btScalar                m_contactCFM2;
     108
    86109                        int                             m_lifeTime;//lifetime of the contactpoint in frames
    87110                       
    88111                        btVector3               m_lateralFrictionDir1;
    89112                        btVector3               m_lateralFrictionDir2;
     113
     114
     115
     116                        PfxConstraintRow mConstraintRow[3];
     117
    90118
    91119                        btScalar getDistance() const
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp

    r5781 r7983  
    2121
    2222#define NUM_UNITSPHERE_POINTS 42
    23 static btVector3        sPenetrationDirections[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2] =
    24 {
    25 btVector3(btScalar(0.000000) , btScalar(-0.000000),btScalar(-1.000000)),
    26 btVector3(btScalar(0.723608) , btScalar(-0.525725),btScalar(-0.447219)),
    27 btVector3(btScalar(-0.276388) , btScalar(-0.850649),btScalar(-0.447219)),
    28 btVector3(btScalar(-0.894426) , btScalar(-0.000000),btScalar(-0.447216)),
    29 btVector3(btScalar(-0.276388) , btScalar(0.850649),btScalar(-0.447220)),
    30 btVector3(btScalar(0.723608) , btScalar(0.525725),btScalar(-0.447219)),
    31 btVector3(btScalar(0.276388) , btScalar(-0.850649),btScalar(0.447220)),
    32 btVector3(btScalar(-0.723608) , btScalar(-0.525725),btScalar(0.447219)),
    33 btVector3(btScalar(-0.723608) , btScalar(0.525725),btScalar(0.447219)),
    34 btVector3(btScalar(0.276388) , btScalar(0.850649),btScalar(0.447219)),
    35 btVector3(btScalar(0.894426) , btScalar(0.000000),btScalar(0.447216)),
    36 btVector3(btScalar(-0.000000) , btScalar(0.000000),btScalar(1.000000)),
    37 btVector3(btScalar(0.425323) , btScalar(-0.309011),btScalar(-0.850654)),
    38 btVector3(btScalar(-0.162456) , btScalar(-0.499995),btScalar(-0.850654)),
    39 btVector3(btScalar(0.262869) , btScalar(-0.809012),btScalar(-0.525738)),
    40 btVector3(btScalar(0.425323) , btScalar(0.309011),btScalar(-0.850654)),
    41 btVector3(btScalar(0.850648) , btScalar(-0.000000),btScalar(-0.525736)),
    42 btVector3(btScalar(-0.525730) , btScalar(-0.000000),btScalar(-0.850652)),
    43 btVector3(btScalar(-0.688190) , btScalar(-0.499997),btScalar(-0.525736)),
    44 btVector3(btScalar(-0.162456) , btScalar(0.499995),btScalar(-0.850654)),
    45 btVector3(btScalar(-0.688190) , btScalar(0.499997),btScalar(-0.525736)),
    46 btVector3(btScalar(0.262869) , btScalar(0.809012),btScalar(-0.525738)),
    47 btVector3(btScalar(0.951058) , btScalar(0.309013),btScalar(0.000000)),
    48 btVector3(btScalar(0.951058) , btScalar(-0.309013),btScalar(0.000000)),
    49 btVector3(btScalar(0.587786) , btScalar(-0.809017),btScalar(0.000000)),
    50 btVector3(btScalar(0.000000) , btScalar(-1.000000),btScalar(0.000000)),
    51 btVector3(btScalar(-0.587786) , btScalar(-0.809017),btScalar(0.000000)),
    52 btVector3(btScalar(-0.951058) , btScalar(-0.309013),btScalar(-0.000000)),
    53 btVector3(btScalar(-0.951058) , btScalar(0.309013),btScalar(-0.000000)),
    54 btVector3(btScalar(-0.587786) , btScalar(0.809017),btScalar(-0.000000)),
    55 btVector3(btScalar(-0.000000) , btScalar(1.000000),btScalar(-0.000000)),
    56 btVector3(btScalar(0.587786) , btScalar(0.809017),btScalar(-0.000000)),
    57 btVector3(btScalar(0.688190) , btScalar(-0.499997),btScalar(0.525736)),
    58 btVector3(btScalar(-0.262869) , btScalar(-0.809012),btScalar(0.525738)),
    59 btVector3(btScalar(-0.850648) , btScalar(0.000000),btScalar(0.525736)),
    60 btVector3(btScalar(-0.262869) , btScalar(0.809012),btScalar(0.525738)),
    61 btVector3(btScalar(0.688190) , btScalar(0.499997),btScalar(0.525736)),
    62 btVector3(btScalar(0.525730) , btScalar(0.000000),btScalar(0.850652)),
    63 btVector3(btScalar(0.162456) , btScalar(-0.499995),btScalar(0.850654)),
    64 btVector3(btScalar(-0.425323) , btScalar(-0.309011),btScalar(0.850654)),
    65 btVector3(btScalar(-0.425323) , btScalar(0.309011),btScalar(0.850654)),
    66 btVector3(btScalar(0.162456) , btScalar(0.499995),btScalar(0.850654))
    67 };
    6823
    6924
     
    7934        (void)v;
    8035       
     36        bool check2d= convexA->isConvex2d() && convexB->isConvex2d();
    8137
    8238        struct btIntermediateResult : public btDiscreteCollisionDetectorInterface::Result
     
    9248                bool    m_hasResult;
    9349
    94                 virtual void setShapeIdentifiers(int partId0,int index0,        int partId1,int index1)
     50                virtual void setShapeIdentifiersA(int partId0,int index0)
    9551                {
    9652                        (void)partId0;
    9753                        (void)index0;
     54                }
     55                virtual void setShapeIdentifiersB(int partId1,int index1)
     56                {
    9857                        (void)partId1;
    9958                        (void)index1;
     
    10968
    11069        //just take fixed number of orientation, and sample the penetration depth in that direction
    111         btScalar minProj = btScalar(1e30);
     70        btScalar minProj = btScalar(BT_LARGE_FLOAT);
    11271        btVector3 minNorm(btScalar(0.), btScalar(0.), btScalar(0.));
    11372        btVector3 minA,minB;
     
    13089        for (i=0;i<numSampleDirections;i++)
    13190        {
    132                 const btVector3& norm = sPenetrationDirections[i];
     91                btVector3 norm = getPenetrationDirections()[i];
    13392                seperatingAxisInABatch[i] =  (-norm) * transA.getBasis() ;
    13493                seperatingAxisInBBatch[i] =  norm   * transB.getBasis() ;
     
    144103                                convexA->getPreferredPenetrationDirection(i,norm);
    145104                                norm  = transA.getBasis() * norm;
    146                                 sPenetrationDirections[numSampleDirections] = norm;
     105                                getPenetrationDirections()[numSampleDirections] = norm;
    147106                                seperatingAxisInABatch[numSampleDirections] = (-norm) * transA.getBasis();
    148107                                seperatingAxisInBBatch[numSampleDirections] = norm * transB.getBasis();
     
    161120                                convexB->getPreferredPenetrationDirection(i,norm);
    162121                                norm  = transB.getBasis() * norm;
    163                                 sPenetrationDirections[numSampleDirections] = norm;
     122                                getPenetrationDirections()[numSampleDirections] = norm;
    164123                                seperatingAxisInABatch[numSampleDirections] = (-norm) * transA.getBasis();
    165124                                seperatingAxisInBBatch[numSampleDirections] = norm * transB.getBasis();
     
    171130
    172131
     132
    173133        convexA->batchedUnitVectorGetSupportingVertexWithoutMargin(seperatingAxisInABatch,supportVerticesABatch,numSampleDirections);
    174134        convexB->batchedUnitVectorGetSupportingVertexWithoutMargin(seperatingAxisInBBatch,supportVerticesBBatch,numSampleDirections);
     
    176136        for (i=0;i<numSampleDirections;i++)
    177137        {
    178                 const btVector3& norm = sPenetrationDirections[i];
    179                 seperatingAxisInA = seperatingAxisInABatch[i];
    180                 seperatingAxisInB = seperatingAxisInBBatch[i];
    181 
    182                 pInA = supportVerticesABatch[i];
    183                 qInB = supportVerticesBBatch[i];
    184 
    185                 pWorld = transA(pInA); 
    186                 qWorld = transB(qInB);
    187                 w       = qWorld - pWorld;
    188                 btScalar delta = norm.dot(w);
    189                 //find smallest delta
    190                 if (delta < minProj)
    191                 {
    192                         minProj = delta;
    193                         minNorm = norm;
    194                         minA = pWorld;
    195                         minB = qWorld;
     138                btVector3 norm = getPenetrationDirections()[i];
     139                if (check2d)
     140                {
     141                        norm[2] = 0.f;
     142                }
     143                if (norm.length2()>0.01)
     144                {
     145
     146                        seperatingAxisInA = seperatingAxisInABatch[i];
     147                        seperatingAxisInB = seperatingAxisInBBatch[i];
     148
     149                        pInA = supportVerticesABatch[i];
     150                        qInB = supportVerticesBBatch[i];
     151
     152                        pWorld = transA(pInA); 
     153                        qWorld = transB(qInB);
     154                        if (check2d)
     155                        {
     156                                pWorld[2] = 0.f;
     157                                qWorld[2] = 0.f;
     158                        }
     159
     160                        w       = qWorld - pWorld;
     161                        btScalar delta = norm.dot(w);
     162                        //find smallest delta
     163                        if (delta < minProj)
     164                        {
     165                                minProj = delta;
     166                                minNorm = norm;
     167                                minA = pWorld;
     168                                minB = qWorld;
     169                        }
    196170                }
    197171        }       
     
    210184                                convexA->getPreferredPenetrationDirection(i,norm);
    211185                                norm  = transA.getBasis() * norm;
    212                                 sPenetrationDirections[numSampleDirections] = norm;
     186                                getPenetrationDirections()[numSampleDirections] = norm;
    213187                                numSampleDirections++;
    214188                        }
     
    225199                                convexB->getPreferredPenetrationDirection(i,norm);
    226200                                norm  = transB.getBasis() * norm;
    227                                 sPenetrationDirections[numSampleDirections] = norm;
     201                                getPenetrationDirections()[numSampleDirections] = norm;
    228202                                numSampleDirections++;
    229203                        }
     
    234208        for (int i=0;i<numSampleDirections;i++)
    235209        {
    236                 const btVector3& norm = sPenetrationDirections[i];
     210                const btVector3& norm = getPenetrationDirections()[i];
    237211                seperatingAxisInA = (-norm)* transA.getBasis();
    238212                seperatingAxisInB = norm* transB.getBasis();
     
    262236                return false;
    263237
    264         minProj += (convexA->getMarginNonVirtual() + convexB->getMarginNonVirtual());
     238        btScalar extraSeparation = 0.5f;///scale dependent
     239        minProj += extraSeparation+(convexA->getMarginNonVirtual() + convexB->getMarginNonVirtual());
    265240
    266241
     
    300275        input.m_transformA = displacedTrans;
    301276        input.m_transformB = transB;
    302         input.m_maximumDistanceSquared = btScalar(1e30);//minProj;
     277        input.m_maximumDistanceSquared = btScalar(BT_LARGE_FLOAT);//minProj;
    303278       
    304279        btIntermediateResult res;
     280        gjkdet.setCachedSeperatingAxis(-minNorm);
    305281        gjkdet.getClosestPoints(input,res,debugDraw);
    306282
     
    311287        btScalar penetration_relaxation= btScalar(1.);
    312288        minNorm*=penetration_relaxation;
     289       
    313290
    314291        if (res.m_hasResult)
     
    317294                pa = res.m_pointInWorld - minNorm * correctedMinNorm;
    318295                pb = res.m_pointInWorld;
     296                v = minNorm;
    319297               
    320298#ifdef DEBUG_DRAW
     
    331309}
    332310
    333 
    334 
     311btVector3*      btMinkowskiPenetrationDepthSolver::getPenetrationDirections()
     312{
     313        static btVector3        sPenetrationDirections[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2] =
     314        {
     315        btVector3(btScalar(0.000000) , btScalar(-0.000000),btScalar(-1.000000)),
     316        btVector3(btScalar(0.723608) , btScalar(-0.525725),btScalar(-0.447219)),
     317        btVector3(btScalar(-0.276388) , btScalar(-0.850649),btScalar(-0.447219)),
     318        btVector3(btScalar(-0.894426) , btScalar(-0.000000),btScalar(-0.447216)),
     319        btVector3(btScalar(-0.276388) , btScalar(0.850649),btScalar(-0.447220)),
     320        btVector3(btScalar(0.723608) , btScalar(0.525725),btScalar(-0.447219)),
     321        btVector3(btScalar(0.276388) , btScalar(-0.850649),btScalar(0.447220)),
     322        btVector3(btScalar(-0.723608) , btScalar(-0.525725),btScalar(0.447219)),
     323        btVector3(btScalar(-0.723608) , btScalar(0.525725),btScalar(0.447219)),
     324        btVector3(btScalar(0.276388) , btScalar(0.850649),btScalar(0.447219)),
     325        btVector3(btScalar(0.894426) , btScalar(0.000000),btScalar(0.447216)),
     326        btVector3(btScalar(-0.000000) , btScalar(0.000000),btScalar(1.000000)),
     327        btVector3(btScalar(0.425323) , btScalar(-0.309011),btScalar(-0.850654)),
     328        btVector3(btScalar(-0.162456) , btScalar(-0.499995),btScalar(-0.850654)),
     329        btVector3(btScalar(0.262869) , btScalar(-0.809012),btScalar(-0.525738)),
     330        btVector3(btScalar(0.425323) , btScalar(0.309011),btScalar(-0.850654)),
     331        btVector3(btScalar(0.850648) , btScalar(-0.000000),btScalar(-0.525736)),
     332        btVector3(btScalar(-0.525730) , btScalar(-0.000000),btScalar(-0.850652)),
     333        btVector3(btScalar(-0.688190) , btScalar(-0.499997),btScalar(-0.525736)),
     334        btVector3(btScalar(-0.162456) , btScalar(0.499995),btScalar(-0.850654)),
     335        btVector3(btScalar(-0.688190) , btScalar(0.499997),btScalar(-0.525736)),
     336        btVector3(btScalar(0.262869) , btScalar(0.809012),btScalar(-0.525738)),
     337        btVector3(btScalar(0.951058) , btScalar(0.309013),btScalar(0.000000)),
     338        btVector3(btScalar(0.951058) , btScalar(-0.309013),btScalar(0.000000)),
     339        btVector3(btScalar(0.587786) , btScalar(-0.809017),btScalar(0.000000)),
     340        btVector3(btScalar(0.000000) , btScalar(-1.000000),btScalar(0.000000)),
     341        btVector3(btScalar(-0.587786) , btScalar(-0.809017),btScalar(0.000000)),
     342        btVector3(btScalar(-0.951058) , btScalar(-0.309013),btScalar(-0.000000)),
     343        btVector3(btScalar(-0.951058) , btScalar(0.309013),btScalar(-0.000000)),
     344        btVector3(btScalar(-0.587786) , btScalar(0.809017),btScalar(-0.000000)),
     345        btVector3(btScalar(-0.000000) , btScalar(1.000000),btScalar(-0.000000)),
     346        btVector3(btScalar(0.587786) , btScalar(0.809017),btScalar(-0.000000)),
     347        btVector3(btScalar(0.688190) , btScalar(-0.499997),btScalar(0.525736)),
     348        btVector3(btScalar(-0.262869) , btScalar(-0.809012),btScalar(0.525738)),
     349        btVector3(btScalar(-0.850648) , btScalar(0.000000),btScalar(0.525736)),
     350        btVector3(btScalar(-0.262869) , btScalar(0.809012),btScalar(0.525738)),
     351        btVector3(btScalar(0.688190) , btScalar(0.499997),btScalar(0.525736)),
     352        btVector3(btScalar(0.525730) , btScalar(0.000000),btScalar(0.850652)),
     353        btVector3(btScalar(0.162456) , btScalar(-0.499995),btScalar(0.850654)),
     354        btVector3(btScalar(-0.425323) , btScalar(-0.309011),btScalar(0.850654)),
     355        btVector3(btScalar(-0.425323) , btScalar(0.309011),btScalar(0.850654)),
     356        btVector3(btScalar(0.162456) , btScalar(0.499995),btScalar(0.850654))
     357        };
     358
     359        return sPenetrationDirections;
     360}
     361
     362
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h

    r5781 r7983  
    2323class btMinkowskiPenetrationDepthSolver : public btConvexPenetrationDepthSolver
    2424{
     25protected:
     26
     27        static btVector3*       getPenetrationDirections();
     28
    2529public:
    2630
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp

    r5781 r7983  
    2626
    2727btPersistentManifold::btPersistentManifold()
    28 :m_body0(0),
     28:btTypedObject(BT_PERSISTENT_MANIFOLD_TYPE),
     29m_body0(0),
    2930m_body1(0),
    3031m_cachedPoints (0),
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h

    r5781 r7983  
    3131typedef bool (*ContactProcessedCallback)(btManifoldPoint& cp,void* body0,void* body1);
    3232extern ContactDestroyedCallback gContactDestroyedCallback;
    33 
    34 
    35 
     33extern ContactProcessedCallback gContactProcessedCallback;
     34
     35
     36enum btContactManifoldTypes
     37{
     38        BT_PERSISTENT_MANIFOLD_TYPE = 1,
     39        MAX_CONTACT_MANIFOLD_TYPE
     40};
    3641
    3742#define MANIFOLD_CACHE_SIZE 4
     
    4449///the contact point with deepest penetration is always kept, and it tries to maximuze the area covered by the points
    4550///note that some pairs of objects might have more then one contact manifold.
    46 ATTRIBUTE_ALIGNED16( class) btPersistentManifold
     51
     52
     53ATTRIBUTE_ALIGNED128( class) btPersistentManifold : public btTypedObject
     54//ATTRIBUTE_ALIGNED16( class) btPersistentManifold : public btTypedObject
    4755{
    4856
     
    5361        void* m_body0;
    5462        void* m_body1;
     63
    5564        int     m_cachedPoints;
    5665
     
    6877        BT_DECLARE_ALIGNED_ALLOCATOR();
    6978
     79        int     m_companionIdA;
     80        int     m_companionIdB;
     81
    7082        int m_index1a;
    7183
     
    7385
    7486        btPersistentManifold(void* body0,void* body1,int , btScalar contactBreakingThreshold,btScalar contactProcessingThreshold)
    75                 : m_body0(body0),m_body1(body1),m_cachedPoints(0),
     87                : btTypedObject(BT_PERSISTENT_MANIFOLD_TYPE),
     88        m_body0(body0),m_body1(body1),m_cachedPoints(0),
    7689                m_contactBreakingThreshold(contactBreakingThreshold),
    7790                m_contactProcessingThreshold(contactProcessingThreshold)
    7891        {
    79                
    8092        }
    8193
     
    135147                        //get rid of duplicated userPersistentData pointer
    136148                        m_pointCache[lastUsedIndex].m_userPersistentData = 0;
     149                        m_pointCache[lastUsedIndex].mConstraintRow[0].mAccumImpulse = 0.f;
     150                        m_pointCache[lastUsedIndex].mConstraintRow[1].mAccumImpulse = 0.f;
     151                        m_pointCache[lastUsedIndex].mConstraintRow[2].mAccumImpulse = 0.f;
     152
    137153                        m_pointCache[lastUsedIndex].m_appliedImpulse = 0.f;
    138154                        m_pointCache[lastUsedIndex].m_lateralFrictionInitialized = false;
     
    152168#ifdef MAINTAIN_PERSISTENCY
    153169                int     lifeTime = m_pointCache[insertIndex].getLifeTime();
    154                 btScalar        appliedImpulse = m_pointCache[insertIndex].m_appliedImpulse;
    155                 btScalar        appliedLateralImpulse1 = m_pointCache[insertIndex].m_appliedImpulseLateral1;
    156                 btScalar        appliedLateralImpulse2 = m_pointCache[insertIndex].m_appliedImpulseLateral2;
    157                                
     170                btScalar        appliedImpulse = m_pointCache[insertIndex].mConstraintRow[0].mAccumImpulse;
     171                btScalar        appliedLateralImpulse1 = m_pointCache[insertIndex].mConstraintRow[1].mAccumImpulse;
     172                btScalar        appliedLateralImpulse2 = m_pointCache[insertIndex].mConstraintRow[2].mAccumImpulse;
     173//              bool isLateralFrictionInitialized = m_pointCache[insertIndex].m_lateralFrictionInitialized;
     174               
     175               
     176                       
    158177                btAssert(lifeTime>=0);
    159178                void* cache = m_pointCache[insertIndex].m_userPersistentData;
     
    166185                m_pointCache[insertIndex].m_appliedImpulseLateral2 = appliedLateralImpulse2;
    167186               
     187                m_pointCache[insertIndex].mConstraintRow[0].mAccumImpulse =  appliedImpulse;
     188                m_pointCache[insertIndex].mConstraintRow[1].mAccumImpulse = appliedLateralImpulse1;
     189                m_pointCache[insertIndex].mConstraintRow[2].mAccumImpulse = appliedLateralImpulse2;
     190
     191
    168192                m_pointCache[insertIndex].m_lifeTime = lifeTime;
    169193#else
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btPointCollector.h

    r5781 r7983  
    3232
    3333        btPointCollector ()
    34                 : m_distance(btScalar(1e30)),m_hasResult(false)
     34                : m_distance(btScalar(BT_LARGE_FLOAT)),m_hasResult(false)
    3535        {
    3636        }
    3737
    38         virtual void setShapeIdentifiers(int partId0,int index0,        int partId1,int index1)
     38        virtual void setShapeIdentifiersA(int partId0,int index0)
    3939        {
    4040                (void)partId0;
    4141                (void)index0;
     42                       
     43        }
     44        virtual void setShapeIdentifiersB(int partId1,int index1)
     45        {
    4246                (void)partId1;
    4347                (void)index1;
    44                 //??
    4548        }
    4649
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp

    r5781 r7983  
    115115                        }
    116116                }
    117                 m_simplexSolver->addVertex( w, supVertexA , supVertexB);
     117                ///Just like regular GJK only add the vertex if it isn't already (close) to current vertex, it would lead to divisions by zero and NaN etc.
     118                if (!m_simplexSolver->inSimplex(w))
     119                        m_simplexSolver->addVertex( w, supVertexA , supVertexB);
     120
    118121                if (m_simplexSolver->closest(v))
    119122                {
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp

    r5781 r7983  
    6969        m_numVertices = 0;
    7070        m_needsUpdate = true;
    71         m_lastW = btVector3(btScalar(1e30),btScalar(1e30),btScalar(1e30));
     71        m_lastW = btVector3(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
    7272        m_cachedBC.reset();
    7373}
     
    290290        for (i=0;i<numverts;i++)
    291291        {
     292#ifdef BT_USE_EQUAL_VERTEX_THRESHOLD
     293                if ( m_simplexVectorW[i].distance2(w) <= m_equalVertexThreshold)
     294#else
    292295                if (m_simplexVectorW[i] == w)
     296#endif
    293297                        found = true;
    294298        }
  • code/branches/kicklib/src/external/bullet/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h

    r5781 r7983  
    2424
    2525#define VORONOI_SIMPLEX_MAX_VERTS 5
     26
     27///disable next define, or use defaultCollisionConfiguration->getSimplexSolver()->setEqualVertexThreshold(0.f) to disable/configure
     28#define BT_USE_EQUAL_VERTEX_THRESHOLD
     29#define VORONOI_DEFAULT_EQUAL_VERTEX_THRESHOLD 0.0001f
     30
    2631
    2732struct btUsageBitfield{
     
    107112        btVector3       m_cachedV;
    108113        btVector3       m_lastW;
     114       
     115        btScalar        m_equalVertexThreshold;
    109116        bool            m_cachedValidClosest;
     117
    110118
    111119        btSubSimplexClosestResult m_cachedBC;
     
    123131public:
    124132
     133        btVoronoiSimplexSolver()
     134                :  m_equalVertexThreshold(VORONOI_DEFAULT_EQUAL_VERTEX_THRESHOLD)
     135        {
     136        }
    125137         void reset();
    126138
    127139         void addVertex(const btVector3& w, const btVector3& p, const btVector3& q);
    128140
     141         void   setEqualVertexThreshold(btScalar threshold)
     142         {
     143                 m_equalVertexThreshold = threshold;
     144         }
     145
     146         btScalar       getEqualVertexThreshold() const
     147         {
     148                 return m_equalVertexThreshold;
     149         }
    129150
    130151         bool closest(btVector3& v);
Note: See TracChangeset for help on using the changeset viewer.