From 837c345ffeb8bb15a33896704c67ee53dfa99a20 Mon Sep 17 00:00:00 2001 From: "Elijah C. Voigt" Date: Tue, 12 Dec 2023 21:02:58 -0800 Subject: [PATCH] Making progress toward 0.12 upgrade completion --- src/display3d.rs | 118 +++++++++++++++++++++++++++++++++++++++-------- src/loading.rs | 2 + src/tweak.rs | 23 ++++----- 3 files changed, 112 insertions(+), 31 deletions(-) diff --git a/src/display3d.rs b/src/display3d.rs index 7ebfa36..f7d99f1 100644 --- a/src/display3d.rs +++ b/src/display3d.rs @@ -1,3 +1,5 @@ +use std::path::Path; + use crate::{ game::{Board, BoardIndex, Piece, Side}, prelude::*, @@ -20,7 +22,7 @@ use bevy::{ render_resource::{TextureViewDescriptor, TextureViewDimension}, view::ColorGrading, }, - window::PrimaryWindow, + window::PrimaryWindow, asset::AssetPath, }; use serde::Deserialize; @@ -106,7 +108,7 @@ pub(crate) struct Display3d; #[derive(Debug, Component)] struct TilesComponent; -#[derive(Debug, Resource)] +#[derive(Debug, Resource, Clone)] struct AssetsMap { models: Handle, skybox: Handle, @@ -122,25 +124,27 @@ fn load_assets( mut commands: Commands, mut meshes: ResMut>, mut materials: ResMut>, - tweaks: Res>, + tweak_file: Res, + tweak_files: Res>, ) { + let hitbox_shape = meshes.add(shape::Box::new(1.0, 0.1, 1.0).into()); + let hitbox_material = materials.add(StandardMaterial { + base_color: Color::NONE, + perceptual_roughness: 0.0, + reflectance: 0.0, + alpha_mode: AlphaMode::Blend, + ..default() + }); + let handle = server.load("martian.tweak.toml"); - if let Some(tweak) = tweaks.get(&handle) { - let hitbox_shape = meshes.add(shape::Box::new(1.0, 0.1, 1.0).into()); - let hitbox_material = materials.add(StandardMaterial { - base_color: Color::NONE, - perceptual_roughness: 0.0, - reflectance: 0.0, - alpha_mode: AlphaMode::Blend, - ..default() - }); - commands.insert_resource(AssetsMap { - models: server.load(tweak.display3d.models.assets_file.as_str().clone()), - skybox: server.load(tweak.display3d.models.skybox_file.as_str().clone()), - hitbox_shape, - hitbox_material, - }); - } + let tweak_file = tweak_files.get(handle).unwrap(); + let asset_map = AssetsMap { + models: tweak_file.display3d.models.assets_handle.clone(), + skybox: tweak_file.display3d.models.skybox_handle.clone(), + hitbox_shape, + hitbox_material, + }; + commands.insert_resource(asset_map.clone()); } /// Initialize the 3d board @@ -866,7 +870,7 @@ fn switch_sides( pub(crate) mod tweaks { use bevy::{ - core_pipeline::tonemapping::Tonemapping, pbr::ScreenSpaceAmbientOcclusionQualityLevel, + core_pipeline::tonemapping::Tonemapping, pbr::ScreenSpaceAmbientOcclusionQualityLevel, asset::LoadContext, }; use super::*; @@ -889,6 +893,36 @@ pub(crate) mod tweaks { pub lights: LightTweaks, } + impl Display3dTweaks { + pub fn load_dependencies(&mut self, load_context: &mut LoadContext) { + self.models.assets_handle = load_context.load(self.models.assets_file.clone()); + self.models.skybox_handle = load_context.load(self.models.skybox_file.clone()); + + // self.models.scenes.queen_handle = load_context.load(self.models.scenes.queen.clone()); + // self.models.scenes.drone_handle = load_context.load(self.models.scenes.drone.clone()); + // self.models.scenes.pawn_handle = load_context.load(self.models.scenes.pawn.clone()); + // self.models.scenes.board_handle = load_context.load(self.models.scenes.board.clone()); + // self.models.scenes.valid_move_handle = load_context.load(self.models.scenes.valid_move.clone()); + + // self.models.animations.intro_a_handle = load_context.load(self.models.animations.intro_a.clone()); + // self.models.animations.intro_b_handle = load_context.load(self.models.animations.xxx.clone()); + // self.models.animations.turn_a_handle = load_context.load(self.models.animations.turn_a.clone()); + // self.models.animations.turn_b_handle = load_context.load(self.models.animations.turn_b.clone()); + // self.models.animations.pick_up_handle = load_context.load(self.models.animations.pick_up.clone()); + // self.models.animations.put_down_handle = load_context.load(self.models.animations.put_down.clone()); + // self.models.animations.idle_handle = load_context.load(self.models.animations.idle.clone()); + + // self.models.materials.queen_red_handle = load_context.load(self.models.materials.queen_red.clone()); + // self.models.materials.queen_blue_handle = load_context.load(self.models.materials.queen_blue.clone()); + // self.models.materials.drone_red_handle = load_context.load(self.models.materials.drone_red.clone()); + // self.models.materials.drone_blue_handle = load_context.load(self.models.materials.drone_blue.clone()); + // self.models.materials.pawn_red_handle = load_context.load(self.models.materials.xxx.clone()); + // self.models.materials.pawn_blue_handle = load_context.load(self.models.materials.pawn_blue.clone()); + // self.models.materials.dots_red_handle = load_context.load(self.models.materials.dots_red.clone()); + // self.models.materials.dots_blue_handle = load_context.load(self.models.materials.dots_blue.clone()); + } + } + #[derive(Debug, Deserialize, Default)] pub(crate) struct ColorTweaks { #[serde(default)] @@ -1089,7 +1123,11 @@ pub(crate) mod tweaks { #[derive(Debug, Deserialize, Default, Clone)] pub(crate) struct ModelTweaks { pub assets_file: String, + #[serde(skip)] + pub assets_handle: Handle, pub skybox_file: String, + #[serde(skip)] + pub skybox_handle: Handle, pub scenes: SceneTweaks, pub animations: AnimationTweaks, pub materials: MaterialTweaks, @@ -1098,33 +1136,73 @@ pub(crate) mod tweaks { #[derive(Debug, Deserialize, Default, Clone)] pub(crate) struct SceneTweaks { pub queen: String, + // #[serde(skip)] + // pub queen_handle: Handle, pub drone: String, + // #[serde(skip)] + // pub drone_handle: Handle, pub pawn: String, + // #[serde(skip)] + // pub pawn_handle: Handle, pub board: String, + // #[serde(skip)] + // pub board_handle: Handle, pub valid_move: String, + // #[serde(skip)] + // pub valid_move_handle: Handle, } #[derive(Debug, Deserialize, Default, Clone)] pub(crate) struct AnimationTweaks { pub intro_a: String, + // #[serde(skip)] + // pub intro_a_handle: Handle, pub intro_b: String, + // #[serde(skip)] + // pub intro_b_handle: Handle, pub turn_a: String, + // #[serde(skip)] + // pub turn_a_handle: Handle, pub turn_b: String, + // #[serde(skip)] + // pub turn_b_handle: Handle, pub pick_up: String, + // #[serde(skip)] + // pub pick_up_handle: Handle, pub put_down: String, + // #[serde(skip)] + // pub put_down_handle: Handle, pub idle: String, + // #[serde(skip)] + // pub idle_handle: Handle, } #[derive(Debug, Deserialize, Default, Clone)] pub(crate) struct MaterialTweaks { pub queen_red: String, + // #[serde(skip)] + // pub queen_red_handle: Handle, pub queen_blue: String, + // #[serde(skip)] + // pub queen_blue_handle: Handle, pub drone_red: String, + // #[serde(skip)] + // pub drone_red_handle: Handle, pub drone_blue: String, + // #[serde(skip)] + // pub drone_blue_handle: Handle, pub pawn_red: String, + // #[serde(skip)] + // pub pawn_red_handle: Handle, pub pawn_blue: String, + // #[serde(skip)] + // pub pawn_blue_handle: Handle, pub dots_red: String, + // #[serde(skip)] + // pub dots_red_handle: Handle, pub dots_blue: String, + // #[serde(skip)] + // pub dots_blue_handle: Handle, } #[derive(Debug, Deserialize, Default, Clone)] diff --git a/src/loading.rs b/src/loading.rs index 0b65a08..ae63db3 100644 --- a/src/loading.rs +++ b/src/loading.rs @@ -67,6 +67,8 @@ fn loading( .ids() .all(|id| server.is_loaded_with_dependencies(id)); + info!("s {} g {} t {}", s, g, t); + if s && g && t { next_state.set(GameState::Menu) } diff --git a/src/tweak.rs b/src/tweak.rs index 3f03152..9c99436 100644 --- a/src/tweak.rs +++ b/src/tweak.rs @@ -2,7 +2,7 @@ use crate::prelude::*; use bevy::asset::AsyncReadExt; use bevy::{ asset::{io::Reader, AssetLoader, LoadContext}, - reflect::{TypePath, TypeUuid}, + reflect::TypePath, utils::BoxedFuture, }; use serde::Deserialize; @@ -17,23 +17,23 @@ impl Plugin for TweakPlugin { fn build(&self, app: &mut App) { app.add_systems(OnEnter(GameState::Loading), load_tweakfile); - app.register_asset_loader(TweakfileLoader) - .init_asset::(); + app.init_asset::().register_asset_loader(TweakfileLoader); } } fn load_tweakfile(server: Res, mut commands: Commands) { let handle: Handle = server.load("martian.tweak.toml"); - commands.insert_resource(GameTweakfile(handle)); + commands.insert_resource(GameTweakfile { handle }); } #[derive(Debug, Resource)] -struct GameTweakfile(Handle); +pub(crate) struct GameTweakfile { + pub handle: Handle, +} /// Tweakfile contains tweaks made to other parts of the game -#[derive(Debug, Deserialize, TypeUuid, TypePath, Asset)] -#[uuid = "e5768efe-edce-4267-bdf4-dd8f8ca613c7"] -pub(crate) struct Tweakfile { +#[derive(Debug, Deserialize, TypePath, Asset)] +pub struct Tweakfile { #[serde(default)] pub audio: audio::AudioTweaks, #[serde(default)] @@ -46,7 +46,7 @@ pub(crate) struct Tweakfile { pub struct TweakfileLoader; #[derive(Debug, Error)] -enum TweakfileError { +pub enum TweakfileError { #[error("Failed to read file")] IO(#[from] std::io::Error), #[error("Failed to decode file")] @@ -64,13 +64,14 @@ impl AssetLoader for TweakfileLoader { &'a self, reader: &'a mut Reader, _settings: &'a Self::Settings, - _load_context: &'a mut LoadContext, + load_context: &'a mut LoadContext, ) -> BoxedFuture<'a, Result> { Box::pin(async move { let mut bytes = Vec::new(); reader.read_to_end(&mut bytes).await?; let s = std::str::from_utf8(bytes.as_slice())?; - let result = toml::from_str::(s)?; + let mut result = toml::from_str::(s)?; + result.display3d.load_dependencies(load_context); Ok(result) }) }