2023-11-14 14:41:48 +01:00
|
|
|
mod scene;
|
2023-09-14 13:58:36 -07:00
|
|
|
|
2023-11-14 15:48:01 +01:00
|
|
|
use scene::Scene;
|
2023-11-14 12:49:49 +01:00
|
|
|
|
|
|
|
|
use iced::time::Instant;
|
2024-09-20 18:35:18 +02:00
|
|
|
use iced::wgpu;
|
2024-05-03 09:11:46 +02:00
|
|
|
use iced::widget::{center, checkbox, column, row, shader, slider, text};
|
2023-11-14 12:49:49 +01:00
|
|
|
use iced::window;
|
2024-07-12 18:12:34 +02:00
|
|
|
use iced::{Center, Color, Element, Fill, Subscription};
|
2023-09-14 13:58:36 -07:00
|
|
|
|
|
|
|
|
fn main() -> iced::Result {
|
2025-03-12 02:10:42 +01:00
|
|
|
iced::application(IcedCubes::default, IcedCubes::update, IcedCubes::view)
|
|
|
|
|
.subscription(IcedCubes::subscription)
|
|
|
|
|
.run()
|
2023-09-14 13:58:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct IcedCubes {
|
|
|
|
|
start: Instant,
|
2023-11-14 14:41:48 +01:00
|
|
|
scene: Scene,
|
2023-09-14 13:58:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
|
enum Message {
|
|
|
|
|
CubeAmountChanged(u32),
|
|
|
|
|
CubeSizeChanged(f32),
|
|
|
|
|
Tick(Instant),
|
|
|
|
|
ShowDepthBuffer(bool),
|
|
|
|
|
LightColorChanged(Color),
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-16 05:33:47 +01:00
|
|
|
impl IcedCubes {
|
|
|
|
|
fn new() -> Self {
|
|
|
|
|
Self {
|
|
|
|
|
start: Instant::now(),
|
|
|
|
|
scene: Scene::new(),
|
|
|
|
|
}
|
2023-09-14 13:58:36 -07:00
|
|
|
}
|
|
|
|
|
|
2024-03-16 05:33:47 +01:00
|
|
|
fn update(&mut self, message: Message) {
|
2023-09-14 13:58:36 -07:00
|
|
|
match message {
|
2023-11-14 14:41:48 +01:00
|
|
|
Message::CubeAmountChanged(amount) => {
|
|
|
|
|
self.scene.change_amount(amount);
|
2023-09-14 13:58:36 -07:00
|
|
|
}
|
|
|
|
|
Message::CubeSizeChanged(size) => {
|
2023-11-14 14:41:48 +01:00
|
|
|
self.scene.size = size;
|
2023-09-14 13:58:36 -07:00
|
|
|
}
|
|
|
|
|
Message::Tick(time) => {
|
2023-11-14 14:41:48 +01:00
|
|
|
self.scene.update(time - self.start);
|
2023-09-14 13:58:36 -07:00
|
|
|
}
|
|
|
|
|
Message::ShowDepthBuffer(show) => {
|
2023-11-14 14:41:48 +01:00
|
|
|
self.scene.show_depth_buffer = show;
|
2023-09-14 13:58:36 -07:00
|
|
|
}
|
|
|
|
|
Message::LightColorChanged(color) => {
|
2023-11-14 14:41:48 +01:00
|
|
|
self.scene.light_color = color;
|
2023-09-14 13:58:36 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-16 05:33:47 +01:00
|
|
|
fn view(&self) -> Element<'_, Message> {
|
2023-09-14 13:58:36 -07:00
|
|
|
let top_controls = row![
|
|
|
|
|
control(
|
|
|
|
|
"Amount",
|
|
|
|
|
slider(
|
2023-11-14 14:41:48 +01:00
|
|
|
1..=scene::MAX,
|
|
|
|
|
self.scene.cubes.len() as u32,
|
2023-09-14 13:58:36 -07:00
|
|
|
Message::CubeAmountChanged
|
|
|
|
|
)
|
|
|
|
|
.width(100)
|
|
|
|
|
),
|
|
|
|
|
control(
|
|
|
|
|
"Size",
|
2023-11-14 14:41:48 +01:00
|
|
|
slider(0.1..=0.25, self.scene.size, Message::CubeSizeChanged)
|
2023-09-14 13:58:36 -07:00
|
|
|
.step(0.01)
|
|
|
|
|
.width(100),
|
|
|
|
|
),
|
2025-04-03 17:29:13 +02:00
|
|
|
checkbox(self.scene.show_depth_buffer)
|
|
|
|
|
.label("Show Depth Buffer")
|
2023-10-02 20:18:15 +02:00
|
|
|
.on_toggle(Message::ShowDepthBuffer),
|
2023-09-14 13:58:36 -07:00
|
|
|
]
|
|
|
|
|
.spacing(40);
|
|
|
|
|
|
|
|
|
|
let bottom_controls = row![
|
|
|
|
|
control(
|
|
|
|
|
"R",
|
2023-11-14 14:41:48 +01:00
|
|
|
slider(0.0..=1.0, self.scene.light_color.r, move |r| {
|
2023-09-14 13:58:36 -07:00
|
|
|
Message::LightColorChanged(Color {
|
|
|
|
|
r,
|
2023-11-14 14:41:48 +01:00
|
|
|
..self.scene.light_color
|
2023-09-14 13:58:36 -07:00
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
.step(0.01)
|
|
|
|
|
.width(100)
|
|
|
|
|
),
|
|
|
|
|
control(
|
|
|
|
|
"G",
|
2023-11-14 14:41:48 +01:00
|
|
|
slider(0.0..=1.0, self.scene.light_color.g, move |g| {
|
2023-09-14 13:58:36 -07:00
|
|
|
Message::LightColorChanged(Color {
|
|
|
|
|
g,
|
2023-11-14 14:41:48 +01:00
|
|
|
..self.scene.light_color
|
2023-09-14 13:58:36 -07:00
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
.step(0.01)
|
|
|
|
|
.width(100)
|
|
|
|
|
),
|
|
|
|
|
control(
|
|
|
|
|
"B",
|
2023-11-14 14:41:48 +01:00
|
|
|
slider(0.0..=1.0, self.scene.light_color.b, move |b| {
|
2023-09-14 13:58:36 -07:00
|
|
|
Message::LightColorChanged(Color {
|
|
|
|
|
b,
|
2023-11-14 14:41:48 +01:00
|
|
|
..self.scene.light_color
|
2023-09-14 13:58:36 -07:00
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
.step(0.01)
|
|
|
|
|
.width(100)
|
|
|
|
|
)
|
|
|
|
|
]
|
|
|
|
|
.spacing(40);
|
|
|
|
|
|
|
|
|
|
let controls = column![top_controls, bottom_controls,]
|
|
|
|
|
.spacing(10)
|
2023-11-28 23:13:38 +01:00
|
|
|
.padding(20)
|
2024-07-12 18:12:34 +02:00
|
|
|
.align_x(Center);
|
2023-09-14 13:58:36 -07:00
|
|
|
|
2024-07-12 18:12:34 +02:00
|
|
|
let shader = shader(&self.scene).width(Fill).height(Fill);
|
2023-09-14 13:58:36 -07:00
|
|
|
|
2024-07-12 18:12:34 +02:00
|
|
|
center(column![shader, controls].align_x(Center)).into()
|
2023-09-14 13:58:36 -07:00
|
|
|
}
|
|
|
|
|
|
2024-03-16 05:33:47 +01:00
|
|
|
fn subscription(&self) -> Subscription<Message> {
|
2023-09-14 13:58:36 -07:00
|
|
|
window::frames().map(Message::Tick)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-16 05:33:47 +01:00
|
|
|
impl Default for IcedCubes {
|
|
|
|
|
fn default() -> Self {
|
|
|
|
|
Self::new()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-14 13:58:36 -07:00
|
|
|
fn control<'a>(
|
|
|
|
|
label: &'static str,
|
|
|
|
|
control: impl Into<Element<'a, Message>>,
|
|
|
|
|
) -> Element<'a, Message> {
|
|
|
|
|
row![text(label), control.into()].spacing(10).into()
|
|
|
|
|
}
|