Simplify point storage for pen tool (#500)

Store points as vectors instead of representing them as transforms to
avoid confusion and improve efficiency
This commit is contained in:
TrueDoctor
2022-01-27 18:49:49 +01:00
committed by Keavon Chambers
parent c215719598
commit 9bb28def62
+8 -8
View File
@@ -11,7 +11,7 @@ use crate::viewport_tools::tool_options::ToolOptions;
use graphene::layers::style; use graphene::layers::style;
use graphene::Operation; use graphene::Operation;
use glam::DAffine2; use glam::{DAffine2, DVec2};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(Default)] #[derive(Default)]
@@ -80,8 +80,8 @@ impl Default for PenToolFsmState {
} }
#[derive(Clone, Debug, Default)] #[derive(Clone, Debug, Default)]
struct PenToolData { struct PenToolData {
points: Vec<DAffine2>, points: Vec<DVec2>,
next_point: DAffine2, next_point: DVec2,
weight: u32, weight: u32,
path: Option<Vec<LayerId>>, path: Option<Vec<LayerId>>,
layer_exists: bool, layer_exists: bool,
@@ -116,7 +116,7 @@ impl Fsm for PenToolFsmState {
data.snap_handler.start_snap(document, document.visible_layers()); data.snap_handler.start_snap(document, document.visible_layers());
let snapped_position = data.snap_handler.snap_position(responses, input.viewport_bounds.size(), document, input.mouse.position); let snapped_position = data.snap_handler.snap_position(responses, input.viewport_bounds.size(), document, input.mouse.position);
let pos = transform.inverse() * DAffine2::from_translation(snapped_position); let pos = transform.inverse().transform_point2(snapped_position);
data.points.push(pos); data.points.push(pos);
data.next_point = pos; data.next_point = pos;
@@ -132,7 +132,7 @@ impl Fsm for PenToolFsmState {
} }
(Drawing, DragStop) => { (Drawing, DragStop) => {
let snapped_position = data.snap_handler.snap_position(responses, input.viewport_bounds.size(), document, input.mouse.position); let snapped_position = data.snap_handler.snap_position(responses, input.viewport_bounds.size(), document, input.mouse.position);
let pos = transform.inverse() * DAffine2::from_translation(snapped_position); let pos = transform.inverse().transform_point2(snapped_position);
// TODO: introduce comparison threshold when operating with canvas coordinates (https://github.com/GraphiteEditor/Graphite/issues/100) // TODO: introduce comparison threshold when operating with canvas coordinates (https://github.com/GraphiteEditor/Graphite/issues/100)
if data.points.last() != Some(&pos) { if data.points.last() != Some(&pos) {
@@ -147,7 +147,7 @@ impl Fsm for PenToolFsmState {
} }
(Drawing, PointerMove) => { (Drawing, PointerMove) => {
let snapped_position = data.snap_handler.snap_position(responses, input.viewport_bounds.size(), document, input.mouse.position); let snapped_position = data.snap_handler.snap_position(responses, input.viewport_bounds.size(), document, input.mouse.position);
let pos = transform.inverse() * DAffine2::from_translation(snapped_position); let pos = transform.inverse().transform_point2(snapped_position);
data.next_point = pos; data.next_point = pos;
responses.push_back(remove_preview(data)); responses.push_back(remove_preview(data));
@@ -215,9 +215,9 @@ fn remove_preview(data: &PenToolData) -> Message {
} }
fn make_operation(data: &PenToolData, tool_data: &DocumentToolData, show_preview: bool) -> Message { fn make_operation(data: &PenToolData, tool_data: &DocumentToolData, show_preview: bool) -> Message {
let mut points: Vec<(f64, f64)> = data.points.iter().map(|p| (p.translation.x, p.translation.y)).collect(); let mut points: Vec<(f64, f64)> = data.points.iter().map(|p| (p.x, p.y)).collect();
if show_preview { if show_preview {
points.push((data.next_point.translation.x, data.next_point.translation.y)) points.push((data.next_point.x, data.next_point.y))
} }
Operation::AddPen { Operation::AddPen {