/
transformation.go
106 lines (82 loc) · 3.47 KB
/
transformation.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
package allegro
// #include <allegro5/allegro.h>
import "C"
import "unsafe"
func (t *Transform) Copy() *Transform {
ts := new(C.ALLEGRO_TRANSFORM)
C.al_copy_transform((*C.ALLEGRO_TRANSFORM)(unsafe.Pointer(t)), ts)
return (*Transform)(unsafe.Pointer(ts))
}
func (t *Transform) Use() {
C.al_use_transform((*C.ALLEGRO_TRANSFORM)(unsafe.Pointer(t)))
}
func GetCurrentTransform() *Transform {
return (*Transform)(unsafe.Pointer(C.al_get_current_transform()))
}
func GetCurrentInverseTransform() *Transform {
return (*Transform)(unsafe.Pointer(C.al_get_current_inverse_transform()))
}
func (t *Transform) Invert() {
C.al_invert_transform((*C.ALLEGRO_TRANSFORM)(unsafe.Pointer(t)))
}
func (t *Transform) CheckInverse(tol float32) int32 {
return int32(C.al_check_inverse((*C.ALLEGRO_TRANSFORM)(unsafe.Pointer(t)), C.float(tol)))
}
func (t *Transform) Identity() {
C.al_identity_transform((*C.ALLEGRO_TRANSFORM)(unsafe.Pointer(t)))
}
func (t *Transform) Build(x, y, sx, sy, theta float32) {
C.al_build_transform((*C.ALLEGRO_TRANSFORM)(unsafe.Pointer(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)(unsafe.Pointer(t)), C.float(x), C.float(y))
}
func (t *Transform) Rotate(theta float32) {
C.al_rotate_transform((*C.ALLEGRO_TRANSFORM)(unsafe.Pointer(t)), C.float(theta))
}
func (t *Transform) Scale(sx, sy float32) {
C.al_scale_transform((*C.ALLEGRO_TRANSFORM)(unsafe.Pointer(t)), C.float(sx), C.float(sy))
}
func (t *Transform) TransformCoordinates(x, y float32) (float32, float32) {
k := x
l := y
C.al_transform_coordinates((*C.ALLEGRO_TRANSFORM)(unsafe.Pointer(t)), (*C.float)(unsafe.Pointer(&k)), (*C.float)(unsafe.Pointer(&l)))
return k, l
}
func (t *Transform) Compose(other *Transform) {
C.al_compose_transform((*C.ALLEGRO_TRANSFORM)(unsafe.Pointer(t)), (*C.ALLEGRO_TRANSFORM)(unsafe.Pointer(other)))
}
func (t *Transform) Orthographic(left, top, n, right, bottom, f float32) {
C.al_orthographic_transform((*C.ALLEGRO_TRANSFORM)(unsafe.Pointer(t)), C.float(left), C.float(top), C.float(n), C.float(right), C.float(bottom), C.float(f))
}
func (t *Transform) Perspective(left, top, n, right, bottom, f float32) {
C.al_perspective_transform((*C.ALLEGRO_TRANSFORM)(unsafe.Pointer(t)), C.float(left), C.float(top), C.float(n), C.float(right), C.float(bottom), C.float(f))
}
func (t *Transform) Translate3d(x, y, z float32) {
C.al_translate_transform_3d((*C.ALLEGRO_TRANSFORM)(unsafe.Pointer(t)), C.float(x), C.float(y), C.float(z))
}
func (t *Transform) Scale3d(sx, sy, sz float32) {
C.al_scale_transform_3d((*C.ALLEGRO_TRANSFORM)(unsafe.Pointer(t)), C.float(sx), C.float(sy), C.float(sz))
}
func (t *Transform) Rotate3d(x, y, z, angle float32) {
C.al_rotate_transform_3d((*C.ALLEGRO_TRANSFORM)(unsafe.Pointer(t)), C.float(x), C.float(y), C.float(z), C.float(angle))
}
func GetProjection(display *Display) *Transform {
return (*Transform)(unsafe.Pointer(C.al_get_projection_transform((*C.ALLEGRO_DISPLAY)(unsafe.Pointer(display)))))
}
func (t *Transform) SetProjection(display *Display) {
C.al_set_projection_transform((*C.ALLEGRO_DISPLAY)(unsafe.Pointer(display)), (*C.ALLEGRO_TRANSFORM)(unsafe.Pointer(t)))
}
/*********************/
/* Transform getters */
/*********************/
func (t *Transform) M() [4][4]float32 {
var m [4][4]float32
tc := (*C.ALLEGRO_TRANSFORM)(unsafe.Pointer(t))
for i := 0; i < 4; i++ {
for j := 0; j < 4; j++ {
m[i][j] = float32(tc.m[i][j])
}
}
return m
}