ソラマメブログ
HUDCampTimerMessageBoard WittyRadar

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);
}
}


  
Posted by 田中明夫 at 22:11Comments(0)TrackBack(0)実用スクリプト

2008年03月08日

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

 スクリプトの前にちょっとTipsを・・・

オブジェクトのフェイス番号をチャットウィンドウに表示する。
 オブジェクトフェイスの番号をチャットウィンドウに表示するには、
テクスチャのフェイスを選択してから「ctrl+shift+alt」を押しながら「T」を押します。
テクスチャのサイズとアルファ値も出ます(どうせなら、編集ボックスに表示すればいいと思うのですが)。


 テクスチャのフェイスを選択してない場合は、オブジェクトにあるフェイス番号がすべて表示されます。


分割してテクスチャを貼るためのスクリプト2
 今回使用しているサンプルテクスチャです。


 前回は、1つのテクスチャを8(2x4)分割して貼り付けましたが、
今回は、1つのテクスチャを4(2x2)分割と16(4x4)分割で貼ってみます。
実際には、絵が重ならないようにして配置します。
そうすれば、1枚のテクスチャでいろいろ使えます。
特にHUDなんかでこまごましたボタンがいっぱいあるときにいいかもと思います。
 スクリプトの関数は変更なしで、テクスチャの指定と呼び出し方とを少し変えるだけです。



変更箇所1:テクスチャの変更。

//テクスチャのUUIDかオブジェクトコンテンツでの名前を指定する。
//このサンプルテクスチャにはフルパーミッションを与えてあるので、誰でもこのテクスチャで実行できるはず。
string myTex = "f4bb40ac-b9c6-1019-0b59-cffa8fb12b68";




変更箇所2: 関数の呼び出し部分。state_entryをすべて入れ替えます。

state_entry() {

      //繰り返したとき変化が分かりやすいようにデフォルトにする。
      setDefaultTex();
      llSleep(2);

      //テクスチャを2列2行で分割し、0番目(0から始まる)のグリッドを第0面に貼る。
      setTex(0, 2, 2, myTex, 0);
      llSleep(2);

      //テクスチャを2列2行で分割し、1番目(0から始まる)のグリッドを第1面に貼る。
      setTex(1, 2, 2, myTex, 1);
      llSleep(2);

      //テクスチャを2列2行で分割し、2番目(0から始まる)のグリッドを第2面に貼る。
      setTex(2, 2, 2, myTex, 2);
      llSleep(2);

      //テクスチャを4列4行で分割し、3番目(0から始まる)のグリッドを第3面に貼る
      setTex(3, 4, 4, myTex, 3);
      llSleep(2);

      //テクスチャを4列4行で分割し、4番目(0から始まる)のグリッドを第4面に貼る。
      setTex(4, 4, 4, myTex, 4);
      llSleep(2);

      //テクスチャを4列4行で分割し、5番目(0から始まる)のグリッドを第5面に貼る
      setTex(5, 4, 4, myTex, 5);
      llSleep(2);

}



こうゆう感じになります。
  
Posted by 田中明夫 at 14:06Comments(0)TrackBack(0)実用スクリプト

2008年03月08日

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

 アップ代を節約するためにテクスチャを分割したりしますが、
けっこう計算とか面倒ですね。

そのためのスクリプトです。

使用しているサンプルテクスチャ。



//ParameterForGridTexture.lsl

//グリッド(格子状)に分割してテクスチャを貼る、もしくはそのときのスケールとオフセットの値を得る。
//テクスチャは、オブジェクトのサイズとは関係なく比率で貼り付けられる。

//デフォルトテクスチャ
string defaultTex = "89556747-24cb-43ed-920b-47caed15465f";

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

//テクスチャグリッドのオフセットを返す。
//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>;
}

//テクスチャのスケールとオフセットをオーナーにSayする。
//index:テクスチャのグリッド番号(0から始まる)。
//numOfCol:テクスチャのグリッド列数。
//numOfRow:テクスチャのグリッド行数。
sayPara(integer index, integer numOfCol, integer numOfRow) {
vector scale = getGridTexScale(numOfCol, numOfRow);
llOwnerSay("顔ごとに繰り返す(scale) 水平(u)=" + (string)scale.x + ", 垂直(v)=" + (string)scale.y);
vector offset = getGridTexOffset(index, numOfCol, numOfRow);
llOwnerSay("ずれ(offset) 水平(u)=" + (string)offset.x + ", 垂直(v)=" + (string)offset.y);
}

//スケールとオフセットを設定してからテクスチャを指定面に貼り付ける。
//index:テクスチャのグリッド番号(0から始まる)。
//numOfCol:テクスチャのグリッド列数。
//numOfRow:テクスチャのグリッド行数。
//tex:テクスチャ名またはテクスチャのUUID
//face:貼り付ける面番号。
setTex(integer index, integer numOfCol, integer numOfRow, string tex, integer face) {
vector scale = getGridTexScale(numOfCol, numOfRow);
llScaleTexture(scale.x,  scale.y, face);
vector offset = getGridTexOffset(index, numOfCol, numOfRow);
llOffsetTexture(offset.x, offset.y, face);
llSetTexture(tex, face);
}

//テクスチャの状態をデフォルトにする。
setDefaultTex() {
llSetTexture(defaultTex, ALL_SIDES);
llScaleTexture(1.0, 1.0, ALL_SIDES);
llOffsetTexture(0.0, 0.0, ALL_SIDES);
}

default {
state_entry() {

//繰り返したとき変化が分かりやすいようにデフォルトにする。
setDefaultTex();
llSleep(2);

//テクスチャを2列4行で分割し、3番目(0から始まる)のグリッドを貼るときのスケールとオフセットをオーナーにSayする。
sayPara(3, 2, 4);

//テクスチャを2列4行で分割し、3番目(0から始まる)のグリッドが全面に表示されるようにテクスチャを貼る。
setTex(3, 2, 4, myTex, ALL_SIDES);
llSleep(2);

//変化が分かりやすいようにデフォルトにする。
setDefaultTex();
llSleep(2);

//テクスチャを2列4行で分割し、0~5番目のグリッドのスケールとオフセットをオーナーにSayしながら、0~5番の面にテクスチャを貼る。
integer i;
for (i=0; i<6 ;i++) {
llOwnerSay(" *** face:" + (string)i + " ***");
sayPara(i, 2, 4);
setTex(i, 2, 4, myTex, i);
llSleep(2);
}

}
}
  
Posted by 田中明夫 at 00:33Comments(0)TrackBack(0)実用スクリプト