|
|
|
|
@ -32,7 +32,7 @@ impl Plugin for Display3dPlugin {
|
|
|
|
|
.insert_resource(Msaa::Off)
|
|
|
|
|
.add_systems(
|
|
|
|
|
OnExit(GameState::Loading),
|
|
|
|
|
(initialize, fix_skybox.before(initialize)),
|
|
|
|
|
(initialize, fix_skybox.before(initialize), update_tweaks.run_if(resource_exists::<tweak::GameTweaks>()),),
|
|
|
|
|
)
|
|
|
|
|
.add_systems(
|
|
|
|
|
Update,
|
|
|
|
|
@ -44,9 +44,10 @@ impl Plugin for Display3dPlugin {
|
|
|
|
|
set_piece_model.run_if(any_component_added::<Piece>),
|
|
|
|
|
set_board_model.run_if(any_component_added::<game::BoardComponent>),
|
|
|
|
|
set_board_model.run_if(any_component_added::<TilesComponent>),
|
|
|
|
|
set_valid_move_model.run_if(any_component_added::<game::ValidMove>),
|
|
|
|
|
set_tile_hitbox.run_if(any_component_added::<game::Tile>),
|
|
|
|
|
set_piece_position.run_if(any_component_changed::<BoardIndex>),
|
|
|
|
|
set_piece_texture.run_if(any_component_changed::<Side>),
|
|
|
|
|
set_piece_texture.run_if(any_component_changed::<Side>).run_if(resource_exists::<tweak::GameTweaks>()),
|
|
|
|
|
select
|
|
|
|
|
.run_if(in_state(GameState::Play))
|
|
|
|
|
.run_if(in_state(DisplayState::Display3d))
|
|
|
|
|
@ -56,8 +57,7 @@ impl Plugin for Display3dPlugin {
|
|
|
|
|
switch_sides
|
|
|
|
|
.run_if(in_state(GameState::Play))
|
|
|
|
|
.run_if(state_changed::<game::TurnState>()),
|
|
|
|
|
set_valid_move_model.run_if(any_component_added::<game::ValidMove>),
|
|
|
|
|
update_tweaks.run_if(on_event::<AssetEvent<Tweaks>>()),
|
|
|
|
|
update_tweaks.run_if(on_event::<AssetEvent<Tweaks>>()).run_if(resource_exists::<tweak::GameTweaks>()),
|
|
|
|
|
scale_lighting.run_if(
|
|
|
|
|
any_component_added::<DirectionalLight>
|
|
|
|
|
.or_else(any_component_added::<SpotLight>)
|
|
|
|
|
@ -84,11 +84,10 @@ impl Plugin for Display3dPlugin {
|
|
|
|
|
OnEnter(DisplayState::Display3d),
|
|
|
|
|
(
|
|
|
|
|
activate::<Display3d>,
|
|
|
|
|
set_piece_texture,
|
|
|
|
|
set_piece_texture.run_if(resource_exists::<tweak::GameTweaks>()),
|
|
|
|
|
opening_animation
|
|
|
|
|
.run_if(run_once())
|
|
|
|
|
.run_if(in_state(GameState::Play)),
|
|
|
|
|
update_tweaks,
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
.add_systems(OnExit(DisplayState::Display3d), deactivate::<Display3d>)
|
|
|
|
|
@ -97,6 +96,7 @@ impl Plugin for Display3dPlugin {
|
|
|
|
|
(
|
|
|
|
|
activate::<Display3d>.run_if(in_state(DisplayState::Display3d)),
|
|
|
|
|
set_piece_texture,
|
|
|
|
|
update_tweaks.run_if(resource_exists::<tweak::GameTweaks>()),
|
|
|
|
|
opening_animation
|
|
|
|
|
.run_if(run_once())
|
|
|
|
|
.run_if(in_state(DisplayState::Display3d)),
|
|
|
|
|
@ -160,6 +160,8 @@ fn initialize(mut commands: Commands, board: Res<game::Board>, assets: Res<Asset
|
|
|
|
|
|
|
|
|
|
// Hitboxes
|
|
|
|
|
game::tiles().for_each(|(index, tile)| {
|
|
|
|
|
let side = Board::side(index).expect("Spawn valid side");
|
|
|
|
|
|
|
|
|
|
parent.spawn((
|
|
|
|
|
Display3d,
|
|
|
|
|
index,
|
|
|
|
|
@ -170,12 +172,15 @@ fn initialize(mut commands: Commands, board: Res<game::Board>, assets: Res<Asset
|
|
|
|
|
visibility: Visibility::Hidden,
|
|
|
|
|
..default()
|
|
|
|
|
},
|
|
|
|
|
side,
|
|
|
|
|
game::Selectable,
|
|
|
|
|
));
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Valid move indicators
|
|
|
|
|
game::tiles().for_each(|(index, _)| {
|
|
|
|
|
let side = Board::side(index).expect("Spawn valid side");
|
|
|
|
|
|
|
|
|
|
parent.spawn((
|
|
|
|
|
Display3d,
|
|
|
|
|
index,
|
|
|
|
|
@ -184,6 +189,7 @@ fn initialize(mut commands: Commands, board: Res<game::Board>, assets: Res<Asset
|
|
|
|
|
transform: Transform::from_translation(board_translation(&index)),
|
|
|
|
|
..default()
|
|
|
|
|
},
|
|
|
|
|
side,
|
|
|
|
|
game::ValidMove,
|
|
|
|
|
));
|
|
|
|
|
});
|
|
|
|
|
@ -232,7 +238,7 @@ fn hydrate_camera(
|
|
|
|
|
DisplayState::Display3d,
|
|
|
|
|
Camera3dBundle {
|
|
|
|
|
camera: Camera {
|
|
|
|
|
is_active: false,
|
|
|
|
|
is_active: true,
|
|
|
|
|
hdr: tweak.get::<bool>("display3d_hdr").unwrap(),
|
|
|
|
|
..default()
|
|
|
|
|
},
|
|
|
|
|
@ -732,9 +738,10 @@ fn select(
|
|
|
|
|
meshes: Res<Assets<Mesh>>,
|
|
|
|
|
cameras: Query<(&Camera, &GlobalTransform)>,
|
|
|
|
|
windows: Query<&Window, With<PrimaryWindow>>,
|
|
|
|
|
selectable: Query<(Entity, &BoardIndex), (With<game::Selectable>, With<Display3d>)>,
|
|
|
|
|
selectable: Query<(Entity, &BoardIndex, &Side, Option<&Piece>), (With<game::Selectable>, With<Display3d>)>,
|
|
|
|
|
children: Query<&Children>,
|
|
|
|
|
mut selections: EventWriter<game::Selection>,
|
|
|
|
|
state: Res<State<game::TurnState>>,
|
|
|
|
|
) {
|
|
|
|
|
events
|
|
|
|
|
.read()
|
|
|
|
|
@ -753,15 +760,20 @@ fn select(
|
|
|
|
|
hit::intersects3d(&ray, mesh, >).and_then(|_hit| {
|
|
|
|
|
selectable
|
|
|
|
|
.iter()
|
|
|
|
|
.find_map(|(e, &board_index)| {
|
|
|
|
|
// A child was hit (pieces)
|
|
|
|
|
let primary = entity == e;
|
|
|
|
|
.find_map(|(e, &board_index, &side, piece_ish)| {
|
|
|
|
|
// Check if this piece is on the active side
|
|
|
|
|
let side_check = piece_ish.is_some() && *state.get() == side;
|
|
|
|
|
|
|
|
|
|
// This entity was hit (tile hitboxes)
|
|
|
|
|
let primary = entity == e;
|
|
|
|
|
|
|
|
|
|
// A child was hit (pieces)
|
|
|
|
|
let secondary = children
|
|
|
|
|
.iter_descendants(e)
|
|
|
|
|
.any(|child| child == entity);
|
|
|
|
|
|
|
|
|
|
(primary || secondary).then_some(board_index)
|
|
|
|
|
(side_check && (primary || secondary)).then_some(board_index)
|
|
|
|
|
|
|
|
|
|
})
|
|
|
|
|
.iter()
|
|
|
|
|
.for_each(|&board_index| {
|
|
|
|
|
@ -804,7 +816,7 @@ fn moves_gizmo(
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn set_valid_move_model(
|
|
|
|
|
mut events: Query<&mut Handle<Scene>, (With<Display3d>, Added<game::ValidMove>)>,
|
|
|
|
|
mut events: Query<(&mut Handle<Scene>, &mut Visibility), (With<Display3d>, Added<game::ValidMove>)>,
|
|
|
|
|
gltfs: Res<Assets<Gltf>>,
|
|
|
|
|
tweaks: Res<Assets<Tweaks>>,
|
|
|
|
|
tweaks_file: Res<tweak::GameTweaks>,
|
|
|
|
|
@ -816,7 +828,7 @@ fn set_valid_move_model(
|
|
|
|
|
.get_handle::<Gltf>("display3d_models_assets_file")
|
|
|
|
|
.unwrap();
|
|
|
|
|
if let Some(gltf) = gltfs.get(assets_handle) {
|
|
|
|
|
events.iter_mut().for_each(|mut handle| {
|
|
|
|
|
events.iter_mut().for_each(|(mut handle, mut visibility)| {
|
|
|
|
|
*handle = gltf
|
|
|
|
|
.named_scenes
|
|
|
|
|
.get(
|
|
|
|
|
@ -826,7 +838,9 @@ fn set_valid_move_model(
|
|
|
|
|
.as_str(),
|
|
|
|
|
)
|
|
|
|
|
.unwrap()
|
|
|
|
|
.clone()
|
|
|
|
|
.clone();
|
|
|
|
|
|
|
|
|
|
*visibility = Visibility::Hidden;
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|