diff options
| -rw-r--r-- | core/core_bind.cpp | 5 | ||||
| -rw-r--r-- | core/core_bind.h | 2 | ||||
| -rw-r--r-- | doc/classes/OS.xml | 6 | ||||
| -rw-r--r-- | doc/classes/ProjectSettings.xml | 2 | ||||
| -rw-r--r-- | drivers/gles3/rasterizer_canvas_gles3.cpp | 3 | ||||
| -rw-r--r-- | drivers/gles3/rasterizer_canvas_gles3.h | 6 | ||||
| -rw-r--r-- | drivers/gles3/rasterizer_gles3.cpp | 3 | ||||
| -rw-r--r-- | drivers/gles3/rasterizer_scene_gles3.h | 2 | ||||
| -rw-r--r-- | drivers/gles3/shader_gles3.cpp | 5 | ||||
| -rw-r--r-- | drivers/gles3/shader_gles3.h | 2 | ||||
| -rw-r--r-- | drivers/gles3/storage/config.cpp | 17 | ||||
| -rw-r--r-- | drivers/gles3/storage/config.h | 11 | ||||
| -rw-r--r-- | drivers/gles3/storage/material_storage.cpp | 9 | ||||
| -rw-r--r-- | drivers/gles3/storage/particles_storage.h | 3 | ||||
| -rw-r--r-- | drivers/gles3/storage/utilities.cpp | 5 | ||||
| -rw-r--r-- | editor/animation_track_editor.cpp | 121 | ||||
| -rw-r--r-- | editor/animation_track_editor.h | 1 | ||||
| -rw-r--r-- | editor/plugins/node_3d_editor_plugin.cpp | 6 | ||||
| -rw-r--r-- | modules/gdscript/gdscript.cpp | 12 | ||||
| -rw-r--r-- | scene/2d/parallax_layer.cpp | 4 | ||||
| -rw-r--r-- | servers/rendering_server.cpp | 2 |
21 files changed, 117 insertions, 110 deletions
diff --git a/core/core_bind.cpp b/core/core_bind.cpp index e8a6a5075b..d6719e715f 100644 --- a/core/core_bind.cpp +++ b/core/core_bind.cpp @@ -194,6 +194,10 @@ void ResourceSaver::_bind_methods() { ////// OS ////// +String OS::get_system_ca_certificates() { + return ::OS::get_singleton()->get_system_ca_certificates(); +} + PackedStringArray OS::get_connected_midi_inputs() { return ::OS::get_singleton()->get_connected_midi_inputs(); } @@ -573,6 +577,7 @@ String OS::get_unique_id() const { OS *OS::singleton = nullptr; void OS::_bind_methods() { + ClassDB::bind_method(D_METHOD("get_system_ca_certificates"), &OS::get_system_ca_certificates); ClassDB::bind_method(D_METHOD("get_connected_midi_inputs"), &OS::get_connected_midi_inputs); ClassDB::bind_method(D_METHOD("open_midi_inputs"), &OS::open_midi_inputs); ClassDB::bind_method(D_METHOD("close_midi_inputs"), &OS::close_midi_inputs); diff --git a/core/core_bind.h b/core/core_bind.h index febc33a9c1..1452368f60 100644 --- a/core/core_bind.h +++ b/core/core_bind.h @@ -134,6 +134,8 @@ public: RENDERING_DRIVER_D3D12, }; + String get_system_ca_certificates(); + virtual PackedStringArray get_connected_midi_inputs(); virtual void open_midi_inputs(); virtual void close_midi_inputs(); diff --git a/doc/classes/OS.xml b/doc/classes/OS.xml index 7c69bc6ed2..a3fd15a46d 100644 --- a/doc/classes/OS.xml +++ b/doc/classes/OS.xml @@ -455,6 +455,12 @@ Returns the amount of static memory being used by the program in bytes. Only works in debug builds. </description> </method> + <method name="get_system_ca_certificates"> + <return type="String" /> + <description> + Returns the list of certification authorities trusted by the operating system as a string of concatenated certificates in PEM format. + </description> + </method> <method name="get_system_dir" qualifiers="const"> <return type="String" /> <param index="0" name="dir" type="int" enum="OS.SystemDir" /> diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index c8a11427b9..84542b755c 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -2634,6 +2634,8 @@ [b]Note:[/b] This setting is only effective when using the Forward+ rendering method, not Mobile and Compatibility. </member> <member name="rendering/limits/global_shader_variables/buffer_size" type="int" setter="" getter="" default="65536"> + The maximum number of uniforms that can be used by the global shader uniform buffer. Each item takes up one slot. In other words, a single uniform float and a uniform vec4 will take the same amount of space in the buffer. + [b]Note:[/b] When using the Compatibility backend, most mobile devices (and all web exports) will be limited to a maximum size of 1024 due to hardware constraints. </member> <member name="rendering/limits/opengl/max_lights_per_object" type="int" setter="" getter="" default="8"> Max number of omnilights and spotlights renderable per object. At the default value of 8, this means that each surface can be affected by up to 8 omnilights and 8 spotlights. This is further limited by hardware support and [member rendering/limits/opengl/max_renderable_lights]. Setting this low will slightly reduce memory usage, may decrease shader compile times, and may result in faster rendering on low-end, mobile, or web devices. diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index 5fabeb94f5..941b1a1b28 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -2742,8 +2742,7 @@ RasterizerCanvasGLES3::RasterizerCanvasGLES3() { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } - int uniform_max_size = config->max_uniform_buffer_size; - if (uniform_max_size < 65536) { + if (config->max_uniform_buffer_size < 65536) { data.max_lights_per_render = 64; } else { data.max_lights_per_render = 256; diff --git a/drivers/gles3/rasterizer_canvas_gles3.h b/drivers/gles3/rasterizer_canvas_gles3.h index a3762e828e..7fc9992c3d 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.h +++ b/drivers/gles3/rasterizer_canvas_gles3.h @@ -157,6 +157,8 @@ class RasterizerCanvasGLES3 : public RendererCanvasRender { float atlas_rect[4]; }; + static_assert(sizeof(LightUniform) % 16 == 0, "2D light UBO size must be a multiple of 16 bytes"); + public: enum { BASE_UNIFORM_LOCATION = 0, @@ -186,6 +188,8 @@ public: uint32_t pad2; }; + static_assert(sizeof(StateBuffer) % 16 == 0, "2D state UBO size must be a multiple of 16 bytes"); + struct PolygonBuffers { GLuint vertex_buffer = 0; GLuint vertex_array = 0; @@ -230,6 +234,8 @@ public: uint32_t lights[4]; }; + static_assert(sizeof(InstanceData) == 128, "2D instance data struct size must be 128 bytes"); + struct Data { GLuint canvas_quad_vertices; GLuint canvas_quad_array; diff --git a/drivers/gles3/rasterizer_gles3.cpp b/drivers/gles3/rasterizer_gles3.cpp index 071765a03c..ae39c86d44 100644 --- a/drivers/gles3/rasterizer_gles3.cpp +++ b/drivers/gles3/rasterizer_gles3.cpp @@ -398,8 +398,7 @@ void RasterizerGLES3::_blit_render_target_to_screen(RID p_render_target, Display // Viewport doesn't cover entire window so clear window to black before blitting. // Querying the actual window size from the DisplayServer would deadlock in separate render thread mode, // so let's set the biggest viewport the implementation supports, to be sure the window is fully covered. - GLsizei max_vp[2] = {}; - glGetIntegerv(GL_MAX_VIEWPORT_DIMS, max_vp); + Size2i max_vp = GLES3::Utilities::get_singleton()->get_maximum_viewport_size(); glViewport(0, 0, max_vp[0], max_vp[1]); glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); diff --git a/drivers/gles3/rasterizer_scene_gles3.h b/drivers/gles3/rasterizer_scene_gles3.h index b6c7a0c5a5..4c70c43244 100644 --- a/drivers/gles3/rasterizer_scene_gles3.h +++ b/drivers/gles3/rasterizer_scene_gles3.h @@ -428,6 +428,7 @@ private: bool pancake_shadows; }; static_assert(sizeof(UBO) % 16 == 0, "Scene UBO size must be a multiple of 16 bytes"); + static_assert(sizeof(UBO) < 16384, "Scene UBO size must be 16384 bytes or smaller"); struct MultiviewUBO { float projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16]; @@ -435,6 +436,7 @@ private: float eye_offset[RendererSceneRender::MAX_RENDER_VIEWS][4]; }; static_assert(sizeof(MultiviewUBO) % 16 == 0, "Multiview UBO size must be a multiple of 16 bytes"); + static_assert(sizeof(MultiviewUBO) < 16384, "MultiviewUBO size must be 16384 bytes or smaller"); struct TonemapUBO { float exposure = 1.0; diff --git a/drivers/gles3/shader_gles3.cpp b/drivers/gles3/shader_gles3.cpp index 876309d22c..4a15ed827a 100644 --- a/drivers/gles3/shader_gles3.cpp +++ b/drivers/gles3/shader_gles3.cpp @@ -37,6 +37,7 @@ #include "core/io/file_access.h" #include "drivers/gles3/rasterizer_gles3.h" +#include "drivers/gles3/storage/config.h" static String _mkid(const String &p_id) { String id = "m_" + p_id.replace("__", "_dus_"); @@ -801,7 +802,9 @@ void ShaderGLES3::initialize(const String &p_general_defines, int p_base_texture print_verbose("Shader '" + name + "' SHA256: " + base_sha256); } - glGetInteger64v(GL_MAX_TEXTURE_IMAGE_UNITS, &max_image_units); + GLES3::Config *config = GLES3::Config::get_singleton(); + ERR_FAIL_NULL(config); + max_image_units = config->max_texture_image_units; } void ShaderGLES3::set_shader_cache_dir(const String &p_dir) { diff --git a/drivers/gles3/shader_gles3.h b/drivers/gles3/shader_gles3.h index 8968e76c12..9ee939e343 100644 --- a/drivers/gles3/shader_gles3.h +++ b/drivers/gles3/shader_gles3.h @@ -148,7 +148,7 @@ private: static bool shader_cache_save_debug; bool shader_cache_dir_valid = false; - int64_t max_image_units = 0; + GLint max_image_units = 0; enum StageType { STAGE_TYPE_VERTEX, diff --git a/drivers/gles3/storage/config.cpp b/drivers/gles3/storage/config.cpp index 07e6d04cb7..1a14902c7c 100644 --- a/drivers/gles3/storage/config.cpp +++ b/drivers/gles3/storage/config.cpp @@ -45,9 +45,9 @@ Config::Config() { singleton = this; { - int64_t max_extensions = 0; - glGetInteger64v(GL_NUM_EXTENSIONS, &max_extensions); - for (int64_t i = 0; i < max_extensions; i++) { + GLint max_extensions = 0; + glGetIntegerv(GL_NUM_EXTENSIONS, &max_extensions); + for (int i = 0; i < max_extensions; i++) { const GLubyte *s = glGetStringi(GL_EXTENSIONS, i); if (!s) { break; @@ -80,11 +80,14 @@ Config::Config() { rgtc_supported = extensions.has("GL_EXT_texture_compression_rgtc") || extensions.has("GL_ARB_texture_compression_rgtc") || extensions.has("EXT_texture_compression_rgtc"); } - glGetInteger64v(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &max_vertex_texture_image_units); - glGetInteger64v(GL_MAX_TEXTURE_IMAGE_UNITS, &max_texture_image_units); - glGetInteger64v(GL_MAX_TEXTURE_SIZE, &max_texture_size); + glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &max_vertex_texture_image_units); + glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &max_texture_image_units); + glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size); + glGetIntegerv(GL_MAX_VIEWPORT_DIMS, max_viewport_size); glGetInteger64v(GL_MAX_UNIFORM_BLOCK_SIZE, &max_uniform_buffer_size); - glGetInteger64v(GL_MAX_VIEWPORT_DIMS, max_viewport_size); + + // sanity clamp buffer size to 16K..1MB + max_uniform_buffer_size = CLAMP(max_uniform_buffer_size, 16384, 1048576); support_anisotropic_filter = extensions.has("GL_EXT_texture_filter_anisotropic"); if (support_anisotropic_filter) { diff --git a/drivers/gles3/storage/config.h b/drivers/gles3/storage/config.h index ee7b1b26ed..0c9f9bc275 100644 --- a/drivers/gles3/storage/config.h +++ b/drivers/gles3/storage/config.h @@ -57,11 +57,12 @@ public: bool use_nearest_mip_filter = false; bool use_depth_prepass = true; - int64_t max_vertex_texture_image_units = 0; - int64_t max_texture_image_units = 0; - int64_t max_texture_size = 0; - int64_t max_viewport_size[2] = { 0, 0 }; - int64_t max_uniform_buffer_size = 0; + GLint max_vertex_texture_image_units = 0; + GLint max_texture_image_units = 0; + GLint max_texture_size = 0; + GLint max_viewport_size[2] = { 0, 0 }; + GLint64 max_uniform_buffer_size = 0; + int64_t max_renderable_elements = 0; int64_t max_renderable_lights = 0; int64_t max_lights_per_object = 0; diff --git a/drivers/gles3/storage/material_storage.cpp b/drivers/gles3/storage/material_storage.cpp index 996c205042..bacf607c66 100644 --- a/drivers/gles3/storage/material_storage.cpp +++ b/drivers/gles3/storage/material_storage.cpp @@ -1055,6 +1055,7 @@ void MaterialData::update_parameters_internal(const HashMap<StringName, Variant> ubo_data.resize(p_ubo_size); if (ubo_data.size()) { + ERR_FAIL_COND(p_ubo_size > uint32_t(Config::get_singleton()->max_uniform_buffer_size)); memset(ubo_data.ptrw(), 0, ubo_data.size()); //clear } } @@ -1108,10 +1109,10 @@ MaterialStorage::MaterialStorage() { static_assert(sizeof(GlobalShaderUniforms::Value) == 16); - global_shader_uniforms.buffer_size = MAX(4096, (int)GLOBAL_GET("rendering/limits/global_shader_variables/buffer_size")); - if (global_shader_uniforms.buffer_size > uint32_t(Config::get_singleton()->max_uniform_buffer_size)) { - global_shader_uniforms.buffer_size = uint32_t(Config::get_singleton()->max_uniform_buffer_size); - WARN_PRINT("Project setting \"rendering/limits/global_shader_variables/buffer_size\" exceeds maximum uniform buffer size of: " + itos(Config::get_singleton()->max_uniform_buffer_size)); + global_shader_uniforms.buffer_size = MAX(16, (int)GLOBAL_GET("rendering/limits/global_shader_variables/buffer_size")); + if (global_shader_uniforms.buffer_size * sizeof(GlobalShaderUniforms::Value) > uint32_t(Config::get_singleton()->max_uniform_buffer_size)) { + global_shader_uniforms.buffer_size = uint32_t(Config::get_singleton()->max_uniform_buffer_size) / sizeof(GlobalShaderUniforms::Value); + WARN_PRINT("Project setting \"rendering/limits/global_shader_variables/buffer_size\" exceeds maximum uniform buffer size of: " + itos(Config::get_singleton()->max_uniform_buffer_size / sizeof(GlobalShaderUniforms::Value)) + ". Falling back on maximum buffer size."); } global_shader_uniforms.buffer_values = memnew_arr(GlobalShaderUniforms::Value, global_shader_uniforms.buffer_size); diff --git a/drivers/gles3/storage/particles_storage.h b/drivers/gles3/storage/particles_storage.h index ca347ed070..086f5f7936 100644 --- a/drivers/gles3/storage/particles_storage.h +++ b/drivers/gles3/storage/particles_storage.h @@ -145,6 +145,9 @@ private: Collider colliders[MAX_COLLIDERS]; }; + static_assert(sizeof(ParticlesFrameParams) % 16 == 0, "ParticlesFrameParams size must be a multiple of 16 bytes"); + static_assert(sizeof(ParticlesFrameParams) < 16384, "ParticlesFrameParams must be 16384 bytes or smaller"); + struct Particles { RS::ParticlesMode mode = RS::PARTICLES_MODE_3D; bool inactive = true; diff --git a/drivers/gles3/storage/utilities.cpp b/drivers/gles3/storage/utilities.cpp index 356dc06733..7f0be36466 100644 --- a/drivers/gles3/storage/utilities.cpp +++ b/drivers/gles3/storage/utilities.cpp @@ -463,10 +463,7 @@ String Utilities::get_video_adapter_api_version() const { Size2i Utilities::get_maximum_viewport_size() const { Config *config = Config::get_singleton(); - if (!config) { - return Size2i(); - } - + ERR_FAIL_NULL_V(config, Size2i()); return Size2i(config->max_viewport_size[0], config->max_viewport_size[1]); } diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index d45f1d7a78..7b4c85e0f5 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -4425,7 +4425,7 @@ AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertD } } - float time = timeline->get_play_position(); + float time = p_id.time == FLT_MAX ? timeline->get_play_position() : p_id.time; Variant value; switch (p_id.type) { @@ -4433,7 +4433,9 @@ AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertD case Animation::TYPE_ROTATION_3D: case Animation::TYPE_SCALE_3D: case Animation::TYPE_BLEND_SHAPE: - case Animation::TYPE_VALUE: { + case Animation::TYPE_VALUE: + case Animation::TYPE_AUDIO: + case Animation::TYPE_ANIMATION: { value = p_id.value; } break; @@ -4449,10 +4451,9 @@ AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertD bezier_edit_icon->set_disabled(false); } break; - case Animation::TYPE_ANIMATION: { - value = p_id.value; - } break; default: { + // Other track types shouldn't use this code path. + DEV_ASSERT(false); } } @@ -5185,87 +5186,68 @@ void AnimationTrackEditor::_insert_key_from_track(float p_ofs, int p_track) { p_ofs += SECOND_DECIMAL; } - EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); + Node *node = root->get_node_or_null(animation->track_get_path(p_track)); + if (!node) { + EditorNode::get_singleton()->show_warning(TTR("Track path is invalid, so can't add a key.")); + return; + } + + // Special handling for this one. + if (animation->track_get_type(p_track) == Animation::TYPE_METHOD) { + method_selector->select_method_from_instance(node); + + insert_key_from_track_call_ofs = p_ofs; + insert_key_from_track_call_track = p_track; + return; + } + + InsertData id; + id.path = animation->track_get_path(p_track); + id.advance = false; + id.track_idx = p_track; + id.type = animation->track_get_type(p_track); + // TRANSLATORS: This describes the target of new animation track, will be inserted into another string. + id.query = vformat(TTR("node '%s'"), node->get_name()); + id.time = p_ofs; + // id.value is filled in each case handled below. + switch (animation->track_get_type(p_track)) { case Animation::TYPE_POSITION_3D: { - if (!root->has_node(animation->track_get_path(p_track))) { - EditorNode::get_singleton()->show_warning(TTR("Track path is invalid, so can't add a key.")); - return; - } - Node3D *base = Object::cast_to<Node3D>(root->get_node(animation->track_get_path(p_track))); + Node3D *base = Object::cast_to<Node3D>(node); if (!base) { EditorNode::get_singleton()->show_warning(TTR("Track is not of type Node3D, can't insert key")); return; } - Vector3 pos = base->get_position(); - - undo_redo->create_action(TTR("Add Position Key")); - undo_redo->add_do_method(animation.ptr(), "position_track_insert_key", p_track, p_ofs, pos); - undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation); - undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", p_track, p_ofs); - undo_redo->commit_action(); - + id.value = base->get_position(); } break; case Animation::TYPE_ROTATION_3D: { - if (!root->has_node(animation->track_get_path(p_track))) { - EditorNode::get_singleton()->show_warning(TTR("Track path is invalid, so can't add a key.")); - return; - } - Node3D *base = Object::cast_to<Node3D>(root->get_node(animation->track_get_path(p_track))); + Node3D *base = Object::cast_to<Node3D>(node); if (!base) { EditorNode::get_singleton()->show_warning(TTR("Track is not of type Node3D, can't insert key")); return; } - Quaternion rot = base->get_transform().basis.operator Quaternion(); - - undo_redo->create_action(TTR("Add Rotation Key")); - undo_redo->add_do_method(animation.ptr(), "rotation_track_insert_key", p_track, p_ofs, rot); - undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation); - undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", p_track, p_ofs); - undo_redo->commit_action(); - + id.value = base->get_transform().basis.operator Quaternion(); } break; case Animation::TYPE_SCALE_3D: { - if (!root->has_node(animation->track_get_path(p_track))) { - EditorNode::get_singleton()->show_warning(TTR("Track path is invalid, so can't add a key.")); - return; - } - Node3D *base = Object::cast_to<Node3D>(root->get_node(animation->track_get_path(p_track))); + Node3D *base = Object::cast_to<Node3D>(node); if (!base) { EditorNode::get_singleton()->show_warning(TTR("Track is not of type Node3D, can't insert key")); return; } - undo_redo->create_action(TTR("Add Scale Key")); - undo_redo->add_do_method(animation.ptr(), "scale_track_insert_key", p_track, p_ofs, base->get_scale()); - undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation); - undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", p_track, p_ofs); - undo_redo->commit_action(); - + id.value = base->get_scale(); } break; case Animation::TYPE_BLEND_SHAPE: case Animation::TYPE_VALUE: { NodePath bp; - Variant value; - _find_hint_for_track(p_track, bp, &value); - - undo_redo->create_action(TTR("Add Track Key")); - undo_redo->add_do_method(animation.ptr(), "track_insert_key", p_track, p_ofs, value); - undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation); - undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", p_track, p_ofs); - undo_redo->commit_action(); - + _find_hint_for_track(p_track, bp, &id.value); } break; case Animation::TYPE_METHOD: { - if (!root->has_node(animation->track_get_path(p_track))) { - EditorNode::get_singleton()->show_warning(TTR("Track path is invalid, so can't add a method key.")); - return; - } Node *base = root->get_node_or_null(animation->track_get_path(p_track)); ERR_FAIL_NULL(base); @@ -5287,12 +5269,7 @@ void AnimationTrackEditor::_insert_key_from_track(float p_ofs, int p_track) { arr[3] = 0.25; arr[4] = 0; - undo_redo->create_action(TTR("Add Track Key")); - undo_redo->add_do_method(animation.ptr(), "track_insert_key", p_track, p_ofs, arr); - undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation); - undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", p_track, p_ofs); - undo_redo->commit_action(); - + id.value = arr; } break; case Animation::TYPE_AUDIO: { Dictionary ak; @@ -5300,22 +5277,18 @@ void AnimationTrackEditor::_insert_key_from_track(float p_ofs, int p_track) { ak["start_offset"] = 0; ak["end_offset"] = 0; - undo_redo->create_action(TTR("Add Track Key")); - undo_redo->add_do_method(animation.ptr(), "track_insert_key", p_track, p_ofs, ak); - undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation); - undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", p_track, p_ofs); - undo_redo->commit_action(); + id.value = ak; } break; case Animation::TYPE_ANIMATION: { - StringName anim = "[stop]"; - - undo_redo->create_action(TTR("Add Track Key")); - undo_redo->add_do_method(animation.ptr(), "track_insert_key", p_track, p_ofs, anim); - undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation); - undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", p_track, p_ofs); - undo_redo->commit_action(); + id.value = StringName("[stop]"); } break; + default: { + // All track types should be handled by now. + DEV_ASSERT(false); + } } + + _query_insert(id); } void AnimationTrackEditor::_add_method_key(const String &p_method) { diff --git a/editor/animation_track_editor.h b/editor/animation_track_editor.h index 1498a948f5..4c7c1a58f8 100644 --- a/editor/animation_track_editor.h +++ b/editor/animation_track_editor.h @@ -464,6 +464,7 @@ class AnimationTrackEditor : public VBoxContainer { Animation::TrackType type; NodePath path; int track_idx = 0; + float time = FLT_MAX; // Defaults to current timeline position. Variant value; String query; bool advance = false; diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index 05b7fa08ca..753b1971f4 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -1639,11 +1639,7 @@ void Node3DEditorViewport::input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseMotion> m = p_event; if (m.is_valid()) { - if (_edit.mode == TRANSFORM_ROTATE) { - _edit.mouse_pos = m->get_position(); // rotate should not wrap - } else { - _edit.mouse_pos += _get_warped_mouse_motion(p_event); - } + _edit.mouse_pos += _get_warped_mouse_motion(p_event); update_transform(_get_key_modifier(m) == Key::SHIFT); } } diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp index 0c58b41fcb..838ab42beb 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -771,8 +771,16 @@ Error GDScript::reload(bool p_keep_state) { if (GDScriptCache::has_parser(source_path)) { Error err = OK; Ref<GDScriptParserRef> parser_ref = GDScriptCache::get_parser(source_path, GDScriptParserRef::EMPTY, err); - if (parser_ref.is_valid() && parser_ref->get_source_hash() != source.hash()) { - GDScriptCache::remove_parser(source_path); + if (parser_ref.is_valid()) { + uint32_t source_hash; + if (!binary_tokens.is_empty()) { + source_hash = hash_djb2_buffer(binary_tokens.ptr(), binary_tokens.size()); + } else { + source_hash = source.hash(); + } + if (parser_ref->get_source_hash() != source_hash) { + GDScriptCache::remove_parser(source_path); + } } } } diff --git a/scene/2d/parallax_layer.cpp b/scene/2d/parallax_layer.cpp index e2a7e9e154..dfe321a435 100644 --- a/scene/2d/parallax_layer.cpp +++ b/scene/2d/parallax_layer.cpp @@ -71,8 +71,8 @@ void ParallaxLayer::_update_mirroring() { if (pb) { RID c = pb->get_canvas(); RID ci = get_canvas_item(); - Point2 mirrorScale = mirroring * get_scale(); - RenderingServer::get_singleton()->canvas_set_item_mirroring(c, ci, mirrorScale); + Point2 mirror_scale = mirroring * orig_scale; + RenderingServer::get_singleton()->canvas_set_item_mirroring(c, ci, mirror_scale); RenderingServer::get_singleton()->canvas_item_set_interpolated(ci, false); } } diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp index 7637d4e7da..dd3491f62c 100644 --- a/servers/rendering_server.cpp +++ b/servers/rendering_server.cpp @@ -3610,7 +3610,7 @@ void RenderingServer::init() { GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "rendering/environment/subsurface_scattering/subsurface_scattering_scale", PROPERTY_HINT_RANGE, "0.001,1,0.001"), 0.05); GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "rendering/environment/subsurface_scattering/subsurface_scattering_depth_scale", PROPERTY_HINT_RANGE, "0.001,1,0.001"), 0.01); - GLOBAL_DEF(PropertyInfo(Variant::INT, "rendering/limits/global_shader_variables/buffer_size", PROPERTY_HINT_RANGE, "1,1048576,1"), 65536); + GLOBAL_DEF(PropertyInfo(Variant::INT, "rendering/limits/global_shader_variables/buffer_size", PROPERTY_HINT_RANGE, "16,1048576,1"), 65536); GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "rendering/lightmapping/probe_capture/update_speed", PROPERTY_HINT_RANGE, "0.001,256,0.001"), 15); GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "rendering/lightmapping/primitive_meshes/texel_size", PROPERTY_HINT_RANGE, "0.001,100,0.001"), 0.2); |
