summaryrefslogtreecommitdiff
path: root/src/ui/joystick.moon
blob: 168e18b47b32a688268ce911a535e38dd2e146bf (plain)
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