these files missed the cvs commt yesterday, this should fix compilation problems

This commit is contained in:
Erwin Coumans
2005-08-13 08:05:48 +00:00
parent 74dc0e191d
commit 4d7089d19b
5 changed files with 131 additions and 92 deletions

View File

@@ -197,6 +197,12 @@ struct BlenderDebugDraw : public IDebugDraw
KX_RasterizerDrawDebugLine(kxfrom,kxto,kxcolor); KX_RasterizerDrawDebugLine(kxfrom,kxto,kxcolor);
} }
} }
virtual void DrawContactPoint(const SimdVector3& PointOnB,const SimdVector3& normalOnB,float distance,int lifeTime,const SimdVector3& color)
{
//not yet
}
virtual void SetDebugMode(int debugMode) virtual void SetDebugMode(int debugMode)
{ {
m_debugMode = debugMode; m_debugMode = debugMode;

View File

@@ -33,7 +33,7 @@
#define KX_CONVERTPHYSICSOBJECTS #define KX_CONVERTPHYSICSOBJECTS
/* These are defined by the build system... */ /* These are defined by the build system... */
#define USE_SUMO_SOLID //#define USE_SUMO_SOLID
//#define USE_ODE //#define USE_ODE
//on visual studio 7/8, always enable BULLET for now //on visual studio 7/8, always enable BULLET for now

View File

@@ -7,8 +7,12 @@
class BP_Proxy; class BP_Proxy;
///todo: fill all the empty CcdPhysicsController methods, hook them up to the RigidBody class
//'temporarily' global variables //'temporarily' global variables
float gDeactivationTime = 2.f; float gDeactivationTime = 2.f;
bool gDisableDeactivation = false;
float gLinearSleepingTreshold = 0.8f; float gLinearSleepingTreshold = 0.8f;
float gAngularSleepingTreshold = 1.0f; float gAngularSleepingTreshold = 1.0f;
@@ -116,46 +120,31 @@ void CcdPhysicsController::RelativeTranslate(float dlocX,float dlocY,float dloc
} }
void CcdPhysicsController::RelativeRotate(const float rotval[12],bool local) void CcdPhysicsController::RelativeRotate(const float drot[9],bool local)
{ {
if (m_body )
{
SimdMatrix3x3 drotmat( rotval[0],rotval[1],rotval[2],
rotval[4],rotval[5],rotval[6],
rotval[8],rotval[9],rotval[10]);
SimdMatrix3x3 currentOrn;
GetWorldOrientation(currentOrn);
SimdTransform xform = m_body->getCenterOfMassTransform();
xform.setBasis(xform.getBasis()*(local ?
drotmat : (currentOrn.inverse() * drotmat * currentOrn)));
printf("hi\n");
m_body->setCenterOfMassTransform(xform);
}
} }
void CcdPhysicsController::GetWorldOrientation(SimdMatrix3x3& mat)
{
float orn[4];
m_MotionState->getWorldOrientation(orn[0],orn[1],orn[2],orn[3]);
SimdQuaternion quat(orn[0],orn[1],orn[2],orn[3]);
mat.setRotation(quat);
}
void CcdPhysicsController::getOrientation(float &quatImag0,float &quatImag1,float &quatImag2,float &quatReal) void CcdPhysicsController::getOrientation(float &quatImag0,float &quatImag1,float &quatImag2,float &quatReal)
{ {
} }
void CcdPhysicsController::setOrientation(float quatImag0,float quatImag1,float quatImag2,float quatReal) void CcdPhysicsController::setOrientation(float quatImag0,float quatImag1,float quatImag2,float quatReal)
{ {
m_body->activate();
SimdTransform xform = m_body->getCenterOfMassTransform();
xform.setRotation(SimdQuaternion(quatImag0,quatImag1,quatImag2,quatReal));
m_body->setCenterOfMassTransform(xform);
} }
void CcdPhysicsController::setPosition(float posX,float posY,float posZ) void CcdPhysicsController::setPosition(float posX,float posY,float posZ)
{ {
m_body->activate();
SimdTransform xform = m_body->getCenterOfMassTransform();
xform.setOrigin(SimdVector3(posX,posY,posZ));
m_body->setCenterOfMassTransform(xform);
} }
void CcdPhysicsController::resolveCombinedVelocities(float linvelX,float linvelY,float linvelZ,float angVelX,float angVelY,float angVelZ) void CcdPhysicsController::resolveCombinedVelocities(float linvelX,float linvelY,float linvelZ,float angVelX,float angVelY,float angVelZ)
{ {
@@ -196,9 +185,7 @@ void CcdPhysicsController::applyImpulse(float attachX,float attachY,float attac
SimdVector3 impulse(impulseX,impulseY,impulseZ); SimdVector3 impulse(impulseX,impulseY,impulseZ);
SimdVector3 pos(attachX,attachY,attachZ); SimdVector3 pos(attachX,attachY,attachZ);
//it might be sleeping... wake up ! m_body->activate();
m_body->SetActivationState(1);
m_body->m_deactivationTime = 0.f;
m_body->applyImpulse(impulse,pos); m_body->applyImpulse(impulse,pos);
@@ -255,7 +242,7 @@ bool CcdPhysicsController::wantsSleeping()
{ {
//disable deactivation //disable deactivation
if (gDeactivationTime == 0.f) if (gDisableDeactivation || (gDeactivationTime == 0.f))
return false; return false;
//2 == ISLAND_SLEEPING, 3 == WANTS_DEACTIVATION //2 == ISLAND_SLEEPING, 3 == WANTS_DEACTIVATION
if ( (m_body->GetActivationState() == 2) || (m_body->GetActivationState() == 3)) if ( (m_body->GetActivationState() == 2) || (m_body->GetActivationState() == 3))

View File

@@ -8,13 +8,12 @@
/// It contains the IMotionState and IDeformableMesh Interfaces. /// It contains the IMotionState and IDeformableMesh Interfaces.
#include "SimdVector3.h" #include "SimdVector3.h"
#include "SimdScalar.h" #include "SimdScalar.h"
#include "SimdMatrix3x3.h"
class CollisionShape; class CollisionShape;
extern float gDeactivationTime; extern float gDeactivationTime;
extern float gLinearSleepingTreshold; extern float gLinearSleepingTreshold;
extern float gAngularSleepingTreshold; extern float gAngularSleepingTreshold;
extern bool gDisableDeactivation;
struct CcdConstructionInfo struct CcdConstructionInfo
@@ -89,7 +88,7 @@ class CcdPhysicsController : public PHY_IPhysicsController
// kinematic methods // kinematic methods
virtual void RelativeTranslate(float dlocX,float dlocY,float dlocZ,bool local); virtual void RelativeTranslate(float dlocX,float dlocY,float dlocZ,bool local);
virtual void RelativeRotate(const float rotval[12],bool local); virtual void RelativeRotate(const float drot[9],bool local);
virtual void getOrientation(float &quatImag0,float &quatImag1,float &quatImag2,float &quatReal); virtual void getOrientation(float &quatImag0,float &quatImag1,float &quatImag2,float &quatReal);
virtual void setOrientation(float quatImag0,float quatImag1,float quatImag2,float quatReal); virtual void setOrientation(float quatImag0,float quatImag1,float quatImag2,float quatReal);
virtual void setPosition(float posX,float posY,float posZ); virtual void setPosition(float posX,float posY,float posZ);
@@ -132,8 +131,6 @@ class CcdPhysicsController : public PHY_IPhysicsController
void SetAabb(const SimdVector3& aabbMin,const SimdVector3& aabbMax); void SetAabb(const SimdVector3& aabbMin,const SimdVector3& aabbMax);
void GetWorldOrientation(SimdMatrix3x3& mat);
}; };

View File

@@ -301,11 +301,17 @@ bool CcdPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep)
{ {
// printf("CcdPhysicsEnvironment::proceedDeltaTime\n");
if (timeStep == 0.f) if (timeStep == 0.f)
return true; return true;
printf("CcdPhysicsEnvironment::proceedDeltaTime\n"); if (m_debugDrawer)
{
gDisableDeactivation = (m_debugDrawer->GetDebugMode() & IDebugDraw::DBG_NoDeactivation);
}
//clamp hardcoded for now //clamp hardcoded for now
if (timeStep > 0.02) if (timeStep > 0.02)
@@ -314,8 +320,8 @@ bool CcdPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep)
//this is needed because scaling is not known in advance, and scaling has to propagate to the shape //this is needed because scaling is not known in advance, and scaling has to propagate to the shape
if (!m_scalingPropagated) if (!m_scalingPropagated)
{ {
SyncMotionStates(timeStep); //SyncMotionStates(timeStep);
m_scalingPropagated = true; //m_scalingPropagated = true;
} }
@@ -436,17 +442,17 @@ bool CcdPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep)
shapeinterface->GetAabb(body->getCenterOfMassTransform(), shapeinterface->GetAabb(body->getCenterOfMassTransform(),
minAabb,maxAabb); minAabb,maxAabb);
SimdVector3 manifoldExtraExtents(gContactBreakingTreshold,gContactBreakingTreshold,gContactBreakingTreshold);
minAabb -= manifoldExtraExtents;
maxAabb += manifoldExtraExtents;
BroadphaseProxy* bp = (BroadphaseProxy*) ctrl->m_broadphaseHandle; BroadphaseProxy* bp = (BroadphaseProxy*) ctrl->m_broadphaseHandle;
if (bp) if (bp)
{ {
#ifdef WIN32 #ifdef WIN32
SimdVector3 color (1,0,0); SimdVector3 color (1,1,0);
if (m_debugDrawer) if (m_debugDrawer)
{ {
//draw aabb //draw aabb
@@ -454,7 +460,7 @@ bool CcdPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep)
{ {
case ISLAND_SLEEPING: case ISLAND_SLEEPING:
{ {
color.setValue(0,1,0); color.setValue(1,1,1);
break; break;
} }
case WANTS_DEACTIVATION: case WANTS_DEACTIVATION:
@@ -466,11 +472,13 @@ bool CcdPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep)
{ {
break; break;
} }
}; };
DrawAabb(m_debugDrawer,minAabb,maxAabb,color); if (m_debugDrawer->GetDebugMode() & IDebugDraw::DBG_DrawAabb)
{
DrawAabb(m_debugDrawer,minAabb,maxAabb,color);
}
} }
#endif #endif
@@ -709,7 +717,89 @@ void CcdPhysicsEnvironment::setGravity(float x,float y,float z)
} }
} }
#ifdef DASHDASJKHASDJK
class RaycastingQueryBox : public QueryBox
{
SimdVector3 m_aabbMin;
SimdVector3 m_aabbMax;
public:
RaycastCallback m_raycastCallback;
RaycastingQueryBox(QueryBoxConstructionInfo& ci,const SimdVector3& from,const SimdVector3& to)
: QueryBox(ci),
m_raycastCallback(from,to)
{
for (int i=0;i<3;i++)
{
float fromI = from[i];
float toI = to[i];
if (fromI < toI)
{
m_aabbMin[i] = fromI;
m_aabbMax[i] = toI;
} else
{
m_aabbMin[i] = toI;
m_aabbMax[i] = fromI;
}
}
}
virtual void AddCollider( BroadphaseProxy* proxy)
{
//perform raycast if wanted, and update the m_hitFraction
if (proxy->GetClientObjectType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
{
//do it
RigidBody* body = (RigidBody*)proxy->m_clientObject;
TriangleMeshInterface* meshInterface = (TriangleMeshInterface*)
body->m_minkowski1;
//if the hit is closer, record the proxy!
float curFraction = m_raycastCallback.m_hitFraction;
meshInterface->ProcessAllTriangles(&m_raycastCallback,m_aabbMin,m_aabbMax);
if (m_raycastCallback.m_hitFraction < curFraction)
{
m_raycastCallback.m_hitProxy = proxy;
}
}
}
};
struct InternalVehicleRaycaster : public VehicleRaycaster
{
CcdPhysicsEnvironment* m_env;
public:
InternalVehicleRaycaster(CcdPhysicsEnvironment* env)
: m_env(env)
{
}
virtual void* CastRay(const SimdVector3& from,const SimdVector3& to, VehicleRaycasterResult& result)
{
return 0;
}
};
#endif
int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl0,class PHY_IPhysicsController* ctrl1,PHY_ConstraintType type, int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl0,class PHY_IPhysicsController* ctrl1,PHY_ConstraintType type,
float pivotX,float pivotY,float pivotZ, float pivotX,float pivotY,float pivotZ,
float axisX,float axisY,float axisZ) float axisX,float axisY,float axisZ)
@@ -775,12 +865,10 @@ void CcdPhysicsEnvironment::removeConstraint(int constraintid)
} }
} }
PHY_IPhysicsController* CcdPhysicsEnvironment::rayTest(PHY_IPhysicsController* ignoreClient, float fromX,float fromY,float fromZ, float toX,float toY,float toZ, PHY_IPhysicsController* CcdPhysicsEnvironment::rayTest(PHY_IPhysicsController* ignoreClient, float fromX,float fromY,float fromZ, float toX,float toY,float toZ,
float& hitX,float& hitY,float& hitZ,float& normalX,float& normalY,float& normalZ) float& hitX,float& hitY,float& hitZ,float& normalX,float& normalY,float& normalZ)
{ {
printf("raytest\n");
int minFraction = 1.f; int minFraction = 1.f;
SimdTransform rayFromTrans,rayToTrans; SimdTransform rayFromTrans,rayToTrans;
@@ -800,17 +888,13 @@ PHY_IPhysicsController* CcdPhysicsEnvironment::rayTest(PHY_IPhysicsController* i
for (i=m_controllers.begin(); for (i=m_controllers.begin();
!(i==m_controllers.end()); i++) !(i==m_controllers.end()); i++)
{ {
CcdPhysicsController* ctrl = (*i); CcdPhysicsController* ctrl = (*i);
if (ctrl == ignoreClient)
continue;
RigidBody* body = ctrl->GetRigidBody(); RigidBody* body = ctrl->GetRigidBody();
if (body->GetCollisionShape()->IsConvex()) if (body->GetCollisionShape()->IsConvex())
{ {
ConvexCast::CastResult rayResult; ConvexCast::CastResult rayResult;
rayResult.m_fraction = minFraction; rayResult.m_fraction = 1.f;
ConvexShape* convexShape = (ConvexShape*) body->GetCollisionShape(); ConvexShape* convexShape = (ConvexShape*) body->GetCollisionShape();
VoronoiSimplexSolver simplexSolver; VoronoiSimplexSolver simplexSolver;
@@ -831,41 +915,6 @@ PHY_IPhysicsController* CcdPhysicsEnvironment::rayTest(PHY_IPhysicsController* i
hitZ = rayResult.m_hitTransformA.getOrigin().getZ(); hitZ = rayResult.m_hitTransformA.getOrigin().getZ();
} }
} }
} else
{
if (body->GetCollisionShape()->IsConcave())
{
TriangleMeshShape* triangleMesh = (TriangleMeshShape*)body->GetCollisionShape();
SimdTransform worldToBody = body->getCenterOfMassTransform().inverse();
SimdVector3 rayFromLocal = worldToBody * rayFromTrans.getOrigin();
SimdVector3 rayToLocal = worldToBody * rayToTrans.getOrigin();
RaycastCallback rcb(rayFromLocal,rayToLocal);
rcb.m_hitFraction = minFraction;
SimdVector3 aabbMax(1e30f,1e30f,1e30f);
triangleMesh->ProcessAllTriangles(&rcb,-aabbMax,aabbMax);
if (rcb.m_hitFound && (rcb.m_hitFraction < minFraction))
{
printf("hit %f\n",rcb.m_hitFraction);
nearestHit = ctrl;
minFraction = rcb.m_hitFraction;
SimdVector3 hitNormalWorld = body->getCenterOfMassTransform()(rcb.m_hitNormalLocal);
normalX = hitNormalWorld.getX();
normalY = hitNormalWorld.getY();
normalZ = hitNormalWorld.getZ();
SimdVector3 hitWorld;
hitWorld.setInterpolate3(rayFromTrans.getOrigin(),rayToTrans.getOrigin(),rcb.m_hitFraction);
hitX = hitWorld.getX();
hitY = hitWorld.getY();
hitZ = hitWorld.getZ();
}
}
} }
} }