jit.gl.lua コルーチンのサンプル : #maxmsp #max6 #jitter

スクリーンショット 2014-05-29 6.00.09

Luaのコルーチンを使ったサンプルです。コルーチンは、関数の途中で処理を中断して呼び出し側に処理を戻し、また再度同じ箇所から処理を行える機能との事です。

状態を変更しながらの制御、フレーム毎のアップデート処理が思い場合にフレーム分割して計算、ジェネレーターとして数値の取得、Tweenといった処理をスッキリ書けそうです。local 変数を関数の中に定義し、スコープを限定してstatic変数のように何度も使いまわせるのも良さそうです。

このサンプルではコルーチン部分で、動画のスピードを上げ下げしています。

[javascript]

autowatch = 1
gc = 1

local mov1 = jit.new("jit.qt.movie",this.drawto)
mov1.adapt = 1;
mov1.rate = 0.1;
mov1:read("bball.mov")

local frame = jit.matrix();

local plane = jit.new("jit.gl.videoplane",this.drawto);
plane.scale = 0.8
plane.automatic = 1;

–coroutine
local update_co = coroutine.create(
function()

— 動画再生スピードを上げる
while true do
if mov1.rate < 50. then

mov1.rate = mov1.rate + 0.1;
mov1:matrixcalc(frame.name,frame.name)
else
break;
end

coroutine.yield ()
end

— 動画再生スピードを下げる
while true do

if mov1.rate > 0 then

mov1.rate = mov1.rate – 0.1;
mov1:matrixcalc(frame.name,frame.name)
else
break;
end

coroutine.yield ()
end

return

end
)

function draw()

if( coroutine.status(update_co) ~= "dead") then

print(coroutine.resume(update_co))
print(coroutine.resume(update_co))
print(coroutine.resume(update_co))

else

print(coroutine.status(update_co));
end

plane:jit_matrix(frame.name)

end

[/javascript]

coroutine.wrap( function ) で既存の関数をコルーチンとして扱う事もできますが、coroutine.* 系の関数を使えなくなるようなので、基本的には coroutine.create を用いてつくるのが良さそうです。

jit.gl.lua 内の jit.gl.videoplane へ jit_matrix の入力からテクスチャを貼る : #max6 #maxmsp #jitter

スクリーンショット 2014-05-14 3.17.17

解説

[javascript]
function jit_matrix(name)

    plane:jit_matrix(name);

end
[/javascript]

緑線(jit_matrix)をjit.gl.luaにそのまま繋げる場合のコード。

[javascript]
function tex(…)

    local jit_matrix = {…}
   plane:jit_matrix(jit_matrix[2])

end
[/javascript]

texをprependして,tex関数をコールした場合のコード。可変長配列で受け取ると2番めの要素にjit_matrixの名前が入っています。

緑線(jit_matrix)は、単に{ “jit_matrix” , jit_matrix の 名前 } のリストを送ってるだけなんですね。

コード

[javascript]

autogarbage = 1
autowatch = 1
gc = 1

local plane = jit.new("jit.gl.videoplane",this.drawto);
plane.blend_enable = 1;
plane.blend = "alphablend";

–1
function jit_matrix(name)

    plane:jit_matrix(name);

end

–2
function tex(…)

    local jit_matrix = {…}
    plane:jit_matrix(jit_matrix[2])

end

[/javascript]

jit.gl.lua 疑問点メモ : #jitter #maxmsp #max6

  • jit.qt.movie を jit.listener を使って、コールバック監視の方法がわからない。asyncreadを行ないたいが、listenerが使えないため困っている。

追記

jit.gl.luaの中でlistenerをつかった jit.qt.mov asyncread 後のevent受ける処理は、実装されてないそうです。Cycling74のサポートからのメールより

jit.gl.lua の出力に jit.gl.pix をかける : #maxmsp #max6 #jitter

スクリーンショット 2014-05-08 23.44.12

jit.gl オブジェクトのTIPSです。表題の通り、jit.gl.luaの出力にjit.gl.pixのエフェクトをかけたかったので、やってみました。jit.gl.luaのテクスチャ出力をゲットするのが少し難しかったです。

やり方

  1. 一旦 jit.gl.node へ jit.gl.luaを描画。※ jit.gl.luaの出力から青線( gpu上のtexture? ) を直接取得できなかったためです。他にやり方はありそうですが・・・
  2. jit.gl.node のアトリビュート @capture 1 にしておくと、第1outletからtexture出力(青い線)
  3. jit.gl.pix でテクスチャに画像処理
  4. jit.gl.videoplane にテクスチャを貼り付け
  5. jit.gl.render で jit.gl.window へ描画

補足 – Syphonを使う場合

jit.gl.*の描画をSyphonへ送る場合も、テクスチャかマトリクスをjit.gl.syphonserver送る必要があるため、上記の方法でluaで描画したtexture取得すると良さそうでした。jit.gl.renderから直接@matrixout 1 / @capture 1などしてマトリクスかテクスチャ取得出来た気がするけど、何故か上手くいかなかったです。

jit.gl.lua 動画テクスチャを利用する

jit.gl.lua内で動画テクスチャを扱う場合に、外部からmatrixで受け取り、jit.gl.textureと接続する方法がForumにありました。少しずつOpenGLとjit.gl.luaの使い方が分かってきました。

スクリーンショット 2014-01-29 01.43.17

[javascript]

local gl = require("opengl")
local GL = gl

local tex = jit.new("jit.gl.texture", this.drawto)

function jit_matrix(name)
tex:jit_matrix(name)
end

function draw()
jit.gl.bindtexture(tex.name, 0)
gl.Color(1., 1., 1., 1.)

gl.Begin(GL.QUADS)
–top left
gl.TexCoord(0., 1.)
gl.Vertex(-0.5, 0.5, 0.)

–bottom left
gl.TexCoord(0., 0.)
gl.Vertex(-0.5, -0.5, 0.)

–bottom right
gl.TexCoord(1., 0.)
gl.Vertex(0.5, -0.5, 0.)

–top right
gl.TexCoord(1., 1.)
gl.Vertex(0.5, 0.5, 0.)
gl.End()

gl.PushMatrix()
gl.Translate(1,0,0)
gl.Begin(GL.QUADS)
–top left
gl.TexCoord(0., 1.)
gl.Vertex(-0.5, 0.5, 0.)

–bottom left
gl.TexCoord(0., 0.)
gl.Vertex(-0.5, -0.5, 0.)

–bottom right
gl.TexCoord(1., 0.)
gl.Vertex(0.5, -0.5, 0.)

–top right
gl.TexCoord(1., 1.)
gl.Vertex(0.5, 0.5, 0.)
gl.End()
gl.PopMatrix()

jit.gl.unbindtexture(tex.name, 0)
end

[/javascript]