use hoplite::{AppConfig, Color, OrbitCamera, OrbitMode, Quat, Transform, Vec3, run_with_config};
fn main() {
run_with_config(
AppConfig::new().title("STL Loader Demo").size(1280, 720),
|ctx| {
ctx.default_font(18.0);
ctx.background_color(Color::rgb(0.08, 0.08, 0.12));
ctx.enable_mesh_rendering();
let chess_piece = ctx
.load("examples/assets/models/chess.stl")
.centered()
.upright()
.normalized()
.scaled(2.0)
.unwrap();
let plane = ctx.mesh_plane(10.0);
let cube = ctx.mesh_cube();
let mut orbit = OrbitCamera::new()
.target(Vec3::new(0.0, 1.0, 0.0))
.distance(5.0)
.elevation(0.4)
.fov(60.0)
.mode(OrbitMode::AutoRotate { speed: 0.3 });
let mut time = 0.0f32;
move |frame| {
time += frame.dt;
orbit.update(frame.input, frame.dt);
frame.set_camera(orbit.camera());
frame
.mesh(plane)
.transform(Transform::new())
.color(Color::rgb(0.15, 0.15, 0.18))
.draw();
frame
.mesh(cube)
.transform(
Transform::new()
.position(Vec3::new(0.0, 0.15, 0.0))
.scale(Vec3::new(1.5, 0.3, 1.5)),
)
.color(Color::rgb(0.2, 0.2, 0.25))
.draw();
let bob = (time * 1.5).sin() * 0.05;
frame
.mesh(chess_piece)
.transform(
Transform::new()
.position(Vec3::new(0.0, 1.3 + bob, 0.0))
.rotation(Quat::from_rotation_y(time * 0.2)),
)
.color(Color::rgb(0.9, 0.85, 0.7))
.draw();
let decoration_color = Color::rgb(0.3, 0.25, 0.35);
for i in 0..4 {
let angle = (i as f32) * std::f32::consts::FRAC_PI_2 + time * 0.1;
let radius = 3.0;
let x = angle.cos() * radius;
let z = angle.sin() * radius;
let height = 0.3 + (time + i as f32).sin().abs() * 0.2;
frame
.mesh(cube)
.transform(
Transform::new()
.position(Vec3::new(x, height, z))
.scale(Vec3::new(0.4, height * 2.0, 0.4))
.rotation(Quat::from_rotation_y(time + i as f32)),
)
.color(decoration_color)
.draw();
}
frame.text(10.0, 10.0, "STL Model Loading Demo");
frame.text_color(
10.0,
35.0,
"Drag mouse to orbit, scroll to zoom",
Color::rgb(0.6, 0.6, 0.6),
);
frame.text_color(
10.0,
55.0,
&format!("FPS: {:.0}", frame.fps()),
Color::rgb(0.5, 0.5, 0.5),
);
}
},
);
}