Welcome to the Second Life Forums Archive

These forums are CLOSED. Please visit the new forums HERE

Bucky's Texture Chooser - 1.0b19

bucky Barkley
Registered User
Join date: 15 May 2006
Posts: 200
08-29-2006 15:41
Bucky's Texture Chooser 1.0b19

Choose textures for your building project easily!

The Texture Chooser gives you the ability to designate floors, walls, windows,
etc. and quickly change the textures on them. ... and much more...

- dialog and chat driven. Can take batches of commands from nearby objects
- alpha, rotation, brightness, lighting, offset

How do I start?

1) create one or more prims with unique names (such as "floor", "exteriorwall"),
and give each one a receiver script
2) create a controller prim with the texture chooser script, and load its inventory
with the textures you want
3) link them together, with the controller as the root prim

There is additional information available in the help and readme files. I have
included those in this posting. I can distribute a demo object in-world - IM me.
I'm also pondering where I could put one to be copied.

I am available on a limited basis to do customization. There is a roadmap for
a 2.0 version and beyond :)

Code note: this is a first version with a fair bit of copy/paste. Now that I have
a much better handle on LSL, 2.0 will be a rewrite, and much more modular.

The files:

_ControlTextures 1.0b19 - for the root prim
_Receiver 1.0b19 - for the child prims

_Help - for the root prim
_0_TextureChooserHelp 1.0b19 - "" "" ""
_1_README - "" "" ""


Add your own textures to the controller to taste. I would keep it under 50.
A future version will remove this restriction.

-- _ControlTextures 1.0b19: (root)

CODE

// -- Bucky's Texture Changer 1.0b19
// Bucky.Barkley@gmail.com - August 2006
//
// controller component

integer chatChannel = 45;
integer dialogChannel = 46;

string CHAT_HELP_MSG = "touch controller for texture dialog, or use ch 45 to choose textures (example \"/45 3\")";

list allTextures;
list allTextureDesc;
list theTextures;
key avKey;

integer linenum = 0;
integer curTextureOffset = 0;
integer textureChunk = 6;
integer curTextureEnd = 5;
integer totalTextures = 0;
integer dialogActive = 0;
integer curIdx = -1;
string dispTextureStr = "";

string NEXT_MSG = "Next >>";
string PREV_MSG = "<< Prev";
string LIST_MSG = "List";
string HELP_MSG = "Help";

string CUR_SET = "c";
string ALL_SET = "a";

integer SET_TEXTURE = 1;
integer SET_ALPHA = 2;
integer SET_COLOR = 3;
integer SET_SHINY = 4;
integer SET_BRIGHT = 5;
integer SET_LIGHT = 6;
integer SET_REPEAT_FACE = 7;
integer SET_REPEAT_METER = 8;
integer SET_ROTATION = 9;
integer SET_OFFSET = 10;
integer SET_MAPPING = 11;

integer GET_HELP = 200;

string DEF_RGB = "255,255,255";
string DEF_ALPHA = "1.0";
string DEF_BRIGHT = "0";
string DEF_SHINY = "0";
string DEF_LIGHT = "1.0,10.0,0.750";
string DEF_OFFSET = "0.0,0,0";
string DEF_ROTATE = "0";

string textureType = "floor";

list cmdNextChunk = [">>", "next", "Next", NEXT_MSG];
list cmdPrevChunk = ["<<", "prev", "Prev", PREV_MSG];
list cmdLsCur = ["ls", "list", LIST_MSG];
list cmdLsAll = ["la", "listall"];
list cmdSearch = ["/", "search"];
list cmdAlpha = ["a", "alpha"];
list cmdColor = ["c", "color"];
list cmdSetType = ["t", "type"];
list cmdBright = ["b", "bright"];
list cmdShiny = ["s", "shiny"];
list cmdLight = ["l", "light"];
list cmdOffset = ["o", "offset"];
list cmdHelp = ["h", "help", HELP_MSG];
list cmdRotate = ["r", "rotate"];

