summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/math/octree.h2
-rw-r--r--core/math/vector2.h15
-rw-r--r--core/math/vector3.h12
-rw-r--r--doc/classes/HMACContext.xml4
-rw-r--r--doc/classes/ProjectSettings.xml2
-rw-r--r--doc/classes/RenderingServer.xml47
-rw-r--r--doc/classes/Vector2.xml2
-rw-r--r--doc/classes/Vector3.xml2
-rw-r--r--drivers/gles3/rasterizer_storage_gles3.h2
-rw-r--r--editor/import_dock.cpp2
-rw-r--r--editor/plugins/material_editor_plugin.cpp2
-rw-r--r--editor/script_create_dialog.cpp10
-rw-r--r--modules/gdscript/gdscript_editor.cpp4
-rw-r--r--scene/property_utils.cpp33
-rw-r--r--servers/rendering_server.cpp11
-rw-r--r--servers/rendering_server.h1
16 files changed, 123 insertions, 28 deletions
diff --git a/core/math/octree.h b/core/math/octree.h
index 7861c35e07..23ba4c1aa3 100644
--- a/core/math/octree.h
+++ b/core/math/octree.h
@@ -103,7 +103,7 @@ private:
Octant *parent = nullptr;
Octant *children[8] = { nullptr };
- int children_count = 0; // cache for amount of childrens (fast check for removal)
+ int children_count = 0; // cache for amount of children (fast check for removal)
int parent_index = -1; // cache for parent index (fast check for removal)
List<Element *, AL> pairable_elements;
diff --git a/core/math/vector2.h b/core/math/vector2.h
index 493e0af27d..e45e011d64 100644
--- a/core/math/vector2.h
+++ b/core/math/vector2.h
@@ -261,11 +261,16 @@ Vector2 Vector2::lerp(const Vector2 &p_to, const real_t p_weight) const {
}
Vector2 Vector2::slerp(const Vector2 &p_to, const real_t p_weight) const {
-#ifdef MATH_CHECKS
- ERR_FAIL_COND_V_MSG(!is_normalized(), Vector2(), "The start Vector2 must be normalized.");
-#endif
- real_t theta = angle_to(p_to);
- return rotated(theta * p_weight);
+ real_t start_length_sq = length_squared();
+ real_t end_length_sq = p_to.length_squared();
+ if (unlikely(start_length_sq == 0.0 || end_length_sq == 0.0)) {
+ // Zero length vectors have no angle, so the best we can do is either lerp or throw an error.
+ return lerp(p_to, p_weight);
+ }
+ real_t start_length = Math::sqrt(start_length_sq);
+ real_t result_length = Math::lerp(start_length, Math::sqrt(end_length_sq), p_weight);
+ real_t angle = angle_to(p_to);
+ return rotated(angle * p_weight) * (result_length / start_length);
}
Vector2 Vector2::direction_to(const Vector2 &p_to) const {
diff --git a/core/math/vector3.h b/core/math/vector3.h
index 1861627718..d7a72b05a8 100644
--- a/core/math/vector3.h
+++ b/core/math/vector3.h
@@ -240,8 +240,16 @@ Vector3 Vector3::lerp(const Vector3 &p_to, const real_t p_weight) const {
}
Vector3 Vector3::slerp(const Vector3 &p_to, const real_t p_weight) const {
- real_t theta = angle_to(p_to);
- return rotated(cross(p_to).normalized(), theta * p_weight);
+ real_t start_length_sq = length_squared();
+ real_t end_length_sq = p_to.length_squared();
+ if (unlikely(start_length_sq == 0.0 || end_length_sq == 0.0)) {
+ // Zero length vectors have no angle, so the best we can do is either lerp or throw an error.
+ return lerp(p_to, p_weight);
+ }
+ real_t start_length = Math::sqrt(start_length_sq);
+ real_t result_length = Math::lerp(start_length, Math::sqrt(end_length_sq), p_weight);
+ real_t angle = angle_to(p_to);
+ return rotated(cross(p_to).normalized(), angle * p_weight) * (result_length / start_length);
}
real_t Vector3::distance_to(const Vector3 &p_to) const {
diff --git a/doc/classes/HMACContext.xml b/doc/classes/HMACContext.xml
index b29f821da5..0b2d65d339 100644
--- a/doc/classes/HMACContext.xml
+++ b/doc/classes/HMACContext.xml
@@ -15,7 +15,7 @@
var err = ctx.start(HashingContext.HASH_SHA256, key)
assert(err == OK)
var msg1 = "this is ".to_utf8()
- var msg2 = "vewy vewy secret".to_utf8()
+ var msg2 = "super duper secret".to_utf8()
err = ctx.update(msg1)
assert(err == OK)
err = ctx.update(msg2)
@@ -38,7 +38,7 @@
Error err = ctx.Start(HashingContext.HASH_SHA256, key);
GD.Assert(err == OK);
PackedByteArray msg1 = String("this is ").to_utf8();
- PackedByteArray msg2 = String("vewy vew secret").to_utf8();
+ PackedByteArray msg2 = String("super duper secret").to_utf8();
err = ctx.Update(msg1);
GD.Assert(err == OK);
err = ctx.Update(msg2);
diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml
index 2065c59d18..7034fc1f75 100644
--- a/doc/classes/ProjectSettings.xml
+++ b/doc/classes/ProjectSettings.xml
@@ -1691,6 +1691,8 @@
<member name="rendering/gles2/compatibility/enable_high_float.Android" type="bool" setter="" getter="" default="false">
</member>
<member name="rendering/global_illumination/gi/use_half_resolution" type="bool" setter="" getter="" default="false">
+ If [code]true[/code], renders [VoxelGI] and SDFGI ([member Environment.sdfgi_enabled]) buffers at halved resolution (e.g. 960×540 when the viewport size is 1920×1080). This improves performance significantly when VoxelGI or SDFGI is enabled, at the cost of artifacts that may be visible on polygon edges. The loss in quality becomes less noticeable as the viewport resolution increases. [LightmapGI] rendering is not affected by this setting.
+ [b]Note:[/b] This property is only read when the project starts. To set half-resolution GI at run-time, call [method RenderingServer.gi_set_use_half_resolution] instead.
</member>
<member name="rendering/global_illumination/sdfgi/frames_to_converge" type="int" setter="" getter="" default="4">
</member>
diff --git a/doc/classes/RenderingServer.xml b/doc/classes/RenderingServer.xml
index f17f6293bc..009e9d3df4 100644
--- a/doc/classes/RenderingServer.xml
+++ b/doc/classes/RenderingServer.xml
@@ -1068,7 +1068,7 @@
<argument index="8" name="light_affect" type="float" />
<argument index="9" name="ao_channel_affect" type="float" />
<description>
- Sets the variables to be used with the "screen space ambient occlusion" post-process effect. See [Environment] for more details.
+ Sets the variables to be used with the screen-space ambient occlusion (SSAO) post-process effect. See [Environment] for more details.
</description>
</method>
<method name="environment_set_ssao_quality">
@@ -1080,6 +1080,19 @@
<argument index="4" name="fadeout_from" type="float" />
<argument index="5" name="fadeout_to" type="float" />
<description>
+ Sets the quality level of the screen-space ambient occlusion (SSAO) post-process effect. See [Environment] for more details.
+ </description>
+ </method>
+ <method name="environment_set_ssil_quality">
+ <return type="void" />
+ <argument index="0" name="quality" type="int" enum="RenderingServer.EnvironmentSSILQuality" />
+ <argument index="1" name="half_size" type="bool" />
+ <argument index="2" name="adaptive_target" type="float" />
+ <argument index="3" name="blur_passes" type="int" />
+ <argument index="4" name="fadeout_from" type="float" />
+ <argument index="5" name="fadeout_to" type="float" />
+ <description>
+ Sets the quality level of the screen-space indirect lighting (SSIL) post-process effect. See [Environment] for more details.
</description>
</method>
<method name="environment_set_ssr">
@@ -1252,6 +1265,13 @@
Returns the id of a white texture. Creates one if none exists.
</description>
</method>
+ <method name="gi_set_use_half_resolution">
+ <return type="void" />
+ <argument index="0" name="half_resolution" type="bool" />
+ <description>
+ If [code]half_resolution[/code] is [code]true[/code], renders [VoxelGI] and SDFGI ([member Environment.sdfgi_enabled]) buffers at halved resolution (e.g. 960×540 when the viewport size is 1920×1080). This improves performance significantly when VoxelGI or SDFGI is enabled, at the cost of artifacts that may be visible on polygon edges. The loss in quality becomes less noticeable as the viewport resolution increases. [LightmapGI] rendering is not affected by this setting. See also [member ProjectSettings.rendering/global_illumination/gi/use_half_resolution].
+ </description>
+ </method>
<method name="global_variable_add">
<return type="void" />
<argument index="0" name="name" type="StringName" />
@@ -4131,19 +4151,34 @@
<constant name="ENV_SSR_ROUGNESS_QUALITY_HIGH" value="3" enum="EnvironmentSSRRoughnessQuality">
</constant>
<constant name="ENV_SSAO_QUALITY_VERY_LOW" value="0" enum="EnvironmentSSAOQuality">
- Lowest quality of screen space ambient occlusion.
+ Lowest quality of screen-space ambient occlusion.
</constant>
<constant name="ENV_SSAO_QUALITY_LOW" value="1" enum="EnvironmentSSAOQuality">
- Low quality screen space ambient occlusion.
+ Low quality screen-space ambient occlusion.
</constant>
<constant name="ENV_SSAO_QUALITY_MEDIUM" value="2" enum="EnvironmentSSAOQuality">
- Medium quality screen space ambient occlusion.
+ Medium quality screen-space ambient occlusion.
</constant>
<constant name="ENV_SSAO_QUALITY_HIGH" value="3" enum="EnvironmentSSAOQuality">
- High quality screen space ambient occlusion.
+ High quality screen-space ambient occlusion.
</constant>
<constant name="ENV_SSAO_QUALITY_ULTRA" value="4" enum="EnvironmentSSAOQuality">
- Highest quality screen space ambient occlusion. Uses the adaptive setting which can be dynamically adjusted to smoothly balance performance and visual quality.
+ Highest quality screen-space ambient occlusion. Uses the adaptive target setting which can be dynamically adjusted to smoothly balance performance and visual quality.
+ </constant>
+ <constant name="ENV_SSIL_QUALITY_VERY_LOW" value="0" enum="EnvironmentSSILQuality">
+ Lowest quality of screen-space indirect lighting.
+ </constant>
+ <constant name="ENV_SSIL_QUALITY_LOW" value="1" enum="EnvironmentSSILQuality">
+ Low quality screen-space indirect lighting.
+ </constant>
+ <constant name="ENV_SSIL_QUALITY_MEDIUM" value="2" enum="EnvironmentSSILQuality">
+ High quality screen-space indirect lighting.
+ </constant>
+ <constant name="ENV_SSIL_QUALITY_HIGH" value="3" enum="EnvironmentSSILQuality">
+ High quality screen-space indirect lighting.
+ </constant>
+ <constant name="ENV_SSIL_QUALITY_ULTRA" value="4" enum="EnvironmentSSILQuality">
+ Highest quality screen-space indirect lighting. Uses the adaptive target setting which can be dynamically adjusted to smoothly balance performance and visual quality.
</constant>
<constant name="ENV_SDFGI_CASCADES_4" value="0" enum="EnvironmentSDFGICascades">
</constant>
diff --git a/doc/classes/Vector2.xml b/doc/classes/Vector2.xml
index e7faa3ef0f..64256f33fd 100644
--- a/doc/classes/Vector2.xml
+++ b/doc/classes/Vector2.xml
@@ -299,7 +299,7 @@
<argument index="1" name="weight" type="float" />
<description>
Returns the result of spherical linear interpolation between this vector and [code]to[/code], by amount [code]weight[/code]. [code]weight[/code] is on the range of 0.0 to 1.0, representing the amount of interpolation.
- [b]Note:[/b] Both vectors must be normalized.
+ This method also handles interpolating the lengths if the input vectors have different lengths. For the special case of one or both input vectors having zero length, this method behaves like [method lerp].
</description>
</method>
<method name="slide" qualifiers="const">
diff --git a/doc/classes/Vector3.xml b/doc/classes/Vector3.xml
index 8d2ef0ecd9..ead08d86df 100644
--- a/doc/classes/Vector3.xml
+++ b/doc/classes/Vector3.xml
@@ -290,7 +290,7 @@
<argument index="1" name="weight" type="float" />
<description>
Returns the result of spherical linear interpolation between this vector and [code]to[/code], by amount [code]weight[/code]. [code]weight[/code] is on the range of 0.0 to 1.0, representing the amount of interpolation.
- [b]Note:[/b] Both vectors must be normalized.
+ This method also handles interpolating the lengths if the input vectors have different lengths. For the special case of one or both input vectors having zero length, this method behaves like [method lerp].
</description>
</method>
<method name="slide" qualifiers="const">
diff --git a/drivers/gles3/rasterizer_storage_gles3.h b/drivers/gles3/rasterizer_storage_gles3.h
index 69af0f6578..807789586b 100644
--- a/drivers/gles3/rasterizer_storage_gles3.h
+++ b/drivers/gles3/rasterizer_storage_gles3.h
@@ -1325,7 +1325,7 @@ public:
struct Frame {
RenderTarget *current_rt;
- // these 2 may have been superceded by the equivalents in the render target.
+ // these 2 may have been superseded by the equivalents in the render target.
// these may be able to be removed.
bool clear_request;
Color clear_request_color;
diff --git a/editor/import_dock.cpp b/editor/import_dock.cpp
index ab1be7f41b..10654cfe43 100644
--- a/editor/import_dock.cpp
+++ b/editor/import_dock.cpp
@@ -297,6 +297,8 @@ void ImportDock::set_edit_multiple_paths(const Vector<String> &p_paths) {
_set_dirty(false);
import_as->set_disabled(false);
preset->set_disabled(false);
+ content->show();
+ select_a_resource->hide();
imported->set_text(vformat(TTR("%d Files"), p_paths.size()));
diff --git a/editor/plugins/material_editor_plugin.cpp b/editor/plugins/material_editor_plugin.cpp
index 490605e9ed..9d45c365a8 100644
--- a/editor/plugins/material_editor_plugin.cpp
+++ b/editor/plugins/material_editor_plugin.cpp
@@ -261,7 +261,7 @@ void EditorInspectorPluginMaterial::_undo_redo_inspector_callback(Object *p_undo
}
// For BaseMaterial3D, if a roughness or metallic textures is being assigned to an empty slot,
- // set the respective metallic or roughness factor to 1.0 as a convinence feature
+ // set the respective metallic or roughness factor to 1.0 as a convenience feature
BaseMaterial3D *base_material = Object::cast_to<StandardMaterial3D>(p_edited);
if (base_material) {
Texture2D *texture = Object::cast_to<Texture2D>(p_new_value);
diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp
index 20c6aafc7f..2098fa2c85 100644
--- a/editor/script_create_dialog.cpp
+++ b/editor/script_create_dialog.cpp
@@ -353,15 +353,15 @@ void ScriptCreateDialog::_load_exist() {
}
Vector<String> ScriptCreateDialog::get_hierarchy(String p_object) const {
- Vector<String> hierachy;
- hierachy.append(p_object);
+ Vector<String> hierarchy;
+ hierarchy.append(p_object);
String parent_class = ClassDB::get_parent_class(p_object);
while (parent_class.is_valid_identifier()) {
- hierachy.append(parent_class);
+ hierarchy.append(parent_class);
parent_class = ClassDB::get_parent_class(parent_class);
}
- return hierachy;
+ return hierarchy;
}
void ScriptCreateDialog::_language_changed(int l) {
@@ -544,7 +544,7 @@ void ScriptCreateDialog::_update_template_menu() {
template_list.clear();
if (is_language_using_templates) {
- // Get the lastest templates used for each type of node from project settings then global settings.
+ // Get the latest templates used for each type of node from project settings then global settings.
Dictionary last_local_templates = EditorSettings::get_singleton()->get_project_metadata("script_setup", "templates_dictionary", Dictionary());
Dictionary last_global_templates;
if (EditorSettings::get_singleton()->has_meta("script_setup/templates_dictionary")) {
diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp
index 81aaef09dc..9db76861ff 100644
--- a/modules/gdscript/gdscript_editor.cpp
+++ b/modules/gdscript/gdscript_editor.cpp
@@ -1164,6 +1164,10 @@ static bool _guess_method_return_type_from_base(GDScriptParser::CompletionContex
static bool _guess_expression_type(GDScriptParser::CompletionContext &p_context, const GDScriptParser::ExpressionNode *p_expression, GDScriptCompletionIdentifier &r_type) {
bool found = false;
+ if (p_expression == nullptr) {
+ return false;
+ }
+
if (p_expression->is_constant) {
// Already has a value, so just use that.
r_type = _type_from_variant(p_expression->reduced_value);
diff --git a/scene/property_utils.cpp b/scene/property_utils.cpp
index e2f1ac8224..2540a633a9 100644
--- a/scene/property_utils.cpp
+++ b/scene/property_utils.cpp
@@ -111,10 +111,37 @@ Variant PropertyUtils::get_property_default_value(const Object *p_object, const
}
// Fall back to the default from the native class
- if (r_is_class_default) {
- *r_is_class_default = true;
+ {
+ if (r_is_class_default) {
+ *r_is_class_default = true;
+ }
+ bool valid = false;
+ Variant value = ClassDB::class_get_default_property_value(p_object->get_class_name(), p_property, &valid);
+ if (valid) {
+ if (r_is_valid) {
+ *r_is_valid = true;
+ }
+ return value;
+ } else {
+ // Heuristically check if this is a synthetic property (whatever/0, whatever/1, etc.)
+ // because they are not in the class DB yet must have a default (null).
+ String prop_str = String(p_property);
+ int p = prop_str.rfind("/");
+ if (p != -1 && p < prop_str.length() - 1) {
+ bool all_digits = true;
+ for (int i = p + 1; i < prop_str.length(); i++) {
+ if (prop_str[i] < '0' || prop_str[i] > '9') {
+ all_digits = false;
+ break;
+ }
+ }
+ if (r_is_valid) {
+ *r_is_valid = all_digits;
+ }
+ }
+ return Variant();
+ }
}
- return ClassDB::class_get_default_property_value(p_object->get_class_name(), p_property, r_is_valid);
}
// Like SceneState::PackState, but using a raw pointer to avoid the cost of
diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp
index 1db9593473..a94f70e20f 100644
--- a/servers/rendering_server.cpp
+++ b/servers/rendering_server.cpp
@@ -2000,6 +2000,10 @@ void RenderingServer::_bind_methods() {
BIND_ENUM_CONSTANT(DECAL_FILTER_LINEAR_MIPMAPS);
BIND_ENUM_CONSTANT(DECAL_FILTER_LINEAR_MIPMAPS_ANISOTROPIC);
+ /* GI API (affects VoxelGI and SDFGI) */
+
+ ClassDB::bind_method(D_METHOD("gi_set_use_half_resolution", "half_resolution"), &RenderingServer::gi_set_use_half_resolution);
+
/* VOXEL GI API */
ClassDB::bind_method(D_METHOD("voxel_gi_create"), &RenderingServer::voxel_gi_create);
@@ -2325,6 +2329,7 @@ void RenderingServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("environment_glow_set_use_high_quality", "enable"), &RenderingServer::environment_glow_set_use_high_quality);
ClassDB::bind_method(D_METHOD("environment_set_ssr_roughness_quality", "quality"), &RenderingServer::environment_set_ssr_roughness_quality);
ClassDB::bind_method(D_METHOD("environment_set_ssao_quality", "quality", "half_size", "adaptive_target", "blur_passes", "fadeout_from", "fadeout_to"), &RenderingServer::environment_set_ssao_quality);
+ ClassDB::bind_method(D_METHOD("environment_set_ssil_quality", "quality", "half_size", "adaptive_target", "blur_passes", "fadeout_from", "fadeout_to"), &RenderingServer::environment_set_ssil_quality);
ClassDB::bind_method(D_METHOD("environment_set_sdfgi_ray_count", "ray_count"), &RenderingServer::environment_set_sdfgi_ray_count);
ClassDB::bind_method(D_METHOD("environment_set_sdfgi_frames_to_converge", "frames"), &RenderingServer::environment_set_sdfgi_frames_to_converge);
ClassDB::bind_method(D_METHOD("environment_set_sdfgi_frames_to_update_light", "frames"), &RenderingServer::environment_set_sdfgi_frames_to_update_light);
@@ -2376,6 +2381,12 @@ void RenderingServer::_bind_methods() {
BIND_ENUM_CONSTANT(ENV_SSAO_QUALITY_HIGH);
BIND_ENUM_CONSTANT(ENV_SSAO_QUALITY_ULTRA);
+ BIND_ENUM_CONSTANT(ENV_SSIL_QUALITY_VERY_LOW);
+ BIND_ENUM_CONSTANT(ENV_SSIL_QUALITY_LOW);
+ BIND_ENUM_CONSTANT(ENV_SSIL_QUALITY_MEDIUM);
+ BIND_ENUM_CONSTANT(ENV_SSIL_QUALITY_HIGH);
+ BIND_ENUM_CONSTANT(ENV_SSIL_QUALITY_ULTRA);
+
BIND_ENUM_CONSTANT(ENV_SDFGI_CASCADES_4);
BIND_ENUM_CONSTANT(ENV_SDFGI_CASCADES_6);
BIND_ENUM_CONSTANT(ENV_SDFGI_CASCADES_8);
diff --git a/servers/rendering_server.h b/servers/rendering_server.h
index d36784dbab..ada50292fc 100644
--- a/servers/rendering_server.h
+++ b/servers/rendering_server.h
@@ -1608,6 +1608,7 @@ VARIANT_ENUM_CAST(RenderingServer::EnvironmentGlowBlendMode);
VARIANT_ENUM_CAST(RenderingServer::EnvironmentToneMapper);
VARIANT_ENUM_CAST(RenderingServer::EnvironmentSSRRoughnessQuality);
VARIANT_ENUM_CAST(RenderingServer::EnvironmentSSAOQuality);
+VARIANT_ENUM_CAST(RenderingServer::EnvironmentSSILQuality);
VARIANT_ENUM_CAST(RenderingServer::EnvironmentSDFGICascades);
VARIANT_ENUM_CAST(RenderingServer::EnvironmentSDFGIFramesToConverge);
VARIANT_ENUM_CAST(RenderingServer::EnvironmentSDFGIRayCount);