From bc9d0c783504148460f44c54d59551cb3e92c8c6 Mon Sep 17 00:00:00 2001 From: kobewi Date: Thu, 27 Mar 2025 14:42:42 +0100 Subject: [PATCH] Add templated version of ObjectDB::get_instance() --- core/core_bind.cpp | 2 +- core/error/error_macros.cpp | 2 +- core/object/object.h | 12 ++++++++++++ core/object/ref_counted.h | 5 +++++ editor/editor_file_system.cpp | 2 +- editor/editor_node.cpp | 4 ++-- editor/gui/scene_tree_editor.cpp | 2 +- .../plugins/animation_player_editor_plugin.cpp | 2 +- editor/plugins/canvas_item_editor_plugin.cpp | 2 +- .../plugins/editor_resource_tooltip_plugins.cpp | 2 +- editor/plugins/node_3d_editor_plugin.cpp | 10 +++++----- editor/plugins/tiles/tile_map_layer_editor.cpp | 6 +++--- editor/plugins/tiles/tile_set_editor.cpp | 2 +- editor/plugins/tiles/tiles_editor_plugin.cpp | 8 ++++---- editor/property_selector.cpp | 2 +- modules/multiplayer/multiplayer_debugger.cpp | 4 ++-- modules/multiplayer/multiplayer_spawner.cpp | 6 +++--- modules/multiplayer/multiplayer_spawner.h | 2 +- modules/multiplayer/multiplayer_synchronizer.cpp | 2 +- modules/multiplayer/scene_cache_interface.cpp | 4 ++-- .../multiplayer/scene_replication_interface.h | 2 +- scene/2d/physics/character_body_2d.cpp | 2 +- scene/2d/physics/kinematic_collision_2d.cpp | 2 +- scene/2d/remote_transform_2d.cpp | 4 ++-- scene/2d/visible_on_screen_notifier_2d.cpp | 2 +- scene/3d/bone_attachment_3d.cpp | 8 ++++---- scene/3d/physics/character_body_3d.cpp | 2 +- scene/3d/physics/kinematic_collision_3d.cpp | 2 +- scene/3d/physics/physical_bone_3d.cpp | 2 +- scene/3d/remote_transform_3d.cpp | 4 ++-- scene/3d/retarget_modifier_3d.cpp | 10 +++++----- scene/3d/skeleton_modifier_3d.cpp | 2 +- scene/3d/visible_on_screen_notifier_3d.cpp | 2 +- scene/animation/animation_mixer.cpp | 14 +++++++------- scene/animation/tween.cpp | 4 ++-- scene/debugger/scene_debugger.cpp | 12 ++++++------ scene/gui/menu_bar.cpp | 4 ++-- scene/gui/rich_text_label.h | 4 ++-- scene/gui/tab_container.cpp | 2 +- scene/main/scene_tree.cpp | 12 ++++++------ scene/main/viewport.cpp | 12 ++++++------ scene/main/window.cpp | 2 +- .../skeleton/skeleton_modification_2d_ccdik.cpp | 4 ++-- .../skeleton/skeleton_modification_2d_fabrik.cpp | 16 ++++++++-------- .../skeleton/skeleton_modification_2d_jiggle.cpp | 2 +- .../skeleton/skeleton_modification_2d_lookat.cpp | 2 +- .../skeleton_modification_2d_physicalbones.cpp | 4 ++-- .../skeleton_modification_2d_twoboneik.cpp | 4 ++-- scene/resources/packed_scene.cpp | 2 +- 49 files changed, 121 insertions(+), 104 deletions(-) diff --git a/core/core_bind.cpp b/core/core_bind.cpp index 12fc065940..91b0505f5f 100644 --- a/core/core_bind.cpp +++ b/core/core_bind.cpp @@ -1350,7 +1350,7 @@ void Thread::_start_func(void *ud) { target_callable.callp(nullptr, 0, ret, ce); // If script properly kept a reference to the thread, we should be able to re-reference it now // (well, or if the call failed, since we had to break chains anyway because the outcome isn't known upfront). - t = Ref(ObjectDB::get_instance(th_instance_id)); + t = ObjectDB::get_ref(th_instance_id); if (t.is_valid()) { t->ret = ret; t->running.clear(); diff --git a/core/error/error_macros.cpp b/core/error/error_macros.cpp index adf58f5b67..74dc933695 100644 --- a/core/error/error_macros.cpp +++ b/core/error/error_macros.cpp @@ -188,7 +188,7 @@ void _physics_interpolation_warning(const char *p_function, const char *p_file, } else { String node_name; if (p_id.is_valid()) { - Node *node = Object::cast_to(ObjectDB::get_instance(p_id)); + Node *node = ObjectDB::get_instance(p_id); if (node && node->is_inside_tree()) { node_name = "\"" + String(node->get_path()) + "\""; } else { diff --git a/core/object/object.h b/core/object/object.h index 41f20f7d0b..ce01d5f1ab 100644 --- a/core/object/object.h +++ b/core/object/object.h @@ -46,6 +46,9 @@ template class TypedArray; +template +class Ref; + enum PropertyHint { PROPERTY_HINT_NONE, ///< no hint provided. PROPERTY_HINT_RANGE, ///< hint_text = "min,max[,step][,or_greater][,or_less][,hide_slider][,radians_as_degrees][,degrees][,exp][,suffix:] range. @@ -1052,6 +1055,15 @@ public: return object; } + + template + _ALWAYS_INLINE_ static T *get_instance(ObjectID p_instance_id) { + return Object::cast_to(get_instance(p_instance_id)); + } + + template + _ALWAYS_INLINE_ static Ref get_ref(ObjectID p_instance_id); // Defined in ref_counted.h + static void debug_objects(DebugFunc p_func); static int get_object_count(); }; diff --git a/core/object/ref_counted.h b/core/object/ref_counted.h index 7bb15d9eea..95274d0d51 100644 --- a/core/object/ref_counted.h +++ b/core/object/ref_counted.h @@ -285,3 +285,8 @@ struct VariantInternalAccessor &> { // Zero-constructing Ref initializes reference to nullptr (and thus empty). template struct is_zero_constructible> : std::true_type {}; + +template +Ref ObjectDB::get_ref(ObjectID p_instance_id) { + return Ref(get_instance(p_instance_id)); +} diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp index 42cd863294..1e2828e08c 100644 --- a/editor/editor_file_system.cpp +++ b/editor/editor_file_system.cpp @@ -3098,7 +3098,7 @@ void EditorFileSystem::_queue_refresh_filesystem() { void EditorFileSystem::_refresh_filesystem() { for (const ObjectID &id : folders_to_sort) { - EditorFileSystemDirectory *dir = Object::cast_to(ObjectDB::get_instance(id)); + EditorFileSystemDirectory *dir = ObjectDB::get_instance(id); if (dir) { dir->subdirs.sort_custom(); } diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 6f5d53ac54..69df412f91 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -2424,7 +2424,7 @@ void EditorNode::edit_item(Object *p_object, Object *p_editing_owner) { if (kv.key == owner_id || !kv.value.has(plugin)) { continue; } - EditorPropertyResource *epres = Object::cast_to(ObjectDB::get_instance(kv.key)); + EditorPropertyResource *epres = ObjectDB::get_instance(kv.key); if (epres) { // If it's resource property editing the same resource type, fold it later to avoid premature modifications // that may result in unsafe iteration of active_plugins. @@ -2555,7 +2555,7 @@ void EditorNode::_add_to_history(const Object *p_object, const String &p_propert ObjectID history_id = editor_history.get_current(); if (id != history_id) { const MultiNodeEdit *multi_node_edit = Object::cast_to(p_object); - const MultiNodeEdit *history_multi_node_edit = Object::cast_to(ObjectDB::get_instance(history_id)); + const MultiNodeEdit *history_multi_node_edit = ObjectDB::get_instance(history_id); if (multi_node_edit && history_multi_node_edit && multi_node_edit->is_same_selection(history_multi_node_edit)) { return; } diff --git a/editor/gui/scene_tree_editor.cpp b/editor/gui/scene_tree_editor.cpp index ffc432896a..0cd8430378 100644 --- a/editor/gui/scene_tree_editor.cpp +++ b/editor/gui/scene_tree_editor.cpp @@ -1291,7 +1291,7 @@ void SceneTreeEditor::_cell_multi_selected(Object *p_object, int p_cell, bool p_ void SceneTreeEditor::_tree_scroll_to_item(ObjectID p_item_id) { ERR_FAIL_NULL(tree); - TreeItem *item = Object::cast_to(ObjectDB::get_instance(p_item_id)); + TreeItem *item = ObjectDB::get_instance(p_item_id); if (item) { tree->scroll_to_item(item, true); } diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp index 15eb7b0ac7..ae10f0af9a 100644 --- a/editor/plugins/animation_player_editor_plugin.cpp +++ b/editor/plugins/animation_player_editor_plugin.cpp @@ -1932,7 +1932,7 @@ AnimationMixer *AnimationPlayerEditor::fetch_mixer_for_library() const { } Node *AnimationPlayerEditor::get_cached_root_node() const { - return Object::cast_to(ObjectDB::get_instance(cached_root_node_id)); + return ObjectDB::get_instance(cached_root_node_id); } bool AnimationPlayerEditor::_validate_tracks(const Ref p_anim) { diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index 423b6e0f84..49a1a8c79a 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -4739,7 +4739,7 @@ void CanvasItemEditor::_popup_callback(int p_op) { undo_redo->create_action(TTR("Paste Pose")); for (const PoseClipboard &E : pose_clipboard) { - Node2D *n2d = Object::cast_to(ObjectDB::get_instance(E.id)); + Node2D *n2d = ObjectDB::get_instance(E.id); if (!n2d) { continue; } diff --git a/editor/plugins/editor_resource_tooltip_plugins.cpp b/editor/plugins/editor_resource_tooltip_plugins.cpp index dfeb59214c..4b72c0d2cc 100644 --- a/editor/plugins/editor_resource_tooltip_plugins.cpp +++ b/editor/plugins/editor_resource_tooltip_plugins.cpp @@ -38,7 +38,7 @@ void EditorResourceTooltipPlugin::_thumbnail_ready(const String &p_path, const Ref &p_preview, const Ref &p_small_preview, const Variant &p_udata) { ObjectID trid = p_udata; - TextureRect *tr = Object::cast_to(ObjectDB::get_instance(trid)); + TextureRect *tr = ObjectDB::get_instance(trid); if (!tr) { return; diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index 3488cefd2f..fe1723a08b 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -758,7 +758,7 @@ void Node3DEditorViewport::_clear_selected() { } void Node3DEditorViewport::_select_clicked(bool p_allow_locked) { - Node *node = Object::cast_to(ObjectDB::get_instance(clicked)); + Node *node = ObjectDB::get_instance(clicked); Node3D *selected = Object::cast_to(node); clicked = ObjectID(); @@ -2118,7 +2118,7 @@ void Node3DEditorViewport::_sinput(const Ref &p_event) { const bool movement_threshold_passed = _edit.original_mouse_pos.distance_to(_edit.mouse_pos) > 8 * EDSCALE; if (selection_in_progress && movement_threshold_passed && clicked.is_valid()) { - if (clicked_wants_append || !editor_selection->is_selected(Object::cast_to(ObjectDB::get_instance(clicked)))) { + if (clicked_wants_append || !editor_selection->is_selected(ObjectDB::get_instance(clicked))) { cursor.region_select = true; cursor.region_begin = _edit.original_mouse_pos; clicked = ObjectID(); @@ -4849,8 +4849,8 @@ bool Node3DEditorViewport::_create_audio_node(Node *p_parent, const String &p_pa void Node3DEditorViewport::_perform_drop_data() { EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); if (spatial_editor->get_preview_material_target().is_valid()) { - GeometryInstance3D *geometry_instance = Object::cast_to(ObjectDB::get_instance(spatial_editor->get_preview_material_target())); - MeshInstance3D *mesh_instance = Object::cast_to(ObjectDB::get_instance(spatial_editor->get_preview_material_target())); + GeometryInstance3D *geometry_instance = ObjectDB::get_instance(spatial_editor->get_preview_material_target()); + MeshInstance3D *mesh_instance = ObjectDB::get_instance(spatial_editor->get_preview_material_target()); if (mesh_instance && spatial_editor->get_preview_material_surface() != -1) { undo_redo->create_action(vformat(TTR("Set Surface %d Override Material"), spatial_editor->get_preview_material_surface())); undo_redo->add_do_method(geometry_instance, "set_surface_override_material", spatial_editor->get_preview_material_surface(), spatial_editor->get_preview_material()); @@ -8519,7 +8519,7 @@ void Node3DEditor::_request_gizmo(Object *p_obj) { } void Node3DEditor::_request_gizmo_for_id(ObjectID p_id) { - Node3D *node = Object::cast_to(ObjectDB::get_instance(p_id)); + Node3D *node = ObjectDB::get_instance(p_id); if (node) { _request_gizmo(node); } diff --git a/editor/plugins/tiles/tile_map_layer_editor.cpp b/editor/plugins/tiles/tile_map_layer_editor.cpp index c94ef4ea50..75e4420aef 100644 --- a/editor/plugins/tiles/tile_map_layer_editor.cpp +++ b/editor/plugins/tiles/tile_map_layer_editor.cpp @@ -48,7 +48,7 @@ #include "core/os/keyboard.h" TileMapLayer *TileMapLayerSubEditorPlugin::_get_edited_layer() const { - return Object::cast_to(ObjectDB::get_instance(edited_tile_map_layer_id)); + return ObjectDB::get_instance(edited_tile_map_layer_id); } void TileMapLayerSubEditorPlugin::draw_tile_coords_over_viewport(Control *p_overlay, const TileMapLayer *p_edited_layer, Ref p_tile_set, bool p_show_rectangle_size, const Vector2i &p_rectangle_origin) { @@ -2177,7 +2177,7 @@ void TileMapLayerEditorTilesPlugin::edit(ObjectID p_tile_map_layer_id) { } } - TileMapLayer *new_tile_map_layer = Object::cast_to(ObjectDB::get_instance(edited_tile_map_layer_id)); + TileMapLayer *new_tile_map_layer = ObjectDB::get_instance(edited_tile_map_layer_id); Ref new_tile_set; if (new_tile_map_layer) { new_tile_set = new_tile_map_layer->get_tile_set(); @@ -3641,7 +3641,7 @@ TileMapLayerEditorTerrainsPlugin::TileMapLayerEditorTerrainsPlugin() { } TileMapLayer *TileMapLayerEditor::_get_edited_layer() const { - return Object::cast_to(ObjectDB::get_instance(edited_tile_map_layer_id)); + return ObjectDB::get_instance(edited_tile_map_layer_id); } void TileMapLayerEditor::_find_tile_map_layers_in_scene(Node *p_current, const Node *p_owner, Vector &r_list) const { diff --git a/editor/plugins/tiles/tile_set_editor.cpp b/editor/plugins/tiles/tile_set_editor.cpp index d92f7c5de4..a559e99377 100644 --- a/editor/plugins/tiles/tile_set_editor.cpp +++ b/editor/plugins/tiles/tile_set_editor.cpp @@ -784,7 +784,7 @@ void TileSetEditor::remove_expanded_editor() { return; } - Node *original_parent = Object::cast_to(ObjectDB::get_instance(expanded_editor_parent)); + Node *original_parent = ObjectDB::get_instance(expanded_editor_parent); if (original_parent) { expanded_editor->remove_meta("reparented"); expanded_editor->reparent(original_parent); diff --git a/editor/plugins/tiles/tiles_editor_plugin.cpp b/editor/plugins/tiles/tiles_editor_plugin.cpp index e1d37069d1..f86504499b 100644 --- a/editor/plugins/tiles/tiles_editor_plugin.cpp +++ b/editor/plugins/tiles/tiles_editor_plugin.cpp @@ -339,14 +339,14 @@ void TileMapEditorPlugin::_tile_map_layer_changed() { void TileMapEditorPlugin::_tile_map_layer_removed() { // Workaround for TileMap, making sure the editor stays open when you delete the currently edited layer. - TileMap *tile_map = Object::cast_to(ObjectDB::get_instance(tile_map_group_id)); + TileMap *tile_map = ObjectDB::get_instance(tile_map_group_id); if (tile_map) { edit(tile_map); } } void TileMapEditorPlugin::_update_tile_map() { - TileMapLayer *edited_layer = Object::cast_to(ObjectDB::get_instance(tile_map_layer_id)); + TileMapLayer *edited_layer = ObjectDB::get_instance(tile_map_layer_id); if (edited_layer) { Ref tile_set = edited_layer->get_tile_set(); if (tile_set.is_valid() && tile_set_id != tile_set->get_instance_id()) { @@ -363,7 +363,7 @@ void TileMapEditorPlugin::_update_tile_map() { } void TileMapEditorPlugin::_select_layer(const StringName &p_name) { - TileMapLayer *edited_layer = Object::cast_to(ObjectDB::get_instance(tile_map_layer_id)); + TileMapLayer *edited_layer = ObjectDB::get_instance(tile_map_layer_id); ERR_FAIL_NULL(edited_layer); Node *parent = edited_layer->get_parent(); @@ -415,7 +415,7 @@ void TileMapEditorPlugin::_notification(int p_notification) { } void TileMapEditorPlugin::edit(Object *p_object) { - TileMapLayer *edited_layer = Object::cast_to(ObjectDB::get_instance(tile_map_layer_id)); + TileMapLayer *edited_layer = ObjectDB::get_instance(tile_map_layer_id); if (edited_layer) { edited_layer->disconnect(CoreStringName(changed), callable_mp(this, &TileMapEditorPlugin::_tile_map_layer_changed)); edited_layer->disconnect(SceneStringName(tree_exited), callable_mp(this, &TileMapEditorPlugin::_tile_map_layer_removed)); diff --git a/editor/property_selector.cpp b/editor/property_selector.cpp index c4b73f26bf..d65f4067ca 100644 --- a/editor/property_selector.cpp +++ b/editor/property_selector.cpp @@ -180,7 +180,7 @@ void PropertySelector::_update_search() { Variant::construct(type, v, nullptr, 0, ce); v.get_method_list(&methods); } else { - Ref