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;
}
}
}