string newTexture;
string newDesc;

//-----------------------

reset_ts() {
llListen(chatChannel, "", "", "");
llListen(dialogChannel, "", "", "");
llSay(0, CHAT_HELP_MSG);
curTextureOffset = 0;
curTextureEnd = 5;
linenum = 0;
dialogActive = 0;
allTextures = [];
allTextureDesc = [];
totalTextures = 0;
curIdx = -1;
dispTextureStr = "";

integer i;
string curTexture;
key curKey;

totalTextures = llGetInventoryNumber(INVENTORY_TEXTURE);
//llWhisper(0, "num prims: " + (string)llGetNumberOfPrims());

//for (i = 1; i <= llGetNumberOfPrims(); i++) {
// llWhisper(0, "linked prim " + (string)i + " is " + llGetLinkName(i));
//}

for (i = 0; i < totalTextures; i++) {
curTexture = llGetInventoryName(INVENTORY_TEXTURE, i);
curKey = llGetInventoryKey(curTexture);
allTextureDesc += curTexture;
allTextures += curKey;
}
curIdx = 0;
dialogActive = 1;
}


curTextures() {
// theTextures = [PREV_MSG, LIST_MSG, NEXT_MSG];
theTextures = [PREV_MSG, HELP_MSG, NEXT_MSG];
integer i;
dispTextureStr = "";

for (i = curTextureOffset; i <= curTextureEnd; i++) {
if (curIdx == i) {
dispTextureStr += "*";
} else {
dispTextureStr += " ";
}
dispTextureStr += (string) (i + 1) + ") ";
dispTextureStr += llList2String(allTextureDesc, i);
dispTextureStr += "\n";
theTextures += (string)(i + 1);
}
}


doNextSet() {
curTextureOffset += textureChunk;
curTextureEnd = curTextureOffset + (textureChunk - 1);

if (curTextureOffset >= totalTextures) {
curTextureOffset = 0;
curTextureEnd = curTextureOffset + (textureChunk - 1);
}

if (curTextureEnd >= totalTextures) {
curTextureEnd = totalTextures - 1;
}
}


doPrevSet() {
if (curTextureOffset > 1 && ((curTextureOffset - textureChunk) < 1)) {
curTextureOffset = 0;
} else {
curTextureOffset -= textureChunk;
}

curTextureEnd = curTextureOffset + (textureChunk - 1);

if (curTextureEnd >= totalTextures) {
curTextureEnd = totalTextures - 1;
}

if (curTextureOffset < 0) {
curTextureEnd = totalTextures - 1;
curTextureOffset = totalTextures - (textureChunk - 1);
}
}


doListTextures(string mode) {
integer i;
integer startPos;
integer endPos;

if (mode == "a") {
startPos = 0;
endPos = totalTextures - 1;
} else {
startPos = curTextureOffset;
endPos = curTextureEnd;
}

for (i = startPos; i <= endPos; i++) {
string newTexture = llList2String(allTextures, i);
string newDesc = llList2String(allTextureDesc, i);
llSay(0, (string)(i + 1) + ": " + newDesc + " = " + newTexture);
}
}


doSearch(list theTerms) {
integer i;
string thePhrase = llToLower(llDumpList2String(theTerms, " "));
llSay(0, "the term is \"" + thePhrase + "\"");

for (i = 0; i < totalTextures; i++) {
string curString = llList2String(allTextureDesc, i);
if (llSubStringIndex(llToLower(curString), thePhrase) != -1) {
llSay(0, (string)(i + 1) + ": " + curString);
}
}
llSay(0, "done searching ...");
}

//-----------------------

