Files
black-hole/src/app.rs
2025-11-08 11:33:40 -05:00

151 lines
3.9 KiB
Rust

use std::default;
use bevy::{
asset::RenderAssetUsages,
image::ImageSamplerDescriptor,
prelude::*,
render::{
render_resource::{Extent3d, SamplerDescriptor, TextureDimension, TextureFormat, TextureUsages},
view::RenderLayers,
},
window::PrimaryWindow,
};
use iyes_perf_ui::prelude::*;
use crate::{
components::rt::RTCamera,
render::pipeline::{TracerPipelinePlugin, TracerRenderTextures, TracerUniforms},
};
pub struct Blackhole;
#[derive(States, Debug, Clone, PartialEq, Eq, Hash, Default)]
pub enum AssetLoad {
#[default]
Pending,
Loading,
Init,
Ready,
}
impl Plugin for Blackhole {
fn build(&self, app: &mut App) {
app.register_type::<TracerRenderTextures>();
app.init_state::<AssetLoad>();
app.add_systems(Startup, setup)
.add_systems(Update, asset_load_check.run_if(in_state(AssetLoad::Loading)))
.add_systems(Update, prepare_skybox.run_if(in_state(AssetLoad::Init)))
.add_systems(Last, asset_init.run_if(in_state(AssetLoad::Init)));
app.add_plugins(TracerPipelinePlugin);
app.insert_resource(TracerUniforms {
sky_color: LinearRgba::rgb(0.1, 0.0, 0.01),
..default()
});
//Perf UI
app.add_plugins(bevy::diagnostic::FrameTimeDiagnosticsPlugin::default())
.add_plugins(bevy::diagnostic::EntityCountDiagnosticsPlugin)
.add_plugins(bevy::diagnostic::SystemInformationDiagnosticsPlugin)
.add_plugins(PerfUiPlugin);
}
}
fn setup(
mut commands: Commands,
mut images: ResMut<Assets<Image>>,
window: Single<&Window, With<PrimaryWindow>>,
asset_server: Res<AssetServer>,
mut load_state: ResMut<NextState<AssetLoad>>,
) {
commands.spawn((
PerfUiRoot::default(),
PerfUiEntryFPS::default(),
PerfUiEntryFPSWorst::default(),
PerfUiEntryFrameTime::default(),
PerfUiEntryFrameTimeWorst::default(),
));
let size = window.physical_size();
let extent = Extent3d {
width: size.x,
height: size.y,
..Default::default()
};
const PIXEL_FORMAT: TextureFormat = TextureFormat::Rgba32Float;
const PIXEL_SIZE: usize = 16;
let mut image = Image::new_fill(
extent,
TextureDimension::D2,
&[255; PIXEL_SIZE],
PIXEL_FORMAT,
RenderAssetUsages::RENDER_WORLD,
);
image.texture_descriptor.usage = TextureUsages::TEXTURE_BINDING
| TextureUsages::STORAGE_BINDING
| TextureUsages::COPY_DST
| TextureUsages::RENDER_ATTACHMENT;
let img0 = images.add(image.clone());
let img1 = images.add(image);
let skybox = asset_server.load("sky-test.png");
commands.spawn((
Name::new("Render Sprite"),
Sprite {
image: img0.clone(),
custom_size: Some(size.as_vec2()),
..default()
},
Transform::from_translation(Vec3::ZERO),
));
commands.spawn((Camera2d, RenderLayers::layer(0)));
commands
.spawn((
Camera3d::default(),
// Camera { order: -1, ..default() },
// Projection::Perspective(PerspectiveProjection {
// aspect_ratio: size.x as f32 / size.y as f32,
// ..default()
// }),
RTCamera,
RenderLayers::layer(1),
Transform::from_xyz(0.0, 5.0, 20.0).looking_at(Vec3::ZERO, Vec3::Y),
Name::new("RT Camera"),
))
.insert(Camera { order: -1, ..default() });
commands.insert_resource(TracerRenderTextures {
main: img0,
secondary: img1,
skybox,
});
load_state.set(AssetLoad::Loading);
}
fn asset_load_check(
mut load_state: ResMut<NextState<AssetLoad>>,
tracer_textures: Res<TracerRenderTextures>,
asset_server: Res<AssetServer>,
) {
let skybox_load_state = asset_server.load_state(tracer_textures.skybox.id());
if skybox_load_state.is_loaded() {
load_state.set(AssetLoad::Init);
info!("Assets Loaded");
}
}
fn prepare_skybox(tracer_textures: Res<TracerRenderTextures>, image_assets: Res<Assets<Image>>) {
let sb = image_assets.get(tracer_textures.skybox.id()).unwrap();
}
fn asset_init(mut load_state: ResMut<NextState<AssetLoad>>) {
load_state.set(AssetLoad::Ready);
info!("Assets Initialized");
}