MagicNStuff/source/components/ui/menus/boot/shader_precompilation/shader_precompiler.gd
2025-02-25 22:07:11 +01:00

80 lines
1.9 KiB
GDScript

extends Node
signal finished_compilation
const EXCLUDED_DIRECTORIES: Array[String] = [
"res://addons",
"res://.godot"
]
#const SIMUTANEOUS_SCENES: int = 5
@onready var progress_bar: ProgressBar = %ProgressBar
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
await get_tree().create_timer(1.0).timeout
precompile_shaders()
func precompile_shaders() -> void:
var files: PackedStringArray = find_scene_file_paths("res://")
var index: int = 0
while index < files.size():
#print("Compilation Progress: ", index, "/", files.size() - 1)
var file: String = files[index]
index += 1
if scene_file_path == file or get_tree().current_scene.scene_file_path == file:
continue
await compile_scene(file)
progress_bar.value = index / float(files.size())
finished_compilation.emit()
func compile_scene(scene_path: String) -> void:
var scene: PackedScene = load(scene_path)
if not scene.can_instantiate():
return
var node: Node = scene.instantiate()
node.set_script(null)
for child: Node in Utils.get_all_children(node):
child.set_script(null)
#child.set_process(false)
#child.set_process_internal(false)
#child.set_physics_process_internal(false)
add_child(node)
await get_tree().create_timer(0.2, false).timeout
node.queue_free()
func find_scene_file_paths(path: String, find_recursive: bool = true) -> PackedStringArray:
var files: PackedStringArray = []
for file: String in DirAccess.get_files_at(path):
if file.get_extension().contains("scn"):
#print("Path: '%s' Filename: '%s'" %[path, file])
files.append(str(path, "/" if not path.ends_with("/") else "", file))
if find_recursive:
for folder: String in DirAccess.get_directories_at(path):
var _path: String = str(path, "/" if not path.ends_with("/") else "", folder)
if EXCLUDED_DIRECTORIES.has(_path):
continue
files.append_array(find_scene_file_paths(_path))
return files