extends RefCounted class_name GLBLoader ## Loads a GLB file at runtime using GLTFDocument. ## Usage: ## var loader = GLBLoader.new() ## var scene = loader.load("res://path/to/model.glb") ## if scene: ## get_tree().current_scene.add_child(scene) static func load(glb_path: String) -> Node3D: print("GLBLoader: loading " + glb_path) # Check if file exists if not FileAccess.file_exists(glb_path): print("GLBLoader: file not found: " + glb_path) return null # Read file as bytes var file = FileAccess.open(glb_path, FileAccess.READ) if not file: print("GLBLoader: failed to open file") return null var bytes = file.get_buffer(file.get_length()) file.close() print("GLBLoader: read %d bytes" % bytes.size()) # Parse with GLTFDocument var gltf = GLTFDocument.new() var state = GLTFState.new() var err = gltf.append_from_buffer(bytes, "", state) if err != OK: print("GLBLoader: failed to parse GLB, error: %d" % err) return null print("GLBLoader: parsed successfully (%d animations, %d meshes)" % [ state.animations.size(), state.meshes.size()]) # Generate scene — remove_immutable_tracks=false preserves all bone # animation tracks (default true strips tracks where rest==pose → T-pose). var scene = gltf.generate_scene(state, 30, false, false) if not scene: print("GLBLoader: failed to generate scene") return null print("GLBLoader: generated scene: %s" % scene.name) return scene