Skip to content

Commit

Permalink
WIP State
Browse files Browse the repository at this point in the history
  • Loading branch information
TrueDoctor committed Mar 5, 2024
1 parent 0227f03 commit e95416f
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 110 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,7 @@ impl<'a> ModifyInputsContext<'a> {
TransformIn::Viewport => parent_transform,
};
let pivot = DAffine2::from_translation(upstream_transform.transform_point2(bounds.layerspace_pivot(transform_utils::get_current_normalized_pivot(inputs))));
let transform = pivot.inverse() * to.inverse() * transform * to * pivot * layer_transform;
let transform = /*pivot.inverse() */ to.inverse() * transform * to * /*pivot */ layer_transform;
transform_utils::update_transform(inputs, transform);
});
}
Expand All @@ -423,7 +423,7 @@ impl<'a> ModifyInputsContext<'a> {
{
transform *= upstream_transform.inverse();
}
let final_transform = pivot.inverse() * to.inverse() * transform * pivot;
let final_transform = /*pivot.inverse() **/ to.inverse() * transform /* pivot*/;
transform_utils::update_transform(inputs, final_transform);
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -370,15 +370,24 @@ impl<'a> Selected<'a> {
(min + max) / 2.
}

fn transform_layer(document_metadata: &DocumentMetadata, layer: LayerNodeIdentifier, original_transform: Option<&DAffine2>, transformation: DAffine2, responses: &mut VecDeque<Message>) {
fn transform_layer(
pivot: DVec2,
document_metadata: &DocumentMetadata,
layer: LayerNodeIdentifier,
original_transform: Option<&DAffine2>,
transformation: DAffine2,
responses: &mut VecDeque<Message>,
) {
let Some(&original_transform) = original_transform else { return };
let to = document_metadata.downstream_transform_to_viewport(layer);
log::warn!("pivot: {:?}", pivot);
log::debug!("to: {to:?} transformation: {transformation:?}, original_transform: {original_transform:?}");
let new = to.inverse() * transformation * to * original_transform;
responses.add(GraphOperationMessage::TransformSet {
let pivot = DAffine2::from_translation(pivot);
let new = pivot * transformation * pivot.inverse();
responses.add(GraphOperationMessage::TransformChange {
layer,
transform: new,
transform_in: TransformIn::Local,
transform_in: TransformIn::Viewport,
skip_rerender: false,
});
}
Expand Down Expand Up @@ -420,8 +429,8 @@ impl<'a> Selected<'a> {
log::debug!("layer_arcestors: {layer_ancestors:?}");

match &self.original_transforms {
OriginalTransforms::Layer(layer_transforms) => Self::transform_layer(self.document_metadata, layer, layer_transforms.get(&layer), transformation, self.responses),
OriginalTransforms::Path(path_transforms) => Self::transform_path(self.document_metadata, layer, path_transforms.get(&layer), transformation, self.responses),
OriginalTransforms::Layer(layer_transforms) => Self::transform_layer(*self.pivot, self.document_metadata, layer, layer_transforms.get(&layer), transformation, self.responses),
OriginalTransforms::Path(path_transforms) => Self::transform_path(&self.document_metadata, layer, path_transforms.get(&layer), transformation, self.responses),
}
}
}
Expand Down
69 changes: 0 additions & 69 deletions editor/src/messages/tool/common_functionality/pivot.rs
Original file line number Diff line number Diff line change
@@ -1,70 +1 @@
//! Handler for the pivot overlay visible on the selected layer(s) whilst using the Select tool which controls the center of rotation/scale and origin of the layer.

use super::graph_modification_utils;
use crate::consts::PIVOT_DIAMETER;
use crate::messages::layout::utility_types::widget_prelude::*;
use crate::messages::portfolio::document::overlays::utility_types::OverlayContext;
use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier;
use crate::messages::prelude::*;

use glam::{DAffine2, DVec2};
use std::collections::VecDeque;

#[derive(Clone, Debug)]
pub struct Pivot {
/// The viewspace pivot position (if applicable)
pivot: Option<DVec2>,
viewport_pos: DVec2,
}

impl Default for Pivot {
fn default() -> Self {
Self {
pivot: None,
viewport_pos: DVec2::ZERO,
}
}
}

impl Pivot {
/// Calculates the transform that gets from normalized pivot to viewspace.
fn get_layer_pivot_transform(layer: LayerNodeIdentifier, document: &DocumentMessageHandler) -> DAffine2 {
document.metadata().transform_to_viewport(layer)
}

pub fn update_pivot(&mut self, document: &DocumentMessageHandler, overlay_context: &mut OverlayContext) {
//log::debug!("adding_overlay for pivot at ");
if let Some(pivot) = self.pivot {
let viewport_transform = document.metadata().document_to_viewport;
let pivot = viewport_transform.transform_point2(pivot);
self.viewport_pos = pivot;
//log::debug!("adding_overlay for pivot at {:?}", pivot);
overlay_context.pivot(pivot);
}
}

/// Answers if the pivot widget has changed (so we should refresh the tool bar at the top of the canvas).
pub fn should_refresh_pivot_position(&mut self) -> bool {
false
}

/// Sets the viewport position of the pivot for all selected layers.
pub fn set_viewport_position(&mut self, position: DVec2, document: &DocumentMessageHandler, responses: &mut VecDeque<Message>) {
let viewport_transform = document.metadata().document_to_viewport.inverse();
self.pivot = Some(viewport_transform.transform_point2(position));
log::debug!("setting pivot to {:?}", self.pivot);
for layer in document.selected_nodes.selected_visible_layers(document.network(), document.metadata()) {
let transform = Self::get_layer_pivot_transform(layer, document);
let pivot = transform.inverse().transform_point2(position);
// Only update the pivot when computed position is finite. Infinite can happen when scale is 0.
if pivot.is_finite() {
responses.add(GraphOperationMessage::TransformSetPivot { layer, pivot });
}
}
}

/// Answers if the pointer is currently positioned over the pivot.
pub fn is_over(&self, mouse: DVec2) -> bool {
mouse.distance_squared(self.viewport_pos) < (PIVOT_DIAMETER / 2.).powi(2)
}
}
43 changes: 10 additions & 33 deletions editor/src/messages/tool/tool_messages/select_tool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ use crate::messages::portfolio::document::utility_types::document_metadata::Laye
use crate::messages::portfolio::document::utility_types::misc::{AlignAggregate, AlignAxis, FlipAxis};
use crate::messages::portfolio::document::utility_types::transformation::Selected;
use crate::messages::tool::common_functionality::graph_modification_utils::is_layer_fed_by_node_of_name;
use crate::messages::tool::common_functionality::pivot::Pivot;
use crate::messages::tool::common_functionality::snapping::{self, SnapCandidatePoint, SnapConstraint, SnapData, SnapManager, SnappedPoint};
use crate::messages::tool::common_functionality::transformation_cage::*;

Expand Down Expand Up @@ -206,12 +205,6 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionHandlerData<'a>> for SelectT
}

self.fsm_state.process_event(message, &mut self.tool_data, tool_data, &(), responses, false);

if self.tool_data.pivot.should_refresh_pivot_position() || self.tool_data.selected_layers_changed {
// Send the layout containing the updated pivot position (a bit ugly to do it here not in the fsm but that doesn't have SelectTool)
self.send_layout(responses, LayoutTarget::ToolOptions);
self.tool_data.selected_layers_changed = false;
}
}

fn actions(&self) -> ActionList {
Expand Down Expand Up @@ -269,7 +262,6 @@ struct SelectToolData {
bounding_box_manager: Option<BoundingBoxManager>,
snap_manager: SnapManager,
cursor: MouseCursorIcon,
pivot: Pivot,
nested_selection_behavior: NestedSelectionBehavior,
selected_layers_count: usize,
selected_layers_changed: bool,
Expand Down Expand Up @@ -439,9 +431,6 @@ impl Fsm for SelectToolFsmState {
tool_data.bounding_box_manager.take();
}

// Update pivot
tool_data.pivot.update_pivot(document, &mut overlay_context);

// Update dragging box
if self == Self::DrawingBox {
overlay_context.quad(Quad::from_box([tool_data.drag_start, tool_data.drag_current]));
Expand All @@ -468,8 +457,12 @@ impl Fsm for SelectToolFsmState {
let edges = bounding_box.check_selected_edges(input.mouse.position);

bounding_box.selected_edges = edges.map(|(top, bottom, left, right)| {
log::debug!("bounding_box: {:?}", bounding_box);
let selected_edges = SelectedEdges::new(top, bottom, left, right, bounding_box.bounds);
bounding_box.opposite_pivot = selected_edges.calculate_pivot();
let opposite_pivot = selected_edges.calculate_pivot();
let opposite_pivot = bounding_box.transform.transform_point2(opposite_pivot);
bounding_box.opposite_pivot = opposite_pivot;
log::debug!("pivot: {:?}", bounding_box.opposite_pivot);
selected_edges
});

Expand All @@ -490,19 +483,7 @@ impl Fsm for SelectToolFsmState {
// If the user clicks on a layer that is in their current selection, go into the dragging mode.
// If the user clicks on new shape, make that layer their new selection.
// Otherwise enter the box select mode

let state =
// Dragging the pivot
if tool_data.pivot.is_over(input.mouse.position) {
responses.add(DocumentMessage::StartTransaction);

//tool_data.snap_manager.start_snap(document, input, document.bounding_boxes(), true, true);
//tool_data.snap_manager.add_all_document_handles(document, input, &[], &[], &[]);

SelectToolFsmState::DraggingPivot
}
// Dragging one (or two, forming a corner) of the transform cage bounding box edges
else if let Some(_selected_edges) = dragging_bounds {
let state = if let Some(_selected_edges) = dragging_bounds {
responses.add(DocumentMessage::StartTransaction);

tool_data.layers_dragging = selected;
Expand All @@ -522,8 +503,6 @@ impl Fsm for SelectToolFsmState {
&ToolType::Select,
);
bounds.center_of_transformation = selected.mean_average_of_pivots();
log::debug!("setting pivot");
tool_data.pivot.set_viewport_position(bounds.center_of_transformation, document, responses);
}
tool_data.get_snap_candidates(document, input);

Expand All @@ -547,8 +526,6 @@ impl Fsm for SelectToolFsmState {
);

bounds.center_of_transformation = selected.mean_average_of_pivots();
log::debug!("setting pivot");
tool_data.pivot.set_viewport_position(bounds.center_of_transformation, document, responses);
}

log::debug!("start rotating");
Expand Down Expand Up @@ -680,6 +657,10 @@ impl Fsm for SelectToolFsmState {
});
let (position, size) = movement.new_size(input.mouse.position, bounds.original_bound_transform, center, constrain, snap);
let (delta, mut pivot) = movement.bounds_to_scale_transform(position, size);
log::debug!("bounds: {:?}", bounds);
log::debug!("vanilla pivot: {:?}", pivot);
pivot = bounds.transform.transform_point2(pivot);
log::debug!("pivot_for_resize: {:?}", pivot);

let transformation = delta;

Expand Down Expand Up @@ -742,7 +723,6 @@ impl Fsm for SelectToolFsmState {
(SelectToolFsmState::DraggingPivot, SelectToolMessage::PointerMove(modifier_keys)) => {
let mouse_position = input.mouse.position;
let snapped_mouse_position = mouse_position; //tool_data.snap_manager.snap_position(responses, document, mouse_position);
tool_data.pivot.set_viewport_position(snapped_mouse_position, document, responses);

setup_pointer_outside_edge_event(mouse_position, input.viewport_bounds.size(), tool_data, modifier_keys, responses);

Expand All @@ -760,9 +740,6 @@ impl Fsm for SelectToolFsmState {
let mut cursor = tool_data.bounding_box_manager.as_ref().map_or(MouseCursorIcon::Default, |bounds| bounds.get_cursor(input, true));

// Dragging the pivot overrules the other operations
if tool_data.pivot.is_over(input.mouse.position) {
cursor = MouseCursorIcon::Move;
}

// Generate the hover outline
responses.add(OverlaysMessage::Draw);
Expand Down

0 comments on commit e95416f

Please sign in to comment.