mirror of
https://github.com/overte-org/overte.git
synced 2025-08-11 04:18:35 +02:00
MotionState also ferries velocity
This commit is contained in:
parent
1bed4eeb5b
commit
7fb7256a92
5 changed files with 56 additions and 4 deletions
|
@ -44,12 +44,14 @@ EntityMotionState::~EntityMotionState() {
|
||||||
// it is an opportunity for outside code to update the object's simulation position
|
// it is an opportunity for outside code to update the object's simulation position
|
||||||
void EntityMotionState::getWorldTransform (btTransform &worldTrans) const {
|
void EntityMotionState::getWorldTransform (btTransform &worldTrans) const {
|
||||||
btVector3 pos;
|
btVector3 pos;
|
||||||
glmToBullet(_entity->getPosition() - _cachedWorldOffset, pos);
|
glmToBullet(_entity->getPositionInMeters() - _cachedWorldOffset, pos);
|
||||||
worldTrans.setOrigin(pos);
|
worldTrans.setOrigin(pos);
|
||||||
|
|
||||||
btQuaternion rot;
|
btQuaternion rot;
|
||||||
glmToBullet(_entity->getRotation(), rot);
|
glmToBullet(_entity->getRotation(), rot);
|
||||||
worldTrans.setRotation(rot);
|
worldTrans.setRotation(rot);
|
||||||
|
|
||||||
|
applyVelocities();
|
||||||
}
|
}
|
||||||
|
|
||||||
// This callback is invoked by the physics simulation at the end of each simulation frame...
|
// This callback is invoked by the physics simulation at the end of each simulation frame...
|
||||||
|
@ -62,6 +64,19 @@ void EntityMotionState::setWorldTransform (const btTransform &worldTrans) {
|
||||||
glm::quat rot;
|
glm::quat rot;
|
||||||
bulletToGLM(worldTrans.getRotation(), rot);
|
bulletToGLM(worldTrans.getRotation(), rot);
|
||||||
_entity->setRotation(rot);
|
_entity->setRotation(rot);
|
||||||
|
|
||||||
|
glm::vec3 v;
|
||||||
|
getVelocity(v);
|
||||||
|
_entity->setVelocityInMeters(v);
|
||||||
|
getAngularVelocity(v);
|
||||||
|
_entity->setAngularVelocity(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityMotionState::applyVelocities() const {
|
||||||
|
if (_body) {
|
||||||
|
setVelocity(_entity->getVelocityInMeters());
|
||||||
|
setAngularVelocity(_entity->getAngularVelocity());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityMotionState::computeShapeInfo(ShapeInfo& info) {
|
void EntityMotionState::computeShapeInfo(ShapeInfo& info) {
|
||||||
|
|
|
@ -14,8 +14,11 @@
|
||||||
|
|
||||||
#ifdef USE_BULLET_PHYSICS
|
#ifdef USE_BULLET_PHYSICS
|
||||||
|
|
||||||
|
#include <AACube.h>
|
||||||
#include <CustomMotionState.h>
|
#include <CustomMotionState.h>
|
||||||
|
|
||||||
|
class EntityItem;
|
||||||
|
|
||||||
class EntityMotionState : public CustomMotionState {
|
class EntityMotionState : public CustomMotionState {
|
||||||
public:
|
public:
|
||||||
static void setWorldOffset(const glm::vec3& offset);
|
static void setWorldOffset(const glm::vec3& offset);
|
||||||
|
@ -24,10 +27,11 @@ public:
|
||||||
EntityMotionState(EntityItem* item);
|
EntityMotionState(EntityItem* item);
|
||||||
virtual ~EntityMotionState();
|
virtual ~EntityMotionState();
|
||||||
|
|
||||||
virtual void getWorldTransform (btTransform &worldTrans) const;
|
void getWorldTransform (btTransform &worldTrans) const;
|
||||||
virtual void setWorldTransform (const btTransform &worldTrans);
|
void setWorldTransform (const btTransform &worldTrans);
|
||||||
|
void applyVelocities() const;
|
||||||
|
|
||||||
virtual void computeShapeInfo(ShapeInfo& info);
|
void computeShapeInfo(ShapeInfo& info);
|
||||||
|
|
||||||
void getBoundingCubes(AACube& oldCube, AACube& newCube);
|
void getBoundingCubes(AACube& oldCube, AACube& newCube);
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "BulletUtil.h"
|
||||||
#include "CustomMotionState.h"
|
#include "CustomMotionState.h"
|
||||||
|
|
||||||
const float MIN_DENSITY = 200.0f;
|
const float MIN_DENSITY = 200.0f;
|
||||||
|
@ -58,4 +59,24 @@ void CustomMotionState::setVolume(float volume) {
|
||||||
_volume = btMax(btMin(fabsf(volume), MAX_VOLUME), MIN_VOLUME);
|
_volume = btMax(btMin(fabsf(volume), MAX_VOLUME), MIN_VOLUME);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CustomMotionState::setVelocity(const glm::vec3& velocity) const {
|
||||||
|
btVector3 v;
|
||||||
|
glmToBullet(velocity, v);
|
||||||
|
_body->setLinearVelocity(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CustomMotionState::setAngularVelocity(const glm::vec3& velocity) const {
|
||||||
|
btVector3 v;
|
||||||
|
glmToBullet(velocity, v);
|
||||||
|
_body->setAngularVelocity(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CustomMotionState::getVelocity(glm::vec3& velocityOut) const {
|
||||||
|
bulletToGLM(_body->getLinearVelocity(), velocityOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CustomMotionState::getAngularVelocity(glm::vec3& angularVelocityOut) const {
|
||||||
|
bulletToGLM(_body->getAngularVelocity(), angularVelocityOut);
|
||||||
|
}
|
||||||
|
|
||||||
#endif // USE_BULLET_PHYSICS
|
#endif // USE_BULLET_PHYSICS
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#ifdef USE_BULLET_PHYSICS
|
#ifdef USE_BULLET_PHYSICS
|
||||||
|
|
||||||
#include <btBulletDynamicsCommon.h>
|
#include <btBulletDynamicsCommon.h>
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
|
||||||
#include "ShapeInfo.h"
|
#include "ShapeInfo.h"
|
||||||
|
|
||||||
|
@ -33,6 +34,8 @@ public:
|
||||||
//virtual void getWorldTransform (btTransform &worldTrans) const;
|
//virtual void getWorldTransform (btTransform &worldTrans) const;
|
||||||
//virtual void setWorldTransform (const btTransform &worldTrans);
|
//virtual void setWorldTransform (const btTransform &worldTrans);
|
||||||
|
|
||||||
|
virtual void applyVelocities() const = 0;
|
||||||
|
|
||||||
virtual void computeShapeInfo(ShapeInfo& info) = 0;
|
virtual void computeShapeInfo(ShapeInfo& info) = 0;
|
||||||
|
|
||||||
MotionType getMotionType() const { return _motionType; }
|
MotionType getMotionType() const { return _motionType; }
|
||||||
|
@ -44,6 +47,12 @@ public:
|
||||||
|
|
||||||
float getMass() const { return _volume * _density; }
|
float getMass() const { return _volume * _density; }
|
||||||
|
|
||||||
|
void setVelocity(const glm::vec3& velocity) const;
|
||||||
|
void setAngularVelocity(const glm::vec3& velocity) const;
|
||||||
|
|
||||||
|
void getVelocity(glm::vec3& velocityOut) const;
|
||||||
|
void getAngularVelocity(glm::vec3& angularVelocityOut) const;
|
||||||
|
|
||||||
friend class PhysicsWorld;
|
friend class PhysicsWorld;
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
|
|
@ -104,8 +104,10 @@ bool PhysicsWorld::addEntity(CustomMotionState* motionState) {
|
||||||
shape->calculateLocalInertia(mass, inertia);
|
shape->calculateLocalInertia(mass, inertia);
|
||||||
btRigidBody* body = new btRigidBody(mass, motionState, shape, inertia);
|
btRigidBody* body = new btRigidBody(mass, motionState, shape, inertia);
|
||||||
motionState->_body = body;
|
motionState->_body = body;
|
||||||
|
motionState->applyVelocities();
|
||||||
// TODO: set dynamic/kinematic/static property from data stored in motionState
|
// TODO: set dynamic/kinematic/static property from data stored in motionState
|
||||||
_dynamicsWorld->addRigidBody(body);
|
_dynamicsWorld->addRigidBody(body);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -121,6 +123,7 @@ bool PhysicsWorld::removeEntity(CustomMotionState* motionState) {
|
||||||
_shapeManager.releaseShape(info);
|
_shapeManager.releaseShape(info);
|
||||||
delete body;
|
delete body;
|
||||||
motionState->_body = NULL;
|
motionState->_body = NULL;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue