2023-10-23 15:45:18 +03:00
|
|
|
package gg
|
2023-02-17 12:47:17 +03:00
|
|
|
|
2023-02-17 23:51:40 +03:00
|
|
|
import (
|
2023-05-11 12:28:34 +03:00
|
|
|
//"github.com/hajimehoshi/ebiten/v2"
|
|
|
|
//"math"
|
2023-02-17 23:51:40 +03:00
|
|
|
)
|
|
|
|
|
2023-06-03 10:39:15 +03:00
|
|
|
// The structure represents basic transformation
|
|
|
|
// features: positioning, rotating and scaling.
|
2023-02-17 12:47:17 +03:00
|
|
|
type Transform struct {
|
2023-12-23 00:09:07 +03:00
|
|
|
// Absolute (if no parent) position and
|
|
|
|
// the scale.
|
|
|
|
Position, Scale Vector
|
|
|
|
// The object rotation in radians.
|
|
|
|
Rotation Float
|
|
|
|
// The not scaled offset vector from upper left corner
|
|
|
|
// which the object should be rotated around.
|
|
|
|
Around Vector
|
|
|
|
// Needs to be implemented.
|
|
|
|
// Makes transform depending on the other one.
|
|
|
|
// Is the root one if Parent == nil
|
|
|
|
Parent *Transform
|
2023-02-17 12:47:17 +03:00
|
|
|
}
|
|
|
|
|
2023-12-24 15:05:34 +03:00
|
|
|
// Returns the default Transform structure.
|
2023-02-17 12:47:17 +03:00
|
|
|
func T() Transform {
|
2023-05-22 23:51:14 +03:00
|
|
|
ret := Transform{
|
2023-12-24 15:05:34 +03:00
|
|
|
// Rotate around
|
2023-12-23 00:09:07 +03:00
|
|
|
Scale: Vector{1, 1},
|
2023-12-24 15:05:34 +03:00
|
|
|
// Rotate around the center.
|
2023-12-23 00:09:07 +03:00
|
|
|
Around: V(.5, .5),
|
2023-05-22 23:51:14 +03:00
|
|
|
}
|
2023-02-17 12:47:17 +03:00
|
|
|
return ret
|
|
|
|
}
|
|
|
|
|
2023-06-03 10:39:15 +03:00
|
|
|
func (t Transform) ScaledToXY(x, y Float) Transform {
|
|
|
|
return t.ScaledToX(x).ScaledToY(y)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t Transform) ScaledToX(x Float) Transform {
|
2023-12-23 00:09:07 +03:00
|
|
|
t.Scale.X = x
|
2023-06-03 10:39:15 +03:00
|
|
|
return t
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t Transform) ScaledToY(y Float) Transform {
|
2023-12-23 00:09:07 +03:00
|
|
|
t.Scale.Y = y
|
2023-06-03 10:39:15 +03:00
|
|
|
return t
|
|
|
|
}
|
|
|
|
|
2023-02-17 23:51:40 +03:00
|
|
|
// Returns the GeoM with corresponding
|
2023-05-30 22:35:49 +03:00
|
|
|
// to the transfrom transformation.
|
2023-05-30 14:34:10 +03:00
|
|
|
func (t Transform)Matrix() Matrix {
|
2023-02-17 23:51:40 +03:00
|
|
|
g := &Matrix{}
|
|
|
|
|
2023-12-23 00:09:07 +03:00
|
|
|
// Scale first.
|
|
|
|
g.Scale(t.Scale.X, t.Scale.Y)
|
|
|
|
|
|
|
|
// Then move and rotate.
|
|
|
|
g.Translate(
|
|
|
|
-t.Around.X * t.Scale.X,
|
|
|
|
-t.Around.Y * t.Scale.Y,
|
|
|
|
)
|
|
|
|
g.Rotate(t.Rotation)
|
|
|
|
|
|
|
|
// And finally move to the absolute position.
|
|
|
|
g.Translate(t.Position.X, t.Position.Y)
|
2023-02-17 23:51:40 +03:00
|
|
|
|
|
|
|
return *g
|
|
|
|
}
|
|
|
|
|