spawn a sphere and be able to move the camera
This commit is contained in:
commit
9edc499a53
4 changed files with 7863 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/target
|
7694
Cargo.lock
generated
Normal file
7694
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
11
Cargo.toml
Normal file
11
Cargo.toml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
[package]
|
||||||
|
name = "spointer"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
anise = "0.5.4"
|
||||||
|
bevy = "0.16.0"
|
||||||
|
hifitime = "4.0.2"
|
||||||
|
log = { version = "0.4.27", features = ["std"] }
|
||||||
|
nyx-space = "2.1.0"
|
157
src/main.rs
Normal file
157
src/main.rs
Normal file
|
@ -0,0 +1,157 @@
|
||||||
|
use anise::{
|
||||||
|
almanac::metaload::MetaFile,
|
||||||
|
constants::{
|
||||||
|
celestial_objects::{MOON, SUN},
|
||||||
|
frames::{EARTH_J2000, IAU_EARTH_FRAME},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
use hifitime::{Epoch, Unit};
|
||||||
|
use log::warn;
|
||||||
|
use nyx_space::{
|
||||||
|
cosmic::{Mass, MetaAlmanac, Orbit, SRPData},
|
||||||
|
dynamics::{Harmonics, OrbitalDynamics, SolarPressure, SpacecraftDynamics},
|
||||||
|
io::{gravity::HarmonicsMem, ExportCfg},
|
||||||
|
od::GroundStation,
|
||||||
|
propagators::Propagator,
|
||||||
|
Spacecraft, State,
|
||||||
|
};
|
||||||
|
|
||||||
|
use bevy::{
|
||||||
|
color::palettes::css::BLUE,
|
||||||
|
pbr::wireframe::{WireframeColor, WireframeConfig, WireframePlugin},
|
||||||
|
platform::collections::HashSet,
|
||||||
|
prelude::*,
|
||||||
|
};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut app = App::new();
|
||||||
|
app.add_plugins((DefaultPlugins, WireframePlugin::default()))
|
||||||
|
.insert_gizmo_config(DefaultGizmoConfigGroup, GizmoConfig::default())
|
||||||
|
.insert_resource(DebugCamOffset::default())
|
||||||
|
.insert_resource(WireframeConfig {
|
||||||
|
global: true,
|
||||||
|
..Default::default()
|
||||||
|
})
|
||||||
|
.add_systems(Startup, (spawn_earth, spawn_camera))
|
||||||
|
.add_systems(Update, (close_on_esc, update_camera_offset, move_camera))
|
||||||
|
.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Resource)]
|
||||||
|
pub struct DebugCamOffset {
|
||||||
|
pub long: f32,
|
||||||
|
pub dist: f32,
|
||||||
|
pub lat: f32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for DebugCamOffset {
|
||||||
|
fn default() -> Self {
|
||||||
|
DebugCamOffset {
|
||||||
|
// 500 units above los angeles
|
||||||
|
dist: 500.0,
|
||||||
|
lat: 34.2,
|
||||||
|
long: -118.45,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn spawn_earth(
|
||||||
|
mut commands: Commands,
|
||||||
|
mut meshes: ResMut<Assets<Mesh>>,
|
||||||
|
mut materials: ResMut<Assets<StandardMaterial>>,
|
||||||
|
) {
|
||||||
|
let spatial_bundle = (Transform::default(), Visibility::default());
|
||||||
|
let mat = materials.add(StandardMaterial::default());
|
||||||
|
commands.spawn((
|
||||||
|
spatial_bundle,
|
||||||
|
Mesh3d(meshes.add(Sphere::new(100.0).mesh().ico(10).unwrap())),
|
||||||
|
MeshMaterial3d(mat),
|
||||||
|
WireframeColor { color: BLUE.into() },
|
||||||
|
AmbientLight {
|
||||||
|
brightness: 2_000.0,
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn close_on_esc(
|
||||||
|
mut commands: Commands,
|
||||||
|
focused_windows: Query<(Entity, &Window)>,
|
||||||
|
input: Res<ButtonInput<KeyCode>>,
|
||||||
|
) {
|
||||||
|
for (window, focus) in focused_windows.iter() {
|
||||||
|
if !focus.focused {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if input.just_pressed(KeyCode::Escape) {
|
||||||
|
commands.entity(window).despawn();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Default, Component)]
|
||||||
|
struct SpaceCamera;
|
||||||
|
|
||||||
|
fn spawn_camera(mut commands: Commands) {
|
||||||
|
commands
|
||||||
|
.spawn(Camera3d::default())
|
||||||
|
.insert(SpaceCamera)
|
||||||
|
.insert(Transform::default());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn move_camera(camera: Single<&mut Transform, With<SpaceCamera>>, offset: Res<DebugCamOffset>) {
|
||||||
|
let mut xform = camera.into_inner();
|
||||||
|
|
||||||
|
let origin = Vec3::ZERO;
|
||||||
|
let north = Vec3::Y;
|
||||||
|
|
||||||
|
let mut new_xform = Transform::from_translation(origin);
|
||||||
|
new_xform.rotate(Quat::from_axis_angle(north, offset.long.to_radians()));
|
||||||
|
new_xform.rotate(Quat::from_axis_angle(
|
||||||
|
*xform.left(),
|
||||||
|
offset.lat.to_radians(),
|
||||||
|
));
|
||||||
|
new_xform.translation += new_xform.forward() * offset.dist;
|
||||||
|
new_xform.look_at(origin, north);
|
||||||
|
|
||||||
|
*xform = new_xform;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn update_camera_offset(
|
||||||
|
mut offset: ResMut<DebugCamOffset>,
|
||||||
|
mut keys: ResMut<ButtonInput<KeyCode>>,
|
||||||
|
) {
|
||||||
|
let keyset: HashSet<_> = keys.get_pressed().collect();
|
||||||
|
let shifted = keyset.contains(&KeyCode::ShiftLeft) || keyset.contains(&KeyCode::ShiftRight);
|
||||||
|
|
||||||
|
for key in keyset {
|
||||||
|
match key {
|
||||||
|
KeyCode::ArrowLeft => offset.long -= 1.0,
|
||||||
|
KeyCode::ArrowRight => offset.long += 1.0,
|
||||||
|
KeyCode::ArrowUp => {
|
||||||
|
if shifted {
|
||||||
|
offset.lat += 0.5;
|
||||||
|
} else {
|
||||||
|
offset.dist += 10.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
KeyCode::ArrowDown => {
|
||||||
|
if shifted {
|
||||||
|
offset.lat -= 0.5;
|
||||||
|
} else {
|
||||||
|
offset.dist -= 10.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
KeyCode::KeyR => {
|
||||||
|
*offset = DebugCamOffset::default();
|
||||||
|
}
|
||||||
|
_ => continue,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let released: Vec<_> = keys.get_just_released().copied().collect();
|
||||||
|
for key in released {
|
||||||
|
keys.clear_just_released(key);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue