@ -90,17 +90,23 @@ impl Plugin for Display3dPlugin {
. run_if ( resource_exists ::< tweak ::GameTweaks > )
. run_if ( resource_exists ::< tweak ::GameTweaks > )
. run_if ( in_state ( GameState ::Play ) )
. run_if ( in_state ( GameState ::Play ) )
. run_if (
. run_if (
any_component_changed ::< Piece > ( )
any_component_added ::< Piece > ( )
. or_else ( any_component_changed ::< Piece > ( ) )
. or_else ( any_component_added ::< Side > ( ) )
. or_else ( any_component_changed ::< Side > ( ) )
. or_else ( any_component_changed ::< Side > ( ) )
. or_else ( any_component_added ::< BoardIndex > ( ) )
. or_else ( any_component_changed ::< BoardIndex > ( ) )
. or_else ( any_component_changed ::< BoardIndex > ( ) )
. or_else ( any_component_added ::< Animating > ( ) )
. or_else ( any_component_removed ::< Animating > ( ) )
. or_else ( any_component_removed ::< Animating > ( ) )
. or_else ( any_component_removed ::< Captured > ( ) )
. or_else ( any_component_removed ::< Captured > ( ) )
. or_else ( any_component_removed ::< Promoted > ( ) ) ,
. or_else ( any_component_removed ::< Promoted > ( ) )
) ,
set_models
. run_if ( resource_exists ::< tweak ::GameTweaks > )
. run_if (
any_component_changed ::< DisplayModel > ( )
. or_else ( any_component_added ::< DisplayModel > ( ) )
. or_else ( any_component_removed ::< Animating > ( ) )
) ,
) ,
set_board_model . run_if ( any_component_added ::< game ::BoardComponent > ( ) ) ,
set_valid_move_model . run_if ( any_component_added ::< game ::ValidMove > ( ) ) ,
set_tile_hitbox . run_if ( any_component_added ::< game ::Tile > ( ) ) ,
dissolve_animation . run_if ( any_with_component ::< Dissolving > ) ,
dissolve_animation . run_if ( any_with_component ::< Dissolving > ) ,
capture_piece_start . run_if ( any_component_added ::< game ::BeingCaptured > ( ) ) ,
capture_piece_start . run_if ( any_component_added ::< game ::BeingCaptured > ( ) ) ,
capture_piece_end . run_if ( any_component_removed ::< Dissolving > ( ) ) ,
capture_piece_end . run_if ( any_component_removed ::< Dissolving > ( ) ) ,
@ -142,7 +148,8 @@ impl Plugin for Display3dPlugin {
color_grading_tweak . run_if ( resource_exists ::< tweak ::GameTweaks > ) ,
color_grading_tweak . run_if ( resource_exists ::< tweak ::GameTweaks > ) ,
fog_tweak . run_if ( resource_exists ::< tweak ::GameTweaks > ) ,
fog_tweak . run_if ( resource_exists ::< tweak ::GameTweaks > ) ,
bloom_tweak . run_if ( resource_exists ::< tweak ::GameTweaks > ) ,
bloom_tweak . run_if ( resource_exists ::< tweak ::GameTweaks > ) ,
update_pieces . run_if ( resource_exists ::< tweak ::GameTweaks > ) ,
set_models . run_if ( resource_exists ::< tweak ::GameTweaks > ) ,
update_pieces . run_if ( resource_exists ::< tweak ::GameTweaks > ) . after ( set_models ) ,
) ,
) ,
)
)
. add_systems (
. add_systems (
@ -303,6 +310,7 @@ fn initialize(mut commands: Commands, board: Res<game::Board>, assets: Res<Asset
Display3d ,
Display3d ,
DisplayState ::Display3d ,
DisplayState ::Display3d ,
game ::BoardComponent ,
game ::BoardComponent ,
DisplayModel ( "display3d_models_scenes_board" ) ,
SceneBundle {
SceneBundle {
visibility : Visibility ::Hidden ,
visibility : Visibility ::Hidden ,
.. default ( )
.. default ( )
@ -326,6 +334,7 @@ fn initialize(mut commands: Commands, board: Res<game::Board>, assets: Res<Asset
mesh : assets . hitbox_shape . clone ( ) ,
mesh : assets . hitbox_shape . clone ( ) ,
material : assets . hitbox_material . clone ( ) ,
material : assets . hitbox_material . clone ( ) ,
visibility : Visibility ::Hidden ,
visibility : Visibility ::Hidden ,
transform : Transform ::from_translation ( board_translation ( & index ) ) ,
.. default ( )
.. default ( )
} ,
} ,
side ,
side ,
@ -340,6 +349,7 @@ fn initialize(mut commands: Commands, board: Res<game::Board>, assets: Res<Asset
parent . spawn ( (
parent . spawn ( (
DisplayState ::Display3d ,
DisplayState ::Display3d ,
Display3d ,
Display3d ,
DisplayModel ( "display3d_models_scenes_valid_move" ) ,
index ,
index ,
SceneBundle {
SceneBundle {
visibility : Visibility ::Hidden ,
visibility : Visibility ::Hidden ,
@ -372,6 +382,7 @@ fn initialize(mut commands: Commands, board: Res<game::Board>, assets: Res<Asset
transform ,
transform ,
.. default ( )
.. default ( )
} ,
} ,
DisplayModel ( game ::piece_model_key ( * piece , side ) ) ,
game ::Selectable ,
game ::Selectable ,
Dissolvable {
Dissolvable {
start : 1.0 ,
start : 1.0 ,
@ -528,32 +539,36 @@ fn fix_skybox(
}
}
}
}
fn set_board_model (
#[ derive(Debug, Component) ]
mut boards : Query < & mut Handle < Scene > , ( Added < game ::BoardComponent > , With < Display3d > ) > ,
struct DisplayModel ( & ' static str ) ;
fn set_models (
mut query : Query < ( Entity , & mut Handle < Scene > , & DisplayModel ) > ,
children : Query < & Children > ,
active_animation_players : Query < & AnimationPlayer , With < Animating > > ,
gltfs : Res < Assets < Gltf > > ,
gltfs : Res < Assets < Gltf > > ,
tweaks : Res < Assets < Tweaks > > ,
tweaks : Res < Assets < Tweaks > > ,
tweaks_file : Res < tweak ::GameTweaks > ,
tweaks_file : Res < tweak ::GameTweaks > ,
) {
) {
let tweak = tweaks
let tweak = tweaks . get ( tweaks_file . handle . clone ( ) ) . expect ( "Load tweakfile" ) ;
. get ( tweaks_file . handle . clone ( ) )
let assets_handle = tweak . get_handle ::< Gltf > ( "display3d_models_assets_file" ) . unwrap ( ) ;
. expect ( "Load tweakfile" ) ;
let gltf = gltfs . get ( assets_handle ) . expect ( "Load GLTF content" ) ;
boards . iter_mut ( ) . for_each ( | mut handle | {
debug ! ( "Setting board model" ) ;
query . iter_mut ( ) . for_each ( | ( entity , mut handle , DisplayModel ( key ) ) | {
let assets_handle = tweak
// Check if any children are animating
. get_handle ::< Gltf > ( "display3d_models_assets_file" )
if active_animation_players
. unwrap ( ) ;
. iter_many ( children . iter_descendants ( entity ) )
let gltf = gltfs . get ( assets_handle ) . expect ( "Load GLTF content" ) ;
. count ( ) > 0 {
* handle = gltf
info ! ( "Piece {:?} is animating. Skipping..." , entity ) ;
. named_scenes
} else {
. get (
let scene = tweak . get ::< String > ( key ) . unwrap ( ) ;
tweak
let new_handle = gltf . named_scenes . get ( scene . as_str ( ) ) . expect ( "Game board model" ) ;
. get ::< String > ( "display3d_models_scenes_board" )
if * new_handle ! = * handle {
. unwrap ( )
info ! ( "Updating piece for {:?}" , entity ) ;
. as_str ( ) ,
* handle = new_handle . clone ( ) ;
)
}
. expect ( "Game board model" )
}
. clone ( ) ;
} )
} ) ;
}
}
/// Given a board index returns the Vec3 location in space
/// Given a board index returns the Vec3 location in space
@ -637,29 +652,15 @@ fn mouse_zoom(
// Essentially we iterate over every piece and set the appropriate model and texture
// Essentially we iterate over every piece and set the appropriate model and texture
fn update_pieces (
fn update_pieces (
mut query : Query < (
mut query : Query < (
Entity ,
& Piece ,
& Side ,
& BoardIndex ,
& BoardIndex ,
& mut Transform ,
& mut Transform ,
& mut Handle < Scene > ,
& mut DisplayModel ,
& Side ,
& Piece ,
) > ,
) > ,
children : Query < & Children > ,
active_animation_players : Query < & AnimationPlayer , With < Animating > > ,
gltfs : Res < Assets < Gltf > > ,
tweaks : Res < Assets < Tweaks > > ,
tweaks_file : Res < tweak ::GameTweaks > ,
) {
) {
let tweak = tweaks
. get ( tweaks_file . handle . clone ( ) )
. expect ( "Load tweakfile" ) ;
let assets_handle = tweak
. get_handle ::< Gltf > ( "display3d_models_assets_file" )
. unwrap ( ) ;
let models = gltfs . get ( assets_handle ) . unwrap ( ) ;
query . iter_mut ( ) . for_each (
query . iter_mut ( ) . for_each (
| ( entity, piece , side , board_index, mut transform , mut scen e) | {
| ( board_index , mut transform , mut display_model , side , piece ) | {
// 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 {
@ -667,34 +668,9 @@ fn update_pieces(
transform . translation = new_translation ;
transform . translation = new_translation ;
}
}
// Check if any children are animating
let key = game ::piece_model_key ( * piece , * side ) ;
let animating = active_animation_players
if display_model . 0 ! = key {
. iter_many ( children . iter_descendants ( entity ) )
* display_model = DisplayModel ( key ) ;
. count ( ) ;
if animating > 0 {
debug ! ( "Piece {:?} is animating. Skipping..." , entity ) ;
} else {
debug ! ( "Checking piece object scene for {:?}" , entity ) ;
// Find name of this piece's model scene
let scene_tweak_name : Option < String > = match ( piece , side ) {
( Piece ::Pawn , Side ::A ) = > tweak . get ( "display3d_models_scenes_pawn_red" ) ,
( Piece ::Pawn , Side ::B ) = > tweak . get ( "display3d_models_scenes_pawn_blue" ) ,
( Piece ::Drone , Side ::A ) = > tweak . get ( "display3d_models_scenes_drone_red" ) ,
( Piece ::Drone , Side ::B ) = > tweak . get ( "display3d_models_scenes_drone_blue" ) ,
( Piece ::Queen , Side ::A ) = > tweak . get ( "display3d_models_scenes_queen_red" ) ,
( Piece ::Queen , Side ::B ) = > tweak . get ( "display3d_models_scenes_queen_blue" ) ,
} ;
// Get model scene for this piece
let scene_handle = models . named_scenes . get ( & scene_tweak_name . unwrap ( ) ) . unwrap ( ) ;
// Set scene model for this piece
if * scene ! = * scene_handle {
warn ! ( "Updating scene for piece {:?}" , entity ) ;
* scene = scene_handle . clone ( ) ;
}
}
}
} ,
} ,
) ;
) ;
@ -823,41 +799,6 @@ fn moves_gizmo(
} ) ;
} ) ;
}
}
fn set_valid_move_model (
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 > ,
) {
let tweak = tweaks
. get ( tweaks_file . handle . clone ( ) )
. expect ( "Load tweakfile" ) ;
let assets_handle = tweak
. get_handle ::< Gltf > ( "display3d_models_assets_file" )
. unwrap ( ) ;
if let Some ( gltf ) = gltfs . get ( assets_handle ) {
debug ! ( "Setting valid move model" ) ;
events . iter_mut ( ) . for_each ( | ( mut handle , mut visibility ) | {
* handle = gltf
. named_scenes
. get (
tweak
. get ::< String > ( "display3d_models_scenes_valid_move" )
. unwrap ( )
. as_str ( ) ,
)
. unwrap ( )
. clone ( ) ;
* visibility = Visibility ::Hidden ;
} )
}
}
fn pick_up (
fn pick_up (
mut events : Query <
mut events : Query <
( Entity , & game ::Piece ) ,
( Entity , & game ::Piece ) ,
@ -1002,16 +943,6 @@ fn put_down(
} )
} )
}
}
fn set_tile_hitbox (
mut events : Query < ( & mut Transform , & BoardIndex ) , ( With < Display3d > , Added < game ::Tile > ) > ,
) {
events . iter_mut ( ) . for_each ( | ( mut transform , index ) | {
debug ! ( "Setting tile hitbox" ) ;
* transform = Transform ::from_translation ( board_translation ( index ) ) ;
} ) ;
}
fn opening_animation (
fn opening_animation (
mut players : Query < & mut AnimationPlayer , ( With < Camera > , With < Display3d > ) > ,
mut players : Query < & mut AnimationPlayer , ( With < Camera > , With < Display3d > ) > ,
mut query : Query < ( Entity , & Dissolvable ) , Or < ( With < BoardComponent > , With < Piece > ) > > ,
mut query : Query < ( Entity , & Dissolvable ) , Or < ( With < BoardComponent > , With < Piece > ) > > ,