| use crate::{Ctx, ExtractAnimationTime, ExtractTime}; |
|
|
| const DAY: f64 = 1000. * 3600. * 24.; |
|
|
| #[derive(Debug, Clone, Copy, PartialEq, Eq, dyn_any::DynAny, Default, Hash, node_macro::ChoiceType, serde::Serialize, serde::Deserialize)] |
| pub enum RealTimeMode { |
| #[label("UTC")] |
| Utc, |
| Year, |
| Hour, |
| Minute, |
| #[default] |
| Second, |
| Millisecond, |
| } |
|
|
| #[derive(Debug, Clone, Copy, PartialEq, Eq)] |
| pub enum AnimationTimeMode { |
| AnimationTime, |
| FrameNumber, |
| } |
|
|
| #[node_macro::node(category("Animation"))] |
| fn real_time(ctx: impl Ctx + ExtractTime, _primary: (), mode: RealTimeMode) -> f64 { |
| let time = ctx.try_time().unwrap_or_default(); |
| |
| match mode { |
| RealTimeMode::Utc => time, |
| RealTimeMode::Year => (time / DAY / 365.25).floor() + 1970., |
| RealTimeMode::Hour => (time / 1000. / 3600.).floor() % 24., |
| RealTimeMode::Minute => (time / 1000. / 60.).floor() % 60., |
|
|
| RealTimeMode::Second => (time / 1000.).floor() % 60., |
| RealTimeMode::Millisecond => time % 1000., |
| } |
| } |
|
|
| #[node_macro::node(category("Animation"))] |
| fn animation_time(ctx: impl Ctx + ExtractAnimationTime) -> f64 { |
| ctx.try_animation_time().unwrap_or_default() |
| } |
|
|
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
|
|