#![allow(dead_code)]
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum BlendTreeNodeType {
Clip,
Blend1D,
Blend2D,
AdditiveBlend,
StateMachine,
}
#[derive(Debug, Clone)]
pub struct BlendTreeNode {
pub id: u32,
pub node_type: BlendTreeNodeType,
pub label: String,
pub position: [f32; 2],
pub weight: f32,
}
#[derive(Debug, Clone)]
pub struct BlendTreeGraphView {
pub nodes: Vec<BlendTreeNode>,
pub show_weights: bool,
pub zoom: f32,
pub pan: [f32; 2],
pub enabled: bool,
}
impl BlendTreeGraphView {
pub fn new() -> Self {
BlendTreeGraphView {
nodes: Vec::new(),
show_weights: true,
zoom: 1.0,
pan: [0.0, 0.0],
enabled: true,
}
}
}
impl Default for BlendTreeGraphView {
fn default() -> Self {
Self::new()
}
}
pub fn new_blend_tree_graph_view() -> BlendTreeGraphView {
BlendTreeGraphView::new()
}
pub fn btgv_add_node(view: &mut BlendTreeGraphView, node: BlendTreeNode) {
view.nodes.push(node);
}
pub fn btgv_clear(view: &mut BlendTreeGraphView) {
view.nodes.clear();
}
pub fn btgv_set_zoom(view: &mut BlendTreeGraphView, zoom: f32) {
view.zoom = zoom.max(0.05);
}
pub fn btgv_set_pan(view: &mut BlendTreeGraphView, pan: [f32; 2]) {
view.pan = pan;
}
pub fn btgv_show_weights(view: &mut BlendTreeGraphView, show: bool) {
view.show_weights = show;
}
pub fn btgv_set_enabled(view: &mut BlendTreeGraphView, enabled: bool) {
view.enabled = enabled;
}
pub fn btgv_node_count(view: &BlendTreeGraphView) -> usize {
view.nodes.len()
}
pub fn btgv_to_json(view: &BlendTreeGraphView) -> String {
format!(
r#"{{"node_count":{},"show_weights":{},"zoom":{},"enabled":{}}}"#,
view.nodes.len(),
view.show_weights,
view.zoom,
view.enabled
)
}
#[cfg(test)]
mod tests {
use super::*;
fn make_node(id: u32) -> BlendTreeNode {
BlendTreeNode {
id,
node_type: BlendTreeNodeType::Clip,
label: "run".to_string(),
position: [0.0, 0.0],
weight: 1.0,
}
}
#[test]
fn test_initial_empty() {
let v = new_blend_tree_graph_view();
assert_eq!(btgv_node_count(&v), 0 );
}
#[test]
fn test_add_node() {
let mut v = new_blend_tree_graph_view();
btgv_add_node(&mut v, make_node(0));
assert_eq!(btgv_node_count(&v), 1 );
}
#[test]
fn test_clear() {
let mut v = new_blend_tree_graph_view();
btgv_add_node(&mut v, make_node(0));
btgv_clear(&mut v);
assert_eq!(btgv_node_count(&v), 0 );
}
#[test]
fn test_zoom_min() {
let mut v = new_blend_tree_graph_view();
btgv_set_zoom(&mut v, 0.0);
assert!((v.zoom - 0.05).abs() < 1e-6 );
}
#[test]
fn test_set_pan() {
let mut v = new_blend_tree_graph_view();
btgv_set_pan(&mut v, [100.0, -50.0]);
assert!((v.pan[0] - 100.0).abs() < 1e-6 );
}
#[test]
fn test_show_weights() {
let mut v = new_blend_tree_graph_view();
btgv_show_weights(&mut v, false);
assert!(!v.show_weights );
}
#[test]
fn test_set_enabled() {
let mut v = new_blend_tree_graph_view();
btgv_set_enabled(&mut v, false);
assert!(!v.enabled );
}
#[test]
fn test_to_json_has_node_count() {
let v = new_blend_tree_graph_view();
let j = btgv_to_json(&v);
assert!(j.contains("\"node_count\"") );
}
#[test]
fn test_enabled_default() {
let v = new_blend_tree_graph_view();
assert!(v.enabled );
}
}