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
|
color = require("color")
window = require("window")
circle_cache = setmetatable({},{__mode: "v"})
hollow_circle = (x,y,radius, thickness, color) ->
key = string.format("%d\0%d\0%d\0%d",x,y,radius, thickness)
if circle_cache[key]
return circle_cache[key]
arr = {}
segments = 60
step = (2*math.pi) / segments
for i = 0,2*math.pi, step
arr[#arr+1] = vec2(i+step, 1)
arr[#arr+1] = vec2(i, 1)
arr[#arr+1] = vec2(i+step,0)
arr[#arr+1] = vec2(i+step,0)
arr[#arr+1] = vec2(i,1)
arr[#arr+1] = vec2(i,0)
circle = am.use_program(am.program([[
precision highp float;
attribute vec2 index;
uniform float thickness;
uniform float radius;
uniform mat4 MV;
uniform mat4 P;
void main() {
float distance = thickness * index[1];
vec2 vert = vec2(cos(index[0]) * (radius - distance), sin(index[0]) * (radius - distance));
gl_Position = P * MV * vec4(vert, 0.0, 1.0);
}
]],[[
precision mediump float;
uniform vec4 color;
void main() {
gl_FragColor = color;
}
]]))\append(am.bind({
MV: mat4(
1, 0, 0, 0
0, 1, 0, 0
0, 0, 1, 0
x, y, 0, 1
)
thickness: thickness
radius: radius
index: am.vec2_array(arr)
color: color
})\append(am.draw("triangles")))
circle_cache[key] = circle
circle
class Joystick
--am.sprite() only works once the window is created
@initalized = false
@initalize: =>
@hollow_circle = am.group!
step = 0.5
thickness = 0.02
lastpoint = vec2(1,0)
print("color.am_color.background is:", color.am_color.background)
for k,v in pairs(color.am_color)
print(k,":",v)
highlight_start = (5/8) * math.pi
highlight_end = (7/8) * math.pi
shadow_start = (3/2) * math.pi
shadow_end = 2 * math.pi
for i = 0,2*math.pi,step
nextpoint = vec2(math.cos(i), math.sin(i))
@hollow_circle\append(am.line(lastpoint + vec2(1,1), nextpoint + vec2(1,1), thickness, color.am_color.outline))
--@hollow_circle\append(am.line(lastpoint, nextpoint, thickness, color.am_color.background))
lastpoint = nextpoint
@hollow_circle\append(am.line(lastpoint, vec2(1,0), thickness * 2, color.am_color.outline))
@hollow_circle\append(am.line(lastpoint,vec2(1,0), thickness, color.am_color.background))
@initalized = true
new: (x,y,r)=>
if not @@initalized
@@initalize!
@node = am.group!
position = am.translate(x,y)\tag("position")
@node\append(position)
--position\append(am.circle(vec2(x,y), r, color.am_color.background))
@stick_pos = am.translate(0,0)\tag("stick")
position\append(
@stick_pos\append(
am.circle(vec2(0,0), r/9, color.am_color.outline)\append(
am.circle(vec2(0,0), r/10, color.am_color.background)\append(
am.circle(vec2(-r/60,r/60),r/15, color.am_color.foreground)\append(
am.circle(vec2(5,-5),r/13, color.am_color.background)
)))))
--position\append(am.scale(r,r)\append(@@hollow_circle))
--position\append(am.circle(vec2(x,y),r)\append(am.blend("subtract")\append(am.circle(vec2(x,y),r-10))))
position\append(hollow_circle(x,y,r,8,color.am_color.outline))
position\append(hollow_circle(x,y,r-math.sqrt(2),5,color.am_color.background))
fire: (tbl) =>
print("Fired",tbl)
Joystick
|