New node: Jitter Points

This commit is contained in:
Keavon Chambers 2024-11-02 16:37:27 -07:00
parent 4c9ab2d50b
commit 7d86bf4abf
1 changed files with 62 additions and 0 deletions

View File

@ -975,6 +975,68 @@ async fn splines_from_points<F: 'n + Send>(
vector_data
}
#[node_macro::node(category("Vector"), path(graphene_core::vector))]
async fn jitter_points<F: 'n + Send>(
#[implementations(
(),
Footprint,
)]
footprint: F,
#[implementations(
() -> VectorData,
Footprint -> VectorData,
)]
vector_data: impl Node<F, Output = VectorData>,
#[default(5.)] amount: f64,
seed: SeedValue,
) -> VectorData {
let mut vector_data = vector_data.eval(footprint).await;
let mut rng = rand::rngs::StdRng::seed_from_u64(seed.into());
let deltas = (0..vector_data.point_domain.positions().len())
.map(|_| {
let angle = rng.gen::<f64>() * std::f64::consts::TAU;
DVec2::from_angle(angle) * rng.gen::<f64>() * amount
})
.collect::<Vec<_>>();
let mut already_applied = vec![false; vector_data.point_domain.positions().len()];
for (handles, start, end) in vector_data.segment_domain.handles_and_points_mut() {
let start_delta = deltas[*start];
let end_delta = deltas[*end];
if !already_applied[*start] {
let start_position = vector_data.point_domain.positions()[*start];
let start_position = vector_data.transform.transform_point2(start_position);
vector_data.point_domain.set_position(*start, start_position + start_delta);
already_applied[*start] = true;
}
if !already_applied[*end] {
let end_position = vector_data.point_domain.positions()[*end];
let end_position = vector_data.transform.transform_point2(end_position);
vector_data.point_domain.set_position(*end, end_position + end_delta);
already_applied[*end] = true;
}
match handles {
bezier_rs::BezierHandles::Cubic { handle_start, handle_end } => {
*handle_start = vector_data.transform.transform_point2(*handle_start) + start_delta;
*handle_end += vector_data.transform.transform_point2(*handle_end) + end_delta;
}
bezier_rs::BezierHandles::Quadratic { handle } => {
*handle += vector_data.transform.transform_point2(*handle) + (start_delta + end_delta) / 2.;
}
bezier_rs::BezierHandles::Linear => {}
}
}
vector_data.transform = DAffine2::IDENTITY;
vector_data.style.set_stroke_transform(DAffine2::IDENTITY);
vector_data
}
#[node_macro::node(category("Vector"), path(graphene_core::vector))]
async fn morph<F: 'n + Send + Copy>(
#[implementations(