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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
use math::*;
use crate::core::event::*;

#[derive(Debug, Default)]
pub struct Transform 
{
	translate:float3,
	scale:float3,
	rotation:float3,
	transform: float4x4,
	transform_inverse: float4x4,
	need_update:bool
}

impl Transform 
{
	pub fn new() -> Self 
	{
		Self
		{
			translate:float3::zero(),
			scale:float3::one(),
			rotation:float3::zero(),
			transform:float4x4::one(),
			transform_inverse:float4x4::one(),
			need_update:true
		}
	}

	#[inline]
	pub fn translate(&self) -> &float3
	{
		return &self.translate;
	}

	#[inline]
	pub fn scale(&self) -> &float3
	{
		return &self.scale;
	}

	#[inline]
	pub fn rotation(&self) -> &float3
	{
		return &self.rotation;
	}

	#[inline]
	pub fn transform(&self) -> &float4x4
	{
		return &self.transform;
	}

	#[inline]
	pub fn transform_inverse(&self) -> &float4x4
	{
		return &self.transform_inverse;
	}

	#[inline]
	pub fn set_translate(&mut self, pos:float3)
	{
		if self.translate != pos
		{
			self.translate = pos;
			self.need_update = true;
		}
	}

	#[inline]
	pub fn set_scale(&mut self, sz:float3)
	{
		if self.scale != sz
		{
			self.scale = sz;
			self.need_update = true;
		}
	}

	#[inline]
	pub fn set_rotation(&mut self, rot:float3)
	{
		if self.rotation != rot
		{
			self.rotation = rot;
			self.need_update = true;
		}
	}
}

impl UpdateEvent for Transform 
{
	fn update(&mut self)
	{
		if self.need_update
		{
			let translate = float4x4::translate(self.translate.x, self.translate.y, self.translate.z);
			let rotation:float4x4 = Quaternion::from_xyz(&self.rotation).into();
			let scale = float4x4::scale(self.scale.x, self.scale.y, self.scale.z);

			self.transform = translate * rotation * scale;
			self.transform_inverse = self.transform.transform_inverse();

			self.need_update = false;
		}
	}
}