mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-04-26 14:55:39 +00:00
Makes vehicles work with the physics plugins.
Makes vehicles create a basic physics body when using one of the physics plugins so that they can collide with other physics-enabled objects. Based on @rextimmy 's work.
This commit is contained in:
parent
5122360552
commit
37e030f8f4
9 changed files with 161 additions and 2 deletions
|
|
@ -46,6 +46,9 @@
|
|||
#include "gfx/primBuilder.h"
|
||||
#include "gfx/gfxDrawUtil.h"
|
||||
#include "materials/materialDefinition.h"
|
||||
#include "T3D/physics/physicsPlugin.h"
|
||||
#include "T3D/physics/physicsBody.h"
|
||||
#include "T3D/physics/physicsCollision.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
|
@ -203,7 +206,8 @@ VehicleData::VehicleData()
|
|||
dMemset(waterSound, 0, sizeof(waterSound));
|
||||
|
||||
collDamageThresholdVel = 20;
|
||||
collDamageMultiplier = 0.05f;
|
||||
collDamageMultiplier = 0.05f;
|
||||
enablePhysicsRep = true;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -315,6 +319,7 @@ void VehicleData::packData(BitStream* stream)
|
|||
stream->write(softSplashSoundVel);
|
||||
stream->write(medSplashSoundVel);
|
||||
stream->write(hardSplashSoundVel);
|
||||
stream->write(enablePhysicsRep);
|
||||
|
||||
// write the water sound profiles
|
||||
for(i = 0; i < MaxSounds; i++)
|
||||
|
|
@ -411,6 +416,7 @@ void VehicleData::unpackData(BitStream* stream)
|
|||
stream->read(&softSplashSoundVel);
|
||||
stream->read(&medSplashSoundVel);
|
||||
stream->read(&hardSplashSoundVel);
|
||||
stream->read(&enablePhysicsRep);
|
||||
|
||||
// write the water sound profiles
|
||||
for(i = 0; i < MaxSounds; i++)
|
||||
|
|
@ -465,6 +471,11 @@ void VehicleData::unpackData(BitStream* stream)
|
|||
|
||||
void VehicleData::initPersistFields()
|
||||
{
|
||||
addGroup("Physics");
|
||||
addField("enablePhysicsRep", TypeBool, Offset(enablePhysicsRep, VehicleData),
|
||||
"@brief Creates a representation of the object in the physics plugin.\n");
|
||||
endGroup("Physics");
|
||||
|
||||
addField( "jetForce", TypeF32, Offset(jetForce, VehicleData),
|
||||
"@brief Additional force applied to the vehicle when it is jetting.\n\n"
|
||||
"For WheeledVehicles, the force is applied in the forward direction. For "
|
||||
|
|
@ -682,6 +693,8 @@ Vehicle::Vehicle()
|
|||
mWorkingQueryBox.minExtents.set(-1e9f, -1e9f, -1e9f);
|
||||
mWorkingQueryBox.maxExtents.set(-1e9f, -1e9f, -1e9f);
|
||||
mWorkingQueryBoxCountDown = sWorkingQueryBoxStaleThreshold;
|
||||
|
||||
mPhysicsRep = NULL;
|
||||
}
|
||||
|
||||
U32 Vehicle::getCollisionMask()
|
||||
|
|
@ -695,6 +708,25 @@ Point3F Vehicle::getVelocity() const
|
|||
return mRigid.linVelocity;
|
||||
}
|
||||
|
||||
void Vehicle::_createPhysics()
|
||||
{
|
||||
SAFE_DELETE(mPhysicsRep);
|
||||
|
||||
if (!PHYSICSMGR || !mDataBlock->enablePhysicsRep)
|
||||
return;
|
||||
|
||||
TSShape *shape = mShapeInstance->getShape();
|
||||
PhysicsCollision *colShape = NULL;
|
||||
colShape = shape->buildColShape(false, getScale());
|
||||
|
||||
if (colShape)
|
||||
{
|
||||
PhysicsWorld *world = PHYSICSMGR->getWorld(isServerObject() ? "server" : "client");
|
||||
mPhysicsRep = PHYSICSMGR->createBody();
|
||||
mPhysicsRep->init(colShape, 0, PhysicsBody::BF_KINEMATIC, this, world);
|
||||
mPhysicsRep->setTransform(getTransform());
|
||||
}
|
||||
}
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
bool Vehicle::onAdd()
|
||||
|
|
@ -776,11 +808,15 @@ bool Vehicle::onAdd()
|
|||
mConvex.box.maxExtents.convolve(mObjScale);
|
||||
mConvex.findNodeTransform();
|
||||
|
||||
_createPhysics();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Vehicle::onRemove()
|
||||
{
|
||||
SAFE_DELETE(mPhysicsRep);
|
||||
|
||||
U32 i=0;
|
||||
for( i=0; i<VehicleData::VC_NUM_DUST_EMITTERS; i++ )
|
||||
{
|
||||
|
|
@ -880,6 +916,11 @@ void Vehicle::processTick(const Move* move)
|
|||
setPosition(mRigid.linPosition, mRigid.angPosition);
|
||||
setMaskBits(PositionMask);
|
||||
updateContainer();
|
||||
|
||||
//TODO: Only update when position has actually changed
|
||||
//no need to check if mDataBlock->enablePhysicsRep is false as mPhysicsRep will be NULL if it is
|
||||
if (mPhysicsRep)
|
||||
mPhysicsRep->moveKinematicTo(getTransform());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -127,6 +127,8 @@ struct VehicleData: public ShapeBaseData
|
|||
F32 splashFreqMod;
|
||||
F32 splashVelEpsilon;
|
||||
|
||||
bool enablePhysicsRep;
|
||||
|
||||
//
|
||||
VehicleData();
|
||||
bool preload(bool server, String &errorStr);
|
||||
|
|
@ -142,6 +144,7 @@ struct VehicleData: public ShapeBaseData
|
|||
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
class PhysicsBody;
|
||||
|
||||
class Vehicle: public ShapeBase
|
||||
{
|
||||
|
|
@ -177,6 +180,8 @@ class Vehicle: public ShapeBase
|
|||
Point3F cameraRotVec;
|
||||
};
|
||||
|
||||
PhysicsBody *mPhysicsRep;
|
||||
|
||||
StateDelta mDelta;
|
||||
S32 mPredictionCount; ///< Number of ticks to predict
|
||||
VehicleData* mDataBlock;
|
||||
|
|
@ -262,6 +267,8 @@ public:
|
|||
bool onAdd();
|
||||
void onRemove();
|
||||
|
||||
void _createPhysics();
|
||||
|
||||
/// Interpolates between move ticks @see processTick
|
||||
/// @param dt Change in time between the last call and this call to the function
|
||||
void interpolateTick(F32 dt);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue