#[cfg(not(feature = "base"))]
#[macro_export]
macro_rules! app_body {
($name:ident) => {
use rust_pixel::game::Game;
use rust_pixel::util::{get_project_path, is_fullscreen_requested, is_fullscreen_fit_requested};
#[cfg(wgpu_web_backend)]
use rust_pixel::render::adapter::wgpu_web_adapter::{input_events_from_web, WgpuWebAdapter};
#[cfg(target_arch = "wasm32")]
use wasm_bindgen::prelude::*;
#[cfg(wgpu_web_backend)]
use log::info;
rust_pixel::paste::paste! {
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen]
pub fn wasm_init_pixel_assets(
game_name: &str,
layer_size: u32,
layer_count: u32,
layer_data: &[u8],
symbol_map_json: &str,
) -> bool {
rust_pixel::wasm_init_pixel_assets(game_name, layer_size, layer_count, layer_data, symbol_map_json)
}
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen]
pub fn wasm_set_app_data(data: &str) {
rust_pixel::set_wasm_app_data(data);
}
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen]
pub fn wasm_on_asset_loaded(url: &str, data: &[u8]) {
rust_pixel::asset::wasm_queue_asset_data(url, data);
}
#[cfg_attr(target_arch = "wasm32", wasm_bindgen)]
pub struct [<$name Game>] {
g: Game<[<$name Model>], [<$name Render>]>,
}
pub fn init_game() -> [<$name Game>] {
#[cfg(target_arch = "wasm32")]
web_sys::console::log_1(&"[init_game] start".into());
let pp = get_project_path();
let fullscreen = is_fullscreen_requested();
let fullscreen_fit = is_fullscreen_fit_requested();
println!("asset path : {:?}, fullscreen: {}, fullscreen_fit: {}", pp, fullscreen, fullscreen_fit);
#[cfg(all(graphics_mode, not(target_arch = "wasm32")))]
{
rust_pixel::init_layered_pixel_assets(stringify!([<$name:lower>]), &pp, fullscreen, fullscreen_fit)
.expect("Failed to initialize layered pixel assets");
}
#[cfg(not(graphics_mode))]
{
rust_pixel::init_game_config(stringify!([<$name:lower>]), &pp, fullscreen, fullscreen_fit);
}
#[cfg(target_arch = "wasm32")]
{
web_sys::console::log_1(&"[init_game] calling init_game_config for wasm".into());
rust_pixel::init_game_config(stringify!([<$name:lower>]), &pp, true, false);
}
#[cfg(target_arch = "wasm32")]
web_sys::console::log_1(&"[init_game] creating Model...".into());
let m = [<$name Model>]::new();
#[cfg(target_arch = "wasm32")]
web_sys::console::log_1(&"[init_game] creating Render...".into());
let r = [<$name Render>]::new();
#[cfg(target_arch = "wasm32")]
web_sys::console::log_1(&"[init_game] creating Game...".into());
let mut g = Game::new(m, r);
#[cfg(target_arch = "wasm32")]
web_sys::console::log_1(&"[init_game] calling g.init()...".into());
g.init();
#[cfg(target_arch = "wasm32")]
web_sys::console::log_1(&"[init_game] done!".into());
[<$name Game>] { g }
}
#[cfg(wgpu_web_backend)]
#[cfg_attr(target_arch = "wasm32", wasm_bindgen)]
impl [<$name Game>] {
pub fn new() -> Self {
init_game()
}
pub fn tick(&mut self, dt: f32) {
#[cfg(target_arch = "wasm32")]
self.g.context.asset_manager.process_queued_assets();
self.g.on_tick(dt);
}
pub fn key_event(&mut self, t: u8, e: web_sys::Event) {
let abase = &self
.g
.context
.adapter
.as_any()
.downcast_ref::<WgpuWebAdapter>()
.unwrap()
.base;
if let Some(pe) = input_events_from_web(t, e, abase.gr.pixel_h, abase.gr.ratio_x, abase.gr.ratio_y, abase.gr.use_tui_height) {
self.g.context.input_events.push(pe);
}
}
pub async fn init_from_cache(&mut self) {
let wa = self
.g
.context
.adapter
.as_any()
.downcast_mut::<WgpuWebAdapter>()
.unwrap();
wa.init_wgpu_from_cache_async().await;
info!("RUST: WGPU Web initialized from cached texture data");
}
pub fn get_ratiox(&mut self) -> f32 {
self.g.context.adapter.get_base().gr.ratio_x
}
pub fn get_ratioy(&mut self) -> f32 {
self.g.context.adapter.get_base().gr.ratio_y
}
pub fn get_canvas_size(&self) -> Vec<u32> {
let (w, h) = self.g.context.adapter.get_canvas_size();
vec![w, h]
}
}
pub fn run() {
let mut g = init_game().g;
g.run().unwrap();
g.render.scene.reset(&mut g.context);
}
}
};
}
#[cfg(not(feature = "base"))]
#[macro_export]
#[allow(clippy::crate_in_macro_def)]
macro_rules! app {
($name:ident, graphics_only) => {
#[cfg(not(graphics_mode))]
compile_error!(concat!(
stringify!($name),
" only supports graphics mode. Use: cargo pixel r ",
stringify!($name),
" g"
));
#[cfg(graphics_mode)]
mod model;
#[cfg(graphics_mode)]
mod render;
#[cfg(graphics_mode)]
use crate::{model::*, render::*};
#[cfg(graphics_mode)]
$crate::app_body!($name);
};
($name:ident, terminal_only) => {
#[cfg(graphics_mode)]
compile_error!(concat!(
stringify!($name),
" only supports terminal mode. Use: cargo pixel r ",
stringify!($name),
" t"
));
#[cfg(not(graphics_mode))]
mod model;
#[cfg(not(graphics_mode))]
mod render;
#[cfg(not(graphics_mode))]
use crate::{model::*, render::*};
#[cfg(not(graphics_mode))]
$crate::app_body!($name);
};
($name:ident, dual) => {
mod model;
#[cfg(not(graphics_mode))]
mod render_terminal;
#[cfg(graphics_mode)]
mod render_graphics;
#[cfg(not(graphics_mode))]
use crate::{model::*, render_terminal::*};
#[cfg(graphics_mode)]
use crate::{model::*, render_graphics::*};
$crate::app_body!($name);
};
($name:ident) => {
mod model;
mod render;
use crate::{model::*, render::*};
$crate::app_body!($name);
};
}