diff --git a/data/shaders/ge_shaders/spm.vert b/data/shaders/ge_shaders/spm.vert index 858324f18..cd09c88e1 100644 --- a/data/shaders/ge_shaders/spm.vert +++ b/data/shaders/ge_shaders/spm.vert @@ -9,7 +9,7 @@ void main() u_object_buffer.m_objects[gl_InstanceIndex].m_scale.xyz, v_position); gl_Position = u_camera.m_projection_view_matrix * v_world_position; f_vertex_color = v_color.zyxw; - f_uv = v_uv; + f_uv = v_uv + u_object_buffer.m_objects[gl_InstanceIndex].m_texture_trans; f_uv_two = v_uv_two; f_material_id = u_object_buffer.m_objects[gl_InstanceIndex].m_material_id; } diff --git a/data/shaders/ge_shaders/spm_skinning.vert b/data/shaders/ge_shaders/spm_skinning.vert index 261e0acb7..ec404e83c 100644 --- a/data/shaders/ge_shaders/spm_skinning.vert +++ b/data/shaders/ge_shaders/spm_skinning.vert @@ -17,7 +17,7 @@ void main() v_skinning_position.xyz); gl_Position = u_camera.m_projection_view_matrix * v_world_position; f_vertex_color = v_color.zyxw; - f_uv = v_uv; + f_uv = v_uv + u_object_buffer.m_objects[gl_InstanceIndex].m_texture_trans; f_uv_two = v_uv_two; f_material_id = u_object_buffer.m_objects[gl_InstanceIndex].m_material_id; } diff --git a/lib/graphics_engine/src/ge_vulkan_draw_call.cpp b/lib/graphics_engine/src/ge_vulkan_draw_call.cpp index db4dda897..08d00f57d 100644 --- a/lib/graphics_engine/src/ge_vulkan_draw_call.cpp +++ b/lib/graphics_engine/src/ge_vulkan_draw_call.cpp @@ -25,7 +25,7 @@ namespace GE { // ============================================================================ ObjectData::ObjectData(irr::scene::ISceneNode* node, int material_id, - int skinning_offset) + int skinning_offset, int irrlicht_material_id) { using namespace MiniGLM; const irr::core::matrix4& model_mat = node->getAbsoluteTransformation(); @@ -53,8 +53,10 @@ ObjectData::ObjectData(irr::scene::ISceneNode* node, int material_id, memcpy(m_scale, &scale, sizeof(irr::core::vector3df)); m_skinning_offset = skinning_offset; m_material_id = material_id; - m_texture_trans[0] = 0.0f; - m_texture_trans[1] = 0.0f; + const irr::core::matrix4& texture_matrix = + node->getMaterial(irrlicht_material_id).getTextureMatrix(0); + m_texture_trans[0] = texture_matrix[8]; + m_texture_trans[1] = texture_matrix[9]; } // ObjectData // ---------------------------------------------------------------------------- @@ -243,7 +245,7 @@ void GEVulkanDrawCall::generate() if (it != skinning_offets.end()) skinning_offset = it->second; m_visible_objects.emplace_back(node, material_id, - skinning_offset); + skinning_offset, r.second); } VkDrawIndexedIndirectCommand cmd; cmd.indexCount = p.first->getIndexCount(); diff --git a/lib/graphics_engine/src/ge_vulkan_draw_call.hpp b/lib/graphics_engine/src/ge_vulkan_draw_call.hpp index 9c0d3aab9..b2585144b 100644 --- a/lib/graphics_engine/src/ge_vulkan_draw_call.hpp +++ b/lib/graphics_engine/src/ge_vulkan_draw_call.hpp @@ -36,7 +36,7 @@ struct ObjectData float m_texture_trans[2]; // ------------------------------------------------------------------------ ObjectData(irr::scene::ISceneNode* node, int material_id, - int skinning_offset); + int skinning_offset, int irrlicht_material_id); }; struct PipelineSettings