diff options
28 files changed, 101 insertions, 446 deletions
diff --git a/core/object.cpp b/core/object.cpp index ea77090a45..3a14c7c0b5 100644 --- a/core/object.cpp +++ b/core/object.cpp @@ -1443,8 +1443,20 @@ Error Object::connect(const StringName &p_signal, Object *p_to_object, const Str if (!s) { bool signal_is_valid = ClassDB::has_signal(get_class_name(), p_signal); //check in script - if (!signal_is_valid && !script.is_null() && Ref<Script>(script)->has_script_signal(p_signal)) - signal_is_valid = true; + if (!signal_is_valid && !script.is_null()) { + + if (Ref<Script>(script)->has_script_signal(p_signal)) { + signal_is_valid = true; + } +#ifdef TOOLS_ENABLED + else { + //allow connecting signals anyway if script is invalid, see issue #17070 + if (!Ref<Script>(script)->is_valid()) { + signal_is_valid = true; + } + } +#endif + } if (!signal_is_valid) { ERR_EXPLAIN("In Object of type '" + String(get_class()) + "': Attempt to connect nonexistent signal '" + p_signal + "' to method '" + p_to_object->get_class() + "." + p_to_method + "'"); diff --git a/core/script_language.h b/core/script_language.h index bcd9c2c5ea..654d1d4265 100644 --- a/core/script_language.h +++ b/core/script_language.h @@ -128,6 +128,7 @@ public: virtual MethodInfo get_method_info(const StringName &p_method) const = 0; virtual bool is_tool() const = 0; + virtual bool is_valid() const = 0; virtual ScriptLanguage *get_language() const = 0; diff --git a/drivers/dummy/rasterizer_dummy.h b/drivers/dummy/rasterizer_dummy.h index 7c095e3798..dfdb3a6bba 100644 --- a/drivers/dummy/rasterizer_dummy.h +++ b/drivers/dummy/rasterizer_dummy.h @@ -63,7 +63,8 @@ public: void environment_set_dof_blur_near(RID p_env, bool p_enable, float p_distance, float p_transition, float p_far_amount, VS::EnvironmentDOFBlurQuality p_quality) {} void environment_set_dof_blur_far(RID p_env, bool p_enable, float p_distance, float p_transition, float p_far_amount, VS::EnvironmentDOFBlurQuality p_quality) {} - void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, bool p_bicubic_upscale) {} + void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale) {} + void environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture) {} void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance, bool p_roughness) {} diff --git a/drivers/gles2/rasterizer_scene_gles2.cpp b/drivers/gles2/rasterizer_scene_gles2.cpp index 6eafdb0e1c..b2826d0ca8 100644 --- a/drivers/gles2/rasterizer_scene_gles2.cpp +++ b/drivers/gles2/rasterizer_scene_gles2.cpp @@ -708,7 +708,7 @@ void RasterizerSceneGLES2::environment_set_dof_blur_near(RID p_env, bool p_enabl ERR_FAIL_COND(!env); } -void RasterizerSceneGLES2::environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, bool p_bicubic_upscale) { +void RasterizerSceneGLES2::environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale) { Environment *env = environment_owner.getornull(p_env); ERR_FAIL_COND(!env); } diff --git a/drivers/gles2/rasterizer_scene_gles2.h b/drivers/gles2/rasterizer_scene_gles2.h index 7d9920158f..ba406183c7 100644 --- a/drivers/gles2/rasterizer_scene_gles2.h +++ b/drivers/gles2/rasterizer_scene_gles2.h @@ -413,7 +413,7 @@ public: virtual void environment_set_dof_blur_near(RID p_env, bool p_enable, float p_distance, float p_transition, float p_amount, VS::EnvironmentDOFBlurQuality p_quality); virtual void environment_set_dof_blur_far(RID p_env, bool p_enable, float p_distance, float p_transition, float p_amount, VS::EnvironmentDOFBlurQuality p_quality); - virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, bool p_bicubic_upscale); + virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale); virtual void environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture); virtual void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_in, float p_fade_out, float p_depth_tolerance, bool p_roughness); diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index e0c8d3af52..ffe9e1c831 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -846,7 +846,7 @@ void RasterizerSceneGLES3::environment_set_dof_blur_near(RID p_env, bool p_enabl env->dof_blur_near_amount = p_amount; env->dof_blur_near_quality = p_quality; } -void RasterizerSceneGLES3::environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, bool p_bicubic_upscale) { +void RasterizerSceneGLES3::environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale) { Environment *env = environment_owner.getornull(p_env); ERR_FAIL_COND(!env); @@ -859,6 +859,7 @@ void RasterizerSceneGLES3::environment_set_glow(RID p_env, bool p_enable, int p_ env->glow_blend_mode = p_blend_mode; env->glow_hdr_bleed_threshold = p_hdr_bleed_threshold; env->glow_hdr_bleed_scale = p_hdr_bleed_scale; + env->glow_hdr_luminance_cap = p_hdr_luminance_cap; env->glow_bicubic_upscale = p_bicubic_upscale; } void RasterizerSceneGLES3::environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture) { @@ -3898,6 +3899,7 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::PIXEL_SIZE, Vector2(1.0 / vp_w, 1.0 / vp_h)); state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::LOD, float(i)); state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::GLOW_STRENGTH, env->glow_strength); + state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::LUMINANCE_CAP, env->glow_hdr_luminance_cap); glActiveTexture(GL_TEXTURE0); if (i == 0) { diff --git a/drivers/gles3/rasterizer_scene_gles3.h b/drivers/gles3/rasterizer_scene_gles3.h index f3157d5a46..0e6027c4ad 100644 --- a/drivers/gles3/rasterizer_scene_gles3.h +++ b/drivers/gles3/rasterizer_scene_gles3.h @@ -404,6 +404,7 @@ public: VS::EnvironmentGlowBlendMode glow_blend_mode; float glow_hdr_bleed_threshold; float glow_hdr_bleed_scale; + float glow_hdr_luminance_cap; bool glow_bicubic_upscale; VS::EnvironmentToneMapper tone_mapper; @@ -494,6 +495,7 @@ public: glow_blend_mode = VS::GLOW_BLEND_MODE_SOFTLIGHT; glow_hdr_bleed_threshold = 1.0; glow_hdr_bleed_scale = 2.0; + glow_hdr_luminance_cap = 12.0; glow_bicubic_upscale = false; dof_blur_far_enabled = false; @@ -548,7 +550,7 @@ public: virtual void environment_set_dof_blur_near(RID p_env, bool p_enable, float p_distance, float p_transition, float p_amount, VS::EnvironmentDOFBlurQuality p_quality); virtual void environment_set_dof_blur_far(RID p_env, bool p_enable, float p_distance, float p_transition, float p_amount, VS::EnvironmentDOFBlurQuality p_quality); - virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, bool p_bicubic_upscale); + virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale); virtual void environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture); virtual void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_in, float p_fade_out, float p_depth_tolerance, bool p_roughness); diff --git a/drivers/gles3/shaders/effect_blur.glsl b/drivers/gles3/shaders/effect_blur.glsl index b67d06bc10..2518cd7cd0 100644 --- a/drivers/gles3/shaders/effect_blur.glsl +++ b/drivers/gles3/shaders/effect_blur.glsl @@ -94,6 +94,7 @@ uniform sampler2D source_dof_original; //texunit:2 uniform float exposure; uniform float white; +uniform highp float luminance_cap; #ifdef GLOW_USE_AUTO_EXPOSURE @@ -271,7 +272,7 @@ void main() { float luminance = max(frag_color.r, max(frag_color.g, frag_color.b)); float feedback = max(smoothstep(glow_hdr_threshold, glow_hdr_threshold + glow_hdr_scale, luminance), glow_bloom); - frag_color *= feedback; + frag_color = min( frag_color * feedback, vec4(luminance_cap) ); #endif diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 8f9c91c008..157dd4d66f 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -999,6 +999,22 @@ void EditorNode::_save_scene_with_preview(String p_file, int p_idx) { EditorResourcePreview::get_singleton()->check_for_invalidation(p_file); } +bool EditorNode::_validate_scene_recursive(const String &p_filename, Node *p_node) { + + for (int i = 0; i < p_node->get_child_count(); i++) { + Node *child = p_node->get_child(i); + if (child->get_filename() == p_filename) { + return true; + } + + if (_validate_scene_recursive(p_filename, child)) { + return true; + } + } + + return false; +} + void EditorNode::_save_scene(String p_file, int idx) { Node *scene = editor_data.get_edited_scene_root(idx); @@ -1009,6 +1025,11 @@ void EditorNode::_save_scene(String p_file, int idx) { return; } + if (scene->get_filename() != String() && _validate_scene_recursive(scene->get_filename(), scene)) { + show_accept(TTR("This scene can't be saved because there is a cyclic instancing inclusion.\nPlease resolve it and then attempt to save again."), TTR("OK")); + return; + } + editor_data.apply_changes_in_editors(); _save_default_environment(); @@ -1452,7 +1473,7 @@ void EditorNode::_edit_current() { bool is_node = current_obj->is_class("Node"); String editable_warning; //none by default - + if (is_resource) { Resource *current_res = Object::cast_to<Resource>(current_obj); diff --git a/editor/editor_node.h b/editor/editor_node.h index e220daf8a9..3fa762c20b 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -445,6 +445,7 @@ private: void _show_messages(); void _vp_resized(); + bool _validate_scene_recursive(const String &p_filename, Node *p_node); void _save_scene(String p_file, int idx = -1); void _save_all_scenes(); int _next_unsaved_scene(bool p_valid_filename, int p_start = 0); diff --git a/modules/gdnative/nativescript/nativescript.cpp b/modules/gdnative/nativescript/nativescript.cpp index eb133502c4..bcaf3f346e 100644 --- a/modules/gdnative/nativescript/nativescript.cpp +++ b/modules/gdnative/nativescript/nativescript.cpp @@ -294,6 +294,10 @@ MethodInfo NativeScript::get_method_info(const StringName &p_method) const { return MethodInfo(); } +bool NativeScript::is_valid() const { + return true; +} + bool NativeScript::is_tool() const { NativeScriptDesc *script_data = get_script_desc(); diff --git a/modules/gdnative/nativescript/nativescript.h b/modules/gdnative/nativescript/nativescript.h index 51370f5fbf..e6f3c06ee5 100644 --- a/modules/gdnative/nativescript/nativescript.h +++ b/modules/gdnative/nativescript/nativescript.h @@ -160,6 +160,7 @@ public: virtual MethodInfo get_method_info(const StringName &p_method) const; virtual bool is_tool() const; + virtual bool is_valid() const; virtual ScriptLanguage *get_language() const; diff --git a/modules/gdnative/pluginscript/pluginscript_script.h b/modules/gdnative/pluginscript/pluginscript_script.h index 31c6c4d67f..3ade8ac004 100644 --- a/modules/gdnative/pluginscript/pluginscript_script.h +++ b/modules/gdnative/pluginscript/pluginscript_script.h @@ -102,6 +102,7 @@ public: PropertyInfo get_property_info(const StringName &p_property) const; bool is_tool() const { return _tool; } + bool is_valid() const { return true; } virtual ScriptLanguage *get_language() const; diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp index 1f5f5035f9..538249c8e2 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -867,7 +867,6 @@ bool GDScript::has_script_signal(const StringName &p_signal) const { else if (base_cache.is_valid()) { return base_cache->has_script_signal(p_signal); } - #endif return false; } diff --git a/modules/gdscript/gdscript.h b/modules/gdscript/gdscript.h index f344beba9f..752d660ffb 100644 --- a/modules/gdscript/gdscript.h +++ b/modules/gdscript/gdscript.h @@ -141,7 +141,7 @@ protected: static void _bind_methods(); public: - bool is_valid() const { return valid; } + virtual bool is_valid() const { return valid; } const Map<StringName, Ref<GDScript> > &get_subclasses() const { return subclasses; } const Map<StringName, Variant> &get_constants() const { return constants; } diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp index 700e518cfc..0a54ed5fbd 100644 --- a/modules/mono/csharp_script.cpp +++ b/modules/mono/csharp_script.cpp @@ -2571,6 +2571,10 @@ void CSharpScript::update_exports() { #endif } +bool CSharpScript::is_valid() const { + return true; //TODO return false if invalid +} + bool CSharpScript::has_script_signal(const StringName &p_signal) const { if (_signals.has(p_signal)) return true; diff --git a/modules/mono/csharp_script.h b/modules/mono/csharp_script.h index fc604df2a0..871d4d7e4c 100644 --- a/modules/mono/csharp_script.h +++ b/modules/mono/csharp_script.h @@ -158,6 +158,8 @@ public: virtual void update_exports(); virtual bool is_tool() const { return tool; } + virtual bool is_valid() const; + virtual Ref<Script> get_base_script() const; virtual ScriptLanguage *get_language() const; diff --git a/modules/visual_script/visual_script.cpp b/modules/visual_script/visual_script.cpp index 186e9e63b1..5b3b3a6769 100644 --- a/modules/visual_script/visual_script.cpp +++ b/modules/visual_script/visual_script.cpp @@ -981,6 +981,10 @@ bool VisualScript::is_tool() const { return false; } +bool VisualScript::is_valid() const { + return true; //always valid +} + ScriptLanguage *VisualScript::get_language() const { return VisualScriptLanguage::singleton; diff --git a/modules/visual_script/visual_script.h b/modules/visual_script/visual_script.h index bd666447a3..cdc9159a73 100644 --- a/modules/visual_script/visual_script.h +++ b/modules/visual_script/visual_script.h @@ -341,6 +341,7 @@ public: virtual Error reload(bool p_keep_state = false); virtual bool is_tool() const; + virtual bool is_valid() const; virtual ScriptLanguage *get_language() const; diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp index 97230d422b..d7750c91ef 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -210,8 +210,6 @@ #include "scene/resources/physics_material.h" #endif -static ResourceFormatLoaderTheme *resource_loader_theme = NULL; - static ResourceFormatSaverText *resource_saver_text = NULL; static ResourceFormatLoaderText *resource_loader_text = NULL; @@ -242,9 +240,6 @@ void register_scene_types() { resource_loader_texture_layered = memnew(ResourceFormatLoaderTextureLayered); ResourceLoader::add_resource_format_loader(resource_loader_texture_layered); - resource_loader_theme = memnew(ResourceFormatLoaderTheme); - ResourceLoader::add_resource_format_loader(resource_loader_theme); - resource_saver_text = memnew(ResourceFormatSaverText); ResourceSaver::add_resource_format_saver(resource_saver_text, true); @@ -743,7 +738,6 @@ void unregister_scene_types() { memdelete(resource_loader_dynamic_font); memdelete(resource_loader_stream_texture); memdelete(resource_loader_texture_layered); - memdelete(resource_loader_theme); DynamicFont::finish_dynamic_fonts(); diff --git a/scene/resources/environment.cpp b/scene/resources/environment.cpp index c9cdfe866f..ac98b5a393 100644 --- a/scene/resources/environment.cpp +++ b/scene/resources/environment.cpp @@ -504,7 +504,7 @@ float Environment::get_ssao_edge_sharpness() const { void Environment::set_glow_enabled(bool p_enabled) { glow_enabled = p_enabled; - VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_bicubic_upscale); + VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale); _change_notify(); } @@ -522,7 +522,7 @@ void Environment::set_glow_level(int p_level, bool p_enabled) { else glow_levels &= ~(1 << p_level); - VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_bicubic_upscale); + VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale); } bool Environment::is_glow_level_enabled(int p_level) const { @@ -535,7 +535,7 @@ void Environment::set_glow_intensity(float p_intensity) { glow_intensity = p_intensity; - VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_bicubic_upscale); + VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale); } float Environment::get_glow_intensity() const { @@ -545,7 +545,7 @@ float Environment::get_glow_intensity() const { void Environment::set_glow_strength(float p_strength) { glow_strength = p_strength; - VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_bicubic_upscale); + VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale); } float Environment::get_glow_strength() const { @@ -556,7 +556,7 @@ void Environment::set_glow_bloom(float p_threshold) { glow_bloom = p_threshold; - VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_bicubic_upscale); + VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale); } float Environment::get_glow_bloom() const { @@ -567,7 +567,7 @@ void Environment::set_glow_blend_mode(GlowBlendMode p_mode) { glow_blend_mode = p_mode; - VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_bicubic_upscale); + VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale); } Environment::GlowBlendMode Environment::get_glow_blend_mode() const { @@ -578,18 +578,29 @@ void Environment::set_glow_hdr_bleed_threshold(float p_threshold) { glow_hdr_bleed_threshold = p_threshold; - VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_bicubic_upscale); + VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale); } float Environment::get_glow_hdr_bleed_threshold() const { return glow_hdr_bleed_threshold; } +void Environment::set_glow_hdr_luminance_cap(float p_threshold) { + + glow_hdr_luminance_cap = p_threshold; + + VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale); +} +float Environment::get_glow_hdr_luminance_cap() const { + + return glow_hdr_luminance_cap; +} + void Environment::set_glow_hdr_bleed_scale(float p_scale) { glow_hdr_bleed_scale = p_scale; - VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_bicubic_upscale); + VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale); } float Environment::get_glow_hdr_bleed_scale() const { @@ -599,7 +610,7 @@ float Environment::get_glow_hdr_bleed_scale() const { void Environment::set_glow_bicubic_upscale(bool p_enable) { glow_bicubic_upscale = p_enable; - VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_bicubic_upscale); + VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale); } bool Environment::is_glow_bicubic_upscale_enabled() const { @@ -1127,6 +1138,9 @@ void Environment::_bind_methods() { ClassDB::bind_method(D_METHOD("set_glow_hdr_bleed_threshold", "threshold"), &Environment::set_glow_hdr_bleed_threshold); ClassDB::bind_method(D_METHOD("get_glow_hdr_bleed_threshold"), &Environment::get_glow_hdr_bleed_threshold); + ClassDB::bind_method(D_METHOD("set_glow_hdr_luminance_cap", "amount"), &Environment::set_glow_hdr_luminance_cap); + ClassDB::bind_method(D_METHOD("get_glow_hdr_luminance_cap"), &Environment::get_glow_hdr_luminance_cap); + ClassDB::bind_method(D_METHOD("set_glow_hdr_bleed_scale", "scale"), &Environment::set_glow_hdr_bleed_scale); ClassDB::bind_method(D_METHOD("get_glow_hdr_bleed_scale"), &Environment::get_glow_hdr_bleed_scale); @@ -1148,6 +1162,7 @@ void Environment::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "glow_bloom", PROPERTY_HINT_RANGE, "0.0,1.0,0.01"), "set_glow_bloom", "get_glow_bloom"); ADD_PROPERTY(PropertyInfo(Variant::INT, "glow_blend_mode", PROPERTY_HINT_ENUM, "Additive,Screen,Softlight,Replace"), "set_glow_blend_mode", "get_glow_blend_mode"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "glow_hdr_threshold", PROPERTY_HINT_RANGE, "0.0,4.0,0.01"), "set_glow_hdr_bleed_threshold", "get_glow_hdr_bleed_threshold"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "glow_hdr_luminance_cap", PROPERTY_HINT_RANGE, "0.0,256.0,0.01"), "set_glow_hdr_luminance_cap", "get_glow_hdr_luminance_cap"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "glow_hdr_scale", PROPERTY_HINT_RANGE, "0.0,4.0,0.01"), "set_glow_hdr_bleed_scale", "get_glow_hdr_bleed_scale"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "glow_bicubic_upscale"), "set_glow_bicubic_upscale", "is_glow_bicubic_upscale_enabled"); @@ -1261,6 +1276,7 @@ Environment::Environment() { glow_bloom = 0.0; glow_blend_mode = GLOW_BLEND_MODE_SOFTLIGHT; glow_hdr_bleed_threshold = 1.0; + glow_hdr_luminance_cap = 12.0; glow_hdr_bleed_scale = 2.0; glow_bicubic_upscale = false; diff --git a/scene/resources/environment.h b/scene/resources/environment.h index 4f5d44088a..55d96bc5bd 100644 --- a/scene/resources/environment.h +++ b/scene/resources/environment.h @@ -141,6 +141,7 @@ private: GlowBlendMode glow_blend_mode; float glow_hdr_bleed_threshold; float glow_hdr_bleed_scale; + float glow_hdr_luminance_cap; bool glow_bicubic_upscale; bool dof_blur_far_enabled; @@ -312,6 +313,9 @@ public: void set_glow_hdr_bleed_threshold(float p_threshold); float get_glow_hdr_bleed_threshold() const; + void set_glow_hdr_luminance_cap(float p_amount); + float get_glow_hdr_luminance_cap() const; + void set_glow_hdr_bleed_scale(float p_scale); float get_glow_hdr_bleed_scale() const; diff --git a/scene/resources/theme.cpp b/scene/resources/theme.cpp index 8c01a642ae..3eb652ecd9 100644 --- a/scene/resources/theme.cpp +++ b/scene/resources/theme.cpp @@ -761,411 +761,3 @@ Theme::Theme() { Theme::~Theme() { } - -RES ResourceFormatLoaderTheme::load(const String &p_path, const String &p_original_path, Error *r_error) { - if (r_error) - *r_error = ERR_CANT_OPEN; - - Error err; - FileAccess *f = FileAccess::open(p_path, FileAccess::READ, &err); - - ERR_EXPLAIN("Unable to open theme file: " + p_path); - ERR_FAIL_COND_V(err, RES()); - String base_path = p_path.get_base_dir(); - Ref<Theme> theme(memnew(Theme)); - Map<StringName, Variant> library; - if (r_error) - *r_error = ERR_FILE_CORRUPT; - - bool reading_library = false; - int line = 0; - - while (!f->eof_reached()) { - - String l = f->get_line().strip_edges(); - line++; - - int comment = l.find(";"); - if (comment != -1) - l = l.substr(0, comment); - if (l == "") - continue; - - if (l.begins_with("[")) { - if (l == "[library]") { - reading_library = true; - } else if (l == "[theme]") { - reading_library = false; - } else { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Unknown section type: '" + l + "'."); - ERR_FAIL_V(RES()); - } - continue; - } - - int eqpos = l.find("="); - if (eqpos == -1) { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Expected '='."); - ERR_FAIL_V(RES()); - } - - String right = l.substr(eqpos + 1, l.length()).strip_edges(); - if (right == "") { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Expected value after '='."); - ERR_FAIL_V(RES()); - } - - Variant value; - - if (right.is_valid_integer()) { - //is number - value = right.to_int(); - } else if (right.is_valid_html_color()) { - //is html color - value = Color::html(right); - } else if (right.begins_with("@")) { //reference - - String reference = right.substr(1, right.length()); - if (!library.has(reference)) { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid reference to '" + reference + "'."); - ERR_FAIL_V(RES()); - } - - value = library[reference]; - - } else if (right.begins_with("default")) { //use default - //do none - } else { - //attempt to parse a constructor - int popenpos = right.find("("); - - if (popenpos == -1) { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid constructor syntax: " + right); - ERR_FAIL_V(RES()); - } - - int pclosepos = right.find_last(")"); - - if (pclosepos == -1) { - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid constructor parameter syntax: " + right); - ERR_FAIL_V(RES()); - } - - String type = right.substr(0, popenpos); - String param = right.substr(popenpos + 1, pclosepos - popenpos - 1); - - if (type == "icon") { - - String path; - - if (param.is_abs_path()) - path = param; - else - path = base_path + "/" + param; - - Ref<Texture> texture = ResourceLoader::load(path); - if (!texture.is_valid()) { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Couldn't find icon at path: " + path); - ERR_FAIL_V(RES()); - } - - value = texture; - - } else if (type == "sbox") { - - String path; - - if (param.is_abs_path()) - path = param; - else - path = base_path + "/" + param; - - Ref<StyleBox> stylebox = ResourceLoader::load(path); - if (!stylebox.is_valid()) { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Couldn't find stylebox at path: " + path); - ERR_FAIL_V(RES()); - } - - value = stylebox; - - } else if (type == "sboxt") { - - Vector<String> params = param.split(","); - if (params.size() != 5 && params.size() != 9) { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid param count for sboxt(): '" + right + "'."); - ERR_FAIL_V(RES()); - } - - String path = params[0]; - - if (!param.is_abs_path()) - path = base_path + "/" + path; - - Ref<Texture> tex = ResourceLoader::load(path); - if (tex.is_null()) { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Could not open texture for sboxt at path: '" + params[0] + "'."); - ERR_FAIL_V(RES()); - } - - Ref<StyleBoxTexture> sbtex(memnew(StyleBoxTexture)); - - sbtex->set_texture(tex); - - for (int i = 0; i < 4; i++) { - if (!params[i + 1].is_valid_integer()) { - - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid expand margin parameter for sboxt #" + itos(i + 1) + ", expected integer constant, got: '" + params[i + 1] + "'."); - ERR_FAIL_V(RES()); - } - - int margin = params[i + 1].to_int(); - sbtex->set_expand_margin_size(Margin(i), margin); - } - - if (params.size() == 9) { - - for (int i = 0; i < 4; i++) { - - if (!params[i + 5].is_valid_integer()) { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid expand margin parameter for sboxt #" + itos(i + 5) + ", expected integer constant, got: '" + params[i + 5] + "'."); - ERR_FAIL_V(RES()); - } - - int margin = params[i + 5].to_int(); - sbtex->set_margin_size(Margin(i), margin); - } - } - - value = sbtex; - } else if (type == "sboxf") { - - Vector<String> params = param.split(","); - if (params.size() < 2) { - - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid param count for sboxf(): '" + right + "'."); - ERR_FAIL_V(RES()); - } - - Ref<StyleBoxFlat> sbflat(memnew(StyleBoxFlat)); - - if (!params[0].is_valid_integer()) { - - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Expected integer numeric constant for parameter 0 (border size)."); - ERR_FAIL_V(RES()); - } - - sbflat->set_border_width_all(params[0].to_int()); - - if (!params[0].is_valid_integer()) { - - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Expected integer numeric constant for parameter 0 (border size)."); - ERR_FAIL_V(RES()); - } - - int left = MIN(params.size() - 1, 3); - - int ccodes = 0; - - for (int i = 0; i < left; i++) { - - if (params[i + 1].is_valid_html_color()) - ccodes++; - else - break; - } - - Color normal; - Color bright; - Color dark; - - if (ccodes < 1) { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Expected at least 1, 2 or 3 html color codes."); - ERR_FAIL_V(RES()); - } else if (ccodes == 1) { - - normal = Color::html(params[1]); - bright = Color::html(params[1]); - dark = Color::html(params[1]); - } else if (ccodes == 2) { - - normal = Color::html(params[1]); - bright = Color::html(params[2]); - dark = Color::html(params[2]); - } else { - - normal = Color::html(params[1]); - bright = Color::html(params[2]); - dark = Color::html(params[3]); - } - - sbflat->set_border_color_all(bright); - // sbflat->set_dark_color(dark); - sbflat->set_bg_color(normal); - - if (params.size() == ccodes + 5) { - //margins - for (int i = 0; i < 4; i++) { - - if (!params[i + ccodes + 1].is_valid_integer()) { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid expand margin parameter for sboxf #" + itos(i + ccodes + 1) + ", expected integer constant, got: '" + params[i + ccodes + 1] + "'."); - ERR_FAIL_V(RES()); - } - - //int margin = params[i+ccodes+1].to_int(); - //sbflat->set_margin_size(Margin(i),margin); - } - } else if (params.size() != ccodes + 1) { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid amount of margin parameters for sboxt."); - ERR_FAIL_V(RES()); - } - - value = sbflat; - - } else { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid constructor type: '" + type + "'."); - ERR_FAIL_V(RES()); - } - } - - //parse left and do something with it - String left = l.substr(0, eqpos); - - if (reading_library) { - - left = left.strip_edges(); - if (!left.is_valid_identifier()) { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": <LibraryItem> is not a valid identifier."); - ERR_FAIL_V(RES()); - } - if (library.has(left)) { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Already in library: '" + left + "'."); - ERR_FAIL_V(RES()); - } - - library[left] = value; - } else { - - int pointpos = left.find("."); - if (pointpos == -1) { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Expected 'control.item=..' assign syntax."); - ERR_FAIL_V(RES()); - } - - String control = left.substr(0, pointpos).strip_edges(); - if (!control.is_valid_identifier()) { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": <Control> is not a valid identifier."); - ERR_FAIL_V(RES()); - } - String item = left.substr(pointpos + 1, left.size()).strip_edges(); - if (!item.is_valid_identifier()) { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": <Item> is not a valid identifier."); - ERR_FAIL_V(RES()); - } - - if (value.get_type() == Variant::NIL) { - //try to use exiting - if (Theme::get_default()->has_stylebox(item, control)) - value = Theme::get_default()->get_stylebox(item, control); - else if (Theme::get_default()->has_font(item, control)) - value = Theme::get_default()->get_font(item, control); - else if (Theme::get_default()->has_icon(item, control)) - value = Theme::get_default()->get_icon(item, control); - else if (Theme::get_default()->has_color(item, control)) - value = Theme::get_default()->get_color(item, control); - else if (Theme::get_default()->has_constant(item, control)) - value = Theme::get_default()->get_constant(item, control); - else { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Default not present for: '" + control + "." + item + "'."); - ERR_FAIL_V(RES()); - } - } - - if (value.get_type() == Variant::OBJECT) { - - Ref<Resource> res = value; - if (!res.is_valid()) { - - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid resource (NULL)."); - ERR_FAIL_V(RES()); - } - - if (Object::cast_to<StyleBox>(*res)) { - theme->set_stylebox(item, control, res); - } else if (Object::cast_to<Font>(*res)) { - theme->set_font(item, control, res); - } else if (Object::cast_to<Font>(*res)) { - theme->set_font(item, control, res); - } else if (Object::cast_to<Texture>(*res)) { - theme->set_icon(item, control, res); - } else { - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid resource type."); - ERR_FAIL_V(RES()); - } - } else if (value.get_type() == Variant::COLOR) { - - theme->set_color(item, control, value); - - } else if (value.get_type() == Variant::INT) { - - theme->set_constant(item, control, value); - - } else { - - memdelete(f); - ERR_EXPLAIN(p_path + ":" + itos(line) + ": Couldn't even determine what this setting is! what did you do!?"); - ERR_FAIL_V(RES()); - } - } - } - - f->close(); - memdelete(f); - - if (r_error) - *r_error = OK; - - return theme; -} - -void ResourceFormatLoaderTheme::get_recognized_extensions(List<String> *p_extensions) const { - - p_extensions->push_back("theme"); -} - -bool ResourceFormatLoaderTheme::handles_type(const String &p_type) const { - - return p_type == "Theme"; -} - -String ResourceFormatLoaderTheme::get_resource_type(const String &p_path) const { - - if (p_path.get_extension().to_lower() == "theme") - return "Theme"; - return ""; -} diff --git a/scene/resources/theme.h b/scene/resources/theme.h index c9da5f6ead..ba47c5fb3c 100644 --- a/scene/resources/theme.h +++ b/scene/resources/theme.h @@ -190,12 +190,4 @@ public: ~Theme(); }; -class ResourceFormatLoaderTheme : public ResourceFormatLoader { -public: - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL); - virtual void get_recognized_extensions(List<String> *p_extensions) const; - virtual bool handles_type(const String &p_type) const; - virtual String get_resource_type(const String &p_path) const; -}; - #endif diff --git a/servers/visual/rasterizer.h b/servers/visual/rasterizer.h index 4329203ccb..f78b4aaf5f 100644 --- a/servers/visual/rasterizer.h +++ b/servers/visual/rasterizer.h @@ -62,7 +62,7 @@ public: virtual void environment_set_dof_blur_near(RID p_env, bool p_enable, float p_distance, float p_transition, float p_far_amount, VS::EnvironmentDOFBlurQuality p_quality) = 0; virtual void environment_set_dof_blur_far(RID p_env, bool p_enable, float p_distance, float p_transition, float p_far_amount, VS::EnvironmentDOFBlurQuality p_quality) = 0; - virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, bool p_bicubic_upscale) = 0; + virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale) = 0; virtual void environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture) = 0; virtual void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance, bool p_roughness) = 0; diff --git a/servers/visual/visual_server_raster.h b/servers/visual/visual_server_raster.h index d37fe28ac6..f3a442be99 100644 --- a/servers/visual/visual_server_raster.h +++ b/servers/visual/visual_server_raster.h @@ -504,7 +504,7 @@ public: BIND6(environment_set_dof_blur_near, RID, bool, float, float, float, EnvironmentDOFBlurQuality) BIND6(environment_set_dof_blur_far, RID, bool, float, float, float, EnvironmentDOFBlurQuality) - BIND10(environment_set_glow, RID, bool, int, float, float, float, EnvironmentGlowBlendMode, float, float, bool) + BIND11(environment_set_glow, RID, bool, int, float, float, float, EnvironmentGlowBlendMode, float, float, float, bool) BIND9(environment_set_tonemap, RID, EnvironmentToneMapper, float, float, bool, float, float, float, float) diff --git a/servers/visual/visual_server_wrap_mt.h b/servers/visual/visual_server_wrap_mt.h index 1aeb2756ba..37f6323b8f 100644 --- a/servers/visual/visual_server_wrap_mt.h +++ b/servers/visual/visual_server_wrap_mt.h @@ -430,7 +430,7 @@ public: FUNC6(environment_set_dof_blur_near, RID, bool, float, float, float, EnvironmentDOFBlurQuality) FUNC6(environment_set_dof_blur_far, RID, bool, float, float, float, EnvironmentDOFBlurQuality) - FUNC10(environment_set_glow, RID, bool, int, float, float, float, EnvironmentGlowBlendMode, float, float, bool) + FUNC11(environment_set_glow, RID, bool, int, float, float, float, EnvironmentGlowBlendMode, float, float, float, bool) FUNC9(environment_set_tonemap, RID, EnvironmentToneMapper, float, float, bool, float, float, float, float) diff --git a/servers/visual_server.h b/servers/visual_server.h index 743e010034..ad2819a95a 100644 --- a/servers/visual_server.h +++ b/servers/visual_server.h @@ -733,7 +733,7 @@ public: GLOW_BLEND_MODE_SOFTLIGHT, GLOW_BLEND_MODE_REPLACE, }; - virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, bool p_bicubic_upscale) = 0; + virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale) = 0; enum EnvironmentToneMapper { ENV_TONE_MAPPER_LINEAR, |