aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2025-09-16 16:17:12 +0000
committers-ol <s+removethis@s-ol.nu>2025-09-16 16:17:12 +0000
commit8fa191e7191047e54e7dcea602e28cb6bce30285 (patch)
tree7195c6f2a251e83f0a5f6f119bf3fcf1b2294e1e
parentlib/osc: set socket reuse flag (diff)
downloadalive-8fa191e7191047e54e7dcea602e28cb6bce30285.tar.gz
alive-8fa191e7191047e54e7dcea602e28cb6bce30285.zip
lib/love: tsv-output takes shape
-rw-r--r--alv-lib/love.moon42
-rw-r--r--alv/copilot/love/init.moon13
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: =>