default {
on_rez(integer start_param) {
reset_ts();
}


state_entry() {
reset_ts();
}

changed(integer change) {
if (change & CHANGED_INVENTORY) {
reset_ts();
}
}

touch_start(integer touchNumber) {
curTextures();

avKey = llDetectedKey(0);
llDialog(avKey, dispTextureStr, theTextures, dialogChannel);
}


link_message(integer sender_num, integer num, string str, key id)
{
// make this a constant..
if (num == 100) {
textureType = str;
}
}


listen(integer channel, string name, key id, string message) {
if (dialogActive == 0) {
llWhisper(0, " ... still loading textures...");
return;
}

avKey = id;

list words = llParseString2List(message, [" ", " ", "="], []);
list testFind = llList2List(words, 0, 0);

if (llListFindList(cmdNextChunk, testFind) != -1) {
doNextSet();
curTextures();
if (channel == chatChannel) {
doListTextures(CUR_SET);
} else {
llDialog(id, dispTextureStr, theTextures, dialogChannel);
}
return;
}

else if (llListFindList(cmdPrevChunk, testFind) != -1) {
doPrevSet();
curTextures();
if (channel == chatChannel) {
doListTextures(CUR_SET);
} else {
llDialog(id, dispTextureStr, theTextures, dialogChannel);
}
return;
}

else if (llListFindList(cmdSearch, testFind) != -1) {
doSearch(llList2List(words, 1, -1));
return;
}

else if (llListFindList(cmdHelp, testFind) != -1) {
llMessageLinked(LINK_THIS, GET_HELP, "", "");
return;
}

else if (llListFindList(cmdSetType, testFind) != -1) {
if (llGetListLength(words) > 1) {
textureType = llList2String(words, 1);
}
return;
}

else if (llListFindList(cmdAlpha, testFind) != -1) {
string alphaStr;
if (llGetListLength(words) > 1) {
alphaStr = llList2String(words, 1);
} else {
alphaStr = DEF_ALPHA;
}
llMessageLinked(LINK_SET, SET_ALPHA, alphaStr, (key)textureType);
return;
}


else if (llListFindList(cmdRotate, testFind) != -1) {
string rotateStr;
if (llGetListLength(words) > 1) {
rotateStr = llList2String(words, 1);
} else {
rotateStr = DEF_ROTATE;
}
llMessageLinked(LINK_SET, SET_ROTATION, rotateStr, (key)textureType);
return;
}

else if (llListFindList(cmdLight, testFind) != -1) {
string lightStr;
if (llGetListLength(words) > 1) {
string testArg = llList2String(words, 1);
if (testArg == "1") {
lightStr = DEF_LIGHT;
} else {
lightStr = testArg;
}
} else {
lightStr = "0";
}

if (llGetListLength(words) > 2) {
lightStr += " " + llList2String(words, 2);
} else {
if (lightStr != "0") {
lightStr += " " + DEF_RGB;
}
}

llMessageLinked(LINK_SET, SET_LIGHT, lightStr, (key)textureType);
return;
}

else if (llListFindList(cmdBright, testFind) != -1) {
string brightStr;
if (llGetListLength(words) > 1) {
brightStr = llList2String(words, 1);
} else {
brightStr = DEF_BRIGHT;
}
llMessageLinked(LINK_SET, SET_BRIGHT, brightStr, (key)textureType);
return;
}

else if (llListFindList(cmdOffset, testFind) != -1) {
string offsetStr;
if (llGetListLength(words) > 1) {
offsetStr = llList2String(words, 1);
} else {
offsetStr = DEF_OFFSET;
}
llMessageLinked(LINK_SET, SET_OFFSET, offsetStr, (key)textureType);
return;
}

else if (llListFindList(cmdShiny, testFind) != -1) {
string shinyStr;
if (llGetListLength(words) > 1) {
shinyStr = llList2String(words, 1);
} else {
shinyStr = DEF_SHINY;
}
llMessageLinked(LINK_SET, SET_SHINY, shinyStr, (key)textureType);
return;
}

else if (llListFindList(cmdColor, testFind) != -1) {
string rgbStr;
if (llGetListLength(words) > 1) {
rgbStr = llList2String(words, 1);
} else {
rgbStr = DEF_RGB;
}
llMessageLinked(LINK_SET, SET_COLOR, rgbStr, (key)textureType);
return;
}

else if (llListFindList(cmdLsAll, testFind) != -1) {
doListTextures(ALL_SET);
return;
}


else if (llListFindList(cmdLsCur, testFind) != -1) {
doListTextures(CUR_SET);
return;
}


else if ((integer)message > 0 && (integer)message < 256) {
curIdx = (integer)message - 1;

string newTexture = llList2String(allTextures, curIdx);
string newDesc = llList2String(allTextureDesc, curIdx);

llWhisper(0, "for " + textureType + "- #" + (string)message + ": " + newDesc);
llMessageLinked(LINK_ALL_OTHERS, 1, newTexture, (key)textureType);
return;
}

else if (message != "") {
doSearch(words);
return;
}
}
}



