node_engine 0.7.0

Node graph engine for Shader graph or Geometry graph.
Documentation
use anyhow::{anyhow, Result};

use crate::*;

impl ValueType for bool {
  fn clone_value(&self) -> Box<dyn ValueType> {
    Box::new(self.clone())
  }

  fn to_value(&self) -> Value {
    if *self {
      Value::U32(1)
    } else {
      Value::U32(0)
    }
  }

  fn set_value(&mut self, value: Value) -> Result<()> {
    let val: u32 = match value {
      Value::I32(v) => v as _,
      Value::U32(v) => v,
      Value::F32(v) => v as _,
      Value::Vec2(v) => v.x as _,
      Value::Vec3(v) => v.x as _,
      Value::Vec4(v) => v.x as _,
      _ => return Err(anyhow!("Expected a boolean value got: {value:?}")),
    };
    *self = val == 1;
    Ok(())
  }

  fn data_type(&self) -> DataType {
    DataType::U32
  }

  #[cfg(feature = "egui")]
  fn ui(&mut self, ui: &mut egui::Ui) -> bool {
    ui.checkbox(self, "bool").changed()
  }
}

impl ValueType for i32 {
  fn clone_value(&self) -> Box<dyn ValueType> {
    Box::new(self.clone())
  }

  fn to_value(&self) -> Value {
    Value::I32(*self)
  }

  fn set_value(&mut self, value: Value) -> Result<()> {
    match value {
      Value::I32(v) => {
        *self = v;
        Ok(())
      }
      Value::U32(v) => {
        *self = v as _;
        Ok(())
      }
      Value::F32(v) => {
        *self = v as _;
        Ok(())
      }
      Value::Vec2(v) => {
        *self = v.x as _;
        Ok(())
      }
      Value::Vec3(v) => {
        *self = v.x as _;
        Ok(())
      }
      Value::Vec4(v) => {
        *self = v.x as _;
        Ok(())
      }
      _ => Err(anyhow!("Expected a I32 got: {value:?}")),
    }
  }

  fn data_type(&self) -> DataType {
    DataType::I32
  }

  #[cfg(feature = "egui")]
  fn ui(&mut self, ui: &mut egui::Ui) -> bool {
    ui.add(egui::DragValue::new(self).speed(1)).changed()
  }
}

impl ValueType for u32 {
  fn clone_value(&self) -> Box<dyn ValueType> {
    Box::new(self.clone())
  }

  fn to_value(&self) -> Value {
    Value::U32(*self)
  }

  fn set_value(&mut self, value: Value) -> Result<()> {
    match value {
      Value::I32(v) => {
        *self = v as _;
        Ok(())
      }
      Value::U32(v) => {
        *self = v;
        Ok(())
      }
      Value::F32(v) => {
        *self = v as _;
        Ok(())
      }
      Value::Vec2(v) => {
        *self = v.x as _;
        Ok(())
      }
      Value::Vec3(v) => {
        *self = v.x as _;
        Ok(())
      }
      Value::Vec4(v) => {
        *self = v.x as _;
        Ok(())
      }
      _ => Err(anyhow!("Expected a U32 got: {value:?}")),
    }
  }

  fn data_type(&self) -> DataType {
    DataType::U32
  }

  #[cfg(feature = "egui")]
  fn ui(&mut self, ui: &mut egui::Ui) -> bool {
    ui.add(egui::DragValue::new(self).speed(1)).changed()
  }
}

impl ValueType for f32 {
  fn clone_value(&self) -> Box<dyn ValueType> {
    Box::new(self.clone())
  }

  fn to_value(&self) -> Value {
    Value::F32(*self)
  }

  fn set_value(&mut self, value: Value) -> Result<()> {
    match value {
      Value::I32(v) => {
        *self = v as _;
        Ok(())
      }
      Value::U32(v) => {
        *self = v as _;
        Ok(())
      }
      Value::F32(v) => {
        *self = v;
        Ok(())
      }
      Value::Vec2(v) => {
        *self = v.x as _;
        Ok(())
      }
      Value::Vec3(v) => {
        *self = v.x as _;
        Ok(())
      }
      Value::Vec4(v) => {
        *self = v.x as _;
        Ok(())
      }
      _ => Err(anyhow!("Expected a F32 got: {value:?}")),
    }
  }

  fn data_type(&self) -> DataType {
    DataType::F32
  }

  #[cfg(feature = "egui")]
  fn ui(&mut self, ui: &mut egui::Ui) -> bool {
    ui.add(egui::DragValue::new(self).speed(0.1)).changed()
  }
}