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}