Skip to content

Commit

Permalink
take collider global rotation into account in shape editing plugin
Browse files Browse the repository at this point in the history
- removed redundant code
- fixed handles position for 2d colliders
  • Loading branch information
mrDIMAS committed Jun 20, 2024
1 parent b490ca5 commit 4d39a12
Show file tree
Hide file tree
Showing 15 changed files with 400 additions and 713 deletions.
56 changes: 22 additions & 34 deletions editor/src/plugins/collider/ball.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
use crate::{
fyrox::{
core::{algebra::Vector3, pool::Handle},
scene::{
collider::{BallShape, ColliderShape},
node::Node,
Scene,
},
scene::{collider::ColliderShape, node::Node, Scene},
},
plugins::collider::{
make_handle, set_node_position, try_get_collider_shape, try_get_collider_shape_mut,
ShapeGizmoTrait, ShapeHandleValue,
make_handle, try_get_collider_shape, try_get_collider_shape_mut, ShapeGizmoTrait,
ShapeHandleValue,
},
};

Expand All @@ -18,16 +14,9 @@ pub struct BallShapeGizmo {
}

impl BallShapeGizmo {
pub fn new(
ball: &BallShape,
center: Vector3<f32>,
side: Vector3<f32>,
root: Handle<Node>,
visible: bool,
scene: &mut Scene,
) -> Self {
pub fn new(root: Handle<Node>, visible: bool, scene: &mut Scene) -> Self {
Self {
radius_handle: make_handle(scene, center + side.scale(ball.radius), root, visible),
radius_handle: make_handle(scene, root, visible),
}
}
}
Expand All @@ -37,6 +26,23 @@ impl ShapeGizmoTrait for BallShapeGizmo {
func(self.radius_handle)
}

fn handle_local_position(
&self,
handle: Handle<Node>,
collider: Handle<Node>,
scene: &Scene,
) -> Option<Vector3<f32>> {
let Some(ColliderShape::Ball(ball)) = try_get_collider_shape(collider, scene) else {
return None;
};

if handle == self.radius_handle {
Some(Vector3::new(ball.radius, 0.0, 0.0))
} else {
None
}
}

fn handle_major_axis(
&self,
handle: Handle<Node>,
Expand All @@ -50,24 +56,6 @@ impl ShapeGizmoTrait for BallShapeGizmo {
}
}

fn try_sync_to_collider(
&self,
collider: Handle<Node>,
center: Vector3<f32>,
side: Vector3<f32>,
_up: Vector3<f32>,
_look: Vector3<f32>,
scene: &mut Scene,
) -> bool {
let Some(ColliderShape::Ball(ball)) = try_get_collider_shape(collider, scene) else {
return false;
};

set_node_position(self.radius_handle, center + side.scale(ball.radius), scene);

true
}

fn value_by_handle(
&self,
handle: Handle<Node>,
Expand Down
56 changes: 22 additions & 34 deletions editor/src/plugins/collider/ball2d.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
use crate::{
fyrox::{
core::{algebra::Vector3, pool::Handle},
scene::{
dim2::collider::{BallShape, ColliderShape},
node::Node,
Scene,
},
scene::{dim2::collider::ColliderShape, node::Node, Scene},
},
plugins::collider::{
make_handle, set_node_position, try_get_collider_shape_2d, try_get_collider_shape_mut_2d,
ShapeGizmoTrait, ShapeHandleValue,
make_handle, try_get_collider_shape_2d, try_get_collider_shape_mut_2d, ShapeGizmoTrait,
ShapeHandleValue,
},
};

Expand All @@ -18,16 +14,9 @@ pub struct Ball2DShapeGizmo {
}

impl Ball2DShapeGizmo {
pub fn new(
ball: &BallShape,
center: Vector3<f32>,
side: Vector3<f32>,
root: Handle<Node>,
visible: bool,
scene: &mut Scene,
) -> Self {
pub fn new(root: Handle<Node>, visible: bool, scene: &mut Scene) -> Self {
Self {
radius_handle: make_handle(scene, center + side.scale(ball.radius), root, visible),
radius_handle: make_handle(scene, root, visible),
}
}
}
Expand All @@ -37,6 +26,23 @@ impl ShapeGizmoTrait for Ball2DShapeGizmo {
func(self.radius_handle)
}

fn handle_local_position(
&self,
handle: Handle<Node>,
collider: Handle<Node>,
scene: &Scene,
) -> Option<Vector3<f32>> {
let Some(ColliderShape::Ball(ball)) = try_get_collider_shape_2d(collider, scene) else {
return None;
};

if handle == self.radius_handle {
Some(Vector3::new(ball.radius, 0.0, 0.0))
} else {
None
}
}

fn handle_major_axis(
&self,
handle: Handle<Node>,
Expand All @@ -50,24 +56,6 @@ impl ShapeGizmoTrait for Ball2DShapeGizmo {
}
}

fn try_sync_to_collider(
&self,
collider: Handle<Node>,
center: Vector3<f32>,
side: Vector3<f32>,
_up: Vector3<f32>,
_look: Vector3<f32>,
scene: &mut Scene,
) -> bool {
let Some(ColliderShape::Ball(ball)) = try_get_collider_shape_2d(collider, scene) else {
return false;
};

set_node_position(self.radius_handle, center + side.scale(ball.radius), scene);

true
}

fn value_by_handle(
&self,
handle: Handle<Node>,
Expand Down
73 changes: 31 additions & 42 deletions editor/src/plugins/collider/capsule.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,13 @@
use crate::{
fyrox::{
core::{algebra::Vector3, pool::Handle},
scene::{
collider::{CapsuleShape, ColliderShape},
node::Node,
Scene,
},
core::{algebra::Vector3, math, pool::Handle},
scene::{collider::ColliderShape, node::Node, Scene},
},
plugins::collider::{
make_handle, set_node_position, try_get_collider_shape, try_get_collider_shape_mut,
ShapeGizmoTrait, ShapeHandleValue,
make_handle, try_get_collider_shape, try_get_collider_shape_mut, ShapeGizmoTrait,
ShapeHandleValue,
},
};
use fyrox::core::math;

pub struct CapsuleShapeGizmo {
radius_handle: Handle<Node>,
Expand All @@ -21,18 +16,11 @@ pub struct CapsuleShapeGizmo {
}

impl CapsuleShapeGizmo {
pub fn new(
capsule: &CapsuleShape,
center: Vector3<f32>,
side: Vector3<f32>,
visible: bool,
root: Handle<Node>,
scene: &mut Scene,
) -> Self {
pub fn new(visible: bool, root: Handle<Node>, scene: &mut Scene) -> Self {
Self {
radius_handle: make_handle(scene, center + side.scale(capsule.radius), root, visible),
begin_handle: make_handle(scene, center + capsule.begin, root, visible),
end_handle: make_handle(scene, center + capsule.end, root, visible),
radius_handle: make_handle(scene, root, visible),
begin_handle: make_handle(scene, root, visible),
end_handle: make_handle(scene, root, visible),
}
}
}
Expand All @@ -44,7 +32,7 @@ impl ShapeGizmoTrait for CapsuleShapeGizmo {
}
}

fn handle_major_axis(
fn handle_local_position(
&self,
handle: Handle<Node>,
collider: Handle<Node>,
Expand All @@ -55,37 +43,38 @@ impl ShapeGizmoTrait for CapsuleShapeGizmo {
};

if handle == self.radius_handle {
Some(
math::get_arbitrary_line_perpendicular(capsule.begin, capsule.end)
.unwrap_or_else(Vector3::x),
)
let perp = math::get_arbitrary_line_perpendicular(capsule.begin, capsule.end)
.unwrap_or_else(Vector3::x)
.scale(capsule.radius);

Some(capsule.begin + perp)
} else if handle == self.begin_handle {
Some(capsule.begin)
} else if handle == self.end_handle {
Some(capsule.end)
} else {
None
}
}

fn try_sync_to_collider(
fn handle_major_axis(
&self,
handle: Handle<Node>,
collider: Handle<Node>,
center: Vector3<f32>,
_side: Vector3<f32>,
_up: Vector3<f32>,
_look: Vector3<f32>,
scene: &mut Scene,
) -> bool {
scene: &Scene,
) -> Option<Vector3<f32>> {
let Some(ColliderShape::Capsule(capsule)) = try_get_collider_shape(collider, scene) else {
return false;
return None;
};

let perp = math::get_arbitrary_line_perpendicular(capsule.begin, capsule.end)
.unwrap_or_else(Vector3::x)
.scale(capsule.radius);

set_node_position(self.radius_handle, center + capsule.begin + perp, scene);
set_node_position(self.begin_handle, center + capsule.begin, scene);
set_node_position(self.end_handle, center + capsule.end, scene);

true
if handle == self.radius_handle {
Some(
math::get_arbitrary_line_perpendicular(capsule.begin, capsule.end)
.unwrap_or_else(Vector3::x),
)
} else {
None
}
}

fn value_by_handle(
Expand Down
Loading

0 comments on commit 4d39a12

Please sign in to comment.