Refactoring:

Moved optional code to Extras: AlgebraicCCD,EPA,quickstep
Moved SimpleBroadphase data to OverlappingPairCache, and derive both SimpleBroadphase and AxisSweep3 from OverlappingPairCache.
Added ParallelPhysicsEnvironment (prepair more parallel mainloop)
Upgraded hardcoded limit from 1024/8192 to 32766/65535 (max objects / max overlapping pairs)
This commit is contained in:
ejcoumans
2006-06-29 20:57:47 +00:00
parent 28a8afe528
commit 9105c3af5a
51 changed files with 7428 additions and 7107 deletions

View File

@@ -48,6 +48,7 @@ void AxisSweep3::SetAabb(BroadphaseProxy* proxy,const SimdVector3& aabbMin,const
AxisSweep3::AxisSweep3(const SimdPoint3& worldAabbMin,const SimdPoint3& worldAabbMax, int maxHandles, int maxOverlaps) AxisSweep3::AxisSweep3(const SimdPoint3& worldAabbMin,const SimdPoint3& worldAabbMax, int maxHandles, int maxOverlaps)
:OverlappingPairCache(maxOverlaps)
{ {
//assert(bounds.HasVolume()); //assert(bounds.HasVolume());

View File

@@ -21,13 +21,13 @@
#include "SimdPoint3.h" #include "SimdPoint3.h"
#include "SimdVector3.h" #include "SimdVector3.h"
#include "SimpleBroadphase.h" #include "OverlappingPairCache.h"
#include "BroadphaseProxy.h" #include "BroadphaseProxy.h"
/// AxisSweep3 is an efficient implementation of the 3d axis sweep and prune broadphase. /// AxisSweep3 is an efficient implementation of the 3d axis sweep and prune broadphase.
/// It uses arrays rather then lists for storage of the 3 axis. Also it operates using integer coordinates instead of floats. /// It uses arrays rather then lists for storage of the 3 axis. Also it operates using integer coordinates instead of floats.
/// The TestOverlap check is optimized to check the array index, rather then the actual AABB coordinates/pos /// The TestOverlap check is optimized to check the array index, rather then the actual AABB coordinates/pos
class AxisSweep3 : public SimpleBroadphase class AxisSweep3 : public OverlappingPairCache
{ {
public: public:

View File

@@ -0,0 +1,213 @@
/*
Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
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.
*/
#include "OverlappingPairCache.h"
#include "Dispatcher.h"
#include "CollisionAlgorithm.h"
OverlappingPairCache::OverlappingPairCache(int maxOverlap):
m_blockedForChanges(false),
m_NumOverlapBroadphasePair(0),
m_maxOverlap(maxOverlap)
{
m_OverlappingPairs = new BroadphasePair[maxOverlap];
}
OverlappingPairCache::~OverlappingPairCache()
{
delete [] m_OverlappingPairs;
}
void OverlappingPairCache::RemoveOverlappingPair(BroadphasePair& pair)
{
CleanOverlappingPair(pair);
int index = &pair - &m_OverlappingPairs[0];
//remove efficiently, swap with the last
m_OverlappingPairs[index] = m_OverlappingPairs[m_NumOverlapBroadphasePair-1];
m_NumOverlapBroadphasePair--;
}
void OverlappingPairCache::CleanOverlappingPair(BroadphasePair& pair)
{
for (int dispatcherId=0;dispatcherId<SIMPLE_MAX_ALGORITHMS;dispatcherId++)
{
if (pair.m_algorithms[dispatcherId])
{
{
delete pair.m_algorithms[dispatcherId];
pair.m_algorithms[dispatcherId]=0;
}
}
}
}
void OverlappingPairCache::AddOverlappingPair(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1)
{
//don't add overlap with own
assert(proxy0 != proxy1);
if (!NeedsCollision(proxy0,proxy1))
return;
BroadphasePair pair(*proxy0,*proxy1);
m_OverlappingPairs[m_NumOverlapBroadphasePair] = pair;
int i;
for (i=0;i<SIMPLE_MAX_ALGORITHMS;i++)
{
assert(!m_OverlappingPairs[m_NumOverlapBroadphasePair].m_algorithms[i]);
m_OverlappingPairs[m_NumOverlapBroadphasePair].m_algorithms[i] = 0;
}
if (m_NumOverlapBroadphasePair >= m_maxOverlap)
{
//printf("Error: too many overlapping objects: m_NumOverlapBroadphasePair: %d\n",m_NumOverlapBroadphasePair);
#ifdef DEBUG
assert(0);
#endif
} else
{
m_NumOverlapBroadphasePair++;
}
}
BroadphasePair* OverlappingPairCache::FindPair(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1)
{
BroadphasePair* foundPair = 0;
int i;
for (i=m_NumOverlapBroadphasePair-1;i>=0;i--)
{
BroadphasePair& pair = m_OverlappingPairs[i];
if (((pair.m_pProxy0 == proxy0) && (pair.m_pProxy1 == proxy1)) ||
((pair.m_pProxy0 == proxy1) && (pair.m_pProxy1 == proxy0)))
{
foundPair = &pair;
return foundPair;
}
}
return foundPair;
}
void OverlappingPairCache::CleanProxyFromPairs(BroadphaseProxy* proxy)
{
for (int i=0;i<m_NumOverlapBroadphasePair;i++)
{
BroadphasePair& pair = m_OverlappingPairs[i];
if (pair.m_pProxy0 == proxy ||
pair.m_pProxy1 == proxy)
{
CleanOverlappingPair(pair);
}
}
}
void OverlappingPairCache::RemoveOverlappingPairsContainingProxy(BroadphaseProxy* proxy)
{
int i;
for ( i=m_NumOverlapBroadphasePair-1;i>=0;i--)
{
BroadphasePair& pair = m_OverlappingPairs[i];
if (pair.m_pProxy0 == proxy ||
pair.m_pProxy1 == proxy)
{
RemoveOverlappingPair(pair);
}
}
}
void OverlappingPairCache::DispatchAllCollisionPairs(Dispatcher& dispatcher,DispatcherInfo& dispatchInfo)
{
m_blockedForChanges = true;
int i;
int dispatcherId = dispatcher.GetUniqueId();
RefreshOverlappingPairs();
for (i=0;i<m_NumOverlapBroadphasePair;i++)
{
BroadphasePair& pair = m_OverlappingPairs[i];
if (dispatcherId>= 0)
{
//dispatcher will keep algorithms persistent in the collision pair
if (!pair.m_algorithms[dispatcherId])
{
pair.m_algorithms[dispatcherId] = dispatcher.FindAlgorithm(
*pair.m_pProxy0,
*pair.m_pProxy1);
}
if (pair.m_algorithms[dispatcherId])
{
if (dispatchInfo.m_dispatchFunc == DispatcherInfo::DISPATCH_DISCRETE)
{
pair.m_algorithms[dispatcherId]->ProcessCollision(pair.m_pProxy0,pair.m_pProxy1,dispatchInfo);
} else
{
float toi = pair.m_algorithms[dispatcherId]->CalculateTimeOfImpact(pair.m_pProxy0,pair.m_pProxy1,dispatchInfo);
if (dispatchInfo.m_timeOfImpact > toi)
dispatchInfo.m_timeOfImpact = toi;
}
}
} else
{
//non-persistent algorithm dispatcher
CollisionAlgorithm* algo = dispatcher.FindAlgorithm(
*pair.m_pProxy0,
*pair.m_pProxy1);
if (algo)
{
if (dispatchInfo.m_dispatchFunc == DispatcherInfo::DISPATCH_DISCRETE)
{
algo->ProcessCollision(pair.m_pProxy0,pair.m_pProxy1,dispatchInfo);
} else
{
float toi = algo->CalculateTimeOfImpact(pair.m_pProxy0,pair.m_pProxy1,dispatchInfo);
if (dispatchInfo.m_timeOfImpact > toi)
dispatchInfo.m_timeOfImpact = toi;
}
}
}
}
m_blockedForChanges = false;
}

View File

@@ -0,0 +1,85 @@
/*
Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
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.
*/
#ifndef OVERLAPPING_PAIR_CACHE_H
#define OVERLAPPING_PAIR_CACHE_H
#include "BroadphaseInterface.h"
#include "BroadphaseProxy.h"
#include "SimdPoint3.h"
///OverlappingPairCache maintains the objects with overlapping AABB
///Typically managed by the Broadphase, Axis3Sweep or SimpleBroadphase
class OverlappingPairCache : public BroadphaseInterface
{
BroadphasePair* m_OverlappingPairs;
int m_NumOverlapBroadphasePair;
int m_maxOverlap;
//during the dispatch, check that user doesn't destroy/create proxy
bool m_blockedForChanges;
public:
OverlappingPairCache(int maxOverlap);
virtual ~OverlappingPairCache();
int GetNumOverlappingPairs() const
{
return m_NumOverlapBroadphasePair;
}
BroadphasePair& GetOverlappingPair(int index)
{
return m_OverlappingPairs[index];
}
void RemoveOverlappingPair(BroadphasePair& pair);
void CleanOverlappingPair(BroadphasePair& pair);
void AddOverlappingPair(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1);
BroadphasePair* FindPair(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1);
void CleanProxyFromPairs(BroadphaseProxy* proxy);
void RemoveOverlappingPairsContainingProxy(BroadphaseProxy* proxy);
inline bool NeedsCollision(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1) const
{
bool collides = proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask;
collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask);
return collides;
}
void DispatchAllCollisionPairs(Dispatcher& dispatcher,DispatcherInfo& dispatchInfo);
virtual void RefreshOverlappingPairs() =0;
};
#endif //OVERLAPPING_PAIR_CACHE_H

View File

@@ -36,19 +36,16 @@ void SimpleBroadphase::validate()
} }
SimpleBroadphase::SimpleBroadphase(int maxProxies,int maxOverlap) SimpleBroadphase::SimpleBroadphase(int maxProxies,int maxOverlap)
:m_firstFreeProxy(0), :OverlappingPairCache(maxOverlap),
m_firstFreeProxy(0),
m_numProxies(0), m_numProxies(0),
m_blockedForChanges(false), m_maxProxies(maxProxies)
m_NumOverlapBroadphasePair(0),
m_maxProxies(maxProxies),
m_maxOverlap(maxOverlap)
{ {
m_proxies = new SimpleBroadphaseProxy[maxProxies]; m_proxies = new SimpleBroadphaseProxy[maxProxies];
m_freeProxies = new int[maxProxies]; m_freeProxies = new int[maxProxies];
m_pProxies = new SimpleBroadphaseProxy*[maxProxies]; m_pProxies = new SimpleBroadphaseProxy*[maxProxies];
m_OverlappingPairs = new BroadphasePair[maxOverlap];
int i; int i;
for (i=0;i<m_maxProxies;i++) for (i=0;i<m_maxProxies;i++)
@@ -62,7 +59,6 @@ SimpleBroadphase::~SimpleBroadphase()
delete[] m_proxies; delete[] m_proxies;
delete []m_freeProxies; delete []m_freeProxies;
delete [] m_pProxies; delete [] m_pProxies;
delete [] m_OverlappingPairs;
/*int i; /*int i;
for (i=m_numProxies-1;i>=0;i--) for (i=m_numProxies-1;i>=0;i--)
@@ -99,19 +95,7 @@ BroadphaseProxy* SimpleBroadphase::CreateProxy( const SimdVector3& min, const
return proxy; return proxy;
} }
void SimpleBroadphase::RemoveOverlappingPairsContainingProxy(BroadphaseProxy* proxy)
{
int i;
for ( i=m_NumOverlapBroadphasePair-1;i>=0;i--)
{
BroadphasePair& pair = m_OverlappingPairs[i];
if (pair.m_pProxy0 == proxy ||
pair.m_pProxy1 == proxy)
{
RemoveOverlappingPair(pair);
}
}
}
void SimpleBroadphase::DestroyProxy(BroadphaseProxy* proxyOrg) void SimpleBroadphase::DestroyProxy(BroadphaseProxy* proxyOrg)
{ {
@@ -148,93 +132,13 @@ void SimpleBroadphase::SetAabb(BroadphaseProxy* proxy,const SimdVector3& aabbMin
sbp->m_max = aabbMax; sbp->m_max = aabbMax;
} }
void SimpleBroadphase::CleanOverlappingPair(BroadphasePair& pair)
{
for (int dispatcherId=0;dispatcherId<SIMPLE_MAX_ALGORITHMS;dispatcherId++)
{
if (pair.m_algorithms[dispatcherId])
{
{
delete pair.m_algorithms[dispatcherId];
pair.m_algorithms[dispatcherId]=0;
}
}
}
}
void SimpleBroadphase::CleanProxyFromPairs(BroadphaseProxy* proxy)
{
for (int i=0;i<m_NumOverlapBroadphasePair;i++)
{
BroadphasePair& pair = m_OverlappingPairs[i];
if (pair.m_pProxy0 == proxy ||
pair.m_pProxy1 == proxy)
{
CleanOverlappingPair(pair);
}
}
}
void SimpleBroadphase::AddOverlappingPair(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1)
{
//don't add overlap with own
assert(proxy0 != proxy1);
if (!NeedsCollision(proxy0,proxy1))
return;
BroadphasePair pair(*proxy0,*proxy1);
m_OverlappingPairs[m_NumOverlapBroadphasePair] = pair;
int i;
for (i=0;i<SIMPLE_MAX_ALGORITHMS;i++)
{
assert(!m_OverlappingPairs[m_NumOverlapBroadphasePair].m_algorithms[i]);
m_OverlappingPairs[m_NumOverlapBroadphasePair].m_algorithms[i] = 0;
}
if (m_NumOverlapBroadphasePair >= m_maxOverlap)
{
//printf("Error: too many overlapping objects: m_NumOverlapBroadphasePair: %d\n",m_NumOverlapBroadphasePair);
#ifdef DEBUG
assert(0);
#endif
} else
{
m_NumOverlapBroadphasePair++;
}
}
BroadphasePair* SimpleBroadphase::FindPair(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1)
{
BroadphasePair* foundPair = 0;
int i;
for (i=m_NumOverlapBroadphasePair-1;i>=0;i--)
{
BroadphasePair& pair = m_OverlappingPairs[i];
if (((pair.m_pProxy0 == proxy0) && (pair.m_pProxy1 == proxy1)) ||
((pair.m_pProxy0 == proxy1) && (pair.m_pProxy1 == proxy0)))
{
foundPair = &pair;
return foundPair;
}
}
return foundPair;
}
void SimpleBroadphase::RemoveOverlappingPair(BroadphasePair& pair)
{
CleanOverlappingPair(pair);
int index = &pair - &m_OverlappingPairs[0];
//remove efficiently, swap with the last
m_OverlappingPairs[index] = m_OverlappingPairs[m_NumOverlapBroadphasePair-1];
m_NumOverlapBroadphasePair--;
}
bool SimpleBroadphase::AabbOverlap(SimpleBroadphaseProxy* proxy0,SimpleBroadphaseProxy* proxy1) bool SimpleBroadphase::AabbOverlap(SimpleBroadphaseProxy* proxy0,SimpleBroadphaseProxy* proxy1)
{ {
@@ -269,9 +173,10 @@ void SimpleBroadphase::RefreshOverlappingPairs()
} }
//then remove non-overlapping ones //then remove non-overlapping ones
for (i=0;i<m_NumOverlapBroadphasePair;i++) for (i=0;i<GetNumOverlappingPairs();i++)
{ {
BroadphasePair& pair = m_OverlappingPairs[i]; BroadphasePair& pair = GetOverlappingPair(i);
SimpleBroadphaseProxy* proxy0 = GetSimpleProxyFromProxy(pair.m_pProxy0); SimpleBroadphaseProxy* proxy0 = GetSimpleProxyFromProxy(pair.m_pProxy0);
SimpleBroadphaseProxy* proxy1 = GetSimpleProxyFromProxy(pair.m_pProxy1); SimpleBroadphaseProxy* proxy1 = GetSimpleProxyFromProxy(pair.m_pProxy1);
if (!AabbOverlap(proxy0,proxy1)) if (!AabbOverlap(proxy0,proxy1))
@@ -284,69 +189,4 @@ void SimpleBroadphase::RefreshOverlappingPairs()
} }
void SimpleBroadphase::DispatchAllCollisionPairs(Dispatcher& dispatcher,DispatcherInfo& dispatchInfo)
{
m_blockedForChanges = true;
int i;
int dispatcherId = dispatcher.GetUniqueId();
RefreshOverlappingPairs();
for (i=0;i<m_NumOverlapBroadphasePair;i++)
{
BroadphasePair& pair = m_OverlappingPairs[i];
if (dispatcherId>= 0)
{
//dispatcher will keep algorithms persistent in the collision pair
if (!pair.m_algorithms[dispatcherId])
{
pair.m_algorithms[dispatcherId] = dispatcher.FindAlgorithm(
*pair.m_pProxy0,
*pair.m_pProxy1);
}
if (pair.m_algorithms[dispatcherId])
{
if (dispatchInfo.m_dispatchFunc == DispatcherInfo::DISPATCH_DISCRETE)
{
pair.m_algorithms[dispatcherId]->ProcessCollision(pair.m_pProxy0,pair.m_pProxy1,dispatchInfo);
} else
{
float toi = pair.m_algorithms[dispatcherId]->CalculateTimeOfImpact(pair.m_pProxy0,pair.m_pProxy1,dispatchInfo);
if (dispatchInfo.m_timeOfImpact > toi)
dispatchInfo.m_timeOfImpact = toi;
}
}
} else
{
//non-persistent algorithm dispatcher
CollisionAlgorithm* algo = dispatcher.FindAlgorithm(
*pair.m_pProxy0,
*pair.m_pProxy1);
if (algo)
{
if (dispatchInfo.m_dispatchFunc == DispatcherInfo::DISPATCH_DISCRETE)
{
algo->ProcessCollision(pair.m_pProxy0,pair.m_pProxy1,dispatchInfo);
} else
{
float toi = algo->CalculateTimeOfImpact(pair.m_pProxy0,pair.m_pProxy1,dispatchInfo);
if (dispatchInfo.m_timeOfImpact > toi)
dispatchInfo.m_timeOfImpact = toi;
}
}
}
}
m_blockedForChanges = false;
}

View File

@@ -16,12 +16,9 @@ subject to the following restrictions:
#ifndef SIMPLE_BROADPHASE_H #ifndef SIMPLE_BROADPHASE_H
#define SIMPLE_BROADPHASE_H #define SIMPLE_BROADPHASE_H
//#define SIMPLE_MAX_PROXIES 8192
//#define SIMPLE_MAX_OVERLAP 4096
#include "BroadphaseInterface.h" #include "OverlappingPairCache.h"
#include "BroadphaseProxy.h"
#include "SimdPoint3.h"
struct SimpleBroadphaseProxy : public BroadphaseProxy struct SimpleBroadphaseProxy : public BroadphaseProxy
{ {
@@ -40,7 +37,7 @@ struct SimpleBroadphaseProxy : public BroadphaseProxy
}; };
///SimpleBroadphase is a brute force aabb culling broadphase based on O(n^2) aabb checks ///SimpleBroadphase is a brute force aabb culling broadphase based on O(n^2) aabb checks
class SimpleBroadphase : public BroadphaseInterface class SimpleBroadphase : public OverlappingPairCache
{ {
SimpleBroadphaseProxy* m_proxies; SimpleBroadphaseProxy* m_proxies;
@@ -50,14 +47,10 @@ class SimpleBroadphase : public BroadphaseInterface
SimpleBroadphaseProxy** m_pProxies; SimpleBroadphaseProxy** m_pProxies;
int m_numProxies; int m_numProxies;
//during the dispatch, check that user doesn't destroy/create proxy
bool m_blockedForChanges;
BroadphasePair* m_OverlappingPairs;
int m_NumOverlapBroadphasePair;
int m_maxProxies; int m_maxProxies;
int m_maxOverlap;
inline SimpleBroadphaseProxy* GetSimpleProxyFromProxy(BroadphaseProxy* proxy) inline SimpleBroadphaseProxy* GetSimpleProxyFromProxy(BroadphaseProxy* proxy)
{ {
@@ -70,13 +63,8 @@ class SimpleBroadphase : public BroadphaseInterface
void validate(); void validate();
protected: protected:
void RemoveOverlappingPair(BroadphasePair& pair);
void CleanOverlappingPair(BroadphasePair& pair);
void RemoveOverlappingPairsContainingProxy(BroadphaseProxy* proxy);
void AddOverlappingPair(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1);
BroadphasePair* FindPair(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1);
virtual void RefreshOverlappingPairs(); virtual void RefreshOverlappingPairs();
public: public:
SimpleBroadphase(int maxProxies=4096,int maxOverlap=8192); SimpleBroadphase(int maxProxies=4096,int maxOverlap=8192);
@@ -88,17 +76,10 @@ public:
virtual void DestroyProxy(BroadphaseProxy* proxy); virtual void DestroyProxy(BroadphaseProxy* proxy);
virtual void SetAabb(BroadphaseProxy* proxy,const SimdVector3& aabbMin,const SimdVector3& aabbMax); virtual void SetAabb(BroadphaseProxy* proxy,const SimdVector3& aabbMin,const SimdVector3& aabbMax);
virtual void CleanProxyFromPairs(BroadphaseProxy* proxy);
virtual void DispatchAllCollisionPairs(Dispatcher& dispatcher,DispatcherInfo& dispatchInfo);
inline bool NeedsCollision(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1) const
{
bool collides = proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask;
collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask);
return collides;
}
}; };

View File

@@ -79,7 +79,9 @@ CollisionDispatcher::CollisionDispatcher ():
PersistentManifold* CollisionDispatcher::GetNewManifold(void* b0,void* b1) PersistentManifold* CollisionDispatcher::GetNewManifold(void* b0,void* b1)
{ {
gNumManifold++; gNumManifold++;
//printf("GetNewManifoldResult: gNumManifold %d\n",gNumManifold);
//ASSERT(gNumManifold < 65535);
CollisionObject* body0 = (CollisionObject*)b0; CollisionObject* body0 = (CollisionObject*)b0;
CollisionObject* body1 = (CollisionObject*)b1; CollisionObject* body1 = (CollisionObject*)b1;

View File

@@ -14,7 +14,7 @@ subject to the following restrictions:
*/ */
#include "SimpleConstraintSolver.h" #include "SequentialImpulseConstraintSolver.h"
#include "NarrowPhaseCollision/PersistentManifold.h" #include "NarrowPhaseCollision/PersistentManifold.h"
#include "Dynamics/RigidBody.h" #include "Dynamics/RigidBody.h"
#include "ContactConstraint.h" #include "ContactConstraint.h"
@@ -45,14 +45,14 @@ bool MyContactDestroyedCallback(void* userPersistentData)
} }
SimpleConstraintSolver::SimpleConstraintSolver() SequentialImpulseConstraintSolver::SequentialImpulseConstraintSolver()
{ {
gContactCallback = &MyContactDestroyedCallback; gContactCallback = &MyContactDestroyedCallback;
} }
/// SimpleConstraintSolver Sequentially applies impulses /// SequentialImpulseConstraintSolver Sequentially applies impulses
float SimpleConstraintSolver::SolveGroup(PersistentManifold** manifoldPtr, int numManifolds,const ContactSolverInfo& infoGlobal,IDebugDraw* debugDrawer) float SequentialImpulseConstraintSolver::SolveGroup(PersistentManifold** manifoldPtr, int numManifolds,const ContactSolverInfo& infoGlobal,IDebugDraw* debugDrawer)
{ {
ContactSolverInfo info = infoGlobal; ContactSolverInfo info = infoGlobal;
@@ -113,7 +113,7 @@ SimdScalar restitutionCurve(SimdScalar rel_vel, SimdScalar restitution)
float SimpleConstraintSolver::Solve(PersistentManifold* manifoldPtr, const ContactSolverInfo& info,int iter,IDebugDraw* debugDrawer) float SequentialImpulseConstraintSolver::Solve(PersistentManifold* manifoldPtr, const ContactSolverInfo& info,int iter,IDebugDraw* debugDrawer)
{ {
RigidBody* body0 = (RigidBody*)manifoldPtr->GetBody0(); RigidBody* body0 = (RigidBody*)manifoldPtr->GetBody0();
@@ -294,7 +294,7 @@ float SimpleConstraintSolver::Solve(PersistentManifold* manifoldPtr, const Conta
return maxImpulse; return maxImpulse;
} }
float SimpleConstraintSolver::SolveFriction(PersistentManifold* manifoldPtr, const ContactSolverInfo& info,int iter,IDebugDraw* debugDrawer) float SequentialImpulseConstraintSolver::SolveFriction(PersistentManifold* manifoldPtr, const ContactSolverInfo& info,int iter,IDebugDraw* debugDrawer)
{ {
RigidBody* body0 = (RigidBody*)manifoldPtr->GetBody0(); RigidBody* body0 = (RigidBody*)manifoldPtr->GetBody0();
RigidBody* body1 = (RigidBody*)manifoldPtr->GetBody1(); RigidBody* body1 = (RigidBody*)manifoldPtr->GetBody1();

View File

@@ -13,17 +13,17 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef SIMPLE_CONSTRAINT_SOLVER_H #ifndef SEQUENTIAL_IMPULSE_CONSTRAINT_SOLVER_H
#define SIMPLE_CONSTRAINT_SOLVER_H #define SEQUENTIAL_IMPULSE_CONSTRAINT_SOLVER_H
#include "ConstraintSolver.h" #include "ConstraintSolver.h"
class IDebugDraw; class IDebugDraw;
/// SimpleConstraintSolver uses a Propagation Method and Sequentially applies impulses /// SequentialImpulseConstraintSolver uses a Propagation Method and Sequentially applies impulses
/// The approach is the 3D version of Erin Catto's GDC 2006 tutorial. See http://www.gphysics.com /// The approach is the 3D version of Erin Catto's GDC 2006 tutorial. See http://www.gphysics.com
/// Although Sequential Impulse is more intuitive, it is mathematically equivalent to Projected Successive Overrelaxation (iterative LCP) /// Although Sequential Impulse is more intuitive, it is mathematically equivalent to Projected Successive Overrelaxation (iterative LCP)
/// Applies impulses for combined restitution and penetration recovery and to simulate friction /// Applies impulses for combined restitution and penetration recovery and to simulate friction
class SimpleConstraintSolver : public ConstraintSolver class SequentialImpulseConstraintSolver : public ConstraintSolver
{ {
float Solve(PersistentManifold* manifold, const ContactSolverInfo& info,int iter,IDebugDraw* debugDrawer); float Solve(PersistentManifold* manifold, const ContactSolverInfo& info,int iter,IDebugDraw* debugDrawer);
float SolveFriction(PersistentManifold* manifoldPtr, const ContactSolverInfo& info,int iter,IDebugDraw* debugDrawer); float SolveFriction(PersistentManifold* manifoldPtr, const ContactSolverInfo& info,int iter,IDebugDraw* debugDrawer);
@@ -31,13 +31,13 @@ class SimpleConstraintSolver : public ConstraintSolver
public: public:
SimpleConstraintSolver(); SequentialImpulseConstraintSolver();
virtual ~SimpleConstraintSolver() {} virtual ~SequentialImpulseConstraintSolver() {}
virtual float SolveGroup(PersistentManifold** manifold,int numManifolds,const ContactSolverInfo& info, IDebugDraw* debugDrawer=0); virtual float SolveGroup(PersistentManifold** manifold,int numManifolds,const ContactSolverInfo& info, IDebugDraw* debugDrawer=0);
}; };
#endif //SIMPLE_CONSTRAINT_SOLVER_H #endif //SEQUENTIAL_IMPULSE_CONSTRAINT_SOLVER_H

View File

@@ -31,7 +31,6 @@ typedef SimdScalar dMatrix3[4*3];
extern float gLinearAirDamping; extern float gLinearAirDamping;
extern bool gUseEpa; extern bool gUseEpa;
#define MAX_RIGIDBODIES 8192
/// RigidBody class for RigidBody Dynamics /// RigidBody class for RigidBody Dynamics

View File

@@ -69,14 +69,17 @@ extern float eye[3];
extern int glutScreenWidth; extern int glutScreenWidth;
extern int glutScreenHeight; extern int glutScreenHeight;
const int maxProxies = 32766;
const int maxOverlap = 65535;
#ifdef _DEBUG #ifdef _DEBUG
const int numObjects = 22; const int numObjects = 5000;
#else #else
const int numObjects = 120; const int numObjects = 2000;
#endif #endif
const int maxNumObjects = 450; const int maxNumObjects = 32760;
MyMotionState ms[maxNumObjects]; MyMotionState ms[maxNumObjects];
CcdPhysicsController* physObjects[maxNumObjects] = {0,0,0,0}; CcdPhysicsController* physObjects[maxNumObjects] = {0,0,0,0};
@@ -127,11 +130,11 @@ int main(int argc,char** argv)
CollisionDispatcher* dispatcher = new CollisionDispatcher(); CollisionDispatcher* dispatcher = new CollisionDispatcher();
SimdVector3 worldAabbMin(-10000,-10000,-10000); SimdVector3 worldAabbMin(-30000,-30000,-30000);
SimdVector3 worldAabbMax(10000,10000,10000); SimdVector3 worldAabbMax(30000,30000,30000);
BroadphaseInterface* broadphase = new AxisSweep3(worldAabbMin,worldAabbMax); //BroadphaseInterface* broadphase = new AxisSweep3(worldAabbMin,worldAabbMax,maxProxies,maxOverlap);
//BroadphaseInterface* broadphase = new SimpleBroadphase(); BroadphaseInterface* broadphase = new SimpleBroadphase(maxProxies,maxOverlap);
physicsEnvironmentPtr = new CcdPhysicsEnvironment(dispatcher,broadphase); physicsEnvironmentPtr = new CcdPhysicsEnvironment(dispatcher,broadphase);
physicsEnvironmentPtr->setDeactivationTime(2.f); physicsEnvironmentPtr->setDeactivationTime(2.f);

View File

@@ -22,8 +22,8 @@ subject to the following restrictions:
#include "Dynamics/RigidBody.h" #include "Dynamics/RigidBody.h"
#include "BroadphaseCollision/AxisSweep3.h" #include "BroadphaseCollision/AxisSweep3.h"
#include "ConstraintSolver/SimpleConstraintSolver.h" #include "ConstraintSolver/SequentialImpulseConstraintSolver.h"
#include "ConstraintSolver/OdeConstraintSolver.h" //#include "ConstraintSolver/OdeConstraintSolver.h"
#include "CollisionDispatch/CollisionDispatcher.h" #include "CollisionDispatch/CollisionDispatcher.h"
#include "BroadphaseCollision/SimpleBroadphase.h" #include "BroadphaseCollision/SimpleBroadphase.h"
#include "CollisionShapes/TriangleMeshShape.h" #include "CollisionShapes/TriangleMeshShape.h"
@@ -216,8 +216,8 @@ int main(int argc,char** argv)
// GLDebugDrawer debugDrawer; // GLDebugDrawer debugDrawer;
//ConstraintSolver* solver = new SimpleConstraintSolver; ConstraintSolver* solver = new SequentialImpulseConstraintSolver;
ConstraintSolver* solver = new OdeConstraintSolver; //ConstraintSolver* solver = new OdeConstraintSolver;
CollisionDispatcher* dispatcher = new CollisionDispatcher(); CollisionDispatcher* dispatcher = new CollisionDispatcher();

View File

@@ -22,8 +22,8 @@ subject to the following restrictions:
#include "CollisionShapes/EmptyShape.h" #include "CollisionShapes/EmptyShape.h"
#include "Dynamics/RigidBody.h" #include "Dynamics/RigidBody.h"
#include "ConstraintSolver/SimpleConstraintSolver.h" #include "ConstraintSolver/SequentialImpulseConstraintSolver.h"
#include "ConstraintSolver/OdeConstraintSolver.h" //#include "ConstraintSolver/OdeConstraintSolver.h"
#include "CollisionDispatch/CollisionDispatcher.h" #include "CollisionDispatch/CollisionDispatcher.h"
#include "BroadphaseCollision/SimpleBroadphase.h" #include "BroadphaseCollision/SimpleBroadphase.h"
#include "IDebugDraw.h" #include "IDebugDraw.h"
@@ -72,7 +72,7 @@ int main(int argc,char** argv)
{ {
ConstraintSolver* solver = new SimpleConstraintSolver; ConstraintSolver* solver = new SequentialImpulseConstraintSolver;
//ConstraintSolver* solver = new OdeConstraintSolver; //ConstraintSolver* solver = new OdeConstraintSolver;
CollisionDispatcher* dispatcher = new CollisionDispatcher(); CollisionDispatcher* dispatcher = new CollisionDispatcher();

View File

@@ -48,9 +48,11 @@ subject to the following restrictions:
#include "NarrowPhaseCollision/Epa.h" #include "NarrowPhaseCollision/Epa.h"
#include "NarrowPhaseCollision/ConvexPenetrationDepthSolver.h" #include "NarrowPhaseCollision/ConvexPenetrationDepthSolver.h"
#include "NarrowPhaseCollision/EpaPenetrationDepthSolver.h" #include "NarrowPhaseCollision/EpaPenetrationDepthSolver.h"
EpaPenetrationDepthSolver epaPenDepthSolver;
SimplexSolverInterface simplexSolver; SimplexSolverInterface simplexSolver;
EpaPenetrationDepthSolver epaPenDepthSolver;
int screenWidth = 640.f; int screenWidth = 640.f;
int screenHeight = 480.f; int screenHeight = 480.f;

View File

@@ -29,7 +29,10 @@
#include "NarrowPhaseCollision/GjkConvexCast.h" #include "NarrowPhaseCollision/GjkConvexCast.h"
#include "NarrowPhaseCollision/ContinuousConvexCollision.h" #include "NarrowPhaseCollision/ContinuousConvexCollision.h"
#include "NarrowPhaseCollision/SubSimplexConvexCast.h" #include "NarrowPhaseCollision/SubSimplexConvexCast.h"
#ifdef USE_ALGEBRAIC_CCD
#include "NarrowPhaseCollision/BU_CollisionPair.h" #include "NarrowPhaseCollision/BU_CollisionPair.h"
#endif //USE_ALGEBRAIC_CCD
#include "CollisionShapes/SphereShape.h" #include "CollisionShapes/SphereShape.h"
@@ -191,7 +194,7 @@ void clientDisplay(void) {
GjkConvexCast convexCaster1(shapePtr[0],shapePtr[i],&gGjkSimplexSolver); GjkConvexCast convexCaster1(shapePtr[0],shapePtr[i],&gGjkSimplexSolver);
//BU_CollisionPair (algebraic version) is currently broken, will look into this //BU_CollisionPair (algebraic version) is currently broken, will look into this
BU_CollisionPair convexCaster2(shapePtr[0],shapePtr[i]); //BU_CollisionPair convexCaster2(shapePtr[0],shapePtr[i]);
SubsimplexConvexCast convexCaster3(shapePtr[0],shapePtr[i],&gGjkSimplexSolver); SubsimplexConvexCast convexCaster3(shapePtr[0],shapePtr[i],&gGjkSimplexSolver);
gGjkSimplexSolver.reset(); gGjkSimplexSolver.reset();

View File

@@ -30,8 +30,9 @@ Very basic raytracer, rendering into a texture.
#include "NarrowPhaseCollision/SubSimplexConvexCast.h" #include "NarrowPhaseCollision/SubSimplexConvexCast.h"
#include "NarrowPhaseCollision/GjkConvexCast.h" #include "NarrowPhaseCollision/GjkConvexCast.h"
#include "NarrowPhaseCollision/ContinuousConvexCollision.h" #include "NarrowPhaseCollision/ContinuousConvexCollision.h"
#ifdef USE_ALGEBRAIC_CCD
#include "NarrowPhaseCollision/BU_CollisionPair.h" #include "NarrowPhaseCollision/BU_CollisionPair.h"
#endif //USE_ALGEBRAIC_CCD
#include "CollisionShapes/SphereShape.h" #include "CollisionShapes/SphereShape.h"

View File

@@ -1,360 +1,360 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#include "BU_AlgebraicPolynomialSolver.h" #include "BU_AlgebraicPolynomialSolver.h"
#include <math.h> #include <math.h>
#include <SimdMinMax.h> #include <SimdMinMax.h>
int BU_AlgebraicPolynomialSolver::Solve2Quadratic(SimdScalar p, SimdScalar q) int BU_AlgebraicPolynomialSolver::Solve2Quadratic(SimdScalar p, SimdScalar q)
{ {
SimdScalar basic_h_local; SimdScalar basic_h_local;
SimdScalar basic_h_local_delta; SimdScalar basic_h_local_delta;
basic_h_local = p * 0.5f; basic_h_local = p * 0.5f;
basic_h_local_delta = basic_h_local * basic_h_local - q; basic_h_local_delta = basic_h_local * basic_h_local - q;
if (basic_h_local_delta > 0.0f) { if (basic_h_local_delta > 0.0f) {
basic_h_local_delta = SimdSqrt(basic_h_local_delta); basic_h_local_delta = SimdSqrt(basic_h_local_delta);
m_roots[0] = - basic_h_local + basic_h_local_delta; m_roots[0] = - basic_h_local + basic_h_local_delta;
m_roots[1] = - basic_h_local - basic_h_local_delta; m_roots[1] = - basic_h_local - basic_h_local_delta;
return 2; return 2;
} }
else if (SimdGreaterEqual(basic_h_local_delta, SIMD_EPSILON)) { else if (SimdGreaterEqual(basic_h_local_delta, SIMD_EPSILON)) {
m_roots[0] = - basic_h_local; m_roots[0] = - basic_h_local;
return 1; return 1;
} }
else { else {
return 0; return 0;
} }
} }
int BU_AlgebraicPolynomialSolver::Solve2QuadraticFull(SimdScalar a,SimdScalar b, SimdScalar c) int BU_AlgebraicPolynomialSolver::Solve2QuadraticFull(SimdScalar a,SimdScalar b, SimdScalar c)
{ {
SimdScalar radical = b * b - 4.0f * a * c; SimdScalar radical = b * b - 4.0f * a * c;
if(radical >= 0.f) if(radical >= 0.f)
{ {
SimdScalar sqrtRadical = SimdSqrt(radical); SimdScalar sqrtRadical = SimdSqrt(radical);
SimdScalar idenom = 1.0f/(2.0f * a); SimdScalar idenom = 1.0f/(2.0f * a);
m_roots[0]=(-b + sqrtRadical) * idenom; m_roots[0]=(-b + sqrtRadical) * idenom;
m_roots[1]=(-b - sqrtRadical) * idenom; m_roots[1]=(-b - sqrtRadical) * idenom;
return 2; return 2;
} }
return 0; return 0;
} }
#define cubic_rt(x) \ #define cubic_rt(x) \
((x) > 0.0f ? SimdPow((SimdScalar)(x), 0.333333333333333333333333f) : \ ((x) > 0.0f ? SimdPow((SimdScalar)(x), 0.333333333333333333333333f) : \
((x) < 0.0f ? -SimdPow((SimdScalar)-(x), 0.333333333333333333333333f) : 0.0f)) ((x) < 0.0f ? -SimdPow((SimdScalar)-(x), 0.333333333333333333333333f) : 0.0f))
/* */ /* */
/* this function solves the following cubic equation: */ /* this function solves the following cubic equation: */
/* */ /* */
/* 3 2 */ /* 3 2 */
/* lead * x + a * x + b * x + c = 0. */ /* lead * x + a * x + b * x + c = 0. */
/* */ /* */
/* it returns the number of different roots found, and stores the roots in */ /* it returns the number of different roots found, and stores the roots in */
/* roots[0,2]. it returns -1 for a degenerate equation 0 = 0. */ /* roots[0,2]. it returns -1 for a degenerate equation 0 = 0. */
/* */ /* */
int BU_AlgebraicPolynomialSolver::Solve3Cubic(SimdScalar lead, SimdScalar a, SimdScalar b, SimdScalar c) int BU_AlgebraicPolynomialSolver::Solve3Cubic(SimdScalar lead, SimdScalar a, SimdScalar b, SimdScalar c)
{ {
SimdScalar p, q, r; SimdScalar p, q, r;
SimdScalar delta, u, phi; SimdScalar delta, u, phi;
SimdScalar dummy; SimdScalar dummy;
if (lead != 1.0) { if (lead != 1.0) {
/* */ /* */
/* transform into normal form: x^3 + a x^2 + b x + c = 0 */ /* transform into normal form: x^3 + a x^2 + b x + c = 0 */
/* */ /* */
if (SimdEqual(lead, SIMD_EPSILON)) { if (SimdEqual(lead, SIMD_EPSILON)) {
/* */ /* */
/* we have a x^2 + b x + c = 0 */ /* we have a x^2 + b x + c = 0 */
/* */ /* */
if (SimdEqual(a, SIMD_EPSILON)) { if (SimdEqual(a, SIMD_EPSILON)) {
/* */ /* */
/* we have b x + c = 0 */ /* we have b x + c = 0 */
/* */ /* */
if (SimdEqual(b, SIMD_EPSILON)) { if (SimdEqual(b, SIMD_EPSILON)) {
if (SimdEqual(c, SIMD_EPSILON)) { if (SimdEqual(c, SIMD_EPSILON)) {
return -1; return -1;
} }
else { else {
return 0; return 0;
} }
} }
else { else {
m_roots[0] = -c / b; m_roots[0] = -c / b;
return 1; return 1;
} }
} }
else { else {
p = c / a; p = c / a;
q = b / a; q = b / a;
return Solve2QuadraticFull(a,b,c); return Solve2QuadraticFull(a,b,c);
} }
} }
else { else {
a = a / lead; a = a / lead;
b = b / lead; b = b / lead;
c = c / lead; c = c / lead;
} }
} }
/* */ /* */
/* we substitute x = y - a / 3 in order to eliminate the quadric term. */ /* we substitute x = y - a / 3 in order to eliminate the quadric term. */
/* we get x^3 + p x + q = 0 */ /* we get x^3 + p x + q = 0 */
/* */ /* */
a /= 3.0f; a /= 3.0f;
u = a * a; u = a * a;
p = b / 3.0f - u; p = b / 3.0f - u;
q = a * (2.0f * u - b) + c; q = a * (2.0f * u - b) + c;
/* */ /* */
/* now use Cardano's formula */ /* now use Cardano's formula */
/* */ /* */
if (SimdEqual(p, SIMD_EPSILON)) { if (SimdEqual(p, SIMD_EPSILON)) {
if (SimdEqual(q, SIMD_EPSILON)) { if (SimdEqual(q, SIMD_EPSILON)) {
/* */ /* */
/* one triple root */ /* one triple root */
/* */ /* */
m_roots[0] = -a; m_roots[0] = -a;
return 1; return 1;
} }
else { else {
/* */ /* */
/* one real and two complex roots */ /* one real and two complex roots */
/* */ /* */
m_roots[0] = cubic_rt(-q) - a; m_roots[0] = cubic_rt(-q) - a;
return 1; return 1;
} }
} }
q /= 2.0f; q /= 2.0f;
delta = p * p * p + q * q; delta = p * p * p + q * q;
if (delta > 0.0f) { if (delta > 0.0f) {
/* */ /* */
/* one real and two complex roots. note that v = -p / u. */ /* one real and two complex roots. note that v = -p / u. */
/* */ /* */
u = -q + SimdSqrt(delta); u = -q + SimdSqrt(delta);
u = cubic_rt(u); u = cubic_rt(u);
m_roots[0] = u - p / u - a; m_roots[0] = u - p / u - a;
return 1; return 1;
} }
else if (delta < 0.0) { else if (delta < 0.0) {
/* */ /* */
/* Casus irreducibilis: we have three real roots */ /* Casus irreducibilis: we have three real roots */
/* */ /* */
r = SimdSqrt(-p); r = SimdSqrt(-p);
p *= -r; p *= -r;
r *= 2.0; r *= 2.0;
phi = SimdAcos(-q / p) / 3.0f; phi = SimdAcos(-q / p) / 3.0f;
dummy = SIMD_2_PI / 3.0f; dummy = SIMD_2_PI / 3.0f;
m_roots[0] = r * SimdCos(phi) - a; m_roots[0] = r * SimdCos(phi) - a;
m_roots[1] = r * SimdCos(phi + dummy) - a; m_roots[1] = r * SimdCos(phi + dummy) - a;
m_roots[2] = r * SimdCos(phi - dummy) - a; m_roots[2] = r * SimdCos(phi - dummy) - a;
return 3; return 3;
} }
else { else {
/* */ /* */
/* one single and one SimdScalar root */ /* one single and one SimdScalar root */
/* */ /* */
r = cubic_rt(-q); r = cubic_rt(-q);
m_roots[0] = 2.0f * r - a; m_roots[0] = 2.0f * r - a;
m_roots[1] = -r - a; m_roots[1] = -r - a;
return 2; return 2;
} }
} }
/* */ /* */
/* this function solves the following quartic equation: */ /* this function solves the following quartic equation: */
/* */ /* */
/* 4 3 2 */ /* 4 3 2 */
/* lead * x + a * x + b * x + c * x + d = 0. */ /* lead * x + a * x + b * x + c * x + d = 0. */
/* */ /* */
/* it returns the number of different roots found, and stores the roots in */ /* it returns the number of different roots found, and stores the roots in */
/* roots[0,3]. it returns -1 for a degenerate equation 0 = 0. */ /* roots[0,3]. it returns -1 for a degenerate equation 0 = 0. */
/* */ /* */
int BU_AlgebraicPolynomialSolver::Solve4Quartic(SimdScalar lead, SimdScalar a, SimdScalar b, SimdScalar c, SimdScalar d) int BU_AlgebraicPolynomialSolver::Solve4Quartic(SimdScalar lead, SimdScalar a, SimdScalar b, SimdScalar c, SimdScalar d)
{ {
SimdScalar p, q ,r; SimdScalar p, q ,r;
SimdScalar u, v, w; SimdScalar u, v, w;
int i, num_roots, num_tmp; int i, num_roots, num_tmp;
//SimdScalar tmp[2]; //SimdScalar tmp[2];
if (lead != 1.0) { if (lead != 1.0) {
/* */ /* */
/* transform into normal form: x^4 + a x^3 + b x^2 + c x + d = 0 */ /* transform into normal form: x^4 + a x^3 + b x^2 + c x + d = 0 */
/* */ /* */
if (SimdEqual(lead, SIMD_EPSILON)) { if (SimdEqual(lead, SIMD_EPSILON)) {
/* */ /* */
/* we have a x^3 + b x^2 + c x + d = 0 */ /* we have a x^3 + b x^2 + c x + d = 0 */
/* */ /* */
if (SimdEqual(a, SIMD_EPSILON)) { if (SimdEqual(a, SIMD_EPSILON)) {
/* */ /* */
/* we have b x^2 + c x + d = 0 */ /* we have b x^2 + c x + d = 0 */
/* */ /* */
if (SimdEqual(b, SIMD_EPSILON)) { if (SimdEqual(b, SIMD_EPSILON)) {
/* */ /* */
/* we have c x + d = 0 */ /* we have c x + d = 0 */
/* */ /* */
if (SimdEqual(c, SIMD_EPSILON)) { if (SimdEqual(c, SIMD_EPSILON)) {
if (SimdEqual(d, SIMD_EPSILON)) { if (SimdEqual(d, SIMD_EPSILON)) {
return -1; return -1;
} }
else { else {
return 0; return 0;
} }
} }
else { else {
m_roots[0] = -d / c; m_roots[0] = -d / c;
return 1; return 1;
} }
} }
else { else {
p = c / b; p = c / b;
q = d / b; q = d / b;
return Solve2QuadraticFull(b,c,d); return Solve2QuadraticFull(b,c,d);
} }
} }
else { else {
return Solve3Cubic(1.0, b / a, c / a, d / a); return Solve3Cubic(1.0, b / a, c / a, d / a);
} }
} }
else { else {
a = a / lead; a = a / lead;
b = b / lead; b = b / lead;
c = c / lead; c = c / lead;
d = d / lead; d = d / lead;
} }
} }
/* */ /* */
/* we substitute x = y - a / 4 in order to eliminate the cubic term. */ /* we substitute x = y - a / 4 in order to eliminate the cubic term. */
/* we get: y^4 + p y^2 + q y + r = 0. */ /* we get: y^4 + p y^2 + q y + r = 0. */
/* */ /* */
a /= 4.0f; a /= 4.0f;
p = b - 6.0f * a * a; p = b - 6.0f * a * a;
q = a * (8.0f * a * a - 2.0f * b) + c; q = a * (8.0f * a * a - 2.0f * b) + c;
r = a * (a * (b - 3.f * a * a) - c) + d; r = a * (a * (b - 3.f * a * a) - c) + d;
if (SimdEqual(q, SIMD_EPSILON)) { if (SimdEqual(q, SIMD_EPSILON)) {
/* */ /* */
/* biquadratic equation: y^4 + p y^2 + r = 0. */ /* biquadratic equation: y^4 + p y^2 + r = 0. */
/* */ /* */
num_roots = Solve2Quadratic(p, r); num_roots = Solve2Quadratic(p, r);
if (num_roots > 0) { if (num_roots > 0) {
if (m_roots[0] > 0.0f) { if (m_roots[0] > 0.0f) {
if (num_roots > 1) { if (num_roots > 1) {
if ((m_roots[1] > 0.0f) && (m_roots[1] != m_roots[0])) { if ((m_roots[1] > 0.0f) && (m_roots[1] != m_roots[0])) {
u = SimdSqrt(m_roots[1]); u = SimdSqrt(m_roots[1]);
m_roots[2] = u - a; m_roots[2] = u - a;
m_roots[3] = -u - a; m_roots[3] = -u - a;
u = SimdSqrt(m_roots[0]); u = SimdSqrt(m_roots[0]);
m_roots[0] = u - a; m_roots[0] = u - a;
m_roots[1] = -u - a; m_roots[1] = -u - a;
return 4; return 4;
} }
else { else {
u = SimdSqrt(m_roots[0]); u = SimdSqrt(m_roots[0]);
m_roots[0] = u - a; m_roots[0] = u - a;
m_roots[1] = -u - a; m_roots[1] = -u - a;
return 2; return 2;
} }
} }
else { else {
u = SimdSqrt(m_roots[0]); u = SimdSqrt(m_roots[0]);
m_roots[0] = u - a; m_roots[0] = u - a;
m_roots[1] = -u - a; m_roots[1] = -u - a;
return 2; return 2;
} }
} }
} }
return 0; return 0;
} }
else if (SimdEqual(r, SIMD_EPSILON)) { else if (SimdEqual(r, SIMD_EPSILON)) {
/* */ /* */
/* no absolute term: y (y^3 + p y + q) = 0. */ /* no absolute term: y (y^3 + p y + q) = 0. */
/* */ /* */
num_roots = Solve3Cubic(1.0, 0.0, p, q); num_roots = Solve3Cubic(1.0, 0.0, p, q);
for (i = 0; i < num_roots; ++i) m_roots[i] -= a; for (i = 0; i < num_roots; ++i) m_roots[i] -= a;
if (num_roots != -1) { if (num_roots != -1) {
m_roots[num_roots] = -a; m_roots[num_roots] = -a;
++num_roots; ++num_roots;
} }
else { else {
m_roots[0] = -a; m_roots[0] = -a;
num_roots = 1;; num_roots = 1;;
} }
return num_roots; return num_roots;
} }
else { else {
/* */ /* */
/* we solve the resolvent cubic equation */ /* we solve the resolvent cubic equation */
/* */ /* */
num_roots = Solve3Cubic(1.0f, -0.5f * p, -r, 0.5f * r * p - 0.125f * q * q); num_roots = Solve3Cubic(1.0f, -0.5f * p, -r, 0.5f * r * p - 0.125f * q * q);
if (num_roots == -1) { if (num_roots == -1) {
num_roots = 1; num_roots = 1;
m_roots[0] = 0.0f; m_roots[0] = 0.0f;
} }
/* */ /* */
/* build two quadric equations */ /* build two quadric equations */
/* */ /* */
w = m_roots[0]; w = m_roots[0];
u = w * w - r; u = w * w - r;
v = 2.0f * w - p; v = 2.0f * w - p;
if (SimdEqual(u, SIMD_EPSILON)) if (SimdEqual(u, SIMD_EPSILON))
u = 0.0; u = 0.0;
else if (u > 0.0f) else if (u > 0.0f)
u = SimdSqrt(u); u = SimdSqrt(u);
else else
return 0; return 0;
if (SimdEqual(v, SIMD_EPSILON)) if (SimdEqual(v, SIMD_EPSILON))
v = 0.0; v = 0.0;
else if (v > 0.0f) else if (v > 0.0f)
v = SimdSqrt(v); v = SimdSqrt(v);
else else
return 0; return 0;
if (q < 0.0f) v = -v; if (q < 0.0f) v = -v;
w -= u; w -= u;
num_roots=Solve2Quadratic(v, w); num_roots=Solve2Quadratic(v, w);
for (i = 0; i < num_roots; ++i) for (i = 0; i < num_roots; ++i)
{ {
m_roots[i] -= a; m_roots[i] -= a;
} }
w += 2.0f *u; w += 2.0f *u;
SimdScalar tmp[2]; SimdScalar tmp[2];
tmp[0] = m_roots[0]; tmp[0] = m_roots[0];
tmp[1] = m_roots[1]; tmp[1] = m_roots[1];
num_tmp = Solve2Quadratic(-v, w); num_tmp = Solve2Quadratic(-v, w);
for (i = 0; i < num_tmp; ++i) for (i = 0; i < num_tmp; ++i)
{ {
m_roots[i + num_roots] = tmp[i] - a; m_roots[i + num_roots] = tmp[i] - a;
m_roots[i]=tmp[i]; m_roots[i]=tmp[i];
} }
return (num_tmp + num_roots); return (num_tmp + num_roots);
} }
} }

View File

@@ -1,45 +1,45 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef BU_ALGEBRAIC_POLYNOMIAL_SOLVER_H #ifndef BU_ALGEBRAIC_POLYNOMIAL_SOLVER_H
#define BU_ALGEBRAIC_POLYNOMIAL_SOLVER_H #define BU_ALGEBRAIC_POLYNOMIAL_SOLVER_H
#include "BU_PolynomialSolverInterface.h" #include "BU_PolynomialSolverInterface.h"
/// BU_AlgebraicPolynomialSolver implements polynomial root finding by analytically solving algebraic equations. /// BU_AlgebraicPolynomialSolver implements polynomial root finding by analytically solving algebraic equations.
/// Polynomials up to 4rd degree are supported, Cardano's formula is used for 3rd degree /// Polynomials up to 4rd degree are supported, Cardano's formula is used for 3rd degree
class BU_AlgebraicPolynomialSolver : public BUM_PolynomialSolverInterface class BU_AlgebraicPolynomialSolver : public BUM_PolynomialSolverInterface
{ {
public: public:
BU_AlgebraicPolynomialSolver() {}; BU_AlgebraicPolynomialSolver() {};
int Solve2Quadratic(SimdScalar p, SimdScalar q); int Solve2Quadratic(SimdScalar p, SimdScalar q);
int Solve2QuadraticFull(SimdScalar a,SimdScalar b, SimdScalar c); int Solve2QuadraticFull(SimdScalar a,SimdScalar b, SimdScalar c);
int Solve3Cubic(SimdScalar lead, SimdScalar a, SimdScalar b, SimdScalar c); int Solve3Cubic(SimdScalar lead, SimdScalar a, SimdScalar b, SimdScalar c);
int Solve4Quartic(SimdScalar lead, SimdScalar a, SimdScalar b, SimdScalar c, SimdScalar d); int Solve4Quartic(SimdScalar lead, SimdScalar a, SimdScalar b, SimdScalar c, SimdScalar d);
SimdScalar GetRoot(int i) const SimdScalar GetRoot(int i) const
{ {
return m_roots[i]; return m_roots[i];
} }
private: private:
SimdScalar m_roots[4]; SimdScalar m_roots[4];
}; };
#endif //BU_ALGEBRAIC_POLYNOMIAL_SOLVER_H #endif //BU_ALGEBRAIC_POLYNOMIAL_SOLVER_H

View File

@@ -1,25 +1,25 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#include "BU_Collidable.h" #include "BU_Collidable.h"
#include "CollisionShapes/CollisionShape.h" #include "CollisionShapes/CollisionShape.h"
#include <SimdTransform.h> #include <SimdTransform.h>
#include "BU_MotionStateInterface.h" #include "BU_MotionStateInterface.h"
BU_Collidable::BU_Collidable(BU_MotionStateInterface& motion,PolyhedralConvexShape& shape,void* userPointer ) BU_Collidable::BU_Collidable(BU_MotionStateInterface& motion,PolyhedralConvexShape& shape,void* userPointer )
:m_motionState(motion),m_shape(shape),m_userPointer(userPointer) :m_motionState(motion),m_shape(shape),m_userPointer(userPointer)
{ {
} }

View File

@@ -1,57 +1,57 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef BU_COLLIDABLE #ifndef BU_COLLIDABLE
#define BU_COLLIDABLE #define BU_COLLIDABLE
class PolyhedralConvexShape; class PolyhedralConvexShape;
class BU_MotionStateInterface; class BU_MotionStateInterface;
#include <SimdPoint3.h> #include <SimdPoint3.h>
class BU_Collidable class BU_Collidable
{ {
public: public:
BU_Collidable(BU_MotionStateInterface& motion,PolyhedralConvexShape& shape, void* userPointer); BU_Collidable(BU_MotionStateInterface& motion,PolyhedralConvexShape& shape, void* userPointer);
void* GetUserPointer() const void* GetUserPointer() const
{ {
return m_userPointer; return m_userPointer;
} }
BU_MotionStateInterface& GetMotionState() BU_MotionStateInterface& GetMotionState()
{ {
return m_motionState; return m_motionState;
} }
inline const BU_MotionStateInterface& GetMotionState() const inline const BU_MotionStateInterface& GetMotionState() const
{ {
return m_motionState; return m_motionState;
} }
inline const PolyhedralConvexShape& GetShape() const inline const PolyhedralConvexShape& GetShape() const
{ {
return m_shape; return m_shape;
}; };
private: private:
BU_MotionStateInterface& m_motionState; BU_MotionStateInterface& m_motionState;
PolyhedralConvexShape& m_shape; PolyhedralConvexShape& m_shape;
void* m_userPointer; void* m_userPointer;
}; };
#endif //BU_COLLIDABLE #endif //BU_COLLIDABLE

View File

@@ -1,54 +1,54 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef BU_COLLISIONPAIR #ifndef BU_COLLISIONPAIR
#define BU_COLLISIONPAIR #define BU_COLLISIONPAIR
#include <NarrowPhaseCollision/BU_Screwing.h> #include <NarrowPhaseCollision/BU_Screwing.h>
#include <NarrowPhaseCollision/ConvexCast.h> #include <NarrowPhaseCollision/ConvexCast.h>
#include <SimdQuaternion.h> #include <SimdQuaternion.h>
class PolyhedralConvexShape; class PolyhedralConvexShape;
///BU_CollisionPair implements collision algorithm for algebraic time of impact calculation of feature based shapes. ///BU_CollisionPair implements collision algorithm for algebraic time of impact calculation of feature based shapes.
class BU_CollisionPair : public ConvexCast class BU_CollisionPair : public ConvexCast
{ {
public: public:
BU_CollisionPair(const PolyhedralConvexShape* convexA,const PolyhedralConvexShape* convexB,SimdScalar tolerance=0.2f); BU_CollisionPair(const PolyhedralConvexShape* convexA,const PolyhedralConvexShape* convexB,SimdScalar tolerance=0.2f);
//toi //toi
virtual bool calcTimeOfImpact( virtual bool calcTimeOfImpact(
const SimdTransform& fromA, const SimdTransform& fromA,
const SimdTransform& toA, const SimdTransform& toA,
const SimdTransform& fromB, const SimdTransform& fromB,
const SimdTransform& toB, const SimdTransform& toB,
CastResult& result); CastResult& result);
private: private:
const PolyhedralConvexShape* m_convexA; const PolyhedralConvexShape* m_convexA;
const PolyhedralConvexShape* m_convexB; const PolyhedralConvexShape* m_convexB;
BU_Screwing m_screwing; BU_Screwing m_screwing;
SimdScalar m_tolerance; SimdScalar m_tolerance;
}; };
#endif //BU_COLLISIONPAIR #endif //BU_COLLISIONPAIR

View File

@@ -1,76 +1,76 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef BU_EDGEEDGE #ifndef BU_EDGEEDGE
#define BU_EDGEEDGE #define BU_EDGEEDGE
class BU_Screwing; class BU_Screwing;
#include <SimdTransform.h> #include <SimdTransform.h>
#include <SimdPoint3.h> #include <SimdPoint3.h>
#include <SimdVector3.h> #include <SimdVector3.h>
//class BUM_Point2; //class BUM_Point2;
#include <SimdScalar.h> #include <SimdScalar.h>
///BU_EdgeEdge implements algebraic time of impact calculation between two (angular + linear) moving edges. ///BU_EdgeEdge implements algebraic time of impact calculation between two (angular + linear) moving edges.
class BU_EdgeEdge class BU_EdgeEdge
{ {
public: public:
BU_EdgeEdge(); BU_EdgeEdge();
bool GetTimeOfImpact( bool GetTimeOfImpact(
const BU_Screwing& screwAB, const BU_Screwing& screwAB,
const SimdPoint3& a,//edge in object A const SimdPoint3& a,//edge in object A
const SimdVector3& u, const SimdVector3& u,
const SimdPoint3& c,//edge in object B const SimdPoint3& c,//edge in object B
const SimdVector3& v, const SimdVector3& v,
SimdScalar &minTime, SimdScalar &minTime,
SimdScalar &lamda, SimdScalar &lamda,
SimdScalar& mu SimdScalar& mu
); );
private: private:
bool Calc2DRotationPointPoint(const SimdPoint3& rotPt, SimdScalar rotRadius, SimdScalar rotW,const SimdPoint3& intersectPt,SimdScalar& minTime); bool Calc2DRotationPointPoint(const SimdPoint3& rotPt, SimdScalar rotRadius, SimdScalar rotW,const SimdPoint3& intersectPt,SimdScalar& minTime);
bool GetTimeOfImpactGeneralCase( bool GetTimeOfImpactGeneralCase(
const BU_Screwing& screwAB, const BU_Screwing& screwAB,
const SimdPoint3& a,//edge in object A const SimdPoint3& a,//edge in object A
const SimdVector3& u, const SimdVector3& u,
const SimdPoint3& c,//edge in object B const SimdPoint3& c,//edge in object B
const SimdVector3& v, const SimdVector3& v,
SimdScalar &minTime, SimdScalar &minTime,
SimdScalar &lamda, SimdScalar &lamda,
SimdScalar& mu SimdScalar& mu
); );
bool GetTimeOfImpactVertexEdge( bool GetTimeOfImpactVertexEdge(
const BU_Screwing& screwAB, const BU_Screwing& screwAB,
const SimdPoint3& a,//edge in object A const SimdPoint3& a,//edge in object A
const SimdVector3& u, const SimdVector3& u,
const SimdPoint3& c,//edge in object B const SimdPoint3& c,//edge in object B
const SimdVector3& v, const SimdVector3& v,
SimdScalar &minTime, SimdScalar &minTime,
SimdScalar &lamda, SimdScalar &lamda,
SimdScalar& mu SimdScalar& mu
); );
}; };
#endif //BU_EDGEEDGE #endif //BU_EDGEEDGE

View File

@@ -1,50 +1,50 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef BU_MOTIONSTATE #ifndef BU_MOTIONSTATE
#define BU_MOTIONSTATE #define BU_MOTIONSTATE
#include <SimdTransform.h> #include <SimdTransform.h>
#include <SimdPoint3.h> #include <SimdPoint3.h>
#include <SimdQuaternion.h> #include <SimdQuaternion.h>
class BU_MotionStateInterface class BU_MotionStateInterface
{ {
public: public:
virtual ~BU_MotionStateInterface(){}; virtual ~BU_MotionStateInterface(){};
virtual void SetTransform(const SimdTransform& trans) = 0; virtual void SetTransform(const SimdTransform& trans) = 0;
virtual void GetTransform(SimdTransform& trans) const = 0; virtual void GetTransform(SimdTransform& trans) const = 0;
virtual void SetPosition(const SimdPoint3& position) = 0; virtual void SetPosition(const SimdPoint3& position) = 0;
virtual void GetPosition(SimdPoint3& position) const = 0; virtual void GetPosition(SimdPoint3& position) const = 0;
virtual void SetOrientation(const SimdQuaternion& orientation) = 0; virtual void SetOrientation(const SimdQuaternion& orientation) = 0;
virtual void GetOrientation(SimdQuaternion& orientation) const = 0; virtual void GetOrientation(SimdQuaternion& orientation) const = 0;
virtual void SetBasis(const SimdMatrix3x3& basis) = 0; virtual void SetBasis(const SimdMatrix3x3& basis) = 0;
virtual void GetBasis(SimdMatrix3x3& basis) const = 0; virtual void GetBasis(SimdMatrix3x3& basis) const = 0;
virtual void SetLinearVelocity(const SimdVector3& linvel) = 0; virtual void SetLinearVelocity(const SimdVector3& linvel) = 0;
virtual void GetLinearVelocity(SimdVector3& linvel) const = 0; virtual void GetLinearVelocity(SimdVector3& linvel) const = 0;
virtual void GetAngularVelocity(SimdVector3& angvel) const = 0; virtual void GetAngularVelocity(SimdVector3& angvel) const = 0;
virtual void SetAngularVelocity(const SimdVector3& angvel) = 0; virtual void SetAngularVelocity(const SimdVector3& angvel) = 0;
}; };
#endif //BU_MOTIONSTATE #endif //BU_MOTIONSTATE

View File

@@ -1,39 +1,39 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef BUM_POLYNOMIAL_SOLVER_INTERFACE #ifndef BUM_POLYNOMIAL_SOLVER_INTERFACE
#define BUM_POLYNOMIAL_SOLVER_INTERFACE #define BUM_POLYNOMIAL_SOLVER_INTERFACE
#include <SimdScalar.h> #include <SimdScalar.h>
// //
//BUM_PolynomialSolverInterface is interface class for polynomial root finding. //BUM_PolynomialSolverInterface is interface class for polynomial root finding.
//The number of roots is returned as a result, query GetRoot to get the actual solution. //The number of roots is returned as a result, query GetRoot to get the actual solution.
// //
class BUM_PolynomialSolverInterface class BUM_PolynomialSolverInterface
{ {
public: public:
virtual ~BUM_PolynomialSolverInterface() {}; virtual ~BUM_PolynomialSolverInterface() {};
// virtual int Solve2QuadraticFull(SimdScalar a,SimdScalar b, SimdScalar c) = 0; // virtual int Solve2QuadraticFull(SimdScalar a,SimdScalar b, SimdScalar c) = 0;
virtual int Solve3Cubic(SimdScalar lead, SimdScalar a, SimdScalar b, SimdScalar c) = 0; virtual int Solve3Cubic(SimdScalar lead, SimdScalar a, SimdScalar b, SimdScalar c) = 0;
virtual int Solve4Quartic(SimdScalar lead, SimdScalar a, SimdScalar b, SimdScalar c, SimdScalar d) = 0; virtual int Solve4Quartic(SimdScalar lead, SimdScalar a, SimdScalar b, SimdScalar c, SimdScalar d) = 0;
virtual SimdScalar GetRoot(int i) const = 0; virtual SimdScalar GetRoot(int i) const = 0;
}; };
#endif //BUM_POLYNOMIAL_SOLVER_INTERFACE #endif //BUM_POLYNOMIAL_SOLVER_INTERFACE

View File

@@ -1,200 +1,200 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Stephane Redon / Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Stephane Redon / Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#include "BU_Screwing.h" #include "BU_Screwing.h"
BU_Screwing::BU_Screwing(const SimdVector3& relLinVel,const SimdVector3& relAngVel) { BU_Screwing::BU_Screwing(const SimdVector3& relLinVel,const SimdVector3& relAngVel) {
const SimdScalar dx=relLinVel[0]; const SimdScalar dx=relLinVel[0];
const SimdScalar dy=relLinVel[1]; const SimdScalar dy=relLinVel[1];
const SimdScalar dz=relLinVel[2]; const SimdScalar dz=relLinVel[2];
const SimdScalar wx=relAngVel[0]; const SimdScalar wx=relAngVel[0];
const SimdScalar wy=relAngVel[1]; const SimdScalar wy=relAngVel[1];
const SimdScalar wz=relAngVel[2]; const SimdScalar wz=relAngVel[2];
// Compute the screwing parameters : // Compute the screwing parameters :
// w : total amount of rotation // w : total amount of rotation
// s : total amount of translation // s : total amount of translation
// u : vector along the screwing axis (||u||=1) // u : vector along the screwing axis (||u||=1)
// o : point on the screwing axis // o : point on the screwing axis
m_w=SimdSqrt(wx*wx+wy*wy+wz*wz); m_w=SimdSqrt(wx*wx+wy*wy+wz*wz);
//if (!w) { //if (!w) {
if (fabs(m_w)<SCREWEPSILON ) { if (fabs(m_w)<SCREWEPSILON ) {
assert(m_w == 0.f); assert(m_w == 0.f);
m_w=0.; m_w=0.;
m_s=SimdSqrt(dx*dx+dy*dy+dz*dz); m_s=SimdSqrt(dx*dx+dy*dy+dz*dz);
if (fabs(m_s)<SCREWEPSILON ) { if (fabs(m_s)<SCREWEPSILON ) {
assert(m_s == 0.); assert(m_s == 0.);
m_s=0.; m_s=0.;
m_u=SimdPoint3(0.,0.,1.); m_u=SimdPoint3(0.,0.,1.);
m_o=SimdPoint3(0.,0.,0.); m_o=SimdPoint3(0.,0.,0.);
} }
else { else {
float t=1.f/m_s; float t=1.f/m_s;
m_u=SimdPoint3(dx*t,dy*t,dz*t); m_u=SimdPoint3(dx*t,dy*t,dz*t);
m_o=SimdPoint3(0.f,0.f,0.f); m_o=SimdPoint3(0.f,0.f,0.f);
} }
} }
else { // there is some rotation else { // there is some rotation
// we compute u // we compute u
float v(1.f/m_w); float v(1.f/m_w);
m_u=SimdPoint3(wx*v,wy*v,wz*v); // normalization m_u=SimdPoint3(wx*v,wy*v,wz*v); // normalization
// decomposition of the translation along u and one orthogonal vector // decomposition of the translation along u and one orthogonal vector
SimdPoint3 t(dx,dy,dz); SimdPoint3 t(dx,dy,dz);
m_s=t.dot(m_u); // component along u m_s=t.dot(m_u); // component along u
if (fabs(m_s)<SCREWEPSILON) if (fabs(m_s)<SCREWEPSILON)
{ {
//printf("m_s component along u < SCREWEPSILION\n"); //printf("m_s component along u < SCREWEPSILION\n");
m_s=0.f; m_s=0.f;
} }
SimdPoint3 n1(t-(m_s*m_u)); // the remaining part (which is orthogonal to u) SimdPoint3 n1(t-(m_s*m_u)); // the remaining part (which is orthogonal to u)
// now we have to compute o // now we have to compute o
//SimdScalar len = n1.length2(); //SimdScalar len = n1.length2();
//(len >= BUM_EPSILON2) { //(len >= BUM_EPSILON2) {
if (n1[0] || n1[1] || n1[2]) { // n1 is not the zero vector if (n1[0] || n1[1] || n1[2]) { // n1 is not the zero vector
n1.normalize(); n1.normalize();
SimdVector3 n1orth=m_u.cross(n1); SimdVector3 n1orth=m_u.cross(n1);
float n2x=SimdCos(0.5f*m_w); float n2x=SimdCos(0.5f*m_w);
float n2y=SimdSin(0.5f*m_w); float n2y=SimdSin(0.5f*m_w);
m_o=0.5f*t.dot(n1)*(n1+n2x/n2y*n1orth); m_o=0.5f*t.dot(n1)*(n1+n2x/n2y*n1orth);
} }
else else
{ {
m_o=SimdPoint3(0.f,0.f,0.f); m_o=SimdPoint3(0.f,0.f,0.f);
} }
} }
} }
//Then, I need to compute Pa, the matrix from the reference (global) frame to //Then, I need to compute Pa, the matrix from the reference (global) frame to
//the screwing frame : //the screwing frame :
void BU_Screwing::LocalMatrix(SimdTransform &t) const { void BU_Screwing::LocalMatrix(SimdTransform &t) const {
//So the whole computations do this : align the Oz axis along the //So the whole computations do this : align the Oz axis along the
// screwing axis (thanks to u), and then find two others orthogonal axes to // screwing axis (thanks to u), and then find two others orthogonal axes to
// complete the basis. // complete the basis.
if ((m_u[0]>SCREWEPSILON)||(m_u[0]<-SCREWEPSILON)||(m_u[1]>SCREWEPSILON)||(m_u[1]<-SCREWEPSILON)) if ((m_u[0]>SCREWEPSILON)||(m_u[0]<-SCREWEPSILON)||(m_u[1]>SCREWEPSILON)||(m_u[1]<-SCREWEPSILON))
{ {
// to avoid numerical problems // to avoid numerical problems
float n=SimdSqrt(m_u[0]*m_u[0]+m_u[1]*m_u[1]); float n=SimdSqrt(m_u[0]*m_u[0]+m_u[1]*m_u[1]);
float invn=1.0f/n; float invn=1.0f/n;
SimdMatrix3x3 mat; SimdMatrix3x3 mat;
mat[0][0]=-m_u[1]*invn; mat[0][0]=-m_u[1]*invn;
mat[0][1]=m_u[0]*invn; mat[0][1]=m_u[0]*invn;
mat[0][2]=0.f; mat[0][2]=0.f;
mat[1][0]=-m_u[0]*invn*m_u[2]; mat[1][0]=-m_u[0]*invn*m_u[2];
mat[1][1]=-m_u[1]*invn*m_u[2]; mat[1][1]=-m_u[1]*invn*m_u[2];
mat[1][2]=n; mat[1][2]=n;
mat[2][0]=m_u[0]; mat[2][0]=m_u[0];
mat[2][1]=m_u[1]; mat[2][1]=m_u[1];
mat[2][2]=m_u[2]; mat[2][2]=m_u[2];
t.setOrigin(SimdPoint3( t.setOrigin(SimdPoint3(
m_o[0]*m_u[1]*invn-m_o[1]*m_u[0]*invn, m_o[0]*m_u[1]*invn-m_o[1]*m_u[0]*invn,
-(m_o[0]*mat[1][0]+m_o[1]*mat[1][1]+m_o[2]*n), -(m_o[0]*mat[1][0]+m_o[1]*mat[1][1]+m_o[2]*n),
-(m_o[0]*m_u[0]+m_o[1]*m_u[1]+m_o[2]*m_u[2]))); -(m_o[0]*m_u[0]+m_o[1]*m_u[1]+m_o[2]*m_u[2])));
t.setBasis(mat); t.setBasis(mat);
} }
else { else {
SimdMatrix3x3 m; SimdMatrix3x3 m;
m[0][0]=1.; m[0][0]=1.;
m[1][0]=0.; m[1][0]=0.;
m[2][0]=0.; m[2][0]=0.;
m[0][1]=0.f; m[0][1]=0.f;
m[1][1]=float(SimdSign(m_u[2])); m[1][1]=float(SimdSign(m_u[2]));
m[2][1]=0.f; m[2][1]=0.f;
m[0][2]=0.f; m[0][2]=0.f;
m[1][2]=0.f; m[1][2]=0.f;
m[2][2]=float(SimdSign(m_u[2])); m[2][2]=float(SimdSign(m_u[2]));
t.setOrigin(SimdPoint3( t.setOrigin(SimdPoint3(
-m_o[0], -m_o[0],
-SimdSign(m_u[2])*m_o[1], -SimdSign(m_u[2])*m_o[1],
-SimdSign(m_u[2])*m_o[2] -SimdSign(m_u[2])*m_o[2]
)); ));
t.setBasis(m); t.setBasis(m);
} }
} }
//gives interpolated transform for time in [0..1] in screwing frame //gives interpolated transform for time in [0..1] in screwing frame
SimdTransform BU_Screwing::InBetweenTransform(const SimdTransform& tr,SimdScalar t) const SimdTransform BU_Screwing::InBetweenTransform(const SimdTransform& tr,SimdScalar t) const
{ {
SimdPoint3 org = tr.getOrigin(); SimdPoint3 org = tr.getOrigin();
SimdPoint3 neworg ( SimdPoint3 neworg (
org.x()*SimdCos(m_w*t)-org.y()*SimdSin(m_w*t), org.x()*SimdCos(m_w*t)-org.y()*SimdSin(m_w*t),
org.x()*SimdSin(m_w*t)+org.y()*SimdCos(m_w*t), org.x()*SimdSin(m_w*t)+org.y()*SimdCos(m_w*t),
org.z()+m_s*CalculateF(t)); org.z()+m_s*CalculateF(t));
SimdTransform newtr; SimdTransform newtr;
newtr.setOrigin(neworg); newtr.setOrigin(neworg);
SimdMatrix3x3 basis = tr.getBasis(); SimdMatrix3x3 basis = tr.getBasis();
SimdMatrix3x3 basisorg = tr.getBasis(); SimdMatrix3x3 basisorg = tr.getBasis();
SimdQuaternion rot(SimdVector3(0.,0.,1.),m_w*t); SimdQuaternion rot(SimdVector3(0.,0.,1.),m_w*t);
SimdQuaternion tmpOrn; SimdQuaternion tmpOrn;
tr.getBasis().getRotation(tmpOrn); tr.getBasis().getRotation(tmpOrn);
rot = rot * tmpOrn; rot = rot * tmpOrn;
//to avoid numerical drift, normalize quaternion //to avoid numerical drift, normalize quaternion
rot.normalize(); rot.normalize();
newtr.setBasis(SimdMatrix3x3(rot)); newtr.setBasis(SimdMatrix3x3(rot));
return newtr; return newtr;
} }
SimdScalar BU_Screwing::CalculateF(SimdScalar t) const SimdScalar BU_Screwing::CalculateF(SimdScalar t) const
{ {
SimdScalar result; SimdScalar result;
if (!m_w) if (!m_w)
{ {
result = t; result = t;
} else } else
{ {
result = ( SimdTan((m_w*t)/2.f) / SimdTan(m_w/2.f)); result = ( SimdTan((m_w*t)/2.f) / SimdTan(m_w/2.f));
} }
return result; return result;
} }

View File

@@ -1,77 +1,77 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef B_SCREWING_H #ifndef B_SCREWING_H
#define B_SCREWING_H #define B_SCREWING_H
#include <SimdVector3.h> #include <SimdVector3.h>
#include <SimdPoint3.h> #include <SimdPoint3.h>
#include <SimdTransform.h> #include <SimdTransform.h>
#define SCREWEPSILON 0.00001f #define SCREWEPSILON 0.00001f
///BU_Screwing implements screwing motion interpolation. ///BU_Screwing implements screwing motion interpolation.
class BU_Screwing class BU_Screwing
{ {
public: public:
BU_Screwing(const SimdVector3& relLinVel,const SimdVector3& relAngVel); BU_Screwing(const SimdVector3& relLinVel,const SimdVector3& relAngVel);
~BU_Screwing() { ~BU_Screwing() {
}; };
SimdScalar CalculateF(SimdScalar t) const; SimdScalar CalculateF(SimdScalar t) const;
//gives interpolated position for time in [0..1] in screwing frame //gives interpolated position for time in [0..1] in screwing frame
inline SimdPoint3 InBetweenPosition(const SimdPoint3& pt,SimdScalar t) const inline SimdPoint3 InBetweenPosition(const SimdPoint3& pt,SimdScalar t) const
{ {
return SimdPoint3( return SimdPoint3(
pt.x()*SimdCos(m_w*t)-pt.y()*SimdSin(m_w*t), pt.x()*SimdCos(m_w*t)-pt.y()*SimdSin(m_w*t),
pt.x()*SimdSin(m_w*t)+pt.y()*SimdCos(m_w*t), pt.x()*SimdSin(m_w*t)+pt.y()*SimdCos(m_w*t),
pt.z()+m_s*CalculateF(t)); pt.z()+m_s*CalculateF(t));
} }
inline SimdVector3 InBetweenVector(const SimdVector3& vec,SimdScalar t) const inline SimdVector3 InBetweenVector(const SimdVector3& vec,SimdScalar t) const
{ {
return SimdVector3( return SimdVector3(
vec.x()*SimdCos(m_w*t)-vec.y()*SimdSin(m_w*t), vec.x()*SimdCos(m_w*t)-vec.y()*SimdSin(m_w*t),
vec.x()*SimdSin(m_w*t)+vec.y()*SimdCos(m_w*t), vec.x()*SimdSin(m_w*t)+vec.y()*SimdCos(m_w*t),
vec.z()); vec.z());
} }
//gives interpolated transform for time in [0..1] in screwing frame //gives interpolated transform for time in [0..1] in screwing frame
SimdTransform InBetweenTransform(const SimdTransform& tr,SimdScalar t) const; SimdTransform InBetweenTransform(const SimdTransform& tr,SimdScalar t) const;
//gives matrix from global frame into screwing frame //gives matrix from global frame into screwing frame
void LocalMatrix(SimdTransform &t) const; void LocalMatrix(SimdTransform &t) const;
inline const SimdVector3& GetU() const { return m_u;} inline const SimdVector3& GetU() const { return m_u;}
inline const SimdVector3& GetO() const {return m_o;} inline const SimdVector3& GetO() const {return m_o;}
inline const SimdScalar GetS() const{ return m_s;} inline const SimdScalar GetS() const{ return m_s;}
inline const SimdScalar GetW() const { return m_w;} inline const SimdScalar GetW() const { return m_w;}
private: private:
float m_w; float m_w;
float m_s; float m_s;
SimdVector3 m_u; SimdVector3 m_u;
SimdVector3 m_o; SimdVector3 m_o;
}; };
#endif //B_SCREWING_H #endif //B_SCREWING_H

View File

@@ -1,91 +1,91 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef BU_STATIC_MOTIONSTATE #ifndef BU_STATIC_MOTIONSTATE
#define BU_STATIC_MOTIONSTATE #define BU_STATIC_MOTIONSTATE
#include <CollisionShapes/BU_MotionStateInterface.h> #include <CollisionShapes/BU_MotionStateInterface.h>
class BU_StaticMotionState :public BU_MotionStateInterface class BU_StaticMotionState :public BU_MotionStateInterface
{ {
public: public:
virtual ~BU_StaticMotionState(){}; virtual ~BU_StaticMotionState(){};
virtual void SetTransform(const SimdTransform& trans) virtual void SetTransform(const SimdTransform& trans)
{ {
m_trans = trans; m_trans = trans;
} }
virtual void GetTransform(SimdTransform& trans) const virtual void GetTransform(SimdTransform& trans) const
{ {
trans = m_trans; trans = m_trans;
} }
virtual void SetPosition(const SimdPoint3& position) virtual void SetPosition(const SimdPoint3& position)
{ {
m_trans.setOrigin( position ); m_trans.setOrigin( position );
} }
virtual void GetPosition(SimdPoint3& position) const virtual void GetPosition(SimdPoint3& position) const
{ {
position = m_trans.getOrigin(); position = m_trans.getOrigin();
} }
virtual void SetOrientation(const SimdQuaternion& orientation) virtual void SetOrientation(const SimdQuaternion& orientation)
{ {
m_trans.setRotation( orientation); m_trans.setRotation( orientation);
} }
virtual void GetOrientation(SimdQuaternion& orientation) const virtual void GetOrientation(SimdQuaternion& orientation) const
{ {
orientation = m_trans.getRotation(); orientation = m_trans.getRotation();
} }
virtual void SetBasis(const SimdMatrix3x3& basis) virtual void SetBasis(const SimdMatrix3x3& basis)
{ {
m_trans.setBasis( basis); m_trans.setBasis( basis);
} }
virtual void GetBasis(SimdMatrix3x3& basis) const virtual void GetBasis(SimdMatrix3x3& basis) const
{ {
basis = m_trans.getBasis(); basis = m_trans.getBasis();
} }
virtual void SetLinearVelocity(const SimdVector3& linvel) virtual void SetLinearVelocity(const SimdVector3& linvel)
{ {
m_linearVelocity = linvel; m_linearVelocity = linvel;
} }
virtual void GetLinearVelocity(SimdVector3& linvel) const virtual void GetLinearVelocity(SimdVector3& linvel) const
{ {
linvel = m_linearVelocity; linvel = m_linearVelocity;
} }
virtual void SetAngularVelocity(const SimdVector3& angvel) virtual void SetAngularVelocity(const SimdVector3& angvel)
{ {
m_angularVelocity = angvel; m_angularVelocity = angvel;
} }
virtual void GetAngularVelocity(SimdVector3& angvel) const virtual void GetAngularVelocity(SimdVector3& angvel) const
{ {
angvel = m_angularVelocity; angvel = m_angularVelocity;
} }
protected: protected:
SimdTransform m_trans; SimdTransform m_trans;
SimdVector3 m_angularVelocity; SimdVector3 m_angularVelocity;
SimdVector3 m_linearVelocity; SimdVector3 m_linearVelocity;
}; };
#endif //BU_STATIC_MOTIONSTATE #endif //BU_STATIC_MOTIONSTATE

View File

@@ -1,159 +1,159 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#include "BU_VertexPoly.h" #include "BU_VertexPoly.h"
#include "BU_Screwing.h" #include "BU_Screwing.h"
#include <SimdTransform.h> #include <SimdTransform.h>
#include <SimdPoint3.h> #include <SimdPoint3.h>
#include <SimdVector3.h> #include <SimdVector3.h>
#define USE_ALGEBRAIC #define USE_ALGEBRAIC
#ifdef USE_ALGEBRAIC #ifdef USE_ALGEBRAIC
#include "BU_AlgebraicPolynomialSolver.h" #include "BU_AlgebraicPolynomialSolver.h"
#define BU_Polynomial BU_AlgebraicPolynomialSolver #define BU_Polynomial BU_AlgebraicPolynomialSolver
#else #else
#include "BU_IntervalArithmeticPolynomialSolver.h" #include "BU_IntervalArithmeticPolynomialSolver.h"
#define BU_Polynomial BU_IntervalArithmeticPolynomialSolver #define BU_Polynomial BU_IntervalArithmeticPolynomialSolver
#endif #endif
inline bool TestFuzzyZero(SimdScalar x) { return SimdFabs(x) < 0.0001f; } inline bool TestFuzzyZero(SimdScalar x) { return SimdFabs(x) < 0.0001f; }
BU_VertexPoly::BU_VertexPoly() BU_VertexPoly::BU_VertexPoly()
{ {
} }
//return true if a collision will occur between [0..1] //return true if a collision will occur between [0..1]
//false otherwise. If true, minTime contains the time of impact //false otherwise. If true, minTime contains the time of impact
bool BU_VertexPoly::GetTimeOfImpact( bool BU_VertexPoly::GetTimeOfImpact(
const BU_Screwing& screwAB, const BU_Screwing& screwAB,
const SimdPoint3& a, const SimdPoint3& a,
const SimdVector4& planeEq, const SimdVector4& planeEq,
SimdScalar &minTime,bool swapAB) SimdScalar &minTime,bool swapAB)
{ {
bool hit = false; bool hit = false;
// precondition: s=0 and w= 0 is catched by caller! // precondition: s=0 and w= 0 is catched by caller!
if (TestFuzzyZero(screwAB.GetS()) && if (TestFuzzyZero(screwAB.GetS()) &&
TestFuzzyZero(screwAB.GetW())) TestFuzzyZero(screwAB.GetW()))
{ {
return false; return false;
} }
//case w<>0 and s<> 0 //case w<>0 and s<> 0
const SimdScalar w=screwAB.GetW(); const SimdScalar w=screwAB.GetW();
const SimdScalar s=screwAB.GetS(); const SimdScalar s=screwAB.GetS();
SimdScalar coefs[4]; SimdScalar coefs[4];
const SimdScalar p=planeEq[0]; const SimdScalar p=planeEq[0];
const SimdScalar q=planeEq[1]; const SimdScalar q=planeEq[1];
const SimdScalar r=planeEq[2]; const SimdScalar r=planeEq[2];
const SimdScalar d=planeEq[3]; const SimdScalar d=planeEq[3];
const SimdVector3 norm(p,q,r); const SimdVector3 norm(p,q,r);
BU_Polynomial polynomialSolver; BU_Polynomial polynomialSolver;
int numroots = 0; int numroots = 0;
//SimdScalar eps=1e-80f; //SimdScalar eps=1e-80f;
//SimdScalar eps2=1e-100f; //SimdScalar eps2=1e-100f;
if (TestFuzzyZero(screwAB.GetS()) ) if (TestFuzzyZero(screwAB.GetS()) )
{ {
//S = 0 , W <> 0 //S = 0 , W <> 0
//ax^3+bx^2+cx+d=0 //ax^3+bx^2+cx+d=0
coefs[0]=0.; coefs[0]=0.;
coefs[1]=(-p*a.x()-q*a.y()+r*a.z()-d); coefs[1]=(-p*a.x()-q*a.y()+r*a.z()-d);
coefs[2]=-2*p*a.y()+2*q*a.x(); coefs[2]=-2*p*a.y()+2*q*a.x();
coefs[3]=p*a.x()+q*a.y()+r*a.z()-d; coefs[3]=p*a.x()+q*a.y()+r*a.z()-d;
// numroots = polynomialSolver.Solve3Cubic(coefs[0],coefs[1],coefs[2],coefs[3]); // numroots = polynomialSolver.Solve3Cubic(coefs[0],coefs[1],coefs[2],coefs[3]);
numroots = polynomialSolver.Solve2QuadraticFull(coefs[1],coefs[2],coefs[3]); numroots = polynomialSolver.Solve2QuadraticFull(coefs[1],coefs[2],coefs[3]);
} else } else
{ {
if (TestFuzzyZero(screwAB.GetW())) if (TestFuzzyZero(screwAB.GetW()))
{ {
// W = 0 , S <> 0 // W = 0 , S <> 0
//pax+qay+r(az+st)=d //pax+qay+r(az+st)=d
SimdScalar dist = (d - a.dot(norm)); SimdScalar dist = (d - a.dot(norm));
if (TestFuzzyZero(r)) if (TestFuzzyZero(r))
{ {
if (TestFuzzyZero(dist)) if (TestFuzzyZero(dist))
{ {
// no hit // no hit
} else } else
{ {
// todo a a' might hit sides of polygon T // todo a a' might hit sides of polygon T
//printf("unhandled case, w=0,s<>0,r<>0, a a' might hit sides of polygon T \n"); //printf("unhandled case, w=0,s<>0,r<>0, a a' might hit sides of polygon T \n");
} }
} else } else
{ {
SimdScalar etoi = (dist)/(r*screwAB.GetS()); SimdScalar etoi = (dist)/(r*screwAB.GetS());
if (swapAB) if (swapAB)
etoi *= -1; etoi *= -1;
if (etoi >= 0. && etoi <= minTime) if (etoi >= 0. && etoi <= minTime)
{ {
minTime = etoi; minTime = etoi;
hit = true; hit = true;
} }
} }
} else } else
{ {
//ax^3+bx^2+cx+d=0 //ax^3+bx^2+cx+d=0
//degenerate coefficients mess things up :( //degenerate coefficients mess things up :(
SimdScalar ietsje = (r*s)/SimdTan(w/2.f); SimdScalar ietsje = (r*s)/SimdTan(w/2.f);
if (ietsje*ietsje < 0.01f) if (ietsje*ietsje < 0.01f)
ietsje = 0.f; ietsje = 0.f;
coefs[0]=ietsje;//(r*s)/tan(w/2.); coefs[0]=ietsje;//(r*s)/tan(w/2.);
coefs[1]=(-p*a.x()-q*a.y()+r*a.z()-d); coefs[1]=(-p*a.x()-q*a.y()+r*a.z()-d);
coefs[2]=-2.f*p*a.y()+2.f*q*a.x()+ietsje;//((r*s)/(tan(w/2.))); coefs[2]=-2.f*p*a.y()+2.f*q*a.x()+ietsje;//((r*s)/(tan(w/2.)));
coefs[3]=p*a.x()+q*a.y()+r*a.z()-d; coefs[3]=p*a.x()+q*a.y()+r*a.z()-d;
numroots = polynomialSolver.Solve3Cubic(coefs[0],coefs[1],coefs[2],coefs[3]); numroots = polynomialSolver.Solve3Cubic(coefs[0],coefs[1],coefs[2],coefs[3]);
} }
} }
for (int i=0;i<numroots;i++) for (int i=0;i<numroots;i++)
{ {
SimdScalar tau = polynomialSolver.GetRoot(i); SimdScalar tau = polynomialSolver.GetRoot(i);
SimdScalar t = 2.f*SimdAtan(tau)/w; SimdScalar t = 2.f*SimdAtan(tau)/w;
//tau = tan (wt/2) so 2*atan (tau)/w //tau = tan (wt/2) so 2*atan (tau)/w
if (swapAB) if (swapAB)
{ {
t *= -1.; t *= -1.;
} }
if (t>=0 && t<minTime) if (t>=0 && t<minTime)
{ {
minTime = t; minTime = t;
hit = true; hit = true;
} }
} }
return hit; return hit;
} }

View File

@@ -1,43 +1,43 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef VERTEX_POLY_H #ifndef VERTEX_POLY_H
#define VERTEX_POLY_H #define VERTEX_POLY_H
class BU_Screwing; class BU_Screwing;
#include <SimdTransform.h> #include <SimdTransform.h>
#include <SimdPoint3.h> #include <SimdPoint3.h>
#include <SimdScalar.h> #include <SimdScalar.h>
///BU_VertexPoly implements algebraic time of impact calculation between vertex and a plane. ///BU_VertexPoly implements algebraic time of impact calculation between vertex and a plane.
class BU_VertexPoly class BU_VertexPoly
{ {
public: public:
BU_VertexPoly(); BU_VertexPoly();
bool GetTimeOfImpact( bool GetTimeOfImpact(
const BU_Screwing& screwAB, const BU_Screwing& screwAB,
const SimdPoint3& vtx, const SimdPoint3& vtx,
const SimdVector4& planeEq, const SimdVector4& planeEq,
SimdScalar &minTime, SimdScalar &minTime,
bool swapAB); bool swapAB);
private: private:
//cached data (frame coherency etc.) here //cached data (frame coherency etc.) here
}; };
#endif //VERTEX_POLY_H #endif //VERTEX_POLY_H

File diff suppressed because it is too large Load Diff

View File

@@ -1,66 +1,66 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
EPA Copyright (c) Ricardo Padrela 2006 EPA Copyright (c) Ricardo Padrela 2006
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef EPA_H #ifndef EPA_H
#define EPA_H #define EPA_H
#define EPA_MAX_FACE_ENTRIES 256 #define EPA_MAX_FACE_ENTRIES 256
extern const SimdScalar EPA_MAX_RELATIVE_ERROR; extern const SimdScalar EPA_MAX_RELATIVE_ERROR;
extern const SimdScalar EPA_MAX_RELATIVE_ERROR_SQRD; extern const SimdScalar EPA_MAX_RELATIVE_ERROR_SQRD;
class Epa class Epa
{ {
private : private :
//! Prevents copying objects from this class //! Prevents copying objects from this class
Epa( const Epa& epa ); Epa( const Epa& epa );
const Epa& operator = ( const Epa& epa ); const Epa& operator = ( const Epa& epa );
public : public :
Epa( ConvexShape* pConvexShapeA, ConvexShape* pConvexShapeB, Epa( ConvexShape* pConvexShapeA, ConvexShape* pConvexShapeB,
const SimdTransform& transformA, const SimdTransform& transformB ); const SimdTransform& transformA, const SimdTransform& transformB );
~Epa(); ~Epa();
bool Initialize( SimplexSolverInterface& simplexSolver ); bool Initialize( SimplexSolverInterface& simplexSolver );
SimdScalar CalcPenDepth( SimdPoint3& wWitnessOnA, SimdPoint3& wWitnessOnB ); SimdScalar CalcPenDepth( SimdPoint3& wWitnessOnA, SimdPoint3& wWitnessOnB );
private : private :
bool TetrahedronContainsOrigin( SimdPoint3* pPoints ); bool TetrahedronContainsOrigin( SimdPoint3* pPoints );
bool TetrahedronContainsOrigin( const SimdPoint3& point0, const SimdPoint3& point1, bool TetrahedronContainsOrigin( const SimdPoint3& point0, const SimdPoint3& point1,
const SimdPoint3& point2, const SimdPoint3& point3 ); const SimdPoint3& point2, const SimdPoint3& point3 );
private : private :
//! Priority queue //! Priority queue
std::vector< EpaFace* > m_faceEntries; std::vector< EpaFace* > m_faceEntries;
ConvexShape* m_pConvexShapeA; ConvexShape* m_pConvexShapeA;
ConvexShape* m_pConvexShapeB; ConvexShape* m_pConvexShapeB;
SimdTransform m_transformA; SimdTransform m_transformA;
SimdTransform m_transformB; SimdTransform m_transformB;
EpaPolyhedron m_polyhedron; EpaPolyhedron m_polyhedron;
}; };
extern bool CompareEpaFaceEntries( EpaFace* pFaceA, EpaFace* pFaceB ); extern bool CompareEpaFaceEntries( EpaFace* pFaceA, EpaFace* pFaceB );
#endif #endif

View File

@@ -1,25 +1,25 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
EPA Copyright (c) Ricardo Padrela 2006 EPA Copyright (c) Ricardo Padrela 2006
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef EPA_COMMON_H #ifndef EPA_COMMON_H
#define EPA_COMMON_H #define EPA_COMMON_H
#define EPA_POLYHEDRON_USE_PLANES #define EPA_POLYHEDRON_USE_PLANES
//#define EPA_USE_HYBRID //#define EPA_USE_HYBRID
#endif #endif

View File

@@ -1,254 +1,254 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
EPA Copyright (c) Ricardo Padrela 2006 EPA Copyright (c) Ricardo Padrela 2006
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#include "SimdScalar.h" #include "SimdScalar.h"
#include "SimdVector3.h" #include "SimdVector3.h"
#include "SimdPoint3.h" #include "SimdPoint3.h"
#include "NarrowPhaseCollision/EpaCommon.h" #include "NarrowPhaseCollision/EpaCommon.h"
#include "NarrowPhaseCollision/EpaVertex.h" #include "NarrowPhaseCollision/EpaVertex.h"
#include "NarrowPhaseCollision/EpaHalfEdge.h" #include "NarrowPhaseCollision/EpaHalfEdge.h"
#include "NarrowPhaseCollision/EpaFace.h" #include "NarrowPhaseCollision/EpaFace.h"
#ifdef EPA_POLYHEDRON_USE_PLANES #ifdef EPA_POLYHEDRON_USE_PLANES
SimdScalar PLANE_THICKNESS = 1e-5f; SimdScalar PLANE_THICKNESS = 1e-5f;
#endif #endif
EpaFace::EpaFace() : m_pHalfEdge( 0 ), m_deleted( false ) EpaFace::EpaFace() : m_pHalfEdge( 0 ), m_deleted( false )
{ {
m_pVertices[ 0 ] = m_pVertices[ 1 ] = m_pVertices[ 2 ] = 0; m_pVertices[ 0 ] = m_pVertices[ 1 ] = m_pVertices[ 2 ] = 0;
} }
EpaFace::~EpaFace() EpaFace::~EpaFace()
{ {
} }
bool EpaFace::Initialize() bool EpaFace::Initialize()
{ {
assert( m_pHalfEdge && "Must setup half-edge first!" ); assert( m_pHalfEdge && "Must setup half-edge first!" );
CollectVertices( m_pVertices ); CollectVertices( m_pVertices );
const SimdVector3 e0 = m_pVertices[ 1 ]->m_point - m_pVertices[ 0 ]->m_point; const SimdVector3 e0 = m_pVertices[ 1 ]->m_point - m_pVertices[ 0 ]->m_point;
const SimdVector3 e1 = m_pVertices[ 2 ]->m_point - m_pVertices[ 0 ]->m_point; const SimdVector3 e1 = m_pVertices[ 2 ]->m_point - m_pVertices[ 0 ]->m_point;
const SimdScalar e0Sqrd = e0.length2(); const SimdScalar e0Sqrd = e0.length2();
const SimdScalar e1Sqrd = e1.length2(); const SimdScalar e1Sqrd = e1.length2();
const SimdScalar e0e1 = e0.dot( e1 ); const SimdScalar e0e1 = e0.dot( e1 );
m_determinant = e0Sqrd * e1Sqrd - e0e1 * e0e1; m_determinant = e0Sqrd * e1Sqrd - e0e1 * e0e1;
const SimdScalar e0v0 = e0.dot( m_pVertices[ 0 ]->m_point ); const SimdScalar e0v0 = e0.dot( m_pVertices[ 0 ]->m_point );
const SimdScalar e1v0 = e1.dot( m_pVertices[ 0 ]->m_point ); const SimdScalar e1v0 = e1.dot( m_pVertices[ 0 ]->m_point );
m_lambdas[ 0 ] = e0e1 * e1v0 - e1Sqrd * e0v0; m_lambdas[ 0 ] = e0e1 * e1v0 - e1Sqrd * e0v0;
m_lambdas[ 1 ] = e0e1 * e0v0 - e0Sqrd * e1v0; m_lambdas[ 1 ] = e0e1 * e0v0 - e0Sqrd * e1v0;
if ( IsAffinelyDependent() ) if ( IsAffinelyDependent() )
{ {
return false; return false;
} }
CalcClosestPoint(); CalcClosestPoint();
#ifdef EPA_POLYHEDRON_USE_PLANES #ifdef EPA_POLYHEDRON_USE_PLANES
if ( !CalculatePlane() ) if ( !CalculatePlane() )
{ {
return false; return false;
} }
#endif #endif
return true; return true;
} }
#ifdef EPA_POLYHEDRON_USE_PLANES #ifdef EPA_POLYHEDRON_USE_PLANES
bool EpaFace::CalculatePlane() bool EpaFace::CalculatePlane()
{ {
assert( ( m_pVertices[ 0 ] && m_pVertices[ 1 ] && m_pVertices[ 2 ] ) assert( ( m_pVertices[ 0 ] && m_pVertices[ 1 ] && m_pVertices[ 2 ] )
&& "Must setup vertices pointers first!" ); && "Must setup vertices pointers first!" );
// Traditional method // Traditional method
const SimdVector3 v1 = m_pVertices[ 1 ]->m_point - m_pVertices[ 0 ]->m_point; const SimdVector3 v1 = m_pVertices[ 1 ]->m_point - m_pVertices[ 0 ]->m_point;
const SimdVector3 v2 = m_pVertices[ 2 ]->m_point - m_pVertices[ 0 ]->m_point; const SimdVector3 v2 = m_pVertices[ 2 ]->m_point - m_pVertices[ 0 ]->m_point;
m_planeNormal = v2.cross( v1 ); m_planeNormal = v2.cross( v1 );
if ( m_planeNormal.length2() == 0 ) if ( m_planeNormal.length2() == 0 )
{ {
return false; return false;
} }
m_planeNormal.normalize(); m_planeNormal.normalize();
m_planeDistance = m_pVertices[ 0 ]->m_point.dot( -m_planeNormal ); m_planeDistance = m_pVertices[ 0 ]->m_point.dot( -m_planeNormal );
// Robust method // Robust method
//SimdVector3 _v1 = m_pVertices[ 1 ]->m_point - m_pVertices[ 0 ]->m_point; //SimdVector3 _v1 = m_pVertices[ 1 ]->m_point - m_pVertices[ 0 ]->m_point;
//SimdVector3 _v2 = m_pVertices[ 2 ]->m_point - m_pVertices[ 0 ]->m_point; //SimdVector3 _v2 = m_pVertices[ 2 ]->m_point - m_pVertices[ 0 ]->m_point;
//SimdVector3 n; //SimdVector3 n;
//n = _v2.cross( _v1 ); //n = _v2.cross( _v1 );
//_v1 = m_pVertices[ 0 ]->m_point - m_pVertices[ 1 ]->m_point; //_v1 = m_pVertices[ 0 ]->m_point - m_pVertices[ 1 ]->m_point;
//_v2 = m_pVertices[ 2 ]->m_point - m_pVertices[ 1 ]->m_point; //_v2 = m_pVertices[ 2 ]->m_point - m_pVertices[ 1 ]->m_point;
//n += ( _v1.cross( _v2 ) ); //n += ( _v1.cross( _v2 ) );
//_v1 = m_pVertices[ 0 ]->m_point - m_pVertices[ 2 ]->m_point; //_v1 = m_pVertices[ 0 ]->m_point - m_pVertices[ 2 ]->m_point;
//_v2 = m_pVertices[ 1 ]->m_point - m_pVertices[ 2 ]->m_point; //_v2 = m_pVertices[ 1 ]->m_point - m_pVertices[ 2 ]->m_point;
//n += ( _v2.cross( _v1 ) ); //n += ( _v2.cross( _v1 ) );
//n /= 3; //n /= 3;
//n.normalize(); //n.normalize();
//SimdVector3 c = ( m_pVertices[ 0 ]->m_point + m_pVertices[ 1 ]->m_point + m_pVertices[ 2 ]->m_point ) / 3; //SimdVector3 c = ( m_pVertices[ 0 ]->m_point + m_pVertices[ 1 ]->m_point + m_pVertices[ 2 ]->m_point ) / 3;
//SimdScalar d = c.dot( -n ); //SimdScalar d = c.dot( -n );
//m_robustPlaneNormal = n; //m_robustPlaneNormal = n;
//m_robustPlaneDistance = d; //m_robustPlaneDistance = d;
// Compare results from both methods and check whether they disagree // Compare results from both methods and check whether they disagree
//if ( d < 0 ) //if ( d < 0 )
//{ //{
// assert( ( m_planeDistance < 0 ) && "He he! Busted!" ); // assert( ( m_planeDistance < 0 ) && "He he! Busted!" );
//} //}
//else //else
//{ //{
// assert( ( m_planeDistance >= 0 ) && "He he! Busted!" ); // assert( ( m_planeDistance >= 0 ) && "He he! Busted!" );
//} //}
return true; return true;
} }
#endif #endif
void EpaFace::CalcClosestPoint() void EpaFace::CalcClosestPoint()
{ {
const SimdVector3 e0 = m_pVertices[ 1 ]->m_point - m_pVertices[ 0 ]->m_point; const SimdVector3 e0 = m_pVertices[ 1 ]->m_point - m_pVertices[ 0 ]->m_point;
const SimdVector3 e1 = m_pVertices[ 2 ]->m_point - m_pVertices[ 0 ]->m_point; const SimdVector3 e1 = m_pVertices[ 2 ]->m_point - m_pVertices[ 0 ]->m_point;
m_v = m_pVertices[ 0 ]->m_point + m_v = m_pVertices[ 0 ]->m_point +
( e0 * m_lambdas[ 0 ] + e1 * m_lambdas[ 1 ] ) / m_determinant; ( e0 * m_lambdas[ 0 ] + e1 * m_lambdas[ 1 ] ) / m_determinant;
m_vSqrd = m_v.length2(); m_vSqrd = m_v.length2();
} }
void EpaFace::CalcClosestPointOnA( SimdVector3& closestPointOnA ) void EpaFace::CalcClosestPointOnA( SimdVector3& closestPointOnA )
{ {
const SimdVector3 e0 = m_pVertices[ 1 ]->m_wSupportPointOnA - m_pVertices[ 0 ]->m_wSupportPointOnA; const SimdVector3 e0 = m_pVertices[ 1 ]->m_wSupportPointOnA - m_pVertices[ 0 ]->m_wSupportPointOnA;
const SimdVector3 e1 = m_pVertices[ 2 ]->m_wSupportPointOnA - m_pVertices[ 0 ]->m_wSupportPointOnA; const SimdVector3 e1 = m_pVertices[ 2 ]->m_wSupportPointOnA - m_pVertices[ 0 ]->m_wSupportPointOnA;
closestPointOnA = m_pVertices[ 0 ]->m_wSupportPointOnA + closestPointOnA = m_pVertices[ 0 ]->m_wSupportPointOnA +
( e0 * m_lambdas[ 0 ] + e1 * m_lambdas[ 1 ] ) / ( e0 * m_lambdas[ 0 ] + e1 * m_lambdas[ 1 ] ) /
m_determinant; m_determinant;
} }
void EpaFace::CalcClosestPointOnB( SimdVector3& closestPointOnB ) void EpaFace::CalcClosestPointOnB( SimdVector3& closestPointOnB )
{ {
const SimdVector3 e0 = m_pVertices[ 1 ]->m_wSupportPointOnB - m_pVertices[ 0 ]->m_wSupportPointOnB; const SimdVector3 e0 = m_pVertices[ 1 ]->m_wSupportPointOnB - m_pVertices[ 0 ]->m_wSupportPointOnB;
const SimdVector3 e1 = m_pVertices[ 2 ]->m_wSupportPointOnB - m_pVertices[ 0 ]->m_wSupportPointOnB; const SimdVector3 e1 = m_pVertices[ 2 ]->m_wSupportPointOnB - m_pVertices[ 0 ]->m_wSupportPointOnB;
closestPointOnB = m_pVertices[ 0 ]->m_wSupportPointOnB + closestPointOnB = m_pVertices[ 0 ]->m_wSupportPointOnB +
( e0 * m_lambdas[ 0 ] + e1 * m_lambdas[ 1 ] ) / ( e0 * m_lambdas[ 0 ] + e1 * m_lambdas[ 1 ] ) /
m_determinant; m_determinant;
} }
bool EpaFace::IsAffinelyDependent() const bool EpaFace::IsAffinelyDependent() const
{ {
return ( m_determinant <= SIMD_EPSILON ); return ( m_determinant <= SIMD_EPSILON );
} }
bool EpaFace::IsClosestPointInternal() const bool EpaFace::IsClosestPointInternal() const
{ {
return ( ( m_lambdas[ 0 ] >= 0 ) && ( m_lambdas[ 1 ] >= 0 ) && ( ( m_lambdas[ 0 ] + m_lambdas[ 1 ] <= m_determinant ) ) ); return ( ( m_lambdas[ 0 ] >= 0 ) && ( m_lambdas[ 1 ] >= 0 ) && ( ( m_lambdas[ 0 ] + m_lambdas[ 1 ] <= m_determinant ) ) );
} }
void EpaFace::CollectVertices( EpaVertex** ppVertices ) void EpaFace::CollectVertices( EpaVertex** ppVertices )
{ {
assert( m_pHalfEdge && "Invalid half-edge pointer!" ); assert( m_pHalfEdge && "Invalid half-edge pointer!" );
int vertexIndex = 0; int vertexIndex = 0;
EpaHalfEdge* pCurrentHalfEdge = m_pHalfEdge; EpaHalfEdge* pCurrentHalfEdge = m_pHalfEdge;
do do
{ {
assert( ( ( vertexIndex >= 0 ) && ( vertexIndex < 3 ) ) && assert( ( ( vertexIndex >= 0 ) && ( vertexIndex < 3 ) ) &&
"Face is not a triangle!" ); "Face is not a triangle!" );
assert( pCurrentHalfEdge->m_pVertex && "Half-edge has an invalid vertex pointer!" ); assert( pCurrentHalfEdge->m_pVertex && "Half-edge has an invalid vertex pointer!" );
ppVertices[ vertexIndex++ ] = pCurrentHalfEdge->m_pVertex; ppVertices[ vertexIndex++ ] = pCurrentHalfEdge->m_pVertex;
pCurrentHalfEdge = pCurrentHalfEdge->m_pNextCCW; pCurrentHalfEdge = pCurrentHalfEdge->m_pNextCCW;
} }
while( pCurrentHalfEdge != m_pHalfEdge ); while( pCurrentHalfEdge != m_pHalfEdge );
} }
//void EpaFace::FixOrder() //void EpaFace::FixOrder()
//{ //{
// EpaHalfEdge* pHalfEdges[ 3 ]; // EpaHalfEdge* pHalfEdges[ 3 ];
// //
// int halfEdgeIndex = 0; // int halfEdgeIndex = 0;
// //
// EpaHalfEdge* pCurrentHalfEdge = m_pHalfEdge; // EpaHalfEdge* pCurrentHalfEdge = m_pHalfEdge;
// //
// do // do
// { // {
// assert( ( ( halfEdgeIndex >= 0 ) && ( halfEdgeIndex < 3 ) ) && // assert( ( ( halfEdgeIndex >= 0 ) && ( halfEdgeIndex < 3 ) ) &&
// "Face is not a triangle!" ); // "Face is not a triangle!" );
// //
// pHalfEdges[ halfEdgeIndex++ ] = pCurrentHalfEdge; // pHalfEdges[ halfEdgeIndex++ ] = pCurrentHalfEdge;
// //
// pCurrentHalfEdge = pCurrentHalfEdge->m_pNextCCW; // pCurrentHalfEdge = pCurrentHalfEdge->m_pNextCCW;
// } // }
// while( pCurrentHalfEdge != m_pHalfEdge ); // while( pCurrentHalfEdge != m_pHalfEdge );
// //
// EpaVertex* pVertices[ 3 ] = { pHalfEdges[ 0 ]->m_pVertex, // EpaVertex* pVertices[ 3 ] = { pHalfEdges[ 0 ]->m_pVertex,
// pHalfEdges[ 1 ]->m_pVertex, // pHalfEdges[ 1 ]->m_pVertex,
// pHalfEdges[ 2 ]->m_pVertex }; // pHalfEdges[ 2 ]->m_pVertex };
// //
// // Make them run in the opposite direction // // Make them run in the opposite direction
// pHalfEdges[ 0 ]->m_pNextCCW = pHalfEdges[ 2 ]; // pHalfEdges[ 0 ]->m_pNextCCW = pHalfEdges[ 2 ];
// pHalfEdges[ 1 ]->m_pNextCCW = pHalfEdges[ 0 ]; // pHalfEdges[ 1 ]->m_pNextCCW = pHalfEdges[ 0 ];
// pHalfEdges[ 2 ]->m_pNextCCW = pHalfEdges[ 1 ]; // pHalfEdges[ 2 ]->m_pNextCCW = pHalfEdges[ 1 ];
// //
// // Make half-edges point to their correct origin vertices // // Make half-edges point to their correct origin vertices
// //
// pHalfEdges[ 1 ]->m_pVertex = pVertices[ 2 ]; // pHalfEdges[ 1 ]->m_pVertex = pVertices[ 2 ];
// pHalfEdges[ 2 ]->m_pVertex = pVertices[ 0 ]; // pHalfEdges[ 2 ]->m_pVertex = pVertices[ 0 ];
// pHalfEdges[ 0 ]->m_pVertex = pVertices[ 1 ]; // pHalfEdges[ 0 ]->m_pVertex = pVertices[ 1 ];
// //
// // Make vertices point to the correct half-edges // // Make vertices point to the correct half-edges
// //
// //pHalfEdges[ 0 ]->m_pVertex->m_pHalfEdge = pHalfEdges[ 0 ]; // //pHalfEdges[ 0 ]->m_pVertex->m_pHalfEdge = pHalfEdges[ 0 ];
// //pHalfEdges[ 1 ]->m_pVertex->m_pHalfEdge = pHalfEdges[ 1 ]; // //pHalfEdges[ 1 ]->m_pVertex->m_pHalfEdge = pHalfEdges[ 1 ];
// //pHalfEdges[ 2 ]->m_pVertex->m_pHalfEdge = pHalfEdges[ 2 ]; // //pHalfEdges[ 2 ]->m_pVertex->m_pHalfEdge = pHalfEdges[ 2 ];
// //
// // Flip normal and change the sign of plane distance // // Flip normal and change the sign of plane distance
// //
//#ifdef EPA_POLYHEDRON_USE_PLANES //#ifdef EPA_POLYHEDRON_USE_PLANES
// m_planeNormal = -m_planeNormal; // m_planeNormal = -m_planeNormal;
// m_planeDistance = -m_planeDistance; // m_planeDistance = -m_planeDistance;
//#endif //#endif
//} //}

View File

@@ -1,83 +1,83 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
EPA Copyright (c) Ricardo Padrela 2006 EPA Copyright (c) Ricardo Padrela 2006
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef EPA_FACE_H #ifndef EPA_FACE_H
#define EPA_FACE_H #define EPA_FACE_H
class EpaVertex; class EpaVertex;
class EpaHalfEdge; class EpaHalfEdge;
#ifdef EPA_POLYHEDRON_USE_PLANES #ifdef EPA_POLYHEDRON_USE_PLANES
extern SimdScalar PLANE_THICKNESS; extern SimdScalar PLANE_THICKNESS;
#endif #endif
//! Note : This class is not supposed to be a base class //! Note : This class is not supposed to be a base class
class EpaFace class EpaFace
{ {
private : private :
//! Prevents copying objects from this class //! Prevents copying objects from this class
EpaFace( const EpaFace& epaFace ); EpaFace( const EpaFace& epaFace );
const EpaFace& operator = ( const EpaFace& epaFace ); const EpaFace& operator = ( const EpaFace& epaFace );
public : public :
EpaFace(); EpaFace();
~EpaFace(); ~EpaFace();
bool Initialize(); bool Initialize();
#ifdef EPA_POLYHEDRON_USE_PLANES #ifdef EPA_POLYHEDRON_USE_PLANES
bool CalculatePlane(); bool CalculatePlane();
#endif #endif
void CalcClosestPoint(); void CalcClosestPoint();
void CalcClosestPointOnA( SimdVector3& closestPointOnA ); void CalcClosestPointOnA( SimdVector3& closestPointOnA );
void CalcClosestPointOnB( SimdVector3& closestPointOnB ); void CalcClosestPointOnB( SimdVector3& closestPointOnB );
bool IsAffinelyDependent() const; bool IsAffinelyDependent() const;
bool IsClosestPointInternal() const; bool IsClosestPointInternal() const;
void CollectVertices( EpaVertex** ppVertices ); void CollectVertices( EpaVertex** ppVertices );
//void FixOrder(); //void FixOrder();
public : public :
EpaHalfEdge* m_pHalfEdge; EpaHalfEdge* m_pHalfEdge;
// We keep vertices here so we don't need to call CollectVertices // We keep vertices here so we don't need to call CollectVertices
// every time we need them // every time we need them
EpaVertex* m_pVertices[ 3 ]; EpaVertex* m_pVertices[ 3 ];
#ifdef EPA_POLYHEDRON_USE_PLANES #ifdef EPA_POLYHEDRON_USE_PLANES
SimdVector3 m_planeNormal; SimdVector3 m_planeNormal;
SimdScalar m_planeDistance; SimdScalar m_planeDistance;
//SimdVector3 m_robustPlaneNormal; //SimdVector3 m_robustPlaneNormal;
//SimdScalar m_robustPlaneDistance; //SimdScalar m_robustPlaneDistance;
#endif #endif
SimdVector3 m_v; SimdVector3 m_v;
SimdScalar m_vSqrd; SimdScalar m_vSqrd;
SimdScalar m_determinant; SimdScalar m_determinant;
SimdScalar m_lambdas[ 2 ]; SimdScalar m_lambdas[ 2 ];
bool m_deleted; bool m_deleted;
}; };
#endif #endif

View File

@@ -1,58 +1,58 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
EPA Copyright (c) Ricardo Padrela 2006 EPA Copyright (c) Ricardo Padrela 2006
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef EPA_HALF_EDGE_H #ifndef EPA_HALF_EDGE_H
#define EPA_HALF_EDGE_H #define EPA_HALF_EDGE_H
class EpaFace; class EpaFace;
class EpaVertex; class EpaVertex;
//! Note : This class is not supposed to be a base class //! Note : This class is not supposed to be a base class
class EpaHalfEdge class EpaHalfEdge
{ {
private : private :
//! Prevents copying objects from this class //! Prevents copying objects from this class
EpaHalfEdge( const EpaHalfEdge& epaHalfEdge ); EpaHalfEdge( const EpaHalfEdge& epaHalfEdge );
const EpaHalfEdge& operator = ( const EpaHalfEdge& epaHalfEdge ); const EpaHalfEdge& operator = ( const EpaHalfEdge& epaHalfEdge );
public : public :
EpaHalfEdge() : m_pTwin( 0 ), m_pNextCCW( 0 ), m_pFace( 0 ), m_pVertex( 0 ) EpaHalfEdge() : m_pTwin( 0 ), m_pNextCCW( 0 ), m_pFace( 0 ), m_pVertex( 0 )
{ {
} }
~EpaHalfEdge() ~EpaHalfEdge()
{ {
} }
public : public :
//! Twin half-edge link //! Twin half-edge link
EpaHalfEdge* m_pTwin; EpaHalfEdge* m_pTwin;
//! Next half-edge in counter clock-wise ( CCW ) order //! Next half-edge in counter clock-wise ( CCW ) order
EpaHalfEdge* m_pNextCCW; EpaHalfEdge* m_pNextCCW;
//! Parent face link //! Parent face link
EpaFace* m_pFace; EpaFace* m_pFace;
//! Origin vertex link //! Origin vertex link
EpaVertex* m_pVertex; EpaVertex* m_pVertex;
}; };
#endif #endif

View File

@@ -1,202 +1,202 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
EPA Copyright (c) Ricardo Padrela 2006 EPA Copyright (c) Ricardo Padrela 2006
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#include "SimdScalar.h" #include "SimdScalar.h"
#include "SimdVector3.h" #include "SimdVector3.h"
#include "SimdPoint3.h" #include "SimdPoint3.h"
#include "SimdTransform.h" #include "SimdTransform.h"
#include "SimdMinMax.h" #include "SimdMinMax.h"
#include <list> #include <list>
#include "CollisionShapes/ConvexShape.h" #include "CollisionShapes/ConvexShape.h"
#include "NarrowPhaseCollision/SimplexSolverInterface.h" #include "NarrowPhaseCollision/SimplexSolverInterface.h"
#include "NarrowPhaseCollision/EpaCommon.h" #include "NarrowPhaseCollision/EpaCommon.h"
#include "NarrowPhaseCollision/EpaVertex.h" #include "NarrowPhaseCollision/EpaVertex.h"
#include "NarrowPhaseCollision/EpaHalfEdge.h" #include "NarrowPhaseCollision/EpaHalfEdge.h"
#include "NarrowPhaseCollision/EpaFace.h" #include "NarrowPhaseCollision/EpaFace.h"
#include "NarrowPhaseCollision/EpaPolyhedron.h" #include "NarrowPhaseCollision/EpaPolyhedron.h"
#include "NarrowPhaseCollision/Epa.h" #include "NarrowPhaseCollision/Epa.h"
#include "NarrowPhaseCollision/ConvexPenetrationDepthSolver.h" #include "NarrowPhaseCollision/ConvexPenetrationDepthSolver.h"
#include "NarrowPhaseCollision/EpaPenetrationDepthSolver.h" #include "NarrowPhaseCollision/EpaPenetrationDepthSolver.h"
SimdScalar g_GJKMaxRelError = 1e-3f; SimdScalar g_GJKMaxRelError = 1e-3f;
SimdScalar g_GJKMaxRelErrorSqrd = g_GJKMaxRelError * g_GJKMaxRelError; SimdScalar g_GJKMaxRelErrorSqrd = g_GJKMaxRelError * g_GJKMaxRelError;
bool EpaPenetrationDepthSolver::CalcPenDepth( SimplexSolverInterface& simplexSolver, bool EpaPenetrationDepthSolver::CalcPenDepth( SimplexSolverInterface& simplexSolver,
ConvexShape* pConvexA, ConvexShape* pConvexB, ConvexShape* pConvexA, ConvexShape* pConvexB,
const SimdTransform& transformA, const SimdTransform& transformB, const SimdTransform& transformA, const SimdTransform& transformB,
SimdVector3& v, SimdPoint3& wWitnessOnA, SimdPoint3& wWitnessOnB, SimdVector3& v, SimdPoint3& wWitnessOnA, SimdPoint3& wWitnessOnB,
class IDebugDraw* debugDraw ) class IDebugDraw* debugDraw )
{ {
assert( pConvexA && "Convex shape A is invalid!" ); assert( pConvexA && "Convex shape A is invalid!" );
assert( pConvexB && "Convex shape B is invalid!" ); assert( pConvexB && "Convex shape B is invalid!" );
SimdScalar penDepth; SimdScalar penDepth;
#ifdef EPA_USE_HYBRID #ifdef EPA_USE_HYBRID
bool needsEPA = !HybridPenDepth( simplexSolver, pConvexA, pConvexB, transformA, transformB, bool needsEPA = !HybridPenDepth( simplexSolver, pConvexA, pConvexB, transformA, transformB,
wWitnessOnA, wWitnessOnB, penDepth, v ); wWitnessOnA, wWitnessOnB, penDepth, v );
if ( needsEPA ) if ( needsEPA )
{ {
#endif #endif
penDepth = EpaPenDepth( simplexSolver, pConvexA, pConvexB, penDepth = EpaPenDepth( simplexSolver, pConvexA, pConvexB,
transformA, transformB, transformA, transformB,
wWitnessOnA, wWitnessOnB ); wWitnessOnA, wWitnessOnB );
assert( ( penDepth > 0 ) && "EPA or Hybrid Technique failed to calculate penetration depth!" ); assert( ( penDepth > 0 ) && "EPA or Hybrid Technique failed to calculate penetration depth!" );
#ifdef EPA_USE_HYBRID #ifdef EPA_USE_HYBRID
} }
#endif #endif
return ( penDepth > 0 ); return ( penDepth > 0 );
} }
#ifdef EPA_USE_HYBRID #ifdef EPA_USE_HYBRID
bool EpaPenetrationDepthSolver::HybridPenDepth( SimplexSolverInterface& simplexSolver, bool EpaPenetrationDepthSolver::HybridPenDepth( SimplexSolverInterface& simplexSolver,
ConvexShape* pConvexA, ConvexShape* pConvexB, ConvexShape* pConvexA, ConvexShape* pConvexB,
const SimdTransform& transformA, const SimdTransform& transformB, const SimdTransform& transformA, const SimdTransform& transformB,
SimdPoint3& wWitnessOnA, SimdPoint3& wWitnessOnB, SimdPoint3& wWitnessOnA, SimdPoint3& wWitnessOnB,
SimdScalar& penDepth, SimdVector3& v ) SimdScalar& penDepth, SimdVector3& v )
{ {
SimdScalar squaredDistance = SIMD_INFINITY; SimdScalar squaredDistance = SIMD_INFINITY;
SimdScalar delta = 0.f; SimdScalar delta = 0.f;
const SimdScalar margin = pConvexA->GetMargin() + pConvexB->GetMargin(); const SimdScalar margin = pConvexA->GetMargin() + pConvexB->GetMargin();
const SimdScalar marginSqrd = margin * margin; const SimdScalar marginSqrd = margin * margin;
simplexSolver.reset(); simplexSolver.reset();
int nbIterations = 0; int nbIterations = 0;
while ( true ) while ( true )
{ {
assert( ( v.length2() > 0 ) && "Warning: v is the zero vector!" ); assert( ( v.length2() > 0 ) && "Warning: v is the zero vector!" );
SimdVector3 seperatingAxisInA = -v * transformA.getBasis(); SimdVector3 seperatingAxisInA = -v * transformA.getBasis();
SimdVector3 seperatingAxisInB = v * transformB.getBasis(); SimdVector3 seperatingAxisInB = v * transformB.getBasis();
SimdVector3 pInA = pConvexA->LocalGetSupportingVertexWithoutMargin( seperatingAxisInA ); SimdVector3 pInA = pConvexA->LocalGetSupportingVertexWithoutMargin( seperatingAxisInA );
SimdVector3 qInB = pConvexB->LocalGetSupportingVertexWithoutMargin( seperatingAxisInB ); SimdVector3 qInB = pConvexB->LocalGetSupportingVertexWithoutMargin( seperatingAxisInB );
SimdPoint3 pWorld = transformA( pInA ); SimdPoint3 pWorld = transformA( pInA );
SimdPoint3 qWorld = transformB( qInB ); SimdPoint3 qWorld = transformB( qInB );
SimdVector3 w = pWorld - qWorld; SimdVector3 w = pWorld - qWorld;
delta = v.dot( w ); delta = v.dot( w );
// potential exit, they don't overlap // potential exit, they don't overlap
if ( ( delta > 0 ) && ( ( delta * delta / squaredDistance ) > marginSqrd ) ) if ( ( delta > 0 ) && ( ( delta * delta / squaredDistance ) > marginSqrd ) )
{ {
// Convex shapes do not overlap // Convex shapes do not overlap
// Returning true means that Hybrid's result is ok and there's no need to run EPA // Returning true means that Hybrid's result is ok and there's no need to run EPA
penDepth = 0; penDepth = 0;
return true; return true;
} }
//exit 0: the new point is already in the simplex, or we didn't come any closer //exit 0: the new point is already in the simplex, or we didn't come any closer
if ( ( squaredDistance - delta <= squaredDistance * g_GJKMaxRelErrorSqrd ) || simplexSolver.inSimplex( w ) ) if ( ( squaredDistance - delta <= squaredDistance * g_GJKMaxRelErrorSqrd ) || simplexSolver.inSimplex( w ) )
{ {
simplexSolver.compute_points( wWitnessOnA, wWitnessOnB ); simplexSolver.compute_points( wWitnessOnA, wWitnessOnB );
assert( ( squaredDistance > 0 ) && "squaredDistance is zero!" ); assert( ( squaredDistance > 0 ) && "squaredDistance is zero!" );
SimdScalar vLength = sqrt( squaredDistance ); SimdScalar vLength = sqrt( squaredDistance );
wWitnessOnA -= v * ( pConvexA->GetMargin() / vLength ); wWitnessOnA -= v * ( pConvexA->GetMargin() / vLength );
wWitnessOnB += v * ( pConvexB->GetMargin() / vLength ); wWitnessOnB += v * ( pConvexB->GetMargin() / vLength );
penDepth = pConvexA->GetMargin() + pConvexB->GetMargin() - vLength; penDepth = pConvexA->GetMargin() + pConvexB->GetMargin() - vLength;
// Returning true means that Hybrid's result is ok and there's no need to run EPA // Returning true means that Hybrid's result is ok and there's no need to run EPA
return true; return true;
} }
//add current vertex to simplex //add current vertex to simplex
simplexSolver.addVertex( w, pWorld, qWorld ); simplexSolver.addVertex( w, pWorld, qWorld );
//calculate the closest point to the origin (update vector v) //calculate the closest point to the origin (update vector v)
if ( !simplexSolver.closest( v ) ) if ( !simplexSolver.closest( v ) )
{ {
simplexSolver.compute_points( wWitnessOnA, wWitnessOnB ); simplexSolver.compute_points( wWitnessOnA, wWitnessOnB );
assert( ( squaredDistance > 0 ) && "squaredDistance is zero!" ); assert( ( squaredDistance > 0 ) && "squaredDistance is zero!" );
SimdScalar vLength = sqrt( squaredDistance ); SimdScalar vLength = sqrt( squaredDistance );
wWitnessOnA -= v * ( pConvexA->GetMargin() / vLength ); wWitnessOnA -= v * ( pConvexA->GetMargin() / vLength );
wWitnessOnB += v * ( pConvexB->GetMargin() / vLength ); wWitnessOnB += v * ( pConvexB->GetMargin() / vLength );
penDepth = pConvexA->GetMargin() + pConvexB->GetMargin() - vLength; penDepth = pConvexA->GetMargin() + pConvexB->GetMargin() - vLength;
// Returning true means that Hybrid's result is ok and there's no need to run EPA // Returning true means that Hybrid's result is ok and there's no need to run EPA
return true; return true;
} }
SimdScalar previousSquaredDistance = squaredDistance; SimdScalar previousSquaredDistance = squaredDistance;
squaredDistance = v.length2(); squaredDistance = v.length2();
//are we getting any closer ? //are we getting any closer ?
if ( previousSquaredDistance - squaredDistance <= SIMD_EPSILON * previousSquaredDistance ) if ( previousSquaredDistance - squaredDistance <= SIMD_EPSILON * previousSquaredDistance )
{ {
simplexSolver.backup_closest( v ); simplexSolver.backup_closest( v );
squaredDistance = v.length2(); squaredDistance = v.length2();
simplexSolver.compute_points( wWitnessOnA, wWitnessOnB ); simplexSolver.compute_points( wWitnessOnA, wWitnessOnB );
assert( ( squaredDistance > 0 ) && "squaredDistance is zero!" ); assert( ( squaredDistance > 0 ) && "squaredDistance is zero!" );
SimdScalar vLength = sqrt( squaredDistance ); SimdScalar vLength = sqrt( squaredDistance );
wWitnessOnA -= v * ( pConvexA->GetMargin() / vLength ); wWitnessOnA -= v * ( pConvexA->GetMargin() / vLength );
wWitnessOnB += v * ( pConvexB->GetMargin() / vLength ); wWitnessOnB += v * ( pConvexB->GetMargin() / vLength );
penDepth = pConvexA->GetMargin() + pConvexB->GetMargin() - vLength; penDepth = pConvexA->GetMargin() + pConvexB->GetMargin() - vLength;
// Returning true means that Hybrid's result is ok and there's no need to run EPA // Returning true means that Hybrid's result is ok and there's no need to run EPA
return true; return true;
} }
if ( simplexSolver.fullSimplex() || ( squaredDistance <= SIMD_EPSILON * simplexSolver.maxVertex() ) ) if ( simplexSolver.fullSimplex() || ( squaredDistance <= SIMD_EPSILON * simplexSolver.maxVertex() ) )
{ {
// Convex Shapes intersect - we need to run EPA // Convex Shapes intersect - we need to run EPA
// Returning false means that Hybrid couldn't do anything for us // Returning false means that Hybrid couldn't do anything for us
// and that we need to run EPA to calculate the pen depth // and that we need to run EPA to calculate the pen depth
return false; return false;
} }
++nbIterations; ++nbIterations;
} }
} }
#endif #endif
SimdScalar EpaPenetrationDepthSolver::EpaPenDepth( SimplexSolverInterface& simplexSolver, SimdScalar EpaPenetrationDepthSolver::EpaPenDepth( SimplexSolverInterface& simplexSolver,
ConvexShape* pConvexA, ConvexShape* pConvexB, ConvexShape* pConvexA, ConvexShape* pConvexB,
const SimdTransform& transformA, const SimdTransform& transformB, const SimdTransform& transformA, const SimdTransform& transformB,
SimdPoint3& wWitnessOnA, SimdPoint3& wWitnessOnB ) SimdPoint3& wWitnessOnA, SimdPoint3& wWitnessOnB )
{ {
Epa epa( pConvexA, pConvexB, transformA, transformB ); Epa epa( pConvexA, pConvexB, transformA, transformB );
if ( !epa.Initialize( simplexSolver ) ) if ( !epa.Initialize( simplexSolver ) )
{ {
assert( false && "Epa failed to initialize!" ); assert( false && "Epa failed to initialize!" );
return 0; return 0;
} }
return epa.CalcPenDepth( wWitnessOnA, wWitnessOnB ); return epa.CalcPenDepth( wWitnessOnA, wWitnessOnB );
} }

View File

@@ -1,56 +1,56 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
EPA Copyright (c) Ricardo Padrela 2006 EPA Copyright (c) Ricardo Padrela 2006
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef EPA_PENETRATION_DEPTH_H #ifndef EPA_PENETRATION_DEPTH_H
#define EPA_PENETRATION_DEPTH_H #define EPA_PENETRATION_DEPTH_H
/** /**
* EpaPenetrationDepthSolver uses the Expanding Polytope Algorithm to * EpaPenetrationDepthSolver uses the Expanding Polytope Algorithm to
* calculate the penetration depth between two convex shapes. * calculate the penetration depth between two convex shapes.
*/ */
extern SimdScalar g_GJKMaxRelError; extern SimdScalar g_GJKMaxRelError;
extern SimdScalar g_GJKMaxRelErrorSqrd; extern SimdScalar g_GJKMaxRelErrorSqrd;
//! Note : This class is not supposed to be a base class //! Note : This class is not supposed to be a base class
class EpaPenetrationDepthSolver : public ConvexPenetrationDepthSolver class EpaPenetrationDepthSolver : public ConvexPenetrationDepthSolver
{ {
public : public :
bool CalcPenDepth( SimplexSolverInterface& simplexSolver, bool CalcPenDepth( SimplexSolverInterface& simplexSolver,
ConvexShape* pConvexA, ConvexShape* pConvexB, ConvexShape* pConvexA, ConvexShape* pConvexB,
const SimdTransform& transformA, const SimdTransform& transformB, const SimdTransform& transformA, const SimdTransform& transformB,
SimdVector3& v, SimdPoint3& wWitnessOnA, SimdPoint3& wWitnessOnB, SimdVector3& v, SimdPoint3& wWitnessOnA, SimdPoint3& wWitnessOnB,
class IDebugDraw* debugDraw ); class IDebugDraw* debugDraw );
private : private :
#ifdef EPA_USE_HYBRID #ifdef EPA_USE_HYBRID
bool HybridPenDepth( SimplexSolverInterface& simplexSolver, bool HybridPenDepth( SimplexSolverInterface& simplexSolver,
ConvexShape* pConvexA, ConvexShape* pConvexB, ConvexShape* pConvexA, ConvexShape* pConvexB,
const SimdTransform& transformA, const SimdTransform& transformB, const SimdTransform& transformA, const SimdTransform& transformB,
SimdPoint3& wWitnessOnA, SimdPoint3& wWitnessOnB, SimdPoint3& wWitnessOnA, SimdPoint3& wWitnessOnB,
SimdScalar& penDepth, SimdVector3& v ); SimdScalar& penDepth, SimdVector3& v );
#endif #endif
SimdScalar EpaPenDepth( SimplexSolverInterface& simplexSolver, SimdScalar EpaPenDepth( SimplexSolverInterface& simplexSolver,
ConvexShape* pConvexA, ConvexShape* pConvexB, ConvexShape* pConvexA, ConvexShape* pConvexB,
const SimdTransform& transformA, const SimdTransform& transformB, const SimdTransform& transformA, const SimdTransform& transformB,
SimdPoint3& wWitnessOnA, SimdPoint3& wWitnessOnB ); SimdPoint3& wWitnessOnA, SimdPoint3& wWitnessOnB );
}; };
#endif // EPA_PENETRATION_DEPTH_H #endif // EPA_PENETRATION_DEPTH_H

View File

@@ -1,89 +1,89 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
EPA Copyright (c) Ricardo Padrela 2006 EPA Copyright (c) Ricardo Padrela 2006
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef EPA_POLYHEDRON_H #ifndef EPA_POLYHEDRON_H
#define EPA_POLYHEDRON_H #define EPA_POLYHEDRON_H
class EpaFace; class EpaFace;
class EpaVertex; class EpaVertex;
//! Note : This class is not supposed to be a base class //! Note : This class is not supposed to be a base class
class EpaPolyhedron class EpaPolyhedron
{ {
private : private :
//! Prevents copying objects from this class //! Prevents copying objects from this class
EpaPolyhedron( const EpaPolyhedron& epaPolyhedron ); EpaPolyhedron( const EpaPolyhedron& epaPolyhedron );
const EpaPolyhedron& operator = ( const EpaPolyhedron& epaPolyhedron ); const EpaPolyhedron& operator = ( const EpaPolyhedron& epaPolyhedron );
public : public :
EpaPolyhedron(); EpaPolyhedron();
~EpaPolyhedron(); ~EpaPolyhedron();
bool Create( SimdPoint3* pInitialPoints, bool Create( SimdPoint3* pInitialPoints,
SimdPoint3* pSupportPointsOnA, SimdPoint3* pSupportPointsOnB, SimdPoint3* pSupportPointsOnA, SimdPoint3* pSupportPointsOnB,
const int nbInitialPoints ); const int nbInitialPoints );
void Destroy(); void Destroy();
EpaFace* CreateFace(); EpaFace* CreateFace();
EpaHalfEdge* CreateHalfEdge(); EpaHalfEdge* CreateHalfEdge();
EpaVertex* CreateVertex( const SimdPoint3& wSupportPoint, EpaVertex* CreateVertex( const SimdPoint3& wSupportPoint,
const SimdPoint3& wSupportPointOnA, const SimdPoint3& wSupportPointOnA,
const SimdPoint3& wSupportPointOnB ); const SimdPoint3& wSupportPointOnB );
void DeleteFace( EpaFace* pFace ); void DeleteFace( EpaFace* pFace );
void DestroyAllFaces(); void DestroyAllFaces();
void DestroyAllHalfEdges(); void DestroyAllHalfEdges();
void DestroyAllVertices(); void DestroyAllVertices();
bool Expand( const SimdPoint3& wSupportPoint, bool Expand( const SimdPoint3& wSupportPoint,
const SimdPoint3& wSupportPointOnA, const SimdPoint3& wSupportPointOnA,
const SimdPoint3& wSupportPointOnB, const SimdPoint3& wSupportPointOnB,
EpaFace* pFace, std::list< EpaFace* >& newFaces ); EpaFace* pFace, std::list< EpaFace* >& newFaces );
std::list< EpaFace* >& GetFaces(); std::list< EpaFace* >& GetFaces();
int GetNbFaces() const; int GetNbFaces() const;
private : private :
void DeleteVisibleFaces( const SimdPoint3& point, EpaFace* pFace, void DeleteVisibleFaces( const SimdPoint3& point, EpaFace* pFace,
std::list< EpaHalfEdge* >& coneBaseTwinHalfEdges ); std::list< EpaHalfEdge* >& coneBaseTwinHalfEdges );
void CreateCone( EpaVertex* pAppexVertex, std::list< EpaHalfEdge* >& baseTwinHalfEdges, void CreateCone( EpaVertex* pAppexVertex, std::list< EpaHalfEdge* >& baseTwinHalfEdges,
std::list< EpaFace* >& newFaces ); std::list< EpaFace* >& newFaces );
EpaFace* CreateConeFace( EpaVertex* pAppexVertex, EpaHalfEdge* pBaseTwinHalfEdge, EpaFace* CreateConeFace( EpaVertex* pAppexVertex, EpaHalfEdge* pBaseTwinHalfEdge,
std::list< EpaHalfEdge* >& halfEdgesToLink ); std::list< EpaHalfEdge* >& halfEdgesToLink );
#ifdef _DEBUG #ifdef _DEBUG
public : public :
//! Please don't remove this method, it will help debugging if some problems arise in the future //! Please don't remove this method, it will help debugging if some problems arise in the future
bool _dbgSaveToFile( const char* pFileName ); bool _dbgSaveToFile( const char* pFileName );
#endif #endif
private : private :
//! This is the number of valid faces, m_faces list also contain deleted faces //! This is the number of valid faces, m_faces list also contain deleted faces
int m_nbFaces; int m_nbFaces;
std::list< EpaFace* > m_faces; std::list< EpaFace* > m_faces;
std::list< EpaHalfEdge* > m_halfEdges; std::list< EpaHalfEdge* > m_halfEdges;
std::list< EpaVertex* > m_vertices; std::list< EpaVertex* > m_vertices;
}; };
#endif #endif

View File

@@ -1,61 +1,61 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
EPA Copyright (c) Ricardo Padrela 2006 EPA Copyright (c) Ricardo Padrela 2006
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef EPA_VERTEX_H #ifndef EPA_VERTEX_H
#define EPA_VERTEX_H #define EPA_VERTEX_H
class EpaHalfEdge; class EpaHalfEdge;
//! Note : This class is not supposed to be a base class //! Note : This class is not supposed to be a base class
class EpaVertex class EpaVertex
{ {
private : private :
//! Prevents copying objects from this class //! Prevents copying objects from this class
EpaVertex( const EpaVertex& epaVertex ); EpaVertex( const EpaVertex& epaVertex );
const EpaVertex& operator = ( const EpaVertex& epaVertex ); const EpaVertex& operator = ( const EpaVertex& epaVertex );
public : public :
EpaVertex( const SimdPoint3& point ) : /*m_pHalfEdge( 0 ),*/ m_point( point ) EpaVertex( const SimdPoint3& point ) : /*m_pHalfEdge( 0 ),*/ m_point( point )
{ {
} }
EpaVertex( const SimdPoint3& point, EpaVertex( const SimdPoint3& point,
const SimdPoint3& wSupportPointOnA, const SimdPoint3& wSupportPointOnA,
const SimdPoint3& wSupportPointOnB ) : /*m_pHalfEdge( 0 ),*/ m_point( point ), const SimdPoint3& wSupportPointOnB ) : /*m_pHalfEdge( 0 ),*/ m_point( point ),
m_wSupportPointOnA( wSupportPointOnA ), m_wSupportPointOnA( wSupportPointOnA ),
m_wSupportPointOnB( wSupportPointOnB ) m_wSupportPointOnB( wSupportPointOnB )
{ {
} }
~EpaVertex() ~EpaVertex()
{ {
} }
public : public :
//! This is not necessary //! This is not necessary
//EpaHalfEdge* m_pHalfEdge; //EpaHalfEdge* m_pHalfEdge;
SimdPoint3 m_point; SimdPoint3 m_point;
SimdPoint3 m_wSupportPointOnA; SimdPoint3 m_wSupportPointOnA;
SimdPoint3 m_wSupportPointOnB; SimdPoint3 m_wSupportPointOnB;
}; };
#endif #endif

View File

@@ -36,8 +36,7 @@ subject to the following restrictions:
#include "BroadphaseCollision/Dispatcher.h" #include "BroadphaseCollision/Dispatcher.h"
#include "NarrowPhaseCollision/PersistentManifold.h" #include "NarrowPhaseCollision/PersistentManifold.h"
#include "CollisionShapes/TriangleMeshShape.h" #include "CollisionShapes/TriangleMeshShape.h"
#include "ConstraintSolver/OdeConstraintSolver.h" #include "ConstraintSolver/SequentialImpulseConstraintSolver.h"
#include "ConstraintSolver/SimpleConstraintSolver.h"
//profiling/timings //profiling/timings
@@ -325,7 +324,7 @@ static void DrawAabb(IDebugDraw* debugDrawer,const SimdVector3& from,const SimdV
CcdPhysicsEnvironment::CcdPhysicsEnvironment(CollisionDispatcher* dispatcher,BroadphaseInterface* broadphase) CcdPhysicsEnvironment::CcdPhysicsEnvironment(CollisionDispatcher* dispatcher,BroadphaseInterface* broadphase)
:m_scalingPropagated(false), :m_scalingPropagated(false),
m_numIterations(10), m_numIterations(4),
m_numTimeSubSteps(1), m_numTimeSubSteps(1),
m_ccdMode(0), m_ccdMode(0),
m_solverType(-1), m_solverType(-1),
@@ -1034,7 +1033,7 @@ void CcdPhysicsEnvironment::setSolverType(int solverType)
if (m_solverType != solverType) if (m_solverType != solverType)
{ {
m_solver = new SimpleConstraintSolver(); m_solver = new SequentialImpulseConstraintSolver();
break; break;
} }
@@ -1044,7 +1043,7 @@ void CcdPhysicsEnvironment::setSolverType(int solverType)
default: default:
if (m_solverType != solverType) if (m_solverType != solverType)
{ {
m_solver = new OdeConstraintSolver(); // m_solver = new OdeConstraintSolver();
break; break;
} }

View File

@@ -1,265 +1,268 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#include "OdeConstraintSolver.h" #include "OdeConstraintSolver.h"
#include "NarrowPhaseCollision/PersistentManifold.h" #include "NarrowPhaseCollision/PersistentManifold.h"
#include "Dynamics/RigidBody.h" #include "Dynamics/RigidBody.h"
#include "ContactConstraint.h" #include "ContactConstraint.h"
#include "Solve2LinearConstraint.h" #include "Solve2LinearConstraint.h"
#include "ContactSolverInfo.h" #include "ContactSolverInfo.h"
#include "Dynamics/BU_Joint.h" #include "Dynamics/BU_Joint.h"
#include "Dynamics/ContactJoint.h" #include "Dynamics/ContactJoint.h"
#include "IDebugDraw.h" #include "IDebugDraw.h"
#define USE_SOR_SOLVER #define USE_SOR_SOLVER
#include "SorLcp.h" #include "SorLcp.h"
#include <math.h> #include <math.h>
#include <float.h>//FLT_MAX #include <float.h>//FLT_MAX
#ifdef WIN32 #ifdef WIN32
#include <memory.h> #include <memory.h>
#endif #endif
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#if defined (WIN32) #if defined (WIN32)
#include <malloc.h> #include <malloc.h>
#else #else
#if defined (__FreeBSD__) #if defined (__FreeBSD__)
#include <stdlib.h> #include <stdlib.h>
#else #else
#include <alloca.h> #include <alloca.h>
#endif #endif
#endif #endif
class BU_Joint; class BU_Joint;
//see below //see below
OdeConstraintSolver::OdeConstraintSolver(): //to bridge with ODE quickstep, we make a temp copy of the rigidbodies in each simultion island, stored in an array of size MAX_RIGIDBODIES
m_cfm(0.f),//1e-5f), #define MAX_QUICKSTEP_RIGIDBODIES 8192
m_erp(0.4f)
{ OdeConstraintSolver::OdeConstraintSolver():
} m_cfm(0.f),//1e-5f),
m_erp(0.4f)
{
}
//iterative lcp and penalty method
float OdeConstraintSolver::SolveGroup(PersistentManifold** manifoldPtr, int numManifolds,const ContactSolverInfo& infoGlobal,IDebugDraw* debugDrawer)
{
m_CurBody = 0; //iterative lcp and penalty method
m_CurJoint = 0; float OdeConstraintSolver::SolveGroup(PersistentManifold** manifoldPtr, int numManifolds,const ContactSolverInfo& infoGlobal,IDebugDraw* debugDrawer)
{
m_CurBody = 0;
RigidBody* bodies [MAX_RIGIDBODIES]; m_CurJoint = 0;
int numBodies = 0;
BU_Joint* joints [MAX_RIGIDBODIES*4]; RigidBody* bodies [MAX_QUICKSTEP_RIGIDBODIES];
int numJoints = 0;
int numBodies = 0;
for (int j=0;j<numManifolds;j++) BU_Joint* joints [MAX_QUICKSTEP_RIGIDBODIES*4];
{ int numJoints = 0;
int body0=-1,body1=-1; for (int j=0;j<numManifolds;j++)
{
PersistentManifold* manifold = manifoldPtr[j];
if (manifold->GetNumContacts() > 0) int body0=-1,body1=-1;
{
body0 = ConvertBody((RigidBody*)manifold->GetBody0(),bodies,numBodies); PersistentManifold* manifold = manifoldPtr[j];
body1 = ConvertBody((RigidBody*)manifold->GetBody1(),bodies,numBodies); if (manifold->GetNumContacts() > 0)
ConvertConstraint(manifold,joints,numJoints,bodies,body0,body1,debugDrawer); {
} body0 = ConvertBody((RigidBody*)manifold->GetBody0(),bodies,numBodies);
} body1 = ConvertBody((RigidBody*)manifold->GetBody1(),bodies,numBodies);
ConvertConstraint(manifold,joints,numJoints,bodies,body0,body1,debugDrawer);
SolveInternal1(m_cfm,m_erp,bodies,numBodies,joints,numJoints,infoGlobal); }
}
return 0.f;
SolveInternal1(m_cfm,m_erp,bodies,numBodies,joints,numJoints,infoGlobal);
}
return 0.f;
/////////////////////////////////////////////////////////////////////////////////
}
typedef SimdScalar dQuaternion[4]; /////////////////////////////////////////////////////////////////////////////////
#define _R(i,j) R[(i)*4+(j)]
void dRfromQ1 (dMatrix3 R, const dQuaternion q) typedef SimdScalar dQuaternion[4];
{ #define _R(i,j) R[(i)*4+(j)]
// q = (s,vx,vy,vz)
SimdScalar qq1 = 2.f*q[1]*q[1]; void dRfromQ1 (dMatrix3 R, const dQuaternion q)
SimdScalar qq2 = 2.f*q[2]*q[2]; {
SimdScalar qq3 = 2.f*q[3]*q[3]; // q = (s,vx,vy,vz)
_R(0,0) = 1.f - qq2 - qq3; SimdScalar qq1 = 2.f*q[1]*q[1];
_R(0,1) = 2*(q[1]*q[2] - q[0]*q[3]); SimdScalar qq2 = 2.f*q[2]*q[2];
_R(0,2) = 2*(q[1]*q[3] + q[0]*q[2]); SimdScalar qq3 = 2.f*q[3]*q[3];
_R(0,3) = 0.f; _R(0,0) = 1.f - qq2 - qq3;
_R(0,1) = 2*(q[1]*q[2] - q[0]*q[3]);
_R(1,0) = 2*(q[1]*q[2] + q[0]*q[3]); _R(0,2) = 2*(q[1]*q[3] + q[0]*q[2]);
_R(1,1) = 1.f - qq1 - qq3; _R(0,3) = 0.f;
_R(1,2) = 2*(q[2]*q[3] - q[0]*q[1]);
_R(1,3) = 0.f; _R(1,0) = 2*(q[1]*q[2] + q[0]*q[3]);
_R(1,1) = 1.f - qq1 - qq3;
_R(2,0) = 2*(q[1]*q[3] - q[0]*q[2]); _R(1,2) = 2*(q[2]*q[3] - q[0]*q[1]);
_R(2,1) = 2*(q[2]*q[3] + q[0]*q[1]); _R(1,3) = 0.f;
_R(2,2) = 1.f - qq1 - qq2;
_R(2,3) = 0.f; _R(2,0) = 2*(q[1]*q[3] - q[0]*q[2]);
_R(2,1) = 2*(q[2]*q[3] + q[0]*q[1]);
} _R(2,2) = 1.f - qq1 - qq2;
_R(2,3) = 0.f;
}
int OdeConstraintSolver::ConvertBody(RigidBody* body,RigidBody** bodies,int& numBodies)
{
if (!body || (body->getInvMass() == 0.f) )
{ int OdeConstraintSolver::ConvertBody(RigidBody* body,RigidBody** bodies,int& numBodies)
return -1; {
} if (!body || (body->getInvMass() == 0.f) )
//first try to find {
int i,j; return -1;
for (i=0;i<numBodies;i++) }
{ //first try to find
if (bodies[i] == body) int i,j;
return i; for (i=0;i<numBodies;i++)
} {
//if not found, create a new body if (bodies[i] == body)
bodies[numBodies++] = body; return i;
//convert data }
//if not found, create a new body
bodies[numBodies++] = body;
body->m_facc.setValue(0,0,0,0); //convert data
body->m_tacc.setValue(0,0,0,0);
//are the indices the same ? body->m_facc.setValue(0,0,0,0);
for (i=0;i<4;i++) body->m_tacc.setValue(0,0,0,0);
{
for ( j=0;j<3;j++) //are the indices the same ?
{ for (i=0;i<4;i++)
body->m_invI[i+4*j] = 0.f; {
body->m_I[i+4*j] = 0.f; for ( j=0;j<3;j++)
} {
} body->m_invI[i+4*j] = 0.f;
body->m_invI[0+4*0] = body->getInvInertiaDiagLocal()[0]; body->m_I[i+4*j] = 0.f;
body->m_invI[1+4*1] = body->getInvInertiaDiagLocal()[1]; }
body->m_invI[2+4*2] = body->getInvInertiaDiagLocal()[2]; }
body->m_invI[0+4*0] = body->getInvInertiaDiagLocal()[0];
body->m_I[0+0*4] = 1.f/body->getInvInertiaDiagLocal()[0]; body->m_invI[1+4*1] = body->getInvInertiaDiagLocal()[1];
body->m_I[1+1*4] = 1.f/body->getInvInertiaDiagLocal()[1]; body->m_invI[2+4*2] = body->getInvInertiaDiagLocal()[2];
body->m_I[2+2*4] = 1.f/body->getInvInertiaDiagLocal()[2];
body->m_I[0+0*4] = 1.f/body->getInvInertiaDiagLocal()[0];
body->m_I[1+1*4] = 1.f/body->getInvInertiaDiagLocal()[1];
body->m_I[2+2*4] = 1.f/body->getInvInertiaDiagLocal()[2];
dQuaternion q;
q[1] = body->getOrientation()[0];
q[2] = body->getOrientation()[1]; dQuaternion q;
q[3] = body->getOrientation()[2];
q[0] = body->getOrientation()[3]; q[1] = body->getOrientation()[0];
q[2] = body->getOrientation()[1];
dRfromQ1(body->m_R,q); q[3] = body->getOrientation()[2];
q[0] = body->getOrientation()[3];
return numBodies-1;
} dRfromQ1(body->m_R,q);
return numBodies-1;
}
#define MAX_JOINTS_1 8192
static ContactJoint gJointArray[MAX_JOINTS_1];
#define MAX_JOINTS_1 65535
void OdeConstraintSolver::ConvertConstraint(PersistentManifold* manifold,BU_Joint** joints,int& numJoints, static ContactJoint gJointArray[MAX_JOINTS_1];
RigidBody** bodies,int _bodyId0,int _bodyId1,IDebugDraw* debugDrawer)
{
void OdeConstraintSolver::ConvertConstraint(PersistentManifold* manifold,BU_Joint** joints,int& numJoints,
RigidBody** bodies,int _bodyId0,int _bodyId1,IDebugDraw* debugDrawer)
manifold->RefreshContactPoints(((RigidBody*)manifold->GetBody0())->getCenterOfMassTransform(), {
((RigidBody*)manifold->GetBody1())->getCenterOfMassTransform());
int bodyId0 = _bodyId0,bodyId1 = _bodyId1; manifold->RefreshContactPoints(((RigidBody*)manifold->GetBody0())->getCenterOfMassTransform(),
((RigidBody*)manifold->GetBody1())->getCenterOfMassTransform());
int i,numContacts = manifold->GetNumContacts();
int bodyId0 = _bodyId0,bodyId1 = _bodyId1;
bool swapBodies = (bodyId0 < 0);
int i,numContacts = manifold->GetNumContacts();
RigidBody* body0,*body1; bool swapBodies = (bodyId0 < 0);
if (swapBodies)
{ RigidBody* body0,*body1;
bodyId0 = _bodyId1;
bodyId1 = _bodyId0; if (swapBodies)
{
body0 = (RigidBody*)manifold->GetBody1(); bodyId0 = _bodyId1;
body1 = (RigidBody*)manifold->GetBody0(); bodyId1 = _bodyId0;
} else body0 = (RigidBody*)manifold->GetBody1();
{ body1 = (RigidBody*)manifold->GetBody0();
body0 = (RigidBody*)manifold->GetBody0();
body1 = (RigidBody*)manifold->GetBody1(); } else
} {
body0 = (RigidBody*)manifold->GetBody0();
assert(bodyId0 >= 0); body1 = (RigidBody*)manifold->GetBody1();
}
SimdVector3 color(0,1,0);
for (i=0;i<numContacts;i++) assert(bodyId0 >= 0);
{
SimdVector3 color(0,1,0);
if (debugDrawer) for (i=0;i<numContacts;i++)
{ {
const ManifoldPoint& cp = manifold->GetContactPoint(i);
if (debugDrawer)
debugDrawer->DrawContactPoint( {
cp.m_positionWorldOnB, const ManifoldPoint& cp = manifold->GetContactPoint(i);
cp.m_normalWorldOnB,
cp.GetDistance(), debugDrawer->DrawContactPoint(
cp.GetLifeTime(), cp.m_positionWorldOnB,
color); cp.m_normalWorldOnB,
cp.GetDistance(),
} cp.GetLifeTime(),
assert (m_CurJoint < MAX_JOINTS_1); color);
// if (manifold->GetContactPoint(i).GetDistance() < 0.0f) }
{ assert (m_CurJoint < MAX_JOINTS_1);
ContactJoint* cont = new (&gJointArray[m_CurJoint++]) ContactJoint( manifold ,i, swapBodies,body0,body1);
// if (manifold->GetContactPoint(i).GetDistance() < 0.0f)
cont->node[0].joint = cont; {
cont->node[0].body = bodyId0 >= 0 ? bodies[bodyId0] : 0; ContactJoint* cont = new (&gJointArray[m_CurJoint++]) ContactJoint( manifold ,i, swapBodies,body0,body1);
cont->node[1].joint = cont; cont->node[0].joint = cont;
cont->node[1].body = bodyId1 >= 0 ? bodies[bodyId1] : 0; cont->node[0].body = bodyId0 >= 0 ? bodies[bodyId0] : 0;
joints[numJoints++] = cont; cont->node[1].joint = cont;
for (int i=0;i<6;i++) cont->node[1].body = bodyId1 >= 0 ? bodies[bodyId1] : 0;
cont->lambda[i] = 0.f;
joints[numJoints++] = cont;
cont->flags = 0; for (int i=0;i<6;i++)
} cont->lambda[i] = 0.f;
}
cont->flags = 0;
//create a new contact constraint }
}; }
//create a new contact constraint
};

View File

@@ -1,66 +1,66 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty. 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. 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, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: 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. 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. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef ODE_CONSTRAINT_SOLVER_H #ifndef ODE_CONSTRAINT_SOLVER_H
#define ODE_CONSTRAINT_SOLVER_H #define ODE_CONSTRAINT_SOLVER_H
#include "ConstraintSolver.h" #include "ConstraintSolver.h"
class RigidBody; class RigidBody;
class BU_Joint; class BU_Joint;
/// OdeConstraintSolver is one of the available solvers for Bullet dynamics framework /// OdeConstraintSolver is one of the available solvers for Bullet dynamics framework
/// It uses the the unmodified version of quickstep solver from the open dynamics project /// It uses the the unmodified version of quickstep solver from the open dynamics project
class OdeConstraintSolver : public ConstraintSolver class OdeConstraintSolver : public ConstraintSolver
{ {
private: private:
int m_CurBody; int m_CurBody;
int m_CurJoint; int m_CurJoint;
float m_cfm; float m_cfm;
float m_erp; float m_erp;
int ConvertBody(RigidBody* body,RigidBody** bodies,int& numBodies); int ConvertBody(RigidBody* body,RigidBody** bodies,int& numBodies);
void ConvertConstraint(PersistentManifold* manifold,BU_Joint** joints,int& numJoints, void ConvertConstraint(PersistentManifold* manifold,BU_Joint** joints,int& numJoints,
RigidBody** bodies,int _bodyId0,int _bodyId1,IDebugDraw* debugDrawer); RigidBody** bodies,int _bodyId0,int _bodyId1,IDebugDraw* debugDrawer);
public: public:
OdeConstraintSolver(); OdeConstraintSolver();
virtual ~OdeConstraintSolver() {} virtual ~OdeConstraintSolver() {}
virtual float SolveGroup(PersistentManifold** manifold,int numManifolds,const ContactSolverInfo& info,IDebugDraw* debugDrawer = 0); virtual float SolveGroup(PersistentManifold** manifold,int numManifolds,const ContactSolverInfo& info,IDebugDraw* debugDrawer = 0);
///setConstraintForceMixing, the cfm adds some positive value to the main diagonal ///setConstraintForceMixing, the cfm adds some positive value to the main diagonal
///This can improve convergence (make matrix positive semidefinite), but it can make the simulation look more 'springy' ///This can improve convergence (make matrix positive semidefinite), but it can make the simulation look more 'springy'
void setConstraintForceMixing(float cfm) { void setConstraintForceMixing(float cfm) {
m_cfm = cfm; m_cfm = cfm;
} }
///setErrorReductionParamter sets the maximum amount of error reduction ///setErrorReductionParamter sets the maximum amount of error reduction
///which limits energy addition during penetration depth recovery ///which limits energy addition during penetration depth recovery
void setErrorReductionParamter(float erp) void setErrorReductionParamter(float erp)
{ {
m_erp = erp; m_erp = erp;
} }
}; };
#endif //ODE_CONSTRAINT_SOLVER_H #endif //ODE_CONSTRAINT_SOLVER_H

View File

@@ -1,45 +1,45 @@
/************************************************************************* /*************************************************************************
* * * *
* Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. *
* All rights reserved. Email: russ@q12.org Web: www.q12.org * * All rights reserved. Email: russ@q12.org Web: www.q12.org *
* * * *
* This library is free software; you can redistribute it and/or * * This library is free software; you can redistribute it and/or *
* modify it under the terms of EITHER: * * modify it under the terms of EITHER: *
* (1) The GNU Lesser General Public License as published by the Free * * (1) The GNU Lesser General Public License as published by the Free *
* Software Foundation; either version 2.1 of the License, or (at * * Software Foundation; either version 2.1 of the License, or (at *
* your option) any later version. The text of the GNU Lesser * * your option) any later version. The text of the GNU Lesser *
* General Public License is included with this library in the * * General Public License is included with this library in the *
* file LICENSE.TXT. * * file LICENSE.TXT. *
* (2) The BSD-style license that is included with this library in * * (2) The BSD-style license that is included with this library in *
* the file LICENSE-BSD.TXT. * * the file LICENSE-BSD.TXT. *
* * * *
* This library is distributed in the hope that it will be useful, * * This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of * * but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files *
* LICENSE.TXT and LICENSE-BSD.TXT for more details. * * LICENSE.TXT and LICENSE-BSD.TXT for more details. *
* * * *
*************************************************************************/ *************************************************************************/
#define USE_SOR_SOLVER #define USE_SOR_SOLVER
#ifdef USE_SOR_SOLVER #ifdef USE_SOR_SOLVER
#ifndef SOR_LCP_H #ifndef SOR_LCP_H
#define SOR_LCP_H #define SOR_LCP_H
class RigidBody; class RigidBody;
class BU_Joint; class BU_Joint;
#include "SimdScalar.h" #include "SimdScalar.h"
struct ContactSolverInfo; struct ContactSolverInfo;
void SolveInternal1 (float global_cfm, void SolveInternal1 (float global_cfm,
float global_erp, float global_erp,
RigidBody * const *body, int nb, RigidBody * const *body, int nb,
BU_Joint * const *_joint, int nj, const ContactSolverInfo& info); BU_Joint * const *_joint, int nj, const ContactSolverInfo& info);
int dRandInt2 (int n); int dRandInt2 (int n);
#endif //SOR_LCP_H #endif //SOR_LCP_H
#endif //USE_SOR_SOLVER #endif //USE_SOR_SOLVER

View File

@@ -1,15 +1,17 @@
<?xml version="1.0" encoding = "Windows-1252"?> <?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="8.00" Version="8.00"
Name="libbullet" Name="libbullet"
ProjectGUID="{90F5975E-550B-EEC8-9A8A-B8581D3FCF97}" ProjectGUID="{90F5975E-550B-EEC8-9A8A-B8581D3FCF97}"
SccProjectName="" >
SccLocalPath="">
<Platforms> <Platforms>
<Platform <Platform
Name="Win32"/> Name="Win32"
/>
</Platforms> </Platforms>
<ToolFiles>
</ToolFiles>
<Configurations> <Configurations>
<Configuration <Configuration
Name="Release|Win32" Name="Release|Win32"
@@ -17,73 +19,82 @@
IntermediateDirectory="..\..\out\release8\build\libbullet\" IntermediateDirectory="..\..\out\release8\build\libbullet\"
ConfigurationType="4" ConfigurationType="4"
UseOfMFC="0" UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"> ATLMinimizesCRunTimeLibraryUsage="false"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG;_LIB;_WINDOWS"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName="..\..\out\release8\build\libbullet\libbullet.tlb"
/>
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="2"
StringPooling="TRUE"
EnableFunctionLevelLinking="TRUE"
RuntimeLibrary="0"
DebugInformationFormat="3"
BufferSecurityCheck="FALSE"
PreprocessorDefinitions="NDEBUG;_LIB;_WINDOWS;WIN32"
OptimizeForProcessor="1"
ExceptionHandling="0"
AdditionalOptions=" " AdditionalOptions=" "
Optimization="2"
AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath" AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath"
PreprocessorDefinitions="NDEBUG;_LIB;_WINDOWS;WIN32"
StringPooling="true"
ExceptionHandling="0"
RuntimeLibrary="0"
BufferSecurityCheck="false"
EnableFunctionLevelLinking="true"
TreatWChar_tAsBuiltInType="false"
PrecompiledHeaderFile="..\..\out\release8\build\libbullet\libbullet.pch" PrecompiledHeaderFile="..\..\out\release8\build\libbullet\libbullet.pch"
AssemblerListingLocation="..\..\out\release8\build\libbullet\" AssemblerListingLocation="..\..\out\release8\build\libbullet\"
ObjectFile="..\..\out\release8\build\libbullet\" ObjectFile="..\..\out\release8\build\libbullet\"
ProgramDataBaseFileName="..\..\out\release8\build\libbullet\bullet.pdb" ProgramDataBaseFileName="..\..\out\release8\build\libbullet\bullet.pdb"
WarningLevel="3" WarningLevel="3"
SuppressStartupBanner="TRUE" SuppressStartupBanner="true"
Detect64BitPortabilityProblems="TRUE" Detect64BitPortabilityProblems="true"
TreatWChar_tAsBuiltInType="false" DebugInformationFormat="3"
CompileAs="0"/> CompileAs="0"
/>
<Tool <Tool
Name="VCCustomBuildTool"/> Name="VCManagedResourceCompilerTool"
<Tool />
Name="VCLinkerTool"
LinkIncremental="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
GenerateDebugInformation="TRUE"
IgnoreDefaultLibraryNames="LIBC,LIBCD"
AdditionalOptions=" "
AdditionalDependencies=""
IgnoreImportLibrary="TRUE"
SuppressStartupBanner="TRUE"
GenerateManifest="false"
AdditionalLibraryDirectories=""
ProgramDatabaseFile="..\..\out\release8\build\libbullet\bullet.pdb"
TargetMachine="1"/>
<Tool
Name="VCLibrarianTool"
OutputFile="..\..\out\release8\libs\libbullet.lib"
SuppressStartupBanner="TRUE"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG;_LIB;_WINDOWS"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName="..\..\out\release8\build\libbullet\libbullet.tlb"/>
<Tool
Name="VCPostBuildEventTool"
/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG;_LIB;_WINDOWS;PROJECTGEN_VERSION=8" PreprocessorDefinitions="NDEBUG;_LIB;_WINDOWS;PROJECTGEN_VERSION=8"
Culture="1033"
AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath" AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath"
Culture="1033"/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool"/> Name="VCPreLinkEventTool"
/>
<Tool <Tool
Name="VCWebDeploymentTool"/> Name="VCLibrarianTool"
OutputFile="..\..\out\release8\libs\libbullet.lib"
SuppressStartupBanner="true"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration> </Configuration>
<Configuration <Configuration
Name="Debug|Win32" Name="Debug|Win32"
@@ -91,471 +102,554 @@
IntermediateDirectory="..\..\out\debug8\build\libbullet\" IntermediateDirectory="..\..\out\debug8\build\libbullet\"
ConfigurationType="4" ConfigurationType="4"
UseOfMFC="0" UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"> ATLMinimizesCRunTimeLibraryUsage="false"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG;_LIB;_WINDOWS"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName="..\..\out\debug8\build\libbullet\libbullet.tlb"
/>
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0"
MinimalRebuild="TRUE"
DebugInformationFormat="4"
RuntimeTypeInfo="FALSE"
RuntimeLibrary="1"
PreprocessorDefinitions="_DEBUG;_LIB;_WINDOWS;WIN32"
OptimizeForProcessor="1"
ExceptionHandling="0"
AdditionalOptions=" " AdditionalOptions=" "
Optimization="0"
AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath" AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath"
PreprocessorDefinitions="_DEBUG;_LIB;_WINDOWS;WIN32"
MinimalRebuild="true"
ExceptionHandling="0"
RuntimeLibrary="1"
TreatWChar_tAsBuiltInType="false"
RuntimeTypeInfo="false"
PrecompiledHeaderFile="..\..\out\debug8\build\libbullet\libbullet.pch" PrecompiledHeaderFile="..\..\out\debug8\build\libbullet\libbullet.pch"
AssemblerListingLocation="..\..\out\debug8\build\libbullet\" AssemblerListingLocation="..\..\out\debug8\build\libbullet\"
ObjectFile="..\..\out\debug8\build\libbullet\" ObjectFile="..\..\out\debug8\build\libbullet\"
ProgramDataBaseFileName="..\..\out\debug8\build\libbullet\bullet.pdb" ProgramDataBaseFileName="..\..\out\debug8\build\libbullet\bullet.pdb"
WarningLevel="3" WarningLevel="3"
SuppressStartupBanner="TRUE" SuppressStartupBanner="true"
Detect64BitPortabilityProblems="TRUE" Detect64BitPortabilityProblems="true"
TreatWChar_tAsBuiltInType="false" DebugInformationFormat="4"
CompileAs="0"/> CompileAs="0"
/>
<Tool <Tool
Name="VCCustomBuildTool"/> Name="VCManagedResourceCompilerTool"
<Tool />
Name="VCLinkerTool"
LinkIncremental="2"
GenerateDebugInformation="TRUE"
IgnoreDefaultLibraryNames="LIBC,LIBCD"
AdditionalOptions=" "
AdditionalDependencies=""
IgnoreImportLibrary="TRUE"
SuppressStartupBanner="TRUE"
GenerateManifest="false"
AdditionalLibraryDirectories=""
ProgramDatabaseFile="..\..\out\debug8\build\libbullet\bullet.pdb"
TargetMachine="1"/>
<Tool
Name="VCLibrarianTool"
OutputFile="..\..\out\debug8\libs\libbullet_d.lib"
SuppressStartupBanner="TRUE"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG;_LIB;_WINDOWS"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName="..\..\out\debug8\build\libbullet\libbullet.tlb"/>
<Tool
Name="VCPostBuildEventTool"
/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG;_LIB;_WINDOWS;PROJECTGEN_VERSION=8" PreprocessorDefinitions="_DEBUG;_LIB;_WINDOWS;PROJECTGEN_VERSION=8"
Culture="1033"
AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath" AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath"
Culture="1033"/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool"/> Name="VCPreLinkEventTool"
/>
<Tool <Tool
Name="VCWebDeploymentTool"/> Name="VCLibrarianTool"
OutputFile="..\..\out\debug8\libs\libbullet_d.lib"
SuppressStartupBanner="true"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration> </Configuration>
</Configurations> </Configurations>
<References>
</References>
<Files> <Files>
<Filter <Filter
Name="Source Files" Name="Source Files"
Filter=""> >
<File <File
RelativePath="..\..\Bullet\BroadphaseCollision\AxisSweep3.cpp"> RelativePath="..\..\Bullet\BroadphaseCollision\AxisSweep3.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\BroadphaseCollision\BroadphaseProxy.cpp"> RelativePath="..\..\Bullet\CollisionShapes\BoxShape.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\BroadphaseCollision\CollisionAlgorithm.cpp"> RelativePath="..\..\Bullet\BroadphaseCollision\BroadphaseProxy.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\BroadphaseCollision\Dispatcher.cpp"> RelativePath="..\..\Bullet\CollisionShapes\BvhTriangleMeshShape.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\BroadphaseCollision\SimpleBroadphase.cpp"> RelativePath="..\..\Bullet\BroadphaseCollision\CollisionAlgorithm.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionDispatch\CollisionDispatcher.cpp"> RelativePath="..\..\Bullet\CollisionDispatch\CollisionDispatcher.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionDispatch\CollisionObject.cpp"> RelativePath="..\..\Bullet\CollisionDispatch\CollisionObject.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionDispatch\CollisionWorld.cpp"> RelativePath="..\..\Bullet\CollisionShapes\CollisionShape.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionDispatch\CompoundCollisionAlgorithm.cpp"> RelativePath="..\..\Bullet\CollisionDispatch\CollisionWorld.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionDispatch\ConvexConcaveCollisionAlgorithm.cpp"> RelativePath="..\..\Bullet\CollisionDispatch\CompoundCollisionAlgorithm.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionDispatch\ConvexConvexAlgorithm.cpp"> RelativePath="..\..\Bullet\CollisionShapes\CompoundShape.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionDispatch\EmptyCollisionAlgorithm.cpp"> RelativePath="..\..\Bullet\CollisionShapes\ConeShape.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionDispatch\ManifoldResult.cpp"> RelativePath="..\..\Bullet\NarrowPhaseCollision\ContinuousConvexCollision.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionDispatch\UnionFind.cpp"> RelativePath="..\..\Bullet\NarrowPhaseCollision\ConvexCast.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\BoxShape.cpp"> RelativePath="..\..\Bullet\CollisionDispatch\ConvexConcaveCollisionAlgorithm.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\BvhTriangleMeshShape.cpp"> RelativePath="..\..\Bullet\CollisionDispatch\ConvexConvexAlgorithm.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\CollisionShape.cpp"> RelativePath="..\..\Bullet\CollisionShapes\ConvexHullShape.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\CompoundShape.cpp"> RelativePath="..\..\Bullet\CollisionShapes\ConvexShape.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\ConeShape.cpp"> RelativePath="..\..\Bullet\CollisionShapes\ConvexTriangleMeshShape.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\ConvexHullShape.cpp"> RelativePath="..\..\Bullet\CollisionShapes\CylinderShape.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\ConvexShape.cpp"> RelativePath="..\..\Bullet\BroadphaseCollision\Dispatcher.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\ConvexTriangleMeshShape.cpp"> RelativePath="..\..\Bullet\CollisionDispatch\EmptyCollisionAlgorithm.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\CylinderShape.cpp"> RelativePath="..\..\Bullet\CollisionShapes\EmptyShape.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\EmptyShape.cpp"> RelativePath="..\..\Bullet\NarrowPhaseCollision\GjkConvexCast.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\MinkowskiSumShape.cpp"> RelativePath="..\..\Bullet\NarrowPhaseCollision\GjkPairDetector.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\MultiSphereShape.cpp"> RelativePath="..\..\Bullet\NarrowPhaseCollision\Hull.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\OptimizedBvh.cpp"> RelativePath="..\..\Bullet\NarrowPhaseCollision\ManifoldContactAddResult.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\PolyhedralConvexShape.cpp"> RelativePath="..\..\Bullet\CollisionDispatch\ManifoldResult.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\Simplex1to4Shape.cpp"> RelativePath="..\..\Bullet\NarrowPhaseCollision\MinkowskiPenetrationDepthSolver.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\SphereShape.cpp"> RelativePath="..\..\Bullet\CollisionShapes\MinkowskiSumShape.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\StridingMeshInterface.cpp"> RelativePath="..\..\Bullet\CollisionShapes\MultiSphereShape.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\TriangleCallback.cpp"> RelativePath="..\..\Bullet\CollisionShapes\OptimizedBvh.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\TriangleIndexVertexArray.cpp"> RelativePath="..\..\Bullet\NarrowPhaseCollision\PersistentManifold.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\TriangleMesh.cpp"> RelativePath="..\..\Bullet\CollisionShapes\PolyhedralConvexShape.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\TriangleMeshShape.cpp"> RelativePath="..\..\Bullet\NarrowPhaseCollision\RaycastCallback.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_AlgebraicPolynomialSolver.cpp"> RelativePath="..\..\Bullet\NarrowPhaseCollision\Shape.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_Collidable.cpp"> RelativePath="..\..\Bullet\BroadphaseCollision\SimpleBroadphase.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_CollisionPair.cpp"> RelativePath="..\..\Bullet\CollisionShapes\Simplex1to4Shape.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_EdgeEdge.cpp"> RelativePath="..\..\Bullet\CollisionShapes\SphereShape.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_Screwing.cpp"> RelativePath="..\..\Bullet\CollisionShapes\StridingMeshInterface.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_VertexPoly.cpp"> RelativePath="..\..\Bullet\NarrowPhaseCollision\SubSimplexConvexCast.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\ContinuousConvexCollision.cpp"> RelativePath="..\..\Bullet\CollisionShapes\TriangleCallback.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\ConvexCast.cpp"> RelativePath="..\..\Bullet\CollisionShapes\TriangleIndexVertexArray.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\Epa.cpp"> RelativePath="..\..\Bullet\CollisionShapes\TriangleMesh.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\EpaFace.cpp"> RelativePath="..\..\Bullet\CollisionShapes\TriangleMeshShape.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\EpaPenetrationDepthSolver.cpp"> RelativePath="..\..\Bullet\CollisionDispatch\UnionFind.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\EpaPolyhedron.cpp"> RelativePath="..\..\Bullet\NarrowPhaseCollision\VoronoiSimplexSolver.cpp"
</File> >
<File
RelativePath="..\..\Bullet\NarrowPhaseCollision\GjkConvexCast.cpp">
</File>
<File
RelativePath="..\..\Bullet\NarrowPhaseCollision\GjkPairDetector.cpp">
</File>
<File
RelativePath="..\..\Bullet\NarrowPhaseCollision\Hull.cpp">
</File>
<File
RelativePath="..\..\Bullet\NarrowPhaseCollision\ManifoldContactAddResult.cpp">
</File>
<File
RelativePath="..\..\Bullet\NarrowPhaseCollision\MinkowskiPenetrationDepthSolver.cpp">
</File>
<File
RelativePath="..\..\Bullet\NarrowPhaseCollision\PersistentManifold.cpp">
</File>
<File
RelativePath="..\..\Bullet\NarrowPhaseCollision\RaycastCallback.cpp">
</File>
<File
RelativePath="..\..\Bullet\NarrowPhaseCollision\Shape.cpp">
</File>
<File
RelativePath="..\..\Bullet\NarrowPhaseCollision\SubSimplexConvexCast.cpp">
</File>
<File
RelativePath="..\..\Bullet\NarrowPhaseCollision\VoronoiSimplexSolver.cpp">
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Header Files" Name="Header Files"
Filter=""> >
<File <File
RelativePath="..\..\Bullet\BroadphaseCollision\AxisSweep3.h"> RelativePath="..\..\Bullet\BroadphaseCollision\AxisSweep3.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\BroadphaseCollision\BroadphaseInterface.h"> RelativePath="..\..\Bullet\CollisionShapes\BoxShape.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\BroadphaseCollision\BroadphaseProxy.h"> RelativePath="..\..\Bullet\BroadphaseCollision\BroadphaseInterface.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\BroadphaseCollision\CollisionAlgorithm.h"> RelativePath="..\..\Bullet\BroadphaseCollision\BroadphaseProxy.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\BroadphaseCollision\Dispatcher.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_AlgebraicPolynomialSolver.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\BroadphaseCollision\SimpleBroadphase.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_Collidable.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionDispatch\CollisionDispatcher.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_CollisionPair.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionDispatch\CollisionObject.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_EdgeEdge.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionDispatch\CollisionWorld.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_MotionStateInterface.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionDispatch\CompoundCollisionAlgorithm.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_PolynomialSolverInterface.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionDispatch\ConvexConcaveCollisionAlgorithm.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_Screwing.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionDispatch\ConvexConvexAlgorithm.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_StaticMotionState.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionDispatch\EmptyCollisionAlgorithm.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_VertexPoly.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionDispatch\ManifoldResult.h"> RelativePath="..\..\Bullet\CollisionShapes\BvhTriangleMeshShape.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionDispatch\UnionFind.h"> RelativePath="..\..\Bullet\BroadphaseCollision\CollisionAlgorithm.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\BoxShape.h"> RelativePath="..\..\Bullet\CollisionDispatch\CollisionDispatcher.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\BvhTriangleMeshShape.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\CollisionMargin.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\CollisionMargin.h"> RelativePath="..\..\Bullet\CollisionShapes\CollisionMargin.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\CollisionShape.h"> RelativePath="..\..\Bullet\CollisionDispatch\CollisionObject.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\CompoundShape.h"> RelativePath="..\..\Bullet\CollisionShapes\CollisionShape.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\ConeShape.h"> RelativePath="..\..\Bullet\CollisionDispatch\CollisionWorld.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\ConvexHullShape.h"> RelativePath="..\..\Bullet\CollisionDispatch\CompoundCollisionAlgorithm.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\ConvexShape.h"> RelativePath="..\..\Bullet\CollisionShapes\CompoundShape.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\ConvexTriangleMeshShape.h"> RelativePath="..\..\Bullet\CollisionShapes\ConeShape.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\CylinderShape.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\ContinuousConvexCollision.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\EmptyShape.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\ConvexCast.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\MinkowskiSumShape.h"> RelativePath="..\..\Bullet\CollisionDispatch\ConvexConcaveCollisionAlgorithm.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\MultiSphereShape.h"> RelativePath="..\..\Bullet\CollisionDispatch\ConvexConvexAlgorithm.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\OptimizedBvh.h"> RelativePath="..\..\Bullet\CollisionShapes\ConvexHullShape.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\PolyhedralConvexShape.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\ConvexPenetrationDepthSolver.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\Simplex1to4Shape.h"> RelativePath="..\..\Bullet\CollisionShapes\ConvexShape.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\SphereShape.h"> RelativePath="..\..\Bullet\CollisionShapes\ConvexTriangleMeshShape.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\StridingMeshInterface.h"> RelativePath="..\..\Bullet\CollisionShapes\CylinderShape.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\TriangleCallback.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\DiscreteCollisionDetectorInterface.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\TriangleIndexVertexArray.h"> RelativePath="..\..\Bullet\BroadphaseCollision\Dispatcher.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\TriangleMesh.h"> RelativePath="..\..\Bullet\CollisionDispatch\EmptyCollisionAlgorithm.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\TriangleMeshShape.h"> RelativePath="..\..\Bullet\CollisionShapes\EmptyShape.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\CollisionShapes\TriangleShape.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\GjkConvexCast.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_AlgebraicPolynomialSolver.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\GjkPairDetector.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_Collidable.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\Hull.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_CollisionPair.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\HullContactCollector.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_EdgeEdge.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\ManifoldContactAddResult.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_MotionStateInterface.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\ManifoldPoint.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_PolynomialSolverInterface.h"> RelativePath="..\..\Bullet\CollisionDispatch\ManifoldResult.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_Screwing.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\MinkowskiPenetrationDepthSolver.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_StaticMotionState.h"> RelativePath="..\..\Bullet\CollisionShapes\MinkowskiSumShape.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\BU_VertexPoly.h"> RelativePath="..\..\Bullet\CollisionShapes\MultiSphereShape.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\CollisionMargin.h"> RelativePath="..\..\Bullet\CollisionShapes\OptimizedBvh.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\ContinuousConvexCollision.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\PersistentManifold.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\ConvexCast.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\PointCollector.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\ConvexPenetrationDepthSolver.h"> RelativePath="..\..\Bullet\CollisionShapes\PolyhedralConvexShape.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\DiscreteCollisionDetectorInterface.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\RaycastCallback.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\Epa.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\Shape.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\EpaCommon.h"> RelativePath="..\..\Bullet\BroadphaseCollision\SimpleBroadphase.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\EpaFace.h"> RelativePath="..\..\Bullet\CollisionShapes\Simplex1to4Shape.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\EpaHalfEdge.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\SimplexSolverInterface.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\EpaPenetrationDepthSolver.h"> RelativePath="..\..\Bullet\CollisionShapes\SphereShape.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\EpaPolyhedron.h"> RelativePath="..\..\Bullet\CollisionShapes\StridingMeshInterface.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\EpaVertex.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\SubSimplexConvexCast.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\GjkConvexCast.h"> RelativePath="..\..\Bullet\CollisionShapes\TriangleCallback.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\GjkPairDetector.h"> RelativePath="..\..\Bullet\CollisionShapes\TriangleIndexVertexArray.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\Hull.h"> RelativePath="..\..\Bullet\CollisionShapes\TriangleMesh.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\HullContactCollector.h"> RelativePath="..\..\Bullet\CollisionShapes\TriangleMeshShape.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\ManifoldContactAddResult.h"> RelativePath="..\..\Bullet\CollisionShapes\TriangleShape.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\ManifoldPoint.h"> RelativePath="..\..\Bullet\CollisionDispatch\UnionFind.h"
>
</File> </File>
<File <File
RelativePath="..\..\Bullet\NarrowPhaseCollision\MinkowskiPenetrationDepthSolver.h"> RelativePath="..\..\Bullet\NarrowPhaseCollision\VoronoiSimplexSolver.h"
</File> >
<File
RelativePath="..\..\Bullet\NarrowPhaseCollision\PersistentManifold.h">
</File>
<File
RelativePath="..\..\Bullet\NarrowPhaseCollision\PointCollector.h">
</File>
<File
RelativePath="..\..\Bullet\NarrowPhaseCollision\RaycastCallback.h">
</File>
<File
RelativePath="..\..\Bullet\NarrowPhaseCollision\Shape.h">
</File>
<File
RelativePath="..\..\Bullet\NarrowPhaseCollision\SimplexSolverInterface.h">
</File>
<File
RelativePath="..\..\Bullet\NarrowPhaseCollision\SubSimplexConvexCast.h">
</File>
<File
RelativePath="..\..\Bullet\NarrowPhaseCollision\VoronoiSimplexSolver.h">
</File> </File>
</Filter> </Filter>
<File
RelativePath="..\..\Bullet\BroadphaseCollision\OverlappingPairCache.cpp"
>
</File>
<File
RelativePath="..\..\Bullet\BroadphaseCollision\OverlappingPairCache.h"
>
</File>
</Files> </Files>
<Globals> <Globals>
</Globals> </Globals>

View File

@@ -1,15 +1,17 @@
<?xml version="1.0" encoding = "Windows-1252"?> <?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="8.00" Version="8.00"
Name="libbulletccdphysics" Name="libbulletccdphysics"
ProjectGUID="{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}" ProjectGUID="{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}"
SccProjectName="" >
SccLocalPath="">
<Platforms> <Platforms>
<Platform <Platform
Name="Win32"/> Name="Win32"
/>
</Platforms> </Platforms>
<ToolFiles>
</ToolFiles>
<Configurations> <Configurations>
<Configuration <Configuration
Name="Release|Win32" Name="Release|Win32"
@@ -17,73 +19,82 @@
IntermediateDirectory="..\..\out\release8\build\libbulletccdphysics\" IntermediateDirectory="..\..\out\release8\build\libbulletccdphysics\"
ConfigurationType="4" ConfigurationType="4"
UseOfMFC="0" UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"> ATLMinimizesCRunTimeLibraryUsage="false"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG;_LIB;_WINDOWS"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName="..\..\out\release8\build\libbulletccdphysics\libbulletccdphysics.tlb"
/>
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="2"
StringPooling="TRUE"
EnableFunctionLevelLinking="TRUE"
RuntimeLibrary="0"
DebugInformationFormat="3"
BufferSecurityCheck="FALSE"
PreprocessorDefinitions="NDEBUG;_LIB;_WINDOWS;WIN32"
OptimizeForProcessor="1"
ExceptionHandling="0"
AdditionalOptions=" " AdditionalOptions=" "
Optimization="2"
AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath;..\..\Extras\PhysicsInterface\Common" AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath;..\..\Extras\PhysicsInterface\Common"
PreprocessorDefinitions="NDEBUG;_LIB;_WINDOWS;WIN32"
StringPooling="true"
ExceptionHandling="0"
RuntimeLibrary="0"
BufferSecurityCheck="false"
EnableFunctionLevelLinking="true"
TreatWChar_tAsBuiltInType="false"
PrecompiledHeaderFile="..\..\out\release8\build\libbulletccdphysics\libbulletccdphysics.pch" PrecompiledHeaderFile="..\..\out\release8\build\libbulletccdphysics\libbulletccdphysics.pch"
AssemblerListingLocation="..\..\out\release8\build\libbulletccdphysics\" AssemblerListingLocation="..\..\out\release8\build\libbulletccdphysics\"
ObjectFile="..\..\out\release8\build\libbulletccdphysics\" ObjectFile="..\..\out\release8\build\libbulletccdphysics\"
ProgramDataBaseFileName="..\..\out\release8\build\libbulletccdphysics\bulletccdphysics.pdb" ProgramDataBaseFileName="..\..\out\release8\build\libbulletccdphysics\bulletccdphysics.pdb"
WarningLevel="3" WarningLevel="3"
SuppressStartupBanner="TRUE" SuppressStartupBanner="true"
Detect64BitPortabilityProblems="TRUE" Detect64BitPortabilityProblems="true"
TreatWChar_tAsBuiltInType="false" DebugInformationFormat="3"
CompileAs="0"/> CompileAs="0"
/>
<Tool <Tool
Name="VCCustomBuildTool"/> Name="VCManagedResourceCompilerTool"
<Tool />
Name="VCLinkerTool"
LinkIncremental="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
GenerateDebugInformation="TRUE"
IgnoreDefaultLibraryNames="LIBC,LIBCD"
AdditionalOptions=" "
AdditionalDependencies=""
IgnoreImportLibrary="TRUE"
SuppressStartupBanner="TRUE"
GenerateManifest="false"
AdditionalLibraryDirectories=""
ProgramDatabaseFile="..\..\out\release8\build\libbulletccdphysics\bulletccdphysics.pdb"
TargetMachine="1"/>
<Tool
Name="VCLibrarianTool"
OutputFile="..\..\out\release8\libs\libbulletccdphysics.lib"
SuppressStartupBanner="TRUE"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG;_LIB;_WINDOWS"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName="..\..\out\release8\build\libbulletccdphysics\libbulletccdphysics.tlb"/>
<Tool
Name="VCPostBuildEventTool"
/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG;_LIB;_WINDOWS;PROJECTGEN_VERSION=8" PreprocessorDefinitions="NDEBUG;_LIB;_WINDOWS;PROJECTGEN_VERSION=8"
Culture="1033"
AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath;..\..\Extras\PhysicsInterface\Common" AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath;..\..\Extras\PhysicsInterface\Common"
Culture="1033"/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool"/> Name="VCPreLinkEventTool"
/>
<Tool <Tool
Name="VCWebDeploymentTool"/> Name="VCLibrarianTool"
OutputFile="..\..\out\release8\libs\libbulletccdphysics.lib"
SuppressStartupBanner="true"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration> </Configuration>
<Configuration <Configuration
Name="Debug|Win32" Name="Debug|Win32"
@@ -91,91 +102,116 @@
IntermediateDirectory="..\..\out\debug8\build\libbulletccdphysics\" IntermediateDirectory="..\..\out\debug8\build\libbulletccdphysics\"
ConfigurationType="4" ConfigurationType="4"
UseOfMFC="0" UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"> ATLMinimizesCRunTimeLibraryUsage="false"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG;_LIB;_WINDOWS"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName="..\..\out\debug8\build\libbulletccdphysics\libbulletccdphysics.tlb"
/>
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0"
MinimalRebuild="TRUE"
DebugInformationFormat="4"
RuntimeTypeInfo="FALSE"
RuntimeLibrary="1"
PreprocessorDefinitions="_DEBUG;_LIB;_WINDOWS;WIN32"
OptimizeForProcessor="1"
ExceptionHandling="0"
AdditionalOptions=" " AdditionalOptions=" "
Optimization="0"
AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath;..\..\Extras\PhysicsInterface\Common" AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath;..\..\Extras\PhysicsInterface\Common"
PreprocessorDefinitions="_DEBUG;_LIB;_WINDOWS;WIN32"
MinimalRebuild="true"
ExceptionHandling="0"
RuntimeLibrary="1"
TreatWChar_tAsBuiltInType="false"
RuntimeTypeInfo="false"
PrecompiledHeaderFile="..\..\out\debug8\build\libbulletccdphysics\libbulletccdphysics.pch" PrecompiledHeaderFile="..\..\out\debug8\build\libbulletccdphysics\libbulletccdphysics.pch"
AssemblerListingLocation="..\..\out\debug8\build\libbulletccdphysics\" AssemblerListingLocation="..\..\out\debug8\build\libbulletccdphysics\"
ObjectFile="..\..\out\debug8\build\libbulletccdphysics\" ObjectFile="..\..\out\debug8\build\libbulletccdphysics\"
ProgramDataBaseFileName="..\..\out\debug8\build\libbulletccdphysics\bulletccdphysics.pdb" ProgramDataBaseFileName="..\..\out\debug8\build\libbulletccdphysics\bulletccdphysics.pdb"
WarningLevel="3" WarningLevel="3"
SuppressStartupBanner="TRUE" SuppressStartupBanner="true"
Detect64BitPortabilityProblems="TRUE" Detect64BitPortabilityProblems="true"
TreatWChar_tAsBuiltInType="false" DebugInformationFormat="4"
CompileAs="0"/> CompileAs="0"
/>
<Tool <Tool
Name="VCCustomBuildTool"/> Name="VCManagedResourceCompilerTool"
<Tool />
Name="VCLinkerTool"
LinkIncremental="2"
GenerateDebugInformation="TRUE"
IgnoreDefaultLibraryNames="LIBC,LIBCD"
AdditionalOptions=" "
AdditionalDependencies=""
IgnoreImportLibrary="TRUE"
SuppressStartupBanner="TRUE"
GenerateManifest="false"
AdditionalLibraryDirectories=""
ProgramDatabaseFile="..\..\out\debug8\build\libbulletccdphysics\bulletccdphysics.pdb"
TargetMachine="1"/>
<Tool
Name="VCLibrarianTool"
OutputFile="..\..\out\debug8\libs\libbulletccdphysics_d.lib"
SuppressStartupBanner="TRUE"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG;_LIB;_WINDOWS"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName="..\..\out\debug8\build\libbulletccdphysics\libbulletccdphysics.tlb"/>
<Tool
Name="VCPostBuildEventTool"
/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG;_LIB;_WINDOWS;PROJECTGEN_VERSION=8" PreprocessorDefinitions="_DEBUG;_LIB;_WINDOWS;PROJECTGEN_VERSION=8"
Culture="1033"
AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath;..\..\Extras\PhysicsInterface\Common" AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath;..\..\Extras\PhysicsInterface\Common"
Culture="1033"/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool"/> Name="VCPreLinkEventTool"
/>
<Tool <Tool
Name="VCWebDeploymentTool"/> Name="VCLibrarianTool"
OutputFile="..\..\out\debug8\libs\libbulletccdphysics_d.lib"
SuppressStartupBanner="true"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration> </Configuration>
</Configurations> </Configurations>
<References>
</References>
<Files> <Files>
<Filter <Filter
Name="Source Files" Name="Source Files"
Filter=""> >
<File <File
RelativePath="..\..\Extras\PhysicsInterface\CcdPhysics\CcdPhysicsController.cpp"> RelativePath="..\..\Extras\PhysicsInterface\CcdPhysics\CcdPhysicsController.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\Extras\PhysicsInterface\CcdPhysics\CcdPhysicsEnvironment.cpp"> RelativePath="..\..\Extras\PhysicsInterface\CcdPhysics\CcdPhysicsEnvironment.cpp"
>
</File>
<File
RelativePath="..\..\Extras\PhysicsInterface\CcdPhysics\ParallelPhysicsEnvironment.cpp"
>
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Header Files" Name="Header Files"
Filter=""> >
<File <File
RelativePath="..\..\Extras\PhysicsInterface\CcdPhysics\CcdPhysicsController.h"> RelativePath="..\..\Extras\PhysicsInterface\CcdPhysics\CcdPhysicsController.h"
>
</File> </File>
<File <File
RelativePath="..\..\Extras\PhysicsInterface\CcdPhysics\CcdPhysicsEnvironment.h"> RelativePath="..\..\Extras\PhysicsInterface\CcdPhysics\CcdPhysicsEnvironment.h"
>
</File>
<File
RelativePath="..\..\Extras\PhysicsInterface\CcdPhysics\ParallelPhysicsEnvironment.h"
>
</File> </File>
</Filter> </Filter>
</Files> </Files>

View File

@@ -1,15 +1,17 @@
<?xml version="1.0" encoding = "Windows-1252"?> <?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="8.00" Version="8.00"
Name="libbulletdynamics" Name="libbulletdynamics"
ProjectGUID="{61BD1097-CF2E-B296-DAA9-73A6FE135319}" ProjectGUID="{61BD1097-CF2E-B296-DAA9-73A6FE135319}"
SccProjectName="" >
SccLocalPath="">
<Platforms> <Platforms>
<Platform <Platform
Name="Win32"/> Name="Win32"
/>
</Platforms> </Platforms>
<ToolFiles>
</ToolFiles>
<Configurations> <Configurations>
<Configuration <Configuration
Name="Release|Win32" Name="Release|Win32"
@@ -17,73 +19,82 @@
IntermediateDirectory="..\..\out\release8\build\libbulletdynamics\" IntermediateDirectory="..\..\out\release8\build\libbulletdynamics\"
ConfigurationType="4" ConfigurationType="4"
UseOfMFC="0" UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"> ATLMinimizesCRunTimeLibraryUsage="false"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG;_LIB;_WINDOWS"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName="..\..\out\release8\build\libbulletdynamics\libbulletdynamics.tlb"
/>
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="2"
StringPooling="TRUE"
EnableFunctionLevelLinking="TRUE"
RuntimeLibrary="0"
DebugInformationFormat="3"
BufferSecurityCheck="FALSE"
PreprocessorDefinitions="NDEBUG;_LIB;_WINDOWS;WIN32"
OptimizeForProcessor="1"
ExceptionHandling="0"
AdditionalOptions=" " AdditionalOptions=" "
Optimization="2"
AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath" AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath"
PreprocessorDefinitions="NDEBUG;_LIB;_WINDOWS;WIN32"
StringPooling="true"
ExceptionHandling="0"
RuntimeLibrary="0"
BufferSecurityCheck="false"
EnableFunctionLevelLinking="true"
TreatWChar_tAsBuiltInType="false"
PrecompiledHeaderFile="..\..\out\release8\build\libbulletdynamics\libbulletdynamics.pch" PrecompiledHeaderFile="..\..\out\release8\build\libbulletdynamics\libbulletdynamics.pch"
AssemblerListingLocation="..\..\out\release8\build\libbulletdynamics\" AssemblerListingLocation="..\..\out\release8\build\libbulletdynamics\"
ObjectFile="..\..\out\release8\build\libbulletdynamics\" ObjectFile="..\..\out\release8\build\libbulletdynamics\"
ProgramDataBaseFileName="..\..\out\release8\build\libbulletdynamics\bulletdynamics.pdb" ProgramDataBaseFileName="..\..\out\release8\build\libbulletdynamics\bulletdynamics.pdb"
WarningLevel="3" WarningLevel="3"
SuppressStartupBanner="TRUE" SuppressStartupBanner="true"
Detect64BitPortabilityProblems="TRUE" Detect64BitPortabilityProblems="true"
TreatWChar_tAsBuiltInType="false" DebugInformationFormat="3"
CompileAs="0"/> CompileAs="0"
/>
<Tool <Tool
Name="VCCustomBuildTool"/> Name="VCManagedResourceCompilerTool"
<Tool />
Name="VCLinkerTool"
LinkIncremental="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
GenerateDebugInformation="TRUE"
IgnoreDefaultLibraryNames="LIBC,LIBCD"
AdditionalOptions=" "
AdditionalDependencies=""
IgnoreImportLibrary="TRUE"
SuppressStartupBanner="TRUE"
GenerateManifest="false"
AdditionalLibraryDirectories=""
ProgramDatabaseFile="..\..\out\release8\build\libbulletdynamics\bulletdynamics.pdb"
TargetMachine="1"/>
<Tool
Name="VCLibrarianTool"
OutputFile="..\..\out\release8\libs\libbulletdynamics.lib"
SuppressStartupBanner="TRUE"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG;_LIB;_WINDOWS"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName="..\..\out\release8\build\libbulletdynamics\libbulletdynamics.tlb"/>
<Tool
Name="VCPostBuildEventTool"
/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG;_LIB;_WINDOWS;PROJECTGEN_VERSION=8" PreprocessorDefinitions="NDEBUG;_LIB;_WINDOWS;PROJECTGEN_VERSION=8"
Culture="1033"
AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath" AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath"
Culture="1033"/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool"/> Name="VCPreLinkEventTool"
/>
<Tool <Tool
Name="VCWebDeploymentTool"/> Name="VCLibrarianTool"
OutputFile="..\..\out\release8\libs\libbulletdynamics.lib"
SuppressStartupBanner="true"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration> </Configuration>
<Configuration <Configuration
Name="Debug|Win32" Name="Debug|Win32"
@@ -91,165 +102,202 @@
IntermediateDirectory="..\..\out\debug8\build\libbulletdynamics\" IntermediateDirectory="..\..\out\debug8\build\libbulletdynamics\"
ConfigurationType="4" ConfigurationType="4"
UseOfMFC="0" UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"> ATLMinimizesCRunTimeLibraryUsage="false"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG;_LIB;_WINDOWS"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName="..\..\out\debug8\build\libbulletdynamics\libbulletdynamics.tlb"
/>
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0"
MinimalRebuild="TRUE"
DebugInformationFormat="4"
RuntimeTypeInfo="FALSE"
RuntimeLibrary="1"
PreprocessorDefinitions="_DEBUG;_LIB;_WINDOWS;WIN32"
OptimizeForProcessor="1"
ExceptionHandling="0"
AdditionalOptions=" " AdditionalOptions=" "
Optimization="0"
AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath" AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath"
PreprocessorDefinitions="_DEBUG;_LIB;_WINDOWS;WIN32"
MinimalRebuild="true"
ExceptionHandling="0"
RuntimeLibrary="1"
TreatWChar_tAsBuiltInType="false"
RuntimeTypeInfo="false"
PrecompiledHeaderFile="..\..\out\debug8\build\libbulletdynamics\libbulletdynamics.pch" PrecompiledHeaderFile="..\..\out\debug8\build\libbulletdynamics\libbulletdynamics.pch"
AssemblerListingLocation="..\..\out\debug8\build\libbulletdynamics\" AssemblerListingLocation="..\..\out\debug8\build\libbulletdynamics\"
ObjectFile="..\..\out\debug8\build\libbulletdynamics\" ObjectFile="..\..\out\debug8\build\libbulletdynamics\"
ProgramDataBaseFileName="..\..\out\debug8\build\libbulletdynamics\bulletdynamics.pdb" ProgramDataBaseFileName="..\..\out\debug8\build\libbulletdynamics\bulletdynamics.pdb"
WarningLevel="3" WarningLevel="3"
SuppressStartupBanner="TRUE" SuppressStartupBanner="true"
Detect64BitPortabilityProblems="TRUE" Detect64BitPortabilityProblems="true"
TreatWChar_tAsBuiltInType="false" DebugInformationFormat="4"
CompileAs="0"/> CompileAs="0"
/>
<Tool <Tool
Name="VCCustomBuildTool"/> Name="VCManagedResourceCompilerTool"
<Tool />
Name="VCLinkerTool"
LinkIncremental="2"
GenerateDebugInformation="TRUE"
IgnoreDefaultLibraryNames="LIBC,LIBCD"
AdditionalOptions=" "
AdditionalDependencies=""
IgnoreImportLibrary="TRUE"
SuppressStartupBanner="TRUE"
GenerateManifest="false"
AdditionalLibraryDirectories=""
ProgramDatabaseFile="..\..\out\debug8\build\libbulletdynamics\bulletdynamics.pdb"
TargetMachine="1"/>
<Tool
Name="VCLibrarianTool"
OutputFile="..\..\out\debug8\libs\libbulletdynamics_d.lib"
SuppressStartupBanner="TRUE"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG;_LIB;_WINDOWS"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName="..\..\out\debug8\build\libbulletdynamics\libbulletdynamics.tlb"/>
<Tool
Name="VCPostBuildEventTool"
/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG;_LIB;_WINDOWS;PROJECTGEN_VERSION=8" PreprocessorDefinitions="_DEBUG;_LIB;_WINDOWS;PROJECTGEN_VERSION=8"
Culture="1033"
AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath" AdditionalIncludeDirectories=".;..\..;..\..\Bullet;..\..\BulletDynamics;..\..\LinearMath"
Culture="1033"/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool"/> Name="VCPreLinkEventTool"
/>
<Tool <Tool
Name="VCWebDeploymentTool"/> Name="VCLibrarianTool"
OutputFile="..\..\out\debug8\libs\libbulletdynamics_d.lib"
SuppressStartupBanner="true"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration> </Configuration>
</Configurations> </Configurations>
<References>
</References>
<Files> <Files>
<Filter <Filter
Name="Source Files" Name="Source Files"
Filter=""> >
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\ContactConstraint.cpp"> RelativePath="..\..\BulletDynamics\Dynamics\BU_Joint.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\Generic6DofConstraint.cpp"> RelativePath="..\..\BulletDynamics\ConstraintSolver\ContactConstraint.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\HingeConstraint.cpp"> RelativePath="..\..\BulletDynamics\Dynamics\ContactJoint.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\OdeConstraintSolver.cpp"> RelativePath="..\..\BulletDynamics\ConstraintSolver\Generic6DofConstraint.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\Point2PointConstraint.cpp"> RelativePath="..\..\BulletDynamics\ConstraintSolver\HingeConstraint.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\SimpleConstraintSolver.cpp"> RelativePath="..\..\BulletDynamics\ConstraintSolver\Point2PointConstraint.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\Solve2LinearConstraint.cpp"> RelativePath="..\..\BulletDynamics\Dynamics\RigidBody.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\SorLcp.cpp"> RelativePath="..\..\BulletDynamics\ConstraintSolver\Solve2LinearConstraint.cpp"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\TypedConstraint.cpp"> RelativePath="..\..\BulletDynamics\ConstraintSolver\TypedConstraint.cpp"
</File> >
<File
RelativePath="..\..\BulletDynamics\Dynamics\BU_Joint.cpp">
</File>
<File
RelativePath="..\..\BulletDynamics\Dynamics\ContactJoint.cpp">
</File>
<File
RelativePath="..\..\BulletDynamics\Dynamics\RigidBody.cpp">
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Header Files" Name="Header Files"
Filter=""> >
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\ConstraintSolver.h"> RelativePath="..\..\BulletDynamics\Dynamics\BU_Joint.h"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\ContactConstraint.h"> RelativePath="..\..\BulletDynamics\ConstraintSolver\ConstraintSolver.h"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\ContactSolverInfo.h"> RelativePath="..\..\BulletDynamics\ConstraintSolver\ContactConstraint.h"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\Generic6DofConstraint.h"> RelativePath="..\..\BulletDynamics\Dynamics\ContactJoint.h"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\HingeConstraint.h"> RelativePath="..\..\BulletDynamics\ConstraintSolver\ContactSolverInfo.h"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\JacobianEntry.h"> RelativePath="..\..\BulletDynamics\ConstraintSolver\Generic6DofConstraint.h"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\OdeConstraintSolver.h"> RelativePath="..\..\BulletDynamics\ConstraintSolver\HingeConstraint.h"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\Point2PointConstraint.h"> RelativePath="..\..\BulletDynamics\ConstraintSolver\JacobianEntry.h"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\SimpleConstraintSolver.h"> RelativePath="..\..\BulletDynamics\Dynamics\MassProps.h"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\Solve2LinearConstraint.h"> RelativePath="..\..\BulletDynamics\ConstraintSolver\OdeConstraintSolver.h"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\SorLcp.h"> RelativePath="..\..\BulletDynamics\ConstraintSolver\Point2PointConstraint.h"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\ConstraintSolver\TypedConstraint.h"> RelativePath="..\..\BulletDynamics\Dynamics\RigidBody.h"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\Dynamics\BU_Joint.h"> RelativePath="..\..\BulletDynamics\ConstraintSolver\SimpleConstraintSolver.h"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\Dynamics\ContactJoint.h"> RelativePath="..\..\BulletDynamics\ConstraintSolver\Solve2LinearConstraint.h"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\Dynamics\MassProps.h"> RelativePath="..\..\BulletDynamics\ConstraintSolver\SorLcp.h"
>
</File> </File>
<File <File
RelativePath="..\..\BulletDynamics\Dynamics\RigidBody.h"> RelativePath="..\..\BulletDynamics\ConstraintSolver\TypedConstraint.h"
>
</File> </File>
</Filter> </Filter>
<File
RelativePath="..\..\BulletDynamics\ConstraintSolver\SequentialImpulseConstraintSolver.cpp"
>
</File>
<File
RelativePath="..\..\BulletDynamics\ConstraintSolver\SequentialImpulseConstraintSolver.h"
>
</File>
</Files> </Files>
<Globals> <Globals>
</Globals> </Globals>

View File

@@ -1,34 +1,172 @@
Microsoft Visual Studio Solution File, Format Version 9.00 Microsoft Visual Studio Solution File, Format Version 9.00
# Visual C++ Express 2005 # Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appCcdPhysicsDemo", "appCcdPhysicsDemo.vcproj", "{7284F809-AF30-6315-88C6-86F1C0798760}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appCcdPhysicsDemo", "appCcdPhysicsDemo.vcproj", "{7284F809-AF30-6315-88C6-86F1C0798760}"
ProjectSection(ProjectDependencies) = postProject
{85BCCE3E-992B-B6D7-28F6-CF0A12680822} = {85BCCE3E-992B-B6D7-28F6-CF0A12680822}
{7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3}
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
{61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}
{90F5975E-550B-EEC8-9A8A-B8581D3FCF97} = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97}
EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appColladaDemo", "appColladaDemo.vcproj", "{D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appColladaDemo", "appColladaDemo.vcproj", "{D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}"
ProjectSection(ProjectDependencies) = postProject
{A0958CD9-0E39-4A77-3711-9B488F508FBF} = {A0958CD9-0E39-4A77-3711-9B488F508FBF}
{8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} = {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}
{5E57E40B-B2C3-7595-57AB-A3936FFBD7D4} = {5E57E40B-B2C3-7595-57AB-A3936FFBD7D4}
{85BCCE3E-992B-B6D7-28F6-CF0A12680822} = {85BCCE3E-992B-B6D7-28F6-CF0A12680822}
{7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3}
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
{61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}
{90F5975E-550B-EEC8-9A8A-B8581D3FCF97} = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97}
EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appCollisionDemo", "appCollisionDemo.vcproj", "{E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appCollisionDemo", "appCollisionDemo.vcproj", "{E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}"
ProjectSection(ProjectDependencies) = postProject
{85BCCE3E-992B-B6D7-28F6-CF0A12680822} = {85BCCE3E-992B-B6D7-28F6-CF0A12680822}
{7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3}
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
{61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}
{90F5975E-550B-EEC8-9A8A-B8581D3FCF97} = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97}
EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appCollisionInterfaceDemo", "appCollisionInterfaceDemo.vcproj", "{F38629D2-EEB2-1A09-FB82-52B8A8DE759B}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appCollisionInterfaceDemo", "appCollisionInterfaceDemo.vcproj", "{F38629D2-EEB2-1A09-FB82-52B8A8DE759B}"
ProjectSection(ProjectDependencies) = postProject
{85BCCE3E-992B-B6D7-28F6-CF0A12680822} = {85BCCE3E-992B-B6D7-28F6-CF0A12680822}
{7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3}
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
{61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}
{90F5975E-550B-EEC8-9A8A-B8581D3FCF97} = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97}
EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appConcaveDemo", "appConcaveDemo.vcproj", "{B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appConcaveDemo", "appConcaveDemo.vcproj", "{B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}"
ProjectSection(ProjectDependencies) = postProject
{85BCCE3E-992B-B6D7-28F6-CF0A12680822} = {85BCCE3E-992B-B6D7-28F6-CF0A12680822}
{7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3}
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
{61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}
{90F5975E-550B-EEC8-9A8A-B8581D3FCF97} = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97}
EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appConstraintDemo", "appConstraintDemo.vcproj", "{DAA547D0-0166-C085-0F93-B88CAB800F97}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appConstraintDemo", "appConstraintDemo.vcproj", "{DAA547D0-0166-C085-0F93-B88CAB800F97}"
ProjectSection(ProjectDependencies) = postProject
{85BCCE3E-992B-B6D7-28F6-CF0A12680822} = {85BCCE3E-992B-B6D7-28F6-CF0A12680822}
{7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3}
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
{61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}
{90F5975E-550B-EEC8-9A8A-B8581D3FCF97} = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97}
EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appContinuousConvexCollision", "appContinuousConvexCollision.vcproj", "{801CB6D4-A45C-C9D2-B176-9711A74B9164}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appContinuousConvexCollision", "appContinuousConvexCollision.vcproj", "{801CB6D4-A45C-C9D2-B176-9711A74B9164}"
ProjectSection(ProjectDependencies) = postProject
{85BCCE3E-992B-B6D7-28F6-CF0A12680822} = {85BCCE3E-992B-B6D7-28F6-CF0A12680822}
{7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3}
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
{61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}
{90F5975E-550B-EEC8-9A8A-B8581D3FCF97} = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97}
EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appConvexDecompositionDemo", "appConvexDecompositionDemo.vcproj", "{69C821C7-1E18-D894-068D-C55E063F4859}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appConvexDecompositionDemo", "appConvexDecompositionDemo.vcproj", "{69C821C7-1E18-D894-068D-C55E063F4859}"
EndProject ProjectSection(ProjectDependencies) = postProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appEPAPenDepthDemo", "appEPAPenDepthDemo.vcproj", "{1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}" {A0958CD9-0E39-4A77-3711-9B488F508FBF} = {A0958CD9-0E39-4A77-3711-9B488F508FBF}
{8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} = {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}
{5E57E40B-B2C3-7595-57AB-A3936FFBD7D4} = {5E57E40B-B2C3-7595-57AB-A3936FFBD7D4}
{85BCCE3E-992B-B6D7-28F6-CF0A12680822} = {85BCCE3E-992B-B6D7-28F6-CF0A12680822}
{7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3}
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
{61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}
{90F5975E-550B-EEC8-9A8A-B8581D3FCF97} = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97}
EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appGjkConvexCastDemo", "appGjkConvexCastDemo.vcproj", "{780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appGjkConvexCastDemo", "appGjkConvexCastDemo.vcproj", "{780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}"
ProjectSection(ProjectDependencies) = postProject
{85BCCE3E-992B-B6D7-28F6-CF0A12680822} = {85BCCE3E-992B-B6D7-28F6-CF0A12680822}
{7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3}
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
{61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}
{90F5975E-550B-EEC8-9A8A-B8581D3FCF97} = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97}
EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appRaytracer", "appRaytracer.vcproj", "{60F71B6A-F888-C449-EF49-268BB9F7C963}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appRaytracer", "appRaytracer.vcproj", "{60F71B6A-F888-C449-EF49-268BB9F7C963}"
ProjectSection(ProjectDependencies) = postProject
{85BCCE3E-992B-B6D7-28F6-CF0A12680822} = {85BCCE3E-992B-B6D7-28F6-CF0A12680822}
{7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3}
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
{61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}
{90F5975E-550B-EEC8-9A8A-B8581D3FCF97} = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97}
EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appSimplexDemo", "appSimplexDemo.vcproj", "{60A1DC9D-F837-3923-E9DE-A7925394A578}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appSimplexDemo", "appSimplexDemo.vcproj", "{60A1DC9D-F837-3923-E9DE-A7925394A578}"
ProjectSection(ProjectDependencies) = postProject
{85BCCE3E-992B-B6D7-28F6-CF0A12680822} = {85BCCE3E-992B-B6D7-28F6-CF0A12680822}
{7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3}
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
{61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}
{90F5975E-550B-EEC8-9A8A-B8581D3FCF97} = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97}
EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "grpall_bullet", "grpall_bullet.vcproj", "{6210A080-01C0-6D67-F1DB-669393175402}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "grpall_bullet", "grpall_bullet.vcproj", "{6210A080-01C0-6D67-F1DB-669393175402}"
ProjectSection(ProjectDependencies) = postProject
{A0958CD9-0E39-4A77-3711-9B488F508FBF} = {A0958CD9-0E39-4A77-3711-9B488F508FBF}
{8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} = {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}
{5E57E40B-B2C3-7595-57AB-A3936FFBD7D4} = {5E57E40B-B2C3-7595-57AB-A3936FFBD7D4}
{85BCCE3E-992B-B6D7-28F6-CF0A12680822} = {85BCCE3E-992B-B6D7-28F6-CF0A12680822}
{7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3}
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
{61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}
{90F5975E-550B-EEC8-9A8A-B8581D3FCF97} = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97}
{60A1DC9D-F837-3923-E9DE-A7925394A578} = {60A1DC9D-F837-3923-E9DE-A7925394A578}
{60F71B6A-F888-C449-EF49-268BB9F7C963} = {60F71B6A-F888-C449-EF49-268BB9F7C963}
{780752A8-6322-5D3E-EF42-D0FD8BF9CEA1} = {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}
{69C821C7-1E18-D894-068D-C55E063F4859} = {69C821C7-1E18-D894-068D-C55E063F4859}
{801CB6D4-A45C-C9D2-B176-9711A74B9164} = {801CB6D4-A45C-C9D2-B176-9711A74B9164}
{DAA547D0-0166-C085-0F93-B88CAB800F97} = {DAA547D0-0166-C085-0F93-B88CAB800F97}
{B94C19C6-F6E7-2F60-56E2-E0BA681B74B3} = {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}
{F38629D2-EEB2-1A09-FB82-52B8A8DE759B} = {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}
{E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9} = {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}
{D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF} = {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}
{7284F809-AF30-6315-88C6-86F1C0798760} = {7284F809-AF30-6315-88C6-86F1C0798760}
EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "grpapps_bullet", "grpapps_bullet.vcproj", "{9E59B16D-0924-409C-1611-DF2207A0053F}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "grpapps_bullet", "grpapps_bullet.vcproj", "{9E59B16D-0924-409C-1611-DF2207A0053F}"
ProjectSection(ProjectDependencies) = postProject
{60A1DC9D-F837-3923-E9DE-A7925394A578} = {60A1DC9D-F837-3923-E9DE-A7925394A578}
{60F71B6A-F888-C449-EF49-268BB9F7C963} = {60F71B6A-F888-C449-EF49-268BB9F7C963}
{780752A8-6322-5D3E-EF42-D0FD8BF9CEA1} = {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}
{69C821C7-1E18-D894-068D-C55E063F4859} = {69C821C7-1E18-D894-068D-C55E063F4859}
{801CB6D4-A45C-C9D2-B176-9711A74B9164} = {801CB6D4-A45C-C9D2-B176-9711A74B9164}
{DAA547D0-0166-C085-0F93-B88CAB800F97} = {DAA547D0-0166-C085-0F93-B88CAB800F97}
{B94C19C6-F6E7-2F60-56E2-E0BA681B74B3} = {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}
{F38629D2-EEB2-1A09-FB82-52B8A8DE759B} = {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}
{E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9} = {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}
{D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF} = {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}
{7284F809-AF30-6315-88C6-86F1C0798760} = {7284F809-AF30-6315-88C6-86F1C0798760}
EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "grplibs_bullet", "grplibs_bullet.vcproj", "{DFAF0062-4CD7-9AB8-0683-A6026B326F56}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "grplibs_bullet", "grplibs_bullet.vcproj", "{DFAF0062-4CD7-9AB8-0683-A6026B326F56}"
ProjectSection(ProjectDependencies) = postProject
{A0958CD9-0E39-4A77-3711-9B488F508FBF} = {A0958CD9-0E39-4A77-3711-9B488F508FBF}
{8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} = {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}
{5E57E40B-B2C3-7595-57AB-A3936FFBD7D4} = {5E57E40B-B2C3-7595-57AB-A3936FFBD7D4}
{85BCCE3E-992B-B6D7-28F6-CF0A12680822} = {85BCCE3E-992B-B6D7-28F6-CF0A12680822}
{7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3}
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
{61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}
{90F5975E-550B-EEC8-9A8A-B8581D3FCF97} = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97}
EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbullet", "libbullet.vcproj", "{90F5975E-550B-EEC8-9A8A-B8581D3FCF97}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbullet", "libbullet.vcproj", "{90F5975E-550B-EEC8-9A8A-B8581D3FCF97}"
EndProject EndProject
@@ -49,232 +187,105 @@ EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liblibxml", "liblibxml.vcproj", "{A0958CD9-0E39-4A77-3711-9B488F508FBF}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liblibxml", "liblibxml.vcproj", "{A0958CD9-0E39-4A77-3711-9B488F508FBF}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfiguration) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
ConfigName.0 = Release Debug|Win32 = Debug|Win32
ConfigName.1 = Debug Release|Win32 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(ProjectDependencies) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{7284F809-AF30-6315-88C6-86F1C0798760}.0 = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97} {7284F809-AF30-6315-88C6-86F1C0798760}.Debug|Win32.ActiveCfg = Debug|Win32
{7284F809-AF30-6315-88C6-86F1C0798760}.1 = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} {7284F809-AF30-6315-88C6-86F1C0798760}.Debug|Win32.Build.0 = Debug|Win32
{7284F809-AF30-6315-88C6-86F1C0798760}.2 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} {7284F809-AF30-6315-88C6-86F1C0798760}.Release|Win32.ActiveCfg = Release|Win32
{7284F809-AF30-6315-88C6-86F1C0798760}.3 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} {7284F809-AF30-6315-88C6-86F1C0798760}.Release|Win32.Build.0 = Release|Win32
{7284F809-AF30-6315-88C6-86F1C0798760}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.Debug|Win32.ActiveCfg = Debug|Win32
{7284F809-AF30-6315-88C6-86F1C0798760}.5 = {85BCCE3E-992B-B6D7-28F6-CF0A12680822} {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.Debug|Win32.Build.0 = Debug|Win32
{D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.0 = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97} {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.Release|Win32.ActiveCfg = Release|Win32
{D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.1 = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.Release|Win32.Build.0 = Release|Win32
{D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.2 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.Debug|Win32.ActiveCfg = Debug|Win32
{D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.3 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.Debug|Win32.Build.0 = Debug|Win32
{D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.Release|Win32.ActiveCfg = Release|Win32
{D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.5 = {85BCCE3E-992B-B6D7-28F6-CF0A12680822} {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.Release|Win32.Build.0 = Release|Win32
{D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.6 = {5E57E40B-B2C3-7595-57AB-A3936FFBD7D4} {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.Debug|Win32.ActiveCfg = Debug|Win32
{D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.7 = {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.Debug|Win32.Build.0 = Debug|Win32
{D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.8 = {A0958CD9-0E39-4A77-3711-9B488F508FBF} {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.Release|Win32.ActiveCfg = Release|Win32
{E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.0 = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97} {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.Release|Win32.Build.0 = Release|Win32
{E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.1 = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.Debug|Win32.ActiveCfg = Debug|Win32
{E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.2 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.Debug|Win32.Build.0 = Debug|Win32
{E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.3 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.Release|Win32.ActiveCfg = Release|Win32
{E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.Release|Win32.Build.0 = Release|Win32
{E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.5 = {85BCCE3E-992B-B6D7-28F6-CF0A12680822} {DAA547D0-0166-C085-0F93-B88CAB800F97}.Debug|Win32.ActiveCfg = Debug|Win32
{F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.0 = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97} {DAA547D0-0166-C085-0F93-B88CAB800F97}.Debug|Win32.Build.0 = Debug|Win32
{F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.1 = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} {DAA547D0-0166-C085-0F93-B88CAB800F97}.Release|Win32.ActiveCfg = Release|Win32
{F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.2 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} {DAA547D0-0166-C085-0F93-B88CAB800F97}.Release|Win32.Build.0 = Release|Win32
{F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.3 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} {801CB6D4-A45C-C9D2-B176-9711A74B9164}.Debug|Win32.ActiveCfg = Debug|Win32
{F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} {801CB6D4-A45C-C9D2-B176-9711A74B9164}.Debug|Win32.Build.0 = Debug|Win32
{F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.5 = {85BCCE3E-992B-B6D7-28F6-CF0A12680822} {801CB6D4-A45C-C9D2-B176-9711A74B9164}.Release|Win32.ActiveCfg = Release|Win32
{B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.0 = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97} {801CB6D4-A45C-C9D2-B176-9711A74B9164}.Release|Win32.Build.0 = Release|Win32
{B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.1 = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} {69C821C7-1E18-D894-068D-C55E063F4859}.Debug|Win32.ActiveCfg = Debug|Win32
{B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.2 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} {69C821C7-1E18-D894-068D-C55E063F4859}.Debug|Win32.Build.0 = Debug|Win32
{B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.3 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} {69C821C7-1E18-D894-068D-C55E063F4859}.Release|Win32.ActiveCfg = Release|Win32
{B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} {69C821C7-1E18-D894-068D-C55E063F4859}.Release|Win32.Build.0 = Release|Win32
{B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.5 = {85BCCE3E-992B-B6D7-28F6-CF0A12680822} {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.Debug|Win32.ActiveCfg = Debug|Win32
{DAA547D0-0166-C085-0F93-B88CAB800F97}.0 = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97} {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.Debug|Win32.Build.0 = Debug|Win32
{DAA547D0-0166-C085-0F93-B88CAB800F97}.1 = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.Release|Win32.ActiveCfg = Release|Win32
{DAA547D0-0166-C085-0F93-B88CAB800F97}.2 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.Release|Win32.Build.0 = Release|Win32
{DAA547D0-0166-C085-0F93-B88CAB800F97}.3 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} {60F71B6A-F888-C449-EF49-268BB9F7C963}.Debug|Win32.ActiveCfg = Debug|Win32
{DAA547D0-0166-C085-0F93-B88CAB800F97}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} {60F71B6A-F888-C449-EF49-268BB9F7C963}.Debug|Win32.Build.0 = Debug|Win32
{DAA547D0-0166-C085-0F93-B88CAB800F97}.5 = {85BCCE3E-992B-B6D7-28F6-CF0A12680822} {60F71B6A-F888-C449-EF49-268BB9F7C963}.Release|Win32.ActiveCfg = Release|Win32
{801CB6D4-A45C-C9D2-B176-9711A74B9164}.0 = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97} {60F71B6A-F888-C449-EF49-268BB9F7C963}.Release|Win32.Build.0 = Release|Win32
{801CB6D4-A45C-C9D2-B176-9711A74B9164}.1 = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} {60A1DC9D-F837-3923-E9DE-A7925394A578}.Debug|Win32.ActiveCfg = Debug|Win32
{801CB6D4-A45C-C9D2-B176-9711A74B9164}.2 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} {60A1DC9D-F837-3923-E9DE-A7925394A578}.Debug|Win32.Build.0 = Debug|Win32
{801CB6D4-A45C-C9D2-B176-9711A74B9164}.3 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} {60A1DC9D-F837-3923-E9DE-A7925394A578}.Release|Win32.ActiveCfg = Release|Win32
{801CB6D4-A45C-C9D2-B176-9711A74B9164}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} {60A1DC9D-F837-3923-E9DE-A7925394A578}.Release|Win32.Build.0 = Release|Win32
{801CB6D4-A45C-C9D2-B176-9711A74B9164}.5 = {85BCCE3E-992B-B6D7-28F6-CF0A12680822} {6210A080-01C0-6D67-F1DB-669393175402}.Debug|Win32.ActiveCfg = Debug|Win32
{69C821C7-1E18-D894-068D-C55E063F4859}.0 = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97} {6210A080-01C0-6D67-F1DB-669393175402}.Debug|Win32.Build.0 = Debug|Win32
{69C821C7-1E18-D894-068D-C55E063F4859}.1 = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} {6210A080-01C0-6D67-F1DB-669393175402}.Release|Win32.ActiveCfg = Release|Win32
{69C821C7-1E18-D894-068D-C55E063F4859}.2 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} {6210A080-01C0-6D67-F1DB-669393175402}.Release|Win32.Build.0 = Release|Win32
{69C821C7-1E18-D894-068D-C55E063F4859}.3 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} {9E59B16D-0924-409C-1611-DF2207A0053F}.Debug|Win32.ActiveCfg = Debug|Win32
{69C821C7-1E18-D894-068D-C55E063F4859}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} {9E59B16D-0924-409C-1611-DF2207A0053F}.Debug|Win32.Build.0 = Debug|Win32
{69C821C7-1E18-D894-068D-C55E063F4859}.5 = {85BCCE3E-992B-B6D7-28F6-CF0A12680822} {9E59B16D-0924-409C-1611-DF2207A0053F}.Release|Win32.ActiveCfg = Release|Win32
{69C821C7-1E18-D894-068D-C55E063F4859}.6 = {5E57E40B-B2C3-7595-57AB-A3936FFBD7D4} {9E59B16D-0924-409C-1611-DF2207A0053F}.Release|Win32.Build.0 = Release|Win32
{69C821C7-1E18-D894-068D-C55E063F4859}.7 = {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.Debug|Win32.ActiveCfg = Debug|Win32
{69C821C7-1E18-D894-068D-C55E063F4859}.8 = {A0958CD9-0E39-4A77-3711-9B488F508FBF} {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.Debug|Win32.Build.0 = Debug|Win32
{1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.0 = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97} {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.Release|Win32.ActiveCfg = Release|Win32
{1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.1 = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.Release|Win32.Build.0 = Release|Win32
{1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.2 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} {90F5975E-550B-EEC8-9A8A-B8581D3FCF97}.Debug|Win32.ActiveCfg = Debug|Win32
{1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.3 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} {90F5975E-550B-EEC8-9A8A-B8581D3FCF97}.Debug|Win32.Build.0 = Debug|Win32
{1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} {90F5975E-550B-EEC8-9A8A-B8581D3FCF97}.Release|Win32.ActiveCfg = Release|Win32
{1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.5 = {85BCCE3E-992B-B6D7-28F6-CF0A12680822} {90F5975E-550B-EEC8-9A8A-B8581D3FCF97}.Release|Win32.Build.0 = Release|Win32
{780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.0 = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97} {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}.Debug|Win32.ActiveCfg = Debug|Win32
{780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.1 = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}.Debug|Win32.Build.0 = Debug|Win32
{780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.2 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}.Release|Win32.ActiveCfg = Release|Win32
{780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.3 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}.Release|Win32.Build.0 = Release|Win32
{780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Debug|Win32.ActiveCfg = Debug|Win32
{780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.5 = {85BCCE3E-992B-B6D7-28F6-CF0A12680822} {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Debug|Win32.Build.0 = Debug|Win32
{60F71B6A-F888-C449-EF49-268BB9F7C963}.0 = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97} {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Release|Win32.ActiveCfg = Release|Win32
{60F71B6A-F888-C449-EF49-268BB9F7C963}.1 = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Release|Win32.Build.0 = Release|Win32
{60F71B6A-F888-C449-EF49-268BB9F7C963}.2 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Debug|Win32.ActiveCfg = Debug|Win32
{60F71B6A-F888-C449-EF49-268BB9F7C963}.3 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Debug|Win32.Build.0 = Debug|Win32
{60F71B6A-F888-C449-EF49-268BB9F7C963}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Release|Win32.ActiveCfg = Release|Win32
{60F71B6A-F888-C449-EF49-268BB9F7C963}.5 = {85BCCE3E-992B-B6D7-28F6-CF0A12680822} {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Release|Win32.Build.0 = Release|Win32
{60A1DC9D-F837-3923-E9DE-A7925394A578}.0 = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97} {7C428E76-9271-6284-20F0-9B38ED6931E3}.Debug|Win32.ActiveCfg = Debug|Win32
{60A1DC9D-F837-3923-E9DE-A7925394A578}.1 = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} {7C428E76-9271-6284-20F0-9B38ED6931E3}.Debug|Win32.Build.0 = Debug|Win32
{60A1DC9D-F837-3923-E9DE-A7925394A578}.2 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} {7C428E76-9271-6284-20F0-9B38ED6931E3}.Release|Win32.ActiveCfg = Release|Win32
{60A1DC9D-F837-3923-E9DE-A7925394A578}.3 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} {7C428E76-9271-6284-20F0-9B38ED6931E3}.Release|Win32.Build.0 = Release|Win32
{60A1DC9D-F837-3923-E9DE-A7925394A578}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} {85BCCE3E-992B-B6D7-28F6-CF0A12680822}.Debug|Win32.ActiveCfg = Debug|Win32
{60A1DC9D-F837-3923-E9DE-A7925394A578}.5 = {85BCCE3E-992B-B6D7-28F6-CF0A12680822} {85BCCE3E-992B-B6D7-28F6-CF0A12680822}.Debug|Win32.Build.0 = Debug|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.0 = {7284F809-AF30-6315-88C6-86F1C0798760} {85BCCE3E-992B-B6D7-28F6-CF0A12680822}.Release|Win32.ActiveCfg = Release|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.1 = {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF} {85BCCE3E-992B-B6D7-28F6-CF0A12680822}.Release|Win32.Build.0 = Release|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.2 = {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9} {5E57E40B-B2C3-7595-57AB-A3936FFBD7D4}.Debug|Win32.ActiveCfg = Debug|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.3 = {F38629D2-EEB2-1A09-FB82-52B8A8DE759B} {5E57E40B-B2C3-7595-57AB-A3936FFBD7D4}.Debug|Win32.Build.0 = Debug|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.4 = {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3} {5E57E40B-B2C3-7595-57AB-A3936FFBD7D4}.Release|Win32.ActiveCfg = Release|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.5 = {DAA547D0-0166-C085-0F93-B88CAB800F97} {5E57E40B-B2C3-7595-57AB-A3936FFBD7D4}.Release|Win32.Build.0 = Release|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.6 = {801CB6D4-A45C-C9D2-B176-9711A74B9164} {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.Debug|Win32.ActiveCfg = Debug|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.7 = {69C821C7-1E18-D894-068D-C55E063F4859} {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.Debug|Win32.Build.0 = Debug|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.8 = {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3} {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.Release|Win32.ActiveCfg = Release|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.9 = {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1} {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.Release|Win32.Build.0 = Release|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.10 = {60F71B6A-F888-C449-EF49-268BB9F7C963} {A0958CD9-0E39-4A77-3711-9B488F508FBF}.Debug|Win32.ActiveCfg = Debug|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.11 = {60A1DC9D-F837-3923-E9DE-A7925394A578} {A0958CD9-0E39-4A77-3711-9B488F508FBF}.Debug|Win32.Build.0 = Debug|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.12 = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97} {A0958CD9-0E39-4A77-3711-9B488F508FBF}.Release|Win32.ActiveCfg = Release|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.13 = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E} {A0958CD9-0E39-4A77-3711-9B488F508FBF}.Release|Win32.Build.0 = Release|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.14 = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
{6210A080-01C0-6D67-F1DB-669393175402}.15 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
{6210A080-01C0-6D67-F1DB-669393175402}.16 = {7C428E76-9271-6284-20F0-9B38ED6931E3}
{6210A080-01C0-6D67-F1DB-669393175402}.17 = {85BCCE3E-992B-B6D7-28F6-CF0A12680822}
{6210A080-01C0-6D67-F1DB-669393175402}.18 = {5E57E40B-B2C3-7595-57AB-A3936FFBD7D4}
{6210A080-01C0-6D67-F1DB-669393175402}.19 = {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}
{6210A080-01C0-6D67-F1DB-669393175402}.20 = {A0958CD9-0E39-4A77-3711-9B488F508FBF}
{9E59B16D-0924-409C-1611-DF2207A0053F}.0 = {7284F809-AF30-6315-88C6-86F1C0798760}
{9E59B16D-0924-409C-1611-DF2207A0053F}.1 = {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}
{9E59B16D-0924-409C-1611-DF2207A0053F}.2 = {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}
{9E59B16D-0924-409C-1611-DF2207A0053F}.3 = {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}
{9E59B16D-0924-409C-1611-DF2207A0053F}.4 = {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}
{9E59B16D-0924-409C-1611-DF2207A0053F}.5 = {DAA547D0-0166-C085-0F93-B88CAB800F97}
{9E59B16D-0924-409C-1611-DF2207A0053F}.6 = {801CB6D4-A45C-C9D2-B176-9711A74B9164}
{9E59B16D-0924-409C-1611-DF2207A0053F}.7 = {69C821C7-1E18-D894-068D-C55E063F4859}
{9E59B16D-0924-409C-1611-DF2207A0053F}.8 = {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}
{9E59B16D-0924-409C-1611-DF2207A0053F}.9 = {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}
{9E59B16D-0924-409C-1611-DF2207A0053F}.10 = {60F71B6A-F888-C449-EF49-268BB9F7C963}
{9E59B16D-0924-409C-1611-DF2207A0053F}.11 = {60A1DC9D-F837-3923-E9DE-A7925394A578}
{DFAF0062-4CD7-9AB8-0683-A6026B326F56}.0 = {90F5975E-550B-EEC8-9A8A-B8581D3FCF97}
{DFAF0062-4CD7-9AB8-0683-A6026B326F56}.1 = {C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}
{DFAF0062-4CD7-9AB8-0683-A6026B326F56}.2 = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
{DFAF0062-4CD7-9AB8-0683-A6026B326F56}.3 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
{DFAF0062-4CD7-9AB8-0683-A6026B326F56}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3}
{DFAF0062-4CD7-9AB8-0683-A6026B326F56}.5 = {85BCCE3E-992B-B6D7-28F6-CF0A12680822}
{DFAF0062-4CD7-9AB8-0683-A6026B326F56}.6 = {5E57E40B-B2C3-7595-57AB-A3936FFBD7D4}
{DFAF0062-4CD7-9AB8-0683-A6026B326F56}.7 = {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}
{DFAF0062-4CD7-9AB8-0683-A6026B326F56}.8 = {A0958CD9-0E39-4A77-3711-9B488F508FBF}
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution GlobalSection(SolutionProperties) = preSolution
{7284F809-AF30-6315-88C6-86F1C0798760}.Release.ActiveCfg = Release|Win32 HideSolutionNode = FALSE
{7284F809-AF30-6315-88C6-86F1C0798760}.Release.Build.0 = Release|Win32
{7284F809-AF30-6315-88C6-86F1C0798760}.Debug.ActiveCfg = Debug|Win32
{7284F809-AF30-6315-88C6-86F1C0798760}.Debug.Build.0 = Debug|Win32
{D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.Release.ActiveCfg = Release|Win32
{D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.Release.Build.0 = Release|Win32
{D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.Debug.ActiveCfg = Debug|Win32
{D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.Debug.Build.0 = Debug|Win32
{E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.Release.ActiveCfg = Release|Win32
{E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.Release.Build.0 = Release|Win32
{E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.Debug.ActiveCfg = Debug|Win32
{E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.Debug.Build.0 = Debug|Win32
{F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.Release.ActiveCfg = Release|Win32
{F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.Release.Build.0 = Release|Win32
{F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.Debug.ActiveCfg = Debug|Win32
{F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.Debug.Build.0 = Debug|Win32
{B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.Release.ActiveCfg = Release|Win32
{B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.Release.Build.0 = Release|Win32
{B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.Debug.ActiveCfg = Debug|Win32
{B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.Debug.Build.0 = Debug|Win32
{DAA547D0-0166-C085-0F93-B88CAB800F97}.Release.ActiveCfg = Release|Win32
{DAA547D0-0166-C085-0F93-B88CAB800F97}.Release.Build.0 = Release|Win32
{DAA547D0-0166-C085-0F93-B88CAB800F97}.Debug.ActiveCfg = Debug|Win32
{DAA547D0-0166-C085-0F93-B88CAB800F97}.Debug.Build.0 = Debug|Win32
{801CB6D4-A45C-C9D2-B176-9711A74B9164}.Release.ActiveCfg = Release|Win32
{801CB6D4-A45C-C9D2-B176-9711A74B9164}.Release.Build.0 = Release|Win32
{801CB6D4-A45C-C9D2-B176-9711A74B9164}.Debug.ActiveCfg = Debug|Win32
{801CB6D4-A45C-C9D2-B176-9711A74B9164}.Debug.Build.0 = Debug|Win32
{69C821C7-1E18-D894-068D-C55E063F4859}.Release.ActiveCfg = Release|Win32
{69C821C7-1E18-D894-068D-C55E063F4859}.Release.Build.0 = Release|Win32
{69C821C7-1E18-D894-068D-C55E063F4859}.Debug.ActiveCfg = Debug|Win32
{69C821C7-1E18-D894-068D-C55E063F4859}.Debug.Build.0 = Debug|Win32
{1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.Release.ActiveCfg = Release|Win32
{1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.Release.Build.0 = Release|Win32
{1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.Debug.ActiveCfg = Debug|Win32
{1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.Debug.Build.0 = Debug|Win32
{780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.Release.ActiveCfg = Release|Win32
{780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.Release.Build.0 = Release|Win32
{780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.Debug.ActiveCfg = Debug|Win32
{780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.Debug.Build.0 = Debug|Win32
{60F71B6A-F888-C449-EF49-268BB9F7C963}.Release.ActiveCfg = Release|Win32
{60F71B6A-F888-C449-EF49-268BB9F7C963}.Release.Build.0 = Release|Win32
{60F71B6A-F888-C449-EF49-268BB9F7C963}.Debug.ActiveCfg = Debug|Win32
{60F71B6A-F888-C449-EF49-268BB9F7C963}.Debug.Build.0 = Debug|Win32
{60A1DC9D-F837-3923-E9DE-A7925394A578}.Release.ActiveCfg = Release|Win32
{60A1DC9D-F837-3923-E9DE-A7925394A578}.Release.Build.0 = Release|Win32
{60A1DC9D-F837-3923-E9DE-A7925394A578}.Debug.ActiveCfg = Debug|Win32
{60A1DC9D-F837-3923-E9DE-A7925394A578}.Debug.Build.0 = Debug|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.Release.ActiveCfg = Release|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.Release.Build.0 = Release|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.Debug.ActiveCfg = Debug|Win32
{6210A080-01C0-6D67-F1DB-669393175402}.Debug.Build.0 = Debug|Win32
{9E59B16D-0924-409C-1611-DF2207A0053F}.Release.ActiveCfg = Release|Win32
{9E59B16D-0924-409C-1611-DF2207A0053F}.Release.Build.0 = Release|Win32
{9E59B16D-0924-409C-1611-DF2207A0053F}.Debug.ActiveCfg = Debug|Win32
{9E59B16D-0924-409C-1611-DF2207A0053F}.Debug.Build.0 = Debug|Win32
{DFAF0062-4CD7-9AB8-0683-A6026B326F56}.Release.ActiveCfg = Release|Win32
{DFAF0062-4CD7-9AB8-0683-A6026B326F56}.Release.Build.0 = Release|Win32
{DFAF0062-4CD7-9AB8-0683-A6026B326F56}.Debug.ActiveCfg = Debug|Win32
{DFAF0062-4CD7-9AB8-0683-A6026B326F56}.Debug.Build.0 = Debug|Win32
{90F5975E-550B-EEC8-9A8A-B8581D3FCF97}.Release.ActiveCfg = Release|Win32
{90F5975E-550B-EEC8-9A8A-B8581D3FCF97}.Release.Build.0 = Release|Win32
{90F5975E-550B-EEC8-9A8A-B8581D3FCF97}.Debug.ActiveCfg = Debug|Win32
{90F5975E-550B-EEC8-9A8A-B8581D3FCF97}.Debug.Build.0 = Debug|Win32
{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}.Release.ActiveCfg = Release|Win32
{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}.Release.Build.0 = Release|Win32
{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}.Debug.ActiveCfg = Debug|Win32
{C63CFD5B-23E8-FB4F-79DB-E40F463B0C1E}.Debug.Build.0 = Debug|Win32
{61BD1097-CF2E-B296-DAA9-73A6FE135319}.Release.ActiveCfg = Release|Win32
{61BD1097-CF2E-B296-DAA9-73A6FE135319}.Release.Build.0 = Release|Win32
{61BD1097-CF2E-B296-DAA9-73A6FE135319}.Debug.ActiveCfg = Debug|Win32
{61BD1097-CF2E-B296-DAA9-73A6FE135319}.Debug.Build.0 = Debug|Win32
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Release.ActiveCfg = Release|Win32
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Release.Build.0 = Release|Win32
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Debug.ActiveCfg = Debug|Win32
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Debug.Build.0 = Debug|Win32
{7C428E76-9271-6284-20F0-9B38ED6931E3}.Release.ActiveCfg = Release|Win32
{7C428E76-9271-6284-20F0-9B38ED6931E3}.Release.Build.0 = Release|Win32
{7C428E76-9271-6284-20F0-9B38ED6931E3}.Debug.ActiveCfg = Debug|Win32
{7C428E76-9271-6284-20F0-9B38ED6931E3}.Debug.Build.0 = Debug|Win32
{85BCCE3E-992B-B6D7-28F6-CF0A12680822}.Release.ActiveCfg = Release|Win32
{85BCCE3E-992B-B6D7-28F6-CF0A12680822}.Release.Build.0 = Release|Win32
{85BCCE3E-992B-B6D7-28F6-CF0A12680822}.Debug.ActiveCfg = Debug|Win32
{85BCCE3E-992B-B6D7-28F6-CF0A12680822}.Debug.Build.0 = Debug|Win32
{5E57E40B-B2C3-7595-57AB-A3936FFBD7D4}.Release.ActiveCfg = Release|Win32
{5E57E40B-B2C3-7595-57AB-A3936FFBD7D4}.Release.Build.0 = Release|Win32
{5E57E40B-B2C3-7595-57AB-A3936FFBD7D4}.Debug.ActiveCfg = Debug|Win32
{5E57E40B-B2C3-7595-57AB-A3936FFBD7D4}.Debug.Build.0 = Debug|Win32
{8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.Release.ActiveCfg = Release|Win32
{8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.Release.Build.0 = Release|Win32
{8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.Debug.ActiveCfg = Debug|Win32
{8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.Debug.Build.0 = Debug|Win32
{A0958CD9-0E39-4A77-3711-9B488F508FBF}.Release.ActiveCfg = Release|Win32
{A0958CD9-0E39-4A77-3711-9B488F508FBF}.Release.Build.0 = Release|Win32
{A0958CD9-0E39-4A77-3711-9B488F508FBF}.Debug.ActiveCfg = Debug|Win32
{A0958CD9-0E39-4A77-3711-9B488F508FBF}.Debug.Build.0 = Debug|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal