Fix 'Scatter Points' node double transformation of points and remove segments connecting the points

This commit is contained in:
Keavon Chambers 2025-06-26 00:19:49 -07:00
parent 504af4e68d
commit 02afd08c80
4 changed files with 13 additions and 18 deletions

View file

@ -316,7 +316,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
DocumentNodeMetadata { DocumentNodeMetadata {
persistent_metadata: DocumentNodePersistentMetadata { persistent_metadata: DocumentNodePersistentMetadata {
display_name: "Layer".to_string(), display_name: "Layer".to_string(),
node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(1, -3)), node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(0, -3)),
..Default::default() ..Default::default()
}, },
..Default::default() ..Default::default()
@ -333,7 +333,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
..Default::default() ..Default::default()
}, },
}, },
description: Cow::Borrowed("The Merge node combines graphical data through composition."), description: Cow::Borrowed("Merge attaches a layer to the stack's group."),
properties: None, properties: None,
}, },
DocumentNodeDefinition { DocumentNodeDefinition {
@ -429,7 +429,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
DocumentNodeMetadata { DocumentNodeMetadata {
persistent_metadata: DocumentNodePersistentMetadata { persistent_metadata: DocumentNodePersistentMetadata {
display_name: "To Artboard".to_string(), display_name: "To Artboard".to_string(),
node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(-10, -3)), node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(-14, -3)),
..Default::default() ..Default::default()
}, },
..Default::default() ..Default::default()
@ -437,7 +437,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
DocumentNodeMetadata { DocumentNodeMetadata {
persistent_metadata: DocumentNodePersistentMetadata { persistent_metadata: DocumentNodePersistentMetadata {
display_name: "Monitor".to_string(), display_name: "Monitor".to_string(),
node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(-2, -3)), node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(-7, -3)),
..Default::default() ..Default::default()
}, },
..Default::default() ..Default::default()
@ -445,7 +445,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
DocumentNodeMetadata { DocumentNodeMetadata {
persistent_metadata: DocumentNodePersistentMetadata { persistent_metadata: DocumentNodePersistentMetadata {
display_name: "Append Artboards".to_string(), display_name: "Append Artboards".to_string(),
node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(6, -4)), node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(0, -4)),
..Default::default() ..Default::default()
}, },
..Default::default() ..Default::default()

View file

@ -1076,7 +1076,6 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageData<'_>> for PortfolioMes
} }
if reference == "Sample Points" && inputs_count == 5 { if reference == "Sample Points" && inputs_count == 5 {
// TODO: Rename to "Sample Polyline", also remove segment generation from "Scatter Points"
let node_definition = resolve_document_node_type("Sample Polyline").unwrap(); let node_definition = resolve_document_node_type("Sample Polyline").unwrap();
let new_node_template = node_definition.default_node_template(); let new_node_template = node_definition.default_node_template();
let document_node = new_node_template.document_node; let document_node = new_node_template.document_node;
@ -1096,7 +1095,6 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageData<'_>> for PortfolioMes
document.network_interface.set_input(&InputConnector::node(*node_id, 5), old_inputs[3].clone(), network_path); document.network_interface.set_input(&InputConnector::node(*node_id, 5), old_inputs[3].clone(), network_path);
document.network_interface.set_input(&InputConnector::node(*node_id, 6), old_inputs[4].clone(), network_path); document.network_interface.set_input(&InputConnector::node(*node_id, 6), old_inputs[4].clone(), network_path);
// TODO: Rename to "Sample Polyline", also remove segment generation from "Scatter Points"
document.network_interface.replace_reference_name(node_id, network_path, "Sample Polyline".to_string()); document.network_interface.replace_reference_name(node_id, network_path, "Sample Polyline".to_string());
} }
} }

View file

@ -340,7 +340,12 @@ pub fn migrate_artboard_group<'de, D: serde::Deserializer<'de>>(deserializer: D)
pub type ArtboardGroupTable = Instances<Artboard>; pub type ArtboardGroupTable = Instances<Artboard>;
#[node_macro::node(category(""))] #[node_macro::node(category(""))]
async fn layer(_: impl Ctx, mut stack: GraphicGroupTable, element: GraphicElement, node_path: Vec<NodeId>) -> GraphicGroupTable { async fn layer<I: 'n + Send + Clone>(
_: impl Ctx,
#[implementations(GraphicGroupTable, VectorDataTable, RasterDataTable<CPU>, RasterDataTable<GPU>)] mut stack: Instances<I>,
#[implementations(GraphicElement, VectorData, Raster<CPU>, Raster<GPU>)] element: I,
node_path: Vec<NodeId>,
) -> Instances<I> {
// Get the penultimate element of the node path, or None if the path is too short // Get the penultimate element of the node path, or None if the path is too short
let source_node_id = node_path.get(node_path.len().wrapping_sub(2)).copied(); let source_node_id = node_path.get(node_path.len().wrapping_sub(2)).copied();

View file

@ -9,7 +9,7 @@ use crate::raster_types::{CPU, GPU, RasterDataTable};
use crate::registry::types::{Angle, Fraction, IntegerCount, Length, Multiplier, Percentage, PixelLength, PixelSize, SeedValue}; use crate::registry::types::{Angle, Fraction, IntegerCount, Length, Multiplier, Percentage, PixelLength, PixelSize, SeedValue};
use crate::renderer::GraphicElementRendered; use crate::renderer::GraphicElementRendered;
use crate::transform::{Footprint, ReferencePoint, Transform}; use crate::transform::{Footprint, ReferencePoint, Transform};
use crate::vector::misc::{MergeByDistanceAlgorithm, PointSpacingType, dvec2_to_point}; use crate::vector::misc::{MergeByDistanceAlgorithm, PointSpacingType};
use crate::vector::style::{PaintOrder, StrokeAlign, StrokeCap, StrokeJoin}; use crate::vector::style::{PaintOrder, StrokeAlign, StrokeCap, StrokeJoin};
use crate::vector::{FillId, PointDomain, RegionId}; use crate::vector::{FillId, PointDomain, RegionId};
use crate::{CloneVarArgs, Color, Context, Ctx, ExtractAll, GraphicElement, GraphicGroupTable, OwnedContextImpl}; use crate::{CloneVarArgs, Color, Context, Ctx, ExtractAll, GraphicElement, GraphicGroupTable, OwnedContextImpl};
@ -1413,7 +1413,6 @@ async fn poisson_disk_points(
.stroke_bezpath_iter() .stroke_bezpath_iter()
.map(|mut bezpath| { .map(|mut bezpath| {
// TODO: apply transform to points instead of modifying the paths // TODO: apply transform to points instead of modifying the paths
bezpath.apply_affine(Affine::new(vector_data_instance.transform.to_cols_array()));
bezpath.close_path(); bezpath.close_path();
let bbox = bezpath.bounding_box(); let bbox = bezpath.bounding_box();
(bezpath, bbox) (bezpath, bbox)
@ -1425,16 +1424,9 @@ async fn poisson_disk_points(
continue; continue;
} }
let mut poisson_disk_bezpath = BezPath::new();
for point in bezpath_algorithms::poisson_disk_points(i, &path_with_bounding_boxes, separation_disk_diameter, || rng.random::<f64>()) { for point in bezpath_algorithms::poisson_disk_points(i, &path_with_bounding_boxes, separation_disk_diameter, || rng.random::<f64>()) {
if poisson_disk_bezpath.elements().is_empty() { result.point_domain.push(PointId::generate(), point);
poisson_disk_bezpath.move_to(dvec2_to_point(point));
} else {
poisson_disk_bezpath.line_to(dvec2_to_point(point));
}
} }
result.append_bezpath(poisson_disk_bezpath);
} }
// Transfer the style from the input vector data to the result. // Transfer the style from the input vector data to the result.