Push All Scripts
This commit is contained in:
3
Texture Organizer/Texture Organizer.sol
Normal file
3
Texture Organizer/Texture Organizer.sol
Normal file
@@ -0,0 +1,3 @@
|
||||
<Solution name="Texture Organizer">
|
||||
<Project name="Texture Organizer" path="Texture Organizer\Texture Organizer.prj" active="true"/>
|
||||
</Solution>
|
||||
824
Texture Organizer/Texture Organizer/Object/Main Script.lsl
Normal file
824
Texture Organizer/Texture Organizer/Object/Main Script.lsl
Normal file
@@ -0,0 +1,824 @@
|
||||
// :CATEGORY:Texture Organizer
|
||||
// :NAME:Texture Organizer
|
||||
// :AUTHOR:Solo Mornington
|
||||
// :CREATED:2013-09-06
|
||||
// :EDITED:2013-09-18 15:39:06
|
||||
// :ID:876
|
||||
// :NUM:1236
|
||||
// :REV:1.0
|
||||
// :WORLD:Second Life, OpenSim
|
||||
// :DESCRIPTION:
|
||||
// You basically lay out 22 box prims and link them.// Then you put the textures in it and install the script,// and you have an instant low-lag 20-pane texture organizer.// It has texture mode and sculpty mode, it checks for perms and// advises how many textures were not loaded due to perms issues// so you can deal with them, it assigns access to all, owner, or group,// and it can display sculpties.
|
||||
// :CODE:
|
||||
|
||||
// Texture Organizer
|
||||
// by
|
||||
// Solo Mornington
|
||||
|
||||
// THIS NOTICE MUST REMAIN INTACT:
|
||||
// Copyright 2011, Solo Mornington
|
||||
// License: Use freely in any way you want. Modified versions
|
||||
// may be used in any way. No credit or acknowledgement required.
|
||||
// Definitive source and updates available here:
|
||||
// https://github.com/SoloMornington/TextureOrganizer
|
||||
// ** end notice
|
||||
|
||||
|
||||
// Assumes the object has 22 prims: base, max 20 images, closebox.
|
||||
|
||||
// constant for which prim is the base.
|
||||
integer BUTTON_PRIM = 1;
|
||||
// These are constants for the controls on the faces of the base
|
||||
integer BUTTON_CONFIG = 4;
|
||||
integer BUTTON_NEXT = 7;
|
||||
integer BUTTON_PREV = 6;
|
||||
|
||||
// Constants for gSecurityMode.
|
||||
integer SECURITY_ALL = 1;
|
||||
integer SECURITY_GROUP = 2;
|
||||
integer SECURITY_OWNER = 3;
|
||||
// Which security mode are we in?
|
||||
integer gSecurityMode = 2;
|
||||
|
||||
integer gSculptMode = FALSE; // if this is true, show all textures as sculpties.
|
||||
|
||||
integer gFirstTextureIndex = 0; // The first texture for the current page of textures being browsed.
|
||||
|
||||
integer gZoomTextureIndex = -1; // index of zoomed texture
|
||||
integer gZoomTexturePrimIndex = -1; // which prim has this texture on it?
|
||||
|
||||
list gTilePositions; // pre-calculated list of tile positions
|
||||
float gCubeSize = 0.5;
|
||||
float gTileMargin = 0.1; // fraction of cube size
|
||||
integer gRows = 5;
|
||||
integer gColumns = 4;
|
||||
float gMargin = 0.1; // margin is calculated as fraction of cube size
|
||||
|
||||
// The base/root prim
|
||||
list gBase = [
|
||||
PRIM_TYPE, PRIM_TYPE_TUBE, PRIM_HOLE_DEFAULT,
|
||||
<0.0, 0.5, 0.0>, // cut
|
||||
0.35, //hollow
|
||||
ZERO_VECTOR, // twist
|
||||
<1.0, 0.1, 0.0>, // hole size
|
||||
ZERO_VECTOR, // top shear
|
||||
<0.25, 1.0, 0.0>, // profile cut
|
||||
ZERO_VECTOR, // taper
|
||||
1.0, // revolutions
|
||||
0.0, // offset
|
||||
0.0, // skew
|
||||
PRIM_SIZE, <2.5, 0.5, 0.5>,
|
||||
// blank textures for all sides
|
||||
PRIM_TEXTURE, ALL_SIDES, TEXTURE_BLANK, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0,
|
||||
PRIM_FULLBRIGHT, ALL_SIDES, 0,
|
||||
PRIM_COLOR, ALL_SIDES, <1.0, 1.0, 1.0>, 1.0,
|
||||
// control textures for the control faces
|
||||
PRIM_TEXTURE, 6, "b6fd4e55-6120-abb5-af43-aa1f223dd4fd", <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0,
|
||||
PRIM_TEXTURE, 7, "b6fd4e55-6120-abb5-af43-aa1f223dd4fd", <-1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0,
|
||||
PRIM_TEXTURE, 4, "b6fd4e55-6120-abb5-af43-aa1f223dd4fd", <5.0, 1.0, 0.0>, <0.150, -0.5, 0.0>, 0.0
|
||||
];
|
||||
|
||||
// A default cube....
|
||||
list gCube = [PRIM_TYPE, PRIM_TYPE_BOX, PRIM_HOLE_DEFAULT,
|
||||
<0.0, 1.0, 0.0>, // cut
|
||||
0.0, //hollow
|
||||
ZERO_VECTOR, // twist
|
||||
<1.0, 1.0, 0.0>, // top size/taper
|
||||
ZERO_VECTOR, // top shear
|
||||
// we add size per application....
|
||||
PRIM_ROT_LOCAL, ZERO_ROTATION,
|
||||
//PRIM_ROT_LOCAL, <0.707107, -0.000000, -0.000000, 0.707107>,
|
||||
PRIM_TEXTURE, ALL_SIDES, TEXTURE_BLANK, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0,
|
||||
PRIM_FULLBRIGHT, ALL_SIDES, 0,
|
||||
PRIM_COLOR, ALL_SIDES, <0.5, 0.5, 0.5>, 1.0
|
||||
];
|
||||
|
||||
// constants for the close button
|
||||
list gCloseButton = [PRIM_TYPE, PRIM_TYPE_CYLINDER, PRIM_HOLE_DEFAULT,
|
||||
<0.0, 1.0, 0.0>, // cut
|
||||
0.0, //hollow
|
||||
ZERO_VECTOR, // twist
|
||||
<1.0, 1.0, 0.0>, // top size/taper
|
||||
ZERO_VECTOR, // top shear
|
||||
// we add size per application....
|
||||
//PRIM_ROT_LOCAL, ZERO_ROTATION,
|
||||
PRIM_ROT_LOCAL, <0.707107, -0.000000, -0.000000, 0.707107>,
|
||||
PRIM_TEXTURE, ALL_SIDES, TEXTURE_BLANK, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0,
|
||||
PRIM_FULLBRIGHT, ALL_SIDES, 0,
|
||||
PRIM_COLOR, ALL_SIDES, <0.5, 0.5, 0.5>, 1.0,
|
||||
PRIM_TEXTURE, 0, "b6fd4e55-6120-abb5-af43-aa1f223dd4fd", <0.5, 0.5, 0.0>, <0.25, 0.25, 0.0>, 0.0,
|
||||
PRIM_FULLBRIGHT, 0, 1,
|
||||
PRIM_COLOR, 0, <1, 1, 1>, 1.0,
|
||||
PRIM_TEXTURE, 2, "b6fd4e55-6120-abb5-af43-aa1f223dd4fd", <0.5, 0.5, 0.0>, <0.25, 0.25, 0.0>, 0.0,
|
||||
PRIM_FULLBRIGHT, 2, 1,
|
||||
PRIM_COLOR, 2, <1, 1, 1>, 1.0
|
||||
];
|
||||
|
||||
list gTextures; // all the textures we can display
|
||||
|
||||
list gHiddenPrims; // list of prims that are already hidden. add to this when you hide one.
|
||||
|
||||
// PRIMS IN SPACE!!!
|
||||
|
||||
// This will all be refactored.
|
||||
|
||||
vector gOrigin = ZERO_VECTOR; // top-left coordinate
|
||||
|
||||
key gConfigOperator; // Who clicked on the config button? state config needs this.
|
||||
integer gConfigSculptModePrim; // which prim is the sculpt mode button?
|
||||
integer gConfigGiveAllPrim; // which prim is the give all button?
|
||||
integer gConfigSecurityOwnerPrim;
|
||||
integer gConfigSecurityGroupPrim;
|
||||
integer gConfigSecurityAllPrim;
|
||||
|
||||
// the textures we like.
|
||||
string gModeTexture = "c6ece822-b257-9dbd-a583-1111ca9cb728"; // sculpty/texture mode/give all
|
||||
string gSecurityTexture = "842a2cb2-fd8f-d456-3b30-bbb762f2028f"; // owner/group/all
|
||||
|
||||
// how long should we show the config menu before timing-out
|
||||
// to browse mode?
|
||||
float gConfigTimeout = 360.0; // five minutes long enough?
|
||||
|
||||
repositionPrims()
|
||||
{
|
||||
// This function makes sure that there are enough
|
||||
// tile prims positioned for browsing.
|
||||
// Gathers tile positions from gTilePositions.
|
||||
// In order to prevent unneccesary lag, it will avoid
|
||||
// repositioning prims that are already positioned.
|
||||
// This assumes that non-hidden prims are already in position,
|
||||
// so if you never called zeroAllPrimsExcept(), this function
|
||||
// won't do much.
|
||||
list hiddenPrims;
|
||||
integer row;
|
||||
integer column;
|
||||
integer link = 2; // start at the first child prim
|
||||
integer linked = llGetObjectPrimCount(llGetKey());
|
||||
float cubeDivisor = 5.0;
|
||||
if (gSculptMode) cubeDivisor = 2.0;
|
||||
for (row=0; row < gRows; ++row)
|
||||
{
|
||||
for (column=0; column < gColumns; ++column)
|
||||
{
|
||||
// if this prim is hidden, we need to un-hide it.
|
||||
// but if it's not, we don't need to do anything.
|
||||
if (llListFindList(gHiddenPrims, [link]) > -1)
|
||||
{
|
||||
vector newPos = llList2Vector(gTilePositions, link - 2);
|
||||
llSetLinkPrimitiveParamsFast(link,
|
||||
gCube +
|
||||
[PRIM_POSITION, newPos,
|
||||
PRIM_SIZE, <gCubeSize, gCubeSize/cubeDivisor, gCubeSize>
|
||||
]);
|
||||
}
|
||||
++link;
|
||||
}
|
||||
}
|
||||
// hide any extra prims....
|
||||
while(link <= linked)
|
||||
{
|
||||
if (llListFindList(gHiddenPrims, [link]) <= -1)
|
||||
{
|
||||
llSetLinkPrimitiveParamsFast(link,
|
||||
gCube + [PRIM_POSITION, ZERO_VECTOR, PRIM_SIZE, ZERO_VECTOR]);
|
||||
}
|
||||
hiddenPrims += [link];
|
||||
++link;
|
||||
}
|
||||
// update the global list of hidden prims with our new one
|
||||
gHiddenPrims = hiddenPrims;
|
||||
}
|
||||
|
||||
calculateTilePositions()
|
||||
{
|
||||
// fill gTilePositions with precalculated positions
|
||||
// so that we can just loop through them to put the
|
||||
// tiles in place.
|
||||
gTilePositions = [];
|
||||
integer row;
|
||||
integer column;
|
||||
float halfCube = gCubeSize / 2.0;
|
||||
for (row=0; row < gRows; ++row)
|
||||
{
|
||||
for (column=0; column < gColumns; ++column)
|
||||
{
|
||||
vector newPos = <
|
||||
gOrigin.x + gMargin + halfCube + ((float)column) * (gCubeSize + gMargin), // x
|
||||
gOrigin.y, // y
|
||||
gOrigin.z + gMargin + halfCube + (((float)row) * (gCubeSize + gMargin)) //z
|
||||
>;
|
||||
gTilePositions += [newPos];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gatherTextures()
|
||||
{
|
||||
// clear the list...
|
||||
gTextures = [];
|
||||
// loop through all the textures,
|
||||
// see if they have proper perms
|
||||
// add them to the list if they do.
|
||||
integer PERM_COPYTRANS = (PERM_COPY | PERM_TRANSFER);
|
||||
string textureName;
|
||||
integer ownerPerms;
|
||||
integer count = llGetInventoryNumber(INVENTORY_TEXTURE);
|
||||
integer i;
|
||||
for (i=0; i<count; ++i)
|
||||
{
|
||||
textureName = llGetInventoryName(INVENTORY_TEXTURE, i);
|
||||
ownerPerms = llGetInventoryPermMask(textureName, MASK_OWNER);
|
||||
if ((ownerPerms & PERM_COPYTRANS) == PERM_COPYTRANS)
|
||||
{
|
||||
gTextures += [textureName];
|
||||
}
|
||||
}
|
||||
// compare inventory count to list count. this will tell us
|
||||
// if there are any textures that didn't pass muster
|
||||
// and we can tell the user.
|
||||
if (llGetListLength(gTextures) != count)
|
||||
{
|
||||
llSay(0,"Some textures in this organizer have restrictive permissions and will not be displayed.");
|
||||
}
|
||||
}
|
||||
|
||||
showTextures()
|
||||
{
|
||||
// display the textures
|
||||
// one per prim, face 1.
|
||||
// We assume that there are 20 textures max, and that the first child prim
|
||||
// is the first texture prim.
|
||||
if (gSculptMode)
|
||||
{
|
||||
showSculpts();
|
||||
return;
|
||||
}
|
||||
list blankParams = [PRIM_TEXTURE, ALL_SIDES, TEXTURE_BLANK, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0];
|
||||
list params; // primitive params
|
||||
integer texturesRemaining =
|
||||
llGetListLength(gTextures) - gFirstTextureIndex;
|
||||
integer i;
|
||||
integer numTextures = gRows * gColumns;
|
||||
for (i=0; i<numTextures; ++i)
|
||||
{
|
||||
integer linkNum = i+2;
|
||||
if (texturesRemaining <= i)
|
||||
{
|
||||
params = gCube + blankParams + [PRIM_POSITION, ZERO_VECTOR, PRIM_SIZE, ZERO_VECTOR];
|
||||
gHiddenPrims += [linkNum];
|
||||
}
|
||||
else
|
||||
{
|
||||
string textureName = llList2String(gTextures, i+gFirstTextureIndex);
|
||||
params = blankParams + [
|
||||
PRIM_TEXTURE, 1, textureName, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0,
|
||||
PRIM_TEXTURE, 3, textureName, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0,
|
||||
PRIM_COLOR, 1, <1.0, 1.0, 1.0>, 1.0,
|
||||
PRIM_COLOR, 3, <1.0, 1.0, 1.0>, 1.0,
|
||||
PRIM_FULLBRIGHT, 1, 1,
|
||||
PRIM_FULLBRIGHT, 3, 1
|
||||
];
|
||||
}
|
||||
llSetLinkPrimitiveParamsFast(linkNum, params);
|
||||
}
|
||||
}
|
||||
|
||||
showSculpts()
|
||||
{
|
||||
list blankParams = [PRIM_TEXTURE, ALL_SIDES, TEXTURE_BLANK, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0];
|
||||
list params; // primitive params
|
||||
integer texturesRemaining =
|
||||
llGetListLength(gTextures) - gFirstTextureIndex;
|
||||
integer i;
|
||||
for (i=0; i<20; ++i)
|
||||
{
|
||||
integer linkNum = i+2;
|
||||
if (texturesRemaining <= i)
|
||||
{
|
||||
params = gCube + blankParams + [PRIM_POSITION, ZERO_VECTOR, PRIM_SIZE, ZERO_VECTOR];
|
||||
gHiddenPrims += [linkNum];
|
||||
}
|
||||
else
|
||||
{
|
||||
string textureName = llList2String(gTextures, i+gFirstTextureIndex);
|
||||
params = blankParams + [
|
||||
PRIM_TYPE, PRIM_TYPE_SCULPT,
|
||||
textureName, PRIM_SCULPT_TYPE_SPHERE,
|
||||
PRIM_TEXTURE, ALL_SIDES, TEXTURE_BLANK, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0,
|
||||
PRIM_COLOR, ALL_SIDES, <0.5, 0.5, 0.5>, 1.0,
|
||||
PRIM_FULLBRIGHT, ALL_SIDES, FALSE
|
||||
];
|
||||
}
|
||||
llSetLinkPrimitiveParamsFast(linkNum, params);
|
||||
}
|
||||
}
|
||||
|
||||
//featureTexture(integer primLink)
|
||||
//{
|
||||
// prominently display gZoomTextureIndex if it's not -1
|
||||
// if (gZoomTextureIndex > -1)
|
||||
//{
|
||||
// llOwnerSay(llList2String(gTextures, gZoomTextureIndex));
|
||||
//}
|
||||
//}
|
||||
|
||||
setupTileGeometry()
|
||||
{
|
||||
// how many rows and columns?
|
||||
integer textureCount = llGetListLength(gTextures);
|
||||
if (textureCount < 1)
|
||||
{
|
||||
// there are no textures, so return.
|
||||
gColumns = 0;
|
||||
gRows = 0;
|
||||
return;
|
||||
}
|
||||
gColumns = llCeil(llSqrt(textureCount));
|
||||
// no more than 4 columns.
|
||||
if (gColumns > 4) gColumns = 4;
|
||||
// convert and store because we use it a few times
|
||||
float columns = (float)gColumns;
|
||||
// how many rows needed for this many columns?
|
||||
gRows = llCeil((float)textureCount / columns);
|
||||
// no more than 5 rows.
|
||||
if (gRows > 5) gRows = 5;
|
||||
// how big is the base?
|
||||
list params = llGetLinkPrimitiveParams(LINK_ROOT, [PRIM_SIZE]);
|
||||
vector baseSize = llList2Vector(params,0);
|
||||
float marginsPerTile = 1.0 / gTileMargin;
|
||||
// common denominator....
|
||||
float marginsPerDisplay = (marginsPerTile * columns) + columns + 1.0;
|
||||
gMargin = baseSize.x / marginsPerDisplay;
|
||||
gCubeSize = gMargin * marginsPerTile;
|
||||
|
||||
gTilePositions = [];
|
||||
|
||||
// setup gOrigin
|
||||
gOrigin.x = 0.0 - (baseSize.x / 2.0);
|
||||
gOrigin.y = 0.0;
|
||||
gOrigin.z = baseSize.z;
|
||||
}
|
||||
|
||||
integer security(key avatar)
|
||||
{
|
||||
// given an avatar, figure out if they pass the security set
|
||||
// for the object in preferences
|
||||
if (gSecurityMode == SECURITY_ALL) return TRUE;
|
||||
if (gSecurityMode == SECURITY_GROUP) return llSameGroup(avatar);
|
||||
if (gSecurityMode == SECURITY_OWNER) return (avatar == llGetOwner());
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
base_browsePrevNext()
|
||||
{
|
||||
// show if there are prev or next buttons available
|
||||
vector nextColor = <0.0, 0.0, 0.0>;
|
||||
vector prevColor = <0.0, 0.0, 0.0>;
|
||||
if (gFirstTextureIndex > 0) prevColor = <1.0, 1.0, 1.0>;
|
||||
if (llGetListLength(gTextures) > gFirstTextureIndex + (gRows * gColumns)) nextColor = <1.0, 1.0, 1.0>;
|
||||
llSetLinkPrimitiveParamsFast(LINK_ROOT, [PRIM_COLOR, 7, nextColor, 1.0,
|
||||
PRIM_COLOR, 6, prevColor, 1.0]);
|
||||
}
|
||||
|
||||
base_noPrevNext()
|
||||
{
|
||||
// hide both prev and next buttons
|
||||
vector nextColor = <0.0, 0.0, 0.0>;
|
||||
vector prevColor = <0.0, 0.0, 0.0>;
|
||||
llSetLinkPrimitiveParamsFast(LINK_ROOT, [PRIM_COLOR, 7, nextColor, 1.0,
|
||||
PRIM_COLOR, 6, prevColor, 1.0]);
|
||||
}
|
||||
|
||||
integer base_processTouch(integer face)
|
||||
{
|
||||
// given that the user has touched the base prim, we need to figure
|
||||
// out what control they hit.
|
||||
// This is factored out so we can change it easily if we need to.
|
||||
if (face == BUTTON_CONFIG) return BUTTON_CONFIG;
|
||||
if (face == BUTTON_PREV) return BUTTON_PREV;
|
||||
if (face == BUTTON_NEXT) return BUTTON_NEXT;
|
||||
return 0; // no-op
|
||||
}
|
||||
|
||||
zeroAllPrimsExcept(integer exception)
|
||||
{
|
||||
// put all non-root prims into a zeroed state, at ZERO_VECTOR and as small as possible
|
||||
// leave the textures/sculpts, so they don't have to reload.
|
||||
// ...Except of course the given exception link number. :-)
|
||||
// Also, keep track of which prims are hidden (zeroed) in gHiddenPrims.
|
||||
integer i;
|
||||
integer count = llGetObjectPrimCount(llGetKey());
|
||||
gHiddenPrims = [];
|
||||
for (i=2; i<count; ++i)
|
||||
{
|
||||
if (i != exception)
|
||||
{
|
||||
llSetLinkPrimitiveParamsFast(i,
|
||||
[PRIM_POSITION, ZERO_VECTOR, PRIM_SIZE, ZERO_VECTOR]);
|
||||
gHiddenPrims += [i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
reportSculptMode(key avatar)
|
||||
{
|
||||
if (avatar == NULL_KEY) avatar = llGetOwner();
|
||||
string message = "Organizer set to normal texture mode.";
|
||||
if (gSculptMode) message = "Organizer set to sculpty mode.";
|
||||
// llRegionSayTo has a strange way of reporting chat to an avatar.
|
||||
// it says 'objectname say, message'. This is acceptable but not ideal.
|
||||
// we'll use it anyway because llInstantMessage eats a 2-second delay.
|
||||
llRegionSayTo(avatar, 0, message);
|
||||
}
|
||||
|
||||
reportSecurity(key avatar)
|
||||
{
|
||||
if (avatar == NULL_KEY) avatar = llGetOwner();
|
||||
string message = "Organizer will only respond to the owner.";
|
||||
if (gSecurityMode == SECURITY_GROUP) message = "Organizer will respond to users in its group.";
|
||||
if (gSecurityMode == SECURITY_ALL) message = "Organizer will respond to all users.";
|
||||
// llRegionSayTo has a strange way of reporting chat to an avatar.
|
||||
// it says 'objectname say, message'. This is acceptable but not ideal.
|
||||
// we'll use it anyway because llInstantMessage eats a 2-second delay.
|
||||
llRegionSayTo(avatar, 0, message);
|
||||
}
|
||||
|
||||
|
||||
giveAllTextures(key avatar)
|
||||
{
|
||||
llGiveInventoryList(avatar, llGetObjectName(), gTextures);
|
||||
}
|
||||
|
||||
default
|
||||
{
|
||||
state_entry()
|
||||
{
|
||||
// Set up the base prim's geometry.
|
||||
llSetLinkPrimitiveParamsFast(LINK_ROOT, gBase);
|
||||
// zero all the prims, or the accounting will be completely off
|
||||
// for the other states.
|
||||
zeroAllPrimsExcept(-1);
|
||||
state browse;
|
||||
}
|
||||
}
|
||||
|
||||
state browse
|
||||
{
|
||||
state_entry()
|
||||
{
|
||||
gZoomTextureIndex = -1; // nothing zoomed.
|
||||
gZoomTexturePrimIndex = -1;
|
||||
llSetTimerEvent(0.1);
|
||||
}
|
||||
|
||||
changed(integer change)
|
||||
{
|
||||
// did the user add some textures?
|
||||
if (change & CHANGED_INVENTORY)
|
||||
{
|
||||
// yes, so update the object, after an acceptable delay.
|
||||
llSetTimerEvent(5.0);
|
||||
}
|
||||
}
|
||||
|
||||
timer()
|
||||
{
|
||||
// we do all this on a timer so that there's some slack in the system
|
||||
// and we don't have to re-update for each texture added en-masse.
|
||||
gatherTextures();
|
||||
setupTileGeometry();
|
||||
calculateTilePositions();
|
||||
repositionPrims();
|
||||
showTextures();
|
||||
base_browsePrevNext();
|
||||
llSetTimerEvent(0.0);
|
||||
}
|
||||
|
||||
touch_start(integer count)
|
||||
{
|
||||
// CLICKY CLICKY!
|
||||
integer i;
|
||||
// loop through all the detected*
|
||||
for (i=0; i<count; ++i)
|
||||
{
|
||||
// check security on each touch.....
|
||||
if (security(llDetectedKey(i)))
|
||||
{
|
||||
integer touchLink = llDetectedLinkNumber(i);
|
||||
// did the user click the base control button prim?
|
||||
if (touchLink == BUTTON_PRIM)
|
||||
{
|
||||
// yes, they did, so which button/face was it?
|
||||
integer button = base_processTouch(llDetectedTouchFace(i));
|
||||
if (button == BUTTON_PREV) // previous
|
||||
{
|
||||
if (gFirstTextureIndex <= 0) jump next;
|
||||
else
|
||||
{
|
||||
gFirstTextureIndex -= gRows * gColumns;
|
||||
if (gFirstTextureIndex < 0) gFirstTextureIndex = 0;
|
||||
}
|
||||
repositionPrims();
|
||||
showTextures();
|
||||
jump next;
|
||||
}
|
||||
if (button == BUTTON_NEXT) // next
|
||||
{
|
||||
integer textureCount = llGetListLength(gTextures);
|
||||
integer tileCount = gRows * gColumns;
|
||||
if (gFirstTextureIndex >= (textureCount - tileCount)) jump next;
|
||||
else
|
||||
{
|
||||
gFirstTextureIndex += tileCount;
|
||||
}
|
||||
repositionPrims();
|
||||
showTextures();
|
||||
jump next;
|
||||
}
|
||||
if (button == BUTTON_CONFIG) // menu
|
||||
{
|
||||
// store the key of the avatar that clicked, so
|
||||
// state config will know.
|
||||
gConfigOperator = llDetectedKey(i);
|
||||
state config;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// figure out which tile the user clicked on
|
||||
integer currentTexture = gFirstTextureIndex + touchLink - 2;
|
||||
if (currentTexture < llGetListLength(gTextures))
|
||||
{
|
||||
gZoomTextureIndex = currentTexture;
|
||||
gZoomTexturePrimIndex = touchLink;
|
||||
state zoom;
|
||||
}
|
||||
}
|
||||
}
|
||||
@next; // next for()....
|
||||
}
|
||||
// make sure the base shows the proper prev/next arrows
|
||||
base_browsePrevNext();
|
||||
}
|
||||
}
|
||||
|
||||
state zoom
|
||||
{
|
||||
// this is where we zoom in on a given texture
|
||||
state_entry()
|
||||
{
|
||||
// sanity check: if we don't have a current texture then go back to browsing.
|
||||
if (gZoomTextureIndex == -1) state browse;
|
||||
// first we hide all the non-zoom prims
|
||||
zeroAllPrimsExcept(gZoomTexturePrimIndex);
|
||||
// now we get the base size so we can figure out the zoom prim size
|
||||
list params = llGetLinkPrimitiveParams(LINK_ROOT, [PRIM_SIZE]);
|
||||
vector baseSize = llList2Vector(params, 0);
|
||||
// set the zoom prim size. It should already have the texture on it.
|
||||
float zoomDivisor = 15.0;
|
||||
// wider prim for scupt mode
|
||||
if (gSculptMode) zoomDivisor = 2.0;
|
||||
llSetLinkPrimitiveParamsFast(gZoomTexturePrimIndex, [PRIM_SIZE,
|
||||
<baseSize.x, baseSize.x/zoomDivisor, baseSize.x>,
|
||||
PRIM_POSITION,
|
||||
<0.0, 0.0, (baseSize.x/2.0) + baseSize.z>
|
||||
]);
|
||||
// and set the close button prim, which is always the last prim.
|
||||
llSetLinkPrimitiveParamsFast(llGetObjectPrimCount(llGetKey()), gCloseButton +
|
||||
[PRIM_SIZE, <baseSize.x * gTileMargin, baseSize.x * gTileMargin, baseSize.x/12.0>,
|
||||
PRIM_POSITION, <baseSize.x / 2.0, 0.0, baseSize.z>
|
||||
]);
|
||||
// turn off the prev/next buttons...
|
||||
base_noPrevNext();
|
||||
}
|
||||
|
||||
touch_start(integer count)
|
||||
{
|
||||
integer i;
|
||||
// store this because we'll likely need it.
|
||||
integer primCount = llGetObjectPrimCount(llGetKey());
|
||||
// cycle through per touch....
|
||||
for (i=0; i<count; ++i)
|
||||
{
|
||||
// check security on each touch....
|
||||
if (security(llDetectedKey(i)))
|
||||
{
|
||||
integer touchLink = llDetectedLinkNumber(i);
|
||||
if (touchLink == BUTTON_PRIM)
|
||||
{
|
||||
integer baseButton = base_processTouch(llDetectedTouchFace(i));
|
||||
if (baseButton == BUTTON_CONFIG)
|
||||
{
|
||||
gConfigOperator = llDetectedKey(i);
|
||||
state config;
|
||||
}
|
||||
}
|
||||
if (touchLink == gZoomTexturePrimIndex)
|
||||
{
|
||||
llGiveInventory(llDetectedKey(i), llList2String(gTextures, gZoomTextureIndex));
|
||||
jump next;
|
||||
}
|
||||
if (touchLink == primCount)
|
||||
{
|
||||
llSetLinkPrimitiveParamsFast(primCount - 1, gCube + [PRIM_SIZE, ZERO_VECTOR, PRIM_POSITION, ZERO_VECTOR]);
|
||||
state browse;
|
||||
}
|
||||
}
|
||||
@next;
|
||||
}
|
||||
}
|
||||
|
||||
changed(integer what)
|
||||
{
|
||||
if (what & CHANGED_INVENTORY)
|
||||
{
|
||||
// the user updated the inventory in some way, so we
|
||||
// go back to browsing.
|
||||
state browse;
|
||||
}
|
||||
}
|
||||
|
||||
state_exit()
|
||||
{
|
||||
// force the other states to update the zoomed prim
|
||||
gHiddenPrims += [gZoomTexturePrimIndex];
|
||||
}
|
||||
}
|
||||
|
||||
state config
|
||||
{
|
||||
// config is where we hide all the tiles,
|
||||
// allow the user to get all of the textures in one folder, and sculpt mode.
|
||||
// also let the owner set the security mode (owner, group, all)
|
||||
state_entry()
|
||||
{
|
||||
key owner = llGetOwner();
|
||||
// put away all the prims
|
||||
zeroAllPrimsExcept(-1);
|
||||
|
||||
// put together the buttons
|
||||
// which prims do we use for the buttons?
|
||||
// we start at the highest prim and go backwards to preserve
|
||||
// the textures on as many prims as possible. This way the
|
||||
// viewer doesn't have to reload them.
|
||||
integer count = llGetObjectPrimCount(llGetKey());
|
||||
gConfigSculptModePrim = count;
|
||||
gConfigGiveAllPrim = count - 1;
|
||||
gConfigSecurityOwnerPrim = count - 2;
|
||||
gConfigSecurityGroupPrim = count - 3;
|
||||
gConfigSecurityAllPrim = count - 4;
|
||||
|
||||
// now we get the base size so we can figure out the control prim sizes
|
||||
list params = llGetLinkPrimitiveParams(LINK_ROOT, [PRIM_SIZE]);
|
||||
vector baseSize = llList2Vector(params, 0);
|
||||
// buttonSize is for the give-all and sculpty/texture-mode buttons.
|
||||
vector buttonSize = <baseSize.x/2.5, baseSize.x/15.0, baseSize.x/2.5>;
|
||||
// securityButtonSize is for the owner/group/all buttons
|
||||
vector securityButtonSize = ZERO_VECTOR;
|
||||
// if the user isn't also the owner, then don't show the security buttons.
|
||||
if (gConfigOperator == llGetOwner())
|
||||
{
|
||||
float securityWidth = baseSize.x/3.05;
|
||||
securityButtonSize = <securityWidth, baseSize.x/15.0, securityWidth/1.5>;
|
||||
}
|
||||
|
||||
list buttonParams = gCube + [PRIM_SIZE, buttonSize,
|
||||
PRIM_TEXTURE, ALL_SIDES, TEXTURE_BLANK, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0,
|
||||
PRIM_FULLBRIGHT, ALL_SIDES, 0,
|
||||
PRIM_COLOR, ALL_SIDES, <0.5, 0.5, 0.5>, 1.0,
|
||||
PRIM_FULLBRIGHT, 1, 1,
|
||||
PRIM_COLOR, 1, <1, 1, 1>, 1.0,
|
||||
PRIM_FULLBRIGHT, 3, 1,
|
||||
PRIM_COLOR, 3, <1, 1, 1>, 1.0
|
||||
];
|
||||
|
||||
// set the sculpt mode prim....
|
||||
vector sculptTextureOffset = <0.0, 0.333, 0.0>; // 'sculpt mode'
|
||||
if (gSculptMode) sculptTextureOffset = <0,0,0>; // 'texture mode'
|
||||
llSetLinkPrimitiveParamsFast(gConfigSculptModePrim, buttonParams +
|
||||
[PRIM_POSITION, <0.0, 0.0, buttonSize.z + securityButtonSize.z>,
|
||||
PRIM_TEXTURE, 1, gModeTexture, <1.0, 0.333, 0.0>, sculptTextureOffset, 0.0,
|
||||
PRIM_TEXTURE, 3, gModeTexture, <1.0, 0.333, 0.0>, sculptTextureOffset, 0.0
|
||||
]);
|
||||
// set the give-all prim
|
||||
llSetLinkPrimitiveParamsFast(gConfigGiveAllPrim, buttonParams +
|
||||
[PRIM_POSITION, <0.0, 0.0, (buttonSize.z * 2.1) + securityButtonSize.z>,
|
||||
PRIM_TEXTURE, 1, gModeTexture, <1.0, 0.333, 0.0>, <0.0, -0.333, 0.0>, 0.0,
|
||||
PRIM_TEXTURE, 3, gModeTexture, <1.0, 0.333, 0.0>, <0.0, -0.333, 0.0>, 0.0
|
||||
]);
|
||||
|
||||
// Owner security
|
||||
llSetLinkPrimitiveParamsFast(gConfigSecurityOwnerPrim, buttonParams +
|
||||
[PRIM_POSITION, <securityButtonSize.x * 1.1, 0.0, securityButtonSize.z * 1.2>,
|
||||
PRIM_SIZE, securityButtonSize,
|
||||
PRIM_TEXTURE, 1, gSecurityTexture, <1.0, 0.333, 0.0>, <0.0, 0.333, 0.0>, 0.0,
|
||||
PRIM_TEXTURE, 3, gSecurityTexture, <1.0, 0.333, 0.0>, <0.0, 0.333, 0.0>, 0.0
|
||||
]);
|
||||
// Group security
|
||||
llSetLinkPrimitiveParamsFast(gConfigSecurityGroupPrim, buttonParams +
|
||||
[PRIM_POSITION, <0.0, 0.0, securityButtonSize.z * 1.2>,
|
||||
PRIM_SIZE, securityButtonSize,
|
||||
PRIM_TEXTURE, 1, gSecurityTexture, <1.0, 0.333, 0.0>, <0.0, 0, 0.0>, 0.0,
|
||||
PRIM_TEXTURE, 3, gSecurityTexture, <1.0, 0.333, 0.0>, <0.0, 0, 0.0>, 0.0
|
||||
]);
|
||||
// All security
|
||||
llSetLinkPrimitiveParamsFast(gConfigSecurityAllPrim, buttonParams +
|
||||
[PRIM_POSITION, <0.0 - (securityButtonSize.x * 1.1), 0.0, securityButtonSize.z * 1.2>,
|
||||
PRIM_SIZE, securityButtonSize,
|
||||
PRIM_TEXTURE, 1, gSecurityTexture, <1.0, 0.333, 0.0>, <0.0, -0.333, 0.0>, 0.0,
|
||||
PRIM_TEXTURE, 3, gSecurityTexture, <1.0, 0.333, 0.0>, <0.0, -0.333, 0.0>, 0.0
|
||||
]);
|
||||
// turn off the prev/next controls
|
||||
base_noPrevNext();
|
||||
llSetTimerEvent(gConfigTimeout);
|
||||
}
|
||||
|
||||
timer()
|
||||
{
|
||||
// We want to go back to browsing from config mode
|
||||
// after a certain time. If the timer ever makes it here,
|
||||
// then boom.
|
||||
state browse;
|
||||
}
|
||||
|
||||
touch_start(integer count)
|
||||
{
|
||||
llSetTimerEvent(gConfigTimeout);
|
||||
integer i;
|
||||
// cycle through per touch....
|
||||
for (i=0; i<count; ++i)
|
||||
{
|
||||
// check security on each touch....
|
||||
key av = llDetectedKey(i);
|
||||
if (security(av))
|
||||
{
|
||||
integer touchLink = llDetectedLinkNumber(i);
|
||||
if (touchLink == BUTTON_PRIM)
|
||||
{
|
||||
integer baseButton = base_processTouch(llDetectedTouchFace(i));
|
||||
if (baseButton == BUTTON_CONFIG)
|
||||
{
|
||||
state browse;
|
||||
}
|
||||
}
|
||||
if (touchLink == gConfigSculptModePrim)
|
||||
{
|
||||
if (gSculptMode) gSculptMode = FALSE;
|
||||
else gSculptMode = TRUE;
|
||||
vector sculptTextureOffset = <0.0, 0.333, 0.0>; // 'sculpt mode'
|
||||
if (gSculptMode) sculptTextureOffset = <0,0,0>; // 'texture mode'
|
||||
llSetLinkPrimitiveParamsFast(gConfigSculptModePrim, [
|
||||
PRIM_TEXTURE, 1, gModeTexture, <1.0, 0.333, 0.0>, sculptTextureOffset, 0.0,
|
||||
PRIM_TEXTURE, 3, gModeTexture, <1.0, 0.333, 0.0>, sculptTextureOffset, 0.0
|
||||
]);
|
||||
reportSculptMode(av);
|
||||
jump next;
|
||||
}
|
||||
if (touchLink == gConfigGiveAllPrim)
|
||||
{
|
||||
giveAllTextures(av);
|
||||
jump next;
|
||||
}
|
||||
// only let the owner do these....
|
||||
if (gConfigOperator == llGetOwner())
|
||||
{
|
||||
if (touchLink == gConfigSecurityOwnerPrim)
|
||||
{
|
||||
gSecurityMode = SECURITY_OWNER;
|
||||
reportSecurity(av);
|
||||
jump next;
|
||||
}
|
||||
if (touchLink == gConfigSecurityGroupPrim)
|
||||
{
|
||||
gSecurityMode = SECURITY_GROUP;
|
||||
reportSecurity(av);
|
||||
jump next;
|
||||
}
|
||||
if (touchLink == gConfigSecurityAllPrim)
|
||||
{
|
||||
gSecurityMode = SECURITY_ALL;
|
||||
reportSecurity(av);
|
||||
jump next;
|
||||
}
|
||||
}
|
||||
}
|
||||
@next;
|
||||
}
|
||||
}
|
||||
|
||||
changed(integer what)
|
||||
{
|
||||
if (what & CHANGED_INVENTORY)
|
||||
{
|
||||
// the user updated the inventory in some way, so we
|
||||
// go back to browsing.
|
||||
state browse;
|
||||
}
|
||||
}
|
||||
|
||||
state_exit()
|
||||
{
|
||||
// hide all the prims so browse will re-init them
|
||||
zeroAllPrimsExcept(-1);
|
||||
}
|
||||
}
|
||||
47
Texture Organizer/Texture Organizer/Object/Readme.txt
Normal file
47
Texture Organizer/Texture Organizer/Object/Readme.txt
Normal file
@@ -0,0 +1,47 @@
|
||||
// :CATEGORY:Texture
|
||||
// :NAME:Texture Organizer
|
||||
// :AUTHOR:Anonymous
|
||||
// :CREATED:2013-09-13 15:11:58
|
||||
// :EDITED:2013-09-18 15:39:06
|
||||
// :ID:876
|
||||
// :NUM:1510
|
||||
// :REV:1
|
||||
// :WORLD:Second Life
|
||||
// :DESCRIPTION:
|
||||
// License
|
||||
// :CODE:
|
||||
|
||||
|
||||
|
||||
Texture Organizer
|
||||
|
||||
by Solo Mornington
|
||||
|
||||
Originally created for the Linden Endowment for the Arts sandbox, in Second Life. Visit sometime! http://slurl.com/secondlife/LEA5/122/129/24
|
||||
|
||||
This is a single-script texture organizer that does some fancy prim animating because I thought it might be neat.
|
||||
|
||||
FEATURES:
|
||||
|
||||
* Fancy prim animations. Woot.
|
||||
* Totally free, open-source, FOSS-happy license.
|
||||
* Security modes: Owner, group, or everyone can use the organizer.
|
||||
* Sculpty mode: Have it show you all the textures as sculpties.
|
||||
* 'Give All' button: Everyone knows how handy that is.
|
||||
* Low lag, minimal prims...
|
||||
* Notification of restrictive permissions on textures.
|
||||
|
||||
HOW TO USE THE SCRIPT:
|
||||
|
||||
1) Make an object with 22 prims.
|
||||
2) Put the script in the object's root prim.
|
||||
3) Add textures.
|
||||
4) You're done.
|
||||
|
||||
RESOURCES:
|
||||
|
||||
Included in this repository is a set of images used to create the user interface of the texture organizer. The script refers to these textures in Second Life by UUID, so there is no need to upload them, as long as Solo Mornington has an inventory. :-)
|
||||
|
||||
LICENSE:
|
||||
|
||||
See the source code file for definitive licensing information.
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 7.8 KiB |
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|08 Sep 2013 03:49:07 -0000
|
||||
vti_extenderversion:SR|12.0.0.6211
|
||||
vti_backlinkinfo:VX|
|
||||
vti_author:SR|alien\\fred
|
||||
vti_modifiedby:SR|alien\\fred
|
||||
vti_timecreated:TR|18 Sep 2013 20:39:06 -0000
|
||||
@@ -0,0 +1,6 @@
|
||||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|18 Sep 2013 20:39:06 -0000
|
||||
vti_extenderversion:SR|12.0.0.0
|
||||
vti_cacheddtm:TX|18 Sep 2013 20:39:06 -0000
|
||||
vti_filesize:IR|1408
|
||||
vti_backlinkinfo:VX|
|
||||
@@ -0,0 +1,9 @@
|
||||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 Aug 2013 14:10:04 -0000
|
||||
vti_extenderversion:SR|12.0.0.0
|
||||
vti_author:SR|alien\\fred
|
||||
vti_modifiedby:SR|alien\\fred
|
||||
vti_timecreated:TR|19 Aug 2013 14:10:04 -0000
|
||||
vti_cacheddtm:TX|19 Aug 2013 14:10:04 -0000
|
||||
vti_filesize:IR|7954
|
||||
vti_backlinkinfo:VX|
|
||||
@@ -0,0 +1,6 @@
|
||||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 Aug 2013 14:10:18 -0000
|
||||
vti_extenderversion:SR|12.0.0.0
|
||||
vti_cacheddtm:TX|19 Aug 2013 14:10:18 -0000
|
||||
vti_filesize:IR|68070
|
||||
vti_backlinkinfo:VX|
|
||||
@@ -0,0 +1,6 @@
|
||||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 Aug 2013 14:10:30 -0000
|
||||
vti_extenderversion:SR|12.0.0.0
|
||||
vti_cacheddtm:TX|19 Aug 2013 14:10:30 -0000
|
||||
vti_filesize:IR|389889
|
||||
vti_backlinkinfo:VX|
|
||||
@@ -0,0 +1,9 @@
|
||||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 Aug 2013 14:10:27 -0000
|
||||
vti_extenderversion:SR|12.0.0.0
|
||||
vti_author:SR|alien\\fred
|
||||
vti_modifiedby:SR|alien\\fred
|
||||
vti_timecreated:TR|19 Aug 2013 14:10:27 -0000
|
||||
vti_cacheddtm:TX|19 Aug 2013 14:10:27 -0000
|
||||
vti_filesize:IR|9928
|
||||
vti_backlinkinfo:VX|
|
||||
@@ -0,0 +1,6 @@
|
||||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 Aug 2013 14:10:41 -0000
|
||||
vti_extenderversion:SR|12.0.0.0
|
||||
vti_cacheddtm:TX|19 Aug 2013 14:10:41 -0000
|
||||
vti_filesize:IR|394584
|
||||
vti_backlinkinfo:VX|
|
||||
@@ -0,0 +1,6 @@
|
||||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 Aug 2013 14:10:52 -0000
|
||||
vti_extenderversion:SR|12.0.0.0
|
||||
vti_cacheddtm:TX|19 Aug 2013 14:10:52 -0000
|
||||
vti_filesize:IR|428247
|
||||
vti_backlinkinfo:VX|
|
||||
@@ -0,0 +1,9 @@
|
||||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 Aug 2013 14:10:36 -0000
|
||||
vti_extenderversion:SR|12.0.0.0
|
||||
vti_author:SR|alien\\fred
|
||||
vti_modifiedby:SR|alien\\fred
|
||||
vti_timecreated:TR|19 Aug 2013 14:10:36 -0000
|
||||
vti_cacheddtm:TX|19 Aug 2013 14:10:36 -0000
|
||||
vti_filesize:IR|12202
|
||||
vti_backlinkinfo:VX|
|
||||
@@ -0,0 +1,9 @@
|
||||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 Aug 2013 14:10:47 -0000
|
||||
vti_extenderversion:SR|12.0.0.0
|
||||
vti_author:SR|alien\\fred
|
||||
vti_modifiedby:SR|alien\\fred
|
||||
vti_timecreated:TR|19 Aug 2013 14:10:47 -0000
|
||||
vti_cacheddtm:TX|19 Aug 2013 14:10:47 -0000
|
||||
vti_filesize:IR|12954
|
||||
vti_backlinkinfo:VX|
|
||||
Binary file not shown.
BIN
Texture Organizer/Texture Organizer/Object/owner-group-all.png
Normal file
BIN
Texture Organizer/Texture Organizer/Object/owner-group-all.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.7 KiB |
Binary file not shown.
Binary file not shown.
BIN
Texture Organizer/Texture Organizer/Object/sculpty-give-all.png
Normal file
BIN
Texture Organizer/Texture Organizer/Object/sculpty-give-all.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
16
Texture Organizer/Texture Organizer/Texture Organizer.prj
Normal file
16
Texture Organizer/Texture Organizer/Texture Organizer.prj
Normal file
@@ -0,0 +1,16 @@
|
||||
<Project name="Texture Organizer" guid="6a7c520d-3089-4118-a6b4-c8f4a6e7fa79">
|
||||
<Object name="Object" guid="d7575f6c-75cc-4b9e-a40b-fe12fc813724" active="true">
|
||||
<Script name="Main Script.lsl" guid="030f4cb0-565a-4a91-aa69-ed3d5b3397c6">
|
||||
</Script>
|
||||
<Snapshot name="owner-group-all.png" guid="6731c1fa-cd54-4335-ab1a-409593ac77cb">
|
||||
</Snapshot>
|
||||
<Notecard name="Readme.txt" guid="444f4dad-eae3-48fd-8cc9-bf285382f3e7">
|
||||
</Notecard>
|
||||
<Snapshot name="sculpty-give-all.png" guid="00d63289-cf93-41fe-beb5-7031327819c4">
|
||||
</Snapshot>
|
||||
<Snapshot name="sculpty-texture-give.png" guid="7822e225-ca56-4769-97f2-f81f404b8bc4">
|
||||
</Snapshot>
|
||||
<Snapshot name="Texture Organizer Buttons.png" guid="e6fc561f-3abe-4a87-81df-9c0f05abc7a0">
|
||||
</Snapshot>
|
||||
</Object>
|
||||
</Project>
|
||||
@@ -0,0 +1,6 @@
|
||||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 Aug 2013 14:17:08 -0000
|
||||
vti_extenderversion:SR|12.0.0.0
|
||||
vti_cacheddtm:TX|19 Aug 2013 14:17:08 -0000
|
||||
vti_filesize:IR|786
|
||||
vti_backlinkinfo:VX|
|
||||
6
Texture Organizer/_vti_cnf/Texture Organizer.sol
Normal file
6
Texture Organizer/_vti_cnf/Texture Organizer.sol
Normal file
@@ -0,0 +1,6 @@
|
||||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 Aug 2013 14:09:04 -0000
|
||||
vti_extenderversion:SR|12.0.0.0
|
||||
vti_cacheddtm:TX|19 Aug 2013 14:09:04 -0000
|
||||
vti_filesize:IR|149
|
||||
vti_backlinkinfo:VX|
|
||||
Reference in New Issue
Block a user