/
transform.go
36 lines (27 loc) · 1.27 KB
/
transform.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package spritesystem
import (
c "github.com/x-hgg-x/goecsengine/components"
w "github.com/x-hgg-x/goecsengine/world"
ecs "github.com/x-hgg-x/goecs"
)
// TransformSystem updates geometry matrix.
// Geometry matrix is first recentered, then scaled and rotated, and finally translated.
func TransformSystem(world w.World) {
world.Manager.Join(world.Components.Engine.SpriteRender, world.Components.Engine.Transform).Visit(ecs.Visit(func(entity ecs.Entity) {
sprite := world.Components.Engine.SpriteRender.Get(entity).(*c.SpriteRender)
transform := world.Components.Engine.Transform.Get(entity).(*c.Transform)
spriteWidth := float64(sprite.SpriteSheet.Sprites[sprite.SpriteNumber].Width)
spriteHeight := float64(sprite.SpriteSheet.Sprites[sprite.SpriteNumber].Height)
// Reset geometry matrix
sprite.Options.GeoM.Reset()
// Center sprite on top left pixel
sprite.Options.GeoM.Translate(-spriteWidth/2, -spriteHeight/2)
// Perform scale
sprite.Options.GeoM.Scale(transform.Scale1.X+1, transform.Scale1.Y+1)
// Perform rotation
sprite.Options.GeoM.Rotate(-transform.Rotation)
// Perform translation
screenHeight := float64(world.Resources.ScreenDimensions.Height)
sprite.Options.GeoM.Translate(transform.Translation.X, screenHeight-transform.Translation.Y)
}))
}