Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErwin Coumans <blender@erwincoumans.com>2006-04-01 07:30:15 +0400
committerErwin Coumans <blender@erwincoumans.com>2006-04-01 07:30:15 +0400
commit36fd42ac85c40861b960b1f896dff972afc75691 (patch)
treef7c3e52ffa17a022829a4e22d6c67e25f4587f7b
parent63bc0b3847366bc21adc7bfcf5f03e223cf4d8f8 (diff)
more Bullet physics improvements, mainly stability and performance related.
AddObjectActuator has new python method to immediately create objects (this allows to create multiple objects in 1 frame in different positions)
-rw-r--r--extern/bullet/Bullet/BroadphaseCollision/BroadphaseInterface.h2
-rw-r--r--extern/bullet/Bullet/BroadphaseCollision/CollisionAlgorithm.h4
-rw-r--r--extern/bullet/Bullet/BroadphaseCollision/Dispatcher.h4
-rw-r--r--extern/bullet/Bullet/BroadphaseCollision/SimpleBroadphase.cpp8
-rw-r--r--extern/bullet/Bullet/CollisionDispatch/ConvexConcaveCollisionAlgorithm.cpp20
-rw-r--r--extern/bullet/Bullet/CollisionDispatch/ConvexConcaveCollisionAlgorithm.h10
-rw-r--r--extern/bullet/Bullet/CollisionDispatch/ConvexConvexAlgorithm.cpp9
-rw-r--r--extern/bullet/Bullet/CollisionDispatch/ConvexConvexAlgorithm.h4
-rw-r--r--extern/bullet/Bullet/CollisionDispatch/EmptyCollisionAlgorithm.cpp4
-rw-r--r--extern/bullet/Bullet/CollisionDispatch/EmptyCollisionAlgorithm.h4
-rw-r--r--extern/bullet/Bullet/CollisionShapes/ConvexTriangleCallback.cpp2
-rw-r--r--extern/bullet/Bullet/NarrowPhaseCollision/ContinuousConvexCollision.cpp4
-rw-r--r--extern/bullet/Bullet/NarrowPhaseCollision/ConvexPenetrationDepthSolver.h4
-rw-r--r--extern/bullet/Bullet/NarrowPhaseCollision/DiscreteCollisionDetectorInterface.h2
-rw-r--r--extern/bullet/Bullet/NarrowPhaseCollision/GjkConvexCast.cpp4
-rw-r--r--extern/bullet/Bullet/NarrowPhaseCollision/GjkPairDetector.cpp7
-rw-r--r--extern/bullet/Bullet/NarrowPhaseCollision/GjkPairDetector.h2
-rw-r--r--extern/bullet/Bullet/NarrowPhaseCollision/MinkowskiPenetrationDepthSolver.cpp174
-rw-r--r--extern/bullet/Bullet/NarrowPhaseCollision/MinkowskiPenetrationDepthSolver.h4
-rw-r--r--extern/bullet/BulletDynamics/ConstraintSolver/ContactConstraint.cpp27
-rw-r--r--extern/bullet/BulletDynamics/ConstraintSolver/SimpleConstraintSolver.cpp17
-rw-r--r--extern/bullet/BulletDynamics/Dynamics/RigidBody.cpp2
-rw-r--r--extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp3
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.cpp1
-rw-r--r--source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp49
-rw-r--r--source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h4
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp6
27 files changed, 231 insertions, 150 deletions
diff --git a/extern/bullet/Bullet/BroadphaseCollision/BroadphaseInterface.h b/extern/bullet/Bullet/BroadphaseCollision/BroadphaseInterface.h
index d4ac5d0b624..b81815b9764 100644
--- a/extern/bullet/Bullet/BroadphaseCollision/BroadphaseInterface.h
+++ b/extern/bullet/Bullet/BroadphaseCollision/BroadphaseInterface.h
@@ -18,7 +18,7 @@ subject to the following restrictions:
-struct DispatcherInfo;
+struct DispatcherInfo;
class Dispatcher;
struct BroadphaseProxy;
#include "SimdVector3.h"
diff --git a/extern/bullet/Bullet/BroadphaseCollision/CollisionAlgorithm.h b/extern/bullet/Bullet/BroadphaseCollision/CollisionAlgorithm.h
index f4ef0717b4a..9368a16f227 100644
--- a/extern/bullet/Bullet/BroadphaseCollision/CollisionAlgorithm.h
+++ b/extern/bullet/Bullet/BroadphaseCollision/CollisionAlgorithm.h
@@ -57,9 +57,9 @@ public:
virtual ~CollisionAlgorithm() {};
- virtual void ProcessCollision (BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,float timeStep,int stepCount, bool useContinuous) = 0;
+ virtual void ProcessCollision (BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,const struct DispatcherInfo& dispatchInfo) = 0;
- virtual float CalculateTimeOfImpact(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,float timeStep,int stepCount) = 0;
+ virtual float CalculateTimeOfImpact(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,const struct DispatcherInfo& dispatchInfo) = 0;
};
diff --git a/extern/bullet/Bullet/BroadphaseCollision/Dispatcher.h b/extern/bullet/Bullet/BroadphaseCollision/Dispatcher.h
index 6e02556d562..ed556c2e60a 100644
--- a/extern/bullet/Bullet/BroadphaseCollision/Dispatcher.h
+++ b/extern/bullet/Bullet/BroadphaseCollision/Dispatcher.h
@@ -40,7 +40,8 @@ struct DispatcherInfo
DispatcherInfo()
:m_dispatchFunc(DISPATCH_DISCRETE),
m_timeOfImpact(1.f),
- m_useContinuous(false)
+ m_useContinuous(false),
+ m_debugDraw(0)
{
}
@@ -49,6 +50,7 @@ struct DispatcherInfo
int m_dispatchFunc;
float m_timeOfImpact;
bool m_useContinuous;
+ class IDebugDraw* m_debugDraw;
};
diff --git a/extern/bullet/Bullet/BroadphaseCollision/SimpleBroadphase.cpp b/extern/bullet/Bullet/BroadphaseCollision/SimpleBroadphase.cpp
index 4b3d0c0745a..c415b7b997d 100644
--- a/extern/bullet/Bullet/BroadphaseCollision/SimpleBroadphase.cpp
+++ b/extern/bullet/Bullet/BroadphaseCollision/SimpleBroadphase.cpp
@@ -292,10 +292,10 @@ void SimpleBroadphase::DispatchAllCollisionPairs(Dispatcher& dispatcher,Dispatch
{
if (dispatchInfo.m_dispatchFunc == DispatcherInfo::DISPATCH_DISCRETE)
{
- pair.m_algorithms[dispatcherId]->ProcessCollision(pair.m_pProxy0,pair.m_pProxy1,dispatchInfo.m_timeStep,dispatchInfo.m_stepCount,dispatchInfo.m_useContinuous);
+ 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.m_timeStep,dispatchInfo.m_stepCount);
+ float toi = pair.m_algorithms[dispatcherId]->CalculateTimeOfImpact(pair.m_pProxy0,pair.m_pProxy1,dispatchInfo);
if (dispatchInfo.m_timeOfImpact > toi)
dispatchInfo.m_timeOfImpact = toi;
@@ -312,10 +312,10 @@ void SimpleBroadphase::DispatchAllCollisionPairs(Dispatcher& dispatcher,Dispatch
{
if (dispatchInfo.m_dispatchFunc == DispatcherInfo::DISPATCH_DISCRETE)
{
- algo->ProcessCollision(pair.m_pProxy0,pair.m_pProxy1,dispatchInfo.m_timeStep,dispatchInfo.m_stepCount,dispatchInfo.m_useContinuous);
+ algo->ProcessCollision(pair.m_pProxy0,pair.m_pProxy1,dispatchInfo);
} else
{
- float toi = algo->CalculateTimeOfImpact(pair.m_pProxy0,pair.m_pProxy1,dispatchInfo.m_timeStep,dispatchInfo.m_stepCount);
+ float toi = algo->CalculateTimeOfImpact(pair.m_pProxy0,pair.m_pProxy1,dispatchInfo);
if (dispatchInfo.m_timeOfImpact > toi)
dispatchInfo.m_timeOfImpact = toi;
}
diff --git a/extern/bullet/Bullet/CollisionDispatch/ConvexConcaveCollisionAlgorithm.cpp b/extern/bullet/Bullet/CollisionDispatch/ConvexConcaveCollisionAlgorithm.cpp
index bb0bf7abbbd..d600c061638 100644
--- a/extern/bullet/Bullet/CollisionDispatch/ConvexConcaveCollisionAlgorithm.cpp
+++ b/extern/bullet/Bullet/CollisionDispatch/ConvexConcaveCollisionAlgorithm.cpp
@@ -29,6 +29,7 @@ subject to the following restrictions:
ConvexConcaveCollisionAlgorithm::ConvexConcaveCollisionAlgorithm( const CollisionAlgorithmConstructionInfo& ci,BroadphaseProxy* proxy0,BroadphaseProxy* proxy1)
: CollisionAlgorithm(ci),m_convex(*proxy0),m_concave(*proxy1),
m_boxTriangleCallback(ci.m_dispatcher,proxy0,proxy1)
+
{
}
@@ -40,9 +41,7 @@ ConvexConcaveCollisionAlgorithm::~ConvexConcaveCollisionAlgorithm()
BoxTriangleCallback::BoxTriangleCallback(Dispatcher* dispatcher,BroadphaseProxy* proxy0,BroadphaseProxy* proxy1):
m_boxProxy(proxy0),m_triangleProxy(*proxy1),m_dispatcher(dispatcher),
- m_timeStep(0.f),
- m_stepCount(-1),
- m_triangleCount(0)
+ m_dispatchInfoPtr(0)
{
//
@@ -96,7 +95,7 @@ void BoxTriangleCallback::ProcessTriangle(SimdVector3* triangle)
ob->m_collisionShape = &tm;
ConvexConvexAlgorithm cvxcvxalgo(m_manifoldPtr,ci,m_boxProxy,&m_triangleProxy);
- cvxcvxalgo.ProcessCollision(m_boxProxy,&m_triangleProxy,m_timeStep,m_stepCount,m_useContinuous);
+ cvxcvxalgo.ProcessCollision(m_boxProxy,&m_triangleProxy,*m_dispatchInfoPtr);
ob->m_collisionShape = tmpShape;
}
@@ -107,12 +106,9 @@ void BoxTriangleCallback::ProcessTriangle(SimdVector3* triangle)
-void BoxTriangleCallback::SetTimeStepAndCounters(float timeStep,int stepCount,float collisionMarginTriangle,bool useContinuous)
+void BoxTriangleCallback::SetTimeStepAndCounters(float collisionMarginTriangle,const DispatcherInfo& dispatchInfo)
{
- m_triangleCount = 0;
- m_timeStep = timeStep;
- m_stepCount = stepCount;
- m_useContinuous = useContinuous;
+ m_dispatchInfoPtr = &dispatchInfo;
m_collisionMarginTriangle = collisionMarginTriangle;
//recalc aabbs
@@ -142,7 +138,7 @@ void ConvexConcaveCollisionAlgorithm::ClearCache()
}
-void ConvexConcaveCollisionAlgorithm::ProcessCollision (BroadphaseProxy* ,BroadphaseProxy* ,float timeStep,int stepCount,bool useContinuous)
+void ConvexConcaveCollisionAlgorithm::ProcessCollision (BroadphaseProxy* ,BroadphaseProxy* ,const DispatcherInfo& dispatchInfo)
{
CollisionObject* boxBody = static_cast<CollisionObject* >(m_convex.m_clientObject);
@@ -163,7 +159,7 @@ void ConvexConcaveCollisionAlgorithm::ProcessCollision (BroadphaseProxy* ,Broadp
{
float collisionMarginTriangle = triangleMesh->GetMargin();
- m_boxTriangleCallback.SetTimeStepAndCounters(timeStep,stepCount, collisionMarginTriangle,useContinuous);
+ m_boxTriangleCallback.SetTimeStepAndCounters(collisionMarginTriangle,dispatchInfo);
#ifdef USE_BOX_TRIANGLE
m_boxTriangleCallback.m_manifoldPtr->ClearManifold();
#endif
@@ -179,7 +175,7 @@ void ConvexConcaveCollisionAlgorithm::ProcessCollision (BroadphaseProxy* ,Broadp
}
-float ConvexConcaveCollisionAlgorithm::CalculateTimeOfImpact(BroadphaseProxy* ,BroadphaseProxy* ,float timeStep,int stepCount)
+float ConvexConcaveCollisionAlgorithm::CalculateTimeOfImpact(BroadphaseProxy* ,BroadphaseProxy* ,const DispatcherInfo& dispatchInfo)
{
//quick approximation using raycast, todo: use proper continuou collision detection
diff --git a/extern/bullet/Bullet/CollisionDispatch/ConvexConcaveCollisionAlgorithm.h b/extern/bullet/Bullet/CollisionDispatch/ConvexConcaveCollisionAlgorithm.h
index 00a03f64f8d..7569f4ed32e 100644
--- a/extern/bullet/Bullet/CollisionDispatch/ConvexConcaveCollisionAlgorithm.h
+++ b/extern/bullet/Bullet/CollisionDispatch/ConvexConcaveCollisionAlgorithm.h
@@ -35,9 +35,7 @@ class BoxTriangleCallback : public TriangleCallback
SimdVector3 m_aabbMax ;
Dispatcher* m_dispatcher;
- float m_timeStep;
- int m_stepCount;
- bool m_useContinuous;
+ const DispatcherInfo* m_dispatchInfoPtr;
float m_collisionMarginTriangle;
public:
@@ -47,7 +45,7 @@ int m_triangleCount;
BoxTriangleCallback(Dispatcher* dispatcher,BroadphaseProxy* proxy0,BroadphaseProxy* proxy1);
- void SetTimeStepAndCounters(float timeStep,int stepCount, float collisionMarginTriangle,bool useContinuous);
+ void SetTimeStepAndCounters(float collisionMarginTriangle,const DispatcherInfo& dispatchInfo);
virtual ~BoxTriangleCallback();
@@ -86,9 +84,9 @@ public:
virtual ~ConvexConcaveCollisionAlgorithm();
- virtual void ProcessCollision (BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,float timeStep,int stepCount, bool useContinuous);
+ virtual void ProcessCollision (BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,const DispatcherInfo& dispatchInfo);
- float CalculateTimeOfImpact(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,float timeStep,int stepCount);
+ float CalculateTimeOfImpact(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,const DispatcherInfo& dispatchInfo);
void ClearCache();
diff --git a/extern/bullet/Bullet/CollisionDispatch/ConvexConvexAlgorithm.cpp b/extern/bullet/Bullet/CollisionDispatch/ConvexConvexAlgorithm.cpp
index e9c56189bfc..8ec124e3dc6 100644
--- a/extern/bullet/Bullet/CollisionDispatch/ConvexConvexAlgorithm.cpp
+++ b/extern/bullet/Bullet/CollisionDispatch/ConvexConvexAlgorithm.cpp
@@ -167,8 +167,9 @@ void ConvexConvexAlgorithm::CheckPenetrationDepthSolver()
//
// box-box collision algorithm, for simplicity also applies resolution-impulse
//
-void ConvexConvexAlgorithm ::ProcessCollision (BroadphaseProxy* ,BroadphaseProxy* ,float timeStep,int stepCount, bool useContinuous)
+void ConvexConvexAlgorithm ::ProcessCollision (BroadphaseProxy* ,BroadphaseProxy* ,const DispatcherInfo& dispatchInfo)
{
+
if (!m_manifoldPtr)
return;
@@ -194,7 +195,7 @@ void ConvexConvexAlgorithm ::ProcessCollision (BroadphaseProxy* ,BroadphaseProxy
MinkowskiSumShape expanded0(min0,&sphere);
MinkowskiSumShape expanded1(min1,&sphere);
- if (useContinuous)
+ if (dispatchInfo.m_useContinuous)
{
m_gjkPairDetector.SetMinkowskiA(&expanded0);
m_gjkPairDetector.SetMinkowskiB(&expanded1);
@@ -214,12 +215,12 @@ void ConvexConvexAlgorithm ::ProcessCollision (BroadphaseProxy* ,BroadphaseProxy
input.m_transformA = col0->m_worldTransform;
input.m_transformB = col1->m_worldTransform;
- m_gjkPairDetector.GetClosestPoints(input,*resultOut);
+ m_gjkPairDetector.GetClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw);
m_dispatcher->ReleaseManifoldResult(resultOut);
}
bool disableCcd = false;
-float ConvexConvexAlgorithm::CalculateTimeOfImpact(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,float timeStep,int stepCount)
+float ConvexConvexAlgorithm::CalculateTimeOfImpact(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,const DispatcherInfo& dispatchInfo)
{
CheckPenetrationDepthSolver();
diff --git a/extern/bullet/Bullet/CollisionDispatch/ConvexConvexAlgorithm.h b/extern/bullet/Bullet/CollisionDispatch/ConvexConvexAlgorithm.h
index 15e0f3a2141..6d8143df552 100644
--- a/extern/bullet/Bullet/CollisionDispatch/ConvexConvexAlgorithm.h
+++ b/extern/bullet/Bullet/CollisionDispatch/ConvexConvexAlgorithm.h
@@ -49,9 +49,9 @@ public:
virtual ~ConvexConvexAlgorithm();
- virtual void ProcessCollision (BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,float timeStep,int stepCount, bool useContinuous);
+ virtual void ProcessCollision (BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,const DispatcherInfo& dispatchInfo);
- virtual float CalculateTimeOfImpact(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,float timeStep,int stepCount);
+ virtual float CalculateTimeOfImpact(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,const DispatcherInfo& dispatchInfo);
void SetLowLevelOfDetail(bool useLowLevel);
diff --git a/extern/bullet/Bullet/CollisionDispatch/EmptyCollisionAlgorithm.cpp b/extern/bullet/Bullet/CollisionDispatch/EmptyCollisionAlgorithm.cpp
index ff4824dadca..6ef31ad6fb4 100644
--- a/extern/bullet/Bullet/CollisionDispatch/EmptyCollisionAlgorithm.cpp
+++ b/extern/bullet/Bullet/CollisionDispatch/EmptyCollisionAlgorithm.cpp
@@ -22,12 +22,12 @@ EmptyAlgorithm::EmptyAlgorithm(const CollisionAlgorithmConstructionInfo& ci)
{
}
-void EmptyAlgorithm::ProcessCollision (BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,float timeStep, int stepCount,bool useContinuous)
+void EmptyAlgorithm::ProcessCollision (BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,const DispatcherInfo& dispatchInfo)
{
}
-float EmptyAlgorithm::CalculateTimeOfImpact(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,float timeStep,int stepCount)
+float EmptyAlgorithm::CalculateTimeOfImpact(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,const DispatcherInfo& dispatchInfo)
{
return 1.f;
}
diff --git a/extern/bullet/Bullet/CollisionDispatch/EmptyCollisionAlgorithm.h b/extern/bullet/Bullet/CollisionDispatch/EmptyCollisionAlgorithm.h
index 598fb27b883..c85efac9959 100644
--- a/extern/bullet/Bullet/CollisionDispatch/EmptyCollisionAlgorithm.h
+++ b/extern/bullet/Bullet/CollisionDispatch/EmptyCollisionAlgorithm.h
@@ -28,9 +28,9 @@ public:
EmptyAlgorithm(const CollisionAlgorithmConstructionInfo& ci);
- virtual void ProcessCollision (BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,float timeStep, int stepCount, bool useContinuous);
+ virtual void ProcessCollision (BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,const DispatcherInfo& dispatchInfo);
- virtual float CalculateTimeOfImpact(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,float timeStep,int stepCount);
+ virtual float CalculateTimeOfImpact(BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,const DispatcherInfo& dispatchInfo);
diff --git a/extern/bullet/Bullet/CollisionShapes/ConvexTriangleCallback.cpp b/extern/bullet/Bullet/CollisionShapes/ConvexTriangleCallback.cpp
index 35cad78fbb9..71a74f65bc2 100644
--- a/extern/bullet/Bullet/CollisionShapes/ConvexTriangleCallback.cpp
+++ b/extern/bullet/Bullet/CollisionShapes/ConvexTriangleCallback.cpp
@@ -74,7 +74,7 @@ void ConvexTriangleCallback::ProcessTriangle(SimdVector3* triangle)
input.m_maximumDistanceSquared = 1e30f;//?
- gjkDetector.GetClosestPoints(input,output);
+ gjkDetector.GetClosestPoints(input,output,0);
}
diff --git a/extern/bullet/Bullet/NarrowPhaseCollision/ContinuousConvexCollision.cpp b/extern/bullet/Bullet/NarrowPhaseCollision/ContinuousConvexCollision.cpp
index d760b368fe3..f5762ee248c 100644
--- a/extern/bullet/Bullet/NarrowPhaseCollision/ContinuousConvexCollision.cpp
+++ b/extern/bullet/Bullet/NarrowPhaseCollision/ContinuousConvexCollision.cpp
@@ -93,7 +93,7 @@ bool ContinuousConvexCollision::calcTimeOfImpact(
GjkPairDetector::ClosestPointInput input;
input.m_transformA = fromA;
input.m_transformB = fromB;
- gjk.GetClosestPoints(input,pointCollector1);
+ gjk.GetClosestPoints(input,pointCollector1,0);
hasResult = pointCollector1.m_hasResult;
c = pointCollector1.m_pointInWorld;
@@ -152,7 +152,7 @@ bool ContinuousConvexCollision::calcTimeOfImpact(
GjkPairDetector::ClosestPointInput input;
input.m_transformA = interpolatedTransA;
input.m_transformB = interpolatedTransB;
- gjk.GetClosestPoints(input,pointCollector);
+ gjk.GetClosestPoints(input,pointCollector,0);
if (pointCollector.m_hasResult)
{
if (pointCollector.m_distance < 0.f)
diff --git a/extern/bullet/Bullet/NarrowPhaseCollision/ConvexPenetrationDepthSolver.h b/extern/bullet/Bullet/NarrowPhaseCollision/ConvexPenetrationDepthSolver.h
index 8001c7883b6..7b1d8426bc0 100644
--- a/extern/bullet/Bullet/NarrowPhaseCollision/ConvexPenetrationDepthSolver.h
+++ b/extern/bullet/Bullet/NarrowPhaseCollision/ConvexPenetrationDepthSolver.h
@@ -31,7 +31,9 @@ public:
virtual bool CalcPenDepth( SimplexSolverInterface& simplexSolver,
ConvexShape* convexA,ConvexShape* convexB,
const SimdTransform& transA,const SimdTransform& transB,
- SimdVector3& v, SimdPoint3& pa, SimdPoint3& pb) = 0;
+ SimdVector3& v, SimdPoint3& pa, SimdPoint3& pb,
+ class IDebugDraw* debugDraw
+ ) = 0;
};
diff --git a/extern/bullet/Bullet/NarrowPhaseCollision/DiscreteCollisionDetectorInterface.h b/extern/bullet/Bullet/NarrowPhaseCollision/DiscreteCollisionDetectorInterface.h
index 08007d75496..400ac805bc3 100644
--- a/extern/bullet/Bullet/NarrowPhaseCollision/DiscreteCollisionDetectorInterface.h
+++ b/extern/bullet/Bullet/NarrowPhaseCollision/DiscreteCollisionDetectorInterface.h
@@ -54,7 +54,7 @@ struct DiscreteCollisionDetectorInterface
// give either closest points (distance > 0) or penetration (distance)
// the normal always points from B towards A
//
- virtual void GetClosestPoints(const ClosestPointInput& input,Result& output) = 0;
+ virtual void GetClosestPoints(const ClosestPointInput& input,Result& output,class IDebugDraw* debugDraw) = 0;
SimdScalar getCollisionMargin() { return 0.2f;}
};
diff --git a/extern/bullet/Bullet/NarrowPhaseCollision/GjkConvexCast.cpp b/extern/bullet/Bullet/NarrowPhaseCollision/GjkConvexCast.cpp
index 0f20061c6e6..344a4555bcf 100644
--- a/extern/bullet/Bullet/NarrowPhaseCollision/GjkConvexCast.cpp
+++ b/extern/bullet/Bullet/NarrowPhaseCollision/GjkConvexCast.cpp
@@ -96,7 +96,7 @@ bool GjkConvexCast::calcTimeOfImpact(
GjkPairDetector::ClosestPointInput input;
input.m_transformA = sphereTr;
input.m_transformB = identityTrans;
- gjk.GetClosestPoints(input,pointCollector1);
+ gjk.GetClosestPoints(input,pointCollector1,0);
hasResult = pointCollector1.m_hasResult;
c = pointCollector1.m_pointInWorld;
@@ -133,7 +133,7 @@ bool GjkConvexCast::calcTimeOfImpact(
GjkPairDetector::ClosestPointInput input;
input.m_transformA = sphereTr;
input.m_transformB = identityTrans;
- gjk.GetClosestPoints(input,pointCollector);
+ gjk.GetClosestPoints(input,pointCollector,0);
if (pointCollector.m_hasResult)
{
if (pointCollector.m_distance < 0.f)
diff --git a/extern/bullet/Bullet/NarrowPhaseCollision/GjkPairDetector.cpp b/extern/bullet/Bullet/NarrowPhaseCollision/GjkPairDetector.cpp
index c453264662f..8ccffc0d86d 100644
--- a/extern/bullet/Bullet/NarrowPhaseCollision/GjkPairDetector.cpp
+++ b/extern/bullet/Bullet/NarrowPhaseCollision/GjkPairDetector.cpp
@@ -33,7 +33,7 @@ m_minkowskiB(objectB)
{
}
-void GjkPairDetector::GetClosestPoints(const ClosestPointInput& input,Result& output)
+void GjkPairDetector::GetClosestPoints(const ClosestPointInput& input,Result& output,class IDebugDraw* debugDraw)
{
SimdScalar distance;
SimdVector3 normalInB(0.f,0.f,0.f);
@@ -155,7 +155,9 @@ void GjkPairDetector::GetClosestPoints(const ClosestPointInput& input,Result& ou
*m_simplexSolver,
m_minkowskiA,m_minkowskiB,
input.m_transformA,input.m_transformB,
- m_cachedSeparatingAxis, pointOnA, pointOnB);
+ m_cachedSeparatingAxis, pointOnA, pointOnB,
+ debugDraw
+ );
if (isValid)
{
@@ -180,6 +182,7 @@ void GjkPairDetector::GetClosestPoints(const ClosestPointInput& input,Result& ou
normalInB,
pointOnB,
distance);
+ //printf("gjk add:%f",distance);
}
diff --git a/extern/bullet/Bullet/NarrowPhaseCollision/GjkPairDetector.h b/extern/bullet/Bullet/NarrowPhaseCollision/GjkPairDetector.h
index 337f8128071..e18fd20697c 100644
--- a/extern/bullet/Bullet/NarrowPhaseCollision/GjkPairDetector.h
+++ b/extern/bullet/Bullet/NarrowPhaseCollision/GjkPairDetector.h
@@ -44,7 +44,7 @@ public:
GjkPairDetector(ConvexShape* objectA,ConvexShape* objectB,SimplexSolverInterface* simplexSolver,ConvexPenetrationDepthSolver* penetrationDepthSolver);
virtual ~GjkPairDetector() {};
- virtual void GetClosestPoints(const ClosestPointInput& input,Result& output);
+ virtual void GetClosestPoints(const ClosestPointInput& input,Result& output,class IDebugDraw* debugDraw);
void SetMinkowskiA(ConvexShape* minkA)
{
diff --git a/extern/bullet/Bullet/NarrowPhaseCollision/MinkowskiPenetrationDepthSolver.cpp b/extern/bullet/Bullet/NarrowPhaseCollision/MinkowskiPenetrationDepthSolver.cpp
index d4fbf022d6c..d482be27659 100644
--- a/extern/bullet/Bullet/NarrowPhaseCollision/MinkowskiPenetrationDepthSolver.cpp
+++ b/extern/bullet/Bullet/NarrowPhaseCollision/MinkowskiPenetrationDepthSolver.cpp
@@ -41,113 +41,147 @@ struct MyResult : public DiscreteCollisionDetectorInterface::Result
}
};
+#define NUM_UNITSPHERE_POINTS 42
+static SimdVector3 sPenetrationDirections[NUM_UNITSPHERE_POINTS] =
+{
+SimdVector3(0.000000f , -0.000000f,-1.000000f),
+SimdVector3(0.723608f , -0.525725f,-0.447219f),
+SimdVector3(-0.276388f , -0.850649f,-0.447219f),
+SimdVector3(-0.894426f , -0.000000f,-0.447216f),
+SimdVector3(-0.276388f , 0.850649f,-0.447220f),
+SimdVector3(0.723608f , 0.525725f,-0.447219f),
+SimdVector3(0.276388f , -0.850649f,0.447220f),
+SimdVector3(-0.723608f , -0.525725f,0.447219f),
+SimdVector3(-0.723608f , 0.525725f,0.447219f),
+SimdVector3(0.276388f , 0.850649f,0.447219f),
+SimdVector3(0.894426f , 0.000000f,0.447216f),
+SimdVector3(-0.000000f , 0.000000f,1.000000f),
+SimdVector3(0.425323f , -0.309011f,-0.850654f),
+SimdVector3(-0.162456f , -0.499995f,-0.850654f),
+SimdVector3(0.262869f , -0.809012f,-0.525738f),
+SimdVector3(0.425323f , 0.309011f,-0.850654f),
+SimdVector3(0.850648f , -0.000000f,-0.525736f),
+SimdVector3(-0.525730f , -0.000000f,-0.850652f),
+SimdVector3(-0.688190f , -0.499997f,-0.525736f),
+SimdVector3(-0.162456f , 0.499995f,-0.850654f),
+SimdVector3(-0.688190f , 0.499997f,-0.525736f),
+SimdVector3(0.262869f , 0.809012f,-0.525738f),
+SimdVector3(0.951058f , 0.309013f,0.000000f),
+SimdVector3(0.951058f , -0.309013f,0.000000f),
+SimdVector3(0.587786f , -0.809017f,0.000000f),
+SimdVector3(0.000000f , -1.000000f,0.000000f),
+SimdVector3(-0.587786f , -0.809017f,0.000000f),
+SimdVector3(-0.951058f , -0.309013f,-0.000000f),
+SimdVector3(-0.951058f , 0.309013f,-0.000000f),
+SimdVector3(-0.587786f , 0.809017f,-0.000000f),
+SimdVector3(-0.000000f , 1.000000f,-0.000000f),
+SimdVector3(0.587786f , 0.809017f,-0.000000f),
+SimdVector3(0.688190f , -0.499997f,0.525736f),
+SimdVector3(-0.262869f , -0.809012f,0.525738f),
+SimdVector3(-0.850648f , 0.000000f,0.525736f),
+SimdVector3(-0.262869f , 0.809012f,0.525738f),
+SimdVector3(0.688190f , 0.499997f,0.525736f),
+SimdVector3(0.525730f , 0.000000f,0.850652f),
+SimdVector3(0.162456f , -0.499995f,0.850654f),
+SimdVector3(-0.425323f , -0.309011f,0.850654f),
+SimdVector3(-0.425323f , 0.309011f,0.850654f),
+SimdVector3(0.162456f , 0.499995f,0.850654f)
+};
bool MinkowskiPenetrationDepthSolver::CalcPenDepth(SimplexSolverInterface& simplexSolver,
ConvexShape* convexA,ConvexShape* convexB,
const SimdTransform& transA,const SimdTransform& transB,
- SimdVector3& v, SimdPoint3& pa, SimdPoint3& pb)
+ SimdVector3& v, SimdPoint3& pa, SimdPoint3& pb,
+ class IDebugDraw* debugDraw
+ )
{
//just take fixed number of orientation, and sample the penetration depth in that direction
-
- int N = 3;
float minProj = 1e30f;
SimdVector3 minNorm;
SimdVector3 minVertex;
SimdVector3 minA,minB;
-
- //not so good, lots of directions overlap, better to use gauss map
- for (int i=-N;i<N;i++)
+ for (int i=0;i<NUM_UNITSPHERE_POINTS;i++)
{
- for (int j = -N;j<N;j++)
+ const SimdVector3& norm = sPenetrationDirections[i];
+
+ SimdVector3 seperatingAxisInA = (-norm)* transA.getBasis();
+ SimdVector3 seperatingAxisInB = norm* transB.getBasis();
+
+ SimdVector3 pInA = convexA->LocalGetSupportingVertex(seperatingAxisInA);
+ SimdVector3 qInB = convexB->LocalGetSupportingVertex(seperatingAxisInB);
+ SimdPoint3 pWorld = transA(pInA);
+ SimdPoint3 qWorld = transB(qInB);
+
+ SimdVector3 w = qWorld - pWorld;
+ float delta = norm.dot(w);
+ //find smallest delta
+
+ if (delta < minProj)
{
- for (int k=-N;k<N;k++)
- {
- if (i | j | k)
- {
- SimdVector3 norm(i,j,k);
- norm.normalize();
-
- {
- SimdVector3 seperatingAxisInA = (-norm)* transA.getBasis();
- SimdVector3 seperatingAxisInB = norm* transB.getBasis();
-
- SimdVector3 pInA = convexA->LocalGetSupportingVertex(seperatingAxisInA);
- SimdVector3 qInB = convexB->LocalGetSupportingVertex(seperatingAxisInB);
- SimdPoint3 pWorld = transA(pInA);
- SimdPoint3 qWorld = transB(qInB);
-
- SimdVector3 w = qWorld - pWorld;
- float delta = norm.dot(w);
- //find smallest delta
-
- if (delta < minProj)
- {
- minProj = delta;
- minNorm = norm;
- minA = pWorld;
- minB = qWorld;
- }
- }
-
- {
- SimdVector3 seperatingAxisInA = (norm)* transA.getBasis();
- SimdVector3 seperatingAxisInB = -norm* transB.getBasis();
-
- SimdVector3 pInA = convexA->LocalGetSupportingVertex(seperatingAxisInA);
- SimdVector3 qInB = convexB->LocalGetSupportingVertex(seperatingAxisInB);
- SimdPoint3 pWorld = transA(pInA);
- SimdPoint3 qWorld = transB(qInB);
-
- SimdVector3 w = qWorld - pWorld;
- float delta = (-norm).dot(w);
- //find smallest delta
-
- if (delta < minProj)
- {
- minProj = delta ;
- minNorm = -norm;
- minA = pWorld;
- minB = qWorld;
- }
- }
-
-
-
- }
- }
+ minProj = delta;
+ minNorm = norm;
+ minA = pWorld;
+ minB = qWorld;
+
}
}
- SimdTransform ident;
- ident.setIdentity();
+#ifdef DEBUG_DRAW
+ if (debugDraw)
+ {
+ SimdVector3 color(0,1,0);
+ debugDraw->DrawLine(minA,minB,color);
+ color = SimdVector3 (1,1,1);
+ SimdVector3 vec = minB-minA;
+ float prj2 = minNorm.dot(vec);
+ debugDraw->DrawLine(minA,minA+(minNorm*minProj),color);
- GjkPairDetector gjkdet(convexA,convexB,&simplexSolver,0);
+ }
+#endif //DEBUG_DRAW
+
- v = minNorm * minProj;
+ GjkPairDetector gjkdet(convexA,convexB,&simplexSolver,0);
+
+ SimdScalar offsetDist = (minProj+0.1f);
+ SimdVector3 offset = minNorm * offsetDist;
+
GjkPairDetector::ClosestPointInput input;
- SimdVector3 newOrg = transA.getOrigin() + v + v;
+ SimdVector3 newOrg = transA.getOrigin() + offset;
SimdTransform displacedTrans = transA;
displacedTrans.setOrigin(newOrg);
input.m_transformA = displacedTrans;
input.m_transformB = transB;
- input.m_maximumDistanceSquared = 1e30f;
+ input.m_maximumDistanceSquared = 1e30f;//minProj;
MyResult res;
- gjkdet.GetClosestPoints(input,res);
+ gjkdet.GetClosestPoints(input,res,debugDraw);
+
+
if (res.m_hasResult)
{
- pa = res.m_pointInWorld - res.m_normalOnBInWorld*0.1f*res.m_depth;
+
+ pa = res.m_pointInWorld - minNorm * minProj;
pb = res.m_pointInWorld;
+
+#ifdef DEBUG_DRAW
+ if (debugDraw)
+ {
+ SimdVector3 color(1,0,0);
+ debugDraw->DrawLine(pa,pb,color);
+ }
+#endif//DEBUG_DRAW
+
+
}
return res.m_hasResult;
}
diff --git a/extern/bullet/Bullet/NarrowPhaseCollision/MinkowskiPenetrationDepthSolver.h b/extern/bullet/Bullet/NarrowPhaseCollision/MinkowskiPenetrationDepthSolver.h
index 65154c59b4e..b7a0da3a024 100644
--- a/extern/bullet/Bullet/NarrowPhaseCollision/MinkowskiPenetrationDepthSolver.h
+++ b/extern/bullet/Bullet/NarrowPhaseCollision/MinkowskiPenetrationDepthSolver.h
@@ -27,7 +27,9 @@ public:
virtual bool CalcPenDepth( SimplexSolverInterface& simplexSolver,
ConvexShape* convexA,ConvexShape* convexB,
const SimdTransform& transA,const SimdTransform& transB,
- SimdVector3& v, SimdPoint3& pa, SimdPoint3& pb);
+ SimdVector3& v, SimdPoint3& pa, SimdPoint3& pb,
+ class IDebugDraw* debugDraw
+ );
};
diff --git a/extern/bullet/BulletDynamics/ConstraintSolver/ContactConstraint.cpp b/extern/bullet/BulletDynamics/ConstraintSolver/ContactConstraint.cpp
index d78a812edf2..38c82fdb07d 100644
--- a/extern/bullet/BulletDynamics/ConstraintSolver/ContactConstraint.cpp
+++ b/extern/bullet/BulletDynamics/ConstraintSolver/ContactConstraint.cpp
@@ -102,7 +102,7 @@ void resolveSingleBilateral(RigidBody& body1, const SimdVector3& pos1,
#endif
}
-
+float allowedPenetration = 0.0f;
//velocity + friction
@@ -115,9 +115,26 @@ float resolveSingleCollision(
)
{
+
const SimdVector3& pos1 = contactPoint.GetPositionWorldOnA();
const SimdVector3& pos2 = contactPoint.GetPositionWorldOnB();
SimdScalar distance = contactPoint.GetDistance();
+
+
+// printf("distance=%f\n",distance);
+
+ if (distance>0.f)
+ {
+ contactPoint.m_appliedImpulse = 0.f;
+ contactPoint.m_accumulatedTangentImpulse0 = 0.f;
+ contactPoint.m_accumulatedTangentImpulse1 = 0.f;
+
+ return 0.f;
+ }
+
+#define MAXPENETRATIONPERFRAME -0.05
+ distance = distance < MAXPENETRATIONPERFRAME? MAXPENETRATIONPERFRAME:distance;
+
const SimdVector3& normal = contactPoint.m_normalWorldOnB;
SimdVector3 rel_pos1 = pos1 - body1.getCenterOfMassPosition();
@@ -146,14 +163,14 @@ float resolveSingleCollision(
float Kcor = Kerp *Kfps;
- float allowedPenetration = 0.001f;
+ //printf("dist=%f\n",distance);
float clipDist = distance + allowedPenetration;
float dist = (clipDist > 0.f) ? 0.f : clipDist;
-
- SimdScalar positionalError = Kcor *-dist*damping;
+ //distance = 0.f;
+ SimdScalar positionalError = Kcor *-clipDist;
//jacDiagABInv;
- SimdScalar velocityError = -(1.0f + restitution) * rel_vel;
+ SimdScalar velocityError = -(1.0f + restitution) * rel_vel;// * damping;
SimdScalar penetrationImpulse = positionalError * contactPoint.m_jacDiagABInv;
diff --git a/extern/bullet/BulletDynamics/ConstraintSolver/SimpleConstraintSolver.cpp b/extern/bullet/BulletDynamics/ConstraintSolver/SimpleConstraintSolver.cpp
index 658554a5d94..7fd42d04775 100644
--- a/extern/bullet/BulletDynamics/ConstraintSolver/SimpleConstraintSolver.cpp
+++ b/extern/bullet/BulletDynamics/ConstraintSolver/SimpleConstraintSolver.cpp
@@ -122,9 +122,10 @@ float SimpleConstraintSolver::Solve(PersistentManifold* manifoldPtr, const Conta
//re-calculate friction direction every frame, todo: check if this is really needed
SimdPlaneSpace1(cp.m_normalWorldOnB,cp.m_frictionWorldTangential0,cp.m_frictionWorldTangential1);
+#ifdef NO_FRICTION_WARMSTART
cp.m_accumulatedTangentImpulse0 = 0.f;
cp.m_accumulatedTangentImpulse1 = 0.f;
-
+#endif //NO_FRICTION_WARMSTART
float denom0 = body0->ComputeImpulseDenominator(pos1,cp.m_frictionWorldTangential0);
float denom1 = body1->ComputeImpulseDenominator(pos2,cp.m_frictionWorldTangential0);
float denom = relaxation/(denom0+denom1);
@@ -137,8 +138,10 @@ float SimpleConstraintSolver::Solve(PersistentManifold* manifoldPtr, const Conta
cp.m_jacDiagABInvTangent1 = denom;
SimdVector3 totalImpulse =
- // cp.m_frictionWorldTangential0*cp.m_accumulatedTangentImpulse0+
- // cp.m_frictionWorldTangential1*cp.m_accumulatedTangentImpulse1+
+#ifndef NO_FRICTION_WARMSTART
+ cp.m_frictionWorldTangential0*cp.m_accumulatedTangentImpulse0+
+ cp.m_frictionWorldTangential1*cp.m_accumulatedTangentImpulse1+
+#endif //NO_FRICTION_WARMSTART
cp.m_normalWorldOnB*cp.m_appliedImpulse;
//apply previous frames impulse on both bodies
@@ -173,12 +176,8 @@ float SimpleConstraintSolver::Solve(PersistentManifold* manifoldPtr, const Conta
{
- //float actualDist = cp.GetDistance();
- //#define MAXPENETRATIONPERFRAME -0.2f
- //float dist = actualDist< MAXPENETRATIONPERFRAME? MAXPENETRATIONPERFRAME:actualDist;
-
- float dist = cp.GetDistance();
-
+ //float dist = cp.GetDistance();
+ //printf("dist(%i)=%f\n",j,dist);
float impulse = resolveSingleCollision(
*body0,*body1,
cp,
diff --git a/extern/bullet/BulletDynamics/Dynamics/RigidBody.cpp b/extern/bullet/BulletDynamics/Dynamics/RigidBody.cpp
index db90a833633..315a9d66c38 100644
--- a/extern/bullet/BulletDynamics/Dynamics/RigidBody.cpp
+++ b/extern/bullet/BulletDynamics/Dynamics/RigidBody.cpp
@@ -97,7 +97,7 @@ void RigidBody::applyForces(SimdScalar step)
m_linearVelocity *= GEN_clamped((1.f - step * gLinearAirDamping * m_linearDamping), 0.0f, 1.0f);
m_angularVelocity *= GEN_clamped((1.f - step * m_angularDamping), 0.0f, 1.0f);
-//#define FORCE_VELOCITY_DAMPING 1
+#define FORCE_VELOCITY_DAMPING 1
#ifdef FORCE_VELOCITY_DAMPING
float speed = m_linearVelocity.length();
if (speed < m_linearDamping)
diff --git a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp
index 98387076892..3039bba8565 100644
--- a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp
+++ b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp
@@ -315,7 +315,8 @@ m_solverType(-1)
//broadphase = new SimpleBroadphase();
}
- setSolverType(0);
+
+ setSolverType(1);
m_collisionWorld = new CollisionWorld(dispatcher,broadphase);
diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp
index 85fdc51826a..3b1e4f7ce59 100644
--- a/source/gameengine/Ketsji/KX_GameObject.cpp
+++ b/source/gameengine/Ketsji/KX_GameObject.cpp
@@ -1091,6 +1091,7 @@ PyObject* KX_GameObject::PySetPosition(PyObject* self,
if (PyVecArgTo(args, pos))
{
NodeSetLocalPosition(pos);
+ NodeUpdateGS(0.f,true);
Py_Return;
}
diff --git a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
index d9517a3a65b..322f41e11a3 100644
--- a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
@@ -85,28 +85,16 @@ bool KX_SCA_AddObjectActuator::Update()
RemoveAllEvents();
if (bNegativeEvent) return false; // do nothing on negative events
- if (m_OriginalObject)
- {
- // Add an identical object, with properties inherited from the original object
- // Now it needs to be added to the current scene.
- SCA_IObject* replica = m_scene->AddReplicaObject(m_OriginalObject,GetParent(),m_timeProp );
- KX_GameObject * game_obj = static_cast<KX_GameObject *>(replica);
- game_obj->setLinearVelocity(m_linear_velocity,m_localFlag);
- game_obj->ResolveCombinedVelocities(m_linear_velocity, MT_Vector3(0., 0., 0.), m_localFlag, false);
- // keep a copy of the last object, to allow python scripters to change it
- if (m_lastCreatedObject)
- m_lastCreatedObject->Release();
-
- m_lastCreatedObject = replica;
- m_lastCreatedObject->AddRef();
- }
+ InstantAddObject();
+
return false;
}
+
SCA_IObject* KX_SCA_AddObjectActuator::GetLastCreatedObject() const
{
return m_lastCreatedObject;
@@ -169,6 +157,8 @@ PyMethodDef KX_SCA_AddObjectActuator::Methods[] = {
{"getLinearVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetLinearVelocity, METH_VARARGS, GetLinearVelocity_doc},
{"setLinearVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPySetLinearVelocity, METH_VARARGS, SetLinearVelocity_doc},
{"getLastCreatedObject", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetLastCreatedObject, METH_VARARGS,"getLastCreatedObject() : get the object handle to the last created object\n"},
+ {"instantAddObject", (PyCFunction) KX_SCA_AddObjectActuator::sPyInstantAddObject, METH_VARARGS,"instantAddObject() : immediately add object without delay\n"},
+
{NULL,NULL} //Sentinel
};
@@ -315,6 +305,35 @@ PyObject* KX_SCA_AddObjectActuator::PySetLinearVelocity(PyObject* self,
Py_Return;
}
+void KX_SCA_AddObjectActuator::InstantAddObject()
+{
+ if (m_OriginalObject)
+ {
+ // Add an identical object, with properties inherited from the original object
+ // Now it needs to be added to the current scene.
+ SCA_IObject* replica = m_scene->AddReplicaObject(m_OriginalObject,GetParent(),m_timeProp );
+ KX_GameObject * game_obj = static_cast<KX_GameObject *>(replica);
+ game_obj->setLinearVelocity(m_linear_velocity,m_localFlag);
+ game_obj->ResolveCombinedVelocities(m_linear_velocity, MT_Vector3(0., 0., 0.), m_localFlag, false);
+
+ // keep a copy of the last object, to allow python scripters to change it
+ if (m_lastCreatedObject)
+ m_lastCreatedObject->Release();
+
+ m_lastCreatedObject = replica;
+ m_lastCreatedObject->AddRef();
+ }
+}
+
+PyObject* KX_SCA_AddObjectActuator::PyInstantAddObject(PyObject* self,
+ PyObject* args,
+ PyObject* kwds)
+{
+ InstantAddObject();
+
+ Py_Return;
+}
+
/* 7. GetLastCreatedObject */
diff --git a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h
index 2a7c27669fa..60adcb27b12 100644
--- a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h
+++ b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h
@@ -104,6 +104,8 @@ public:
GetLastCreatedObject(
) const ;
+ void InstantAddObject();
+
/* 1. setObject */
KX_PYMETHOD_DOC(KX_SCA_AddObjectActuator,SetObject);
/* 2. setTime */
@@ -118,6 +120,8 @@ public:
KX_PYMETHOD_DOC(KX_SCA_AddObjectActuator,SetLinearVelocity);
/* 7. getLastCreatedObject */
KX_PYMETHOD_DOC(KX_SCA_AddObjectActuator,GetLastCreatedObject);
+ /* 8. instantAddObject*/
+ KX_PYMETHOD_DOC(KX_SCA_AddObjectActuator,InstantAddObject);
}; /* end of class KX_SCA_AddObjectActuator : public KX_EditObjectActuator */
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
index 98387076892..2c4f98c5624 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
@@ -315,7 +315,7 @@ m_solverType(-1)
//broadphase = new SimpleBroadphase();
}
- setSolverType(0);
+ setSolverType(1);
m_collisionWorld = new CollisionWorld(dispatcher,broadphase);
@@ -524,6 +524,7 @@ bool CcdPhysicsEnvironment::proceedDeltaTimeOneStep(float timeStep)
DispatcherInfo dispatchInfo;
dispatchInfo.m_timeStep = timeStep;
dispatchInfo.m_stepCount = 0;
+ dispatchInfo.m_debugDraw = m_debugDrawer;
scene->DispatchAllCollisionPairs(*GetDispatcher(),dispatchInfo);///numsubstep,g);
@@ -882,7 +883,7 @@ void CcdPhysicsEnvironment::setSolverType(int solverType)
{
m_solver = new SimpleConstraintSolver();
-
+ //printf("Iterative Impulse ConstraintSolver\n");
break;
}
}
@@ -892,6 +893,7 @@ void CcdPhysicsEnvironment::setSolverType(int solverType)
if (m_solverType != solverType)
{
m_solver = new OdeConstraintSolver();
+ //printf("Quickstep ConstraintSolver\n");
break;
}