1 module polyplex.math.simplemath.transform;
2 import polyplex.math.simplemath.matrix4x4;
3 import polyplex.math.simplemath.vectors;
4 import polyplex.math.simplemath.quaternion;
5 
6 public class Transform {
7 	public Transform Parent;
8 	public Vector3 LocalScale;
9 	public Quaternion LocalRotation;
10 	public Vector3 LocalPosition;
11 
12 	public Transform LocalTransform() {
13 		return new Transform(LocalScale, LocalRotation, LocalPosition);
14 	}
15 
16 	this(Transform parent) {
17 		this.Parent = parent;
18 		LocalScale = Vector3.One;
19 		LocalRotation = Quaternion.Identity;
20 		LocalPosition = Vector3.Zero;
21 	}
22 
23 	this(Vector3 scale, Quaternion rotation, Vector3 position) {
24 		this(null);
25 		LocalScale = scale;
26 		LocalRotation = rotation;
27 		LocalPosition = position;
28 	}
29 
30 	this() {
31 		this(null);
32 	}
33 
34 	private Matrix4x4 lscale() {
35 		return Matrix4x4.Scaling(LocalScale);
36 	}
37 
38 	private Matrix4x4 lrot() {
39 		return Matrix4x4.FromQuaternion(LocalRotation);
40 	}
41 
42 	private Matrix4x4 ltrans() {
43 		return Matrix4x4.Translation(LocalPosition);
44 	}
45 
46 	public Matrix4x4 TRS() {
47 		if (Parent is null) 
48 			return (ltrans * lrot * lscale);
49 		return Parent.TRS*(ltrans * lrot * lscale);
50 	}
51 
52 	public Vector3 Scale() {
53 		if (Parent is null) return LocalScale;
54 		return (TRS).ToScaling();
55 	}
56 
57 	public Quaternion Rotation() {
58 		if (Parent is null) return LocalRotation;
59 		return Rotation.FromMatrix(TRS);
60 	}
61 
62 	public Vector3 Position() {
63 		if (Parent is null) return LocalPosition;
64 		return TRS.ToTranslation();
65 	}
66 
67 	public Vector3 Up() {
68 		return Rotation.UpDirection;
69 	}
70 
71 	public Vector3 Down() {
72 		Vector3 up = Up;
73 		return Vector3(-up.X, -up.Y, -up.Z);
74 	}
75 
76 	public Vector3 Forward() {
77 		return Rotation.ForwardDirection;
78 	}
79 	
80 	public Vector3 Back() {
81 		Vector3 forward = Forward;
82 		return Vector3(-forward.X, -forward.Y, -forward.Z);
83 	}
84 
85 	public Vector3 Left() {
86 		return Rotation.LeftDirection;
87 	}
88 	
89 	public Vector3 Right() {
90 		Vector3 left = Left;
91 		return Vector3(-left.X, -left.Y, -left.Z);
92 	}
93 }
94 
95 public class Transform2D {
96 	public Transform2D Parent;
97 	public Vector2 LocalScale;
98 	public float LocalRotation;
99 	public Vector2 LocalPosition;
100 
101 	public Transform2D LocalTransform() {
102 		return new Transform2D(LocalScale, LocalRotation, LocalPosition);
103 	}
104 
105 	this(Transform2D parent) {
106 		this.Parent = parent;
107 		LocalScale = Vector2.One;
108 		LocalRotation = 0f;
109 		LocalPosition = Vector2.Zero;
110 	}
111 
112 
113 	this(Vector2 scale, float rotation, Vector2 position) {
114 		LocalScale = scale;
115 		LocalRotation = rotation;
116 		LocalPosition = position;
117 	}
118 
119 	this() {
120 		this(null);
121 	}
122 
123 	private Matrix4x4 lscale() {
124 		return Matrix4x4.Scaling(Vector3(LocalScale));
125 	}
126 
127 	private Matrix4x4 lrot() {
128 		return Matrix4x4.RotationZ(this.LocalRotation);
129 	}
130 
131 	private Matrix4x4 ltrans() {
132 		return Matrix4x4.Translation(Vector3(LocalPosition));
133 	}
134 
135 	public Matrix4x4 TRS() {
136 		if (Parent is null) 
137 			return (ltrans * lrot * lscale);
138 		return Parent.TRS*(ltrans * lrot * lscale);
139 	}
140 
141 	public Matrix4x4 MatrixScale() {
142 		return lscale;
143 	}
144 
145 	public Matrix4x4 MatrixRotation() {
146 		return lrot;
147 	}
148 
149 	public Matrix4x4 MatrixPosition() {
150 		return ltrans;
151 	}
152 
153 	public Vector2 Scale() {
154 		if (Parent is null) return LocalScale;
155 		return Vector2(TRS.ToScaling());
156 	}
157 
158 	public float Rotation() {
159 		if (Parent is null) return LocalRotation;
160 		return Parent.Rotation+LocalRotation;
161 	}
162 
163 	public Vector2 Position() {
164 		if (Parent is null) return LocalPosition;
165 		return Vector2(TRS.ToTranslation());
166 	}
167 
168 	public void Rotate(float amount) {
169 		LocalRotation = amount;
170 	}
171 
172 	public Vector2 Up() {
173 		return Vector2(
174 			Vector2.Up.X * Mathf.Cos(Rotation) - Vector2.Up.Y * Mathf.Sin(Rotation),
175 			Vector2.Up.X * Mathf.Sin(Rotation) + Vector2.Up.Y * Mathf.Cos(Rotation)
176 		);
177 	}
178 
179 	public Vector2 Down() {
180 		Vector2 up = Up;
181 		return Vector2(-up.X, -up.Y);
182 	}
183 
184 	public Vector2 Left() {
185 		return Vector2(
186 			Vector2.Left.X * Mathf.Cos(Rotation) - Vector2.Left.Y * Mathf.Sin(Rotation),
187 			Vector2.Left.X * Mathf.Sin(Rotation) + Vector2.Left.Y * Mathf.Cos(Rotation)
188 		);
189 	}
190 	
191 	public Vector2 Right() {
192 		Vector2 left = Left;
193 		return Vector2(-left.X, -left.Y);
194 	}
195 }