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,
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
}

View file

@ -1,4 +1,3 @@
use crate::consts::VIEWPORT_ROTATE_SNAP_INTERVAL;
use glam::{DAffine2, DVec2};
use graphene::layers::{style::ViewMode, BlendMode, Layer, LayerData as DocumentLayerData, LayerDataType};
use graphene::LayerId;
@ -12,7 +11,6 @@ pub struct LayerData {
pub expanded: bool,
pub translation: DVec2,
pub rotation: f64,
pub snap_rotate: bool,
pub scale: f64,
}
@ -23,25 +21,15 @@ impl LayerData {
expanded,
translation: DVec2::ZERO,
rotation: 0.,
snap_rotate: false,
scale: 1.,
}
}
pub fn snapped_angle(&self) -> f64 {
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 {
pub fn calculate_offset_transform(&self, offset: DVec2, snapped_angle: f64) -> DAffine2 {
// TODO: replace with DAffine2::from_scale_angle_translation and fix the errors
let offset_transform = DAffine2::from_translation(offset);
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);
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::*;
use crate::document::{DocumentMessage, LayerData};
use crate::message_prelude::*;
@ -40,16 +41,26 @@ pub struct MovementMessageHandler {
zooming: bool,
snapping: bool,
mouse_pos: ViewportPosition,
snap_rotate: bool,
}
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>) {
let half_viewport = viewport_bounds.size() / 2.;
let scaled_half_viewport = half_viewport / layerdata.scale;
responses.push_back(
DocumentOperation::SetLayerTransform {
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(),
);
@ -68,7 +79,7 @@ impl MessageHandler<MovementMessage, (&mut LayerData, &Document, &InputPreproces
RotateCanvasBegin { snap } => {
self.rotating = true;
self.snapping = snap;
layerdata.snap_rotate = snap;
self.snap_rotate = snap;
self.mouse_pos = ipp.mouse.position;
}
EnableSnapping => self.snapping = true,
@ -78,8 +89,8 @@ impl MessageHandler<MovementMessage, (&mut LayerData, &Document, &InputPreproces
self.mouse_pos = ipp.mouse.position;
}
TransformCanvasEnd => {
layerdata.rotation = layerdata.snapped_angle();
layerdata.snap_rotate = false;
layerdata.rotation = self.snapped_angle(layerdata);
self.snap_rotate = false;
self.translating = false;
self.rotating = false;
self.zooming = false;
@ -104,11 +115,11 @@ impl MessageHandler<MovementMessage, (&mut LayerData, &Document, &InputPreproces
let snapping = self.snapping;
layerdata.rotation += rotation;
layerdata.snap_rotate = snapping;
self.snap_rotate = snapping;
responses.push_back(ToolMessage::SelectedLayersChanged.into());
responses.push_back(
FrontendMessage::SetCanvasRotation {
new_radians: layerdata.snapped_angle(),
new_radians: self.snapped_angle(layerdata),
}
.into(),
);