fennel_love2d_experiments/one_line/main.fnl

96 lines
2.9 KiB
Fennel
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(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))