diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2019-11-13 12:02:35 +0000 |
|---|---|---|
| committer | s-ol <s-ol@users.noreply.github.com> | 2019-11-13 12:02:47 +0000 |
| commit | b651f4dbcbec7eccfcb90ea2b23e28d988e36026 (patch) | |
| tree | aea6d2ef5f3420bde3fc7fe5c0727d6bd85fb8b3 | |
| parent | add input.slider (diff) | |
| download | watch-cad-b651f4dbcbec7eccfcb90ea2b23e28d988e36026.tar.gz watch-cad-b651f4dbcbec7eccfcb90ea2b23e28d988e36026.zip | |
add line, arrow; hover events
| -rw-r--r-- | api.moon | 93 | ||||
| -rw-r--r-- | examples/capsule.moon | 2 | ||||
| -rw-r--r-- | examples/place_in_rect.lua | 17 | ||||
| -rw-r--r-- | examples/place_on_line.lua | 17 | ||||
| -rw-r--r-- | examples/test.moon | 2 | ||||
| -rw-r--r-- | init.moon | 6 | ||||
| -rw-r--r-- | input.moon | 1 | ||||
| -rw-r--r-- | object.moon | 18 | ||||
| -rw-r--r-- | session.moon | 4 |
9 files changed, 119 insertions, 41 deletions
@@ -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! @@ -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 @@ -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 |
