From 7528c204d33327a69cdb39a5d7cb87512f1f8272 Mon Sep 17 00:00:00 2001 From: Yuri Roubinsky Date: Fri, 29 Oct 2021 17:49:12 +0300 Subject: [PATCH] Added convertor from `ORMMaterial3D` to `ShaderMaterial` --- editor/editor_node.cpp | 4 ++ editor/plugins/material_editor_plugin.cpp | 46 +++++++++++++++++++++++ editor/plugins/material_editor_plugin.h | 9 +++++ 3 files changed, 59 insertions(+) diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 0b8db76310..288b6752ee 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -7015,6 +7015,10 @@ EditorNode::EditorNode() { spatial_mat_convert.instantiate(); resource_conversion_plugins.push_back(spatial_mat_convert); + Ref orm_mat_convert; + orm_mat_convert.instantiate(); + resource_conversion_plugins.push_back(orm_mat_convert); + Ref canvas_item_mat_convert; canvas_item_mat_convert.instantiate(); resource_conversion_plugins.push_back(canvas_item_mat_convert); diff --git a/editor/plugins/material_editor_plugin.cpp b/editor/plugins/material_editor_plugin.cpp index 00315aa88d..140d2952dd 100644 --- a/editor/plugins/material_editor_plugin.cpp +++ b/editor/plugins/material_editor_plugin.cpp @@ -284,6 +284,52 @@ Ref StandardMaterial3DConversionPlugin::convert(const Ref &p return smat; } +String ORMMaterial3DConversionPlugin::converts_to() const { + return "ShaderMaterial"; +} + +bool ORMMaterial3DConversionPlugin::handles(const Ref &p_resource) const { + Ref mat = p_resource; + return mat.is_valid(); +} + +Ref ORMMaterial3DConversionPlugin::convert(const Ref &p_resource) const { + Ref mat = p_resource; + ERR_FAIL_COND_V(!mat.is_valid(), Ref()); + + Ref smat; + smat.instantiate(); + + Ref shader; + shader.instantiate(); + + String code = RS::get_singleton()->shader_get_code(mat->get_shader_rid()); + + shader->set_code(code); + + smat->set_shader(shader); + + List params; + RS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), ¶ms); + + for (const PropertyInfo &E : params) { + // Texture parameter has to be treated specially since ORMMaterial3D saved it + // as RID but ShaderMaterial needs Texture itself + Ref texture = mat->get_texture_by_name(E.name); + if (texture.is_valid()) { + smat->set_shader_param(E.name, texture); + } else { + Variant value = RS::get_singleton()->material_get_param(mat->get_rid(), E.name); + smat->set_shader_param(E.name, value); + } + } + + smat->set_render_priority(mat->get_render_priority()); + smat->set_local_to_scene(mat->is_local_to_scene()); + smat->set_name(mat->get_name()); + return smat; +} + String ParticlesMaterialConversionPlugin::converts_to() const { return "ShaderMaterial"; } diff --git a/editor/plugins/material_editor_plugin.h b/editor/plugins/material_editor_plugin.h index c8bd60eb26..62549843f7 100644 --- a/editor/plugins/material_editor_plugin.h +++ b/editor/plugins/material_editor_plugin.h @@ -107,6 +107,15 @@ public: virtual Ref convert(const Ref &p_resource) const override; }; +class ORMMaterial3DConversionPlugin : public EditorResourceConversionPlugin { + GDCLASS(ORMMaterial3DConversionPlugin, EditorResourceConversionPlugin); + +public: + virtual String converts_to() const override; + virtual bool handles(const Ref &p_resource) const override; + virtual Ref convert(const Ref &p_resource) const override; +}; + class ParticlesMaterialConversionPlugin : public EditorResourceConversionPlugin { GDCLASS(ParticlesMaterialConversionPlugin, EditorResourceConversionPlugin);