From dbcd8df94f6d60c95695d8f689545e37c4bfcf0b Mon Sep 17 00:00:00 2001 From: mosure Date: Sun, 28 Jul 2024 19:59:40 -0500 Subject: [PATCH] feat: render-mode cli arg --- src/primitive.rs | 2 +- src/render/depth.wgsl | 2 +- src/render/mod.rs | 38 ++++++++++++++++++++++++++++++++------ src/scene/room.rs | 43 ++++++++++++++----------------------------- tools/viewer.rs | 7 +++++++ 5 files changed, 55 insertions(+), 37 deletions(-) diff --git a/src/primitive.rs b/src/primitive.rs index f4f6e7c..0df28c1 100644 --- a/src/primitive.rs +++ b/src/primitive.rs @@ -438,7 +438,7 @@ fn build_primitive( } -fn process_primitives( +pub fn process_primitives( mut commands: Commands, mut meshes: ResMut>, mut standard_materials: ResMut>, diff --git a/src/render/depth.wgsl b/src/render/depth.wgsl index fdab01e..15c9272 100644 --- a/src/render/depth.wgsl +++ b/src/render/depth.wgsl @@ -13,5 +13,5 @@ fn depth_to_rgb(depth: f32) -> vec3 { @fragment fn fragment(in: VertexOutput) -> @location(0) vec4 { - return vec4(depth_to_rgb(in.position.w), 1.0); + return vec4(vec3(in.position.w), 1.0); } diff --git a/src/render/mod.rs b/src/render/mod.rs index 7a417c3..4e60571 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -2,12 +2,29 @@ use bevy::{ prelude::*, render::render_resource::Face, }; +use bevy_args::{ + Deserialize, + Serialize, + ValueEnum, +}; + +use crate::primitive::process_primitives; pub mod depth; pub mod normal; -#[derive(Default, Debug, Resource, Reflect)] +#[derive( + Debug, + Default, + Clone, + PartialEq, + Serialize, + Deserialize, + Reflect, + Resource, + ValueEnum, +)] #[reflect(Resource)] pub enum RenderMode { #[default] @@ -29,11 +46,20 @@ impl Plugin for RenderPlugin { app.add_plugins(normal::NormalPlugin); // TODO: add wireframe depth, pbr disable, normals - app.add_systems(PostUpdate, auto_disable_pbr_material::); - app.add_systems(PostUpdate, auto_disable_pbr_material::); - - app.add_systems(PostUpdate, apply_render_modes); - app.add_systems(PostUpdate, enable_pbr_material); + app.add_systems( + Update, + apply_render_modes.after(process_primitives), + ); + app.add_systems( + Update, + ( + auto_disable_pbr_material::, + auto_disable_pbr_material::, + enable_pbr_material, + ) + .after(apply_render_modes) + .after(process_primitives) + ); } } diff --git a/src/scene/room.rs b/src/scene/room.rs index 3ec2f6c..2f78887 100644 --- a/src/scene/room.rs +++ b/src/scene/room.rs @@ -52,6 +52,7 @@ impl Plugin for ZeroverseRoomPlugin { #[derive(Clone, Debug, Reflect, Resource)] #[reflect(Resource)] pub struct ZeroverseRoomSettings { + pub camera_floor_padding: f32, pub camera_wall_padding: f32, pub center_primitive_count: CountSampler, pub center_primitive_scale_sampler: ScaleSampler, @@ -69,6 +70,7 @@ impl Default for ZeroverseRoomSettings { // }; Self { + camera_floor_padding: 3.0, camera_wall_padding: 1.0, center_primitive_count: CountSampler::Bounded(4, 10), center_primitive_scale_sampler: ScaleSampler::Bounded( @@ -78,7 +80,7 @@ impl Default for ZeroverseRoomSettings { center_primitive_settings: ZeroversePrimitiveSettings::default(), looking_at_sampler: LookingAtSampler::Sphere { geometry: Sphere::new(4.0), - transform: Transform::from_translation(Vec3::new(0.0, 1.0, 0.0)), + transform: Transform::from_translation(Vec3::new(0.0, 3.0, 0.0)), }, room_size: ScaleSampler::Bounded( Vec3::new(12.0, 8.0, 12.0), @@ -105,27 +107,6 @@ fn setup_scene( .insert(SpatialBundle::default()) .with_children(|commands| { {// outer walls - // // bounding box - // let outer_walls_settings = ZeroversePrimitiveSettings { - // invert_normals: true, - // available_types: vec![ZeroversePrimitives::Cuboid], // TODO: change to plane, support multi-material hull - // components: 1, - // wireframe_probability: 1.0, - // noise_probability: 0.0, - // cast_shadows: false, - // position_sampler: PositionSampler::Exact { - // position: Vec3::new(0.0, scale.y / 2.0, 0.0), - // }, - // rotation_sampler: RotationSampler::Identity, - // scale_sampler: ScaleSampler::Exact(scale), - // ..default() - // }; - - // commands.spawn(PrimitiveBundle { - // settings: outer_walls_settings, - // ..default() - // }); - let base_plane_settings = ZeroversePrimitiveSettings { cull_mode: Some(Face::Front), available_types: vec![ZeroversePrimitives::Plane], @@ -259,9 +240,9 @@ fn setup_scene( let center_object_height = 8.0; let center_object_sampler = PositionSampler::Cube { extents: Vec3::new( - scale.x / 2.0, + scale.x / 1.5, center_object_height / 2.0, - scale.z / 2.0, + scale.z / 1.5, ), }; @@ -293,10 +274,10 @@ fn setup_scene( }); for _ in 0..scene_settings.num_cameras { - let size = Vec3::new( - scale.x - room_settings.camera_wall_padding, - scale.y / 2.0, - scale.z - room_settings.camera_wall_padding, + let size: Vec3 = Vec3::new( + scale.x - room_settings.camera_wall_padding * 2.0, + scale.y - room_settings.camera_floor_padding, + scale.z - room_settings.camera_wall_padding * 2.0, ); commands.spawn(ZeroverseCamera { @@ -304,7 +285,11 @@ fn setup_scene( sampler_type: CameraPositionSamplerType::Band { size, rotation: Quat::IDENTITY, - translate: Vec3::new(0.0, scale.y / 2.0 + size.y / 2.0, 0.0), + translate: Vec3::new( + 0.0, + room_settings.camera_floor_padding + size.y / 2.0, + 0.0, + ), }, looking_at: room_settings.looking_at_sampler.clone(), }, diff --git a/tools/viewer.rs b/tools/viewer.rs index da6a701..afd28d6 100644 --- a/tools/viewer.rs +++ b/tools/viewer.rs @@ -31,6 +31,7 @@ use bevy_zeroverse::{ }, plucker::ZeroversePluckerSettings, primitive::ScaleSampler, + render::RenderMode, scene::{ room::ZeroverseRoomSettings, RegenerateSceneEvent, @@ -94,6 +95,9 @@ struct BevyZeroverseViewer { #[arg(long, default_value = "0.0")] yaw_speed: f32, + #[arg(long, value_enum, default_value_t = RenderMode::Color)] + render_mode: RenderMode, + #[arg(long, value_enum, default_value_t = ZeroverseSceneType::Object)] scene_type: ZeroverseSceneType, } @@ -112,6 +116,7 @@ impl Default for BevyZeroverseViewer { name: "bevy_zeroverse".to_string(), regenerate_ms: 0, yaw_speed: 0.0, + render_mode: Default::default(), scene_type: Default::default(), } } @@ -181,6 +186,8 @@ fn viewer_app() { app.add_plugins(BevyZeroversePlugin); + app.insert_resource(args.render_mode); + app.insert_resource(DefaultZeroverseCamera { resolution: UVec2::new(args.width as u32, args.height as u32).into(), });