Skip to content

Commit

Permalink
grs done
Browse files Browse the repository at this point in the history
  • Loading branch information
0SlowPoke0 committed Jan 22, 2025
1 parent d760b27 commit abc01d2
Show file tree
Hide file tree
Showing 4 changed files with 333 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -271,29 +271,26 @@ impl TransformOperation {
if self != &TransformOperation::None {
match self {
TransformOperation::Grabbing(translation) => {
let transform = DAffine2::from_translation(translation.to_dvec());
let final_position = transform.transform_point2(initial_handle_pos);
responses.add(PenToolMessage::FinalPosition { final_pos: final_position });
let pivot = DAffine2::from_translation(pivot);
let transformation = pivot * DAffine2::from_translation(translation.to_dvec()) * pivot.inverse();
let final_pos = transformation.transform_point2(initial_handle_pos);

responses.add(PenToolMessage::FinalPosition { final_pos });
}
TransformOperation::Rotating(rotation) => {
let rotation_matrix = DAffine2::from_angle(rotation.to_f64(snapping));
let to_pivot = DAffine2::from_translation(pivot);
let transformation = to_pivot * rotation_matrix * to_pivot.inverse();
let transformed_handle_position = transformation.transform_point2(initial_handle_pos);
responses.add(PenToolMessage::FinalPosition {
final_pos: transformed_handle_position,
});
let pivot = DAffine2::from_translation(pivot);
let transformation = pivot * DAffine2::from_angle(rotation.to_f64(snapping)) * pivot.inverse();
let final_pos = transformation.transform_point2(initial_handle_pos);

responses.add(PenToolMessage::FinalPosition { final_pos });
}

TransformOperation::Scaling(scale) => {
let scaling_matrix = DAffine2::from_scale(scale.to_dvec(snapping));
let to_pivot = DAffine2::from_translation(pivot);
let transformation = to_pivot * scaling_matrix * to_pivot.inverse();
let transformed_handle_position = transformation.transform_point2(initial_handle_pos);
let pivot = DAffine2::from_translation(pivot);
let transformation = pivot * DAffine2::from_scale(scale.to_dvec(snapping)) * pivot.inverse();
let final_pos = transformation.transform_point2(initial_handle_pos);

responses.add(PenToolMessage::FinalPosition {
final_pos: transformed_handle_position,
});
responses.add(PenToolMessage::FinalPosition { final_pos });
}
TransformOperation::None => unreachable!(),
};
Expand Down
42 changes: 21 additions & 21 deletions editor/src/messages/tool/tool_messages/pen_tool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ use crate::messages::portfolio::document::overlays::utility_functions::path_over
use crate::messages::portfolio::document::overlays::utility_types::OverlayContext;
use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier;
use crate::messages::portfolio::document::utility_types::network_interface::InputConnector;
use crate::messages::portfolio::document::utility_types::transformation::{Rotation, TransformOperation, Translation};
use crate::messages::tool::common_functionality::auto_panning::AutoPanning;
use crate::messages::tool::common_functionality::color_selector::{ToolColorOptions, ToolColorType};
use crate::messages::tool::common_functionality::graph_modification_utils;
Expand All @@ -16,7 +15,7 @@ use bezier_rs::{Bezier, BezierHandles};
use graph_craft::document::NodeId;
use graphene_core::vector::{PointId, VectorModificationType};
use graphene_core::Color;
use graphene_std::vector::{HandleId, ManipulatorPointId, PointDomain, SegmentId};
use graphene_std::vector::{HandleId, SegmentId};

#[derive(Default)]
pub struct PenTool {
Expand Down Expand Up @@ -565,30 +564,33 @@ impl Fsm for PenToolFsmState {
match (self, event) {
(PenToolFsmState::PlacingAnchor, PenToolMessage::GRS { grab, rotate, scale }) => {
if let Some(latest) = tool_data.latest_point_mut() {
if input.keyboard.key(grab) {
responses.add(TransformLayerMessage::BeginGrabPen {
last_point: latest.pos,
handle: latest.handle_start,
});
} else if input.keyboard.key(rotate) {
responses.add(TransformLayerMessage::BeginRotatePen {
last_point: latest.pos,
handle: latest.handle_start,
});
} else if input.keyboard.key(scale) {
responses.add(TransformLayerMessage::BeginScalePen {
last_point: latest.pos,
handle: latest.handle_start,
});
if let Some(layer) = layer {
if latest.handle_start != latest.pos {
let viewport = document.metadata().transform_to_viewport(layer);
let last_point = viewport.transform_point2(latest.pos);
let handle = viewport.transform_point2(latest.handle_start);
if input.keyboard.key(grab) {
responses.add(TransformLayerMessage::BeginGrabPen { last_point, handle });
} else if input.keyboard.key(rotate) {
responses.add(TransformLayerMessage::BeginRotatePen { last_point, handle });
} else if input.keyboard.key(scale) {
responses.add(TransformLayerMessage::BeginScalePen { last_point, handle });
}
tool_data.before_grs_pos = latest.handle_start;
} else {
return PenToolFsmState::PlacingAnchor;
}
}
tool_data.before_grs_pos = tool_data.latest_point().unwrap().handle_start;
} else {
return PenToolFsmState::PlacingAnchor;
}

PenToolFsmState::GRSHandle
}
(PenToolFsmState::GRSHandle, PenToolMessage::FinalPosition { final_pos }) => {
let viewport = document.metadata().transform_to_viewport(layer.unwrap()); // always present if started grs
if let Some(latest) = tool_data.latest_point_mut() {
latest.handle_start = final_pos;
latest.handle_start = viewport.inverse().transform_point2(final_pos);
}
responses.add(OverlaysMessage::Draw);

Expand All @@ -607,7 +609,6 @@ impl Fsm for PenToolFsmState {
PenToolFsmState::PlacingAnchor
}
(PenToolFsmState::GRSHandle, PenToolMessage::Abort) => {
let previous = tool_data.before_grs_pos;
tool_data.next_point = input.mouse.position;
tool_data.next_handle_start = input.mouse.position;
let previous = tool_data.before_grs_pos;
Expand Down Expand Up @@ -842,7 +843,6 @@ impl Fsm for PenToolFsmState {
PenToolFsmState::Ready
}
(_, PenToolMessage::Abort) => {
log::info!("also reaching here");
responses.add(DocumentMessage::AbortTransaction);

responses.add(OverlaysMessage::Draw);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,6 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
}
}
TransformLayerMessage::BeginGrabPen { last_point, handle } => {
log::info!("{:?}", handle);
self.typing.clear();

self.last_point = last_point;
Expand All @@ -155,6 +154,7 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
}
TransformLayerMessage::BeginScalePen { last_point, handle } => {
self.typing.clear();

self.last_point = last_point;
self.handle = handle;

Expand Down Expand Up @@ -317,7 +317,16 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
TransformOperation::Scaling(scaling) => scaling.constraint,
_ => Axis::Both,
};
self.transform_operation.apply_transform_operation(&mut selected, self.snap, axis_constraint);
// We can set tool_specific behavior here
match tool_data.active_tool_type {
ToolType::Pen => {
self.transform_operation
.apply_transformation_pen(self.handle, self.last_point, selected.responses, self.snap, axis_constraint);
}
_ => {
self.transform_operation.apply_transform_operation(&mut selected, self.snap, axis_constraint);
}
}
}

if self.typing.digits.is_empty() {
Expand All @@ -327,14 +336,12 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
TransformOperation::None => unreachable!(),
TransformOperation::Grabbing(translation) => match tool_data.active_tool_type {
ToolType::Pen => {
let change = if self.slow { delta_pos * 0.5 } else { delta_pos * 3.25 };
let change = if self.slow { delta_pos / SLOWING_DIVISOR } else { delta_pos };
let axis_constraint = translation.constraint;
let handle = self.handle;
let last_point = self.last_point;

self.transform_operation = TransformOperation::Grabbing(translation.increment_amount(change));
self.transform_operation
.apply_transformation_pen(handle, self.last_point, selected.responses, self.snap, axis_constraint);
.apply_transformation_pen(self.handle, self.last_point, selected.responses, self.snap, axis_constraint);
}
_ => {
let change = if self.slow { delta_pos / SLOWING_DIVISOR } else { delta_pos };
Expand All @@ -344,22 +351,23 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
}
},
TransformOperation::Rotating(rotation) => match tool_data.active_tool_type {
// Tool-Specific context and transformation
ToolType::Pen => {
let pivot = self.last_point; // in pen tool the latest point would be the pivot
let start = pivot - self.start_mouse;
let start = pivot - self.mouse_position;
let end = pivot - input.mouse.position;

let angle = start.angle_to(end);
let change = if self.slow { angle / SLOWING_DIVISOR } else { angle };

self.transform_operation = TransformOperation::Rotating(rotation.increment_amount(angle));
self.transform_operation = TransformOperation::Rotating(rotation.increment_amount(change));
self.transform_operation
.apply_transformation_pen(self.handle, self.last_point, selected.responses, self.snap, Axis::Both);
}
_ => {
let start_offset = *selected.pivot - self.mouse_position;
let end_offset = *selected.pivot - input.mouse.position;
let angle = start_offset.angle_to(end_offset);

let change = if self.slow { angle / SLOWING_DIVISOR } else { angle };

self.transform_operation = TransformOperation::Rotating(rotation.increment_amount(change));
Expand All @@ -377,7 +385,7 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
let change = if self.slow { change / SLOWING_DIVISOR } else { change };

let axis_constraint = scale.constraint;
self.transform_operation = TransformOperation::Scaling(scale.increment_amount(change * 2.));
self.transform_operation = TransformOperation::Scaling(scale.increment_amount(change));
self.transform_operation
.apply_transformation_pen(self.handle, self.last_point, selected.responses, self.snap, axis_constraint);
}
Expand Down
Loading

0 comments on commit abc01d2

Please sign in to comment.