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

この記事へのトラックバックURL
http://tanakaakio.slmame.com/t166167


