diff --git a/src/runtime/ops/ecs.rs b/src/runtime/ops/ecs.rs index 0b780e9..979d2ac 100644 --- a/src/runtime/ops/ecs.rs +++ b/src/runtime/ops/ecs.rs @@ -4,12 +4,12 @@ use crate::runtime::{JsRuntimeOp, OpMap}; use self::types::{JsReflectFunctions, JsValueRefs}; -mod component; mod info; mod query; mod resource; pub mod types; mod value; +mod world; pub fn insert_ecs_ops(ops: &mut OpMap) { ops.insert("ecs_js", Box::new(EcsJs)); @@ -41,9 +41,10 @@ pub fn insert_ecs_ops(ops: &mut OpMap) { Box::new(value::ecs_value_ref_default), ); ops.insert("ecs_value_ref_patch", Box::new(value::ecs_value_ref_patch)); + ops.insert("ecs_entity_spawn", Box::new(world::ecs_entity_spawn)); ops.insert( "ecs_component_insert", - Box::new(component::ecs_component_insert), + Box::new(world::ecs_component_insert), ); } diff --git a/src/runtime/ops/ecs/ecs.js b/src/runtime/ops/ecs/ecs.js index 44c38d5..7902c2d 100644 --- a/src/runtime/ops/ecs/ecs.js +++ b/src/runtime/ops/ecs/ecs.js @@ -97,6 +97,10 @@ Value.unwrapValueRef(component) ); } + + spawn() { + return Value.wrapValueRef(bevyModJsScriptingOpSync("ecs_entity_spawn")); + } } const valueRefFinalizationRegistry = new FinalizationRegistry(ref => { diff --git a/src/runtime/ops/ecs/component.rs b/src/runtime/ops/ecs/world.rs similarity index 81% rename from src/runtime/ops/ecs/component.rs rename to src/runtime/ops/ecs/world.rs index 0579253..3998454 100644 --- a/src/runtime/ops/ecs/component.rs +++ b/src/runtime/ops/ecs/world.rs @@ -4,6 +4,22 @@ use bevy_reflect::TypeRegistryArc; use crate::{JsValueRef, JsValueRefs, OpContext}; +pub fn ecs_entity_spawn( + context: OpContext, + world: &mut bevy::prelude::World, + _args: serde_json::Value, +) -> anyhow::Result { + let value_refs = context + .op_state + .entry::() + .or_insert_with(default); + + let entity = world.spawn().id(); + let value_ref = JsValueRef::new_free(Box::new(entity), value_refs); + + Ok(serde_json::to_value(value_ref)?) +} + pub fn ecs_component_insert( context: OpContext, world: &mut bevy::prelude::World, diff --git a/types/lib.bevy.d.ts b/types/lib.bevy.d.ts index 246bd84..309e0a7 100644 --- a/types/lib.bevy.d.ts +++ b/types/lib.bevy.d.ts @@ -80,6 +80,7 @@ declare class World { query(...query: Q): QueryItems; get(entity: Entity, component: BevyType): T | undefined; insert(entity: Entity, component: any): void; + spawn(): Entity; } declare let world: World;