feat: more or less fixed the parenting.
This commit is contained in:
parent
c4c17fbaec
commit
14f0db2d40
4 changed files with 80 additions and 17 deletions
|
@ -22,7 +22,14 @@ func (d *Debug) Draw(c *Context) {
|
||||||
"fps: %d", int(c.FPS()),
|
"fps: %d", int(c.FPS()),
|
||||||
))
|
))
|
||||||
keyStrs = append(keyStrs, fmt.Sprintf(
|
keyStrs = append(keyStrs, fmt.Sprintf(
|
||||||
"absPlayerPos: %v", player.Position,
|
"relPlayerPos: %v", player.Position,
|
||||||
|
))
|
||||||
|
keyStrs = append(keyStrs, fmt.Sprintf(
|
||||||
|
"absPlayerPos: %v", player.AbsPosition(),
|
||||||
|
))
|
||||||
|
|
||||||
|
keyStrs = append(keyStrs, fmt.Sprintf(
|
||||||
|
"relTriPos: %v", tri.Position,
|
||||||
))
|
))
|
||||||
keyStrs = append(keyStrs, fmt.Sprintf(
|
keyStrs = append(keyStrs, fmt.Sprintf(
|
||||||
"absTriPos: %v", tri.AbsPosition(),
|
"absTriPos: %v", tri.AbsPosition(),
|
||||||
|
|
|
@ -19,7 +19,7 @@ func NewPlayer() *Player {
|
||||||
ret.Transform = gg.T()
|
ret.Transform = gg.T()
|
||||||
fmt.Println("transform:", ret.Transform)
|
fmt.Println("transform:", ret.Transform)
|
||||||
//ret.Parent = rect
|
//ret.Parent = rect
|
||||||
ret.Scale = gg.V(5, 5)
|
ret.Scale = gg.V2(1)
|
||||||
// Around center.
|
// Around center.
|
||||||
ret.Around = gg.V2(.5)
|
ret.Around = gg.V2(.5)
|
||||||
ret.MoveSpeed = 90.
|
ret.MoveSpeed = 90.
|
||||||
|
@ -136,7 +136,7 @@ func (p *Player) Event(c *gg.Context) {
|
||||||
c.Camera.Position = pos.Sub(ec.Abs)
|
c.Camera.Position = pos.Sub(ec.Abs)
|
||||||
case *gg.WheelChange :
|
case *gg.WheelChange :
|
||||||
c.Camera.Scale = c.Camera.Scale.Add(gg.V2(
|
c.Camera.Scale = c.Camera.Scale.Add(gg.V2(
|
||||||
ec.Offset.Y * c.DT() * p.ScaleSpeed * 20,
|
ec.Offset.Y * c.DT() * p.ScaleSpeed * 40,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import "github.com/di4f/gg"
|
import "github.com/di4f/gg"
|
||||||
//import "fmt"
|
import "fmt"
|
||||||
|
|
||||||
type Tri struct {
|
type Tri struct {
|
||||||
gg.DrawablePolygon
|
gg.DrawablePolygon
|
||||||
|
@ -20,7 +20,7 @@ func NewTri() *Tri {
|
||||||
gg.V(0, -10),
|
gg.V(0, -10),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
ret.Color = gg.Color{gg.MaxColorV, gg.MaxColorV, 0, gg.MaxColorV}
|
ret.Color = gg.Rgba(1, 1, 0, 1)
|
||||||
ret.Visible = true
|
ret.Visible = true
|
||||||
ret.Layer = TriangleL
|
ret.Layer = TriangleL
|
||||||
|
|
||||||
|
@ -51,3 +51,19 @@ func (t *Tri) Update(c *Context) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *Tri) Event(c *Context) {
|
||||||
|
switch e := c.Event.(type) {
|
||||||
|
case *gg.KeyDown :
|
||||||
|
if e.Key != gg.Key1 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if t.Connected() {
|
||||||
|
fmt.Println("disconnecting:", tri.Transform)
|
||||||
|
t.Disconnect()
|
||||||
|
} else {
|
||||||
|
t.Connect(player)
|
||||||
|
fmt.Println("connecting:", tri.Transform)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
64
transform.go
64
transform.go
|
@ -55,26 +55,41 @@ func (t Transform) ScaledToY(y Float) Transform {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Transform) SetAbsPosition(absPosition Vector) {
|
func (t *Transform) SetAbsPosition(absPosition Vector) {
|
||||||
m := t.Matrix()
|
if t.Parent == nil {
|
||||||
|
t.Position = absPosition
|
||||||
|
return
|
||||||
|
}
|
||||||
|
m := t.ParentMatrix()
|
||||||
m.Invert()
|
m.Invert()
|
||||||
t.Position = absPosition.Apply(m)
|
t.Position = absPosition.Apply(m)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the absolute representation of the transform.
|
// Get the absolute representation of the transform.
|
||||||
func (t *Transform) Abs() Transform {
|
func (t *Transform) Abs() Transform {
|
||||||
m := t.Matrix()
|
if t.Parent == nil {
|
||||||
ret := Transform{}
|
return *t
|
||||||
ret.Position = t.Position.Apply(m)
|
}
|
||||||
|
|
||||||
|
ret := T()
|
||||||
|
ret.Position = t.AbsPosition()
|
||||||
ret.Rotation = t.AbsRotation()
|
ret.Rotation = t.AbsRotation()
|
||||||
|
ret.Scale = t.AbsScale()
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Transform) AbsPosition() Vector {
|
func (t *Transform) AbsPosition() Vector {
|
||||||
return t.Position.Apply(t.Matrix())
|
if t.Parent == nil {
|
||||||
|
return t.Position
|
||||||
|
}
|
||||||
|
return t.Position.Apply(t.ParentMatrix())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Transform) AbsScale() Vector {
|
func (t *Transform) AbsScale() Vector {
|
||||||
return V2(0)
|
if t.Parent == nil {
|
||||||
|
return t.Scale
|
||||||
|
}
|
||||||
|
return V2(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Transform) AbsRotation() Float {
|
func (t *Transform) AbsRotation() Float {
|
||||||
|
@ -84,11 +99,23 @@ func (t *Transform) AbsRotation() Float {
|
||||||
return t.Rotation + t.Parent.GetTransform().AbsRotation()
|
return t.Rotation + t.Parent.GetTransform().AbsRotation()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *Transform) SetAbsRotation(rot Float) {
|
||||||
|
if t.Parent == nil {
|
||||||
|
t.Rotation = rot
|
||||||
|
}
|
||||||
|
t.Rotation -= t.Parent.GetTransform().AbsRotation()
|
||||||
|
}
|
||||||
|
|
||||||
func (t *Transform) Connected() bool {
|
func (t *Transform) Connected() bool {
|
||||||
return t.Parent != nil
|
return t.Parent != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Transform) Connect(p Transformer) {
|
func (t *Transform) Connect(parent Transformer) {
|
||||||
|
absPosition := t.AbsPosition()
|
||||||
|
absRotation := t.AbsRotation()
|
||||||
|
t.Parent = parent
|
||||||
|
t.SetAbsPosition(absPosition)
|
||||||
|
t.SetAbsRotation(absRotation)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Transform) Disconnect() {
|
func (t *Transform) Disconnect() {
|
||||||
|
@ -96,7 +123,22 @@ func (t *Transform) Disconnect() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
*t = t.Abs()
|
*t = t.Abs()
|
||||||
t.Parent = nil
|
}
|
||||||
|
|
||||||
|
func (t *Transform) ParentMatrix() *Matrix {
|
||||||
|
g := &Matrix{}
|
||||||
|
if t.Parent == nil {
|
||||||
|
return g
|
||||||
|
}
|
||||||
|
|
||||||
|
p := t.Parent.GetTransform()
|
||||||
|
g = p.ParentMatrix()
|
||||||
|
|
||||||
|
g.Scale(p.Scale.X, p.Scale.Y)
|
||||||
|
g.Rotate(p.Rotation)
|
||||||
|
g.Translate(p.Position.X, p.Position.Y)
|
||||||
|
|
||||||
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the GeoM with corresponding
|
// Returns the GeoM with corresponding
|
||||||
|
@ -117,10 +159,8 @@ func (t *Transform)Matrix() *Matrix {
|
||||||
// And finally move to the absolute position.
|
// And finally move to the absolute position.
|
||||||
g.Translate(t.Position.X, t.Position.Y)
|
g.Translate(t.Position.X, t.Position.Y)
|
||||||
|
|
||||||
if t.Parent != nil {
|
m := t.ParentMatrix()
|
||||||
m := t.Parent.GetTransform().Matrix()
|
g.Concat(*m)
|
||||||
g.Concat(*m)
|
|
||||||
}
|
|
||||||
|
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue