dioxus_spline/
speobject.rs1use 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}