/
camera.go
103 lines (87 loc) · 2.79 KB
/
camera.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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package objects
import (
"github.com/YarikRevich/hide-seek-client/internal/core/screen"
"github.com/YarikRevich/hide-seek-client/internal/core/types"
)
type Camera struct {
Base
Zoom float64
COffset types.Vec2
CScale types.Vec2
// fOffsetX += (fMouseWorldX_BeforeZoom - fMouseWorldX_AfterZoom);
// fOffsetY += (fMouseWorldY_BeforeZoom - fMouseWorldY_AfterZoom);
}
func (c *Camera) GetZoom() types.Vec2 {
s := c.MetadataModel.GetScale()
return types.Vec2{X: s.X / 100 * c.Zoom, Y: s.Y / 100 * c.Zoom}
}
//Increments zoom property
func (c *Camera) ZoomIn(o *Base) {
// pScaleOld := c.GetZoomedScale(o)
cPosOld := c.ConvertScreenToWorld(c.RawPos)
if c.Zoom < c.MetadataModel.Camera.MaxZoom {
// c.Zoom = 2.001
// c.Zoom++
c.CScale.X += 0.05
c.CScale.Y += 0.05
// pScale := c.GetZoomedScale(o)
cPos := c.ConvertScreenToWorld(c.RawPos)
c.COffset.X += cPosOld.X - cPos.X
c.COffset.Y += cPosOld.Y - cPos.Y
// o.SetTranslationYMovementBlocked(false)
// o.SetTranslationXMovementBlocked(false)
}
}
//Decrements zoom property
func (c *Camera) ZoomOut(o *Base) {
// pScaleOld := c.GetZoomedScale(o)
cPosOld := c.ConvertScreenToWorld(c.RawPos)
if c.Zoom > c.MetadataModel.Camera.MinZoom {
// c.AlignOffset.X -= pScale.X
// c.AlignOffset.Y += pScale.Y
// c.Zoom--
c.CScale.X -= 0.05
c.CScale.Y -= 0.05
cPos := c.ConvertScreenToWorld(c.RawPos)
c.COffset.X += cPosOld.X - cPos.X
c.COffset.Y += cPosOld.Y - cPos.Y
// fmt.Println(cPos, cPosOld)
// o.SetTranslationYMovementBlocked(false)
// o.SetTranslationXMovementBlocked(false)
}
// }
// }
}
func (c *Camera) GetZoomedScale(b *Base) types.Vec2 {
s := b.MetadataModel.GetScale()
return types.Vec2{X: ((s.X * c.Zoom) / 100), Y: ((s.Y * c.Zoom) / 100)}
}
func (c *Camera) GetZoomedPos(b *Base) types.Vec2 {
s := b.MetadataModel.GetScale()
return types.Vec2{X: b.RawPos.X * ((s.X * c.Zoom) / 100), Y: b.RawPos.Y * ((s.Y * c.Zoom) / 100)}
}
func (c *Camera) GetZoomedOffset(b *Base) types.Vec2 {
s := b.MetadataModel.GetScale()
return types.Vec2{X: b.RawOffset.X * ((s.X * c.Zoom) / 100), Y: b.RawOffset.Y * ((s.Y * c.Zoom) / 100)}
}
//Checks if passed v2 is outta range of v1
func (c *Camera) IsOuttaRange(v1, v2 float64) bool {
return v2 > v1
}
func (c *Camera) ConvertWorldToScreen(w types.Vec2) types.Vec2 {
return types.Vec2{X: (w.X - c.COffset.X) * c.Scale.X, Y: (w.Y - c.COffset.Y) * c.Scale.Y}
}
func (c *Camera) ConvertScreenToWorld(s types.Vec2) types.Vec2 {
return types.Vec2{X: (s.X / c.Scale.X) + c.COffset.X, Y: (s.Y / c.Scale.Y) + c.COffset.Y}
}
func NewCamera() *Camera {
c := new(Camera)
c.SetSkin("camera/camera")
c.Zoom = c.MetadataModel.Camera.InitZoom
c.Type = "camera"
c.COffset.X = -screen.UseScreen().GetAxis().X
c.COffset.Y = -screen.UseScreen().GetAxis().Y
c.CScale.X = 1
c.CScale.Y = 1
return c
}