diff --git a/source/blender/src/buttons_shading.c b/source/blender/src/buttons_shading.c index 0e416a8ffda..92a67db69e8 100644 --- a/source/blender/src/buttons_shading.c +++ b/source/blender/src/buttons_shading.c @@ -1885,7 +1885,11 @@ static void world_panel_mistaph(World *wrld) #if GAMEBLENDER == 1 uiDefButI(block, MENU, 1, - "Physics %t|None %x0|Sumo %x2|Ode %x4 |Bullet %x5", +#ifdef USE_ODE + "Physics %t|None %x0|Sumo %x2|Ode %x4 |Bullet %x5", +#else + "Physics %t|None %x0|Sumo %x2|Bullet %x5", +#endif 10,180,140,19, &wrld->physicsEngine, 0, 0, 0, 0, "Physics Engine"); diff --git a/source/gameengine/Ketsji/KX_RaySensor.cpp b/source/gameengine/Ketsji/KX_RaySensor.cpp index 01d49cef777..b7d6ccab15b 100644 --- a/source/gameengine/Ketsji/KX_RaySensor.cpp +++ b/source/gameengine/Ketsji/KX_RaySensor.cpp @@ -40,7 +40,7 @@ #include "KX_ClientObjectInfo.h" #include "KX_GameObject.h" #include "KX_Scene.h" - +#include "KX_RayCast.h" #include "PHY_IPhysicsEnvironment.h" #include "KX_IPhysicsController.h" #include "PHY_IPhysicsController.h" @@ -103,6 +103,50 @@ bool KX_RaySensor::IsPositiveTrigger() return result; } +bool KX_RaySensor::RayHit(KX_ClientObjectInfo* client, MT_Point3& hit_point, MT_Vector3& hit_normal, void * const data) +{ + + KX_GameObject* hitKXObj = client->m_gameobject; + + if (client->m_type > KX_ClientObjectInfo::ACTOR) + { + // false hit + return false; + } + bool bFound = false; + + if (m_propertyname.Length() == 0) + { + bFound = true; + } + else + { + if (m_bFindMaterial) + { + if (client->m_auxilary_info) + { + bFound = (m_propertyname== ((char*)client->m_auxilary_info)); + } + } + else + { + bFound = hitKXObj->GetProperty(m_propertyname) != NULL; + } + } + + if (bFound) + { + m_rayHit = true; + m_hitObject = hitKXObj; + m_hitPosition = hit_point; + m_hitNormal = hit_normal; + + } + + return true; + +} + bool KX_RaySensor::Evaluate(CValue* event) @@ -188,101 +232,12 @@ bool KX_RaySensor::Evaluate(CValue* event) if (parent) parent->Release(); - do { - PHY_IPhysicsController* physCtrl = 0; -// frompoint, -// topoint, -// resultpoint, -// resultnormal); - - if (physCtrl) - { - - KX_ClientObjectInfo* info = static_cast(physCtrl->getNewClientInfo()); - bool bFound = false; - - if (!info) - { - std::cout<< "WARNING: Ray sensor ";// << GetName() << " cannot sense SM_Object " << hitObj << " - no client info.\n" << std::endl; - ready = true; - break; - } - - SCA_IObject *hitgameobj = info->m_gameobject; - - if (hitgameobj == obj || info->m_type > KX_ClientObjectInfo::ACTOR) - { -#ifdef NOPE - /* - // false hit - KX_IPhysicsController *hitspc = (static_cast (hitgameobj))->GetPhysicsController(); - if (hitspc) - { - /* We add 0.01 of fudge, so that if the margin && radius == 0., we don't endless loop. */ - MT_Scalar marg = 0.01;// + hitspc->getmargin(); - - if (hitspc->GetSumoObject()->getShapeProps()) - { - marg += 2*hitspc->GetSumoObject()->getShapeProps()->m_radius; - } - - /* Calculate the other side of this object */ - MT_Point3 hitObjPos; - hitspc->GetWorldPosition(hitObjPos); - MT_Vector3 hitvector = hitObjPos - resultpoint; - if (hitvector.dot(hitvector) > MT_EPSILON) - { - hitvector.normalize(); - marg *= 2.*todir.dot(hitvector); - } - frompoint = resultpoint + marg * todir; - } else { - ready = true; - } -#endif - ready = true; - } - else - { - ready = true; - if (m_propertyname.Length() == 0) - { - bFound = true; - } - else - { - if (m_bFindMaterial) - { - if (info->m_auxilary_info) - { - bFound = (m_propertyname== ((char*)info->m_auxilary_info)); - } - } - else - { - bFound = hitgameobj->GetProperty(m_propertyname) != NULL; - } - } - - if (bFound) - { - m_rayHit = true; - m_hitObject = hitgameobj; - m_hitPosition = resultpoint; - m_hitNormal = resultnormal; - - } - } - } - else - { - ready = true; - } - } - while (!ready); - + PHY_IPhysicsEnvironment* physics_environment = this->m_scene->GetPhysicsEnvironment(); + + result = KX_RayCast::RayTest(spc, physics_environment, frompoint, topoint, resultpoint, resultnormal, KX_RayCast::Callback(this)); + /* now pass this result to some controller */ if (m_rayHit) diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp index 5ddacd05d05..d9c5575f657 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp @@ -114,8 +114,15 @@ void CcdPhysicsController::PostProcessReplica(class PHY_IMotionState* motionsta // kinematic methods void CcdPhysicsController::RelativeTranslate(float dlocX,float dlocY,float dlocZ,bool local) { + SimdVector3 dloc(dlocX,dlocY,dlocZ); SimdTransform xform = m_body->getCenterOfMassTransform(); - xform.setOrigin(xform.getOrigin() + SimdVector3(dlocX,dlocY,dlocZ)); + + if (local) + { + dloc = xform.getBasis()*dloc; + } + + xform.setOrigin(xform.getOrigin() + dloc); this->m_body->setCenterOfMassTransform(xform); } @@ -152,7 +159,11 @@ void CcdPhysicsController::GetWorldOrientation(SimdMatrix3x3& mat) void CcdPhysicsController::getOrientation(float &quatImag0,float &quatImag1,float &quatImag2,float &quatReal) { - + SimdQuaternion q = m_body->getCenterOfMassTransform().getRotation(); + quatImag0 = q[0]; + quatImag1 = q[1]; + quatImag2 = q[2]; + quatReal = q[3]; } void CcdPhysicsController::setOrientation(float quatImag0,float quatImag1,float quatImag2,float quatReal) { @@ -184,26 +195,55 @@ void CcdPhysicsController::getPosition(PHY__Vector3& pos) const void CcdPhysicsController::setScaling(float scaleX,float scaleY,float scaleZ) { + if (m_body && m_body->GetCollisionShape()) + { + SimdVector3 scaling(scaleX,scaleY,scaleZ); + m_body->GetCollisionShape()->setLocalScaling(scaling); + } } // physics methods void CcdPhysicsController::ApplyTorque(float torqueX,float torqueY,float torqueZ,bool local) { + SimdVector3 torque(torqueX,torqueY,torqueZ); + SimdTransform xform = m_body->getCenterOfMassTransform(); + if (local) + { + torque = xform.getBasis()*torque; + } + m_body->applyTorque(torque); } + void CcdPhysicsController::ApplyForce(float forceX,float forceY,float forceZ,bool local) { + SimdVector3 force(forceX,forceX,forceX); + SimdTransform xform = m_body->getCenterOfMassTransform(); + if (local) + { + force = xform.getBasis()*force; + } + m_body->applyCentralForce(force); } void CcdPhysicsController::SetAngularVelocity(float ang_velX,float ang_velY,float ang_velZ,bool local) { SimdVector3 angvel(ang_velX,ang_velY,ang_velZ); + SimdTransform xform = m_body->getCenterOfMassTransform(); + if (local) + { + angvel = xform.getBasis()*angvel; + } m_body->setAngularVelocity(angvel); } void CcdPhysicsController::SetLinearVelocity(float lin_velX,float lin_velY,float lin_velZ,bool local) { - SimdVector3 linVel(lin_velX,lin_velY,lin_velZ); + SimdTransform xform = m_body->getCenterOfMassTransform(); + if (local) + { + linVel = xform.getBasis()*linVel; + } m_body->setLinearVelocity(linVel); } void CcdPhysicsController::applyImpulse(float attachX,float attachY,float attachZ, float impulseX,float impulseY,float impulseZ) @@ -223,9 +263,20 @@ void CcdPhysicsController::SetActive(bool active) // reading out information from physics void CcdPhysicsController::GetLinearVelocity(float& linvX,float& linvY,float& linvZ) { + const SimdVector3& linvel = this->m_body->getLinearVelocity(); + linvX = linvel.x(); + linvY = linvel.y(); + linvZ = linvel.z(); + } void CcdPhysicsController::GetVelocity(const float posX,const float posY,const float posZ,float& linvX,float& linvY,float& linvZ) { + SimdVector3 pos(posX,posY,posZ); + SimdVector3 rel_pos = pos-m_body->getCenterOfMassPosition(); + SimdVector3 linvel = m_body->getVelocityInLocalPoint(rel_pos); + linvX = linvel.x(); + linvY = linvel.y(); + linvZ = linvel.z(); } void CcdPhysicsController::getReactionForce(float& forceX,float& forceY,float& forceZ) {