/
transform.go
107 lines (68 loc) · 2.08 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
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
104
105
106
107
package allegro
/*
#cgo pkg-config: allegro-5.0
#include <allegro5/allegro.h>
*/
import "C"
import "unsafe"
import "reflect"
type Transform C.ALLEGRO_TRANSFORM
func (t *Transform) GetMatrix() []float32 {
length := 16
data := (C.ALLEGRO_TRANSFORM)(*t).m
var slice []float32
// This make slice
sliceHeader := (*reflect.SliceHeader)((unsafe.Pointer(&slice)))
sliceHeader.Cap = length
sliceHeader.Len = length
sliceHeader.Data = uintptr(unsafe.Pointer(&data))
return slice
}
func (t *Transform) Copy() *Transform {
var cp Transform
C.al_copy_transform((*C.ALLEGRO_TRANSFORM)(&cp), (*C.ALLEGRO_TRANSFORM)(t))
return &cp
}
// Need to keep a reference to stop it being garbage collected (i think)
var current *Transform = nil
func (t *Transform) Use() {
C.al_use_transform((*C.ALLEGRO_TRANSFORM)(t))
current = t
}
func GetCurrentTransform() *Transform {
var t *Transform
t = (*Transform)(C.al_get_current_transform())
return t
}
func (t *Transform) Invert() {
C.al_invert_transform((*C.ALLEGRO_TRANSFORM)(t))
}
func (t *Transform) HasInverse(tolerance float32) bool {
var b bool
b = C.al_check_inverse((*C.ALLEGRO_TRANSFORM)(t), C.float(tolerance)) != C.int(0)
return b
}
func (t *Transform) Identity() {
C.al_identity_transform((*C.ALLEGRO_TRANSFORM)(t))
}
func (t *Transform) Build(x, y, sx, sy, theta float32) {
C.al_build_transform((*C.ALLEGRO_TRANSFORM)(t),
C.float(x), C.float(y), C.float(sx), C.float(sy), C.float(theta))
}
func (t *Transform) Translate(x, y float32) {
C.al_translate_transform((*C.ALLEGRO_TRANSFORM)(t), C.float(x), C.float(y))
}
func (t *Transform) Rotate(theta float32) {
C.al_rotate_transform((*C.ALLEGRO_TRANSFORM)(t), C.float(theta))
}
func (t *Transform) Scale(sx, sy float32) {
C.al_scale_transform((*C.ALLEGRO_TRANSFORM)(t), C.float(sx), C.float(sy))
}
func (t *Transform) Compose(o *Transform) {
C.al_compose_transform((*C.ALLEGRO_TRANSFORM)(t), (*C.ALLEGRO_TRANSFORM)(o))
}
func (t *Transform) Apply(x, y float32) (float32, float32) {
C.al_transform_coordinates((*C.ALLEGRO_TRANSFORM)(t),
(*C.float)(&x), (*C.float)(&y))
return x, y
}