From 88c059a607f3911785aee7f37a2cc7b5e672967a Mon Sep 17 00:00:00 2001 From: celyk <50609684+celyk@users.noreply.github.com> Date: Tue, 8 Jul 2025 07:48:22 +1000 Subject: [PATCH] Add Normalize and Length nodes (#2837) * Add vector length node * Add normalize node * Add comments * Make normalize node safer for the user --- node-graph/gmath-nodes/src/lib.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/node-graph/gmath-nodes/src/lib.rs b/node-graph/gmath-nodes/src/lib.rs index c4d1b9a1..1019506b 100644 --- a/node-graph/gmath-nodes/src/lib.rs +++ b/node-graph/gmath-nodes/src/lib.rs @@ -612,6 +612,20 @@ fn dot_product(_: impl Ctx, vector_a: DVec2, vector_b: DVec2) -> f64 { vector_a.dot(vector_b) } +/// Gets the length or magnitude of a vector. +#[node_macro::node(category("Math: Vector"))] +fn length(_: impl Ctx, vector: DVec2) -> f64 { + vector.length() +} + +/// Scales the input vector to unit length while preserving it's direction. This is equivalent to dividing the input vector by it's own magnitude. +/// +/// Returns zero when the input vector is zero. +#[node_macro::node(category("Math: Vector"))] +fn normalize(_: impl Ctx, vector: DVec2) -> DVec2 { + vector.normalize_or_zero() +} + #[cfg(test)] mod test { use super::*; @@ -625,6 +639,12 @@ mod test { assert_eq!(dot_product((), vector_a, vector_b), 11.); } + #[test] + pub fn length_function() { + let vector = DVec2::new(3., 4.); + assert_eq!(length((), vector), 5.); + } + #[test] fn test_basic_expression() { let result = math((), 0., "2 + 2".to_string(), 0.);