godotengine / godot-cpp

C++ bindings for the Godot script API
MIT License
1.75k stars 578 forks source link

`SceneTree::get_singleton()` is not available #1597

Open aaronfranke opened 2 months ago

aaronfranke commented 2 months ago

Godot version

Godot 4.3-stable

godot-cpp version

master b93d6e887e98d5f55e77883950032da9675c405d

System information

macOS 14.6.1 arm64

Issue description

SceneTree *scene_tree = SceneTree::get_singleton();

This code snippet compiles in engine code, but does not compile in godot-cpp:

 error: no member named 'get_singleton' in 'godot::SceneTree'
   91 |         SceneTree *scene_tree = SceneTree::get_singleton();
      |                                 ~~~~~~~~~~~^
1 error generated.

My use case is that I'm trying to connect to signals on SceneTree such as physics_frame.

It seems that most other singletons have this method in godot-cpp, it's just SceneTree where it's missing:

Screenshot 2024-09-18 at 8 30 03 PM

Steps to reproduce

Add SceneTree *scene_tree = SceneTree::get_singleton(); to a GDExtension godot-cpp project and try to compile it.

Minimal reproduction project

I'm not gonna bother including a minimal reproduction project since it's one line of code.

AThousandShips commented 2 months ago

It isn't registered as a singleton, and isn't available in scripting as such, see scene/register_scene_types.cpp

BenLubar commented 1 month ago

SceneTree is accessed in GDScript via Engine.get_main_loop().

dsnopek commented 1 month ago

Yeah, it's a workaround, but you can get the scene tree like this:

SceneTree *scene_tree = Object::cast_to<SceneTree>(Engine::get_singleton()->get_main_loop());

We should probably generate a SceneTree::get_singleton() function that does this in godot-cpp, to make code compatible with modules.