-- _Receiver 1.0b19: (children)

CODE

// -- Bucky's Texture Changer 1.0b19
// Bucky.Barkley@gmail.com - August 2006
//
// receiver component

// sample prim names:
// wall
// interiorwall+halfwall
// floor=0,1
// wall=1,2,3+window=4,5,6
string myName;
string myType;

list myTypes = [];
list allFaceInfo = [];

integer SET_TEXTURE = 1;
integer SET_ALPHA = 2;
integer SET_COLOR = 3;
integer SET_SHINY = 4;
integer SET_BRIGHT = 5;
integer SET_LIGHT = 6;
integer SET_REPEAT_FACE = 7;
integer SET_REPEAT_METER = 8;
integer SET_ROTATION = 9;
integer SET_OFFSET = 10;
integer SET_MAPPING = 11;

float DEF_INTENSITY = 1.0;
float DEF_RADIUS = 10.0;
float DEF_FALLOFF = 0.75;

default
{
state_entry() {
integer curPart;
integer numParts;
string curStr;
string curFaces;

myName = llGetObjectName();

list allParts = llParseString2List(myName, ["+"], []);
numParts = llGetListLength(allParts);

for (curPart = 0; curPart < numParts; curPart++) {
curStr = llList2String(allParts, curPart);
list myOpts = llParseString2List(curStr, ["="], []);

myTypes += llList2List(myOpts, 0, 0);
if (llGetListLength(myOpts) > 1) {
allFaceInfo += llList2List(myOpts, 1, 1);
} else {
allFaceInfo += [ALL_SIDES];
}
}

list words = llParseString2List(myName, [" ", "_", "-", "="], []);
}


link_message(integer sender_num, integer num, string str, key id)
{
list Lid = [(string)id];


if (num == SET_ALPHA) {
integer curFace;
integer whichType = llListFindList(myTypes, Lid);

if (whichType == -1) {
return;
}

list curFaceInfo = llList2List(allFaceInfo, whichType, whichType);
if (llList2Integer(curFaceInfo, 0) == ALL_SIDES) {
llSetAlpha((float)str, ALL_SIDES);
} else {
list updateFaces = llParseString2List((string)curFaceInfo, [","], []);
integer numFaces = llGetListLength(updateFaces);

for (curFace = 0; curFace < numFaces; curFace++) {
llSetAlpha((float)str, curFace);
}
}
return;
}

if (num == SET_ROTATION) {
integer curFace;
integer whichType = llListFindList(myTypes, Lid);

if (whichType == -1) {
return;
}

float rotAngle = (float)str * DEG_TO_RAD;

list curFaceInfo = llList2List(allFaceInfo, whichType, whichType);
if (llList2Integer(curFaceInfo, 0) == ALL_SIDES) {
llRotateTexture(rotAngle, ALL_SIDES);
} else {
list updateFaces = llParseString2List((string)curFaceInfo, [","], []);
integer numFaces = llGetListLength(updateFaces);

for (curFace = 0; curFace < numFaces; curFace++) {
llRotateTexture(rotAngle, curFace);
}
}
return;
}


if (num == SET_OFFSET) {
integer curFace;
integer whichType = llListFindList(myTypes, Lid);

if (whichType == -1) {
return;
}

list offsetList = llParseString2List(str, [","], []);

if (llGetListLength(offsetList) == 2) {
float horz = llList2Float(offsetList, 0);
float vert = llList2Float(offsetList, 1);
list curFaceInfo = llList2List(allFaceInfo, whichType, whichType);

if (llList2Integer(curFaceInfo, 0) == ALL_SIDES) {
llOffsetTexture(horz, vert, ALL_SIDES);
} else {
list updateFaces = llParseString2List((string)curFaceInfo, [","], []);
integer numFaces = llGetListLength(updateFaces);

for (curFace = 0; curFace < numFaces; curFace++) {
llOffsetTexture(horz, vert, curFace);
}
}
}
return;
}

if (num == SET_BRIGHT) {
integer curFace;
integer whichType = llListFindList(myTypes, Lid);
integer myBright;

if (whichType == -1) {
return;
}

if ((integer)str > 0) {
myBright = TRUE;
} else {
myBright = FALSE;
}

list curFaceInfo = llList2List(allFaceInfo, whichType, whichType);
if (llList2Integer(curFaceInfo, 0) == ALL_SIDES) {
llSetPrimitiveParams([PRIM_FULLBRIGHT, ALL_SIDES, myBright]);
} else {
list updateFaces = llParseString2List((string)curFaceInfo, [","], []);
integer numFaces = llGetListLength(updateFaces);

for (curFace = 0; curFace < numFaces; curFace++) {
llSetPrimitiveParams([PRIM_FULLBRIGHT, curFace, myBright]);
}
}
return;
}


if (num == SET_SHINY) {
integer curFace;
integer whichType = llListFindList(myTypes, Lid);
integer myShiny;

if (whichType == -1) {
return;
}

myShiny = (integer)str;

list curFaceInfo = llList2List(allFaceInfo, whichType, whichType);
if (llList2Integer(curFaceInfo, 0) == ALL_SIDES) {
llSetPrimitiveParams([PRIM_BUMP_SHINY, ALL_SIDES, myShiny, PRIM_BUMP_NONE]);
} else {
list updateFaces = llParseString2List((string)curFaceInfo, [","], []);
integer numFaces = llGetListLength(updateFaces);

for (curFace = 0; curFace < numFaces; curFace++) {
llSetPrimitiveParams([PRIM_BUMP_SHINY, curFace, myShiny,
PRIM_BUMP_NONE]);
}
}
return;
}

if (num == SET_TEXTURE) {
integer curFace;
integer whichType = llListFindList(myTypes, Lid);

if (whichType == -1) {
return;
}

list curFaceInfo = llList2List(allFaceInfo, whichType, whichType);

if (llList2Integer(curFaceInfo, 0) == ALL_SIDES) {
llSetPrimitiveParams([PRIM_TEXTURE, ALL_SIDES, str,
<1, 1, 0>, <0, 0, 0>, 0.0]);
} else {
list updateFaces = llParseString2List((string)curFaceInfo, [","], []);
integer numFaces = llGetListLength(updateFaces);

for (curFace = 0; curFace < numFaces; curFace++) {
llSetTexture(str, curFace);
}
}
return;
}

if (num == SET_LIGHT) {
integer curFace;
integer whichType = llListFindList(myTypes, Lid);
integer onOff = TRUE;
vector myColor;
vector RGB = <0,0,0>;
float intensity = DEF_INTENSITY;
float radius = DEF_RADIUS;
float falloff = DEF_FALLOFF;

if (whichType == -1) {
return;
}

if (str == "0") {
onOff = FALSE;
} else {
// maybe we have some values to play with?
list theArgs = llParseString2List((string)str, [" "], []);
integer numArgs = llGetListLength(theArgs);

if (numArgs > 0) {
string irfStr = llList2String(theArgs, 0);
string colorStr = llList2String(theArgs, 1);

list intenseRadFall = llParseString2List(irfStr, [","], []);
list colorList = llParseString2List(colorStr, [","], []);

if (llGetListLength(intenseRadFall) == 3) {
intensity = llList2Float(intenseRadFall, 0);
radius = llList2Float(intenseRadFall, 1);
falloff = llList2Float(intenseRadFall, 2);
}

if (llGetListLength(colorList) == 3) {
RGB.x = llList2Integer(colorList, 0);
RGB.y = llList2Integer(colorList, 1);
RGB.z = llList2Integer(colorList, 2);
}
myColor = RGB / 255;
}
}

llSetPrimitiveParams([PRIM_POINT_LIGHT, onOff, myColor,
intensity, radius, falloff]);


return;
}

// this expects str to be r,g,b - example 0,128,0
if (num == SET_COLOR) {
vector myColor;
integer curFace;
integer whichType = llListFindList(myTypes, Lid);

if (whichType == -1) {
return;
}

list curFaceInfo = llList2List(allFaceInfo, whichType, whichType);

vector RGB = <0,0,0>;

list allColor = llParseString2List(str, [","], []);
if (llGetListLength(allColor) == 3) {
RGB.x = llList2Integer(allColor, 0);
RGB.y = llList2Integer(allColor, 1);
RGB.z = llList2Integer(allColor, 2);
}

myColor = RGB / 255;

if (llList2Integer(curFaceInfo, 0) == ALL_SIDES) {
llSetColor(myColor, ALL_SIDES);
} else {
list updateFaces = llParseString2List((string)curFaceInfo, [","], []);
integer numFaces = llGetListLength(updateFaces);

for (curFace = 0; curFace < numFaces; curFace++) {
llSetColor(myColor, curFace);
}
}
return;
}
}


touch_start(integer touchNumber) {
string curStr = llList2String(myTypes, 0);

llSay(0, curStr);
llMessageLinked(LINK_ROOT, 100, curStr, "");
}
}




