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