//! # llimphi-voxel-studio — el creador de mundos, con interfaz //! //! Editor por **niveles de composición**: Leyes → Materiales → Seres → Biomas → //! Mundos → Escenas. Cada nivel tiene su lista de items **creables, editables, //! renombrables, borrables y duplicables**, su editor a la derecha y (donde aplica) //! preview 3D en vivo. La jerarquía vive en el [`Project`] agnóstico de //! `llimphi-voxel`; esta app sólo la pinta. //! //! ```bash //! cargo run -p llimphi-voxel-studio --release # ventana interactiva //! cargo run -p llimphi-voxel-studio --release -- --shot # PNG headless a /tmp //! ``` use std::sync::{Arc, Mutex}; use std::time::Duration; use llimphi_3d::glam::{Mat4, Vec3}; use llimphi_3d::{push_cube, Atmosphere, Camera3d, VoxelGrid}; use llimphi_icons::{icon_view, Icon}; use llimphi_theme::Theme; use llimphi_ui::llimphi_layout::taffy::prelude::{ auto, length, percent, AlignItems, Dimension, FlexDirection, Position, Size, Style, }; use llimphi_ui::llimphi_raster::peniko::Color; use llimphi_ui::{ App, DragPhase, Handle, Key, KeyEvent, KeyState, Modifiers, NamedKey, View, WheelDelta, }; use llimphi_voxel::{ forward_h, hex_corto, right_h, window_origin_for_cast, world_dim, ActorKeySpec, ActorScript, ActorSpec, Age, BinOp, Bioma, Documento, Historia, Player, Suceso, TipoSuceso, BiomaPalette, CharSpec, Clip, FieldDef, FieldEngine, Forma, Impulso, LeyKind, LeyUso, MatRole, Material, MaterialDef, Mundo, MundoRender, ParamDef, Primitiva, Program, Project, Reduce, SceneSpec, ShotKind, ShotSpec, UnOp, PREVIEW_DIM_XZ, Mineral, MineralUso, Mueble, Interior, Cutaway, CasaTipo, CasaUso, PuebloTipo, Bicho, BichoUso, Cielo, Decorado, Peinado, Sombrero, Utileria, UtileriaSpec, }; use pixel_verbo_core::Proveedor; use pixel_verbo_daemon::ClienteBloqueante; use llimphi_widget_button::{button_view, ButtonPalette}; use llimphi_widget_rag_sidebar::{ rag_multiselect_view, rag_sidebar_view, RagOptions, RagSidebarMsg, RagSidebarPalette, RagSidebarState, RagSidebarView, RagSide, RagTooth, }; use llimphi_widget_slider::{slider_view, SliderPalette}; use llimphi_clipboard::SystemClipboard; use llimphi_widget_text_input::{ text_input_view_full, TextInputEvent, TextInputPalette, TextInputState, }; use llimphi_widget_nodegraph::{nodegraph_view_ex, NodeId, NodegraphMetrics, NodegraphPalette, PinIdx}; use llimphi_image::{from_rgba8, Image}; use graph::{EqGraph, NodeOp}; mod ai; mod graph; mod mapa_import; // El preview 3D y el bucle de cuadro viven en `llimphi-voxel-render`: los // comparte con el taller de películas (`ende`), que filma con el MISMO // código con el que este editor muestra. Si fueran dos, divergirían. pub(crate) use llimphi_voxel_render::preview; mod render; mod rostro; mod shot; mod soundtrack; use ai::MatRefs; use preview::WorldPreview; /// Dónde se guarda/carga el proyecto (relativo al cwd). const PROJECT_PATH: &str = "voxel-studio.ron"; /// Dónde persiste la HISTORIA (DAG de versiones/alternativas). const HISTORY_PATH: &str = "voxel-studio.voxdag"; /// Paso de tiempo de la reproducción de escenas (~30 fps). const DT: f32 = 1.0 / 30.0; /// Ancho de la tira de dientes de un sidebar unificado (px). const RAIL_W: f32 = 46.0; /// Lado de la grilla 2D del **laboratorio de leyes** (petri dish del nivel Leyes). const LAB_DIM: u32 = 64; /// Sub‑pasos del laboratorio por cuadro (la reacción‑difusión evoluciona lento). const LAB_SUBSTEPS: usize = 4; /// Tolerancia por canal para clasificar las celdas de un material en el mundo (el /// terreno lleva grano que varía el color base; el agua no). Ver [`EcuacionSim`]. const ECUACION_TOL: i32 = 28; // El corte en piezas es del 26-ago: esto era un solo `main.rs` de 4.907 líneas. // El `update` vive aparte de su propio `impl App` porque un trait admite un solo // bloque por tipo: el impl delega en una línea. mod actualizar; mod app; mod arranque; mod editores; mod helpers; mod items; mod lab; mod lienzo; mod modelo; mod vista; #[cfg(test)] mod pruebas; use actualizar::*; use app::*; use arranque::main_de_verdad; use editores::*; use helpers::*; use items::*; use lab::*; use lienzo::*; use modelo::*; use vista::*; fn main() { main_de_verdad() }