|
|
|
@ -22,8 +22,8 @@ impl Plugin for Display3dPlugin {
|
|
|
|
Update,
|
|
|
|
Update,
|
|
|
|
(
|
|
|
|
(
|
|
|
|
menu::exit_to_menu.run_if(in_state(GameState::Display3d)),
|
|
|
|
menu::exit_to_menu.run_if(in_state(GameState::Display3d)),
|
|
|
|
set_piece_model.run_if(any_component_added::<Piece3d>),
|
|
|
|
set_piece_model.run_if(any_component_added::<Piece>),
|
|
|
|
set_board_model.run_if(any_component_added::<Board3d>),
|
|
|
|
set_board_model.run_if(any_component_added::<game::BoardComponent>),
|
|
|
|
set_piece_position.run_if(any_component_changed::<BoardIndex>),
|
|
|
|
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>),
|
|
|
|
select_3d
|
|
|
|
select_3d
|
|
|
|
@ -54,13 +54,7 @@ impl Plugin for Display3dPlugin {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Component)]
|
|
|
|
#[derive(Debug, Component)]
|
|
|
|
struct Display3d;
|
|
|
|
pub(crate) struct Display3d;
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Component)]
|
|
|
|
|
|
|
|
pub(crate) struct Piece3d;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Component)]
|
|
|
|
|
|
|
|
pub(crate) struct Board3d;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Resource)]
|
|
|
|
#[derive(Debug, Resource)]
|
|
|
|
struct AssetsMap {
|
|
|
|
struct AssetsMap {
|
|
|
|
@ -127,14 +121,14 @@ fn initialize(mut commands: Commands, board: Res<game::Board>, assets: Res<Asset
|
|
|
|
|
|
|
|
|
|
|
|
info!("Intializing 3D Board!");
|
|
|
|
info!("Intializing 3D Board!");
|
|
|
|
parent
|
|
|
|
parent
|
|
|
|
.spawn((Display3d, Board3d, SceneBundle { ..default() }))
|
|
|
|
.spawn((Display3d, game::BoardComponent, SceneBundle { ..default() }))
|
|
|
|
.with_children(|parent| {
|
|
|
|
.with_children(|parent| {
|
|
|
|
board.pieces().iter().for_each(|(index, piece)| {
|
|
|
|
board.pieces().iter().for_each(|(index, piece)| {
|
|
|
|
let side = Board::side(index).expect("Spawn valid side");
|
|
|
|
let side = Board::side(index).expect("Spawn valid side");
|
|
|
|
|
|
|
|
|
|
|
|
parent.spawn((
|
|
|
|
parent.spawn((
|
|
|
|
side,
|
|
|
|
side,
|
|
|
|
Piece3d,
|
|
|
|
Display3d,
|
|
|
|
piece.clone(),
|
|
|
|
piece.clone(),
|
|
|
|
index.clone(),
|
|
|
|
index.clone(),
|
|
|
|
SceneBundle { ..default() },
|
|
|
|
SceneBundle { ..default() },
|
|
|
|
@ -162,7 +156,7 @@ fn fix_skybox(mut images: ResMut<Assets<Image>>, assets: Res<AssetsMap>) {
|
|
|
|
|
|
|
|
|
|
|
|
/// Set the model for each piece based on the game::Piece::* marker
|
|
|
|
/// Set the model for each piece based on the game::Piece::* marker
|
|
|
|
fn set_piece_model(
|
|
|
|
fn set_piece_model(
|
|
|
|
mut events: Query<(&mut Handle<Scene>, &Piece), Added<Piece3d>>,
|
|
|
|
mut events: Query<(&mut Handle<Scene>, &Piece), (Added<game::Piece>, With<Display3d>)>,
|
|
|
|
assets_map: Res<AssetsMap>,
|
|
|
|
assets_map: Res<AssetsMap>,
|
|
|
|
gltfs: Res<Assets<Gltf>>,
|
|
|
|
gltfs: Res<Assets<Gltf>>,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
@ -179,7 +173,7 @@ fn set_piece_model(
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn set_board_model(
|
|
|
|
fn set_board_model(
|
|
|
|
mut events: Query<&mut Handle<Scene>, With<Board3d>>,
|
|
|
|
mut events: Query<&mut Handle<Scene>, (With<game::BoardComponent>, With<Display3d>)>,
|
|
|
|
assets_map: Res<AssetsMap>,
|
|
|
|
assets_map: Res<AssetsMap>,
|
|
|
|
gltfs: Res<Assets<Gltf>>,
|
|
|
|
gltfs: Res<Assets<Gltf>>,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
@ -195,7 +189,10 @@ fn set_board_model(
|
|
|
|
|
|
|
|
|
|
|
|
/// Sets a piece location given it's board index
|
|
|
|
/// Sets a piece location given it's board index
|
|
|
|
fn set_piece_position(
|
|
|
|
fn set_piece_position(
|
|
|
|
mut events: Query<(&mut Transform, &BoardIndex), (With<Piece3d>, Changed<BoardIndex>)>,
|
|
|
|
mut events: Query<
|
|
|
|
|
|
|
|
(&mut Transform, &BoardIndex),
|
|
|
|
|
|
|
|
(With<game::Piece>, With<Display3d>, Changed<BoardIndex>),
|
|
|
|
|
|
|
|
>,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
events.iter_mut().for_each(|(mut t, i)| {
|
|
|
|
events.iter_mut().for_each(|(mut t, i)| {
|
|
|
|
t.translation = board_translation(i);
|
|
|
|
t.translation = board_translation(i);
|
|
|
|
@ -267,8 +264,8 @@ fn mouse_zoom(
|
|
|
|
/// PERF: We are saving what to work on in a Vector which is bad.
|
|
|
|
/// PERF: We are saving what to work on in a Vector which is bad.
|
|
|
|
/// CAVEAT: We are only exeucting this when a piece changes or state is changed.
|
|
|
|
/// CAVEAT: We are only exeucting this when a piece changes or state is changed.
|
|
|
|
fn set_piece_texture(
|
|
|
|
fn set_piece_texture(
|
|
|
|
events: Query<(Entity, &Piece, &Side), (With<Piece3d>, Changed<Side>)>,
|
|
|
|
events: Query<(Entity, &Piece, &Side), (With<game::Piece>, With<Display3d>, Changed<Side>)>,
|
|
|
|
all: Query<(Entity, &Piece, &Side), With<Piece3d>>,
|
|
|
|
all: Query<(Entity, &Piece, &Side), (With<game::Piece>, With<Display3d>)>,
|
|
|
|
gltfs: Res<Assets<Gltf>>,
|
|
|
|
gltfs: Res<Assets<Gltf>>,
|
|
|
|
assets_map: Res<AssetsMap>,
|
|
|
|
assets_map: Res<AssetsMap>,
|
|
|
|
children: Query<&Children>,
|
|
|
|
children: Query<&Children>,
|
|
|
|
@ -377,16 +374,17 @@ fn set_piece_texture(
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Function for selecting entities based on ray intersection
|
|
|
|
/// Function for selecting entities based on ray intersection
|
|
|
|
|
|
|
|
/// There is a bug where we are selecting multiple entities...
|
|
|
|
fn select_3d(
|
|
|
|
fn select_3d(
|
|
|
|
mut events: EventReader<MouseButtonInput>,
|
|
|
|
mut events: EventReader<MouseButtonInput>,
|
|
|
|
query: Query<(Entity, &Handle<Mesh>, &GlobalTransform)>,
|
|
|
|
query: Query<(Entity, &Handle<Mesh>, &GlobalTransform)>,
|
|
|
|
meshes: Res<Assets<Mesh>>,
|
|
|
|
meshes: Res<Assets<Mesh>>,
|
|
|
|
cameras: Query<(&Camera, &GlobalTransform)>,
|
|
|
|
cameras: Query<(&Camera, &GlobalTransform), With<Display3d>>,
|
|
|
|
windows: Query<&Window, With<PrimaryWindow>>,
|
|
|
|
windows: Query<&Window, With<PrimaryWindow>>,
|
|
|
|
parents: Query<Entity, (With<Piece3d>, Without<game::Selected>)>,
|
|
|
|
parents: Query<Entity, (With<game::Piece>, With<Display3d>)>,
|
|
|
|
children: Query<&Children>,
|
|
|
|
children: Query<&Children>,
|
|
|
|
mut commands: Commands,
|
|
|
|
mut commands: Commands,
|
|
|
|
selected: Query<Entity, (With<game::Selected>, With<Piece3d>)>,
|
|
|
|
selected: Query<Entity, (With<game::Selected>, With<game::Piece>, With<Display3d>)>,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
events
|
|
|
|
events
|
|
|
|
.iter()
|
|
|
|
.iter()
|
|
|
|
@ -412,9 +410,12 @@ fn select_3d(
|
|
|
|
})
|
|
|
|
})
|
|
|
|
.iter()
|
|
|
|
.iter()
|
|
|
|
.for_each(|&parent| {
|
|
|
|
.for_each(|&parent| {
|
|
|
|
// TODO: Only remove/insert component if different
|
|
|
|
|
|
|
|
selected.iter().for_each(|s| {
|
|
|
|
selected.iter().for_each(|s| {
|
|
|
|
commands.entity(s).remove::<game::Selected>();
|
|
|
|
if s != parent {
|
|
|
|
|
|
|
|
commands
|
|
|
|
|
|
|
|
.entity(s)
|
|
|
|
|
|
|
|
.remove::<game::Selected>();
|
|
|
|
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
commands.entity(parent).insert(game::Selected);
|
|
|
|
commands.entity(parent).insert(game::Selected);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
@ -431,10 +432,21 @@ fn select_3d(
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn selected_gizmo(
|
|
|
|
fn selected_gizmo(
|
|
|
|
selected: Query<&Transform, (With<game::Selected>, With<Piece3d>)>,
|
|
|
|
selected: Query<&Transform, (With<game::Selected>, With<game::Piece>, With<Display3d>)>,
|
|
|
|
mut gizmos: Gizmos,
|
|
|
|
mut gizmos: Gizmos,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
selected.iter().for_each(|transform| {
|
|
|
|
selected.iter().for_each(|transform| {
|
|
|
|
gizmos.cuboid(transform.clone(), Color::GREEN);
|
|
|
|
gizmos.cuboid(transform.clone(), Color::GREEN);
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Animations
|
|
|
|
|
|
|
|
// * QueenPickup
|
|
|
|
|
|
|
|
// * QueenPutDown
|
|
|
|
|
|
|
|
// * QueenIdle
|
|
|
|
|
|
|
|
// * DronePickup
|
|
|
|
|
|
|
|
// * DronePutDown
|
|
|
|
|
|
|
|
// * DroneIdle
|
|
|
|
|
|
|
|
// * PawnPickup
|
|
|
|
|
|
|
|
// * PawnPutDown
|
|
|
|
|
|
|
|
// * PawnIdle
|
|
|
|
|