neo_babylon/
shapes.rs

1use js_sys::{Promise, Array};
2use crate::prelude::*;
3
4#[wasm_bindgen]
5extern "C" {
6    type MeshBuilder;
7
8    #[wasm_bindgen(static_method_of = MeshBuilder, js_namespace = BABYLON)]
9    fn CreateSphere(name: &str, options: SphereOptions, scene: &Scene) -> Mesh;
10
11    #[wasm_bindgen(static_method_of = MeshBuilder, js_namespace = BABYLON)]
12    fn CreateBox(name: &str, options: BoxOptions, scene: &Scene) -> Mesh;
13}
14
15#[wasm_bindgen]
16#[derive(Default)]
17pub struct SphereOptions {
18    pub arc: Option<f64>,
19    pub diameter: Option<f64>,
20    pub diameterX: Option<f64>,
21    pub diameterY: Option<f64>,
22    pub diameterZ: Option<f64>,
23    pub segments: Option<f64>,
24    pub sideOrientation: Option<f64>,
25    pub slice: Option<f64>,
26    pub updatable: Option<bool>,
27}
28
29#[wasm_bindgen]
30#[derive(Default)]
31pub struct BoxOptions {
32    pub bottomBaseAt: Option<f64>,
33    pub depth: Option<f64>,
34    pub height: Option<f64>,
35    pub sideOrientation: Option<f64>,
36    pub size: Option<f64>,
37    pub topBaseAt: Option<f64>,
38    pub updatable: Option<bool>,
39    pub width: Option<f64>,
40    pub wrap: Option<bool>,
41}
42
43#[wasm_bindgen]
44extern "C" {
45    pub(crate) type SceneLoader;
46
47    #[wasm_bindgen(static_method_of = SceneLoader, js_namespace = BABYLON)]
48    pub(crate) fn ImportMeshAsync(meshNames: Option<&str>, rootUrl: &str, sceneFilename: &str, scene: Option<&Scene>) -> Promise;
49}
50
51impl BabylonMesh {
52    pub fn create_sphere(scene: &Scene, name: &str, options: SphereOptions) -> BabylonMesh {
53        BabylonMesh {
54            mesh: MeshBuilder::CreateSphere(name, options, scene),
55        }
56    }
57
58    pub fn create_box(scene: &Scene, name: &str, options: BoxOptions) -> BabylonMesh {
59        BabylonMesh {
60            mesh: MeshBuilder::CreateBox(name, options, scene),
61        }
62    }
63
64    pub async fn create_gltf(scene: &Scene, name: &str, file: &str) -> Result<BabylonMesh, JsValue> {
65        let dummy = Mesh::new(name, scene.into());
66        let promise = SceneLoader::ImportMeshAsync(None, "", file, scene.into());
67        let import = wasm_bindgen_futures::JsFuture::from(promise);
68
69        let import_result = import.await?;
70
71        let imported_meshes = &Reflect::get(&import_result, &JsValue::from_str("meshes"))?;
72        let imported_meshes_array = imported_meshes.unchecked_ref::<Array>();
73
74        for val in imported_meshes_array.iter() { 
75            let mesh: &Mesh = val.unchecked_ref::<Mesh>();
76            mesh.set_parent(&dummy);
77        }
78
79        Ok(BabylonMesh {
80            mesh: dummy,
81        })
82    }
83}