Remove snap rotate from layerdata (#435)

This commit is contained in:
0HyperCube 2021-12-28 17:30:41 +00:00 committed by Keavon Chambers
parent 4c74462be0
commit 3811c78b70
3 changed files with 20 additions and 21 deletions

View file

@ -171,7 +171,7 @@ impl DocumentMessageHandler {
snapping_enabled: true, snapping_enabled: true,
view_mode: ViewMode::default(), view_mode: ViewMode::default(),
}; };
document.graphene_document.root.transform = document.layerdata(&[]).calculate_offset_transform(ipp.viewport_bounds.size() / 2.); document.graphene_document.root.transform = document.layerdata(&[]).calculate_offset_transform(ipp.viewport_bounds.size() / 2., 0.);
document document
} }

View file

@ -1,4 +1,3 @@
use crate::consts::VIEWPORT_ROTATE_SNAP_INTERVAL;
use glam::{DAffine2, DVec2}; use glam::{DAffine2, DVec2};
use graphene::layers::{style::ViewMode, BlendMode, Layer, LayerData as DocumentLayerData, LayerDataType}; use graphene::layers::{style::ViewMode, BlendMode, Layer, LayerData as DocumentLayerData, LayerDataType};
use graphene::LayerId; use graphene::LayerId;
@ -12,7 +11,6 @@ pub struct LayerData {
pub expanded: bool, pub expanded: bool,
pub translation: DVec2, pub translation: DVec2,
pub rotation: f64, pub rotation: f64,
pub snap_rotate: bool,
pub scale: f64, pub scale: f64,
} }
@ -23,25 +21,15 @@ impl LayerData {
expanded, expanded,
translation: DVec2::ZERO, translation: DVec2::ZERO,
rotation: 0., rotation: 0.,
snap_rotate: false,
scale: 1., scale: 1.,
} }
} }
pub fn snapped_angle(&self) -> f64 { pub fn calculate_offset_transform(&self, offset: DVec2, snapped_angle: f64) -> DAffine2 {
let increment_radians: f64 = VIEWPORT_ROTATE_SNAP_INTERVAL.to_radians();
if self.snap_rotate {
(self.rotation / increment_radians).round() * increment_radians
} else {
self.rotation
}
}
pub fn calculate_offset_transform(&self, offset: DVec2) -> DAffine2 {
// TODO: replace with DAffine2::from_scale_angle_translation and fix the errors // TODO: replace with DAffine2::from_scale_angle_translation and fix the errors
let offset_transform = DAffine2::from_translation(offset); let offset_transform = DAffine2::from_translation(offset);
let scale_transform = DAffine2::from_scale(DVec2::new(self.scale, self.scale)); let scale_transform = DAffine2::from_scale(DVec2::new(self.scale, self.scale));
let angle_transform = DAffine2::from_angle(self.snapped_angle()); let angle_transform = DAffine2::from_angle(snapped_angle);
let translation_transform = DAffine2::from_translation(self.translation); let translation_transform = DAffine2::from_translation(self.translation);
scale_transform * offset_transform * angle_transform * translation_transform scale_transform * offset_transform * angle_transform * translation_transform
} }

View file

@ -1,3 +1,4 @@
use crate::consts::VIEWPORT_ROTATE_SNAP_INTERVAL;
pub use crate::document::layer_panel::*; pub use crate::document::layer_panel::*;
use crate::document::{DocumentMessage, LayerData}; use crate::document::{DocumentMessage, LayerData};
use crate::message_prelude::*; use crate::message_prelude::*;
@ -40,16 +41,26 @@ pub struct MovementMessageHandler {
zooming: bool, zooming: bool,
snapping: bool, snapping: bool,
mouse_pos: ViewportPosition, mouse_pos: ViewportPosition,
snap_rotate: bool,
} }
impl MovementMessageHandler { impl MovementMessageHandler {
pub fn snapped_angle(&self, layerdata: &LayerData) -> f64 {
let increment_radians: f64 = VIEWPORT_ROTATE_SNAP_INTERVAL.to_radians();
if self.snap_rotate {
(layerdata.rotation / increment_radians).round() * increment_radians
} else {
layerdata.rotation
}
}
fn create_document_transform_from_layerdata(&self, layerdata: &LayerData, viewport_bounds: &ViewportBounds, responses: &mut VecDeque<Message>) { fn create_document_transform_from_layerdata(&self, layerdata: &LayerData, viewport_bounds: &ViewportBounds, responses: &mut VecDeque<Message>) {
let half_viewport = viewport_bounds.size() / 2.; let half_viewport = viewport_bounds.size() / 2.;
let scaled_half_viewport = half_viewport / layerdata.scale; let scaled_half_viewport = half_viewport / layerdata.scale;
responses.push_back( responses.push_back(
DocumentOperation::SetLayerTransform { DocumentOperation::SetLayerTransform {
path: vec![], path: vec![],
transform: layerdata.calculate_offset_transform(scaled_half_viewport).to_cols_array(), transform: layerdata.calculate_offset_transform(scaled_half_viewport, self.snapped_angle(layerdata)).to_cols_array(),
} }
.into(), .into(),
); );
@ -68,7 +79,7 @@ impl MessageHandler<MovementMessage, (&mut LayerData, &Document, &InputPreproces
RotateCanvasBegin { snap } => { RotateCanvasBegin { snap } => {
self.rotating = true; self.rotating = true;
self.snapping = snap; self.snapping = snap;
layerdata.snap_rotate = snap; self.snap_rotate = snap;
self.mouse_pos = ipp.mouse.position; self.mouse_pos = ipp.mouse.position;
} }
EnableSnapping => self.snapping = true, EnableSnapping => self.snapping = true,
@ -78,8 +89,8 @@ impl MessageHandler<MovementMessage, (&mut LayerData, &Document, &InputPreproces
self.mouse_pos = ipp.mouse.position; self.mouse_pos = ipp.mouse.position;
} }
TransformCanvasEnd => { TransformCanvasEnd => {
layerdata.rotation = layerdata.snapped_angle(); layerdata.rotation = self.snapped_angle(layerdata);
layerdata.snap_rotate = false; self.snap_rotate = false;
self.translating = false; self.translating = false;
self.rotating = false; self.rotating = false;
self.zooming = false; self.zooming = false;
@ -104,11 +115,11 @@ impl MessageHandler<MovementMessage, (&mut LayerData, &Document, &InputPreproces
let snapping = self.snapping; let snapping = self.snapping;
layerdata.rotation += rotation; layerdata.rotation += rotation;
layerdata.snap_rotate = snapping; self.snap_rotate = snapping;
responses.push_back(ToolMessage::SelectedLayersChanged.into()); responses.push_back(ToolMessage::SelectedLayersChanged.into());
responses.push_back( responses.push_back(
FrontendMessage::SetCanvasRotation { FrontendMessage::SetCanvasRotation {
new_radians: layerdata.snapped_angle(), new_radians: self.snapped_angle(layerdata),
} }
.into(), .into(),
); );