-
-
Notifications
You must be signed in to change notification settings - Fork 3.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
return Direction3d from Transform::up and friends #11604
Changes from all commits
4c9ac33
baa4f46
a6a6bb8
f23ebd7
e63c897
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -71,6 +71,12 @@ impl TryFrom<Vec3> for Direction3d { | |
} | ||
} | ||
|
||
impl From<Direction3d> for Vec3 { | ||
fn from(value: Direction3d) -> Self { | ||
value.0 | ||
} | ||
} | ||
|
||
impl std::ops::Deref for Direction3d { | ||
type Target = Vec3; | ||
fn deref(&self) -> &Self::Target { | ||
|
@@ -85,6 +91,13 @@ impl std::ops::Neg for Direction3d { | |
} | ||
} | ||
|
||
impl std::ops::Mul<f32> for Direction3d { | ||
type Output = Vec3; | ||
fn mul(self, rhs: f32) -> Self::Output { | ||
self.0 * rhs | ||
} | ||
} | ||
|
||
Comment on lines
+94
to
+100
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This should be implemented for |
||
impl std::ops::Mul<Direction3d> for Quat { | ||
type Output = Direction3d; | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,6 @@ | ||
use super::GlobalTransform; | ||
use bevy_ecs::{component::Component, reflect::ReflectComponent}; | ||
use bevy_math::primitives::Direction3d; | ||
use bevy_math::{Affine3A, Mat3, Mat4, Quat, Vec3}; | ||
use bevy_reflect::prelude::*; | ||
use bevy_reflect::Reflect; | ||
|
@@ -185,55 +186,58 @@ impl Transform { | |
|
||
/// Get the unit vector in the local `X` direction. | ||
#[inline] | ||
pub fn local_x(&self) -> Vec3 { | ||
self.rotation * Vec3::X | ||
pub fn local_x(&self) -> Direction3d { | ||
// Direction3d::new(x) panics if x is of invalid length, but quat * unit vector is length 1 | ||
Direction3d::new(self.rotation * Vec3::X).unwrap() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These should probably use self.rotation * Direction3d::X Of course, it would have to be guaranteed that rotation doesn't change the length. I think it should work, but I haven't tried with degenerate quaternions. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This (rotate direction with multiplication) would also only work for 3D directions until we have a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't know enough maths to confidently use new_unchecked (or to say that the unwrap will never be hit), so I'd appreciate if someone smarter than me could help here There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we should merge this with the checked version for now, and look into accelerating this (with tests) in a follow-up. |
||
} | ||
|
||
/// Equivalent to [`-local_x()`][Transform::local_x()] | ||
#[inline] | ||
pub fn left(&self) -> Vec3 { | ||
pub fn left(&self) -> Direction3d { | ||
-self.local_x() | ||
} | ||
|
||
/// Equivalent to [`local_x()`][Transform::local_x()] | ||
#[inline] | ||
pub fn right(&self) -> Vec3 { | ||
pub fn right(&self) -> Direction3d { | ||
self.local_x() | ||
} | ||
|
||
/// Get the unit vector in the local `Y` direction. | ||
#[inline] | ||
pub fn local_y(&self) -> Vec3 { | ||
self.rotation * Vec3::Y | ||
pub fn local_y(&self) -> Direction3d { | ||
// Direction3d::new(x) panics if x is of invalid length, but quat * unit vector is length 1 | ||
Direction3d::new(self.rotation * Vec3::Y).unwrap() | ||
} | ||
|
||
/// Equivalent to [`local_y()`][Transform::local_y] | ||
#[inline] | ||
pub fn up(&self) -> Vec3 { | ||
pub fn up(&self) -> Direction3d { | ||
self.local_y() | ||
} | ||
|
||
/// Equivalent to [`-local_y()`][Transform::local_y] | ||
#[inline] | ||
pub fn down(&self) -> Vec3 { | ||
pub fn down(&self) -> Direction3d { | ||
-self.local_y() | ||
} | ||
|
||
/// Get the unit vector in the local `Z` direction. | ||
#[inline] | ||
pub fn local_z(&self) -> Vec3 { | ||
self.rotation * Vec3::Z | ||
pub fn local_z(&self) -> Direction3d { | ||
// Direction3d::new(x) panics if x is of invalid length, but quat * unit vector is length 1 | ||
Direction3d::new(self.rotation * Vec3::Z).unwrap() | ||
} | ||
|
||
/// Equivalent to [`-local_z()`][Transform::local_z] | ||
#[inline] | ||
pub fn forward(&self) -> Vec3 { | ||
pub fn forward(&self) -> Direction3d { | ||
-self.local_z() | ||
} | ||
|
||
/// Equivalent to [`local_z()`][Transform::local_z] | ||
#[inline] | ||
pub fn back(&self) -> Vec3 { | ||
pub fn back(&self) -> Direction3d { | ||
self.local_z() | ||
} | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -224,7 +224,7 @@ fn setup_color_gradient_scene( | |
camera_transform: Res<CameraTransform>, | ||
) { | ||
let mut transform = camera_transform.0; | ||
transform.translation += transform.forward(); | ||
transform.translation += *transform.forward(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. One way to avoid the deref here would be to simply implement There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would find this a little odd, from an API perspective. If we include direction in the vector algebra we might as well just call it |
||
|
||
commands.spawn(( | ||
MaterialMeshBundle { | ||
|
@@ -248,7 +248,7 @@ fn setup_image_viewer_scene( | |
camera_transform: Res<CameraTransform>, | ||
) { | ||
let mut transform = camera_transform.0; | ||
transform.translation += transform.forward(); | ||
transform.translation += *transform.forward(); | ||
|
||
// exr/hdr viewer (exr requires enabling bevy feature) | ||
commands.spawn(( | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -171,8 +171,8 @@ fn run_camera_controller( | |
controller.velocity = Vec3::ZERO; | ||
} | ||
} | ||
let forward = transform.forward(); | ||
let right = transform.right(); | ||
let forward = *transform.forward(); | ||
let right = *transform.right(); | ||
transform.translation += controller.velocity.x * dt * right | ||
+ controller.velocity.y * dt * Vec3::Y | ||
+ controller.velocity.z * dt * forward; | ||
Comment on lines
+174
to
178
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If we impl |
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -127,7 +127,7 @@ fn rotate_cube( | |
// Update the rotation of the cube(s). | ||
for (mut transform, cube) in &mut cubes { | ||
// Calculate the rotation of the cube if it would be looking at the sphere in the center. | ||
let look_at_sphere = transform.looking_at(center, transform.local_y()); | ||
let look_at_sphere = transform.looking_at(center, *transform.local_y()); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We could technically make |
||
// Interpolate between the current rotation and the fully turned rotation | ||
// when looking a the sphere, with a given turn speed to get a smooth motion. | ||
// With higher speed the curvature of the orbit would be smaller. | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should also be implemented for the
Direction2d
&Vec2
pair.