119 lines
3.6 KiB
Fennel
119 lines
3.6 KiB
Fennel
(local scale 6)
|
||
(local canvas-w (* scale 88))
|
||
(local canvas-h (* scale 31))
|
||
(local canvas-x (* -1 (/ canvas-w 2)))
|
||
(local canvas-y (* -1 (/ canvas-h 2)))
|
||
(local app-state {
|
||
:mode :draw ; draw or preview
|
||
})
|
||
(local theme {
|
||
:white (lambda [cb] (cb (love.math.colorFromBytes 247 246 246)))
|
||
:black (lambda [cb] (cb (love.math.colorFromBytes 60 54 51)))
|
||
})
|
||
|
||
(lambda set-center-origin []
|
||
(let [(w h f) (love.window.getMode)
|
||
x (/ w 2)
|
||
y (/ h 2)
|
||
]
|
||
(love.graphics.push)
|
||
(love.graphics.translate x y)))
|
||
|
||
; setup pixels for image that we are drawing
|
||
(var pixel-canvas nil)
|
||
(local pixels {
|
||
:export-ordered-keys []
|
||
:drawn-ordered-keys []
|
||
:cords {}
|
||
})
|
||
(for [y 1 31]
|
||
(for [x 1 88]
|
||
(let [key (.. x "," y)]
|
||
(tset pixels.cords key {: x : y :val false})
|
||
(table.insert pixels.export-ordered-keys key))))
|
||
|
||
(fn draw-canvases []
|
||
"Draw main drawing canvas and preview canvas to screen"
|
||
(pixel-canvas:setFilter "nearest" "nearest")
|
||
(love.graphics.draw pixel-canvas canvas-x canvas-y 0 scale scale)
|
||
(love.graphics.draw pixel-canvas canvas-x (- canvas-y 60)))
|
||
|
||
(fn update-canvas []
|
||
(love.graphics.setCanvas pixel-canvas)
|
||
(love.graphics.clear 0 0 0 0)
|
||
(each [key {: x : y : val} (pairs pixels.cords)]
|
||
(when val (love.graphics.points x y)))
|
||
(love.graphics.setCanvas)
|
||
)
|
||
|
||
(fn love.update []
|
||
(let [
|
||
(w h _) (love.window.getMode)
|
||
(mouse-x-raw mouse-y-raw) (love.mouse.getPosition)
|
||
mouse-x (- mouse-x-raw (/ w 2))
|
||
mouse-y (- mouse-y-raw (/ h 2))
|
||
]
|
||
(when (and (> mouse-x canvas-x) (> mouse-y canvas-y) (< mouse-x (+ canvas-x canvas-w)) (< mouse-y (+ canvas-y canvas-h)))
|
||
(let [
|
||
x (+ 1 (math.floor (/ (+ (/ canvas-w 2) mouse-x) scale)))
|
||
y (+ 1 (math.floor (/ (+ (/ canvas-h 2) mouse-y) scale)))
|
||
key (.. x "," y)
|
||
]
|
||
(tset (. pixels.cords key) :val true)
|
||
(table.insert pixels.drawn-ordered-keys key)
|
||
(update-canvas)
|
||
; (print (.. x "," y))
|
||
))))
|
||
|
||
(fn love.load []
|
||
;; 480p 720×480
|
||
(love.window.setMode 720 480)
|
||
|
||
; prep canvas
|
||
(set pixel-canvas (love.graphics.newCanvas 88 31))
|
||
(update-canvas)
|
||
|
||
;; start a thread listening on stdin
|
||
(: (love.thread.newThread "require('love.event')
|
||
while 1 do love.event.push('stdin', io.read('*line')) end") :start))
|
||
|
||
(fn love.handlers.stdin [line]
|
||
; evaluate lines read from stdin as fennel code
|
||
(let [(ok val) (pcall fennel.eval line)]
|
||
(print (if ok (fennel.view val) val))))
|
||
|
||
(lambda draw-static-bg []
|
||
; canvas outline and text
|
||
(love.graphics.print "Canvas:" canvas-x (- canvas-y 20))
|
||
(love.graphics.rectangle "line" canvas-x canvas-y canvas-w canvas-h)
|
||
; preview outline and text
|
||
(love.graphics.print "Preview:" canvas-x (- canvas-y 80))
|
||
(love.graphics.rectangle "line" canvas-x (- canvas-y 60) 89 32)
|
||
|
||
; future preview outlines and text
|
||
(for [i 0 4]
|
||
(let [
|
||
gap (/ (- canvas-w (* 5 89)) 4)
|
||
txt (case i
|
||
0 "After 1 day"
|
||
1 "After 2 days"
|
||
2 "After 3 days"
|
||
3 "After 4 days"
|
||
4 "After 5 days")]
|
||
(love.graphics.print txt (+ (* i (+ 89 gap)) canvas-x) (+ (+ 20 canvas-h) canvas-y))
|
||
(love.graphics.rectangle "line" (+ (* i (+ 89 gap)) canvas-x) (+ (+ 40 canvas-h) canvas-y) 89 32)))
|
||
)
|
||
|
||
(fn love.draw []
|
||
(set-center-origin)
|
||
(theme.white love.graphics.setBackgroundColor)
|
||
(theme.black love.graphics.setColor)
|
||
(draw-static-bg)
|
||
(draw-canvases)
|
||
(love.graphics.pop))
|
||
|
||
(fn love.keypressed [key]
|
||
(match key
|
||
"d" (tset app-state :mode "draw")
|
||
"p" (tset app-state :mode "preview")))
|
||
; (love.event.quit))
|