bevy_mod_ffi_host_sys 0.2.0

Low-level FFI bindings for bevy_mod_ffi hosts
Documentation
use bevy::ecs::{
    component::ComponentId,
    entity::Entity,
    query::QueryState,
    world::{DeferredWorld, FilteredEntityMut},
};
use bevy_mod_ffi_core::{deferred_world, query, query_state};

#[unsafe(no_mangle)]
pub unsafe extern "C" fn bevy_deferred_world_query(
    deferred_ptr: *mut deferred_world,
    query_state_ptr: *mut query_state,
    out_query: *mut *mut query,
) -> bool {
    let deferred = unsafe { &mut *(deferred_ptr as *mut DeferredWorld) };
    let query_state =
        unsafe { &mut *(query_state_ptr as *mut QueryState<FilteredEntityMut<'static, 'static>>) };

    let query = deferred.query(query_state);
    unsafe {
        *out_query = Box::into_raw(Box::new(query)) as *mut query;
    }

    true
}

#[unsafe(no_mangle)]
pub unsafe extern "C" fn bevy_deferred_world_get_mut(
    deferred_ptr: *mut deferred_world,
    entity_bits: u64,
    component_id: usize,
    out_ptr: *mut *mut u8,
) -> bool {
    let deferred = unsafe { &mut *(deferred_ptr as *mut DeferredWorld) };
    let entity = Entity::from_bits(entity_bits);
    let component_id = ComponentId::new(component_id);

    let Some(mut mut_untyped) = deferred.get_mut_by_id(entity, component_id) else {
        return false;
    };

    unsafe {
        *out_ptr = mut_untyped.as_mut().as_ptr();
    }

    true
}

#[unsafe(no_mangle)]
pub unsafe extern "C" fn bevy_deferred_world_get_resource_mut(
    deferred_ptr: *mut deferred_world,
    component_id: usize,
    out_ptr: *mut *mut u8,
) -> bool {
    let deferred = unsafe { &mut *(deferred_ptr as *mut DeferredWorld) };
    let component_id = ComponentId::new(component_id);

    let Some(mut mut_untyped) = deferred.get_resource_mut_by_id(component_id) else {
        return false;
    };

    unsafe {
        *out_ptr = mut_untyped.as_mut().as_ptr();
    }

    true
}

#[unsafe(no_mangle)]
pub unsafe extern "C" fn bevy_deferred_world_drop(deferred_ptr: *mut deferred_world) {
    let _ = unsafe { Box::from_raw(deferred_ptr as *mut DeferredWorld) };
}