From b47ecbf45a7e7a210b2a07c5b8a3a3837acd4652 Mon Sep 17 00:00:00 2001 From: Tao Tien <29749622+taotien@users.noreply.github.com> Date: Mon, 5 Jan 2026 23:49:37 -0800 Subject: [PATCH] init tiles, table/camera/environment placeholder --- Cargo.lock | 28 ++++++++++++++ Cargo.toml | 1 + src/gui/mod.rs | 31 +++++++++++++++ src/gui/tiles.rs | 99 ++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 14 ++++++- src/tui.rs | 0 6 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 src/gui/mod.rs create mode 100644 src/gui/tiles.rs create mode 100644 src/tui.rs diff --git a/Cargo.lock b/Cargo.lock index 6a75282..a419784 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2616,6 +2616,12 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.5.2" @@ -4174,6 +4180,27 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "svg_fmt" version = "0.4.5" @@ -4325,6 +4352,7 @@ name = "tiny_riichi" version = "0.1.0" dependencies = [ "bevy", + "strum", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 9d3ffe2..414149e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ edition = "2024" [dependencies] bevy = { version = "0.17.3", features = ["dynamic_linking"] } +strum = { version = "0.27.2", features = ["derive"] } [profile.dev] opt-level = 1 diff --git a/src/gui/mod.rs b/src/gui/mod.rs new file mode 100644 index 0000000..0961361 --- /dev/null +++ b/src/gui/mod.rs @@ -0,0 +1,31 @@ +use bevy::{color::palettes::css::GREEN, prelude::*}; + +pub(crate) mod tiles; + +pub(crate) fn init_environment(mut commands: Commands) { + commands.spawn(( + DirectionalLight { + shadows_enabled: true, + ..default() + }, + // Transform::from_xyz(), + )); + commands.spawn(( + Camera3d::default(), + Transform::from_xyz(-200.5, 100., 0.).looking_at(Vec3::ZERO, Vec3::Y), + )); +} + +pub(crate) fn init_table( + mut commands: Commands, + mut meshes: ResMut>, + mut materials: ResMut>, +) { + let green: Color = GREEN.into(); + let table = Cuboid::new(1000., 5., 1000.); + + commands.spawn(( + Mesh3d(meshes.add(table)), + MeshMaterial3d(materials.add(green)), + )); +} diff --git a/src/gui/tiles.rs b/src/gui/tiles.rs new file mode 100644 index 0000000..d0ef9ea --- /dev/null +++ b/src/gui/tiles.rs @@ -0,0 +1,99 @@ +use bevy::{color::palettes::css::GREY, prelude::*}; +use strum::FromRepr; + +#[derive(Component)] +pub(crate) enum Tile { + Pin(Number), + Sou(Number), + Man(Number), + Wind(Wind), + Dragon(Dragon), +} + +#[derive(FromRepr)] +pub(crate) enum Number { + One = 1, + Two, + Three, + Four, + Five, + Six, + Seven, + Eight, + Nine, +} + +#[derive(FromRepr)] +pub(crate) enum Wind { + Ton, + Nan, + Shaa, + Pei, +} + +#[derive(FromRepr)] +pub(crate) enum Dragon { + Haku, + Hatsu, + Chun, +} + +#[derive(Component)] +struct Dora; + +pub fn init_tileset( + mut commands: Commands, + mut meshes: ResMut>, + mut materials: ResMut>, +) { + let cuboid = Cuboid::new(25., 20., 16.); + + for _ in 0..4 { + for i in 1..=9 { + commands.spawn(( + ( + Mesh3d(meshes.add(cuboid)), + Transform::from_xyz(30., 0., 0.), + MeshMaterial3d(materials.add(std::convert::Into::::into(GREY))), + ), + Tile::Pin(Number::from_repr(i).unwrap()), + )); + commands.spawn(( + ( + Mesh3d(meshes.add(cuboid)), + Transform::from_xyz(30., 0., 0.), + MeshMaterial3d(materials.add(std::convert::Into::::into(GREY))), + ), + Tile::Sou(Number::from_repr(i).unwrap()), + )); + commands.spawn(( + ( + Mesh3d(meshes.add(cuboid)), + Transform::from_xyz(30., 0., 0.), + MeshMaterial3d(materials.add(std::convert::Into::::into(GREY))), + ), + Tile::Man(Number::from_repr(i).unwrap()), + )); + } + for i in 0..4 { + commands.spawn(( + ( + Mesh3d(meshes.add(cuboid)), + Transform::from_xyz(30., 0., 0.), + MeshMaterial3d(materials.add(std::convert::Into::::into(GREY))), + ), + Tile::Wind(Wind::from_repr(i).unwrap()), + )); + } + for i in 0..3 { + commands.spawn(( + ( + Mesh3d(meshes.add(cuboid)), + Transform::from_xyz(30., 0., 0.), + MeshMaterial3d(materials.add(std::convert::Into::::into(GREY))), + ), + Tile::Dragon(Dragon::from_repr(i).unwrap()), + )); + } + } +} diff --git a/src/main.rs b/src/main.rs index e7a11a9..054f0d6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,15 @@ +use bevy::prelude::*; + +use crate::gui::{tiles::*, *}; + +mod gui; +mod tui; + fn main() { - println!("Hello, world!"); + App::new() + // .add_plugins(DefaultPlugins) + .add_systems(Startup, init_table) + .add_systems(Startup, init_tileset) + .add_systems(Startup, init_environment) + .run(); } diff --git a/src/tui.rs b/src/tui.rs new file mode 100644 index 0000000..e69de29