Program Listing for File meshbatchingstage.cpp¶
↰ Return to documentation for file (/home/runner/work/Legion-Engine/Legion-Engine/legion/engine/rendering/pipeline/default/stages/meshbatchingstage.cpp
)
#include <rendering/pipeline/default/stages/meshbatchingstage.hpp>
namespace legion::rendering
{
void MeshBatchingStage::setup(app::window& context)
{
OPTICK_EVENT();
create_meta<sparse_map<material_handle, sparse_map<model_handle, std::vector<math::mat4>>>>("mesh batches");
}
void MeshBatchingStage::render(app::window& context, camera& cam, const camera::camera_input& camInput, time::span deltaTime)
{
OPTICK_EVENT();
(void)deltaTime;
(void)camInput;
(void)cam;
(void)context;
static id_type batchesId = nameHash("mesh batches");
auto* batches = get_meta<sparse_map<material_handle, sparse_map<model_handle, std::vector<math::mat4>>>>(batchesId);
static auto renderablesQuery = createQuery<position, rotation, scale, mesh_filter, mesh_renderer>();
renderablesQuery.queryEntities();
auto& positions = renderablesQuery.get<position>();
auto& rotations = renderablesQuery.get<rotation>();
auto& scales = renderablesQuery.get<scale>();
auto& filters = renderablesQuery.get<mesh_filter>();
auto& renderers = renderablesQuery.get<mesh_renderer>();
{
OPTICK_EVENT("Clear instances");
for (auto [_, models] : *batches)
for (auto [_, instances] : models)
instances.clear();
}
{
OPTICK_EVENT("Calculate instances");
for (int i = 0; i < renderablesQuery.size(); i++)
{
OPTICK_EVENT("instance");
(*batches)[renderers[i].material][model_handle{ filters[i].id }].push_back(math::compose(scales[i], rotations[i], positions[i]));
}
}
}
priority_type MeshBatchingStage::priority()
{
return setup_priority;
}
}