|
|
@ -4,36 +4,35 @@ namespace Smoll { |
|
|
|
|
|
|
|
struct Transform2D { |
|
|
|
public Complex position; |
|
|
|
public Complex anchor; |
|
|
|
public float angle; |
|
|
|
public Complex scale; |
|
|
|
public float scale; |
|
|
|
|
|
|
|
public void ForceInvariant() { |
|
|
|
while(angle > 2*MathF.PI) angle -= 2*MathF.PI; |
|
|
|
while(angle < 0) angle += 2*MathF.PI; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
sealed class Transform2DComponent : Component { |
|
|
|
public Transform2D transform; |
|
|
|
|
|
|
|
public Transform2DComponent() |
|
|
|
: this(0,0,0,0,0,1,1) |
|
|
|
: this(0,0,0,1) |
|
|
|
{} |
|
|
|
|
|
|
|
public Transform2DComponent(float x, float y) |
|
|
|
: this(x,y,0,0,0,1,1) |
|
|
|
: this(x,y,0,1) |
|
|
|
{} |
|
|
|
|
|
|
|
public Transform2DComponent(float x, float y, float angle) |
|
|
|
: this(x,y,angle,0,0,1,1) |
|
|
|
{} |
|
|
|
|
|
|
|
public Transform2DComponent(float x, float y, float angle, float center_x, float center_y) |
|
|
|
: this(x,y,angle,center_x,center_y,1,1) |
|
|
|
: this(x,y,angle,1) |
|
|
|
{} |
|
|
|
|
|
|
|
public Transform2DComponent(float x, float y, float angle, float center_x, float center_y, float scale_x, float scale_y) { |
|
|
|
public Transform2DComponent(float x, float y, float angle, float scale) { |
|
|
|
transform = new Transform2D(); |
|
|
|
transform.position = y*Complex.ImaginaryOne + x; |
|
|
|
transform.angle = angle; |
|
|
|
transform.anchor = center_y*Complex.ImaginaryOne + center_x; |
|
|
|
transform.scale = scale_y*Complex.ImaginaryOne + scale_x; |
|
|
|
transform.scale = scale; |
|
|
|
} |
|
|
|
|
|
|
|
public Transform2D AbsoluteTransform() { |
|
|
@ -44,18 +43,21 @@ sealed class Transform2DComponent : Component { |
|
|
|
var component = up.GetComponent<Transform2DComponent>(); |
|
|
|
if(component != null) { |
|
|
|
Transform2D combined = component.AbsoluteTransform(); |
|
|
|
var unscaled_pos = (transform.position - transform.anchor)*Complex.Exp(Complex.ImaginaryOne * combined.angle) + transform.anchor; |
|
|
|
combined.position = combined.scale.Real*unscaled_pos.Real + combined.scale.Imaginary*unscaled_pos.Imaginary*Complex.ImaginaryOne |
|
|
|
+ combined.position + combined.anchor; |
|
|
|
var unscaled_anchor = (transform.anchor - transform.position)*Complex.Exp(Complex.ImaginaryOne * combined.angle) + transform.position; |
|
|
|
combined.anchor = transform.scale.Real*unscaled_anchor.Real + transform.scale.Imaginary*unscaled_anchor.Imaginary*Complex.ImaginaryOne; |
|
|
|
combined.scale = transform.scale.Imaginary*combined.scale.Imaginary*Complex.ImaginaryOne + transform.scale.Real * combined.scale.Real; |
|
|
|
var unscaled_pos = (transform.position)*Complex.Exp(Complex.ImaginaryOne * combined.angle); |
|
|
|
combined.position = unscaled_pos + combined.position; |
|
|
|
combined.scale *= transform.scale; |
|
|
|
combined.angle += transform.angle; |
|
|
|
combined.ForceInvariant(); |
|
|
|
return combined; |
|
|
|
} |
|
|
|
up = up.parent; |
|
|
|
} while(true); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public override void Update(float _) |
|
|
|
{ |
|
|
|
transform.ForceInvariant(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |