nightshade 0.13.3

A cross-platform data-oriented game engine.
Documentation
use crate::ecs::world::World;
use crate::mcp::McpResponse;

pub(crate) fn mcp_spawn_3d_text(
    world: &mut World,
    request: crate::mcp::Spawn3dTextRequest,
) -> McpResponse {
    use crate::ecs::text::components::Text;
    use crate::ecs::transform::components::LocalTransform;
    use crate::ecs::world::{GLOBAL_TRANSFORM, LOCAL_TRANSFORM, LOCAL_TRANSFORM_DIRTY, NAME, TEXT};

    let font_size = request.font_size.unwrap_or(32.0);
    let color = request.color.unwrap_or([1.0, 1.0, 1.0, 1.0]);
    let billboard = request.billboard.unwrap_or(false);

    let text_index = world.resources.text_cache.add_text(&request.text);

    let entity = world
        .spawn_entities(
            NAME | LOCAL_TRANSFORM | LOCAL_TRANSFORM_DIRTY | GLOBAL_TRANSFORM | TEXT,
            1,
        )
        .into_iter()
        .next()
        .unwrap();

    let pos = nalgebra_glm::Vec3::new(
        request.position[0],
        request.position[1],
        request.position[2],
    );
    world
        .core
        .set_local_transform(entity, LocalTransform::from_translation(pos));

    let mut text_component = Text::new(text_index);
    text_component.billboard = billboard;
    text_component.properties.font_size = font_size;
    text_component.properties.color =
        nalgebra_glm::Vec4::new(color[0], color[1], color[2], color[3]);
    world.core.set_text(entity, text_component);
    world.core.set_name(
        entity,
        crate::ecs::name::components::Name(request.name.clone()),
    );
    world
        .resources
        .entity_names
        .insert(request.name.clone(), entity);

    McpResponse::Success(format!("Spawned 3D text '{}'", request.name))
}