The UI portion of Bakes on Mesh... and the entire thing, sure, why not?

Also let's now select the proper tab when we input an ID or select a face
with an asset ID that we can find in a tab, but that never works for BOM
when applied.
This commit is contained in:
Liru Færs
2019-10-10 21:19:50 -04:00
parent 1cb9ea16da
commit 7c24e67c50
18 changed files with 722 additions and 42 deletions

View File

@@ -79,6 +79,7 @@ LLIconDictionary::LLIconDictionary()
addEntry(LLInventoryType::ICONNAME_CLOTHING_SKIRT, new IconEntry("inv_item_skirt.tga"));
addEntry(LLInventoryType::ICONNAME_CLOTHING_ALPHA, new IconEntry("inv_item_alpha.tga"));
addEntry(LLInventoryType::ICONNAME_CLOTHING_TATTOO, new IconEntry("inv_item_tattoo.tga"));
addEntry(LLInventoryType::ICONNAME_CLOTHING_UNIVERSAL, new IconEntry("Inv_Universal.png"));
addEntry(LLInventoryType::ICONNAME_ANIMATION, new IconEntry("inv_item_animation.tga"));
addEntry(LLInventoryType::ICONNAME_GESTURE, new IconEntry("inv_item_gesture.tga"));

View File

@@ -379,6 +379,28 @@ void LLPanelVolume::getState( )
}
getChildView("Animated Mesh Checkbox Ctrl")->setEnabled(enabled_animated_object_box);
//refresh any bakes
if (root_volobjp)
{
root_volobjp->refreshBakeTexture();
LLViewerObject::const_child_list_t& child_list = root_volobjp->getChildren();
for (const auto& iter : child_list)
{
LLViewerObject* objectp = iter;
if (objectp)
{
objectp->refreshBakeTexture();
}
}
if (gAgentAvatarp)
{
gAgentAvatarp->updateMeshVisibility();
}
}
// Flexible properties
BOOL is_flexible = volobjp && volobjp->isFlexible();
getChild<LLUICtrl>("Flexible1D Checkbox Ctrl")->setValue(is_flexible);
@@ -825,6 +847,27 @@ void LLPanelVolume::onCommitAnimatedMeshCheckbox(LLUICtrl *, void*)
{
volobjp->setExtendedMeshFlags(new_flags);
}
//refresh any bakes
if (volobjp)
{
volobjp->refreshBakeTexture();
LLViewerObject::const_child_list_t& child_list = volobjp->getChildren();
for (const auto& iter : child_list)
{
LLViewerObject* objectp = iter;
if (objectp)
{
objectp->refreshBakeTexture();
}
}
if (gAgentAvatarp)
{
gAgentAvatarp->updateMeshVisibility();
}
}
}
void LLPanelVolume::onCommitIsFlexible(LLUICtrl *, void*)

View File

