feat: fixed camera matrix bufferization.
This commit is contained in:
parent
f4bf94a0e6
commit
d378490396
6 changed files with 49 additions and 25 deletions
13
camera.go
13
camera.go
|
@ -7,7 +7,8 @@ type Camera struct {
|
|||
// that the camera shows.
|
||||
ShaderOptions
|
||||
Transform
|
||||
buf *Matrix
|
||||
buffered bool
|
||||
buf Matrix
|
||||
engine *Engine
|
||||
}
|
||||
|
||||
|
@ -24,20 +25,20 @@ func (e *Engine) NewCamera() *Camera {
|
|||
// transform to display on the screen.
|
||||
func (c *Camera)RealMatrix() Matrix {
|
||||
// Bufferization
|
||||
if c.buf != nil {
|
||||
return *(c.buf)
|
||||
if c.buffered {
|
||||
return c.buf
|
||||
}
|
||||
g := &Matrix{}
|
||||
g := Matrix{}
|
||||
g.Translate(-c.Position.X, -c.Position.Y)
|
||||
g.Rotate(c.Rotation)
|
||||
siz := c.engine.AbsWinSize()
|
||||
g.Translate(c.Around.X * siz.X, c.Around.Y * siz.Y)
|
||||
g.Scale(c.Scale.X, c.Scale.Y)
|
||||
|
||||
|
||||
c.buf = g
|
||||
c.buffered = true
|
||||
|
||||
return *g
|
||||
return g
|
||||
}
|
||||
|
||||
// The matrix to convert things into the
|
||||
|
|
|
@ -3,6 +3,7 @@ package main
|
|||
import (
|
||||
"vultras.su/core/gg"
|
||||
"github.com/hajimehoshi/ebiten/v2/examples/resources/images"
|
||||
_ "github.com/silbinarywolf/preferdiscretegpu"
|
||||
"bytes"
|
||||
"log"
|
||||
//"strings"
|
||||
|
@ -34,6 +35,7 @@ func main() {
|
|||
Width: 720,
|
||||
Height: 480,
|
||||
VSync: true,
|
||||
Fullscreen: true,
|
||||
})
|
||||
|
||||
var err error
|
||||
|
|
|
@ -63,6 +63,15 @@ func (t *Tri) Update(c *Context) {
|
|||
case gg.KeyV:
|
||||
t.Rotation += d * gg.Pi * 0.3 * dt
|
||||
case gg.Key2 :
|
||||
if t.Spawned {
|
||||
break
|
||||
}
|
||||
t.Triangles = append(t.Triangles, gg.Triangle{
|
||||
gg.V(0, 10 + gg.Float(counter)),
|
||||
gg.V(100 + gg.Float(counter), 0),
|
||||
gg.V(0, -10 - gg.Float(counter)),
|
||||
})
|
||||
case gg.Key3 :
|
||||
if t.Spawned {
|
||||
break
|
||||
}
|
||||
|
|
45
engine.go
45
engine.go
|
@ -40,6 +40,10 @@ type WindowConfig struct {
|
|||
VSync bool
|
||||
}
|
||||
|
||||
type Objects struct {
|
||||
store []Objecter
|
||||
}
|
||||
|
||||
// The main structure that represents current state of [game] engine.
|
||||
type Engine struct {
|
||||
wcfg *WindowConfig
|
||||
|
@ -47,7 +51,7 @@ type Engine struct {
|
|||
// The main holder for objects.
|
||||
// Uses the map structure to quickly
|
||||
// delete and create new objects.
|
||||
Objects maps.Map[Objecter, struct{}]
|
||||
Objects *Objects
|
||||
|
||||
// The main camera to display in window.
|
||||
// If is set to nil then the engine will panic.
|
||||
|
@ -103,16 +107,22 @@ func NewEngine(
|
|||
ret.Camera = ret.NewCamera()
|
||||
ret.outerEvents = make(EventChan)
|
||||
ret.handleEvents = make(EventChan)
|
||||
ret.Objects = maps.NewOrdered[Objecter, struct{}]()
|
||||
ret.Objects = &Objects{}
|
||||
ret.buttons = MouseButtonMap{}
|
||||
return ret
|
||||
}
|
||||
|
||||
// Get the real window size in the current context.
|
||||
func (c *Engine) RealWinSize() Vector {
|
||||
var w, h int
|
||||
if c.wcfg.Fullscreen {
|
||||
w, h = ebiten.ScreenSizeInFullscreen()
|
||||
} else {
|
||||
w, h = c.wcfg.Width, c.wcfg.Height
|
||||
}
|
||||
return V(
|
||||
Float(c.wcfg.Width),
|
||||
Float(c.wcfg.Height),
|
||||
Float(w),
|
||||
Float(h),
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -127,35 +137,32 @@ func (e *Engine) EventInput() EventChan {
|
|||
// Add new object considering what
|
||||
// interfaces it implements.
|
||||
func (e *Engine) Spawn(b Objecter) error {
|
||||
if e.Objects.Has(b) {
|
||||
/*if e.Objects.Has(b) {
|
||||
return ObjectExistErr
|
||||
}
|
||||
}*/
|
||||
|
||||
b.Start(&Context{Engine: e})
|
||||
obj := b.GetObject()
|
||||
obj.input = make(chan *Context)
|
||||
go func() {
|
||||
for c := range obj.input {
|
||||
switch c.typ {
|
||||
case updateContext:
|
||||
b.Update(c)
|
||||
}
|
||||
b.Update(c)
|
||||
e.wg.Done()
|
||||
}
|
||||
}()
|
||||
e.Objects.Set(b, struct{}{})
|
||||
e.Objects.store = append(e.Objects.store, b)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Delete object from Engine.
|
||||
func (e *Engine) Del(b Objecter) error {
|
||||
if !e.Objects.Has(b) {
|
||||
/*if !e.Objects.Has(b) {
|
||||
return ObjectNotExistErr
|
||||
}
|
||||
|
||||
b.Delete(&Context{Engine: e})
|
||||
e.Objects.Del(b)
|
||||
e.Objects.Del(b)*/
|
||||
|
||||
return nil
|
||||
}
|
||||
|
@ -206,7 +213,6 @@ func (e *Engine) AbsCursorPosition() Vector {
|
|||
func (e *engine) Update() error {
|
||||
eng := (*Engine)(e)
|
||||
|
||||
e.dt = time.Since(e.lastTime).Seconds()
|
||||
// Buffering the context for faster.
|
||||
|
||||
e.prevKeys = e.keys
|
||||
|
@ -274,20 +280,20 @@ func (e *engine) Update() error {
|
|||
typ: updateContext,
|
||||
Events: events,
|
||||
}
|
||||
for object := range e.Objects.KeyChan() {
|
||||
for _, object := range e.Objects.store {
|
||||
e.wg.Add(1)
|
||||
object.Input() <- c
|
||||
}
|
||||
e.wg.Wait()
|
||||
|
||||
e.lastTime = time.Now()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (e *engine) Draw(i *ebiten.Image) {
|
||||
e.dt = time.Since(e.lastTime).Seconds()
|
||||
eng := (*Engine)(e)
|
||||
m := map[Layer][]Drawer{}
|
||||
for object := range eng.Objects.KeyChan() {
|
||||
for _, object := range eng.Objects.store {
|
||||
// Skipping the ones we do not need to draw.
|
||||
if !object.IsVisible() {
|
||||
continue
|
||||
|
@ -311,8 +317,10 @@ func (e *engine) Draw(i *ebiten.Image) {
|
|||
drawer.Draw(c)
|
||||
}
|
||||
}
|
||||
|
||||
// Empty the buff to generate it again.
|
||||
eng.Camera.buf = nil
|
||||
eng.Camera.buffered = false
|
||||
e.lastTime = time.Now()
|
||||
}
|
||||
|
||||
func (e *engine) Layout(ow, oh int) (int, int) {
|
||||
|
@ -341,6 +349,7 @@ func (e *Engine) Run() error {
|
|||
ebiten.SetWindowSize(e.wcfg.Width, e.wcfg.Height)
|
||||
ebiten.SetWindowSizeLimits(1, 1, e.wcfg.Width, e.wcfg.Height)
|
||||
|
||||
ebiten.SetFullscreen(e.wcfg.Fullscreen)
|
||||
ebiten.SetVsyncEnabled(e.wcfg.VSync)
|
||||
|
||||
e.lastTime = time.Now()
|
||||
|
|
3
go.mod
3
go.mod
|
@ -7,6 +7,8 @@ toolchain go1.21.3
|
|||
require (
|
||||
github.com/di4f/gods v0.0.0-20231214190239-d523423d8d5e
|
||||
github.com/hajimehoshi/ebiten/v2 v2.6.0-alpha.3.0.20230521122940-90562ee84b9b
|
||||
github.com/silbinarywolf/preferdiscretegpu v1.0.0
|
||||
golang.org/x/image v0.7.0
|
||||
)
|
||||
|
||||
require (
|
||||
|
@ -14,7 +16,6 @@ require (
|
|||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b // indirect
|
||||
github.com/jezek/xgb v1.1.0 // indirect
|
||||
golang.org/x/exp/shiny v0.0.0-20230522175609-2e198f4a06a1 // indirect
|
||||
golang.org/x/image v0.7.0 // indirect
|
||||
golang.org/x/mobile v0.0.0-20230427221453-e8d11dd0ba41 // indirect
|
||||
golang.org/x/sync v0.2.0 // indirect
|
||||
golang.org/x/sys v0.8.0 // indirect
|
||||
|
|
2
go.sum
2
go.sum
|
@ -8,6 +8,8 @@ github.com/hajimehoshi/ebiten/v2 v2.6.0-alpha.3.0.20230521122940-90562ee84b9b h1
|
|||
github.com/hajimehoshi/ebiten/v2 v2.6.0-alpha.3.0.20230521122940-90562ee84b9b/go.mod h1:+fFI6Ag5YvbX1ivNQD2TxNhpWFDPuxEoew421TTQAxI=
|
||||
github.com/jezek/xgb v1.1.0 h1:wnpxJzP1+rkbGclEkmwpVFQWpuE2PUGNUzP8SbfFobk=
|
||||
github.com/jezek/xgb v1.1.0/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk=
|
||||
github.com/silbinarywolf/preferdiscretegpu v1.0.0 h1:tuvXLRCnoFMFyk74/8PFvO0B5rjDmXm0JgNTaOYAHT0=
|
||||
github.com/silbinarywolf/preferdiscretegpu v1.0.0/go.mod h1:h3s2GkfAP2sWqoS7v/PxAlFOQ1azMRsZxUJNw47QhLc=
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
|
|
Loading…
Reference in a new issue