From 2191c5fc4f3a23a417398663fd3bd4da87312028 Mon Sep 17 00:00:00 2001 From: yesfish Date: Tue, 17 Dec 2024 01:51:07 +0000 Subject: [PATCH] implement use_parent_material --- scene/main/canvas_item.cpp | 8 +------- servers/rendering/renderer_canvas_cull.cpp | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/scene/main/canvas_item.cpp b/scene/main/canvas_item.cpp index 331f0a6360..3ebb09e8ba 100644 --- a/scene/main/canvas_item.cpp +++ b/scene/main/canvas_item.cpp @@ -587,13 +587,7 @@ bool CanvasItem::_get(const StringName &p_name, Variant &r_ret) const { void CanvasItem::_get_property_list(List *p_list) const { List pinfo; - if (use_parent_material) { - Node *parent = get_parent(); - CanvasItem *parent_canvas_item = Object::cast_to(parent); - RS::get_singleton()->canvas_item_get_instance_shader_parameter_list(parent_canvas_item->get_canvas_item(), &pinfo); - } else { - RS::get_singleton()->canvas_item_get_instance_shader_parameter_list(get_canvas_item(), &pinfo); - } + RS::get_singleton()->canvas_item_get_instance_shader_parameter_list(get_canvas_item(), &pinfo); for (PropertyInfo &pi : pinfo) { bool has_def_value = false; diff --git a/servers/rendering/renderer_canvas_cull.cpp b/servers/rendering/renderer_canvas_cull.cpp index c51042503e..0ba99b9876 100644 --- a/servers/rendering/renderer_canvas_cull.cpp +++ b/servers/rendering/renderer_canvas_cull.cpp @@ -1909,6 +1909,7 @@ void RendererCanvasCull::canvas_item_set_use_parent_material(RID p_item, bool p_ ERR_FAIL_NULL(canvas_item); canvas_item->use_parent_material = p_enable; + _item_queue_update(canvas_item, true); } void RendererCanvasCull::canvas_item_set_instance_shader_parameter(RID p_item, const StringName &p_parameter, const Variant &p_value) { @@ -2490,13 +2491,26 @@ void RendererCanvasCull::update_dirty_items() { void RendererCanvasCull::_update_dirty_item(Item *p_item) { if (p_item->update_dependencies) { + RID material = p_item->material; + + if (p_item->use_parent_material) { + Item *parent = canvas_item_owner.get_or_null(p_item->parent); + while (parent != nullptr) { + material = parent->material; + if (!parent->use_parent_material) { + break; + } + parent = canvas_item_owner.get_or_null(parent->parent); + } + } + p_item->dependency_tracker.update_begin(); p_item->instance_uniforms.materials_start(); - if (p_item->material.is_valid()) { - p_item->instance_uniforms.materials_append(p_item->material); - RSG::material_storage->material_update_dependency(p_item->material, &p_item->dependency_tracker); + if (material.is_valid()) { + p_item->instance_uniforms.materials_append(material); + RSG::material_storage->material_update_dependency(material, &p_item->dependency_tracker); } if (p_item->instance_uniforms.materials_finish(p_item->self)) { -- 2.45.2.windows.1