Fixed bug with 3d not having textures on startup

bevy0.12
Elijah Voigt 2 years ago
parent e2e535137a
commit 012593b891

@ -35,9 +35,7 @@ impl Plugin for Display3dPlugin {
set_board_model.run_if(any_component_added::<game::BoardComponent>),
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>)
.after(game::set_side),
set_piece_texture.run_if(any_component_changed::<Side>),
select
.run_if(in_state(GameState::Play))
.run_if(in_state(DisplayState::Display3d))
@ -59,11 +57,17 @@ impl Plugin for Display3dPlugin {
.run_if(in_state(GameState::Play))
.run_if(in_state(DisplayState::Display3d)),
)
.add_systems(OnEnter(DisplayState::Display3d), activate::<Display3d>)
.add_systems(
OnEnter(DisplayState::Display3d),
(activate::<Display3d>, set_piece_texture),
)
.add_systems(OnExit(DisplayState::Display3d), deactivate::<Display3d>)
.add_systems(
OnEnter(GameState::Play),
(
activate::<Display3d>.run_if(in_state(DisplayState::Display3d)),
set_piece_texture,
),
)
.add_systems(
OnExit(GameState::Play),
@ -344,23 +348,26 @@ fn mouse_zoom(
/// 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.
fn set_piece_texture(
events: Query<(Entity, &Piece, &Side), (With<game::Piece>, With<Display3d>, Changed<Side>)>,
all: Query<(Entity, &Piece, &Side), (With<game::Piece>, With<Display3d>)>,
events: Query<
(Entity, &Piece, &Side),
(
With<game::Piece>,
With<Display3d>,
Or<(Changed<Side>, Added<Side>)>,
),
>,
gltfs: Res<Assets<Gltf>>,
assets_map: Res<AssetsMap>,
children: Query<&Children>,
mut models: Query<(&Name, &mut Handle<StandardMaterial>)>,
) {
let pieces = if events.is_empty() {
all.iter().collect::<Vec<(Entity, &Piece, &Side)>>()
} else {
events.iter().collect::<Vec<(Entity, &Piece, &Side)>>()
};
pieces.iter().for_each(|(entity, piece, side)| {
events.iter().for_each(|(entity, piece, side)| {
info!("Checking piece texture for {:?}", entity);
if let Some(gltf) = gltfs.get(&assets_map.models) {
children.iter_descendants(*entity).for_each(|child| {
children.iter_descendants(entity).for_each(|child| {
if let Ok((n, mut m)) = models.get_mut(child) {
match (*piece, *side, n.as_str()) {
info!("Setting piece texture for {:?}", child);
match (*piece, side, n.as_str()) {
(Piece::Queen, Side::A, "Queen.0") => {
*m = gltf
.named_materials

@ -13,7 +13,7 @@ impl Plugin for GamePlugin {
(
menu::exit_to_menu.run_if(in_state(GameState::Play)),
update_board.run_if(on_event::<Move>()).after(select_sync),
set_side.run_if(on_event::<Move>()), // TODO: correct run_if?
set_side.run_if(on_event::<Move>()).after(update_board),
cancel_place.run_if(|buttons: Res<Input<MouseButton>>| -> bool {
buttons.just_pressed(MouseButton::Right)
}),

Loading…
Cancel
Save