| 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}; |
|
|
| #[node_macro::node(category(""))] |
| async fn transform<T: 'n + 'static>( |
| ctx: impl Ctx + CloneVarArgs + ExtractAll, |
| #[implementations( |
| Context -> VectorDataTable, |
| Context -> GraphicGroupTable, |
| Context -> RasterDataTable<CPU>, |
| Context -> RasterDataTable<GPU>, |
| )] |
| 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 |
| } |
|
|
| #[node_macro::node(category(""))] |
| fn replace_transform<Data, TransformInput: Transform>( |
| _: impl Ctx, |
| #[implementations(VectorDataTable, RasterDataTable<CPU>, GraphicGroupTable)] mut data: Instances<Data>, |
| #[implementations(DAffine2)] transform: TransformInput, |
| ) -> Instances<Data> { |
| for data_transform in data.instance_mut_iter() { |
| *data_transform.transform = transform.transform(); |
| } |
| data |
| } |
|
|
| #[node_macro::node(category("Debug"))] |
| async fn boundless_footprint<T: 'n + 'static>( |
| ctx: impl Ctx + CloneVarArgs + ExtractAll, |
| #[implementations( |
| Context -> VectorDataTable, |
| Context -> GraphicGroupTable, |
| Context -> RasterDataTable<CPU>, |
| Context -> RasterDataTable<GPU>, |
| Context -> String, |
| Context -> f64, |
| )] |
| 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 |
| } |
|
|
| #[node_macro::node(category("Debug"))] |
| async fn freeze_real_time<T: 'n + 'static>( |
| ctx: impl Ctx + CloneVarArgs + ExtractAll, |
| #[implementations( |
| Context -> VectorDataTable, |
| Context -> GraphicGroupTable, |
| Context -> RasterDataTable<CPU>, |
| Context -> RasterDataTable<GPU>, |
| Context -> String, |
| Context -> f64, |
| )] |
| 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 |
| } |
|
|