FireAlpaca用図形散布型ブラシスクリプトの一般化
以前作った五芒星形の散布ブラシのスクリプトを、他の図形にも対応するよう一般化した。また、機能の強化と可読性の向上を図った。
スクリプト
function default_size()
return 20 , 0.50
end
-- パラメータ
function param1()
return "筆圧透明度" , 0 , 1 ,1
end
function param2()
return "散布幅" , 0 , 100 , 100
end
function param3()
return "散布幅ブースター" , 1 , 10 , 1
end
function param4()
return "散布量" , 1 , 100 , 1
end
function param5()
return "粒子サイズ" , 1 , 100 , 50
end
function param6()
return "粒子サイズブースタ-" , 1 , 100 , 1
end
function param7()
return "粒子ランダム" , 0 ,100 ,50
end
function param8()
return "ランダム粒子回転" , 0 , 1 , 1
end
function param9()
return "固定粒子回転角" , 0 , 90 , 0
end
-- 座標( X , Y )から距離D、W [rad] の座標を返す
function point(X , Y , D ,W)
return X + math.cos( D ) * W , Y + math.sin( D ) * W
end
function main( x, y, p )-- 散布幅
local sw = bs_width_max() * ( bs_param2() * 0.01 ) * bs_param3()
-- 散布量係数(描画頻度係数)
local q = bs_param4()
-- 粒子半径
local rr = bs_width_max() * ( bs_param5() * 0.01 ) * bs_param6() * ( math.random( bs_param7() , 100 ) * 0.01 ) * 0.5
-- 描画壁
if not firstDraw then
local distance = bs_distance( lastDrawX - x, lastDrawY - y )
if distance < 2 * rr / q then
return 0
end
end
-- 描画位置までの距離、角度
local rp , rad = sw * 0.5 * math.random() , math.random( 0 , 360 ) * math.pi /180
-- 描画座標
local x0 , y0 = x + rp *math.cos(rad) , y + rp * math.sin(rad)-- 回転角
local k = 0if bs_param8() == 1 then
-- ランダム回転時の処理
k = math.random(0 , 360 )
else-- 固定回転時の処理
k = bs_param9()
end-- 頂点の設定
for i , value in ipairs(d) do
bs_polygon( point(x0 , y0 , (d[i] + k ) * math.pi / 180 , rr ) )
end-- 不透明度の反映
local a = 255 * bs_opaque()-- 筆圧の反映
if bs_param1() == 1 then
a = p * a
end
-- 前景色の取得
local r , g , b = bs_fore()-- 塗り
bs_fill( r , g , b , a )
lastDrawX = x
lastDrawY = y
firstDraw = falsereturn 1
end
d = { 54 , 198 , 342 , 126 , 270 }
lastDrawX = 0
lastDrawY = 0
firstDraw = truebs_setmode( 1 )
スクリプト解説
上である程度コメントを書いているのでmain関数内の解説は控える。
このスクリプトで、描きたい図形に対応する d を与えれば、その図形を散布することができる。