Download node-graph/gcore/src/transform_nodes.rs from openfree/graphite2: direct link, hf CLI and curl.
- Browser
- Download file 2.78 kB
-
https://huggingface.co/spaces/openfree/graphite2/resolve/main/node-graph/gcore/src/transform_nodes.rs
- Command line
-
hf download hf://spaces/openfree/graphite2/node-graph/gcore/src/transform_nodes.rs
-
curl -L -o transform_nodes.rs https://huggingface.co/spaces/openfree/graphite2/resolve/main/node-graph/gcore/src/transform_nodes.rs
2.78 kB
| use crate::instances::Instances; | |
| use crate::raster_types::{CPU, GPU, RasterDataTable}; | |
| use crate::transform::{ApplyTransform, Footprint, Transform}; | |
| use crate::vector::VectorDataTable; | |
| use crate::{CloneVarArgs, Context, Ctx, ExtractAll, GraphicGroupTable, OwnedContextImpl}; | |
| use core::f64; | |
| use glam::{DAffine2, DVec2}; | |
| async fn transform<T: 'n + 'static>( | |
| ctx: impl Ctx + CloneVarArgs + ExtractAll, | |
| transform_target: impl Node<Context<'static>, Output = Instances<T>>, | |
| translate: DVec2, | |
| rotate: f64, | |
| scale: DVec2, | |
| skew: DVec2, | |
| _pivot: DVec2, | |
| ) -> Instances<T> { | |
| let matrix = DAffine2::from_scale_angle_translation(scale, rotate, translate) * DAffine2::from_cols_array(&[1., skew.y, skew.x, 1., 0., 0.]); | |
| let footprint = ctx.try_footprint().copied(); | |
| let mut ctx = OwnedContextImpl::from(ctx); | |
| if let Some(mut footprint) = footprint { | |
| footprint.apply_transform(&matrix); | |
| ctx = ctx.with_footprint(footprint); | |
| } | |
| let mut transform_target = transform_target.eval(ctx.into_context()).await; | |
| for data_transform in transform_target.instance_mut_iter() { | |
| *data_transform.transform = matrix * *data_transform.transform; | |
| } | |
| transform_target | |
| } | |
| fn replace_transform<Data, TransformInput: Transform>( | |
| _: impl Ctx, | |
| mut data: Instances<Data>, | |
| transform: TransformInput, | |
| ) -> Instances<Data> { | |
| for data_transform in data.instance_mut_iter() { | |
| *data_transform.transform = transform.transform(); | |
| } | |
| data | |
| } | |
| async fn boundless_footprint<T: 'n + 'static>( | |
| ctx: impl Ctx + CloneVarArgs + ExtractAll, | |
| transform_target: impl Node<Context<'static>, Output = T>, | |
| ) -> T { | |
| let ctx = OwnedContextImpl::from(ctx).with_footprint(Footprint::BOUNDLESS); | |
| transform_target.eval(ctx.into_context()).await | |
| } | |
| async fn freeze_real_time<T: 'n + 'static>( | |
| ctx: impl Ctx + CloneVarArgs + ExtractAll, | |
| transform_target: impl Node<Context<'static>, Output = T>, | |
| ) -> T { | |
| let ctx = OwnedContextImpl::from(ctx).with_real_time(0.); | |
| transform_target.eval(ctx.into_context()).await | |
| } | |