use vertra::camera::Camera;
use vertra::geometry::Geometry;
use vertra::objects::Object;
use vertra::transform::Transform;
use vertra::window::Window;
const TEXTURE_PATH: &str = "examples/assets/texture.png";
struct AppState {
cube_id: Option<usize>,
}
fn main() {
Window::new(AppState { cube_id: None })
.with_title("Textured Cube — Vertra")
.with_camera(
Camera::new()
.with_position([0.0, 2.5, -6.0])
.with_rotation(90.0, -15.0),
)
.on_startup(|state, scene, _| {
#[cfg(not(target_arch = "wasm32"))]
match scene.load_texture(TEXTURE_PATH) {
Ok(()) => println!("[info] Texture loaded: {TEXTURE_PATH}"),
Err(e) => eprintln!("[warn] {e} – cube will render with vertex colour"),
}
let cube_id = scene.spawn(
Object {
name: "Textured Cube".to_string(),
str_id: "cube".to_string(),
geometry: Some(Geometry::Cube { size: 2.0 }),
color: [1.0, 1.0, 1.0, 1.0],
transform: Transform::from_position(0.0, 1.0, 0.0),
texture_path: Some(TEXTURE_PATH.to_string()),
..Default::default()
},
None,
);
state.cube_id = Some(cube_id);
})
.on_update(|state, scene, ctx| {
if let Some(cube) = state.cube_id.and_then(|id| scene.world.get_mut(id)) {
cube.transform.rotation[1] += 40.0 * ctx.dt; cube.transform.rotation[0] += 15.0 * ctx.dt; }
})
.create();
}