-- _Help: (root)

CODE

integer GET_HELP = 200;


default
{
state_entry()
{}

link_message(integer sender_num, integer num, string str, key id)
{
if (num == GET_HELP) {
llWhisper(0, "THE HELP COMMAND ...");
llGiveInventory(llGetOwner(), llGetInventoryName(INVENTORY_NOTECARD, 0));
}
}
}




-- _0_TextureChooserHelp 1.0b19: (root)

CODE

btc 1.0b19 - Help for Bucky's Texture Chooser

The chooser lets you change textures for an entire type of surface
at once. The basic idea is: click on a surface, then click on the controller
and pick a texture. In the demo object, the controller is a tube object
in the left corner. It will bring up a dialog. You can also give chat
commands.

This help covers: Dialog, Chat Commands, Prim Names & Linking, Multiple
Types, and Textures in Inventory

Dialog

* Pick the number that corresponds with the texture you want
* Use the "<< Prev" and "Next >>" buttons to flip to different pages
of textures (6 at a time)
* The "Help" button brings up this notecard

Chat

As distributed, the chooser listens to chat commands on channel 45.

Two of the most useful: applying a texture, and searching.

Sample: apply texture #12 - "/45 12"
Sample: search for "stone" - "/45 stone"

More Sample Commands

These apply to the currently selected type of texture (floor, window, etc.)

