File size: 1,601 Bytes
2409829
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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();
	// TODO: Implement proper conversion using and existing time implementation
	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()
}

// These nodes require more sophistcated algorithms for giving the correct result

// #[node_macro::node(category("Animation"))]
// fn month(ctx: impl Ctx + ExtractTime) -> f64 {
// 	((ctx.try_time().unwrap_or_default() / DAY / 365.25 % 1.) * 12.).floor()
// }
// #[node_macro::node(category("Animation"))]
// fn day(ctx: impl Ctx + ExtractTime) -> f64 {
// 	(ctx.try_time().unwrap_or_default() / DAY
// }