use std::any::Any;
use glam::{Mat4, Vec3};
use crate::pick::PickResult;
use crate::quantity::Quantity;
pub trait Structure: Any + Send + Sync {
fn as_any(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;
fn name(&self) -> &str;
fn type_name(&self) -> &'static str;
fn bounding_box(&self) -> Option<(Vec3, Vec3)>;
fn length_scale(&self) -> f32;
fn transform(&self) -> Mat4;
fn set_transform(&mut self, transform: Mat4);
fn is_enabled(&self) -> bool;
fn set_enabled(&mut self, enabled: bool);
fn draw(&self, ctx: &mut dyn RenderContext);
fn draw_pick(&self, ctx: &mut dyn RenderContext);
fn build_ui(&mut self, ui: &dyn std::any::Any);
fn build_pick_ui(&self, ui: &dyn std::any::Any, pick: &PickResult);
fn refresh(&mut self);
fn center_bounding_box(&mut self) {
}
fn reset_transform(&mut self) {
self.set_transform(Mat4::IDENTITY);
}
fn clear_gpu_resources(&mut self) {
}
#[allow(clippy::unnecessary_literal_bound)]
fn material(&self) -> &str {
"clay"
}
fn set_material(&mut self, _material: &str) {
}
}
pub trait HasQuantities: Structure {
fn add_quantity(&mut self, quantity: Box<dyn Quantity>);
fn get_quantity(&self, name: &str) -> Option<&dyn Quantity>;
fn get_quantity_mut(&mut self, name: &str) -> Option<&mut Box<dyn Quantity>>;
fn remove_quantity(&mut self, name: &str) -> Option<Box<dyn Quantity>>;
fn quantities(&self) -> &[Box<dyn Quantity>];
fn num_quantities(&self) -> usize {
self.quantities().len()
}
}
pub trait RenderContext: Send + Sync {}