type /45 t floor # set current type to "floor"

alpha /45 a .4 # (.0 - 1)

color /45 c # clear color
/45 c 255,0,0 # set to red .. order is R,G,B

brightness /45 b 1 # turn brightness on
/45 b 0 # turn brighness off

shiny /45 s 0 # turn shininess off
/45 s 1 # shiny low
/45 s 2 # shiny medium
/45 s 3 # shiny high

lighting /45 l 0 # lighting off
/45 l 1 # lighting on (default vals)
/45 l 1.0,5.0,0.3 # lighting - intensity, radius, falloff
/45 l 1.0,5.0,0.3 255,0,0 # "" "" with red light

intensity range: 0.0 - 1.0
radius range: 0.0 - 20.0
falloff range: 0.0 - 2.0

offset /45 o .4,.4 # offset, horz & vert

offset range: -1.0 - 1.0

rotation /45 r 33 # rotate

rotation range: -180 - 180


All Chat Commands (for reference):

">>", "next"
"<<", "prev"
"ls", "list"
"la", "listall"
"/", "search"
"a", "alpha"
"c", "color"
"t", "type"
"b", "bright"
"s", "shiny"
"l", "light"
"o", "offset"
"h", "help"
"r", "rotate"

Prim Names & Linking

When creating prims, use the name field in the edit dialog consistently. Good examples
of names:

