|
|
|
@ -12,14 +12,15 @@ impl Plugin for Display3dPlugin {
|
|
|
|
.add_systems(
|
|
|
|
.add_systems(
|
|
|
|
OnExit(GameState::Loading),
|
|
|
|
OnExit(GameState::Loading),
|
|
|
|
(
|
|
|
|
(
|
|
|
|
initialize,
|
|
|
|
|
|
|
|
fix_skybox.before(initialize),
|
|
|
|
fix_skybox.before(initialize),
|
|
|
|
|
|
|
|
initialize,
|
|
|
|
update_tweaks.run_if(resource_exists::<tweak::GameTweaks>),
|
|
|
|
update_tweaks.run_if(resource_exists::<tweak::GameTweaks>),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
.add_systems(
|
|
|
|
.add_systems(
|
|
|
|
Update,
|
|
|
|
Update,
|
|
|
|
(
|
|
|
|
(
|
|
|
|
|
|
|
|
debug_textures,
|
|
|
|
load_assets
|
|
|
|
load_assets
|
|
|
|
.run_if(in_state(GameState::Loading))
|
|
|
|
.run_if(in_state(GameState::Loading))
|
|
|
|
.run_if(on_event::<AssetEvent<Tweaks>>()),
|
|
|
|
.run_if(on_event::<AssetEvent<Tweaks>>()),
|
|
|
|
@ -37,10 +38,7 @@ impl Plugin for Display3dPlugin {
|
|
|
|
.or_else(any_component_changed::<BoardIndex>())
|
|
|
|
.or_else(any_component_changed::<BoardIndex>())
|
|
|
|
)
|
|
|
|
)
|
|
|
|
),
|
|
|
|
),
|
|
|
|
set_board_model.run_if(
|
|
|
|
set_board_model.run_if(any_component_added::<game::BoardComponent>()),
|
|
|
|
any_component_added::<game::BoardComponent>()
|
|
|
|
|
|
|
|
.or_else(any_component_added::<TilesComponent>())
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
set_valid_move_model.run_if(any_component_added::<game::ValidMove>()),
|
|
|
|
set_valid_move_model.run_if(any_component_added::<game::ValidMove>()),
|
|
|
|
set_tile_hitbox.run_if(any_component_added::<game::Tile>()),
|
|
|
|
set_tile_hitbox.run_if(any_component_added::<game::Tile>()),
|
|
|
|
select
|
|
|
|
select
|
|
|
|
@ -49,8 +47,8 @@ impl Plugin for Display3dPlugin {
|
|
|
|
.run_if(on_event::<MouseButtonInput>()),
|
|
|
|
.run_if(on_event::<MouseButtonInput>()),
|
|
|
|
pick_up.run_if(any_component_added::<game::Selected>()),
|
|
|
|
pick_up.run_if(any_component_added::<game::Selected>()),
|
|
|
|
put_down.run_if(any_component_removed::<game::Selected>()),
|
|
|
|
put_down.run_if(any_component_removed::<game::Selected>()),
|
|
|
|
setup_capture_piece.run_if(any_component_changed::<Handle<StandardMaterial>>()),
|
|
|
|
// setup_capture_piece.run_if(any_component_changed::<Handle<StandardMaterial>>()),
|
|
|
|
capture_piece.run_if(any_with_component::<game::Captured>),
|
|
|
|
// capture_piece.run_if(any_with_component::<game::Captured>),
|
|
|
|
skip_animation
|
|
|
|
skip_animation
|
|
|
|
.run_if(just_pressed(KeyCode::Enter).or_else(just_pressed(MouseButton::Left)))
|
|
|
|
.run_if(just_pressed(KeyCode::Enter).or_else(just_pressed(MouseButton::Left)))
|
|
|
|
.run_if(in_state(GameState::Play)),
|
|
|
|
.run_if(in_state(GameState::Play)),
|
|
|
|
@ -93,9 +91,6 @@ impl Plugin for Display3dPlugin {
|
|
|
|
#[derive(Debug, Component, PartialEq)]
|
|
|
|
#[derive(Debug, Component, PartialEq)]
|
|
|
|
pub(crate) struct Display3d;
|
|
|
|
pub(crate) struct Display3d;
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Component)]
|
|
|
|
|
|
|
|
struct TilesComponent;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Resource, Clone)]
|
|
|
|
#[derive(Debug, Resource, Clone)]
|
|
|
|
struct AssetsMap {
|
|
|
|
struct AssetsMap {
|
|
|
|
hitbox_shape: Handle<Mesh>,
|
|
|
|
hitbox_shape: Handle<Mesh>,
|
|
|
|
@ -146,14 +141,6 @@ fn initialize(mut commands: Commands, board: Res<game::Board>, assets: Res<Asset
|
|
|
|
SceneBundle { ..default() },
|
|
|
|
SceneBundle { ..default() },
|
|
|
|
))
|
|
|
|
))
|
|
|
|
.with_children(|parent| {
|
|
|
|
.with_children(|parent| {
|
|
|
|
// TEMP: Tiles
|
|
|
|
|
|
|
|
parent.spawn((
|
|
|
|
|
|
|
|
Display3d,
|
|
|
|
|
|
|
|
DisplayState::Display3d,
|
|
|
|
|
|
|
|
TilesComponent,
|
|
|
|
|
|
|
|
SceneBundle { ..default() },
|
|
|
|
|
|
|
|
));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Hitboxes
|
|
|
|
// Hitboxes
|
|
|
|
game::tiles().for_each(|(index, tile)| {
|
|
|
|
game::tiles().for_each(|(index, tile)| {
|
|
|
|
let side = Board::side(index).expect("Spawn valid side");
|
|
|
|
let side = Board::side(index).expect("Spawn valid side");
|
|
|
|
@ -307,8 +294,8 @@ fn update_tweaks(
|
|
|
|
tweaks: Res<Assets<Tweaks>>,
|
|
|
|
tweaks: Res<Assets<Tweaks>>,
|
|
|
|
mut commands: Commands,
|
|
|
|
mut commands: Commands,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
warn!("Updating tweaks!");
|
|
|
|
|
|
|
|
if let Some(tweak) = tweaks.get(tweaks_file.handle.clone()) {
|
|
|
|
if let Some(tweak) = tweaks.get(tweaks_file.handle.clone()) {
|
|
|
|
|
|
|
|
warn!("Updating tweaks!");
|
|
|
|
camera_settings.iter_mut().for_each(
|
|
|
|
camera_settings.iter_mut().for_each(
|
|
|
|
|(entity, mut fog, mut color_grading, mut tonemapping, mut bloom)| {
|
|
|
|
|(entity, mut fog, mut color_grading, mut tonemapping, mut bloom)| {
|
|
|
|
*fog = tweak
|
|
|
|
*fog = tweak
|
|
|
|
@ -387,8 +374,7 @@ fn set_board_model(
|
|
|
|
mut boards: Query<
|
|
|
|
mut boards: Query<
|
|
|
|
&mut Handle<Scene>,
|
|
|
|
&mut Handle<Scene>,
|
|
|
|
(
|
|
|
|
(
|
|
|
|
With<game::BoardComponent>,
|
|
|
|
Added<game::BoardComponent>,
|
|
|
|
Without<TilesComponent>,
|
|
|
|
|
|
|
|
With<Display3d>,
|
|
|
|
With<Display3d>,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
>,
|
|
|
|
>,
|
|
|
|
@ -400,6 +386,7 @@ fn set_board_model(
|
|
|
|
.get(tweaks_file.handle.clone())
|
|
|
|
.get(tweaks_file.handle.clone())
|
|
|
|
.expect("Load tweakfile");
|
|
|
|
.expect("Load tweakfile");
|
|
|
|
boards.iter_mut().for_each(|mut handle| {
|
|
|
|
boards.iter_mut().for_each(|mut handle| {
|
|
|
|
|
|
|
|
info!("Setting board model");
|
|
|
|
let assets_handle = tweak
|
|
|
|
let assets_handle = tweak
|
|
|
|
.get_handle::<Gltf>("display3d_models_assets_file")
|
|
|
|
.get_handle::<Gltf>("display3d_models_assets_file")
|
|
|
|
.unwrap();
|
|
|
|
.unwrap();
|
|
|
|
@ -511,41 +498,47 @@ fn update_pieces(
|
|
|
|
let models = gltfs.get(assets_handle).unwrap();
|
|
|
|
let models = gltfs.get(assets_handle).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
query.iter_mut().for_each(|(entity, piece, side, board_index, mut transform, mut scene, animation_player)| {
|
|
|
|
query.iter_mut().for_each(|(entity, piece, side, board_index, mut transform, mut scene, animation_player)| {
|
|
|
|
|
|
|
|
|
|
|
|
// Set position of piece
|
|
|
|
// Set position of piece
|
|
|
|
let new_translation = board_translation(board_index);
|
|
|
|
let new_translation = board_translation(board_index);
|
|
|
|
if transform.translation != new_translation {
|
|
|
|
if transform.translation != new_translation {
|
|
|
|
|
|
|
|
info!("Updating piece transform");
|
|
|
|
transform.translation = new_translation;
|
|
|
|
transform.translation = new_translation;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Find name of this piece's model scene
|
|
|
|
if animation_player.is_finished() {
|
|
|
|
let scene_tweak_name: Option<String> = match (piece, side) {
|
|
|
|
info!("Updating piece object scene");
|
|
|
|
(Piece::Pawn, Side::A) => {
|
|
|
|
|
|
|
|
tweak.get("display3d_models_scenes_pawn_red")
|
|
|
|
// Find name of this piece's model scene
|
|
|
|
},
|
|
|
|
let scene_tweak_name: Option<String> = match (piece, side) {
|
|
|
|
(Piece::Pawn, Side::B) => {
|
|
|
|
(Piece::Pawn, Side::A) => {
|
|
|
|
tweak.get("display3d_models_scenes_pawn_blue")
|
|
|
|
tweak.get("display3d_models_scenes_pawn_red")
|
|
|
|
}
|
|
|
|
},
|
|
|
|
(Piece::Drone, Side::A) => {
|
|
|
|
(Piece::Pawn, Side::B) => {
|
|
|
|
tweak.get("display3d_models_scenes_drone_red")
|
|
|
|
tweak.get("display3d_models_scenes_pawn_blue")
|
|
|
|
},
|
|
|
|
}
|
|
|
|
(Piece::Drone, Side::B) => {
|
|
|
|
(Piece::Drone, Side::A) => {
|
|
|
|
tweak.get("display3d_models_scenes_drone_blue")
|
|
|
|
tweak.get("display3d_models_scenes_drone_red")
|
|
|
|
}
|
|
|
|
},
|
|
|
|
(Piece::Queen, Side::A) => {
|
|
|
|
(Piece::Drone, Side::B) => {
|
|
|
|
tweak.get("display3d_models_scenes_queen_red")
|
|
|
|
tweak.get("display3d_models_scenes_drone_blue")
|
|
|
|
},
|
|
|
|
}
|
|
|
|
(Piece::Queen, Side::B) => {
|
|
|
|
(Piece::Queen, Side::A) => {
|
|
|
|
tweak.get("display3d_models_scenes_queen_blue")
|
|
|
|
tweak.get("display3d_models_scenes_queen_red")
|
|
|
|
}
|
|
|
|
},
|
|
|
|
};
|
|
|
|
(Piece::Queen, Side::B) => {
|
|
|
|
|
|
|
|
tweak.get("display3d_models_scenes_queen_blue")
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Get model scene for this piece
|
|
|
|
// Get model scene for this piece
|
|
|
|
let scene_handle = models.named_scenes.get(&scene_tweak_name.unwrap()).unwrap();
|
|
|
|
let scene_handle = models.named_scenes.get(&scene_tweak_name.unwrap()).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
// Set scene model for this piece
|
|
|
|
// Set scene model for this piece
|
|
|
|
if *scene != *scene_handle {
|
|
|
|
if *scene != *scene_handle {
|
|
|
|
warn!("Updating scene for piece {:?}", entity);
|
|
|
|
warn!("Updating scene for piece {:?}", entity);
|
|
|
|
*scene = scene_handle.clone();
|
|
|
|
*scene = scene_handle.clone();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -655,6 +648,8 @@ fn set_valid_move_model(
|
|
|
|
.get_handle::<Gltf>("display3d_models_assets_file")
|
|
|
|
.get_handle::<Gltf>("display3d_models_assets_file")
|
|
|
|
.unwrap();
|
|
|
|
.unwrap();
|
|
|
|
if let Some(gltf) = gltfs.get(assets_handle) {
|
|
|
|
if let Some(gltf) = gltfs.get(assets_handle) {
|
|
|
|
|
|
|
|
info!("Setting valid move model");
|
|
|
|
|
|
|
|
|
|
|
|
events.iter_mut().for_each(|(mut handle, mut visibility)| {
|
|
|
|
events.iter_mut().for_each(|(mut handle, mut visibility)| {
|
|
|
|
*handle = gltf
|
|
|
|
*handle = gltf
|
|
|
|
.named_scenes
|
|
|
|
.named_scenes
|
|
|
|
@ -688,6 +683,8 @@ fn pick_up(
|
|
|
|
.get(tweaks_file.handle.clone())
|
|
|
|
.get(tweaks_file.handle.clone())
|
|
|
|
.expect("Load tweakfile");
|
|
|
|
.expect("Load tweakfile");
|
|
|
|
events.iter_mut().for_each(|(entity, piece, side)| {
|
|
|
|
events.iter_mut().for_each(|(entity, piece, side)| {
|
|
|
|
|
|
|
|
info!("Picking up piece");
|
|
|
|
|
|
|
|
|
|
|
|
let assets_handle = tweak
|
|
|
|
let assets_handle = tweak
|
|
|
|
.get_handle::<Gltf>("display3d_models_assets_file")
|
|
|
|
.get_handle::<Gltf>("display3d_models_assets_file")
|
|
|
|
.unwrap();
|
|
|
|
.unwrap();
|
|
|
|
@ -755,6 +752,8 @@ fn put_down(
|
|
|
|
.expect("Load tweakfile");
|
|
|
|
.expect("Load tweakfile");
|
|
|
|
events.read().for_each(|entity| {
|
|
|
|
events.read().for_each(|entity| {
|
|
|
|
if let Ok((piece, side)) = query.get_mut(entity) {
|
|
|
|
if let Ok((piece, side)) = query.get_mut(entity) {
|
|
|
|
|
|
|
|
info!("Putting down piece");
|
|
|
|
|
|
|
|
|
|
|
|
let assets_handle = tweak
|
|
|
|
let assets_handle = tweak
|
|
|
|
.get_handle::<Gltf>("display3d_models_assets_file")
|
|
|
|
.get_handle::<Gltf>("display3d_models_assets_file")
|
|
|
|
.unwrap();
|
|
|
|
.unwrap();
|
|
|
|
@ -795,6 +794,8 @@ fn set_tile_hitbox(
|
|
|
|
mut events: Query<(&mut Transform, &BoardIndex), (With<Display3d>, Added<game::Tile>)>,
|
|
|
|
mut events: Query<(&mut Transform, &BoardIndex), (With<Display3d>, Added<game::Tile>)>,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
events.iter_mut().for_each(|(mut transform, index)| {
|
|
|
|
events.iter_mut().for_each(|(mut transform, index)| {
|
|
|
|
|
|
|
|
info!("Setting tile hitbox");
|
|
|
|
|
|
|
|
|
|
|
|
*transform = Transform::from_translation(board_translation(index));
|
|
|
|
*transform = Transform::from_translation(board_translation(index));
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -813,6 +814,8 @@ fn skip_animation(
|
|
|
|
time: Res<Time>,
|
|
|
|
time: Res<Time>,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
players.iter_mut().for_each(|mut p| {
|
|
|
|
players.iter_mut().for_each(|mut p| {
|
|
|
|
|
|
|
|
info!("Skipping animation");
|
|
|
|
|
|
|
|
|
|
|
|
if let Some(c) = clips.get(p.animation_clip()) {
|
|
|
|
if let Some(c) = clips.get(p.animation_clip()) {
|
|
|
|
// HACK: We should be able to skip to the end of an animation
|
|
|
|
// HACK: We should be able to skip to the end of an animation
|
|
|
|
// But implementation details means this is as close as we can get...
|
|
|
|
// But implementation details means this is as close as we can get...
|
|
|
|
@ -836,6 +839,8 @@ fn switch_sides(
|
|
|
|
.unwrap();
|
|
|
|
.unwrap();
|
|
|
|
let gltf = gltfs.get(assets_handle).expect("Load GLTF content");
|
|
|
|
let gltf = gltfs.get(assets_handle).expect("Load GLTF content");
|
|
|
|
players.iter_mut().for_each(|mut player| {
|
|
|
|
players.iter_mut().for_each(|mut player| {
|
|
|
|
|
|
|
|
info!("Switching sides");
|
|
|
|
|
|
|
|
|
|
|
|
let animation = match state.get() {
|
|
|
|
let animation = match state.get() {
|
|
|
|
game::TurnState(game::Side::A) => gltf.named_animations.get(
|
|
|
|
game::TurnState(game::Side::A) => gltf.named_animations.get(
|
|
|
|
tweak
|
|
|
|
tweak
|
|
|
|
@ -1289,3 +1294,11 @@ fn debug_selected(
|
|
|
|
);
|
|
|
|
);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fn debug_textures(
|
|
|
|
|
|
|
|
mut events: EventReader<AssetEvent<StandardMaterial>>,
|
|
|
|
|
|
|
|
) {
|
|
|
|
|
|
|
|
events.read().for_each(|event| {
|
|
|
|
|
|
|
|
info!("New material: {:?}", event);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|