96 lines
2.9 KiB
Fennel
96 lines
2.9 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 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 {})
|
||
(tset pixels :ordered-keys [])
|
||
(tset pixels :cords {})
|
||
(for [y 1 31]
|
||
(for [x 1 88]
|
||
(let [key (.. x "," y)]
|
||
(tset pixels.cords key {: x : y :val false})
|
||
(table.insert pixels.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)
|
||
(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)
|
||
)
|
||
|
||
(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]
|
||
; (love.event.quit))
|