@@ -60,19 +60,22 @@
#include "llscrollcontainer.h"
#include "lltoolmgr.h"
#include "lltoolpipette.h"
#include "lltool.h"
#include "llglheaders.h"
#include "llselectmgr.h"
#include "lltrans.h"
#include "lluictrlfactory.h"
#include "llviewerwindow.h"
#include "llviewerobject.h"
#include "llviewercontrol.h"
#include "llglheaders.h"
#include "lluictrlfactory.h"
#include "lltrans.h"
#include "llavatarappearancedefines.h"
// <edit>
#include "llmenugl.h"
// </edit>
// tag: vaa emerald local_asset_browser [begin]
//#include <boost/algorithm/cxx11/any_of.hpp>
#include "floaterlocalassetbrowse.h"
#include "llscrolllistctrl.h"
#define LOCALLIST_COL_ID 1
@@ -177,6 +180,7 @@ public:
void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
static void onShowFolders(LLUICtrl* ctrl, void* userdata);
static void onApplyImmediateCheck(LLUICtrl* ctrl, void* userdata);
void onBakeTextureSelect(const LLSD& val);
void onFilterEdit(const std::string& filter_string );
void onTextureSelect( const LLTextureEntry& te );
@@ -285,22 +289,43 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id)
mNoCopyTextureSelected = FALSE;
mIsDirty = TRUE;
mImageAssetID = image_id;
LLUUID item_id = findItemID(mImageAssetID, FALSE);
if (item_id.isNull())
std::string tab;
if (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID))
{
mInventoryPanel->getRootFolder()->clearSelection();
tab = "bake";
getChild<LLScrollListCtrl>("l_bake_use_texture_combo_box")->selectByID(mImageAssetID);
}
/* TODO: Figure out how to select local asset if in use?
// tag: vaa emerald local_asset_browser [begin]
else if (boost::algorithm::any_of_equal(mLocalScrollCtrl->getAllIDs(), mImageAssetID))
{
tab = "local_tab";
mLocalScrollCtrl->selectByID(mImageAssetID);
}
// tag: vaa emerald local_asset_browser [end]
*/
else
{
LLInventoryItem* itemp = gInventory.getItem(image_id);
if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID()))
LLUUID item_id = findItemID(mImageAssetID, FALSE);
if (item_id.isNull())
{
// no copy texture
getChild<LLUICtrl>("apply_immediate_check")->setValue(FALSE);
mNoCopyTextureSelected = TRUE;
mInventoryPanel->getRootFolder()->clearSelection();
}
else
{
tab = "server_tab";
LLInventoryItem* itemp = gInventory.getItem(image_id);
if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID()))
{
// no copy texture
getChild<LLUICtrl>("apply_immediate_check")->setValue(FALSE);
mNoCopyTextureSelected = TRUE;
}
mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO);
}
mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO);
}
if (!tab.empty()) getChild<LLTabContainer>("actions_tab_container")->selectTabByName(tab);
}
}
@@ -557,6 +582,8 @@ BOOL LLFloaterTexturePicker::postBuild()
// update permission filter once UI is fully initialized
updateFilterPermMask();
LLToolPipette::getInstance()->setToolSelectCallback(boost::bind(&LLFloaterTexturePicker::onTextureSelect, this, _1));
getChild<LLUICtrl>("l_bake_use_texture_combo_box")->setCommitCallback(boost::bind(&LLFloaterTexturePicker::onBakeTextureSelect, this, _2));
return TRUE;
}
@@ -623,10 +650,28 @@ void LLFloaterTexturePicker::draw()
//BOOL allow_copy = FALSE;
if( mOwner )
{
mTexturep = NULL;
mTexturep = nullptr;
if(mImageAssetID.notNull())
{
mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_PREVIEW);
LLPointer<LLViewerFetchedTexture> texture = NULL;
if (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID))
{
LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
if (obj)
{
LLViewerTexture* viewerTexture = obj->getBakedTextureForMagicId(mImageAssetID);
texture = viewerTexture ? dynamic_cast<LLViewerFetchedTexture*>(viewerTexture) : NULL;
}
}
if (texture.isNull())
{
texture = LLViewerTextureManager::getFetchedTexture(mImageAssetID);
}
mTexturep = texture;
mTexturep->setBoostLevel(LLGLTexture::BOOST_PREVIEW);
}
else if (!mFallbackImageName.empty())
{
@@ -1030,6 +1075,19 @@ void LLFloaterTexturePicker::onApplyImmediateCheck(LLUICtrl* ctrl, void *user_da
picker->commitIfImmediateSet();
}
void LLFloaterTexturePicker::onBakeTextureSelect(const LLSD& val)
{
LLUUID imageID = val.asUUID();
setImageID(imageID);
if (mCanPreview)
{
// only commit intentional selections, not implicit ones
commitIfImmediateSet();
}
}
void LLFloaterTexturePicker::updateFilterPermMask()
{
//mInventoryPanel->setFilterPermMask( getFilterPermMask() ); Commented out due to no-copy texture loss.
@@ -1581,12 +1639,31 @@ void LLTextureCtrl::draw()
if (!mValid)
{
mTexturep = NULL;
mTexturep = nullptr;
}
else if (!mImageAssetID.isNull())
{
mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES,LLGLTexture::BOOST_PREVIEW, LLViewerTexture::LOD_TEXTURE);
mTexturep->forceToSaveRawImage(0) ;
LLPointer<LLViewerFetchedTexture> texture = NULL;
if (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID))
{
LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
if (obj)
{
LLViewerTexture* viewerTexture = obj->getBakedTextureForMagicId(mImageAssetID);
texture = viewerTexture ? dynamic_cast<LLViewerFetchedTexture*>(viewerTexture) : NULL;
}
}
if (texture.isNull())
{
texture = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
}
texture->setBoostLevel(LLGLTexture::BOOST_PREVIEW);
texture->forceToSaveRawImage(0) ;
mTexturep = texture;
}
else if (!mFallbackImageName.empty())
{
@@ -1595,7 +1672,7 @@ void LLTextureCtrl::draw()
}
else // mImageAssetID == LLUUID::null
{
mTexturep = NULL;
mTexturep = nullptr;
}
// Border

