diff options
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); |