From b8982200b635b3651b1d496c9b0ca1e5c43c0e0f Mon Sep 17 00:00:00 2001 From: Benau Date: Tue, 15 May 2018 15:23:39 +0800 Subject: [PATCH] Fix track objects in network --- src/network/rewind_manager.cpp | 5 +++++ src/physics/physical_object.hpp | 2 ++ src/tracks/track_object.cpp | 3 +-- src/tracks/track_object_manager.cpp | 22 ++++++++++++++++++++++ src/tracks/track_object_manager.hpp | 2 ++ 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/network/rewind_manager.cpp b/src/network/rewind_manager.cpp index e3866b95e..0e1360167 100755 --- a/src/network/rewind_manager.cpp +++ b/src/network/rewind_manager.cpp @@ -27,6 +27,8 @@ #include "network/rewind_info.hpp" #include "physics/physics.hpp" #include "race/history.hpp" +#include "tracks/track.hpp" +#include "tracks/track_object_manager.hpp" #include "utils/log.hpp" #include "utils/profiler.hpp" @@ -318,6 +320,8 @@ void RewindManager::playEventsTill(int world_ticks, int *ticks) void RewindManager::rewindTo(int rewind_ticks, int now_ticks) { assert(!m_is_rewinding); + // TODO Do it properly for track objects like soccer ball + Track::getCurrentTrack()->getTrackObjectManager()->removeForRewind(); bool is_history = history->replayHistory(); history->setReplayHistory(false); @@ -384,5 +388,6 @@ void RewindManager::rewindTo(int rewind_ticks, int now_ticks) } history->setReplayHistory(is_history); + Track::getCurrentTrack()->getTrackObjectManager()->addForRewind(); m_is_rewinding = false; } // rewindTo diff --git a/src/physics/physical_object.hpp b/src/physics/physical_object.hpp index 2e1d40db7..49de86506 100644 --- a/src/physics/physical_object.hpp +++ b/src/physics/physical_object.hpp @@ -206,6 +206,8 @@ public: const Material **material, btVector3 *normal, bool interpolate_normal) const; + // ------------------------------------------------------------------------ + bool isDynamic() const { return m_is_dynamic; } // ------------------------------------------------------------------------ /** Returns the ID of this physical object. */ std::string getID() { return m_id; } diff --git a/src/tracks/track_object.cpp b/src/tracks/track_object.cpp index 9169392c1..392388868 100644 --- a/src/tracks/track_object.cpp +++ b/src/tracks/track_object.cpp @@ -535,6 +535,7 @@ void TrackObject::updateGraphics(float dt) // have been converted to use separate updateGraphics() calls. if (m_physical_object) m_physical_object->updateGraphics(dt); + if (m_animator) m_animator->update(dt); } // update @@ -546,10 +547,8 @@ void TrackObject::updateGraphics(float dt) void TrackObject::update(float dt) { if (m_presentation) m_presentation->update(dt); - if (m_physical_object) m_physical_object->update(dt); - if (m_animator) m_animator->update(dt); } // update // ---------------------------------------------------------------------------- diff --git a/src/tracks/track_object_manager.cpp b/src/tracks/track_object_manager.cpp index 89a7a5032..0fcda15c1 100644 --- a/src/tracks/track_object_manager.cpp +++ b/src/tracks/track_object_manager.cpp @@ -238,3 +238,25 @@ void TrackObjectManager::removeObject(TrackObject* obj) m_all_objects.remove(obj); delete obj; } // removeObject + +// ---------------------------------------------------------------------------- +void TrackObjectManager::removeForRewind() +{ + for (TrackObject* curr : m_all_objects) + { + if (curr->getPhysicalObject() && + curr->getPhysicalObject()->isDynamic()) + curr->getPhysicalObject()->removeBody(); + } +} // removeForRewind + +// ---------------------------------------------------------------------------- +void TrackObjectManager::addForRewind() +{ + for (TrackObject* curr : m_all_objects) + { + if (curr->getPhysicalObject() && + curr->getPhysicalObject()->isDynamic()) + curr->getPhysicalObject()->addBody(); + } +} // addForRewind diff --git a/src/tracks/track_object_manager.hpp b/src/tracks/track_object_manager.hpp index 979401057..feb8bf840 100644 --- a/src/tracks/track_object_manager.hpp +++ b/src/tracks/track_object_manager.hpp @@ -76,6 +76,8 @@ public: PtrVector& getObjects() { return m_all_objects; } const PtrVector& getObjects() const { return m_all_objects; } + void removeForRewind(); + void addForRewind(); }; // class TrackObjectManager