bevy_tnua/
action_state.rs1use bevy_tnua_physics_integration_layer::data_for_backends::TnuaMotor;
2use serde::{Deserialize, Serialize};
3
4use crate::{TnuaAction, TnuaActionContext, TnuaBasis};
5use crate::{TnuaActionLifecycleDirective, TnuaActionLifecycleStatus, TnuaBasisContext};
6
7#[derive(Serialize, Deserialize)]
12pub struct TnuaActionState<A: TnuaAction<B>, B: TnuaBasis> {
13 pub input: A,
16 pub config: A::Config,
18 pub memory: A::Memory,
20}
21
22impl<A: TnuaAction<B>, B: TnuaBasis> TnuaActionState<A, B> {
23 pub fn new(input: A, config: &A::Config) -> Self {
24 Self {
25 input,
26 config: config.clone(),
27 memory: Default::default(),
28 }
29 }
30}
31
32#[doc(hidden)]
33pub trait TnuaActionStateInterface<B: TnuaBasis> {
34 fn apply(
35 &mut self,
36 sensors: &B::Sensors<'_>,
37 ctx: TnuaActionContext<B>,
38 lifecycle_status: TnuaActionLifecycleStatus,
39 motor: &mut TnuaMotor,
40 ) -> TnuaActionLifecycleDirective;
41
42 fn influence_basis(
43 &self,
44 ctx: TnuaBasisContext,
45 basis_input: &B,
46 basis_config: &B::Config,
47 basis_memory: &mut B::Memory,
48 );
49}
50
51impl<A: TnuaAction<B>, B: TnuaBasis> TnuaActionStateInterface<B> for TnuaActionState<A, B> {
52 fn apply(
53 &mut self,
54 sensors: &B::Sensors<'_>,
55 ctx: TnuaActionContext<B>,
56 lifecycle_status: TnuaActionLifecycleStatus,
57 motor: &mut TnuaMotor,
58 ) -> TnuaActionLifecycleDirective {
59 self.input.apply(
60 &self.config,
61 &mut self.memory,
62 sensors,
63 ctx,
64 lifecycle_status,
65 motor,
66 )
67 }
68
69 fn influence_basis(
70 &self,
71 ctx: TnuaBasisContext,
72 basis_input: &B,
73 basis_config: &<B as TnuaBasis>::Config,
74 basis_memory: &mut <B as TnuaBasis>::Memory,
75 ) {
76 self.input.influence_basis(
77 &self.config,
78 &self.memory,
79 ctx,
80 basis_input,
81 basis_config,
82 basis_memory,
83 );
84 }
85}