* floor, floorA, floorB, halfwall, wall, upperwall, intwindow, extwall

Each prim that belongs to a given type should be named exactly the same.
Do not expect "FLOORa" and "floorA" to work.

The receiver script is placed in the the content (inventory) section for each
prim you wish to apply textures to. The controller script is placed in the
prim that contains your controller. When linking the object, make the
controller the root prim.

See the demo (as distributed) for the example.

Multiple Types

Now that I have explained the basic form of prim naming, there are
two other exciting variations that give you a lot more control.

A prim can respond to multiple types. Use the '+' sign to separate the
types in the name:

example: wall+halfwall

This sets up a prim that changes whenever "wall" or "halfwall" is updated.

Note: you will need to use the chat command "type" (or "t") to set the current
type sometimes. There is not a reliable way to detect which face a user has
clicked on. Example: I click on a "wall", but I want it to be known as a "halfwall".
I would enter "/45 t halfwall"

Prim Faces

To extend the capabilities even further, you can define which faces of a prim
belong to a given type.

Example: wall=0,1,2 - a prim that is a "wall" on faces 0, 1, and 2

Example: window=0,1,2+extwall=3,4,5 - a prim that is a window on faces
0, 1, and 2, and an exterior wall on faces 3, 4, and 5.

You can also overlap prim faces: floorA=0,1,2,3,4+floorB=2,3,4,5

The general rule is "most recently specified type wins" when applying textures.

One effect of multiple prim names, and specifying faces per type, is that you
can handle interior windows and exterior walls with the same prim.

Some commands (notably lighting) will affect the entire prim.

Note that whenever you update the name of a prim, you will need to reset
the receiver script it contains.




-- _1_README: (root)

CODE

README file for btc 1.0b19 - Bucky's Texture Chooser
Bucky Barkley, August 2006

** Personal / Non-Commercial use only. Ask me for terms
for commercial and custom uses. **

-------
Welcome to the demo version of the chooser!

The texture chooser enables you to easily try out textures on an object.
A common scenario: updating a room with floors, walls, windows, and ceilings

The demo object consists of a variety of surfaces that can be updated, along
with some sample textures to try out. There is a controller in the left corner
(the tube shaped plywood thing). All of the prims in the object have a script
which listens for texture commands from the controller.

Get Started! Click on a surface. Click on the controller, and you will get a dialog.
Pick the number of the texture you want. That's it in a nutshell!

The dialog pages through textures (try the Prev and Next buttons). There
is extensive help available in the notecard. Try the Help button in the dialog.

At this time, most of the interesting bits of functionality are accessible
via chat commands. This includes things such as transparency, rotation,
offsets, and lighting.

As shipped, the textures are deliberately chosen to clash a bit. This is to
encourage experimentation!




Dont forget:

* add textures to the inventory of the controller/root prim
* name prims consistently
* reset all scripts after renaming or linking
Nada Epoch
The Librarian
Join date: 4 Nov 2002
Posts: 1,423
Discussion Thread
09-05-2006 07:28
/54/45/135021/1.html
_____________________
i've got nothing. ;)