GL - merge with physics
This commit is contained in:
commit
6d7893c6e9
|
@ -47,7 +47,7 @@ API_Impl::~API_Impl()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bullet physics
|
// Bullet physics
|
||||||
ICustomBody* API_Impl::AddCollisionSphere(float radius, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass)
|
ICustomBody* API_Impl::AddCollisionSphere(float radius, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass, float restitution, float staticFriction, float dynamicFriction)
|
||||||
{
|
{
|
||||||
SimpleRigidBody* body = new SimpleRigidBody;
|
SimpleRigidBody* body = new SimpleRigidBody;
|
||||||
|
|
||||||
|
@ -64,6 +64,8 @@ ICustomBody* API_Impl::AddCollisionSphere(float radius, ::Oyster::Math::Float4 r
|
||||||
collisionShape->calculateLocalInertia(mass, fallInertia);
|
collisionShape->calculateLocalInertia(mass, fallInertia);
|
||||||
btRigidBody::btRigidBodyConstructionInfo rigidBodyCI(mass, motionState, collisionShape, fallInertia);
|
btRigidBody::btRigidBodyConstructionInfo rigidBodyCI(mass, motionState, collisionShape, fallInertia);
|
||||||
btRigidBody* rigidBody = new btRigidBody(rigidBodyCI);
|
btRigidBody* rigidBody = new btRigidBody(rigidBodyCI);
|
||||||
|
rigidBody->setFriction(staticFriction);
|
||||||
|
rigidBody->setRestitution(restitution);
|
||||||
rigidBody->setUserPointer(body);
|
rigidBody->setUserPointer(body);
|
||||||
body->SetRigidBody(rigidBody);
|
body->SetRigidBody(rigidBody);
|
||||||
|
|
||||||
|
@ -73,7 +75,8 @@ ICustomBody* API_Impl::AddCollisionSphere(float radius, ::Oyster::Math::Float4 r
|
||||||
|
|
||||||
return body;
|
return body;
|
||||||
}
|
}
|
||||||
ICustomBody* API_Impl::AddCollisionBox(Float3 halfSize, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass)
|
|
||||||
|
ICustomBody* API_Impl::AddCollisionBox(Float3 halfSize, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass, float restitution, float staticFriction, float dynamicFriction)
|
||||||
{
|
{
|
||||||
SimpleRigidBody* body = new SimpleRigidBody;
|
SimpleRigidBody* body = new SimpleRigidBody;
|
||||||
|
|
||||||
|
@ -90,6 +93,37 @@ ICustomBody* API_Impl::AddCollisionBox(Float3 halfSize, ::Oyster::Math::Float4 r
|
||||||
collisionShape->calculateLocalInertia(mass, fallInertia);
|
collisionShape->calculateLocalInertia(mass, fallInertia);
|
||||||
btRigidBody::btRigidBodyConstructionInfo rigidBodyCI(mass, motionState, collisionShape, fallInertia);
|
btRigidBody::btRigidBodyConstructionInfo rigidBodyCI(mass, motionState, collisionShape, fallInertia);
|
||||||
btRigidBody* rigidBody = new btRigidBody(rigidBodyCI);
|
btRigidBody* rigidBody = new btRigidBody(rigidBodyCI);
|
||||||
|
rigidBody->setFriction(staticFriction);
|
||||||
|
rigidBody->setRestitution(restitution);
|
||||||
|
rigidBody->setUserPointer(body);
|
||||||
|
body->SetRigidBody(rigidBody);
|
||||||
|
|
||||||
|
// Add rigid body to world
|
||||||
|
this->dynamicsWorld->addRigidBody(rigidBody);
|
||||||
|
this->customBodies.push_back(body);
|
||||||
|
|
||||||
|
return body;
|
||||||
|
}
|
||||||
|
|
||||||
|
ICustomBody* API_Impl::AddCollisionCylinder(::Oyster::Math::Float3 halfSize, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass, float restitution, float staticFriction, float dynamicFriction)
|
||||||
|
{
|
||||||
|
SimpleRigidBody* body = new SimpleRigidBody;
|
||||||
|
|
||||||
|
// Add collision shape
|
||||||
|
btCollisionShape* collisionShape = new btCylinderShape(btVector3(halfSize.x, halfSize.y, halfSize.z));
|
||||||
|
body->SetCollisionShape(collisionShape);
|
||||||
|
|
||||||
|
// Add motion state
|
||||||
|
btDefaultMotionState* motionState = new btDefaultMotionState(btTransform(btQuaternion(rotation.x, rotation.y, rotation.z, rotation.w),btVector3(position.x, position.y, position.z)));
|
||||||
|
body->SetMotionState(motionState);
|
||||||
|
|
||||||
|
// Add rigid body
|
||||||
|
btVector3 fallInertia(0, 0, 0);
|
||||||
|
collisionShape->calculateLocalInertia(mass, fallInertia);
|
||||||
|
btRigidBody::btRigidBodyConstructionInfo rigidBodyCI(mass, motionState, collisionShape, fallInertia);
|
||||||
|
btRigidBody* rigidBody = new btRigidBody(rigidBodyCI);
|
||||||
|
rigidBody->setFriction(staticFriction);
|
||||||
|
rigidBody->setRestitution(restitution);
|
||||||
rigidBody->setUserPointer(body);
|
rigidBody->setUserPointer(body);
|
||||||
body->SetRigidBody(rigidBody);
|
body->SetRigidBody(rigidBody);
|
||||||
|
|
||||||
|
@ -108,19 +142,15 @@ void API_Impl::UpdateWorld()
|
||||||
|
|
||||||
for(unsigned int i = 0; i < this->customBodies.size(); i++ )
|
for(unsigned int i = 0; i < this->customBodies.size(); i++ )
|
||||||
{
|
{
|
||||||
this->customBodies[i]->GetState(state);
|
|
||||||
|
|
||||||
btTransform trans;
|
btTransform trans;
|
||||||
dynamic_cast<SimpleRigidBody*>(this->customBodies[i])->GetMotionState()->getWorldTransform(trans);
|
dynamic_cast<SimpleRigidBody*>(this->customBodies[i])->GetMotionState()->getWorldTransform(trans);
|
||||||
state.centerPos = Float3(trans.getOrigin().x(), trans.getOrigin().y(), trans.getOrigin().z());
|
this->customBodies[i]->SetPosition(Float3(trans.getOrigin().x(), trans.getOrigin().y(), trans.getOrigin().z()));
|
||||||
state.quaternion = Quaternion(Float3(trans.getRotation().x(), trans.getRotation().y(), trans.getRotation().z()), trans.getRotation().w());
|
this->customBodies[i]->SetRotation(Quaternion(Float3(trans.getRotation().x(), trans.getRotation().y(), trans.getRotation().z()), trans.getRotation().w()));
|
||||||
|
|
||||||
if(dynamic_cast<SimpleRigidBody*>(this->customBodies[i])->GetRigidBody()->getActivationState() == ACTIVE_TAG)
|
if(dynamic_cast<SimpleRigidBody*>(this->customBodies[i])->GetRigidBody()->getActivationState() == ACTIVE_TAG)
|
||||||
{
|
{
|
||||||
dynamic_cast<SimpleRigidBody*>(this->customBodies[i])->CallSubscription_Move();
|
dynamic_cast<SimpleRigidBody*>(this->customBodies[i])->CallSubscription_Move();
|
||||||
}
|
}
|
||||||
|
|
||||||
this->customBodies[i]->SetState(state);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int numManifolds = this->dynamicsWorld->getDispatcher()->getNumManifolds();
|
int numManifolds = this->dynamicsWorld->getDispatcher()->getNumManifolds();
|
||||||
|
|
|
@ -22,8 +22,9 @@ namespace Oyster
|
||||||
void ReleaseFromLimbo( const ICustomBody* objRef );
|
void ReleaseFromLimbo( const ICustomBody* objRef );
|
||||||
|
|
||||||
// Bullet physics
|
// Bullet physics
|
||||||
ICustomBody* AddCollisionSphere(float radius, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass);
|
ICustomBody* AddCollisionSphere(float radius, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass, float restitution, float staticFriction, float dynamicFriction);
|
||||||
ICustomBody* AddCollisionBox(::Oyster::Math::Float3 halfSize, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass);
|
ICustomBody* AddCollisionBox(::Oyster::Math::Float3 halfSize, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass, float restitution, float staticFriction, float dynamicFriction);
|
||||||
|
ICustomBody* AddCollisionCylinder(::Oyster::Math::Float3 halfSize, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass, float restitution, float staticFriction, float dynamicFriction);
|
||||||
|
|
||||||
void UpdateWorld();
|
void UpdateWorld();
|
||||||
|
|
||||||
|
|
|
@ -64,6 +64,67 @@ void SimpleRigidBody::SetSubscription(EventAction_Move function)
|
||||||
this->onMovement = function;
|
this->onMovement = function;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SimpleRigidBody::SetLinearVelocity(Float3 velocity)
|
||||||
|
{
|
||||||
|
this->rigidBody->setLinearVelocity(btVector3(velocity.x, velocity.y, velocity.z));
|
||||||
|
}
|
||||||
|
|
||||||
|
void SimpleRigidBody::SetPosition(::Oyster::Math::Float3 position)
|
||||||
|
{
|
||||||
|
btTransform trans;
|
||||||
|
this->motionState->getWorldTransform(trans);
|
||||||
|
trans.setOrigin(btVector3(position.x, position.y, position.z));
|
||||||
|
this->motionState->setWorldTransform(trans);
|
||||||
|
this->state.centerPos = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SimpleRigidBody::SetRotation(Float4 quaternion)
|
||||||
|
{
|
||||||
|
btTransform trans;
|
||||||
|
this->motionState->getWorldTransform(trans);
|
||||||
|
trans.setRotation(btQuaternion(quaternion.x, quaternion.y, quaternion.z, quaternion.w));
|
||||||
|
this->motionState->setWorldTransform(trans);
|
||||||
|
this->state.quaternion = Quaternion(quaternion.xyz, quaternion.w);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SimpleRigidBody::SetRotation(::Oyster::Math::Quaternion quaternion)
|
||||||
|
{
|
||||||
|
btTransform trans;
|
||||||
|
this->motionState->getWorldTransform(trans);
|
||||||
|
trans.setRotation(btQuaternion(quaternion.imaginary.x, quaternion.imaginary.y, quaternion.imaginary.z, quaternion.real));
|
||||||
|
this->motionState->setWorldTransform(trans);
|
||||||
|
this->state.quaternion = quaternion;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SimpleRigidBody::SetRotation(Float3 eulerAngles)
|
||||||
|
{
|
||||||
|
btTransform trans;
|
||||||
|
this->motionState->getWorldTransform(trans);
|
||||||
|
trans.setRotation(btQuaternion(eulerAngles.x, eulerAngles.y, eulerAngles.z));
|
||||||
|
this->motionState->setWorldTransform(trans);
|
||||||
|
this->state.quaternion = Quaternion(Float3(trans.getRotation().x(), trans.getRotation().y(), trans.getRotation().z()), trans.getRotation().w());
|
||||||
|
}
|
||||||
|
|
||||||
|
Float4x4 SimpleRigidBody::GetRotation() const
|
||||||
|
{
|
||||||
|
return this->state.GetRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
Float4x4 SimpleRigidBody::GetOrientation() const
|
||||||
|
{
|
||||||
|
return this->state.GetOrientation();
|
||||||
|
}
|
||||||
|
|
||||||
|
Float4x4 SimpleRigidBody::GetView() const
|
||||||
|
{
|
||||||
|
return this->state.GetView();
|
||||||
|
}
|
||||||
|
|
||||||
|
Float4x4 SimpleRigidBody::GetView( const ::Oyster::Math::Float3 &offset ) const
|
||||||
|
{
|
||||||
|
return this->state.GetView(offset);
|
||||||
|
}
|
||||||
|
|
||||||
void SimpleRigidBody::CallSubscription_AfterCollisionResponse(ICustomBody* bodyA, ICustomBody* bodyB, Oyster::Math::Float kineticEnergyLoss)
|
void SimpleRigidBody::CallSubscription_AfterCollisionResponse(ICustomBody* bodyA, ICustomBody* bodyB, Oyster::Math::Float kineticEnergyLoss)
|
||||||
{
|
{
|
||||||
if(this->onMovement)
|
if(this->onMovement)
|
||||||
|
@ -91,22 +152,6 @@ btRigidBody* SimpleRigidBody::GetRigidBody() const
|
||||||
return this->rigidBody;
|
return this->rigidBody;
|
||||||
}
|
}
|
||||||
|
|
||||||
SimpleRigidBody::State SimpleRigidBody::GetState() const
|
|
||||||
{
|
|
||||||
return this->state;
|
|
||||||
}
|
|
||||||
|
|
||||||
SimpleRigidBody::State & SimpleRigidBody::GetState( SimpleRigidBody::State &targetMem ) const
|
|
||||||
{
|
|
||||||
targetMem = this->state;
|
|
||||||
return targetMem;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SimpleRigidBody::SetState( const SimpleRigidBody::State &state )
|
|
||||||
{
|
|
||||||
this->state = state;
|
|
||||||
}
|
|
||||||
|
|
||||||
void * SimpleRigidBody::GetCustomTag() const
|
void * SimpleRigidBody::GetCustomTag() const
|
||||||
{
|
{
|
||||||
return this->customTag;
|
return this->customTag;
|
||||||
|
|
|
@ -21,13 +21,20 @@ namespace Oyster
|
||||||
void SetSubscription(EventAction_AfterCollisionResponse function);
|
void SetSubscription(EventAction_AfterCollisionResponse function);
|
||||||
void SetSubscription(EventAction_Move function);
|
void SetSubscription(EventAction_Move function);
|
||||||
|
|
||||||
|
void SetLinearVelocity(Math::Float3 velocity);
|
||||||
|
void SetPosition(::Oyster::Math::Float3 position);
|
||||||
|
void SetRotation(Math::Float4 quaternion);
|
||||||
|
void SetRotation(::Oyster::Math::Quaternion quaternion);
|
||||||
|
void SetRotation(Math::Float3 eulerAngles);
|
||||||
|
|
||||||
|
Math::Float4x4 GetRotation() const;
|
||||||
|
Math::Float4x4 GetOrientation() const;
|
||||||
|
Math::Float4x4 GetView() const;
|
||||||
|
Math::Float4x4 GetView( const ::Oyster::Math::Float3 &offset ) const;
|
||||||
|
|
||||||
void CallSubscription_AfterCollisionResponse(ICustomBody* bodyA, ICustomBody* bodyB, Math::Float kineticEnergyLoss);
|
void CallSubscription_AfterCollisionResponse(ICustomBody* bodyA, ICustomBody* bodyB, Math::Float kineticEnergyLoss);
|
||||||
void CallSubscription_Move();
|
void CallSubscription_Move();
|
||||||
|
|
||||||
State GetState() const;
|
|
||||||
State & GetState( State &targetMem ) const;
|
|
||||||
void SetState( const State &state );
|
|
||||||
|
|
||||||
btCollisionShape* GetCollisionShape() const;
|
btCollisionShape* GetCollisionShape() const;
|
||||||
btDefaultMotionState* GetMotionState() const;
|
btDefaultMotionState* GetMotionState() const;
|
||||||
btRigidBody* GetRigidBody() const;
|
btRigidBody* GetRigidBody() const;
|
||||||
|
|
|
@ -80,9 +80,9 @@ namespace Oyster
|
||||||
|
|
||||||
|
|
||||||
// Bullet physics
|
// Bullet physics
|
||||||
virtual ICustomBody* AddCollisionSphere(float radius, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass) = 0;
|
virtual ICustomBody* AddCollisionSphere(float radius, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass, float restitution, float staticFriction, float dynamicFriction) = 0;
|
||||||
|
virtual ICustomBody* AddCollisionBox(::Oyster::Math::Float3 halfSize, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass, float restitution, float staticFriction, float dynamicFriction) = 0;
|
||||||
virtual ICustomBody* AddCollisionBox(::Oyster::Math::Float3 halfSize, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass) = 0;
|
virtual ICustomBody* AddCollisionCylinder(::Oyster::Math::Float3 halfSize, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass, float restitution, float staticFriction, float dynamicFriction) = 0;
|
||||||
|
|
||||||
virtual void UpdateWorld() = 0;
|
virtual void UpdateWorld() = 0;
|
||||||
|
|
||||||
|
@ -123,27 +123,20 @@ namespace Oyster
|
||||||
|
|
||||||
virtual ~ICustomBody() {};
|
virtual ~ICustomBody() {};
|
||||||
|
|
||||||
/********************************************************
|
|
||||||
* Gets the current state of the rigid body
|
|
||||||
* @return the current state of the rigid body
|
|
||||||
********************************************************/
|
|
||||||
virtual State GetState() const = 0;
|
|
||||||
|
|
||||||
/********************************************************
|
|
||||||
* Gets the current state of the rigid body
|
|
||||||
* @param targetMem: The state is copied into targetMem
|
|
||||||
* @return the current state of the rigid body
|
|
||||||
********************************************************/
|
|
||||||
virtual State & GetState( State &targetMem ) const = 0;
|
|
||||||
|
|
||||||
/********************************************************
|
|
||||||
* Sets the current state of the rigid body
|
|
||||||
********************************************************/
|
|
||||||
virtual void SetState( const State &state ) = 0;
|
|
||||||
|
|
||||||
virtual void SetSubscription(EventAction_AfterCollisionResponse function) = 0;
|
virtual void SetSubscription(EventAction_AfterCollisionResponse function) = 0;
|
||||||
virtual void SetSubscription(EventAction_Move function) = 0;
|
virtual void SetSubscription(EventAction_Move function) = 0;
|
||||||
|
|
||||||
|
virtual void SetLinearVelocity(::Oyster::Math::Float3 velocity) = 0;
|
||||||
|
virtual void SetPosition(::Oyster::Math::Float3 position) = 0;
|
||||||
|
virtual void SetRotation(::Oyster::Math::Float4 quaternion) = 0;
|
||||||
|
virtual void SetRotation(::Oyster::Math::Quaternion quaternion) = 0;
|
||||||
|
virtual void SetRotation(::Oyster::Math::Float3 eulerAngles) = 0;
|
||||||
|
|
||||||
|
::Oyster::Math::Float4x4 GetRotation() const;
|
||||||
|
::Oyster::Math::Float4x4 GetOrientation() const;
|
||||||
|
::Oyster::Math::Float4x4 GetView() const;
|
||||||
|
::Oyster::Math::Float4x4 GetView( const ::Oyster::Math::Float3 &offset ) const;
|
||||||
|
|
||||||
/********************************************************
|
/********************************************************
|
||||||
* @return the void pointer set by SetCustomTag.
|
* @return the void pointer set by SetCustomTag.
|
||||||
|
|
|
@ -30,8 +30,7 @@ namespace Oyster
|
||||||
::Oyster::Math::Float4x4 GetOrientation() const;
|
::Oyster::Math::Float4x4 GetOrientation() const;
|
||||||
::Oyster::Math::Float4x4 GetView() const;
|
::Oyster::Math::Float4x4 GetView() const;
|
||||||
::Oyster::Math::Float4x4 GetView( const ::Oyster::Math::Float3 &offset ) const;
|
::Oyster::Math::Float4x4 GetView( const ::Oyster::Math::Float3 &offset ) const;
|
||||||
void CustomBodyState::ApplyFriction( const ::Oyster::Math::Float3 &j);
|
|
||||||
|
|
||||||
// Variables for state
|
// Variables for state
|
||||||
::Oyster::Math::Float mass, restitutionCoeff, staticFrictionCoeff, dynamicFrictionCoeff;
|
::Oyster::Math::Float mass, restitutionCoeff, staticFrictionCoeff, dynamicFrictionCoeff;
|
||||||
::Oyster::Math::Float3 reach, centerPos;
|
::Oyster::Math::Float3 reach, centerPos;
|
||||||
|
|
Loading…
Reference in New Issue