summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/core_bind.cpp5
-rw-r--r--core/core_bind.h2
-rw-r--r--doc/classes/OS.xml6
-rw-r--r--doc/classes/ProjectSettings.xml2
-rw-r--r--drivers/gles3/rasterizer_canvas_gles3.cpp3
-rw-r--r--drivers/gles3/rasterizer_canvas_gles3.h6
-rw-r--r--drivers/gles3/rasterizer_gles3.cpp3
-rw-r--r--drivers/gles3/rasterizer_scene_gles3.h2
-rw-r--r--drivers/gles3/shader_gles3.cpp5
-rw-r--r--drivers/gles3/shader_gles3.h2
-rw-r--r--drivers/gles3/storage/config.cpp17
-rw-r--r--drivers/gles3/storage/config.h11
-rw-r--r--drivers/gles3/storage/material_storage.cpp9
-rw-r--r--drivers/gles3/storage/particles_storage.h3
-rw-r--r--drivers/gles3/storage/utilities.cpp5
-rw-r--r--editor/animation_track_editor.cpp121
-rw-r--r--editor/animation_track_editor.h1
-rw-r--r--editor/plugins/node_3d_editor_plugin.cpp6
-rw-r--r--modules/gdscript/gdscript.cpp12
-rw-r--r--scene/2d/parallax_layer.cpp4
-rw-r--r--servers/rendering_server.cpp2
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);