diff options
| author | s-ol <s+removethis@s-ol.nu> | 2025-09-16 16:17:12 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2025-09-16 16:17:12 +0000 |
| commit | 8fa191e7191047e54e7dcea602e28cb6bce30285 (patch) | |
| tree | 7195c6f2a251e83f0a5f6f119bf3fcf1b2294e1e | |
| parent | lib/osc: set socket reuse flag (diff) | |
| download | alive-8fa191e7191047e54e7dcea602e28cb6bce30285.tar.gz alive-8fa191e7191047e54e7dcea602e28cb6bce30285.zip | |
lib/love: tsv-output takes shape
| -rw-r--r-- | alv-lib/love.moon | 42 | ||||
| -rw-r--r-- | alv/copilot/love/init.moon | 13 |
2 files changed, 33 insertions, 22 deletions
diff --git a/alv-lib/love.moon b/alv-lib/love.moon index c88986f..f29da91 100644 --- a/alv-lib/love.moon +++ b/alv-lib/love.moon @@ -1,4 +1,4 @@ -import Constant, Op, PureOp, Input, Error, T, Array, any, sig from require 'alv.base' +import Constant, Op, PureOp, Input, Error, T, Array, any, sig, const from require 'alv.base' import RTNode from require 'alv' tsv = do ok, mod = pcall require, 'texture-share-vk' @@ -72,28 +72,52 @@ window_mode = Constant.meta tick: => { width, height, flags } = @unwrap_all! love.window.setMode width, height, flags + COPILOT.window_size\set { width, height } tsv_output = Constant.meta meta: name: 'tsv-output' summary: "send rendered output via texture_share_vk." - examples: { '(love/tsv-output name)' } + examples: { '(love/tsv-output name [size] shape)' } value: class extends Op + pattern = const.str + -const(vec2) + any['love/shape'] setup: (inputs, scope) => - name = sig.str\match inputs - @state or= tsv.new! + { name, size, shape } = pattern\match inputs super name: Input.hot name - size: Input.hot COPILOT.window_size + size: Input.hot size or COPILOT.window_size + shape: Input.hot shape + + @state or= { tsv: assert tsv.new! } + @setup_out '~', T['love/shape'] + + fork: => + out = @out\fork! + state = { tsv: @state.tsv } + @@ out, state, @inputs tick: => - { :name, :size } = @unwrap_all! - COPILOT.tsv_canvas = @state\newSharedCanvas name, unpack size + { :name, :size, :shape } = @inputs - destroy: => - COPILOT.tsv_canvas = nil + if not @state.canvas or name\dirty! or size\dirty! + @state.canvas = @state.tsv\newSharedCanvas name!, unpack size! + + @out\set -> + love.graphics.push "all" + love.graphics.reset! + love.graphics.setCanvas @state.canvas.canvas + + love.graphics.clear! + shape!! + love.graphics.pop! + + assert @state.canvas\send! + + love.graphics.push "all" + love.graphics.draw @state.canvas.canvas + love.graphics.pop! no_shape = Constant.meta meta: diff --git a/alv/copilot/love/init.moon b/alv/copilot/love/init.moon index f21e11d..6941da6 100644 --- a/alv/copilot/love/init.moon +++ b/alv/copilot/love/init.moon @@ -28,27 +28,14 @@ class LoveCopilot extends CLICopilot w, h = love.window.getMode! @window_size = vec2\mk_sig { w, h } - @tsv_canvas = nil - draw: => love.graphics.reset! love.graphics.clear! - if @tsv_canvas - love.graphics.setCanvas @tsv_canvas.canvas - love.graphics.clear! - for id, list in pairs @drawlist for fn in *list fn! - if @tsv_canvas - love.graphics.reset! - - @tsv_canvas\send! - love.graphics.setBlendMode "alpha", "premultiplied" - love.graphics.draw @tsv_canvas.canvas - love.graphics.present! run: => |
