1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

Speed up scene group scanning for text scenes

This commit is contained in:
kobewi
2024-06-29 00:40:34 +02:00
parent 4ab8fb8093
commit b83c64faac
4 changed files with 52 additions and 8 deletions

View File

@@ -2124,6 +2124,56 @@ void PackedScene::recreate_state() {
#endif
}
#ifdef TOOLS_ENABLED
HashSet<StringName> PackedScene::get_scene_groups(const String &p_path) {
{
Ref<PackedScene> packed_scene = ResourceCache::get_ref(p_path);
if (packed_scene.is_valid()) {
return packed_scene->get_state()->get_all_groups();
}
}
if (p_path.get_extension() == "tscn") {
Ref<FileAccess> scene_file = FileAccess::open(p_path, FileAccess::READ);
ERR_FAIL_COND_V(scene_file.is_null(), HashSet<StringName>());
HashSet<StringName> ret;
while (!scene_file->eof_reached()) {
const String line = scene_file->get_line();
if (!line.begins_with("[node")) {
continue;
}
int i = line.find("groups=[");
if (i == -1) {
continue;
}
int j = line.find_char(']', i);
while (i < j) {
i = line.find_char('"', i);
if (i == -1) {
break;
}
int k = line.find_char('"', i + 1);
if (k == -1) {
break;
}
ret.insert(line.substr(i + 1, k - i - 1));
i = k + 1;
}
}
return ret;
} else {
Ref<PackedScene> packed_scene = ResourceLoader::load(p_path);
ERR_FAIL_COND_V(packed_scene.is_null(), HashSet<StringName>());
return packed_scene->get_state()->get_all_groups();
}
}
#endif
Ref<SceneState> PackedScene::get_state() const {
return state;
}