FireAlpaca用ブラシスクリプト「ハニカムブラシ」を作成しました

タイルブラシを改良して正六角形を平面充填できる「ハニカムブラシ」を作成しました。

実はタイルブラシよりも先に作成をし始めたのですが、粒子の描画中心を決定するアルゴリズムに苦戦し中断していて、タイルブラシのアルゴリズムを書いた後に閃いたので、ようやく完成に漕ぎ着けました。現在のところ横向き(HcS_a08.bs)と縦向き(HxS_a09.bs)でブラシが分かれていますが、今後は一つのブラシに統合していく方針です。

ブラシのDownloadは記事下部のリンク先から行ってください。

 

f:id:Inari777:20150410104501p:plain

パラメータ

筆圧透明度

省略。

大きさ

HcS_a08.bsの方では粒子の縦幅、HcS_a09.bsの方では粒子の横幅がブラシ幅に対する大きさ(%)で指定できます。具体的には下図のようなこともできたりする。

f:id:Inari777:20150410134534p:plain

スクリプト

function param1()
 return "筆圧透明度", 0, 1, 1
end

function param2()
 return "大きさ", 10, 100, 95
end

 

function po( x0 , y0 , d , rs )
 return x0 + math.cos( d * math.pi /180 ) * rs , y0 + math.sin( d * math.pi /180 ) * rs
end


function main( x, y, p )
 local w = bs_width_max()
 local wh = w * 0.5 * math.sqrt(3)
 local y0 = ( math.floor( y / ( 0.75 * w ) ) + 0.5 ) * 0.75 * w
 local k = 0
 if math.floor( y / ( 0.75 * w ) ) % 2 == 0 then
  k = 0.5
 end
 local x0 = ( math.floor( x / wh ) + k ) * wh
 local rs = w * bs_param2() * 0.01 * 0.5
 local r , g , b = bs_fore()
 local a = 255 * bs_opaque()
 if bs_param1() == 1 then
  a = p * a
 end

 bs_polygon( po( x0 , y0 , 30 , rs ) )
 bs_polygon( po( x0 , y0 , 90 , rs ) )
 bs_polygon( po( x0 , y0 , 150 , rs ) )
 bs_polygon( po( x0 , y0 , 210 , rs ) )
 bs_polygon( po( x0 , y0 , 270 , rs ) )
 bs_polygon( po( x0 , y0 , 330 , rs ) )
 bs_fill( r , g , b , a )

 return 1
end

bs_setmode( 1 )

 HcS_a08.bs

スクリプト解説

スクリプト全体の流れはタイルブラシの時と同じで、ただ粒子の描画を判定するのに下図に赤色で示されたような格子を仮定しているだけである。

f:id:Inari777:20150410110436p:plain

Download

Downloadは以下のリンク先から行ってください。

HcS_a08.bs - Google ドライブ

HcS_a09.bs - Google ドライブ