Logo Search packages:      
Sourcecode: blender version File versions  Download package


* Copyright (c) 2005 Erwin Coumans http://continuousphysics.com/Bullet/
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies.
* Erwin Coumans makes no representations about the suitability 
* of this software for any purpose.  
* It is provided "as is" without express or implied warranty.


#include "SimdVector3.h"
#include "SimdTransform.h"
#include "ManifoldPoint.h"

struct CollisionResult;

///contact breaking and merging treshold
extern float gContactBreakingTreshold;


///PersistentManifold maintains contact points, and reduces them to 4
00028 class PersistentManifold 

      ManifoldPoint m_pointCache[MANIFOLD_CACHE_SIZE];

      /// this two body pointers can point to the physics rigidbody class.
      /// void* will allow any rigidbody class
00035       void* m_body0;
      void* m_body1;
      int   m_cachedPoints;

      /// sort cached points so most isolated points come first
      int   SortCachedPoints(const ManifoldPoint& pt);

      int         FindContactPoint(const ManifoldPoint* unUsed, int numUnused,const ManifoldPoint& pt);


      int m_index1;


      PersistentManifold(void* body0,void* body1)
            : m_body0(body0),m_body1(body1),m_cachedPoints(0)

      inline void* GetBody0() { return m_body0;}
      inline void* GetBody1() { return m_body1;}

      inline const void* GetBody0() const { return m_body0;}
      inline const void* GetBody1() const { return m_body1;}

      void  SetBodies(void* body0,void* body1)
            m_body0 = body0;
            m_body1 = body1;


      inline int  GetNumContacts() const { return m_cachedPoints;}

      inline const ManifoldPoint& GetContactPoint(int index) const
            ASSERT(index < m_cachedPoints);
            return m_pointCache[index];

      inline ManifoldPoint& GetContactPoint(int index)
            ASSERT(index < m_cachedPoints);
            return m_pointCache[index];

      /// todo: get this margin from the current physics / collision environment
      float GetManifoldMargin() const;
      int GetCacheEntry(const ManifoldPoint& newPoint) const;

      void AddManifoldPoint( const ManifoldPoint& newPoint);

      void RemoveContactPoint (int index)
            m_pointCache[index] = m_pointCache[GetNumContacts() - 1];
      void ReplaceContactPoint(const ManifoldPoint& newPoint,int insertIndex)
            m_pointCache[insertIndex] = newPoint;

      bool ValidContactDistance(const ManifoldPoint& pt) const
            return pt.m_distance1 <= GetManifoldMargin();
      /// calculated new worldspace coordinates and depth, and reject points that exceed the collision margin
      void  RefreshContactPoints(  const SimdTransform& trA,const SimdTransform& trB);

      void  ClearManifold();

      float GetCollisionImpulse() const;



Generated by  Doxygen 1.6.0   Back to index