From a7bbe54ea6fda9bad6a43fce169c08e1bf8d2686 Mon Sep 17 00:00:00 2001 From: Benau Date: Fri, 2 Nov 2018 15:59:32 +0800 Subject: [PATCH] Fix stuttering of item rotation for big nitro switched by bubblegum --- src/items/item.cpp | 23 +++++++++++++++++------ src/items/item.hpp | 3 --- src/items/item_manager.hpp | 12 ++++++------ 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/items/item.cpp b/src/items/item.cpp index b7bf1b7dd..6808222b4 100644 --- a/src/items/item.cpp +++ b/src/items/item.cpp @@ -159,7 +159,6 @@ Item::Item(ItemType type, const Vec3& xyz, const Vec3& normal, initItem(type, xyz); m_graphical_type = type; m_original_rotation = shortestArcQuat(Vec3(0, 1, 0), normal); - m_rotation_angle = 0.0f; m_listener = NULL; LODNode* lodnode = @@ -210,7 +209,6 @@ Item::Item(const Vec3& xyz, float distance, TriggerItemListener* trigger) initItem(ITEM_TRIGGER, xyz); m_graphical_type = ITEM_TRIGGER; m_original_rotation = btQuaternion(0, 0, 0, 1); - m_rotation_angle = 0.0f; m_node = NULL; m_listener = trigger; m_was_available_previously = true; @@ -332,7 +330,6 @@ void Item::handleNewMesh(ItemType type) Vec3 hpr; hpr.setHPR(m_original_rotation); m_node->setRotation(hpr.toIrrHPR()); - m_rotation_angle = 0.0f; #endif } // handleNewMesh @@ -369,18 +366,32 @@ void Item::updateGraphics(float dt) if (!isAvailable() && time_till_return <= 1.0f) { // Make it visible by scaling it from 0 to 1: + if (rotating()) + { + float angle = + fmodf((float)(World::getWorld()->getTicksSinceStart() + + getTicksTillReturn()) / 40.0f, M_PI * 2); + btMatrix3x3 m; + m.setRotation(m_original_rotation); + btQuaternion r = btQuaternion(m.getColumn(1), angle) * + m_original_rotation; + Vec3 hpr; + hpr.setHPR(r); + m_node->setRotation(hpr.toIrrHPR()); + } m_node->setVisible(true); m_node->setScale(core::vector3df(1, 1, 1)*(1 - time_till_return)); } if (isAvailable() && rotating()) { // have it rotate - m_rotation_angle += dt * M_PI; - if (m_rotation_angle > M_PI * 2) m_rotation_angle -= M_PI * 2; + float angle = + fmodf((float)World::getWorld()->getTicksSinceStart() / 40.0f, + M_PI * 2); btMatrix3x3 m; m.setRotation(m_original_rotation); - btQuaternion r = btQuaternion(m.getColumn(1), m_rotation_angle) * + btQuaternion r = btQuaternion(m.getColumn(1), angle) * m_original_rotation; Vec3 hpr; diff --git a/src/items/item.hpp b/src/items/item.hpp index b7e8bcacb..857250651 100644 --- a/src/items/item.hpp +++ b/src/items/item.hpp @@ -323,9 +323,6 @@ private: * rotation). */ btQuaternion m_original_rotation; - /** Used when rotating the item */ - float m_rotation_angle; - /** Scene node of this item. */ LODNode *m_node; diff --git a/src/items/item_manager.hpp b/src/items/item_manager.hpp index 8219c1f07..f9f6f831d 100644 --- a/src/items/item_manager.hpp +++ b/src/items/item_manager.hpp @@ -56,12 +56,6 @@ protected: /** The instance of ItemManager while a race is on. */ static std::shared_ptr m_item_manager; - /** Stores all item models. */ - static std::vector m_item_mesh; - - /** Stores all low-resolution item models. */ - static std::vector m_item_lowres_mesh; - public: static void loadDefaultItemMeshes(); static void removeTextures(); @@ -116,6 +110,12 @@ private: * field is undefined if no Graph exist, e.g. arena without navmesh. */ std::vector< AllItemTypes > *m_items_in_quads; + /** Stores all item models. */ + static std::vector m_item_mesh; + + /** Stores all low-resolution item models. */ + static std::vector m_item_lowres_mesh; + protected: /** Remaining time that items should remain switched. If the * value is <0, it indicates that the items are not switched atm. */