70 lines
No EOL
2.6 KiB
Rust
70 lines
No EOL
2.6 KiB
Rust
use std::any::TypeId;
|
|
|
|
use lyra_ecs::ResourceObject;
|
|
use lyra_reflect::{Reflect, TypeRegistry};
|
|
use lyra_resource::gltf::Gltf;
|
|
|
|
use crate::{lua::{wrappers::{LuaGltfHandle, LuaActionHandler, LuaDeltaTime, LuaResHandleToComponent, LuaSceneHandle}, LuaContext, ReflectLuaProxy, RegisterLuaType, FN_NAME_INTERNAL_REFLECT_TYPE}, ScriptApiProvider, ScriptBorrow, ScriptData, ScriptDynamicBundle, ScriptWorldPtr};
|
|
|
|
#[derive(Default)]
|
|
pub struct LyraEcsApiProvider;
|
|
|
|
impl ScriptApiProvider for LyraEcsApiProvider {
|
|
type ScriptContext = LuaContext;
|
|
|
|
fn prepare_world(&mut self, world: &mut lyra_ecs::World) {
|
|
world.register_lua_convert::<LuaDeltaTime>();
|
|
world.register_lua_wrapper::<LuaSceneHandle>();
|
|
world.register_lua_wrapper::<LuaActionHandler>();
|
|
|
|
let mut registry = world.get_resource_mut::<TypeRegistry>();
|
|
|
|
let reg_type = registry.get_type_or_default(TypeId::of::<Gltf>());
|
|
reg_type.add_data(ReflectLuaProxy::from_lua_proxy::<LuaGltfHandle>());
|
|
|
|
let l = LuaResHandleToComponent::new(
|
|
|lua, res| {
|
|
if let Some(gltf) = res.as_typed::<Gltf>() {
|
|
Some(lua.create_userdata(LuaGltfHandle(gltf)).unwrap())
|
|
} else {
|
|
None
|
|
}
|
|
}
|
|
);
|
|
reg_type.add_data(l);
|
|
|
|
//reg_type.add_data(ReflectLuaProxy::from_lua_proxy::<LuaGltfHandle>());
|
|
}
|
|
|
|
fn expose_api(&mut self, _: &ScriptData, ctx: &mut Self::ScriptContext) -> Result<(), crate::ScriptError> {
|
|
let ctx = ctx.lock().unwrap();
|
|
|
|
let globals = ctx.globals()?;
|
|
globals.set("World", ctx.create_proxy::<ScriptWorldPtr>()?)?;
|
|
globals.set("DynamicBundle", ctx.create_proxy::<ScriptDynamicBundle>()?)?;
|
|
globals.set("SceneComponent", ctx.create_proxy::<LuaSceneHandle>()?)?;
|
|
globals.set("ActionHandler", ctx.create_proxy::<LuaActionHandler>()?)?;
|
|
|
|
let dt_table = create_reflect_table::<lyra_game::DeltaTime>(&ctx)?;
|
|
globals.set("DeltaTime", dt_table)?;
|
|
|
|
Ok(())
|
|
}
|
|
|
|
fn setup_script(&mut self, _: &crate::ScriptData, _: &mut Self::ScriptContext) -> Result<(), crate::ScriptError> {
|
|
Ok(())
|
|
}
|
|
|
|
fn update_script_environment(&mut self, _: crate::ScriptWorldPtr, _: &crate::ScriptData, _: &mut Self::ScriptContext) -> Result<(), crate::ScriptError> {
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
fn create_reflect_table<T: Reflect + ResourceObject + Default + 'static>(lua: &elua::State) -> elua::Result<elua::Table> {
|
|
let table = lua.create_table()?;
|
|
table.set(FN_NAME_INTERNAL_REFLECT_TYPE, lua.create_function(|_, ()| {
|
|
Ok(ScriptBorrow::from_resource::<T>(None))
|
|
})?)?;
|
|
|
|
Ok(table)
|
|
} |