gg/camera.go

60 lines
1.1 KiB
Go
Raw Normal View History

2023-10-23 15:45:18 +03:00
package gg
2023-02-18 03:51:43 +03:00
// Implements the camera component
// for the main window.
type Camera struct {
2023-12-23 00:09:07 +03:00
// The shaders that will be applied to everything
// that the camera shows.
ShaderOptions
Transform
buffered bool
buf Matrix
2023-12-23 00:09:07 +03:00
engine *Engine
}
func (e *Engine) NewCamera() *Camera {
ret := &Camera{}
ret.Transform = T()
ret.engine = e
return ret
2023-02-18 03:51:43 +03:00
}
// Returns the matrix satysfying camera
// position, scale and rotation to apply
// it to the objects to get the real
// transform to display on the screen.
func (c *Camera)RealMatrix() Matrix {
2023-12-24 15:05:34 +03:00
// Bufferization
if c.buffered {
return c.buf
2023-12-24 15:05:34 +03:00
}
g := Matrix{}
2024-01-18 06:06:27 +03:00
position := c.Position().Neg()
around := c.Around()
scale := c.Scale()
rotation := c.Rotation()
g.Translate(-position.X, -position.Y)
g.Rotate(rotation)
size := c.engine.AbsWinSize()
g.Translate(around.X * size.X, around.Y * size.Y)
g.Scale(scale.X, scale.Y)
2023-12-23 00:09:07 +03:00
c.buf = g
c.buffered = true
return g
2023-02-18 03:51:43 +03:00
}
// The matrix to convert things into the
// inside engine representation,
// get the position of cursor inside the world
// basing on its window position.
func (c *Camera) AbsMatrix() Matrix {
m := c.RealMatrix()
m.Invert()
return m
}