Skip to content

Commit 72a6f67

Browse files
KeavonAnnonnymmousss
authored andcommitted
Promote vector meshes from experimental by removing it from preferences
1 parent fd0addf commit 72a6f67

6 files changed

Lines changed: 20 additions & 74 deletions

File tree

editor/src/messages/portfolio/document/overlays/utility_functions.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ pub fn path_endpoint_overlays(document: &DocumentMessageHandler, shape_editor: &
210210
let selected = shape_editor.selected_shape_state.get(&layer);
211211
let is_selected = |selected: Option<&SelectedLayerState>, point: ManipulatorPointId| selected.is_some_and(|selected| selected.is_point_selected(point));
212212

213-
for point in vector.anchor_endpoints() {
213+
for point in vector.extendable_points() {
214214
let Some(position) = vector.point_domain.position_from_id(point) else { continue };
215215
let position = transform.transform_point2(position);
216216
overlay_context.manipulator_anchor(position, is_selected(selected, ManipulatorPointId::Anchor(point)), None);

editor/src/messages/tool/common_functionality/shape_editor.rs

Lines changed: 0 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -421,68 +421,6 @@ impl ShapeState {
421421
(point.as_handle().is_some() && self.ignore_handles) || (point.as_anchor().is_some() && self.ignore_anchors)
422422
}
423423

424-
/// Applies a dummy vector modification to the layer. In the case where a group containing some vector data is selected, this triggers the creation of a «Flatten Path» node.
425-
fn add_dummy_modification_to_trigger_graph_reorganization(layer: LayerNodeIdentifier, start_point: PointId, _end_point: PointId, responses: &mut VecDeque<Message>) {
426-
// Apply a zero-delta to one of the points to trigger reorganization
427-
let dummy_modification = VectorModificationType::ApplyPointDelta {
428-
point: start_point,
429-
delta: DVec2::ZERO,
430-
};
431-
responses.add(GraphOperationMessage::Vector {
432-
layer,
433-
modification_type: dummy_modification,
434-
});
435-
responses.add(NodeGraphMessage::RunDocumentGraph);
436-
}
437-
438-
fn defer_connect_points_by_position(
439-
document: &DocumentMessageHandler,
440-
layer1: LayerNodeIdentifier,
441-
start_point: PointId,
442-
layer2: LayerNodeIdentifier,
443-
end_point: PointId,
444-
target_layer: LayerNodeIdentifier,
445-
responses: &mut VecDeque<Message>,
446-
) {
447-
// Get the local positions of the selected points
448-
let start_local_pos = document.network_interface.compute_modified_vector(layer1).and_then(|v| v.point_domain.position_from_id(start_point));
449-
let end_local_pos = document.network_interface.compute_modified_vector(layer2).and_then(|v| v.point_domain.position_from_id(end_point));
450-
451-
// Transform to document/world space
452-
let start_transform = document.metadata().transform_to_document(layer1);
453-
let end_transform = document.metadata().transform_to_document(layer2);
454-
455-
let (Some(start_local), Some(end_local)) = (start_local_pos, end_local_pos) else {
456-
warn!("Unable to resolve point ids for joining");
457-
return;
458-
};
459-
// Transform positions to document/world space
460-
// These positions are stable (won't change during reorganization)
461-
let start_pos = start_transform.transform_point2(start_local);
462-
let end_pos = end_transform.transform_point2(end_local);
463-
464-
// Defer position-based connection to run after reorganization completes
465-
// By then, PointIds will be stable with their new remapped values
466-
responses.add(DeferMessage::AfterGraphRun {
467-
messages: vec![
468-
ToolMessage::Path(PathToolMessage::ConnectPointsByPosition {
469-
layer: target_layer,
470-
start_position: start_pos,
471-
end_position: end_pos,
472-
})
473-
.into(),
474-
],
475-
});
476-
}
477-
478-
fn handle_grouped_transform_close_path(document: &DocumentMessageHandler, layer: LayerNodeIdentifier, start_point: PointId, end_point: PointId, responses: &mut VecDeque<Message>) {
479-
// This zero-delta modification triggers point domain reorganization
480-
Self::add_dummy_modification_to_trigger_graph_reorganization(layer, start_point, end_point, responses);
481-
482-
// Use the helper to defer the connection until after reorganization
483-
Self::defer_connect_points_by_position(document, layer, start_point, layer, end_point, layer, responses);
484-
}
485-
486424
pub fn close_selected_path(&self, document: &DocumentMessageHandler, responses: &mut VecDeque<Message>) {
487425
// First collect all selected anchor points across all layers
488426
let all_selected_points: Vec<(LayerNodeIdentifier, PointId)> = self

editor/src/messages/tool/common_functionality/utility_functions.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ where
4444
for layer in layers {
4545
let viewspace = document.metadata().transform_to_viewport(layer);
4646
let Some(vector) = document.network_interface.compute_modified_vector(layer) else { continue };
47-
for id in vector.anchor_points() {
47+
for id in vector.extendable_points() {
4848
if exclude(id) {
4949
continue;
5050
}

editor/src/messages/tool/tool_messages/path_tool.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -828,7 +828,7 @@ impl PathToolData {
828828
.filter(|handle| handle.length(&vector) < 1e-6)
829829
.map(|handle| handle.to_manipulator_point())
830830
.collect::<Vec<_>>();
831-
let endpoint = vector.anchor_endpoints().any(|anchor| point == anchor);
831+
let endpoint = vector.extendable_points_no_vector_meshes().any(|anchor| point == anchor);
832832

833833
if drag_zero_handle && (handles.len() == 1 && !endpoint) {
834834
shape_editor.deselect_all_points();

editor/src/messages/tool/tool_messages/pen_tool.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,7 @@ impl PenToolData {
652652
}
653653

654654
fn close_path_on_point(&mut self, snap_data: SnapData, vector: &Vector, document: &DocumentMessageHandler, id: PointId, transform: &DAffine2) -> bool {
655-
for id in vector.anchor_points().filter(|&point| point != id) {
655+
for id in vector.extendable_points().filter(|&point| point != id) {
656656
let Some(pos) = vector.point_domain.position_from_id(id) else { continue };
657657
let transformed_distance_between_squared = transform.transform_point2(pos).distance_squared(transform.transform_point2(self.next_point));
658658
let snap_point_tolerance_squared = crate::consts::SNAP_POINT_TOLERANCE.powi(2);
@@ -701,7 +701,7 @@ impl PenToolData {
701701
let vector = document.network_interface.compute_modified_vector(layer)?;
702702
let start = self.latest_point()?.id;
703703
let transform = document.metadata().document_to_viewport * transform;
704-
for id in vector.anchor_points().filter(|&point| point != start) {
704+
for id in vector.extendable_points().filter(|&point| point != start) {
705705
let Some(pos) = vector.point_domain.position_from_id(id) else { continue };
706706
let transformed_distance_between_squared = transform.transform_point2(pos).distance_squared(transform.transform_point2(next_point));
707707
let snap_point_tolerance_squared = crate::consts::SNAP_POINT_TOLERANCE.powi(2);
@@ -1126,7 +1126,7 @@ impl PenToolData {
11261126
let layer = selected_layers.next().filter(|_| selected_layers.next().is_none()).or(self.current_layer)?;
11271127
let vector = document.network_interface.compute_modified_vector(layer)?;
11281128
let transform = document.metadata().document_to_viewport * transform;
1129-
for point in vector.anchor_points() {
1129+
for point in vector.extendable_points() {
11301130
let Some(pos) = vector.point_domain.position_from_id(point) else { continue };
11311131
let transformed_distance_between_squared = transform.transform_point2(pos).distance_squared(transform.transform_point2(self.next_point));
11321132
let snap_point_tolerance_squared = crate::consts::SNAP_POINT_TOLERANCE.powi(2);
@@ -1755,7 +1755,7 @@ impl Fsm for PenToolFsmState {
17551755
if let Some(layer) = layer
17561756
&& let Some(mut vector) = document.network_interface.compute_modified_vector(layer)
17571757
{
1758-
let closest_point = vector.anchor_points().filter(|&id| id != start).find(|&id| {
1758+
let closest_point = vector.extendable_points().filter(|&id| id != start).find(|&id| {
17591759
vector.point_domain.position_from_id(id).is_some_and(|pos| {
17601760
let dist_sq = transform.transform_point2(pos).distance_squared(transform.transform_point2(next_point));
17611761
dist_sq < crate::consts::SNAP_POINT_TOLERANCE.powi(2)

node-graph/libraries/vector-types/src/vector/vector_types.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -364,14 +364,22 @@ impl<Upstream> Vector<Upstream> {
364364
number != 0
365365
}
366366

367-
/// Iterator over all anchor points.
368-
pub fn anchor_points(&self) -> impl Iterator<Item = PointId> + '_ {
367+
/// Points that can be extended from.
368+
///
369+
/// This may be points with more than one connection because of vector meshes.
370+
pub fn extendable_points(&self) -> impl Iterator<Item = PointId> + '_ {
369371
self.point_domain.ids().iter().copied()
370372
}
371373

372-
/// Anchor points at the ends of open subpaths. These are points with exactly one connection by a segment to another anchor.
373-
pub fn anchor_endpoints(&self) -> impl Iterator<Item = PointId> + '_ {
374-
self.anchor_points().enumerate().filter(|&(index, _)| self.segment_domain.connected_count(index) == 1).map(|(_, id)| id)
374+
// TODO: Avoid needing this special function that's used in only one place. See: <https://github.com/GraphiteEditor/Graphite/commit/6e7f218068a55cc22659ee2cf4f0f2cf26d37774#r173283173>
375+
/// Points that can be extended from.
376+
///
377+
/// This includes only points with exactly one connection because vector meshes are ignored.
378+
pub fn extendable_points_no_vector_meshes(&self) -> impl Iterator<Item = PointId> + '_ {
379+
self.extendable_points()
380+
.enumerate()
381+
.filter(|&(index, _)| self.segment_domain.connected_count(index) == 1)
382+
.map(|(_, id)| id)
375383
}
376384

377385
/// Computes if all the connected handles are colinear for an anchor, or if that handle is colinear for a handle.

0 commit comments

Comments
 (0)