三原色レイヤー分割操作DLL

画面の色を操作するフィルタリングプラグインを作成しました。

ダウンロード

以下のURLからどうぞ。
http://www.eiji8pou.pics/download/rgbfilter20120629.zip

デモンストレーション

D
上の部分が消えている理由はよくわかりません。AVIMakerに聞いてください。

どういうものか

レイヤー型のプラグインで、画面を赤・青・緑の三つのレイヤーにわけ、それぞれを操作してから再構成するものです。
できる操作は、

  • 選んだレイヤーをずらす。
  • 選んだレイヤーの輝度を調節する。
  • 選んだレイヤーをネガポジ反転する。

などです。

どこで使うのか。

使える場所が少ないのは確かです。

レイヤーをずらす機能

カメラを通して見ている光景で、電波状態の悪さを表現するために、ランダムにレイヤーをずらして画面が滲む風を演出してみる。

レイヤーの輝度を調節する。

千と千尋の神隠し」DVDに対して抗議するために画面全体の赤を強くしてみるとか。

レイヤーをネガポジ反転する。

これだけ使えば普通にネガポジ反転フィルタとしても使えます。

使い方

NScripterのレイヤー型プラグインです。
まず、define節で定義します。

*define
setlayer 10,30,"rgbfilter.dll"
; 最初の10はレイヤー番号です。後のlayermessage命令で、この番号を使います。
; 次の30は更新の間隔です。単位はミリ秒です。あまり短くすると動作が重くなります。17にすると60fpsくらいになります。

次に、start節で、プラグインをスプライトに結びつけます。

lsph 100,"*10" ; 最初は非表示にしておくのをオススメします。
; "*"の次の数字は、setlayerで設定したレイヤー番号です。

レイヤースプライトが非表示中は、フィルタリングをしません。vspを効果的に使ってください。
そして、layermessage命令で設定ができます。

layermessage 10,"rx,10" ; 赤レイヤーのx座標を右に10ドットずらす。
layermessage 10,"gy,-5" ; 緑レイヤーのy座標を上に5ドットずらす。
layermessage 10,"balpha,128" ; 青レイヤーの輝度を半分(デフォルトは255)にする。
; ちなみに輝度は0〜255の範囲を超えて設定することができます。

また、命令はいくつでもつなげて構いません。

layermessage 10,"rx,10,ry,10" ; 赤レイヤーを右下に10ドットずらす。

ネガポジ反転は以下のようにします。

layermessage 10,"rnega,-1" ; 赤レイヤーをネガポジ反転させます。
layermessage 10,"gnega,1" ; 緑レイヤーをネガポジ反転させます。

全ての設定を初期状態に戻すには、以下のようにします。

layermessage 10,"reset"

また、状態をシリアライズできます。

layermessage 10,"save"
getret $0 ; これに、状態を入れた文字列が入る。

layermessage 10,$0 ; これで状態を再現できる。

このシリアライズ機能で、セーブロードに対処してください。

サンプルスクリプト

動画の元になったスクリプトは以下のもの。先日の連続画面キャプチャーDLLを組み合わせて画面を出力した後、それをAVIMakerでまとめたんですが、何故かこんなことに。

00.txt
;mode800
*define

	setlayer 10,30,"rgbfilter.dll"
	setlayer 11,50,"playmovie.dll"
	deletemenu

	numalias com,100

	game

*start
	lsp 550,":c;image.jpg",0,0
	print 1
	lsp 500,"*10"
	lsph 499,"*11"

	vsp 499,1
*loop
	make_command $com
	layermessage 10,$com
	layermessage 10,"save"
	getret $0
	caption $0
	repaint
	layermessage 11,"shot"
	wait 10
goto *loop
	
end
system.lua
-- system.lua
do
	-- PIE
	local pie = 6 * math.asin( 0.5 )

	-- 角度
	local deg = 0
	local deg2 = 0
	local deg3 = 0
	local rad = 0
	-- ズレの大きさ
	local dis = 0;
	local dis2 = 0;
	local dissize = 20;
	-- 前回の呼出
	local before = NSTimer()
	-- 今回の呼出
	local now = 0
	-- 前回からの経過時間
	local span = 0
	-- 座標
	local x
	local y

	local int = math.floor
	local sin = math.sin
	local cos = math.cos

	NSExec("_luasub make_command")
	function NSCOM_make_command()
		now = NSTimer()
		span = now - before
		
		deg = deg + span / 10
		while deg > 360 do deg = deg - 360 end
		deg2 = deg + 120
		deg3 = deg + 240
		
		dis = dis + span / 5
		while dis > 360 do dis = dis - 360 end
		dis2 = pie * dis / 180
		
		local ret = NSPopStrRef()
		local str = ""

		str = str .. "rx," .. int(cos(deg *pie/180)*sin(dis2)*dissize)
		str = str .. ",ry," .. int(sin(deg *pie/180)*sin(dis2)*dissize)
		str = str .. ",gx," .. int(cos(deg2*pie/180)*sin(dis2)*dissize)
		str = str .. ",gy," .. int(sin(deg2*pie/180)*sin(dis2)*dissize)
		str = str .. ",bx," .. int(cos(deg3*pie/180)*sin(dis2)*dissize)
		str = str .. ",by," .. int(sin(deg3*pie/180)*sin(dis2)*dissize)

		NSSetStrValue(ret, str)
		
		before = now
	end

end

※なお、image.jpgは各自で調達してください。