View File

@@ -4765,12 +4765,75 @@ void LLViewerObject::sendTEUpdate() const
msg->sendReliable( regionp->getHost() );
}
LLViewerTexture* LLViewerObject::getBakedTextureForMagicId(const LLUUID& id)
{
if (!LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(id))
{
return NULL;
}
LLViewerObject *root = getRootEdit();
if (root && root->isAnimatedObject())
{
return LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
}
LLVOAvatar* avatar = getAvatar();
if (avatar)
{
LLAvatarAppearanceDefines::EBakedTextureIndex texIndex = LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::assetIdToBakedTextureIndex(id);
LLViewerTexture* bakedTexture = avatar->getBakedTexture(texIndex);
if (bakedTexture == NULL || bakedTexture->isMissingAsset())
{
return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
}
else
{
return bakedTexture;
}
}
else
{
return LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
}
}
void LLViewerObject::updateAvatarMeshVisibility(const LLUUID& id, const LLUUID& old_id)
{
if (id == old_id)
{
return;
}
if (!LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(old_id) && !LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(id))
{
return;
}
LLVOAvatar* avatar = getAvatar();
if (avatar)
{
avatar->updateMeshVisibility();
}
}
void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry)
{
LLUUID old_image_id;
if (getTE(te))
{
old_image_id = getTE(te)->getID();
}
LLPrimitive::setTE(te, texture_entry);
const LLUUID& image_id = getTE(te)->getID();
mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
LLViewerTexture* bakedTexture = getBakedTextureForMagicId(image_id);
mTEImages[te] = bakedTexture ? bakedTexture : LLViewerTextureManager::getFetchedTexture(image_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
updateAvatarMeshVisibility(image_id,old_image_id);
if (getTE(te)->getMaterialParams().notNull())
{
@@ -4782,12 +4845,31 @@ void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry)
}
}
void LLViewerObject::refreshBakeTexture()
{
for (int face_index = 0; face_index < getNumTEs(); face_index++)
{
LLTextureEntry* tex_entry = getTE(face_index);
if (tex_entry && LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(tex_entry->getID()))
{
const LLUUID& image_id = tex_entry->getID();
LLViewerTexture* bakedTexture = getBakedTextureForMagicId(image_id);
changeTEImage(face_index, bakedTexture);
}
}
}
void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep)
{
if (mTEImages[te] != imagep)
{
mTEImages[te] = imagep;
LLUUID old_image_id = getTE(te) ? getTE(te)->getID() : LLUUID::null;
LLPrimitive::setTETexture(te, imagep->getID());
LLViewerTexture* baked_texture = getBakedTextureForMagicId(imagep->getID());
mTEImages[te] = baked_texture ? baked_texture : imagep;
updateAvatarMeshVisibility(imagep->getID(), old_image_id);
setChanged(TEXTURE);
if (mDrawable.notNull())
{
@@ -4798,13 +4880,18 @@ void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep)
S32 LLViewerObject::setTETextureCore(const U8 te, LLViewerTexture *image)
{
if (!image)
return 0;
LLUUID old_image_id = getTE(te)->getID();
const LLUUID& uuid = image->getID();
S32 retval = 0;
if (uuid != getTE(te)->getID() ||
uuid == LLUUID::null)
{
retval = LLPrimitive::setTETexture(te, uuid);
mTEImages[te] = image;
LLViewerTexture* baked_texture = getBakedTextureForMagicId(uuid);
mTEImages[te] = baked_texture ? baked_texture : image;
updateAvatarMeshVisibility(uuid,old_image_id);
setChanged(TEXTURE);
if (mDrawable.notNull())
{

View File

@@ -614,6 +614,10 @@ public:
friend class LLViewerObjectList;
friend class LLViewerMediaList;
public:
LLViewerTexture* getBakedTextureForMagicId(const LLUUID& id);
void updateAvatarMeshVisibility(const LLUUID& id, const LLUUID& old_id);
void refreshBakeTexture();
public:
static void unpackVector3(LLDataPackerBinaryBuffer* dp, LLVector3& value, std::string name);
static void unpackUUID(LLDataPackerBinaryBuffer* dp, LLUUID& value, std::string name);

View File

@@ -7772,6 +7772,21 @@ const LLViewerJointAttachment *LLVOAvatar::attachObject(LLViewerObject *viewer_o
LLSelectMgr::getInstance()->updatePointAt();
}
viewer_object->refreshBakeTexture();
LLViewerObject::const_child_list_t& child_list = viewer_object->getChildren();
for (const auto& iter : child_list)
{
LLViewerObject* objectp = iter;
if (objectp)
{
objectp->refreshBakeTexture();
}
}
updateMeshVisibility();
return attachment;
}
@@ -7988,6 +8003,20 @@ BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object)
{
updateAttachmentOverrides();
}
viewer_object->refreshBakeTexture();
LLViewerObject::const_child_list_t& child_list = viewer_object->getChildren();
for (const auto& iter1 : child_list)
{
LLViewerObject* objectp = iter1;
if (objectp)
{
objectp->refreshBakeTexture();
}
}
updateMeshVisibility();
LL_DEBUGS() << "Detaching object " << viewer_object->mID << " from " << attachment->getName() << LL_ENDL;
return TRUE;
}
@@ -8684,6 +8713,109 @@ void LLVOAvatar::debugColorizeSubMeshes(U32 i, const LLColor4& color)
}
}
//-----------------------------------------------------------------------------
// updateMeshVisibility()
// Hide the mesh joints if attachments are using baked textures
//-----------------------------------------------------------------------------
void LLVOAvatar::updateMeshVisibility()
{
bool bake_flag[BAKED_NUM_INDICES];
memset(bake_flag, 0, BAKED_NUM_INDICES*sizeof(bool));
for (auto& attachment_point : mAttachmentPoints)
{
LLViewerJointAttachment* attachment = attachment_point.second;
if (attachment)
{
for (auto objectp : attachment->mAttachedObjects)
{
if (objectp)
{
for (int face_index = 0; face_index < objectp->getNumTEs(); face_index++)
{
LLTextureEntry* tex_entry = objectp->getTE(face_index);
bake_flag[BAKED_HEAD] |= (tex_entry->getID() == IMG_USE_BAKED_HEAD);
bake_flag[BAKED_EYES] |= (tex_entry->getID() == IMG_USE_BAKED_EYES);
bake_flag[BAKED_HAIR] |= (tex_entry->getID() == IMG_USE_BAKED_HAIR);
bake_flag[BAKED_LOWER] |= (tex_entry->getID() == IMG_USE_BAKED_LOWER);
bake_flag[BAKED_UPPER] |= (tex_entry->getID() == IMG_USE_BAKED_UPPER);
bake_flag[BAKED_SKIRT] |= (tex_entry->getID() == IMG_USE_BAKED_SKIRT);
bake_flag[BAKED_LEFT_ARM] |= (tex_entry->getID() == IMG_USE_BAKED_LEFTARM);
bake_flag[BAKED_LEFT_LEG] |= (tex_entry->getID() == IMG_USE_BAKED_LEFTLEG);
bake_flag[BAKED_AUX1] |= (tex_entry->getID() == IMG_USE_BAKED_AUX1);
bake_flag[BAKED_AUX2] |= (tex_entry->getID() == IMG_USE_BAKED_AUX2);
bake_flag[BAKED_AUX3] |= (tex_entry->getID() == IMG_USE_BAKED_AUX3);
}
}
LLViewerObject::const_child_list_t& child_list = objectp->getChildren();
for (const auto& iter1 : child_list)
{
LLViewerObject* objectchild = iter1;
if (objectchild)
{
for (int face_index = 0; face_index < objectchild->getNumTEs(); face_index++)
{
LLTextureEntry* tex_entry = objectchild->getTE(face_index);
bake_flag[BAKED_HEAD] |= (tex_entry->getID() == IMG_USE_BAKED_HEAD);
bake_flag[BAKED_EYES] |= (tex_entry->getID() == IMG_USE_BAKED_EYES);
bake_flag[BAKED_HAIR] |= (tex_entry->getID() == IMG_USE_BAKED_HAIR);
bake_flag[BAKED_LOWER] |= (tex_entry->getID() == IMG_USE_BAKED_LOWER);
bake_flag[BAKED_UPPER] |= (tex_entry->getID() == IMG_USE_BAKED_UPPER);
bake_flag[BAKED_SKIRT] |= (tex_entry->getID() == IMG_USE_BAKED_SKIRT);
bake_flag[BAKED_LEFT_ARM] |= (tex_entry->getID() == IMG_USE_BAKED_LEFTARM);
bake_flag[BAKED_LEFT_LEG] |= (tex_entry->getID() == IMG_USE_BAKED_LEFTLEG);
bake_flag[BAKED_AUX1] |= (tex_entry->getID() == IMG_USE_BAKED_AUX1);
bake_flag[BAKED_AUX2] |= (tex_entry->getID() == IMG_USE_BAKED_AUX2);
bake_flag[BAKED_AUX3] |= (tex_entry->getID() == IMG_USE_BAKED_AUX3);
}
}
}
}
}
}
//LL_INFOS() << "head " << bake_flag[BAKED_HEAD] << "eyes " << bake_flag[BAKED_EYES] << "hair " << bake_flag[BAKED_HAIR] << "lower " << bake_flag[BAKED_LOWER] << "upper " << bake_flag[BAKED_UPPER] << "skirt " << bake_flag[BAKED_SKIRT] << LL_ENDL;
for (S32 i = 0; i < mMeshLOD.size(); i++)
{
LLAvatarJoint* joint = mMeshLOD[i];
if (i == MESH_ID_HAIR)
{
joint->setVisible(!bake_flag[BAKED_HAIR], TRUE);
}
else if (i == MESH_ID_HEAD)
{
joint->setVisible(!bake_flag[BAKED_HEAD], TRUE);
}
else if (i == MESH_ID_SKIRT)
{
joint->setVisible(!bake_flag[BAKED_SKIRT], TRUE);
}
else if (i == MESH_ID_UPPER_BODY)
{
joint->setVisible(!bake_flag[BAKED_UPPER], TRUE);
}
else if (i == MESH_ID_LOWER_BODY)
{
joint->setVisible(!bake_flag[BAKED_LOWER], TRUE);
}
else if (i == MESH_ID_EYEBALL_LEFT)
{
joint->setVisible(!bake_flag[BAKED_EYES], TRUE);
}
else if (i == MESH_ID_EYEBALL_RIGHT)
{
joint->setVisible(!bake_flag[BAKED_EYES], TRUE);
}
else if (i == MESH_ID_EYELASH)
{
joint->setVisible(!bake_flag[BAKED_HEAD], TRUE);
}
}
}
//-----------------------------------------------------------------------------
// updateMeshTextures()
// Uses the current TE values to set the meshes' and layersets' textures.
@@ -8925,6 +9057,30 @@ void LLVOAvatar::updateMeshTextures()
removeMissingBakedTextures(); // May call back into this function if anything is removed
call_remove_missing = true;
}
//refresh bakes on any attached objects
for (auto& attachment_point : mAttachmentPoints)
{
LLViewerJointAttachment* attachment = attachment_point.second;
for (auto attached_object : attachment->mAttachedObjects)
{
if (attached_object && !attached_object->isDead())
{
attached_object->refreshBakeTexture();
LLViewerObject::const_child_list_t& child_list = attached_object->getChildren();
for (const auto& iter : child_list)
{
LLViewerObject* objectp = iter;
if (objectp && !objectp->isDead())
{
objectp->refreshBakeTexture();
}
}
}
}
}
}
// virtual
@@ -9727,6 +9883,36 @@ void LLVOAvatar::applyParsedAppearanceMessage(LLAppearanceMessageContents& conte
updateMeshTextures();
//if (enable_verbose_dumps) dumpArchetypeXML(dump_prefix + "process_end");
updateMeshVisibility();
}
LLViewerTexture* LLVOAvatar::getBakedTexture(const U8 te)
{
if (te < 0 || te >= BAKED_NUM_INDICES)
{
return NULL;
}
BOOL is_layer_baked = isTextureDefined(mBakedTextureDatas[te].mTextureIndex);
LLViewerTexLayerSet* layerset = NULL;
layerset = getTexLayerSet(te);
if (!isEditingAppearance() && is_layer_baked)
{
LLViewerFetchedTexture* baked_img = LLViewerTextureManager::staticCastToFetchedTexture(getImage(mBakedTextureDatas[te].mTextureIndex, 0), TRUE);
return baked_img;
}
else if (layerset && isEditingAppearance())
{
layerset->createComposite();
layerset->setUpdatesEnabled(TRUE);
return layerset->getViewerComposite();
}
return NULL;
}
// static

