summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/core_bind.cpp9
-rw-r--r--core/core_bind.h1
-rw-r--r--core/register_core_types.cpp2
-rw-r--r--doc/classes/OS.xml8
-rw-r--r--editor/animation_track_editor.cpp16
-rw-r--r--editor/editor_node.cpp17
-rw-r--r--editor/editor_node.h23
-rw-r--r--editor/plugins/editor_preview_plugins.cpp4
-rw-r--r--editor/plugins/node_3d_editor_plugin.cpp2
-rw-r--r--editor/plugins/tiles/tile_atlas_view.cpp1
-rw-r--r--editor/plugins/visual_shader_editor_plugin.cpp9
-rw-r--r--modules/navigation/nav_map.cpp30
-rw-r--r--platform/linuxbsd/x11/gl_manager_x11.cpp2
-rw-r--r--platform/windows/gl_manager_windows_native.cpp4
-rw-r--r--scene/3d/physical_bone_simulator_3d.cpp18
-rw-r--r--scene/animation/animation_blend_space_1d.cpp2
-rw-r--r--scene/animation/animation_blend_space_2d.cpp6
-rw-r--r--scene/main/node.cpp8
-rw-r--r--scene/resources/visual_shader.cpp53
-rw-r--r--scene/resources/visual_shader.h9
-rw-r--r--servers/physics_2d/godot_body_2d.cpp4
-rw-r--r--servers/physics_3d/godot_body_3d.cpp4
-rw-r--r--servers/rendering/renderer_canvas_render.h9
-rw-r--r--servers/rendering/renderer_compositor.cpp5
-rw-r--r--servers/rendering/renderer_compositor.h2
-rw-r--r--servers/rendering/renderer_rd/renderer_compositor_rd.cpp2
-rw-r--r--servers/rendering/shader_types.cpp32
27 files changed, 195 insertions, 87 deletions
diff --git a/core/core_bind.cpp b/core/core_bind.cpp
index d6719e715f..a1b7b81111 100644
--- a/core/core_bind.cpp
+++ b/core/core_bind.cpp
@@ -194,6 +194,14 @@ void ResourceSaver::_bind_methods() {
////// OS //////
+PackedByteArray OS::get_entropy(int p_bytes) {
+ PackedByteArray pba;
+ pba.resize(p_bytes);
+ Error err = ::OS::get_singleton()->get_entropy(pba.ptrw(), p_bytes);
+ ERR_FAIL_COND_V(err != OK, PackedByteArray());
+ return pba;
+}
+
String OS::get_system_ca_certificates() {
return ::OS::get_singleton()->get_system_ca_certificates();
}
@@ -577,6 +585,7 @@ String OS::get_unique_id() const {
OS *OS::singleton = nullptr;
void OS::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("get_entropy", "size"), &OS::get_entropy);
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);
diff --git a/core/core_bind.h b/core/core_bind.h
index 1452368f60..b142a2fbbd 100644
--- a/core/core_bind.h
+++ b/core/core_bind.h
@@ -134,6 +134,7 @@ public:
RENDERING_DRIVER_D3D12,
};
+ PackedByteArray get_entropy(int p_bytes);
String get_system_ca_certificates();
virtual PackedStringArray get_connected_midi_inputs();
diff --git a/core/register_core_types.cpp b/core/register_core_types.cpp
index 8a55e4de8f..c0a86e9fb7 100644
--- a/core/register_core_types.cpp
+++ b/core/register_core_types.cpp
@@ -444,8 +444,8 @@ void unregister_core_types() {
unregister_global_constants();
- ClassDB::cleanup();
ResourceCache::clear();
+ ClassDB::cleanup();
CoreStringNames::free();
StringName::cleanup();
diff --git a/doc/classes/OS.xml b/doc/classes/OS.xml
index a3fd15a46d..3d048e2f63 100644
--- a/doc/classes/OS.xml
+++ b/doc/classes/OS.xml
@@ -262,6 +262,14 @@
[b]Note:[/b] This method is not supported on the Web platform. It returns an empty string.
</description>
</method>
+ <method name="get_entropy">
+ <return type="PackedByteArray" />
+ <param index="0" name="size" type="int" />
+ <description>
+ Generates a [PackedByteArray] of cryptographically secure random bytes with given [param size].
+ [b]Note:[/b] Generating large quantities of bytes using this method can result in locking and entropy of lower quality on most platforms. Using [method Crypto.generate_random_bytes] is preferred in most cases.
+ </description>
+ </method>
<method name="get_environment" qualifiers="const">
<return type="String" />
<param index="0" name="variable" type="String" />
diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp
index 7b4c85e0f5..af4853673b 100644
--- a/editor/animation_track_editor.cpp
+++ b/editor/animation_track_editor.cpp
@@ -2826,6 +2826,9 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
}
menu->reset_size();
+ moving_selection_attempt = false;
+ moving_selection = false;
+
Vector2 popup_pos = get_screen_position() + update_mode_rect.position + Vector2(0, update_mode_rect.size.height);
menu->set_position(popup_pos);
menu->popup();
@@ -2872,6 +2875,9 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
}
menu->reset_size();
+ moving_selection_attempt = false;
+ moving_selection = false;
+
Vector2 popup_pos = get_screen_position() + interp_mode_rect.position + Vector2(0, interp_mode_rect.size.height);
menu->set_position(popup_pos);
menu->popup();
@@ -2889,6 +2895,9 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
menu->add_icon_item(get_editor_theme_icon(SNAME("InterpWrapLoop")), TTR("Wrap Loop Interp"), MENU_LOOP_WRAP);
menu->reset_size();
+ moving_selection_attempt = false;
+ moving_selection = false;
+
Vector2 popup_pos = get_screen_position() + loop_wrap_rect.position + Vector2(0, loop_wrap_rect.size.height);
menu->set_position(popup_pos);
menu->popup();
@@ -2943,6 +2952,9 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
}
menu->reset_size();
+ moving_selection_attempt = false;
+ moving_selection = false;
+
menu->set_position(get_screen_position() + get_local_mouse_position());
menu->popup();
@@ -2965,6 +2977,10 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
path->set_text(animation->track_get_path(track));
Vector2 theme_ofs = path->get_theme_stylebox(CoreStringName(normal), SNAME("LineEdit"))->get_offset();
+
+ moving_selection_attempt = false;
+ moving_selection = false;
+
path_popup->set_position(get_screen_position() + path_rect.position - theme_ofs);
path_popup->set_size(path_rect.size);
path_popup->popup();
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
index d5e1242406..238c22693e 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -543,6 +543,8 @@ void EditorNode::_update_theme(bool p_skip_creation) {
tb->set_icon(theme->get_icon(p_editor->get_name(), EditorStringName(EditorIcons)));
}
}
+
+ _update_renderer_color();
}
editor_dock_manager->update_tab_styles();
@@ -3537,7 +3539,7 @@ void EditorNode::add_extension_editor_plugin(const StringName &p_class_name) {
void EditorNode::remove_extension_editor_plugin(const StringName &p_class_name) {
// If we're exiting, the editor plugins will get cleaned up anyway, so don't do anything.
- if (singleton->exiting) {
+ if (!singleton || singleton->exiting) {
return;
}
@@ -6177,15 +6179,12 @@ Vector<Ref<EditorResourceConversionPlugin>> EditorNode::find_resource_conversion
void EditorNode::_update_renderer_color() {
String rendering_method = renderer->get_selected_metadata();
- // TODO: Use theme colors instead of hardcoded values.
if (rendering_method == "forward_plus") {
- renderer->add_theme_color_override("font_color", Color::hex(0x5d8c3fff));
- }
- if (rendering_method == "mobile") {
- renderer->add_theme_color_override("font_color", Color::hex(0xa5557dff));
- }
- if (rendering_method == "gl_compatibility") {
- renderer->add_theme_color_override("font_color", Color::hex(0x5586a4ff));
+ renderer->add_theme_color_override("font_color", theme->get_color(SNAME("forward_plus_color"), EditorStringName(Editor)));
+ } else if (rendering_method == "mobile") {
+ renderer->add_theme_color_override("font_color", theme->get_color(SNAME("mobile_color"), EditorStringName(Editor)));
+ } else if (rendering_method == "gl_compatibility") {
+ renderer->add_theme_color_override("font_color", theme->get_color(SNAME("gl_compatibility_color"), EditorStringName(Editor)));
}
}
diff --git a/editor/editor_node.h b/editor/editor_node.h
index 899da99450..2127d30765 100644
--- a/editor/editor_node.h
+++ b/editor/editor_node.h
@@ -928,12 +928,29 @@ public:
struct EditorProgress {
String task;
- bool step(const String &p_state, int p_step = -1, bool p_force_refresh = true) { return EditorNode::progress_task_step(task, p_state, p_step, p_force_refresh); }
+ bool step(const String &p_state, int p_step = -1, bool p_force_refresh = true) {
+ if (Thread::is_main_thread()) {
+ return EditorNode::progress_task_step(task, p_state, p_step, p_force_refresh);
+ } else {
+ EditorNode::progress_task_step_bg(task, p_step);
+ return false;
+ }
+ }
EditorProgress(const String &p_task, const String &p_label, int p_amount, bool p_can_cancel = false) {
- EditorNode::progress_add_task(p_task, p_label, p_amount, p_can_cancel);
+ if (Thread::is_main_thread()) {
+ EditorNode::progress_add_task(p_task, p_label, p_amount, p_can_cancel);
+ } else {
+ EditorNode::progress_add_task_bg(p_task, p_label, p_amount);
+ }
task = p_task;
}
- ~EditorProgress() { EditorNode::progress_end_task(task); }
+ ~EditorProgress() {
+ if (Thread::is_main_thread()) {
+ EditorNode::progress_end_task(task);
+ } else {
+ EditorNode::progress_end_task_bg(task);
+ }
+ }
};
class EditorPluginList : public Object {
diff --git a/editor/plugins/editor_preview_plugins.cpp b/editor/plugins/editor_preview_plugins.cpp
index f2b38536b5..7ac924571d 100644
--- a/editor/plugins/editor_preview_plugins.cpp
+++ b/editor/plugins/editor_preview_plugins.cpp
@@ -97,6 +97,10 @@ Ref<Texture2D> EditorTexturePreviewPlugin::generate(const Ref<Resource> &p_from,
return Ref<Texture2D>();
}
+ if (!atex->get_region().has_area()) {
+ return Ref<Texture2D>();
+ }
+
img = atlas->get_region(atex->get_region());
} else {
Ref<Texture2D> tex = p_from;
diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp
index 753b1971f4..4c8202916b 100644
--- a/editor/plugins/node_3d_editor_plugin.cpp
+++ b/editor/plugins/node_3d_editor_plugin.cpp
@@ -8431,6 +8431,7 @@ Node3DEditor::Node3DEditor() {
VBoxContainer *vbc = this;
custom_camera = nullptr;
+ ERR_FAIL_COND_MSG(singleton != nullptr, "A Node3DEditor singleton already exists.");
singleton = this;
editor_selection = EditorNode::get_singleton()->get_editor_selection();
editor_selection->add_editor_plugin(this);
@@ -9060,6 +9061,7 @@ void fragment() {
clear(); // Make sure values are initialized. Will call _snap_update() for us.
}
Node3DEditor::~Node3DEditor() {
+ singleton = nullptr;
memdelete(preview_node);
if (preview_sun_dangling && preview_sun) {
memdelete(preview_sun);
diff --git a/editor/plugins/tiles/tile_atlas_view.cpp b/editor/plugins/tiles/tile_atlas_view.cpp
index 52b58b74a3..3942baed8a 100644
--- a/editor/plugins/tiles/tile_atlas_view.cpp
+++ b/editor/plugins/tiles/tile_atlas_view.cpp
@@ -311,6 +311,7 @@ RID TileAtlasView::_get_canvas_item_to_draw(const TileData *p_for_data, const Ca
RID ci_rid = RS::get_singleton()->canvas_item_create();
RS::get_singleton()->canvas_item_set_parent(ci_rid, p_base_item->get_canvas_item());
RS::get_singleton()->canvas_item_set_material(ci_rid, mat->get_rid());
+ RS::get_singleton()->canvas_item_set_default_texture_filter(ci_rid, RS::CanvasItemTextureFilter(p_base_item->get_texture_filter_in_tree()));
p_material_map[mat] = ci_rid;
return ci_rid;
}
diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp
index 290e0a3239..8d027bccef 100644
--- a/editor/plugins/visual_shader_editor_plugin.cpp
+++ b/editor/plugins/visual_shader_editor_plugin.cpp
@@ -806,6 +806,11 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id, bool
parameter_ref->update_parameter_type();
}
+ Ref<VisualShaderNodeVarying> varying = vsnode;
+ if (varying.is_valid()) {
+ varying->set_shader_rid(visual_shader->get_rid());
+ }
+
Ref<VisualShaderNodeParameter> parameter = vsnode;
HBoxContainer *hb = nullptr;
@@ -3859,13 +3864,13 @@ void VisualShaderEditor::_remove_varying(const String &p_name) {
}
void VisualShaderEditor::_update_varyings() {
- VisualShaderNodeVarying::clear_varyings();
+ VisualShaderNodeVarying::clear_varyings(visual_shader->get_rid());
for (int i = 0; i < visual_shader->get_varyings_count(); i++) {
const VisualShader::Varying *var = visual_shader->get_varying_by_index(i);
if (var != nullptr) {
- VisualShaderNodeVarying::add_varying(var->name, var->mode, var->type);
+ VisualShaderNodeVarying::add_varying(visual_shader->get_rid(), var->name, var->mode, var->type);
}
}
}
diff --git a/modules/navigation/nav_map.cpp b/modules/navigation/nav_map.cpp
index 1779be2cc2..f0184a155b 100644
--- a/modules/navigation/nav_map.cpp
+++ b/modules/navigation/nav_map.cpp
@@ -627,24 +627,20 @@ Vector3 NavMap::get_closest_point_to_segment(const Vector3 &p_from, const Vector
closest_point_d = d;
}
}
- }
-
- if (use_collision == false) {
- for (size_t point_id = 0; point_id < p.points.size(); point_id += 1) {
- Vector3 a, b;
-
- Geometry3D::get_closest_points_between_segments(
- p_from,
- p_to,
- p.points[point_id].pos,
- p.points[(point_id + 1) % p.points.size()].pos,
- a,
- b);
+ // If segment does not itersect face, check the distance from segment's endpoints.
+ else if (!use_collision) {
+ const Vector3 p_from_closest = f.get_closest_point_to(p_from);
+ const real_t d_p_from = p_from.distance_to(p_from_closest);
+ if (closest_point_d > d_p_from) {
+ closest_point = p_from_closest;
+ closest_point_d = d_p_from;
+ }
- const real_t d = a.distance_to(b);
- if (d < closest_point_d) {
- closest_point_d = d;
- closest_point = b;
+ const Vector3 p_to_closest = f.get_closest_point_to(p_to);
+ const real_t d_p_to = p_to.distance_to(p_to_closest);
+ if (closest_point_d > d_p_to) {
+ closest_point = p_to_closest;
+ closest_point_d = d_p_to;
}
}
}
diff --git a/platform/linuxbsd/x11/gl_manager_x11.cpp b/platform/linuxbsd/x11/gl_manager_x11.cpp
index febb7ae584..738ebffa02 100644
--- a/platform/linuxbsd/x11/gl_manager_x11.cpp
+++ b/platform/linuxbsd/x11/gl_manager_x11.cpp
@@ -357,7 +357,7 @@ void GLManager_X11::set_use_vsync(bool p_use) {
GLXDrawable drawable = glXGetCurrentDrawable();
glXSwapIntervalEXT(disp.x11_display, drawable, val);
} else {
- WARN_PRINT("Could not set V-Sync mode. V-Sync is not supported.");
+ WARN_PRINT_ONCE("Could not set V-Sync mode, as changing V-Sync mode is not supported by the graphics driver.");
return;
}
use_vsync = p_use;
diff --git a/platform/windows/gl_manager_windows_native.cpp b/platform/windows/gl_manager_windows_native.cpp
index b45d254fc6..c8d7534e26 100644
--- a/platform/windows/gl_manager_windows_native.cpp
+++ b/platform/windows/gl_manager_windows_native.cpp
@@ -510,10 +510,10 @@ void GLManagerNative_Windows::set_use_vsync(DisplayServer::WindowID p_window_id,
win.use_vsync = p_use;
if (!wglSwapIntervalEXT(p_use ? 1 : 0)) {
- WARN_PRINT("Could not set V-Sync mode.");
+ WARN_PRINT_ONCE("Could not set V-Sync mode, as changing V-Sync mode is not supported by the graphics driver.");
}
} else {
- WARN_PRINT("Could not set V-Sync mode. V-Sync is not supported.");
+ WARN_PRINT_ONCE("Could not set V-Sync mode, as changing V-Sync mode is not supported by the graphics driver.");
}
}
diff --git a/scene/3d/physical_bone_simulator_3d.cpp b/scene/3d/physical_bone_simulator_3d.cpp
index ef3c51b032..ffe79e0892 100644
--- a/scene/3d/physical_bone_simulator_3d.cpp
+++ b/scene/3d/physical_bone_simulator_3d.cpp
@@ -367,6 +367,20 @@ void PhysicalBoneSimulator3D::_process_modification() {
}
} else {
ERR_FAIL_COND(skeleton->get_bone_count() != bones.size());
+ for (int i = 0; i < skeleton->get_bone_count(); i++) {
+ if (!bones[i].physical_bone) {
+ continue;
+ }
+ skeleton->set_bone_global_pose(i, bones[i].global_pose);
+ }
+
+ // TODO:
+ // The above method is performance heavy and needs to be improved.
+ // Ideally, the processing of set_bone_global_pose within Skeleton3D should be improved,
+ // but the workaround available now is to convert the global pose to a local pose on the SkeletonModifier side.
+ // However, the follow method needs recursive processing for deformations within PhysicalBoneSimulator3D to account for update order.
+ /*
+ ERR_FAIL_COND(skeleton->get_bone_count() != bones.size());
LocalVector<Transform3D> local_poses;
for (int i = 0; i < skeleton->get_bone_count(); i++) {
Transform3D pt;
@@ -376,10 +390,14 @@ void PhysicalBoneSimulator3D::_process_modification() {
local_poses.push_back(pt.affine_inverse() * bones[i].global_pose);
}
for (int i = 0; i < skeleton->get_bone_count(); i++) {
+ if (!bones[i].physical_bone) {
+ continue;
+ }
skeleton->set_bone_pose_position(i, local_poses[i].origin);
skeleton->set_bone_pose_rotation(i, local_poses[i].basis.get_rotation_quaternion());
skeleton->set_bone_pose_scale(i, local_poses[i].basis.get_scale());
}
+ */
}
}
diff --git a/scene/animation/animation_blend_space_1d.cpp b/scene/animation/animation_blend_space_1d.cpp
index 36343edd11..ff19eb8c12 100644
--- a/scene/animation/animation_blend_space_1d.cpp
+++ b/scene/animation/animation_blend_space_1d.cpp
@@ -278,7 +278,7 @@ void AnimationNodeBlendSpace1D::_add_blend_point(int p_index, const Ref<Animatio
}
AnimationNode::NodeTimeInfo AnimationNodeBlendSpace1D::_process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only) {
- if (blend_points_used == 0) {
+ if (!blend_points_used) {
return NodeTimeInfo();
}
diff --git a/scene/animation/animation_blend_space_2d.cpp b/scene/animation/animation_blend_space_2d.cpp
index 9c5787b97c..0a6546f7da 100644
--- a/scene/animation/animation_blend_space_2d.cpp
+++ b/scene/animation/animation_blend_space_2d.cpp
@@ -448,6 +448,10 @@ void AnimationNodeBlendSpace2D::_blend_triangle(const Vector2 &p_pos, const Vect
AnimationNode::NodeTimeInfo AnimationNodeBlendSpace2D::_process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only) {
_update_triangles();
+ if (!blend_points_used) {
+ return NodeTimeInfo();
+ }
+
Vector2 blend_pos = get_parameter(blend_position);
int cur_closest = get_parameter(closest);
NodeTimeInfo mind; //time of min distance point
@@ -455,7 +459,7 @@ AnimationNode::NodeTimeInfo AnimationNodeBlendSpace2D::_process(const AnimationM
AnimationMixer::PlaybackInfo pi = p_playback_info;
if (blend_mode == BLEND_MODE_INTERPOLATED) {
- if (triangles.size() == 0) {
+ if (triangles.is_empty()) {
return NodeTimeInfo();
}
diff --git a/scene/main/node.cpp b/scene/main/node.cpp
index c6e5a4603e..ae8e2a493d 100644
--- a/scene/main/node.cpp
+++ b/scene/main/node.cpp
@@ -2777,12 +2777,12 @@ Node *Node::duplicate(int p_flags) const {
ERR_THREAD_GUARD_V(nullptr);
Node *dupe = _duplicate(p_flags);
+ _duplicate_properties(this, this, dupe, p_flags);
+
if (dupe && (p_flags & DUPLICATE_SIGNALS)) {
_duplicate_signals(this, dupe);
}
- _duplicate_properties(this, this, dupe, p_flags);
-
return dupe;
}
@@ -2795,6 +2795,8 @@ Node *Node::duplicate_from_editor(HashMap<const Node *, Node *> &r_duplimap, con
int flags = DUPLICATE_SIGNALS | DUPLICATE_GROUPS | DUPLICATE_SCRIPTS | DUPLICATE_USE_INSTANTIATION | DUPLICATE_FROM_EDITOR;
Node *dupe = _duplicate(flags, &r_duplimap);
+ _duplicate_properties(this, this, dupe, flags);
+
// This is used by SceneTreeDock's paste functionality. When pasting to foreign scene, resources are duplicated.
if (!p_resource_remap.is_empty()) {
remap_node_resources(dupe, p_resource_remap);
@@ -2805,8 +2807,6 @@ Node *Node::duplicate_from_editor(HashMap<const Node *, Node *> &r_duplimap, con
// if the emitter node comes later in tree order than the receiver
_duplicate_signals(this, dupe);
- _duplicate_properties(this, this, dupe, flags);
-
return dupe;
}
diff --git a/scene/resources/visual_shader.cpp b/scene/resources/visual_shader.cpp
index a54f1d376c..bedac4e933 100644
--- a/scene/resources/visual_shader.cpp
+++ b/scene/resources/visual_shader.cpp
@@ -1861,7 +1861,7 @@ void VisualShader::_get_property_list(List<PropertyInfo> *p_list) const {
}
for (const KeyValue<String, Varying> &E : varyings) {
- p_list->push_back(PropertyInfo(Variant::STRING, vformat("%s/%s", PNAME("varyings"), E.key)));
+ p_list->push_back(PropertyInfo(Variant::STRING, vformat("%s/%s", PNAME("varyings"), E.key), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR));
}
for (int i = 0; i < TYPE_MAX; i++) {
@@ -2620,7 +2620,7 @@ void VisualShader::_update_shader() const {
default:
break;
}
- global_code += E.key + ";\n";
+ global_code += vformat("var_%s;\n", E.key);
}
global_code += "\n";
@@ -2689,7 +2689,7 @@ void VisualShader::_update_shader() const {
default:
break;
}
- varying_code += vformat(" %s = %s;\n", E.key, code2);
+ varying_code += vformat(" var_%s = %s;\n", E.key, code2);
}
is_empty_func = false;
}
@@ -5048,18 +5048,18 @@ VisualShaderNodeGlobalExpression::VisualShaderNodeGlobalExpression() {
////////////// Varying
-List<VisualShaderNodeVarying::Varying> varyings;
+RBMap<RID, List<VisualShaderNodeVarying::Varying>> varyings;
-void VisualShaderNodeVarying::add_varying(const String &p_name, VisualShader::VaryingMode p_mode, VisualShader::VaryingType p_type) { // static
- varyings.push_back({ p_name, p_mode, p_type });
+void VisualShaderNodeVarying::add_varying(RID p_shader_rid, const String &p_name, VisualShader::VaryingMode p_mode, VisualShader::VaryingType p_type) { // static
+ varyings[p_shader_rid].push_back({ p_name, p_mode, p_type });
}
-void VisualShaderNodeVarying::clear_varyings() { // static
- varyings.clear();
+void VisualShaderNodeVarying::clear_varyings(RID p_shader_rid) { // static
+ varyings[p_shader_rid].clear();
}
-bool VisualShaderNodeVarying::has_varying(const String &p_name) { // static
- for (const VisualShaderNodeVarying::Varying &E : varyings) {
+bool VisualShaderNodeVarying::has_varying(RID p_shader_rid, const String &p_name) { // static
+ for (const VisualShaderNodeVarying::Varying &E : varyings[p_shader_rid]) {
if (E.name == p_name) {
return true;
}
@@ -5067,19 +5067,23 @@ bool VisualShaderNodeVarying::has_varying(const String &p_name) { // static
return false;
}
+void VisualShaderNodeVarying::set_shader_rid(const RID &p_shader_rid) {
+ shader_rid = p_shader_rid;
+}
+
int VisualShaderNodeVarying::get_varyings_count() const {
- return varyings.size();
+ return varyings[shader_rid].size();
}
String VisualShaderNodeVarying::get_varying_name_by_index(int p_idx) const {
- if (p_idx >= 0 && p_idx < varyings.size()) {
- return varyings.get(p_idx).name;
+ if (p_idx >= 0 && p_idx < varyings[shader_rid].size()) {
+ return varyings[shader_rid].get(p_idx).name;
}
return "";
}
VisualShader::VaryingType VisualShaderNodeVarying::get_varying_type_by_name(const String &p_name) const {
- for (const VisualShaderNodeVarying::Varying &varying : varyings) {
+ for (const VisualShaderNodeVarying::Varying &varying : varyings[shader_rid]) {
if (varying.name == p_name) {
return varying.type;
}
@@ -5088,14 +5092,14 @@ VisualShader::VaryingType VisualShaderNodeVarying::get_varying_type_by_name(cons
}
VisualShader::VaryingType VisualShaderNodeVarying::get_varying_type_by_index(int p_idx) const {
- if (p_idx >= 0 && p_idx < varyings.size()) {
- return varyings.get(p_idx).type;
+ if (p_idx >= 0 && p_idx < varyings[shader_rid].size()) {
+ return varyings[shader_rid].get(p_idx).type;
}
return VisualShader::VARYING_TYPE_FLOAT;
}
VisualShader::VaryingMode VisualShaderNodeVarying::get_varying_mode_by_name(const String &p_name) const {
- for (const VisualShaderNodeVarying::Varying &varying : varyings) {
+ for (const VisualShaderNodeVarying::Varying &varying : varyings[shader_rid]) {
if (varying.name == p_name) {
return varying.mode;
}
@@ -5104,15 +5108,15 @@ VisualShader::VaryingMode VisualShaderNodeVarying::get_varying_mode_by_name(cons
}
VisualShader::VaryingMode VisualShaderNodeVarying::get_varying_mode_by_index(int p_idx) const {
- if (p_idx >= 0 && p_idx < varyings.size()) {
- return varyings.get(p_idx).mode;
+ if (p_idx >= 0 && p_idx < varyings[shader_rid].size()) {
+ return varyings[shader_rid].get(p_idx).mode;
}
return VisualShader::VARYING_MODE_VERTEX_TO_FRAG_LIGHT;
}
VisualShaderNodeVarying::PortType VisualShaderNodeVarying::get_port_type_by_index(int p_idx) const {
- if (p_idx >= 0 && p_idx < varyings.size()) {
- return get_port_type(varyings.get(p_idx).type, 0);
+ if (p_idx >= 0 && p_idx < varyings[shader_rid].size()) {
+ return get_port_type(varyings[shader_rid].get(p_idx).type, 0);
}
return PORT_TYPE_SCALAR;
}
@@ -5239,7 +5243,7 @@ String VisualShaderNodeVaryingSetter::generate_code(Shader::Mode p_mode, VisualS
if (varying_name == "[None]") {
return code;
}
- code += vformat(" %s = %s;\n", varying_name, p_input_vars[0]);
+ code += vformat(" var_%s = %s;\n", varying_name, p_input_vars[0]);
return code;
}
@@ -5284,7 +5288,7 @@ String VisualShaderNodeVaryingGetter::generate_code(Shader::Mode p_mode, VisualS
String from = varying_name;
String from2;
- if (varying_name == "[None]") {
+ if (varying_name == "[None]" || p_for_preview) {
switch (varying_type) {
case VisualShader::VARYING_TYPE_FLOAT:
from = "0.0";
@@ -5313,8 +5317,9 @@ String VisualShaderNodeVaryingGetter::generate_code(Shader::Mode p_mode, VisualS
default:
break;
}
+ return vformat(" %s = %s;\n", p_output_vars[0], from);
}
- return vformat(" %s = %s;\n", p_output_vars[0], from);
+ return vformat(" %s = var_%s;\n", p_output_vars[0], from);
}
VisualShaderNodeVaryingGetter::VisualShaderNodeVaryingGetter() {
diff --git a/scene/resources/visual_shader.h b/scene/resources/visual_shader.h
index 18cdc8342b..9cd8f86d0f 100644
--- a/scene/resources/visual_shader.h
+++ b/scene/resources/visual_shader.h
@@ -910,13 +910,16 @@ public:
};
protected:
+ RID shader_rid;
VisualShader::VaryingType varying_type = VisualShader::VARYING_TYPE_FLOAT;
String varying_name = "[None]";
public: // internal
- static void add_varying(const String &p_name, VisualShader::VaryingMode p_mode, VisualShader::VaryingType p_type);
- static void clear_varyings();
- static bool has_varying(const String &p_name);
+ static void add_varying(RID p_shader_rid, const String &p_name, VisualShader::VaryingMode p_mode, VisualShader::VaryingType p_type);
+ static void clear_varyings(RID p_shader_rid);
+ static bool has_varying(RID p_shader_rid, const String &p_name);
+
+ void set_shader_rid(const RID &p_shader);
int get_varyings_count() const;
String get_varying_name_by_index(int p_idx) const;
diff --git a/servers/physics_2d/godot_body_2d.cpp b/servers/physics_2d/godot_body_2d.cpp
index 01996dc43c..c401e6eee7 100644
--- a/servers/physics_2d/godot_body_2d.cpp
+++ b/servers/physics_2d/godot_body_2d.cpp
@@ -616,6 +616,8 @@ void GodotBody2D::integrate_velocities(real_t p_step) {
return;
}
+ ERR_FAIL_NULL(get_space());
+
if (fi_callback_data || body_state_callback.is_valid()) {
get_space()->body_add_to_state_query_list(&direct_state_query_list);
}
@@ -705,6 +707,8 @@ bool GodotBody2D::sleep_test(real_t p_step) {
return false;
}
+ ERR_FAIL_NULL_V(get_space(), true);
+
if (Math::abs(angular_velocity) < get_space()->get_body_angular_velocity_sleep_threshold() && Math::abs(linear_velocity.length_squared()) < get_space()->get_body_linear_velocity_sleep_threshold() * get_space()->get_body_linear_velocity_sleep_threshold()) {
still_time += p_step;
diff --git a/servers/physics_3d/godot_body_3d.cpp b/servers/physics_3d/godot_body_3d.cpp
index 407957b904..669c4b985b 100644
--- a/servers/physics_3d/godot_body_3d.cpp
+++ b/servers/physics_3d/godot_body_3d.cpp
@@ -675,6 +675,8 @@ void GodotBody3D::integrate_velocities(real_t p_step) {
return;
}
+ ERR_FAIL_NULL(get_space());
+
if (fi_callback_data || body_state_callback.is_valid()) {
get_space()->body_add_to_state_query_list(&direct_state_query_list);
}
@@ -784,6 +786,8 @@ bool GodotBody3D::sleep_test(real_t p_step) {
return false;
}
+ ERR_FAIL_NULL_V(get_space(), true);
+
if (Math::abs(angular_velocity.length()) < get_space()->get_body_angular_velocity_sleep_threshold() && Math::abs(linear_velocity.length_squared()) < get_space()->get_body_linear_velocity_sleep_threshold() * get_space()->get_body_linear_velocity_sleep_threshold()) {
still_time += p_step;
diff --git a/servers/rendering/renderer_canvas_render.h b/servers/rendering/renderer_canvas_render.h
index 4a56548932..cb8180f989 100644
--- a/servers/rendering/renderer_canvas_render.h
+++ b/servers/rendering/renderer_canvas_render.h
@@ -545,8 +545,13 @@ public:
virtual void set_debug_redraw(bool p_enabled, double p_time, const Color &p_color) = 0;
- RendererCanvasRender() { singleton = this; }
- virtual ~RendererCanvasRender() {}
+ RendererCanvasRender() {
+ ERR_FAIL_COND_MSG(singleton != nullptr, "A RendererCanvasRender singleton already exists.");
+ singleton = this;
+ }
+ virtual ~RendererCanvasRender() {
+ singleton = nullptr;
+ }
};
#endif // RENDERER_CANVAS_RENDER_H
diff --git a/servers/rendering/renderer_compositor.cpp b/servers/rendering/renderer_compositor.cpp
index d364de5633..428cecead1 100644
--- a/servers/rendering/renderer_compositor.cpp
+++ b/servers/rendering/renderer_compositor.cpp
@@ -47,6 +47,7 @@ bool RendererCompositor::is_xr_enabled() const {
}
RendererCompositor::RendererCompositor() {
+ ERR_FAIL_COND_MSG(singleton != nullptr, "A RendererCompositor singleton already exists.");
singleton = this;
#ifndef _3D_DISABLED
@@ -57,3 +58,7 @@ RendererCompositor::RendererCompositor() {
}
#endif // _3D_DISABLED
}
+
+RendererCompositor::~RendererCompositor() {
+ singleton = nullptr;
+}
diff --git a/servers/rendering/renderer_compositor.h b/servers/rendering/renderer_compositor.h
index 3c49e31516..ab789d5b4d 100644
--- a/servers/rendering/renderer_compositor.h
+++ b/servers/rendering/renderer_compositor.h
@@ -110,7 +110,7 @@ public:
static RendererCompositor *get_singleton() { return singleton; }
RendererCompositor();
- virtual ~RendererCompositor() {}
+ virtual ~RendererCompositor();
};
#endif // RENDERER_COMPOSITOR_H
diff --git a/servers/rendering/renderer_rd/renderer_compositor_rd.cpp b/servers/rendering/renderer_rd/renderer_compositor_rd.cpp
index 14d138181f..84ea6a5da2 100644
--- a/servers/rendering/renderer_rd/renderer_compositor_rd.cpp
+++ b/servers/rendering/renderer_rd/renderer_compositor_rd.cpp
@@ -299,6 +299,7 @@ RendererCompositorRD::RendererCompositorRD() {
}
}
+ ERR_FAIL_COND_MSG(singleton != nullptr, "A RendererCompositorRD singleton already exists.");
singleton = this;
utilities = memnew(RendererRD::Utilities);
@@ -330,6 +331,7 @@ RendererCompositorRD::RendererCompositorRD() {
}
RendererCompositorRD::~RendererCompositorRD() {
+ singleton = nullptr;
memdelete(uniform_set_cache);
memdelete(framebuffer_cache);
ShaderRD::set_shader_cache_dir(String());
diff --git a/servers/rendering/shader_types.cpp b/servers/rendering/shader_types.cpp
index ab9cf666ec..de396cd18b 100644
--- a/servers/rendering/shader_types.cpp
+++ b/servers/rendering/shader_types.cpp
@@ -77,12 +77,12 @@ ShaderTypes::ShaderTypes() {
shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["INSTANCE_CUSTOM"] = constt(ShaderLanguage::TYPE_VEC4);
shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["VERTEX_ID"] = constt(ShaderLanguage::TYPE_INT);
shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["ROUGHNESS"] = ShaderLanguage::TYPE_FLOAT;
- shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["BONE_INDICES"] = ShaderLanguage::TYPE_UVEC4;
- shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["BONE_WEIGHTS"] = ShaderLanguage::TYPE_VEC4;
- shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["CUSTOM0"] = ShaderLanguage::TYPE_VEC4;
- shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["CUSTOM1"] = ShaderLanguage::TYPE_VEC4;
- shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["CUSTOM2"] = ShaderLanguage::TYPE_VEC4;
- shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["CUSTOM3"] = ShaderLanguage::TYPE_VEC4;
+ shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["BONE_INDICES"] = constt(ShaderLanguage::TYPE_UVEC4);
+ shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["BONE_WEIGHTS"] = constt(ShaderLanguage::TYPE_VEC4);
+ shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["CUSTOM0"] = constt(ShaderLanguage::TYPE_VEC4);
+ shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["CUSTOM1"] = constt(ShaderLanguage::TYPE_VEC4);
+ shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["CUSTOM2"] = constt(ShaderLanguage::TYPE_VEC4);
+ shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["CUSTOM3"] = constt(ShaderLanguage::TYPE_VEC4);
shader_modes[RS::SHADER_SPATIAL].functions["vertex"].can_discard = false;
shader_modes[RS::SHADER_SPATIAL].functions["vertex"].main_function = true;
@@ -99,11 +99,11 @@ ShaderTypes::ShaderTypes() {
shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["OUTPUT_IS_SRGB"] = constt(ShaderLanguage::TYPE_BOOL);
shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["MAIN_CAM_INV_VIEW_MATRIX"] = constt(ShaderLanguage::TYPE_MAT4);
- shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["NODE_POSITION_WORLD"] = ShaderLanguage::TYPE_VEC3;
- shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["CAMERA_POSITION_WORLD"] = ShaderLanguage::TYPE_VEC3;
- shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["CAMERA_DIRECTION_WORLD"] = ShaderLanguage::TYPE_VEC3;
- shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["CAMERA_VISIBLE_LAYERS"] = ShaderLanguage::TYPE_UINT;
- shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["NODE_POSITION_VIEW"] = ShaderLanguage::TYPE_VEC3;
+ shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["NODE_POSITION_WORLD"] = constt(ShaderLanguage::TYPE_VEC3);
+ shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["CAMERA_POSITION_WORLD"] = constt(ShaderLanguage::TYPE_VEC3);
+ shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["CAMERA_DIRECTION_WORLD"] = constt(ShaderLanguage::TYPE_VEC3);
+ shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["CAMERA_VISIBLE_LAYERS"] = constt(ShaderLanguage::TYPE_UINT);
+ shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["NODE_POSITION_VIEW"] = constt(ShaderLanguage::TYPE_VEC3);
shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["VIEW_INDEX"] = constt(ShaderLanguage::TYPE_INT);
shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["VIEW_MONO_LEFT"] = constt(ShaderLanguage::TYPE_INT);
@@ -147,11 +147,11 @@ ShaderTypes::ShaderTypes() {
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["SCREEN_UV"] = constt(ShaderLanguage::TYPE_VEC2);
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["POINT_COORD"] = constt(ShaderLanguage::TYPE_VEC2);
- shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["NODE_POSITION_WORLD"] = ShaderLanguage::TYPE_VEC3;
- shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["CAMERA_POSITION_WORLD"] = ShaderLanguage::TYPE_VEC3;
- shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["CAMERA_DIRECTION_WORLD"] = ShaderLanguage::TYPE_VEC3;
- shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["CAMERA_VISIBLE_LAYERS"] = ShaderLanguage::TYPE_UINT;
- shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["NODE_POSITION_VIEW"] = ShaderLanguage::TYPE_VEC3;
+ shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["NODE_POSITION_WORLD"] = constt(ShaderLanguage::TYPE_VEC3);
+ shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["CAMERA_POSITION_WORLD"] = constt(ShaderLanguage::TYPE_VEC3);
+ shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["CAMERA_DIRECTION_WORLD"] = constt(ShaderLanguage::TYPE_VEC3);
+ shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["CAMERA_VISIBLE_LAYERS"] = constt(ShaderLanguage::TYPE_UINT);
+ shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["NODE_POSITION_VIEW"] = constt(ShaderLanguage::TYPE_VEC3);
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["VIEW_INDEX"] = constt(ShaderLanguage::TYPE_INT);
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["VIEW_MONO_LEFT"] = constt(ShaderLanguage::TYPE_INT);