use std::marker::PhantomData;
use crate::prelude::*;
use beet_core::prelude::*;
use beet_flow::prelude::*;
use beet_spatial::prelude::*;
#[action(sentence_steer_target::<F>)]
#[derive(Debug, Clone, PartialEq, Component, Reflect)]
#[reflect(Default, Component)]
pub struct SentenceSteerTarget<F: Component> {
pub target_entity: TargetEntity,
_phantom: PhantomData<F>,
}
impl<F: Component> SentenceSteerTarget<F> {
pub fn new(target_entity: TargetEntity) -> Self {
Self {
target_entity,
_phantom: PhantomData,
}
}
}
impl<F: Component> Default for SentenceSteerTarget<F> {
fn default() -> Self {
Self {
target_entity: Default::default(),
_phantom: PhantomData,
}
}
}
fn sentence_steer_target<F: Component>(
ev: On<GetOutcome>,
mut commands: Commands,
query: Query<(&HandleWrapper<Bert>, &SentenceSteerTarget<F>)>,
sentences: Query<&Sentence>,
items: Query<Entity, (With<Sentence>, With<F>)>,
mut berts: ResMut<Assets<Bert>>,
) -> Result {
let (handle, sentence_steer_target) = query.get(ev.action())?;
let target_entity = sentence_steer_target.target_entity.select_target(&ev);
let target_sentence = sentences.get(target_entity)?;
let bert = berts
.get_mut(handle)
.expect(&expect_action::to_have_asset(&ev));
match bert.closest_sentence_entity(
target_sentence.0.clone(),
items
.into_iter()
.filter(|e| *e != target_entity)
.collect::<Vec<_>>(),
&sentences,
) {
Ok(entity) => {
commands
.entity(ev.agent())
.insert(SteerTarget::Entity(entity));
}
Err(e) => log::error!("SentenceFlow: {}", e),
}
Ok(())
}