use gdnative::prelude::*;
#[derive(Debug, Clone, PartialEq)]
pub enum SceneHelperErrs {
CouldNotMakeInstance,
RootClassNotSpatial(String),
}
pub fn load_scene(path: &str) -> Option<Ref<PackedScene, ThreadLocal>> {
let scene = ResourceLoader::godot_singleton().load(path, "PackedScene", false)?;
let scene = unsafe { scene.assume_thread_local() };
scene.cast::<PackedScene>()
}
pub fn instanciate_scene<Root>(scene: &PackedScene) -> Result<Ref<Root, Unique>, SceneHelperErrs>
where
Root: gdnative::GodotObject<RefKind = ManuallyManaged> + SubClass<Node>,
{
let instance = scene
.instance(PackedScene::GEN_EDIT_STATE_DISABLED)
.ok_or(SceneHelperErrs::CouldNotMakeInstance)?;
let instance = unsafe { instance.assume_unique() };
instance
.try_cast::<Root>()
.map_err(|instance| SceneHelperErrs::RootClassNotSpatial(instance.name().to_string()))
}