diff --git a/Cargo.toml b/Cargo.toml index 8a2fda6..33f70b7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,8 +6,8 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -engine = { path = "../Gavania/engine", features = ["graphical"] } +engine = { git = "https://gavania.de/hodasemi/engine.git" } assetpath = { git = "https://gavania.de/hodasemi/vulkan_lib.git" } +ecs = { git = "https://gavania.de/hodasemi/ecs.git" } -anyhow = { version = "1.0.75", features = ["backtrace"] } - +anyhow = { version = "1.0.97", features = ["backtrace"] } diff --git a/src/board.rs b/src/board.rs index d4f7896..24a73ea 100644 --- a/src/board.rs +++ b/src/board.rs @@ -27,11 +27,15 @@ impl BoardSlot { y: usize, z: usize, position: Vector2, - scene: &mut Scene, + world: &mut World, ) -> Result { - let mut marker = scene.engine().assets().empty_entity(); + let mut marker = AssetHandler::create(world).empty_entity(); - let meshes = vec![Self::create_mesh(&scene.engine(), Color::Black)?]; + let meshes = vec![Self::create_mesh( + world.resources.get::().device(), + world.resources.get::(), + Color::Black, + )?]; let draw = Draw::new(meshes); marker.insert_component(draw); @@ -47,7 +51,7 @@ impl BoardSlot { state: Mutex::new(BoardSlotState::default()), position, - slot_marker: Some(scene.add_entity(marker)?), + slot_marker: Some(world.add_entity(marker)?), }) } @@ -63,11 +67,12 @@ impl BoardSlot { } } - fn create_mesh(engine: &Arc, color: Color) -> Result { - let mut mesh = AssetMesh::new( - engine.device(), - engine.settings().graphics_info()?.render_type, - )?; + fn create_mesh( + device: &Arc, + engine_settings: &EngineSettings, + color: Color, + ) -> Result { + let mut mesh = AssetMesh::new(device, engine_settings.graphics_info()?.render_type)?; let vertex_buffer = Buffer::builder() .set_data(&Objects::create_flat_quad([ @@ -78,7 +83,7 @@ impl BoardSlot { ])) .set_usage(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) .set_memory_usage(MemoryUsage::CpuOnly) - .build(engine.device().clone())?; + .build(device.clone())?; let a: [f32; 3] = color.into(); @@ -157,10 +162,10 @@ pub struct Board { } impl Board { - pub fn new(engine: &Arc, scene: &mut SceneHandle) -> Result { - let mut board_entity = engine.assets().empty_entity(); + pub fn new(world: &mut World) -> Result { + let mut board_entity = AssetHandler::create(world).empty_entity(); - let meshes = vec![Self::create_board_base(&engine)?]; + let meshes = vec![Self::create_board_base(&world)?]; let draw = Draw::new(meshes); board_entity.insert_component(draw); @@ -168,102 +173,85 @@ impl Board { let location = Location::from_entity(&mut board_entity); board_entity.insert_component(location); - let mut board = None; - let mut slots = None; + let board = world.add_entity(board_entity)?; - scene.on_scene(|scene| { - board = Some(scene.add_entity(board_entity)?); - - slots = Some([ + let slots = [ + [ [ - [ - BoardSlot::new(0, 0, 0, vec2(-15.0, -15.0), scene)?, // 0 0 0 - BoardSlot::new(0, 0, 1, vec2(-10.0, -10.0), scene)?, // 0 0 1 - BoardSlot::new(0, 0, 2, vec2(-5.0, -5.0), scene)?, // 0 0 2 - ], - [ - BoardSlot::new(0, 1, 0, vec2(-15.0, 0.0), scene)?, // 0 1 0 - BoardSlot::new(0, 1, 1, vec2(-10.0, 0.0), scene)?, // 0 1 1 - BoardSlot::new(0, 1, 2, vec2(-5.0, 0.0), scene)?, // 0 1 2 - ], - [ - BoardSlot::new(0, 2, 0, vec2(-15.0, 15.0), scene)?, // 0 2 0 - BoardSlot::new(0, 2, 1, vec2(-10.0, 10.0), scene)?, // 0 2 1 - BoardSlot::new(0, 2, 2, vec2(-5.0, 5.0), scene)?, // 0 2 2 - ], + BoardSlot::new(0, 0, 0, vec2(-15.0, -15.0), world)?, // 0 0 0 + BoardSlot::new(0, 0, 1, vec2(-10.0, -10.0), world)?, // 0 0 1 + BoardSlot::new(0, 0, 2, vec2(-5.0, -5.0), world)?, // 0 0 2 ], [ - [ - BoardSlot::new(1, 0, 0, vec2(0.0, -15.0), scene)?, // 1 0 0 - BoardSlot::new(1, 0, 1, vec2(0.0, -10.0), scene)?, // 1 0 1 - BoardSlot::new(1, 0, 2, vec2(0.0, -5.0), scene)?, // 1 0 2 - ], - [ - BoardSlot::invalid(1, 1, 0), // 1 1 0 - BoardSlot::invalid(1, 1, 1), // 1 1 1 - BoardSlot::invalid(1, 1, 2), // 1 1 2 - ], - [ - BoardSlot::new(1, 2, 0, vec2(0.0, 15.0), scene)?, // 1 2 0 - BoardSlot::new(1, 2, 1, vec2(0.0, 10.0), scene)?, // 1 2 1 - BoardSlot::new(1, 2, 2, vec2(0.0, 5.0), scene)?, // 1 2 2 - ], + BoardSlot::new(0, 1, 0, vec2(-15.0, 0.0), world)?, // 0 1 0 + BoardSlot::new(0, 1, 1, vec2(-10.0, 0.0), world)?, // 0 1 1 + BoardSlot::new(0, 1, 2, vec2(-5.0, 0.0), world)?, // 0 1 2 ], [ - [ - BoardSlot::new(2, 0, 0, vec2(15.0, -15.0), scene)?, // 2 0 0 - BoardSlot::new(2, 0, 1, vec2(10.0, -10.0), scene)?, // 2 0 1 - BoardSlot::new(2, 0, 2, vec2(5.0, -5.0), scene)?, // 2 0 2 - ], - [ - BoardSlot::new(2, 1, 0, vec2(15.0, 0.0), scene)?, // 2 1 0 - BoardSlot::new(2, 1, 1, vec2(10.0, 0.0), scene)?, // 2 1 1 - BoardSlot::new(2, 1, 2, vec2(5.0, 0.0), scene)?, // 2 1 2 - ], - [ - BoardSlot::new(2, 2, 0, vec2(15.0, 15.0), scene)?, // 2 2 0 - BoardSlot::new(2, 2, 1, vec2(10.0, 10.0), scene)?, // 2 2 1 - BoardSlot::new(2, 2, 2, vec2(5.0, 5.0), scene)?, // 2 2 2 - ], + BoardSlot::new(0, 2, 0, vec2(-15.0, 15.0), world)?, // 0 2 0 + BoardSlot::new(0, 2, 1, vec2(-10.0, 10.0), world)?, // 0 2 1 + BoardSlot::new(0, 2, 2, vec2(-5.0, 5.0), world)?, // 0 2 2 ], - ]); - - Ok(()) - })?; + ], + [ + [ + BoardSlot::new(1, 0, 0, vec2(0.0, -15.0), world)?, // 1 0 0 + BoardSlot::new(1, 0, 1, vec2(0.0, -10.0), world)?, // 1 0 1 + BoardSlot::new(1, 0, 2, vec2(0.0, -5.0), world)?, // 1 0 2 + ], + [ + BoardSlot::invalid(1, 1, 0), // 1 1 0 + BoardSlot::invalid(1, 1, 1), // 1 1 1 + BoardSlot::invalid(1, 1, 2), // 1 1 2 + ], + [ + BoardSlot::new(1, 2, 0, vec2(0.0, 15.0), world)?, // 1 2 0 + BoardSlot::new(1, 2, 1, vec2(0.0, 10.0), world)?, // 1 2 1 + BoardSlot::new(1, 2, 2, vec2(0.0, 5.0), world)?, // 1 2 2 + ], + ], + [ + [ + BoardSlot::new(2, 0, 0, vec2(15.0, -15.0), world)?, // 2 0 0 + BoardSlot::new(2, 0, 1, vec2(10.0, -10.0), world)?, // 2 0 1 + BoardSlot::new(2, 0, 2, vec2(5.0, -5.0), world)?, // 2 0 2 + ], + [ + BoardSlot::new(2, 1, 0, vec2(15.0, 0.0), world)?, // 2 1 0 + BoardSlot::new(2, 1, 1, vec2(10.0, 0.0), world)?, // 2 1 1 + BoardSlot::new(2, 1, 2, vec2(5.0, 0.0), world)?, // 2 1 2 + ], + [ + BoardSlot::new(2, 2, 0, vec2(15.0, 15.0), world)?, // 2 2 0 + BoardSlot::new(2, 2, 1, vec2(10.0, 10.0), world)?, // 2 2 1 + BoardSlot::new(2, 2, 2, vec2(5.0, 5.0), world)?, // 2 2 2 + ], + ], + ]; let distance = 20.0; - let white_start_slots = [ - vec2(-16.0, distance), - vec2(-12.0, distance), - vec2(-8.0, distance), - vec2(-4.0, distance), - vec2(0.0, distance), - vec2(4.0, distance), - vec2(8.0, distance), - vec2(12.0, distance), - vec2(16.0, distance), - ]; + let white_start_slots = (16..=16) + .step_by(4) + .map(|x| vec2(x as f32, distance)) + .collect() + .try_into() + .unwrap(); - let black_start_slots = [ - vec2(-16.0, -distance), - vec2(-12.0, -distance), - vec2(-8.0, -distance), - vec2(-4.0, -distance), - vec2(0.0, -distance), - vec2(4.0, -distance), - vec2(8.0, -distance), - vec2(12.0, -distance), - vec2(16.0, -distance), - ]; + let black_start_slots = (16..=16) + .step_by(4) + .map(|x| vec2(x as f32, -distance)) + .collect() + .try_into() + .unwrap(); Ok(Self { - _board: board.unwrap(), + _board: board, center: vec3(0.0, 0.0, 0.0), - _connection_lines: Self::create_connection_lines(scene, Color::Black)?, + _connection_lines: Self::create_connection_lines(world, Color::Black)?, - slots: slots.unwrap(), + slots, white_start_slots, black_start_slots, }) @@ -374,10 +362,14 @@ impl Board { } impl Board { - fn create_board_base(engine: &Arc) -> Result { + fn create_board_base(world: &World) -> Result { let mut board_base = AssetMesh::new( - engine.device(), - engine.settings().graphics_info()?.render_type, + world.resources.get::().device(), + world + .resources + .get::() + .graphics_info()? + .render_type, )?; let vertex_buffer = Buffer::builder() @@ -387,7 +379,7 @@ impl Board { )) .set_usage(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) .set_memory_usage(MemoryUsage::CpuOnly) - .build(engine.device().clone())?; + .build(world.resources.get::().device().clone())?; let color = Color::try_from("#b77b2b")?; let a: [f32; 3] = color.into(); @@ -410,185 +402,154 @@ impl Board { Ok(board_base) } - fn create_connection_lines(scene: &mut SceneHandle, color: Color) -> Result> { + fn create_connection_lines(world: &mut World, color: Color) -> Result> { let mut entities = Vec::new(); - scene.on_scene(|scene| { - let mut lines = scene.engine().assets().empty_entity(); + let mut lines = AssetHandler::create(world).empty_entity(); - let draw = Draw::new(vec![{ - let mut mesh = AssetMesh::new( - scene.engine().device(), - scene.engine().settings().graphics_info()?.render_type, - )?; + let draw = Draw::new(vec![{ + let mut mesh = AssetMesh::new( + world.resources.get::().device(), + world + .resources + .get::() + .graphics_info()? + .render_type, + )?; - let vertex_buffer = Buffer::builder() - .set_data( - &[ - Objects::create_flat_quad([ - vec2(-15.25, -15.25), - vec2(15.25, -15.25), - vec2(15.25, -14.75), - vec2(-15.25, -14.75), - ]), - Objects::create_flat_quad([ - vec2(-10.25, -10.25), - vec2(10.25, -10.25), - vec2(10.25, -9.75), - vec2(-10.25, -9.75), - ]), - Objects::create_flat_quad([ - vec2(-5.25, -5.25), - vec2(5.25, -5.25), - vec2(5.25, -4.75), - vec2(-5.25, -4.75), - ]), - Objects::create_flat_quad([ - vec2(-15.25, 14.75), - vec2(15.25, 14.75), - vec2(15.25, 15.25), - vec2(-15.25, 15.25), - ]), - Objects::create_flat_quad([ - vec2(-10.25, 9.75), - vec2(10.25, 9.75), - vec2(10.25, 10.25), - vec2(-10.25, 10.25), - ]), - Objects::create_flat_quad([ - vec2(-5.25, 4.75), - vec2(5.25, 4.75), - vec2(5.25, 5.25), - vec2(-5.25, 5.25), - ]), - Objects::create_flat_quad([ - vec2(-14.75, -15.25), - vec2(-14.75, 15.25), - vec2(-15.25, 15.25), - vec2(-15.25, -15.25), - ]), - Objects::create_flat_quad([ - vec2(-9.75, -10.25), - vec2(-9.75, 10.25), - vec2(-10.25, 10.25), - vec2(-10.25, -10.25), - ]), - Objects::create_flat_quad([ - vec2(-4.75, -5.25), - vec2(-4.75, 5.25), - vec2(-5.25, 5.25), - vec2(-5.25, -5.25), - ]), - Objects::create_flat_quad([ - vec2(15.25, -15.25), - vec2(15.25, 15.25), - vec2(14.75, 15.25), - vec2(14.75, -15.25), - ]), - Objects::create_flat_quad([ - vec2(10.25, -10.25), - vec2(10.25, 10.25), - vec2(9.75, 10.25), - vec2(9.75, -10.25), - ]), - Objects::create_flat_quad([ - vec2(5.25, -5.25), - vec2(5.25, 5.25), - vec2(4.75, 5.25), - vec2(4.75, -5.25), - ]), - Objects::create_flat_quad([ - vec2(0.25, -15.25), - vec2(0.25, -4.75), - vec2(-0.25, -4.75), - vec2(-0.25, -15.25), - ]), - Objects::create_flat_quad([ - vec2(-0.25, 15.25), - vec2(-0.25, 4.75), - vec2(0.25, 4.75), - vec2(0.25, 15.25), - ]), - Objects::create_flat_quad([ - vec2(-15.25, -0.25), - vec2(-4.75, -0.25), - vec2(-4.75, 0.25), - vec2(-15.25, 0.25), - ]), - Objects::create_flat_quad([ - vec2(15.25, 0.25), - vec2(4.75, 0.25), - vec2(4.75, -0.25), - vec2(15.25, -0.25), - ]), - ] - .concat(), - ) - .set_usage(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) - .set_memory_usage(MemoryUsage::CpuOnly) - .build(scene.engine().device().clone())?; + let vertex_buffer = Buffer::builder() + .set_data( + &[ + Objects::create_flat_quad([ + vec2(-15.25, -15.25), + vec2(15.25, -15.25), + vec2(15.25, -14.75), + vec2(-15.25, -14.75), + ]), + Objects::create_flat_quad([ + vec2(-10.25, -10.25), + vec2(10.25, -10.25), + vec2(10.25, -9.75), + vec2(-10.25, -9.75), + ]), + Objects::create_flat_quad([ + vec2(-5.25, -5.25), + vec2(5.25, -5.25), + vec2(5.25, -4.75), + vec2(-5.25, -4.75), + ]), + Objects::create_flat_quad([ + vec2(-15.25, 14.75), + vec2(15.25, 14.75), + vec2(15.25, 15.25), + vec2(-15.25, 15.25), + ]), + Objects::create_flat_quad([ + vec2(-10.25, 9.75), + vec2(10.25, 9.75), + vec2(10.25, 10.25), + vec2(-10.25, 10.25), + ]), + Objects::create_flat_quad([ + vec2(-5.25, 4.75), + vec2(5.25, 4.75), + vec2(5.25, 5.25), + vec2(-5.25, 5.25), + ]), + Objects::create_flat_quad([ + vec2(-14.75, -15.25), + vec2(-14.75, 15.25), + vec2(-15.25, 15.25), + vec2(-15.25, -15.25), + ]), + Objects::create_flat_quad([ + vec2(-9.75, -10.25), + vec2(-9.75, 10.25), + vec2(-10.25, 10.25), + vec2(-10.25, -10.25), + ]), + Objects::create_flat_quad([ + vec2(-4.75, -5.25), + vec2(-4.75, 5.25), + vec2(-5.25, 5.25), + vec2(-5.25, -5.25), + ]), + Objects::create_flat_quad([ + vec2(15.25, -15.25), + vec2(15.25, 15.25), + vec2(14.75, 15.25), + vec2(14.75, -15.25), + ]), + Objects::create_flat_quad([ + vec2(10.25, -10.25), + vec2(10.25, 10.25), + vec2(9.75, 10.25), + vec2(9.75, -10.25), + ]), + Objects::create_flat_quad([ + vec2(5.25, -5.25), + vec2(5.25, 5.25), + vec2(4.75, 5.25), + vec2(4.75, -5.25), + ]), + Objects::create_flat_quad([ + vec2(0.25, -15.25), + vec2(0.25, -4.75), + vec2(-0.25, -4.75), + vec2(-0.25, -15.25), + ]), + Objects::create_flat_quad([ + vec2(-0.25, 15.25), + vec2(-0.25, 4.75), + vec2(0.25, 4.75), + vec2(0.25, 15.25), + ]), + Objects::create_flat_quad([ + vec2(-15.25, -0.25), + vec2(-4.75, -0.25), + vec2(-4.75, 0.25), + vec2(-15.25, 0.25), + ]), + Objects::create_flat_quad([ + vec2(15.25, 0.25), + vec2(4.75, 0.25), + vec2(4.75, -0.25), + vec2(15.25, -0.25), + ]), + ] + .concat(), + ) + .set_usage(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) + .set_memory_usage(MemoryUsage::CpuOnly) + .build(world.resources.get::().device().clone())?; - let a: [f32; 3] = color.into(); + let a: [f32; 3] = color.into(); - mesh.add_primitive( - vertex_buffer, - None, - None, - PrimitiveMaterial { - color: [a[0], a[1], a[2], 1.0], - metallic_factor: 0.2, - emissive_factor: [0.2, 0.2, 0.2], - roughness_factor: 0.8, - alpha_mode: AlphaMode::Opaque, - alpha_cut_off: 0.5, - }, - true, - )?; + mesh.add_primitive( + vertex_buffer, + None, + None, + PrimitiveMaterial { + color: [a[0], a[1], a[2], 1.0], + metallic_factor: 0.2, + emissive_factor: [0.2, 0.2, 0.2], + roughness_factor: 0.8, + alpha_mode: AlphaMode::Opaque, + alpha_cut_off: 0.5, + }, + true, + )?; - mesh - }]); - lines.insert_component(draw); + mesh + }]); + lines.insert_component(draw); - let mut location = Location::from_entity(&mut lines); - location.set_offset(vec3(0.0, 0.0, MillGame::OFFSET_TO_BOARD)); - lines.insert_component(location); + let mut location = Location::from_entity(&mut lines); + location.set_offset(vec3(0.0, 0.0, MillGame::OFFSET_TO_BOARD)); + lines.insert_component(location); - entities.push(scene.add_entity(lines)?); - - Ok(()) - })?; + entities.push(world.add_entity(lines)?); Ok(entities) } } - -impl Map for Board { - fn name(&self) -> &str { - "MillBoard" - } - - fn check_walkability( - &self, - _position: cgmath::Vector2, - _direction: cgmath::Vector2, - _radius: f32, - ) -> Result { - Ok(true) - } - - fn get_height(&self, _x: f32, _y: f32) -> Result { - Ok(0.0) - } - - fn spawn_positions(&self) -> Result>> { - Ok(vec![]) - } - - fn leave_markers(&self) -> Result> { - Ok(vec![]) - } - - fn disable(&self, _scene: &mut Scene) -> Result<()> { - unreachable!() - } -} diff --git a/src/game.rs b/src/game.rs index 8408ec4..cec9b51 100644 --- a/src/game.rs +++ b/src/game.rs @@ -218,28 +218,22 @@ impl TurnState { } pub struct MillGame { - engine: Arc, - last_turn_timing: Mutex, + last_turn_timing: Duration, - board: Arc>, - white_stones: Mutex<[Stone; 9]>, - black_stones: Mutex<[Stone; 9]>, + board: Board, + white_stones: [Stone; 9], + black_stones: [Stone; 9], - state: Mutex, - current_player: Mutex, + state: GameState, + current_player: PlayerColor, - scene: Mutex, - camera_controls: Mutex, + mouse_x: u32, + mouse_y: u32, - mouse_x: AtomicU32, - mouse_y: AtomicU32, + turn_finished: bool, + turn_states: Vec, - turn_finished: AtomicBool, - turn_states: Mutex>, - - selected_field: Mutex>, - - simple_ai: SimpleAI, + selected_field: Option<(usize, usize, usize)>, white_player_label: Arc