Update to latest dependency versions
This commit is contained in:
parent
5f509ba05b
commit
b55e4fbbba
5 changed files with 347 additions and 402 deletions
|
@ -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"] }
|
||||
|
|
493
src/board.rs
493
src/board.rs
|
@ -27,11 +27,15 @@ impl BoardSlot {
|
|||
y: usize,
|
||||
z: usize,
|
||||
position: Vector2<f32>,
|
||||
scene: &mut Scene,
|
||||
world: &mut World,
|
||||
) -> Result<Self> {
|
||||
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::<Context>().device(),
|
||||
world.resources.get::<EngineSettings>(),
|
||||
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<Engine>, color: Color) -> Result<AssetMesh> {
|
||||
let mut mesh = AssetMesh::new(
|
||||
engine.device(),
|
||||
engine.settings().graphics_info()?.render_type,
|
||||
)?;
|
||||
fn create_mesh(
|
||||
device: &Arc<Device>,
|
||||
engine_settings: &EngineSettings,
|
||||
color: Color,
|
||||
) -> Result<AssetMesh> {
|
||||
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<Engine>, scene: &mut SceneHandle) -> Result<Self> {
|
||||
let mut board_entity = engine.assets().empty_entity();
|
||||
pub fn new(world: &mut World) -> Result<Self> {
|
||||
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<Engine>) -> Result<AssetMesh> {
|
||||
fn create_board_base(world: &World) -> Result<AssetMesh> {
|
||||
let mut board_base = AssetMesh::new(
|
||||
engine.device(),
|
||||
engine.settings().graphics_info()?.render_type,
|
||||
world.resources.get::<Context>().device(),
|
||||
world
|
||||
.resources
|
||||
.get::<EngineSettings>()
|
||||
.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::<Context>().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<Vec<Entity>> {
|
||||
fn create_connection_lines(world: &mut World, color: Color) -> Result<Vec<Entity>> {
|
||||
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::<Context>().device(),
|
||||
world
|
||||
.resources
|
||||
.get::<EngineSettings>()
|
||||
.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::<Context>().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<f32>,
|
||||
_direction: cgmath::Vector2<f32>,
|
||||
_radius: f32,
|
||||
) -> Result<bool> {
|
||||
Ok(true)
|
||||
}
|
||||
|
||||
fn get_height(&self, _x: f32, _y: f32) -> Result<f32> {
|
||||
Ok(0.0)
|
||||
}
|
||||
|
||||
fn spawn_positions(&self) -> Result<Vec<cgmath::Vector3<f32>>> {
|
||||
Ok(vec![])
|
||||
}
|
||||
|
||||
fn leave_markers(&self) -> Result<Vec<Entity>> {
|
||||
Ok(vec![])
|
||||
}
|
||||
|
||||
fn disable(&self, _scene: &mut Scene) -> Result<()> {
|
||||
unreachable!()
|
||||
}
|
||||
}
|
||||
|
|
234
src/game.rs
234
src/game.rs
|
@ -218,28 +218,22 @@ impl TurnState {
|
|||
}
|
||||
|
||||
pub struct MillGame {
|
||||
engine: Arc<Engine>,
|
||||
last_turn_timing: Mutex<Duration>,
|
||||
last_turn_timing: Duration,
|
||||
|
||||
board: Arc<Mutex<Board>>,
|
||||
white_stones: Mutex<[Stone; 9]>,
|
||||
black_stones: Mutex<[Stone; 9]>,
|
||||
board: Board,
|
||||
white_stones: [Stone; 9],
|
||||
black_stones: [Stone; 9],
|
||||
|
||||
state: Mutex<GameState>,
|
||||
current_player: Mutex<PlayerColor>,
|
||||
state: GameState,
|
||||
current_player: PlayerColor,
|
||||
|
||||
scene: Mutex<SceneHandle>,
|
||||
camera_controls: Mutex<CameraControl>,
|
||||
mouse_x: u32,
|
||||
mouse_y: u32,
|
||||
|
||||
mouse_x: AtomicU32,
|
||||
mouse_y: AtomicU32,
|
||||
turn_finished: bool,
|
||||
turn_states: Vec<TurnState>,
|
||||
|
||||
turn_finished: AtomicBool,
|
||||
turn_states: Mutex<Vec<TurnState>>,
|
||||
|
||||
selected_field: Mutex<Option<(usize, usize, usize)>>,
|
||||
|
||||
simple_ai: SimpleAI,
|
||||
selected_field: Option<(usize, usize, usize)>,
|
||||
|
||||
white_player_label: Arc<Label>,
|
||||
black_player_label: Arc<Label>,
|
||||
|
@ -253,79 +247,63 @@ impl MillGame {
|
|||
pub const OFFSET_TO_BOARD: f32 = 0.02;
|
||||
pub const TURN_WAIT_TIME: Duration = Duration::from_millis(500);
|
||||
|
||||
pub fn new(engine: Arc<Engine>) -> Result<Arc<Self>> {
|
||||
let mut scene = SceneHandle::new(&engine)?;
|
||||
let board = Board::new(&engine, &mut scene)?;
|
||||
pub fn new(world: &mut World) -> Result<()> {
|
||||
let board = Board::new(world)?;
|
||||
|
||||
let mut white_stones = None;
|
||||
let mut black_stones = None;
|
||||
// add light
|
||||
let mut sun_light = Light::directional_light(world.resources.get::<Context>().device());
|
||||
sun_light.set_direction(vec3(10.0, -4.0, -20.0))?;
|
||||
sun_light.set_color(vec3(1.0, 1.0, 1.0))?;
|
||||
sun_light.set_position(vec3(0.0, 0.0, 100.0))?;
|
||||
sun_light.set_power(10000000000.0)?;
|
||||
|
||||
scene.on_scene(|scene| {
|
||||
let view = scene.view_mut();
|
||||
let scene = world.resources.get_mut::<Scene>();
|
||||
scene.add_light(sun_light)?;
|
||||
|
||||
view.camera_mut().set_center(board.center());
|
||||
view.update_buffer()?;
|
||||
let view = scene.view_mut();
|
||||
view.camera_mut().set_center(board.center());
|
||||
view.update_buffer()?;
|
||||
|
||||
// add light
|
||||
let mut sun_light = engine.new_directional_light()?;
|
||||
sun_light.set_direction(vec3(10.0, -4.0, -20.0))?;
|
||||
sun_light.set_color(vec3(1.0, 1.0, 1.0))?;
|
||||
sun_light.set_position(vec3(0.0, 0.0, 100.0))?;
|
||||
sun_light.set_power(10000000000.0)?;
|
||||
let white_stones = Self::init_nine_stones(world, Color::White)?
|
||||
.into_iter()
|
||||
.enumerate()
|
||||
.map(|(index, mut e)| {
|
||||
let location = e.get_component_mut::<Location>()?;
|
||||
location.set_position(board.white_start_slots()[index].extend(0.0));
|
||||
|
||||
scene.add_light(sun_light)?;
|
||||
Ok(Stone {
|
||||
stone: world.add_entity(e)?,
|
||||
state: StoneState::ReadyToBePlaced,
|
||||
})
|
||||
})
|
||||
.collect::<Result<Vec<Stone>>>()?
|
||||
.try_into()
|
||||
.unwrap_or_else(|_: Vec<Stone>| unreachable!("create array from vec from an array"));
|
||||
|
||||
white_stones = Some(
|
||||
Self::init_nine_stones(&engine, Color::White)?
|
||||
.into_iter()
|
||||
.enumerate()
|
||||
.map(|(index, mut e)| {
|
||||
let location = e.get_component_mut::<Location>()?;
|
||||
location.set_position(board.white_start_slots()[index].extend(0.0));
|
||||
let black_stones = Self::init_nine_stones(world, Color::try_from("#2c2c2c")?)?
|
||||
.into_iter()
|
||||
.enumerate()
|
||||
.map(|(index, mut e)| {
|
||||
let location = e.get_component_mut::<Location>()?;
|
||||
location.set_position(board.black_start_slots()[index].extend(0.0));
|
||||
|
||||
Ok(Stone {
|
||||
stone: scene.add_entity(e)?,
|
||||
state: StoneState::ReadyToBePlaced,
|
||||
})
|
||||
})
|
||||
.collect::<Result<Vec<Stone>>>()?
|
||||
.try_into()
|
||||
.unwrap_or_else(|_: Vec<Stone>| {
|
||||
unreachable!("create array from vec from an array")
|
||||
}),
|
||||
);
|
||||
Ok(Stone {
|
||||
stone: world.add_entity(e)?,
|
||||
state: StoneState::ReadyToBePlaced,
|
||||
})
|
||||
})
|
||||
.collect::<Result<Vec<Stone>>>()?
|
||||
.try_into()
|
||||
.unwrap_or_else(|_: Vec<Stone>| unreachable!("create array from vec from an array"));
|
||||
|
||||
black_stones = Some(
|
||||
Self::init_nine_stones(&engine, Color::try_from("#2c2c2c")?)?
|
||||
.into_iter()
|
||||
.enumerate()
|
||||
.map(|(index, mut e)| {
|
||||
let location = e.get_component_mut::<Location>()?;
|
||||
location.set_position(board.black_start_slots()[index].extend(0.0));
|
||||
|
||||
Ok(Stone {
|
||||
stone: scene.add_entity(e)?,
|
||||
state: StoneState::ReadyToBePlaced,
|
||||
})
|
||||
})
|
||||
.collect::<Result<Vec<Stone>>>()?
|
||||
.try_into()
|
||||
.unwrap_or_else(|_: Vec<Stone>| {
|
||||
unreachable!("create array from vec from an array")
|
||||
}),
|
||||
);
|
||||
|
||||
Ok(())
|
||||
})?;
|
||||
|
||||
let mut camera_control = CameraControl::new(&mut scene)?;
|
||||
let mut camera_control = TopDownCameraControl::new(&mut scene)?;
|
||||
camera_control.set_zoom_levels(
|
||||
(3..60).into_iter().rev().map(|z| z as f32).collect(),
|
||||
5,
|
||||
&mut scene,
|
||||
)?;
|
||||
|
||||
scene.activate()?;
|
||||
world.resources.insert(camera_control);
|
||||
|
||||
let gui = GuiBuilder::new(
|
||||
engine.gui_handler(),
|
||||
|
@ -340,31 +318,50 @@ impl MillGame {
|
|||
let black_player_label: Arc<Label> = gui.element("black_player_label")?;
|
||||
let start_button: Arc<Button> = gui.element("start")?;
|
||||
|
||||
gui.enable()?;
|
||||
gui.enable(world.resources.get_mut::<GuiHandler>())?;
|
||||
|
||||
let me = Arc::new(Self {
|
||||
engine: engine.clone(),
|
||||
last_turn_timing: Mutex::default(),
|
||||
start_button.set_callback({
|
||||
let weak_grid = Arc::downgrade(&grid);
|
||||
|
||||
board: Arc::new(Mutex::new(board)),
|
||||
white_stones: Mutex::new(white_stones.unwrap()),
|
||||
black_stones: Mutex::new(black_stones.unwrap()),
|
||||
move |world| {
|
||||
if let Some(grid) = weak_grid.upgrade() {
|
||||
grid.detach(world, 1, 0)?;
|
||||
}
|
||||
|
||||
state: Mutex::new(GameState::Waiting),
|
||||
current_player: Mutex::new(PlayerColor::White),
|
||||
let now = world.now();
|
||||
let me = world.resources.get_mut::<Self>();
|
||||
|
||||
scene: Mutex::new(scene),
|
||||
camera_controls: Mutex::new(camera_control),
|
||||
Self::log(" ===== START GAME =====", LogSeverity::Basic);
|
||||
|
||||
mouse_x: AtomicU32::new(0),
|
||||
mouse_y: AtomicU32::new(0),
|
||||
me.state = GameState::Placing;
|
||||
me.current_player = PlayerColor::Black;
|
||||
|
||||
turn_finished: AtomicBool::new(false),
|
||||
turn_states: Mutex::default(),
|
||||
me.finish_turn();
|
||||
me.last_turn_timing = now;
|
||||
|
||||
selected_field: Mutex::default(),
|
||||
Ok(())
|
||||
}
|
||||
});
|
||||
|
||||
simple_ai: SimpleAI::new(PlayerColor::White),
|
||||
world.resources.insert(SimpleAI::new(PlayerColor::White));
|
||||
|
||||
let me = Self {
|
||||
last_turn_timing: Duration::default(),
|
||||
|
||||
board,
|
||||
white_stones,
|
||||
black_stones,
|
||||
|
||||
state: GameState::Waiting,
|
||||
current_player: PlayerColor::White,
|
||||
|
||||
mouse_x: 0,
|
||||
mouse_y: 0,
|
||||
|
||||
turn_finished: false,
|
||||
turn_states: TurnState::default(),
|
||||
|
||||
selected_field: None,
|
||||
|
||||
_grid: grid.clone(),
|
||||
white_player_label,
|
||||
|
@ -372,32 +369,11 @@ impl MillGame {
|
|||
_start_button: start_button.clone(),
|
||||
|
||||
_gui: gui,
|
||||
});
|
||||
};
|
||||
|
||||
start_button.set_callback({
|
||||
let weak_grid = Arc::downgrade(&grid);
|
||||
let weak_self = Arc::downgrade(&me);
|
||||
world.resources.insert(me);
|
||||
|
||||
move || {
|
||||
if let Some(grid) = weak_grid.upgrade() {
|
||||
grid.detach(1, 0)?;
|
||||
}
|
||||
|
||||
if let Some(me) = weak_self.upgrade() {
|
||||
Self::log(" ===== START GAME =====", LogSeverity::Basic);
|
||||
|
||||
*me.state.lock().unwrap() = GameState::Placing;
|
||||
*me.current_player.lock().unwrap() = PlayerColor::Black;
|
||||
|
||||
me.finish_turn();
|
||||
*me.last_turn_timing.lock().unwrap() = me.engine.time();
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
});
|
||||
|
||||
Ok(me)
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn finish_turn(&self) {
|
||||
|
@ -570,16 +546,16 @@ impl MillGame {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn stones(&self, player_color: PlayerColor) -> MutexGuard<'_, [Stone; 9]> {
|
||||
fn stones(&self, player_color: PlayerColor) -> &[Stone; 9] {
|
||||
match player_color {
|
||||
PlayerColor::White => self.white_stones.lock().unwrap(),
|
||||
PlayerColor::Black => self.black_stones.lock().unwrap(),
|
||||
PlayerColor::White => &self.white_stones,
|
||||
PlayerColor::Black => &self.black_stones,
|
||||
}
|
||||
}
|
||||
|
||||
fn init_nine_stones(engine: &Arc<Engine>, color: Color) -> Result<[EntityObject; 9]> {
|
||||
fn init_nine_stones(world: &mut World, color: Color) -> Result<[EntityObject; 9]> {
|
||||
Ok((0..9)
|
||||
.map(|_| Self::init_stone(engine, color))
|
||||
.map(|_| Self::init_stone(world, color))
|
||||
.collect::<Result<Vec<EntityObject>>>()?
|
||||
.try_into()
|
||||
.unwrap_or_else(|_: Vec<EntityObject>| {
|
||||
|
@ -587,20 +563,24 @@ impl MillGame {
|
|||
}))
|
||||
}
|
||||
|
||||
fn init_stone(engine: &Arc<Engine>, color: Color) -> Result<EntityObject> {
|
||||
let mut marker = engine.assets().empty_entity();
|
||||
fn init_stone(world: &mut World, color: Color) -> Result<EntityObject> {
|
||||
let mut marker = AssetHandler::create(world).empty_entity();
|
||||
|
||||
let draw = Draw::new(vec![{
|
||||
let mut mesh = AssetMesh::new(
|
||||
engine.device(),
|
||||
engine.settings().graphics_info()?.render_type,
|
||||
world.resources.get::<Context>().device(),
|
||||
world
|
||||
.resources
|
||||
.get::<EngineSettings>()
|
||||
.graphics_info()?
|
||||
.render_type,
|
||||
)?;
|
||||
|
||||
let vertex_buffer = Buffer::builder()
|
||||
.set_data(&Objects::create_cylinder(1.1, 0.25, 30))
|
||||
.set_usage(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)
|
||||
.set_memory_usage(MemoryUsage::CpuOnly)
|
||||
.build(engine.device().clone())?;
|
||||
.build(world.resources.get::<Context>().device().clone())?;
|
||||
|
||||
let a: [f32; 3] = color.into();
|
||||
|
||||
|
|
14
src/main.rs
14
src/main.rs
|
@ -9,6 +9,12 @@ use engine::prelude::*;
|
|||
use game::MillGame;
|
||||
|
||||
fn main() -> Result<()> {
|
||||
let mut world_builder = World::builder();
|
||||
|
||||
world_builder.build().run()
|
||||
}
|
||||
|
||||
fn create_engine(world_builder: &mut WorldBuilder) -> Result<()> {
|
||||
let mut create_info = EngineCreateInfo::default();
|
||||
|
||||
create_info.resource_base_path = "resources".to_string();
|
||||
|
@ -17,7 +23,7 @@ fn main() -> Result<()> {
|
|||
create_info.gui_info.menu_button = AssetPath::from("button_dark.png");
|
||||
create_info.gui_info.menu_button_selected = AssetPath::from("button_light.png");
|
||||
create_info.gui_info.resource_directory =
|
||||
AssetPath::from((create_info.resource_base_path.as_str(), ""));
|
||||
AssetPath::from((create_info.resource_base_path.as_str(), "")).into();
|
||||
|
||||
create_info.graphics_info.render_scale = 1.0;
|
||||
create_info.graphics_info.vsync = true;
|
||||
|
@ -32,9 +38,7 @@ fn main() -> Result<()> {
|
|||
create_info.enable_keyboard = true;
|
||||
create_info.enable_mouse = true;
|
||||
|
||||
let engine = Engine::new(create_info)?;
|
||||
let engine = Engine::new(create_info, world_builder)?;
|
||||
|
||||
engine.set_game_object(Some(MillGame::new(engine.clone())?))?;
|
||||
|
||||
engine.run()
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ impl SimpleAI {
|
|||
&self,
|
||||
stones: &mut [Stone; 9],
|
||||
board: &mut [[[BoardSlot; 3]; 3]; 3],
|
||||
scene: &mut SceneHandle,
|
||||
world: &mut World,
|
||||
state: &mut GameState,
|
||||
) -> Result<()> {
|
||||
MillGame::log(&format!("AI at state {:?}", *state), LogSeverity::Debug);
|
||||
|
|
Loading…
Reference in a new issue