bevy_tnua/
action_state.rs

1use 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/// The full state of a single [`TnuaAction`].
8///
9/// These are used in the variants of the [action state enum](crate::TnuaScheme::ActionState),
10/// created automatically by [the `TnuaScheme` derive](bevy_tnua_macros::TnuaScheme).
11#[derive(Serialize, Deserialize)]
12pub struct TnuaActionState<A: TnuaAction<B>, B: TnuaBasis> {
13    /// The data that the user control system feeds to the
14    /// [`TnuaController`](crate::TnuaController).
15    pub input: A,
16    /// The action configuration, retrieved from an asset.
17    pub config: A::Config,
18    /// Initiated when the action starts, and gets updated by the action itself.
19    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}