From b651f4dbcbec7eccfcb90ea2b23e28d988e36026 Mon Sep 17 00:00:00 2001 From: s-ol Date: Wed, 13 Nov 2019 13:02:35 +0100 Subject: add line, arrow; hover events --- api.moon | 93 ++++++++++++++++++++++++++++++++++++---------- examples/capsule.moon | 2 +- examples/place_in_rect.lua | 17 --------- examples/place_on_line.lua | 17 +++++++++ examples/test.moon | 2 +- init.moon | 6 +-- input.moon | 1 + object.moon | 18 +++++++++ session.moon | 4 ++ 9 files changed, 119 insertions(+), 41 deletions(-) delete mode 100644 examples/place_in_rect.lua create mode 100644 examples/place_on_line.lua create mode 100644 object.moon diff --git a/api.moon b/api.moon index 6234dd0..62a1b16 100644 --- a/api.moon +++ b/api.moon @@ -11,6 +11,28 @@ random = size: -> vec2 math.random! * 200 + 100, math.random! * 200 + 100 +hit = + radius: (pos, r) -> + hit.radius2 pos, r*r + + radius2: (pos, r2) -> + contains = (INPUT.mouse - pos)\len2! < r2 + INPUT\mouse_event! or 'hover' if contains + + line: (frm, to, r2=10) -> + delta = to - frm + mouse = INPUT.mouse - frm + dot = (mouse\dot delta) / delta\len2! + dot = math.min 1, math.max 0, dot + p = frm + delta * dot + + hit.radius2 p, r2 + + rect: (min, max) -> + rect = bound2 min, max + contains = rect\contains INPUT.mouse + INPUT\mouse_event! or 'hover' if contains + draw = cross: (pos) -> hs = vec2 8, 8 @@ -21,14 +43,21 @@ draw = lg.line mx, my, Mx, My lg.line mx, My, Mx, my - contains = (INPUT.mouse - pos)\len2! < hs\len2! - INPUT\mouse_event! if contains + hit.radius2 pos, hs\len2! line: (frm, to) -> lg.setColor 1, 1, 1 lg.line frm.x, frm.y, to.x, to.y - -- @TODO: hit checking + hit.line frm, to + + arrow: (frm, to) -> + dir = (to - frm)\normalize! + up = dir\perpendicular! + draw.line to - dir * 15 + up * 7, to + draw.line to - dir * 15 - up * 7, to + + draw.line frm, to rect: (min, max) -> x, y = min\unpack! @@ -36,17 +65,14 @@ draw = lg.setColor 1, 1, 1 lg.rectangle 'line', x, y, w, h - rect = bound2 min, max - contains = rect\contains INPUT.mouse - INPUT\mouse_event! if contains + hit.rect min, max circle: (center, r) -> x, y = center\unpack! lg.setColor 1, 1, 1 lg.circle 'line', x, y, r - contains = (INPUT.mouse - center)\len! < r - INPUT\mouse_event! if contains + hit.radius2 center, r*r half_handle = vec2 15, 15 input = @@ -109,7 +135,23 @@ input = delta = last and pos - last return delta and delta\len2! > 0 and delta - rectangle: do + line: (frm, to) => + input.point @frm, frm + input.point @to, to + + frm, to = @frm!, @to! + @set :frm, :to + draw.line frm, to + + arrow: (frm, to) => + input.point @frm, frm + input.point @to, to + + frm, to = @frm!, @to! + @set :frm, :to + draw.line frm, to + + rect: do meta = size: => @max - @min meta.__index = meta @@ -146,24 +188,37 @@ input = selection: (pattern) => -- @TOOD: fix - @init {o for o in *SESSION.objects when match and o.name\match init} + @init {o,o for o in *SESSION.objects when match and o.name\match init} + + selection = @! + index = {o,i for i,o in ipairs selection} - lg.push 'all' - lg.setLineWidth 5 - for obj in *OBJS - selected = @selection[obj] + to_remove = {} + for obj in *SESSION.objects + selected = index[obj] if selected - obj\draw 'line', orng + draw.cross obj.pos + -- obj\draw 'line', orng - if obj\hit! - @selection[obj] = if selected then nil else obj + if obj\hit! == 'down' + if selected + table.insert to_remove, selected + else + table.insert selection, obj - lg.pop! + table.sort to_remove + for i=#to_remove,1,-1 + table.remove selection, to_remove[i] - [o for o in pairs @selection] +op = + move: (obj, to) -> + draw.arrow obj.pos, to + obj\draw! { + :hit :random :draw :input + :op } diff --git a/examples/capsule.moon b/examples/capsule.moon index 2a9033c..fe546e2 100644 --- a/examples/capsule.moon +++ b/examples/capsule.moon @@ -5,7 +5,7 @@ import vec2 from require 'cpml' => -- let's try to construct a pill-shape - input.rectangle @rect + input.rect @rect rect = @rect! hsize = (rect.max - rect.min) / 2 diff --git a/examples/place_in_rect.lua b/examples/place_in_rect.lua deleted file mode 100644 index 3650257..0000000 --- a/examples/place_in_rect.lua +++ /dev/null @@ -1,17 +0,0 @@ --- return function (state) -function place_in_rect(S) - input.selection(S.objs, '^led-') - input.rect(S.dest) - - local start = S.min() - local step = S.dest():size() - step.y = 0 - - for i, obj in ipairs(S.objs()) do - local pos = start + step:scale(i) - draw.cross(pos) - -- op.move(obj, pos) - end -end - -return place_in_rect diff --git a/examples/place_on_line.lua b/examples/place_on_line.lua new file mode 100644 index 0000000..d58f713 --- /dev/null +++ b/examples/place_on_line.lua @@ -0,0 +1,17 @@ +-- return function (state) +function place_in_rect(S) + input.selection(S.objs, '^led-') + input.line(S.dest) + + local dest = S.dest() + local start = dest.frm + local step = (dest.to - dest.frm) / #S.objs() + start = start - step/2 + + for i, obj in ipairs(S.objs()) do + local pos = start + step * i + op.move(obj, pos) + end +end + +return place_in_rect diff --git a/examples/test.moon b/examples/test.moon index 352ebd2..ef25cd8 100644 --- a/examples/test.moon +++ b/examples/test.moon @@ -3,6 +3,6 @@ import vec2 from require 'cpml' => input.point @p - input.rectangle @re, max: @p! + input.rect @re, max: @p! input.circle @circ, center: @p! diff --git a/init.moon b/init.moon index 1c0f5ef..f1f8616 100644 --- a/init.moon +++ b/init.moon @@ -5,14 +5,14 @@ profile = require 'profile' export ^ +for k, v in pairs require 'api' + _G[k] = v + COMMIT = false INPUT = Input! STATE = State! SESSION = Session Script arg[#arg] -for k, v in pairs require 'api' - _G[k] = v - love.draw = -> p = INPUT\key_down 'p' if p diff --git a/input.moon b/input.moon index 3b18880..fe23fa3 100644 --- a/input.moon +++ b/input.moon @@ -20,6 +20,7 @@ class Input return 'down' if @key_down key return 'up' if @key_up key return 'held' if @key_held key + return 'hover' mouse_pos: => @mouse mouse_delta: => @mouse - @last_mouse diff --git a/object.moon b/object.moon new file mode 100644 index 0000000..a5bbd88 --- /dev/null +++ b/object.moon @@ -0,0 +1,18 @@ +import vec2 from require 'cpml' +import random, hit, draw from require 'api' + +class Object + new: (@pos=random.point!, @size=random.size!) => + + minmax: => + @pos - @size/2, @pos + @size/2 + + hit: => + hit.rect @minmax! + + draw: => + draw.rect @minmax! + +{ + :Object +} diff --git a/session.moon b/session.moon index 4e59d3b..7549b91 100644 --- a/session.moon +++ b/session.moon @@ -62,9 +62,13 @@ class Script @error = nil msg +import Object from require 'object' + class Session new: (@script) => @objects = {} + for i=1,4 + table.insert @objects, Object nil, random.size!/8 frame: => for obj in *@objects -- cgit v1.2.3