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 = 0

 if 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 = false

 return 1
end

 

 

d = { 54 , 198 , 342 , 126 , 270 }

lastDrawX = 0
lastDrawY = 0
firstDraw = true

bs_setmode( 1 )

スクリプト解説

上である程度コメントを書いているのでmain関数内の解説は控える。

このスクリプトで、描きたい図形に対応する d を与えれば、その図形を散布することができる。