From 68f85d8f1dff5481e1d8f274a78da27cfca443f5 Mon Sep 17 00:00:00 2001 From: Robert Swain Date: Thu, 10 Mar 2022 20:21:20 +0100 Subject: [PATCH 01/17] Add a scene viewer tool --- Cargo.toml | 2 +- tools/scene-viewer/Cargo.toml | 14 ++ tools/scene-viewer/src/main.rs | 233 +++++++++++++++++++++++++++++++++ 3 files changed, 248 insertions(+), 1 deletion(-) create mode 100644 tools/scene-viewer/Cargo.toml create mode 100644 tools/scene-viewer/src/main.rs diff --git a/Cargo.toml b/Cargo.toml index e03574f666edf..d5d5456f88c78 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ repository = "https://github.com/bevyengine/bevy" [workspace] exclude = ["benches", "crates/bevy_ecs_compile_fail_tests"] -members = ["crates/*", "examples/ios", "tools/ci", "errors"] +members = ["crates/*", "examples/ios", "tools/ci", "tools/scene-viewer", "errors"] [features] default = [ diff --git a/tools/scene-viewer/Cargo.toml b/tools/scene-viewer/Cargo.toml new file mode 100644 index 0000000000000..81a117d80f86e --- /dev/null +++ b/tools/scene-viewer/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "scene-viewer" +version = "0.1.0" +edition = "2021" +description = "Scene viewer tool for Bevy" +publish = false +license = "MIT OR Apache-2.0" + +[features] +default = [] +jpeg = ["bevy/jpeg"] + +[dependencies] +bevy = { path = "../../" } diff --git a/tools/scene-viewer/src/main.rs b/tools/scene-viewer/src/main.rs new file mode 100644 index 0000000000000..4d95df14b705f --- /dev/null +++ b/tools/scene-viewer/src/main.rs @@ -0,0 +1,233 @@ +use bevy::{asset::AssetServerSettings, input::mouse::MouseMotion, prelude::*}; + +fn main() { + println!( + " +Controls: + WSAD - forward/back/strafe left/right + LShift - 'run' + E - up + Q - down + L - animate light direction + U - toggle shadows + 5/6 - decrease/increase shadow projection width + 7/8 - decrease/increase shadow projection height + 9/0 - decrease/increase shadow projection near/far +" + ); + App::new() + .insert_resource(AmbientLight { + color: Color::WHITE, + brightness: 1.0 / 5.0f32, + }) + .insert_resource(AssetServerSettings { + asset_folder: "../../".to_string(), + watch_for_changes: true, + }) + .insert_resource(WindowDescriptor { + title: "bevy scene viewer".to_string(), + ..default() + }) + .add_plugins(DefaultPlugins) + .add_startup_system(setup) + .add_system(update_lights) + .add_system(camera_controller) + .run(); +} + +fn setup(mut commands: Commands, asset_server: Res) { + let scene_path = std::env::args() + .nth(1) + .unwrap_or_else(|| "assets/models/FlightHelmet/FlightHelmet.gltf#Scene0".to_string()); + commands.spawn_scene(asset_server.load(&scene_path)); + commands + .spawn_bundle(PerspectiveCameraBundle { + transform: Transform::from_xyz(0.0, 0.0, 1.0).looking_at(Vec3::ZERO, Vec3::Y), + ..default() + }) + .insert(CameraController::default()); + const HALF_SIZE: f32 = 1.0; + commands.spawn_bundle(DirectionalLightBundle { + directional_light: DirectionalLight { + shadow_projection: OrthographicProjection { + left: -HALF_SIZE, + right: HALF_SIZE, + bottom: -HALF_SIZE, + top: HALF_SIZE, + near: -10.0 * HALF_SIZE, + far: 10.0 * HALF_SIZE, + ..default() + }, + shadows_enabled: false, + ..default() + }, + ..default() + }); +} + +const SCALE_STEP: f32 = 0.1; + +fn update_lights( + key_input: Res>, + time: Res