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 }