From d4e9de1f5373acec89cc373ac02d070244f23c66 Mon Sep 17 00:00:00 2001 From: Benau Date: Thu, 27 Oct 2016 09:41:01 +0800 Subject: [PATCH] Fix non-animated karts --- src/graphics/irr_driver.cpp | 6 ++++-- src/graphics/irr_driver.hpp | 3 ++- src/graphics/stk_mesh_scene_node.cpp | 19 +++++++++++++++---- src/graphics/stk_mesh_scene_node.hpp | 4 +++- src/karts/kart_model.cpp | 10 +++++++--- 5 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/graphics/irr_driver.cpp b/src/graphics/irr_driver.cpp index c335a7a03..51cadb2f3 100644 --- a/src/graphics/irr_driver.cpp +++ b/src/graphics/irr_driver.cpp @@ -1236,7 +1236,8 @@ scene::IMeshSceneNode *IrrDriver::addMesh(scene::IMesh *mesh, const std::string& debug_name, scene::ISceneNode *parent, RenderInfo* render_info, - bool all_parts_colorized) + bool all_parts_colorized, + int frame_for_mesh) { if (!CVS->isGLSL()) return m_scene_manager->addMeshSceneNode(mesh, parent); @@ -1251,7 +1252,8 @@ scene::IMeshSceneNode *IrrDriver::addMesh(scene::IMesh *mesh, core::vector3df(0, 0, 0), core::vector3df(1.0f, 1.0f, 1.0f), true, render_info, - all_parts_colorized); + all_parts_colorized, + frame_for_mesh); node->drop(); return node; diff --git a/src/graphics/irr_driver.hpp b/src/graphics/irr_driver.hpp index 08bac725b..3f78657b5 100644 --- a/src/graphics/irr_driver.hpp +++ b/src/graphics/irr_driver.hpp @@ -393,7 +393,8 @@ public: const std::string& debug_name, scene::ISceneNode *parent = NULL, RenderInfo* render_info = NULL, - bool all_parts_colorized = false); + bool all_parts_colorized = false, + int frame_for_mesh = -1); PerCameraNode *addPerCameraNode(scene::ISceneNode* node, scene::ICameraSceneNode* cam, scene::ISceneNode *parent = NULL); diff --git a/src/graphics/stk_mesh_scene_node.cpp b/src/graphics/stk_mesh_scene_node.cpp index d48c98441..3938d4679 100644 --- a/src/graphics/stk_mesh_scene_node.cpp +++ b/src/graphics/stk_mesh_scene_node.cpp @@ -32,8 +32,8 @@ #include "utils/helpers.hpp" #include "utils/tuple.hpp" -#include #include +#include // ============================================================================ class ColorizeShader : public ShadergetMeshBufferCount(); ++i) + + scene::IAnimatedMesh* am = dynamic_cast(Mesh); + scene::IMesh* m = Mesh; + if (am && m_frame_for_mesh > -1) { - scene::IMeshBuffer* mb = Mesh->getMeshBuffer(i); + // Get the correct frame of animation for animated mesh + m = am->getMesh(m_frame_for_mesh); + } + + for (u32 i = 0; i < m->getMeshBufferCount(); ++i) + { + scene::IMeshBuffer* mb = m->getMeshBuffer(i); if (!mb) continue; GLMesh &mesh = GLmeshes[i]; diff --git a/src/graphics/stk_mesh_scene_node.hpp b/src/graphics/stk_mesh_scene_node.hpp index ae879e7b6..07fc4030f 100644 --- a/src/graphics/stk_mesh_scene_node.hpp +++ b/src/graphics/stk_mesh_scene_node.hpp @@ -29,6 +29,7 @@ class STKMeshSceneNode : public irr::scene::CMeshSceneNode, public STKMeshCommon { protected: PtrVector m_static_render_info; + int m_frame_for_mesh; std::vector GLmeshes; core::matrix4 ModelViewProjectionMatrix; core::vector3df windDir; @@ -58,7 +59,8 @@ public: const irr::core::vector3df& rotation = irr::core::vector3df(0, 0, 0), const irr::core::vector3df& scale = irr::core::vector3df(1.0f, 1.0f, 1.0f), bool createGLMeshes = true, - RenderInfo* render_info = NULL, bool all_parts_colorized = false); + RenderInfo* render_info = NULL, bool all_parts_colorized = false, + int frame_for_mesh = -1); virtual void render(); virtual void setMesh(irr::scene::IMesh* mesh); virtual void OnRegisterSceneNode(); diff --git a/src/karts/kart_model.cpp b/src/karts/kart_model.cpp index 642a533fe..c9e265346 100644 --- a/src/karts/kart_model.cpp +++ b/src/karts/kart_model.cpp @@ -427,8 +427,12 @@ scene::ISceneNode* KartModel::attachModel(bool animated_models, bool always_anim ? m_animation_frame[AF_STRAIGHT] : 0; - scene::IMesh* main_frame = m_mesh->getMesh(straight_frame); - main_frame->setHardwareMappingHint(scene::EHM_STATIC); + scene::IMesh* main_frame = m_mesh; + if (!CVS->isGLSL()) + { + main_frame = m_mesh->getMesh(straight_frame); + main_frame->setHardwareMappingHint(scene::EHM_STATIC); + } std::string debug_name; @@ -437,7 +441,7 @@ scene::ISceneNode* KartModel::attachModel(bool animated_models, bool always_anim #endif node = irr_driver->addMesh(main_frame, debug_name, - NULL /*parent*/, getRenderInfo()); + NULL /*parent*/, getRenderInfo(), false, straight_frame); #ifdef DEBUG node->setName(debug_name.c_str());