diff --git a/lib/irrlicht/source/Irrlicht/CSkinnedMesh.h b/lib/irrlicht/source/Irrlicht/CSkinnedMesh.h index 64a93e24d..0ffdc6984 100644 --- a/lib/irrlicht/source/Irrlicht/CSkinnedMesh.h +++ b/lib/irrlicht/source/Irrlicht/CSkinnedMesh.h @@ -14,6 +14,17 @@ #include "matrix4.h" #include "quaternion.h" +class Matrix4x4 +{ +private: + float data[16]; +public: + inline Matrix4x4(const irr::core::matrix4& m) + { + memcpy(data, m.pointer(), 16 * sizeof(float)); + } +}; + class JointInfluence { public: @@ -181,7 +192,6 @@ namespace scene u32 getTotalJointSize() const { - _IRR_DEBUG_BREAK_IF(m_joint_total_size == 0); return m_joint_total_size; } @@ -231,7 +241,7 @@ private: bool PreparedForSkinning; bool AnimateNormals; bool HardwareSkinning; - core::array m_joint_matrixes; + core::array m_joint_matrixes; u32 m_joint_total_size; }; diff --git a/src/graphics/draw_calls.cpp b/src/graphics/draw_calls.cpp index 3c1ac7d44..431561c50 100644 --- a/src/graphics/draw_calls.cpp +++ b/src/graphics/draw_calls.cpp @@ -254,7 +254,7 @@ void DrawCalls::handleSTKCommon(scene::ISceneNode *Node, { skinning_offset = getSkinningOffset(); m_mesh_for_skinning.insert(am); - am->setSkinningOffset(skinning_offset * sizeof(core::matrix4)); + am->setSkinningOffset(skinning_offset * 16 * sizeof(float)); } if (!culled_for_cams[0]) @@ -712,6 +712,7 @@ void DrawCalls::multidrawSolidFirstPass() const { m_solid_cmd_buffer->bind(); m_solid_cmd_buffer->multidrawFirstPass(); + m_solid_cmd_buffer->multidrawFirstPass(); m_solid_cmd_buffer->multidrawFirstPass(); m_solid_cmd_buffer->multidrawFirstPass(); m_solid_cmd_buffer->multidrawFirstPass(); @@ -750,6 +751,7 @@ void DrawCalls::multidrawSolidSecondPass(const std::vector &handles) c { m_solid_cmd_buffer->bind(); m_solid_cmd_buffer->multidraw2ndPass(handles); + m_solid_cmd_buffer->multidraw2ndPass(handles); m_solid_cmd_buffer->multidraw2ndPass(handles); m_solid_cmd_buffer->multidraw2ndPass(handles); m_solid_cmd_buffer->multidraw2ndPass(handles); diff --git a/src/graphics/stk_animated_mesh.cpp b/src/graphics/stk_animated_mesh.cpp index 13f37149c..df131f8c5 100644 --- a/src/graphics/stk_animated_mesh.cpp +++ b/src/graphics/stk_animated_mesh.cpp @@ -243,7 +243,7 @@ void STKAnimatedMesh::updateGL() video::IMaterialRenderer* rnd = driver->getMaterialRenderer(type); GLMesh &mesh = GLmeshes[i]; - if (!rnd->isTransparent()) + if (1)//!rnd->isTransparent()) { Material* material = material_manager->getMaterialFor(mb->getMaterial().getTexture(0), mb); Material* material2 = NULL; @@ -251,7 +251,7 @@ void STKAnimatedMesh::updateGL() material2 = material_manager->getMaterialFor(mb->getMaterial().getTexture(1), mb); Material::ShaderType MatType = getMeshMaterialFromType(type, mb->getVertexType(), material, material2); - initTextures(mesh, MatType); + initTextures(mesh, m_skinned_mesh ? Material::SHADERTYPE_SOLID_SKINNED_MESH : MatType); } else initTexturesTransparent(mesh); @@ -278,7 +278,7 @@ void STKAnimatedMesh::updateGL() if (m_skinning_offset == -1) return; glBindBuffer(GL_UNIFORM_BUFFER, SharedGPUObjects::getSkinningUBO()); glBufferSubData(GL_UNIFORM_BUFFER, m_skinning_offset, - m_skinned_mesh->getTotalJointSize() * sizeof(core::matrix4), + m_skinned_mesh->getTotalJointSize() * 16 * sizeof(float), m_skinned_mesh->getJointPointer()); m_skinning_offset = -1; return; @@ -337,5 +337,9 @@ void STKAnimatedMesh::resetSkinningState(scene::IAnimatedMesh* mesh) m_skinning_offset = -1; m_skinned_mesh = dynamic_cast(mesh); if (m_skinned_mesh) + { m_skinned_mesh->convertForSkinning(); + if (m_skinned_mesh->getTotalJointSize() == 0) + m_skinned_mesh = NULL; + } }