From 0507bfdae61a52cde3f4dba52b5cbf7e780ab6ae Mon Sep 17 00:00:00 2001 From: Daniel Evans Date: Mon, 27 Apr 2015 04:12:58 +0100 Subject: [PATCH] Fix Dynamic objects not visually moving --- rwengine/include/objects/InstanceObject.hpp | 3 ++ rwengine/src/objects/InstanceObject.cpp | 30 ++++++++++++++++-- rwgame/RWGame.cpp | 34 ++++++++------------- rwgame/RWGame.hpp | 1 + 4 files changed, 44 insertions(+), 24 deletions(-) diff --git a/rwengine/include/objects/InstanceObject.hpp b/rwengine/include/objects/InstanceObject.hpp index 9b686495..34df7509 100644 --- a/rwengine/include/objects/InstanceObject.hpp +++ b/rwengine/include/objects/InstanceObject.hpp @@ -30,6 +30,9 @@ public: void changeModel(std::shared_ptr incoming); + virtual glm::vec3 getPosition() const; + virtual glm::quat getRotation() const; + virtual void setRotation(const glm::quat& r); virtual bool takeDamage(const DamageInfo& damage); diff --git a/rwengine/src/objects/InstanceObject.cpp b/rwengine/src/objects/InstanceObject.cpp index d88b642f..35251e37 100644 --- a/rwengine/src/objects/InstanceObject.cpp +++ b/rwengine/src/objects/InstanceObject.cpp @@ -47,6 +47,10 @@ void InstanceObject::tick(float dt) engine->dynamicsWorld->addRigidBody(body->body); } } + else + { + _updateLastTransform(); + } auto _bws = body->body->getWorldTransform().getOrigin(); glm::vec3 ws(_bws.x(), _bws.y(), _bws.z()); @@ -115,20 +119,40 @@ void InstanceObject::changeModel(std::shared_ptr incoming) { if( body ) { delete body; + body = nullptr; } object = incoming; if( incoming ) { - body = new CollisionInstance; + auto bod = new CollisionInstance; - if( body->createPhysicsBody(this, object->modelName, dynamics.get()) ) + if( bod->createPhysicsBody(this, object->modelName, dynamics.get()) ) { - body->body->setActivationState(ISLAND_SLEEPING); + bod->body->setActivationState(ISLAND_SLEEPING); + body = bod; } } } +glm::vec3 InstanceObject::getPosition() const +{ + if( body ) { + btVector3 Pos = body->body->getWorldTransform().getOrigin(); + return glm::vec3(Pos.x(), Pos.y(), Pos.z()); + } + return position; +} + +glm::quat InstanceObject::getRotation() const +{ + if( body ) { + btQuaternion rot = body->body->getWorldTransform().getRotation(); + return glm::quat(rot.w(), rot.x(), rot.y(), rot.z()); + } + return rotation; +} + void InstanceObject::setRotation(const glm::quat &r) { if( body ) { diff --git a/rwgame/RWGame.cpp b/rwgame/RWGame.cpp index c14d4cde..4e13d43f 100644 --- a/rwgame/RWGame.cpp +++ b/rwgame/RWGame.cpp @@ -27,7 +27,7 @@ StdOutReciever logPrinter; RWGame::RWGame(const std::string& gamepath, int argc, char* argv[]) : state(nullptr), engine(nullptr), renderer(nullptr), script(nullptr), inFocus(true), - showDebugStats(false), showDebugPaths(false), + showDebugStats(false), showDebugPaths(false), showDebugPhysics(false), accum(0.f), timescale(1.f) { size_t w = GAME_WINDOW_WIDTH, h = GAME_WINDOW_HEIGHT; @@ -434,26 +434,6 @@ void RWGame::render(float alpha, float time) auto rendertime = renderer->getRenderer()->popDebugGroup(); -#if 0 - debug->setShaderProgram(engine->renderer.worldProg); - if( engine->state.player ) - { - if( engine->state.player->getCharacter()->getCurrentVehicle() ) - { - auto v = engine->state.player->getCharacter()->getCurrentVehicle(); - for( auto& p : v->dynamicParts ) - { - if( p.second.body ) - { - engine->dynamicsWorld->debugDrawObject(p.second.body->getWorldTransform(), p.second.body->getCollisionShape(), btVector3(1.f, 0.f, 0.f)); - engine->dynamicsWorld->debugDrawConstraint(p.second.constraint); - } - } - } - } - debug->flush(&engine->renderer); -#endif - if( showDebugPaths ) { renderDebugPaths(time); @@ -463,6 +443,15 @@ void RWGame::render(float alpha, float time) { renderDebugStats(time, rendertime); } + + if( showDebugPhysics ) + { + if( engine ) + { + engine->dynamicsWorld->debugDrawWorld(); + debug->flush(renderer); + } + } drawOnScreenText(engine, renderer); } @@ -612,6 +601,9 @@ void RWGame::globalKeyEvent(const sf::Event& event) case sf::Keyboard::F2: showDebugPaths = ! showDebugPaths; break; + case sf::Keyboard::F3: + showDebugPhysics = ! showDebugPhysics; + break; default: break; } } diff --git a/rwgame/RWGame.hpp b/rwgame/RWGame.hpp index 882e3695..1e1467a2 100644 --- a/rwgame/RWGame.hpp +++ b/rwgame/RWGame.hpp @@ -27,6 +27,7 @@ class RWGame ViewCamera lastCam, nextCam; bool showDebugStats; bool showDebugPaths; + bool showDebugPhysics; int lastDraws; /// Number of draws issued for the last frame. float accum;