diff --git a/rwengine/src/objects/GameObject.cpp b/rwengine/src/objects/GameObject.cpp index 07a6c1fa..25579af9 100644 --- a/rwengine/src/objects/GameObject.cpp +++ b/rwengine/src/objects/GameObject.cpp @@ -1,5 +1,7 @@ #include "objects/GameObject.hpp" +#include + #include #include #include @@ -40,3 +42,21 @@ glm::mat4 GameObject::getTimeAdjustedTransform(float alpha) const { t = t * glm::mat4_cast(glm::slerp(_lastRotation, getRotation(), alpha)); return t; } + +void GameObject::updateTransform(const glm::vec3& pos, const glm::quat& rot) { + _lastPosition = position; + _lastRotation = rotation; + position = pos; + rotation = rot; + + const auto& clump = getClump(); + const auto& atomic = getAtomic(); + if (clump) { + clump->getFrame()->setRotation(glm::mat3_cast(rot)); + clump->getFrame()->setTranslation(pos); + } + if (atomic) { + atomic->getFrame()->setRotation(glm::mat3_cast(rot)); + atomic->getFrame()->setTranslation(pos); + } +} diff --git a/rwengine/src/objects/GameObject.hpp b/rwengine/src/objects/GameObject.hpp index 93148d16..aae6862f 100644 --- a/rwengine/src/objects/GameObject.hpp +++ b/rwengine/src/objects/GameObject.hpp @@ -270,12 +270,7 @@ public: } } - virtual void updateTransform(const glm::vec3& pos, const glm::quat& rot) { - _lastPosition = position; - _lastRotation = rotation; - position = pos; - rotation = rot; - } + void updateTransform(const glm::vec3& pos, const glm::quat& rot); private: ObjectLifetime lifetime = GameObject::UnknownLifetime; diff --git a/rwengine/src/objects/InstanceObject.cpp b/rwengine/src/objects/InstanceObject.cpp index 37a45e18..80191ab8 100644 --- a/rwengine/src/objects/InstanceObject.cpp +++ b/rwengine/src/objects/InstanceObject.cpp @@ -270,11 +270,3 @@ void InstanceObject::setSolid(bool solid) { } body->getBulletBody()->setCollisionFlags(flags); } - -void InstanceObject::updateTransform(const glm::vec3& pos, - const glm::quat& rot) { - position = pos; - rotation = rot; - getAtomic()->getFrame()->setRotation(glm::mat3_cast(rot)); - getAtomic()->getFrame()->setTranslation(pos); -} diff --git a/rwengine/src/objects/InstanceObject.hpp b/rwengine/src/objects/InstanceObject.hpp index 3e36f1b1..eef7d3b7 100644 --- a/rwengine/src/objects/InstanceObject.hpp +++ b/rwengine/src/objects/InstanceObject.hpp @@ -86,8 +86,6 @@ public: float getHealth() const { return health; } - - void updateTransform(const glm::vec3& pos, const glm::quat& rot) override; }; #endif diff --git a/rwengine/src/objects/ProjectileObject.cpp b/rwengine/src/objects/ProjectileObject.cpp index 6002fd9d..58144f26 100644 --- a/rwengine/src/objects/ProjectileObject.cpp +++ b/rwengine/src/objects/ProjectileObject.cpp @@ -117,8 +117,9 @@ void ProjectileObject::cleanup() { ProjectileObject::ProjectileObject(GameWorld* world, const glm::vec3& position, const ProjectileObject::ProjectileInfo& info) - : GameObject(world, position, glm::quat{1.0f,0.0f,0.0f,0.0f}, nullptr) - , _info(info) { + : GameObject(world, position, glm::quat{1.0f, 0.0f, 0.0f, 0.0f}, nullptr) + , _info(info) + , _motionState(this) { _shape = std::make_unique(0.45f); btVector3 inertia(0.f, 0.f, 0.f); _shape->calculateLocalInertia(1.f, inertia); @@ -130,6 +131,7 @@ ProjectileObject::ProjectileObject(GameWorld* world, const glm::vec3& position, ws.setOrigin(btVector3(position.x, position.y, position.z)); riginfo.m_startWorldTransform = ws; riginfo.m_mass = 1.f; + riginfo.m_motionState = &_motionState; _body = std::make_unique(riginfo); _body->setUserPointer(this); @@ -173,12 +175,6 @@ ProjectileObject::~ProjectileObject() { void ProjectileObject::tick(float dt) { if (_body == nullptr) return; - auto& bttr = _body->getWorldTransform(); - position = {bttr.getOrigin().x(), bttr.getOrigin().y(), - bttr.getOrigin().z()}; - auto r = bttr.getRotation(); - rotation = {r.x(), r.y(), r.z(), r.w()}; - _info.time -= dt; if (_ghostBody) { diff --git a/rwengine/src/objects/ProjectileObject.hpp b/rwengine/src/objects/ProjectileObject.hpp index 542b97eb..c7c89d85 100644 --- a/rwengine/src/objects/ProjectileObject.hpp +++ b/rwengine/src/objects/ProjectileObject.hpp @@ -1,13 +1,12 @@ #ifndef _RWENGINE_PROJECTILEOBJECT_HPP_ #define _RWENGINE_PROJECTILEOBJECT_HPP_ +#include #include #include "render/VisualFX.hpp" - class GameWorld; class btPairCachingGhostObject; -class btRigidBody; class btSphereShape; struct WeaponData; @@ -51,6 +50,8 @@ private: /** Used for RPGs and Molotov collision detection */ std::unique_ptr _ghostBody; + GameObjectMotionState _motionState; + bool _exploded = false; void checkPhysicsContact(); diff --git a/rwengine/src/objects/VehicleObject.cpp b/rwengine/src/objects/VehicleObject.cpp index b52960e4..a4374809 100644 --- a/rwengine/src/objects/VehicleObject.cpp +++ b/rwengine/src/objects/VehicleObject.cpp @@ -309,14 +309,6 @@ void VehicleObject::setRotation(const glm::quat& orientation) { GameObject::setRotation(orientation); } -void VehicleObject::updateTransform(const glm::vec3& pos, - const glm::quat& rot) { - position = pos; - rotation = rot; - getClump()->getFrame()->setRotation(glm::mat3_cast(rot)); - getClump()->getFrame()->setTranslation(pos); -} - void VehicleObject::setExtraEnabled(size_t extra, bool enabled) { auto atomic = extras_.at(extra); if (!atomic) { diff --git a/rwengine/src/objects/VehicleObject.hpp b/rwengine/src/objects/VehicleObject.hpp index b7ccdcea..fac730ff 100644 --- a/rwengine/src/objects/VehicleObject.hpp +++ b/rwengine/src/objects/VehicleObject.hpp @@ -106,8 +106,6 @@ public: glm::vec3 getCenterOffset() override; - void updateTransform(const glm::vec3& pos, const glm::quat& rot) override; - VehicleModelInfo* getVehicle() const { return getModelInfo(); } diff --git a/rwengine/src/render/ObjectRenderer.cpp b/rwengine/src/render/ObjectRenderer.cpp index 3d23245d..fb08208b 100644 --- a/rwengine/src/render/ObjectRenderer.cpp +++ b/rwengine/src/render/ObjectRenderer.cpp @@ -339,9 +339,8 @@ void ObjectRenderer::renderCutsceneObject(CutsceneObject* cutscene, void ObjectRenderer::renderProjectile(ProjectileObject* projectile, RenderList& outList) { - glm::mat4 modelMatrix = projectile->getTimeAdjustedTransform(m_renderAlpha); const auto& atomic = projectile->getAtomic(); - renderAtomic(atomic.get(), modelMatrix, nullptr, outList); + renderAtomic(atomic.get(), glm::mat4(1.0f), nullptr, outList); } void ObjectRenderer::buildRenderList(GameObject* object, RenderList& outList) {