aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2019-11-13 12:02:35 +0000
committers-ol <s-ol@users.noreply.github.com>2019-11-13 12:02:47 +0000
commitb651f4dbcbec7eccfcb90ea2b23e28d988e36026 (patch)
treeaea6d2ef5f3420bde3fc7fe5c0727d6bd85fb8b3
parentadd input.slider (diff)
downloadwatch-cad-b651f4dbcbec7eccfcb90ea2b23e28d988e36026.tar.gz
watch-cad-b651f4dbcbec7eccfcb90ea2b23e28d988e36026.zip
add line, arrow; hover events
-rw-r--r--api.moon93
-rw-r--r--examples/capsule.moon2
-rw-r--r--examples/place_in_rect.lua17
-rw-r--r--examples/place_on_line.lua17
-rw-r--r--examples/test.moon2
-rw-r--r--init.moon6
-rw-r--r--input.moon1
-rw-r--r--object.moon18
-rw-r--r--session.moon4
9 files changed, 119 insertions, 41 deletions
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