diff --git a/crates/bevy_animation_graph/src/core/animation_graph/loader.rs b/crates/bevy_animation_graph/src/core/animation_graph/loader.rs index 519e547..56719e5 100644 --- a/crates/bevy_animation_graph/src/core/animation_graph/loader.rs +++ b/crates/bevy_animation_graph/src/core/animation_graph/loader.rs @@ -5,9 +5,9 @@ use super::{ use crate::{ core::{animation_clip::GraphClip, errors::AssetLoaderError}, nodes::{ - AbsF32, AddF32, BlendNode, ChainNode, ClampF32, ClipNode, CompareF32, ConstBool, DivF32, - FSMNode, FireEventNode, FlipLRNode, GraphNode, LoopNode, MulF32, PaddingNode, - RotationArcNode, RotationNode, SpeedNode, SubF32, TwoBoneIKNode, + AbsF32, AddF32, BlendNode, BuildVec3Node, ChainNode, ClampF32, ClipNode, CompareF32, + ConstBool, DivF32, FSMNode, FireEventNode, FlipLRNode, GraphNode, LoopNode, MulF32, + PaddingNode, RotationArcNode, RotationNode, SpeedNode, SubF32, TwoBoneIKNode, }, prelude::DummyNode, }; @@ -192,6 +192,9 @@ impl AssetLoader for AnimationGraphLoader { AnimationNodeTypeSerial::Padding { interpolation_period, } => PaddingNode::new(*interpolation_period).wrapped(&serial_node.name), + AnimationNodeTypeSerial::BuildVec3() => { + BuildVec3Node::new().wrapped(&serial_node.name) + } }; graph.add_node(node); } diff --git a/crates/bevy_animation_graph/src/core/animation_graph/serial.rs b/crates/bevy_animation_graph/src/core/animation_graph/serial.rs index a601999..4617888 100644 --- a/crates/bevy_animation_graph/src/core/animation_graph/serial.rs +++ b/crates/bevy_animation_graph/src/core/animation_graph/serial.rs @@ -90,6 +90,7 @@ pub enum AnimationNodeTypeSerial { CompareF32(CompareOp), AbsF32, ConstBool(bool), + BuildVec3(), RotationArc, FireEvent(AnimationEvent), // IntoBoneSpace, @@ -182,6 +183,7 @@ impl From<&AnimationNodeType> for AnimationNodeTypeSerial { AnimationNodeType::CompareF32(n) => AnimationNodeTypeSerial::CompareF32(n.op), AnimationNodeType::AbsF32(_) => AnimationNodeTypeSerial::AbsF32, AnimationNodeType::ConstBool(n) => AnimationNodeTypeSerial::ConstBool(n.constant), + AnimationNodeType::BuildVec3(_) => AnimationNodeTypeSerial::BuildVec3(), AnimationNodeType::RotationArc(_) => AnimationNodeTypeSerial::RotationArc, AnimationNodeType::Fsm(n) => { AnimationNodeTypeSerial::Fsm(n.fsm.path().unwrap().to_string()) diff --git a/crates/bevy_animation_graph/src/core/animation_node.rs b/crates/bevy_animation_graph/src/core/animation_node.rs index 0e97194..ce1b200 100644 --- a/crates/bevy_animation_graph/src/core/animation_node.rs +++ b/crates/bevy_animation_graph/src/core/animation_node.rs @@ -5,9 +5,9 @@ use super::{ }; use crate::{ nodes::{ - AbsF32, AddF32, BlendNode, ChainNode, ClampF32, ClipNode, CompareF32, ConstBool, DivF32, - DummyNode, FSMNode, FireEventNode, FlipLRNode, GraphNode, LoopNode, MulF32, PaddingNode, - RotationArcNode, RotationNode, SpeedNode, SubF32, TwoBoneIKNode, + AbsF32, AddF32, BlendNode, BuildVec3Node, ChainNode, ClampF32, ClipNode, CompareF32, + ConstBool, DivF32, DummyNode, FSMNode, FireEventNode, FlipLRNode, GraphNode, LoopNode, + MulF32, PaddingNode, RotationArcNode, RotationNode, SpeedNode, SubF32, TwoBoneIKNode, }, prelude::{PassContext, SpecContext}, }; @@ -204,6 +204,7 @@ pub enum AnimationNodeType { // --- Vec3 arithmetic nodes // ------------------------------------------------ RotationArc(RotationArcNode), + BuildVec3(BuildVec3Node), // ------------------------------------------------ Fsm(#[reflect(ignore)] FSMNode), // HACK: needs to be ignored for now due to: @@ -241,6 +242,7 @@ impl AnimationNodeType { AnimationNodeType::CompareF32(n) => f(n), AnimationNodeType::AbsF32(n) => f(n), AnimationNodeType::ConstBool(n) => f(n), + AnimationNodeType::BuildVec3(n) => f(n), AnimationNodeType::RotationArc(n) => f(n), AnimationNodeType::Fsm(n) => f(n), AnimationNodeType::Graph(n) => f(n), @@ -276,6 +278,7 @@ impl AnimationNodeType { AnimationNodeType::CompareF32(n) => f(n), AnimationNodeType::AbsF32(n) => f(n), AnimationNodeType::ConstBool(n) => f(n), + AnimationNodeType::BuildVec3(n) => f(n), AnimationNodeType::RotationArc(n) => f(n), AnimationNodeType::Fsm(n) => f(n), AnimationNodeType::Graph(n) => f(n), @@ -317,6 +320,7 @@ impl AnimationNodeType { AnimationNodeType::CompareF32(n) => n, AnimationNodeType::AbsF32(n) => n, AnimationNodeType::ConstBool(n) => n, + AnimationNodeType::BuildVec3(n) => n, AnimationNodeType::RotationArc(n) => n, AnimationNodeType::Fsm(n) => n, AnimationNodeType::Graph(n) => n, diff --git a/crates/bevy_animation_graph/src/nodes/arithmetic/vec3/from_f32.rs b/crates/bevy_animation_graph/src/nodes/arithmetic/vec3/from_f32.rs new file mode 100644 index 0000000..d6c8444 --- /dev/null +++ b/crates/bevy_animation_graph/src/nodes/arithmetic/vec3/from_f32.rs @@ -0,0 +1,55 @@ +use crate::core::animation_graph::PinMap; +use crate::core::animation_node::{AnimationNode, AnimationNodeType, NodeLike}; +use crate::core::errors::GraphError; +use crate::core::prelude::DataSpec; +use crate::prelude::{PassContext, SpecContext}; +use crate::utils::unwrap::UnwrapVal; +use bevy::prelude::*; + +#[derive(Reflect, Clone, Debug, Default)] +#[reflect(Default)] +pub struct BuildVec3Node {} + +impl BuildVec3Node { + pub const INPUT_X: &'static str = "x"; + pub const INPUT_Y: &'static str = "y"; + pub const INPUT_Z: &'static str = "z"; + pub const OUTPUT: &'static str = "vec"; + + pub fn new() -> Self { + Self {} + } + + pub fn wrapped(self, name: impl Into) -> AnimationNode { + AnimationNode::new_from_nodetype(name.into(), AnimationNodeType::BuildVec3(self)) + } +} + +impl NodeLike for BuildVec3Node { + fn update(&self, mut ctx: PassContext) -> Result<(), GraphError> { + let x: f32 = ctx.data_back(Self::INPUT_X)?.val(); + let y: f32 = ctx.data_back(Self::INPUT_X)?.val(); + let z: f32 = ctx.data_back(Self::INPUT_X)?.val(); + + ctx.set_data_fwd(Self::OUTPUT, Vec3::new(x, y, z)); + + Ok(()) + } + + fn data_input_spec(&self, _: SpecContext) -> PinMap { + [ + (Self::INPUT_X.into(), DataSpec::F32), + (Self::INPUT_Y.into(), DataSpec::F32), + (Self::INPUT_Z.into(), DataSpec::F32), + ] + .into() + } + + fn data_output_spec(&self, _: SpecContext) -> PinMap { + [(Self::OUTPUT.into(), DataSpec::Vec3)].into() + } + + fn display_name(&self) -> String { + "Build Vec3".into() + } +} diff --git a/crates/bevy_animation_graph/src/nodes/arithmetic/vec3/mod.rs b/crates/bevy_animation_graph/src/nodes/arithmetic/vec3/mod.rs index 7539e4c..0de200b 100644 --- a/crates/bevy_animation_graph/src/nodes/arithmetic/vec3/mod.rs +++ b/crates/bevy_animation_graph/src/nodes/arithmetic/vec3/mod.rs @@ -1,3 +1,5 @@ +mod from_f32; mod rotation_arc; +pub use from_f32::*; pub use rotation_arc::*;