ソラマメブログ

2008年03月08日

分割してテクスチャを貼るためのスクリプト3


タグ(名前)を付けて、テクスチャグリッドを貼るスクリプト。

すいません。
101行目訂正しました。
誤: llSetTexture(tex, ALL_SIDES);
正:llSetTexture(tex, face);

これが前回使用した数字テクスチャです。

string tex1 = "f4bb40ac-b9c6-1019-0b59-cffa8fb12b68";



これが前々回使用した絵柄テクスチャです。

string tex0 = "0c5fb359-7ca3-00f2-8362-a6c2f0e5e8e9";




 これらを今回も使って、テクスチャグリッドに名前を付けて貼り付けてみます。
listの登録がだらだらと続きますが、それさえすめば名前だけでテクスチャグリッドを貼れます。
それはそれで面倒ですが、電卓を片手に細かい小数計算をして入力しなくてすみます。
ちょっと見難いかもしれませんが、テクスチャのライブラリのような感じでもあります。

 ありがちなミスとしては、
・テクスチャを再アップしたけどスクリプトのUUIDを変えてなくてテクスチャが変わらない。
・同じ名前を登録してしまって、思ったものと違うものが表示される。
・名前に余計なスペースが入っていて、ありませんといわれる。
・各listの登録数があっていない。
・各listの数が同じように見えたが、目の錯覚で実際数えてみると数が違っていた。
・リストが長いので、コンマや括弧が分かりにくくて入れ間違え、狭いスクリプトコンソールでシンタックスエラー(構文エラー)で苦しむ。

自分だけかなこんなミスをするのは・・・


//TaggedTexGridSample.lsl

//テクスチャグリッドにタグ(名前)をつけてリストに登録し、タグでテクスチャグリッドを貼れるようにする。
//各タグのグリッドの分割数(列行)、グリッド番号とテクスチャもリストに登録する。

//テクスチャのUUIDかオブジェクトコンテンツでの名前を指定する。
//これらのサンプルテクスチャにはフルパーミッションを与えてあるので、誰でもこのテクスチャで実行できるはず。
//絵柄サンプルテクスチャ
string tex0 = "0c5fb359-7ca3-00f2-8362-a6c2f0e5e8e9";
//数字サンプルテクスチャ
string tex1 = "f4bb40ac-b9c6-1019-0b59-cffa8fb12b68";

//***グリッドのタグ(名前)。
list tag = [
//絵柄テクスチャを8(2x4)分割。
"Board" , "Ice"
,"Lily" , "Warning"
,"Ribbon" , "Whiteboard"
,"Blue" , "Celt"
//数字テクスチャを4(2x2)分割。
,"0" , "1"
,"2" , "3"
//数字テクスチャを16(4x4)分割。
,"00" , "01" , "02" , "03"
,"04" , "05" , "06" , "07"
,"08" , "09" , "10" , "11"
,"12" , "13" , "14" , "15"
];

//***各グリッドタグのテクスチャを設定する。
list tagTex = [
//絵柄テクスチャを8(2x4)分割。
tex0 , tex0
,tex0 , tex0
,tex0 , tex0
,tex0 , tex0
//数字テクスチャを4(2x2)分割。
,tex1 , tex1
,tex1 , tex1
//数字テクスチャを16(4x4)分割。
,tex1 , tex1 , tex1 , tex1
,tex1 , tex1 , tex1 , tex1
,tex1 , tex1 , tex1 , tex1
,tex1 , tex1 , tex1 , tex1
];

//***各グリッドタグの分割数と番号を設定する。<列数, 行数, グリッド番号(0から始まる)>
list tagGrid = [
//絵柄テクスチャを8(2x4)分割。
<2, 4, 0> , <2, 4, 1>
,<2, 4, 2> , <2, 4, 3>
,<2, 4, 4> , <2, 4, 5>
,<2, 4, 6> , <2, 4, 7>
//数字テクスチャを4(2x2)分割。
,<2, 2, 0> , <2, 2, 1>
,<2, 2, 2> , <2, 2, 3>
//数字テクスチャを16(4x4)分割。
,<4, 4, 0> , <4, 4, 1> , <4, 4, 2> , <4, 4, 3>
,<4, 4, 4> , <4, 4, 5> , <4, 4, 6> , <4, 4, 7>
,<4, 4, 8> , <4, 4, 9> , <4, 4, 10> , <4, 4, 11>
,<4, 4, 12> , <4, 4, 13> , <4, 4, 14> , <4, 4, 15>
];

//テクスチャグリッドのオフセットを返す。
//index:テクスチャのグリッド番号(0から始まる)。
//numOfCol:テクスチャのグリッド列数。
//numOfRow:テクスチャのグリッド行数。
vector getGridTexOffset(integer index, integer numOfCol, integer numOfRow) {
integer Col = index % numOfCol;
integer Row = index / numOfCol;
float pitchCol = 1 / (float)numOfCol;
float pitchRow = 1 / (float)numOfRow;
float offX = -0.5 + pitchCol / 2 + Col * pitchCol;
float offY = 0.5 - pitchRow / 2 - Row * pitchRow;
return < offX, offY, 0.0>;
}

//テクスチャグリッドのスケールを返す。
//numOfCol:テクスチャのグリッド列数。
//numOfRow:テクスチャのグリッド行数。
vector getGridTexScale(integer numOfCol, integer numOfRow) {
return < 1/(float)numOfCol, 1/(float)numOfRow, 0.0>;
}

//タグ名のテクスチャグリッドを指定面に貼り付ける。
//name:タグ名。
//face:貼り付ける面番号。
setTaggedGridTex(string name, integer face) {
integer pos = llListFindList(tag, [name]);
if (pos==-1) {
string s = "*** " + name + " is not found. ***";
llOwnerSay(s);
llSetText("tag=" + s, <1.0,1.0,1.0>, 1.0);
} else {
vector grid = llList2Vector(tagGrid, pos);
vector scale = getGridTexScale((integer)grid.x, (integer)grid.y);
llScaleTexture(scale.x,  scale.y, face);
vector offset = getGridTexOffset((integer)grid.z, (integer)grid.x, (integer)grid.y);
llOffsetTexture(offset.x, offset.y, face);
key tex = llList2Key(tagTex, pos );
llSetTexture(tex, face);
}
}

//登録されているタグ名のテクスチャグリッドを順にすべて貼りつけていく。チェック用。
demo() {
integer i;
for (i=0; i < llGetListLength(tag) ; i++) {
string s = llList2String(tag, i);
// llOwnerSay("tag=" + s);
llSetText("tag=" + s, <1.0,1.0,1.0>, 1.0);
setTaggedGridTex(s, ALL_SIDES);
llSleep(2);
}
llSetText("", <1.0,1.0,1.0>, 1.0);
}

default {
state_entry() {
//デモ表示
demo();//
//登録されてないのでエラー表示が出る
setTaggedGridTex("foo", ALL_SIDES);
//テクスチャを実際に貼り付ける時は、この部分だけタグと面を変えて各プリムで実行する。
setTaggedGridTex("Whiteboard", ALL_SIDES);
}
}



HUDCampTimerMessageBoard WittyRadar

この記事へのトラックバックURL

http://tanakaakio.slmame.com/t167022