finally realized that bevy uses right handed coords

This commit is contained in:
2024-08-06 20:49:47 -04:00
parent 911cf8d5c3
commit a8409e5720
9 changed files with 42 additions and 25 deletions

View File

@@ -2,7 +2,6 @@ use core::f32;
use bevy::math::{IVec2, UVec2}; use bevy::math::{IVec2, UVec2};
use bevy::prelude::{FloatExt, Vec2}; use bevy::prelude::{FloatExt, Vec2};
use bevy::render::render_resource::encase::internal::BufferMut;
use bevy::utils::default; use bevy::utils::default;
use noise::{NoiseFn, SuperSimplex}; use noise::{NoiseFn, SuperSimplex};
use rayon::iter::{IntoParallelIterator, ParallelIterator}; use rayon::iter::{IntoParallelIterator, ParallelIterator};

View File

@@ -72,12 +72,12 @@ impl Display for HexCoord {
impl HexCoord { impl HexCoord {
pub const DIRECTIONS: [IVec3; 6] = [ pub const DIRECTIONS: [IVec3; 6] = [
IVec3::new(1, -1, 0),
IVec3::new(1, 0, -1),
IVec3::new(0, 1, -1), IVec3::new(0, 1, -1),
IVec3::new(-1, 1, 0), IVec3::new(1, 0, -1),
IVec3::new(-1, 0, 1), IVec3::new(1, -1, 0),
IVec3::new(0, -1, 1), IVec3::new(0, -1, 1),
IVec3::new(-1, 0, 1),
IVec3::new(-1, 1, 0),
]; ];
pub const ZERO: HexCoord = HexCoord { hex: IVec3::ZERO }; pub const ZERO: HexCoord = HexCoord { hex: IVec3::ZERO };

View File

@@ -11,7 +11,7 @@ impl MeshChunkData {
pub fn get_neighbors(&self, coord: &HexCoord) -> [f32; 6] { pub fn get_neighbors(&self, coord: &HexCoord) -> [f32; 6] {
let mut data = [0.; 6]; let mut data = [0.; 6];
let n_tiles = coord.get_neighbors(); let n_tiles = coord.get_neighbors();
for i in 6..0 { for i in 0..6 {
let n = n_tiles[i]; let n = n_tiles[i];
if !n.is_in_bounds(Chunk::SIZE, Chunk::SIZE) { if !n.is_in_bounds(Chunk::SIZE, Chunk::SIZE) {
continue; continue;

View File

@@ -106,6 +106,9 @@ fn hq_placement(
if let Some((_e, dist)) = collision { if let Some((_e, dist)) = collision {
let contact_point = cam_ray.get_point(dist); let contact_point = cam_ray.get_point(dist);
let contact_coord = HexCoord::from_world_pos(contact_point); let contact_coord = HexCoord::from_world_pos(contact_point);
if !map.is_in_bounds(&contact_coord) {
return;
}
let positions = map.hex_select(&contact_coord, 3, true, |pos, h, _| pos.to_world(h)); let positions = map.hex_select(&contact_coord, 3, true, |pos, h, _| pos.to_world(h));
show_indicators(positions, &mut commands, &indicator); show_indicators(positions, &mut commands, &indicator);

View File

@@ -31,7 +31,7 @@ fn setup(mut commands: Commands, mut msaa: ResMut<Msaa>) {
commands commands
.spawn(( .spawn((
Camera3dBundle { Camera3dBundle {
transform: Transform::from_xyz(0., 30., 0.).looking_to(Vec3::Z, Vec3::Y), transform: Transform::from_xyz(0., 30., 0.).looking_to(Vec3::NEG_Z, Vec3::Y),
..default() ..default()
}, },
PhosCamera::default(), PhosCamera::default(),
@@ -138,15 +138,15 @@ fn rts_camera_system(
let mut cam_pos = cam.translation; let mut cam_pos = cam.translation;
if key.pressed(KeyCode::KeyA) { if key.pressed(KeyCode::KeyA) {
cam_move.x = 1.;
} else if key.pressed(KeyCode::KeyD) {
cam_move.x = -1.; cam_move.x = -1.;
} else if key.pressed(KeyCode::KeyD) {
cam_move.x = 1.;
} }
if key.pressed(KeyCode::KeyW) { if key.pressed(KeyCode::KeyW) {
cam_move.z = 1.;
} else if key.pressed(KeyCode::KeyS) {
cam_move.z = -1.; cam_move.z = -1.;
} else if key.pressed(KeyCode::KeyS) {
cam_move.z = 1.;
} }
let move_speed = if key.pressed(KeyCode::ShiftLeft) { let move_speed = if key.pressed(KeyCode::ShiftLeft) {
@@ -156,7 +156,7 @@ fn rts_camera_system(
}; };
cam_move = cam_move.normalize_or_zero() * move_speed * time.delta_seconds(); cam_move = cam_move.normalize_or_zero() * move_speed * time.delta_seconds();
cam_pos -= cam_move; cam_pos += cam_move;
let mut scroll = 0.0; let mut scroll = 0.0;
for e in wheel.read() { for e in wheel.read() {
@@ -209,8 +209,11 @@ fn rts_camera_system(
cam_targets.rotate_time = cam_targets.rotate_time.min(1.); cam_targets.rotate_time = cam_targets.rotate_time.min(1.);
} }
let angle = cam_cfg.min_angle.lerp(cam_cfg.max_angle, t); let angle = cam_cfg.min_angle.lerp(cam_cfg.max_angle, t);
let rot = Quat::from_axis_angle(Vec3::X, -angle); let mut rot = cam.rotation.to_euler(EulerRot::XYZ);
cam.rotation = rot; rot.0 = -angle;
cam.rotation = Quat::from_euler(EulerRot::XYZ, rot.0, rot.1, rot.2);
// let rot = Quat::from_axis_angle(Vec3::X, -angle);
// cam.rotation = rot;
cam.translation = cam_pos; cam.translation = cam_pos;
} }

View File

@@ -38,7 +38,7 @@ impl Default for PhosCameraTargets {
fn default() -> Self { fn default() -> Self {
Self { Self {
height: Default::default(), height: Default::default(),
forward: Vec3::Z, forward: Vec3::NEG_Z,
last_height: Default::default(), last_height: Default::default(),
anim_time: Default::default(), anim_time: Default::default(),
rotate_time: Default::default(), rotate_time: Default::default(),

View File

@@ -55,7 +55,7 @@ impl Plugin for MapInitPlugin {
app.register_asset_reflect::<ExtendedMaterial<StandardMaterial, WaterMaterial>>(); app.register_asset_reflect::<ExtendedMaterial<StandardMaterial, WaterMaterial>>();
app.add_plugins(( app.add_plugins((
ChunkRebuildPlugin, ChunkRebuildPlugin,
TerraFormingTestPlugin, // TerraFormingTestPlugin,
MaterialPlugin::<ExtendedMaterial<StandardMaterial, ChunkMaterial>>::default(), MaterialPlugin::<ExtendedMaterial<StandardMaterial, ChunkMaterial>>::default(),
MaterialPlugin::<ExtendedMaterial<StandardMaterial, WaterMaterial>> { MaterialPlugin::<ExtendedMaterial<StandardMaterial, WaterMaterial>> {
prepass_enabled: false, prepass_enabled: false,

View File

@@ -69,6 +69,9 @@ fn deform(
let span = info_span!("Deform Mesh").entered(); let span = info_span!("Deform Mesh").entered();
let contact_point = cam_ray.get_point(dist); let contact_point = cam_ray.get_point(dist);
let contact_coord = HexCoord::from_world_pos(contact_point); let contact_coord = HexCoord::from_world_pos(contact_point);
if !heightmap.is_in_bounds(&contact_coord) {
return;
}
let modified_tiles = heightmap.create_crater(&contact_coord, 5, 5. * multi); let modified_tiles = heightmap.create_crater(&contact_coord, 5, 5. * multi);
let mut chunk_set: HashSet<usize> = HashSet::new(); let mut chunk_set: HashSet<usize> = HashSet::new();
for (tile, height) in modified_tiles { for (tile, height) in modified_tiles {

View File

@@ -81,7 +81,9 @@ fn show_tile_heights(
if let Some((_e, dist)) = collision { if let Some((_e, dist)) = collision {
let contact_point = cam_ray.get_point(dist); let contact_point = cam_ray.get_point(dist);
let contact_coord = HexCoord::from_world_pos(contact_point); let contact_coord = HexCoord::from_world_pos(contact_point);
if map.is_in_bounds(&contact_coord) { if !map.is_in_bounds(&contact_coord) {
return;
}
let height = map.sample_height(&contact_coord); let height = map.sample_height(&contact_coord);
gizmos.primitive_3d( gizmos.primitive_3d(
&shape.0, &shape.0,
@@ -89,17 +91,24 @@ fn show_tile_heights(
Quat::IDENTITY, Quat::IDENTITY,
Color::WHITE, Color::WHITE,
); );
}
let nbors = map.get_neighbors(&contact_coord); let nbors = map.get_neighbors(&contact_coord);
let contact_tile_pos = contact_coord.to_world(map.sample_height(&contact_coord));
for i in 0..6 { for i in 0..6 {
if let Some(s) = nbors[i] { if let Some(s) = nbors[i] {
let coord = contact_coord.get_neighbor(i); let coord = contact_coord.get_neighbor(i);
let p = coord.to_world(s); let p = coord.to_world(s);
gizmos.arrow(p, p + Vec3::Y * (i as f32 + 1.0), Color::WHITE); gizmos.arrow(p, p + Vec3::Y * (i as f32 + 1.0), Color::WHITE);
} }
let p = HEX_CORNERS[i] + contact_tile_pos;
gizmos.arrow(p, p + Vec3::Y * (i as f32 + 1.0), LinearRgba::rgb(1.0, 0.0, 0.5));
} }
gizmos.sphere(contact_point, Quat::IDENTITY, 0.1, Srgba::rgb(1., 0., 0.5)); gizmos.line(contact_point, contact_point + Vec3::X, LinearRgba::RED);
gizmos.line(contact_point, contact_point + Vec3::Y, LinearRgba::GREEN);
gizmos.line(contact_point, contact_point + Vec3::Z, LinearRgba::BLUE);
//gizmos.sphere(contact_point, Quat::IDENTITY, 0.1, LinearRgba::rgb(1., 0., 0.5));
} }
} }