mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-10-01 02:08:12 +08:00
@@ -1,5 +1,10 @@
|
|||||||
use core_types::{Ctx, ExtractAnimationTime, ExtractPointerPosition, ExtractRealTime};
|
use core_types::table::Table;
|
||||||
use glam::DVec2;
|
use core_types::transform::Footprint;
|
||||||
|
use core_types::uuid::NodeId;
|
||||||
|
use core_types::{CloneVarArgs, Color, Context, Ctx, ExtractAll, ExtractAnimationTime, ExtractPointerPosition, ExtractRealTime, OwnedContextImpl};
|
||||||
|
use glam::{DAffine2, DVec2};
|
||||||
|
use graphic_types::{Artboard, Graphic, Vector, vector_types::GradientStops};
|
||||||
|
use raster_types::{CPU, GPU, Raster};
|
||||||
|
|
||||||
const DAY: f64 = 1000. * 3600. * 24.;
|
const DAY: f64 = 1000. * 3600. * 24.;
|
||||||
|
|
||||||
@@ -54,6 +59,92 @@ fn animation_time(
|
|||||||
ctx.try_animation_time().unwrap_or_default() * rate
|
ctx.try_animation_time().unwrap_or_default() * rate
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[node_macro::node(category("Animation"))]
|
||||||
|
async fn quantize_real_time<T>(
|
||||||
|
ctx: impl Ctx + ExtractAll + CloneVarArgs,
|
||||||
|
#[implementations(
|
||||||
|
Context -> bool,
|
||||||
|
Context -> u32,
|
||||||
|
Context -> u64,
|
||||||
|
Context -> f32,
|
||||||
|
Context -> f64,
|
||||||
|
Context -> String,
|
||||||
|
Context -> DAffine2,
|
||||||
|
Context -> Footprint,
|
||||||
|
Context -> DVec2,
|
||||||
|
Context -> Vec<DVec2>,
|
||||||
|
Context -> Vec<NodeId>,
|
||||||
|
Context -> Vec<f64>,
|
||||||
|
Context -> Vec<f32>,
|
||||||
|
Context -> Vec<String>,
|
||||||
|
Context -> Table<Vector>,
|
||||||
|
Context -> Table<Graphic>,
|
||||||
|
Context -> Table<Raster<CPU>>,
|
||||||
|
Context -> Table<Raster<GPU>>,
|
||||||
|
Context -> Table<Color>,
|
||||||
|
Context -> Table<Artboard>,
|
||||||
|
Context -> Table<GradientStops>,
|
||||||
|
Context -> GradientStops,
|
||||||
|
Context -> (),
|
||||||
|
)]
|
||||||
|
value: impl Node<'n, Context<'static>, Output = T>,
|
||||||
|
#[default(1)]
|
||||||
|
#[unit("sec")]
|
||||||
|
quantum: f64,
|
||||||
|
) -> T {
|
||||||
|
let time = ctx.try_real_time().unwrap_or_default();
|
||||||
|
let time = time / 1000.;
|
||||||
|
let mut quantized_time = (time * quantum.recip()).round() / quantum.recip();
|
||||||
|
if !quantized_time.is_finite() {
|
||||||
|
quantized_time = time;
|
||||||
|
}
|
||||||
|
let quantized_time = quantized_time * 1000.;
|
||||||
|
let new_context = OwnedContextImpl::from(ctx).with_real_time(quantized_time);
|
||||||
|
value.eval(Some(new_context.into())).await
|
||||||
|
}
|
||||||
|
|
||||||
|
#[node_macro::node(category("Animation"))]
|
||||||
|
async fn quantize_animation_time<T>(
|
||||||
|
ctx: impl Ctx + ExtractAll + CloneVarArgs,
|
||||||
|
#[implementations(
|
||||||
|
Context -> bool,
|
||||||
|
Context -> u32,
|
||||||
|
Context -> u64,
|
||||||
|
Context -> f32,
|
||||||
|
Context -> f64,
|
||||||
|
Context -> String,
|
||||||
|
Context -> DAffine2,
|
||||||
|
Context -> Footprint,
|
||||||
|
Context -> DVec2,
|
||||||
|
Context -> Vec<DVec2>,
|
||||||
|
Context -> Vec<NodeId>,
|
||||||
|
Context -> Vec<f64>,
|
||||||
|
Context -> Vec<f32>,
|
||||||
|
Context -> Vec<String>,
|
||||||
|
Context -> Table<Vector>,
|
||||||
|
Context -> Table<Graphic>,
|
||||||
|
Context -> Table<Raster<CPU>>,
|
||||||
|
Context -> Table<Raster<GPU>>,
|
||||||
|
Context -> Table<Color>,
|
||||||
|
Context -> Table<Artboard>,
|
||||||
|
Context -> Table<GradientStops>,
|
||||||
|
Context -> GradientStops,
|
||||||
|
Context -> (),
|
||||||
|
)]
|
||||||
|
value: impl Node<'n, Context<'static>, Output = T>,
|
||||||
|
#[default(1)]
|
||||||
|
#[unit("sec")]
|
||||||
|
quantum: f64,
|
||||||
|
) -> T {
|
||||||
|
let time = ctx.try_animation_time().unwrap_or_default();
|
||||||
|
let mut quantized_time = (time * quantum.recip()).round() / quantum.recip();
|
||||||
|
if !quantized_time.is_finite() {
|
||||||
|
quantized_time = time;
|
||||||
|
}
|
||||||
|
let new_context = OwnedContextImpl::from(ctx).with_animation_time(quantized_time);
|
||||||
|
value.eval(Some(new_context.into())).await
|
||||||
|
}
|
||||||
|
|
||||||
/// Produces the current position of the user's pointer within the document canvas.
|
/// Produces the current position of the user's pointer within the document canvas.
|
||||||
#[node_macro::node(category("Animation"))]
|
#[node_macro::node(category("Animation"))]
|
||||||
fn pointer_position(ctx: impl Ctx + ExtractPointerPosition) -> DVec2 {
|
fn pointer_position(ctx: impl Ctx + ExtractPointerPosition) -> DVec2 {
|
||||||
|
|||||||
Reference in New Issue
Block a user