View File

@@ -733,6 +733,9 @@ public:
void updateSexDependentLayerSets(bool upload_bake = false);
virtual void dirtyMesh(); // Dirty the avatar mesh
void updateMeshData();
void updateMeshVisibility();
LLViewerTexture* getBakedTexture(const U8 te);
protected:
void releaseMeshData();
virtual void restoreMeshData();

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -355,6 +355,7 @@ with the same filename but different name
<texture name="inv_item_socks.tga"/>
<texture name="inv_item_sound.tga"/>
<texture name="inv_item_tattoo.tga"/>
<texture name="Inv_Universal" file_name="Inv_Universal.png" preload="false" />
<texture name="inv_item_texture.tga"/>
<texture name="inv_item_underpants.tga"/>
<texture name="inv_item_undershirt.tga"/>

View File

@@ -111,5 +111,73 @@
</scroll_list>
<!-- tag: vaa emerald local_asset_browser [end] -->
</panel>
<panel border="false" bottom_delta="0" follows="all" height="300" label="Bake" left="0" mouse_opaque="false" name="bake" width="410">
<scroll_list
left="0"
bottom="-300"
height="299"
follows="all"
name="l_bake_use_texture_combo_box"
tool_tip="Choose the bake texture"
draw_heading="true"
width="287">
<scroll_list.column name="type" label="Type"/>
<scroll_list.row
name="BAKED_HEAD"
value="5a9f4a74-30f2-821c-b88d-70499d3e7183">
<columns name="type" value="BAKED_HEAD"/>
</scroll_list.row>
<scroll_list.row
name="BAKED_UPPER"
value="ae2de45c-d252-50b8-5c6e-19f39ce79317">
<column name="type" value="BAKED_UPPER"/>
</scroll_list.row>
<scroll_list.row
name="BAKED_LOWER"
value="24daea5f-0539-cfcf-047f-fbc40b2786ba">
<column name="type" value="BAKED_LOWER"/>
</scroll_list.row>
<scroll_list.row
name="BAKED_EYES"
value="52cc6bb6-2ee5-e632-d3ad-50197b1dcb8a">
<column name="type" value="BAKED_EYES"/>
</scroll_list.row>
<scroll_list.row
name="BAKED_SKIRT"
value="43529ce8-7faa-ad92-165a-bc4078371687">
<column name="type" value="BAKED_SKIRT"/>
</scroll_list.row>
<scroll_list.row
name="BAKED_HAIR"
value="09aac1fb-6bce-0bee-7d44-caac6dbb6c63">
<column name="type" value="BAKED_HAIR"/>
</scroll_list.row>
<scroll_list.row
name="BAKED_LEFTARM"
value="ff62763f-d60a-9855-890b-0c96f8f8cd98">
<column name="type" value="BAKED_LEFTARM"/>
</scroll_list.row>
<scroll_list.row
name="BAKED_LEFTLEG"
value="8e915e25-31d1-cc95-ae08-d58a47488251">
<column name="type" value="BAKED_LEFTLEG"/>
</scroll_list.row>
<scroll_list.row
name="BAKED_AUX1"
value="9742065b-19b5-297c-858a-29711d539043">
<column name="type" value="BAKED_AUX1"/>
</scroll_list.row>
<scroll_list.row
name="BAKED_AUX2"
value="03642e83-2bd1-4eb9-34b4-4c47ed586d2d">
<column name="type" value="BAKED_AUX2"/>
</scroll_list.row>
<scroll_list.row
name="BAKED_AUX3"
value="edd51b77-fc10-ce7a-4b3d-011dfc349e4f">
<column name="type" value="BAKED_AUX3"/>
</scroll_list.row>
</scroll_list>
</panel>
</tab_container>
</floater>

View File

@@ -3333,6 +3333,7 @@ Where tag = tag string to match. Removes bot's matching the tag.
<string name="skirt">Skirt</string>
<string name="alpha">Alpha</string>
<string name="tattoo">Tattoo</string>
<string name="universal">Universal</string>
<string name="physics">Physics</string>
<string name="invalid">invalid</string>
<string name="unknown">unknown</string>