bevy_mod_ffi_host_sys 0.2.0

Low-level FFI bindings for bevy_mod_ffi hosts
Documentation
use bevy::{
    ecs::{
        prelude::*,
        query::{QueryIter, QueryState},
        world::FilteredEntityMut,
    },
    prelude::*,
};
use bevy_mod_ffi_core::{filtered_entity_mut, query, query_iter};

type SharedQueryBuilder<'w> = QueryBuilder<'w, FilteredEntityMut<'static, 'static>>;
type SharedQueryState = QueryState<FilteredEntityMut<'static, 'static>>;
type SharedQueryIter = QueryIter<'static, 'static, FilteredEntityMut<'static, 'static>, ()>;

pub mod builder;
pub mod iter;
pub mod state;

#[unsafe(no_mangle)]
unsafe extern "C" fn bevy_query_iter_mut(
    query_ptr: *mut query,
    out_iter: *mut *mut query_iter,
) -> bool {
    let query = unsafe { &mut *(query_ptr as *mut Query<FilteredEntityMut>) };
    let iter = query.iter_mut();

    unsafe {
        *out_iter = Box::into_raw(Box::new(iter)) as *mut query_iter;
    }

    true
}

#[unsafe(no_mangle)]
unsafe extern "C" fn bevy_query_get_mut(
    query_ptr: *mut query,
    entity_id: u64,
    out_entity: *mut *mut filtered_entity_mut,
) -> bool {
    let query = unsafe { &mut *(query_ptr as *mut Query<FilteredEntityMut>) };
    let entity = Entity::from_bits(entity_id);

    let filtered_entity = match query.get_mut(entity) {
        Ok(e) => e,
        Err(_) => return false,
    };

    unsafe {
        *out_entity = Box::into_raw(Box::new(filtered_entity)) as *mut filtered_entity_mut;
    }

    true
}

#[unsafe(no_mangle)]
unsafe extern "C" fn bevy_query_drop(query_ptr: *mut query) {
    let _ = unsafe { Box::from_raw(query_ptr as *mut Query<FilteredEntityMut>) };
}