use std::collections::BTreeSet; /* DEBUG */ use sycamore::prelude::*; use web_sys::{console, wasm_bindgen::JsValue}; use crate::{engine, AppState, assembly::{Assembly, Constraint, Element}}; /* DEBUG */ fn load_gen_assemb(assembly: &Assembly) { let _ = assembly.try_insert_element( Element { id: String::from("gemini_a"), label: String::from("Castor"), color: [1.00_f32, 0.25_f32, 0.00_f32], representation: engine::sphere(0.5, 0.5, 0.0, 1.0), constraints: BTreeSet::default(), index: 0 } ); let _ = assembly.try_insert_element( Element { id: String::from("gemini_b"), label: String::from("Pollux"), color: [0.00_f32, 0.25_f32, 1.00_f32], representation: engine::sphere(-0.5, -0.5, 0.0, 1.0), constraints: BTreeSet::default(), index: 0 } ); let _ = assembly.try_insert_element( Element { id: String::from("ursa_major"), label: String::from("Ursa major"), color: [0.25_f32, 0.00_f32, 1.00_f32], representation: engine::sphere(-0.5, 0.5, 0.0, 0.75), constraints: BTreeSet::default(), index: 0 } ); let _ = assembly.try_insert_element( Element { id: String::from("ursa_minor"), label: String::from("Ursa minor"), color: [0.25_f32, 1.00_f32, 0.00_f32], representation: engine::sphere(0.5, -0.5, 0.0, 0.5), constraints: BTreeSet::default(), index: 0 } ); let _ = assembly.try_insert_element( Element { id: String::from("moon_deimos"), label: String::from("Deimos"), color: [0.75_f32, 0.75_f32, 0.00_f32], representation: engine::sphere(0.0, 0.15, 1.0, 0.25), constraints: BTreeSet::default(), index: 0 } ); let _ = assembly.try_insert_element( Element { id: String::from("moon_phobos"), label: String::from("Phobos"), color: [0.00_f32, 0.75_f32, 0.50_f32], representation: engine::sphere(0.0, -0.15, -1.0, 0.25), constraints: BTreeSet::default(), index: 0 } ); } /* DEBUG */ fn load_low_curv_assemb(assembly: &Assembly) { let a = 0.75_f64.sqrt(); let _ = assembly.try_insert_element( Element { id: "central".to_string(), label: "Central".to_string(), color: [0.75_f32, 0.75_f32, 0.75_f32], representation: engine::sphere(0.0, 0.0, 0.0, 1.0), constraints: BTreeSet::default(), index: 0 } ); let _ = assembly.try_insert_element( Element { id: "assemb_plane".to_string(), label: "Assembly plane".to_string(), color: [0.75_f32, 0.75_f32, 0.75_f32], representation: engine::sphere_with_offset(0.0, 0.0, 1.0, 0.0, 0.0), constraints: BTreeSet::default(), index: 0 } ); let _ = assembly.try_insert_element( Element { id: "side1".to_string(), label: "Side 1".to_string(), color: [1.00_f32, 0.00_f32, 0.25_f32], representation: engine::sphere_with_offset(1.0, 0.0, 0.0, 1.0, 0.0), constraints: BTreeSet::default(), index: 0 } ); let _ = assembly.try_insert_element( Element { id: "side2".to_string(), label: "Side 2".to_string(), color: [0.25_f32, 1.00_f32, 0.00_f32], representation: engine::sphere_with_offset(-0.5, a, 0.0, 1.0, 0.0), constraints: BTreeSet::default(), index: 0 } ); let _ = assembly.try_insert_element( Element { id: "side3".to_string(), label: "Side 3".to_string(), color: [0.00_f32, 0.25_f32, 1.00_f32], representation: engine::sphere_with_offset(-0.5, -a, 0.0, 1.0, 0.0), constraints: BTreeSet::default(), index: 0 } ); let _ = assembly.try_insert_element( Element { id: "corner1".to_string(), label: "Corner 1".to_string(), color: [0.75_f32, 0.75_f32, 0.75_f32], representation: engine::sphere(-4.0/3.0, 0.0, 0.0, 1.0/3.0), constraints: BTreeSet::default(), index: 0 } ); let _ = assembly.try_insert_element( Element { id: "corner2".to_string(), label: "Corner 2".to_string(), color: [0.75_f32, 0.75_f32, 0.75_f32], representation: engine::sphere(2.0/3.0, -4.0/3.0 * a, 0.0, 1.0/3.0), constraints: BTreeSet::default(), index: 0 } ); let _ = assembly.try_insert_element( Element { id: String::from("corner3"), label: String::from("Corner 3"), color: [0.75_f32, 0.75_f32, 0.75_f32], representation: engine::sphere(2.0/3.0, 4.0/3.0 * a, 0.0, 1.0/3.0), constraints: BTreeSet::default(), index: 0 } ); } #[component] pub fn AddRemove() -> View { /* DEBUG */ let assembly_name = create_signal("general".to_string()); create_effect(move || { // get name of chosen assembly let name = assembly_name.get_clone(); console::log_1( &JsValue::from(format!("Showing assembly \"{}\"", name.clone())) ); batch(|| { let state = use_context::(); let assembly = &state.assembly; // clear state assembly.elements.update(|elts| elts.clear()); assembly.elements_by_id.update(|elts_by_id| elts_by_id.clear()); state.selection.update(|sel| sel.clear()); // load assembly match name.as_str() { "general" => load_gen_assemb(assembly), "low-curv" => load_low_curv_assemb(assembly), _ => () }; }); }); view! { div(id="add-remove") { button( on:click=|_| { let state = use_context::(); state.assembly.insert_new_element(); /* DEBUG */ // print updated list of elements by identifier console::log_1(&JsValue::from("elements by identifier:")); for (id, key) in state.assembly.elements_by_id.get_clone().iter() { console::log_3( &JsValue::from(" "), &JsValue::from(id), &JsValue::from(*key) ); } } ) { "+" } button( disabled={ let state = use_context::(); state.selection.with(|sel| sel.len() != 2) }, on:click=|_| { let state = use_context::(); let subjects = state.selection.with( |sel| { let subject_vec: Vec<_> = sel.into_iter().collect(); (subject_vec[0].clone(), subject_vec[1].clone()) } ); let rep = create_signal(0.0); let active = create_signal(true); state.assembly.insert_constraint(Constraint { subjects: subjects, rep: rep, rep_text: create_signal(String::new()), rep_valid: create_signal(false), active: active, }); state.assembly.realize(); state.selection.update(|sel| sel.clear()); /* DEBUG */ // print updated constraint list console::log_1(&JsValue::from("Constraints:")); state.assembly.constraints.with(|csts| { for (_, cst) in csts.into_iter() { console::log_5( &JsValue::from(" "), &JsValue::from(cst.subjects.0), &JsValue::from(cst.subjects.1), &JsValue::from(":"), &JsValue::from(cst.rep.get_untracked()) ); } }); // update the realization when the constraint activated, or // edited while active create_effect(move || { rep.track(); console::log_2( &JsValue::from("Lorentz product updated to"), &JsValue::from(rep.get_untracked()) ); if active.get() { state.assembly.realize(); } }); } ) { "🔗" } select(bind:value=assembly_name) { /* DEBUG */ option(value="general") { "General" } option(value="low-curv") { "Low-curvature" } } } } }