dioxus_spline/
speobject.rs

1use js_sys::{Object, Reflect};
2use wasm_bindgen::JsValue;
3
4#[derive(Debug, Clone, PartialEq)]
5pub struct SPEObject {
6    inner: JsValue,
7    pub position: SPEVector3,
8    pub scale: SPEVector3,
9}
10
11impl SPEObject {
12    pub fn new(obj: JsValue) -> SPEObject {
13        let position = Reflect::get(&obj, &"position".into())
14            .ok()
15            .map(SPEVector3::from_jsvalue)
16            .unwrap_or_else(|| SPEVector3::new(0.0, 0.0, 0.0));
17        let scale = Reflect::get(&obj, &"scale".into())
18            .ok()
19            .map(SPEVector3::from_jsvalue)
20            .unwrap_or_else(|| SPEVector3::new(1.0, 1.0, 1.0));
21        SPEObject {
22            inner: obj,
23            position,
24            scale,
25        }
26    }
27}
28
29#[derive(Debug, Clone, PartialEq)]
30pub struct SPEVector3 {
31    inner: JsValue,
32    pub x: f64,
33    pub y: f64,
34    pub z: f64,
35}
36
37impl SPEVector3 {
38    fn new(x: f64, y: f64, z: f64) -> SPEVector3 {
39        let obj = Object::new();
40        SPEVector3 {
41            inner: obj.into(),
42            x,
43            y,
44            z,
45        }
46    }
47
48    fn from_jsvalue(value: JsValue) -> SPEVector3 {
49        let x = Reflect::get(&value, &"x".into())
50            .expect("Did not receive x")
51            .as_f64()
52            .expect("x is not a f64");
53        let y = Reflect::get(&value, &"y".into())
54            .expect("Did not receive y")
55            .as_f64()
56            .expect("y is not a f64");
57        let z = Reflect::get(&value, &"z".into())
58            .expect("Did not receive z")
59            .as_f64()
60            .expect("z is not a f64");
61        SPEVector3 {
62            inner: value,
63            x,
64            y,
65            z,
66        }
67    }
68
69    fn update_js_fields(&self) {
70        Reflect::set(&self.inner, &"x".into(), &self.x.into()).unwrap();
71        Reflect::set(&self.inner, &"y".into(), &self.y.into()).unwrap();
72        Reflect::set(&self.inner, &"z".into(), &self.z.into()).unwrap();
73    }
74}
75
76impl Drop for SPEVector3 {
77    fn drop(&mut self) {
78        self.update_js_fields();
79    }
80}