bevy_mod_ffi_host_sys 0.2.0

Low-level FFI bindings for bevy_mod_ffi hosts
Documentation
use bevy::{
    ecs::{component::ComponentId, world::World},
    prelude::*,
};
use bevy_mod_ffi_core::{query_builder, query_state, world};

use super::SharedQueryBuilder;

#[unsafe(no_mangle)]
pub unsafe extern "C" fn bevy_query_builder_new(world_ptr: *mut world) -> *mut query_builder {
    let world = unsafe { &mut *(world_ptr as *mut World) };
    let builder = SharedQueryBuilder::new(world);
    Box::into_raw(Box::new(builder)) as *mut query_builder
}

#[unsafe(no_mangle)]
pub unsafe extern "C" fn bevy_query_builder_with_ref(
    builder_ptr: *mut query_builder,
    component_id: usize,
) {
    let builder = unsafe { &mut *(builder_ptr as *mut SharedQueryBuilder) };
    builder.ref_id(ComponentId::new(component_id));
}

#[unsafe(no_mangle)]
pub unsafe extern "C" fn bevy_query_builder_with_mut(
    builder_ptr: *mut query_builder,
    component_id: usize,
) {
    let builder = unsafe { &mut *(builder_ptr as *mut SharedQueryBuilder) };
    builder.mut_id(ComponentId::new(component_id));
}

#[unsafe(no_mangle)]
pub unsafe extern "C" fn bevy_query_builder_with(
    builder_ptr: *mut query_builder,
    component_id: usize,
) {
    let builder = unsafe { &mut *(builder_ptr as *mut SharedQueryBuilder) };
    builder.with_id(ComponentId::new(component_id));
}

#[unsafe(no_mangle)]
pub unsafe extern "C" fn bevy_query_builder_without(
    builder_ptr: *mut query_builder,
    component_id: usize,
) {
    let builder = unsafe { &mut *(builder_ptr as *mut SharedQueryBuilder) };
    builder.without_id(ComponentId::new(component_id));
}

#[unsafe(no_mangle)]
pub unsafe extern "C" fn bevy_query_builder_build(
    builder_ptr: *mut query_builder,
) -> *mut query_state {
    let mut builder = unsafe { Box::from_raw(builder_ptr as *mut SharedQueryBuilder) };
    let query_state = builder.build();

    Box::into_raw(Box::new(query_state)) as *mut query_state
}

#[unsafe(no_mangle)]
pub unsafe extern "C" fn bevy_query_builder_drop(builder_ptr: *mut query_builder) {
    let _ = unsafe { Box::from_raw(builder_ptr as *mut SharedQueryBuilder) };
}