Skip to content

Commit cd045c5

Browse files
committed
use radians as base for transform rotations
1 parent 0d37af6 commit cd045c5

File tree

1 file changed

+44
-17
lines changed

1 file changed

+44
-17
lines changed

echo/util/Transform.hx

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ class Transform implements IDisposable #if cog implements cog.IComponent #end {
2121
* The Transform's rotation (as degrees) in world coordinates.
2222
*/
2323
public var rotation(get, set):Float;
24+
/**
25+
* The Transform's rotation in world coordinates.
26+
*/
27+
public var radians(get, set):Float;
2428
/**
2529
* The Transform's scale on the X axis in world coordinates.
2630
*/
@@ -40,7 +44,11 @@ class Transform implements IDisposable #if cog implements cog.IComponent #end {
4044
/**
4145
* The Transform's rotation (as degrees) in local coordinates.
4246
*/
43-
public var local_rotation(default, set):Float;
47+
public var local_rotation(get, set):Float;
48+
/**
49+
* The Transform's rotation in local coordinates.
50+
*/
51+
public var local_radians(default, set):Float;
4452
/**
4553
* The Transform's scale on the X axis in local coordinates.
4654
*/
@@ -50,18 +58,18 @@ class Transform implements IDisposable #if cog implements cog.IComponent #end {
5058
*/
5159
public var local_scale_y(default, set):Float;
5260

53-
public var right(get, never):Vector2;
54-
public var left(get, never):Vector2;
5561
public var up(get, never):Vector2;
5662
public var down(get, never):Vector2;
63+
public var right(get, never):Vector2;
64+
public var left(get, never):Vector2;
5765
/**
5866
* Optional callback method that gets called when the Transform is set as dirty.
5967
*/
6068
public var on_dirty:Transform->Void = null;
6169

6270
var _x:Float = 0;
6371
var _y:Float = 0;
64-
var _rotation:Float = 0;
72+
var _radians:Float = 0;
6573
var _scale_x:Float = 1;
6674
var _scale_y:Float = 1;
6775

@@ -157,10 +165,9 @@ class Transform implements IDisposable #if cog implements cog.IComponent #end {
157165
* @return Matrix3
158166
*/
159167
public inline function get_local_matrix():Matrix3 {
160-
// translate(local_x, local_y) * rotate(local_rotation.deg_to_rad()) * scale(local_scale_x, local_scale_y);
161-
var radians = local_rotation.deg_to_rad();
162-
var s = Math.sin(radians);
163-
var c = Math.cos(radians);
168+
// translate(local_x, local_y) * rotate(local_radians) * scale(local_scale_x, local_scale_y);
169+
var s = Math.sin(local_radians);
170+
var c = Math.cos(local_radians);
164171
return new Matrix3(c * local_scale_x, -s * local_scale_y, local_x, s * local_scale_x, c * local_scale_y, local_y, 0, 0, 1);
165172
}
166173
/**
@@ -402,7 +409,7 @@ class Transform implements IDisposable #if cog implements cog.IComponent #end {
402409
_y = local_y;
403410
_scale_x = local_scale_x;
404411
_scale_y = local_scale_y;
405-
_rotation = local_rotation;
412+
_radians = local_radians;
406413
}
407414
else {
408415
var a = m.m00;
@@ -413,7 +420,7 @@ class Transform implements IDisposable #if cog implements cog.IComponent #end {
413420
_y = m.m21;
414421
_scale_x = Math.sqrt(a * a + b * b);
415422
_scale_y = Math.sqrt(c * c + d * d);
416-
_rotation = Math.atan2(-c / _scale_y, a / _scale_x).rad_to_deg();
423+
_radians = Math.atan2(-c / _scale_y, a / _scale_x).rad_to_deg();
417424
}
418425

419426
coordinates_dirty = false;
@@ -443,9 +450,15 @@ class Transform implements IDisposable #if cog implements cog.IComponent #end {
443450
}
444451

445452
inline function get_rotation() {
446-
if (parent == null) return local_rotation;
453+
if (parent == null) return local_radians.rad_to_deg();
447454
sync();
448-
return _rotation;
455+
return _radians.rad_to_deg();
456+
}
457+
458+
inline function get_radians() {
459+
if (parent == null) return local_radians;
460+
sync();
461+
return _radians;
449462
}
450463

451464
inline function get_scale_x() {
@@ -460,20 +473,24 @@ class Transform implements IDisposable #if cog implements cog.IComponent #end {
460473
return _scale_y;
461474
}
462475

476+
inline function get_local_rotation() {
477+
return local_radians.rad_to_deg();
478+
}
479+
463480
inline function get_right() {
464-
return Vector2.from_radians(rotation.deg_to_rad(), 1);
481+
return Vector2.from_radians(radians, 1);
465482
}
466483

467484
inline function get_left() {
468-
return Vector2.from_radians((rotation + 180).deg_to_rad(), 1);
485+
return Vector2.from_radians(radians + Math.PI, 1);
469486
}
470487

471488
inline function get_up() {
472-
return Vector2.from_radians((rotation + 90).deg_to_rad(), 1);
489+
return Vector2.from_radians(radians + Math.PI * 0.5, 1);
473490
}
474491

475492
inline function get_down() {
476-
return Vector2.from_radians((rotation - 90).deg_to_rad(), 1);
493+
return Vector2.from_radians(radians - Math.PI * 0.5, 1);
477494
}
478495

479496
inline function set_x(v:Float) {
@@ -494,6 +511,12 @@ class Transform implements IDisposable #if cog implements cog.IComponent #end {
494511
return rotation;
495512
}
496513

514+
inline function set_radians(v:Float) {
515+
if (parent == null) return local_radians = v;
516+
local_radians = parent.rotation_to_local(v);
517+
return radians;
518+
}
519+
497520
inline function set_scale_x(v:Float) {
498521
if (parent == null) return local_scale_x = v;
499522
set_local_scale(parent.scale_to_local(v, scale_y));
@@ -517,8 +540,12 @@ class Transform implements IDisposable #if cog implements cog.IComponent #end {
517540
}
518541

519542
inline function set_local_rotation(v:Float) {
543+
return local_radians = v.deg_to_rad();
544+
}
545+
546+
inline function set_local_radians(v:Float) {
520547
try_set_dirty();
521-
return local_rotation = v;
548+
return local_radians = v;
522549
}
523550

524551
inline function set_local_scale_x(v:Float) {

0 commit comments

Comments
 (0)