From d0113a4a4bb620c81899da76b53cb60454bdf369 Mon Sep 17 00:00:00 2001 From: yesfish Date: Sun, 15 Sep 2024 21:31:49 +0100 Subject: [PATCH] Implement 2D instance shader parameters --- scene/main/canvas_item.cpp | 3 +++ servers/rendering/renderer_canvas_cull.h | 1 - servers/rendering/renderer_canvas_render.h | 2 ++ servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp | 3 +++ servers/rendering/renderer_rd/renderer_canvas_render_rd.h | 2 ++ servers/rendering/renderer_rd/shaders/canvas_uniforms_inc.glsl | 2 ++ 6 files changed, 12 insertions(+), 1 deletion(-) diff --git a/scene/main/canvas_item.cpp b/scene/main/canvas_item.cpp index 940b0d8dd13f..cb1227d0d5c2 100644 --- a/scene/main/canvas_item.cpp +++ b/scene/main/canvas_item.cpp @@ -1315,6 +1315,9 @@ void CanvasItem::_bind_methods() { ClassDB::bind_method(D_METHOD("set_material", "material"), &CanvasItem::set_material); ClassDB::bind_method(D_METHOD("get_material"), &CanvasItem::get_material); + ClassDB::bind_method(D_METHOD("set_instance_shader_parameter", "name", "value"), &CanvasItem::set_instance_shader_parameter); + ClassDB::bind_method(D_METHOD("get_instance_shader_parameter", "name"), &CanvasItem::get_instance_shader_parameter); + ClassDB::bind_method(D_METHOD("set_use_parent_material", "enable"), &CanvasItem::set_use_parent_material); ClassDB::bind_method(D_METHOD("get_use_parent_material"), &CanvasItem::get_use_parent_material); diff --git a/servers/rendering/renderer_canvas_cull.h b/servers/rendering/renderer_canvas_cull.h index 80c48be1bf7d..e4c5e530f8c2 100644 --- a/servers/rendering/renderer_canvas_cull.h +++ b/servers/rendering/renderer_canvas_cull.h @@ -82,7 +82,6 @@ class RendererCanvasCull { HashMap instance_shader_uniforms; bool instance_allocated_shader_uniforms = false; - int32_t instance_allocated_shader_uniforms_offset = -1; SelfList update_item; Item() : diff --git a/servers/rendering/renderer_canvas_render.h b/servers/rendering/renderer_canvas_render.h index c57abee1659f..339771dfb6b2 100644 --- a/servers/rendering/renderer_canvas_render.h +++ b/servers/rendering/renderer_canvas_render.h @@ -343,6 +343,8 @@ class RendererCanvasRender { RID material; RID skeleton; + int32_t instance_allocated_shader_uniforms_offset = -1; + Item *next = nullptr; struct CopyBackBuffer { diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp index 88a22c6fc348..6fe8689b33df 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp @@ -1828,6 +1828,7 @@ RendererCanvasRenderRD::RendererCanvasRenderRD() { actions.base_varying_index = 5; actions.global_buffer_array_variable = "global_shader_uniforms.data"; + actions.instance_uniform_index_variable = "draw_data.instance_uniforms_ofs"; shader.compiler.initialize(actions); } @@ -2343,6 +2344,8 @@ void RendererCanvasRenderRD::_record_item_commands(const Item *p_item, RenderTar instance_data->color_texture_pixel_size[1] = r_current_batch->tex_texpixel_size.height; instance_data->specular_shininess = r_current_batch->tex_specular_shininess; + instance_data->instance_uniforms_ofs = uint32_t(p_item->instance_allocated_shader_uniforms_offset); + return instance_data; }; diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.h b/servers/rendering/renderer_rd/renderer_canvas_render_rd.h index 8d90cd23ce25..db316cdba725 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.h +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.h @@ -361,6 +361,8 @@ class RendererCanvasRenderRD : public RendererCanvasRender { }; float color_texture_pixel_size[2]; uint32_t lights[4]; + uint32_t instance_uniforms_ofs; + uint32_t pad2[3]; }; struct PushConstant { diff --git a/servers/rendering/renderer_rd/shaders/canvas_uniforms_inc.glsl b/servers/rendering/renderer_rd/shaders/canvas_uniforms_inc.glsl index 7cf5b4576e6a..5bee1839ed38 100644 --- a/servers/rendering/renderer_rd/shaders/canvas_uniforms_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/canvas_uniforms_inc.glsl @@ -52,6 +52,8 @@ struct InstanceData { #endif vec2 color_texture_pixel_size; uint lights[4]; + uint instance_uniforms_ofs; + uint pad2[3]; }; layout(set = 4, binding = 0, std430) restrict readonly buffer DrawData {