#include "mesh_controller.hpp" #include #include #include #include "vulkan_buffers.hpp" namespace rse::graphics::mesh { std::map g_meshes; std::queue free_ids; std::map> instance_free_ids; uint16_t create_mesh(std::vector vertices, std::vector indices) { static uint16_t last_id = 0U; uint16_t assignable_id = 0U; if (free_ids.empty()) { assignable_id = last_id++; } else { assignable_id = free_ids.front(); free_ids.pop(); } g_meshes.emplace(assignable_id, Mesh ( assignable_id, vertices, indices )); rse::graphics::vulkanbase::update_mesh_buffers(vertices, indices); return assignable_id; } void create_mesh_instance(uint16_t mesh_id, InstanceData instance_data) { uint16_t instance_id = 0U; auto& instances = g_meshes[mesh_id].instances; auto& free_instance_ids = instance_free_ids[mesh_id]; if (free_instance_ids.empty()) { instance_id = instances.size(); } else { instance_id = free_instance_ids.front(); free_instance_ids.pop(); } instances[instance_id] = std::make_unique( instance_id, instance_data ); rse::graphics::vulkanbase::update_mesh_instances(instance_data); } //TODO: Replace with something else. It will take to much time to do this each time we draw frame for all the objects std::vector get_instance_data_for_mesh(uint16_t mesh_id) { std::vector data; for(const auto& [id, instance] : g_meshes[mesh_id].instances) { data.push_back(instance.get()->instance_data); } return data; } std::vector get_mesh_vertices(uint16_t mesh_id) { return g_meshes[mesh_id].vertices; } std::vector get_mesh_indices(uint16_t mesh_id) { return g_meshes[mesh_id].indices; } } // namespace rse::graphics::mesh