--==--==--==--==--==--==--==--== 照準描画用ライブラリ ==--==--==--==--==--==--==--==-- -- 2007年11月29日 -- 初版 -- 2007年12月1日 -- リファレンスの不備を修正 -- 2007年12月2日 -- N以外の方向に接続されているときに正しく前方に -- 線が延びなかった不具合を修正 -- -- -- リファレンス -- -- ArmScope -- ライブラリテーブル -- -- ArmScope.draw -- 照準を描画する。最大で7つの引数を取る。 -- 各引数は有効な値の代わりにnilを渡すことで、省略と同等の扱いとなる。 -- -- 第一引数:対象チップ -- 照準線の起点となるチップの番号。一般にArmを渡すが、Arm以外でも当然OK。 -- 省略された場合はコアチップ。 -- 第二引数:長さ -- スコープの線の長さ。Armの弾は1200mぐらいしか飛ばないらしいので注意。 -- 省略された場合には1000。 -- 第三引数:ガイドの種類(関数) -- 定義済みの ArmScope.Box か ArmScope.Cross 、または独自のガイド描画用ファンクタ(後述)を渡す。 -- 省略された場合には描画されない。 -- 第四引数:ガイドの数 -- 一定距離ごとに描画されるガイドを、何個描画するかを指定する。 -- 省略された場合には5。 -- 第五引数:ガイドの倍率 -- ガイドの大きさの倍率。省略時には1(等倍)。 -- 第六引数:ガイドの間隔 -- ガイドをどれだけの距離を開けて描画するかを指定する。 -- 省略された場合には、length / count。 -- 第七引数:直線描画の抑制 -- 何かの値を与えると、中心の直線の描画がされない。 -- 省略されるか、nilが渡されたときには描画される。 -- -- ※ ファンクタ … 後ろにカッコをつけて呼び出すことのできる何か。 -- 関数と、__callメタメソッドを持ったテーブルがこれに当たる。 -- -- ArmScope.Box -- 四角いガイドを描画する、定義済みファンクタ。 -- ArmScope.drawの第三引数に使用する -- 例: ArmScope.draw(MYARM, 500, ArmScope.Box, ... ) -- ArmScope.Cross -- 十字のガイドを描画する、定義済みファンクタ。 -- ArmScope.drawの第三引数に使用する -- 例: ArmScope.draw(MYARM, 500, ArmScope.Cross, ... ) -- -- ArmScope.ColorSet -- 照準の色設定を表すテーブル。これを変更することにより、描画の際の色を変更できる。 -- -- ArmScope.ColorSet.lineColor -- ArmScope.ColorSet.guideColorOdd -- ArmScope.ColorSet.guideColorEven -- それぞれ、中心線の色、奇数番目・偶数番目のガイドの色を表す。 -- 既定ではそれぞれ、水色・赤・黄色である。 -- -- ※ ガイド描画用ファンクタの定義 --  第三引数には、ArmScope.Box, ArmScope.Crossの他に、ユーザーが定義した -- ファンクタを使用できる。これにより、さまざまな形のガイドを描画できる。 -- -- 関数の場合、その関数には引数として -- ・ガイド番号 -- ・_MOVE3D代替関数 -- ・_LINE3D代替関数 -- の3つが与えられて呼び出される。 -- -- たとえば、横線と縦線を交互に描画する関数は、以下のように定義できる。 -- function myGuide(i, _move, _line) -- if math.mod(i, 2) == 1 then -- _move(-2, 0, 0) -- _line(2, 0, 0) -- else -- _move(0, -2, 0) -- _line(0, 2, 0) -- end -- end -- -- これをArmScope.drawの第三引数とすることにより、目的のガイドが描画される。 -- -- テーブルの場合も関数の際と同じく、この三要素が渡される。ただし、 -- __callメタメソッドは呼び出しの際に、先頭にそれ自身を示すテーブルが -- 暗黙のうちに渡されていることに注意すること。 -- 例: ○ function someMetatable.__call(self, i, _move, _line) ... -- × function someMetatable.__call(i, _move, _line) -- スペシャルサンクス -- wikiのモデル「照準サイト試作」の作者様 -- こちらのモデルのスクリプト部をLuaに書き換え、それをベースとして作りました。 -- Lua リファレンスマニュアル -- Lua文法全般について、お世話になりました。 -- RigidChips Wiki -- ライブラリ云々に関する知識をいただきました。 ArmScope = {}; ArmScope.ColorSet = {} ArmScope.ColorSet.lineColor = 65535; ArmScope.ColorSet.guideColorOdd = 255 * 65536; ArmScope.ColorSet.guideColorEven = 255 * (65536 + 256) function ArmScope.draw(chipid,length,guide,count,size,span,disableLine) local function nilfunc() end if chipid == nil then chipid = 0 end if length == nil then length = 1000 end if guide == nil then guide = nilfunc end if count == nil then count = 5 end if size == nil then size = 1 end if span == nil then span = length / count end --変数x,y,zにチップの座標取得。 local x = _X(chipid) local y = _Y(chipid) local z = _Z(chipid) --変数zx,zy,zzにチップのZ軸ベクトル、変数xx,xy,xzにX軸、変数yx,yy,yzにY軸ベクトルを格納。 local zx = _ZX(chipid) local zy = _ZY(chipid) local zz = _ZZ(chipid) local xx = _XX(chipid) local xy = _XY(chipid) local xz = _XZ(chipid) local yx = _YX(chipid) local yy = _YY(chipid) local yz = _YZ(chipid) local dir = _DIR(chipid) local zx0; local zy0; local zz0; if dir == 1 then -- W xx, zx = zx, xx; xy, zy = zy, xy; xz, zz = zz, xz; elseif dir == 2 then -- S zx = -zx; zy = -zy; zz = -zz; elseif dir == 3 then -- E xx, zx = zx, -xx; xy, zy = zy, -xy; xz, zz = zz, -xz; end zx0 = zx; zy0 = zy; zz0 = zz; xx = xx * size; xy = xy * size; xz = xz * size; yx = yx * size; yy = yy * size; yz = yz * size; zx = zx * size; zy = zy * size; zz = zz * size; -- 射軸をライン描画 if disableLine == nil then _SETCOLOR(ArmScope.ColorSet.lineColor); _MOVE3D(x,y,z); _LINE3D(x + zx0*length,y + zy0*length,z + zz0*length); end local color = {ArmScope.ColorSet.guideColorOdd, ArmScope.ColorSet.guideColorEven}; local colorindex = 1; -- 引数として渡すためのクロージャ local function moveFunc(xxx, yyy, zzz) local xxxx = x + xx * xxx + yx * yyy + zx * zzz; local yyyy = y + xy * xxx + yy * yyy + zy * zzz; local zzzz = z + xz * xxx + yz * yyy + zz * zzz; _MOVE3D(xxxx, yyyy, zzzz); end local function lineFunc(xxx, yyy, zzz) local xxxx = x + xx * xxx + yx * yyy + zx * zzz; local yyyy = y + xy * xxx + yy * yyy + zy * zzz; local zzzz = z + xz * xxx + yz * yyy + zz * zzz; _LINE3D(xxxx, yyyy, zzzz); end for i = 1, count do --基準座標を射線方向にオフセット x = x + zx0 * span y = y + zy0 * span z = z + zz0 * span --ガイドの描画 _SETCOLOR(color[colorindex]); guide(i, moveFunc, lineFunc); colorindex = 3 - colorindex; end end function ArmScope.Box(i, move, line) move( 1, 1,0) line(-1, 1,0) line(-1,-1,0) line( 1,-1,0) line( 1, 1,0) end function ArmScope.Cross(i, move, line) move(2, 0, 0) line(-2, 0, 0) move(0, 2, 0) line(0, -2, 0) end -- ここから先、ユーザー定義ガイドテスト用のテーブル。 -- testTable = {} -- testTableMeta = {} -- function testTable.func(i, move, line) -- move(5, 0, 0); -- line(i*i+5, 0, 0); -- move(0, 5, 0); -- line(0, i*i+5, 0); -- move(-5, 0, 0); -- line(-i*i-5, 0, 0); -- move(0, -5, 0); -- line(0, -i*i-5, 0); -- end -- -- selfを忘れずに! -- function testTableMeta.__call(self, i, move, line) -- self.func(i, move, line); -- end -- setmetatable(testTable, testTableMeta);