You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-20 14:45:44 +00:00
Added indirect drawing functionality to MultiMesh
Update doc/classes/RenderingServer.xml Co-Authored-By: Micky <66727710+Mickeon@users.noreply.github.com>
This commit is contained in:
@@ -599,7 +599,11 @@ void RenderForwardClustered::_render_list_template(RenderingDevice::DrawListID p
|
||||
instance_count /= surf->owner->trail_steps;
|
||||
}
|
||||
|
||||
RD::get_singleton()->draw_list_draw(draw_list, index_array_rd.is_valid(), instance_count);
|
||||
if (bool(surf->owner->base_flags & INSTANCE_DATA_FLAG_MULTIMESH_INDIRECT)) {
|
||||
RD::get_singleton()->draw_list_draw_indirect(draw_list, index_array_rd.is_valid(), mesh_storage->_multimesh_get_command_buffer_rd_rid(surf->owner->data->base), surf->surface_index * sizeof(uint32_t) * mesh_storage->INDIRECT_MULTIMESH_COMMAND_STRIDE, 1, 0);
|
||||
} else {
|
||||
RD::get_singleton()->draw_list_draw(draw_list, index_array_rd.is_valid(), instance_count);
|
||||
}
|
||||
}
|
||||
|
||||
i += element_info.repeat - 1; //skip equal elements
|
||||
@@ -1083,6 +1087,7 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con
|
||||
} else {
|
||||
surf->sort.lod_index = 0;
|
||||
if (p_render_data->render_info) {
|
||||
// This does not include primitives rendered via indirect draw calls.
|
||||
uint32_t to_draw = mesh_storage->mesh_surface_get_vertices_drawn_count(surf->surface);
|
||||
to_draw = _indices_to_primitives(surf->primitive, to_draw);
|
||||
to_draw *= inst->instance_count;
|
||||
@@ -4205,9 +4210,9 @@ void RenderForwardClustered::_geometry_instance_update(RenderGeometryInstance *p
|
||||
ginstance->base_flags = 0;
|
||||
|
||||
bool store_transform = true;
|
||||
|
||||
if (ginstance->data->base_type == RS::INSTANCE_MULTIMESH) {
|
||||
ginstance->base_flags |= INSTANCE_DATA_FLAG_MULTIMESH;
|
||||
|
||||
if (mesh_storage->multimesh_get_transform_format(ginstance->data->base) == RS::MULTIMESH_TRANSFORM_2D) {
|
||||
ginstance->base_flags |= INSTANCE_DATA_FLAG_MULTIMESH_FORMAT_2D;
|
||||
}
|
||||
@@ -4217,6 +4222,9 @@ void RenderForwardClustered::_geometry_instance_update(RenderGeometryInstance *p
|
||||
if (mesh_storage->multimesh_uses_custom_data(ginstance->data->base)) {
|
||||
ginstance->base_flags |= INSTANCE_DATA_FLAG_MULTIMESH_HAS_CUSTOM_DATA;
|
||||
}
|
||||
if (mesh_storage->multimesh_uses_indirect(ginstance->data->base)) {
|
||||
ginstance->base_flags |= INSTANCE_DATA_FLAG_MULTIMESH_INDIRECT;
|
||||
}
|
||||
|
||||
ginstance->transforms_uniform_set = mesh_storage->multimesh_get_3d_uniform_set(ginstance->data->base, scene_shader.default_shader_rd, TRANSFORMS_UNIFORM_SET);
|
||||
|
||||
|
||||
@@ -255,6 +255,7 @@ private:
|
||||
|
||||
// When changing any of these enums, remember to change the corresponding enums in the shader files as well.
|
||||
enum {
|
||||
INSTANCE_DATA_FLAG_MULTIMESH_INDIRECT = 1 << 2,
|
||||
INSTANCE_DATA_FLAGS_DYNAMIC = 1 << 3,
|
||||
INSTANCE_DATA_FLAGS_NON_UNIFORM_SCALE = 1 << 4,
|
||||
INSTANCE_DATA_FLAG_USE_GI_BUFFERS = 1 << 5,
|
||||
|
||||
Reference in New Issue
Block a user