diff --git a/lib/graphics_engine/src/ge_vulkan_draw_call.cpp b/lib/graphics_engine/src/ge_vulkan_draw_call.cpp index 253bd8cd6..a8051a543 100644 --- a/lib/graphics_engine/src/ge_vulkan_draw_call.cpp +++ b/lib/graphics_engine/src/ge_vulkan_draw_call.cpp @@ -16,6 +16,7 @@ #include "ge_vulkan_texture_descriptor.hpp" #include +#include namespace GE { @@ -137,8 +138,42 @@ void GEVulkanDrawCall::generate() m_skinning_data_padded_size += bone_size; } - unsigned accumulated_instance = 0; + using Nodes = std::pair > > >; + std::vector visible_nodes; + for (auto& p : m_visible_nodes) + visible_nodes.emplace_back(p.first, std::move(p.second)); + std::unordered_map nodes_area; + for (auto& p : visible_nodes) + { + if (p.second.empty()) + { + nodes_area[p.first] = std::numeric_limits::max(); + continue; + } + for (auto& q : p.second) + { + if (q.second.empty()) + { + nodes_area[p.first] = std::numeric_limits::max(); + continue; + } + irr::core::aabbox3df bb = p.first->getBoundingBox(); + q.second[0].first->getAbsoluteTransformation().transformBoxEx(bb); + nodes_area[p.first] = bb.getArea() * (float)q.second.size(); + break; + } + } + std::sort(visible_nodes.begin(), visible_nodes.end(), + [&nodes_area](const Nodes& a, const Nodes& b) + { + return nodes_area.at(a.first) < nodes_area.at(b.first) ; + }); + + unsigned accumulated_instance = 0; + for (auto& p : visible_nodes) { irr::video::SMaterial& m = p.first->getMaterial(); std::array textures =