ブラシスクリプト概要
mdiappはブラシ処理でスクリプト(Lua)を用いたプログラム制御が行えます。
http://staff.aist.go.jp/yutaka.ueno/lua/docsjp.html (Lua言語について
プログラム制御をすることで、
こういった形で自由度の高いブラシを作成することが可能です。ブラシスクリプトは、拡張子 (*.bs) で作成します。ブラシデザインウィンドウからスタイルで「プログラム」を選び、下のボタンを押しスクリプトを指定します (ファイルをブラシウィンドウにドラッグ&ドロップでもOKです)。正しくパースできた場合のみ、インストールが可能です。参照したファイルは実行ファイルと同階層の "bs" フォルダにコピーされます。
一番シンプルなスクリプトは、こんな具合です。
function main( x, y, p ) local r,g,b,a = bs_pixel_get( x, y ) bs_pixel_set( x,y, 255-r,255-g,255-b, 255 ) return 1 end
プログラムブラシの場合、ブラシ描画に使うマウスやタブレットから取得した座標の各頂点間を、十分に細かい頻度で (ブラシの直径に応じた細かさ) main( x,y,p ) 関数が呼ばれます。かなりの頻度で呼ばれる事になるので、間隔調整が必要になります。
上記のスクリプトの場合、bs_pixel_get命令で、x,y座標のRGBA値を取得し、bs_pixel_set命令で、RGB値を反転した値のピクセルを書き込むような処理になっています。
何かしら描画した場合は return 1 を、何も描かなかった場合は return 0 してください。
次はもう少し複雑なスクリプトを見てみましょう。
function main( x, y, p ) local w = bs_width() if w < 5 then w = 5 end if not firstDraw then local distance = bs_distance( lastDrawX - x, lastDrawY - y ) if distance < w then return 0 end end local dx,dy = bs_dir() local nx,ny = bs_normal() bs_polygon( x + nx * w/3, y + ny * w/3 ) bs_polygon( x - nx * w/3, y - ny * w/3 ) bs_polygon( x + dx * w, y + dy * w ) local r,g,b = bs_fore() bs_fill( r,g,b, 255 ) lastDrawX = x lastDrawY = y firstDraw = false return 1 end lastDrawX = 0 lastDrawY = 0 firstDraw = true
最後の3行に注目してください。ここはグローバル宣言部なので、main(x,y,p) が呼び出される前に、一度だけ必ず実行されます。ここでは、firstDraw = true といったように、最初の描画を判定する為の変数を初期化しています。
local w = bs_width() if w < 5 then w = 5 end
bs_width() は現在のブラシ幅(直径)を所得する関数です (筆圧適用した幅)。5pixel以下のブラシ幅にしないように調整しています。
if not firstDraw then local distance = bs_distance( lastDrawX - x, lastDrawY - y ) if distance < w then return 0 end end
最初の描画でない時、あまりにブラシが進んでいない場合は描画を避けるような処理をしています。bs_distance() で差分の距離を測っています。
local dx,dy = bs_dir() local nx,ny = bs_normal()
bs_dir() はブラシの進行方向の正規ベクトル、bs_normal() はブラシの進行方向の垂直方向の正規ベクトルを取得する関数です。正規ベクトルとは、大きさが1になるベクトルのことです。進行方向が必要なので取得しています。
bs_polygon( x + nx * w/3, y + ny * w/3 ) bs_polygon( x - nx * w/3, y - ny * w/3 ) bs_polygon( x + dx * w, y + dy * w )
bs_polygon() は多角形を設定する命令です。現在の座標値 x, y をベースに、進行方向を指す3頂点を指定しています。
local r,g,b = bs_fore() bs_fill( r,g,b, 255 )
bs_fore() で前景色のRGB値を取得し、その色を使い bs_fill() で先ほど定義した3頂点を塗りつぶしています。