summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeal Orman <nyx@lindenlab.com>2009-10-16 17:56:30 +0000
committerNeal Orman <nyx@lindenlab.com>2009-10-16 17:56:30 +0000
commitd08b0b6ae8bcd452a3d707ac153107d0f1523df8 (patch)
tree3caac3468a18b105e5aa5eb53cd13ed416c1a48d
parent087897b1f837872fc02822595e5dd47fabf3b7e8 (diff)
merging in new wearable infrastructure to get a step closer to eventually supporting multiple wearables per type. Merge tested and compiles/working on linux and windows - no obvious regressions on appearance or appearance editor. Merge generated no conflicts due to being tested in fresh re-branch in avatar-pipeline/multiple-textures-12. Merge perfomed with following command:
svn merge -r 136489:136510 svn+ssh://svn.lindenlab.com/svn/linden/branches/avatar-pipeline/multiple-textures-12 . Progress can be tracked in DEV-32551. -Nyx
-rw-r--r--indra/llcharacter/llcharacter.h6
-rw-r--r--indra/llcharacter/llvisualparam.cpp23
-rw-r--r--indra/llcharacter/llvisualparam.h11
-rw-r--r--indra/llui/llscrollingpanellist.cpp4
-rw-r--r--indra/llui/llscrollingpanellist.h2
-rw-r--r--indra/llvfs/lldir_linux.cpp14
-rw-r--r--indra/newview/CMakeLists.txt4
-rw-r--r--indra/newview/character/avatar_lad.xml20284
-rw-r--r--indra/newview/llagent.cpp4
-rw-r--r--indra/newview/llagentwearables.cpp219
-rw-r--r--indra/newview/llagentwearables.h12
-rw-r--r--indra/newview/lldriverparam.cpp186
-rw-r--r--indra/newview/lldriverparam.h12
-rw-r--r--indra/newview/llfloateravatartextures.cpp41
-rw-r--r--indra/newview/lllocaltextureobject.cpp122
-rw-r--r--indra/newview/lllocaltextureobject.h21
-rw-r--r--indra/newview/llpaneleditwearable.cpp658
-rw-r--r--indra/newview/llpaneleditwearable.h114
-rw-r--r--indra/newview/llpolymesh.cpp8
-rw-r--r--indra/newview/llpolymesh.h3
-rw-r--r--indra/newview/llpolymorph.cpp8
-rw-r--r--indra/newview/llpolymorph.h3
-rw-r--r--indra/newview/llscrollingpanelparam.cpp388
-rw-r--r--indra/newview/llscrollingpanelparam.h100
-rw-r--r--indra/newview/llspatialpartition.cpp7
-rw-r--r--indra/newview/lltexglobalcolor.cpp13
-rw-r--r--indra/newview/lltexglobalcolor.h4
-rw-r--r--indra/newview/lltexlayer.cpp852
-rw-r--r--indra/newview/lltexlayer.h136
-rw-r--r--indra/newview/lltexlayerparams.cpp37
-rw-r--r--indra/newview/lltexlayerparams.h17
-rw-r--r--indra/newview/llviewerinventory.cpp9
-rw-r--r--indra/newview/llviewermenu.cpp10
-rw-r--r--indra/newview/llviewervisualparam.cpp15
-rw-r--r--indra/newview/llviewervisualparam.h9
-rw-r--r--indra/newview/llvoavatar.cpp192
-rw-r--r--indra/newview/llvoavatar.h12
-rw-r--r--indra/newview/llvoavatarself.cpp213
-rw-r--r--indra/newview/llvoavatarself.h40
-rw-r--r--indra/newview/llwearable.cpp505
-rw-r--r--indra/newview/llwearable.h44
-rw-r--r--indra/newview/llwearablelist.cpp28
-rw-r--r--indra/newview/llwearablelist.h3
-rw-r--r--indra/newview/skins/default/xui/en/floater_customize.xml165
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_alpha.xml126
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_eyes.xml55
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_gloves.xml67
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_hair.xml97
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_jacket.xml79
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_pants.xml67
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_shape.xml189
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_shirt.xml67
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_shoes.xml67
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_skin.xml124
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_skirt.xml67
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_socks.xml67
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_tattoo.xml57
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_underpants.xml67
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_undershirt.xml67
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_wearable.xml365
61 files changed, 15061 insertions, 11133 deletions
diff --git a/indra/llcharacter/llcharacter.h b/indra/llcharacter/llcharacter.h
index cd8f9e63fb..1507686f67 100644
--- a/indra/llcharacter/llcharacter.h
+++ b/indra/llcharacter/llcharacter.h
@@ -203,9 +203,9 @@ public:
void addVisualParam(LLVisualParam *param);
void addSharedVisualParam(LLVisualParam *param);
- BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL set_by_user = FALSE );
- BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user = FALSE );
- BOOL setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user = FALSE );
+ virtual BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL set_by_user = FALSE );
+ virtual BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user = FALSE );
+ virtual BOOL setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user = FALSE );
// get visual param weight by param or name
F32 getVisualParamWeight(LLVisualParam *distortion);
diff --git a/indra/llcharacter/llvisualparam.cpp b/indra/llcharacter/llvisualparam.cpp
index d7a144e00c..e948913a68 100644
--- a/indra/llcharacter/llvisualparam.cpp
+++ b/indra/llcharacter/llvisualparam.cpp
@@ -147,6 +147,21 @@ BOOL LLVisualParamInfo::parseXml(LLXmlTreeNode *node)
return TRUE;
}
+//virtual
+void LLVisualParamInfo::toStream(std::ostream &out)
+{
+ out << mID << "\t";
+ out << mName << "\t";
+ out << mDisplayName << "\t";
+ out << mMinName << "\t";
+ out << mMaxName << "\t";
+ out << mGroup << "\t";
+ out << mMinWeight << "\t";
+ out << mMaxWeight << "\t";
+ out << mDefaultWeight << "\t";
+ out << mSex << "\t";
+}
+
//-----------------------------------------------------------------------------
// LLVisualParam()
//-----------------------------------------------------------------------------
@@ -288,3 +303,11 @@ void LLVisualParam::stopAnimating(BOOL set_by_user)
setWeight(mTargetWeight, set_by_user);
}
}
+
+//virtual
+BOOL LLVisualParam::linkDrivenParams(visual_param_mapper mapper, bool only_cross_params)
+{
+ // nothing to do for non-driver parameters
+ return TRUE;
+}
+
diff --git a/indra/llcharacter/llvisualparam.h b/indra/llcharacter/llvisualparam.h
index 25c41e8509..b2b697766f 100644
--- a/indra/llcharacter/llvisualparam.h
+++ b/indra/llcharacter/llvisualparam.h
@@ -36,6 +36,7 @@
#include "v3math.h"
#include "llstring.h"
#include "llxmltree.h"
+#include <boost/function.hpp>
class LLPolyMesh;
class LLXmlTreeNode;
@@ -68,6 +69,10 @@ public:
virtual ~LLVisualParamInfo() {};
virtual BOOL parseXml(LLXmlTreeNode *node);
+
+ S32 getID() const { return mID; }
+
+ virtual void toStream(std::ostream &out);
protected:
S32 mID; // ID associated with VisualParam
@@ -91,6 +96,9 @@ protected:
//-----------------------------------------------------------------------------
class LLVisualParam
{
+protected:
+ typedef boost::function<LLVisualParam*(S32)> visual_param_mapper;
+
public:
LLVisualParam();
virtual ~LLVisualParam();
@@ -111,6 +119,8 @@ public:
virtual void animate(F32 delta, BOOL set_by_user);
virtual void stopAnimating(BOOL set_by_user);
+ virtual BOOL linkDrivenParams(visual_param_mapper mapper, bool only_cross_params);
+
// Interface methods
S32 getID() const { return mID; }
void setID(S32 id) { llassert(!mInfo); mID = id; }
@@ -150,6 +160,7 @@ protected:
S32 mID; // id for storing weight/morphtarget compares compactly
LLVisualParamInfo *mInfo;
+
};
#endif // LL_LLVisualParam_H
diff --git a/indra/llui/llscrollingpanellist.cpp b/indra/llui/llscrollingpanellist.cpp
index 13fbe1d576..4f55c0507c 100644
--- a/indra/llui/llscrollingpanellist.cpp
+++ b/indra/llui/llscrollingpanellist.cpp
@@ -50,7 +50,7 @@ void LLScrollingPanelList::clearPanels()
reshape( 1, 1, FALSE );
}
-void LLScrollingPanelList::addPanel( LLScrollingPanel* panel )
+S32 LLScrollingPanelList::addPanel( LLScrollingPanel* panel )
{
addChildInBack( panel );
mPanelList.push_front( panel );
@@ -79,6 +79,8 @@ void LLScrollingPanelList::addPanel( LLScrollingPanel* panel )
childp->translate( -childp->getRect().mLeft, cur_y - childp->getRect().mBottom);
cur_y -= GAP_BETWEEN_PANELS;
}
+
+ return total_height;
}
void LLScrollingPanelList::removePanel(LLScrollingPanel* panel)
diff --git a/indra/llui/llscrollingpanellist.h b/indra/llui/llscrollingpanellist.h
index 9da15822d0..3abfbcbbe7 100644
--- a/indra/llui/llscrollingpanellist.h
+++ b/indra/llui/llscrollingpanellist.h
@@ -77,7 +77,7 @@ public:
virtual void draw();
void clearPanels();
- void addPanel( LLScrollingPanel* panel );
+ S32 addPanel( LLScrollingPanel* panel );
void removePanel( LLScrollingPanel* panel );
void removePanel( U32 panel_index );
void updatePanels(BOOL allow_modify);
diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp
index 7a531e0fbf..08c993ed2a 100644
--- a/indra/llvfs/lldir_linux.cpp
+++ b/indra/llvfs/lldir_linux.cpp
@@ -99,7 +99,19 @@ LLDir_Linux::LLDir_Linux()
#else
mAppRODataDir = tmp_str;
#endif
- mSkinBaseDir = mAppRODataDir + mDirDelimiter + "skins";
+ U32 indra_pos = mExecutableDir.find("/indra");
+ if (indra_pos != std::string::npos)
+ {
+ // ...we're in a dev checkout
+ mSkinBaseDir = mExecutableDir.substr(0, indra_pos) + "/indra/newview/skins";
+ llinfos << "Running in dev checkout with mSkinBaseDir "
+ << mSkinBaseDir << llendl;
+ }
+ else
+ {
+ // ...normal installation running
+ mSkinBaseDir = mAppRODataDir + mDirDelimiter + "skins";
+ }
mOSUserDir = getCurrentUserHome(tmp_str);
mOSUserAppDir = "";
mLindenUserDir = tmp_str;
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index c402c3979a..37acdc3cef 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -303,6 +303,7 @@ set(viewer_SOURCE_FILES
llpaneldirland.cpp
llpaneldirpeople.cpp
llpaneldirplaces.cpp
+ llpaneleditwearable.cpp
llpanelevent.cpp
llpanelface.cpp
llpanelgroup.cpp
@@ -358,6 +359,7 @@ set(viewer_SOURCE_FILES
llremoteparcelrequest.cpp
llsavedsettingsglue.cpp
llscreenchannel.cpp
+ llscrollingpanelparam.cpp
llsearchcombobox.cpp
llsearchhistory.cpp
llselectmgr.cpp
@@ -767,6 +769,7 @@ set(viewer_HEADER_FILES
llpaneldirland.h
llpaneldirpeople.h
llpaneldirplaces.h
+ llpaneleditwearable.h
llpanelevent.h
llpanelface.h
llpanelgroup.h
@@ -823,6 +826,7 @@ set(viewer_HEADER_FILES
llresourcedata.h
llrootview.h
llscreenchannel.h
+ llscrollingpanelparam.h
llsavedsettingsglue.h
llsearchcombobox.h
llsearchhistory.h
diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index c943c57fdb..f3bfa37cea 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -1,310 +1,309 @@
<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
<linden_avatar
- version="1.0"
- wearable_definition_version="22">
- <!-- The wearable_definition_version is checked during asset upload. -->
- <!-- If you increment it, check indra/lib/python/indra/assetutil.py. -->
- <skeleton
- file_name="avatar_skeleton.xml">
- <attachment_point
- id="1"
- group="6"
- pie_slice="2"
- name="Chest"
- joint="mChest"
- position="0.15 0 -0.1"
- rotation="0 90 90"
- visible_in_first_person="true" />
-
- <attachment_point
- id="2"
- group="2"
- pie_slice="2"
- name="Skull"
- joint="mHead"
- position="0 0 0.15"
- rotation="0 0 90"
- visible_in_first_person="false" />
-
- <attachment_point
- id="3"
- group="3"
- pie_slice="3"
- name="Left Shoulder"
- joint="mCollarLeft"
- position="0 0 0.08"
- rotation="0 0 0"
- visible_in_first_person="true" />
+ version="1.0" wearable_definition_version="23">
+ <!-- The wearable_definition_version is checked during asset upload. -->
+ <!-- If you increment it, check indra/lib/python/indra/assetutil.py. -->
+ <skeleton
+ file_name="avatar_skeleton.xml">
+ <attachment_point
+ id="1"
+ group="6"
+ pie_slice="2"
+ name="Chest"
+ joint="mChest"
+ position="0.15 0 -0.1"
+ rotation="0 90 90"
+ visible_in_first_person="true" />
- <attachment_point
- id="4"
- group="1"
- pie_slice="1"
- name="Right Shoulder"
- joint="mCollarRight"
- position="0 0 0.08"
- rotation="0 0 0"
- visible_in_first_person="true"/>
-
- <attachment_point
- id="5"
- group="4"
- name="Left Hand"
- joint="mWristLeft"
- position="0 0.08 -0.02"
- rotation="0 0 0"
- visible_in_first_person="true"
- max_attachment_offset="1.5" />
+ <attachment_point
+ id="2"
+ group="2"
+ pie_slice="2"
+ name="Skull"
+ joint="mHead"
+ position="0 0 0.15"
+ rotation="0 0 90"
+ visible_in_first_person="false" />
- <attachment_point
- id="6"
- group="0"
- name="Right Hand"
- joint="mWristRight"
- position="0 -0.08 -0.02"
- rotation="0 0 0"
- visible_in_first_person="true"
- max_attachment_offset="1.5" />
-
- <attachment_point
- id="7"
- group="5"
- pie_slice="6"
- name="Left Foot"
- joint="mFootLeft"
- position="0 0.0 0.0"
- rotation="0 0 0"
- visible_in_first_person="true"/>
-
- <attachment_point
- id="8"
- group="7"
- pie_slice="6"
- name="Right Foot"
- joint="mFootRight"
- position="0 0.0 0.0"
- rotation="0 0 0"
- visible_in_first_person="true"/>
-
- <attachment_point
- id="9"
- group="6"
- pie_slice="7"
- name="Spine"
- joint="mChest"
- position="-0.15 0 -0.1"
- rotation="0 -90 90"
- visible_in_first_person="true" />
-
- <attachment_point
- id="10"
- group="6"
- pie_slice="6"
- name="Pelvis"
- joint="mPelvis"
- position="0 0 -0.15"
- rotation="0 0 0"
- visible_in_first_person="true" />
-
- <attachment_point
- id="11"
- group="2"
- pie_slice="6"
- name="Mouth"
- joint="mHead"
- position="0.12 0 0.001"
- rotation="0 0 0"
- visible_in_first_person="false"/>
-
- <attachment_point
- id="12"
- group="2"
- pie_slice="7"
- name="Chin"
- joint="mHead"
- position="0.12 0 -0.04"
- rotation="0 0 0"
- visible_in_first_person="false" />
-
- <attachment_point
- id="13"
- group="2"
- pie_slice="4"
- name="Left Ear"
- joint="mHead"
- position="0.015 0.08 0.017"
- rotation="0 0 0"
- visible_in_first_person="false" />
-
- <attachment_point
- id="14"
- group="2"
- pie_slice="0"
- name="Right Ear"
- joint="mHead"
- position="0.015 -0.08 0.017"
- rotation="0 0 0"
- visible_in_first_person="false" />
-
- <attachment_point
- id="15"
- group="2"
- pie_slice="3"
- name="Left Eyeball"
- joint="mEyeLeft"
- position="0 0 0"
- rotation="0 0 0"
- visible_in_first_person="false"/>
-
- <attachment_point
- id="16"
- group="2"
- pie_slice="1"
- name="Right Eyeball"
- joint="mEyeRight"
- position="0 0 0"
- rotation="0 0 0"
- visible_in_first_person="false" />
-
- <attachment_point
- id="17"
- group="2"
- pie_slice="5"
- name="Nose"
- joint="mHead"
- position="0.1 0 0.05"
- rotation="0 0 0"
- visible_in_first_person="false"/>
-
- <attachment_point
- id="18"
- group="1"
- pie_slice="0"
- name="R Upper Arm"
- joint="mShoulderRight"
- position="0.01 -0.13 0.01"
- rotation="0 0 0"
- visible_in_first_person="true" />
+ <attachment_point
+ id="3"
+ group="3"
+ pie_slice="3"
+ name="Left Shoulder"
+ joint="mCollarLeft"
+ position="0 0 0.08"
+ rotation="0 0 0"
+ visible_in_first_person="true" />
- <attachment_point
- id="19"
- group="1"
- pie_slice="7"
- name="R Forearm"
- joint="mElbowRight"
- position="0 -0.12 0"
- rotation="0 0 0"
- visible_in_first_person="true"/>
-
- <attachment_point
- id="20"
- group="3"
- pie_slice="4"
- name="L Upper Arm"
- joint="mShoulderLeft"
- position="0.01 0.15 -0.01"
- rotation="0 0 0"
- visible_in_first_person="true" />
-
- <attachment_point
- id="21"
- group="3"
- pie_slice="5"
- name="L Forearm"
- joint="mElbowLeft"
- position="0 0.113 0"
- rotation="0 0 0"
- visible_in_first_person="true" />
-
- <attachment_point
- id="22"
- group="7"
- pie_slice="1"
- name="Right Hip"
- joint="mHipRight"
- position="0 0 0"
- rotation="0 0 0"
- visible_in_first_person="true" />
-
- <attachment_point
- id="23"
- group="7"
- pie_slice="0"
- name="R Upper Leg"
- joint="mHipRight"
- position="-0.017 0.041 -0.310"
- rotation="0 0 0"
- visible_in_first_person="true" />
-
- <attachment_point
- id="24"
- group="7"
- pie_slice="7"
- name="R Lower Leg"
- joint="mKneeRight"
- position="-0.044 -0.007 -0.262"
- rotation="0 0 0"
- visible_in_first_person="true" />
-
- <attachment_point
- id="25"
- group="5"
- pie_slice="3"
- name="Left Hip"
- joint="mHipLeft"
- position="0 0 0"
- rotation="0 0 0"
- visible_in_first_person="true" />
-
- <attachment_point
- id="26"
- group="5"
- pie_slice="4"
- name="L Upper Leg"
- joint="mHipLeft"
- position="-0.019 -0.034 -0.310"
- rotation="0 0 0"
- visible_in_first_person="true"/>
-
- <attachment_point
- id="27"
- group="5"
- pie_slice="5"
- name="L Lower Leg"
- joint="mKneeLeft"
- position="-0.044 -0.007 -0.261"
- rotation="0 0 0"
- visible_in_first_person="true" />
-
- <attachment_point
- id="28"
- group="6"
- pie_slice="5"
- name="Stomach"
- joint="mPelvis"
- position="0.092 0.0 0.088"
- rotation="0 0 0"
- visible_in_first_person="true" />
-
- <attachment_point
- id="29"
- group="6"
- pie_slice="3"
- name="Left Pec"
- joint="mTorso"
- position="0.104 0.082 0.247"
- rotation="0 0 0"
- visible_in_first_person="true" />
-
- <attachment_point
- id="30"
- group="6"
- pie_slice="1"
- name="Right Pec"
- joint="mTorso"
- position="0.104 -0.082 0.247"
- rotation="0 0 0"
- visible_in_first_person="true" />
+ <attachment_point
+ id="4"
+ group="1"
+ pie_slice="1"
+ name="Right Shoulder"
+ joint="mCollarRight"
+ position="0 0 0.08"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="5"
+ group="4"
+ name="Left Hand"
+ joint="mWristLeft"
+ position="0 0.08 -0.02"
+ rotation="0 0 0"
+ visible_in_first_person="true"
+ max_attachment_offset="1.5" />
+
+ <attachment_point
+ id="6"
+ group="0"
+ name="Right Hand"
+ joint="mWristRight"
+ position="0 -0.08 -0.02"
+ rotation="0 0 0"
+ visible_in_first_person="true"
+ max_attachment_offset="1.5" />
+
+ <attachment_point
+ id="7"
+ group="5"
+ pie_slice="6"
+ name="Left Foot"
+ joint="mFootLeft"
+ position="0 0.0 0.0"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="8"
+ group="7"
+ pie_slice="6"
+ name="Right Foot"
+ joint="mFootRight"
+ position="0 0.0 0.0"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="9"
+ group="6"
+ pie_slice="7"
+ name="Spine"
+ joint="mChest"
+ position="-0.15 0 -0.1"
+ rotation="0 -90 90"
+ visible_in_first_person="true" />
+
+ <attachment_point
+ id="10"
+ group="6"
+ pie_slice="6"
+ name="Pelvis"
+ joint="mPelvis"
+ position="0 0 -0.15"
+ rotation="0 0 0"
+ visible_in_first_person="true" />
+
+ <attachment_point
+ id="11"
+ group="2"
+ pie_slice="6"
+ name="Mouth"
+ joint="mHead"
+ position="0.12 0 0.001"
+ rotation="0 0 0"
+ visible_in_first_person="false"/>
+
+ <attachment_point
+ id="12"
+ group="2"
+ pie_slice="7"
+ name="Chin"
+ joint="mHead"
+ position="0.12 0 -0.04"
+ rotation="0 0 0"
+ visible_in_first_person="false" />
+
+ <attachment_point
+ id="13"
+ group="2"
+ pie_slice="4"
+ name="Left Ear"
+ joint="mHead"
+ position="0.015 0.08 0.017"
+ rotation="0 0 0"
+ visible_in_first_person="false" />
+
+ <attachment_point
+ id="14"
+ group="2"
+ pie_slice="0"
+ name="Right Ear"
+ joint="mHead"
+ position="0.015 -0.08 0.017"
+ rotation="0 0 0"
+ visible_in_first_person="false" />
+
+ <attachment_point
+ id="15"
+ group="2"
+ pie_slice="3"
+ name="Left Eyeball"
+ joint="mEyeLeft"
+ position="0 0 0"
+ rotation="0 0 0"
+ visible_in_first_person="false"/>
+
+ <attachment_point
+ id="16"
+ group="2"
+ pie_slice="1"
+ name="Right Eyeball"
+ joint="mEyeRight"
+ position="0 0 0"
+ rotation="0 0 0"
+ visible_in_first_person="false" />
+
+ <attachment_point
+ id="17"
+ group="2"
+ pie_slice="5"
+ name="Nose"
+ joint="mHead"
+ position="0.1 0 0.05"
+ rotation="0 0 0"
+ visible_in_first_person="false"/>
+
+ <attachment_point
+ id="18"
+ group="1"
+ pie_slice="0"
+ name="R Upper Arm"
+ joint="mShoulderRight"
+ position="0.01 -0.13 0.01"
+ rotation="0 0 0"
+ visible_in_first_person="true" />
+
+ <attachment_point
+ id="19"
+ group="1"
+ pie_slice="7"
+ name="R Forearm"
+ joint="mElbowRight"
+ position="0 -0.12 0"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="20"
+ group="3"
+ pie_slice="4"
+ name="L Upper Arm"
+ joint="mShoulderLeft"
+ position="0.01 0.15 -0.01"
+ rotation="0 0 0"
+ visible_in_first_person="true" />
+
+ <attachment_point
+ id="21"
+ group="3"
+ pie_slice="5"
+ name="L Forearm"
+ joint="mElbowLeft"
+ position="0 0.113 0"
+ rotation="0 0 0"
+ visible_in_first_person="true" />
+
+ <attachment_point
+ id="22"
+ group="7"
+ pie_slice="1"
+ name="Right Hip"
+ joint="mHipRight"
+ position="0 0 0"
+ rotation="0 0 0"
+ visible_in_first_person="true" />
+
+ <attachment_point
+ id="23"
+ group="7"
+ pie_slice="0"
+ name="R Upper Leg"
+ joint="mHipRight"
+ position="-0.017 0.041 -0.310"
+ rotation="0 0 0"
+ visible_in_first_person="true" />
+
+ <attachment_point
+ id="24"
+ group="7"
+ pie_slice="7"
+ name="R Lower Leg"
+ joint="mKneeRight"
+ position="-0.044 -0.007 -0.262"
+ rotation="0 0 0"
+ visible_in_first_person="true" />
+
+ <attachment_point
+ id="25"
+ group="5"
+ pie_slice="3"
+ name="Left Hip"
+ joint="mHipLeft"
+ position="0 0 0"
+ rotation="0 0 0"
+ visible_in_first_person="true" />
+
+ <attachment_point
+ id="26"
+ group="5"
+ pie_slice="4"
+ name="L Upper Leg"
+ joint="mHipLeft"
+ position="-0.019 -0.034 -0.310"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="27"
+ group="5"
+ pie_slice="5"
+ name="L Lower Leg"
+ joint="mKneeLeft"
+ position="-0.044 -0.007 -0.261"
+ rotation="0 0 0"
+ visible_in_first_person="true" />
+
+ <attachment_point
+ id="28"
+ group="6"
+ pie_slice="5"
+ name="Stomach"
+ joint="mPelvis"
+ position="0.092 0.0 0.088"
+ rotation="0 0 0"
+ visible_in_first_person="true" />
+
+ <attachment_point
+ id="29"
+ group="6"
+ pie_slice="3"
+ name="Left Pec"
+ joint="mTorso"
+ position="0.104 0.082 0.247"
+ rotation="0 0 0"
+ visible_in_first_person="true" />
+
+ <attachment_point
+ id="30"
+ group="6"
+ pie_slice="1"
+ name="Right Pec"
+ joint="mTorso"
+ position="0.104 -0.082 0.247"
+ rotation="0 0 0"
+ visible_in_first_person="true" />
<attachment_point
id="31"
@@ -394,6 +393,7 @@
max_attachment_offset="2.0"
visible_in_first_person="true" />
+
<param
id="32"
group="1"
@@ -403,10899 +403,10959 @@
label_max="Male"
value_min="0"
value_max="1">
- <param_skeleton>
- <bone
- name="mNeck"
- scale="0 0 .2" />
+ <param_skeleton>
+ <bone
+ name="mNeck"
+ scale="0 0 .2" />
- <bone
- name="mCollarLeft"
- scale="0 .4 0" />
+ <bone
+ name="mCollarLeft"
+ scale="0 .4 0" />
- <bone
- name="mCollarRight"
- scale="0 .4 0" />
+ <bone
+ name="mCollarRight"
+ scale="0 .4 0" />
- <bone
- name="mShoulderLeft"
- scale="0 .35 0" />
+ <bone
+ name="mShoulderLeft"
+ scale="0 .35 0" />
- <bone
- name="mShoulderRight"
- scale="0 .35 0" />
+ <bone
+ name="mShoulderRight"
+ scale="0 .35 0" />
- <bone
- name="mElbowLeft"
- scale="0 .1 0" />
+ <bone
+ name="mElbowLeft"
+ scale="0 .1 0" />
- <bone
- name="mElbowRight"
- scale="0 .1 0" />
+ <bone
+ name="mElbowRight"
+ scale="0 .1 0" />
- <bone
- name="mChest"
- scale=".05 .05 .05" />
+ <bone
+ name="mChest"
+ scale=".05 .05 .05" />
- <bone
- name="mTorso"
- scale="0 0 .05" />
+ <bone
+ name="mTorso"
+ scale="0 0 .05" />
- <bone
- name="mPelvis"
- scale="0 0 0" />
+ <bone
+ name="mPelvis"
+ scale="0 0 0" />
- <bone
- name="mHipLeft"
- scale=".05 .05 0" />
+ <bone
+ name="mHipLeft"
+ scale=".05 .05 0" />
- <bone
- name="mHipRight"
- scale=".05 .05 0" />
+ <bone
+ name="mHipRight"
+ scale=".05 .05 0" />
- <bone
- name="mKneeLeft"
- scale=".05 .05 .1" />
+ <bone
+ name="mKneeLeft"
+ scale=".05 .05 .1" />
- <bone
- name="mKneeRight"
- scale=".05 .05 .1" />
- </param_skeleton>
- </param>
+ <bone
+ name="mKneeRight"
+ scale=".05 .05 .1" />
+ </param_skeleton>
+ </param>
- <param
- id="33"
- group="0"
- name="Height"
- label="Height"
- wearable="shape"
- edit_group="shape_body"
- edit_group_order="1"
- label_min="Short"
- label_max="Tall"
- show_simple="true"
- value_min="-2.3"
- value_max="2"
- camera_distance="2.2">
- <param_skeleton>
- <bone
- name="mNeck"
- scale="0 0 .02" />
+ <param
+ id="33"
+ group="0"
+ name="Height"
+ label="Height"
+ wearable="shape"
+ edit_group="shape_body"
+ edit_group_order="1"
+ label_min="Short"
+ label_max="Tall"
+ show_simple="true"
+ value_min="-2.3"
+ value_max="2"
+ camera_distance="2.2">
+ <param_skeleton>
+ <bone
+ name="mNeck"
+ scale="0 0 .02" />
+
+ <bone
+ name="mCollarLeft"
+ scale="0 0 0" />
+
+ <bone
+ name="mCollarRight"
+ scale="0 0 0" />
+
+ <bone
+ name="mShoulderLeft"
+ scale="0 0.08 0" />
+
+ <bone
+ name="mShoulderRight"
+ scale="0 0.08 0" />
+
+ <bone
+ name="mElbowLeft"
+ scale="0 0.06 0" />
+
+ <bone
+ name="mElbowRight"
+ scale="0 0.06 0" />
+
+ <bone
+ name="mChest"
+ scale="0 0 0.05" />
+
+ <bone
+ name="mTorso"
+ scale="0 0 0.05" />
+
+ <bone
+ name="mPelvis"
+ scale="0 0 0" />
+
+ <bone
+ name="mHipLeft"
+ scale="0 0 0.1" />
+
+ <bone
+ name="mHipRight"
+ scale="0 0 0.1" />
+
+ <bone
+ name="mKneeLeft"
+ scale="0 0 0.1" />
+
+ <bone
+ name="mKneeRight"
+ scale="0 0 0.1" />
+ </param_skeleton>
+ </param>
- <bone
- name="mCollarLeft"
- scale="0 0 0" />
+ <param
+ id="34"
+ group="0"
+ name="Thickness"
+ label="Body Thickness"
+ wearable="shape"
+ edit_group="shape_body"
+ edit_group_order="2"
+ label_min="Body Thin"
+ label_max="Body Thick"
+ show_simple="true"
+ value_min="-0.7"
+ value_max="1.5"
+ camera_distance="1.8">
+ <param_skeleton>
+ <bone
+ name="mNeck"
+ scale="0.1 0.1 0" />
+
+ <bone
+ name="mCollarLeft"
+ scale="0 0.2 0" />
+
+ <bone
+ name="mCollarRight"
+ scale="0 0.2 0" />
+
+ <bone
+ name="mShoulderLeft"
+ scale="0.1 0 0.1" />
+
+ <bone
+ name="mShoulderRight"
+ scale="0.1 0 0.1" />
+
+ <bone
+ name="mElbowLeft"
+ scale="0.1 0 0.1" />
+
+ <bone
+ name="mElbowRight"
+ scale="0.1 0 0.1" />
+
+ <bone
+ name="mChest"
+ scale="0.1 0.1 0" />
+
+ <bone
+ name="mTorso"
+ scale="0.1 0.1 0" />
+
+ <bone
+ name="mPelvis"
+ scale="0.1 0.1 0" />
+
+ <bone
+ name="mHipLeft"
+ scale="0.13 0.13 0" />
+
+ <bone
+ name="mHipRight"
+ scale="0.13 0.13 0" />
+
+ <bone
+ name="mKneeLeft"
+ scale="0.12 0.12 0" />
+
+ <bone
+ name="mKneeRight"
+ scale="0.12 0.12 0" />
+ </param_skeleton>
+ </param>
- <bone
- name="mCollarRight"
- scale="0 0 0" />
+ <param
+ id="36"
+ group="0"
+ name="Shoulders"
+ label="Shoulders"
+ wearable="shape"
+ edit_group="shape_torso"
+ edit_group_order="4"
+ label_min="Narrow"
+ label_max="Broad"
+ show_simple="true"
+ value_min="-1.8"
+ value_max="1.4"
+ value_default="-0.5"
+ camera_elevation=".1"
+ camera_distance="1.2"
+ camera_angle="0">
+ <param_skeleton>
+ <bone
+ name="mNeck"
+ scale="0.01 0.03 0" />
+
+ <bone
+ name="mCollarLeft"
+ scale="0 0 0"
+ offset="0 .02 0" />
+
+ <bone
+ name="mCollarRight"
+ scale="0 0 0"
+ offset="0 -.02 0" />
+
+ <bone
+ name="mChest"
+ scale="0.02 0.08 0" />
+ </param_skeleton>
+ </param>
- <bone
- name="mShoulderLeft"
- scale="0 0.08 0" />
+ <param
+ id="37"
+ group="0"
+ name="Hip Width"
+ label="Hip Width"
+ wearable="shape"
+ edit_group="shape_legs"
+ edit_group_order="3"
+ label_min="Narrow"
+ label_max="Wide"
+ show_simple="true"
+ value_min="-3.2"
+ value_max="2.8"
+ camera_distance="1.8">
+ <param_skeleton>
+ <bone
+ name="mPelvis"
+ scale="0 0.1 0" />
+
+ <bone
+ name="mHipLeft"
+ scale="0 0 0"
+ offset="0 .004 0" />
+
+ <bone
+ name="mHipRight"
+ scale="0 0 0"
+ offset="0 -.004 0" />
+ </param_skeleton>
+ </param>
- <bone
- name="mShoulderRight"
- scale="0 0.08 0" />
+ <param
+ id="842"
+ group="0"
+ name="Hip Length"
+ wearable="shape"
+ edit_group="shape_legs"
+ edit_group_order="3.2"
+ label_min="Short hips"
+ label_max="Long Hips"
+ value_min="-1"
+ value_max="1"
+ camera_distance="1.8">
+ <param_skeleton>
+ <bone
+ name="mPelvis"
+ scale="0 0 0.3" />
+ </param_skeleton>
+ </param>
- <bone
- name="mElbowLeft"
- scale="0 0.06 0" />
+ <param
+ id="38"
+ group="0"
+ name="Torso Length"
+ wearable="shape"
+ edit_group="shape_torso"
+ edit_group_order="11"
+ label_min="Short Torso"
+ label_max="Long Torso"
+ value_min="-1"
+ value_max="1"
+ camera_distance="1.8">
+ <param_skeleton>
+ <bone
+ name="mTorso"
+ scale="0 0 .3" />
+
+ <bone
+ name="mPelvis"
+ scale="0 0 .1" />
+
+ <bone
+ name="mHipLeft"
+ scale="0 0 -.1" />
+
+ <bone
+ name="mHipRight"
+ scale="0 0 -.1" />
+
+ <bone
+ name="mKneeRight"
+ scale="0 0 -.05" />
+
+ <bone
+ name="mKneeLeft"
+ scale="0 0 -.05" />
+ </param_skeleton>
+ </param>
- <bone
- name="mElbowRight"
- scale="0 0.06 0" />
+ <param
+ id="195"
+ group="1"
+ name="EyeBone_Spread"
+ wearable="shape"
+ edit_group="shape_eyes"
+ label_min="Eyes Together"
+ label_max="Eyes Spread"
+ value_min="-1"
+ value_max="1">
+ <param_skeleton>
+ <bone
+ name="mEyeLeft"
+ scale="0 0 0"
+ offset="0 .009 0" />
+
+ <bone
+ name="mEyeRight"
+ scale="0 0 0"
+ offset="0 -.009 0" />
+ </param_skeleton>
+ </param>
- <bone
- name="mChest"
- scale="0 0 0.05" />
+ <param
+ id="661"
+ group="1"
+ name="EyeBone_Head_Shear"
+ wearable="shape"
+ edit_group="shape_eyes"
+ label_min="Eyes Shear Left Up"
+ label_max="Eyes Shear Right Up"
+ value_min="-2"
+ value_max="2">
+ <param_skeleton>
+ <bone
+ name="mEyeLeft"
+ scale="0 0 0"
+ offset="0 0 .004" />
+
+ <bone
+ name="mEyeRight"
+ scale="0 0 0"
+ offset="0 0 -.004" />
+ </param_skeleton>
+ </param>
- <bone
- name="mTorso"
- scale="0 0 0.05" />
+ <param
+ id="772"
+ group="1"
+ name="EyeBone_Head_Elongate"
+ wearable="shape"
+ edit_group="shape_eyes"
+ label_min="Eyes Short Head"
+ label_max="Eyes Long Head"
+ value_min="-1"
+ value_max="1">
+ <param_skeleton>
+ <bone
+ name="mEyeLeft"
+ scale="0 0 0"
+ offset=".016 0 0" />
+
+ <bone
+ name="mEyeRight"
+ scale="0 0 0"
+ offset=".016 0 0" />
+ </param_skeleton>
+ </param>
- <bone
- name="mPelvis"
- scale="0 0 0" />
+ <param
+ id="768"
+ group="1"
+ name="EyeBone_Bug"
+ wearable="shape"
+ edit_group="shape_eyes"
+ label_min="Eyes Sunken"
+ label_max="Eyes Bugged"
+ value_min="-2"
+ value_max="2">
+ <param_skeleton>
+ <bone
+ name="mEyeLeft"
+ scale="0 0 0"
+ offset=".005 0 0" />
+
+ <bone
+ name="mEyeRight"
+ scale="0 0 0"
+ offset=".005 0 0" />
+ </param_skeleton>
+ </param>
- <bone
- name="mHipLeft"
- scale="0 0 0.1" />
+ <param
+ id="655"
+ group="1"
+ name="Head Size"
+ label="Head Size"
+ wearable="shape"
+ edit_group="shape_head"
+ label_min="Small Head"
+ label_max="Big Head"
+ show_simple="true"
+ value_min="-.25"
+ value_max=".10">
+ <param_skeleton>
+ <bone
+ name="mSkull"
+ scale="1 1 1"
+ offset="0 0 0.1" />
+
+ <bone
+ name="mHead"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mEyeLeft"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mEyeRight"
+ scale="1 1 1"
+ offset="0 0 0" />
+ </param_skeleton>
+ </param>
- <bone
- name="mHipRight"
- scale="0 0 0.1" />
+ <param
+ id="197"
+ group="1"
+ wearable="shoes"
+ name="Shoe_Heels"
+ edit_group="shoes"
+ label_min="No Heels"
+ label_max="High Heels"
+ value_min="0"
+ value_max="1">
+ <param_skeleton>
+ <bone
+ name="mFootRight"
+ scale="0 0 0"
+ offset="0 0 -.08" />
+
+ <bone
+ name="mFootLeft"
+ scale="0 0 0"
+ offset="0 0 -.08" />
+ </param_skeleton>
+ </param>
- <bone
- name="mKneeLeft"
- scale="0 0 0.1" />
+ <param
+ id="502"
+ group="1"
+ wearable="shoes"
+ name="Shoe_Platform"
+ edit_group="shoes"
+ label_min="No Heels"
+ label_max="High Heels"
+ value_min="0"
+ value_max="1">
+ <param_skeleton>
+ <bone
+ name="mFootRight"
+ scale="0 0 0"
+ offset="0 0 -.07" />
+
+ <bone
+ name="mFootLeft"
+ scale="0 0 0"
+ offset="0 0 -.07" />
+ </param_skeleton>
+ </param>
- <bone
- name="mKneeRight"
- scale="0 0 0.1" />
- </param_skeleton>
- </param>
+ <param
+ id="675"
+ group="0"
+ name="Hand Size"
+ wearable="shape"
+ edit_group="shape_torso"
+ edit_group_order="10"
+ label_min="Small Hands"
+ label_max="Large Hands"
+ value_min="-.3"
+ value_max=".3"
+ camera_elevation=".1"
+ camera_distance="1.4"
+ camera_angle="0">
+ <param_skeleton>
+ <bone
+ name="mWristRight"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mWristLeft"
+ scale="1 1 1"
+ offset="0 0 0" />
+ </param_skeleton>
+ </param>
- <param
- id="34"
- group="0"
- name="Thickness"
- label="Body Thickness"
- wearable="shape"
- edit_group="shape_body"
- edit_group_order="2"
- label_min="Body Thin"
- label_max="Body Thick"
- show_simple="true"
- value_min="-0.7"
- value_max="1.5"
- camera_distance="1.8">
- <param_skeleton>
- <bone
- name="mNeck"
- scale="0.1 0.1 0" />
+ <param
+ id="683"
+ group="0"
+ name="Neck Thickness"
+ wearable="shape"
+ edit_group="shape_torso"
+ edit_group_order="2"
+ label_min="Skinny Neck"
+ label_max="Thick Neck"
+ value_min="-.4"
+ value_max=".2"
+ value_default="-.15"
+ camera_elevation=".3"
+ camera_distance=".8"
+ camera_angle="15">
+ <param_skeleton>
+ <bone
+ name="mNeck"
+ scale="1 1 0"
+ offset="0 0 0" />
+ </param_skeleton>
+ </param>
- <bone
- name="mCollarLeft"
- scale="0 0.2 0" />
+ <param
+ id="689"
+ group="1"
+ wearable="shape"
+ name="EyeBone_Big_Eyes"
+ edit_group="shape_eyes"
+ label_min="Eyes Back"
+ label_max="Eyes Forward"
+ value_min="-1"
+ value_max="1">
+ <param_skeleton>
+ <bone
+ name="mEyeLeft"
+ scale="0 0 0"
+ offset="-.005 0 0" />
+
+ <bone
+ name="mEyeRight"
+ scale="0 0 0"
+ offset="-.005 0 0" />
+ </param_skeleton>
+ </param>
- <bone
- name="mCollarRight"
- scale="0 0.2 0" />
+ <param
+ id="692"
+ group="0"
+ name="Leg Length"
+ wearable="shape"
+ edit_group="shape_legs"
+ edit_group_order="2"
+ label_min="Short Legs"
+ label_max="Long Legs"
+ value_min="-1"
+ value_max="1"
+ camera_distance="2.5">
+ <param_skeleton>
+ <bone
+ name="mHipLeft"
+ scale="0 0 .2" />
+
+ <bone
+ name="mHipRight"
+ scale="0 0 .2" />
+
+ <bone
+ name="mKneeRight"
+ scale="0 0 .2" />
+
+ <bone
+ name="mKneeLeft"
+ scale="0 0 .2" />
+ </param_skeleton>
+ </param>
- <bone
- name="mShoulderLeft"
- scale="0.1 0 0.1" />
+ <param
+ id="693"
+ group="0"
+ name="Arm Length"
+ wearable="shape"
+ edit_group="shape_torso"
+ edit_group_order="9"
+ label_min="Short Arms"
+ label_max="Long arms"
+ value_min="-1"
+ value_max="1"
+ value_default=".6"
+ camera_distance="1.5">
+ <param_skeleton>
+ <bone
+ name="mShoulderLeft"
+ scale="0 .2 0" />
+
+ <bone
+ name="mShoulderRight"
+ scale="0 .2 0" />
+
+ <bone
+ name="mElbowRight"
+ scale="0 .3 0" />
+
+ <bone
+ name="mElbowLeft"
+ scale="0 .3 0" />
+ </param_skeleton>
+ </param>
- <bone
- name="mShoulderRight"
- scale="0.1 0 0.1" />
+ <param
+ id="756"
+ group="0"
+ name="Neck Length"
+ wearable="shape"
+ edit_group="shape_torso"
+ edit_group_order="3"
+ label_min="Short Neck"
+ label_max="Long Neck"
+ value_min="-1"
+ value_max="1"
+ value_default="0"
+ camera_elevation=".3"
+ camera_distance=".8"
+ camera_angle="15">
+ <param_skeleton>
+ <bone
+ name="mNeck"
+ scale="0 0 .5" />
+ </param_skeleton>
+ </param>
+ </skeleton>
+
+ <mesh
+ type="hairMesh"
+ lod="0"
+ file_name="avatar_hair.llm"
+ min_pixel_width="320">
+ <!-- begin morph targets -->
+ <param
+ id="180"
+ group="1"
+ name="Hair_Volume"
+ label="Hair Volume"
+ show_simple="true"
+ wearable="hair"
+ clothing_morph="true"
+ edit_group="hair_style"
+ label_min="Less"
+ label_max="More"
+ value_min="0"
+ value_max="1.3"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
- <bone
- name="mElbowLeft"
- scale="0.1 0 0.1" />
+ <param
+ id="761"
+ group="1"
+ name="Hair_Volume_Small"
+ label="Hair Volume"
+ show_simple="true"
+ wearable="hair"
+ edit_group="hair_style"
+ label_min="Less"
+ label_max="More"
+ value_min="0"
+ value_max="1.3"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
- <bone
- name="mElbowRight"
- scale="0.1 0 0.1" />
+ <param
+ id="181"
+ group="0"
+ name="Hair_Big_Front"
+ label="Big Hair Front"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="5"
+ label_min="Less"
+ label_max="More"
+ value_min="-1"
+ value_max="1"
+ value_default="0.14"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="90">
+ <param_morph />
+ </param>
- <bone
- name="mChest"
- scale="0.1 0.1 0" />
+ <param
+ id="182"
+ group="0"
+ name="Hair_Big_Top"
+ label="Big Hair Top"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="6"
+ label_min="Less"
+ label_max="More"
+ value_min="-1"
+ value_max="1"
+ value_default=".7"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="90">
+ <param_morph />
+ </param>
- <bone
- name="mTorso"
- scale="0.1 0.1 0" />
+ <param
+ id="183"
+ group="0"
+ name="Hair_Big_Back"
+ clothing_morph="true"
+ label="Big Hair Back"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="7"
+ label_min="Less"
+ label_max="More"
+ value_min="-1"
+ value_max="1"
+ value_default="0.05"
+ camera_elevation=".1"
+ camera_distance=".7"
+ camera_angle="90">
+ <param_morph />
+ </param>
- <bone
- name="mPelvis"
- scale="0.1 0.1 0" />
+ <param
+ id="184"
+ group="0"
+ name="Hair_Spiked"
+ label="Spiked Hair"
+ show_simple="true"
+ wearable="hair"
+ clothing_morph="true"
+ edit_group="hair_style"
+ edit_group_order="15"
+ label_min="No Spikes"
+ label_max="Big Spikes"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
- <bone
- name="mHipLeft"
- scale="0.13 0.13 0" />
+ <param
+ id="140"
+ group="0"
+ name="Hair_Part_Middle"
+ label="Middle Part"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="17"
+ label_min="No Part"
+ label_max="Part"
+ value_min="0"
+ value_max="2"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="0">
+ <param_morph />
+ </param>
- <bone
- name="mHipRight"
- scale="0.13 0.13 0" />
+ <param
+ id="141"
+ group="0"
+ name="Hair_Part_Right"
+ label="Right Part"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="18"
+ label_min="No Part"
+ label_max="Part"
+ value_min="0"
+ value_max="2"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="0">
+ <param_morph />
+ </param>
- <bone
- name="mKneeLeft"
- scale="0.12 0.12 0" />
+ <param
+ id="142"
+ group="0"
+ name="Hair_Part_Left"
+ label="Left Part"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="19"
+ label_min="No Part"
+ label_max="Part"
+ value_min="0"
+ value_max="2"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="0">
+ <param_morph />
+ </param>
- <bone
- name="mKneeRight"
- scale="0.12 0.12 0" />
- </param_skeleton>
- </param>
+ <param
+ id="143"
+ group="0"
+ name="Hair_Sides_Full"
+ label="Full Hair Sides"
+ show_simple="true"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="11"
+ label_min="Mowhawk"
+ label_max="Full Sides"
+ value_min="-4"
+ value_max="1.5"
+ value_default="0.125"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
- <param
- id="36"
- group="0"
- name="Shoulders"
- label="Shoulders"
- wearable="shape"
- edit_group="shape_torso"
- edit_group_order="4"
- label_min="Narrow"
- label_max="Broad"
- show_simple="true"
- value_min="-1.8"
- value_max="1.4"
- value_default="-0.5"
- camera_elevation=".1"
- camera_distance="1.2"
- camera_angle="0">
- <param_skeleton>
- <bone
- name="mNeck"
- scale="0.01 0.03 0" />
+ <param
+ id="144"
+ group="1"
+ name="Bangs_Front_Up"
+ label="Front Bangs Up"
+ wearable="hair"
+ edit_group="hair_style"
+ label_min="Bangs"
+ label_max="Bangs Up"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
- <bone
- name="mCollarLeft"
- scale="0 0 0"
- offset="0 .02 0" />
+ <param
+ id="145"
+ group="1"
+ clothing_morph="true"
+ name="Bangs_Front_Down"
+ label="Front Bangs Down"
+ wearable="hair"
+ edit_group="hair_style"
+ label_min="Bangs"
+ label_max="Bangs Down"
+ value_min="0"
+ value_max="5"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
- <bone
- name="mCollarRight"
- scale="0 0 0"
- offset="0 -.02 0" />
+ <param
+ id="146"
+ group="1"
+ name="Bangs_Sides_Up"
+ label="Side Bangs Up"
+ wearable="hair"
+ edit_group="hair_style"
+ label_min="Side Bangs"
+ label_max="Side Bangs Up"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
- <bone
- name="mChest"
- scale="0.02 0.08 0" />
- </param_skeleton>
- </param>
+ <param
+ id="147"
+ group="1"
+ clothing_morph="true"
+ name="Bangs_Sides_Down"
+ label="Side Bangs Down"
+ wearable="hair"
+ edit_group="hair_style"
+ label_min="Side Bangs"
+ label_max="Side Bangs Down"
+ value_min="0"
+ value_max="2"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
- <param
- id="37"
- group="0"
- name="Hip Width"
- label="Hip Width"
- wearable="shape"
- edit_group="shape_legs"
- edit_group_order="3"
- label_min="Narrow"
- label_max="Wide"
- show_simple="true"
- value_min="-3.2"
- value_max="2.8"
- camera_distance="1.8">
- <param_skeleton>
- <bone
- name="mPelvis"
- scale="0 0.1 0" />
-
- <bone
- name="mHipLeft"
- scale="0 0 0"
- offset="0 .004 0" />
-
- <bone
- name="mHipRight"
- scale="0 0 0"
- offset="0 -.004 0" />
- </param_skeleton>
- </param>
-
- <param
- id="842"
- group="0"
- name="Hip Length"
- wearable="shape"
- edit_group="shape_legs"
- edit_group_order="3.2"
- label_min="Short hips"
- label_max="Long Hips"
- value_min="-1"
- value_max="1"
- camera_distance="1.8">
- <param_skeleton>
- <bone
- name="mPelvis"
- scale="0 0 0.3" />
- </param_skeleton>
- </param>
+ <param
+ id="148"
+ group="1"
+ name="Bangs_Back_Up"
+ label="Back Bangs Up"
+ wearable="hair"
+ edit_group="hair_style"
+ label_min="Back Bangs"
+ label_max="Back Bangs Up"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="150">
+ <param_morph />
+ </param>
- <param
- id="38"
- group="0"
- name="Torso Length"
- wearable="shape"
- edit_group="shape_torso"
- edit_group_order="11"
- label_min="Short Torso"
- label_max="Long Torso"
- value_min="-1"
- value_max="1"
- camera_distance="1.8">
- <param_skeleton>
- <bone
- name="mTorso"
- scale="0 0 .3" />
+ <param
+ id="149"
+ group="1"
+ name="Bangs_Back_Down"
+ label="Back Bangs Down"
+ clothing_morph="true"
+ wearable="hair"
+ edit_group="hair_style"
+ label_min="Back Bangs"
+ label_max="Back Bangs Down"
+ value_min="0"
+ value_max="2"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="150">
+ <param_morph />
+ </param>
- <bone
- name="mPelvis"
- scale="0 0 .1" />
+ <param
+ id="171"
+ group="1"
+ name="Hair_Front_Down"
+ label="Front Hair Down"
+ wearable="hair"
+ edit_group="hair_style"
+ label_min="Front Hair"
+ label_max="Front Hair Down"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
- <bone
- name="mHipLeft"
- scale="0 0 -.1" />
+ <param
+ id="172"
+ group="1"
+ name="Hair_Front_Up"
+ label="Front Hair Up"
+ wearable="hair"
+ edit_group="hair_style"
+ label_min="Front Hair"
+ label_max="Front Hair Up"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
- <bone
- name="mHipRight"
- scale="0 0 -.1" />
+ <param
+ id="173"
+ group="1"
+ name="Hair_Sides_Down"
+ label="Sides Hair Down"
+ wearable="hair"
+ edit_group="hair_style"
+ label_min="Sides Hair"
+ label_max="Sides Hair Down"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
- <bone
- name="mKneeRight"
- scale="0 0 -.05" />
+ <param
+ id="174"
+ group="1"
+ name="Hair_Sides_Up"
+ label="Sides Hair Up"
+ wearable="hair"
+ edit_group="hair_style"
+ label_min="Sides Hair"
+ label_max="Sides Hair Up"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
- <bone
- name="mKneeLeft"
- scale="0 0 -.05" />
- </param_skeleton>
- </param>
+ <param
+ id="175"
+ group="1"
+ name="Hair_Back_Down"
+ label="Back Hair Down"
+ clothing_morph="true"
+ wearable="hair"
+ edit_group="hair_style"
+ label_min="Back Hair"
+ label_max="Back Hair Down"
+ value_min="0"
+ value_max="3"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="150">
+ <param_morph />
+ </param>
- <param
- id="195"
- group="1"
- name="EyeBone_Spread"
- wearable="shape"
- edit_group="shape_eyes"
- label_min="Eyes Together"
- label_max="Eyes Spread"
- value_min="-1"
- value_max="1">
- <param_skeleton>
- <bone
- name="mEyeLeft"
- scale="0 0 0"
- offset="0 .009 0" />
+ <param
+ id="176"
+ group="1"
+ name="Hair_Back_Up"
+ label="Back Hair Up"
+ wearable="hair"
+ edit_group="hair_style"
+ label_min="Back Hair"
+ label_max="Back Hair Up"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="150">
+ <param_morph />
+ </param>
- <bone
- name="mEyeRight"
- scale="0 0 0"
- offset="0 -.009 0" />
- </param_skeleton>
- </param>
+ <param
+ id="177"
+ group="0"
+ name="Hair_Rumpled"
+ label="Rumpled Hair"
+ show_simple="true"
+ wearable="hair"
+ clothing_morph="true"
+ edit_group="hair_style"
+ edit_group_order="14.5"
+ label_min="Smooth Hair"
+ label_max="Rumpled Hair"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
- <param
- id="661"
- group="1"
- name="EyeBone_Head_Shear"
- wearable="shape"
- edit_group="shape_eyes"
- label_min="Eyes Shear Left Up"
- label_max="Eyes Shear Right Up"
- value_min="-2"
- value_max="2">
- <param_skeleton>
- <bone
- name="mEyeLeft"
- scale="0 0 0"
- offset="0 0 .004" />
+ <param
+ id="178"
+ group="1"
+ name="Hair_Swept_Back"
+ label="Swept Back Hair"
+ wearable="hair"
+ edit_group="hair_style"
+ label_min="NotHair"
+ label_max="Swept Back"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="90">
+ <param_morph />
+ </param>
- <bone
- name="mEyeRight"
- scale="0 0 0"
- offset="0 0 -.004" />
- </param_skeleton>
- </param>
+ <param
+ id="179"
+ group="1"
+ name="Hair_Swept_Forward"
+ label="Swept Forward Hair"
+ wearable="hair"
+ edit_group="hair_style"
+ label_min="Hair"
+ label_max="Swept Forward"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="90">
+ <param_morph />
+ </param>
- <param
- id="772"
- group="1"
- name="EyeBone_Head_Elongate"
- wearable="shape"
- edit_group="shape_eyes"
- label_min="Eyes Short Head"
- label_max="Eyes Long Head"
- value_min="-1"
- value_max="1">
- <param_skeleton>
- <bone
- name="mEyeLeft"
- scale="0 0 0"
- offset=".016 0 0" />
+ <param
+ id="190"
+ group="1"
+ name="Hair_Tilt_Right"
+ label="Hair Tilted Right"
+ wearable="hair"
+ edit_group="hair_style"
+ label_min="Hair"
+ label_max="Tilt Right"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="0">
+ <param_morph />
+ </param>
- <bone
- name="mEyeRight"
- scale="0 0 0"
- offset=".016 0 0" />
- </param_skeleton>
- </param>
+ <param
+ id="191"
+ group="1"
+ name="Hair_Tilt_Left"
+ label="Hair Tilted Left"
+ wearable="hair"
+ edit_group="hair_style"
+ label_min="Hair"
+ label_max="Tilt Left"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="0">
+ <param_morph />
+ </param>
- <param
- id="768"
- group="1"
- name="EyeBone_Bug"
- wearable="shape"
- edit_group="shape_eyes"
- label_min="Eyes Sunken"
- label_max="Eyes Bugged"
- value_min="-2"
- value_max="2">
- <param_skeleton>
- <bone
- name="mEyeLeft"
- scale="0 0 0"
- offset=".005 0 0" />
+ <param
+ id="192"
+ group="0"
+ name="Bangs_Part_Middle"
+ label="Part Bangs"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="20"
+ label_min="No Part"
+ label_max="Part Bangs"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="0">
+ <param_morph />
+ </param>
- <bone
- name="mEyeRight"
- scale="0 0 0"
- offset=".005 0 0" />
- </param_skeleton>
- </param>
+ <param
+ id="640"
+ group="1"
+ name="Hair_Egg_Head"
+ wearable="hair"
+ edit_group="hair_style"
+ cross_wearable="true"
+ value_min="-1.3"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="655"
- group="1"
- name="Head Size"
- label="Head Size"
- wearable="shape"
- edit_group="shape_head"
- label_min="Small Head"
- label_max="Big Head"
- show_simple="true"
- value_min="-.25"
- value_max=".10">
- <param_skeleton>
- <bone
- name="mSkull"
- scale="1 1 1"
- offset="0 0 0.1" />
-
- <bone
- name="mHead"
- scale="1 1 1"
- offset="0 0 0" />
-
- <bone
- name="mEyeLeft"
- scale="1 1 1"
- offset="0 0 0" />
-
- <bone
- name="mEyeRight"
- scale="1 1 1"
- offset="0 0 0" />
- </param_skeleton>
- </param>
-
- <param
- id="197"
- group="1"
- wearable="shoes"
- name="Shoe_Heels"
- edit_group="shoes"
- label_min="No Heels"
- label_max="High Heels"
- value_min="0"
- value_max="1">
- <param_skeleton>
- <bone
- name="mFootRight"
- scale="0 0 0"
- offset="0 0 -.08" />
+ <param
+ id="641"
+ group="1"
+ name="Hair_Squash_Stretch_Head"
+ wearable="hair"
+ edit_group="hair_style"
+ cross_wearable="true"
+ value_min="-.5"
+ value_max="1">
+ <param_morph />
+ </param>
- <bone
- name="mFootLeft"
- scale="0 0 0"
- offset="0 0 -.08" />
- </param_skeleton>
- </param>
+ <param
+ id="642"
+ group="1"
+ name="Hair_Square_Head"
+ wearable="hair"
+ edit_group="hair_style"
+ cross_wearable="true"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="502"
- group="1"
- wearable="shoes"
- name="Shoe_Platform"
- edit_group="shoes"
- label_min="No Heels"
- label_max="High Heels"
- value_min="0"
- value_max="1">
- <param_skeleton>
- <bone
- name="mFootRight"
- scale="0 0 0"
- offset="0 0 -.07" />
+ <param
+ id="643"
+ group="1"
+ name="Hair_Round_Head"
+ wearable="hair"
+ edit_group="hair_style"
+ cross_wearable="true"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <bone
- name="mFootLeft"
- scale="0 0 0"
- offset="0 0 -.07" />
- </param_skeleton>
- </param>
+ <param
+ id="644"
+ group="1"
+ name="Hair_Forehead_Round"
+ wearable="hair"
+ edit_group="hair_style"
+ cross_wearable="true"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="675"
- group="0"
- name="Hand Size"
- wearable="shape"
- edit_group="shape_torso"
- edit_group_order="10"
- label_min="Small Hands"
- label_max="Large Hands"
- value_min="-.3"
- value_max=".3"
- camera_elevation=".1"
- camera_distance="1.4"
- camera_angle="0">
- <param_skeleton>
- <bone
- name="mWristRight"
- scale="1 1 1"
- offset="0 0 0" />
+ <param
+ id="645"
+ group="1"
+ name="Hair_Forehead_Slant"
+ wearable="hair"
+ edit_group="hair_style"
+ cross_wearable="true"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <bone
- name="mWristLeft"
- scale="1 1 1"
- offset="0 0 0" />
- </param_skeleton>
- </param>
+ <param
+ id="774"
+ group="1"
+ name="Shear_Head_Hair"
+ wearable="hair"
+ edit_group="hair_style"
+ cross_wearable="true"
+ value_min="-2"
+ value_max="2">
+ <param_morph />
+ </param>
- <param
- id="683"
- group="0"
- name="Neck Thickness"
- wearable="shape"
- edit_group="shape_torso"
- edit_group_order="2"
- label_min="Skinny Neck"
- label_max="Thick Neck"
- value_min="-.4"
- value_max=".2"
- value_default="-.15"
- camera_elevation=".3"
- camera_distance=".8"
- camera_angle="15">
- <param_skeleton>
- <bone
- name="mNeck"
- scale="1 1 0"
- offset="0 0 0" />
- </param_skeleton>
- </param>
-
- <param
- id="689"
- group="1"
- wearable="shape"
- name="EyeBone_Big_Eyes"
- edit_group="shape_eyes"
- label_min="Eyes Back"
- label_max="Eyes Forward"
- value_min="-1"
- value_max="1">
- <param_skeleton>
- <bone
- name="mEyeLeft"
- scale="0 0 0"
- offset="-.005 0 0" />
+ <param
+ id="771"
+ group="1"
+ name="Elongate_Head_Hair"
+ wearable="hair"
+ edit_group="hair_style"
+ cross_wearable="true"
+ value_min="-1"
+ value_max="1">
+ <param_morph />
+ </param>
- <bone
- name="mEyeRight"
- scale="0 0 0"
- offset="-.005 0 0" />
- </param_skeleton>
- </param>
+ <param
+ id="674"
+ group="0"
+ name="Hair_Shear_Back"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="12"
+ label="Shear Back"
+ label_min="Full Back"
+ label_max="Sheared Back"
+ value_min="-1"
+ value_max="2"
+ value_default="-0.3"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="100">
+ <param_morph />
+ </param>
- <param
- id="692"
- group="0"
- name="Leg Length"
- wearable="shape"
- edit_group="shape_legs"
- edit_group_order="2"
- label_min="Short Legs"
- label_max="Long Legs"
- value_min="-1"
- value_max="1"
- camera_distance="2.5">
- <param_skeleton>
- <bone
- name="mHipLeft"
- scale="0 0 .2" />
+ <param
+ id="762"
+ group="0"
+ name="Hair_Shear_Front"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="11.8"
+ label="Shear Front"
+ show_simple="true"
+ label_min="Full Front"
+ label_max="Sheared Front"
+ value_min="0"
+ value_max="3"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="30">
+ <param_morph />
+ </param>
- <bone
- name="mHipRight"
- scale="0 0 .2" />
+ <param
+ id="754"
+ group="0"
+ name="Hair_Taper_Back"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="14"
+ label="Taper Back"
+ label_min="Wide Back"
+ label_max="Narrow Back"
+ value_min="-1"
+ value_max="2"
+ value_default="0"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="160">
+ <param_morph />
+ </param>
- <bone
- name="mKneeRight"
- scale="0 0 .2" />
+ <param
+ id="755"
+ group="0"
+ name="Hair_Taper_Front"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="13"
+ label="Taper Front"
+ label_min="Wide Front"
+ label_max="Narrow Front"
+ value_min="-1.5"
+ value_max="1.5"
+ value_default="0.05"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
- <bone
- name="mKneeLeft"
- scale="0 0 .2" />
- </param_skeleton>
- </param>
+ <param
+ id="782"
+ group="1"
+ clothing_morph="true"
+ name="Hair_Pigtails_Short"
+ wearable="hair"
+ edit_group="hair_style"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="693"
- group="0"
- name="Arm Length"
- wearable="shape"
- edit_group="shape_torso"
- edit_group_order="9"
- label_min="Short Arms"
- label_max="Long arms"
- value_min="-1"
- value_max="1"
- value_default=".6"
- camera_distance="1.5">
- <param_skeleton>
- <bone
- name="mShoulderLeft"
- scale="0 .2 0" />
+ <param
+ id="783"
+ group="1"
+ clothing_morph="true"
+ name="Hair_Pigtails_Med"
+ wearable="hair"
+ edit_group="hair_style"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <bone
- name="mShoulderRight"
- scale="0 .2 0" />
+ <param
+ id="790"
+ group="1"
+ clothing_morph="true"
+ name="Hair_Pigtails_Medlong"
+ wearable="hair"
+ edit_group="hair_style"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <bone
- name="mElbowRight"
- scale="0 .3 0" />
+ <param
+ id="784"
+ group="1"
+ clothing_morph="true"
+ name="Hair_Pigtails_Long"
+ wearable="hair"
+ edit_group="hair_style"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <bone
- name="mElbowLeft"
- scale="0 .3 0" />
- </param_skeleton>
- </param>
+ <param
+ id="786"
+ group="1"
+ name="Hair_Ponytail_Short"
+ wearable="hair"
+ edit_group="hair_style"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="756"
+ <param
+ id="787"
+ group="1"
+ name="Hair_Ponytail_Med"
+ wearable="hair"
+ edit_group="hair_style"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="788"
+ group="1"
+ name="Hair_Ponytail_Long"
+ clothing_morph="true"
+ wearable="hair"
+ edit_group="hair_style"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <!-- #end morph targets -->
+ </mesh>
+
+ <mesh
+ type="hairMesh"
+ lod="1"
+ file_name="avatar_hair_1.llm"
+ min_pixel_width="160"
+ reference="avatar_hair.llm">
+ </mesh>
+
+ <mesh
+ type="hairMesh"
+ lod="2"
+ file_name="avatar_hair_2.llm"
+ min_pixel_width="80"
+ reference="avatar_hair.llm">
+ </mesh>
+
+ <mesh
+ type="hairMesh"
+ lod="3"
+ file_name="avatar_hair_3.llm"
+ min_pixel_width="40"
+ reference="avatar_hair.llm">
+ </mesh>
+
+ <mesh
+ type="hairMesh"
+ lod="4"
+ file_name="avatar_hair_4.llm"
+ min_pixel_width="20"
+ reference="avatar_hair.llm">
+ </mesh>
+
+ <mesh
+ type="hairMesh"
+ lod="5"
+ file_name="avatar_hair_5.llm"
+ min_pixel_width="0"
+ reference="avatar_hair.llm">
+ </mesh>
+
+ <mesh
+ type="headMesh"
+ lod="0"
+ file_name="avatar_head.llm"
+ min_pixel_width="320">
+ <!--
+ begin morph targets
+ #############
+ tweakable morphs
+ #############
+ -->
+ <param
+ id="1"
+ group="0"
+ name="Big_Brow"
+ label="Brow Size"
+ wearable="shape"
+ edit_group="shape_head"
+ edit_group_order="7"
+ label_min="Small"
+ label_max="Large"
+ value_min="-.3"
+ value_max="2"
+ camera_elevation=".1"
+ camera_distance=".4"
+ camera_angle="45">
+ <param_morph />
+ </param>
+
+ <param
+ id="2"
+ group="0"
+ name="Nose_Big_Out"
+ label="Nose Size"
+ wearable="shape"
+ edit_group="shape_nose"
+ edit_group_order="1"
+ label_min="Small"
+ label_max="Large"
+ show_simple="true"
+ value_min="-0.8"
+ value_max="2.5"
+ camera_elevation=".1"
+ camera_distance=".35"
+ camera_angle="50">
+ <param_morph />
+ </param>
+
+ <param
+ id="4"
+ group="0"
+ name="Broad_Nostrils"
+ label="Nostril Width"
+ wearable="shape"
+ edit_group="shape_nose"
+ edit_group_order="3"
+ label_min="Narrow"
+ label_max="Broad"
+ value_min="-.5"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".3"
+ camera_angle="-20">
+ <param_morph />
+ </param>
+
+ <param
+ id="759"
+ group="0"
+ name="Low_Septum_Nose"
+ label="Nostril Division"
+ wearable="shape"
+ edit_group="shape_nose"
+ edit_group_order="3.5"
+ label_min="High"
+ label_max="Low"
+ value_min="-1"
+ value_max="1.5"
+ value_default="0.5"
+ camera_elevation=".1"
+ camera_distance=".3"
+ camera_angle="-20">
+ <param_morph />
+ </param>
+
+ <param
+ id="517"
+ group="0"
+ name="Wide_Nose"
+ label="Nose Width"
+ wearable="shape"
+ edit_group="shape_nose"
+ edit_group_order="2"
+ label_min="Narrow"
+ label_max="Wide"
+ show_simple="true"
+ value_min="-.5"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".3"
+ camera_angle="-20">
+ <param_morph />
+ </param>
+
+ <param
+ id="5"
+ group="0"
+ name="Cleft_Chin"
+ label="Chin Cleft"
+ wearable="shape"
+ edit_group="shape_chin"
+ edit_group_order="6"
+ label_min="Round"
+ label_max="Cleft"
+ value_min="-.1"
+ value_max="1"
+ camera_elevation="0"
+ camera_distance=".28"
+ camera_angle="-20">
+ <param_morph />
+ </param>
+
+ <param
+ id="6"
+ group="0"
+ name="Bulbous_Nose_Tip"
+ label="Nose Tip Shape"
+ wearable="shape"
+ edit_group="shape_nose"
+ edit_group_order="8"
+ label_min="Pointy"
+ label_max="Bulbous"
+ value_min="-.3"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".35"
+ camera_angle="15">
+ <param_morph />
+ </param>
+
+ <param
+ id="7"
+ group="0"
+ name="Weak_Chin"
+ label="Chin Angle"
+ wearable="shape"
+ edit_group="shape_chin"
+ edit_group_order="1"
+ label_min="Chin Out"
+ label_max="Chin In"
+ value_min="-.5"
+ value_max=".5"
+ camera_elevation=".1"
+ camera_distance=".4"
+ camera_angle="45">
+ <param_morph />
+ </param>
+
+ <param
+ id="8"
+ group="0"
+ name="Double_Chin"
+ label="Chin-Neck"
+ wearable="shape"
+ edit_group="shape_chin"
+ edit_group_order="8"
+ label_min="Tight Chin"
+ label_max="Double Chin"
+ value_min="-.5"
+ value_max="1.5"
+ camera_elevation="-.1"
+ camera_distance=".3"
+ camera_angle="60">
+ <param_morph />
+ </param>
+
+ <param
+ id="10"
+ group="0"
+ name="Sunken_Cheeks"
+ label="Lower Cheeks"
+ wearable="shape"
+ edit_group="shape_head"
+ edit_group_order="9"
+ label_min="Well-Fed"
+ label_max="Sunken"
+ show_simple="true"
+ value_min="-1.5"
+ value_max="3"
+ camera_elevation=".1"
+ camera_distance=".4"
+ camera_angle="5">
+ <param_morph />
+ </param>
+
+ <param
+ id="11"
+ group="0"
+ name="Noble_Nose_Bridge"
+ label="Upper Bridge"
+ wearable="shape"
+ edit_group="shape_nose"
+ edit_group_order="5"
+ label_min="Low"
+ label_max="High"
+ value_min="-.5"
+ value_max="1.5"
+ camera_elevation=".1"
+ camera_distance=".35"
+ camera_angle="70">
+ <param_morph />
+ </param>
+
+ <param
+ id="758"
+ group="0"
+ name="Lower_Bridge_Nose"
+ label="Lower Bridge"
+ wearable="shape"
+ edit_group="shape_nose"
+ edit_group_order="5.5"
+ label_min="Low"
+ label_max="High"
+ value_min="-1.5"
+ value_max="1.5"
+ camera_elevation=".1"
+ camera_distance=".35"
+ camera_angle="70">
+ <param_morph />
+ </param>
+
+ <param
+ id="12"
+ group="0"
+ name="Jowls"
+ wearable="shape"
+ edit_group="shape_chin"
+ edit_group_order="5"
+ label_min="Less"
+ label_max="More"
+ value_min="-.5"
+ value_max="2.5"
+ camera_elevation=".1"
+ camera_distance=".4"
+ camera_angle="0">
+ <param_morph />
+ </param>
+
+ <param
+ id="13"
+ group="0"
+ name="Cleft_Chin_Upper"
+ label="Upper Chin Cleft"
+ wearable="shape"
+ edit_group="shape_chin"
+ edit_group_order="7"
+ label_min="Round"
+ label_max="Cleft"
+ value_min="0"
+ value_max="1.5"
+ camera_elevation="0"
+ camera_distance=".28"
+ camera_angle="-20">
+ <param_morph />
+ </param>
+
+ <param
+ id="14"
+ group="0"
+ name="High_Cheek_Bones"
+ label="Cheek Bones"
+ wearable="shape"
+ edit_group="shape_head"
+ edit_group_order="10"
+ label_min="Low"
+ label_max="High"
+ value_min="-.5"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".3"
+ camera_angle="-20">
+ <param_morph />
+ </param>
+
+ <param
+ id="15"
+ group="0"
+ name="Ears_Out"
+ label="Ear Angle"
+ wearable="shape"
+ edit_group="shape_ears"
+ edit_group_order="2"
+ label_min="In"
+ label_max="Out"
+ value_min="-.5"
+ value_max="1.5"
+ camera_elevation=".1"
+ camera_distance=".3"
+ camera_angle="-20">
+ <param_morph />
+ </param>
+
+ <!--Pointy eyebrows became a driver/driven param with new max value for backwards compatibility between 1.0 and 1.1-->
+ <param
+ id="870"
+ group="1"
+ name="Pointy_Eyebrows"
+ label="Eyebrow Points"
+ wearable="hair"
+ edit_group="hair_eyebrows"
+ edit_group_order="4"
+ label_min="Smooth"
+ label_max="Pointy"
+ value_min="-.5"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".3">
+ <param_morph />
+ </param>
+
+ <param
+ id="17"
+ group="0"
+ name="Square_Jaw"
+ label="Jaw Shape"
+ wearable="shape"
+ edit_group="shape_chin"
+ edit_group_order="2"
+ label_min="Pointy"
+ label_max="Square"
+ value_min="-.5"
+ value_max="1"
+ camera_distance=".3"
+ camera_elevation=".04"
+ camera_angle="-20">
+ <param_morph />
+ </param>
+
+ <param
+ id="18"
+ group="0"
+ name="Puffy_Upper_Cheeks"
+ label="Upper Cheeks"
+ wearable="shape"
+ edit_group="shape_head"
+ edit_group_order="8"
+ label_min="Thin"
+ label_max="Puffy"
+ value_min="-1.5"
+ value_max="2.5"
+ camera_elevation=".1"
+ camera_distance=".3"
+ camera_angle="-20">
+ <param_morph />
+ </param>
+
+ <param
+ id="19"
+ group="0"
+ name="Upturned_Nose_Tip"
+ label="Nose Tip Angle"
+ wearable="shape"
+ edit_group="shape_nose"
+ edit_group_order="7"
+ label_min="Downturned"
+ label_max="Upturned"
+ value_min="-1.5"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".35"
+ camera_angle="15">
+ <param_morph />
+ </param>
+
+ <param
+ id="20"
+ group="0"
+ name="Bulbous_Nose"
+ label="Nose Thickness"
+ wearable="shape"
+ edit_group="shape_nose"
+ edit_group_order="4"
+ label_min="Thin Nose"
+ label_max="Bulbous Nose"
+ show_simple="true"
+ value_min="-.5"
+ value_max="1.5"
+ camera_elevation=".1"
+ camera_distance=".3">
+ <param_morph />
+ </param>
+
+ <param
+ id="21"
+ group="0"
+ name="Upper_Eyelid_Fold"
+ label="Upper Eyelid Fold"
+ wearable="shape"
+ edit_group="shape_eyes"
+ edit_group_order="5"
+ label_min="Uncreased"
+ label_max="Creased"
+ value_min="-0.2"
+ value_max="1.3"
+ camera_elevation=".1"
+ camera_distance=".35">
+ <param_morph />
+ </param>
+
+ <param
+ id="22"
+ group="0"
+ name="Attached_Earlobes"
+ label="Attached Earlobes"
+ wearable="shape"
+ edit_group="shape_ears"
+ edit_group_order="3"
+ label_min="Unattached"
+ label_max="Attached"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".3"
+ camera_angle="45">
+ <param_morph />
+ </param>
+
+ <param
+ id="23"
+ group="0"
+ name="Baggy_Eyes"
+ label="Eye Bags"
+ wearable="shape"
+ edit_group="shape_eyes"
+ edit_group_order="6"
+ label_min="Smooth"
+ label_max="Baggy"
+ value_min="-.5"
+ value_max="1.5"
+ camera_elevation=".1"
+ camera_distance=".35">
+ <param_morph />
+ </param>
+
+ <param
+ id="765"
+ group="0"
+ name="Puffy_Lower_Lids"
+ label="Puffy Eyelids"
+ wearable="shape"
+ edit_group="shape_eyes"
+ edit_group_order="6.1"
+ label_min="Flat"
+ label_max="Puffy"
+ value_min="-.3"
+ value_max="2.5"
+ camera_elevation=".1"
+ camera_distance=".35">
+ <param_morph />
+ </param>
+
+ <param
+ id="24"
+ group="0"
+ name="Wide_Eyes"
+ label="Eye Opening"
+ wearable="shape"
+ edit_group="shape_eyes"
+ edit_group_order="1.1"
+ label_min="Narrow"
+ label_max="Wide"
+ value_min="-1.5"
+ value_max="2"
+ show_simple="true"
+ camera_elevation=".1"
+ camera_distance=".35">
+ <param_morph />
+ </param>
+
+ <param
+ id="25"
+ group="0"
+ name="Wide_Lip_Cleft"
+ label="Lip Cleft"
+ wearable="shape"
+ edit_group="shape_mouth"
+ edit_group_order="6"
+ label_min="Narrow"
+ label_max="Wide"
+ value_min="-.8"
+ value_max="1.5"
+ camera_elevation="0"
+ camera_distance=".28">
+ <param_morph />
+ </param>
+
+ <param
+ id="764"
+ group="0"
+ name="Lip_Cleft_Deep"
+ label="Lip Cleft Depth"
+ wearable="shape"
+ edit_group="shape_mouth"
+ edit_group_order="5.8"
+ label_min="Shallow"
+ label_max="Deep"
+ value_min="-.5"
+ value_max="1.2"
+ camera_elevation="0"
+ camera_distance=".28">
+ <param_morph />
+ </param>
+
+ <param
+ id="26"
+ group="1"
+ wearable="shape"
+ name="Lips_Thin"
+ edit_group="driven"
+ value_min="0"
+ value_max=".7">
+ <param_morph />
+ </param>
+
+ <param
+ id="27"
+ group="0"
+ name="Wide_Nose_Bridge"
+ label="Bridge Width"
+ wearable="shape"
+ edit_group="shape_nose"
+ edit_group_order="6"
+ label_min="Narrow"
+ label_max="Wide"
+ value_min="-1.3"
+ value_max="1.2"
+ camera_elevation=".1"
+ camera_distance=".3"
+ camera_angle="-20">
+ <param_morph />
+ </param>
+
+ <param
+ id="28"
+ group="1"
+ name="Lips_Fat"
+ wearable="shape"
+ edit_group="driven"
+ value_min="0"
+ value_max="2">
+ <param_morph />
+ </param>
+
+ <param
+ id="29"
+ group="1"
+ name="Wide_Upper_Lip"
+ wearable="shape"
+ edit_group="driven"
+ value_min="-.7"
+ value_max="1.3">
+ <param_morph />
+ </param>
+
+ <param
+ id="30"
+ group="1"
+ name="Wide_Lower_Lip"
+ wearable="shape"
+ edit_group="driven"
+ value_min="-.7"
+ value_max="1.3">
+ <param_morph />
+ </param>
+
+ <!--Arced eyebrows became a driver/driven param with new max value for backwards compatibility between 1.0 and 1.1-->
+ <param
+ id="872"
+ group="1"
+ name="Arced_Eyebrows"
+ label="Eyebrow Arc"
+ wearable="hair"
+ edit_group="hair_eyebrows"
+ edit_group_order="3"
+ label_min="Flat"
+ label_max="Arced"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <!--Lower eyebrows became a driver/driven param with new min value for backwards compatibility between 1.0 and 1.1-->
+ <param
+ id="871"
+ group="1"
+ name="Lower_Eyebrows"
+ label="Eyebrow Height"
+ show_simple="true"
+ wearable="hair"
+ edit_group="hair_eyebrows"
+ edit_group_order="2.5"
+ label_min="Higher"
+ label_max="Lower"
+ value_min="-2"
+ value_max="2">
+ <param_morph />
+ </param>
+
+ <param
+ id="35"
+ group="0"
+ name="Big_Ears"
+ label="Ear Size"
+ wearable="shape"
+ edit_group="shape_ears"
+ edit_group_order="1"
+ label_min="Small"
+ label_max="Large"
+ value_min="-1"
+ value_max="2"
+ camera_elevation=".1"
+ camera_distance=".3"
+ camera_angle="45">
+ <param_morph />
+ </param>
+
+ <param
+ id="796"
+ group="0"
+ name="Pointy_Ears"
+ label="Ear Tips"
+ wearable="shape"
+ edit_group="shape_ears"
+ edit_group_order="4"
+ label_min="Flat"
+ label_max="Pointy"
+ value_min="-.4"
+ value_max="3"
+ camera_elevation=".1"
+ camera_distance=".3"
+ camera_angle="45">
+ <param_morph />
+ </param>
+
+ <param
+ id="185"
+ group="0"
+ name="Deep_Chin"
+ label="Chin Depth"
+ wearable="shape"
+ edit_group="shape_chin"
+ edit_group_order="3"
+ label_min="Shallow"
+ label_max="Deep"
+ value_min="-1"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".4"
+ camera_angle="30">
+ <param_morph />
+ </param>
+
+ <param
+ id="186"
+ group="1"
+ name="Egg_Head"
+ label="Egg Head"
+ wearable="shape"
+ edit_group="shape_head"
+ label_min="Chin Heavy"
+ label_max="Forehead Heavy"
+ value_min="-1.3"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
+
+ <param
+ id="187"
+ group="1"
+ name="Squash_Stretch_Head"
+ label="Squash/Stretch Head"
+ wearable="shape"
+ edit_group="shape_head"
+ label_min="Squash Head"
+ label_max="Stretch Head"
+ value_min="-.5"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph>
+ <volume_morph
+ name="HEAD"
+ scale="-0.008 -0.006 0.015"/>
+ </param_morph>
+ </param>
+
+ <param
+ id="188"
+ group="1"
+ name="Square_Head"
+ wearable="shape"
+ label_min="Less Square"
+ label_max="More Square"
+ value_min="0"
+ value_max=".7"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
+
+ <param
+ id="189"
+ group="1"
+ wearable="shape"
+ name="Round_Head"
+ label_min="Less Round"
+ label_max="More Round"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
+
+ <param
+ id="194"
+ group="1"
+ name="Eye_Spread"
+ wearable="shape"
+ edit_group="shape_eyes"
+ label_min="Eyes Together"
+ label_max="Eyes Spread"
+ value_min="-2"
+ value_max="2">
+ <param_morph />
+ </param>
+
+ <param
+ id="400"
+ sex="male"
+ group="1"
+ name="Displace_Hair_Facial"
+ label="Hair Thickess"
+ wearable="hair"
+ edit_group="hair_facial"
+ label_min="Cropped Hair"
+ label_max="Bushy Hair"
+ value_min="0"
+ value_max="2">
+ <param_morph />
+ </param>
+
+ <param
+ id="506"
+ group="0"
+ name="Mouth_Height"
+ wearable="shape"
+ label="Mouth Position"
+ show_simple="true"
+ edit_group="shape_mouth"
+ edit_group_order="4"
+ label_min="High"
+ label_max="Low"
+ value_min="-2"
+ value_max="2"
+ camera_distance=".3"
+ camera_elevation=".04">
+ <param_morph />
+ </param>
+
+ <param
+ id="633"
+ group="1"
+ name="Fat_Head"
+ label="Fat Head"
+ wearable="shape"
+ edit_group="shape_body"
+ label_min="Skinny"
+ label_max="Fat"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".3">
+ <param_morph/>
+ </param>
+
+ <param
+ id="630"
+ group="1"
+ name="Forehead_Round"
+ label="Round Forehead"
+ wearable="shape"
+ label_min="Less"
+ label_max="More"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="631"
+ group="1"
+ name="Forehead_Slant"
+ label="Slanted Forehead"
+ wearable="shape"
+ label_min="Less"
+ label_max="More"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="650"
+ group="0"
+ name="Eyelid_Corner_Up"
+ label="Outer Eye Corner"
+ wearable="shape"
+ edit_group="shape_eyes"
+ edit_group_order="4"
+ label_min="Corner Down"
+ label_max="Corner Up"
+ value_min="-1.3"
+ value_max="1.2"
+ camera_elevation=".1"
+ camera_distance=".30">
+ <param_morph />
+ </param>
+
+ <param
+ id="880"
group="0"
- name="Neck Length"
+ name="Eyelid_Inner_Corner_Up"
+ label="Inner Eye Corner"
wearable="shape"
- edit_group="shape_torso"
- edit_group_order="3"
- label_min="Short Neck"
- label_max="Long Neck"
- value_min="-1"
- value_max="1"
- value_default="0"
- camera_elevation=".3"
- camera_distance=".8"
- camera_angle="15">
- <param_skeleton>
- <bone
- name="mNeck"
- scale="0 0 .5" />
- </param_skeleton>
- </param>
- </skeleton>
-
- <mesh
- type="hairMesh"
- lod="0"
- file_name="avatar_hair.llm"
- min_pixel_width="320">
-<!-- begin morph targets -->
- <param
- id="180"
- group="1"
- name="Hair_Volume"
- label="Hair Volume"
- show_simple="true"
- wearable="hair"
- clothing_morph="true"
- edit_group="hair_style"
- label_min="Less"
- label_max="More"
- value_min="0"
- value_max="1.3"
+ edit_group="shape_eyes"
+ edit_group_order="4.2"
+ label_min="Corner Down"
+ label_max="Corner Up"
+ value_min="-1.3"
+ value_max="1.2"
camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
- </param>
+ camera_distance=".30">
+ <param_morph />
+ </param>
+
- <param
- id="761"
- group="1"
- name="Hair_Volume_Small"
- label="Hair Volume"
- show_simple="true"
- wearable="hair"
- edit_group="hair_style"
- label_min="Less"
- label_max="More"
- value_min="0"
- value_max="1.3"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
- </param>
+ <param
+ id="653"
+ group="0"
+ name="Tall_Lips"
+ wearable="shape"
+ label="Lip Fullness"
+ show_simple="true"
+ edit_group="shape_mouth"
+ edit_group_order="2"
+ label_min="Less Full"
+ label_max="More Full"
+ value_min="-1"
+ value_max="2"
+ camera_distance=".3"
+ camera_elevation=".04">
+ <param_morph />
+ </param>
- <param
- id="181"
- group="0"
- name="Hair_Big_Front"
- label="Big Hair Front"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="5"
- label_min="Less"
- label_max="More"
- value_min="-1"
- value_max="1"
- value_default="0.14"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="90">
- <param_morph />
- </param>
+ <param
+ id="656"
+ group="0"
+ name="Crooked_Nose"
+ wearable="shape"
+ label="Crooked Nose"
+ edit_group="shape_nose"
+ edit_group_order="9"
+ label_min="Nose Left"
+ label_max="Nose Right"
+ value_min="-2"
+ value_max="2"
+ camera_distance=".3"
+ camera_elevation=".04"
+ camera_angle="-20">
+ <param_morph />
+ </param>
- <param
- id="182"
- group="0"
- name="Hair_Big_Top"
- label="Big Hair Top"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="6"
- label_min="Less"
- label_max="More"
- value_min="-1"
- value_max="1"
- value_default=".7"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="90">
- <param_morph />
- </param>
+ <param
+ id="657"
+ group="1"
+ name="Smile_Mouth"
+ wearable="shape"
+ label="Mouth Corner"
+ edit_group="shape_mouth"
+ label_min="Corner Normal"
+ label_max="Corner Up"
+ value_min="0"
+ value_max="1.4"
+ camera_distance=".3"
+ camera_elevation=".04">
+ <param_morph />
+ </param>
- <param
- id="183"
- group="0"
- name="Hair_Big_Back"
- clothing_morph="true"
- label="Big Hair Back"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="7"
- label_min="Less"
- label_max="More"
- value_min="-1"
- value_max="1"
- value_default="0.05"
- camera_elevation=".1"
- camera_distance=".7"
- camera_angle="90">
- <param_morph />
- </param>
+ <param
+ id="658"
+ group="1"
+ name="Frown_Mouth"
+ wearable="shape"
+ label="Mouth Corner"
+ edit_group="shape_mouth"
+ label_min="Corner Normal"
+ label_max="Corner Down"
+ value_min="0"
+ value_max="1.2"
+ camera_distance=".3"
+ camera_elevation=".04">
+ <param_morph />
+ </param>
- <param
- id="184"
- group="0"
- name="Hair_Spiked"
- label="Spiked Hair"
- show_simple="true"
- wearable="hair"
- clothing_morph="true"
- edit_group="hair_style"
- edit_group_order="15"
- label_min="No Spikes"
- label_max="Big Spikes"
- value_min="0"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
- </param>
+ <param
+ id="797"
+ group="1"
+ name="Fat_Upper_Lip"
+ wearable="shape"
+ label="Fat Upper Lip"
+ edit_group="shape_mouth"
+ label_min="Normal Upper"
+ label_max="Fat Upper"
+ value_min="0"
+ value_max="1.5"
+ camera_distance=".3"
+ camera_elevation=".04">
+ <param_morph />
+ </param>
- <param
- id="140"
- group="0"
- name="Hair_Part_Middle"
- label="Middle Part"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="17"
- label_min="No Part"
- label_max="Part"
- value_min="0"
- value_max="2"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="0">
- <param_morph />
- </param>
+ <param
+ id="798"
+ group="1"
+ name="Fat_Lower_Lip"
+ wearable="shape"
+ label="Fat Lower Lip"
+ edit_group="shape_mouth"
+ label_min="Normal Lower"
+ label_max="Fat Lower"
+ value_min="0"
+ value_max="1.5"
+ camera_distance=".3"
+ camera_elevation=".04">
+ <param_morph />
+ </param>
- <param
- id="141"
- group="0"
- name="Hair_Part_Right"
- label="Right Part"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="18"
- label_min="No Part"
- label_max="Part"
- value_min="0"
- value_max="2"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="0">
- <param_morph />
- </param>
+ <param
+ id="660"
+ group="1"
+ name="Shear_Head"
+ wearable="shape"
+ label="Shear Face"
+ edit_group="shape_head"
+ label_min="Shear Left"
+ label_max="Shear Right"
+ value_min="-2"
+ value_max="2"
+ value_default="0"
+ camera_distance=".5"
+ camera_elevation=".04">
+ <param_morph />
+ </param>
- <param
- id="142"
- group="0"
- name="Hair_Part_Left"
- label="Left Part"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="19"
- label_min="No Part"
- label_max="Part"
- value_min="0"
- value_max="2"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="0">
- <param_morph />
- </param>
+ <param
+ id="770"
+ group="1"
+ name="Elongate_Head"
+ wearable="shape"
+ label="Shear Face"
+ edit_group="shape_head"
+ label_min="Flat Head"
+ label_max="Long Head"
+ value_min="-1"
+ value_max="1"
+ value_default="0"
+ camera_distance=".5"
+ camera_elevation=".04">
+ <param_morph>
+ <volume_morph
+ name="HEAD"
+ scale="0.02 0.0 0.0"/>
+ </param_morph>
+ </param>
- <param
- id="143"
- group="0"
- name="Hair_Sides_Full"
- label="Full Hair Sides"
- show_simple="true"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="11"
- label_min="Mowhawk"
- label_max="Full Sides"
- value_min="-4"
- value_max="1.5"
- value_default="0.125"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
- </param>
+ <param
+ id="663"
+ group="0"
+ name="Shift_Mouth"
+ wearable="shape"
+ label="Shift Mouth"
+ edit_group="shape_mouth"
+ edit_group_order="7"
+ label_min="Shift Left"
+ label_max="Shift Right"
+ value_min="-2"
+ value_max="2"
+ value_default="0"
+ camera_distance=".35"
+ camera_elevation=".04"
+ camera_angle="-20">
+ <param_morph />
+ </param>
- <param
- id="144"
- group="1"
- name="Bangs_Front_Up"
- label="Front Bangs Up"
- wearable="hair"
- edit_group="hair_style"
- label_min="Bangs"
- label_max="Bangs Up"
- value_min="0"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
- </param>
+ <param
+ id="664"
+ group="0"
+ name="Pop_Eye"
+ wearable="shape"
+ label="Eye Pop"
+ edit_group="shape_eyes"
+ edit_group_order="8"
+ label_min="Pop Right Eye"
+ label_max="Pop Left Eye"
+ value_min="-1.3"
+ value_max="1.3"
+ value_default="0"
+ camera_elevation=".1"
+ camera_distance=".35">
+ <param_morph />
+ </param>
- <param
- id="145"
- group="1"
- clothing_morph="true"
- name="Bangs_Front_Down"
- label="Front Bangs Down"
- wearable="hair"
- edit_group="hair_style"
- label_min="Bangs"
- label_max="Bangs Down"
- value_min="0"
- value_max="5"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
- </param>
+ <param
+ id="760"
+ group="0"
+ name="Jaw_Angle"
+ wearable="shape"
+ label="Jaw Angle"
+ edit_group="shape_chin"
+ edit_group_order="3.5"
+ label_min="Low Jaw"
+ label_max="High Jaw"
+ value_min="-1.2"
+ value_max="2"
+ value_default="0"
+ camera_distance=".5"
+ camera_elevation=".04"
+ camera_angle="70">
+ <param_morph />
+ </param>
- <param
- id="146"
- group="1"
- name="Bangs_Sides_Up"
- label="Side Bangs Up"
- wearable="hair"
- edit_group="hair_style"
- label_min="Side Bangs"
- label_max="Side Bangs Up"
- value_min="0"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
- </param>
+ <param
+ id="665"
+ group="0"
+ name="Jaw_Jut"
+ wearable="shape"
+ label="Jaw Jut"
+ edit_group="shape_chin"
+ edit_group_order="4"
+ label_min="Overbite"
+ label_max="Underbite"
+ value_min="-2"
+ value_max="2"
+ value_default="0"
+ camera_distance=".5"
+ camera_elevation=".04"
+ camera_angle="70">
+ <param_morph />
+ </param>
- <param
- id="147"
- group="1"
- clothing_morph="true"
- name="Bangs_Sides_Down"
- label="Side Bangs Down"
- wearable="hair"
- edit_group="hair_style"
- label_min="Side Bangs"
- label_max="Side Bangs Down"
- value_min="0"
- value_max="2"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
- </param>
+ <param
+ id="686"
+ group="1"
+ name="Head_Eyes_Big"
+ wearable="shape"
+ label="Eye Size"
+ edit_group="shape_eyes"
+ label_min="Beady Eyes"
+ label_max="Anime Eyes"
+ show_simple="true"
+ value_min="-2"
+ value_max="2"
+ value_default="0">
+ <param_morph />
+ </param>
- <param
- id="148"
- group="1"
- name="Bangs_Back_Up"
- label="Back Bangs Up"
- wearable="hair"
- edit_group="hair_style"
- label_min="Back Bangs"
- label_max="Back Bangs Up"
- value_min="0"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="150">
- <param_morph />
- </param>
+ <param
+ id="767"
+ group="1"
+ name="Bug_Eyed_Head"
+ wearable="shape"
+ label="Eye Depth"
+ edit_group="shape_eyes"
+ edit_group_order="4.5"
+ label_min="Sunken Eyes"
+ label_max="Bug Eyes"
+ value_min="-2"
+ value_max="2"
+ value_default="0">
+ <param_morph />
+ </param>
+
+ <!--
+ #Fat_Lips = Fat_Lips 34 1 0 1
+ #Wide_Lips = Wide_Lips 35 1 0 1
+ #Wide_Nose = Wide_Nose 36 1 0 1
+ -->
+ <!--
+ ##############
+ # Facial Expression morphs
+ ##############
+ -->
+ <param
+ id="300"
+ group="1"
+ name="Express_Closed_Mouth"
+ value_default="1"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="149"
- group="1"
- name="Bangs_Back_Down"
- label="Back Bangs Down"
- clothing_morph="true"
- wearable="hair"
- edit_group="hair_style"
- label_min="Back Bangs"
- label_max="Back Bangs Down"
- value_min="0"
- value_max="2"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="150">
- <param_morph />
- </param>
+ <param
+ id="301"
+ group="1"
+ name="Express_Tongue_Out"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="171"
- group="1"
- name="Hair_Front_Down"
- label="Front Hair Down"
- wearable="hair"
- edit_group="hair_style"
- label_min="Front Hair"
- label_max="Front Hair Down"
- value_min="0"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
- </param>
+ <param
+ id="302"
+ group="1"
+ name="Express_Surprise_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="172"
- group="1"
- name="Hair_Front_Up"
- label="Front Hair Up"
- wearable="hair"
- edit_group="hair_style"
- label_min="Front Hair"
- label_max="Front Hair Up"
- value_min="0"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
- </param>
+ <param
+ id="303"
+ group="1"
+ name="Express_Wink_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="173"
- group="1"
- name="Hair_Sides_Down"
- label="Sides Hair Down"
- wearable="hair"
- edit_group="hair_style"
- label_min="Sides Hair"
- label_max="Sides Hair Down"
- value_min="0"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
- </param>
+ <param
+ id="304"
+ group="1"
+ name="Express_Embarrassed_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="174"
- group="1"
- name="Hair_Sides_Up"
- label="Sides Hair Up"
- wearable="hair"
- edit_group="hair_style"
- label_min="Sides Hair"
- label_max="Sides Hair Up"
- value_min="0"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
- </param>
+ <param
+ id="305"
+ group="1"
+ name="Express_Shrug_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="175"
- group="1"
- name="Hair_Back_Down"
- label="Back Hair Down"
- clothing_morph="true"
- wearable="hair"
- edit_group="hair_style"
- label_min="Back Hair"
- label_max="Back Hair Down"
- value_min="0"
- value_max="3"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="150">
- <param_morph />
- </param>
+ <param
+ id="306"
+ group="1"
+ name="Express_Kiss"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="176"
- group="1"
- name="Hair_Back_Up"
- label="Back Hair Up"
- wearable="hair"
- edit_group="hair_style"
- label_min="Back Hair"
- label_max="Back Hair Up"
- value_min="0"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="150">
- <param_morph />
- </param>
+ <param
+ id="307"
+ group="1"
+ name="Express_Bored_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="177"
- group="0"
- name="Hair_Rumpled"
- label="Rumpled Hair"
- show_simple="true"
- wearable="hair"
- clothing_morph="true"
- edit_group="hair_style"
- edit_group_order="14.5"
- label_min="Smooth Hair"
- label_max="Rumpled Hair"
- value_min="0"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
- </param>
+ <param
+ id="308"
+ group="1"
+ name="Express_Repulsed_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="178"
- group="1"
- name="Hair_Swept_Back"
- label="Swept Back Hair"
- wearable="hair"
- edit_group="hair_style"
- label_min="NotHair"
- label_max="Swept Back"
- value_min="0"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="90">
- <param_morph />
- </param>
+ <param
+ id="309"
+ group="1"
+ name="Express_Disdain"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="179"
- group="1"
- name="Hair_Swept_Forward"
- label="Swept Forward Hair"
- wearable="hair"
- edit_group="hair_style"
- label_min="Hair"
- label_max="Swept Forward"
- value_min="0"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="90">
- <param_morph />
- </param>
+ <param
+ id="310"
+ group="1"
+ name="Express_Afraid_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="190"
- group="1"
- name="Hair_Tilt_Right"
- label="Hair Tilted Right"
- wearable="hair"
- edit_group="hair_style"
- label_min="Hair"
- label_max="Tilt Right"
- value_min="0"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="0">
- <param_morph />
- </param>
+ <param
+ id="311"
+ group="1"
+ name="Express_Worry_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="191"
- group="1"
- name="Hair_Tilt_Left"
- label="Hair Tilted Left"
- wearable="hair"
- edit_group="hair_style"
- label_min="Hair"
- label_max="Tilt Left"
- value_min="0"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="0">
- <param_morph />
- </param>
+ <param
+ id="312"
+ group="1"
+ name="Express_Cry_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="192"
- group="0"
- name="Bangs_Part_Middle"
- label="Part Bangs"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="20"
- label_min="No Part"
- label_max="Part Bangs"
- value_min="0"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="0">
- <param_morph />
- </param>
+ <param
+ id="313"
+ group="1"
+ name="Express_Sad_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="640"
- group="1"
- name="Hair_Egg_Head"
- wearable="hair"
- edit_group="hair_style"
- value_min="-1.3"
- value_max="1">
- <param_morph />
- </param>
+ <param
+ id="314"
+ group="1"
+ name="Express_Anger_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="641"
- group="1"
- name="Hair_Squash_Stretch_Head"
- wearable="hair"
- edit_group="hair_style"
- value_min="-.5"
- value_max="1">
- <param_morph />
- </param>
+ <param
+ id="315"
+ group="1"
+ name="Express_Frown"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="642"
- group="1"
- name="Hair_Square_Head"
- wearable="hair"
- edit_group="hair_style"
- value_min="0"
- value_max="1">
- <param_morph />
- </param>
+ <param
+ id="316"
+ group="1"
+ name="Express_Laugh_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
- <param
- id="643"
- group="1"
- name="Hair_Round_Head"
- wearable="hair"
- edit_group="hair_style"
- value_min="0"
- value_max="1">
- <param_morph />
- </param>
+ <param
+ id="317"
+ group="1"
+ name="Express_Toothsmile"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="318"
+ group="1"
+ name="Express_Smile"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="632"
+ group="1"
+ name="Express_Open_Mouth"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <!--
+ ##############
+ # Lipsync morphs
+ ##############
+ -->
+
+ <param
+ id="70"
+ group="1"
+ name="Lipsync_Aah"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="71"
+ group="1"
+ name="Lipsync_Ooh"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <!--
+ ##############
+ # other morphs (not user controlled)
+ ##############
+ -->
+ <param
+ id="40"
+ group="1"
+ name="Male_Head"
+ wearable="shape"
+ edit_group="driven"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="41"
+ group="1"
+ name="Old"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <!--
+ ##############
+ # animatable morphs
+ ##############
+ -->
+ <param
+ id="51"
+ group="1"
+ name="Furrowed_Eyebrows"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="53"
+ group="1"
+ name="Surprised_Eyebrows"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="54"
+ group="1"
+ name="Worried_Eyebrows"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="55"
+ group="1"
+ name="Frown_Mouth"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="57"
+ group="1"
+ name="Smile_Mouth"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="58"
+ group="1"
+ name="Blink_Left"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="59"
+ group="1"
+ name="Blink_Right"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <!--
+ #end morph targets
+ -->
+ </mesh>
+
+ <mesh
+ type="headMesh"
+ lod="1"
+ file_name="avatar_head_1.llm"
+ min_pixel_width="160"
+ reference="avatar_head.llm">
+ </mesh>
+
+ <mesh
+ type="headMesh"
+ lod="2"
+ file_name="avatar_head_2.llm"
+ min_pixel_width="80"
+ reference="avatar_head.llm">
+ </mesh>
+
+ <mesh
+ type="headMesh"
+ lod="3"
+ file_name="avatar_head_3.llm"
+ min_pixel_width="40"
+ reference="avatar_head.llm">
+ </mesh>
+
+ <mesh
+ type="headMesh"
+ lod="4"
+ file_name="avatar_head_4.llm"
+ min_pixel_width="0"
+ reference="avatar_head.llm">
+ </mesh>
+
+ <mesh
+ type="eyelashMesh"
+ lod="0"
+ file_name="avatar_eyelashes.llm"
+ min_pixel_width="320">
+ <param
+ shared="1"
+ id="660"
+ group="1"
+ name="Shear_Head"
+ wearable="shape"
+ label="Shear Face"
+ edit_group="shape_head"
+ label_min="Shear Left"
+ label_max="Shear Right"
+ value_min="-2"
+ value_max="2"
+ value_default="0"
+ camera_distance=".5"
+ camera_elevation=".04">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="770"
+ group="1"
+ name="Elongate_Head"
+ wearable="shape"
+ label="Shear Face"
+ edit_group="shape_head"
+ label_min="Flat Head"
+ label_max="Long Head"
+ value_min="-1"
+ value_max="1"
+ value_default="0"
+ camera_distance=".5"
+ camera_elevation=".04">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="664"
+ group="0"
+ name="Pop_Eye"
+ wearable="shape"
+ label="Eye Pop"
+ edit_group="shape_eyes"
+ edit_group_order="8"
+ label_min="Pop Right Eye"
+ label_max="Pop Left Eye"
+ value_min="-2"
+ value_max="2"
+ value_default="0"
+ camera_distance=".5"
+ camera_elevation=".04"
+ camera_angle="-20">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="21"
+ group="0"
+ name="Upper_Eyelid_Fold"
+ label="Upper Eyelid Fold"
+ wearable="shape"
+ edit_group="shape_eyes"
+ label_min="Uncreased"
+ label_max="Creased"
+ value_min="-0.2"
+ value_max="1.3"
+ camera_elevation=".1"
+ camera_distance=".35">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="24"
+ group="0"
+ name="Wide_Eyes"
+ label="Eye Opening"
+ wearable="shape"
+ edit_group="shape_eyes"
+ label_min="Narrow"
+ label_max="Wide"
+ show_simple="true"
+ value_min="-1.5"
+ value_max="2"
+ camera_elevation=".1"
+ camera_distance=".3">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="186"
+ group="1"
+ name="Egg_Head"
+ label="Egg Head"
+ wearable="shape"
+ edit_group="shape_head"
+ label_min="Chin Heavy"
+ label_max="Forehead Heavy"
+ value_min="-1.3"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="187"
+ group="1"
+ name="Squash_Stretch_Head"
+ label="Squash/Stretch Head"
+ wearable="shape"
+ edit_group="shape_head"
+ label_min="Squash Head"
+ label_max="Stretch Head"
+ value_min="-.5"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="194"
+ group="1"
+ name="Eye_Spread"
+ edit_group="shape_eyes"
+ label_min="Eyes Together"
+ label_max="Eyes Spread"
+ value_min="-2"
+ value_max="2">
+ <param_morph />
+ </param>
+
+ <param
+ id="518"
+ group="0"
+ name="Eyelashes_Long"
+ wearable="shape"
+ label="Eyelash Length"
+ edit_group="shape_eyes"
+ edit_group_order="7"
+ label_min="Short"
+ label_max="Long"
+ value_min="-.3"
+ value_max="1.5"
+ camera_elevation=".1"
+ camera_distance=".30"
+ camera_angle="-20">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="650"
+ group="0"
+ name="Eyelid_Corner_Up"
+ label="Outer Eye Corner"
+ wearable="shape"
+ edit_group="shape_eyes"
+ label_min="Corner Down"
+ label_max="Corner Up"
+ value_min="-1.3"
+ value_max="1.2"
+ camera_elevation=".1"
+ camera_distance=".3">
+ <param_morph />
+ </param>
+
+
+ <param
+ shared="1"
+ id="880"
+ group="0"
+ name="Eyelid_Inner_Corner_Up"
+ label="Inner Eye Corner"
+ wearable="shape"
+ edit_group="shape_eyes"
+ label_min="Corner Down"
+ label_max="Corner Up"
+ value_min="-1.3"
+ value_max="1.2"
+ camera_elevation=".1"
+ camera_distance=".3">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="686"
+ group="1"
+ name="Head_Eyes_Big"
+ wearable="shape"
+ label="Eye Size"
+ edit_group="shape_eyes"
+ label_min="Beady Eyes"
+ label_max="Anime Eyes"
+ value_min="-2"
+ value_max="2"
+ show_simple="true"
+ value_default="0">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="767"
+ group="1"
+ name="Bug_Eyed_Head"
+ wearable="shape"
+ label="Eye Depth"
+ edit_group="shape_eyes"
+ edit_group_order="4.5"
+ label_min="Sunken Eyes"
+ label_max="Bug Eyes"
+ value_min="-2"
+ value_max="2"
+ value_default="0">
+ <param_morph />
+ </param>
+
+ <!--
+ ##############
+ # Facial Expression morphs
+ ##############
+ -->
+ <param
+ shared="1"
+ id="301"
+ group="1"
+ name="Express_Tongue_Out"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="302"
+ group="1"
+ name="Express_Surprise_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="303"
+ group="1"
+ name="Express_Wink_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="304"
+ group="1"
+ name="Express_Embarrassed_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="305"
+ group="1"
+ name="Express_Shrug_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="306"
+ group="1"
+ name="Express_Kiss"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="307"
+ group="1"
+ name="Express_Bored_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="308"
+ group="1"
+ name="Express_Repulsed_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="309"
+ group="1"
+ name="Express_Disdain"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="310"
+ group="1"
+ name="Express_Afraid_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="312"
+ group="1"
+ name="Express_Cry_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="313"
+ group="1"
+ name="Express_Sad_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="314"
+ group="1"
+ name="Express_Anger_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="315"
+ group="1"
+ name="Express_Frown"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="316"
+ group="1"
+ name="Express_Laugh_Emote"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="317"
+ group="1"
+ name="Express_Toothsmile"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="318"
+ group="1"
+ name="Express_Smile"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <!--
+ ##############
+ # other morphs (not user controlled)
+ ##############
+ -->
+ <param
+ shared="1"
+ id="41"
+ group="1"
+ name="Old"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <!--
+ ##############
+ # animatable morphs
+ ##############
+ -->
+ <param
+ shared="1"
+ id="58"
+ group="1"
+ name="Blink_Left"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ shared="1"
+ id="59"
+ group="1"
+ name="Blink_Right"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+ </mesh>
+
+ <!--
+ #headMesh2 =
+ #headMesh3 =
+ -->
+ <mesh
+ type="upperBodyMesh"
+ lod="0"
+ file_name="avatar_upper_body.llm"
+ min_pixel_width="320">
+ <!--
+ #begin morph targets
+ #############
+ # tweakable morphs
+ #############
+ -->
+ <param
+ id="104"
+ group="1"
+ name="Big_Belly_Torso"
+ wearable="shape"
+ edit_group="driven"
+ value_min="0"
+ value_max="1">
+ <param_morph>
+ <volume_morph
+ name="BELLY"
+ scale="0.075 0.04 0.03"
+ pos="0.07 0 -0.07"/>
+ </param_morph>
+ </param>
+
+ <param
+ id="626"
+ sex="female"
+ group="1"
+ name="Big_Chest"
+ label="Chest Size"
+ wearable="shape"
+ edit_group="shape_torso"
+ label_min="Small"
+ label_max="Large"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance="1"
+ camera_angle="15">
+ <param_morph />
+ </param>
+
+ <param
+ id="627"
+ sex="female"
+ group="1"
+ name="Small_Chest"
+ label="Chest Size"
+ wearable="shape"
+ edit_group="shape_torso"
+ label_min="Large"
+ label_max="Small"
+ value_min="0"
+ value_max="1"
+ camera_elevation="0"
+ camera_distance=".28">
+ <param_morph />
+ </param>
+
+ <param
+ id="843"
+ sex="female"
+ group="1"
+ name="No_Chest"
+ label="Chest Size"
+ wearable="shape"
+ edit_group="shape_torso"
+ label_min="Some"
+ label_max="None"
+ value_min="0"
+ value_max="1"
+ camera_elevation="0"
+ camera_distance=".28">
+ <param_morph />
+ </param>
+
+ <param
+ id="106"
+ group="1"
+ name="Muscular_Torso"
+ label="Torso Muscles"
+ show_simple="true"
+ wearable="shape"
+ edit_group="shape_torso"
+ label_min="Regular"
+ label_max="Muscular"
+ value_min="0"
+ value_max="1.4"
+ camera_elevation=".3"
+ camera_distance="1.2">
+ <param_morph>
+ <volume_morph
+ name="L_CLAVICLE"
+ scale="0.02 0.0 0.005"
+ pos="0.0 0 0.005"/>
+ <volume_morph
+ name="L_UPPER_ARM"
+ scale="0.015 0.0 0.005"
+ pos="0.015 0 0"/>
+ <volume_morph
+ name="L_LOWER_ARM"
+ scale="0.005 0.0 0.005"
+ pos="0.005 0 0"/>
+ <volume_morph
+ name="R_CLAVICLE"
+ scale="0.02 0.0 0.005"
+ pos="0.0 0 0.005"/>
+ <volume_morph
+ name="R_UPPER_ARM"
+ scale="0.015 0.0 0.005"
+ pos="0.015 0 0"/>
+ <volume_morph
+ name="R_LOWER_ARM"
+ scale="0.005 0.0 0.005"
+ pos="0.005 0 0"/>
+ </param_morph>
+ </param>
+
+ <param
+ id="648"
+ group="1"
+ sex="female"
+ name="Scrawny_Torso"
+ label="Torso Muscles"
+ show_simple="true"
+ wearable="shape"
+ edit_group="shape_torso"
+ label_min="Regular"
+ label_max="Scrawny"
+ value_min="0"
+ value_max="1.3"
+ camera_elevation=".3"
+ camera_distance="1.2">
+ <param_morph>
+ <volume_morph
+ name="BELLY"
+ scale="0.0 -0.01 0.0"
+ pos="0.0 0.0 0"/>
+ <volume_morph
+ name="CHEST"
+ scale="-0.01 -0.01 0.0"
+ pos="0.01 0.0 0"/>
+ <volume_morph
+ name="L_CLAVICLE"
+ scale="0.0 -0.03 -0.005"
+ pos="0.0 0 -0.005"/>
+ <volume_morph
+ name="L_UPPER_ARM"
+ scale="-0.01 -0.01 -0.02"
+ pos="0 0 0"/>
+ <volume_morph
+ name="L_LOWER_ARM"
+ scale="-0.005 0.0 -0.01"
+ pos="-0.005 0 0"/>
+ <volume_morph
+ name="R_CLAVICLE"
+ scale="0.0 -0.03 -0.005"
+ pos="0.0 0 -0.005"/>
+ <volume_morph
+ name="R_UPPER_ARM"
+ scale="-0.01 -0.01 -0.02"
+ pos="0 0 0"/>
+ <volume_morph
+ name="R_LOWER_ARM"
+ scale="-0.005 0.0 -0.01"
+ pos="-0.005 0 0"/>
+ </param_morph>
+ </param>
+
+ <param
+ id="677"
+ group="1"
+ sex="male"
+ name="Scrawny_Torso_Male"
+ label="Torso Scrawny"
+ wearable="shape"
+ edit_group="shape_torso"
+ label_min="Regular"
+ label_max="Scrawny"
+ value_min="0"
+ value_max="1.3"
+ camera_elevation=".3"
+ camera_distance="1.2">
+ <param_morph>
+ <volume_morph
+ name="BELLY"
+ scale="-0.01 -0.01 0.0"
+ pos="0.01 0.0 0"/>
+ <volume_morph
+ name="CHEST"
+ scale="-0.02 -0.02 0.0"
+ pos="0.01 0.0 0"/>
+ <volume_morph
+ name="L_CLAVICLE"
+ scale="0.0 -0.03 -0.005"
+ pos="0.0 0 -0.005"/>
+ <volume_morph
+ name="L_UPPER_ARM"
+ scale="-0.01 -0.01 -0.02"
+ pos="0 0 0"/>
+ <volume_morph
+ name="L_LOWER_ARM"
+ scale="-0.005 0.0 -0.01"
+ pos="-0.005 0 0"/>
+ <volume_morph
+ name="R_CLAVICLE"
+ scale="0.0 -0.03 -0.005"
+ pos="0.0 0 -0.005"/>
+ <volume_morph
+ name="R_UPPER_ARM"
+ scale="-0.01 -0.01 -0.02"
+ pos="0 0 0"/>
+ <volume_morph
+ name="R_LOWER_ARM"
+ scale="-0.005 0.0 -0.01"
+ pos="-0.005 0 0"/>
+ </param_morph>
+ </param>
+
+ <param
+ id="634"
+ group="1"
+ name="Fat_Torso"
+ label="Fat Torso"
+ wearable="shape"
+ edit_group="shape_body"
+ label_min="skinny"
+ label_max="fat"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".3">
+ <param_morph>
+ <volume_morph
+ name="CHEST"
+ scale="0.02 0.03 0.03"
+ pos="0 0 -0.03"/>
+ <volume_morph
+ name="BELLY"
+ scale="0.09 0.08 0.07"
+ pos="0 0 -0.05"/>
+ <volume_morph
+ name="L_CLAVICLE"
+ scale="0.0 0.0 0.015"/>
+ <volume_morph
+ name="L_UPPER_ARM"
+ scale="0.02 0.0 0.02"
+ pos="0.0 0.0 -0.02"/>
+ <volume_morph
+ name="L_LOWER_ARM"
+ scale="0.01 0.0 0.01"
+ pos="0.0 0.0 -0.01"/>
+ <volume_morph
+ name="R_CLAVICLE"
+ scale="0.0 0.0 0.015"/>
+ <volume_morph
+ name="R_UPPER_ARM"
+ scale="0.02 0.0 0.02"
+ pos="0.0 0.0 -0.02"/>
+ <volume_morph
+ name="R_LOWER_ARM"
+ scale="0.01 0.0 0.01"
+ pos="0.0 0.0 -0.01"/>
+ <volume_morph
+ name="NECK"
+ scale="0.015 0.01 0.0"/>
+ <volume_morph
+ name="HEAD"
+ scale="0.0 0.0 0.01"
+ pos="0 0 -0.01"/>
+ </param_morph>
+
+ </param>
+
+ <param
+ id="507"
+ group="0"
+ sex="female"
+ name="Breast_Gravity"
+ label="Breast Buoyancy"
+ wearable="shape"
+ edit_group="shape_torso"
+ edit_group_order="7"
+ label_min="Less Gravity"
+ label_max="More Gravity"
+ value_default="0"
+ value_min="-1.5"
+ value_max="2"
+ camera_elevation=".3"
+ camera_distance=".8">
+ <param_morph />
+ </param>
+
+ <param
+ id="628"
+ group="1"
+ name="Displace_Loose_Upperbody"
+ label="Shirt Fit"
+ wearable="shirt"
+ edit_group="driven"
+ clothing_morph="true"
+ value_min="0"
+ value_max="1"
+ value_default="0">
+ <param_morph />
+ </param>
+
+ <param
+ id="840"
+ group="0"
+ name="Shirtsleeve_flair"
+ label="Sleeve Looseness"
+ show_simple="true"
+ wearable="shirt"
+ edit_group="shirt"
+ edit_group_order="6"
+ clothing_morph="true"
+ label_min="Tight Sleeves"
+ label_max="Loose Sleeves"
+ value_min="0"
+ value_max="1.5"
+ camera_distance="1.8"
+ camera_angle="30"
+ camera_elevation="-.3">
+ <param_morph />
+ </param>
+
+ <param
+ id="855"
+ group="1"
+ name="Love_Handles"
+ wearable="shape"
+ edit_group="driven"
+ value_default="0"
+ value_min="-1"
+ value_max="2">
+ <param_morph>
+ <volume_morph
+ name="BELLY"
+ scale="0.0 0.02 0.0"/>
+ </param_morph>
+ </param>
+
+ <param
+ id="684"
+ group="0"
+ sex="female"
+ name="Breast_Female_Cleavage"
+ label="Breast Cleavage"
+ wearable="shape"
+ edit_group="shape_torso"
+ edit_group_order="8"
+ label_min="Separate"
+ label_max="Join"
+ value_default="0"
+ value_min="-.3"
+ value_max="1.3"
+ camera_elevation=".3"
+ camera_distance=".8">
+ <param_morph />
+ </param>
+
+ <param
+ id="685"
+ group="0"
+ sex="male"
+ name="Chest_Male_No_Pecs"
+ label="Pectorals"
+ wearable="shape"
+ edit_group="shape_torso"
+ edit_group_order="5"
+ label_min="Big Pectorals"
+ label_max="Sunken Chest"
+ value_default="0"
+ value_min="-.5"
+ value_max="1.1"
+ camera_elevation=".3"
+ camera_distance="1.2">
+ <param_morph />
+ </param>
+
+ <!-- ############# #
+ other morphs (not user controlled)
+ ############# -->
+ <param
+ id="100"
+ group="1"
+ name="Male_Torso"
+ wearable="shape"
+ edit_group="driven"
+ label_min="Male_Torso"
+ value_min="0"
+ value_max="1">
+ <param_morph>
+ <volume_morph
+ name="CHEST"
+ scale="0.03 0.04 0.02"
+ pos="-0.03 0 -0.01"/>
+ <volume_morph
+ name="BELLY"
+ scale="0.03 0.03 0.0"
+ pos="-0.03 0 0.02"/>
+ <volume_morph
+ name="L_CLAVICLE"
+ scale="0.02 0.0 0.01"
+ pos="-0.02 0 0"/>
+ <volume_morph
+ name="L_UPPER_ARM"
+ scale="0.01 0.0 0.01"
+ pos="0.0 0.0 -0.01"/>
+ <volume_morph
+ name="L_LOWER_ARM"
+ scale="0.005 0.0 0.005"
+ pos="0.0 0.0 -0.005"/>
+ <volume_morph
+ name="R_CLAVICLE"
+ scale="0.02 0.0 0.01"
+ pos="-0.02 0 0"/>
+ <volume_morph
+ name="R_UPPER_ARM"
+ scale="0.01 0.0 0.01"
+ pos="0.0 0.0 -0.01"/>
+ <volume_morph
+ name="R_LOWER_ARM"
+ scale="0.005 0.0 0.005"
+ pos="0.0 0.0 -0.005"/>
+ <volume_morph
+ name="NECK"
+ scale="0.015 0.01 0.0"/>
+ <volume_morph
+ name="HEAD"
+ scale="0.0 0.0 0.01"
+ pos="0 0 -0.01"/>
+ </param_morph>
+ </param>
+
+ <!--
+ ##############
+ # animatable morphs
+ ##############
+ -->
+ <param
+ id="101"
+ group="1"
+ name="Hands_Relaxed"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="102"
+ group="1"
+ name="Hands_Point"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="103"
+ group="1"
+ name="Hands_Fist"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="666"
+ group="1"
+ name="Hands_Relaxed_L"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="667"
+ group="1"
+ name="Hands_Point_L"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="668"
+ group="1"
+ name="Hands_Fist_L"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="669"
+ group="1"
+ name="Hands_Relaxed_R"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="670"
+ group="1"
+ name="Hands_Point_R"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="671"
+ group="1"
+ name="Hands_Fist_R"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="672"
+ group="1"
+ name="Hands_Typing"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="766"
+ group="1"
+ name="Hands_Salute_R"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="791"
+ group="1"
+ name="Hands_Peace_R"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="792"
+ group="1"
+ name="Hands_Spread_R"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <!--
+ #end morph targets
+ -->
+ </mesh>
+
+ <mesh
+ type="upperBodyMesh"
+ lod="1"
+ file_name="avatar_upper_body_1.llm"
+ min_pixel_width="160"
+ reference="avatar_upper_body.llm">
+ </mesh>
+
+ <mesh
+ type="upperBodyMesh"
+ lod="2"
+ file_name="avatar_upper_body_2.llm"
+ min_pixel_width="80"
+ reference="avatar_upper_body.llm">
+ </mesh>
+
+ <mesh
+ type="upperBodyMesh"
+ lod="3"
+ file_name="avatar_upper_body_3.llm"
+ min_pixel_width="40"
+ reference="avatar_upper_body.llm">
+ </mesh>
+
+ <mesh
+ type="upperBodyMesh"
+ lod="4"
+ file_name="avatar_upper_body_4.llm"
+ min_pixel_width="0"
+ reference="avatar_upper_body.llm">
+ </mesh>
+
+ <!--
+ #upperBodyMesh2 =
+ #upperBodyMesh3 =
+ -->
+ <mesh
+ type="lowerBodyMesh"
+ lod="0"
+ file_name="avatar_lower_body.llm"
+ min_pixel_width="320">
+ <!--
+ #begin morph targets
+ #############
+ # tweakable morphs
+ #############
+ -->
+ <param
+ id="156"
+ group="1"
+ name="Big_Belly_Legs"
+ wearable="shape"
+ edit_group="driven"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="151"
+ group="1"
+ name="Big_Butt_Legs"
+ label="Butt Size"
+ wearable="shape"
+ edit_group="shape_legs"
+ label_min="Regular"
+ label_max="Large"
+ value_min="0"
+ value_max="1">
+ <param_morph>
+ <volume_morph
+ name="PELVIS"
+ scale="0.03 0.0 0.02"
+ pos="-0.03 0 -0.025"/>
+ </param_morph>
+ </param>
+
+ <param
+ id="794"
+ group="1"
+ name="Small_Butt"
+ label="Butt Size"
+ wearable="shape"
+ edit_group="shape_legs"
+ label_min="Regular"
+ label_max="Small"
+ value_min="0"
+ value_max="1">
+ <param_morph>
+ <volume_morph
+ name="PELVIS"
+ scale="-0.01 0.0 0.0"
+ pos="0.01 0 0.0"/>
+ </param_morph>
+ </param>
+
+ <param
+ id="152"
+ group="1"
+ name="Muscular_Legs"
+ label="Leg Muscles"
+ show_simple="true"
+ wearable="shape"
+ edit_group="shape_legs"
+ label_min="Regular Muscles"
+ label_max="More Muscles"
+ value_min="0"
+ value_max="1.5"
+ camera_distance="1.3"
+ camera_elevation="-.5">
+ <param_morph>
+ <volume_morph
+ name="L_UPPER_LEG"
+ scale="0.015 0.015 0.0"
+ pos="0.0 0 0.0"/>
+ <volume_morph
+ name="L_LOWER_LEG"
+ scale="0.01 0.01 0.0"
+ pos="0.0 0 0.0"/>
+ <volume_morph
+ name="R_UPPER_LEG"
+ scale="0.015 0.015 0.0"
+ pos="0.0 0 0.0"/>
+ <volume_morph
+ name="R_LOWER_LEG"
+ scale="0.01 0.01 0.0"
+ pos="0.0 0 0.0"/>
+ </param_morph>
+ </param>
+
+ <param
+ id="651"
+ group="1"
+ name="Scrawny_Legs"
+ label="Scrawny Leg"
+ wearable="shape"
+ edit_group="shape_legs"
+ label_min="Regular Muscles"
+ label_max="Less Muscles"
+ value_min="0"
+ value_max="1.5"
+ camera_distance="1.3"
+ camera_elevation="-.5">
+ <param_morph>
+ <volume_morph
+ name="L_UPPER_LEG"
+ scale="-0.03 -0.03 0.0"
+ pos="0.0 0 0.0"/>
+ <volume_morph
+ name="L_LOWER_LEG"
+ scale="-0.015 -0.015 0.0"
+ pos="0.0 0 0.0"/>
+ <volume_morph
+ name="R_UPPER_LEG"
+ scale="-0.03 -0.03 0.0"
+ pos="0.0 0 0.0"/>
+ <volume_morph
+ name="R_LOWER_LEG"
+ scale="-0.015 -0.015 0.0"
+ pos="0.0 0 0.0"/>
+ </param_morph>
+ </param>
+
+ <param
+ id="853"
+ group="1"
+ name="Bowed_Legs"
+ label="Knee Angle"
+ wearable="shape"
+ value_min="-1"
+ value_max="1">
+ <param_morph>
+ <volume_morph
+ name="L_UPPER_LEG"
+ pos="0.0 0.03 0.0"/>
+ <volume_morph
+ name="L_LOWER_LEG"
+ pos="0.0 0.03 0.0"/>
+ <volume_morph
+ name="R_UPPER_LEG"
+ pos="0.0 -0.03 0.0"/>
+ <volume_morph
+ name="R_LOWER_LEG"
+ pos="0.0 -0.03 0.0"/>
+ </param_morph>
+ </param>
+
+ <param
+ id="500"
+ group="1"
+ name="Shoe_Heel_Height"
+ label="Heel Height"
+ wearable="shoes"
+ edit_group="shoes"
+ label_min="Low Heels"
+ label_max="High Heels"
+ value_min="0"
+ value_max="1"
+ camera_distance="1.5"
+ camera_elevation="-.5">
+ <param_morph />
+ </param>
+
+ <param
+ id="501"
+ group="1"
+ name="Shoe_Platform_Height"
+ label="Platform Height"
+ wearable="shoes"
+ edit_group="shoes"
+ label_min="Low Platforms"
+ label_max="High Platforms"
+ value_min="0"
+ value_max="1"
+ camera_distance="1.5"
+ camera_elevation="-.5">
+ <param_morph />
+ </param>
+
+ <param
+ id="508"
+ group="0"
+ name="Shoe_Platform_Width"
+ label="Platform Width"
+ wearable="shoes"
+ edit_group="shoes"
+ edit_group_order="7"
+ label_min="Narrow"
+ label_max="Wide"
+ value_min="-1"
+ value_max="2"
+ camera_angle="15"
+ camera_distance="1.5"
+ camera_elevation="-1">
+ <param_morph />
+ </param>
+
+ <param
+ id="509"
+ group="1"
+ name="Shoe_Heel_Point"
+ label="Heel Shape"
+ wearable="shoes"
+ edit_group="shoes"
+ label_min="Default Heels"
+ label_max="Pointy Heels"
+ value_min="0"
+ value_max="1"
+ camera_distance="1.3"
+ camera_elevation="-.5">
+ <param_morph />
+ </param>
+
+ <param
+ id="510"
+ group="1"
+ name="Shoe_Heel_Thick"
+ label="Heel Shape"
+ wearable="shoes"
+ edit_group="shoes"
+ label_min="default Heels"
+ label_max="Thick Heels"
+ value_min="0"
+ value_max="1"
+ camera_distance="1.3"
+ camera_elevation="-.5">
+ <param_morph />
+ </param>
+
+ <param
+ id="511"
+ group="1"
+ name="Shoe_Toe_Point"
+ label="Toe Shape"
+ wearable="shoes"
+ edit_group="shoes"
+ label_min="Default Toe"
+ label_max="Pointy Toe"
+ value_min="0"
+ value_max="1"
+ camera_distance="1.3"
+ camera_elevation="-.5">
+ <param_morph />
+ </param>
+
+ <param
+ id="512"
+ group="1"
+ name="Shoe_Toe_Square"
+ label="Toe Shape"
+ wearable="shoes"
+ edit_group="shoes"
+ label_min="Default Toe"
+ label_max="Square Toe"
+ value_min="0"
+ value_max="1"
+ camera_distance="1.5"
+ camera_elevation="-.5">
+ <param_morph />
+ </param>
+
+ <param
+ id="654"
+ group="0"
+ name="Shoe_Toe_Thick"
+ label="Toe Thickness"
+ wearable="shoes"
+ edit_group="shoes"
+ edit_group_order="5"
+ label_min="Flat Toe"
+ label_max="Thick Toe"
+ value_min="0"
+ value_max="2"
+ camera_angle="15"
+ camera_distance="1.5"
+ camera_elevation="-1">
+ <param_morph />
+ </param>
+
+ <param
+ id="515"
+ group="0"
+ name="Foot_Size"
+ label="Foot Size"
+ wearable="shape"
+ edit_group="shape_legs"
+ edit_group_order="6"
+ label_min="Small"
+ label_max="Big"
+ value_min="-1"
+ value_max="3"
+ camera_angle="45"
+ camera_distance="1.1"
+ camera_elevation="-1">
+ <param_morph>
+ <volume_morph
+ name="L_FOOT"
+ scale="0.02 0.01 0.0"
+ pos="0.01 0 0"/>
+ <volume_morph
+ name="R_FOOT"
+ scale="0.02 0.01 0.0"
+ pos="0.01 0 0"/>
+ </param_morph>
+ </param>
+
+ <param
+ id="516"
+ group="1"
+ name="Displace_Loose_Lowerbody"
+ label="Pants Fit"
+ wearable="pants"
+ edit_group="driven"
+ clothing_morph="true"
+ value_min="0"
+ value_max="1"
+ value_default="0">
+ <param_morph />
+ </param>
+
+ <param
+ id="625"
+ group="0"
+ name="Leg_Pantflair"
+ label="Cuff Flare"
+ show_simple="true"
+ wearable="pants"
+ edit_group="pants"
+ edit_group_order="3"
+ clothing_morph="true"
+ label_min="Tight Cuffs"
+ label_max="Flared Cuffs"
+ value_min="0"
+ value_max="1.5"
+ camera_distance="1.8"
+ camera_angle="30"
+ camera_elevation="-.3">
+ <param_morph />
+ </param>
+
+ <param
+ id="793"
+ group="1"
+ name="Leg_Longcuffs"
+ label="Longcuffs"
+ wearable="pants"
+ edit_group="driven"
+ clothing_morph="true"
+ value_min="0"
+ value_max="3"
+ value_default="0">
+ <param_morph />
+ </param>
+
+ <param
+ id="638"
+ group="0"
+ name="Low_Crotch"
+ label="Pants Crotch"
+ wearable="pants"
+ clothing_morph="true"
+ edit_group="pants"
+ edit_group_order="4"
+ label_min="High and Tight"
+ label_max="Low and Loose"
+ value_min="0"
+ value_max="1.3"
+ camera_distance="1.2"
+ camera_angle="-20"
+ camera_elevation="-.3">
+ <param_morph />
+ </param>
+
+ <param
+ id="635"
+ group="1"
+ name="Fat_Legs"
+ label="Fat Torso"
+ wearable="shape"
+ edit_group="shape_body"
+ label_min="skinny"
+ label_max="fat"
+ value_min="0"
+ value_max="1">
+ <param_morph>
+ <volume_morph
+ name="PELVIS"
+ scale="0.03 0.06 0.0"/>
+ <volume_morph
+ name="R_UPPER_LEG"
+ scale="0.02 0.02 0.0"
+ pos="0.0 -0.02 0.0"/>
+ <volume_morph
+ name="R_LOWER_LEG"
+ scale="0.01 0.01 0.0"/>
+ <volume_morph
+ name="L_UPPER_LEG"
+ scale="0.02 0.02 0.0"
+ pos="0.0 0.02 0.0"/>
+ <volume_morph
+ name="L_LOWER_LEG"
+ scale="0.01 0.01 0.0"/>
+ </param_morph>
+ </param>
+
+ <param
+ id="854"
+ group="1"
+ name="Saddlebags"
+ wearable="shape"
+ edit_grouo="driven"
+ value_min="-.5"
+ value_max="3">
+ <param_morph>
+ <volume_morph
+ name="PELVIS"
+ scale="0.0 0.025 0.0"/>
+ </param_morph>
+
+ </param>
+
+ <param
+ id="879"
+ group="0"
+ sex="male"
+ name="Male_Package"
+ label="Package"
+ wearable="shape"
+ edit_group="shape_legs"
+ edit_group_order="4.6"
+ label_min="Coin Purse"
+ label_max="Duffle Bag"
+ value_default="0"
+ value_min="-.5"
+ value_max="2"
+ camera_angle="60"
+ camera_distance=".6">
+ <param_morph />
+ </param>
+
+ <!--
+ #############
+ # other morphs (not user controlled)
+ #############
+ -->
+ <param
+ id="153"
+ group="1"
+ name="Male_Legs"
+ wearable="shape"
+ edit_group="driven"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <!--
+ #end morph targets
+ -->
+ </mesh>
+
+ <mesh
+ type="lowerBodyMesh"
+ lod="1"
+ file_name="avatar_lower_body_1.llm"
+ min_pixel_width="160"
+ reference="avatar_lower_body.llm">
+ </mesh>
+
+ <mesh
+ type="lowerBodyMesh"
+ lod="2"
+ file_name="avatar_lower_body_2.llm"
+ min_pixel_width="80"
+ reference="avatar_lower_body.llm">
+ </mesh>
+
+ <mesh
+ type="lowerBodyMesh"
+ lod="3"
+ file_name="avatar_lower_body_3.llm"
+ min_pixel_width="40"
+ reference="avatar_lower_body.llm">
+ </mesh>
+
+ <mesh
+ type="lowerBodyMesh"
+ lod="4"
+ file_name="avatar_lower_body_4.llm"
+ min_pixel_width="0"
+ reference="avatar_lower_body.llm">
+ </mesh>
+
+ <!--
+ #lowerBodyMesh2 =
+ #lowerBodyMesh3 =
+ -->
+ <!--
+ #eyeLidLeftMesh =
+ -->
+ <mesh
+ type="eyeBallLeftMesh"
+ lod="0"
+ file_name="avatar_eye.llm"
+ min_pixel_width="320">
+ <!-- begin morph_params -->
+ <param
+ id="679"
+ group="1"
+ name="Eyeball_Size"
+ label="Eyeball Size"
+ wearable="shape"
+ edit_group="shape_eyes"
+ label_min="small eye"
+ label_max="big eye"
+ value_min="-.25"
+ value_max=".10">
+ <param_morph />
+ </param>
+
+ <param
+ id="687"
+ group="1"
+ name="Eyeball_Size"
+ label="Big Eyeball"
+ wearable="shape"
+ edit_group="shape_eyes"
+ label_min="small eye"
+ label_max="big eye"
+ value_min="-.25"
+ value_max=".25">
+ <param_morph />
+ </param>
+ </mesh>
+
+ <mesh
+ type="eyeBallLeftMesh"
+ lod="1"
+ file_name="avatar_eye_1.llm"
+ min_pixel_width="80">
+ <!-- begin morph_params -->
+ <param
+ id="694"
+ group="1"
+ name="Eyeball_Size"
+ label="Eyeball Size"
+ wearable="shape"
+ edit_group="shape_eyes"
+ label_min="small eye"
+ label_max="big eye"
+ value_min="-.25"
+ value_max=".10">
+ <param_morph />
+ </param>
+
+ <param
+ id="695"
+ group="1"
+ name="Eyeball_Size"
+ label="Big Eyeball"
+ wearable="shape"
+ edit_group="shape_eyes"
+ label_min="small eye"
+ label_max="big eye"
+ value_min="-.25"
+ value_max=".25">
+ <param_morph />
+ </param>
+ </mesh>
+
+ <!--
+ #eyeLidRightMesh =
+ -->
+ <mesh
+ type="eyeBallRightMesh"
+ lod="0"
+ file_name="avatar_eye.llm"
+ min_pixel_width="320">
+ <!-- begin morph_params -->
+ <param
+ id="680"
+ group="1"
+ name="Eyeball_Size"
+ label="Eyeball Size"
+ wearable="shape"
+ label_min="small eye"
+ label_max="big eye"
+ value_min="-.25"
+ value_max=".10">
+ <param_morph />
+ </param>
+
+ <param
+ id="688"
+ group="1"
+ name="Eyeball_Size"
+ label="Big Eyeball"
+ wearable="shape"
+ label_min="small eye"
+ label_max="big eye"
+ value_min="-.25"
+ value_max=".25">
+ <param_morph />
+ </param>
+ </mesh>
+
+ <mesh
+ type="eyeBallRightMesh"
+ lod="1"
+ file_name="avatar_eye_1.llm"
+ min_pixel_width="80">
+ <!-- begin morph_params -->
+ <param
+ id="681"
+ group="1"
+ name="Eyeball_Size"
+ label="Eyeball Size"
+ wearable="shape"
+ edit_group="shape_eyes"
+ label_min="small eye"
+ label_max="big eye"
+ value_min="-.25"
+ value_max=".10">
+ <param_morph />
+ </param>
+
+ <param
+ id="691"
+ group="1"
+ name="Eyeball_Size"
+ label="Big Eyeball"
+ wearable="shape"
+ edit_group="shape_eyes"
+ label_min="small eye"
+ label_max="big eye"
+ value_min="-.25"
+ value_max=".25">
+ <param_morph />
+ </param>
+ </mesh>
+
+ <mesh
+ type="skirtMesh"
+ lod="0"
+ file_name="avatar_skirt.llm"
+ min_pixel_width="320">
+ <param
+ id="845"
+ group="1"
+ name="skirt_poofy"
+ label="poofy skirt"
+ clothing_morph="true"
+ wearable="skirt"
+ edit_group="skirt"
+ label_min="less poofy"
+ label_max="more poofy"
+ value_min="0"
+ value_max="1.5">
+ <param_morph />
+ </param>
+
+ <param
+ id="846"
+ group="1"
+ name="skirt_loose"
+ label="loose skirt"
+ clothing_morph="true"
+ wearable="skirt"
+ edit_group="skirt"
+ label_min="form fitting"
+ label_max="loose"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="866"
+ group="1"
+ name="skirt_tight"
+ label="tight skirt"
+ clothing_morph="true"
+ wearable="skirt"
+ edit_group="skirt"
+ label_min="form fitting"
+ label_max="loose"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="867"
+ group="1"
+ name="skirt_smallbutt"
+ label="tight skirt"
+ clothing_morph="false"
+ wearable="skirt"
+ edit_group="skirt"
+ cross_wearable="true"
+ label_min="form fitting"
+ label_max="loose"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="848"
+ group="0"
+ name="skirt_bustle"
+ label="bustle skirt"
+ clothing_morph="true"
+ wearable="skirt"
+ edit_group_order="3"
+ edit_group="skirt"
+ label_min="no bustle"
+ label_max="more bustle"
+ value_min="0"
+ value_max="2"
+ value_default=".2"
+ camera_angle="100"
+ camera_distance="1.3"
+ camera_elevation="-.5">
+ <param_morph />
+ </param>
+
+ <param
+ id="847"
+ group="1"
+ name="skirt_bowlegs"
+ label="legs skirt"
+ wearable="skirt"
+ edit_group="driven"
+ cross_wearable="true"
+ value_min="-1"
+ value_max="1"
+ value_default="0">
+ <param_morph />
+ </param>
+
+ <param
+ id="852"
+ group="1"
+ name="skirt_bigbutt"
+ wearable="skirt"
+ edit_group="driven"
+ cross_wearable="true"
+ label="bigbutt skirt"
+ label_min="less"
+ label_max="more"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="849"
+ group="1"
+ name="skirt_belly"
+ wearable="skirt"
+ edit_group="driven"
+ cross_wearable="true"
+ label="big belly skirt"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="850"
+ group="1"
+ wearable="skirt"
+ edit_group="driven"
+ cross_wearable="true"
+ name="skirt_saddlebags"
+ value_min="-.5"
+ value_max="3">
+ <param_morph />
+ </param>
+
+ <param
+ id="851"
+ group="1"
+ name="skirt_chubby"
+ wearable="skirt"
+ edit_group="driven"
+ cross_wearable="true"
+ label_min="less"
+ label_max="more"
+ value_min="0"
+ value_max="1"
+ value_default="0">
+ <param_morph />
+ </param>
+
+ <param
+ id="856"
+ group="1"
+ name="skirt_lovehandles"
+ wearable="skirt"
+ edit_group="driven"
+ cross_wearable="true"
+ label_min="less"
+ label_max="more"
+ value_min="-1"
+ value_max="2"
+ value_default="0">
+ <param_morph />
+ </param>
+
+ <!--
+ #############
+ # other morphs (not user controlled)
+ #############
+ -->
+ <param
+ id="857"
+ group="1"
+ name="skirt_male"
+ wearable="skirt"
+ edit_group="driven"
+ cross_wearable="true"
+ value_min="0"
+ value_max="1">
+ <param_morph />
+ </param>
+ </mesh>
+
+ <mesh
+ type="skirtMesh"
+ lod="1"
+ file_name="avatar_skirt_1.llm"
+ min_pixel_width="160"
+ reference="avatar_skirt.llm">
+ </mesh>
+
+ <mesh
+ type="skirtMesh"
+ lod="2"
+ file_name="avatar_skirt_2.llm"
+ min_pixel_width="80"
+ reference="avatar_skirt.llm">
+ </mesh>
+
+ <mesh
+ type="skirtMesh"
+ lod="3"
+ file_name="avatar_skirt_3.llm"
+ min_pixel_width="40"
+ reference="avatar_skirt.llm">
+ </mesh>
+
+ <mesh
+ type="skirtMesh"
+ lod="4"
+ file_name="avatar_skirt_4.llm"
+ min_pixel_width="0"
+ reference="avatar_skirt.llm">
+ </mesh>
+
+ <!-- =========================================================== -->
+ <global_color
+ name="skin_color">
+ <param
+ id="111"
+ group="0"
+ wearable="skin"
+ edit_group="skin_color"
+ edit_group_order="1"
+ name="Pigment"
+ show_simple="true"
+ label_min="Light"
+ label_max="Dark"
+ value_min="0"
+ value_max="1"
+ value_default=".5">
+ <param_color>
+ <value
+ color="252, 215, 200, 255" />
+
+ <value
+ color="240, 177, 112, 255" />
+
+ <value
+ color="90, 40, 16, 255" />
+
+ <value
+ color="29, 9, 6, 255" />
+ </param_color>
+ </param>
+
+ <param
+ id="110"
+ group="0"
+ wearable="skin"
+ edit_group="skin_color"
+ edit_group_order="2"
+ name="Red Skin"
+ label="Ruddiness"
+ label_min="Pale"
+ label_max="Ruddy"
+ value_min="0"
+ value_max="0.1">
+ <param_color
+ operation="blend">
+ <value
+ color="218, 41, 37, 255" />
+ </param_color>
+ </param>
+
+ <param
+ id="108"
+ group="0"
+ wearable="skin"
+ edit_group="skin_color"
+ edit_group_order="3"
+ name="Rainbow Color"
+ show_simple="true"
+ label_min="None"
+ label_max="Wild"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5">
+ <param_color>
+ <value
+ color=" 0, 0, 0, 255" />
+
+ <value
+ color="255, 0, 255, 255" />
+
+ <value
+ color="255, 0, 0, 255" />
+
+ <value
+ color="255, 255, 0, 255" />
+
+ <value
+ color=" 0, 255, 0, 255" />
+
+ <value
+ color=" 0, 255, 255, 255" />
+
+ <value
+ color=" 0, 0, 255, 255" />
+
+ <value
+ color="255, 0, 255, 255" />
+ </param_color>
+ </param>
+ </global_color>
+
+ <!-- =========================================================== -->
+ <global_color
+ name="hair_color">
+ <param
+ id="114"
+ group="0"
+ wearable="hair"
+ edit_group="hair_color"
+ edit_group_order="3"
+ name="Blonde Hair"
+ show_simple="true"
+ label_min="Black"
+ label_max="Blonde"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_elevation=".1"
+ camera_distance=".5">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="22, 6, 6, 255" />
+
+ <value
+ color="29, 9, 6, 255" />
+
+ <value
+ color="45, 21, 11, 255" />
+
+ <value
+ color="78, 39, 11, 255" />
+
+ <value
+ color="90, 53, 16, 255" />
+
+ <value
+ color="136, 92, 21, 255" />
+
+ <value
+ color="150, 106, 33, 255" />
+
+ <value
+ color="198, 156, 74, 255" />
+
+ <value
+ color="233, 192, 103, 255" />
+
+ <value
+ color="238, 205, 136, 255" />
+ </param_color>
+ </param>
+
+ <param
+ id="113"
+ group="0"
+ wearable="hair"
+ edit_group="hair_color"
+ edit_group_order="4"
+ name="Red Hair"
+ show_simple="true"
+ label_min="No Red"
+ label_max="Very Red"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="118, 47, 19, 255" />
+ </param_color>
+ </param>
+
+ <param
+ id="115"
+ group="0"
+ wearable="hair"
+ edit_group="hair_color"
+ edit_group_order="1"
+ name="White Hair"
+ show_simple="true"
+ label_min="No White"
+ label_max="All White"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="255, 255, 255, 255" />
+ </param_color>
+ </param>
+
+ <param
+ id="112"
+ group="0"
+ wearable="hair"
+ edit_group="hair_color"
+ edit_group_order="2"
+ name="Rainbow Color"
+ show_simple="true"
+ label_min="None"
+ label_max="Wild"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".5">
+ <param_color>
+ <value
+ color=" 0, 0, 0, 255" />
+
+ <value
+ color="255, 0, 255, 255" />
+
+ <value
+ color="255, 0, 0, 255" />
+
+ <value
+ color="255, 255, 0, 255" />
+
+ <value
+ color=" 0, 255, 0, 255" />
+
+ <value
+ color=" 0, 255, 255, 255" />
+
+ <value
+ color=" 0, 0, 255, 255" />
+
+ <value
+ color="255, 0, 255, 255" />
+ </param_color>
+ </param>
+ </global_color>
+
+ <!-- =========================================================== -->
+ <global_color
+ name="eye_color">
+ <param
+ id="99"
+ group="0"
+ wearable="eyes"
+ edit_group="eyes"
+ edit_group_order="1"
+ name="Eye Color"
+ show_simple="true"
+ label_min="Natural"
+ label_max="Unnatural"
+ value_min="0"
+ value_max="1"
+ value_default="0"
+ camera_elevation=".1"
+ camera_distance=".3">
+ <!-- default to natural brown eyes-->
+ <param_color>
+ <value
+ color="50, 25, 5, 255" />
+
+ <!-- natural dark brown eyes-->
+ <value
+ color="109, 55, 15, 255" />
+
+ <!-- natural brown eyes-->
+ <value
+ color="150, 93, 49, 255" />
+
+ <!-- natural light brown eyes-->
+ <value
+ color="152, 118, 25, 255" />
+
+ <!--natural hazel eyes-->
+ <value
+ color="95, 179, 107, 255" />
+
+ <!--natural green eyes-->
+ <value
+ color="87, 192, 191, 255" />
+
+ <!--natural aqua eyes-->
+ <value
+ color="95, 172, 179, 255" />
+
+ <!--natural blue eyes-->
+ <value
+ color="128, 128, 128, 255" />
+
+ <!--natural grey eyes-->
+ <value
+ color="0, 0, 0, 255" />
+
+ <!--black eyes-->
+ <value
+ color="255, 255, 0, 255" />
+
+ <!--bright yellow eyes-->
+ <value
+ color=" 0, 255, 0, 255" />
+
+ <!-- bright green eyes-->
+ <value
+ color=" 0, 255, 255, 255" />
+
+ <!-- bright cyan eyes-->
+ <value
+ color=" 0, 0, 255, 255" />
+
+ <!--bright blue eyes-->
+ <value
+ color="255, 0, 255, 255" />
+
+ <!-- bright violet eyes-->
+ <value
+ color="255, 0, 0, 255" />
+
+ <!--bright red eyes-->
+ </param_color>
+ </param>
+
+ <param
+ id="98"
+ group="0"
+ wearable="eyes"
+ edit_group="eyes"
+ edit_group_order="2"
+ name="Eye Lightness"
+ show_simple="true"
+ label_min="Darker"
+ label_max="Lighter"
+ value_min="0"
+ value_max="1"
+ camera_elevation=".1"
+ camera_distance=".3">
+ <param_color>
+ <value
+ color="0, 0, 0, 0" />
+
+ <value
+ color="255, 255, 255, 255" />
+ </param_color>
+ </param>
+ </global_color>
+
+ <!-- =========================================================== -->
+ <layer_set
+ body_region="hair"
+ width="512"
+ height="512"
+ clear_alpha="false">
+ <layer
+ name="base"
+ global_color="hair_color"
+ write_all_channels="true">
+ <texture
+ local_texture="hair_grain" />
+ </layer>
+
+ <layer
+ name="hair alpha"
+ visibility_mask="TRUE">
+ <texture
+ local_texture="hair_alpha" />
+ </layer>
+
+ </layer_set>
+ <!-- =========================================================== -->
+
+ <layer_set
+ body_region="head"
+ width="512"
+ height="512"
+ clear_alpha="false"
+ alpha_tga_file="head_alpha.tga">
+ <layer
+ name="head bump base"
+ fixed_color = "128,128,128,255"
+ render_pass="bump">
+ </layer>
+
+ <layer
+ name="head bump definition"
+ render_pass="bump">
+
+
+ <texture
+ tga_file="bump_head_base.tga"
+ file_is_mask="FALSE"/>
<param
- id="644"
+ id="873"
group="1"
- name="Hair_Forehead_Round"
- wearable="hair"
- edit_group="hair_style"
+ wearable="skin"
+ edit_group="driven"
+ edit_group_order="12"
+ name="Bump base"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ domain="0" />
</param>
+ </layer>
+
+ <layer
+ name="base"
+ global_color="skin_color">
+ <texture
+ tga_file="head_skingrain.tga" />
+ </layer>
+
+ <layer
+ name="headcolor">
+ <texture
+ tga_file="head_color.tga" />
+ </layer>
+
+ <layer
+ name="shadow">
+ <texture
+ tga_file="head_shading_alpha.tga"
+ file_is_mask="TRUE" />
<param
- id="645"
+ id="158"
group="1"
- name="Hair_Forehead_Slant"
- wearable="hair"
- edit_group="hair_style"
+ wearable="skin"
+ name="Shading"
value_min="0"
value_max="1">
- <param_morph />
- </param>
+ <param_color>
+ <value
+ color="0, 0, 0, 0" />
- <param
- id="774"
- group="1"
- name="Shear_Head_Hair"
- wearable="hair"
- edit_group="hair_style"
- value_min="-2"
- value_max="2">
- <param_morph />
+ <value
+ color="0, 0, 0, 128" />
+ </param_color>
</param>
+ </layer>
+
+ <layer
+ name="highlight">
+ <texture
+ tga_file="head_highlights_alpha.tga"
+file_is_mask="TRUE" />
+
<param
- id="771"
- group="1"
- name="Elongate_Head_Hair"
- wearable="hair"
- edit_group="hair_style"
- value_min="-1"
+ id="159"
+ group="1"
+ name="Shading"
+ wearable="skin"
+ value_min="0"
value_max="1">
- <param_morph />
- </param>
+ <param_color>
+ <value
+color="255, 255, 255, 0" />
- <param
- id="674"
- group="0"
- name="Hair_Shear_Back"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="12"
- label="Shear Back"
- label_min="Full Back"
- label_max="Sheared Back"
- value_min="-1"
- value_max="2"
- value_default="-0.3"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="100">
- <param_morph />
- </param>
- <param
- id="762"
- group="0"
- name="Hair_Shear_Front"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="11.8"
- label="Shear Front"
- show_simple="true"
- label_min="Full Front"
- label_max="Sheared Front"
- value_min="0"
- value_max="3"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="30">
- <param_morph />
+ <value
+ color="255, 255, 255, 64" />
+ </param_color>
</param>
+ </layer>
+ <layer
+ name="rosyface">
+ <texture
+ tga_file="rosyface_alpha.tga"
+ file_is_mask="true" />
<param
- id="754"
+ id="116"
group="0"
- name="Hair_Taper_Back"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="14"
- label="Taper Back"
- label_min="Wide Back"
- label_max="Narrow Back"
- value_min="-1"
- value_max="2"
- value_default="0"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="160">
- <param_morph />
- </param>
+ wearable="skin"
+ edit_group="skin_facedetail"
+ edit_group_order="4"
+ name="Rosy Complexion"
+ label_min="Less Rosy"
+ label_max="More Rosy"
+ value_min="0"
+ value_max="1"
+ camera_distance=".3"
+ camera_elevation=".07">
+ <param_color>
+ <value
+ color="198, 71, 71, 0" />
- <param
- id="755"
- group="0"
- name="Hair_Taper_Front"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="13"
- label="Taper Front"
- label_min="Wide Front"
- label_max="Narrow Front"
- value_min="-1.5"
- value_max="1.5"
- value_default="0.05"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
+ <value
+ color="198, 71, 71, 255" />
+ </param_color>
</param>
+ </layer>
+
+ <layer
+ name="lips">
+ <texture
+ tga_file="lips_mask.tga"
+ file_is_mask="true" />
<param
- id="782"
- group="1"
- clothing_morph="true"
- name="Hair_Pigtails_Short"
- wearable="hair"
- edit_group="hair_style"
+ id="117"
+ group="0"
+ wearable="skin"
+ edit_group="skin_facedetail"
+ edit_group_order="5"
+ name="Lip Pinkness"
+ label_min="Darker"
+ label_max="Pinker"
value_min="0"
- value_max="1">
- <param_morph />
+ value_max="1"
+ camera_distance=".25">
+ <param_color>
+ <value
+ color="220, 115, 115, 0" />
+
+ <value
+ color="220, 115, 115, 128" />
+ </param_color>
</param>
+ </layer>
+ <layer
+ name="wrinkles_shading"
+ render_pass="bump"
+ fixed_color="0,0,0,100">
<param
- id="783"
+ id="118"
group="1"
- clothing_morph="true"
- name="Hair_Pigtails_Med"
- wearable="hair"
- edit_group="hair_style"
+ wearable="skin"
+ name="Wrinkles"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ tga_file="bump_face_wrinkles.tga"
+ skip_if_zero="true"
+ domain="0.3" />
</param>
+ </layer>
- <param
- id="790"
- group="1"
- clothing_morph="true"
- name="Hair_Pigtails_Medlong"
- wearable="hair"
- edit_group="hair_style"
- value_min="0"
- value_max="1">
- <param_morph />
+ <!--<layer
+ name="wrinkles_highlights"
+ fixed_color="255,255,255,64">
+ <param
+ id="128"
+ group="1"
+ name="Wrinkles"
+ value_min="0"
+ value_max="1">
+ <param_alpha
+ tga_file="head_wrinkles_highlights_alpha.tga"
+ skip_if_zero="true"
+ domain="0.3" />
+ </param>
+ </layer>-->
+ <layer
+ name="freckles"
+ fixed_color="120,47,20,128">
+ <param
+ id="165"
+ group="0"
+ wearable="skin"
+ edit_group="skin_facedetail"
+ edit_group_order="2"
+ name="Freckles"
+ label_min="Less"
+ label_max="More"
+ value_min="0"
+ value_max="1"
+ camera_distance=".3"
+camera_elevation=".07">
+ <param_alpha
+ tga_file="freckles_alpha.tga"
+ skip_if_zero="true"
+domain="0.5" />
</param>
+ </layer>
+ <layer
+name="eyebrowsbump"
+render_pass="bump">
+ <texture
+ tga_file="head_hair.tga"
+ file_is_mask="false" />
<param
- id="784"
+ id="1000"
group="1"
- clothing_morph="true"
- name="Hair_Pigtails_Long"
wearable="hair"
- edit_group="hair_style"
+ edit_group="driven"
+ name="Eyebrow Size Bump"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ tga_file="eyebrows_alpha.tga"
+ domain="0.1" />
</param>
<param
- id="786"
+ id="1002"
group="1"
- name="Hair_Ponytail_Short"
wearable="hair"
- edit_group="hair_style"
+ edit_group="driven"
+ name="Eyebrow Density Bump"
value_min="0"
value_max="1">
- <param_morph />
+ <param_color>
+ <value
+ color="255,255,255,0" />
+
+ <value
+ color="255,255,255,255" />
+ </param_color>
</param>
+ </layer>
+
+ <layer
+ name="eyebrows"
+ global_color="hair_color">
+ <texture
+ tga_file="head_hair.tga"
+ file_is_mask="false" />
<param
- id="787"
+ id="1001"
group="1"
- name="Hair_Ponytail_Med"
wearable="hair"
- edit_group="hair_style"
+ edit_group="hair_eyebrows"
+ name="Eyebrow Size"
+ show_simple="true"
value_min="0"
- value_max="1">
- <param_morph />
+ value_max="1"
+ value_default="0.5">
+ <param_alpha
+ tga_file="eyebrows_alpha.tga"
+ domain="0.1" />
</param>
<param
- id="788"
+ id="1003"
group="1"
- name="Hair_Ponytail_Long"
- clothing_morph="true"
wearable="hair"
- edit_group="hair_style"
+ edit_group="driven"
+ name="Eyebrow Density"
value_min="0"
value_max="1">
- <param_morph />
- </param>
-
-<!-- #end morph targets -->
- </mesh>
-
- <mesh
- type="hairMesh"
- lod="1"
- file_name="avatar_hair_1.llm"
- min_pixel_width="160"
- reference="avatar_hair.llm">
- </mesh>
-
- <mesh
- type="hairMesh"
- lod="2"
- file_name="avatar_hair_2.llm"
- min_pixel_width="80"
- reference="avatar_hair.llm">
- </mesh>
-
- <mesh
- type="hairMesh"
- lod="3"
- file_name="avatar_hair_3.llm"
- min_pixel_width="40"
- reference="avatar_hair.llm">
- </mesh>
-
- <mesh
- type="hairMesh"
- lod="4"
- file_name="avatar_hair_4.llm"
- min_pixel_width="20"
- reference="avatar_hair.llm">
- </mesh>
-
- <mesh
- type="hairMesh"
- lod="5"
- file_name="avatar_hair_5.llm"
- min_pixel_width="0"
- reference="avatar_hair.llm">
- </mesh>
-
- <mesh
- type="headMesh"
- lod="0"
- file_name="avatar_head.llm"
- min_pixel_width="320">
-<!--
- begin morph targets
- #############
- tweakable morphs
- #############
- -->
- <param
- id="1"
- group="0"
- name="Big_Brow"
- label="Brow Size"
- wearable="shape"
- edit_group="shape_head"
- edit_group_order="7"
- label_min="Small"
- label_max="Large"
- value_min="-.3"
- value_max="2"
- camera_elevation=".1"
- camera_distance=".4"
- camera_angle="45">
- <param_morph />
- </param>
+ <param_color
+ operation="multiply">
+ <value
+ color="255,255,255,0" />
- <param
- id="2"
- group="0"
- name="Nose_Big_Out"
- label="Nose Size"
- wearable="shape"
- edit_group="shape_nose"
- edit_group_order="1"
- label_min="Small"
- label_max="Large"
- show_simple="true"
- value_min="-0.8"
- value_max="2.5"
- camera_elevation=".1"
- camera_distance=".35"
- camera_angle="50">
- <param_morph />
- </param>
-
- <param
- id="4"
- group="0"
- name="Broad_Nostrils"
- label="Nostril Width"
- wearable="shape"
- edit_group="shape_nose"
- edit_group_order="3"
- label_min="Narrow"
- label_max="Broad"
- value_min="-.5"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".3"
- camera_angle="-20">
- <param_morph />
- </param>
-
- <param
- id="759"
- group="0"
- name="Low_Septum_Nose"
- label="Nostril Division"
- wearable="shape"
- edit_group="shape_nose"
- edit_group_order="3.5"
- label_min="High"
- label_max="Low"
- value_min="-1"
- value_max="1.5"
- value_default="0.5"
- camera_elevation=".1"
- camera_distance=".3"
- camera_angle="-20">
- <param_morph />
+ <value
+ color="255,255,255,255" />
+ </param_color>
</param>
+ </layer>
+ <layer
+ name="lipstick">
<param
- id="517"
+ id="700"
group="0"
- name="Wide_Nose"
- label="Nose Width"
- wearable="shape"
- edit_group="shape_nose"
+ wearable="skin"
+ edit_group="skin_makeup"
edit_group_order="2"
- label_min="Narrow"
- label_max="Wide"
- show_simple="true"
- value_min="-.5"
+ name="Lipstick Color"
+ label_min="Pink"
+ label_max="Black"
+ value_min="0"
value_max="1"
- camera_elevation=".1"
- camera_distance=".3"
- camera_angle="-20">
- <param_morph />
- </param>
+ value_default=".25"
+ camera_distance=".25">
+ <param_color>
+ <value
+ color="245,161,177,200" />
- <param
- id="5"
- group="0"
- name="Cleft_Chin"
- label="Chin Cleft"
- wearable="shape"
- edit_group="shape_chin"
- edit_group_order="6"
- label_min="Round"
- label_max="Cleft"
- value_min="-.1"
- value_max="1"
- camera_elevation="0"
- camera_distance=".28"
- camera_angle="-20">
- <param_morph />
- </param>
+ <value
+ color="216,37,67,200" />
- <param
- id="6"
- group="0"
- name="Bulbous_Nose_Tip"
- label="Nose Tip Shape"
- wearable="shape"
- edit_group="shape_nose"
- edit_group_order="8"
- label_min="Pointy"
- label_max="Bulbous"
- value_min="-.3"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".35"
- camera_angle="15">
- <param_morph />
- </param>
+ <value
+ color="178,48,76,200" />
- <param
- id="7"
- group="0"
- name="Weak_Chin"
- label="Chin Angle"
- wearable="shape"
- edit_group="shape_chin"
- edit_group_order="1"
- label_min="Chin Out"
- label_max="Chin In"
- value_min="-.5"
- value_max=".5"
- camera_elevation=".1"
- camera_distance=".4"
- camera_angle="45">
- <param_morph />
- </param>
+ <value
+ color="68,0,11,200" />
- <param
- id="8"
- group="0"
- name="Double_Chin"
- label="Chin-Neck"
- wearable="shape"
- edit_group="shape_chin"
- edit_group_order="8"
- label_min="Tight Chin"
- label_max="Double Chin"
- value_min="-.5"
- value_max="1.5"
- camera_elevation="-.1"
- camera_distance=".3"
- camera_angle="60">
- <param_morph />
- </param>
+ <value
+ color="252,207,184,200" />
- <param
- id="10"
- group="0"
- name="Sunken_Cheeks"
- label="Lower Cheeks"
- wearable="shape"
- edit_group="shape_head"
- edit_group_order="9"
- label_min="Well-Fed"
- label_max="Sunken"
- show_simple="true"
- value_min="-1.5"
- value_max="3"
- camera_elevation=".1"
- camera_distance=".4"
- camera_angle="5">
- <param_morph />
- </param>
+ <value
+ color="241,136,106,200" />
- <param
- id="11"
- group="0"
- name="Noble_Nose_Bridge"
- label="Upper Bridge"
- wearable="shape"
- edit_group="shape_nose"
- edit_group_order="5"
- label_min="Low"
- label_max="High"
- value_min="-.5"
- value_max="1.5"
- camera_elevation=".1"
- camera_distance=".35"
- camera_angle="70">
- <param_morph />
- </param>
+ <value
+ color="208,110,85,200" />
- <param
- id="758"
- group="0"
- name="Lower_Bridge_Nose"
- label="Lower Bridge"
- wearable="shape"
- edit_group="shape_nose"
- edit_group_order="5.5"
- label_min="Low"
- label_max="High"
- value_min="-1.5"
- value_max="1.5"
- camera_elevation=".1"
- camera_distance=".35"
- camera_angle="70">
- <param_morph />
- </param>
+ <value
+ color="106,28,18,200" />
- <param
- id="12"
- group="0"
- name="Jowls"
- wearable="shape"
- edit_group="shape_chin"
- edit_group_order="5"
- label_min="Less"
- label_max="More"
- value_min="-.5"
- value_max="2.5"
- camera_elevation=".1"
- camera_distance=".4"
- camera_angle="0">
- <param_morph />
+ <value
+ color="58,26,49,200" />
+
+ <value
+ color="14,14,14,200" />
+ </param_color>
</param>
<param
- id="13"
+ id="701"
group="0"
- name="Cleft_Chin_Upper"
- label="Upper Chin Cleft"
- wearable="shape"
- edit_group="shape_chin"
- edit_group_order="7"
- label_min="Round"
- label_max="Cleft"
+ wearable="skin"
+ edit_group="skin_makeup"
+ edit_group_order="1"
+ name="Lipstick"
+ label_min="No Lipstick"
+ label_max="More Lipstick"
value_min="0"
- value_max="1.5"
- camera_elevation="0"
- camera_distance=".28"
- camera_angle="-20">
- <param_morph />
+ value_max=".9"
+ value_default="0.0"
+ camera_distance=".25">
+ <param_alpha
+ tga_file="lipstick_alpha.tga"
+ skip_if_zero="true"
+ domain="0.05" />
</param>
+ </layer>
+ <layer
+ name="lipgloss"
+ fixed_color="255,255,255,190">
<param
- id="14"
+ id="702"
+ name="Lipgloss"
+ label_min="No Lipgloss"
+ label_max="Glossy"
+ wearable="skin"
+ edit_group="skin_makeup"
+ edit_group_order="3"
group="0"
- name="High_Cheek_Bones"
- label="Cheek Bones"
- wearable="shape"
- edit_group="shape_head"
- edit_group_order="10"
- label_min="Low"
- label_max="High"
- value_min="-.5"
+ value_min="0"
value_max="1"
- camera_elevation=".1"
- camera_distance=".3"
- camera_angle="-20">
- <param_morph />
+ camera_distance=".25">
+ <param_alpha
+ tga_file="lipgloss_alpha.tga"
+ skip_if_zero="true"
+ domain="0.2" />
</param>
+ </layer>
+ <layer
+ name="blush">
<param
- id="15"
+ id="704"
group="0"
- name="Ears_Out"
- label="Ear Angle"
- wearable="shape"
- edit_group="shape_ears"
- edit_group_order="2"
- label_min="In"
- label_max="Out"
- value_min="-.5"
- value_max="1.5"
- camera_elevation=".1"
- camera_distance=".3"
- camera_angle="-20">
- <param_morph />
- </param>
-
-<!--Pointy eyebrows became a driver/driven param with new max value for backwards compatibility between 1.0 and 1.1-->
- <param
- id="870"
- group="1"
- name="Pointy_Eyebrows"
- label="Eyebrow Points"
- wearable="hair"
- edit_group="hair_eyebrows"
+ wearable="skin"
+ edit_group="skin_makeup"
edit_group_order="4"
- label_min="Smooth"
- label_max="Pointy"
- value_min="-.5"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".3">
- <param_morph />
+ name="Blush"
+ label_min="No Blush"
+ label_max="More Blush"
+ value_min="0"
+ value_max=".9"
+ value_default="0"
+ camera_distance=".3"
+ camera_elevation=".07"
+ camera_angle="20">
+ <param_alpha
+ tga_file="blush_alpha.tga"
+ skip_if_zero="true"
+ domain="0.3" />
</param>
<param
- id="17"
+ id="705"
group="0"
- name="Square_Jaw"
- label="Jaw Shape"
- wearable="shape"
- edit_group="shape_chin"
- edit_group_order="2"
- label_min="Pointy"
- label_max="Square"
- value_min="-.5"
+ wearable="skin"
+ edit_group="skin_makeup"
+ edit_group_order="5"
+ name="Blush Color"
+ label_min="Pink"
+ label_max="Orange"
+ value_min="0"
value_max="1"
+ value_default=".5"
camera_distance=".3"
- camera_elevation=".04"
- camera_angle="-20">
- <param_morph />
- </param>
+ camera_elevation=".07"
+ camera_angle="20">
+ <param_color>
+ <value
+ color="253,162,193,200" />
- <param
- id="18"
- group="0"
- name="Puffy_Upper_Cheeks"
- label="Upper Cheeks"
- wearable="shape"
- edit_group="shape_head"
- edit_group_order="8"
- label_min="Thin"
- label_max="Puffy"
- value_min="-1.5"
- value_max="2.5"
- camera_elevation=".1"
- camera_distance=".3"
- camera_angle="-20">
- <param_morph />
- </param>
+ <value
+ color="247,131,152,200" />
- <param
- id="19"
- group="0"
- name="Upturned_Nose_Tip"
- label="Nose Tip Angle"
- wearable="shape"
- edit_group="shape_nose"
- edit_group_order="7"
- label_min="Downturned"
- label_max="Upturned"
- value_min="-1.5"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".35"
- camera_angle="15">
- <param_morph />
- </param>
+ <value
+ color="213,122,140,200" />
- <param
- id="20"
- group="0"
- name="Bulbous_Nose"
- label="Nose Thickness"
- wearable="shape"
- edit_group="shape_nose"
- edit_group_order="4"
- label_min="Thin Nose"
- label_max="Bulbous Nose"
- show_simple="true"
- value_min="-.5"
- value_max="1.5"
- camera_elevation=".1"
- camera_distance=".3">
- <param_morph />
- </param>
+ <value
+ color="253,152,144,200" />
- <param
- id="21"
- group="0"
- name="Upper_Eyelid_Fold"
- label="Upper Eyelid Fold"
- wearable="shape"
- edit_group="shape_eyes"
- edit_group_order="5"
- label_min="Uncreased"
- label_max="Creased"
- value_min="-0.2"
- value_max="1.3"
- camera_elevation=".1"
- camera_distance=".35">
- <param_morph />
+ <value
+ color="236,138,103,200" />
+
+ <value
+ color="195,128,122,200" />
+
+ <value
+ color="148,103,100,200" />
+
+ <value
+ color="168,95,62,200" />
+ </param_color>
</param>
<param
- id="22"
+ id="711"
group="0"
- name="Attached_Earlobes"
- label="Attached Earlobes"
- wearable="shape"
- edit_group="shape_ears"
- edit_group_order="3"
- label_min="Unattached"
- label_max="Attached"
+ wearable="skin"
+ edit_group="skin_makeup"
+ edit_group_order="6"
+ name="Blush Opacity"
+ label_min="Clear"
+ label_max="Opaque"
value_min="0"
value_max="1"
- camera_elevation=".1"
+ value_default=".5"
camera_distance=".3"
- camera_angle="45">
- <param_morph />
- </param>
+ camera_elevation=".07"
+ camera_angle="20">
+ <param_color
+ operation="multiply">
+ <value
+ color="255,255,255,0" />
- <param
- id="23"
- group="0"
- name="Baggy_Eyes"
- label="Eye Bags"
- wearable="shape"
- edit_group="shape_eyes"
- edit_group_order="6"
- label_min="Smooth"
- label_max="Baggy"
- value_min="-.5"
- value_max="1.5"
- camera_elevation=".1"
- camera_distance=".35">
- <param_morph />
+ <value
+ color="255,255,255,255" />
+ </param_color>
</param>
+ </layer>
+ <layer
+ name="Outer Eye Shadow">
<param
- id="765"
+ id="708"
group="0"
- name="Puffy_Lower_Lids"
- label="Puffy Eyelids"
- wearable="shape"
- edit_group="shape_eyes"
- edit_group_order="6.1"
- label_min="Flat"
- label_max="Puffy"
- value_min="-.3"
- value_max="2.5"
- camera_elevation=".1"
- camera_distance=".35">
- <param_morph />
- </param>
+ wearable="skin"
+ edit_group="skin_makeup"
+ edit_group_order="11"
+ name="Out Shdw Color"
+ label_min="Light"
+ label_max="Dark"
+ value_min="0"
+ value_max="1"
+ camera_distance=".3"
+ camera_elevation=".14">
+ <param_color>
+ <value
+ color="252,247,246,255" />
- <param
- id="24"
- group="0"
- name="Wide_Eyes"
- label="Eye Opening"
- wearable="shape"
- edit_group="shape_eyes"
- edit_group_order="1.1"
- label_min="Narrow"
- label_max="Wide"
- value_min="-1.5"
- value_max="2"
- show_simple="true"
- camera_elevation=".1"
- camera_distance=".35">
- <param_morph />
- </param>
+ <value
+ color="255,206,206,255" />
- <param
- id="25"
- group="0"
- name="Wide_Lip_Cleft"
- label="Lip Cleft"
- wearable="shape"
- edit_group="shape_mouth"
- edit_group_order="6"
- label_min="Narrow"
- label_max="Wide"
- value_min="-.8"
- value_max="1.5"
- camera_elevation="0"
- camera_distance=".28">
- <param_morph />
- </param>
+ <value
+ color="233,135,149,255" />
- <param
- id="764"
- group="0"
- name="Lip_Cleft_Deep"
- label="Lip Cleft Depth"
- wearable="shape"
- edit_group="shape_mouth"
- edit_group_order="5.8"
- label_min="Shallow"
- label_max="Deep"
- value_min="-.5"
- value_max="1.2"
- camera_elevation="0"
- camera_distance=".28">
- <param_morph />
- </param>
+ <value
+ color="220,168,192,255" />
- <param
- id="26"
- group="1"
- wearable="shape"
- name="Lips_Thin"
- edit_group="driven"
- value_min="0"
- value_max=".7">
- <param_morph />
- </param>
+ <value
+ color="228,203,232,255" />
- <param
- id="27"
- group="0"
- name="Wide_Nose_Bridge"
- label="Bridge Width"
- wearable="shape"
- edit_group="shape_nose"
- edit_group_order="6"
- label_min="Narrow"
- label_max="Wide"
- value_min="-1.3"
- value_max="1.2"
- camera_elevation=".1"
- camera_distance=".3"
- camera_angle="-20">
- <param_morph />
- </param>
+ <value
+ color="255,234,195,255" />
- <param
- id="28"
- group="1"
- name="Lips_Fat"
- wearable="shape"
- edit_group="driven"
- value_min="0"
- value_max="2">
- <param_morph />
- </param>
+ <value
+ color="230,157,101,255" />
- <param
- id="29"
- group="1"
- name="Wide_Upper_Lip"
- wearable="shape"
- edit_group="driven"
- value_min="-.7"
- value_max="1.3">
- <param_morph />
- </param>
+ <value
+ color="255,147,86,255" />
- <param
- id="30"
- group="1"
- name="Wide_Lower_Lip"
- wearable="shape"
- edit_group="driven"
- value_min="-.7"
- value_max="1.3">
- <param_morph />
- </param>
+ <value
+ color="228,110,89,255" />
-<!--Arced eyebrows became a driver/driven param with new max value for backwards compatibility between 1.0 and 1.1-->
- <param
- id="872"
- group="1"
- name="Arced_Eyebrows"
- label="Eyebrow Arc"
- wearable="hair"
- edit_group="hair_eyebrows"
- edit_group_order="3"
- label_min="Flat"
- label_max="Arced"
- value_min="0"
- value_max="1">
- <param_morph />
- </param>
+ <value
+ color="228,150,120,255" />
-<!--Lower eyebrows became a driver/driven param with new min value for backwards compatibility between 1.0 and 1.1-->
- <param
- id="871"
- group="1"
- name="Lower_Eyebrows"
- label="Eyebrow Height"
- show_simple="true"
- wearable="hair"
- edit_group="hair_eyebrows"
- edit_group_order="2.5"
- label_min="Higher"
- label_max="Lower"
- value_min="-2"
- value_max="2">
- <param_morph />
+ <value
+ color="223,227,213,255" />
+
+ <value
+ color="96,116,87,255" />
+
+ <value
+ color="88,143,107,255" />
+
+ <value
+ color="194,231,223,255" />
+
+ <value
+ color="207,227,234,255" />
+
+ <value
+ color="41,171,212,255" />
+
+ <value
+ color="180,137,130,255" />
+
+ <value
+ color="173,125,105,255" />
+
+ <value
+ color="144,95,98,255" />
+
+ <value
+ color="115,70,77,255" />
+
+ <value
+ color="155,78,47,255" />
+
+ <value
+ color="239,239,239,255" />
+
+ <value
+ color="194,194,194,255" />
+
+ <value
+ color="120,120,120,255" />
+
+ <value
+ color="10,10,10,255" />
+ </param_color>
</param>
<param
- id="35"
+ id="706"
group="0"
- name="Big_Ears"
- label="Ear Size"
- wearable="shape"
- edit_group="shape_ears"
- edit_group_order="1"
- label_min="Small"
- label_max="Large"
- value_min="-1"
- value_max="2"
- camera_elevation=".1"
+ wearable="skin"
+ edit_group="skin_makeup"
+ edit_group_order="12"
+ name="Out Shdw Opacity"
+ label_min="Clear"
+ label_max="Opaque"
+ value_min=".2"
+ value_max="1"
+ value_default=".6"
camera_distance=".3"
- camera_angle="45">
- <param_morph />
+ camera_elevation=".14">
+ <param_color
+ operation="multiply">
+ <value
+ color="255,255,255,0" />
+
+ <value
+ color="255,255,255,255" />
+ </param_color>
</param>
<param
- id="796"
+ id="707"
group="0"
- name="Pointy_Ears"
- label="Ear Tips"
- wearable="shape"
- edit_group="shape_ears"
- edit_group_order="4"
- label_min="Flat"
- label_max="Pointy"
- value_min="-.4"
- value_max="3"
- camera_elevation=".1"
+ wearable="skin"
+ edit_group="skin_makeup"
+ edit_group_order="10"
+ name="Outer Shadow"
+ label_min="No Eyeshadow"
+ label_max="More Eyeshadow"
+ value_min="0"
+ value_max=".7"
camera_distance=".3"
- camera_angle="45">
- <param_morph />
+ camera_elevation=".14">
+ <param_alpha
+ tga_file="eyeshadow_outer_alpha.tga"
+ skip_if_zero="true"
+ domain="0.05" />
</param>
+ </layer>
+ <layer
+ name="Inner Eye Shadow">
<param
- id="185"
+ id="712"
group="0"
- name="Deep_Chin"
- label="Chin Depth"
- wearable="shape"
- edit_group="shape_chin"
- edit_group_order="3"
- label_min="Shallow"
- label_max="Deep"
- value_min="-1"
+ wearable="skin"
+ edit_group="skin_makeup"
+ edit_group_order="8"
+ name="In Shdw Color"
+ label_min="Light"
+ label_max="Dark"
+ value_min="0"
value_max="1"
- camera_elevation=".1"
- camera_distance=".4"
- camera_angle="30">
- <param_morph />
- </param>
+ camera_distance=".3"
+ camera_elevation=".14">
+ <param_color>
+ <value
+ color="252,247,246,255" />
- <param
- id="186"
- group="1"
- name="Egg_Head"
- label="Egg Head"
- wearable="shape"
- edit_group="shape_head"
- label_min="Chin Heavy"
- label_max="Forehead Heavy"
- value_min="-1.3"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
- </param>
+ <value
+ color="255,206,206,255" />
- <param
- id="187"
- group="1"
- name="Squash_Stretch_Head"
- label="Squash/Stretch Head"
- wearable="shape"
- edit_group="shape_head"
- label_min="Squash Head"
- label_max="Stretch Head"
- value_min="-.5"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph>
- <volume_morph
- name="HEAD"
- scale="-0.008 -0.006 0.015"/>
- </param_morph>
- </param>
+ <value
+ color="233,135,149,255" />
- <param
- id="188"
- group="1"
- name="Square_Head"
- wearable="shape"
- label_min="Less Square"
- label_max="More Square"
- value_min="0"
- value_max=".7"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
- </param>
+ <value
+ color="220,168,192,255" />
- <param
- id="189"
- group="1"
- wearable="shape"
- name="Round_Head"
- label_min="Less Round"
- label_max="More Round"
- value_min="0"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
- </param>
+ <value
+ color="228,203,232,255" />
- <param
- id="194"
- group="1"
- name="Eye_Spread"
- wearable="shape"
- edit_group="shape_eyes"
- label_min="Eyes Together"
- label_max="Eyes Spread"
- value_min="-2"
- value_max="2">
- <param_morph />
- </param>
+ <value
+ color="255,234,195,255" />
- <param
- id="400"
- sex="male"
- group="1"
- name="Displace_Hair_Facial"
- label="Hair Thickess"
- wearable="hair"
- edit_group="hair_facial"
- label_min="Cropped Hair"
- label_max="Bushy Hair"
- value_min="0"
- value_max="2">
- <param_morph />
- </param>
+ <value
+ color="230,157,101,255" />
- <param
- id="506"
- group="0"
- name="Mouth_Height"
- wearable="shape"
- label="Mouth Position"
- show_simple="true"
- edit_group="shape_mouth"
- edit_group_order="4"
- label_min="High"
- label_max="Low"
- value_min="-2"
- value_max="2"
- camera_distance=".3"
- camera_elevation=".04">
- <param_morph />
- </param>
+ <value
+ color="255,147,86,255" />
- <param
- id="633"
- group="1"
- name="Fat_Head"
- label="Fat Head"
- wearable="shape"
- edit_group="shape_body"
- label_min="Skinny"
- label_max="Fat"
- value_min="0"
- value_max="1"
- camera_elevation=".3">
- <param_morph/>
- </param>
+ <value
+ color="228,110,89,255" />
- <param
- id="630"
- group="1"
- name="Forehead_Round"
- label="Round Forehead"
- wearable="shape"
- label_min="Less"
- label_max="More"
- value_min="0"
- value_max="1">
- <param_morph />
- </param>
+ <value
+ color="228,150,120,255" />
- <param
- id="631"
- group="1"
- name="Forehead_Slant"
- label="Slanted Forehead"
- wearable="shape"
- label_min="Less"
- label_max="More"
- value_min="0"
- value_max="1">
- <param_morph />
- </param>
+ <value
+ color="223,227,213,255" />
- <param
- id="650"
- group="0"
- name="Eyelid_Corner_Up"
- label="Outer Eye Corner"
- wearable="shape"
- edit_group="shape_eyes"
- edit_group_order="4"
- label_min="Corner Down"
- label_max="Corner Up"
- value_min="-1.3"
- value_max="1.2"
- camera_elevation=".1"
- camera_distance=".30">
- <param_morph />
- </param>
+ <value
+ color="96,116,87,255" />
- <param
- id="880"
- group="0"
- name="Eyelid_Inner_Corner_Up"
- label="Inner Eye Corner"
- wearable="shape"
- edit_group="shape_eyes"
- edit_group_order="4.2"
- label_min="Corner Down"
- label_max="Corner Up"
- value_min="-1.3"
- value_max="1.2"
- camera_elevation=".1"
- camera_distance=".30">
- <param_morph />
- </param>
-
- <param
- id="653"
- group="0"
- name="Tall_Lips"
- wearable="shape"
- label="Lip Fullness"
- show_simple="true"
- edit_group="shape_mouth"
- edit_group_order="2"
- label_min="Less Full"
- label_max="More Full"
- value_min="-1"
- value_max="2"
- camera_distance=".3"
- camera_elevation=".04">
- <param_morph />
+ <value
+ color="88,143,107,255" />
+
+ <value
+ color="194,231,223,255" />
+
+ <value
+ color="207,227,234,255" />
+
+ <value
+ color="41,171,212,255" />
+
+ <value
+ color="180,137,130,255" />
+
+ <value
+ color="173,125,105,255" />
+
+ <value
+ color="144,95,98,255" />
+
+ <value
+ color="115,70,77,255" />
+
+ <value
+ color="155,78,47,255" />
+
+ <value
+ color="239,239,239,255" />
+
+ <value
+ color="194,194,194,255" />
+
+ <value
+ color="120,120,120,255" />
+
+ <value
+ color="10,10,10,255" />
+ </param_color>
</param>
<param
- id="656"
+ id="713"
group="0"
- name="Crooked_Nose"
- wearable="shape"
- label="Crooked Nose"
- edit_group="shape_nose"
+ wearable="skin"
+ edit_group="skin_makeup"
edit_group_order="9"
- label_min="Nose Left"
- label_max="Nose Right"
- value_min="-2"
- value_max="2"
+ name="In Shdw Opacity"
+ label_min="Clear"
+ label_max="Opaque"
+ value_min=".2"
+ value_max="1"
+ value_default=".7"
camera_distance=".3"
- camera_elevation=".04"
- camera_angle="-20">
- <param_morph />
- </param>
+ camera_elevation=".14">
+ <param_color
+ operation="multiply">
+ <value
+ color="255,255,255,0" />
- <param
- id="657"
- group="1"
- name="Smile_Mouth"
- wearable="shape"
- label="Mouth Corner"
- edit_group="shape_mouth"
- label_min="Corner Normal"
- label_max="Corner Up"
- value_min="0"
- value_max="1.4"
- camera_distance=".3"
- camera_elevation=".04">
- <param_morph />
+ <value
+ color="255,255,255,255" />
+ </param_color>
</param>
<param
- id="658"
- group="1"
- name="Frown_Mouth"
- wearable="shape"
- label="Mouth Corner"
- edit_group="shape_mouth"
- label_min="Corner Normal"
- label_max="Corner Down"
+ id="709"
+ group="0"
+ wearable="skin"
+ edit_group="skin_makeup"
+ edit_group_order="7"
+ name="Inner Shadow"
+ label_min="No Eyeshadow"
+ label_max="More Eyeshadow"
value_min="0"
- value_max="1.2"
+ value_max="1"
+ value_default="0"
camera_distance=".3"
- camera_elevation=".04">
- <param_morph />
+ camera_elevation=".14">
+ <param_alpha
+ tga_file="eyeshadow_inner_alpha.tga"
+ skip_if_zero="true"
+ domain="0.2" />
</param>
+ </layer>
+ <layer
+ name="eyeliner"
+ fixed_color="0,0,0,200">
<param
- id="797"
- group="1"
- name="Fat_Upper_Lip"
- wearable="shape"
- label="Fat Upper Lip"
- edit_group="shape_mouth"
- label_min="Normal Upper"
- label_max="Fat Upper"
+ id="703"
+ group="0"
+ wearable="skin"
+ edit_group="skin_makeup"
+ edit_group_order="13"
+ name="Eyeliner"
+ label_min="No Eyeliner"
+ label_max="Full Eyeliner"
value_min="0"
- value_max="1.5"
+ value_max="1"
+ value_default="0.0"
camera_distance=".3"
- camera_elevation=".04">
- <param_morph />
+ camera_elevation=".14">
+ <param_alpha
+ tga_file="eyeliner_alpha.tga"
+ skip_if_zero="true"
+ domain="0.1" />
</param>
<param
- id="798"
- group="1"
- name="Fat_Lower_Lip"
- wearable="shape"
- label="Fat Lower Lip"
- edit_group="shape_mouth"
- label_min="Normal Lower"
- label_max="Fat Lower"
+ id="714"
+ group="0"
+ wearable="skin"
+ edit_group="skin_makeup"
+ edit_group_order="14"
+ name="Eyeliner Color"
+ label_min="Dark Green"
+ label_max="Black"
value_min="0"
- value_max="1.5"
+ value_max="1"
camera_distance=".3"
- camera_elevation=".04">
- <param_morph />
- </param>
+ camera_elevation=".14">
+ <param_color>
+ <value
+ color="24,98,40,250" />
- <param
- id="660"
- group="1"
- name="Shear_Head"
- wearable="shape"
- label="Shear Face"
- edit_group="shape_head"
- label_min="Shear Left"
- label_max="Shear Right"
- value_min="-2"
- value_max="2"
- value_default="0"
- camera_distance=".5"
- camera_elevation=".04">
- <param_morph />
- </param>
+ <!-- dark green -->
+ <value
+ color="9,100,127,250" />
- <param
- id="770"
- group="1"
- name="Elongate_Head"
- wearable="shape"
- label="Shear Face"
- edit_group="shape_head"
- label_min="Flat Head"
- label_max="Long Head"
- value_min="-1"
- value_max="1"
- value_default="0"
- camera_distance=".5"
- camera_elevation=".04">
- <param_morph>
- <volume_morph
- name="HEAD"
- scale="0.02 0.0 0.0"/>
- </param_morph>
- </param>
+ <!-- lt.aqua blue -->
+ <value
+ color="61,93,134,250" />
- <param
- id="663"
- group="0"
- name="Shift_Mouth"
- wearable="shape"
- label="Shift Mouth"
- edit_group="shape_mouth"
- edit_group_order="7"
- label_min="Shift Left"
- label_max="Shift Right"
- value_min="-2"
- value_max="2"
- value_default="0"
- camera_distance=".35"
- camera_elevation=".04"
- camera_angle="-20">
- <param_morph />
- </param>
+ <!-- aqua -->
+ <value
+ color="70,29,27,250" />
- <param
- id="664"
- group="0"
- name="Pop_Eye"
- wearable="shape"
- label="Eye Pop"
- edit_group="shape_eyes"
- edit_group_order="8"
- label_min="Pop Right Eye"
- label_max="Pop Left Eye"
- value_min="-1.3"
- value_max="1.3"
- value_default="0"
- camera_elevation=".1"
- camera_distance=".35">
- <param_morph />
- </param>
+ <!-- dark brown -->
+ <value
+ color="115,75,65,250" />
- <param
- id="760"
- group="0"
- name="Jaw_Angle"
- wearable="shape"
- label="Jaw Angle"
- edit_group="shape_chin"
- edit_group_order="3.5"
- label_min="Low Jaw"
- label_max="High Jaw"
- value_min="-1.2"
- value_max="2"
- value_default="0"
- camera_distance=".5"
- camera_elevation=".04"
- camera_angle="70">
- <param_morph />
- </param>
+ <!-- lt. brown blue -->
+ <value
+ color="100,100,100,250" />
- <param
- id="665"
- group="0"
- name="Jaw_Jut"
- wearable="shape"
- label="Jaw Jut"
- edit_group="shape_chin"
- edit_group_order="4"
- label_min="Overbite"
- label_max="Underbite"
- value_min="-2"
- value_max="2"
- value_default="0"
- camera_distance=".5"
- camera_elevation=".04"
- camera_angle="70">
- <param_morph />
- </param>
+ <!-- grey -->
+ <value
+ color="91,80,74,250" />
- <param
- id="686"
- group="1"
- name="Head_Eyes_Big"
- wearable="shape"
- label="Eye Size"
- edit_group="shape_eyes"
- label_min="Beady Eyes"
- label_max="Anime Eyes"
- show_simple="true"
- value_min="-2"
- value_max="2"
- value_default="0">
- <param_morph />
- </param>
+ <!-- grey/brown -->
+ <value
+ color="112,42,76,250" />
- <param
- id="767"
- group="1"
- name="Bug_Eyed_Head"
- wearable="shape"
- label="Eye Depth"
- edit_group="shape_eyes"
- edit_group_order="4.5"
- label_min="Sunken Eyes"
- label_max="Bug Eyes"
- value_min="-2"
- value_max="2"
- value_default="0">
- <param_morph />
- </param>
+ <!-- plum -->
+ <value
+ color="14,14,14,250" />
-<!--
- #Fat_Lips = Fat_Lips 34 1 0 1
- #Wide_Lips = Wide_Lips 35 1 0 1
- #Wide_Nose = Wide_Nose 36 1 0 1
- -->
-<!--
- ##############
- # Facial Expression morphs
- ##############
- -->
- <param
- id="300"
- group="1"
- name="Express_Closed_Mouth"
- value_default="1"
- value_min="0"
- value_max="1">
- <param_morph />
+ <!-- black -->
+ </param_color>
</param>
+ </layer>
- <param
- id="301"
- group="1"
- name="Express_Tongue_Out"
- value_min="0"
- value_max="1">
- <param_morph />
- </param>
+ <layer
+ name="facialhair bump"
+ render_pass="bump">
+ <texture
+ tga_file="head_hair.tga"
+ file_is_mask="false" />
<param
- id="302"
+ id="1004"
+ sex="male"
group="1"
- name="Express_Surprise_Emote"
+ wearable="hair"
+ edit_group="driven"
+ name="Sideburns bump"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ tga_file="facehair_sideburns_alpha.tga"
+ skip_if_zero="true"
+ domain="0.05" />
</param>
<param
- id="303"
+ id="1006"
+ sex="male"
group="1"
- name="Express_Wink_Emote"
+ wearable="hair"
+ edit_group="driven"
+ name="Moustache bump"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ tga_file="facehair_moustache_alpha.tga"
+ skip_if_zero="true"
+ domain="0.05" />
</param>
<param
- id="304"
+ id="1008"
+ sex="male"
group="1"
- name="Express_Embarrassed_Emote"
+ wearable="hair"
+ edit_group="driven"
+ name="Soulpatch bump"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ tga_file="facehair_soulpatch_alpha.tga"
+ skip_if_zero="true"
+ domain="0.1" />
</param>
<param
- id="305"
+ id="1010"
+ sex="male"
group="1"
- name="Express_Shrug_Emote"
+ edit_group="driven"
+ wearable="hair"
+ name="Chin Curtains bump"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ tga_file="facehair_chincurtains_alpha.tga"
+ skip_if_zero="true"
+ domain="0.03" />
</param>
<param
- id="306"
+ id="1012"
group="1"
- name="Express_Kiss"
+ sex="male"
+ wearable="hair"
+ edit_group="driven"
+ name="5 O'Clock Shadow bump"
value_min="0"
value_max="1">
- <param_morph />
- </param>
+ <param_color>
+ <value
+ color="255,255,255,255" />
- <param
- id="307"
- group="1"
- name="Express_Bored_Emote"
- value_min="0"
- value_max="1">
- <param_morph />
+ <value
+ color="255,255,255,0" />
+ </param_color>
</param>
+ </layer>
- <param
- id="308"
- group="1"
- name="Express_Repulsed_Emote"
- value_min="0"
- value_max="1">
- <param_morph />
- </param>
+ <layer
+ name="facialhair"
+ global_color="hair_color">
- <param
- id="309"
- group="1"
- name="Express_Disdain"
- value_min="0"
- value_max="1">
- <param_morph />
- </param>
+ <texture
+ tga_file="head_hair.tga"
+ file_is_mask="false" />
<param
- id="310"
+ id="1005"
+ sex="male"
group="1"
- name="Express_Afraid_Emote"
+ wearable="hair"
+ edit_group="driven"
+ name="Sideburns"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ tga_file="facehair_sideburns_alpha.tga"
+ skip_if_zero="true"
+ domain="0.05" />
</param>
<param
- id="311"
+ id="1007"
+ sex="male"
group="1"
- name="Express_Worry_Emote"
+ wearable="hair"
+ edit_group="driven"
+ name="Moustache"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ tga_file="facehair_moustache_alpha.tga"
+ skip_if_zero="true"
+ domain="0.05" />
</param>
<param
- id="312"
+ id="1009"
+ sex="male"
group="1"
- name="Express_Cry_Emote"
+ wearable="hair"
+ edit_group="driven"
+ name="Soulpatch"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ tga_file="facehair_soulpatch_alpha.tga"
+ skip_if_zero="true"
+ domain="0.1" />
</param>
<param
- id="313"
+ id="1011"
+ sex="male"
group="1"
- name="Express_Sad_Emote"
+ wearable="hair"
+ edit_group="driven"
+ name="Chin Curtains"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ tga_file="facehair_chincurtains_alpha.tga"
+ skip_if_zero="true"
+ domain="0.03" />
</param>
<param
- id="314"
+ id="751"
group="1"
- name="Express_Anger_Emote"
+ wearable="hair"
+ sex="male"
+ edit_group="hair_facial"
+ name="5 O'Clock Shadow"
+ label_min="Dense hair"
+ label_max="Shadow hair"
value_min="0"
- value_max="1">
- <param_morph />
- </param>
+ value_max="1"
+ value_default="0.7"
+ camera_elevation=".1"
+ camera_distance=".3">
+ <param_color
+ operation="multiply">
+ <value
+ color="255,255,255,255" />
- <param
- id="315"
- group="1"
- name="Express_Frown"
- value_min="0"
- value_max="1">
- <param_morph />
+ <value
+ color="255,255,255,30" />
+ </param_color>
</param>
+ </layer>
- <param
- id="316"
- group="1"
- name="Express_Laugh_Emote"
- value_min="0"
- value_max="1">
- <param_morph />
- </param>
+ <layer
+ name="head_bodypaint">
+ <texture
+ local_texture="head_bodypaint" />
+ </layer>
+ <layer
+ name="head alpha"
+ visibility_mask="TRUE">
+ <texture
+ local_texture="head_alpha" />
+ </layer>
+ <layer
+ name="head_tattoo">
+ <texture
+ local_texture="head_tattoo" />
+ </layer>
+
+ </layer_set>
+
+ <!-- =========================================================== -->
+ <layer_set
+ body_region="upper_body"
+ width="512"
+ height="512">
+ <layer
+ name="base_upperbody bump"
+ render_pass="bump"
+ fixed_color="128,128,128,255">
+ </layer>
+ <layer
+ name="upperbody bump definition"
+ render_pass="bump">
+ <texture
+ tga_file="bump_upperbody_base.tga"
+ file_is_mask="FALSE"/>
<param
- id="317"
+ id="874"
group="1"
- name="Express_Toothsmile"
+ wearable="skin"
+ edit_group="driven"
+ edit_group_order="20"
+ name="Bump upperdef"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ domain="0" />
</param>
+ </layer>
+
+ <layer
+ name="base"
+ global_color="skin_color">
+ <texture
+ tga_file="body_skingrain.tga" />
+ </layer>
+
+ <layer
+ name="nipples">
+ <texture
+ tga_file="upperbody_color.tga" />
+ </layer>
+
+ <layer
+ name="shadow">
+ <texture
+ tga_file="upperbody_shading_alpha.tga"
+ file_is_mask="TRUE" />
<param
- id="318"
+ id="125"
group="1"
- name="Express_Smile"
+ name="Shading"
+ wearable="skin"
value_min="0"
value_max="1">
- <param_morph />
+ <param_color>
+ <value
+ color="0, 0, 0, 0" />
+
+ <value
+ color="0, 0, 0, 128" />
+ </param_color>
</param>
+ </layer>
+
+ <layer
+ name="highlight">
+ <texture
+ tga_file="upperbody_highlights_alpha.tga"
+ file_is_mask="TRUE" />
<param
- id="632"
+ id="126"
group="1"
- name="Express_Open_Mouth"
+ wearable="skin"
+ name="Shading"
value_min="0"
value_max="1">
- <param_morph />
+ <param_color>
+ <value
+ color="255, 255, 255, 0" />
+
+ <value
+ color="255, 255, 255, 64" />
+ </param_color>
</param>
+ </layer>
-<!--
- ##############
- # Lipsync morphs
- ##############
- -->
+ <layer
+ name="upper_bodypaint">
+ <texture
+ local_texture="upper_bodypaint" />
+ </layer>
+ <layer
+ name="freckles upper"
+ fixed_color="120,47,20,128">
<param
- id="70"
+ id="776"
group="1"
- name="Lipsync_Aah"
+ name="freckles upper"
+ wearable="skin"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ tga_file="upperbodyfreckles_alpha.tga"
+ skip_if_zero="true"
+ domain="0.6" />
</param>
+ </layer>
+
+ <layer
+ name="upper_tattoo">
+ <texture
+ local_texture="upper_tattoo" />
+ </layer>
+
+
+ <layer
+ name="upper_undershirt bump"
+ render_pass="bump"
+ fixed_color="128,128,128,255">
+ <texture
+ local_texture="upper_undershirt"
+ local_texture_alpha_only="true" />
<param
- id="71"
+ id="1043"
group="1"
- name="Lipsync_Ooh"
- value_min="0"
- value_max="1">
- <param_morph />
+ wearable="undershirt"
+ edit_group="driven"
+ name="Sleeve Length bump"
+ value_min=".01"
+ value_max="1"
+ value_default=".4">
+ <param_alpha
+ tga_file="shirt_sleeve_alpha.tga"
+ multiply_blend="false"
+ domain="0.01" />
</param>
-<!--
- ##############
- # other morphs (not user controlled)
- ##############
- -->
<param
- id="40"
+ id="1045"
group="1"
- name="Male_Head"
+ wearable="undershirt"
+ edit_group="undershirt"
+ edit_group_order="2"
+ name="Bottom bump"
value_min="0"
- value_max="1">
- <param_morph />
+ value_max="1"
+ value_default=".8">
+ <param_alpha
+ tga_file="shirt_bottom_alpha.tga"
+ multiply_blend="true"
+ domain="0.05" />
</param>
<param
- id="41"
+ id="1047"
group="1"
- name="Old"
+ wearable="undershirt"
+ edit_group="driven"
+ name="Collar Front bump"
value_min="0"
- value_max="1">
- <param_morph />
+ value_max="1"
+ value_default=".8">
+ <param_alpha
+ tga_file="shirt_collar_alpha.tga"
+ multiply_blend="true"
+ domain="0.05" />
</param>
-<!--
- ##############
- # animatable morphs
- ##############
- -->
<param
- id="51"
+ id="1049"
group="1"
- name="Furrowed_Eyebrows"
+ wearable="undershirt"
+ edit_group="driven"
+ name="Collar Back bump"
value_min="0"
- value_max="1">
- <param_morph />
+ value_max="1"
+ value_default=".8">
+ <param_alpha
+ tga_file="shirt_collar_back_alpha.tga"
+ multiply_blend="true"
+ domain="0.05" />
</param>
+ </layer>
+
+ <layer
+ name="upper_undershirt">
+ <texture
+ local_texture="upper_undershirt" />
<param
- id="53"
- group="1"
- name="Surprised_Eyebrows"
+ id="821"
+ group="0"
+ wearable="undershirt"
+ edit_group="colorpicker"
+ name="undershirt_red"
value_min="0"
- value_max="1">
- <param_morph />
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="255, 0, 0, 255" />
+ </param_color>
</param>
<param
- id="54"
- group="1"
- name="Worried_Eyebrows"
+ id="822"
+ group="0"
+ wearable="undershirt"
+ edit_group="colorpicker"
+ name="undershirt_green"
value_min="0"
- value_max="1">
- <param_morph />
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="0, 255, 0, 255" />
+ </param_color>
</param>
<param
- id="55"
- group="1"
- name="Frown_Mouth"
+ id="823"
+ group="0"
+ wearable="undershirt"
+ edit_group="colorpicker"
+ name="undershirt_blue"
value_min="0"
- value_max="1">
- <param_morph />
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="0, 0, 255, 255" />
+ </param_color>
</param>
<param
- id="57"
+ id="1042"
group="1"
- name="Smile_Mouth"
- value_min="0"
- value_max="1">
- <param_morph />
+ wearable="undershirt"
+ edit_group="driven"
+ name="Sleeve Length"
+ value_min=".01"
+ value_max="1"
+ value_default=".4">
+ <param_alpha
+ tga_file="shirt_sleeve_alpha.tga"
+ multiply_blend="false"
+ domain="0.01" />
</param>
<param
- id="58"
+ id="1044"
group="1"
- name="Blink_Left"
+ wearable="undershirt"
+ edit_group="driven"
+ name="Bottom"
value_min="0"
- value_max="1">
- <param_morph />
+ value_max="1"
+ value_default=".8">
+ <param_alpha
+ tga_file="shirt_bottom_alpha.tga"
+ multiply_blend="true"
+ domain="0.05" />
</param>
<param
- id="59"
+ id="1046"
group="1"
- name="Blink_Right"
+ wearable="undershirt"
+ edit_group="driven"
+ name="Collar Front"
value_min="0"
- value_max="1">
- <param_morph />
- </param>
-
-<!--
- #end morph targets
- -->
- </mesh>
-
- <mesh
- type="headMesh"
- lod="1"
- file_name="avatar_head_1.llm"
- min_pixel_width="160"
- reference="avatar_head.llm">
- </mesh>
-
- <mesh
- type="headMesh"
- lod="2"
- file_name="avatar_head_2.llm"
- min_pixel_width="80"
- reference="avatar_head.llm">
- </mesh>
-
- <mesh
- type="headMesh"
- lod="3"
- file_name="avatar_head_3.llm"
- min_pixel_width="40"
- reference="avatar_head.llm">
- </mesh>
-
- <mesh
- type="headMesh"
- lod="4"
- file_name="avatar_head_4.llm"
- min_pixel_width="0"
- reference="avatar_head.llm">
- </mesh>
-
- <mesh
- type="eyelashMesh"
- lod="0"
- file_name="avatar_eyelashes.llm"
- min_pixel_width="320">
- <param
- shared="1"
- id="660"
- group="1"
- name="Shear_Head"
- wearable="shape"
- label="Shear Face"
- edit_group="shape_head"
- label_min="Shear Left"
- label_max="Shear Right"
- value_min="-2"
- value_max="2"
- value_default="0"
- camera_distance=".5"
- camera_elevation=".04">
- <param_morph />
+ value_max="1"
+ value_default=".8">
+ <param_alpha
+ tga_file="shirt_collar_alpha.tga"
+ multiply_blend="true"
+ domain="0.05" />
</param>
<param
- shared="1"
- id="770"
+ id="1048"
group="1"
- name="Elongate_Head"
- wearable="shape"
- label="Shear Face"
- edit_group="shape_head"
- label_min="Flat Head"
- label_max="Long Head"
- value_min="-1"
+ wearable="undershirt"
+ edit_group="driven"
+ name="Collar Back"
+ label_min="Low"
+ label_max="High"
+ value_min="0"
value_max="1"
- value_default="0"
- camera_distance=".5"
- camera_elevation=".04">
- <param_morph />
+ value_default=".8">
+ <param_alpha
+ tga_file="shirt_collar_back_alpha.tga"
+ multiply_blend="true"
+ domain="0.05" />
</param>
+ </layer>
+ <layer
+ name="Nail Polish">
<param
- shared="1"
- id="664"
+ id="710"
group="0"
- name="Pop_Eye"
- wearable="shape"
- label="Eye Pop"
- edit_group="shape_eyes"
- edit_group_order="8"
- label_min="Pop Right Eye"
- label_max="Pop Left Eye"
- value_min="-2"
- value_max="2"
- value_default="0"
- camera_distance=".5"
- camera_elevation=".04"
- camera_angle="-20">
- <param_morph />
+ wearable="skin"
+ edit_group="skin_makeup"
+ edit_group_order="15"
+ name="Nail Polish"
+ label_min="No Polish"
+ label_max="Painted Nails"
+ value_min="0"
+ value_max="1"
+ value_default="0.0"
+ camera_distance="1.6"
+ camera_elevation="-.4"
+ camera_angle="70">
+ <param_alpha
+ tga_file="nailpolish_alpha.tga"
+ skip_if_zero="true"
+ domain="0.1" />
</param>
<param
- shared="1"
- id="21"
+ id="715"
group="0"
- name="Upper_Eyelid_Fold"
- label="Upper Eyelid Fold"
- wearable="shape"
- edit_group="shape_eyes"
- label_min="Uncreased"
- label_max="Creased"
- value_min="-0.2"
- value_max="1.3"
- camera_elevation=".1"
- camera_distance=".35">
- <param_morph />
- </param>
+ wearable="skin"
+ edit_group="skin_makeup"
+ edit_group_order="16"
+ name="Nail Polish Color"
+ label_min="Pink"
+ label_max="Black"
+ value_min="0"
+ value_max="1"
+ camera_distance="1.6"
+ camera_elevation="-.4"
+ camera_angle="70">
+ <param_color>
+ <value
+ color="255,187,200,255" />
- <param
- shared="1"
- id="24"
- group="0"
- name="Wide_Eyes"
- label="Eye Opening"
- wearable="shape"
- edit_group="shape_eyes"
- label_min="Narrow"
- label_max="Wide"
- show_simple="true"
- value_min="-1.5"
- value_max="2"
- camera_elevation=".1"
- camera_distance=".3">
- <param_morph />
+ <value
+ color="194,102,127,255" />
+
+ <value
+ color="227,34,99,255" />
+
+ <value
+ color="168,41,60,255" />
+
+ <value
+ color="97,28,59,255" />
+
+ <value
+ color="234,115,93,255" />
+
+ <value
+ color="142,58,47,255" />
+
+ <value
+ color="114,30,46,255" />
+
+ <value
+ color="14,14,14,255" />
+ </param_color>
</param>
+ </layer>
+
+ <layer
+ name="upper_gloves bump"
+ render_pass="bump"
+ fixed_color="128,128,128,255">
+ <texture
+ local_texture="upper_gloves"
+ local_texture_alpha_only="true" />
<param
- shared="1"
- id="186"
+ id="1059"
group="1"
- name="Egg_Head"
- label="Egg Head"
- wearable="shape"
- edit_group="shape_head"
- label_min="Chin Heavy"
- label_max="Forehead Heavy"
- value_min="-1.3"
+ wearable="gloves"
+ edit_group="driven"
+ name="Glove Length bump"
+ value_min=".01"
value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
+ value_default=".8">
+ <param_alpha
+ tga_file="glove_length_alpha.tga"
+ domain="0.01" />
</param>
<param
- shared="1"
- id="187"
+ id="1061"
group="1"
- name="Squash_Stretch_Head"
- label="Squash/Stretch Head"
- wearable="shape"
- edit_group="shape_head"
- label_min="Squash Head"
- label_max="Stretch Head"
- value_min="-.5"
+ wearable="gloves"
+ edit_group="driven"
+ name="Glove Fingers bump"
+ value_min=".01"
value_max="1"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_morph />
+ value_default="1">
+ <param_alpha
+ tga_file="gloves_fingers_alpha.tga"
+ multiply_blend="true"
+ domain="0.01" />
</param>
+ </layer>
- <param
- shared="1"
- id="194"
- group="1"
- name="Eye_Spread"
- edit_group="shape_eyes"
- label_min="Eyes Together"
- label_max="Eyes Spread"
- value_min="-2"
- value_max="2">
- <param_morph />
- </param>
+ <layer
+ name="upper_gloves">
+ <texture
+ local_texture="upper_gloves" />
<param
- id="518"
+ id="827"
group="0"
- name="Eyelashes_Long"
- wearable="shape"
- label="Eyelash Length"
- edit_group="shape_eyes"
- edit_group_order="7"
- label_min="Short"
- label_max="Long"
- value_min="-.3"
- value_max="1.5"
- camera_elevation=".1"
- camera_distance=".30"
- camera_angle="-20">
- <param_morph />
+ wearable="gloves"
+ edit_group="colorpicker"
+ name="gloves_red"
+ value_min="0"
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="255, 0, 0, 255" />
+ </param_color>
</param>
<param
- shared="1"
- id="650"
+ id="829"
group="0"
- name="Eyelid_Corner_Up"
- label="Outer Eye Corner"
- wearable="shape"
- edit_group="shape_eyes"
- label_min="Corner Down"
- label_max="Corner Up"
- value_min="-1.3"
- value_max="1.2"
- camera_elevation=".1"
- camera_distance=".3">
- <param_morph />
+ wearable="gloves"
+ edit_group="colorpicker"
+ name="gloves_green"
+ value_min="0"
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="0, 255, 0, 255" />
+ </param_color>
</param>
-
+
<param
- shared="1"
- id="880"
+ id="830"
group="0"
- name="Eyelid_Inner_Corner_Up"
- label="Inner Eye Corner"
- wearable="shape"
- edit_group="shape_eyes"
- label_min="Corner Down"
- label_max="Corner Up"
- value_min="-1.3"
- value_max="1.2"
- camera_elevation=".1"
- camera_distance=".3">
- <param_morph />
- </param>
+ wearable="gloves"
+ edit_group="colorpicker"
+ name="gloves_blue"
+ value_min="0"
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
- <param
- shared="1"
- id="686"
- group="1"
- name="Head_Eyes_Big"
- wearable="shape"
- label="Eye Size"
- edit_group="shape_eyes"
- label_min="Beady Eyes"
- label_max="Anime Eyes"
- value_min="-2"
- value_max="2"
- show_simple="true"
- value_default="0">
- <param_morph />
+ <value
+ color="0, 0, 255, 255" />
+ </param_color>
</param>
<param
- shared="1"
- id="767"
+ id="1058"
group="1"
- name="Bug_Eyed_Head"
- wearable="shape"
- label="Eye Depth"
- edit_group="shape_eyes"
- edit_group_order="4.5"
- label_min="Sunken Eyes"
- label_max="Bug Eyes"
- value_min="-2"
- value_max="2"
- value_default="0">
- <param_morph />
+ wearable="gloves"
+ edit_group="driven"
+ name="Glove Length"
+ value_min=".01"
+ value_max="1"
+ value_default=".8">
+ <param_alpha
+ tga_file="glove_length_alpha.tga"
+ domain="0.01" />
</param>
-<!--
- ##############
- # Facial Expression morphs
- ##############
- -->
<param
- shared="1"
- id="301"
+ id="1060"
group="1"
- name="Express_Tongue_Out"
- value_min="0"
- value_max="1">
- <param_morph />
+ wearable="gloves"
+ edit_group="driven"
+ name="Glove Fingers"
+ value_min=".01"
+ value_max="1"
+ value_default="1">
+ <param_alpha
+ tga_file="gloves_fingers_alpha.tga"
+ multiply_blend="true"
+ domain="0.01" />
</param>
+ </layer>
- <param
- shared="1"
- id="302"
- group="1"
- name="Express_Surprise_Emote"
- value_min="0"
- value_max="1">
- <param_morph />
- </param>
+ <layer
+ name="upper_clothes_shadow">
+ <texture
+ local_texture="upper_shirt" />
<param
- shared="1"
- id="303"
+ id="899"
group="1"
- name="Express_Wink_Emote"
+ edit_group="driven"
+ wearable="shirt"
+ name="Upper Clothes Shading"
value_min="0"
- value_max="1">
- <param_morph />
- </param>
+ value_max="1"
+ value_default="0">
+ <param_color>
+ <value
+ color="0, 0, 0, 0" />
- <param
- shared="1"
- id="304"
- group="1"
- name="Express_Embarrassed_Emote"
- value_min="0"
- value_max="1">
- <param_morph />
+ <value
+ color="0, 0, 0, 80" />
+ </param_color>
</param>
<param
- shared="1"
- id="305"
+ id="900"
group="1"
- name="Express_Shrug_Emote"
- value_min="0"
- value_max="1">
- <param_morph />
+ wearable="shirt"
+ edit_group="driven"
+ name="Sleeve Length Shadow"
+ value_min="0.02"
+ value_max=".87"
+ value_default="0.02">
+ <param_alpha
+ multiply_blend="false"
+ tga_file="shirt_sleeve_alpha.tga"
+ skip_if_zero="true"
+ domain="0.03" />
</param>
<param
- shared="1"
- id="306"
+ id="901"
group="1"
- name="Express_Kiss"
- value_min="0"
+ wearable="shirt"
+ edit_group="driven"
+ name="Shirt Shadow Bottom"
+ value_min="0.02"
value_max="1">
- <param_morph />
+ <param_alpha
+ multiply_blend="true"
+ tga_file="shirt_bottom_alpha.tga"
+ skip_if_zero="true"
+ domain="0.05" />
</param>
<param
- shared="1"
- id="307"
+ id="902"
group="1"
- name="Express_Bored_Emote"
- value_min="0"
+ wearable="shirt"
+ edit_group="driven"
+ name="Collar Front Shadow Height"
+ value_min="0.02"
value_max="1">
- <param_morph />
+ <param_alpha
+ multiply_blend="true"
+ tga_file="shirt_collar_alpha.tga"
+ skip_if_zero="true"
+ domain="0.02" />
</param>
<param
- shared="1"
- id="308"
+ id="903"
group="1"
- name="Express_Repulsed_Emote"
- value_min="0"
+ wearable="shirt"
+ edit_group="driven"
+ name="Collar Back Shadow Height"
+ value_min="0.02"
value_max="1">
- <param_morph />
+ <param_alpha
+ multiply_blend="true"
+ tga_file="shirt_collar_back_alpha.tga"
+ skip_if_zero="true"
+ domain="0.02" />
</param>
+ </layer>
- <param
- shared="1"
- id="309"
- group="1"
- name="Express_Disdain"
- value_min="0"
- value_max="1">
- <param_morph />
- </param>
+ <layer
+ name="upper_shirt base bump"
+ render_pass="bump"
+ fixed_color="128,128,128,255">
+ <texture
+ local_texture="upper_shirt"
+ local_texture_alpha_only="true" />
<param
- shared="1"
- id="310"
+ id="1029"
group="1"
- name="Express_Afraid_Emote"
+ wearable="shirt"
+ edit_group="driven"
+ name="Sleeve Length Cloth"
value_min="0"
- value_max="1">
- <param_morph />
+ value_max="0.85">
+ <param_alpha
+ multiply_blend="false"
+ tga_file="shirt_sleeve_alpha.tga"
+ domain="0.01" />
</param>
<param
- shared="1"
- id="312"
+ id="1030"
group="1"
- name="Express_Cry_Emote"
+ wearable="shirt"
+ edit_group="driven"
+ name="Shirt Bottom Cloth"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ multiply_blend="true"
+ tga_file="shirt_bottom_alpha.tga"
+ domain="0.05" />
</param>
<param
- shared="1"
- id="313"
+ id="1031"
group="1"
- name="Express_Sad_Emote"
+ wearable="shirt"
+ edit_group="driven"
+ name="Collar Front Height Cloth"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ multiply_blend="true"
+ tga_file="shirt_collar_alpha.tga"
+ domain="0.05" />
</param>
<param
- shared="1"
- id="314"
+ id="1032"
group="1"
- name="Express_Anger_Emote"
+ wearable="shirt"
+ edit_group="driven"
+ name="Collar Back Height Cloth"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ multiply_blend="true"
+ tga_file="shirt_collar_back_alpha.tga"
+ domain="0.05" />
</param>
+ </layer>
- <param
- shared="1"
- id="315"
- group="1"
- name="Express_Frown"
- value_min="0"
- value_max="1">
- <param_morph />
- </param>
+ <layer
+ name="upper_clothes bump"
+ render_pass="bump">
+ <texture
+ tga_file="bump_shirt_wrinkles.tga" />
- <param
- shared="1"
- id="316"
- group="1"
- name="Express_Laugh_Emote"
- value_min="0"
- value_max="1">
- <param_morph />
- </param>
+ <texture
+ local_texture="upper_shirt"
+ local_texture_alpha_only="true" />
<param
- shared="1"
- id="317"
- group="1"
- name="Express_Toothsmile"
+ id="868"
+ group="0"
+ wearable="shirt"
+ edit_group="shirt"
+ edit_group_order="8"
+ name="Shirt Wrinkles"
value_min="0"
- value_max="1">
- <param_morph />
+ value_max="1"
+ value_default="0">
+ <param_color>
+ <value
+ color="255, 255, 255, 0" />
+
+ <value
+ color="255, 255, 255, 255" />
+ </param_color>
</param>
<param
- shared="1"
- id="318"
+ id="1013"
group="1"
- name="Express_Smile"
+ wearable="shirt"
+ edit_group="driven"
+ name="Sleeve Length Cloth"
value_min="0"
- value_max="1">
- <param_morph />
+ value_max="0.85">
+ <param_alpha
+ multiply_blend="false"
+ tga_file="shirt_sleeve_alpha.tga"
+ domain="0.01" />
</param>
-<!--
- ##############
- # other morphs (not user controlled)
- ##############
- -->
<param
- shared="1"
- id="41"
+ id="1014"
group="1"
- name="Old"
+ wearable="shirt"
+ edit_group="driven"
+ name="Shirt Bottom Cloth"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ multiply_blend="true"
+ tga_file="shirt_bottom_alpha.tga"
+ domain="0.05" />
</param>
-<!--
- ##############
- # animatable morphs
- ##############
- -->
<param
- shared="1"
- id="58"
+ id="1015"
group="1"
- name="Blink_Left"
+ wearable="shirt"
+ edit_group="driven"
+ name="Collar Front Height Cloth"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ multiply_blend="true"
+ tga_file="shirt_collar_alpha.tga"
+ domain="0.05" />
</param>
<param
- shared="1"
- id="59"
+ id="1016"
group="1"
- name="Blink_Right"
- value_min="0"
- value_max="1">
- <param_morph />
- </param>
- </mesh>
-
-<!--
- #headMesh2 =
- #headMesh3 =
- -->
- <mesh
- type="upperBodyMesh"
- lod="0"
- file_name="avatar_upper_body.llm"
- min_pixel_width="320">
-<!--
- #begin morph targets
- #############
- # tweakable morphs
- #############
- -->
- <param
- id="104"
- group="1"
- name="Big_Belly_Torso"
+ wearable="shirt"
+ edit_group="driven"
+ name="Collar Back Height Cloth"
value_min="0"
value_max="1">
- <param_morph>
- <volume_morph
- name="BELLY"
- scale="0.075 0.04 0.03"
- pos="0.07 0 -0.07"/>
- </param_morph>
+ <param_alpha
+ multiply_blend="true"
+ tga_file="shirt_collar_back_alpha.tga"
+ domain="0.05" />
</param>
+ </layer>
+
+ <layer
+ name="upper_clothes">
+ <texture
+ local_texture="upper_shirt" />
<param
- id="626"
- sex="female"
- group="1"
- name="Big_Chest"
- label="Chest Size"
- wearable="shape"
- edit_group="shape_torso"
- label_min="Small"
- label_max="Large"
+ id="803"
+ group="0"
+ wearable="shirt"
+ edit_group="colorpicker"
+ name="shirt_red"
value_min="0"
value_max="1"
- camera_elevation=".1"
- camera_distance="1"
- camera_angle="15">
- <param_morph />
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="255, 0, 0, 255" />
+ </param_color>
</param>
<param
- id="627"
- sex="female"
- group="1"
- name="Small_Chest"
- label="Chest Size"
- wearable="shape"
- edit_group="shape_torso"
- label_min="Large"
- label_max="Small"
+ id="804"
+ group="0"
+ wearable="shirt"
+ edit_group="colorpicker"
+ name="shirt_green"
value_min="0"
value_max="1"
- camera_elevation="0"
- camera_distance=".28">
- <param_morph />
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="0, 255, 0, 255" />
+ </param_color>
</param>
<param
- id="843"
- sex="female"
- group="1"
- name="No_Chest"
- label="Chest Size"
- wearable="shape"
- edit_group="shape_torso"
- label_min="Some"
- label_max="None"
+ id="805"
+ group="0"
+ wearable="shirt"
+ edit_group="colorpicker"
+ name="shirt_blue"
value_min="0"
value_max="1"
- camera_elevation="0"
- camera_distance=".28">
- <param_morph />
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="0, 0, 255, 255" />
+ </param_color>
</param>
<param
- id="106"
- group="1"
- name="Muscular_Torso"
- label="Torso Muscles"
- show_simple="true"
- wearable="shape"
- edit_group="shape_torso"
- label_min="Regular"
- label_max="Muscular"
- value_min="0"
- value_max="1.4"
- camera_elevation=".3"
- camera_distance="1.2">
- <param_morph>
- <volume_morph
- name="L_CLAVICLE"
- scale="0.02 0.0 0.005"
- pos="0.0 0 0.005"/>
- <volume_morph
- name="L_UPPER_ARM"
- scale="0.015 0.0 0.005"
- pos="0.015 0 0"/>
- <volume_morph
- name="L_LOWER_ARM"
- scale="0.005 0.0 0.005"
- pos="0.005 0 0"/>
- <volume_morph
- name="R_CLAVICLE"
- scale="0.02 0.0 0.005"
- pos="0.0 0 0.005"/>
- <volume_morph
- name="R_UPPER_ARM"
- scale="0.015 0.0 0.005"
- pos="0.015 0 0"/>
- <volume_morph
- name="R_LOWER_ARM"
- scale="0.005 0.0 0.005"
- pos="0.005 0 0"/>
- </param_morph>
- </param>
-
- <param
- id="648"
- group="1"
- sex="female"
- name="Scrawny_Torso"
- label="Torso Muscles"
- show_simple="true"
- wearable="shape"
- edit_group="shape_torso"
- label_min="Regular"
- label_max="Scrawny"
- value_min="0"
- value_max="1.3"
- camera_elevation=".3"
- camera_distance="1.2">
- <param_morph>
- <volume_morph
- name="BELLY"
- scale="0.0 -0.01 0.0"
- pos="0.0 0.0 0"/>
- <volume_morph
- name="CHEST"
- scale="-0.01 -0.01 0.0"
- pos="0.01 0.0 0"/>
- <volume_morph
- name="L_CLAVICLE"
- scale="0.0 -0.03 -0.005"
- pos="0.0 0 -0.005"/>
- <volume_morph
- name="L_UPPER_ARM"
- scale="-0.01 -0.01 -0.02"
- pos="0 0 0"/>
- <volume_morph
- name="L_LOWER_ARM"
- scale="-0.005 0.0 -0.01"
- pos="-0.005 0 0"/>
- <volume_morph
- name="R_CLAVICLE"
- scale="0.0 -0.03 -0.005"
- pos="0.0 0 -0.005"/>
- <volume_morph
- name="R_UPPER_ARM"
- scale="-0.01 -0.01 -0.02"
- pos="0 0 0"/>
- <volume_morph
- name="R_LOWER_ARM"
- scale="-0.005 0.0 -0.01"
- pos="-0.005 0 0"/>
- </param_morph>
- </param>
-
- <param
- id="677"
+ id="600"
group="1"
- sex="male"
- name="Scrawny_Torso_Male"
- label="Torso Scrawny"
- wearable="shape"
- edit_group="shape_torso"
- label_min="Regular"
- label_max="Scrawny"
- value_min="0"
- value_max="1.3"
- camera_elevation=".3"
- camera_distance="1.2">
- <param_morph>
- <volume_morph
- name="BELLY"
- scale="-0.01 -0.01 0.0"
- pos="0.01 0.0 0"/>
- <volume_morph
- name="CHEST"
- scale="-0.02 -0.02 0.0"
- pos="0.01 0.0 0"/>
- <volume_morph
- name="L_CLAVICLE"
- scale="0.0 -0.03 -0.005"
- pos="0.0 0 -0.005"/>
- <volume_morph
- name="L_UPPER_ARM"
- scale="-0.01 -0.01 -0.02"
- pos="0 0 0"/>
- <volume_morph
- name="L_LOWER_ARM"
- scale="-0.005 0.0 -0.01"
- pos="-0.005 0 0"/>
- <volume_morph
- name="R_CLAVICLE"
- scale="0.0 -0.03 -0.005"
- pos="0.0 0 -0.005"/>
- <volume_morph
- name="R_UPPER_ARM"
- scale="-0.01 -0.01 -0.02"
- pos="0 0 0"/>
- <volume_morph
- name="R_LOWER_ARM"
- scale="-0.005 0.0 -0.01"
- pos="-0.005 0 0"/>
- </param_morph>
- </param>
-
- <param
- id="634"
- group="1"
- name="Fat_Torso"
- label="Fat Torso"
- wearable="shape"
- edit_group="shape_body"
- label_min="skinny"
- label_max="fat"
+ wearable="shirt"
+ edit_group="driven"
+ name="Sleeve Length Cloth"
value_min="0"
- value_max="1"
- camera_elevation=".3">
- <param_morph>
- <volume_morph
- name="CHEST"
- scale="0.02 0.03 0.03"
- pos="0 0 -0.03"/>
- <volume_morph
- name="BELLY"
- scale="0.09 0.08 0.07"
- pos="0 0 -0.05"/>
- <volume_morph
- name="L_CLAVICLE"
- scale="0.0 0.0 0.015"/>
- <volume_morph
- name="L_UPPER_ARM"
- scale="0.02 0.0 0.02"
- pos="0.0 0.0 -0.02"/>
- <volume_morph
- name="L_LOWER_ARM"
- scale="0.01 0.0 0.01"
- pos="0.0 0.0 -0.01"/>
- <volume_morph
- name="R_CLAVICLE"
- scale="0.0 0.0 0.015"/>
- <volume_morph
- name="R_UPPER_ARM"
- scale="0.02 0.0 0.02"
- pos="0.0 0.0 -0.02"/>
- <volume_morph
- name="R_LOWER_ARM"
- scale="0.01 0.0 0.01"
- pos="0.0 0.0 -0.01"/>
- <volume_morph
- name="NECK"
- scale="0.015 0.01 0.0"/>
- <volume_morph
- name="HEAD"
- scale="0.0 0.0 0.01"
- pos="0 0 -0.01"/>
- </param_morph>
-
- </param>
-
- <param
- id="507"
- group="0"
- sex="female"
- name="Breast_Gravity"
- label="Breast Buoyancy"
- wearable="shape"
- edit_group="shape_torso"
- edit_group_order="7"
- label_min="Less Gravity"
- label_max="More Gravity"
- value_default="0"
- value_min="-1.5"
- value_max="2"
- camera_elevation=".3"
- camera_distance=".8">
- <param_morph />
+ value_max="0.85"
+ value_default=".7">
+ <param_alpha
+ multiply_blend="false"
+ tga_file="shirt_sleeve_alpha.tga"
+ domain="0.01" />
</param>
<param
- id="628"
+ id="601"
group="1"
- name="Displace_Loose_Upperbody"
- label="Shirt Fit"
wearable="shirt"
edit_group="driven"
- clothing_morph="true"
+ name="Shirt Bottom Cloth"
value_min="0"
value_max="1"
- value_default="0">
- <param_morph />
+ value_default=".8">
+ <param_alpha
+ multiply_blend="true"
+ tga_file="shirt_bottom_alpha.tga"
+ domain="0.05" />
</param>
<param
- id="840"
- group="0"
- name="Shirtsleeve_flair"
- label="Sleeve Looseness"
- show_simple="true"
+ id="602"
+ group="1"
wearable="shirt"
- edit_group="shirt"
- edit_group_order="6"
- clothing_morph="true"
- label_min="Tight Sleeves"
- label_max="Loose Sleeves"
+ edit_group="driven"
+ name="Collar Front Height Cloth"
value_min="0"
- value_max="1.5"
- camera_distance="1.8"
- camera_angle="30"
- camera_elevation="-.3">
- <param_morph />
+ value_max="1"
+ value_default=".8">
+ <param_alpha
+ multiply_blend="true"
+ tga_file="shirt_collar_alpha.tga"
+ domain="0.05" />
</param>
<param
- id="855"
+ id="778"
group="1"
- name="Love_Handles"
- value_default="0"
- value_min="-1"
- value_max="2">
- <param_morph>
- <volume_morph
- name="BELLY"
- scale="0.0 0.02 0.0"/>
- </param_morph>
- </param>
-
- <param
- id="684"
- group="0"
- sex="female"
- name="Breast_Female_Cleavage"
- label="Breast Cleavage"
- wearable="shape"
- edit_group="shape_torso"
- edit_group_order="8"
- label_min="Separate"
- label_max="Join"
- value_default="0"
- value_min="-.3"
- value_max="1.3"
- camera_elevation=".3"
- camera_distance=".8">
- <param_morph />
+ wearable="shirt"
+ edit_group="driven"
+ name="Collar Back Height Cloth"
+ value_min="0"
+ value_max="1"
+ value_default=".8">
+ <param_alpha
+ multiply_blend="true"
+ tga_file="shirt_collar_back_alpha.tga"
+ domain="0.05" />
</param>
+ </layer>
- <param
- id="685"
- group="0"
- sex="male"
- name="Chest_Male_No_Pecs"
- label="Pectorals"
- wearable="shape"
- edit_group="shape_torso"
- edit_group_order="5"
- label_min="Big Pectorals"
- label_max="Sunken Chest"
- value_default="0"
- value_min="-.5"
- value_max="1.1"
- camera_elevation=".3"
- camera_distance="1.2">
- <param_morph />
- </param>
+ <layer
+ name="upper_jacket base bump"
+ render_pass="bump"
+ fixed_color="128,128,128,255">
+ <texture
+ local_texture="upper_jacket"
+ local_texture_alpha_only="true" />
-<!-- ############# #
- other morphs (not user controlled)
- ############# -->
<param
- id="100"
+ id="1039"
group="1"
- name="Male_Torso"
- label_min="Male_Torso"
- value_min="0"
- value_max="1">
- <param_morph>
- <volume_morph
- name="CHEST"
- scale="0.03 0.04 0.02"
- pos="-0.03 0 -0.01"/>
- <volume_morph
- name="BELLY"
- scale="0.03 0.03 0.0"
- pos="-0.03 0 0.02"/>
- <volume_morph
- name="L_CLAVICLE"
- scale="0.02 0.0 0.01"
- pos="-0.02 0 0"/>
- <volume_morph
- name="L_UPPER_ARM"
- scale="0.01 0.0 0.01"
- pos="0.0 0.0 -0.01"/>
- <volume_morph
- name="L_LOWER_ARM"
- scale="0.005 0.0 0.005"
- pos="0.0 0.0 -0.005"/>
- <volume_morph
- name="R_CLAVICLE"
- scale="0.02 0.0 0.01"
- pos="-0.02 0 0"/>
- <volume_morph
- name="R_UPPER_ARM"
- scale="0.01 0.0 0.01"
- pos="0.0 0.0 -0.01"/>
- <volume_morph
- name="R_LOWER_ARM"
- scale="0.005 0.0 0.005"
- pos="0.0 0.0 -0.005"/>
- <volume_morph
- name="NECK"
- scale="0.015 0.01 0.0"/>
- <volume_morph
- name="HEAD"
- scale="0.0 0.0 0.01"
- pos="0 0 -0.01"/>
- </param_morph>
- </param>
-
-<!--
- ##############
- # animatable morphs
- ##############
- -->
- <param
- id="101"
- group="1"
- name="Hands_Relaxed"
+ wearable="jacket"
+ edit_group="driven"
+ edit_group_order="1"
+ name="Jacket Sleeve Length bump"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ multiply_blend="false"
+ tga_file="shirt_sleeve_alpha.tga"
+ domain="0.01" />
</param>
<param
- id="102"
+ id="1040"
group="1"
- name="Hands_Point"
+ wearable="jacket"
+ edit_group="driven"
+ name="Jacket Collar Front bump"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ multiply_blend="true"
+ tga_file="shirt_collar_alpha.tga"
+ domain="0.05" />
</param>
<param
- id="103"
+ id="1041"
group="1"
- name="Hands_Fist"
+ wearable="jacket"
+ edit_group="driven"
+ edit_group_order="3.5"
+ name="Jacket Collar Back bump"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ multiply_blend="true"
+ tga_file="shirt_collar_back_alpha.tga"
+ domain="0.05" />
</param>
<param
- id="666"
+ id="1037"
group="1"
- name="Hands_Relaxed_L"
+ wearable="jacket"
+ edit_group="driven"
+ name="jacket bottom length upper bump"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ multiply_blend="true"
+ tga_file="jacket_length_upper_alpha.tga"
+ domain="0.01" />
</param>
<param
- id="667"
+ id="1038"
group="1"
- name="Hands_Point_L"
+ wearable="jacket"
+ edit_group="driven"
+ name="jacket open upper bump"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ multiply_blend="true"
+ tga_file="jacket_open_upper_alpha.tga"
+ domain="0.01" />
</param>
+ </layer>
- <param
- id="668"
- group="1"
- name="Hands_Fist_L"
- value_min="0"
- value_max="1">
- <param_morph />
- </param>
+ <layer
+ name="upper_jacket bump"
+ render_pass="bump">
+ <texture
+ tga_file="bump_shirt_wrinkles.tga" />
- <param
- id="669"
- group="1"
- name="Hands_Relaxed_R"
- value_min="0"
- value_max="1">
- <param_morph />
- </param>
+ <texture
+ local_texture="upper_jacket"
+ local_texture_alpha_only="true" />
+
<param
- id="670"
- group="1"
- name="Hands_Point_R"
- value_min="0"
- value_max="1">
- <param_morph />
+ id="875"
+ group="1"
+ wearable="jacket"
+ name="jacket upper Wrinkles"
+ value_min="0"
+ value_max="1"
+ value_default="0">
+ <param_color>
+ <value
+ color="255, 255, 255, 0" />
+
+ <value
+ color="255, 255, 255, 255" />
+ </param_color>
</param>
<param
- id="671"
+ id="1019"
group="1"
- name="Hands_Fist_R"
+ wearable="jacket"
+ edit_group="driven"
+ edit_group_order="1"
+ name="Jacket Sleeve Length bump"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ multiply_blend="false"
+ tga_file="shirt_sleeve_alpha.tga"
+ domain="0.01" />
</param>
<param
- id="672"
+ id="1021"
group="1"
- name="Hands_Typing"
+ wearable="jacket"
+ edit_group="driven"
+ name="Jacket Collar Front bump"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ multiply_blend="true"
+ tga_file="shirt_collar_alpha.tga"
+ domain="0.05" />
</param>
<param
- id="766"
+ id="1023"
group="1"
- name="Hands_Salute_R"
+ wearable="jacket"
+ edit_group="driven"
+ edit_group_order="3.5"
+ name="Jacket Collar Back bump"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ multiply_blend="true"
+ tga_file="shirt_collar_back_alpha.tga"
+ domain="0.05" />
</param>
<param
- id="791"
+ id="1025"
group="1"
- name="Hands_Peace_R"
+ wearable="jacket"
+ edit_group="driven"
+ name="jacket bottom length upper bump"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ multiply_blend="true"
+ tga_file="jacket_length_upper_alpha.tga"
+ domain="0.01" />
</param>
<param
- id="792"
+ id="1026"
group="1"
- name="Hands_Spread_R"
+ wearable="jacket"
+ edit_group="driven"
+ name="jacket open upper bump"
value_min="0"
value_max="1">
- <param_morph />
+ <param_alpha
+ multiply_blend="true"
+ tga_file="jacket_open_upper_alpha.tga"
+ domain="0.01" />
</param>
+ </layer>
-<!--
- #end morph targets
- -->
- </mesh>
-
- <mesh
- type="upperBodyMesh"
- lod="1"
- file_name="avatar_upper_body_1.llm"
- min_pixel_width="160"
- reference="avatar_upper_body.llm">
- </mesh>
-
- <mesh
- type="upperBodyMesh"
- lod="2"
- file_name="avatar_upper_body_2.llm"
- min_pixel_width="80"
- reference="avatar_upper_body.llm">
- </mesh>
-
- <mesh
- type="upperBodyMesh"
- lod="3"
- file_name="avatar_upper_body_3.llm"
- min_pixel_width="40"
- reference="avatar_upper_body.llm">
- </mesh>
-
- <mesh
- type="upperBodyMesh"
- lod="4"
- file_name="avatar_upper_body_4.llm"
- min_pixel_width="0"
- reference="avatar_upper_body.llm">
- </mesh>
-
-<!--
- #upperBodyMesh2 =
- #upperBodyMesh3 =
- -->
- <mesh
- type="lowerBodyMesh"
- lod="0"
- file_name="avatar_lower_body.llm"
- min_pixel_width="320">
-<!--
- #begin morph targets
- #############
- # tweakable morphs
- #############
- -->
- <param
- id="156"
- group="1"
- name="Big_Belly_Legs"
- value_min="0"
- value_max="1">
- <param_morph />
- </param>
+ <layer
+ name="upper_jacket">
+ <texture
+ local_texture="upper_jacket" />
<param
- id="151"
+ id="831"
group="1"
- name="Big_Butt_Legs"
- label="Butt Size"
- wearable="shape"
- edit_group="shape_legs"
- label_min="Regular"
- label_max="Large"
+ edit_group="colorpicker_driven"
+ wearable="jacket"
+ name="upper_jacket_red"
value_min="0"
- value_max="1">
- <param_morph>
- <volume_morph
- name="PELVIS"
- scale="0.03 0.0 0.02"
- pos="-0.03 0 -0.025"/>
- </param_morph>
- </param>
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
- <param
- id="794"
- group="1"
- name="Small_Butt"
- label="Butt Size"
- wearable="shape"
- edit_group="shape_legs"
- label_min="Regular"
- label_max="Small"
- value_min="0"
- value_max="1">
- <param_morph>
- <volume_morph
- name="PELVIS"
- scale="-0.01 0.0 0.0"
- pos="0.01 0 0.0"/>
- </param_morph>
+ <value
+ color="255, 0, 0, 255" />
+ </param_color>
</param>
<param
- id="152"
- group="1"
- name="Muscular_Legs"
- label="Leg Muscles"
- show_simple="true"
- wearable="shape"
- edit_group="shape_legs"
- label_min="Regular Muscles"
- label_max="More Muscles"
- value_min="0"
- value_max="1.5"
- camera_distance="1.3"
- camera_elevation="-.5">
- <param_morph>
- <volume_morph
- name="L_UPPER_LEG"
- scale="0.015 0.015 0.0"
- pos="0.0 0 0.0"/>
- <volume_morph
- name="L_LOWER_LEG"
- scale="0.01 0.01 0.0"
- pos="0.0 0 0.0"/>
- <volume_morph
- name="R_UPPER_LEG"
- scale="0.015 0.015 0.0"
- pos="0.0 0 0.0"/>
- <volume_morph
- name="R_LOWER_LEG"
- scale="0.01 0.01 0.0"
- pos="0.0 0 0.0"/>
- </param_morph>
- </param>
-
- <param
- id="651"
- group="1"
- name="Scrawny_Legs"
- label="Scrawny Leg"
- wearable="shape"
- edit_group="shape_legs"
- label_min="Regular Muscles"
- label_max="Less Muscles"
- value_min="0"
- value_max="1.5"
- camera_distance="1.3"
- camera_elevation="-.5">
- <param_morph>
- <volume_morph
- name="L_UPPER_LEG"
- scale="-0.03 -0.03 0.0"
- pos="0.0 0 0.0"/>
- <volume_morph
- name="L_LOWER_LEG"
- scale="-0.015 -0.015 0.0"
- pos="0.0 0 0.0"/>
- <volume_morph
- name="R_UPPER_LEG"
- scale="-0.03 -0.03 0.0"
- pos="0.0 0 0.0"/>
- <volume_morph
- name="R_LOWER_LEG"
- scale="-0.015 -0.015 0.0"
- pos="0.0 0 0.0"/>
- </param_morph>
- </param>
-
- <param
- id="853"
- group="1"
- name="Bowed_Legs"
- label="Knee Angle"
- wearable="shape"
- value_min="-1"
- value_max="1">
- <param_morph>
- <volume_morph
- name="L_UPPER_LEG"
- pos="0.0 0.03 0.0"/>
- <volume_morph
- name="L_LOWER_LEG"
- pos="0.0 0.03 0.0"/>
- <volume_morph
- name="R_UPPER_LEG"
- pos="0.0 -0.03 0.0"/>
- <volume_morph
- name="R_LOWER_LEG"
- pos="0.0 -0.03 0.0"/>
- </param_morph>
- </param>
-
- <param
- id="500"
+ id="832"
group="1"
- name="Shoe_Heel_Height"
- label="Heel Height"
- wearable="shoes"
- edit_group="shoes"
- label_min="Low Heels"
- label_max="High Heels"
+ edit_group="colorpicker_driven"
+ wearable="jacket"
+ name="upper_jacket_green"
value_min="0"
value_max="1"
- camera_distance="1.5"
- camera_elevation="-.5">
- <param_morph />
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="0, 255, 0, 255" />
+ </param_color>
</param>
<param
- id="501"
+ id="833"
group="1"
- name="Shoe_Platform_Height"
- label="Platform Height"
- wearable="shoes"
- edit_group="shoes"
- label_min="Low Platforms"
- label_max="High Platforms"
+ edit_group="colorpicker_driven"
+ wearable="jacket"
+ name="upper_jacket_blue"
value_min="0"
value_max="1"
- camera_distance="1.5"
- camera_elevation="-.5">
- <param_morph />
- </param>
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
- <param
- id="508"
- group="0"
- name="Shoe_Platform_Width"
- label="Platform Width"
- wearable="shoes"
- edit_group="shoes"
- edit_group_order="7"
- label_min="Narrow"
- label_max="Wide"
- value_min="-1"
- value_max="2"
- camera_angle="15"
- camera_distance="1.5"
- camera_elevation="-1">
- <param_morph />
+ <value
+ color="0, 0, 255, 255" />
+ </param_color>
</param>
<param
- id="509"
+ id="1020"
group="1"
- name="Shoe_Heel_Point"
- label="Heel Shape"
- wearable="shoes"
- edit_group="shoes"
- label_min="Default Heels"
- label_max="Pointy Heels"
- value_min="0"
- value_max="1"
- camera_distance="1.3"
- camera_elevation="-.5">
- <param_morph />
+ edit_group="driven"
+ wearable="jacket"
+ name="jacket Sleeve Length" value_min="0"
+ value_max="1">
+ <param_alpha
+ multiply_blend="false"
+ tga_file="shirt_sleeve_alpha.tga"
+ domain="0.01" />
</param>
<param
- id="510"
+ id="1022"
group="1"
- name="Shoe_Heel_Thick"
- label="Heel Shape"
- wearable="shoes"
- edit_group="shoes"
- label_min="default Heels"
- label_max="Thick Heels"
+ wearable="jacket"
+ edit_group="driven"
+ name="jacket Collar Front"
value_min="0"
- value_max="1"
- camera_distance="1.3"
- camera_elevation="-.5">
- <param_morph />
+ value_max="1">
+ <param_alpha
+ multiply_blend="true"
+ tga_file="shirt_collar_alpha.tga"
+ domain="0.05" />
</param>
<param
- id="511"
+ id="1024"
group="1"
- name="Shoe_Toe_Point"
- label="Toe Shape"
- wearable="shoes"
- edit_group="shoes"
- label_min="Default Toe"
- label_max="Pointy Toe"
+ wearable="jacket"
+ edit_group="driven"
+ edit_group_order="3.5"
+ name="jacket Collar Back"
value_min="0"
- value_max="1"
- camera_distance="1.3"
- camera_elevation="-.5">
- <param_morph />
+ value_max="1">
+ <param_alpha
+ multiply_blend="true"
+ tga_file="shirt_collar_back_alpha.tga"
+ domain="0.05" />
</param>
<param
- id="512"
+ id="620"
group="1"
- name="Shoe_Toe_Square"
- label="Toe Shape"
- wearable="shoes"
- edit_group="shoes"
- label_min="Default Toe"
- label_max="Square Toe"
+ wearable="jacket"
+ edit_group="jacket"
+ name="bottom length upper"
+ label_min="hi cut"
+ label_max="low cut"
value_min="0"
value_max="1"
- camera_distance="1.5"
- camera_elevation="-.5">
- <param_morph />
- </param>
-
- <param
- id="654"
- group="0"
- name="Shoe_Toe_Thick"
- label="Toe Thickness"
- wearable="shoes"
- edit_group="shoes"
- edit_group_order="5"
- label_min="Flat Toe"
- label_max="Thick Toe"
- value_min="0"
- value_max="2"
- camera_angle="15"
- camera_distance="1.5"
- camera_elevation="-1">
- <param_morph />
+ value_default=".8"
+ camera_distance="1.2"
+ camera_angle="30"
+ camera_elevation=".2">
+ <param_alpha
+ multiply_blend="true"
+ tga_file="jacket_length_upper_alpha.tga"
+ domain="0.01" />
</param>
<param
- id="515"
- group="0"
- name="Foot_Size"
- label="Foot Size"
- wearable="shape"
- edit_group="shape_legs"
- edit_group_order="6"
- label_min="Small"
- label_max="Big"
- value_min="-1"
- value_max="3"
- camera_angle="45"
- camera_distance="1.1"
- camera_elevation="-1">
- <param_morph>
- <volume_morph
- name="L_FOOT"
- scale="0.02 0.01 0.0"
- pos="0.01 0 0"/>
- <volume_morph
- name="R_FOOT"
- scale="0.02 0.01 0.0"
- pos="0.01 0 0"/>
- </param_morph>
- </param>
-
- <param
- id="516"
+ id="622"
group="1"
- name="Displace_Loose_Lowerbody"
- label="Pants Fit"
- wearable="pants"
- edit_group="driven"
- clothing_morph="true"
+ wearable="jacket"
+ edit_group="jacket"
+ name="open upper"
+ label_min="closed"
+ label_max="open"
value_min="0"
value_max="1"
- value_default="0">
- <param_morph />
- </param>
-
- <param
- id="625"
- group="0"
- name="Leg_Pantflair"
- label="Cuff Flare"
- show_simple="true"
- wearable="pants"
- edit_group="pants"
- edit_group_order="3"
- clothing_morph="true"
- label_min="Tight Cuffs"
- label_max="Flared Cuffs"
- value_min="0"
- value_max="1.5"
- camera_distance="1.8"
+ value_default=".8"
+ camera_distance="1.2"
camera_angle="30"
- camera_elevation="-.3">
- <param_morph />
+ camera_elevation=".2">
+ <param_alpha
+ multiply_blend="true"
+ tga_file="jacket_open_upper_alpha.tga"
+ domain="0.01" />
</param>
+ </layer>
+
+ <layer
+ name="upper alpha"
+ visibility_mask="TRUE">
+ <texture
+ local_texture="upper_alpha" />
+ </layer>
+
+ </layer_set>
+
+ <!-- =========================================================== -->
+ <layer_set
+ body_region="lower_body"
+ width="512"
+ height="512">
+ <layer
+ name="lower body bump base"
+ fixed_color = "128,128,128,255"
+ render_pass="bump">
+ </layer>
+ <layer
+ name="base_lowerbody bump"
+ render_pass="bump">
+ <texture
+ tga_file="bump_lowerbody_base.tga"
+ file_is_mask="FALSE" />
<param
- id="793"
+ id="878"
group="1"
- name="Leg_Longcuffs"
- label="Longcuffs"
- wearable="pants"
+ wearable="skin"
edit_group="driven"
- clothing_morph="true"
+ edit_group_order="20"
+ name="Bump upperdef"
value_min="0"
- value_max="3"
- value_default="0">
- <param_morph />
+ value_max="1">
+ <param_alpha
+ domain="0" />
</param>
+ </layer>
- <param
- id="638"
- group="0"
- name="Low_Crotch"
- label="Pants Crotch"
- wearable="pants"
- clothing_morph="true"
- edit_group="pants"
- edit_group_order="4"
- label_min="High and Tight"
- label_max="Low and Loose"
- value_min="0"
- value_max="1.3"
- camera_distance="1.2"
- camera_angle="-20"
- camera_elevation="-.3">
- <param_morph />
- </param>
+ <layer
+ name="base"
+ global_color="skin_color">
+ <texture
+ tga_file="body_skingrain.tga" />
+ </layer>
+
+ <layer
+ name="shadow">
+ <texture
+ tga_file="lowerbody_shading_alpha.tga"
+ file_is_mask="TRUE" />
<param
- id="635"
+ id="160"
group="1"
- name="Fat_Legs"
- label="Fat Torso"
- wearable="shape"
- edit_group="shape_body"
- label_min="skinny"
- label_max="fat"
+ name="Shading"
+ wearable="pants"
+ cross_wearable="true"
value_min="0"
value_max="1">
- <param_morph>
- <volume_morph
- name="PELVIS"
- scale="0.03 0.06 0.0"/>
- <volume_morph
- name="R_UPPER_LEG"
- scale="0.02 0.02 0.0"
- pos="0.0 -0.02 0.0"/>
- <volume_morph
- name="R_LOWER_LEG"
- scale="0.01 0.01 0.0"/>
- <volume_morph
- name="L_UPPER_LEG"
- scale="0.02 0.02 0.0"
- pos="0.0 0.02 0.0"/>
- <volume_morph
- name="L_LOWER_LEG"
- scale="0.01 0.01 0.0"/>
- </param_morph>
- </param>
-
- <param
- id="854"
- group="1"
- name="Saddlebags"
- value_min="-.5"
- value_max="3">
- <param_morph>
- <volume_morph
- name="PELVIS"
- scale="0.0 0.025 0.0"/>
- </param_morph>
+ <param_color>
+ <value
+ color="0, 0, 0, 0" />
+ <value
+ color="0, 0, 0, 128" />
+ </param_color>
</param>
+ </layer>
- <param
- id="879"
- group="0"
- sex="male"
- name="Male_Package"
- label="Package"
- wearable="shape"
- edit_group="shape_legs"
- edit_group_order="4.6"
- label_min="Coin Purse"
- label_max="Duffle Bag"
- value_default="0"
- value_min="-.5"
- value_max="2"
- camera_angle="60"
- camera_distance=".6">
- <param_morph />
- </param>
+ <layer
+ name="highlight">
+ <texture
+ tga_file="lowerbody_highlights_alpha.tga"
+ file_is_mask="TRUE" />
-<!--
- #############
- # other morphs (not user controlled)
- #############
- -->
<param
- id="153"
+ id="161"
group="1"
- name="Male_Legs"
+ name="Shading"
+ wearable="skin"
value_min="0"
value_max="1">
- <param_morph />
- </param>
-
-<!--
- #end morph targets
- -->
- </mesh>
-
- <mesh
- type="lowerBodyMesh"
- lod="1"
- file_name="avatar_lower_body_1.llm"
- min_pixel_width="160"
- reference="avatar_lower_body.llm">
- </mesh>
-
- <mesh
- type="lowerBodyMesh"
- lod="2"
- file_name="avatar_lower_body_2.llm"
- min_pixel_width="80"
- reference="avatar_lower_body.llm">
- </mesh>
-
- <mesh
- type="lowerBodyMesh"
- lod="3"
- file_name="avatar_lower_body_3.llm"
- min_pixel_width="40"
- reference="avatar_lower_body.llm">
- </mesh>
-
- <mesh
- type="lowerBodyMesh"
- lod="4"
- file_name="avatar_lower_body_4.llm"
- min_pixel_width="0"
- reference="avatar_lower_body.llm">
- </mesh>
-
-<!--
- #lowerBodyMesh2 =
- #lowerBodyMesh3 =
- -->
-<!--
- #eyeLidLeftMesh =
- -->
- <mesh
- type="eyeBallLeftMesh"
- lod="0"
- file_name="avatar_eye.llm"
- min_pixel_width="320">
-<!-- begin morph_params -->
- <param
- id="679"
- group="1"
- name="Eyeball_Size"
- label="Eyeball Size"
- wearable="shape"
- edit_group="shape_eyes"
- label_min="small eye"
- label_max="big eye"
- value_min="-.25"
- value_max=".10">
- <param_morph />
- </param>
+ <param_color>
+ <value
+ color="255, 255, 255, 0" />
- <param
- id="687"
- group="1"
- name="Eyeball_Size"
- label="Big Eyeball"
- wearable="shape"
- edit_group="shape_eyes"
- label_min="small eye"
- label_max="big eye"
- value_min="-.25"
- value_max=".25">
- <param_morph />
- </param>
- </mesh>
-
- <mesh
- type="eyeBallLeftMesh"
- lod="1"
- file_name="avatar_eye_1.llm"
- min_pixel_width="80">
-<!-- begin morph_params -->
- <param
- id="694"
- group="1"
- name="Eyeball_Size"
- label="Eyeball Size"
- wearable="shape"
- edit_group="shape_eyes"
- label_min="small eye"
- label_max="big eye"
- value_min="-.25"
- value_max=".10">
- <param_morph />
- </param>
-
- <param
- id="695"
- group="1"
- name="Eyeball_Size"
- label="Big Eyeball"
- wearable="shape"
- edit_group="shape_eyes"
- label_min="small eye"
- label_max="big eye"
- value_min="-.25"
- value_max=".25">
- <param_morph />
- </param>
- </mesh>
-
-<!--
- #eyeLidRightMesh =
- -->
- <mesh
- type="eyeBallRightMesh"
- lod="0"
- file_name="avatar_eye.llm"
- min_pixel_width="320">
-<!-- begin morph_params -->
- <param
- id="680"
- group="1"
- name="Eyeball_Size"
- label="Eyeball Size"
- wearable="shape"
- label_min="small eye"
- label_max="big eye"
- value_min="-.25"
- value_max=".10">
- <param_morph />
+ <value
+ color="255, 255, 255, 64" />
+ </param_color>
</param>
+ </layer>
- <param
- id="688"
- group="1"
- name="Eyeball_Size"
- label="Big Eyeball"
- wearable="shape"
- label_min="small eye"
- label_max="big eye"
- value_min="-.25"
- value_max=".25">
- <param_morph />
- </param>
- </mesh>
-
- <mesh
- type="eyeBallRightMesh"
- lod="1"
- file_name="avatar_eye_1.llm"
- min_pixel_width="80">
-<!-- begin morph_params -->
- <param
- id="681"
- group="1"
- name="Eyeball_Size"
- label="Eyeball Size"
- wearable="shape"
- edit_group="shape_eyes"
- label_min="small eye"
- label_max="big eye"
- value_min="-.25"
- value_max=".10">
- <param_morph />
- </param>
+ <layer
+ name="toenails">
+ <texture
+ tga_file="lowerbody_color.tga" />
+ </layer>
- <param
- id="691"
- group="1"
- name="Eyeball_Size"
- label="Big Eyeball"
- wearable="shape"
- edit_group="shape_eyes"
- label_min="small eye"
- label_max="big eye"
- value_min="-.25"
- value_max=".25">
- <param_morph />
- </param>
- </mesh>
+ <layer
+ name="lower_bodypaint">
+ <texture
+ local_texture="lower_bodypaint" />
+ </layer>
- <mesh
- type="skirtMesh"
- lod="0"
- file_name="avatar_skirt.llm"
- min_pixel_width="320">
+ <layer
+ name="freckles lower"
+ fixed_color="120,47,20,128">
<param
- id="845"
+ id="777"
group="1"
- name="skirt_poofy"
- label="poofy skirt"
- clothing_morph="true"
- wearable="skirt"
- edit_group="skirt"
- label_min="less poofy"
- label_max="more poofy"
+ name="freckles lower"
+ wearable="skin"
value_min="0"
- value_max="1.5">
- <param_morph />
+ value_max="1">
+ <param_alpha
+ tga_file="bodyfreckles_alpha.tga"
+ skip_if_zero="true"
+ domain="0.6" />
</param>
+ </layer>
+
+ <layer
+ name="lower_tattoo">
+ <texture
+ local_texture="lower_tattoo" />
+ </layer>
+
+ <layer
+ name="lower_underpants bump"
+ render_pass="bump"
+ fixed_color="128,128,128,255">
+ <texture
+ local_texture="lower_underpants"
+ local_texture_alpha_only="true" />
<param
- id="846"
+ id="1055"
group="1"
- name="skirt_loose"
- label="loose skirt"
- clothing_morph="true"
- wearable="skirt"
- edit_group="skirt"
- label_min="form fitting"
- label_max="loose"
+ wearable="underpants"
+ edit_group="underpants"
+ name="Pants Length"
value_min="0"
- value_max="1">
- <param_morph />
+ value_max="1"
+ value_default=".3">
+ <param_alpha
+ tga_file="pants_length_alpha.tga"
+ domain="0.01" />
</param>
<param
- id="866"
+ id="1057"
group="1"
- name="skirt_tight"
- label="tight skirt"
- clothing_morph="true"
- wearable="skirt"
- edit_group="skirt"
- label_min="form fitting"
- label_max="loose"
+ wearable="underpants"
+ edit_group="underpants"
+ name="Pants Waist"
value_min="0"
- value_max="1">
- <param_morph />
+ value_max="1"
+ value_default=".8">
+ <param_alpha
+ tga_file="pants_waist_alpha.tga"
+ domain="0.05" />
</param>
+ </layer>
+
+ <layer
+ name="lower_underpants">
+ <texture
+ local_texture="lower_underpants" />
<param
- id="867"
- group="1"
- name="skirt_smallbutt"
- label="tight skirt"
- clothing_morph="false"
- wearable="skirt"
- edit_group="skirt"
- label_min="form fitting"
- label_max="loose"
+ id="824"
+ group="0"
+ wearable="underpants"
+ edit_group="colorpicker"
+ name="underpants_red"
value_min="0"
- value_max="1">
- <param_morph />
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="255, 0, 0, 255" />
+ </param_color>
</param>
<param
- id="848"
+ id="825"
group="0"
- name="skirt_bustle"
- label="bustle skirt"
- clothing_morph="true"
- wearable="skirt"
- edit_group_order="3"
- edit_group="skirt"
- label_min="no bustle"
- label_max="more bustle"
+ wearable="underpants"
+ edit_group="colorpicker"
+ name="underpants_green"
value_min="0"
- value_max="2"
- value_default=".2"
- camera_angle="100"
- camera_distance="1.3"
- camera_elevation="-.5">
- <param_morph />
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="0, 255, 0, 255" />
+ </param_color>
</param>
<param
- id="847"
- group="1"
- name="skirt_bowlegs"
- label="legs skirt"
- wearable="skirt"
- value_min="-1"
+ id="826"
+ group="0"
+ wearable="underpants"
+ edit_group="colorpicker"
+ name="underpants_blue"
+ value_min="0"
value_max="1"
- value_default="0">
- <param_morph />
- </param>
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
- <param
- id="852"
- group="1"
- name="skirt_bigbutt"
- label="bigbutt skirt"
- label_min="less"
- label_max="more"
- value_min="0"
- value_max="1">
- <param_morph />
+ <value
+ color="0, 0, 255, 255" />
+ </param_color>
</param>
<param
- id="849"
+ id="1054"
group="1"
- name="skirt_belly"
- label="big belly skirt"
+ wearable="underpants"
+ edit_group="driven"
+ name="Pants Length"
value_min="0"
- value_max="1">
- <param_morph />
+ value_max="1"
+ value_default=".3"
+ camera_distance="1.2"
+ camera_angle="30"
+ camera_elevation="-.3">
+ <param_alpha
+ tga_file="pants_length_alpha.tga"
+ domain="0.01" />
</param>
<param
- id="850"
+ id="1056"
group="1"
- name="skirt_saddlebags"
- value_min="-.5"
- value_max="3">
- <param_morph />
+ wearable="underpants"
+ edit_group="driven"
+ name="Pants Waist"
+ value_min="0"
+ value_max="1"
+ value_default=".8">
+ <param_alpha
+ tga_file="pants_waist_alpha.tga"
+ domain="0.05" />
</param>
+ </layer>
+
+ <layer
+ name="lower_socks bump"
+ render_pass="bump"
+ fixed_color="128,128,128,255">
+ <texture
+ local_texture="lower_socks"
+ local_texture_alpha_only="true" />
<param
- id="851"
+ id="1051"
group="1"
- name="skirt_chubby"
- label_min="less"
- label_max="more"
+ wearable="socks"
+ edit_group="driven"
+ name="Socks Length bump"
value_min="0"
value_max="1"
- value_default="0">
- <param_morph />
+ value_default="0.35">
+ <param_alpha
+ tga_file="shoe_height_alpha.tga"
+ domain="0.01" />
</param>
+ </layer>
- <param
- id="856"
- group="1"
- name="skirt_lovehandles"
- label_min="less"
- label_max="more"
- value_min="-1"
- value_max="2"
- value_default="0">
- <param_morph />
- </param>
+ <layer
+ name="lower_socks">
+ <texture
+ local_texture="lower_socks" />
-<!--
- #############
- # other morphs (not user controlled)
- #############
- -->
<param
- id="857"
- group="1"
- name="skirt_male"
- value_min="0"
- value_max="1">
- <param_morph />
- </param>
- </mesh>
-
- <mesh
- type="skirtMesh"
- lod="1"
- file_name="avatar_skirt_1.llm"
- min_pixel_width="160"
- reference="avatar_skirt.llm">
- </mesh>
-
- <mesh
- type="skirtMesh"
- lod="2"
- file_name="avatar_skirt_2.llm"
- min_pixel_width="80"
- reference="avatar_skirt.llm">
- </mesh>
-
- <mesh
- type="skirtMesh"
- lod="3"
- file_name="avatar_skirt_3.llm"
- min_pixel_width="40"
- reference="avatar_skirt.llm">
- </mesh>
-
- <mesh
- type="skirtMesh"
- lod="4"
- file_name="avatar_skirt_4.llm"
- min_pixel_width="0"
- reference="avatar_skirt.llm">
- </mesh>
-
-<!-- =========================================================== -->
- <global_color
- name="skin_color">
- <param
- id="111"
+ id="818"
group="0"
- wearable="skin"
- edit_group="skin_color"
- edit_group_order="1"
- name="Pigment"
- show_simple="true"
- label_min="Light"
- label_max="Dark"
+ wearable="socks"
+ edit_group="colorpicker"
+ name="socks_red"
value_min="0"
value_max="1"
- value_default=".5">
- <param_color>
- <value
- color="252, 215, 200, 255" />
-
- <value
- color="240, 177, 112, 255" />
-
- <value
- color="90, 40, 16, 255" />
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
- <value
- color="29, 9, 6, 255" />
- </param_color>
+ <value
+ color="255, 0, 0, 255" />
+ </param_color>
</param>
<param
- id="110"
+ id="819"
group="0"
- wearable="skin"
- edit_group="skin_color"
- edit_group_order="2"
- name="Red Skin"
- label="Ruddiness"
- label_min="Pale"
- label_max="Ruddy"
+ wearable="socks"
+ edit_group="colorpicker"
+ name="socks_green"
value_min="0"
- value_max="0.1">
- <param_color
- operation="blend">
- <value
- color="218, 41, 37, 255" />
- </param_color>
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="0, 255, 0, 255" />
+ </param_color>
</param>
<param
- id="108"
+ id="820"
group="0"
- wearable="skin"
- edit_group="skin_color"
- edit_group_order="3"
- name="Rainbow Color"
- show_simple="true"
- label_min="None"
- label_max="Wild"
+ wearable="socks"
+ edit_group="colorpicker"
+ name="socks_blue"
value_min="0"
value_max="1"
- camera_elevation=".1"
- camera_distance=".5">
- <param_color>
- <value
- color=" 0, 0, 0, 255" />
-
- <value
- color="255, 0, 255, 255" />
-
- <value
- color="255, 0, 0, 255" />
-
- <value
- color="255, 255, 0, 255" />
-
- <value
- color=" 0, 255, 0, 255" />
-
- <value
- color=" 0, 255, 255, 255" />
-
- <value
- color=" 0, 0, 255, 255" />
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
- <value
- color="255, 0, 255, 255" />
- </param_color>
+ <value
+ color="0, 0, 255, 255" />
+ </param_color>
</param>
- </global_color>
-<!-- =========================================================== -->
- <global_color
- name="hair_color">
<param
- id="114"
- group="0"
- wearable="hair"
- edit_group="hair_color"
- edit_group_order="3"
- name="Blonde Hair"
- show_simple="true"
- label_min="Black"
- label_max="Blonde"
+ id="1050"
+ group="1"
+ wearable="socks"
+ edit_group="driven"
+ name="Socks Length bump"
value_min="0"
value_max="1"
- value_default=".5"
- camera_elevation=".1"
- camera_distance=".5">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="22, 6, 6, 255" />
-
- <value
- color="29, 9, 6, 255" />
-
- <value
- color="45, 21, 11, 255" />
-
- <value
- color="78, 39, 11, 255" />
-
- <value
- color="90, 53, 16, 255" />
-
- <value
- color="136, 92, 21, 255" />
-
- <value
- color="150, 106, 33, 255" />
-
- <value
- color="198, 156, 74, 255" />
-
- <value
- color="233, 192, 103, 255" />
-
- <value
- color="238, 205, 136, 255" />
- </param_color>
+ value_default="0.35">
+ <param_alpha
+ tga_file="shoe_height_alpha.tga"
+ domain="0.01" />
</param>
+ </layer>
+
+ <layer
+ name="lower_shoes bump"
+ render_pass="bump"
+ fixed_color="128,128,128,255">
+ <texture
+ local_texture="lower_shoes"
+ local_texture_alpha_only="true" />
<param
- id="113"
- group="0"
- wearable="hair"
- edit_group="hair_color"
- edit_group_order="4"
- name="Red Hair"
- show_simple="true"
- label_min="No Red"
- label_max="Very Red"
+ id="1053"
+ group="1"
+ wearable="shoes"
+ edit_group="driven"
+ name="Shoe Height bump"
value_min="0"
value_max="1"
- camera_elevation=".1"
- camera_distance=".5">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="118, 47, 19, 255" />
- </param_color>
+ value_default="0.1">
+ <param_alpha
+ tga_file="shoe_height_alpha.tga"
+ domain="0.01" />
</param>
+ </layer>
+
+ <layer
+ name="lower_shoes">
+ <texture
+ local_texture="lower_shoes" />
<param
- id="115"
+ id="812"
group="0"
- wearable="hair"
- edit_group="hair_color"
- edit_group_order="1"
- name="White Hair"
- show_simple="true"
- label_min="No White"
- label_max="All White"
+ wearable="shoes"
+ edit_group="colorpicker"
+ name="shoes_red"
value_min="0"
value_max="1"
- camera_elevation=".1"
- camera_distance=".5">
- <param_color>
- <value
- color="0, 0, 0, 255" />
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
- <value
- color="255, 255, 255, 255" />
- </param_color>
+ <value
+ color="255, 0, 0, 255" />
+ </param_color>
</param>
<param
- id="112"
+ id="813"
group="0"
- wearable="hair"
- edit_group="hair_color"
- edit_group_order="2"
- name="Rainbow Color"
- show_simple="true"
- label_min="None"
- label_max="Wild"
+ wearable="shoes"
+ edit_group="colorpicker"
+ name="shoes_green"
value_min="0"
value_max="1"
- camera_elevation=".1"
- camera_distance=".5">
- <param_color>
- <value
- color=" 0, 0, 0, 255" />
-
- <value
- color="255, 0, 255, 255" />
-
- <value
- color="255, 0, 0, 255" />
-
- <value
- color="255, 255, 0, 255" />
-
- <value
- color=" 0, 255, 0, 255" />
-
- <value
- color=" 0, 255, 255, 255" />
-
- <value
- color=" 0, 0, 255, 255" />
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
- <value
- color="255, 0, 255, 255" />
- </param_color>
+ <value
+ color="0, 255, 0, 255" />
+ </param_color>
</param>
- </global_color>
-<!-- =========================================================== -->
- <global_color
- name="eye_color">
<param
- id="99"
+ id="817"
group="0"
- wearable="eyes"
- edit_group="eyes"
- edit_group_order="1"
- name="Eye Color"
- show_simple="true"
- label_min="Natural"
- label_max="Unnatural"
+ wearable="shoes"
+ edit_group="colorpicker"
+ name="shoes_blue"
value_min="0"
value_max="1"
- value_default="0"
- camera_elevation=".1"
- camera_distance=".3">
-<!-- default to natural brown eyes-->
- <param_color>
- <value
- color="50, 25, 5, 255" />
-
-<!-- natural dark brown eyes-->
- <value
- color="109, 55, 15, 255" />
-
-<!-- natural brown eyes-->
- <value
- color="150, 93, 49, 255" />
-
-<!-- natural light brown eyes-->
- <value
- color="152, 118, 25, 255" />
-
-<!--natural hazel eyes-->
- <value
- color="95, 179, 107, 255" />
-
-<!--natural green eyes-->
- <value
- color="87, 192, 191, 255" />
-
-<!--natural aqua eyes-->
- <value
- color="95, 172, 179, 255" />
-
-<!--natural blue eyes-->
- <value
- color="128, 128, 128, 255" />
-
-<!--natural grey eyes-->
- <value
- color="0, 0, 0, 255" />
-
-<!--black eyes-->
- <value
- color="255, 255, 0, 255" />
-
-<!--bright yellow eyes-->
- <value
- color=" 0, 255, 0, 255" />
-
-<!-- bright green eyes-->
- <value
- color=" 0, 255, 255, 255" />
-
-<!-- bright cyan eyes-->
- <value
- color=" 0, 0, 255, 255" />
-
-<!--bright blue eyes-->
- <value
- color="255, 0, 255, 255" />
-
-<!-- bright violet eyes-->
- <value
- color="255, 0, 0, 255" />
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
-<!--bright red eyes-->
- </param_color>
+ <value
+ color="0, 0, 255, 255" />
+ </param_color>
</param>
<param
- id="98"
- group="0"
- wearable="eyes"
- edit_group="eyes"
- edit_group_order="2"
- name="Eye Lightness"
- show_simple="true"
- label_min="Darker"
- label_max="Lighter"
+ id="1052"
+ group="1"
+ wearable="shoes"
+ edit_group="driven"
+ name="Shoe Height"
value_min="0"
value_max="1"
- camera_elevation=".1"
- camera_distance=".3">
- <param_color>
- <value
- color="0, 0, 0, 0" />
-
- <value
- color="255, 255, 255, 255" />
- </param_color>
+ value_default="0.1">
+ <param_alpha
+ tga_file="shoe_height_alpha.tga"
+ domain="0.01" />
</param>
- </global_color>
-
-<!-- =========================================================== -->
- <layer_set
- body_region="hair"
- width="512"
- height="512"
- clear_alpha="false">
- <layer
- name="base"
- global_color="hair_color"
- write_all_channels="true">
- <texture
- local_texture="hair_grain" />
</layer>
<layer
- name="hair alpha"
- visibility_mask="TRUE">
+ name="lower_clothes_shadow">
<texture
- local_texture="hair_alpha" />
- </layer>
+ local_texture="lower_pants" />
- </layer_set>
- <!-- =========================================================== -->
-
- <layer_set
- body_region="head"
- width="512"
- height="512"
- clear_alpha="false"
- alpha_tga_file="head_alpha.tga">
- <layer
- name="head bump base"
- fixed_color = "128,128,128,255"
- render_pass="bump">
- </layer>
-
- <layer
- name="head bump definition"
- render_pass="bump">
-
- <texture
- tga_file="bump_head_base.tga"
- file_is_mask="FALSE"/>
-
- <param
- id="873"
- group="1"
- wearable="skin"
- edit_group="driven"
- edit_group_order="12"
- name="Bump base"
- value_min="0"
- value_max="1">
- <param_alpha
- domain="0" />
- </param>
- </layer>
-
- <layer
- name="base"
- global_color="skin_color">
- <texture
- tga_file="head_skingrain.tga" />
- </layer>
-
- <layer
- name="headcolor">
- <texture
- tga_file="head_color.tga" />
- </layer>
-
- <layer
- name="shadow">
- <texture
- tga_file="head_shading_alpha.tga"
- file_is_mask="TRUE" />
-
- <param
- id="158"
- group="1"
- wearable="skin"
- name="Shading"
- value_min="0"
- value_max="1">
- <param_color>
- <value
- color="0, 0, 0, 0" />
-
- <value
- color="0, 0, 0, 128" />
- </param_color>
- </param>
- </layer>
-
- <layer
- name="highlight">
- <texture
- tga_file="head_highlights_alpha.tga"
- file_is_mask="TRUE" />
-
-
- <param
- id="159"
- group="1"
- name="Shading"
- wearable="skin"
- value_min="0"
- value_max="1">
- <param_color>
- <value
- color="255, 255, 255, 0" />
-
-
- <value
- color="255, 255, 255, 64" />
- </param_color>
- </param>
- </layer>
- <layer
- name="rosyface">
- <texture
- tga_file="rosyface_alpha.tga"
- file_is_mask="true" />
-
- <param
- id="116"
- group="0"
- wearable="skin"
- edit_group="skin_facedetail"
- edit_group_order="4"
- name="Rosy Complexion"
- label_min="Less Rosy"
- label_max="More Rosy"
- value_min="0"
- value_max="1"
- camera_distance=".3"
- camera_elevation=".07">
- <param_color>
- <value
- color="198, 71, 71, 0" />
-
- <value
- color="198, 71, 71, 255" />
- </param_color>
- </param>
- </layer>
-
- <layer
- name="lips">
- <texture
- tga_file="lips_mask.tga"
- file_is_mask="true" />
-
- <param
- id="117"
- group="0"
- wearable="skin"
- edit_group="skin_facedetail"
- edit_group_order="5"
- name="Lip Pinkness"
- label_min="Darker"
- label_max="Pinker"
- value_min="0"
- value_max="1"
- camera_distance=".25">
- <param_color>
- <value
- color="220, 115, 115, 0" />
-
- <value
- color="220, 115, 115, 128" />
- </param_color>
- </param>
- </layer>
-
- <layer
- name="wrinkles_shading"
- render_pass="bump"
- fixed_color="0,0,0,100">
- <param
- id="118"
- group="1"
- wearable="skin"
- name="Wrinkles"
- value_min="0"
- value_max="1">
- <param_alpha
- tga_file="bump_face_wrinkles.tga"
- skip_if_zero="true"
- domain="0.3" />
- </param>
- </layer>
-
-<!--<layer
- name="wrinkles_highlights"
- fixed_color="255,255,255,64">
- <param
- id="128"
- group="1"
- name="Wrinkles"
- value_min="0"
- value_max="1">
- <param_alpha
- tga_file="head_wrinkles_highlights_alpha.tga"
- skip_if_zero="true"
- domain="0.3" />
- </param>
- </layer>-->
- <layer
- name="freckles"
- fixed_color="120,47,20,128">
- <param
- id="165"
- group="0"
- wearable="skin"
- edit_group="skin_facedetail"
- edit_group_order="2"
- name="Freckles"
- label_min="Less"
- label_max="More"
- value_min="0"
- value_max="1"
- camera_distance=".3"
- camera_elevation=".07">
- <param_alpha
- tga_file="freckles_alpha.tga"
- skip_if_zero="true"
- domain="0.5" />
- </param>
- </layer>
- <layer
- name="eyebrowsbump"
- render_pass="bump">
- <texture
- tga_file="head_hair.tga"
- file_is_mask="false" />
-
- <param
- id="1000"
- group="1"
- wearable="hair"
- edit_group="driven"
- name="Eyebrow Size Bump"
- value_min="0"
- value_max="1">
- <param_alpha
- tga_file="eyebrows_alpha.tga"
- domain="0.1" />
- </param>
-
- <param
- id="1002"
- group="1"
- wearable="hair"
- edit_group="driven"
- name="Eyebrow Density Bump"
- value_min="0"
- value_max="1">
- <param_color>
- <value
- color="255,255,255,0" />
-
- <value
- color="255,255,255,255" />
- </param_color>
- </param>
- </layer>
-
- <layer
- name="eyebrows"
- global_color="hair_color">
- <texture
- tga_file="head_hair.tga"
- file_is_mask="false" />
-
- <param
- id="1001"
- group="1"
- wearable="hair"
- edit_group="hair_eyebrows"
- name="Eyebrow Size"
- show_simple="true"
- value_min="0"
- value_max="1"
- value_default="0.5">
- <param_alpha
- tga_file="eyebrows_alpha.tga"
- domain="0.1" />
- </param>
-
- <param
- id="1003"
- group="1"
- edit_group="driven"
- name="Eyebrow Density"
- value_min="0"
- value_max="1">
- <param_color
- operation="multiply">
- <value
- color="255,255,255,0" />
-
- <value
- color="255,255,255,255" />
- </param_color>
- </param>
- </layer>
-
- <layer
- name="lipstick">
- <param
- id="700"
- group="0"
- wearable="skin"
- edit_group="skin_makeup"
- edit_group_order="2"
- name="Lipstick Color"
- label_min="Pink"
- label_max="Black"
- value_min="0"
- value_max="1"
- value_default=".25"
- camera_distance=".25">
- <param_color>
- <value
- color="245,161,177,200" />
-
- <value
- color="216,37,67,200" />
-
- <value
- color="178,48,76,200" />
-
- <value
- color="68,0,11,200" />
-
- <value
- color="252,207,184,200" />
-
- <value
- color="241,136,106,200" />
-
- <value
- color="208,110,85,200" />
-
- <value
- color="106,28,18,200" />
-
- <value
- color="58,26,49,200" />
-
- <value
- color="14,14,14,200" />
- </param_color>
- </param>
-
- <param
- id="701"
- group="0"
- wearable="skin"
- edit_group="skin_makeup"
- edit_group_order="1"
- name="Lipstick"
- label_min="No Lipstick"
- label_max="More Lipstick"
- value_min="0"
- value_max=".9"
- value_default="0.0"
- camera_distance=".25">
- <param_alpha
- tga_file="lipstick_alpha.tga"
- skip_if_zero="true"
- domain="0.05" />
- </param>
- </layer>
-
- <layer
- name="lipgloss"
- fixed_color="255,255,255,190">
- <param
- id="702"
- name="Lipgloss"
- label_min="No Lipgloss"
- label_max="Glossy"
- wearable="skin"
- edit_group="skin_makeup"
- edit_group_order="3"
- group="0"
- value_min="0"
- value_max="1"
- camera_distance=".25">
- <param_alpha
- tga_file="lipgloss_alpha.tga"
- skip_if_zero="true"
- domain="0.2" />
- </param>
- </layer>
-
- <layer
- name="blush">
- <param
- id="704"
- group="0"
- wearable="skin"
- edit_group="skin_makeup"
- edit_group_order="4"
- name="Blush"
- label_min="No Blush"
- label_max="More Blush"
- value_min="0"
- value_max=".9"
- value_default="0"
- camera_distance=".3"
- camera_elevation=".07"
- camera_angle="20">
- <param_alpha
- tga_file="blush_alpha.tga"
- skip_if_zero="true"
- domain="0.3" />
- </param>
-
- <param
- id="705"
- group="0"
- wearable="skin"
- edit_group="skin_makeup"
- edit_group_order="5"
- name="Blush Color"
- label_min="Pink"
- label_max="Orange"
- value_min="0"
- value_max="1"
- value_default=".5"
- camera_distance=".3"
- camera_elevation=".07"
- camera_angle="20">
- <param_color>
- <value
- color="253,162,193,200" />
-
- <value
- color="247,131,152,200" />
-
- <value
- color="213,122,140,200" />
-
- <value
- color="253,152,144,200" />
-
- <value
- color="236,138,103,200" />
-
- <value
- color="195,128,122,200" />
-
- <value
- color="148,103,100,200" />
-
- <value
- color="168,95,62,200" />
- </param_color>
- </param>
-
- <param
- id="711"
- group="0"
- wearable="skin"
- edit_group="skin_makeup"
- edit_group_order="6"
- name="Blush Opacity"
- label_min="Clear"
- label_max="Opaque"
- value_min="0"
- value_max="1"
- value_default=".5"
- camera_distance=".3"
- camera_elevation=".07"
- camera_angle="20">
- <param_color
- operation="multiply">
- <value
- color="255,255,255,0" />
-
- <value
- color="255,255,255,255" />
- </param_color>
- </param>
- </layer>
-
- <layer
- name="Outer Eye Shadow">
- <param
- id="708"
- group="0"
- wearable="skin"
- edit_group="skin_makeup"
- edit_group_order="11"
- name="Out Shdw Color"
- label_min="Light"
- label_max="Dark"
- value_min="0"
- value_max="1"
- camera_distance=".3"
- camera_elevation=".14">
- <param_color>
- <value
- color="252,247,246,255" />
-
- <value
- color="255,206,206,255" />
-
- <value
- color="233,135,149,255" />
-
- <value
- color="220,168,192,255" />
-
- <value
- color="228,203,232,255" />
-
- <value
- color="255,234,195,255" />
-
- <value
- color="230,157,101,255" />
-
- <value
- color="255,147,86,255" />
-
- <value
- color="228,110,89,255" />
-
- <value
- color="228,150,120,255" />
-
- <value
- color="223,227,213,255" />
-
- <value
- color="96,116,87,255" />
-
- <value
- color="88,143,107,255" />
-
- <value
- color="194,231,223,255" />
-
- <value
- color="207,227,234,255" />
-
- <value
- color="41,171,212,255" />
-
- <value
- color="180,137,130,255" />
-
- <value
- color="173,125,105,255" />
-
- <value
- color="144,95,98,255" />
-
- <value
- color="115,70,77,255" />
-
- <value
- color="155,78,47,255" />
-
- <value
- color="239,239,239,255" />
-
- <value
- color="194,194,194,255" />
-
- <value
- color="120,120,120,255" />
-
- <value
- color="10,10,10,255" />
- </param_color>
- </param>
-
- <param
- id="706"
- group="0"
- wearable="skin"
- edit_group="skin_makeup"
- edit_group_order="12"
- name="Out Shdw Opacity"
- label_min="Clear"
- label_max="Opaque"
- value_min=".2"
- value_max="1"
- value_default=".6"
- camera_distance=".3"
- camera_elevation=".14">
- <param_color
- operation="multiply">
- <value
- color="255,255,255,0" />
-
- <value
- color="255,255,255,255" />
- </param_color>
- </param>
-
- <param
- id="707"
- group="0"
- wearable="skin"
- edit_group="skin_makeup"
- edit_group_order="10"
- name="Outer Shadow"
- label_min="No Eyeshadow"
- label_max="More Eyeshadow"
- value_min="0"
- value_max=".7"
- camera_distance=".3"
- camera_elevation=".14">
- <param_alpha
- tga_file="eyeshadow_outer_alpha.tga"
- skip_if_zero="true"
- domain="0.05" />
- </param>
- </layer>
-
- <layer
- name="Inner Eye Shadow">
- <param
- id="712"
- group="0"
- wearable="skin"
- edit_group="skin_makeup"
- edit_group_order="8"
- name="In Shdw Color"
- label_min="Light"
- label_max="Dark"
- value_min="0"
- value_max="1"
- camera_distance=".3"
- camera_elevation=".14">
- <param_color>
- <value
- color="252,247,246,255" />
-
- <value
- color="255,206,206,255" />
-
- <value
- color="233,135,149,255" />
-
- <value
- color="220,168,192,255" />
-
- <value
- color="228,203,232,255" />
-
- <value
- color="255,234,195,255" />
-
- <value
- color="230,157,101,255" />
-
- <value
- color="255,147,86,255" />
-
- <value
- color="228,110,89,255" />
-
- <value
- color="228,150,120,255" />
-
- <value
- color="223,227,213,255" />
-
- <value
- color="96,116,87,255" />
-
- <value
- color="88,143,107,255" />
-
- <value
- color="194,231,223,255" />
-
- <value
- color="207,227,234,255" />
-
- <value
- color="41,171,212,255" />
-
- <value
- color="180,137,130,255" />
-
- <value
- color="173,125,105,255" />
-
- <value
- color="144,95,98,255" />
-
- <value
- color="115,70,77,255" />
-
- <value
- color="155,78,47,255" />
-
- <value
- color="239,239,239,255" />
-
- <value
- color="194,194,194,255" />
-
- <value
- color="120,120,120,255" />
-
- <value
- color="10,10,10,255" />
- </param_color>
- </param>
-
- <param
- id="713"
- group="0"
- wearable="skin"
- edit_group="skin_makeup"
- edit_group_order="9"
- name="In Shdw Opacity"
- label_min="Clear"
- label_max="Opaque"
- value_min=".2"
- value_max="1"
- value_default=".7"
- camera_distance=".3"
- camera_elevation=".14">
- <param_color
- operation="multiply">
- <value
- color="255,255,255,0" />
-
- <value
- color="255,255,255,255" />
- </param_color>
- </param>
-
- <param
- id="709"
- group="0"
- wearable="skin"
- edit_group="skin_makeup"
- edit_group_order="7"
- name="Inner Shadow"
- label_min="No Eyeshadow"
- label_max="More Eyeshadow"
- value_min="0"
- value_max="1"
- value_default="0"
- camera_distance=".3"
- camera_elevation=".14">
- <param_alpha
- tga_file="eyeshadow_inner_alpha.tga"
- skip_if_zero="true"
- domain="0.2" />
- </param>
- </layer>
-
- <layer
- name="eyeliner"
- fixed_color="0,0,0,200">
- <param
- id="703"
- group="0"
- wearable="skin"
- edit_group="skin_makeup"
- edit_group_order="13"
- name="Eyeliner"
- label_min="No Eyeliner"
- label_max="Full Eyeliner"
- value_min="0"
- value_max="1"
- value_default="0.0"
- camera_distance=".3"
- camera_elevation=".14">
- <param_alpha
- tga_file="eyeliner_alpha.tga"
- skip_if_zero="true"
- domain="0.1" />
- </param>
-
- <param
- id="714"
- group="0"
- wearable="skin"
- edit_group="skin_makeup"
- edit_group_order="14"
- name="Eyeliner Color"
- label_min="Dark Green"
- label_max="Black"
- value_min="0"
- value_max="1"
- camera_distance=".3"
- camera_elevation=".14">
- <param_color>
- <value
- color="24,98,40,250" />
-
-<!-- dark green -->
- <value
- color="9,100,127,250" />
-
-<!-- lt.aqua blue -->
- <value
- color="61,93,134,250" />
-
-<!-- aqua -->
- <value
- color="70,29,27,250" />
-
-<!-- dark brown -->
- <value
- color="115,75,65,250" />
-
-<!-- lt. brown blue -->
- <value
- color="100,100,100,250" />
-
-<!-- grey -->
- <value
- color="91,80,74,250" />
-
-<!-- grey/brown -->
- <value
- color="112,42,76,250" />
-
-<!-- plum -->
- <value
- color="14,14,14,250" />
-
-<!-- black -->
- </param_color>
- </param>
- </layer>
-
- <layer
- name="facialhair bump"
- render_pass="bump">
- <texture
- tga_file="head_hair.tga"
- file_is_mask="false" />
-
- <param
- id="1004"
- sex="male"
- group="1"
- wearable="hair"
- edit_group="driven"
- name="Sideburns bump"
- value_min="0"
- value_max="1">
- <param_alpha
- tga_file="facehair_sideburns_alpha.tga"
- skip_if_zero="true"
- domain="0.05" />
- </param>
-
- <param
- id="1006"
- sex="male"
- group="1"
- wearable="hair"
- edit_group="driven"
- name="Moustache bump"
- value_min="0"
- value_max="1">
- <param_alpha
- tga_file="facehair_moustache_alpha.tga"
- skip_if_zero="true"
- domain="0.05" />
- </param>
-
- <param
- id="1008"
- sex="male"
- group="1"
- wearable="hair"
- edit_group="driven"
- name="Soulpatch bump"
- value_min="0"
- value_max="1">
- <param_alpha
- tga_file="facehair_soulpatch_alpha.tga"
- skip_if_zero="true"
- domain="0.1" />
- </param>
-
- <param
- id="1010"
- sex="male"
- group="1"
- edit_group="driven"
- wearable="hair"
- name="Chin Curtains bump"
- value_min="0"
- value_max="1">
- <param_alpha
- tga_file="facehair_chincurtains_alpha.tga"
- skip_if_zero="true"
- domain="0.03" />
- </param>
-
- <param
- id="1012"
- group="1"
- sex="male"
- wearable="hair"
- edit_group="driven"
- name="5 O'Clock Shadow bump"
- value_min="0"
- value_max="1">
- <param_color>
- <value
- color="255,255,255,255" />
-
- <value
- color="255,255,255,0" />
- </param_color>
- </param>
- </layer>
-
- <layer
- name="facialhair"
- global_color="hair_color">
-
- <texture
- tga_file="head_hair.tga"
- file_is_mask="false" />
-
- <param
- id="1005"
- sex="male"
- group="1"
- edit_group="driven"
- name="Sideburns"
- value_min="0"
- value_max="1">
- <param_alpha
- tga_file="facehair_sideburns_alpha.tga"
- skip_if_zero="true"
- domain="0.05" />
- </param>
-
- <param
- id="1007"
- sex="male"
- group="1"
- edit_group="driven"
- name="Moustache"
- value_min="0"
- value_max="1">
- <param_alpha
- tga_file="facehair_moustache_alpha.tga"
- skip_if_zero="true"
- domain="0.05" />
- </param>
-
- <param
- id="1009"
- sex="male"
- group="1"
- edit_group="driven"
- name="Soulpatch"
- value_min="0"
- value_max="1">
- <param_alpha
- tga_file="facehair_soulpatch_alpha.tga"
- skip_if_zero="true"
- domain="0.1" />
- </param>
-
- <param
- id="1011"
- sex="male"
- group="1"
- edit_group="driven"
- name="Chin Curtains"
- value_min="0"
- value_max="1">
- <param_alpha
- tga_file="facehair_chincurtains_alpha.tga"
- skip_if_zero="true"
- domain="0.03" />
- </param>
-
- <param
- id="751"
- group="1"
- wearable="hair"
- sex="male"
- edit_group="hair_facial"
- name="5 O'Clock Shadow"
- label_min="Dense hair"
- label_max="Shadow hair"
- value_min="0"
- value_max="1"
- value_default="0.7"
- camera_elevation=".1"
- camera_distance=".3">
- <param_color
- operation="multiply">
- <value
- color="255,255,255,255" />
-
- <value
- color="255,255,255,30" />
- </param_color>
- </param>
- </layer>
-
- <layer
- name="head_bodypaint">
- <texture
- local_texture="head_bodypaint" />
- </layer>
- <layer
- name="head alpha"
- visibility_mask="TRUE">
- <texture
- local_texture="head_alpha" />
- </layer>
- <layer
- name="head_tattoo">
- <texture
- local_texture="head_tattoo" />
- </layer>
-
- </layer_set>
-
-<!-- =========================================================== -->
- <layer_set
- body_region="upper_body"
- width="512"
- height="512">
- <layer
- name="base_upperbody bump"
- render_pass="bump"
- fixed_color="128,128,128,255">
- </layer>
- <layer
- name="upperbody bump definition"
- render_pass="bump">
- <texture
- tga_file="bump_upperbody_base.tga"
- file_is_mask="FALSE"/>
-
- <param
- id="874"
- group="1"
- wearable="skin"
- edit_group="driven"
- edit_group_order="20"
- name="Bump upperdef"
- value_min="0"
- value_max="1">
- <param_alpha
- domain="0" />
- </param>
- </layer>
-
- <layer
- name="base"
- global_color="skin_color">
- <texture
- tga_file="body_skingrain.tga" />
- </layer>
-
- <layer
- name="nipples">
- <texture
- tga_file="upperbody_color.tga" />
- </layer>
-
- <layer
- name="shadow">
- <texture
- tga_file="upperbody_shading_alpha.tga"
- file_is_mask="TRUE" />
-
- <param
- id="125"
- group="1"
- name="Shading"
- wearable="skin"
- value_min="0"
- value_max="1">
- <param_color>
- <value
- color="0, 0, 0, 0" />
-
- <value
- color="0, 0, 0, 128" />
- </param_color>
- </param>
- </layer>
-
- <layer
- name="highlight">
- <texture
- tga_file="upperbody_highlights_alpha.tga"
- file_is_mask="TRUE" />
-
- <param
- id="126"
- group="1"
- wearable="skin"
- name="Shading"
- value_min="0"
- value_max="1">
- <param_color>
- <value
- color="255, 255, 255, 0" />
-
- <value
- color="255, 255, 255, 64" />
- </param_color>
- </param>
- </layer>
-
- <layer
- name="upper_bodypaint">
- <texture
- local_texture="upper_bodypaint" />
- </layer>
-
- <layer
- name="freckles upper"
- fixed_color="120,47,20,128">
- <param
- id="776"
- group="1"
- name="freckles upper"
- wearable="skin"
- value_min="0"
- value_max="1">
- <param_alpha
- tga_file="upperbodyfreckles_alpha.tga"
- skip_if_zero="true"
- domain="0.6" />
- </param>
- </layer>
-
- <layer
- name="upper_tattoo">
- <texture
- local_texture="upper_tattoo" />
- </layer>
-
-
- <layer
- name="upper_undershirt bump"
- render_pass="bump"
- fixed_color="128,128,128,255">
- <texture
- local_texture="upper_undershirt"
- local_texture_alpha_only="true" />
-
- <param
- id="1043"
- group="1"
- wearable="undershirt"
- edit_group="driven"
- name="Sleeve Length bump"
- value_min=".01"
- value_max="1"
- value_default=".4">
- <param_alpha
- tga_file="shirt_sleeve_alpha.tga"
- multiply_blend="false"
- domain="0.01" />
- </param>
-
- <param
- id="1045"
- group="1"
- wearable="undershirt"
- edit_group="undershirt"
- edit_group_order="2"
- name="Bottom bump"
- value_min="0"
- value_max="1"
- value_default=".8">
- <param_alpha
- tga_file="shirt_bottom_alpha.tga"
- multiply_blend="true"
- domain="0.05" />
- </param>
-
- <param
- id="1047"
- group="1"
- wearable="undershirt"
- edit_group="driven"
- name="Collar Front bump"
- value_min="0"
- value_max="1"
- value_default=".8">
- <param_alpha
- tga_file="shirt_collar_alpha.tga"
- multiply_blend="true"
- domain="0.05" />
- </param>
-
- <param
- id="1049"
- group="1"
- wearable="undershirt"
- edit_group="driven"
- name="Collar Back bump"
- value_min="0"
- value_max="1"
- value_default=".8">
- <param_alpha
- tga_file="shirt_collar_back_alpha.tga"
- multiply_blend="true"
- domain="0.05" />
- </param>
- </layer>
-
- <layer
- name="upper_undershirt">
- <texture
- local_texture="upper_undershirt" />
-
- <param
- id="821"
- group="0"
- wearable="undershirt"
- edit_group="colorpicker"
- name="undershirt_red"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="255, 0, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="822"
- group="0"
- wearable="undershirt"
- edit_group="colorpicker"
- name="undershirt_green"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 255, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="823"
- group="0"
- wearable="undershirt"
- edit_group="colorpicker"
- name="undershirt_blue"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 0, 255, 255" />
- </param_color>
- </param>
-
- <param
- id="1042"
- group="1"
- wearable="undershirt"
- edit_group="driven"
- name="Sleeve Length"
- value_min=".01"
- value_max="1"
- value_default=".4">
- <param_alpha
- tga_file="shirt_sleeve_alpha.tga"
- multiply_blend="false"
- domain="0.01" />
- </param>
-
- <param
- id="1044"
- group="1"
- wearable="undershirt"
- edit_group="driven"
- name="Bottom"
- value_min="0"
- value_max="1"
- value_default=".8">
- <param_alpha
- tga_file="shirt_bottom_alpha.tga"
- multiply_blend="true"
- domain="0.05" />
- </param>
-
- <param
- id="1046"
- group="1"
- wearable="undershirt"
- edit_group="driven"
- name="Collar Front"
- value_min="0"
- value_max="1"
- value_default=".8">
- <param_alpha
- tga_file="shirt_collar_alpha.tga"
- multiply_blend="true"
- domain="0.05" />
- </param>
-
- <param
- id="1048"
- group="1"
- wearable="undershirt"
- edit_group="driven"
- name="Collar Back"
- label_min="Low"
- label_max="High"
- value_min="0"
- value_max="1"
- value_default=".8">
- <param_alpha
- tga_file="shirt_collar_back_alpha.tga"
- multiply_blend="true"
- domain="0.05" />
- </param>
- </layer>
-
- <layer
- name="Nail Polish">
- <param
- id="710"
- group="0"
- wearable="skin"
- edit_group="skin_makeup"
- edit_group_order="15"
- name="Nail Polish"
- label_min="No Polish"
- label_max="Painted Nails"
- value_min="0"
- value_max="1"
- value_default="0.0"
- camera_distance="1.6"
- camera_elevation="-.4"
- camera_angle="70">
- <param_alpha
- tga_file="nailpolish_alpha.tga"
- skip_if_zero="true"
- domain="0.1" />
- </param>
-
- <param
- id="715"
- group="0"
- wearable="skin"
- edit_group="skin_makeup"
- edit_group_order="16"
- name="Nail Polish Color"
- label_min="Pink"
- label_max="Black"
- value_min="0"
- value_max="1"
- camera_distance="1.6"
- camera_elevation="-.4"
- camera_angle="70">
- <param_color>
- <value
- color="255,187,200,255" />
-
- <value
- color="194,102,127,255" />
-
- <value
- color="227,34,99,255" />
-
- <value
- color="168,41,60,255" />
-
- <value
- color="97,28,59,255" />
-
- <value
- color="234,115,93,255" />
-
- <value
- color="142,58,47,255" />
-
- <value
- color="114,30,46,255" />
-
- <value
- color="14,14,14,255" />
- </param_color>
- </param>
- </layer>
-
- <layer
- name="upper_gloves bump"
- render_pass="bump"
- fixed_color="128,128,128,255">
- <texture
- local_texture="upper_gloves"
- local_texture_alpha_only="true" />
-
- <param
- id="1059"
- group="1"
- wearable="gloves"
- edit_group="driven"
- name="Glove Length bump"
- value_min=".01"
- value_max="1"
- value_default=".8">
- <param_alpha
- tga_file="glove_length_alpha.tga"
- domain="0.01" />
- </param>
-
- <param
- id="1061"
- group="1"
- wearable="gloves"
- edit_group="driven"
- name="Glove Fingers bump"
- value_min=".01"
- value_max="1"
- value_default="1">
- <param_alpha
- tga_file="gloves_fingers_alpha.tga"
- multiply_blend="true"
- domain="0.01" />
- </param>
- </layer>
-
- <layer
- name="upper_gloves">
- <texture
- local_texture="upper_gloves" />
-
- <param
- id="827"
- group="0"
- wearable="gloves"
- edit_group="colorpicker"
- name="gloves_red"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="255, 0, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="829"
- group="0"
- wearable="gloves"
- edit_group="colorpicker"
- name="gloves_green"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 255, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="830"
- group="0"
- wearable="gloves"
- edit_group="colorpicker"
- name="gloves_blue"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 0, 255, 255" />
- </param_color>
- </param>
-
- <param
- id="1058"
- group="1"
- wearable="gloves"
- edit_group="driven"
- name="Glove Length"
- value_min=".01"
- value_max="1"
- value_default=".8">
- <param_alpha
- tga_file="glove_length_alpha.tga"
- domain="0.01" />
- </param>
-
- <param
- id="1060"
- group="1"
- wearable="gloves"
- edit_group="driven"
- name="Glove Fingers"
- value_min=".01"
- value_max="1"
- value_default="1">
- <param_alpha
- tga_file="gloves_fingers_alpha.tga"
- multiply_blend="true"
- domain="0.01" />
- </param>
- </layer>
-
- <layer
- name="upper_clothes_shadow">
- <texture
- local_texture="upper_shirt" />
-
- <param
- id="899"
- group="1"
- edit_group="driven"
- wearable="shirt"
- name="Upper Clothes Shading"
- value_min="0"
- value_max="1"
- value_default="0">
- <param_color>
- <value
- color="0, 0, 0, 0" />
-
- <value
- color="0, 0, 0, 80" />
- </param_color>
- </param>
-
- <param
- id="900"
- group="1"
- wearable="shirt"
- edit_group="driven"
- name="Sleeve Length Shadow"
- value_min="0.02"
- value_max=".87"
- value_default="0.02">
- <param_alpha
- multiply_blend="false"
- tga_file="shirt_sleeve_alpha.tga"
- skip_if_zero="true"
- domain="0.03" />
- </param>
-
- <param
- id="901"
- group="1"
- wearable="shirt"
- edit_group="driven"
- name="Shirt Shadow Bottom"
- value_min="0.02"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="shirt_bottom_alpha.tga"
- skip_if_zero="true"
- domain="0.05" />
- </param>
-
- <param
- id="902"
- group="1"
- wearable="shirt"
- edit_group="driven"
- name="Collar Front Shadow Height"
- value_min="0.02"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="shirt_collar_alpha.tga"
- skip_if_zero="true"
- domain="0.02" />
- </param>
-
- <param
- id="903"
- group="1"
- wearable="shirt"
- edit_group="driven"
- name="Collar Back Shadow Height"
- value_min="0.02"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="shirt_collar_back_alpha.tga"
- skip_if_zero="true"
- domain="0.02" />
- </param>
- </layer>
-
- <layer
- name="upper_shirt base bump"
- render_pass="bump"
- fixed_color="128,128,128,255">
- <texture
- local_texture="upper_shirt"
- local_texture_alpha_only="true" />
-
- <param
- id="1029"
- group="1"
- wearable="shirt"
- edit_group="driven"
- name="Sleeve Length Cloth"
- value_min="0"
- value_max="0.85">
- <param_alpha
- multiply_blend="false"
- tga_file="shirt_sleeve_alpha.tga"
- domain="0.01" />
- </param>
-
- <param
- id="1030"
- group="1"
- wearable="shirt"
- edit_group="driven"
- name="Shirt Bottom Cloth"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="shirt_bottom_alpha.tga"
- domain="0.05" />
- </param>
-
- <param
- id="1031"
- group="1"
- wearable="shirt"
- edit_group="driven"
- name="Collar Front Height Cloth"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="shirt_collar_alpha.tga"
- domain="0.05" />
- </param>
-
- <param
- id="1032"
- group="1"
- wearable="shirt"
- edit_group="driven"
- name="Collar Back Height Cloth"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="shirt_collar_back_alpha.tga"
- domain="0.05" />
- </param>
- </layer>
-
- <layer
- name="upper_clothes bump"
- render_pass="bump">
- <texture
- tga_file="bump_shirt_wrinkles.tga" />
-
- <texture
- local_texture="upper_shirt"
- local_texture_alpha_only="true" />
-
- <param
- id="868"
- group="0"
- wearable="shirt"
- edit_group="shirt"
- edit_group_order="8"
- name="Shirt Wrinkles"
- value_min="0"
- value_max="1"
- value_default="0">
- <param_color>
- <value
- color="255, 255, 255, 0" />
-
- <value
- color="255, 255, 255, 255" />
- </param_color>
- </param>
-
- <param
- id="1013"
- group="1"
- wearable="shirt"
- edit_group="driven"
- name="Sleeve Length Cloth"
- value_min="0"
- value_max="0.85">
- <param_alpha
- multiply_blend="false"
- tga_file="shirt_sleeve_alpha.tga"
- domain="0.01" />
- </param>
-
- <param
- id="1014"
- group="1"
- wearable="shirt"
- edit_group="driven"
- name="Shirt Bottom Cloth"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="shirt_bottom_alpha.tga"
- domain="0.05" />
- </param>
-
- <param
- id="1015"
- group="1"
- wearable="shirt"
- edit_group="driven"
- name="Collar Front Height Cloth"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="shirt_collar_alpha.tga"
- domain="0.05" />
- </param>
-
- <param
- id="1016"
- group="1"
- wearable="shirt"
- edit_group="driven"
- name="Collar Back Height Cloth"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="shirt_collar_back_alpha.tga"
- domain="0.05" />
- </param>
- </layer>
-
- <layer
- name="upper_clothes">
- <texture
- local_texture="upper_shirt" />
-
- <param
- id="803"
- group="0"
- wearable="shirt"
- edit_group="colorpicker"
- name="shirt_red"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="255, 0, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="804"
- group="0"
- wearable="shirt"
- edit_group="colorpicker"
- name="shirt_green"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 255, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="805"
- group="0"
- wearable="shirt"
- edit_group="colorpicker"
- name="shirt_blue"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 0, 255, 255" />
- </param_color>
- </param>
-
- <param
- id="600"
- group="1"
- wearable="shirt"
- edit_group="driven"
- name="Sleeve Length Cloth"
- value_min="0"
- value_max="0.85"
- value_default=".7">
- <param_alpha
- multiply_blend="false"
- tga_file="shirt_sleeve_alpha.tga"
- domain="0.01" />
- </param>
-
- <param
- id="601"
- group="1"
- wearable="shirt"
- edit_group="driven"
- name="Shirt Bottom Cloth"
- value_min="0"
- value_max="1"
- value_default=".8">
- <param_alpha
- multiply_blend="true"
- tga_file="shirt_bottom_alpha.tga"
- domain="0.05" />
- </param>
-
- <param
- id="602"
- group="1"
- wearable="shirt"
- edit_group="driven"
- name="Collar Front Height Cloth"
- value_min="0"
- value_max="1"
- value_default=".8">
- <param_alpha
- multiply_blend="true"
- tga_file="shirt_collar_alpha.tga"
- domain="0.05" />
- </param>
-
- <param
- id="778"
- group="1"
- wearable="shirt"
- edit_group="driven"
- name="Collar Back Height Cloth"
- value_min="0"
- value_max="1"
- value_default=".8">
- <param_alpha
- multiply_blend="true"
- tga_file="shirt_collar_back_alpha.tga"
- domain="0.05" />
- </param>
- </layer>
-
- <layer
- name="upper_jacket base bump"
- render_pass="bump"
- fixed_color="128,128,128,255">
- <texture
- local_texture="upper_jacket"
- local_texture_alpha_only="true" />
-
- <param
- id="1039"
- group="1"
- wearable="jacket"
- edit_group="driven"
- edit_group_order="1"
- name="Jacket Sleeve Length bump"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="false"
- tga_file="shirt_sleeve_alpha.tga"
- domain="0.01" />
- </param>
-
- <param
- id="1040"
- group="1"
- wearable="jacket"
- edit_group="driven"
- name="Jacket Collar Front bump"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="shirt_collar_alpha.tga"
- domain="0.05" />
- </param>
-
- <param
- id="1041"
- group="1"
- wearable="jacket"
- edit_group="driven"
- edit_group_order="3.5"
- name="Jacket Collar Back bump"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="shirt_collar_back_alpha.tga"
- domain="0.05" />
- </param>
-
- <param
- id="1037"
- group="1"
- wearable="jacket"
- edit_group="driven"
- name="jacket bottom length upper bump"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="jacket_length_upper_alpha.tga"
- domain="0.01" />
- </param>
-
- <param
- id="1038"
- group="1"
- wearable="jacket"
- edit_group="driven"
- name="jacket open upper bump"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="jacket_open_upper_alpha.tga"
- domain="0.01" />
- </param>
- </layer>
-
- <layer
- name="upper_jacket bump"
- render_pass="bump">
- <texture
- tga_file="bump_shirt_wrinkles.tga" />
-
- <texture
- local_texture="upper_jacket"
- local_texture_alpha_only="true" />
-
- <param
- id="875"
- group="1"
- wearable="jacket"
- name="jacket upper Wrinkles"
- value_min="0"
- value_max="1"
- value_default="0">
- <param_color>
- <value
- color="255, 255, 255, 0" />
-
- <value
- color="255, 255, 255, 255" />
- </param_color>
- </param>
-
- <param
- id="1019"
- group="1"
- wearable="jacket"
- edit_group="driven"
- edit_group_order="1"
- name="Jacket Sleeve Length bump"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="false"
- tga_file="shirt_sleeve_alpha.tga"
- domain="0.01" />
- </param>
-
- <param
- id="1021"
- group="1"
- wearable="jacket"
- edit_group="driven"
- name="Jacket Collar Front bump"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="shirt_collar_alpha.tga"
- domain="0.05" />
- </param>
-
- <param
- id="1023"
- group="1"
- wearable="jacket"
- edit_group="driven"
- edit_group_order="3.5"
- name="Jacket Collar Back bump"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="shirt_collar_back_alpha.tga"
- domain="0.05" />
- </param>
-
- <param
- id="1025"
- group="1"
- wearable="jacket"
- edit_group="driven"
- name="jacket bottom length upper bump"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="jacket_length_upper_alpha.tga"
- domain="0.01" />
- </param>
-
- <param
- id="1026"
- group="1"
- wearable="jacket"
- edit_group="driven"
- name="jacket open upper bump"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="jacket_open_upper_alpha.tga"
- domain="0.01" />
- </param>
- </layer>
-
- <layer
- name="upper_jacket">
- <texture
- local_texture="upper_jacket" />
-
- <param
- id="831"
- group="1"
- edit_group="colorpicker_driven"
- wearable="jacket"
- name="upper_jacket_red"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="255, 0, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="832"
- group="1"
- edit_group="colorpicker_driven"
- wearable="jacket"
- name="upper_jacket_green"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 255, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="833"
- group="1"
- edit_group="colorpicker_driven"
- wearable="jacket"
- name="upper_jacket_blue"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 0, 255, 255" />
- </param_color>
- </param>
-
- <param
- id="1020"
- group="1"
- edit_group="driven"
- name="jacket Sleeve Length"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="false"
- tga_file="shirt_sleeve_alpha.tga"
- domain="0.01" />
- </param>
-
- <param
- id="1022"
- group="1"
- edit_group="driven"
- name="jacket Collar Front"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="shirt_collar_alpha.tga"
- domain="0.05" />
- </param>
-
- <param
- id="1024"
- group="1"
- edit_group="driven"
- edit_group_order="3.5"
- name="jacket Collar Back"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="shirt_collar_back_alpha.tga"
- domain="0.05" />
- </param>
-
- <param
- id="620"
- group="1"
- wearable="jacket"
- edit_group="jacket"
- name="bottom length upper"
- label_min="hi cut"
- label_max="low cut"
- value_min="0"
- value_max="1"
- value_default=".8"
- camera_distance="1.2"
- camera_angle="30"
- camera_elevation=".2">
- <param_alpha
- multiply_blend="true"
- tga_file="jacket_length_upper_alpha.tga"
- domain="0.01" />
- </param>
-
- <param
- id="622"
- group="1"
- wearable="jacket"
- edit_group="jacket"
- name="open upper"
- label_min="closed"
- label_max="open"
- value_min="0"
- value_max="1"
- value_default=".8"
- camera_distance="1.2"
- camera_angle="30"
- camera_elevation=".2">
- <param_alpha
- multiply_blend="true"
- tga_file="jacket_open_upper_alpha.tga"
- domain="0.01" />
- </param>
- </layer>
-
- <layer
- name="upper alpha"
- visibility_mask="TRUE">
- <texture
- local_texture="upper_alpha" />
- </layer>
-
- </layer_set>
-
-<!-- =========================================================== -->
- <layer_set
- body_region="lower_body"
- width="512"
- height="512">
- <layer
- name="lower body bump base"
- fixed_color = "128,128,128,255"
- render_pass="bump">
- </layer>
- <layer
- name="base_lowerbody bump"
- render_pass="bump">
- <texture
- tga_file="bump_lowerbody_base.tga"
- file_is_mask="FALSE" />
-
- <param
- id="878"
- group="1"
- wearable="skin"
- edit_group="driven"
- edit_group_order="20"
- name="Bump upperdef"
- value_min="0"
- value_max="1">
- <param_alpha
- domain="0" />
- </param>
- </layer>
-
- <layer
- name="base"
- global_color="skin_color">
- <texture
- tga_file="body_skingrain.tga" />
- </layer>
-
- <layer
- name="shadow">
- <texture
- tga_file="lowerbody_shading_alpha.tga"
- file_is_mask="TRUE" />
-
- <param
- id="160"
- group="1"
- name="Shading"
- wearable="pants"
- value_min="0"
- value_max="1">
- <param_color>
- <value
- color="0, 0, 0, 0" />
-
- <value
- color="0, 0, 0, 128" />
- </param_color>
- </param>
- </layer>
-
- <layer
- name="highlight">
- <texture
- tga_file="lowerbody_highlights_alpha.tga"
- file_is_mask="TRUE" />
-
- <param
- id="161"
- group="1"
- name="Shading"
- wearable="skin"
- value_min="0"
- value_max="1">
- <param_color>
- <value
- color="255, 255, 255, 0" />
-
- <value
- color="255, 255, 255, 64" />
- </param_color>
- </param>
- </layer>
-
- <layer
- name="toenails">
- <texture
- tga_file="lowerbody_color.tga" />
- </layer>
-
- <layer
- name="lower_bodypaint">
- <texture
- local_texture="lower_bodypaint" />
- </layer>
-
- <layer
- name="freckles lower"
- fixed_color="120,47,20,128">
- <param
- id="777"
- group="1"
- name="freckles lower"
- wearable="skin"
- value_min="0"
- value_max="1">
- <param_alpha
- tga_file="bodyfreckles_alpha.tga"
- skip_if_zero="true"
- domain="0.6" />
- </param>
- </layer>
-
- <layer
- name="lower_tattoo">
- <texture
- local_texture="lower_tattoo" />
- </layer>
-
- <layer
- name="lower_underpants bump"
- render_pass="bump"
- fixed_color="128,128,128,255">
- <texture
- local_texture="lower_underpants"
- local_texture_alpha_only="true" />
-
- <param
- id="1055"
- group="1"
- wearable="underpants"
- edit_group="underpants"
- name="Pants Length"
- value_min="0"
- value_max="1"
- value_default=".3">
- <param_alpha
- tga_file="pants_length_alpha.tga"
- domain="0.01" />
- </param>
-
- <param
- id="1057"
- group="1"
- wearable="underpants"
- edit_group="underpants"
- name="Pants Waist"
- value_min="0"
- value_max="1"
- value_default=".8">
- <param_alpha
- tga_file="pants_waist_alpha.tga"
- domain="0.05" />
- </param>
- </layer>
-
- <layer
- name="lower_underpants">
- <texture
- local_texture="lower_underpants" />
-
- <param
- id="824"
- group="0"
- wearable="underpants"
- edit_group="colorpicker"
- name="underpants_red"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="255, 0, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="825"
- group="0"
- wearable="underpants"
- edit_group="colorpicker"
- name="underpants_green"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 255, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="826"
- group="0"
- wearable="underpants"
- edit_group="colorpicker"
- name="underpants_blue"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 0, 255, 255" />
- </param_color>
- </param>
-
- <param
- id="1054"
- group="1"
- wearable="underpants"
- edit_group="driven"
- name="Pants Length"
- value_min="0"
- value_max="1"
- value_default=".3"
- camera_distance="1.2"
- camera_angle="30"
- camera_elevation="-.3">
- <param_alpha
- tga_file="pants_length_alpha.tga"
- domain="0.01" />
- </param>
-
- <param
- id="1056"
- group="1"
- wearable="underpants"
- edit_group="driven"
- name="Pants Waist"
- value_min="0"
- value_max="1"
- value_default=".8">
- <param_alpha
- tga_file="pants_waist_alpha.tga"
- domain="0.05" />
- </param>
- </layer>
-
- <layer
- name="lower_socks bump"
- render_pass="bump"
- fixed_color="128,128,128,255">
- <texture
- local_texture="lower_socks"
- local_texture_alpha_only="true" />
-
- <param
- id="1051"
- group="1"
- wearable="socks"
- edit_group="driven"
- name="Socks Length bump"
- value_min="0"
- value_max="1"
- value_default="0.35">
- <param_alpha
- tga_file="shoe_height_alpha.tga"
- domain="0.01" />
- </param>
- </layer>
-
- <layer
- name="lower_socks">
- <texture
- local_texture="lower_socks" />
-
- <param
- id="818"
- group="0"
- wearable="socks"
- edit_group="colorpicker"
- name="socks_red"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="255, 0, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="819"
- group="0"
- wearable="socks"
- edit_group="colorpicker"
- name="socks_green"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 255, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="820"
- group="0"
- wearable="socks"
- edit_group="colorpicker"
- name="socks_blue"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 0, 255, 255" />
- </param_color>
- </param>
-
- <param
- id="1050"
- group="1"
- wearable="socks"
- edit_group="driven"
- name="Socks Length bump"
- value_min="0"
- value_max="1"
- value_default="0.35">
- <param_alpha
- tga_file="shoe_height_alpha.tga"
- domain="0.01" />
- </param>
- </layer>
-
- <layer
- name="lower_shoes bump"
- render_pass="bump"
- fixed_color="128,128,128,255">
- <texture
- local_texture="lower_shoes"
- local_texture_alpha_only="true" />
-
- <param
- id="1053"
- group="1"
- wearable="shoes"
- edit_group="driven"
- name="Shoe Height bump"
- value_min="0"
- value_max="1"
- value_default="0.1">
- <param_alpha
- tga_file="shoe_height_alpha.tga"
- domain="0.01" />
- </param>
- </layer>
-
- <layer
- name="lower_shoes">
- <texture
- local_texture="lower_shoes" />
-
- <param
- id="812"
- group="0"
- wearable="shoes"
- edit_group="colorpicker"
- name="shoes_red"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="255, 0, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="813"
- group="0"
- wearable="shoes"
- edit_group="colorpicker"
- name="shoes_green"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 255, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="817"
- group="0"
- wearable="shoes"
- edit_group="colorpicker"
- name="shoes_blue"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 0, 255, 255" />
- </param_color>
- </param>
-
- <param
- id="1052"
- group="1"
- wearable="shoes"
- edit_group="driven"
- name="Shoe Height"
- value_min="0"
- value_max="1"
- value_default="0.1">
- <param_alpha
- tga_file="shoe_height_alpha.tga"
- domain="0.01" />
- </param>
- </layer>
-
- <layer
- name="lower_clothes_shadow">
- <texture
- local_texture="lower_pants" />
-
- <param
- id="913"
- group="1"
- edit_group="driven"
- wearable="pants"
- name="Lower Clothes Shading"
- value_min="0"
- value_max="1"
- value_default="0">
- <param_color>
- <value
- color="0, 0, 0, 0" />
-
- <value
- color="0, 0, 0, 80" />
- </param_color>
- </param>
-
- <param
- id="914"
- group="1"
- edit_group="driven"
- wearable="pants"
- name="Waist Height Shadow"
- value_min="0.02"
- value_max="1">
- <param_alpha
- tga_file="pants_waist_alpha.tga"
- skip_if_zero="true"
- domain="0.04" />
- </param>
-
- <param
- id="915"
- group="1"
- edit_group="driven"
- wearable="pants"
- name="Pants Length Shadow"
- value_min="0.02"
- value_max="1">
- <param_alpha
- tga_file="pants_length_alpha.tga"
- skip_if_zero="true"
- domain="0.03" />
- </param>
- </layer>
-
- <layer
- name="lower_pants base bump"
- render_pass="bump"
- fixed_color="128,128,128,255">
- <texture
- local_texture="lower_pants"
- local_texture_alpha_only="true" />
-
- <param
- id="1035"
- group="1"
- edit_group="driven"
- wearable="pants"
- name="Waist Height Cloth"
- value_min="0"
- value_max="1">
- <param_alpha
- tga_file="pants_waist_alpha.tga"
- domain="0.05" />
- </param>
-
- <param
- id="1036"
- group="1"
- edit_group="driven"
- wearable="pants"
- name="Pants Length Cloth"
- value_min="0"
- value_max="1">
- <param_alpha
- tga_file="pants_length_alpha.tga"
- domain="0.01" />
- </param>
- </layer>
-
- <layer
- name="lower_pants bump"
- render_pass="bump">
- <texture
- tga_file="bump_pants_wrinkles.tga" />
-
- <texture
- local_texture="lower_pants"
- local_texture_alpha_only="true" />
-
- <param
- id="869"
- group="0"
- wearable="pants"
- edit_group="pants"
- edit_group_order="6"
- name="Pants Wrinkles"
- value_min="0"
- value_max="1"
- value_default="0">
- <param_color>
- <value
- color="255, 255, 255, 0" />
-
- <value
- color="255, 255, 255, 255" />
- </param_color>
- </param>
-
- <param
- id="1017"
- group="1"
- edit_group="driven"
- wearable="pants"
- name="Waist Height Cloth"
- value_min="0"
- value_max="1">
- <param_alpha
- tga_file="pants_waist_alpha.tga"
- domain="0.05" />
- </param>
-
- <param
- id="1018"
- group="1"
- edit_group="driven"
- wearable="pants"
- name="Pants Length Cloth"
- value_min="0"
- value_max="1">
- <param_alpha
- tga_file="pants_length_alpha.tga"
- domain="0.01" />
- </param>
- </layer>
-
- <layer
- name="lower_pants">
- <texture
- local_texture="lower_pants" />
-
- <param
- id="806"
- group="0"
- wearable="pants"
- edit_group="colorpicker"
- name="pants_red"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="255, 0, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="807"
- group="0"
- wearable="pants"
- edit_group="colorpicker"
- name="pants_green"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 255, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="808"
- group="0"
- wearable="pants"
- edit_group="colorpicker"
- name="pants_blue"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 0, 255, 255" />
- </param_color>
- </param>
-
- <param
- id="614"
- group="1"
- edit_group="driven"
- wearable="pants"
- name="Waist Height Cloth"
- value_min="0"
- value_max="1"
- value_default=".8">
- <param_alpha
- tga_file="pants_waist_alpha.tga"
- domain="0.05" />
- </param>
-
- <param
- id="615"
- group="1"
- edit_group="driven"
- wearable="pants"
- name="Pants Length Cloth"
- value_min="0"
- value_max="1"
- value_default=".8">
- <param_alpha
- tga_file="pants_length_alpha.tga"
- domain="0.01" />
- </param>
- </layer>
-
- <layer
- name="lower_jacket base bump"
- render_pass="bump"
- fixed_color="128,128,128,255">
- <texture
- local_texture="lower_jacket"
- local_texture_alpha_only="true" />
-
- <param
- id="1033"
- group="1"
- wearable="jacket"
- edit_group="driven"
- name="jacket bottom length lower bump"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="false"
- tga_file="jacket_length_lower_alpha.tga"
- domain="0.01" />
- </param>
-
- <param
- id="1034"
- group="1"
- wearable="jacket"
- edit_group="driven"
- name="jacket open lower bump"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="jacket_open_lower_alpha.tga"
- domain="0.01" />
- </param>
- </layer>
-
- <layer
- name="lower_jacket bump"
- render_pass="bump">
- <texture
- tga_file="bump_pants_wrinkles.tga" />
-
- <texture
- local_texture="lower_jacket"
- local_texture_alpha_only="true" />
-
- <param
- id="876"
- group="1"
- wearable="jacket"
- name="jacket upper Wrinkles"
- value_min="0"
- value_max="1"
- value_default="0">
- <param_color>
- <value
- color="255, 255, 255, 0" />
-
- <value
- color="255, 255, 255, 255" />
- </param_color>
- </param>
-
- <param
- id="1027"
- group="1"
- wearable="jacket"
- edit_group="driven"
- name="jacket bottom length lower bump"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="false"
- tga_file="jacket_length_lower_alpha.tga"
- domain="0.01" />
- </param>
-
- <param
- id="1028"
- group="1"
- wearable="jacket"
- edit_group="driven"
- name="jacket open lower bump"
- value_min="0"
- value_max="1">
- <param_alpha
- multiply_blend="true"
- tga_file="jacket_open_lower_alpha.tga"
- domain="0.01" />
- </param>
- </layer>
-
- <layer
- name="lower_jacket">
- <texture
- local_texture="lower_jacket" />
-
- <param
- id="809"
- group="1"
- edit_group="colorpicker_driven"
- wearable="jacket"
- name="lower_jacket_red"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="255, 0, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="810"
- group="1"
- edit_group="colorpicker_driven"
- wearable="jacket"
- name="lower_jacket_green"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 255, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="811"
- group="1"
- edit_group="colorpicker_driven"
- wearable="jacket"
- name="lower_jacket_blue"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 0, 255, 255" />
- </param_color>
- </param>
-
- <param
- id="621"
- group="1"
- wearable="jacket"
- edit_group="jacket"
- name="bottom length lower"
- label_min="hi cut"
- label_max="low cut"
- value_min="0"
- value_max="1"
- value_default=".8"
- camera_distance="1.2"
- camera_angle="30"
- camera_elevation=".2">
- <param_alpha
- multiply_blend="false"
- tga_file="jacket_length_lower_alpha.tga"
- domain="0.01" />
- </param>
-
- <param
- id="623"
- group="1"
- wearable="jacket"
- edit_group="jacket"
- name="open lower"
- label_min="open"
- label_max="closed"
- value_min="0"
- value_max="1"
- value_default=".8"
- camera_distance="1.2"
- camera_angle="30"
- camera_elevation=".2">
- <param_alpha
- multiply_blend="true"
- tga_file="jacket_open_lower_alpha.tga"
- domain="0.01" />
- </param>
- </layer>
-
- <layer
- name="lower alpha"
- visibility_mask="TRUE">
- <texture
- local_texture="lower_alpha" />
- </layer>
-
- </layer_set>
-
-<!-- =========================================================== -->
- <layer_set
- body_region="eyes"
- width="128"
- height="128">
- <layer
- name="whites">
- <texture
- tga_file="eyewhite.tga" />
- </layer>
-
- <layer
- name="iris"
- global_color="eye_color">
- <texture
- local_texture="eyes_iris" />
- </layer>
-
- <layer
- name="eyes alpha"
- visibility_mask="TRUE">
- <texture
- local_texture="eyes_alpha" />
- </layer>
-
- </layer_set>
-
-<!-- =========================================================== -->
- <layer_set
- body_region="skirt"
- width="512"
- height="512"
- clear_alpha="false">
- <layer
- name="skirt_fabric"
- write_all_channels="true">
- <texture
- local_texture="skirt" />
-
- <param
- id="921"
- group="0"
- wearable="skirt"
- edit_group="colorpicker"
- name="skirt_red"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="255, 0, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="922"
- group="0"
- wearable="skirt"
- edit_group="colorpicker"
- name="skirt_green"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 255, 0, 255" />
- </param_color>
- </param>
-
- <param
- id="923"
- group="0"
- wearable="skirt"
- edit_group="colorpicker"
- name="skirt_blue"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_color>
- <value
- color="0, 0, 0, 255" />
-
- <value
- color="0, 0, 255, 255" />
- </param_color>
- </param>
- </layer>
-
- <layer
- name="skirt_fabric_alpha">
- <param
- id="858"
- group="0"
- wearable="skirt"
- edit_group="skirt"
- edit_group_order="1"
- name="Skirt Length"
- show_simple="true"
- label_min="Short"
- label_max="Long"
- value_min=".01"
- value_max="1"
- value_default=".4"
- simple_percent_min="40"
- simple_percent_max="100"
- camera_distance="1.3"
- camera_elevation="-.5"
- camera_angle="30">
- <param_alpha
- tga_file="skirt_length_alpha.tga"
- domain="0"
- multiply_blend="true" />
- </param>
-
- <param
- id="859"
- group="0"
- wearable="skirt"
- edit_group="skirt"
- edit_group_order="4"
- name="Slit Front"
- label_min="Open Front"
- label_max="Closed Front"
- value_min="0"
- value_max="1"
- value_default="1"
- camera_distance="1.3"
- camera_elevation="-.5"
- camera_angle="30">
- <param_alpha
- tga_file="skirt_slit_front_alpha.tga"
- multiply_blend="true"
- domain="0" />
- </param>
-
- <param
- id="860"
- group="0"
- wearable="skirt"
- edit_group="skirt"
- edit_group_order="5"
- name="Slit Back"
- label_min="Open Back"
- label_max="Closed Back"
- value_min="0"
- value_max="1"
- value_default="1"
- camera_distance="1.3"
- camera_elevation="-.5"
- camera_angle="160">
- <param_alpha
- tga_file="skirt_slit_back_alpha.tga"
- multiply_blend="true"
- domain="0" />
- </param>
-
- <param
- id="861"
- group="0"
- wearable="skirt"
- edit_group="skirt"
- edit_group_order="6"
- name="Slit Left"
- label_min="Open Left"
- label_max="Closed Left"
- value_min="0"
- value_max="1"
- value_default="1"
- camera_distance="1.3"
- camera_elevation="-.5"
- camera_angle="30">
- <param_alpha
- tga_file="skirt_slit_left_alpha.tga"
- multiply_blend="true"
- domain="0" />
- </param>
-
- <param
- id="862"
- group="0"
- wearable="skirt"
- edit_group="skirt"
- edit_group_order="7"
- name="Slit Right"
- label_min="Open Right"
- label_max="Closed Right"
- value_min="0"
- value_max="1"
- value_default="1"
- camera_distance="1.3"
- camera_elevation="-.5"
- camera_angle="-30">
- <param_alpha
- tga_file="skirt_slit_right_alpha.tga"
- multiply_blend="true"
- domain="0" />
- </param>
- </layer>
-
- </layer_set>
-
-<!-- =========================================================== -->
- <driver_parameters>
- <param
- id="828"
- group="0"
- name="Loose Upper Clothing"
- label="Shirt Fit"
- show_simple="true"
- wearable="shirt"
- edit_group="shirt"
- edit_group_order="4"
- label_min="Tight Shirt"
- label_max="Loose Shirt"
+ <param
+ id="913"
+ group="1"
+ edit_group="driven"
+ wearable="pants"
+ name="Lower Clothes Shading"
value_min="0"
value_max="1"
- camera_distance="1.2"
- camera_angle="30"
- camera_elevation=".2">
- <param_driver>
- <driven
- id="628" />
+ value_default="0">
+ <param_color>
+ <value
+ color="0, 0, 0, 0" />
- <driven
- id="899"
- min1="0.1"
- max1="0.5"
- max2="1"
- min2="1" />
- </param_driver>
+ <value
+ color="0, 0, 0, 80" />
+ </param_color>
</param>
<param
- id="816"
- group="0"
- name="Loose Lower Clothing"
- label="Pants Fit"
- show_simple="true"
+ id="914"
+ group="1"
+ edit_group="driven"
wearable="pants"
- edit_group="pants"
- edit_group_order="2.5"
- label_min="Tight Pants"
- label_max="Loose Pants"
- value_min="0"
- value_max="1"
- camera_distance="1.8"
- camera_angle="30"
- camera_elevation="-.3">
- <param_driver>
- <driven
- id="516" />
+ name="Waist Height Shadow"
+ value_min="0.02"
+ value_max="1">
+ <param_alpha
+ tga_file="pants_waist_alpha.tga"
+ skip_if_zero="true"
+ domain="0.04" />
+ </param>
- <driven
- id="913"
- min1="0.1"
- max1="0.5"
- max2="1"
- min2="1" />
- </param_driver>
+ <param
+ id="915"
+ group="1"
+ edit_group="driven"
+ wearable="pants"
+ name="Pants Length Shadow"
+ value_min="0.02"
+ value_max="1">
+ <param_alpha
+ tga_file="pants_length_alpha.tga"
+ skip_if_zero="true"
+ domain="0.03" />
</param>
+ </layer>
+
+ <layer
+ name="lower_pants base bump"
+ render_pass="bump"
+ fixed_color="128,128,128,255">
+ <texture
+ local_texture="lower_pants"
+ local_texture_alpha_only="true" />
<param
- id="814"
- group="0"
+ id="1035"
+ group="1"
+ edit_group="driven"
wearable="pants"
- edit_group="pants"
- edit_group_order="2"
- name="Waist Height"
- label_min="Low"
- label_max="High"
+ name="Waist Height Cloth"
value_min="0"
- value_max="1"
- value_default="1"
- camera_distance="1.2"
- camera_angle="30"
- camera_elevation="-.3">
- <param_driver>
- <driven
- id="614" />
+ value_max="1">
+ <param_alpha
+ tga_file="pants_waist_alpha.tga"
+ domain="0.05" />
+ </param>
- <driven
- id="1017" />
+ <param
+ id="1036"
+ group="1"
+ edit_group="driven"
+ wearable="pants"
+ name="Pants Length Cloth"
+ value_min="0"
+ value_max="1">
+ <param_alpha
+ tga_file="pants_length_alpha.tga"
+ domain="0.01" />
+ </param>
+ </layer>
- <driven
- id="1033" />
+ <layer
+ name="lower_pants bump"
+ render_pass="bump">
+ <texture
+ tga_file="bump_pants_wrinkles.tga" />
- <driven
- id="914"
- min1="0"
- max1=".98"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
+ <texture
+ local_texture="lower_pants"
+ local_texture_alpha_only="true" />
<param
- id="815"
+ id="869"
group="0"
wearable="pants"
edit_group="pants"
- edit_group_order="1"
- name="Pants Length"
- show_simple="true"
- label_min="Short"
- label_max="Long"
- value_min="0"
- value_max="1"
- value_default=".8"
- simple_percent_min="20"
- simple_percent_max="100"
- camera_distance="1.8"
- camera_angle="30"
- camera_elevation="-.3">
- <param_driver>
- <driven
- id="615"
- min1="0"
- max1=".9"
- max2="1"
- min2="1" />
-
- <driven
- id="1018"
- min1="0"
- max1=".9"
- max2="1"
- min2="1" />
-
- <driven
- id="1036"
- min1="0"
- max1=".9"
- max2="1"
- min2="1" />
-
- <driven
- id="793"
- min1=".9"
- max1="1"
- max2="1"
- min2="1" />
-
- <driven
- id="915"
- min1="0"
- max1=".882"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="800"
- group="0"
- wearable="shirt"
- edit_group="shirt"
- edit_group_order="1"
- name="Sleeve Length"
- show_simple="true"
- label_min="Short"
- label_max="Long"
+ edit_group_order="6"
+ name="Pants Wrinkles"
value_min="0"
value_max="1"
- value_default=".89"
- simple_percent_min="15"
- simple_percent_max="100"
- camera_distance="1.2"
- camera_angle="30"
- camera_elevation=".2">
- <param_driver>
- <driven
- id="600" />
-
- <driven
- id="1013" />
-
- <driven
- id="1029" />
+ value_default="0">
+ <param_color>
+ <value
+ color="255, 255, 255, 0" />
- <driven
- id="900"
- min1="0"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
+ <value
+ color="255, 255, 255, 255" />
+ </param_color>
</param>
<param
- id="801"
- group="0"
- wearable="shirt"
- edit_group="shirt"
- edit_group_order="2"
- name="Shirt Bottom"
- label_min="Short"
- label_max="Long"
+ id="1017"
+ group="1"
+ edit_group="driven"
+ wearable="pants"
+ name="Waist Height Cloth"
value_min="0"
- value_max="1"
- value_default="1"
- camera_distance="1.2"
- camera_angle="30"
- camera_elevation=".2">
- <param_driver>
- <driven
- id="601" />
-
- <driven
- id="1014" />
-
- <driven
- id="1030" />
+ value_max="1">
+ <param_alpha
+ tga_file="pants_waist_alpha.tga"
+ domain="0.05" />
+ </param>
- <driven
- id="901"
- min1="0"
- max1=".98"
- max2="1"
- min2="1" />
- </param_driver>
+ <param
+ id="1018"
+ group="1"
+ edit_group="driven"
+ wearable="pants"
+ name="Pants Length Cloth"
+ value_min="0"
+ value_max="1">
+ <param_alpha
+ tga_file="pants_length_alpha.tga"
+ domain="0.01" />
</param>
+ </layer>
+
+ <layer
+ name="lower_pants">
+ <texture
+ local_texture="lower_pants" />
<param
- id="802"
+ id="806"
group="0"
- wearable="shirt"
- edit_group="shirt"
- edit_group_order="3"
- name="Collar Front"
- show_simple="true"
- label_min="Low"
- label_max="High"
+ wearable="pants"
+ edit_group="colorpicker"
+ name="pants_red"
value_min="0"
value_max="1"
- value_default=".78"
- simple_percent_min="40"
- simple_percent_max="100"
- camera_distance="1.2"
- camera_angle="15"
- camera_elevation=".2">
- <param_driver>
- <driven
- id="602" />
-
- <driven
- id="1015" />
-
- <driven
- id="1031" />
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
- <driven
- id="902"
- min1="0"
- max1=".98"
- max2="1"
- min2="1" />
- </param_driver>
+ <value
+ color="255, 0, 0, 255" />
+ </param_color>
</param>
<param
- id="781"
+ id="807"
group="0"
- wearable="shirt"
- edit_group="shirt"
- edit_group_order="3.1"
- name="Collar Back"
- label_min="Low"
- label_max="High"
+ wearable="pants"
+ edit_group="colorpicker"
+ name="pants_green"
value_min="0"
value_max="1"
- value_default=".78"
- camera_distance="1.2"
- camera_angle="195"
- camera_elevation=".2">
- <param_driver>
- <driven
- id="778" />
-
- <driven
- id="1016" />
-
- <driven
- id="1032" />
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
- <driven
- id="903"
- min1="0"
- max1=".98"
- max2="1"
- min2="1" />
- </param_driver>
+ <value
+ color="0, 255, 0, 255" />
+ </param_color>
</param>
<param
- id="150"
+ id="808"
group="0"
- wearable="skin"
- edit_group="skin_bodydetail"
- name="Body Definition"
- label_min="Less"
- label_max="More"
+ wearable="pants"
+ edit_group="colorpicker"
+ name="pants_blue"
value_min="0"
value_max="1"
- value_default="0"
- camera_distance="1.4"
- camera_elevation="-.2">
- <param_driver>
- <driven
- id="125" />
-
- <driven
- id="126" />
-
- <driven
- id="160" />
-
- <driven
- id="161" />
-
- <driven
- id="874" />
-
- <driven
- id="878" />
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
- </param_driver>
+ <value
+ color="0, 0, 255, 255" />
+ </param_color>
</param>
<param
- id="775"
- group="0"
- wearable="skin"
- edit_group="skin_bodydetail"
- name="Body Freckles"
- label_min="Less Freckles"
- label_max="More Freckles"
+ id="614"
+ group="1"
+ edit_group="driven"
+ wearable="pants"
+ name="Waist Height Cloth"
value_min="0"
value_max="1"
- value_default="0"
- camera_distance="1.4"
- camera_elevation="-.2">
- <param_driver>
- <driven
- id="776" />
-
- <driven
- id="777" />
- </param_driver>
+ value_default=".8">
+ <param_alpha
+ tga_file="pants_waist_alpha.tga"
+ domain="0.05" />
</param>
<param
- id="162"
- group="0"
- wearable="skin"
- edit_group="skin_facedetail"
- edit_group_order="1"
- name="Facial Definition"
- label_min="Less"
- label_max="More"
+ id="615"
+ group="1"
+ edit_group="driven"
+ wearable="pants"
+ name="Pants Length Cloth"
value_min="0"
value_max="1"
- camera_distance=".3"
- camera_elevation=".07"
- value_default="0">
- <param_driver>
- <driven
- id="158" />
+ value_default=".8">
+ <param_alpha
+ tga_file="pants_length_alpha.tga"
+ domain="0.01" />
+ </param>
+ </layer>
- <driven
- id="159" />
+ <layer
+ name="lower_jacket base bump"
+ render_pass="bump"
+ fixed_color="128,128,128,255">
+ <texture
+ local_texture="lower_jacket"
+ local_texture_alpha_only="true" />
- <driven
- id="873" />
- </param_driver>
+ <param
+ id="1033"
+ group="1"
+ wearable="jacket"
+ edit_group="driven"
+ cross_wearable="true"
+ name="jacket bottom length lower bump"
+ value_min="0"
+ value_max="1">
+ <param_alpha
+ multiply_blend="false"
+ tga_file="jacket_length_lower_alpha.tga"
+ domain="0.01" />
</param>
<param
- id="163"
- group="0"
- wearable="skin"
- edit_group="skin_facedetail"
- edit_group_order="3"
- name="wrinkles"
- label_min="Less"
- label_max="More"
+ id="1034"
+ group="1"
+ wearable="jacket"
+ edit_group="driven"
+ name="jacket open lower bump"
value_min="0"
- value_max="1"
- camera_distance=".3"
- camera_elevation=".07"
- value_default="0">
- <param_driver>
-<!--<driven
- id="128" />-->
- <driven
- id="118" />
- </param_driver>
+ value_max="1">
+ <param_alpha
+ multiply_blend="true"
+ tga_file="jacket_open_lower_alpha.tga"
+ domain="0.01" />
</param>
+ </layer>
+
+ <layer
+ name="lower_jacket bump"
+ render_pass="bump">
+ <texture
+ tga_file="bump_pants_wrinkles.tga" />
+
+ <texture
+ local_texture="lower_jacket"
+ local_texture_alpha_only="true" />
+
<param
- id="505"
- group="0"
- wearable="shape"
- edit_group="shape_mouth"
- edit_group_order="3"
- name="Lip Thickness"
- label_min="Thin Lips"
- label_max="Fat Lips"
+ id="876"
+ group="1"
+ wearable="jacket"
+ name="jacket upper Wrinkles"
value_min="0"
value_max="1"
- value_default=".5"
- camera_distance=".3"
- camera_elevation=".04"
- camera_angle="20">
- <param_driver>
- <driven
- id="26"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
+ value_default="0">
+ <param_color>
+ <value
+ color="255, 255, 255, 0" />
- <driven
- id="28"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
+ <value
+ color="255, 255, 255, 255" />
+ </param_color>
</param>
<param
- id="799"
- group="0"
- wearable="shape"
- edit_group="shape_mouth"
- edit_group_order="3.2"
- name="Lip Ratio"
- label="Lip Ratio"
- show_simple="true"
- label_min="More Upper Lip"
- label_max="More Lower Lip"
+ id="1027"
+ group="1"
+ wearable="jacket"
+ edit_group="driven"
+ name="jacket bottom length lower bump"
value_min="0"
- value_max="1"
- value_default=".5"
- camera_distance=".3"
- camera_elevation=".04"
- camera_angle="20">
- <param_driver>
- <driven
- id="797"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
-
- <driven
- id="798"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
+ value_max="1">
+ <param_alpha
+ multiply_blend="false"
+ tga_file="jacket_length_lower_alpha.tga"
+ domain="0.01" />
</param>
<param
- id="155"
- group="0"
- wearable="shape"
- edit_group="shape_mouth"
- edit_group_order="1"
- name="Lip Width"
- label="Lip Width"
- label_min="Narrow Lips"
- label_max="Wide Lips"
- show_simple="true"
- value_min="-0.9"
- value_max="1.3"
- camera_distance=".3"
- camera_elevation=".04"
- value_default="0">
- <param_driver>
- <driven
- id="29" />
-
- <driven
- id="30" />
- </param_driver>
+ id="1028"
+ group="1"
+ wearable="jacket"
+ edit_group="driven"
+ name="jacket open lower bump"
+ value_min="0"
+ value_max="1">
+ <param_alpha
+ multiply_blend="true"
+ tga_file="jacket_open_lower_alpha.tga"
+ domain="0.01" />
</param>
+ </layer>
+
+ <layer
+ name="lower_jacket">
+ <texture
+ local_texture="lower_jacket" />
<param
- id="196"
- group="0"
- wearable="shape"
- edit_group="shape_eyes"
- edit_group_order="2"
- name="Eye Spacing"
- label="Eye Spacing"
- label_min="Close Set Eyes"
- label_max="Far Set Eyes"
- show_simple="true"
- value_min="-2"
+ id="809"
+ group="1"
+ edit_group="colorpicker_driven"
+ wearable="jacket"
+ name="lower_jacket_red"
+ value_min="0"
value_max="1"
- value_default="0"
- camera_elevation=".1"
- camera_distance=".35"
- camera_angle="5">
- <param_driver>
- <driven
- id="194" />
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
- <driven
- id="195" />
- </param_driver>
+ <value
+ color="255, 0, 0, 255" />
+ </param_color>
</param>
<param
- id="769"
- group="0"
- wearable="shape"
- edit_group="shape_eyes"
- edit_group_order="4.5"
- name="Eye Depth"
- label_min="Sunken Eyes"
- label_max="Bugged Eyes"
+ id="810"
+ group="1"
+ edit_group="colorpicker_driven"
+ wearable="jacket"
+ name="lower_jacket_green"
value_min="0"
value_max="1"
- value_default=".5"
- camera_elevation=".1"
- camera_distance=".3"
- camera_angle="75">
- <param_driver>
- <driven
- id="767" />
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
- <driven
- id="768" />
- </param_driver>
+ <value
+ color="0, 255, 0, 255" />
+ </param_color>
</param>
<param
- id="198"
- group="0"
- wearable="shoes"
- edit_group="shoes"
- edit_group_order="2"
- name="Heel Height"
- label_min="Low Heels"
- label_max="High Heels"
+ id="811"
+ group="1"
+ edit_group="colorpicker_driven"
+ wearable="jacket"
+ name="lower_jacket_blue"
value_min="0"
value_max="1"
- value_default="0"
- camera_angle="45"
- camera_distance=".8"
- camera_elevation="-1">
- <param_driver>
- <driven
- id="197" />
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
- <driven
- id="500" />
- </param_driver>
+ <value
+ color="0, 0, 255, 255" />
+ </param_color>
</param>
<param
- id="513"
- group="0"
- wearable="shoes"
- edit_group="shoes"
- edit_group_order="3"
- name="Heel Shape"
- label_min="Pointy Heels"
- label_max="Thick Heels"
- value_min="0"
- value_max="1"
- value_default=".5"
- camera_angle="45"
- camera_distance="1.5"
- camera_elevation="-1">
- <param_driver>
- <driven
- id="509"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
-
- <driven
- id="510"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="514"
- group="0"
- wearable="shoes"
- edit_group="shoes"
- edit_group_order="4"
- name="Toe Shape"
- label_min="Pointy"
- label_max="Square"
- value_min="0"
- value_max="1"
- value_default=".5"
- camera_angle="5"
- camera_distance=".8"
- camera_elevation="-.8">
- <param_driver>
- <driven
- id="511"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
-
- <driven
- id="512"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="503"
- group="0"
- wearable="shoes"
- edit_group="shoes"
- edit_group_order="6"
- name="Platform Height"
- label_min="Low Platforms"
- label_max="High Platforms"
+ id="621"
+ group="1"
+ wearable="jacket"
+ edit_group="jacket"
+ name="bottom length lower"
+ label_min="hi cut"
+ label_max="low cut"
value_min="0"
value_max="1"
- value_default="0"
- camera_angle="45"
- camera_distance=".5"
- camera_elevation="-1">
- <param_driver>
- <driven
- id="501" />
-
- <driven
- id="502" />
- </param_driver>
+ value_default=".8"
+ camera_distance="1.2"
+ camera_angle="30"
+ camera_elevation=".2">
+ <param_alpha
+ multiply_blend="false"
+ tga_file="jacket_length_lower_alpha.tga"
+ domain="0.01" />
</param>
<param
- id="193"
- group="0"
- wearable="shape"
- edit_group="shape_head"
- edit_group_order="3"
- name="Head Shape"
- label="Head Shape"
- label_min="More Square"
- label_max="More Round"
- show_simple="true"
- value_min="0"
- value_max="1"
- value_default=".5"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_driver>
- <driven
- id="188"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
-
- <driven
- id="642"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
-
- <driven
- id="189"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
-
- <driven
- id="643"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="157"
- group="0"
- wearable="shape"
- edit_group="shape_torso"
- edit_group_order="13"
- name="Belly Size"
- label_min="Small"
- label_max="Big"
+ id="623"
+ group="1"
+ wearable="jacket"
+ edit_group="jacket"
+ name="open lower"
+ label_min="open"
+ label_max="closed"
value_min="0"
value_max="1"
- value_default="0"
- camera_distance="1.4"
+ value_default=".8"
+ camera_distance="1.2"
camera_angle="30"
camera_elevation=".2">
- <param_driver>
- <driven
- id="104" />
+ <param_alpha
+ multiply_blend="true"
+ tga_file="jacket_open_lower_alpha.tga"
+ domain="0.01" />
+ </param>
+ </layer>
- <driven
- id="156" />
+ <layer
+ name="lower alpha"
+ visibility_mask="TRUE">
+ <texture
+ local_texture="lower_alpha" />
+ </layer>
- <driven
- id="849" />
- </param_driver>
- </param>
+ </layer_set>
- <param
- id="637"
- group="0"
- wearable="shape"
- edit_group="shape_body"
- edit_group_order="3"
- name="Body Fat"
- label_min="Less Body Fat"
- label_max="More Body Fat"
- value_min="0"
- value_max="1"
- value_default="0"
- camera_distance="1.8">
- <param_driver>
- <driven
- id="633" />
+ <!-- =========================================================== -->
+ <layer_set
+ body_region="eyes"
+ width="128"
+ height="128">
+ <layer
+ name="whites">
+ <texture
+ tga_file="eyewhite.tga" />
+ </layer>
- <driven
- id="634" />
+ <layer
+ name="iris"
+ global_color="eye_color">
+ <texture
+ local_texture="eyes_iris" />
+ </layer>
+
+ <layer
+ name="eyes alpha"
+ visibility_mask="TRUE">
+ <texture
+ local_texture="eyes_alpha" />
+ </layer>
- <driven
- id="635" />
+ </layer_set>
- <driven
- id="851" />
- </param_driver>
- </param>
+ <!-- =========================================================== -->
+ <layer_set
+ body_region="skirt"
+ width="512"
+ height="512"
+ clear_alpha="false">
+ <layer
+ name="skirt_fabric"
+ write_all_channels="true">
+ <texture
+ local_texture="skirt" />
<param
- id="130"
+ id="921"
group="0"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="8"
- name="Front Fringe"
- label_min="Short"
- label_max="Long"
+ wearable="skirt"
+ edit_group="colorpicker"
+ name="skirt_red"
value_min="0"
value_max="1"
- value_default=".45"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_driver>
- <driven
- id="144"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
- <driven
- id="145"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
+ <value
+ color="255, 0, 0, 255" />
+ </param_color>
</param>
<param
- id="131"
+ id="922"
group="0"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="9"
- name="Side Fringe"
- label_min="Short"
- label_max="Long"
- value_min="0"
- value_max="1"
- value_default=".5"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="90">
- <param_driver>
- <driven
- id="146"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
-
- <driven
- id="147"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="132"
- group="0"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="10"
- name="Back Fringe"
- label_min="Short"
- label_max="Long"
+ wearable="skirt"
+ edit_group="colorpicker"
+ name="skirt_green"
value_min="0"
value_max="1"
- value_default=".39"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="160">
- <param_driver>
- <driven
- id="148"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
- <driven
- id="149"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
+ <value
+ color="0, 255, 0, 255" />
+ </param_color>
</param>
<param
- id="133"
+ id="923"
group="0"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="2"
- name="Hair Front"
- label_min="Short"
- label_max="Long"
+ wearable="skirt"
+ edit_group="colorpicker"
+ name="skirt_blue"
value_min="0"
value_max="1"
- value_default=".25"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_driver>
- <driven
- id="172"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
- <driven
- id="171"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
+ <value
+ color="0, 0, 255, 255" />
+ </param_color>
</param>
+ </layer>
+ <layer
+ name="skirt_fabric_alpha">
<param
- id="134"
+ id="858"
group="0"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="3"
- name="Hair Sides"
- label_min="Short"
- label_max="Long"
- value_min="0"
- value_max="1"
- value_default=".5"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="90">
- <param_driver>
- <driven
- id="174"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
-
- <driven
- id="173"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="135"
- group="0"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="4"
- name="Hair Back"
- show_simple="true"
+ wearable="skirt"
+ edit_group="skirt"
+ edit_group_order="1"
+ name="Skirt Length"
+ show_simple="true"
label_min="Short"
label_max="Long"
- value_min="0"
+ value_min=".01"
value_max="1"
- value_default=".55"
- camera_elevation="-.1"
- camera_distance=".8"
- camera_angle="160">
- <param_driver>
- <driven
- id="176"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
-
- <driven
- id="175"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
+ value_default=".4"
+ simple_percent_min="40"
+ simple_percent_max="100"
+ camera_distance="1.3"
+ camera_elevation="-.5"
+ camera_angle="30">
+ <param_alpha
+ tga_file="skirt_length_alpha.tga"
+ domain="0"
+ multiply_blend="true" />
</param>
<param
- id="136"
- group="0"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="11.5"
- name="Hair Sweep"
- label_min="Sweep Forward"
- label_max="Sweep Back"
- value_min="0"
- value_max="1"
- value_default=".5"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="90">
- <param_driver>
- <driven
- id="179"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
-
- <driven
- id="178"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="137"
- group="0"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="16"
- name="Hair Tilt"
- label_min="Left"
- label_max="Right"
- value_min="0"
- value_max="1"
- value_default=".5"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="0">
- <param_driver>
- <driven
- id="190"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
-
- <driven
- id="191"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="608"
+ id="859"
group="0"
- wearable="jacket"
- edit_group="jacket"
- edit_group_order="2"
- name="bottom length lower"
- label="Jacket Length"
- label_min="Short"
- label_max="Long"
+ wearable="skirt"
+ edit_group="skirt"
+ edit_group_order="4"
+ name="Slit Front"
+ label_min="Open Front"
+ label_max="Closed Front"
value_min="0"
value_max="1"
- value_default=".8"
- camera_distance="1.4"
- camera_angle="30"
- camera_elevation=".2">
- <param_driver>
- <driven
- id="620" />
-
- <driven
- id="1025" />
-
- <driven
- id="1037" />
-
- <driven
- id="621" />
-
- <driven
- id="1027" />
-
- <driven
- id="1033" />
- </param_driver>
+ value_default="1"
+ camera_distance="1.3"
+ camera_elevation="-.5"
+ camera_angle="30">
+ <param_alpha
+ tga_file="skirt_slit_front_alpha.tga"
+ multiply_blend="true"
+ domain="0" />
</param>
<param
- id="609"
+ id="860"
group="0"
- wearable="jacket"
- edit_group="jacket"
- edit_group_order="4"
- name="open jacket"
- label="Open Front"
- label_min="Open"
- label_max="Closed"
+ wearable="skirt"
+ edit_group="skirt"
+ edit_group_order="5"
+ name="Slit Back"
+ label_min="Open Back"
+ label_max="Closed Back"
value_min="0"
value_max="1"
- value_default=".2"
- camera_distance="1.4"
- camera_angle="30"
- camera_elevation=".2">
- <param_driver>
- <driven
- id="622" />
-
- <driven
- id="1026" />
-
- <driven
- id="1038" />
-
- <driven
- id="623" />
-
- <driven
- id="1028" />
-
- <driven
- id="1034" />
- </param_driver>
+ value_default="1"
+ camera_distance="1.3"
+ camera_elevation="-.5"
+ camera_angle="160">
+ <param_alpha
+ tga_file="skirt_slit_back_alpha.tga"
+ multiply_blend="true"
+ domain="0" />
</param>
<param
- id="105"
+ id="861"
group="0"
- sex="female"
- wearable="shape"
- edit_group="shape_torso"
+ wearable="skirt"
+ edit_group="skirt"
edit_group_order="6"
- name="Breast Size"
- label_min="Small"
- label_max="Large"
+ name="Slit Left"
+ label_min="Open Left"
+ label_max="Closed Left"
value_min="0"
value_max="1"
- value_default=".5"
- camera_elevation=".3"
- camera_distance="1.2"
+ value_default="1"
+ camera_distance="1.3"
+ camera_elevation="-.5"
camera_angle="30">
- <param_driver>
- <driven
- id="843"
- min1="0"
- max1="0"
- max2="0"
- min2=".01" />
-
- <driven
- id="627"
- min1="0"
- max1="0.01"
- max2="0.01"
- min2=".5" />
-
- <driven
- id="626"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="629"
- group="0"
- wearable="shape"
- edit_group="shape_head"
- edit_group_order="6"
- name="Forehead Angle"
- label_min="More Vertical"
- label_max="More Sloped"
- value_min="0"
- value_max="1"
- value_default=".5"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="70">
- <param_driver>
- <driven
- id="630"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
-
- <driven
- id="644"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
-
- <driven
- id="631"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
-
- <driven
- id="645"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="646"
- group="0"
- name="Egg_Head"
- label="Egg Head"
- wearable="shape"
- edit_group="shape_head"
- edit_group_order="4"
- label_min="Chin Heavy"
- label_max="Forehead Heavy"
- show_simple="true"
- value_min="-1.3"
- value_max="1"
- value_default="0"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_driver>
- <driven
- id="640" />
-
- <driven
- id="186" />
- </param_driver>
- </param>
-
- <param
- id="647"
- group="0"
- name="Squash_Stretch_Head"
- label="Head Stretch"
- wearable="shape"
- edit_group="shape_head"
- edit_group_order="2"
- show_simple="true"
- label_min="Squash Head"
- label_max="Stretch Head"
- value_min="-0.5"
- value_max="1"
- value_default="0"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_driver>
- <driven
- id="641" />
-
- <driven
- id="187" />
- </param_driver>
+ <param_alpha
+ tga_file="skirt_slit_left_alpha.tga"
+ multiply_blend="true"
+ domain="0" />
</param>
<param
- id="649"
- group="0"
- sex="female"
- wearable="shape"
- edit_group="shape_torso"
- edit_group_order="1.1"
- name="Torso Muscles"
- label="Torso Muscles"
- show_simple="true"
- label_min="Less Muscular"
- label_max="More Muscular"
- value_min="0"
- value_max="1"
- value_default=".5"
- camera_elevation=".1"
- camera_distance="1"
- camera_angle="15">
- <param_driver>
- <driven
- id="648"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
-
- <driven
- id="106"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="678"
+ id="862"
group="0"
- sex="male"
- wearable="shape"
- edit_group="shape_torso"
- edit_group_order="1"
- name="Torso Muscles"
- show_simple="true"
- label_min="Less Muscular"
- label_max="More Muscular"
- value_min="0"
- value_max="1"
- value_default=".5"
- camera_elevation=".1"
- camera_distance="1.2"
- camera_angle="0">
- <param_driver>
- <driven
- id="677"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
-
- <driven
- id="106"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="652"
- group="0"
- wearable="shape"
- edit_group="shape_legs"
- edit_group_order="1"
- name="Leg Muscles"
- label_min="Less Muscular"
- label_max="More Muscular"
- show_simple="true"
+ wearable="skirt"
+ edit_group="skirt"
+ edit_group_order="7"
+ name="Slit Right"
+ label_min="Open Right"
+ label_max="Closed Right"
value_min="0"
value_max="1"
- value_default=".5"
+ value_default="1"
camera_distance="1.3"
camera_elevation="-.5"
- camera_angle="15">
- <param_driver>
- <driven
- id="651"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
-
- <driven
- id="152"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="80"
- name="male"
- group="0"
- edit_group="dummy"
- wearable="shape"
- value_min="0"
- value_max="1">
- <param_driver>
- <driven
- id="32" />
+ camera_angle="-30">
+ <param_alpha
+ tga_file="skirt_slit_right_alpha.tga"
+ multiply_blend="true"
+ domain="0" />
+ </param>
+ </layer>
- <driven
- id="153" />
+ </layer_set>
- <driven
- id="40" />
+ <!-- =========================================================== -->
+ <driver_parameters>
+ <param
+ id="828"
+ group="0"
+ name="Loose Upper Clothing"
+ label="Shirt Fit"
+ show_simple="true"
+ wearable="shirt"
+ edit_group="shirt"
+ edit_group_order="4"
+ label_min="Tight Shirt"
+ label_max="Loose Shirt"
+ value_min="0"
+ value_max="1"
+ camera_distance="1.2"
+ camera_angle="30"
+ camera_elevation=".2">
+ <param_driver>
+ <driven
+ id="628" />
+
+ <driven
+ id="899"
+ min1="0.1"
+ max1="0.5"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="100" />
+ <param
+ id="816"
+ group="0"
+ name="Loose Lower Clothing"
+ label="Pants Fit"
+ show_simple="true"
+ wearable="pants"
+ edit_group="pants"
+ edit_group_order="2.5"
+ label_min="Tight Pants"
+ label_max="Loose Pants"
+ value_min="0"
+ value_max="1"
+ camera_distance="1.8"
+ camera_angle="30"
+ camera_elevation="-.3">
+ <param_driver>
+ <driven
+ id="516" />
+
+ <driven
+ id="913"
+ min1="0.1"
+ max1="0.5"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="857" />
- </param_driver>
- </param>
+ <param
+ id="814"
+ group="0"
+ wearable="pants"
+ edit_group="pants"
+ edit_group_order="2"
+ name="Waist Height"
+ label_min="Low"
+ label_max="High"
+ value_min="0"
+ value_max="1"
+ value_default="1"
+ camera_distance="1.2"
+ camera_angle="30"
+ camera_elevation="-.3">
+ <param_driver>
+ <driven
+ id="614" />
+
+ <driven
+ id="1017" />
+
+ <driven
+ id="1033" />
+
+ <driven
+ id="914"
+ min1="0"
+ max1=".98"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <param
- id="659"
- group="0"
- wearable="shape"
- edit_group="shape_mouth"
- edit_group_order="5"
- name="Mouth Corner"
- label_min="Corner Down"
- label_max="Corner Up"
- value_min="0"
- value_max="1"
- value_default=".5"
- camera_elevation="0"
- camera_distance=".28">
- <param_driver>
- <driven
- id="658"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
-
- <driven
- id="657"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="662"
- group="0"
- wearable="shape"
- edit_group="shape_head"
- edit_group_order="5"
- name="Face Shear"
- label_min="Shear Right Up"
- label_max="Shear Left Up"
- value_min="0"
- value_max="1"
- value_default=".5"
- camera_elevation=".1"
- camera_distance=".5">
- <param_driver>
- <driven
- id="660" />
+ <param
+ id="815"
+ group="0"
+ wearable="pants"
+ edit_group="pants"
+ edit_group_order="1"
+ name="Pants Length"
+ show_simple="true"
+ label_min="Short"
+ label_max="Long"
+ value_min="0"
+ value_max="1"
+ value_default=".8"
+ simple_percent_min="20"
+ simple_percent_max="100"
+ camera_distance="1.8"
+ camera_angle="30"
+ camera_elevation="-.3">
+ <param_driver>
+ <driven
+ id="615"
+ min1="0"
+ max1=".9"
+ max2="1"
+ min2="1" />
+
+ <driven
+ id="1018"
+ min1="0"
+ max1=".9"
+ max2="1"
+ min2="1" />
+
+ <driven
+ id="1036"
+ min1="0"
+ max1=".9"
+ max2="1"
+ min2="1" />
+
+ <driven
+ id="793"
+ min1=".9"
+ max1="1"
+ max2="1"
+ min2="1" />
+
+ <driven
+ id="915"
+ min1="0"
+ max1=".882"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="661" />
+ <param
+ id="800"
+ group="0"
+ wearable="shirt"
+ edit_group="shirt"
+ edit_group_order="1"
+ name="Sleeve Length"
+ show_simple="true"
+ label_min="Short"
+ label_max="Long"
+ value_min="0"
+ value_max="1"
+ value_default=".89"
+ simple_percent_min="15"
+ simple_percent_max="100"
+ camera_distance="1.2"
+ camera_angle="30"
+ camera_elevation=".2">
+ <param_driver>
+ <driven
+ id="600" />
+
+ <driven
+ id="1013" />
+
+ <driven
+ id="1029" />
+
+ <driven
+ id="900"
+ min1="0"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="774" />
- </param_driver>
- </param>
+ <param
+ id="801"
+ group="0"
+ wearable="shirt"
+ edit_group="shirt"
+ edit_group_order="2"
+ name="Shirt Bottom"
+ label_min="Short"
+ label_max="Long"
+ value_min="0"
+ value_max="1"
+ value_default="1"
+ camera_distance="1.2"
+ camera_angle="30"
+ camera_elevation=".2">
+ <param_driver>
+ <driven
+ id="601" />
+
+ <driven
+ id="1014" />
+
+ <driven
+ id="1030" />
+
+ <driven
+ id="901"
+ min1="0"
+ max1=".98"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <param
- id="773"
- group="0"
- wearable="shape"
- edit_group="shape_head"
- edit_group_order="4.5"
- name="Head Length"
- label_min="Flat Head"
- label_max="Long Head"
- value_min="0"
- value_max="1"
- value_default=".5"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="75">
- <param_driver>
- <driven
- id="770" />
+ <param
+ id="802"
+ group="0"
+ wearable="shirt"
+ edit_group="shirt"
+ edit_group_order="3"
+ name="Collar Front"
+ show_simple="true"
+ label_min="Low"
+ label_max="High"
+ value_min="0"
+ value_max="1"
+ value_default=".78"
+ simple_percent_min="40"
+ simple_percent_max="100"
+ camera_distance="1.2"
+ camera_angle="15"
+ camera_elevation=".2">
+ <param_driver>
+ <driven
+ id="602" />
+
+ <driven
+ id="1015" />
+
+ <driven
+ id="1031" />
+
+ <driven
+ id="902"
+ min1="0"
+ max1=".98"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="771" />
+ <param
+ id="781"
+ group="0"
+ wearable="shirt"
+ edit_group="shirt"
+ edit_group_order="3.1"
+ name="Collar Back"
+ label_min="Low"
+ label_max="High"
+ value_min="0"
+ value_max="1"
+ value_default=".78"
+ camera_distance="1.2"
+ camera_angle="195"
+ camera_elevation=".2">
+ <param_driver>
+ <driven
+ id="778" />
+
+ <driven
+ id="1016" />
+
+ <driven
+ id="1032" />
+
+ <driven
+ id="903"
+ min1="0"
+ max1=".98"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="772" />
- </param_driver>
- </param>
+ <param
+ id="150"
+ group="0"
+ wearable="skin"
+ edit_group="skin_bodydetail"
+ name="Body Definition"
+ label_min="Less"
+ label_max="More"
+ value_min="0"
+ value_max="1"
+ value_default="0"
+ camera_distance="1.4"
+ camera_elevation="-.2">
+ <param_driver>
+ <driven
+ id="125" />
+
+ <driven
+ id="126" />
+
+ <driven
+ id="160" />
+
+ <driven
+ id="161" />
+
+ <driven
+ id="874" />
+
+ <driven
+ id="878" />
+
+ </param_driver>
+ </param>
- <param
- id="682"
- group="0"
- wearable="shape"
- edit_group="shape_head"
- edit_group_order="1"
- name="Head Size"
- label="Head Size"
- label_min="Small Head"
- label_max="Big Head"
- show_simple="true"
- value_min="0"
- value_max="1"
- value_default=".5"
- camera_elevation=".1"
- camera_distance=".5">
- <param_driver>
- <driven
- id="679" />
+ <param
+ id="775"
+ group="0"
+ wearable="skin"
+ edit_group="skin_bodydetail"
+ name="Body Freckles"
+ label_min="Less Freckles"
+ label_max="More Freckles"
+ value_min="0"
+ value_max="1"
+ value_default="0"
+ camera_distance="1.4"
+ camera_elevation="-.2">
+ <param_driver>
+ <driven
+ id="776" />
+
+ <driven
+ id="777" />
+ </param_driver>
+ </param>
- <driven
- id="694" />
+ <param
+ id="162"
+ group="0"
+ wearable="skin"
+ edit_group="skin_facedetail"
+ edit_group_order="1"
+ name="Facial Definition"
+ label_min="Less"
+ label_max="More"
+ value_min="0"
+ value_max="1"
+ camera_distance=".3"
+ camera_elevation=".07"
+ value_default="0">
+ <param_driver>
+ <driven
+ id="158" />
+
+ <driven
+ id="159" />
+
+ <driven
+ id="873" />
+ </param_driver>
+ </param>
- <driven
- id="680" />
+ <param
+ id="163"
+ group="0"
+ wearable="skin"
+ edit_group="skin_facedetail"
+ edit_group_order="3"
+ name="wrinkles"
+ label_min="Less"
+ label_max="More"
+ value_min="0"
+ value_max="1"
+ camera_distance=".3"
+ camera_elevation=".07"
+ value_default="0">
+ <param_driver>
+ <!--<driven
+ id="128" />-->
+ <driven
+ id="118" />
+ </param_driver>
+ </param>
- <driven
- id="681" />
+ <param
+ id="505"
+ group="0"
+ wearable="shape"
+ edit_group="shape_mouth"
+ edit_group_order="3"
+ name="Lip Thickness"
+ label_min="Thin Lips"
+ label_max="Fat Lips"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_distance=".3"
+ camera_elevation=".04"
+ camera_angle="20">
+ <param_driver>
+ <driven
+ id="26"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="28"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="655" />
- </param_driver>
- </param>
+ <param
+ id="799"
+ group="0"
+ wearable="shape"
+ edit_group="shape_mouth"
+ edit_group_order="3.2"
+ name="Lip Ratio"
+ label="Lip Ratio"
+ show_simple="true"
+ label_min="More Upper Lip"
+ label_max="More Lower Lip"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_distance=".3"
+ camera_elevation=".04"
+ camera_angle="20">
+ <param_driver>
+ <driven
+ id="797"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="798"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <param
- id="690"
- group="0"
- wearable="shape"
- edit_group="shape_eyes"
- edit_group_order="1"
- name="Eye Size"
- label="Eye Size"
- label_min="Beady Eyes"
- label_max="Anime Eyes"
- value_min="0"
- value_max="1"
- value_default=".5"
- show_simple="true"
- camera_elevation=".1"
- camera_distance=".35">
- <param_driver>
- <driven
- id="686" />
+ <param
+ id="155"
+ group="0"
+ wearable="shape"
+ edit_group="shape_mouth"
+ edit_group_order="1"
+ name="Lip Width"
+ label="Lip Width"
+ label_min="Narrow Lips"
+ label_max="Wide Lips"
+ show_simple="true"
+ value_min="-0.9"
+ value_max="1.3"
+ camera_distance=".3"
+ camera_elevation=".04"
+ value_default="0">
+ <param_driver>
+ <driven
+ id="29" />
+
+ <driven
+ id="30" />
+ </param_driver>
+ </param>
- <driven
- id="687" />
+ <param
+ id="196"
+ group="0"
+ wearable="shape"
+ edit_group="shape_eyes"
+ edit_group_order="2"
+ name="Eye Spacing"
+ label="Eye Spacing"
+ label_min="Close Set Eyes"
+ label_max="Far Set Eyes"
+ show_simple="true"
+ value_min="-2"
+ value_max="1"
+ value_default="0"
+ camera_elevation=".1"
+ camera_distance=".35"
+ camera_angle="5">
+ <param_driver>
+ <driven
+ id="194" />
+
+ <driven
+ id="195" />
+ </param_driver>
+ </param>
- <driven
- id="695" />
+ <param
+ id="769"
+ group="0"
+ wearable="shape"
+ edit_group="shape_eyes"
+ edit_group_order="4.5"
+ name="Eye Depth"
+ label_min="Sunken Eyes"
+ label_max="Bugged Eyes"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_elevation=".1"
+ camera_distance=".3"
+ camera_angle="75">
+ <param_driver>
+ <driven
+ id="767" />
+
+ <driven
+ id="768" />
+ </param_driver>
+ </param>
- <driven
- id="688" />
+ <param
+ id="198"
+ group="0"
+ wearable="shoes"
+ edit_group="shoes"
+ edit_group_order="2"
+ name="Heel Height"
+ label_min="Low Heels"
+ label_max="High Heels"
+ value_min="0"
+ value_max="1"
+ value_default="0"
+ camera_angle="45"
+ camera_distance=".8"
+ camera_elevation="-1">
+ <param_driver>
+ <driven
+ id="197" />
+
+ <driven
+ id="500" />
+ </param_driver>
+ </param>
- <driven
- id="691" />
+ <param
+ id="513"
+ group="0"
+ wearable="shoes"
+ edit_group="shoes"
+ edit_group_order="3"
+ name="Heel Shape"
+ label_min="Pointy Heels"
+ label_max="Thick Heels"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_angle="45"
+ camera_distance="1.5"
+ camera_elevation="-1">
+ <param_driver>
+ <driven
+ id="509"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="510"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="689" />
- </param_driver>
- </param>
+ <param
+ id="514"
+ group="0"
+ wearable="shoes"
+ edit_group="shoes"
+ edit_group_order="4"
+ name="Toe Shape"
+ label_min="Pointy"
+ label_max="Square"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_angle="5"
+ camera_distance=".8"
+ camera_elevation="-.8">
+ <param_driver>
+ <driven
+ id="511"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="512"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <param
- id="752"
- group="0"
- sex="male"
- wearable="hair"
- edit_group="hair_facial"
- edit_group_order="1"
- name="Hair Thickness"
- label_min="5 O'Clock Shadow"
- label_max="Bushy Hair"
- value_min="0"
- value_max="1"
- value_default=".5"
- camera_elevation="0"
- camera_distance=".28">
- <param_driver>
- <driven
- id="751"
- min1="0"
- max1="0"
- max2="0"
- min2=".2" />
-
- <driven
- id="1012"
- min1="0"
- max1="0"
- max2=".2"
- min2=".6" />
-
- <driven
- id="400"
- min1=".2"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="763"
- group="0"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="1"
- name="Hair Volume"
- show_simple="true"
- label_min="Less Volume"
- label_max="More Volume"
- value_min="0"
- value_max="1"
- value_default=".55"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="20">
- <param_driver>
- <driven
- id="761"
- min1="0"
- max1="0"
- max2="0"
- min2=".5" />
+ <param
+ id="503"
+ group="0"
+ wearable="shoes"
+ edit_group="shoes"
+ edit_group_order="6"
+ name="Platform Height"
+ label_min="Low Platforms"
+ label_max="High Platforms"
+ value_min="0"
+ value_max="1"
+ value_default="0"
+ camera_angle="45"
+ camera_distance=".5"
+ camera_elevation="-1">
+ <param_driver>
+ <driven
+ id="501" />
+
+ <driven
+ id="502" />
+ </param_driver>
+ </param>
- <driven
- id="180"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
+ <param
+ id="193"
+ group="0"
+ wearable="shape"
+ edit_group="shape_head"
+ edit_group_order="3"
+ name="Head Shape"
+ label="Head Shape"
+ label_min="More Square"
+ label_max="More Round"
+ show_simple="true"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_driver>
+ <driven
+ id="188"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="642"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="189"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+
+ <driven
+ id="643"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <param
- id="834"
- group="0"
- wearable="jacket"
- edit_group="colorpicker"
- name="jacket_red"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_driver>
- <driven
- id="809"
- min1="0"
- max1="1"
- max2="1"
- min2="1" />
+ <param
+ id="157"
+ group="0"
+ wearable="shape"
+ edit_group="shape_torso"
+ edit_group_order="13"
+ name="Belly Size"
+ label_min="Small"
+ label_max="Big"
+ value_min="0"
+ value_max="1"
+ value_default="0"
+ camera_distance="1.4"
+ camera_angle="30"
+ camera_elevation=".2">
+ <param_driver>
+ <driven
+ id="104" />
+
+ <driven
+ id="156" />
+
+ <driven
+ id="849" />
+ </param_driver>
+ </param>
- <driven
- id="831"
- min1="0"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
+ <param
+ id="637"
+ group="0"
+ wearable="shape"
+ edit_group="shape_body"
+ edit_group_order="3"
+ name="Body Fat"
+ label_min="Less Body Fat"
+ label_max="More Body Fat"
+ value_min="0"
+ value_max="1"
+ value_default="0"
+ camera_distance="1.8">
+ <param_driver>
+ <driven
+ id="633" />
+
+ <driven
+ id="634" />
+
+ <driven
+ id="635" />
+
+ <driven
+ id="851" />
+ </param_driver>
+ </param>
- <param
- id="835"
- group="0"
- wearable="jacket"
- edit_group="colorpicker"
- name="jacket_green"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_driver>
- <driven
- id="810"
- min1="0"
- max1="1"
- max2="1"
- min2="1" />
+ <param
+ id="130"
+ group="0"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="8"
+ name="Front Fringe"
+ label_min="Short"
+ label_max="Long"
+ value_min="0"
+ value_max="1"
+ value_default=".45"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_driver>
+ <driven
+ id="144"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="145"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="832"
- min1="0"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
+ <param
+ id="131"
+ group="0"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="9"
+ name="Side Fringe"
+ label_min="Short"
+ label_max="Long"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="90">
+ <param_driver>
+ <driven
+ id="146"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="147"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <param
- id="836"
- group="0"
- wearable="jacket"
- edit_group="colorpicker"
- name="jacket_blue"
- value_min="0"
- value_max="1"
- value_default="1">
- <param_driver>
- <driven
- id="811"
- min1="0"
- max1="1"
- max2="1"
- min2="1" />
+ <param
+ id="132"
+ group="0"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="10"
+ name="Back Fringe"
+ label_min="Short"
+ label_max="Long"
+ value_min="0"
+ value_max="1"
+ value_default=".39"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="160">
+ <param_driver>
+ <driven
+ id="148"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="149"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="833"
- min1="0"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
+ <param
+ id="133"
+ group="0"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="2"
+ name="Hair Front"
+ label_min="Short"
+ label_max="Long"
+ value_min="0"
+ value_max="1"
+ value_default=".25"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_driver>
+ <driven
+ id="172"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="171"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <param
- id="785"
- group="0"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="14.6"
- name="Pigtails"
- show_simple="true"
- label_min="Short Pigtails"
- label_max="Long Pigtails"
- value_min="0"
- value_max="1"
- value_default="0"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="15">
- <param_driver>
- <driven
- id="782"
- min1="0"
- max1=".10"
- max2=".10"
- min2=".5" />
-
- <driven
- id="783"
- min1=".10"
- max1=".5"
- max2=".5"
- min2=".75" />
-
- <driven
- id="790"
- min1=".5"
- max1=".75"
- max2=".75"
- min2="1" />
-
- <driven
- id="784"
- min1=".75"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="789"
- group="0"
- wearable="hair"
- edit_group="hair_style"
- edit_group_order="14.7"
- name="Ponytail"
- label_min="Short Ponytail"
- label_max="Long Ponytail"
- value_min="0"
- value_max="1"
- value_default="0"
- camera_elevation=".1"
- camera_distance=".5"
- camera_angle="180">
- <param_driver>
- <driven
- id="786"
- min1="0"
- max1=".10"
- max2=".10"
- min2=".66" />
-
- <driven
- id="787"
- min1=".10"
- max1=".66"
- max2=".66"
- min2="1" />
-
- <driven
- id="788"
- min1=".66"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="795"
- group="0"
- name="Butt Size"
- label="Butt Size"
- wearable="shape"
- edit_group="shape_legs"
- edit_group_order="4"
- label_min="Flat Butt"
- label_max="Big Butt"
- value_min="0"
- value_max="1"
- value_default=".25"
- camera_angle="180"
- camera_distance=".6">
- <param_driver>
- <driven
- id="867"
- min1="0"
- max1="0"
- max2="0"
- min2=".3" />
-
- <driven
- id="794"
- min1="0"
- max1="0"
- max2="0"
- min2=".3" />
-
- <driven
- id="151"
- min1=".3"
- max1="1"
- max2="1"
- min2="1" />
-
- <driven
- id="852"
- min1=".3"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="841"
- group="0"
- name="Bowed_Legs"
- label="Knee Angle"
- wearable="shape"
- edit_group_order="5.5"
- edit_group="shape_legs"
- label_min="Knock Kneed"
- label_max="Bow Legged"
- value_min="-1"
- value_max="1"
- value_default="0"
- camera_distance="1.3"
- camera_elevation="-.5">
- <param_driver>
- <driven
- id="853" />
+ <param
+ id="134"
+ group="0"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="3"
+ name="Hair Sides"
+ label_min="Short"
+ label_max="Long"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="90">
+ <param_driver>
+ <driven
+ id="174"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="173"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="847" />
- </param_driver>
- </param>
+ <param
+ id="135"
+ group="0"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="4"
+ name="Hair Back"
+ show_simple="true"
+ label_min="Short"
+ label_max="Long"
+ value_min="0"
+ value_max="1"
+ value_default=".55"
+ camera_elevation="-.1"
+ camera_distance=".8"
+ camera_angle="160">
+ <param_driver>
+ <driven
+ id="176"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="175"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <param
- id="753"
- group="0"
- name="Saddlebags"
- label="Saddle Bags"
- wearable="shape"
- edit_group="shape_legs"
- edit_group_order="5"
- label_min="Less Saddle"
- label_max="More Saddle"
- value_min="-0.5"
- value_max="3"
- value_default="0"
- camera_angle="0"
- camera_distance="1.2">
- <param_driver>
- <driven
- id="850" />
+ <param
+ id="136"
+ group="0"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="11.5"
+ name="Hair Sweep"
+ label_min="Sweep Forward"
+ label_max="Sweep Back"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="90">
+ <param_driver>
+ <driven
+ id="179"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="178"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="854" />
- </param_driver>
- </param>
+ <param
+ id="137"
+ group="0"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="16"
+ name="Hair Tilt"
+ label_min="Left"
+ label_max="Right"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="0">
+ <param_driver>
+ <driven
+ id="190"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="191"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <param
- id="676"
- group="0"
- name="Love_Handles"
- label="Love Handles"
- wearable="shape"
- edit_group="shape_torso"
- edit_group_order="12"
- label_min="Less Love"
- label_max="More Love"
- value_min="-1"
- value_max="2"
- value_default="0"
- camera_elevation=".3"
- camera_distance=".9">
- <param_driver>
- <driven
- id="855" />
+ <param
+ id="608"
+ group="0"
+ wearable="jacket"
+ edit_group="jacket"
+ edit_group_order="2"
+ name="bottom length lower"
+ label="Jacket Length"
+ label_min="Short"
+ label_max="Long"
+ value_min="0"
+ value_max="1"
+ value_default=".8"
+ camera_distance="1.4"
+ camera_angle="30"
+ camera_elevation=".2">
+ <param_driver>
+ <driven
+ id="620" />
+
+ <driven
+ id="1025" />
+
+ <driven
+ id="1037" />
+
+ <driven
+ id="621" />
+
+ <driven
+ id="1027" />
+
+ <driven
+ id="1033" />
+ </param_driver>
+ </param>
- <driven
- id="856" />
- </param_driver>
- </param>
+ <param
+ id="609"
+ group="0"
+ wearable="jacket"
+ edit_group="jacket"
+ edit_group_order="4"
+ name="open jacket"
+ label="Open Front"
+ label_min="Open"
+ label_max="Closed"
+ value_min="0"
+ value_max="1"
+ value_default=".2"
+ camera_distance="1.4"
+ camera_angle="30"
+ camera_elevation=".2">
+ <param_driver>
+ <driven
+ id="622" />
+
+ <driven
+ id="1026" />
+
+ <driven
+ id="1038" />
+
+ <driven
+ id="623" />
+
+ <driven
+ id="1028" />
+
+ <driven
+ id="1034" />
+ </param_driver>
+ </param>
- <param
- id="863"
- group="0"
- name="skirt_looseness"
- label="Skirt Fit"
- show_simple="true"
- clothing_morph="true"
- wearable="skirt"
- edit_group_order="2"
- edit_group="skirt"
- label_min="Tight Skirt"
- label_max="Poofy Skirt"
- value_min="0"
- value_max="1"
- value_default=".333"
- camera_distance="1.3"
- camera_elevation="-.5">
- <param_driver>
- <driven
- id="866"
- min1="0"
- max1="0"
- max2="0"
- min2=".2" />
-
- <driven
- id="846"
- min1="0"
- max1=".5"
- max2=".5"
- min2="1" />
-
- <driven
- id="845"
- min1=".5"
- max1="1"
- max2="1"
- min2="1" />
- </param_driver>
- </param>
-
- <param
- id="119"
- group="0"
- wearable="hair"
- edit_group="hair_eyebrows"
- edit_group_order="1"
- name="Eyebrow Size"
- show_simple="true"
- label_min="Thin Eyebrows"
- label_max="Bushy Eyebrows"
- value_min="0"
- value_max="1"
- value_default="0.5"
- camera_elevation=".1"
- camera_distance=".3">
- <param_driver>
- <driven
- id="1000" />
+ <param
+ id="105"
+ group="0"
+ sex="female"
+ wearable="shape"
+ edit_group="shape_torso"
+ edit_group_order="6"
+ name="Breast Size"
+ label_min="Small"
+ label_max="Large"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_elevation=".3"
+ camera_distance="1.2"
+ camera_angle="30">
+ <param_driver>
+ <driven
+ id="843"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".01" />
+
+ <driven
+ id="627"
+ min1="0"
+ max1="0.01"
+ max2="0.01"
+ min2=".5" />
+
+ <driven
+ id="626"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="1001" />
- </param_driver>
- </param>
+ <param
+ id="629"
+ group="0"
+ wearable="shape"
+ edit_group="shape_head"
+ edit_group_order="6"
+ name="Forehead Angle"
+ label_min="More Vertical"
+ label_max="More Sloped"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="70">
+ <param_driver>
+ <driven
+ id="630"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="644"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="631"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+
+ <driven
+ id="645"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <param
- id="750"
- group="0"
- wearable="hair"
- edit_group="hair_eyebrows"
- edit_group_order="2"
- name="Eyebrow Density"
- label_min="Sparse"
- label_max="Dense"
- value_min="0"
- value_max="1"
- value_default="0.7"
- camera_elevation=".1"
- camera_distance=".3">
- <param_driver>
- <driven
- id="1002" />
+ <param
+ id="646"
+ group="0"
+ name="Egg_Head"
+ label="Egg Head"
+ wearable="shape"
+ edit_group="shape_head"
+ edit_group_order="4"
+ label_min="Chin Heavy"
+ label_max="Forehead Heavy"
+ show_simple="true"
+ value_min="-1.3"
+ value_max="1"
+ value_default="0"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_driver>
+ <driven
+ id="640" />
+
+ <driven
+ id="186" />
+ </param_driver>
+ </param>
- <driven
- id="1003" />
- </param_driver>
- </param>
+ <param
+ id="647"
+ group="0"
+ name="Squash_Stretch_Head"
+ label="Head Stretch"
+ wearable="shape"
+ edit_group="shape_head"
+ edit_group_order="2"
+ show_simple="true"
+ label_min="Squash Head"
+ label_max="Stretch Head"
+ value_min="-0.5"
+ value_max="1"
+ value_default="0"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_driver>
+ <driven
+ id="641" />
+
+ <driven
+ id="187" />
+ </param_driver>
+ </param>
- <param
- id="166"
- sex="male"
- group="0"
- wearable="hair"
- edit_group="hair_facial"
- edit_group_order="2"
- name="Sideburns"
- show_simple="true"
- label_min="Short Sideburns"
- label_max="Mutton Chops"
- value_min="0"
- value_max="1"
- value_default="0.0"
- camera_elevation=".1"
- camera_distance=".3"
- camera_angle="30">
- <param_driver>
- <driven
- id="1004" />
+ <param
+ id="649"
+ group="0"
+ sex="female"
+ wearable="shape"
+ edit_group="shape_torso"
+ edit_group_order="1.1"
+ name="Torso Muscles"
+ label="Torso Muscles"
+ show_simple="true"
+ label_min="Less Muscular"
+ label_max="More Muscular"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_elevation=".1"
+ camera_distance="1"
+ camera_angle="15">
+ <param_driver>
+ <driven
+ id="648"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="106"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="1005" />
- </param_driver>
- </param>
+ <param
+ id="678"
+ group="0"
+ sex="male"
+ wearable="shape"
+ edit_group="shape_torso"
+ edit_group_order="1"
+ name="Torso Muscles"
+ show_simple="true"
+ label_min="Less Muscular"
+ label_max="More Muscular"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_elevation=".1"
+ camera_distance="1.2"
+ camera_angle="0">
+ <param_driver>
+ <driven
+ id="677"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="106"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <param
- id="167"
- sex="male"
- group="0"
- wearable="hair"
- edit_group="hair_facial"
- edit_group_order="3"
- name="Moustache"
- show_simple="true"
- label_min="Chaplin"
- label_max="Handlebars"
- value_min="0"
- value_max="1"
- value_default="0.0"
- camera_elevation=".1"
- camera_distance=".3"
- camera_angle="30">
- <param_driver>
- <driven
- id="1006" />
+ <param
+ id="652"
+ group="0"
+ wearable="shape"
+ edit_group="shape_legs"
+ edit_group_order="1"
+ name="Leg Muscles"
+ label_min="Less Muscular"
+ label_max="More Muscular"
+ show_simple="true"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_distance="1.3"
+ camera_elevation="-.5"
+ camera_angle="15">
+ <param_driver>
+ <driven
+ id="651"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="152"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="1007" />
- </param_driver>
- </param>
+ <param
+ id="80"
+ name="male"
+ group="0"
+ edit_group="dummy"
+ wearable="shape"
+ value_min="0"
+ value_max="1">
+ <param_driver>
+ <driven
+ id="32" />
+
+ <driven
+ id="153" />
+
+ <driven
+ id="40" />
+
+ <driven
+ id="100" />
+
+ <driven
+ id="857" />
+ </param_driver>
+ </param>
- <param
- id="168"
- sex="male"
- group="0"
- wearable="hair"
- edit_group="hair_facial"
- edit_group_order="5"
- name="Soulpatch"
- show_simple="true"
- label_min="Less soul"
- label_max="More soul"
- value_min="0"
- value_max="1"
- value_default="0.0"
- camera_elevation="-.1"
- camera_distance=".3"
- camera_angle="0">
- <param_driver>
- <driven
- id="1008" />
+ <param
+ id="659"
+ group="0"
+ wearable="shape"
+ edit_group="shape_mouth"
+ edit_group_order="5"
+ name="Mouth Corner"
+ label_min="Corner Down"
+ label_max="Corner Up"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_elevation="0"
+ camera_distance=".28">
+ <param_driver>
+ <driven
+ id="658"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="657"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="1009" />
- </param_driver>
- </param>
+ <param
+ id="662"
+ group="0"
+ wearable="shape"
+ edit_group="shape_head"
+ edit_group_order="5"
+ name="Face Shear"
+ label_min="Shear Right Up"
+ label_max="Shear Left Up"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_elevation=".1"
+ camera_distance=".5">
+ <param_driver>
+ <driven
+ id="660" />
+
+ <driven
+ id="661" />
+
+ <driven
+ id="774" />
+ </param_driver>
+ </param>
- <param
- id="169"
- sex="male"
- group="0"
- wearable="hair"
- edit_group="hair_facial"
- edit_group_order="4"
- name="Chin Curtains"
- show_simple="true"
- label_min="Less Curtains"
- label_max="More Curtains"
- value_min="0"
- value_max="1"
- value_default="0.0"
- camera_elevation="-.1"
- camera_distance=".3"
- camera_angle="45">
- <param_driver>
- <driven
- id="1010" />
+ <param
+ id="773"
+ group="0"
+ wearable="shape"
+ edit_group="shape_head"
+ edit_group_order="4.5"
+ name="Head Length"
+ label_min="Flat Head"
+ label_max="Long Head"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="75">
+ <param_driver>
+ <driven
+ id="770" />
+
+ <driven
+ id="771" />
+
+ <driven
+ id="772" />
+ </param_driver>
+ </param>
- <driven
- id="1011" />
- </param_driver>
- </param>
+ <param
+ id="682"
+ group="0"
+ wearable="shape"
+ edit_group="shape_head"
+ edit_group_order="1"
+ name="Head Size"
+ label="Head Size"
+ label_min="Small Head"
+ label_max="Big Head"
+ show_simple="true"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_elevation=".1"
+ camera_distance=".5">
+ <param_driver>
+ <driven
+ id="679" />
+
+ <driven
+ id="694" />
+
+ <driven
+ id="680" />
+
+ <driven
+ id="681" />
+
+ <driven
+ id="655" />
+ </param_driver>
+ </param>
- <param
- id="606"
- group="0"
- wearable="jacket"
- edit_group="jacket"
- edit_group_order="1"
- name="Sleeve Length"
- label_min="Short"
- label_max="Long"
- value_min="0"
- value_max="1"
- value_default=".8"
- camera_distance="1.2"
- camera_angle="30"
- camera_elevation=".2">
- <param_driver>
- <driven
- id="1019" />
+ <param
+ id="690"
+ group="0"
+ wearable="shape"
+ edit_group="shape_eyes"
+ edit_group_order="1"
+ name="Eye Size"
+ label="Eye Size"
+ label_min="Beady Eyes"
+ label_max="Anime Eyes"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ show_simple="true"
+ camera_elevation=".1"
+ camera_distance=".35">
+ <param_driver>
+ <driven
+ id="686" />
+
+ <driven
+ id="687" />
+
+ <driven
+ id="695" />
+
+ <driven
+ id="688" />
+
+ <driven
+ id="691" />
+
+ <driven
+ id="689" />
+ </param_driver>
+ </param>
- <driven
- id="1039" />
+ <param
+ id="752"
+ group="0"
+ sex="male"
+ wearable="hair"
+ edit_group="hair_facial"
+ edit_group_order="1"
+ name="Hair Thickness"
+ label_min="5 O'Clock Shadow"
+ label_max="Bushy Hair"
+ value_min="0"
+ value_max="1"
+ value_default=".5"
+ camera_elevation="0"
+ camera_distance=".28">
+ <param_driver>
+ <driven
+ id="751"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".2" />
+
+ <driven
+ id="1012"
+ min1="0"
+ max1="0"
+ max2=".2"
+ min2=".6" />
+
+ <driven
+ id="400"
+ min1=".2"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="1020" />
- </param_driver>
- </param>
+ <param
+ id="763"
+ group="0"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="1"
+ name="Hair Volume"
+ show_simple="true"
+ label_min="Less Volume"
+ label_max="More Volume"
+ value_min="0"
+ value_max="1"
+ value_default=".55"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="20">
+ <param_driver>
+ <driven
+ id="761"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="180"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <param
- id="607"
- group="0"
- wearable="jacket"
- edit_group="jacket"
- edit_group_order="3"
- name="Collar Front"
- label_min="Low"
- label_max="High"
- value_min="0"
- value_max="1"
- value_default=".8"
- camera_distance="1.2"
- camera_angle="15"
- camera_elevation=".2">
- <param_driver>
- <driven
- id="1021" />
+ <param
+ id="834"
+ group="0"
+ wearable="jacket"
+ edit_group="colorpicker"
+ name="jacket_red"
+ value_min="0"
+ value_max="1"
+ value_default="1">
+ <param_driver>
+ <driven
+ id="809"
+ min1="0"
+ max1="1"
+ max2="1"
+ min2="1" />
+
+ <driven
+ id="831"
+ min1="0"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="1040" />
+ <param
+ id="835"
+ group="0"
+ wearable="jacket"
+ edit_group="colorpicker"
+ name="jacket_green"
+ value_min="0"
+ value_max="1"
+ value_default="1">
+ <param_driver>
+ <driven
+ id="810"
+ min1="0"
+ max1="1"
+ max2="1"
+ min2="1" />
+
+ <driven
+ id="832"
+ min1="0"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="1022" />
- </param_driver>
- </param>
+ <param
+ id="836"
+ group="0"
+ wearable="jacket"
+ edit_group="colorpicker"
+ name="jacket_blue"
+ value_min="0"
+ value_max="1"
+ value_default="1">
+ <param_driver>
+ <driven
+ id="811"
+ min1="0"
+ max1="1"
+ max2="1"
+ min2="1" />
+
+ <driven
+ id="833"
+ min1="0"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <param
- id="780"
- group="0"
- wearable="jacket"
- edit_group="jacket"
- edit_group_order="3.5"
- name="Collar Back"
- label_min="Low"
- label_max="High"
- value_min="0"
- value_max="1"
- value_default=".8"
- camera_distance="1.2"
- camera_angle="195"
- camera_elevation=".2">
- <param_driver>
- <driven
- id="1023" />
+ <param
+ id="785"
+ group="0"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="14.6"
+ name="Pigtails"
+ show_simple="true"
+ label_min="Short Pigtails"
+ label_max="Long Pigtails"
+ value_min="0"
+ value_max="1"
+ value_default="0"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="15">
+ <param_driver>
+ <driven
+ id="782"
+ min1="0"
+ max1=".10"
+ max2=".10"
+ min2=".5" />
+
+ <driven
+ id="783"
+ min1=".10"
+ max1=".5"
+ max2=".5"
+ min2=".75" />
+
+ <driven
+ id="790"
+ min1=".5"
+ max1=".75"
+ max2=".75"
+ min2="1" />
+
+ <driven
+ id="784"
+ min1=".75"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="1041" />
+ <param
+ id="789"
+ group="0"
+ wearable="hair"
+ edit_group="hair_style"
+ edit_group_order="14.7"
+ name="Ponytail"
+ label_min="Short Ponytail"
+ label_max="Long Ponytail"
+ value_min="0"
+ value_max="1"
+ value_default="0"
+ camera_elevation=".1"
+ camera_distance=".5"
+ camera_angle="180">
+ <param_driver>
+ <driven
+ id="786"
+ min1="0"
+ max1=".10"
+ max2=".10"
+ min2=".66" />
+
+ <driven
+ id="787"
+ min1=".10"
+ max1=".66"
+ max2=".66"
+ min2="1" />
+
+ <driven
+ id="788"
+ min1=".66"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <driven
- id="1024" />
- </param_driver>
- </param>
+ <param
+ id="795"
+ group="0"
+ name="Butt Size"
+ label="Butt Size"
+ wearable="shape"
+ edit_group="shape_legs"
+ edit_group_order="4"
+ label_min="Flat Butt"
+ label_max="Big Butt"
+ value_min="0"
+ value_max="1"
+ value_default=".25"
+ camera_angle="180"
+ camera_distance=".6">
+ <param_driver>
+ <driven
+ id="867"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".3" />
+
+ <driven
+ id="794"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".3" />
+
+ <driven
+ id="151"
+ min1=".3"
+ max1="1"
+ max2="1"
+ min2="1" />
+
+ <driven
+ id="852"
+ min1=".3"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <param
- id="603"
- group="0"
- wearable="undershirt"
- edit_group="undershirt"
- edit_group_order="1"
- name="Sleeve Length"
- label_min="Short"
- label_max="Long"
- value_min=".01"
- value_max="1"
- value_default=".4"
- camera_distance="1.2"
- camera_angle="30"
- camera_elevation=".2">
- <param_driver>
- <driven
- id="1042" />
+ <param
+ id="841"
+ group="0"
+ name="Bowed_Legs"
+ label="Knee Angle"
+ wearable="shape"
+ edit_group_order="5.5"
+ edit_group="shape_legs"
+ label_min="Knock Kneed"
+ label_max="Bow Legged"
+ value_min="-1"
+ value_max="1"
+ value_default="0"
+ camera_distance="1.3"
+ camera_elevation="-.5">
+ <param_driver>
+ <driven
+ id="853" />
+
+ <driven
+ id="847" />
+ </param_driver>
+ </param>
- <driven
- id="1043" />
- </param_driver>
- </param>
+ <param
+ id="753"
+ group="0"
+ name="Saddlebags"
+ label="Saddle Bags"
+ wearable="shape"
+ edit_group="shape_legs"
+ edit_group_order="5"
+ label_min="Less Saddle"
+ label_max="More Saddle"
+ value_min="-0.5"
+ value_max="3"
+ value_default="0"
+ camera_angle="0"
+ camera_distance="1.2">
+ <param_driver>
+ <driven
+ id="850" />
+
+ <driven
+ id="854" />
+ </param_driver>
+ </param>
- <param
- id="604"
- group="0"
- wearable="undershirt"
- edit_group="undershirt"
- edit_group_order="2"
- name="Bottom"
- label_min="Short"
- label_max="Long"
- value_min="0"
- value_max="1"
- value_default=".85"
- camera_distance="1.2"
- camera_angle="30"
- camera_elevation=".2">
- <param_driver>
- <driven
- id="1044" />
+ <param
+ id="676"
+ group="0"
+ name="Love_Handles"
+ label="Love Handles"
+ wearable="shape"
+ edit_group="shape_torso"
+ edit_group_order="12"
+ label_min="Less Love"
+ label_max="More Love"
+ value_min="-1"
+ value_max="2"
+ value_default="0"
+ camera_elevation=".3"
+ camera_distance=".9">
+ <param_driver>
+ <driven
+ id="855" />
+
+ <driven
+ id="856" />
+ </param_driver>
+ </param>
- <driven
- id="1045" />
- </param_driver>
- </param>
+ <param
+ id="863"
+ group="0"
+ name="skirt_looseness"
+ label="Skirt Fit"
+ show_simple="true"
+ clothing_morph="true"
+ wearable="skirt"
+ edit_group_order="2"
+ edit_group="skirt"
+ label_min="Tight Skirt"
+ label_max="Poofy Skirt"
+ value_min="0"
+ value_max="1"
+ value_default=".333"
+ camera_distance="1.3"
+ camera_elevation="-.5">
+ <param_driver>
+ <driven
+ id="866"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".2" />
+
+ <driven
+ id="846"
+ min1="0"
+ max1=".5"
+ max2=".5"
+ min2="1" />
+
+ <driven
+ id="845"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
- <param
- id="605"
- group="0"
- wearable="undershirt"
- edit_group="undershirt"
- edit_group_order="3"
- name="Collar Front"
- label_min="Low"
- label_max="High"
- value_min="0"
- value_max="1"
- value_default=".84"
- camera_distance=".8"
- camera_angle="15"
- camera_elevation=".2">
- <param_driver>
- <driven
- id="1046" />
+ <param
+ id="119"
+ group="0"
+ wearable="hair"
+ edit_group="hair_eyebrows"
+ edit_group_order="1"
+ name="Eyebrow Size"
+ show_simple="true"
+ label_min="Thin Eyebrows"
+ label_max="Bushy Eyebrows"
+ value_min="0"
+ value_max="1"
+ value_default="0.5"
+ camera_elevation=".1"
+ camera_distance=".3">
+ <param_driver>
+ <driven
+ id="1000" />
+
+ <driven
+ id="1001" />
+ </param_driver>
+ </param>
- <driven
- id="1047" />
- </param_driver>
- </param>
+ <param
+ id="750"
+ group="0"
+ wearable="hair"
+ edit_group="hair_eyebrows"
+ edit_group_order="2"
+ name="Eyebrow Density"
+ label_min="Sparse"
+ label_max="Dense"
+ value_min="0"
+ value_max="1"
+ value_default="0.7"
+ camera_elevation=".1"
+ camera_distance=".3">
+ <param_driver>
+ <driven
+ id="1002" />
+
+ <driven
+ id="1003" />
+ </param_driver>
+ </param>
- <param
- id="779"
- group="0"
- wearable="undershirt"
- edit_group="undershirt"
- edit_group_order="4"
- name="Collar Back"
- label_min="Low"
- label_max="High"
- value_min="0"
- value_max="1"
- value_default=".84"
- camera_distance=".8"
- camera_angle="195"
- camera_elevation=".2">
- <param_driver>
- <driven
- id="1048" />
+ <param
+ id="166"
+ sex="male"
+ group="0"
+ wearable="hair"
+ edit_group="hair_facial"
+ edit_group_order="2"
+ name="Sideburns"
+ show_simple="true"
+ label_min="Short Sideburns"
+ label_max="Mutton Chops"
+ value_min="0"
+ value_max="1"
+ value_default="0.0"
+ camera_elevation=".1"
+ camera_distance=".3"
+ camera_angle="30">
+ <param_driver>
+ <driven
+ id="1004" />
+
+ <driven
+ id="1005" />
+ </param_driver>
+ </param>
- <driven
- id="1049" />
- </param_driver>
- </param>
+ <param
+ id="167"
+ sex="male"
+ group="0"
+ wearable="hair"
+ edit_group="hair_facial"
+ edit_group_order="3"
+ name="Moustache"
+ show_simple="true"
+ label_min="Chaplin"
+ label_max="Handlebars"
+ value_min="0"
+ value_max="1"
+ value_default="0.0"
+ camera_elevation=".1"
+ camera_distance=".3"
+ camera_angle="30">
+ <param_driver>
+ <driven
+ id="1006" />
+
+ <driven
+ id="1007" />
+ </param_driver>
+ </param>
- <param
- id="617"
- group="0"
- wearable="socks"
- edit_group="socks"
- name="Socks Length"
- label_min="Short"
- label_max="Long"
- value_min="0"
- value_max="1"
- value_default="0.35"
- camera_distance=".95"
- camera_angle="30"
- camera_elevation="-.75">
- <param_driver>
- <driven
- id="1050" />
+ <param
+ id="168"
+ sex="male"
+ group="0"
+ wearable="hair"
+ edit_group="hair_facial"
+ edit_group_order="5"
+ name="Soulpatch"
+ show_simple="true"
+ label_min="Less soul"
+ label_max="More soul"
+ value_min="0"
+ value_max="1"
+ value_default="0.0"
+ camera_elevation="-.1"
+ camera_distance=".3"
+ camera_angle="0">
+ <param_driver>
+ <driven
+ id="1008" />
+
+ <driven
+ id="1009" />
+ </param_driver>
+ </param>
- <driven
- id="1051" />
- </param_driver>
- </param>
+ <param
+ id="169"
+ sex="male"
+ group="0"
+ wearable="hair"
+ edit_group="hair_facial"
+ edit_group_order="4"
+ name="Chin Curtains"
+ show_simple="true"
+ label_min="Less Curtains"
+ label_max="More Curtains"
+ value_min="0"
+ value_max="1"
+ value_default="0.0"
+ camera_elevation="-.1"
+ camera_distance=".3"
+ camera_angle="45">
+ <param_driver>
+ <driven
+ id="1010" />
+
+ <driven
+ id="1011" />
+ </param_driver>
+ </param>
- <param
- id="616"
- group="0"
- wearable="shoes"
- edit_group="shoes"
- edit_group_order="1"
- name="Shoe Height"
- label_min="Short"
- label_max="Tall"
- value_min="0"
- value_max="1"
- value_default="0.1"
- camera_distance="1.2"
- camera_angle="30"
- camera_elevation="-.75">
- <param_driver>
- <driven
- id="1052" />
+ <param
+ id="606"
+ group="0"
+ wearable="jacket"
+ edit_group="jacket"
+ edit_group_order="1"
+ name="Sleeve Length"
+ label_min="Short"
+ label_max="Long"
+ value_min="0"
+ value_max="1"
+ value_default=".8"
+ camera_distance="1.2"
+ camera_angle="30"
+ camera_elevation=".2">
+ <param_driver>
+ <driven
+ id="1019" />
+
+ <driven
+ id="1039" />
+
+ <driven
+ id="1020" />
+ </param_driver>
+ </param>
- <driven
- id="1053" />
- </param_driver>
- </param>
+ <param
+ id="607"
+ group="0"
+ wearable="jacket"
+ edit_group="jacket"
+ edit_group_order="3"
+ name="Collar Front"
+ label_min="Low"
+ label_max="High"
+ value_min="0"
+ value_max="1"
+ value_default=".8"
+ camera_distance="1.2"
+ camera_angle="15"
+ camera_elevation=".2">
+ <param_driver>
+ <driven
+ id="1021" />
+
+ <driven
+ id="1040" />
+
+ <driven
+ id="1022" />
+ </param_driver>
+ </param>
- <param
- id="619"
- group="0"
- wearable="underpants"
- edit_group="underpants"
- name="Pants Length"
- label_min="Short"
- label_max="Long"
- value_min="0"
- value_max="1"
- value_default=".3"
- camera_distance="1.2"
- camera_angle="30"
- camera_elevation="-.3">
- <param_driver>
- <driven
- id="1054" />
+ <param
+ id="780"
+ group="0"
+ wearable="jacket"
+ edit_group="jacket"
+ edit_group_order="3.5"
+ name="Collar Back"
+ label_min="Low"
+ label_max="High"
+ value_min="0"
+ value_max="1"
+ value_default=".8"
+ camera_distance="1.2"
+ camera_angle="195"
+ camera_elevation=".2">
+ <param_driver>
+ <driven
+ id="1023" />
+
+ <driven
+ id="1041" />
+
+ <driven
+ id="1024" />
+ </param_driver>
+ </param>
- <driven
- id="1055" />
- </param_driver>
- </param>
+ <param
+ id="603"
+ group="0"
+ wearable="undershirt"
+ edit_group="undershirt"
+ edit_group_order="1"
+ name="Sleeve Length"
+ label_min="Short"
+ label_max="Long"
+ value_min=".01"
+ value_max="1"
+ value_default=".4"
+ camera_distance="1.2"
+ camera_angle="30"
+ camera_elevation=".2">
+ <param_driver>
+ <driven
+ id="1042" />
+
+ <driven
+ id="1043" />
+ </param_driver>
+ </param>
- <param
- id="624"
- group="0"
- wearable="underpants"
- edit_group="underpants"
- name="Pants Waist"
- label_min="Low"
- label_max="High"
- value_min="0"
- value_max="1"
- value_default=".8"
- camera_distance="1.2"
- camera_angle="30"
- camera_elevation="-.3">
- <param_driver>
- <driven
- id="1056" />
+ <param
+ id="604"
+ group="0"
+ wearable="undershirt"
+ edit_group="undershirt"
+ edit_group_order="2"
+ name="Bottom"
+ label_min="Short"
+ label_max="Long"
+ value_min="0"
+ value_max="1"
+ value_default=".85"
+ camera_distance="1.2"
+ camera_angle="30"
+ camera_elevation=".2">
+ <param_driver>
+ <driven
+ id="1044" />
+
+ <driven
+ id="1045" />
+ </param_driver>
+ </param>
- <driven
- id="1057" />
- </param_driver>
- </param>
+ <param
+ id="605"
+ group="0"
+ wearable="undershirt"
+ edit_group="undershirt"
+ edit_group_order="3"
+ name="Collar Front"
+ label_min="Low"
+ label_max="High"
+ value_min="0"
+ value_max="1"
+ value_default=".84"
+ camera_distance=".8"
+ camera_angle="15"
+ camera_elevation=".2">
+ <param_driver>
+ <driven
+ id="1046" />
+
+ <driven
+ id="1047" />
+ </param_driver>
+ </param>
- <param
- id="93"
- group="0"
- wearable="gloves"
- edit_group="gloves"
- name="Glove Length"
- label_min="Short"
- label_max="Long"
- value_min=".01"
- value_max="1"
- value_default=".8"
- camera_distance="1.2"
- camera_angle="30"
- camera_elevation=".2">
- <param_driver>
- <driven
- id="1058" />
+ <param
+ id="779"
+ group="0"
+ wearable="undershirt"
+ edit_group="undershirt"
+ edit_group_order="4"
+ name="Collar Back"
+ label_min="Low"
+ label_max="High"
+ value_min="0"
+ value_max="1"
+ value_default=".84"
+ camera_distance=".8"
+ camera_angle="195"
+ camera_elevation=".2">
+ <param_driver>
+ <driven
+ id="1048" />
+
+ <driven
+ id="1049" />
+ </param_driver>
+ </param>
- <driven
- id="1059" />
- </param_driver>
- </param>
+ <param
+ id="617"
+ group="0"
+ wearable="socks"
+ edit_group="socks"
+ name="Socks Length"
+ label_min="Short"
+ label_max="Long"
+ value_min="0"
+ value_max="1"
+ value_default="0.35"
+ camera_distance=".95"
+ camera_angle="30"
+ camera_elevation="-.75">
+ <param_driver>
+ <driven
+ id="1050" />
+
+ <driven
+ id="1051" />
+ </param_driver>
+ </param>
- <param
- id="844"
- group="0"
- wearable="gloves"
- edit_group="gloves"
- name="Glove Fingers"
- label_min="Fingerless"
- label_max="Fingers"
- value_min=".01"
- value_max="1"
- value_default="1"
- camera_distance="1.2"
- camera_angle="30"
- camera_elevation=".2">
- <param_driver>
- <driven
- id="1060" />
+ <param
+ id="616"
+ group="0"
+ wearable="shoes"
+ edit_group="shoes"
+ edit_group_order="1"
+ name="Shoe Height"
+ label_min="Short"
+ label_max="Tall"
+ value_min="0"
+ value_max="1"
+ value_default="0.1"
+ camera_distance="1.2"
+ camera_angle="30"
+ camera_elevation="-.75">
+ <param_driver>
+ <driven
+ id="1052" />
+
+ <driven
+ id="1053" />
+ </param_driver>
+ </param>
- <driven
- id="1061" />
- </param_driver>
- </param>
+ <param
+ id="619"
+ group="0"
+ wearable="underpants"
+ edit_group="underpants"
+ name="Pants Length"
+ label_min="Short"
+ label_max="Long"
+ value_min="0"
+ value_max="1"
+ value_default=".3"
+ camera_distance="1.2"
+ camera_angle="30"
+ camera_elevation="-.3">
+ <param_driver>
+ <driven
+ id="1054" />
+
+ <driven
+ id="1055" />
+ </param_driver>
+ </param>
-<!--Pointy eyebrows became a driver/driven param with new max value for backwards compatibility between 1.0 and 1.1-->
- <param
- id="16"
- group="0"
- name="Pointy_Eyebrows"
- label="Eyebrow Points"
- wearable="hair"
- edit_group="hair_eyebrows"
- edit_group_order="4"
- label_min="Smooth"
- label_max="Pointy"
- value_min="-.5"
- value_max="3"
- camera_elevation=".1"
- camera_distance=".3">
- <param_driver>
- <driven
- id="870" />
- </param_driver>
- </param>
+ <param
+ id="624"
+ group="0"
+ wearable="underpants"
+ edit_group="underpants"
+ name="Pants Waist"
+ label_min="Low"
+ label_max="High"
+ value_min="0"
+ value_max="1"
+ value_default=".8"
+ camera_distance="1.2"
+ camera_angle="30"
+ camera_elevation="-.3">
+ <param_driver>
+ <driven
+ id="1056" />
+
+ <driven
+ id="1057" />
+ </param_driver>
+ </param>
-<!--Lower eyebrows became a driver/driven param with new min value for backwards compatibility between 1.0 and 1.1-->
- <param
- id="757"
- group="0"
- name="Lower_Eyebrows"
- label="Eyebrow Height"
- show_simple="true"
- wearable="hair"
- edit_group="hair_eyebrows"
- edit_group_order="2.5"
- label_min="Higher"
- label_max="Lower"
- value_min="-4"
- value_max="2"
- value_default="-1"
- camera_elevation=".1"
- camera_distance=".3">
- <param_driver>
- <driven
- id="871" />
- </param_driver>
- </param>
+ <param
+ id="93"
+ group="0"
+ wearable="gloves"
+ edit_group="gloves"
+ name="Glove Length"
+ label_min="Short"
+ label_max="Long"
+ value_min=".01"
+ value_max="1"
+ value_default=".8"
+ camera_distance="1.2"
+ camera_angle="30"
+ camera_elevation=".2">
+ <param_driver>
+ <driven
+ id="1058" />
+
+ <driven
+ id="1059" />
+ </param_driver>
+ </param>
-<!--Arced eyebrows became a driver/driven param with new max value for backwards compatibility between 1.0 and 1.1-->
- <param
- id="31"
- group="0"
- name="Arced_Eyebrows"
- label="Eyebrow Arc"
- wearable="hair"
- edit_group="hair_eyebrows"
- edit_group_order="3"
- label_min="Flat"
- label_max="Arced"
- value_min="0"
- value_max="2"
- value_default=".5"
- camera_elevation=".1"
- camera_distance=".3">
- <param_driver>
- <driven
- id="872" />
- </param_driver>
- </param>
+ <param
+ id="844"
+ group="0"
+ wearable="gloves"
+ edit_group="gloves"
+ name="Glove Fingers"
+ label_min="Fingerless"
+ label_max="Fingers"
+ value_min=".01"
+ value_max="1"
+ value_default="1"
+ camera_distance="1.2"
+ camera_angle="30"
+ camera_elevation=".2">
+ <param_driver>
+ <driven
+ id="1060" />
+
+ <driven
+ id="1061" />
+ </param_driver>
+ </param>
+
+ <!--Pointy eyebrows became a driver/driven param with new max value for backwards compatibility between 1.0 and 1.1-->
+ <param
+ id="16"
+ group="0"
+ name="Pointy_Eyebrows"
+ label="Eyebrow Points"
+ wearable="hair"
+ edit_group="hair_eyebrows"
+ edit_group_order="4"
+ label_min="Smooth"
+ label_max="Pointy"
+ value_min="-.5"
+ value_max="3"
+ camera_elevation=".1"
+ camera_distance=".3">
+ <param_driver>
+ <driven
+ id="870" />
+ </param_driver>
+ </param>
+
+ <!--Lower eyebrows became a driver/driven param with new min value for backwards compatibility between 1.0 and 1.1-->
+ <param
+ id="757"
+ group="0"
+ name="Lower_Eyebrows"
+ label="Eyebrow Height"
+ show_simple="true"
+ wearable="hair"
+ edit_group="hair_eyebrows"
+ edit_group_order="2.5"
+ label_min="Higher"
+ label_max="Lower"
+ value_min="-4"
+ value_max="2"
+ value_default="-1"
+ camera_elevation=".1"
+ camera_distance=".3">
+ <param_driver>
+ <driven
+ id="871" />
+ </param_driver>
+ </param>
+
+ <!--Arced eyebrows became a driver/driven param with new max value for backwards compatibility between 1.0 and 1.1-->
+ <param
+ id="31"
+ group="0"
+ name="Arced_Eyebrows"
+ label="Eyebrow Arc"
+ wearable="hair"
+ edit_group="hair_eyebrows"
+ edit_group_order="3"
+ label_min="Flat"
+ label_max="Arced"
+ value_min="0"
+ value_max="2"
+ value_default=".5"
+ camera_elevation=".1"
+ camera_distance=".3">
+ <param_driver>
+ <driven
+ id="872" />
+ </param_driver>
+ </param>
- <param
- id="877"
- group="0"
- name="Jacket Wrinkles"
- label="Jacket Wrinkles"
- wearable="jacket"
- edit_group="jacket"
- edit_group_order="20"
- label_min="No Wrinkles"
- label_max="Wrinkles"
- value_min="0"
- value_max="1"
- value_default="0"
- camera_elevation=".1"
- camera_distance=".3">
- <param_driver>
- <driven
- id="875" />
+
+ <param
+ id="877"
+ group="0"
+ name="Jacket Wrinkles"
+ label="Jacket Wrinkles"
+ wearable="jacket"
+ edit_group="jacket"
+ edit_group_order="20"
+ label_min="No Wrinkles"
+ label_max="Wrinkles"
+ value_min="0"
+ value_max="1"
+ value_default="0"
+ camera_elevation=".1"
+ camera_distance=".3">
+ <param_driver>
+ <driven
+ id="875" />
- <driven
- id="876" />
- </param_driver>
- </param>
+
+ <driven
+ id="876" />
+ </param_driver>
+ </param>
- </driver_parameters>
+
+ </driver_parameters>
<morph_masks>
<mask
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 41aeeee82a..fa60c5afc1 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -6320,8 +6320,8 @@ void LLAgent::sendAgentSetAppearance()
continue;
}
- // IMG_DEFAULT_AVATAR means not baked
- if (!mAvatarObject->isTextureDefined(texture_index))
+ // IMG_DEFAULT_AVATAR means not baked. 0 index should be ignored for baked textures
+ if (!mAvatarObject->isTextureDefined(texture_index, 0))
{
textures_current = FALSE;
break;
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 2cfa8d2a54..a26b799d3d 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -46,6 +46,7 @@
#include "llwearablelist.h"
#include "llgesturemgr.h"
#include "llappearancemgr.h"
+#include "lltexlayer.h"
#include <boost/scoped_ptr.hpp>
@@ -65,11 +66,10 @@ public:
struct InitialWearableData
{
EWearableType mType;
- U32 mIndex;
LLUUID mItemID;
LLUUID mAssetID;
- InitialWearableData(EWearableType type, U32 index, LLUUID itemID, LLUUID assetID) :
- mType(type), mIndex(index), mItemID(itemID), mAssetID(assetID) { }
+ InitialWearableData(EWearableType type, LLUUID itemID, LLUUID assetID) :
+ mType(type), mItemID(itemID), mAssetID(assetID) { }
};
typedef std::vector<InitialWearableData> initial_wearable_data_vec_t;
@@ -139,11 +139,6 @@ LLAgentWearables::LLAgentWearables() :
mWearablesLoaded(FALSE),
mAvatarObject(NULL)
{
- // MULTI-WEARABLE: TODO remove null entries.
- for (U32 i = 0; i < WT_COUNT; i++)
- {
- mWearableDatas[(EWearableType)i].push_back(NULL);
- }
}
LLAgentWearables::~LLAgentWearables()
@@ -237,10 +232,16 @@ void LLAgentWearables::addWearabletoAgentInventoryDone(const S32 type,
{
wearable->setItemID(item_id);
}
- setWearable((EWearableType)type,index,wearable);
if (old_item_id.notNull())
+ {
gInventory.addChangedMask(LLInventoryObserver::LABEL, old_item_id);
+ setWearable((EWearableType)type,index,wearable);
+ }
+ else
+ {
+ pushWearable((EWearableType)type,wearable);
+ }
gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
LLViewerInventoryItem* item = gInventory.getItem(item_id);
if (item && wearable)
@@ -260,11 +261,11 @@ void LLAgentWearables::sendAgentWearablesUpdate()
{
// MULTI-WEARABLE: call i "type" or something.
// First make sure that we have inventory items for each wearable
- for (S32 i=0; i < WT_COUNT; ++i)
+ for (S32 type=0; type < WT_COUNT; ++type)
{
- for (U32 j=0; j < getWearableCount((EWearableType)i); j++)
+ for (U32 j=0; j < getWearableCount((EWearableType)type); ++j)
{
- LLWearable* wearable = getWearable((EWearableType)i,j);
+ LLWearable* wearable = getWearable((EWearableType)type,j);
if (wearable)
{
if (wearable->getItemID().isNull())
@@ -272,7 +273,7 @@ void LLAgentWearables::sendAgentWearablesUpdate()
LLPointer<LLInventoryCallback> cb =
new addWearableToAgentInventoryCallback(
LLPointer<LLRefCount>(NULL),
- i,
+ type,
j,
wearable,
addWearableToAgentInventoryCallback::CALL_NONE);
@@ -299,15 +300,15 @@ void LLAgentWearables::sendAgentWearablesUpdate()
lldebugs << "sendAgentWearablesUpdate()" << llendl;
// MULTI-WEARABLE: update for multi-wearables after server-side support is in.
- for (S32 i=0; i < WT_COUNT; ++i)
+ for (S32 type=0; type < WT_COUNT; ++type)
{
gMessageSystem->nextBlockFast(_PREHASH_WearableData);
- U8 type_u8 = (U8)i;
+ U8 type_u8 = (U8)type;
gMessageSystem->addU8Fast(_PREHASH_WearableType, type_u8);
// MULTI-WEARABLE: TODO: hacked index to 0, needs to loop over all once messages support this.
- LLWearable* wearable = getWearable((EWearableType)i, 0);
+ LLWearable* wearable = getWearable((EWearableType)type, 0);
if (wearable)
{
//llinfos << "Sending wearable " << wearable->getName() << llendl;
@@ -327,19 +328,18 @@ void LLAgentWearables::sendAgentWearablesUpdate()
gMessageSystem->addUUIDFast(_PREHASH_ItemID, LLUUID::null);
}
- lldebugs << " " << LLWearableDictionary::getTypeLabel((EWearableType)i) << ": " << (wearable ? wearable->getAssetID() : LLUUID::null) << llendl;
+ lldebugs << " " << LLWearableDictionary::getTypeLabel((EWearableType)type) << ": " << (wearable ? wearable->getAssetID() : LLUUID::null) << llendl;
}
gAgent.sendReliableMessage();
}
-// MULTI-WEARABLE: add index.
void LLAgentWearables::saveWearable(const EWearableType type, const U32 index, BOOL send_update)
{
LLWearable* old_wearable = getWearable(type, index);
if (old_wearable && (old_wearable->isDirty() || old_wearable->isOldVersion()))
{
LLUUID old_item_id = old_wearable->getItemID();
- LLWearable* new_wearable = LLWearableList::instance().createCopyFromAvatar(old_wearable);
+ LLWearable* new_wearable = LLWearableList::instance().createCopy(old_wearable);
new_wearable->setItemID(old_item_id); // should this be in LLWearable::copyDataFrom()?
setWearable(type,index,new_wearable);
@@ -391,7 +391,6 @@ void LLAgentWearables::saveWearable(const EWearableType type, const U32 index, B
}
}
-// MULTI-WEARABLE: add index
void LLAgentWearables::saveWearableAs(const EWearableType type,
const U32 index,
const std::string& new_name,
@@ -417,7 +416,7 @@ void LLAgentWearables::saveWearableAs(const EWearableType type,
}
std::string trunc_name(new_name);
LLStringUtil::truncate(trunc_name, DB_INV_ITEM_NAME_STR_LEN);
- LLWearable* new_wearable = LLWearableList::instance().createCopyFromAvatar(
+ LLWearable* new_wearable = LLWearableList::instance().createCopy(
old_wearable,
trunc_name);
LLPointer<LLInventoryCallback> cb =
@@ -451,10 +450,8 @@ void LLAgentWearables::saveWearableAs(const EWearableType type,
void LLAgentWearables::revertWearable(const EWearableType type, const U32 index)
{
LLWearable* wearable = getWearable(type, index);
- if (wearable)
- {
- wearable->writeToAvatar(TRUE);
- }
+ wearable->revertValues();
+
gAgent.sendAgentSetAppearance();
}
@@ -604,13 +601,10 @@ void LLAgentWearables::sendAgentWearablesRequest()
gAgent.sendReliableMessage();
}
-// MULTI-WEARABLE: update for multiple items per type.
-// Used to enable/disable menu items.
// static
BOOL LLAgentWearables::selfHasWearable(EWearableType type)
{
- // MULTI-WEARABLE: TODO could be getWearableCount > 0, once null entries have been eliminated.
- return gAgentWearables.getWearable(type,0) != NULL;
+ return (gAgentWearables.getWearableCount(type) > 0);
}
LLWearable* LLAgentWearables::getWearable(const EWearableType type, U32 index)
@@ -633,6 +627,11 @@ LLWearable* LLAgentWearables::getWearable(const EWearableType type, U32 index)
void LLAgentWearables::setWearable(const EWearableType type, U32 index, LLWearable *wearable)
{
+ if (!getWearable(type,index))
+ {
+ pushWearable(type,wearable);
+ return;
+ }
wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(type);
if (wearable_iter == mWearableDatas.end())
{
@@ -650,6 +649,59 @@ void LLAgentWearables::setWearable(const EWearableType type, U32 index, LLWearab
}
}
+U32 LLAgentWearables::pushWearable(const EWearableType type, LLWearable *wearable)
+{
+ if (wearable == NULL)
+ {
+ // no null wearables please!
+ //TODO: insert llwarns
+ return MAX_ATTACHMENTS_PER_TYPE;
+ }
+ if (type < WT_COUNT)
+ {
+ mWearableDatas[type].push_back(wearable);
+ return mWearableDatas[type].size()-1;
+ }
+ return MAX_ATTACHMENTS_PER_TYPE;
+}
+
+void LLAgentWearables::popWearable(const EWearableType type, LLWearable *wearable)
+{
+ U32 index = getWearableIndex(type, wearable);
+ if (index < MAX_ATTACHMENTS_PER_TYPE && index < getWearableCount(type))
+ {
+ popWearable(type, index);
+ }
+}
+
+void LLAgentWearables::popWearable(const EWearableType type, U32 index)
+{
+ if (getWearable(type, index))
+ {
+ mWearableDatas[type].erase(mWearableDatas[type].begin() + index);
+ }
+}
+
+U32 LLAgentWearables::getWearableIndex(const EWearableType type, LLWearable *wearable)
+{
+ wearableentry_map_t::const_iterator wearable_iter = mWearableDatas.find(type);
+ if (wearable_iter == mWearableDatas.end())
+ {
+ llwarns << "tried to get wearable index with an invalid type!" << llendl;
+ return MAX_ATTACHMENTS_PER_TYPE;
+ }
+ const wearableentry_vec_t& wearable_vec = wearable_iter->second;
+ for(U32 index = 0; index < wearable_vec.size(); index++)
+ {
+ if (wearable_vec[index] == wearable)
+ {
+ return index;
+ }
+ }
+
+ return MAX_ATTACHMENTS_PER_TYPE;
+}
+
const LLWearable* LLAgentWearables::getWearable(const EWearableType type, U32 index) const
{
wearableentry_map_t::const_iterator wearable_iter = mWearableDatas.find(type);
@@ -668,7 +720,17 @@ const LLWearable* LLAgentWearables::getWearable(const EWearableType type, U32 in
}
}
-//MULTI-WEARABLE: this will give wrong values until we get rid of the "always one empty object" scheme.
+LLWearable* LLAgentWearables::getTopWearable(const EWearableType type)
+{
+ U32 count = getWearableCount(type);
+ if ( count == 0)
+ {
+ return NULL;
+ }
+
+ return getWearable(type, count-1);
+}
+
U32 LLAgentWearables::getWearableCount(const EWearableType type) const
{
wearableentry_map_t::const_iterator wearable_iter = mWearableDatas.find(type);
@@ -680,6 +742,13 @@ U32 LLAgentWearables::getWearableCount(const EWearableType type) const
return wearable_vec.size();
}
+U32 LLAgentWearables::getWearableCount(const U32 tex_index) const
+{
+ const EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType((LLVOAvatarDefines::ETextureIndex)tex_index);
+ return getWearableCount(wearable_type);
+}
+
+
BOOL LLAgentWearables::itemUpdatePending(const LLUUID& item_id) const
{
return mItemsAwaitingWearableUpdate.find(item_id) != mItemsAwaitingWearableUpdate.end();
@@ -798,7 +867,7 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
// MULTI-WEARABLE: TODO: update once messages change. Currently use results to populate the zeroth element.
// Store initial wearables data until we know whether we have the current outfit folder or need to use the data.
- LLInitialWearablesFetch::InitialWearableData wearable_data(type, 0, item_id, asset_id); // MULTI-WEARABLE: update
+ LLInitialWearablesFetch::InitialWearableData wearable_data(type, item_id, asset_id); // MULTI-WEARABLE: update
outfit->mAgentInitialWearables.push_back(wearable_data);
}
@@ -832,7 +901,7 @@ void LLAgentWearables::onInitialWearableAssetArrived(LLWearable* wearable, void*
{
boost::scoped_ptr<LLInitialWearablesFetch::InitialWearableData> wear_data((LLInitialWearablesFetch::InitialWearableData*)userdata);
const EWearableType type = wear_data->mType;
- const U32 index = wear_data->mIndex;
+ U32 index = 0;
LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
if (!avatar)
@@ -843,22 +912,19 @@ void LLAgentWearables::onInitialWearableAssetArrived(LLWearable* wearable, void*
if (wearable)
{
llassert(type == wearable->getType());
- // MULTI-WEARABLE: is this always zeroth element? Change sometime.
wearable->setItemID(wear_data->mItemID);
- gAgentWearables.setWearable(type, index, wearable);
+ index = gAgentWearables.pushWearable(type, wearable);
gAgentWearables.mItemsAwaitingWearableUpdate.erase(wear_data->mItemID);
// disable composites if initial textures are baked
avatar->setupComposites();
- wearable->writeToAvatar(FALSE);
avatar->setCompositeUpdatesEnabled(TRUE);
gInventory.addChangedMask(LLInventoryObserver::LABEL, wearable->getItemID());
}
else
{
// Somehow the asset doesn't exist in the database.
- // MULTI-WEARABLE: assuming zeroth elt
gAgentWearables.recoverMissingWearable(type,index);
}
@@ -898,7 +964,7 @@ void LLAgentWearables::recoverMissingWearable(const EWearableType type, U32 inde
S32 type_s32 = (S32) type;
setWearable(type,index,new_wearable);
- new_wearable->writeToAvatar(TRUE);
+ //new_wearable->writeToAvatar(TRUE);
// Add a new one in the lost and found folder.
// (We used to overwrite the "not found" one, but that could potentially
@@ -938,8 +1004,8 @@ void LLAgentWearables::addLocalTextureObject(const EWearableType wearable_type,
{
llerrs << "Tried to add local texture object to invalid wearable with type " << wearable_type << " and index " << wearable_index << llendl;
}
-
- wearable->setLocalTextureObject(texture_type, new LLLocalTextureObject());
+ LLLocalTextureObject* lto = new LLLocalTextureObject();
+ wearable->setLocalTextureObject(texture_type, lto);
}
void LLAgentWearables::createStandardWearables(BOOL female)
@@ -982,17 +1048,15 @@ void LLAgentWearables::createStandardWearables(BOOL female)
once = true;
donecb = new createStandardWearablesAllDoneCallback;
}
- // MULTI_WEARABLE: only elt 0, may be the right thing?
- llassert(getWearable((EWearableType)i,0) == NULL);
+ llassert(getWearableCount((EWearableType)i) == 0);
LLWearable* wearable = LLWearableList::instance().createNewWearable((EWearableType)i);
- setWearable((EWearableType)i,0,wearable);
+ U32 index = pushWearable((EWearableType)i,wearable);
// no need to update here...
- // MULTI_WEARABLE: hardwired index = 0 here.
LLPointer<LLInventoryCallback> cb =
new addWearableToAgentInventoryCallback(
donecb,
i,
- 0,
+ index,
wearable,
addWearableToAgentInventoryCallback::CALL_CREATESTANDARDDONE);
addWearableToAgentInventory(cb, wearable, LLUUID::null, FALSE);
@@ -1002,11 +1066,9 @@ void LLAgentWearables::createStandardWearables(BOOL female)
void LLAgentWearables::createStandardWearablesDone(S32 type, U32 index)
{
- LLWearable* wearable = getWearable((EWearableType)type, index);
-
- if (wearable)
+ if (mAvatarObject)
{
- wearable->writeToAvatar(TRUE);
+ mAvatarObject->updateVisualParams();
}
}
@@ -1023,12 +1085,12 @@ void LLAgentWearables::createStandardWearablesAllDone()
mAvatarObject->onFirstTEMessageReceived();
}
+// MULTI-WEARABLE: Properly handle multiwearables later.
void LLAgentWearables::getAllWearablesArray(LLDynamicArray<S32>& wearables)
{
for( S32 i = 0; i < WT_COUNT; ++i )
{
- // MULTI-WEARABLE: Properly handle multiwearables later.
- if (getWearable( (EWearableType) i, 0 ) != NULL)
+ if (getWearableCount( (EWearableType) i) != 0 )
{
wearables.push_back(i);
}
@@ -1233,6 +1295,13 @@ void LLAgentWearables::addWearableToAgentInventory(LLPointer<LLInventoryCallback
void LLAgentWearables::removeWearable(const EWearableType type, bool do_remove_all, U32 index)
{
+ if ((gAgent.isTeen())
+ && (type == WT_UNDERSHIRT || type == WT_UNDERPANTS))
+ {
+ // Can't take off underclothing in simple UI mode or on PG accounts
+ // TODO: enable the removing of a single undershirt/underpants if multiple are worn. - Nyx
+ return;
+ }
if (do_remove_all)
{
@@ -1240,16 +1309,8 @@ void LLAgentWearables::removeWearable(const EWearableType type, bool do_remove_a
}
else
{
-// MULTI_WEARABLE: handle vector changes from arbitrary removal.
LLWearable* old_wearable = getWearable(type,index);
- if ((gAgent.isTeen())
- && (type == WT_UNDERSHIRT || type == WT_UNDERPANTS))
- {
- // Can't take off underclothing in simple UI mode or on PG accounts
- return;
- }
-
if (old_wearable)
{
if (old_wearable->isDirty())
@@ -1308,26 +1369,22 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem
{
LLWearable* old_wearable = getWearable(type,i);
gInventory.addChangedMask(LLInventoryObserver::LABEL, getWearableItemID(type,i));
- setWearable(type,i,NULL);
+ popWearable(type,i);
//queryWearableCache(); // moved below
- // MULTI_WEARABLE: FIXME - currently we keep a null entry, so can't delete the last one.
- if (i>0)
- {
- mWearableDatas[type].pop_back();
- }
if (old_wearable)
{
old_wearable->removeFromAvatar(TRUE);
}
}
+ mWearableDatas[type].clear();
}
else
{
LLWearable* old_wearable = getWearable(type, index);
gInventory.addChangedMask(LLInventoryObserver::LABEL, getWearableItemID(type,index));
- setWearable(type,index,NULL);
+ popWearable(type, index);
//queryWearableCache(); // moved below
@@ -1335,16 +1392,6 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem
{
old_wearable->removeFromAvatar(TRUE);
}
-
- // MULTI_WEARABLE: logic changes if null entries go away
- if (getWearableCount(type)>1)
- {
- // Have to shrink the vector and clean up the item.
- wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(type);
- llassert_always(wearable_iter != mWearableDatas.end());
- wearableentry_vec_t& wearable_vec = wearable_iter->second;
- wearable_vec.erase( wearable_vec.begin() + index );
- }
}
queryWearableCache();
@@ -1429,7 +1476,7 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
{
wearables_being_removed.push_back(wearable);
}
- setWearable((EWearableType)i,0,NULL);
+ removeWearable((EWearableType)i,true,0);
}
}
@@ -1450,9 +1497,9 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
}
}
- for (i = 0; i < count; i++)
+ if (mAvatarObject)
{
- wearables[i]->writeToAvatar(TRUE);
+ mAvatarObject->updateVisualParams();
}
// Start rendering & update the server
@@ -1578,7 +1625,7 @@ void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLWearable* n
//llinfos << "LLVOAvatar::setWearableItem()" << llendl;
queryWearableCache();
- new_wearable->writeToAvatar(TRUE);
+ //new_wearable->writeToAvatar(TRUE);
updateServer();
}
@@ -1612,13 +1659,16 @@ void LLAgentWearables::queryWearableCache()
LLUUID hash;
for (U8 i=0; i < baked_dict->mWearables.size(); i++)
{
- // EWearableType baked_type = gBakedWearableMap[baked_index][baked_num];
const EWearableType baked_type = baked_dict->mWearables[i];
- // MULTI_WEARABLE: assuming 0th
- const LLWearable* wearable = getWearable(baked_type,0);
- if (wearable)
+ // MULTI_WEARABLE: not order-dependent
+ const U32 num_wearables = getWearableCount(baked_type);
+ for (U32 index = 0; index < num_wearables; ++index)
{
- hash ^= wearable->getAssetID();
+ const LLWearable* wearable = getWearable(baked_type,index);
+ if (wearable)
+ {
+ hash ^= wearable->getAssetID();
+ }
}
}
if (hash.notNull())
@@ -1672,7 +1722,6 @@ void LLAgentWearables::userRemoveAllClothes(void* userdata)
}
// static
-// MULTI_WEARABLE: removing all here.
void LLAgentWearables::userRemoveAllClothesStep2(BOOL proceed)
{
if (proceed)
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index 8b9d29342a..d147b0447b 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -45,6 +45,7 @@ class LLVOAvatarSelf;
class LLWearable;
class LLInitialWearablesFetch;
class LLViewerObject;
+class LLTexLayerTemplate;
class LLAgentWearables
{
@@ -93,8 +94,9 @@ public:
static BOOL selfHasWearable(EWearableType type);
LLWearable* getWearable(const EWearableType type, U32 index /*= 0*/);
const LLWearable* getWearable(const EWearableType type, U32 index /*= 0*/) const;
- U32 getWearableCount(const EWearableType type) const;
-
+ LLWearable* getTopWearable(const EWearableType type);
+ U32 getWearableCount(const EWearableType type) const;
+ U32 getWearableCount(const U32 tex_index) const;
//--------------------------------------------------------------------
// Setters
@@ -103,12 +105,16 @@ public:
private:
// Low-level data structure setter - public access is via setWearableItem, etc.
void setWearable(const EWearableType type, U32 index, LLWearable *wearable);
+ U32 pushWearable(const EWearableType type, LLWearable *wearable);
+ void popWearable(const EWearableType type, LLWearable *wearable);
+ void popWearable(const EWearableType type, U32 index);
public:
void setWearableItem(LLInventoryItem* new_item, LLWearable* wearable, bool do_append = false);
void setWearableOutfit(const LLInventoryItem::item_array_t& items, const LLDynamicArray< LLWearable* >& wearables, BOOL remove);
void setWearableName(const LLUUID& item_id, const std::string& new_name);
void addLocalTextureObject(const EWearableType wearable_type, const LLVOAvatarDefines::ETextureIndex texture_type, U32 wearable_index);
+ U32 getWearableIndex(const EWearableType type, LLWearable *wearable);
protected:
void setWearableFinal(LLInventoryItem* new_item, LLWearable* new_wearable, bool do_append = false);
static bool onSetWearableDialog(const LLSD& notification, const LLSD& response, LLWearable* wearable);
@@ -252,6 +258,8 @@ private:
LLPointer<LLRefCount> mCB;
};
+ static const U32 MAX_ATTACHMENTS_PER_TYPE = 4;
+
}; // LLAgentWearables
extern LLAgentWearables gAgentWearables;
diff --git a/indra/newview/lldriverparam.cpp b/indra/newview/lldriverparam.cpp
index 55b3ab796e..87a8557a88 100644
--- a/indra/newview/lldriverparam.cpp
+++ b/indra/newview/lldriverparam.cpp
@@ -36,6 +36,9 @@
#include "llfasttimer.h"
#include "llvoavatar.h"
+#include "llvoavatarself.h"
+#include "llagent.h"
+#include "llwearable.h"
//-----------------------------------------------------------------------------
// LLDriverParamInfo
@@ -100,12 +103,66 @@ BOOL LLDriverParamInfo::parseXml(LLXmlTreeNode* node)
return TRUE;
}
+//virtual
+void LLDriverParamInfo::toStream(std::ostream &out)
+{
+ LLViewerVisualParamInfo::toStream(out);
+ out << "driver" << "\t";
+ out << mDrivenInfoList.size() << "\t";
+ for (entry_info_list_t::iterator iter = mDrivenInfoList.begin(); iter != mDrivenInfoList.end(); iter++)
+ {
+ LLDrivenEntryInfo driven = *iter;
+ out << driven.mDrivenID << "\t";
+ }
+
+ out << std::endl;
+
+ LLVOAvatarSelf *avatar = gAgent.getAvatarObject();
+ if(avatar)
+ {
+ for (entry_info_list_t::iterator iter = mDrivenInfoList.begin(); iter != mDrivenInfoList.end(); iter++)
+ {
+ LLDrivenEntryInfo driven = *iter;
+ LLViewerVisualParam *param = (LLViewerVisualParam*)avatar->getVisualParam(driven.mDrivenID);
+ if (param)
+ {
+ param->getInfo()->toStream(out);
+ if (param->getWearableType() != mWearableType)
+ {
+ if(param->getCrossWearable())
+ {
+ out << "cross-wearable" << "\t";
+ }
+ else
+ {
+ out << "ERROR!" << "\t";
+ }
+ }
+ else
+ {
+ out << "valid" << "\t";
+ }
+ }
+ else
+ {
+ llwarns << "could not get parameter " << driven.mDrivenID << " from avatar " << avatar << " for driver parameter " << getID() << llendl;
+ }
+ out << std::endl;
+ }
+ }
+}
+
//-----------------------------------------------------------------------------
// LLDriverParam
//-----------------------------------------------------------------------------
LLDriverParam::LLDriverParam(LLVOAvatar *avatarp)
- : mCurrentDistortionParam( NULL ), mAvatarp(avatarp)
+ : mCurrentDistortionParam( NULL ), mAvatarp(avatarp), mWearablep(NULL)
+{
+}
+
+LLDriverParam::LLDriverParam(LLWearable *wearablep)
+ : mCurrentDistortionParam( NULL ), mAvatarp(NULL), mWearablep(wearablep)
{
}
@@ -122,27 +179,65 @@ BOOL LLDriverParam::setInfo(LLDriverParamInfo *info)
mID = info->mID;
setWeight(getDefaultWeight(), FALSE );
+
+ BOOL success;
+ if (mWearablep)
+ {
+ LLVisualParam*(LLWearable::*function)(S32)const = &LLWearable::getVisualParam; // need this line to disambiguate between versions of LLCharacter::getVisualParam()
+ success = linkDrivenParams(boost::bind(function,(LLWearable*)mWearablep, _1), false);
+ }
+ else
+ {
+ LLVisualParam*(LLCharacter::*function)(S32)const = &LLCharacter::getVisualParam; // need this line to disambiguate between versions of LLCharacter::getVisualParam()
+ success = linkDrivenParams(boost::bind(function,(LLCharacter*)mAvatarp, _1), false);
+ }
+ if(!success)
+ {
+ mInfo = NULL;
+ return FALSE;
+ }
- LLDriverParamInfo::entry_info_list_t::iterator iter;
- mDriven.reserve(getInfo()->mDrivenInfoList.size());
- for (iter = getInfo()->mDrivenInfoList.begin(); iter != getInfo()->mDrivenInfoList.end(); iter++)
+ return TRUE;
+}
+
+void LLDriverParam::setWearable(LLWearable *wearablep)
+{
+ if (wearablep)
{
- LLDrivenEntryInfo *driven_info = &(*iter);
- S32 driven_id = driven_info->mDrivenID;
- LLViewerVisualParam* param = (LLViewerVisualParam*)mAvatarp->getVisualParam( driven_id );
- if (param)
+ mWearablep = wearablep;
+ mAvatarp = NULL;
+ }
+}
+
+void LLDriverParam::setAvatar(LLVOAvatar *avatarp)
+{
+ if (avatarp)
+ {
+ mWearablep = NULL;
+ mAvatarp = avatarp;
+ }
+}
+
+/*virtual*/ LLViewerVisualParam * LLDriverParam::cloneParam(LLWearable* wearable) const
+{
+ LLDriverParam *new_param;
+ if (wearable)
+ {
+ new_param = new LLDriverParam(wearable);
+ }
+ else
+ {
+ if (mWearablep)
{
- mDriven.push_back(LLDrivenEntry( param, driven_info ));
+ new_param = new LLDriverParam(mWearablep);
}
else
{
- llerrs << "<driven> Unable to resolve driven parameter: " << driven_id << llendl;
- mInfo = NULL;
- return FALSE;
+ new_param = new LLDriverParam(mAvatarp);
}
}
-
- return TRUE;
+ *new_param = *this;
+ return new_param;
}
#if 0 // obsolete
@@ -218,8 +313,8 @@ void LLDriverParam::setWeight(F32 weight, BOOL set_by_user)
{
driven_weight = driven_min;
}
-
- driven->mParam->setWeight( driven_weight, set_by_user );
+
+ setDrivenWeight(driven,driven_weight,set_by_user);
continue;
}
else
@@ -243,13 +338,13 @@ void LLDriverParam::setWeight(F32 weight, BOOL set_by_user)
driven_weight = driven_min;
}
- driven->mParam->setWeight( driven_weight, set_by_user );
+ setDrivenWeight(driven,driven_weight,set_by_user);
continue;
}
}
driven_weight = getDrivenWeight(driven, mCurWeight);
- driven->mParam->setWeight( driven_weight, set_by_user );
+ setDrivenWeight(driven,driven_weight,set_by_user);
}
}
@@ -402,6 +497,46 @@ void LLDriverParam::stopAnimating(BOOL set_by_user)
}
}
+/*virtual*/
+BOOL LLDriverParam::linkDrivenParams(visual_param_mapper mapper, bool only_cross_params)
+{
+ BOOL success = TRUE;
+ LLDriverParamInfo::entry_info_list_t::iterator iter;
+ mDriven.clear();
+ mDriven.reserve(getInfo()->mDrivenInfoList.size());
+ for (iter = getInfo()->mDrivenInfoList.begin(); iter != getInfo()->mDrivenInfoList.end(); ++iter)
+ {
+ LLDrivenEntryInfo *driven_info = &(*iter);
+ S32 driven_id = driven_info->mDrivenID;
+
+ // check for already existing links. Do not overwrite.
+ BOOL found = FALSE;
+ for (entry_list_t::iterator driven_iter = mDriven.begin(); driven_iter != mDriven.end() && !found; ++driven_iter)
+ {
+ if (driven_iter->mInfo->mDrivenID == driven_id)
+ {
+ found = TRUE;
+ }
+ }
+
+ if (!found)
+ {
+ LLViewerVisualParam* param = (LLViewerVisualParam*)mapper(driven_id);
+ bool push = param && (!only_cross_params || param->getCrossWearable());
+ if (push)
+ {
+ mDriven.push_back(LLDrivenEntry( param, driven_info ));
+ }
+ else
+ {
+ success = FALSE;
+ }
+ }
+ }
+
+ return success;
+}
+
//-----------------------------------------------------------------------------
// getDrivenWeight()
//-----------------------------------------------------------------------------
@@ -458,3 +593,18 @@ F32 LLDriverParam::getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight
return driven_weight;
}
+
+void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool set_by_user)
+{
+ LLVOAvatarSelf *avatar_self = gAgent.getAvatarObject();
+ if(mWearablep && driven->mParam->getCrossWearable() &&
+ mWearablep->isOnTop())
+ {
+ // call setWeight through LLVOAvatarSelf so other wearables can be updated with the correct values
+ avatar_self->setVisualParamWeight( (LLVisualParam*)driven->mParam, driven_weight, set_by_user );
+ }
+ else
+ {
+ driven->mParam->setWeight( driven_weight, set_by_user );
+ }
+}
diff --git a/indra/newview/lldriverparam.h b/indra/newview/lldriverparam.h
index 7bc0c15448..c5dce62fa6 100644
--- a/indra/newview/lldriverparam.h
+++ b/indra/newview/lldriverparam.h
@@ -36,6 +36,7 @@
#include "llviewervisualparam.h"
class LLVOAvatar;
+class LLWearable;
//-----------------------------------------------------------------------------
@@ -69,6 +70,8 @@ public:
/*virtual*/ BOOL parseXml(LLXmlTreeNode* node);
+ /*virtual*/ void toStream(std::ostream &out);
+
protected:
typedef std::deque<LLDrivenEntryInfo> entry_info_list_t;
entry_info_list_t mDrivenInfoList;
@@ -80,6 +83,7 @@ class LLDriverParam : public LLViewerVisualParam
{
public:
LLDriverParam(LLVOAvatar *avatarp);
+ LLDriverParam(LLWearable *wearablep);
~LLDriverParam();
// Special: These functions are overridden by child classes
@@ -87,12 +91,18 @@ public:
// This sets mInfo and calls initialization functions
BOOL setInfo(LLDriverParamInfo *info);
+ void setWearable(LLWearable *wearablep);
+ void setAvatar(LLVOAvatar *avatarp);
+
+ /*virtual*/ LLViewerVisualParam * cloneParam(LLWearable* wearable) const;
+
// LLVisualParam Virtual functions
///*virtual*/ BOOL parseData(LLXmlTreeNode* node);
/*virtual*/ void apply( ESex sex ) {} // apply is called separately for each driven param.
/*virtual*/ void setWeight(F32 weight, BOOL set_by_user);
/*virtual*/ void setAnimationTarget( F32 target_value, BOOL set_by_user );
/*virtual*/ void stopAnimating(BOOL set_by_user);
+ /*virtual*/ BOOL linkDrivenParams(visual_param_mapper mapper, bool only_cross_params);
// LLViewerVisualParam Virtual functions
/*virtual*/ F32 getTotalDistortion();
@@ -103,6 +113,7 @@ public:
/*virtual*/ const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh);
protected:
F32 getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight);
+ void setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool set_by_user);
LLVector3 mDefaultVec; // temp holder
@@ -111,6 +122,7 @@ protected:
LLViewerVisualParam* mCurrentDistortionParam;
// Backlink only; don't make this an LLPointer.
LLVOAvatar* mAvatarp;
+ LLWearable* mWearablep;
};
#endif // LL_LLDRIVERPARAM_H
diff --git a/indra/newview/llfloateravatartextures.cpp b/indra/newview/llfloateravatartextures.cpp
index 3976e25ba4..81d38f8f68 100644
--- a/indra/newview/llfloateravatartextures.cpp
+++ b/indra/newview/llfloateravatartextures.cpp
@@ -39,6 +39,7 @@
#include "lluictrlfactory.h"
#include "llviewerobjectlist.h"
#include "llvoavatar.h"
+#include "llagentwearables.h"
using namespace LLVOAvatarDefines;
@@ -79,7 +80,18 @@ static void update_texture_ctrl(LLVOAvatar* avatarp,
LLTextureCtrl* ctrl,
ETextureIndex te)
{
- LLUUID id = avatarp->getTE(te)->getID();
+ LLUUID id = IMG_DEFAULT_AVATAR;
+ EWearableType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType(te);
+ LLWearable *wearable = gAgentWearables.getWearable(wearable_type, 0);
+ if (wearable)
+ {
+ LLLocalTextureObject *lto = wearable->getLocalTextureObject(te);
+ if (lto)
+ {
+ id = lto->getID();
+ }
+ }
+ //id = avatarp->getTE(te)->getID();
if (id == IMG_DEFAULT_AVATAR)
{
ctrl->setImageAssetID(LLUUID::null);
@@ -152,7 +164,32 @@ void LLFloaterAvatarTextures::onClickDump(void* data)
const LLTextureEntry* te = avatarp->getTE(i);
if (!te) continue;
- llinfos << "Avatar TE " << i << " id " << te->getID() << llendl;
+ if (LLVOAvatar::isIndexLocalTexture((ETextureIndex)i))
+ {
+ LLUUID id = IMG_DEFAULT_AVATAR;
+ EWearableType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType((ETextureIndex)i);
+ LLWearable *wearable = gAgentWearables.getWearable(wearable_type, 0);
+ if (wearable)
+ {
+ LLLocalTextureObject *lto = wearable->getLocalTextureObject(i);
+ if (lto)
+ {
+ id = lto->getID();
+ }
+ }
+ if (id != IMG_DEFAULT_AVATAR)
+ {
+ llinfos << "Avatar TE " << i << " id " << id << llendl;
+ }
+ else
+ {
+ llinfos << "Avatar TE " << i << " id " << "<DEFAULT>" << llendl;
+ }
+ }
+ else
+ {
+ llinfos << "Avatar TE " << i << " id " << te->getID() << llendl;
+ }
}
#endif
}
diff --git a/indra/newview/lllocaltextureobject.cpp b/indra/newview/lllocaltextureobject.cpp
index e4a20aea68..99c98ec16e 100644
--- a/indra/newview/lllocaltextureobject.cpp
+++ b/indra/newview/lllocaltextureobject.cpp
@@ -37,6 +37,7 @@
#include "llviewertexture.h"
#include "lltextureentry.h"
#include "lluuid.h"
+#include "llwearable.h"
LLLocalTextureObject::LLLocalTextureObject() :
@@ -46,31 +47,33 @@ LLLocalTextureObject::LLLocalTextureObject() :
mImage = NULL;
}
-LLLocalTextureObject::LLLocalTextureObject(LLViewerFetchedTexture *image, LLTextureEntry *entry, LLTexLayer *layer, LLUUID id)
+LLLocalTextureObject::LLLocalTextureObject(LLViewerFetchedTexture *image, LLUUID id)
{
- if (entry)
- {
- LLTextureEntry * te = new LLTextureEntry(*entry);
- mTexEntry = boost::shared_ptr<LLTextureEntry>(te);
- }
-
- if (layer)
- {
- LLTexLayer *texLayer = new LLTexLayer(*layer);
- mTexLayer = boost::shared_ptr<LLTexLayer>(texLayer);
- }
mImage = image;
+ gGL.getTexUnit(0)->bind(mImage);
mID = id;
}
LLLocalTextureObject::LLLocalTextureObject(const LLLocalTextureObject &lto) :
mImage(lto.mImage),
-mTexEntry(lto.mTexEntry),
-mTexLayer(lto.mTexLayer),
mID(lto.mID),
mIsBakedReady(lto.mIsBakedReady),
mDiscard(lto.mDiscard)
{
+ U32 num_layers = lto.getNumTexLayers();
+ mTexLayers.reserve(num_layers);
+ for (U32 index = 0; index < num_layers; index++)
+ {
+ LLTexLayer* original_layer = lto.getTexLayer(index);
+ if (!original_layer)
+ {
+ llerrs << "could not clone Local Texture Object: unable to extract texlayer!" << llendl;
+ }
+
+ LLTexLayer* new_layer = new LLTexLayer(*original_layer);
+ new_layer->setLTO(this);
+ mTexLayers.push_back(new_layer);
+ }
}
LLLocalTextureObject::~LLLocalTextureObject()
@@ -82,14 +85,33 @@ LLViewerFetchedTexture* LLLocalTextureObject::getImage() const
return mImage;
}
-LLTextureEntry* LLLocalTextureObject::getTexEntry() const
+LLTexLayer* LLLocalTextureObject::getTexLayer(U32 index) const
{
- return mTexEntry.get();
+ if (index >= getNumTexLayers())
+ {
+ return NULL;
+ }
+
+ return mTexLayers[index];
}
-LLTexLayer* LLLocalTextureObject::getTexLayer() const
+LLTexLayer* LLLocalTextureObject::getTexLayer(const std::string &name)
{
- return mTexLayer.get();
+ for( tex_layer_p::iterator iter = mTexLayers.begin(); iter != mTexLayers.end(); iter++)
+ {
+ LLTexLayer *layer = *iter;
+ if (layer->getName().compare(name) == 0)
+ {
+ return layer;
+ }
+ }
+
+ return NULL;
+}
+
+U32 LLLocalTextureObject::getNumTexLayers() const
+{
+ return mTexLayers.size();
}
LLUUID LLLocalTextureObject::getID() const
@@ -112,24 +134,68 @@ void LLLocalTextureObject::setImage(LLViewerFetchedTexture* new_image)
mImage = new_image;
}
-void LLLocalTextureObject::setTexEntry(LLTextureEntry *new_te)
+BOOL LLLocalTextureObject::setTexLayer(LLTexLayer *new_tex_layer, U32 index)
{
- LLTextureEntry *ptr = NULL;
- if (new_te)
+ if (index >= getNumTexLayers() )
+ {
+ return FALSE;
+ }
+
+ if (new_tex_layer == NULL)
{
- ptr = new LLTextureEntry(*new_te);
+ return removeTexLayer(index);
}
- mTexEntry = boost::shared_ptr<LLTextureEntry>(ptr);
+
+ LLTexLayer *layer = new LLTexLayer(*new_tex_layer);
+ layer->setLTO(this);
+
+ if (mTexLayers[index])
+ {
+ delete mTexLayers[index];
+ }
+ mTexLayers[index] = layer;
+
+ return TRUE;
+}
+
+BOOL LLLocalTextureObject::addTexLayer(LLTexLayer *new_tex_layer, LLWearable *wearable)
+{
+ if (new_tex_layer == NULL)
+ {
+ return FALSE;
+ }
+
+ LLTexLayer *layer = new LLTexLayer(*new_tex_layer, wearable);
+ layer->setLTO(this);
+ mTexLayers.push_back(layer);
+ return TRUE;
}
-void LLLocalTextureObject::setTexLayer(LLTexLayer *new_tex_layer)
+BOOL LLLocalTextureObject::addTexLayer(LLTexLayerTemplate *new_tex_layer, LLWearable *wearable)
{
- LLTexLayer *ptr = NULL;
- if (new_tex_layer)
+ if (new_tex_layer == NULL)
{
- ptr = new LLTexLayer(*new_tex_layer);
+ return FALSE;
}
- mTexLayer = boost::shared_ptr<LLTexLayer>(ptr);
+
+ LLTexLayer *layer = new LLTexLayer(*new_tex_layer, this, wearable);
+ layer->setLTO(this);
+ mTexLayers.push_back(layer);
+ return TRUE;
+}
+
+BOOL LLLocalTextureObject::removeTexLayer(U32 index)
+{
+ if (index >= getNumTexLayers())
+ {
+ return FALSE;
+ }
+ tex_layer_p::iterator iter = mTexLayers.begin();
+ iter += index;
+
+ delete *iter;
+ mTexLayers.erase(iter);
+ return TRUE;
}
void LLLocalTextureObject::setID(LLUUID new_id)
diff --git a/indra/newview/lllocaltextureobject.h b/indra/newview/lllocaltextureobject.h
index 79e1562dce..138bbad677 100644
--- a/indra/newview/lllocaltextureobject.h
+++ b/indra/newview/lllocaltextureobject.h
@@ -39,6 +39,8 @@ class LLViewerFetchedTexture;
class LLUUID;
class LLTexLayer;
class LLTextureEntry;
+class LLTexLayerTemplate;
+class LLWearable;
// Stores all relevant information for a single texture
// assumed to have ownership of all objects referred to -
@@ -47,20 +49,24 @@ class LLLocalTextureObject
{
public:
LLLocalTextureObject();
- LLLocalTextureObject(LLViewerFetchedTexture *image, LLTextureEntry *entry, LLTexLayer *layer, LLUUID id);
+ LLLocalTextureObject(LLViewerFetchedTexture *image, LLUUID id);
LLLocalTextureObject(const LLLocalTextureObject &lto);
~LLLocalTextureObject();
LLViewerFetchedTexture* getImage() const;
- LLTextureEntry* getTexEntry() const;
- LLTexLayer* getTexLayer() const;
+ LLTexLayer* getTexLayer(U32 index) const;
+ LLTexLayer* getTexLayer(const std::string &name);
+ U32 getNumTexLayers() const;
LLUUID getID() const;
S32 getDiscard() const;
BOOL getBakedReady() const;
void setImage(LLViewerFetchedTexture* new_image);
- void setTexEntry(LLTextureEntry *new_te);
- void setTexLayer(LLTexLayer *new_tex_layer);
+ BOOL setTexLayer(LLTexLayer *new_tex_layer, U32 index);
+ BOOL addTexLayer(LLTexLayer *new_tex_layer, LLWearable *wearable);
+ BOOL addTexLayer(LLTexLayerTemplate *new_tex_layer, LLWearable *wearable);
+ BOOL removeTexLayer(U32 index);
+
void setID(LLUUID new_id);
void setDiscard(S32 new_discard);
void setBakedReady(BOOL ready);
@@ -73,8 +79,9 @@ private:
// NOTE: LLLocalTextureObject should be the exclusive owner of mTexEntry and mTexLayer
// using shared pointers here only for smart assignment & cleanup
// do NOT create new shared pointers to these objects, or keep pointers to them around
- boost::shared_ptr<LLTextureEntry> mTexEntry;
- boost::shared_ptr<LLTexLayer> mTexLayer;
+ typedef std::vector<LLTexLayer*> tex_layer_p;
+ tex_layer_p mTexLayers;
+
LLUUID mID;
BOOL mIsBakedReady;
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
new file mode 100644
index 0000000000..c2c32527fb
--- /dev/null
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -0,0 +1,658 @@
+/**
+ * @file llpaneleditwearable.cpp
+ * @brief UI panel for editing of a particular wearable item.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpaneleditwearable.h"
+#include "llpanel.h"
+#include "llwearable.h"
+#include "lluictrl.h"
+#include "llscrollingpanellist.h"
+#include "llvisualparam.h"
+#include "lltoolmorph.h"
+#include "llviewerjointmesh.h"
+#include "lltrans.h"
+#include "llbutton.h"
+#include "llsliderctrl.h"
+#include "llagent.h"
+#include "llvoavatarself.h"
+#include "lltexteditor.h"
+#include "lltextbox.h"
+#include "llaccordionctrltab.h"
+#include "llagentwearables.h"
+#include "llscrollingpanelparam.h"
+
+// register panel with appropriate XML
+static LLRegisterPanelClassWrapper<LLPanelEditWearable> t_edit_wearable("panel_edit_wearable");
+
+// subparts of the UI for focus, camera position, etc.
+enum ESubpart {
+ SUBPART_SHAPE_HEAD = 1, // avoid 0
+ SUBPART_SHAPE_EYES,
+ SUBPART_SHAPE_EARS,
+ SUBPART_SHAPE_NOSE,
+ SUBPART_SHAPE_MOUTH,
+ SUBPART_SHAPE_CHIN,
+ SUBPART_SHAPE_TORSO,
+ SUBPART_SHAPE_LEGS,
+ SUBPART_SHAPE_WHOLE,
+ SUBPART_SHAPE_DETAIL,
+ SUBPART_SKIN_COLOR,
+ SUBPART_SKIN_FACEDETAIL,
+ SUBPART_SKIN_MAKEUP,
+ SUBPART_SKIN_BODYDETAIL,
+ SUBPART_HAIR_COLOR,
+ SUBPART_HAIR_STYLE,
+ SUBPART_HAIR_EYEBROWS,
+ SUBPART_HAIR_FACIAL,
+ SUBPART_EYES,
+ SUBPART_SHIRT,
+ SUBPART_PANTS,
+ SUBPART_SHOES,
+ SUBPART_SOCKS,
+ SUBPART_JACKET,
+ SUBPART_GLOVES,
+ SUBPART_UNDERSHIRT,
+ SUBPART_UNDERPANTS,
+ SUBPART_SKIRT,
+ SUBPART_ALPHA,
+ SUBPART_TATTOO
+ };
+
+typedef std::vector<ESubpart> subpart_vec_t;
+
+// Locally defined classes
+
+class LLEditWearableDictionary : public LLSingleton<LLEditWearableDictionary>
+{
+ //--------------------------------------------------------------------
+ // Constructors and Destructors
+ //--------------------------------------------------------------------
+public:
+ LLEditWearableDictionary();
+ virtual ~LLEditWearableDictionary();
+
+ //--------------------------------------------------------------------
+ // Wearable Types
+ //--------------------------------------------------------------------
+public:
+ struct WearableEntry : public LLDictionaryEntry
+ {
+ WearableEntry(EWearableType type,
+ const std::string &title,
+ const std::string &desc_title,
+ U8 num_subparts, ... ); // number of subparts followed by a list of ESubparts
+
+
+ const EWearableType mWearableType;
+ const std::string mTitle;
+ const std::string mDescTitle;
+ subpart_vec_t mSubparts;
+
+ };
+
+ struct Wearables : public LLDictionary<EWearableType, WearableEntry>
+ {
+ Wearables();
+ } mWearables;
+
+ const WearableEntry* getWearable(EWearableType type) const { return mWearables.lookup(type); }
+
+ //--------------------------------------------------------------------
+ // Subparts
+ //--------------------------------------------------------------------
+public:
+ struct SubpartEntry : public LLDictionaryEntry
+ {
+ SubpartEntry(ESubpart part,
+ const std::string &joint,
+ const std::string &edit_group,
+ const std::string &param_list,
+ const std::string &accordion_tab,
+ const LLVector3d &target_offset,
+ const LLVector3d &camera_offset,
+ const ESex &sex);
+
+ ESubpart mSubpart;
+ std::string mTargetJoint;
+ std::string mEditGroup;
+ std::string mParamList;
+ std::string mAccordionTab;
+ LLVector3d mTargetOffset;
+ LLVector3d mCameraOffset;
+ ESex mSex;
+ };
+
+ struct Subparts : public LLDictionary<ESubpart, SubpartEntry>
+ {
+ Subparts();
+ } mSubparts;
+
+ const SubpartEntry* getSubpart(ESubpart subpart) const { return mSubparts.lookup(subpart); }
+};
+
+LLEditWearableDictionary::LLEditWearableDictionary()
+{
+
+}
+
+//virtual
+LLEditWearableDictionary::~LLEditWearableDictionary()
+{
+}
+
+LLEditWearableDictionary::Wearables::Wearables()
+{
+ addEntry(WT_SHAPE, new WearableEntry(WT_SHAPE,"edit_shape_title","shape_desc_text",9, SUBPART_SHAPE_HEAD, SUBPART_SHAPE_EYES, SUBPART_SHAPE_EARS, SUBPART_SHAPE_NOSE, SUBPART_SHAPE_MOUTH, SUBPART_SHAPE_CHIN, SUBPART_SHAPE_TORSO, SUBPART_SHAPE_LEGS, SUBPART_SHAPE_WHOLE));
+ addEntry(WT_SKIN, new WearableEntry(WT_SKIN,"edit_skin_title","skin_desc_text",4, SUBPART_SKIN_COLOR, SUBPART_SKIN_FACEDETAIL, SUBPART_SKIN_MAKEUP, SUBPART_SKIN_BODYDETAIL));
+ addEntry(WT_HAIR, new WearableEntry(WT_HAIR,"edit_hair_title","hair_desc_text",4, SUBPART_HAIR_COLOR, SUBPART_HAIR_STYLE, SUBPART_HAIR_EYEBROWS, SUBPART_HAIR_FACIAL));
+ addEntry(WT_EYES, new WearableEntry(WT_EYES,"edit_eyes_title","eyes_desc_text",1, SUBPART_EYES));
+ addEntry(WT_SHIRT, new WearableEntry(WT_SHIRT,"edit_shirt_title","shirt_desc_text",1, SUBPART_SHIRT));
+ addEntry(WT_PANTS, new WearableEntry(WT_PANTS,"edit_pants_title","pants_desc_text",1, SUBPART_PANTS));
+ addEntry(WT_SHOES, new WearableEntry(WT_SHOES,"edit_shoes_title","shoes_desc_text",1, SUBPART_SHOES));
+ addEntry(WT_SOCKS, new WearableEntry(WT_SOCKS,"edit_socks_title","socks_desc_text",1, SUBPART_SOCKS));
+ addEntry(WT_JACKET, new WearableEntry(WT_JACKET,"edit_jacket_title","jacket_desc_text",1, SUBPART_JACKET));
+ addEntry(WT_GLOVES, new WearableEntry(WT_GLOVES,"edit_gloves_title","gloves_desc_text",1, SUBPART_GLOVES));
+ addEntry(WT_UNDERSHIRT, new WearableEntry(WT_UNDERSHIRT,"edit_undershirt_title","undershirt_desc_text",1, SUBPART_UNDERSHIRT));
+ addEntry(WT_UNDERPANTS, new WearableEntry(WT_UNDERPANTS,"edit_underpants_title","underpants_desc_text",1, SUBPART_UNDERPANTS));
+ addEntry(WT_SKIRT, new WearableEntry(WT_SKIRT,"edit_skirt_title","skirt_desc_text",1, SUBPART_SKIRT));
+ addEntry(WT_ALPHA, new WearableEntry(WT_ALPHA,"edit_alpha_title","alpha_desc_text",1, SUBPART_ALPHA));
+ addEntry(WT_TATTOO, new WearableEntry(WT_TATTOO,"edit_tattoo_title","tattoo_desc_text",1, SUBPART_TATTOO));
+}
+
+LLEditWearableDictionary::WearableEntry::WearableEntry(EWearableType type,
+ const std::string &title,
+ const std::string &desc_title,
+ U8 num_subparts, ... ) :
+ LLDictionaryEntry(title),
+ mWearableType(type),
+ mTitle(title),
+ mDescTitle(desc_title)
+{
+ va_list argp;
+ va_start(argp, num_subparts);
+
+ for (U8 i = 0; i < num_subparts; ++i)
+ {
+ ESubpart part = (ESubpart)va_arg(argp,int);
+ mSubparts.push_back(part);
+ }
+}
+
+LLEditWearableDictionary::Subparts::Subparts()
+{
+ addEntry(SUBPART_SHAPE_WHOLE, new SubpartEntry(SUBPART_SHAPE_WHOLE, "mPelvis", "shape_body","shape_body_param_list", "shape_body_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
+ addEntry(SUBPART_SHAPE_HEAD, new SubpartEntry(SUBPART_SHAPE_HEAD, "mHead", "shape_head", "shape_head_param_list", "shape_head_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_SHAPE_EYES, new SubpartEntry(SUBPART_SHAPE_EYES, "mHead", "shape_eyes", "shape_eyes_param_list", "shape_eyes_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_SHAPE_EARS, new SubpartEntry(SUBPART_SHAPE_EARS, "mHead", "shape_ears", "shape_ears_param_list", "shape_ears_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_SHAPE_NOSE, new SubpartEntry(SUBPART_SHAPE_NOSE, "mHead", "shape_nose", "shape_nose_param_list", "shape_nose_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_SHAPE_MOUTH, new SubpartEntry(SUBPART_SHAPE_MOUTH, "mHead", "shape_mouth", "shape_mouth_param_list", "shape_mouth_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_SHAPE_CHIN, new SubpartEntry(SUBPART_SHAPE_CHIN, "mHead", "shape_chin", "shape_chin_param_list", "shape_chin_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_SHAPE_TORSO, new SubpartEntry(SUBPART_SHAPE_TORSO, "mTorso", "shape_torso", "shape_torso_param_list", "shape_torso_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH));
+ addEntry(SUBPART_SHAPE_LEGS, new SubpartEntry(SUBPART_SHAPE_LEGS, "mPelvis", "shape_legs", "shape_legs_param_list", "shape_legs_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
+
+ addEntry(SUBPART_SKIN_COLOR, new SubpartEntry(SUBPART_SKIN_COLOR, "mHead", "skin_color", "skin_color_param_list", "skin_color_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_SKIN_FACEDETAIL, new SubpartEntry(SUBPART_SKIN_FACEDETAIL, "mHead", "skin_facedetail", "skin_face_param_list", "skin_face_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_SKIN_MAKEUP, new SubpartEntry(SUBPART_SKIN_MAKEUP, "mHead", "skin_makeup", "skin_makeup_param_list", "skin_makeup_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_SKIN_BODYDETAIL, new SubpartEntry(SUBPART_SKIN_BODYDETAIL, "mPelvis", "skin_bodydetail", "skin_body_param_list", "skin_body_tab", LLVector3d(0.f, 0.f, -0.2f), LLVector3d(-2.5f, 0.5f, 0.5f),SEX_BOTH));
+
+ addEntry(SUBPART_HAIR_COLOR, new SubpartEntry(SUBPART_HAIR_COLOR, "mHead", "hair_color", "hair_color_param_list", "hair_color_tab", LLVector3d(0.f, 0.f, 0.10f), LLVector3d(-0.4f, 0.05f, 0.10f),SEX_BOTH));
+ addEntry(SUBPART_HAIR_STYLE, new SubpartEntry(SUBPART_HAIR_STYLE, "mHead", "hair_style", "hair_style_param_list", "hair_style_tab", LLVector3d(0.f, 0.f, 0.10f), LLVector3d(-0.4f, 0.05f, 0.10f),SEX_BOTH));
+ addEntry(SUBPART_HAIR_EYEBROWS, new SubpartEntry(SUBPART_HAIR_EYEBROWS, "mHead", "hair_eyebrows", "hair_eyebrows_param_list", "hair_eyebrows_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_HAIR_FACIAL, new SubpartEntry(SUBPART_HAIR_FACIAL, "mHead", "hair_facial", "hair_facial_param_list", "hair_facial_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_MALE));
+
+ addEntry(SUBPART_EYES, new SubpartEntry(SUBPART_EYES, "mHead", "eyes", "eyes_main_param_list", "eyes_main_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+
+ addEntry(SUBPART_SHIRT, new SubpartEntry(SUBPART_SHIRT, "mTorso", "shirt", "shirt_main_param_list", "shirt_main_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH));
+ addEntry(SUBPART_PANTS, new SubpartEntry(SUBPART_PANTS, "mPelvis", "pants", "pants_main_param_list", "pants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
+ addEntry(SUBPART_SHOES, new SubpartEntry(SUBPART_SHOES, "mPelvis", "shoes", "shoes_main_param_list", "shoes_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
+ addEntry(SUBPART_SOCKS, new SubpartEntry(SUBPART_SOCKS, "mPelvis", "socks", "socks_main_param_list", "socks_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
+ addEntry(SUBPART_JACKET, new SubpartEntry(SUBPART_JACKET, "mTorso", "jacket", "jacket_main_param_list", "jacket_main_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(-2.f, 0.1f, 0.3f),SEX_BOTH));
+ addEntry(SUBPART_SKIRT, new SubpartEntry(SUBPART_SKIRT, "mPelvis", "skirt", "skirt_main_param_list", "skirt_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
+ addEntry(SUBPART_GLOVES, new SubpartEntry(SUBPART_GLOVES, "mTorso", "gloves", "gloves_main_param_list", "gloves_main_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(-1.f, 0.15f, 0.f),SEX_BOTH));
+ addEntry(SUBPART_UNDERSHIRT, new SubpartEntry(SUBPART_UNDERSHIRT, "mTorso", "undershirt", "undershirt_main_param_list", "undershirt_main_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH));
+ addEntry(SUBPART_UNDERPANTS, new SubpartEntry(SUBPART_UNDERPANTS, "mPelvis", "underpants", "underpants_main_param_list", "underpants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
+ addEntry(SUBPART_ALPHA, new SubpartEntry(SUBPART_ALPHA, "mPelvis", "alpha", "alpha_main_param_list", "alpha_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
+ addEntry(SUBPART_TATTOO, new SubpartEntry(SUBPART_TATTOO, "mPelvis", "tattoo", "tattoo_main_param_list", "tattoo_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
+}
+
+LLEditWearableDictionary::SubpartEntry::SubpartEntry(ESubpart part,
+ const std::string &joint,
+ const std::string &edit_group,
+ const std::string &param_list,
+ const std::string &accordion_tab,
+ const LLVector3d &target_offset,
+ const LLVector3d &camera_offset,
+ const ESex &sex) :
+ LLDictionaryEntry(edit_group),
+ mSubpart(part),
+ mTargetJoint(joint),
+ mEditGroup(edit_group),
+ mParamList(param_list),
+ mAccordionTab(accordion_tab),
+ mTargetOffset(target_offset),
+ mCameraOffset(camera_offset),
+ mSex(sex)
+{
+}
+
+
+// LLPanelEditWearable
+
+LLPanelEditWearable::LLPanelEditWearable()
+ : LLPanel()
+{
+}
+
+//virtual
+LLPanelEditWearable::~LLPanelEditWearable()
+{
+
+}
+
+// virtual
+BOOL LLPanelEditWearable::postBuild()
+{
+ // buttons
+ mBtnRevert = getChild<LLButton>("revert_button");
+ mBtnRevert->setClickedCallback(boost::bind(&LLPanelEditWearable::onRevertButtonClicked, this));
+
+ mBtnBack = getChild<LLButton>("back_btn");
+ // handled at appearance panel level?
+ //mBtnBack->setClickedCallback(boost::bind(&LLPanelEditWearable::onBackButtonClicked, this));
+
+ mTextEditor = getChild<LLTextEditor>("description");
+
+ mPanelTitle = getChild<LLTextBox>("edit_wearable_title");
+ mDescTitle = getChild<LLTextBox>("description_text");
+
+ // The following panels will be shown/hidden based on what wearable we're editing
+ // body parts
+ mPanelShape = getChild<LLPanel>("edit_shape_panel");
+ mPanelSkin = getChild<LLPanel>("edit_skin_panel");
+ mPanelEyes = getChild<LLPanel>("edit_eyes_panel");
+ mPanelHair = getChild<LLPanel>("edit_hair_panel");
+
+ //clothes
+ mPanelShirt = getChild<LLPanel>("edit_shirt_panel");
+ mPanelPants = getChild<LLPanel>("edit_pants_panel");
+ mPanelShoes = getChild<LLPanel>("edit_shoes_panel");
+ mPanelSocks = getChild<LLPanel>("edit_socks_panel");
+ mPanelJacket = getChild<LLPanel>("edit_jacket_panel");
+ mPanelGloves = getChild<LLPanel>("edit_gloves_panel");
+ mPanelUndershirt = getChild<LLPanel>("edit_undershirt_panel");
+ mPanelUnderpants = getChild<LLPanel>("edit_underpants_panel");
+ mPanelSkirt = getChild<LLPanel>("edit_skirt_panel");
+ mPanelAlpha = getChild<LLPanel>("edit_alpha_panel");
+ mPanelTattoo = getChild<LLPanel>("edit_tattoo_panel");
+
+ mWearablePtr = NULL;
+
+ return TRUE;
+}
+
+// virtual
+// LLUICtrl
+BOOL LLPanelEditWearable::isDirty() const
+{
+ BOOL isDirty = FALSE;
+ if (mWearablePtr)
+ {
+ if (mWearablePtr->isDirty() ||
+ mWearablePtr->getName().compare(mTextEditor->getText()) != 0)
+ {
+ isDirty = TRUE;
+ }
+ }
+ return isDirty;
+}
+//virtual
+void LLPanelEditWearable::draw()
+{
+ BOOL is_dirty = isDirty();
+ mBtnRevert->setEnabled(is_dirty);
+
+ LLPanel::draw();
+}
+
+void LLPanelEditWearable::setWearable(LLWearable *wearable)
+{
+ showWearable(mWearablePtr, FALSE);
+ mWearablePtr = wearable;
+ showWearable(mWearablePtr, TRUE);
+
+ initializePanel();
+}
+
+//static
+void LLPanelEditWearable::onRevertButtonClicked(void* userdata)
+{
+ LLPanelEditWearable *panel = (LLPanelEditWearable*) userdata;
+ panel->revertChanges();
+}
+
+
+void LLPanelEditWearable::saveChanges()
+{
+ if (!mWearablePtr || !isDirty())
+ {
+ // do nothing if no unsaved changes
+ return;
+ }
+
+ U32 index = gAgentWearables.getWearableIndex(mWearablePtr->getType(), mWearablePtr);
+
+ if (mWearablePtr->getName().compare(mTextEditor->getText()) != 0)
+ {
+ // the name of the wearable has changed, re-save wearable with new name
+ gAgentWearables.saveWearableAs(mWearablePtr->getType(), index, mTextEditor->getText(), FALSE);
+ }
+ else
+ {
+ gAgentWearables.saveWearable(mWearablePtr->getType(), index);
+ }
+}
+
+void LLPanelEditWearable::revertChanges()
+{
+ if (!mWearablePtr || !isDirty())
+ {
+ // no unsaved changes to revert
+ return;
+ }
+
+ mWearablePtr->revertValues();
+ mTextEditor->setText(mWearablePtr->getName());
+}
+
+void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show)
+{
+ if (!wearable)
+ {
+ return;
+ }
+
+ EWearableType type = wearable->getType();
+ LLPanel *targetPanel = NULL;
+ std::string title;
+ std::string description_title;
+
+ const LLEditWearableDictionary::WearableEntry *entry = LLEditWearableDictionary::getInstance()->getWearable(type);
+ if (!entry)
+ {
+ llwarns << "called LLPanelEditWearable::showWearable with an invalid wearable type! (" << type << ")" << llendl;
+ return;
+ }
+
+ targetPanel = getPanel(type);
+ title = getString(entry->mTitle);
+ description_title = getString(entry->mDescTitle);
+
+ targetPanel->setVisible(show);
+ if (show)
+ {
+ mPanelTitle->setText(title);
+ mDescTitle->setText(description_title);
+ }
+
+}
+
+void LLPanelEditWearable::initializePanel()
+{
+ if (!mWearablePtr)
+ {
+ // cannot initialize with a null reference.
+ return;
+ }
+
+ EWearableType type = mWearablePtr->getType();
+
+ // set name
+ mTextEditor->setText(mWearablePtr->getName());
+
+ // clear and rebuild visual param list
+ const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type);
+ if (!wearable_entry)
+ {
+ llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl;
+ return;
+ }
+ U8 num_subparts = wearable_entry->mSubparts.size();
+
+ for (U8 index = 0; index < num_subparts; ++index)
+ {
+ // dive into data structures to get the panel we need
+ ESubpart subpart_e = wearable_entry->mSubparts[index];
+ const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
+
+ if (!subpart_entry)
+ {
+ llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl;
+ continue;
+ }
+
+ const std::string scrolling_panel = subpart_entry->mParamList;
+ const std::string accordion_tab = subpart_entry->mAccordionTab;
+
+ LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel);
+ LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab);
+
+ if (!panel_list)
+ {
+ llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl;
+ continue;
+ }
+
+ if (!tab)
+ {
+ llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl;
+ continue;
+ }
+
+ // what edit group do we want to extract params for?
+ const std::string edit_group = subpart_entry->mEditGroup;
+
+ // storage for ordered list of visual params
+ value_map_t sorted_params;
+ getSortedParams(sorted_params, edit_group);
+
+ buildParamList(panel_list, sorted_params, tab);
+
+ updateScrollingPanelUI();
+ }
+
+}
+
+void LLPanelEditWearable::updateScrollingPanelUI()
+{
+ // do nothing if we don't have a valid wearable we're editing
+ if (mWearablePtr == NULL)
+ {
+ return;
+ }
+
+ EWearableType type = mWearablePtr->getType();
+ LLPanel *panel = getPanel(type);
+
+ if(panel && (mWearablePtr->getItemID().notNull()))
+ {
+ const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type);
+ U8 num_subparts = wearable_entry->mSubparts.size();
+
+ LLScrollingPanelParam::sUpdateDelayFrames = 0;
+ for (U8 index = 0; index < num_subparts; ++index)
+ {
+ // dive into data structures to get the panel we need
+ ESubpart subpart_e = wearable_entry->mSubparts[index];
+ const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
+
+ const std::string scrolling_panel = subpart_entry->mParamList;
+
+ LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel);
+
+ if (!panel_list)
+ {
+ llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl;
+ continue;
+ }
+
+ panel_list->updatePanels(TRUE);
+ }
+ }
+}
+
+LLPanel* LLPanelEditWearable::getPanel(EWearableType type)
+{
+ switch (type)
+ {
+ case WT_SHAPE:
+ return mPanelShape;
+ break;
+
+ case WT_SKIN:
+ return mPanelSkin;
+ break;
+
+ case WT_HAIR:
+ return mPanelHair;
+ break;
+
+ case WT_EYES:
+ return mPanelEyes;
+ break;
+
+ case WT_SHIRT:
+ return mPanelShirt;
+ break;
+
+ case WT_PANTS:
+ return mPanelPants;
+ break;
+
+ case WT_SHOES:
+ return mPanelShoes;
+ break;
+
+ case WT_SOCKS:
+ return mPanelSocks;
+ break;
+
+ case WT_JACKET:
+ return mPanelJacket;
+ break;
+
+ case WT_GLOVES:
+ return mPanelGloves;
+ break;
+
+ case WT_UNDERSHIRT:
+ return mPanelUndershirt;
+ break;
+
+ case WT_UNDERPANTS:
+ return mPanelUnderpants;
+ break;
+
+ case WT_SKIRT:
+ return mPanelSkirt;
+ break;
+
+ case WT_ALPHA:
+ return mPanelAlpha;
+ break;
+
+ case WT_TATTOO:
+ return mPanelTattoo;
+ break;
+ default:
+ break;
+ }
+ return NULL;
+}
+
+void LLPanelEditWearable::getSortedParams(value_map_t &sorted_params, const std::string &edit_group)
+{
+ LLWearable::visualParamCluster_t param_list;
+ ESex avatar_sex = gAgent.getAvatarObject()->getSex();
+
+ mWearablePtr->getVisualParams(param_list);
+
+ LLWearable::visualParamCluster_t::iterator iter = param_list.begin();
+ LLWearable::visualParamCluster_t::iterator end = param_list.end();
+
+ for (; iter != end; ++iter)
+ {
+ LLViewerVisualParam *param = (LLViewerVisualParam*) *iter;
+
+ if (param->getID() == -1
+ || param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE
+ || param->getEditGroup() != edit_group
+ || !(param->getSex() & avatar_sex))
+ {
+ continue;
+ }
+
+ value_map_t::value_type vt(-param->getDisplayOrder(), param);
+ llassert( sorted_params.find(-param->getDisplayOrder()) == sorted_params.end() ); //check for duplicates
+ sorted_params.insert(vt);
+ }
+}
+
+void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab)
+{
+ // sorted_params is sorted according to magnitude of effect from
+ // least to greatest. Adding to the front of the child list
+ // reverses that order.
+ if( panel_list )
+ {
+ panel_list->clearPanels();
+ value_map_t::iterator end = sorted_params.end();
+ S32 height = 0;
+ for(value_map_t::iterator it = sorted_params.begin(); it != end; ++it)
+ {
+ LLPanel::Params p;
+ p.name("LLScrollingPanelParam");
+ p.rect(LLRect(0, LLScrollingPanelParam::PARAM_PANEL_HEIGHT, LLScrollingPanelParam::PARAM_PANEL_WIDTH, 0 ));
+ LLScrollingPanelParam* panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable());
+ height = panel_list->addPanel( panel_param );
+ }
+
+ S32 width = tab->getRect().getWidth();
+
+ tab->reshape(width,height + tab->getHeaderHeight()+10,FALSE);
+ }
+}
+
+
+
+
+
diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h
new file mode 100644
index 0000000000..4178659617
--- /dev/null
+++ b/indra/newview/llpaneleditwearable.h
@@ -0,0 +1,114 @@
+/**
+ * @file llfloatercustomize.h
+ * @brief The customize avatar floater, triggered by "Appearance..."
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELEDITWEARABLE_H
+#define LL_LLPANELEDITWEARABLE_H
+
+#include "llpanel.h"
+#include "llscrollingpanellist.h"
+#include "llmodaldialog.h"
+#include "llwearabledictionary.h"
+
+class LLWearable;
+class LLTextEditor;
+class LLTextBox;
+class LLViewerVisualParam;
+class LLVisualParamHint;
+class LLViewerJointMesh;
+class LLAccordionCtrlTab;
+
+class LLPanelEditWearable : public LLPanel
+{
+public:
+ LLPanelEditWearable( );
+ virtual ~LLPanelEditWearable();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ BOOL isDirty() const; // LLUICtrl
+ /*virtual*/ void draw();
+
+ LLWearable* getWearable() { return mWearablePtr; }
+ void setWearable(LLWearable *wearable);
+
+ void saveChanges();
+ void revertChanges();
+
+ static void onRevertButtonClicked(void* userdata);
+
+private:
+ typedef std::map<F32, LLViewerVisualParam*> value_map_t;
+
+ void showWearable(LLWearable* wearable, BOOL show);
+ void initializePanel();
+ void updateScrollingPanelUI();
+ LLPanel* getPanel(EWearableType type);
+ void getSortedParams(value_map_t &sorted_params, const std::string &edit_group);
+ void buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab);
+
+ // the pointer to the wearable we're editing. NULL means we're not editing a wearable.
+ LLWearable *mWearablePtr;
+
+ // these are constant no matter what wearable we're editing
+ LLButton *mBtnRevert;
+ LLButton *mBtnBack;
+
+ LLTextBox *mPanelTitle;
+ LLTextBox *mDescTitle;
+
+
+ // This text editor reference will change each time we edit a new wearable -
+ // it will be grabbed from the currently visible panel
+ LLTextEditor *mTextEditor;
+
+ // The following panels will be shown/hidden based on what wearable we're editing
+ // body parts
+ LLPanel *mPanelShape;
+ LLPanel *mPanelSkin;
+ LLPanel *mPanelEyes;
+ LLPanel *mPanelHair;
+
+ //clothes
+ LLPanel *mPanelShirt;
+ LLPanel *mPanelPants;
+ LLPanel *mPanelShoes;
+ LLPanel *mPanelSocks;
+ LLPanel *mPanelJacket;
+ LLPanel *mPanelGloves;
+ LLPanel *mPanelUndershirt;
+ LLPanel *mPanelUnderpants;
+ LLPanel *mPanelSkirt;
+ LLPanel *mPanelAlpha;
+ LLPanel *mPanelTattoo;
+
+};
+
+#endif
diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp
index dbe6079ed5..02e11cefad 100644
--- a/indra/newview/llpolymesh.cpp
+++ b/indra/newview/llpolymesh.cpp
@@ -40,6 +40,7 @@
#include "llviewercontrol.h"
#include "llxmltree.h"
#include "llvoavatar.h"
+#include "llwearable.h"
#include "lldir.h"
#include "llvolume.h"
#include "llendianswizzle.h"
@@ -1117,6 +1118,13 @@ BOOL LLPolySkeletalDistortion::setInfo(LLPolySkeletalDistortionInfo *info)
return TRUE;
}
+/*virtual*/ LLViewerVisualParam * LLPolySkeletalDistortion::cloneParam(LLWearable* wearable) const
+{
+ LLPolySkeletalDistortion *new_param = new LLPolySkeletalDistortion(mAvatar);
+ *new_param = *this;
+ return new_param;
+}
+
//-----------------------------------------------------------------------------
// apply()
//-----------------------------------------------------------------------------
diff --git a/indra/newview/llpolymesh.h b/indra/newview/llpolymesh.h
index c23617749f..709b176c8d 100644
--- a/indra/newview/llpolymesh.h
+++ b/indra/newview/llpolymesh.h
@@ -46,6 +46,7 @@
class LLSkinJoint;
class LLVOAvatar;
+class LLWearable;
//#define USE_STRIPS // Use tri-strips for rendering.
@@ -416,6 +417,8 @@ public:
// This sets mInfo and calls initialization functions
BOOL setInfo(LLPolySkeletalDistortionInfo *info);
+ /*virtual*/ LLViewerVisualParam * cloneParam(LLWearable* wearable) const;
+
// LLVisualParam Virtual functions
///*virtual*/ BOOL parseData(LLXmlTreeNode* node);
/*virtual*/ void apply( ESex sex );
diff --git a/indra/newview/llpolymorph.cpp b/indra/newview/llpolymorph.cpp
index 3a57b6f9f7..924b1a4d6e 100644
--- a/indra/newview/llpolymorph.cpp
+++ b/indra/newview/llpolymorph.cpp
@@ -37,6 +37,7 @@
#include "llpolymorph.h"
#include "llvoavatar.h"
+#include "llwearable.h"
#include "llxmltree.h"
#include "llendianswizzle.h"
@@ -301,6 +302,13 @@ BOOL LLPolyMorphTarget::setInfo(LLPolyMorphTargetInfo* info)
return TRUE;
}
+/*virtual*/ LLViewerVisualParam * LLPolyMorphTarget::cloneParam(LLWearable* wearable) const
+{
+ LLPolyMorphTarget *new_param = new LLPolyMorphTarget(mMesh);
+ *new_param = *this;
+ return new_param;
+}
+
#if 0 // obsolete
//-----------------------------------------------------------------------------
// parseData()
diff --git a/indra/newview/llpolymorph.h b/indra/newview/llpolymorph.h
index f8dd52ca32..5089fc2e8a 100644
--- a/indra/newview/llpolymorph.h
+++ b/indra/newview/llpolymorph.h
@@ -42,6 +42,7 @@ class LLPolyMeshSharedData;
class LLVOAvatar;
class LLVector2;
class LLViewerJointCollisionVolume;
+class LLWearable;
//-----------------------------------------------------------------------------
// LLPolyMorphData()
@@ -153,6 +154,8 @@ public:
// This sets mInfo and calls initialization functions
BOOL setInfo(LLPolyMorphTargetInfo *info);
+ /*virtual*/ LLViewerVisualParam * cloneParam(LLWearable* wearable) const;
+
// LLVisualParam Virtual functions
///*virtual*/ BOOL parseData(LLXmlTreeNode* node);
/*virtual*/ void apply( ESex sex );
diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp
new file mode 100644
index 0000000000..1013d5adb7
--- /dev/null
+++ b/indra/newview/llscrollingpanelparam.cpp
@@ -0,0 +1,388 @@
+/**
+ * @file llscrollingpanelparam.cpp
+ * @brief UI panel for a list of visual param panels
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llscrollingpanelparam.h"
+#include "llviewerjointmesh.h"
+#include "llviewervisualparam.h"
+#include "llwearable.h"
+#include "llviewervisualparam.h"
+#include "lltoolmorph.h"
+#include "lltrans.h"
+#include "llbutton.h"
+#include "llsliderctrl.h"
+#include "llagent.h"
+#include "llvoavatarself.h"
+
+// Constants for LLPanelVisualParam
+const static F32 PARAM_STEP_TIME_THRESHOLD = 0.25f;
+
+const static S32 BTN_BORDER = 2;
+const static S32 PARAM_HINT_WIDTH = 128;
+const static S32 PARAM_HINT_HEIGHT = 128;
+const static S32 PARAM_HINT_LABEL_HEIGHT = 16;
+const static S32 PARAM_PANEL_WIDTH = 2 * (3* BTN_BORDER + PARAM_HINT_WIDTH + LLPANEL_BORDER_WIDTH);
+const static S32 PARAM_PANEL_HEIGHT = 2 * BTN_BORDER + PARAM_HINT_HEIGHT + PARAM_HINT_LABEL_HEIGHT + 4 * LLPANEL_BORDER_WIDTH;
+
+// LLScrollingPanelParam
+//static
+S32 LLScrollingPanelParam::sUpdateDelayFrames = 0;
+
+LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_params,
+ LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable )
+ : LLScrollingPanel( panel_params ),
+ mParam(param),
+ mAllowModify(allow_modify),
+ mWearable(wearable)
+{
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_scrolling_param.xml");
+
+ static LLUICachedControl<S32> slider_ctrl_height ("UISliderctrlHeight", 0);
+ S32 pos_x = 2 * LLPANEL_BORDER_WIDTH;
+ S32 pos_y = 3 * LLPANEL_BORDER_WIDTH + slider_ctrl_height;
+ F32 min_weight = param->getMinWeight();
+ F32 max_weight = param->getMaxWeight();
+
+ mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param, min_weight);
+ pos_x += PARAM_HINT_WIDTH + 3 * BTN_BORDER;
+ mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param, max_weight );
+
+ mHintMin->setAllowsUpdates( FALSE );
+ mHintMax->setAllowsUpdates( FALSE );
+ childSetValue("param slider", weightToPercent(param->getWeight()));
+
+ std::string display_name = LLTrans::getString(param->getDisplayName());
+ childSetLabelArg("param slider", "[DESC]", display_name);
+ childSetEnabled("param slider", mAllowModify);
+ childSetCommitCallback("param slider", LLScrollingPanelParam::onSliderMoved, this);
+
+ // *TODO: Translate
+ std::string min_name = param->getMinDisplayName();
+ std::string max_name = param->getMaxDisplayName();
+ childSetValue("min param text", min_name);
+ childSetValue("max param text", max_name);
+
+ LLButton* less = getChild<LLButton>("less");
+ if (less)
+ {
+ less->setMouseDownCallback( LLScrollingPanelParam::onHintMinMouseDown, this );
+ less->setMouseUpCallback( LLScrollingPanelParam::onHintMinMouseUp, this );
+ less->setHeldDownCallback( LLScrollingPanelParam::onHintMinHeldDown, this );
+ less->setHeldDownDelay( PARAM_STEP_TIME_THRESHOLD );
+ }
+
+ LLButton* more = getChild<LLButton>("more");
+ if (more)
+ {
+ more->setMouseDownCallback( LLScrollingPanelParam::onHintMaxMouseDown, this );
+ more->setMouseUpCallback( LLScrollingPanelParam::onHintMaxMouseUp, this );
+ more->setHeldDownCallback( LLScrollingPanelParam::onHintMaxHeldDown, this );
+ more->setHeldDownDelay( PARAM_STEP_TIME_THRESHOLD );
+ }
+
+ setVisible(FALSE);
+ setBorderVisible( FALSE );
+}
+
+LLScrollingPanelParam::~LLScrollingPanelParam()
+{
+}
+void LLScrollingPanelParam::updatePanel(BOOL allow_modify)
+{
+ LLViewerVisualParam* param = mHintMin->getVisualParam();
+
+ if (!mWearable)
+ {
+ // not editing a wearable just now, no update necessary
+ return;
+ }
+ F32 current_weight = mWearable->getVisualParamWeight( param->getID() );
+ childSetValue("param slider", weightToPercent( current_weight ) );
+ mHintMin->requestUpdate( sUpdateDelayFrames++ );
+ mHintMax->requestUpdate( sUpdateDelayFrames++ );
+
+ mAllowModify = allow_modify;
+ childSetEnabled("param slider", mAllowModify);
+ childSetEnabled("less", mAllowModify);
+ childSetEnabled("more", mAllowModify);
+}
+
+void LLScrollingPanelParam::setVisible( BOOL visible )
+{
+ if( getVisible() != visible )
+ {
+ LLPanel::setVisible( visible );
+ mHintMin->setAllowsUpdates( visible );
+ mHintMax->setAllowsUpdates( visible );
+
+ if( visible )
+ {
+ mHintMin->setUpdateDelayFrames( sUpdateDelayFrames++ );
+ mHintMax->setUpdateDelayFrames( sUpdateDelayFrames++ );
+ }
+ }
+}
+
+void LLScrollingPanelParam::draw()
+{
+ if( !mWearable )
+ {
+ return;
+ }
+
+ childSetVisible("less", mHintMin->getVisible());
+ childSetVisible("more", mHintMax->getVisible());
+
+ // Draw all the children except for the labels
+ childSetVisible( "min param text", FALSE );
+ childSetVisible( "max param text", FALSE );
+ LLPanel::draw();
+
+ // Draw the hints over the "less" and "more" buttons.
+ glPushMatrix();
+ {
+ const LLRect& r = mHintMin->getRect();
+ F32 left = (F32)(r.mLeft + BTN_BORDER);
+ F32 bot = (F32)(r.mBottom + BTN_BORDER);
+ glTranslatef(left, bot, 0.f);
+ mHintMin->draw();
+ }
+ glPopMatrix();
+
+ glPushMatrix();
+ {
+ const LLRect& r = mHintMax->getRect();
+ F32 left = (F32)(r.mLeft + BTN_BORDER);
+ F32 bot = (F32)(r.mBottom + BTN_BORDER);
+ glTranslatef(left, bot, 0.f);
+ mHintMax->draw();
+ }
+ glPopMatrix();
+
+
+ // Draw labels on top of the buttons
+ childSetVisible( "min param text", TRUE );
+ drawChild(getChild<LLView>("min param text"), BTN_BORDER, BTN_BORDER);
+
+ childSetVisible( "max param text", TRUE );
+ drawChild(getChild<LLView>("max param text"), BTN_BORDER, BTN_BORDER);
+}
+
+// static
+void LLScrollingPanelParam::onSliderMoved(LLUICtrl* ctrl, void* userdata)
+{
+ LLSliderCtrl* slider = (LLSliderCtrl*) ctrl;
+ LLScrollingPanelParam* self = (LLScrollingPanelParam*) userdata;
+ LLViewerVisualParam* param = self->mParam;
+
+ F32 current_weight = self->mWearable->getVisualParamWeight( param->getID() );
+ F32 new_weight = self->percentToWeight( (F32)slider->getValue().asReal() );
+ if (current_weight != new_weight )
+ {
+ self->mWearable->setVisualParamWeight( param->getID(), new_weight, TRUE );
+ gAgent.getAvatarObject()->updateVisualParams();
+ }
+}
+
+// static
+void LLScrollingPanelParam::onSliderMouseDown(LLUICtrl* ctrl, void* userdata)
+{
+}
+
+// static
+void LLScrollingPanelParam::onSliderMouseUp(LLUICtrl* ctrl, void* userdata)
+{
+ LLScrollingPanelParam* self = (LLScrollingPanelParam*) userdata;
+
+ LLVisualParamHint::requestHintUpdates( self->mHintMin, self->mHintMax );
+}
+
+// static
+void LLScrollingPanelParam::onHintMinMouseDown( void* userdata )
+{
+ LLScrollingPanelParam* self = (LLScrollingPanelParam*) userdata;
+ self->onHintMouseDown( self->mHintMin );
+}
+
+// static
+void LLScrollingPanelParam::onHintMaxMouseDown( void* userdata )
+{
+ LLScrollingPanelParam* self = (LLScrollingPanelParam*) userdata;
+ self->onHintMouseDown( self->mHintMax );
+}
+
+
+void LLScrollingPanelParam::onHintMouseDown( LLVisualParamHint* hint )
+{
+ // morph towards this result
+ F32 current_weight = mWearable->getVisualParamWeight( hint->getVisualParam()->getID() );
+
+ // if we have maxed out on this morph, we shouldn't be able to click it
+ if( hint->getVisualParamWeight() != current_weight )
+ {
+ mMouseDownTimer.reset();
+ mLastHeldTime = 0.f;
+ }
+}
+
+// static
+void LLScrollingPanelParam::onHintMinHeldDown( void* userdata )
+{
+ LLScrollingPanelParam* self = (LLScrollingPanelParam*) userdata;
+ self->onHintHeldDown( self->mHintMin );
+}
+
+// static
+void LLScrollingPanelParam::onHintMaxHeldDown( void* userdata )
+{
+ LLScrollingPanelParam* self = (LLScrollingPanelParam*) userdata;
+ self->onHintHeldDown( self->mHintMax );
+}
+
+void LLScrollingPanelParam::onHintHeldDown( LLVisualParamHint* hint )
+{
+ F32 current_weight = mWearable->getVisualParamWeight( hint->getVisualParam()->getID() );
+
+ if (current_weight != hint->getVisualParamWeight() )
+ {
+ const F32 FULL_BLEND_TIME = 2.f;
+ F32 elapsed_time = mMouseDownTimer.getElapsedTimeF32() - mLastHeldTime;
+ mLastHeldTime += elapsed_time;
+
+ F32 new_weight;
+ if (current_weight > hint->getVisualParamWeight() )
+ {
+ new_weight = current_weight - (elapsed_time / FULL_BLEND_TIME);
+ }
+ else
+ {
+ new_weight = current_weight + (elapsed_time / FULL_BLEND_TIME);
+ }
+
+ // Make sure we're not taking the slider out of bounds
+ // (this is where some simple UI limits are stored)
+ F32 new_percent = weightToPercent(new_weight);
+ LLSliderCtrl* slider = getChild<LLSliderCtrl>("param slider");
+ if (slider)
+ {
+ if (slider->getMinValue() < new_percent
+ && new_percent < slider->getMaxValue())
+ {
+ mWearable->setVisualParamWeight( hint->getVisualParam()->getID(), new_weight, TRUE);
+ gAgent.getAvatarObject()->updateVisualParams();
+
+ slider->setValue( weightToPercent( new_weight ) );
+ }
+ }
+ }
+}
+
+// static
+void LLScrollingPanelParam::onHintMinMouseUp( void* userdata )
+{
+ LLScrollingPanelParam* self = (LLScrollingPanelParam*) userdata;
+
+ F32 elapsed_time = self->mMouseDownTimer.getElapsedTimeF32();
+
+ LLVisualParamHint* hint = self->mHintMin;
+
+ if (elapsed_time < PARAM_STEP_TIME_THRESHOLD)
+ {
+ // step in direction
+ F32 current_weight = self->mWearable->getVisualParamWeight( hint->getVisualParam()->getID() );
+ F32 range = self->mHintMax->getVisualParamWeight() - self->mHintMin->getVisualParamWeight();
+ // step a fraction in the negative directiona
+ F32 new_weight = current_weight - (range / 10.f);
+ F32 new_percent = self->weightToPercent(new_weight);
+ LLSliderCtrl* slider = self->getChild<LLSliderCtrl>("param slider");
+ if (slider)
+ {
+ if (slider->getMinValue() < new_percent
+ && new_percent < slider->getMaxValue())
+ {
+ self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, TRUE);
+ slider->setValue( self->weightToPercent( new_weight ) );
+ }
+ }
+ }
+
+ LLVisualParamHint::requestHintUpdates( self->mHintMin, self->mHintMax );
+}
+
+void LLScrollingPanelParam::onHintMaxMouseUp( void* userdata )
+{
+ LLScrollingPanelParam* self = (LLScrollingPanelParam*) userdata;
+
+ F32 elapsed_time = self->mMouseDownTimer.getElapsedTimeF32();
+
+ LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
+ if (avatar)
+ {
+ LLVisualParamHint* hint = self->mHintMax;
+
+ if (elapsed_time < PARAM_STEP_TIME_THRESHOLD)
+ {
+ // step in direction
+ F32 current_weight = self->mWearable->getVisualParamWeight( hint->getVisualParam()->getID() );
+ F32 range = self->mHintMax->getVisualParamWeight() - self->mHintMin->getVisualParamWeight();
+ // step a fraction in the negative direction
+ F32 new_weight = current_weight + (range / 10.f);
+ F32 new_percent = self->weightToPercent(new_weight);
+ LLSliderCtrl* slider = self->getChild<LLSliderCtrl>("param slider");
+ if (slider)
+ {
+ if (slider->getMinValue() < new_percent
+ && new_percent < slider->getMaxValue())
+ {
+ self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, TRUE);
+ slider->setValue( self->weightToPercent( new_weight ) );
+ }
+ }
+ }
+ }
+
+ LLVisualParamHint::requestHintUpdates( self->mHintMin, self->mHintMax );
+}
+
+
+F32 LLScrollingPanelParam::weightToPercent( F32 weight )
+{
+ LLViewerVisualParam* param = mParam;
+ return (weight - param->getMinWeight()) / (param->getMaxWeight() - param->getMinWeight()) * 100.f;
+}
+
+F32 LLScrollingPanelParam::percentToWeight( F32 percent )
+{
+ LLViewerVisualParam* param = mParam;
+ return percent / 100.f * (param->getMaxWeight() - param->getMinWeight()) + param->getMinWeight();
+}
diff --git a/indra/newview/llscrollingpanelparam.h b/indra/newview/llscrollingpanelparam.h
new file mode 100644
index 0000000000..8c5db64816
--- /dev/null
+++ b/indra/newview/llscrollingpanelparam.h
@@ -0,0 +1,100 @@
+/**
+ * @file llscrollingpanelparam.h
+ * @brief the scrolling panel containing a list of visual param
+ * panels
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_SCROLLINGPANELPARAM_H
+#define LL_SCROLLINGPANELPARAM_H
+
+#include "llpanel.h"
+#include "llscrollingpanellist.h"
+
+class LLViewerJointMesh;
+class LLViewerVisualParam;
+class LLWearable;
+class LLVisualParamHint;
+class LLViewerVisualParam;
+
+class LLScrollingPanelParam : public LLScrollingPanel
+{
+public:
+ LLScrollingPanelParam( const LLPanel::Params& panel_params,
+ LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable );
+ virtual ~LLScrollingPanelParam();
+
+ virtual void draw();
+ virtual void setVisible( BOOL visible );
+ virtual void updatePanel(BOOL allow_modify);
+
+ static void onSliderMouseDown(LLUICtrl* ctrl, void* userdata);
+ static void onSliderMoved(LLUICtrl* ctrl, void* userdata);
+ static void onSliderMouseUp(LLUICtrl* ctrl, void* userdata);
+
+ static void onHintMinMouseDown(void* userdata);
+ static void onHintMinHeldDown(void* userdata);
+ static void onHintMaxMouseDown(void* userdata);
+ static void onHintMaxHeldDown(void* userdata);
+ static void onHintMinMouseUp(void* userdata);
+ static void onHintMaxMouseUp(void* userdata);
+
+ void onHintMouseDown( LLVisualParamHint* hint );
+ void onHintHeldDown( LLVisualParamHint* hint );
+
+ F32 weightToPercent( F32 weight );
+ F32 percentToWeight( F32 percent );
+
+public:
+ // Constants for LLPanelVisualParam
+ const static F32 PARAM_STEP_TIME_THRESHOLD;
+
+ const static S32 BTN_BORDER;
+ const static S32 PARAM_HINT_WIDTH;
+ const static S32 PARAM_HINT_HEIGHT;
+ const static S32 PARAM_HINT_LABEL_HEIGHT;
+ const static S32 PARAM_PANEL_WIDTH;
+ const static S32 PARAM_PANEL_HEIGHT;
+
+
+public:
+ LLViewerVisualParam* mParam;
+ LLPointer<LLVisualParamHint> mHintMin;
+ LLPointer<LLVisualParamHint> mHintMax;
+ static S32 sUpdateDelayFrames;
+
+protected:
+ LLTimer mMouseDownTimer; // timer for how long mouse has been held down on a hint.
+ F32 mLastHeldTime;
+
+ BOOL mAllowModify;
+ LLWearable *mWearable;
+};
+
+#endif
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 7bf0d31d94..9f317803ce 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -659,8 +659,11 @@ void LLSpatialPartition::rebuildGeom(LLSpatialGroup* group)
return;
}
- group->mLastUpdateDistance = group->mDistance;
- group->mLastUpdateViewAngle = group->mViewAngle;
+ if (group->changeLOD())
+ {
+ group->mLastUpdateDistance = group->mDistance;
+ group->mLastUpdateViewAngle = group->mViewAngle;
+ }
LLFastTimer ftm(FTM_REBUILD_VBO);
diff --git a/indra/newview/lltexglobalcolor.cpp b/indra/newview/lltexglobalcolor.cpp
index e81c3731f7..d0bb9e1cf1 100644
--- a/indra/newview/lltexglobalcolor.cpp
+++ b/indra/newview/lltexglobalcolor.cpp
@@ -33,6 +33,7 @@
#include "llagent.h"
#include "lltexlayer.h"
#include "llvoavatar.h"
+#include "llwearable.h"
#include "lltexglobalcolor.h"
//-----------------------------------------------------------------------------
@@ -64,7 +65,7 @@ BOOL LLTexGlobalColor::setInfo(LLTexGlobalColorInfo *info)
iter++)
{
LLTexParamGlobalColor* param_color = new LLTexParamGlobalColor(this);
- if (!param_color->setInfo(*iter))
+ if (!param_color->setInfo(*iter, TRUE))
{
mInfo = NULL;
return FALSE;
@@ -95,10 +96,16 @@ const std::string& LLTexGlobalColor::getName() const
// LLTexParamGlobalColor
//-----------------------------------------------------------------------------
LLTexParamGlobalColor::LLTexParamGlobalColor(LLTexGlobalColor* tex_global_color) :
- LLTexLayerParamColor((LLTexLayer*)NULL),
+ LLTexLayerParamColor(tex_global_color->getAvatar()),
mTexGlobalColor(tex_global_color)
{
- mAvatar = tex_global_color->getAvatar();
+}
+
+/*virtual*/ LLViewerVisualParam * LLTexParamGlobalColor::cloneParam(LLWearable* wearable) const
+{
+ LLTexParamGlobalColor *new_param = new LLTexParamGlobalColor(mTexGlobalColor);
+ *new_param = *this;
+ return new_param;
}
void LLTexParamGlobalColor::onGlobalColorChanged(bool set_by_user)
diff --git a/indra/newview/lltexglobalcolor.h b/indra/newview/lltexglobalcolor.h
index 154b814392..f0d22d317c 100644
--- a/indra/newview/lltexglobalcolor.h
+++ b/indra/newview/lltexglobalcolor.h
@@ -36,6 +36,7 @@
#include "lltexlayerparams.h"
class LLVOAvatar;
+class LLWearable;
class LLTexGlobalColorInfo;
class LLTexGlobalColor
@@ -67,7 +68,7 @@ public:
~LLTexGlobalColorInfo();
BOOL parseXml(LLXmlTreeNode* node);
-
+
private:
param_color_info_list_t mParamColorInfoList;
std::string mName;
@@ -77,6 +78,7 @@ class LLTexParamGlobalColor : public LLTexLayerParamColor
{
public:
LLTexParamGlobalColor(LLTexGlobalColor *tex_color);
+ /*virtual*/ LLViewerVisualParam * cloneParam(LLWearable* wearable) const;
protected:
/*virtual*/ void onGlobalColorChanged(bool set_by_user);
private:
diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp
index 5a5f187415..de8458c0fa 100644
--- a/indra/newview/lltexlayer.cpp
+++ b/indra/newview/lltexlayer.cpp
@@ -41,6 +41,9 @@
#include "llassetuploadresponders.h"
#include "lltexlayerparams.h"
#include "llui.h"
+#include "llagentwearables.h"
+#include "llwearable.h"
+#include "llviewervisualparam.h"
//#include "../tools/imdebug/imdebug.h"
@@ -66,90 +69,45 @@ LLBakedUploadData::LLBakedUploadData(const LLVOAvatarSelf* avatar,
// static
S32 LLTexLayerSetBuffer::sGLByteCount = 0;
-S32 LLTexLayerSetBuffer::sGLBumpByteCount = 0;
LLTexLayerSetBuffer::LLTexLayerSetBuffer(LLTexLayerSet* const owner,
- S32 width, S32 height,
- BOOL has_bump) :
+ S32 width, S32 height) :
// ORDER_LAST => must render these after the hints are created.
LLViewerDynamicTexture( width, height, 4, LLViewerDynamicTexture::ORDER_LAST, TRUE ),
mNeedsUpdate( TRUE ),
mNeedsUpload( FALSE ),
mUploadPending( FALSE ), // Not used for any logic here, just to sync sending of updates
- mTexLayerSet(owner),
- mHasBump(has_bump),
- mBumpTex(NULL)
+ mTexLayerSet(owner)
{
LLTexLayerSetBuffer::sGLByteCount += getSize();
- createBumpTexture() ;
}
LLTexLayerSetBuffer::~LLTexLayerSetBuffer()
{
LLTexLayerSetBuffer::sGLByteCount -= getSize();
-
- if( mBumpTex.notNull())
+ destroyGLTexture();
+ for( S32 order = 0; order < ORDER_COUNT; order++ )
{
- mBumpTex = NULL ;
- LLImageGL::sGlobalTextureMemoryInBytes -= mFullWidth * mFullHeight * 4;
- LLTexLayerSetBuffer::sGLBumpByteCount -= mFullWidth * mFullHeight * 4;
+ LLViewerDynamicTexture::sInstances[order].erase(this); // will fail in all but one case.
}
}
//virtual
void LLTexLayerSetBuffer::restoreGLTexture()
{
- createBumpTexture() ;
LLViewerDynamicTexture::restoreGLTexture() ;
}
//virtual
void LLTexLayerSetBuffer::destroyGLTexture()
{
- if( mBumpTex.notNull() )
- {
- mBumpTex = NULL ;
- LLImageGL::sGlobalTextureMemoryInBytes -= mFullWidth * mFullHeight * 4;
- LLTexLayerSetBuffer::sGLBumpByteCount -= mFullWidth * mFullHeight * 4;
- }
-
LLViewerDynamicTexture::destroyGLTexture() ;
}
-void LLTexLayerSetBuffer::createBumpTexture()
-{
- if( mHasBump )
- {
- LLGLSUIDefault gls_ui;
- mBumpTex = LLViewerTextureManager::getLocalTexture(FALSE) ;
- if(!mBumpTex->createGLTexture())
- {
- mBumpTex = NULL ;
- return ;
- }
-
- gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mBumpTex->getTexName());
- stop_glerror();
-
- gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
-
- gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
-
- LLImageGL::setManualImage(GL_TEXTURE_2D, 0, GL_RGBA8, mFullWidth, mFullHeight, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
- stop_glerror();
-
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-
- LLImageGL::sGlobalTextureMemoryInBytes += mFullWidth * mFullHeight * 4;
- LLTexLayerSetBuffer::sGLBumpByteCount += mFullWidth * mFullHeight * 4;
- }
-}
-
// static
void LLTexLayerSetBuffer::dumpTotalByteCount()
{
llinfos << "Composite System GL Buffers: " << (LLTexLayerSetBuffer::sGLByteCount/1024) << "KB" << llendl;
- llinfos << "Composite System GL Bump Buffers: " << (LLTexLayerSetBuffer::sGLBumpByteCount/1024) << "KB" << llendl;
}
void LLTexLayerSetBuffer::requestUpdate()
@@ -242,8 +200,6 @@ void LLTexLayerSetBuffer::postRender(BOOL success)
BOOL LLTexLayerSetBuffer::render()
{
- U8* baked_bump_data = NULL;
-
// Default color mask for tex layer render
gGL.setColorMask(true, true);
@@ -252,33 +208,6 @@ BOOL LLTexLayerSetBuffer::render()
BOOL upload_now = (gAgentQueryManager.hasNoPendingQueries() && mNeedsUpload && mTexLayerSet->isLocalTextureDataFinal());
BOOL success = TRUE;
- // Composite bump
- if( mBumpTex.notNull() )
- {
- // Composite the bump data
- success &= mTexLayerSet->renderBump( mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight );
- stop_glerror();
-
- if (success)
- {
- LLGLSUIDefault gls_ui;
-
- // read back into texture (this is done externally for the color data)
- gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mBumpTex->getTexName());
- stop_glerror();
-
- glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight);
- stop_glerror();
-
- // if we need to upload the data, read it back into a buffer
- if( upload_now )
- {
- baked_bump_data = new U8[ mFullWidth * mFullHeight * 4 ];
- glReadPixels(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, GL_RGBA, GL_UNSIGNED_BYTE, baked_bump_data );
- stop_glerror();
- }
- }
- }
// Composite the color data
LLGLSUIDefault gls_ui;
@@ -294,7 +223,7 @@ BOOL LLTexLayerSetBuffer::render()
}
else
{
- readBackAndUpload(baked_bump_data);
+ readBackAndUpload();
}
}
@@ -306,7 +235,6 @@ BOOL LLTexLayerSetBuffer::render()
mGLTexturep->setGLTextureCreated(true);
mNeedsUpdate = FALSE;
- delete [] baked_bump_data;
return success;
}
@@ -330,7 +258,7 @@ BOOL LLTexLayerSetBuffer::updateImmediate()
return result;
}
-void LLTexLayerSetBuffer::readBackAndUpload(const U8* baked_bump_data)
+void LLTexLayerSetBuffer::readBackAndUpload()
{
// pointers for storing data to upload
U8* baked_color_data = new U8[ mFullWidth * mFullHeight * 4 ];
@@ -358,44 +286,25 @@ void LLTexLayerSetBuffer::readBackAndUpload(const U8* baked_bump_data)
// writes into baked_color_data
const char* comment_text = NULL;
- S32 baked_image_components = mBumpTex.notNull() ? 5 : 4; // red green blue [bump] clothing
+ S32 baked_image_components = 5; // red green blue [bump] clothing
LLPointer<LLImageRaw> baked_image = new LLImageRaw( mFullWidth, mFullHeight, baked_image_components );
U8* baked_image_data = baked_image->getData();
-
- if( mBumpTex.notNull() )
- {
- comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // 5 channels: rgb, heightfield/alpha, mask
+ comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // 5 channels: rgb, heightfield/alpha, mask
- S32 i = 0;
- for( S32 u = 0; u < mFullWidth; u++ )
- {
- for( S32 v = 0; v < mFullHeight; v++ )
- {
- baked_image_data[5*i + 0] = baked_color_data[4*i + 0];
- baked_image_data[5*i + 1] = baked_color_data[4*i + 1];
- baked_image_data[5*i + 2] = baked_color_data[4*i + 2];
- baked_image_data[5*i + 3] = baked_color_data[4*i + 3]; // alpha should be correct for eyelashes.
- baked_image_data[5*i + 4] = baked_mask_data[i];
- i++;
- }
- }
- }
- else
+ S32 i = 0;
+ for( S32 u = 0; u < mFullWidth; u++ )
+ {
+ for( S32 v = 0; v < mFullHeight; v++ )
{
- S32 i = 0;
- for( S32 u = 0; u < mFullWidth; u++ )
- {
- for( S32 v = 0; v < mFullHeight; v++ )
- {
- baked_image_data[4*i + 0] = baked_color_data[4*i + 0];
- baked_image_data[4*i + 1] = baked_color_data[4*i + 1];
- baked_image_data[4*i + 2] = baked_color_data[4*i + 2];
- baked_image_data[4*i + 3] = baked_color_data[4*i + 3]; // Use alpha, not bump
- i++;
- }
- }
+ baked_image_data[5*i + 0] = baked_color_data[4*i + 0];
+ baked_image_data[5*i + 1] = baked_color_data[4*i + 1];
+ baked_image_data[5*i + 2] = baked_color_data[4*i + 2];
+ baked_image_data[5*i + 3] = baked_color_data[4*i + 3]; // alpha should be correct for eyelashes.
+ baked_image_data[5*i + 4] = baked_mask_data[i];
+ i++;
}
+ }
LLPointer<LLImageJ2C> compressedImage = new LLImageJ2C;
compressedImage->setRate(0.f);
@@ -548,23 +457,6 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
delete baked_upload_data;
}
-void LLTexLayerSetBuffer::bindBumpTexture( U32 stage )
-{
- if( mBumpTex.notNull() )
- {
- gGL.getTexUnit(stage)->bindManual(LLTexUnit::TT_TEXTURE, mBumpTex->getTexName());
- gGL.getTexUnit(0)->activate();
-
- mGLTexturep->updateBindStats(mFullWidth * mFullHeight * 4);
- }
- else
- {
- gGL.getTexUnit(stage)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.getTexUnit(0)->activate();
- }
-}
-
-
//-----------------------------------------------------------------------------
// LLTexLayerSet
// An ordered set of texture layers that get composited into a single texture.
@@ -659,7 +551,6 @@ LLTexLayerSet::LLTexLayerSet(LLVOAvatarSelf* const avatar) :
mComposite( NULL ),
mAvatar( avatar ),
mUpdatesEnabled( FALSE ),
- mHasBump( FALSE ),
mInfo( NULL )
{
}
@@ -686,16 +577,25 @@ BOOL LLTexLayerSet::setInfo(const LLTexLayerSetInfo *info)
iter != info->mLayerInfoList.end();
iter++)
{
- LLTexLayer* layer = new LLTexLayer( this );
- if (!layer->setInfo(*iter))
+ LLTexLayerInterface *layer = NULL;
+ if ( (*iter)->isUserSettable() )
+ {
+ layer = new LLTexLayerTemplate( this );
+ }
+ else
+ {
+ layer = new LLTexLayer(this);
+ }
+ // this is the first time this layer (of either type) is being created - make sure you add the parameters to the avatar
+ if (!layer->setInfo(*iter, NULL))
{
mInfo = NULL;
return FALSE;
}
if (!layer->isVisibilityMask())
{
- mLayerList.push_back( layer );
- }
+ mLayerList.push_back( layer );
+ }
else
{
mMaskLayerList.push_back(layer);
@@ -736,12 +636,12 @@ void LLTexLayerSet::deleteCaches()
{
for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
{
- LLTexLayer* layer = *iter;
+ LLTexLayerInterface* layer = *iter;
layer->deleteCaches();
}
for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++)
{
- LLTexLayer* layer = *iter;
+ LLTexLayerInterface* layer = *iter;
layer->deleteCaches();
}
}
@@ -772,10 +672,22 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
BOOL render_morph = mAvatar->morphMaskNeedsUpdate(mBakedTexIndex);
+ // clear buffer area to ensure we don't pick up UI elements
+ {
+ gGL.flush();
+ LLGLDisable no_alpha(GL_ALPHA_TEST);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.color4f( 0.f, 0.f, 0.f, 1.f );
+
+ gl_rect_2d_simple( width, height );
+
+ gGL.flush();
+ }
+
// composite color layers
for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
{
- LLTexLayer* layer = *iter;
+ LLTexLayerInterface* layer = *iter;
if (layer->getRenderPass() == LLTexLayer::RP_COLOR)
{
gGL.flush();
@@ -788,44 +700,13 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
}
}
- renderAlphaMaskTextures(width, height, false);
+ renderAlphaMaskTextures(x, y, width, height, false);
stop_glerror();
return success;
}
-BOOL LLTexLayerSet::renderBump( S32 x, S32 y, S32 width, S32 height )
-{
- BOOL success = TRUE;
-
- LLGLSUIDefault gls_ui;
- LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE);
-
- //static S32 bump_layer_count = 1;
-
- for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
- {
- LLTexLayer* layer = *iter;
- if (layer->getRenderPass() == LLTexLayer::RP_BUMP)
- {
-// success &= layer->render(x, y, width, height);
- }
- }
-
- // Set the alpha channel to one (clean up after previous blending)
- LLGLDisable no_alpha(GL_ALPHA_TEST);
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.color4f( 0.f, 0.f, 0.f, 1.f );
- gGL.setColorMask(false, true);
-
- gl_rect_2d_simple( width, height );
-
- gGL.setColorMask(true, true);
- stop_glerror();
-
- return success;
-}
BOOL LLTexLayerSet::isBodyRegion(const std::string& region) const
{
@@ -869,11 +750,9 @@ void LLTexLayerSet::createComposite()
// Composite other avatars at reduced resolution
if( !mAvatar->isSelf() )
{
- // TODO: replace with sanity check to ensure not called for non-self avatars
-// width /= 2;
-// height /= 2;
+ llerrs << "composites should not be created for non-self avatars!" << llendl;
}
- mComposite = new LLTexLayerSetBuffer( this, width, height, mHasBump );
+ mComposite = new LLTexLayerSetBuffer( this, width, height );
}
}
@@ -905,44 +784,21 @@ LLTexLayerSetBuffer* LLTexLayerSet::getComposite()
void LLTexLayerSet::gatherMorphMaskAlpha(U8 *data, S32 width, S32 height)
{
- S32 size = width * height;
-
memset(data, 255, width * height);
BOOL render_morph = mAvatar->morphMaskNeedsUpdate(mBakedTexIndex);
for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
{
- LLTexLayer* layer = *iter;
- U8* alphaData = layer->getAlphaData();
- if (!alphaData && layer->hasAlphaParams())
- {
- LLColor4 net_color;
- layer->findNetColor( &net_color );
- // TODO: eliminate need for layer morph mask valid flag
- layer->invalidateMorphMasks();
- mAvatar->invalidateMorphMasks(mBakedTexIndex);
- layer->renderMorphMasks(mComposite->getOriginX(), mComposite->getOriginY(), width, height, net_color, render_morph);
- alphaData = layer->getAlphaData();
- }
- if (alphaData)
- {
- for( S32 i = 0; i < size; i++ )
- {
- U8 curAlpha = data[i];
- U16 resultAlpha = curAlpha;
- resultAlpha *= (alphaData[i] + 1);
- resultAlpha = resultAlpha >> 8;
- data[i] = (U8)resultAlpha;
- }
- }
+ LLTexLayerInterface* layer = *iter;
+ layer->gatherAlphaMasks(data, mComposite->getOriginX(),mComposite->getOriginY(), width, height, render_morph);
}
// Set alpha back to that of our alpha masks.
- renderAlphaMaskTextures(width, height, true);
+ renderAlphaMaskTextures(mComposite->getOriginX(), mComposite->getOriginY(), width, height, true);
}
-void LLTexLayerSet::renderAlphaMaskTextures(S32 width, S32 height, bool forceClear)
+void LLTexLayerSet::renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear)
{
const LLTexLayerSetInfo *info = getInfo();
@@ -986,9 +842,9 @@ void LLTexLayerSet::renderAlphaMaskTextures(S32 width, S32 height, bool forceCle
gGL.getTexUnit(0)->setTextureBlendType( LLTexUnit::TB_REPLACE );
for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++)
{
- LLTexLayer* layer = *iter;
+ LLTexLayerInterface* layer = *iter;
gGL.flush();
- layer->blendAlphaTexture(width, height);
+ layer->blendAlphaTexture(x,y,width, height);
gGL.flush();
}
@@ -1006,23 +862,6 @@ void LLTexLayerSet::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_
mAvatar->applyMorphMask(tex_data, width, height, num_components, mBakedTexIndex);
}
-//-----------------------------------------------------------------------------
-// finds a specific layer based on a passed in name
-//-----------------------------------------------------------------------------
-LLTexLayer* LLTexLayerSet::findLayerByName(std::string name)
-{
- for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
- {
- LLTexLayer* layer = *iter;
-
- if (layer->getName().compare(name) == 0)
- {
- return layer;
- }
- }
- return NULL;
-}
-
//-----------------------------------------------------------------------------
// LLTexLayerInfo
@@ -1190,7 +1029,7 @@ BOOL LLTexLayerInfo::createVisualParams(LLVOAvatar *avatar)
{
LLTexLayerParamColorInfo * color_info = *color_info_iter;
LLTexLayerParamColor* param_color = new LLTexLayerParamColor(avatar);
- if (!param_color->setInfo(color_info))
+ if (!param_color->setInfo(color_info, TRUE))
{
llwarns << "NULL TexLayer Color Param could not be added to visual param list. Deleting." << llendl;
delete param_color;
@@ -1204,7 +1043,7 @@ BOOL LLTexLayerInfo::createVisualParams(LLVOAvatar *avatar)
{
LLTexLayerParamAlphaInfo * alpha_info = *alpha_info_iter;
LLTexLayerParamAlpha* param_alpha = new LLTexLayerParamAlpha(avatar);
- if (!param_alpha->setInfo(alpha_info))
+ if (!param_alpha->setInfo(alpha_info, TRUE))
{
llwarns << "NULL TexLayer Alpha Param could not be added to visual param list. Deleting." << llendl;
delete param_alpha;
@@ -1215,6 +1054,138 @@ BOOL LLTexLayerInfo::createVisualParams(LLVOAvatar *avatar)
return success;
}
+LLTexLayerInterface::LLTexLayerInterface(LLTexLayerSet* const layer_set):
+ mTexLayerSet( layer_set ),
+ mMorphMasksValid( FALSE ),
+ mStaticImageInvalid( FALSE ),
+ mInfo(NULL),
+ mHasMorph(FALSE)
+{
+}
+
+LLTexLayerInterface::LLTexLayerInterface(const LLTexLayerInterface &layer, LLWearable *wearable):
+ mTexLayerSet( layer.mTexLayerSet )
+{
+ // don't add visual params for cloned layers
+ setInfo(layer.getInfo(), wearable);
+
+ mHasMorph = layer.mHasMorph;
+}
+
+BOOL LLTexLayerInterface::setInfo(const LLTexLayerInfo *info, LLWearable* wearable ) // This sets mInfo and calls initialization functions
+{
+ llassert(mInfo == NULL);
+ mInfo = info;
+ //mID = info->mID; // No ID
+
+ mParamColorList.reserve(mInfo->mParamColorInfoList.size());
+ for (param_color_info_list_t::const_iterator iter = mInfo->mParamColorInfoList.begin();
+ iter != mInfo->mParamColorInfoList.end();
+ iter++)
+ {
+ LLTexLayerParamColor* param_color;
+ if (!wearable)
+ {
+ param_color = new LLTexLayerParamColor(this);
+ if (!param_color->setInfo(*iter, TRUE))
+ {
+ mInfo = NULL;
+ return FALSE;
+ }
+ }
+ else
+ {
+ param_color = (LLTexLayerParamColor*)wearable->getVisualParam((*iter)->getID());
+ if (!param_color)
+ {
+ mInfo = NULL;
+ return FALSE;
+ }
+ }
+ mParamColorList.push_back( param_color );
+ }
+
+ mParamAlphaList.reserve(mInfo->mParamAlphaInfoList.size());
+ for (param_alpha_info_list_t::const_iterator iter = mInfo->mParamAlphaInfoList.begin();
+ iter != mInfo->mParamAlphaInfoList.end();
+ iter++)
+ {
+ LLTexLayerParamAlpha* param_alpha;
+ if (!wearable)
+ {
+ param_alpha = new LLTexLayerParamAlpha( this );
+ if (!param_alpha->setInfo(*iter, TRUE))
+ {
+ mInfo = NULL;
+ return FALSE;
+ }
+ }
+ else
+ {
+ param_alpha = (LLTexLayerParamAlpha*) wearable->getVisualParam((*iter)->getID());
+ if (!param_alpha)
+ {
+ mInfo = NULL;
+ return FALSE;
+ }
+ }
+ mParamAlphaList.push_back( param_alpha );
+ }
+
+ return TRUE;
+}
+
+/*virtual*/ void LLTexLayerInterface::requestUpdate()
+{
+ mTexLayerSet->requestUpdate();
+}
+
+const std::string& LLTexLayerInterface::getName() const
+{
+ return mInfo->mName;
+}
+
+LLTexLayerInterface::ERenderPass LLTexLayerInterface::getRenderPass() const
+{
+ return mInfo->mRenderPass;
+}
+
+const std::string& LLTexLayerInterface::getGlobalColor() const
+{
+ return mInfo->mGlobalColor;
+}
+
+BOOL LLTexLayerInterface::isVisibilityMask() const
+{
+ return mInfo->mIsVisibilityMask;
+}
+
+void LLTexLayerInterface::invalidateMorphMasks()
+{
+ mMorphMasksValid = FALSE;
+}
+
+LLViewerVisualParam* LLTexLayerInterface::getVisualParamPtr(S32 index)
+{
+ LLViewerVisualParam *result = NULL;
+ for (param_color_list_t::iterator color_iter = mParamColorList.begin(); color_iter != mParamColorList.end() && !result; ++color_iter)
+ {
+ if ((*color_iter)->getID() == index)
+ {
+ result = *color_iter;
+ }
+ }
+ for (param_alpha_list_t::iterator alpha_iter = mParamAlphaList.begin(); alpha_iter != mParamAlphaList.end() && !result; ++alpha_iter)
+ {
+ if ((*alpha_iter)->getID() == index)
+ {
+ result = *alpha_iter;
+ }
+ }
+
+ return result;
+}
+
//-----------------------------------------------------------------------------
// LLTexLayer
// A single texture layer, consisting of:
@@ -1228,23 +1199,22 @@ BOOL LLTexLayerInfo::createVisualParams(LLVOAvatar *avatar)
// * a texture entry index (TE)
// * (optional) one or more alpha parameters (weighted alpha textures)
//-----------------------------------------------------------------------------
-LLTexLayer::LLTexLayer(LLTexLayerSet* layer_set) :
- mTexLayerSet( layer_set ),
- mMorphMasksValid( FALSE ),
- mStaticImageInvalid( FALSE ),
- mInfo(NULL),
- mHasMorph(FALSE)
+LLTexLayer::LLTexLayer(LLTexLayerSet* const layer_set) :
+ LLTexLayerInterface( layer_set ),
+ mLocalTextureObject(NULL)
{
}
-LLTexLayer::LLTexLayer(const LLTexLayer &layer) :
- mTexLayerSet( layer.mTexLayerSet )
+LLTexLayer::LLTexLayer(const LLTexLayer &layer, LLWearable *wearable) :
+ LLTexLayerInterface( layer, wearable ),
+ mLocalTextureObject(NULL)
{
- setInfo(layer.getInfo());
-
-
- mHasMorph = layer.mHasMorph;
+}
+LLTexLayer::LLTexLayer(const LLTexLayerTemplate &layer_template, LLLocalTextureObject *lto, LLWearable *wearable) :
+ LLTexLayerInterface( layer_template, wearable ),
+ mLocalTextureObject(lto)
+{
}
LLTexLayer::~LLTexLayer()
@@ -1267,44 +1237,9 @@ LLTexLayer::~LLTexLayer()
// setInfo
//-----------------------------------------------------------------------------
-BOOL LLTexLayer::setInfo(const LLTexLayerInfo* info)
+BOOL LLTexLayer::setInfo(const LLTexLayerInfo* info, LLWearable* wearable )
{
- llassert(mInfo == NULL);
- mInfo = info;
- //mID = info->mID; // No ID
-
- if (info->mRenderPass == LLTexLayer::RP_BUMP)
- mTexLayerSet->setBump(TRUE);
-
- mParamColorList.reserve(mInfo->mParamColorInfoList.size());
- for (param_color_info_list_t::const_iterator iter = mInfo->mParamColorInfoList.begin();
- iter != mInfo->mParamColorInfoList.end();
- iter++)
- {
- LLTexLayerParamColor* param_color = new LLTexLayerParamColor(this);
- if (!param_color->setInfo(*iter))
- {
- mInfo = NULL;
- return FALSE;
- }
- mParamColorList.push_back( param_color );
- }
-
- mParamAlphaList.reserve(mInfo->mParamAlphaInfoList.size());
- for (param_alpha_info_list_t::const_iterator iter = mInfo->mParamAlphaInfoList.begin();
- iter != mInfo->mParamAlphaInfoList.end();
- iter++)
- {
- LLTexLayerParamAlpha* param_alpha = new LLTexLayerParamAlpha( this );
- if (!param_alpha->setInfo(*iter))
- {
- mInfo = NULL;
- return FALSE;
- }
- mParamAlphaList.push_back( param_alpha );
- }
-
- return TRUE;
+ return LLTexLayerInterface::setInfo(info, wearable);
}
//static
@@ -1312,12 +1247,12 @@ void LLTexLayer::calculateTexLayerColor(const param_color_list_t &param_list, LL
{
for (param_color_list_t::const_iterator iter = param_list.begin();
iter != param_list.end(); iter++)
-{
+ {
const LLTexLayerParamColor* param = *iter;
LLColor4 param_net = param->getNetColor();
const LLTexLayerParamColorInfo *info = (LLTexLayerParamColorInfo *)param->getInfo();
switch(info->getOperation())
- {
+ {
case LLTexLayerParamColor::OP_ADD:
net_color += param_net;
break;
@@ -1330,13 +1265,14 @@ void LLTexLayer::calculateTexLayerColor(const param_color_list_t &param_list, LL
default:
llassert(0);
break;
- }
+ }
}
net_color.clamp();
}
-void LLTexLayer::deleteCaches()
+/*virtual*/ void LLTexLayer::deleteCaches()
{
+ // Only need to delete caches for alpha params. Color params don't hold extra memory
for (param_alpha_list_t::iterator iter = mParamAlphaList.begin();
iter != mParamAlphaList.end(); iter++ )
{
@@ -1373,7 +1309,7 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph)
{
// If we have alpha masks, but we're skipping all of them, skip the whole layer.
// However, we can't do this optimization if we have morph masks that need updating.
- if (!mHasMorph)
+/* if (!mHasMorph)
{
BOOL skip_layer = TRUE;
@@ -1394,7 +1330,7 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph)
{
return success;
}
- }
+ }//*/
renderMorphMasks(x, y, width, height, net_color, render_morph);
alpha_mask_specified = TRUE;
@@ -1414,7 +1350,19 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph)
{
{
LLViewerTexture* tex = NULL;
- if( mTexLayerSet->getAvatar()->getLocalTextureGL((ETextureIndex)getInfo()->mLocalTexture, &tex ) )
+ if (mLocalTextureObject && mLocalTextureObject->getImage())
+ {
+ tex = mLocalTextureObject->getImage();
+ if (mLocalTextureObject->getID() == IMG_DEFAULT_AVATAR)
+ {
+ tex = NULL;
+ }
+ }
+ else
+ {
+ llinfos << "lto not defined or image not defined: " << getInfo()->getLocalTexture() << " lto: " << mLocalTextureObject << llendl;
+ }
+// if( mTexLayerSet->getAvatar()->getLocalTextureGL((ETextureIndex)getInfo()->mLocalTexture, &image_gl ) )
{
if( tex )
{
@@ -1431,10 +1379,10 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph)
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
}
- else
- {
- success = FALSE;
- }
+// else
+// {
+// success = FALSE;
+// }
}
}
@@ -1484,12 +1432,13 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph)
U8* LLTexLayer::getAlphaData()
{
LLCRC alpha_mask_crc;
- const LLUUID& uuid = mTexLayerSet->getAvatar()->getLocalTextureID((ETextureIndex)getInfo()->mLocalTexture);
+ const LLUUID& uuid = getUUID();
alpha_mask_crc.update((U8*)(&uuid.mData), UUID_BYTES);
for (param_alpha_list_t::const_iterator iter = mParamAlphaList.begin(); iter != mParamAlphaList.end(); iter++)
{
const LLTexLayerParamAlpha* param = *iter;
+ // MULTI-WEARABLE: verify visual parameters used here
F32 param_weight = param->getWeight();
alpha_mask_crc.update((U8*)&param_weight, sizeof(F32));
}
@@ -1544,7 +1493,7 @@ BOOL LLTexLayer::findNetColor(LLColor4* net_color) const
return FALSE; // No need to draw a separate colored polygon
}
-BOOL LLTexLayer::blendAlphaTexture(S32 width, S32 height)
+BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height)
{
BOOL success = TRUE;
@@ -1569,17 +1518,14 @@ BOOL LLTexLayer::blendAlphaTexture(S32 width, S32 height)
{
if (getInfo()->mLocalTexture >=0 && getInfo()->mLocalTexture < TEX_NUM_INDICES)
{
- LLViewerTexture* tex = NULL;
- if (mTexLayerSet->getAvatar()->getLocalTextureGL((ETextureIndex)getInfo()->mLocalTexture, &tex))
+ LLViewerTexture* tex = mLocalTextureObject->getImage();
+ if (tex)
{
- if (tex)
- {
- LLGLSNoAlphaTest gls_no_alpha_test;
- gGL.getTexUnit(0)->bind(tex);
- gl_rect_2d_simple_tex( width, height );
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- success = TRUE;
- }
+ LLGLSNoAlphaTest gls_no_alpha_test;
+ gGL.getTexUnit(0)->bind(tex);
+ gl_rect_2d_simple_tex( width, height );
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ success = TRUE;
}
}
}
@@ -1587,6 +1533,10 @@ BOOL LLTexLayer::blendAlphaTexture(S32 width, S32 height)
return success;
}
+/*virtual*/ void LLTexLayer::gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph)
+{
+ addAlphaMask(data, originX, originY, width, height, render_morph);
+}
BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color, BOOL render_morph)
{
@@ -1627,23 +1577,20 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
// Accumulate the alpha component of the texture
if( getInfo()->mLocalTexture != -1 )
{
- LLViewerTexture* tex = NULL;
- if( mTexLayerSet->getAvatar()->getLocalTextureGL((ETextureIndex)getInfo()->mLocalTexture, &tex ) )
+ LLViewerTexture* tex = mLocalTextureObject->getImage();
+ if( tex && (tex->getComponents() == 4) )
{
- if( tex && (tex->getComponents() == 4) )
- {
- LLGLSNoAlphaTest gls_no_alpha_test;
+ LLGLSNoAlphaTest gls_no_alpha_test;
- LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode();
-
- gGL.getTexUnit(0)->bind(tex);
- gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+ LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode();
+
+ gGL.getTexUnit(0)->bind(tex);
+ gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
- gl_rect_2d_simple_tex( width, height );
+ gl_rect_2d_simple_tex( width, height );
- gGL.getTexUnit(0)->setTextureAddressMode(old_mode);
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- }
+ gGL.getTexUnit(0)->setTextureAddressMode(old_mode);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
else
{
@@ -1686,10 +1633,10 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
gGL.setColorMask(true, true);
- if (render_morph && mHasMorph)
+ if (render_morph && mHasMorph && success)
{
LLCRC alpha_mask_crc;
- const LLUUID& uuid = mTexLayerSet->getAvatar()->getLocalTextureID((ETextureIndex)getInfo()->mLocalTexture);
+ const LLUUID& uuid = getUUID();
alpha_mask_crc.update((U8*)(&uuid.mData), UUID_BYTES);
for (param_alpha_list_t::const_iterator iter = mParamAlphaList.begin(); iter != mParamAlphaList.end(); iter++)
@@ -1726,106 +1673,269 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
return success;
}
-// Returns TRUE on success.
-BOOL LLTexLayer::renderImageRaw( U8* in_data, S32 in_width, S32 in_height, S32 in_components, S32 width, S32 height, BOOL is_mask )
+void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph)
{
- if (!in_data)
+ S32 size = width * height;
+ U8* alphaData = getAlphaData();
+ if (!alphaData && hasAlphaParams())
{
- return FALSE;
+ LLColor4 net_color;
+ findNetColor( &net_color );
+ // TODO: eliminate need for layer morph mask valid flag
+ invalidateMorphMasks();
+ renderMorphMasks(originX, originY, width, height, net_color, render_morph);
+ alphaData = getAlphaData();
}
- GLenum format_options[4] = { GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA };
- GLenum format = format_options[in_components-1];
- if( is_mask )
+ if (alphaData)
{
- llassert( 1 == in_components );
- format = GL_ALPHA;
+ for( S32 i = 0; i < size; i++ )
+ {
+ U8 curAlpha = data[i];
+ U16 resultAlpha = curAlpha;
+ resultAlpha *= (alphaData[i] + 1);
+ resultAlpha = resultAlpha >> 8;
+ data[i] = (U8)resultAlpha;
+ }
}
+}
- if( (in_width != SCRATCH_TEX_WIDTH) || (in_height != SCRATCH_TEX_HEIGHT) )
+// private helper function
+LLUUID LLTexLayer::getUUID()
+{
+ LLUUID uuid;
+ if( getInfo()->mLocalTexture != -1 )
{
- LLGLSNoAlphaTest gls_no_alpha_test;
+ LLViewerTexture* tex = mLocalTextureObject->getImage();
+ if (tex)
+ {
+ uuid = mLocalTextureObject->getID();
+ }
+ }
+ if( !getInfo()->mStaticImageFileName.empty() )
+ {
+ LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask);
+ if( tex )
+ {
+ uuid = tex->getID();
+ }
+ }
+ return uuid;
+}
- GLenum internal_format_options[4] = { GL_LUMINANCE8, GL_LUMINANCE8_ALPHA8, GL_RGB8, GL_RGBA8 };
- GLenum internal_format = internal_format_options[in_components-1];
- if( is_mask )
- {
- llassert( 1 == in_components );
- internal_format = GL_ALPHA8;
- }
-
- U32 name = 0;
- LLImageGL::generateTextures(1, &name );
- stop_glerror();
- gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, name);
- stop_glerror();
+//-----------------------------------------------------------------------------
+// LLTexLayerTemplate
+// A single texture layer, consisting of:
+// * color, consisting of either
+// * one or more color parameters (weighted colors)
+// * a reference to a global color
+// * a fixed color with non-zero alpha
+// * opaque white (the default)
+// * (optional) a texture defined by either
+// * a GUID
+// * a texture entry index (TE)
+// * (optional) one or more alpha parameters (weighted alpha textures)
+//-----------------------------------------------------------------------------
+LLTexLayerTemplate::LLTexLayerTemplate(LLTexLayerSet* layer_set) :
+ LLTexLayerInterface(layer_set)
+{
+}
- LLImageGL::setManualImage(
- GL_TEXTURE_2D, 0, internal_format,
- in_width, in_height,
- format, GL_UNSIGNED_BYTE, in_data );
- stop_glerror();
+LLTexLayerTemplate::LLTexLayerTemplate(const LLTexLayerTemplate &layer) :
+ LLTexLayerInterface(layer)
+{
+}
- gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
-
- gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+LLTexLayerTemplate::~LLTexLayerTemplate()
+{
+}
- gl_rect_2d_simple_tex( width, height );
+//-----------------------------------------------------------------------------
+// setInfo
+//-----------------------------------------------------------------------------
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+/*virtual*/ BOOL LLTexLayerTemplate::setInfo(const LLTexLayerInfo* info, LLWearable* wearable )
+{
+ return LLTexLayerInterface::setInfo(info, wearable);
+}
- LLImageGL::deleteTextures(1, &name );
- stop_glerror();
+U32 LLTexLayerTemplate::updateWearableCache()
+{
+ mWearableCache.clear();
+
+ S32 te = mInfo->mLocalTexture;
+ if (te == -1)
+ {
+ //this isn't a cloneable layer
+ return 0;
}
- else
+ EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)te);
+ U32 num_wearables = gAgentWearables.getWearableCount(wearable_type);
+ U32 added = 0;
+ for (U32 i = 0; i < num_wearables; i++)
{
- LLGLSNoAlphaTest gls_no_alpha_test;
-
- if( !mTexLayerSet->getAvatar()->bindScratchTexture(format) )
+ LLWearable* wearable = gAgentWearables.getWearable(wearable_type, i);
+ if (!wearable)
{
- return FALSE;
+ continue;
}
+ mWearableCache.push_back(wearable);
+ added++;
+ }
+ return added;
+}
+LLTexLayer* LLTexLayerTemplate::getLayer(U32 i)
+{
+ if (mWearableCache.size() <= i || i < 0)
+ {
+ return NULL;
+ }
+ LLWearable *wearable = mWearableCache[i];
+ LLLocalTextureObject *lto = NULL;
+ LLTexLayer *layer = NULL;
+ if (wearable)
+ {
+ lto = wearable->getLocalTextureObject(mInfo->mLocalTexture);
+ }
+ if (lto)
+ {
+ layer = lto->getTexLayer(getName());
+ }
+ return layer;
+}
- glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, in_width, in_height, format, GL_UNSIGNED_BYTE, in_data );
- stop_glerror();
+/*virtual*/ BOOL LLTexLayerTemplate::render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph)
+{
+ BOOL success = TRUE;
+ updateWearableCache();
+ for (wearable_cache_t::const_iterator iter = mWearableCache.begin(); iter!= mWearableCache.end(); iter++)
+ {
+ LLWearable* wearable = NULL;
+ LLLocalTextureObject *lto = NULL;
+ LLTexLayer *layer = NULL;
+ wearable = *iter;
+ if (wearable)
+ {
+ lto = wearable->getLocalTextureObject(mInfo->mLocalTexture);
+ }
+ if (lto)
+ {
+ layer = lto->getTexLayer(getName());
+ }
+ if (layer)
+ {
+ wearable->writeToAvatar(FALSE, FALSE);
+ layer->setLTO(lto);
+ success &= layer->render(x,y,width,height,render_morph);
+ }
+ }
- gl_rect_2d_simple_tex( width, height );
+ return success;
+}
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+/*virtual*/ BOOL LLTexLayerTemplate::blendAlphaTexture( S32 x, S32 y, S32 width, S32 height) // Multiplies a single alpha texture against the frame buffer
+{
+ BOOL success = TRUE;
+ U32 num_wearables = updateWearableCache();
+ for (U32 i = 0; i < num_wearables; i++)
+ {
+ LLTexLayer *layer = getLayer(i);
+ if (layer)
+ {
+ success &= layer->blendAlphaTexture(x,y,width,height);
+ }
}
-
- return TRUE;
+ return success;
}
-void LLTexLayer::requestUpdate()
+/*virtual*/ void LLTexLayerTemplate::gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph)
{
- mTexLayerSet->requestUpdate();
+ U32 num_wearables = updateWearableCache();
+ for (U32 i = 0; i < num_wearables; i++)
+ {
+ LLTexLayer *layer = getLayer(i);
+ if (layer)
+ {
+ layer->addAlphaMask(data, originX, originY, width, height, render_morph);
+ }
+ }
}
-const std::string& LLTexLayer::getName() const
+/*virtual*/ void LLTexLayerTemplate::setHasMorph(BOOL newval)
{
- return mInfo->mName;
+ mHasMorph = newval;
+ U32 num_wearables = updateWearableCache();
+ for (U32 i = 0; i < num_wearables; i++)
+ {
+ LLTexLayer *layer = getLayer(i);
+ if (layer)
+ {
+ layer->setHasMorph(newval);
+ }
+ }
}
-LLTexLayer::ERenderPass LLTexLayer::getRenderPass() const
+/*virtual*/ void LLTexLayerTemplate::deleteCaches()
{
- return mInfo->mRenderPass;
+ U32 num_wearables = updateWearableCache();
+ for (U32 i = 0; i < num_wearables; i++)
+ {
+ LLTexLayer *layer = getLayer(i);
+ if (layer)
+ {
+ layer->deleteCaches();
+ }
+ }
}
-const std::string& LLTexLayer::getGlobalColor() const
+
+
+
+//-----------------------------------------------------------------------------
+// finds a specific layer based on a passed in name
+//-----------------------------------------------------------------------------
+LLTexLayerInterface* LLTexLayerSet::findLayerByName(std::string name)
{
- return mInfo->mGlobalColor;
+ for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
+ {
+ LLTexLayerInterface* layer = *iter;
+
+ if (layer->getName().compare(name) == 0)
+ {
+ return layer;
+ }
+ }
+ for( layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++ )
+ {
+ LLTexLayerInterface* layer = *iter;
+
+ if (layer->getName().compare(name) == 0)
+ {
+ return layer;
+ }
+ }
+ return NULL;
}
-void LLTexLayer::invalidateMorphMasks()
+void LLTexLayerSet::cloneTemplates(LLLocalTextureObject *lto, LLVOAvatarDefines::ETextureIndex tex_index, LLWearable *wearable)
{
- mMorphMasksValid = FALSE;
+ // initialize all texlayers with this texture type for this LTO
+ for( LLTexLayerSet::layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
+ {
+ LLTexLayerTemplate* layer = (LLTexLayerTemplate*)*iter;
+ if (layer->getInfo()->getLocalTexture() == (S32) tex_index)
+ {
+ lto->addTexLayer(layer, wearable);
+ }
}
-
-BOOL LLTexLayer::isVisibilityMask() const
+ for( LLTexLayerSet::layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++ )
{
- return mInfo->mIsVisibilityMask;
+ LLTexLayerTemplate* layer = (LLTexLayerTemplate*)*iter;
+ if (layer->getInfo()->getLocalTexture() == (S32) tex_index)
+ {
+ lto->addTexLayer(layer, wearable);
+ }
+ }
}
-
//-----------------------------------------------------------------------------
// LLTexLayerStaticImageList
//-----------------------------------------------------------------------------
diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h
index 6922eae0e1..2269c3c9a5 100644
--- a/indra/newview/lltexlayer.h
+++ b/indra/newview/lltexlayer.h
@@ -52,19 +52,15 @@ class LLTexLayerParamColor;
class LLTexLayerParamColorInfo;
class LLTexLayerParamAlpha;
class LLTexLayerParamAlphaInfo;
-
+class LLWearable;
+class LLViewerVisualParam;
typedef std::vector<LLTexLayerParamColor *> param_color_list_t;
typedef std::vector<LLTexLayerParamAlpha *> param_alpha_list_t;
typedef std::vector<LLTexLayerParamColorInfo *> param_color_info_list_t;
typedef std::vector<LLTexLayerParamAlphaInfo *> param_alpha_info_list_t;
-//-----------------------------------------------------------------------------
-// LLTexLayer
-// A single texture layer
-// Only exists for llvoavatarself
-
-class LLTexLayer
+class LLTexLayerInterface
{
public:
enum ERenderPass
@@ -74,36 +70,36 @@ public:
RP_SHINE
};
- LLTexLayer(LLTexLayerSet* const layer_set);
- LLTexLayer(const LLTexLayer &layer);
- ~LLTexLayer();
+ LLTexLayerInterface(LLTexLayerSet* const layer_set);
+ LLTexLayerInterface(const LLTexLayerInterface &layer, LLWearable *wearable);
+ virtual ~LLTexLayerInterface() {}
const LLTexLayerInfo* getInfo() const { return mInfo; }
- BOOL setInfo(const LLTexLayerInfo *info); // This sets mInfo and calls initialization functions
- BOOL render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph);
+ virtual BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable ); // This sets mInfo and calls initialization functions
+ virtual BOOL render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph) = 0;
void requestUpdate();
LLTexLayerSet* const getTexLayerSet() const { return mTexLayerSet; }
- void deleteCaches();
- U8* getAlphaData();
+ virtual void deleteCaches() = 0;
void invalidateMorphMasks();
- void setHasMorph(BOOL newval) { mHasMorph = newval; }
+ virtual void setHasMorph(BOOL newval) { mHasMorph = newval; }
BOOL isMorphValid() { return mMorphMasksValid; }
const std::string& getName() const;
ERenderPass getRenderPass() const;
- const std::string& getGlobalColor() const;
+ const std::string& getGlobalColor() const;
- BOOL findNetColor(LLColor4* color) const;
- BOOL renderImageRaw(U8* in_data, S32 in_width, S32 in_height, S32 in_components, S32 width, S32 height, BOOL is_mask);
- BOOL blendAlphaTexture(S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer
- BOOL renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color, BOOL render_morph);
+ virtual BOOL blendAlphaTexture( S32 x, S32 y, S32 width, S32 height) = 0;
+ virtual void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph) = 0;
BOOL hasAlphaParams() const { return !mParamAlphaList.empty(); }
BOOL isVisibilityMask() const;
- static void calculateTexLayerColor(const param_color_list_t &param_list, LLColor4 &net_color);
+ LLTexLayerSet* getLayerSet() {return mTexLayerSet;}
-private:
+ LLViewerVisualParam* getVisualParamPtr(S32 index);
+
+
+protected:
LLTexLayerSet* const mTexLayerSet;
// Layers can have either mParamColorList, mGlobalColor, or mFixedColor. They are looked for in that order.
@@ -111,27 +107,96 @@ private:
// mGlobalColor name stored in mInfo
// mFixedColor value stored in mInfo
param_alpha_list_t mParamAlphaList;
-
+
BOOL mMorphMasksValid;
- typedef std::map<U32, U8*> alpha_cache_t;
- alpha_cache_t mAlphaCache;
BOOL mStaticImageInvalid;
BOOL mHasMorph;
const LLTexLayerInfo *mInfo;
+
+};
+
+//-----------------------------------------------------------------------------
+// LLTexLayerTemplate
+// Template class
+// Only exists for llvoavatarself
+
+class LLTexLayerTemplate : public LLTexLayerInterface
+{
+public:
+ LLTexLayerTemplate(LLTexLayerSet* const layer_set);
+ LLTexLayerTemplate(const LLTexLayerTemplate &layer);
+ /*virtual*/ ~LLTexLayerTemplate();
+
+ /*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph);
+ /*virtual*/ BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable ); // This sets mInfo and calls initialization functions
+ /*virtual*/ BOOL blendAlphaTexture( S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer
+ /*virtual*/ void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph);
+ /*virtual*/ void setHasMorph(BOOL newval);
+ /*virtual*/ void deleteCaches();
+private:
+ U32 updateWearableCache();
+ LLTexLayer* getLayer(U32 i);
+ typedef std::vector<LLWearable*> wearable_cache_t;
+ wearable_cache_t mWearableCache;
+
+};
+
+//-----------------------------------------------------------------------------
+// LLTexLayer
+// A single texture layer
+// Only exists for llvoavatarself
+
+class LLTexLayer : public LLTexLayerInterface
+{
+public:
+ LLTexLayer(LLTexLayerSet* const layer_set);
+ LLTexLayer(const LLTexLayer &layer, LLWearable *wearable);
+ LLTexLayer(const LLTexLayerTemplate &layer_template, LLLocalTextureObject *lto, LLWearable *wearable);
+ /*virtual*/ ~LLTexLayer();
+
+ /*virtual*/ BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable ); // This sets mInfo and calls initialization functions
+ /*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph);
+
+ /*virtual*/ void deleteCaches();
+ U8* getAlphaData();
+
+ BOOL findNetColor(LLColor4* color) const;
+ /*virtual*/ BOOL blendAlphaTexture( S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer
+ /*virtual*/ void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph);
+ BOOL renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color, BOOL render_morph);
+ void addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph);
+
+ void setLTO(LLLocalTextureObject *lto) { mLocalTextureObject = lto; }
+ LLLocalTextureObject* getLTO() { return mLocalTextureObject; }
+
+ static void calculateTexLayerColor(const param_color_list_t &param_list, LLColor4 &net_color);
+
+private:
+ LLUUID getUUID();
+
+ typedef std::map<U32, U8*> alpha_cache_t;
+ alpha_cache_t mAlphaCache;
+ LLLocalTextureObject *mLocalTextureObject;
};
// Make private
class LLTexLayerInfo
{
friend class LLTexLayer;
+ friend class LLTexLayerTemplate;
+ friend class LLTexLayerInterface;
public:
LLTexLayerInfo();
~LLTexLayerInfo();
BOOL parseXml(LLXmlTreeNode* node);
BOOL createVisualParams(LLVOAvatar *avatar);
+ BOOL isUserSettable() { return mLocalTexture != -1; }
+ S32 getLocalTexture() const { return mLocalTexture; }
+ BOOL getOnlyAlpha() const { return mUseLocalTextureAlphaOnly; }
+ std::string getName() const { return mName; }
private:
std::string mName;
@@ -174,7 +239,7 @@ public:
BOOL setInfo(const LLTexLayerSetInfo *info); // This sets mInfo and calls initialization functions
BOOL render(S32 x, S32 y, S32 width, S32 height);
- BOOL renderBump(S32 x, S32 y, S32 width,S32 height);
+ void renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear = false);
BOOL isBodyRegion(const std::string& region) const;
LLTexLayerSetBuffer* getComposite();
@@ -191,28 +256,26 @@ public:
void deleteCaches();
void gatherMorphMaskAlpha(U8 *data, S32 width, S32 height);
void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components);
- void renderAlphaMaskTextures(S32 width, S32 height, bool forceClear = false);
- LLTexLayer* findLayerByName(std::string name);
+ LLTexLayerInterface* findLayerByName(std::string name);
+ void cloneTemplates(LLLocalTextureObject *lto, LLVOAvatarDefines::ETextureIndex tex_index, LLWearable* wearable);
LLVOAvatarSelf* getAvatar() const { return mAvatar; }
const std::string getBodyRegion() const;
BOOL hasComposite() const { return (mComposite.notNull()); }
- void setBump(BOOL b) { mHasBump = b; }
- BOOL hasBump() const { return mHasBump; }
LLVOAvatarDefines::EBakedTextureIndex getBakedTexIndex() { return mBakedTexIndex; }
void setBakedTexIndex( LLVOAvatarDefines::EBakedTextureIndex index) { mBakedTexIndex = index; }
public:
static BOOL sHasCaches;
+ typedef std::vector<LLTexLayerInterface *> layer_list_t;
+
private:
- typedef std::vector<LLTexLayer *> layer_list_t;
layer_list_t mLayerList;
layer_list_t mMaskLayerList;
LLPointer<LLTexLayerSetBuffer> mComposite;
LLVOAvatarSelf* const mAvatar; // Backlink only; don't make this an LLPointer.
BOOL mUpdatesEnabled;
- BOOL mHasBump;
LLVOAvatarDefines::EBakedTextureIndex mBakedTexIndex;
@@ -245,14 +308,13 @@ private:
class LLTexLayerSetBuffer : public LLViewerDynamicTexture
{
public:
- LLTexLayerSetBuffer(LLTexLayerSet* const owner, S32 width, S32 height, BOOL has_bump);
+ LLTexLayerSetBuffer(LLTexLayerSet* const owner, S32 width, S32 height);
virtual ~LLTexLayerSetBuffer();
virtual void preRender(BOOL clear_depth);
virtual void postRender(BOOL success);
virtual BOOL render();
BOOL updateImmediate();
- void bindBumpTexture(U32 stage);
bool isInitialized(void) const;
BOOL needsRender();
void requestUpdate();
@@ -260,8 +322,7 @@ public:
void cancelUpload();
BOOL uploadPending() { return mUploadPending; }
BOOL render( S32 x, S32 y, S32 width, S32 height );
- void readBackAndUpload(const U8* baked_bump_data);
- void createBumpTexture();
+ void readBackAndUpload();
static void onTextureUploadComplete(const LLUUID& uuid,
void* userdata,
@@ -276,17 +337,14 @@ private:
void popProjection() const;
private:
- const BOOL mHasBump;
LLTexLayerSet* const mTexLayerSet;
BOOL mNeedsUpdate;
BOOL mNeedsUpload;
BOOL mUploadPending;
LLUUID mUploadID; // Identifys the current upload process (null if none). Used to avoid overlaps (eg, when the user rapidly makes two changes outside of Face Edit)
- LLPointer<LLViewerTexture> mBumpTex; // zero if none
static S32 sGLByteCount;
- static S32 sGLBumpByteCount;
};
//
diff --git a/indra/newview/lltexlayerparams.cpp b/indra/newview/lltexlayerparams.cpp
index 7a1ee95a65..9cd73c4656 100644
--- a/indra/newview/lltexlayerparams.cpp
+++ b/indra/newview/lltexlayerparams.cpp
@@ -33,13 +33,14 @@
#include "llagent.h"
#include "lltexlayer.h"
#include "llvoavatarself.h"
+#include "llwearable.h"
#include "lltexlayerparams.h"
#include "llui.h"
//-----------------------------------------------------------------------------
// LLTexLayerParam
//-----------------------------------------------------------------------------
-LLTexLayerParam::LLTexLayerParam(LLTexLayer *layer) :
+LLTexLayerParam::LLTexLayerParam(LLTexLayerInterface *layer) :
mTexLayer(layer),
mAvatar(NULL)
{
@@ -47,6 +48,10 @@ LLTexLayerParam::LLTexLayerParam(LLTexLayer *layer) :
{
mAvatar = mTexLayer->getTexLayerSet()->getAvatar();
}
+ else
+ {
+ llerrs << "LLTexLayerParam constructor passed with NULL reference for layer!" << llendl;
+ }
}
LLTexLayerParam::LLTexLayerParam(LLVOAvatar *avatar) :
@@ -56,15 +61,19 @@ LLTexLayerParam::LLTexLayerParam(LLVOAvatar *avatar) :
}
-BOOL LLTexLayerParam::setInfo(LLViewerVisualParamInfo *info)
+BOOL LLTexLayerParam::setInfo(LLViewerVisualParamInfo *info, BOOL add_to_avatar )
{
LLViewerVisualParam::setInfo(info);
- mAvatar->addVisualParam( this);
+
+ if (add_to_avatar)
+ {
+ mAvatar->addVisualParam( this);
+ }
+
return TRUE;
}
-
//-----------------------------------------------------------------------------
// LLTexLayerParamAlpha
//-----------------------------------------------------------------------------
@@ -102,7 +111,7 @@ void LLTexLayerParamAlpha::getCacheByteCount(S32* gl_bytes)
}
}
-LLTexLayerParamAlpha::LLTexLayerParamAlpha(LLTexLayer* layer) :
+LLTexLayerParamAlpha::LLTexLayerParamAlpha(LLTexLayerInterface* layer) :
LLTexLayerParam(layer),
mCachedProcessedTexture(NULL),
mNeedsCreateTexture(FALSE),
@@ -131,6 +140,13 @@ LLTexLayerParamAlpha::~LLTexLayerParamAlpha()
sInstances.remove(this);
}
+/*virtual*/ LLViewerVisualParam * LLTexLayerParamAlpha::cloneParam(LLWearable* wearable) const
+{
+ LLTexLayerParamAlpha *new_param = new LLTexLayerParamAlpha(mTexLayer);
+ *new_param = *this;
+ return new_param;
+}
+
void LLTexLayerParamAlpha::deleteCaches()
{
mStaticImageTGA = NULL; // deletes image
@@ -313,7 +329,7 @@ BOOL LLTexLayerParamAlpha::render(S32 x, S32 y, S32 width, S32 height)
// Don't keep the cache for other people's avatars
// (It's not really a "cache" in that case, but the logic is the same)
- if (mAvatar->isSelf())
+ if (!mAvatar->isSelf())
{
mCachedProcessedTexture = NULL;
}
@@ -377,7 +393,7 @@ BOOL LLTexLayerParamAlphaInfo::parseXml(LLXmlTreeNode* node)
-LLTexLayerParamColor::LLTexLayerParamColor(LLTexLayer* layer) :
+LLTexLayerParamColor::LLTexLayerParamColor(LLTexLayerInterface* layer) :
LLTexLayerParam(layer),
mAvgDistortionVec(1.f, 1.f, 1.f)
{
@@ -393,6 +409,13 @@ LLTexLayerParamColor::~LLTexLayerParamColor()
{
}
+/*virtual*/ LLViewerVisualParam * LLTexLayerParamColor::cloneParam(LLWearable* wearable) const
+{
+ LLTexLayerParamColor *new_param = new LLTexLayerParamColor(mTexLayer);
+ *new_param = *this;
+ return new_param;
+}
+
LLColor4 LLTexLayerParamColor::getNetColor() const
{
const LLTexLayerParamColorInfo *info = (LLTexLayerParamColorInfo *)getInfo();
diff --git a/indra/newview/lltexlayerparams.h b/indra/newview/lltexlayerparams.h
index 49feb01b5e..589bd41054 100644
--- a/indra/newview/lltexlayerparams.h
+++ b/indra/newview/lltexlayerparams.h
@@ -36,15 +36,18 @@
class LLTexLayer;
class LLVOAvatar;
+class LLWearable;
class LLTexLayerParam : public LLViewerVisualParam
{
public:
- LLTexLayerParam(LLTexLayer *layer);
+ LLTexLayerParam(LLTexLayerInterface *layer);
LLTexLayerParam(LLVOAvatar *avatar);
- /* Virtual */ BOOL setInfo(LLViewerVisualParamInfo *info);
+ /* Virtual */ BOOL setInfo(LLViewerVisualParamInfo *info, BOOL add_to_avatar );
+ /*virtual*/ LLViewerVisualParam * cloneParam(LLWearable* wearable) const = 0;
+
protected:
- LLTexLayer* mTexLayer;
+ LLTexLayerInterface* mTexLayer;
LLVOAvatar* mAvatar;
};
@@ -54,10 +57,12 @@ protected:
class LLTexLayerParamAlpha : public LLTexLayerParam
{
public:
- LLTexLayerParamAlpha( LLTexLayer* layer );
+ LLTexLayerParamAlpha( LLTexLayerInterface* layer );
LLTexLayerParamAlpha( LLVOAvatar* avatar );
/*virtual*/ ~LLTexLayerParamAlpha();
+ /*virtual*/ LLViewerVisualParam * cloneParam(LLWearable* wearable = NULL) const;
+
// LLVisualParam Virtual functions
///*virtual*/ BOOL parseData(LLXmlTreeNode* node);
/*virtual*/ void apply( ESex avatar_sex ) {}
@@ -129,10 +134,12 @@ public:
OP_COUNT = 3 // Number of operations
};
- LLTexLayerParamColor( LLTexLayer* layer );
+ LLTexLayerParamColor( LLTexLayerInterface* layer );
LLTexLayerParamColor( LLVOAvatar* avatar );
/* virtual */ ~LLTexLayerParamColor();
+ /*virtual*/ LLViewerVisualParam * cloneParam(LLWearable* wearable = NULL) const;
+
// LLVisualParam Virtual functions
///*virtual*/ BOOL parseData(LLXmlTreeNode* node);
/*virtual*/ void apply( ESex avatar_sex ) {}
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index dc53358311..c34517d104 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -54,6 +54,7 @@
#include "llviewerwindow.h"
#include "lltrans.h"
#include "llappearancemgr.h"
+#include "llfloatercustomize.h"
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
@@ -729,6 +730,14 @@ void WearOnAvatarCallback::fire(const LLUUID& inv_item)
void ModifiedCOFCallback::fire(const LLUUID& inv_item)
{
LLAppearanceManager::instance().updateAppearanceFromCOF();
+ if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode() )
+ {
+ // If we're in appearance editing mode, the current tab may need to be refreshed
+ if (gFloaterCustomize)
+ {
+ gFloaterCustomize->switchToDefaultSubpart();
+ }
+ }
}
RezAttachmentCallback::RezAttachmentCallback(LLViewerJointAttachment *attachmentp)
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index c2def610dc..2e45a61f1b 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -6910,11 +6910,12 @@ void handle_debug_avatar_textures(void*)
void handle_grab_texture(void* data)
{
- ETextureIndex index = (ETextureIndex)((intptr_t)data);
+ ETextureIndex tex_index = (ETextureIndex)((intptr_t)data);
const LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
if ( avatar )
{
- const LLUUID& asset_id = avatar->grabLocalTexture(index);
+ // MULTI-WEARABLE: change to support an index
+ const LLUUID& asset_id = avatar->grabLocalTexture(tex_index, 0);
LL_INFOS("texture") << "Adding baked texture " << asset_id << " to inventory." << llendl;
LLAssetType::EType asset_type = LLAssetType::AT_TEXTURE;
LLInventoryType::EType inv_type = LLInventoryType::IT_TEXTURE;
@@ -6922,7 +6923,7 @@ void handle_grab_texture(void* data)
if(folder_id.notNull())
{
std::string name = "Unknown";
- const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture(index);
+ const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture(tex_index);
if (texture_dict->mIsBakedTexture)
{
EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;
@@ -6989,7 +6990,8 @@ BOOL enable_grab_texture(void* data)
const LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
if ( avatar )
{
- return avatar->canGrabLocalTexture(index);
+ // MULTI-WEARABLE:
+ return avatar->canGrabLocalTexture(index,0);
}
return FALSE;
}
diff --git a/indra/newview/llviewervisualparam.cpp b/indra/newview/llviewervisualparam.cpp
index 7d717ed6dc..b088ef0730 100644
--- a/indra/newview/llviewervisualparam.cpp
+++ b/indra/newview/llviewervisualparam.cpp
@@ -85,6 +85,12 @@ BOOL LLViewerVisualParamInfo::parseXml(LLXmlTreeNode *node)
mEditGroup = "";
}
+ static LLStdStringHandle cross_wearable_string = LLXmlTree::addAttributeString("cross_wearable");
+ if (!node->getFastAttributeBOOL(cross_wearable_string, mCrossWearable))
+ {
+ mCrossWearable = FALSE;
+ }
+
// Optional camera offsets from the current joint center. Used for generating "hints" (thumbnails).
static LLStdStringHandle camera_distance_string = LLXmlTree::addAttributeString("camera_distance");
node->getFastAttributeF32( camera_distance_string, mCamDist );
@@ -112,6 +118,15 @@ BOOL LLViewerVisualParamInfo::parseXml(LLXmlTreeNode *node)
return TRUE;
}
+/*virtual*/ void LLViewerVisualParamInfo::toStream(std::ostream &out)
+{
+ LLVisualParamInfo::toStream(out);
+
+ out << mWearableType << "\t";
+ out << mEditGroup << "\t";
+ out << mEditGroupDisplayOrder << "\t";
+}
+
//-----------------------------------------------------------------------------
// LLViewerVisualParam()
//-----------------------------------------------------------------------------
diff --git a/indra/newview/llviewervisualparam.h b/indra/newview/llviewervisualparam.h
index 77a95db564..82a694e277 100644
--- a/indra/newview/llviewervisualparam.h
+++ b/indra/newview/llviewervisualparam.h
@@ -37,6 +37,8 @@
#include "llstring.h"
#include "llvisualparam.h"
+class LLWearable;
+
//-----------------------------------------------------------------------------
// LLViewerVisualParamInfo
//-----------------------------------------------------------------------------
@@ -49,8 +51,11 @@ public:
/*virtual*/ BOOL parseXml(LLXmlTreeNode* node);
+ /*virtual*/ void toStream(std::ostream &out);
+
protected:
S32 mWearableType;
+ BOOL mCrossWearable;
std::string mEditGroup;
F32 mCamDist;
F32 mCamAngle; // degrees
@@ -77,6 +82,8 @@ public:
LLViewerVisualParamInfo *getInfo() const { return (LLViewerVisualParamInfo*)mInfo; };
// This sets mInfo and calls initialization functions
BOOL setInfo(LLViewerVisualParamInfo *info);
+
+ virtual LLViewerVisualParam * cloneParam(LLWearable* wearable) const = 0;
// LLVisualParam Virtual functions
///*virtual*/ BOOL parseData(LLXmlTreeNode* node);
@@ -102,6 +109,8 @@ public:
BOOL getShowSimple() const { return getInfo()->mShowSimple; }
F32 getSimpleMin() const { return getInfo()->mSimpleMin; }
F32 getSimpleMax() const { return getInfo()->mSimpleMax; }
+
+ BOOL getCrossWearable() const { return getInfo()->mCrossWearable; }
};
#endif // LL_LLViewerVisualParam_H
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 9437d8797e..2c578ebd2b 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -3793,7 +3793,7 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass)
}
// Can't test for baked hair being defined, since that won't always be the case (not all viewers send baked hair)
// TODO: 1.25 will be able to switch this logic back to calling isTextureVisible();
- if (getImage(TEX_HAIR_BAKED)->getID() != IMG_INVISIBLE || LLDrawPoolAlpha::sShowDebugAlpha)
+ if (getImage(TEX_HAIR_BAKED, 0)->getID() != IMG_INVISIBLE || LLDrawPoolAlpha::sShowDebugAlpha)
{
num_indices += mMeshLOD[MESH_ID_HAIR]->render(mAdjustedPixelArea, first_pass, mIsDummy);
first_pass = FALSE;
@@ -3954,7 +3954,7 @@ void LLVOAvatar::updateTextures(LLAgent &agent)
{
if (layer_baked[i] && !mBakedTextureDatas[i].mIsLoaded)
{
- gGL.getTexUnit(0)->bind(getImage( mBakedTextureDatas[i].mTextureIndex ));
+ gGL.getTexUnit(0)->bind(getImage( mBakedTextureDatas[i].mTextureIndex, 0 ));
}
}
}
@@ -3962,17 +3962,32 @@ void LLVOAvatar::updateTextures(LLAgent &agent)
mMaxPixelArea = 0.f;
mMinPixelArea = 99999999.f;
mHasGrey = FALSE; // debug
- for (U32 index = 0; index < getNumTEs(); index++)
+ for (U32 texture = 0; texture < getNumTEs(); texture++)
{
- LLViewerFetchedTexture *imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(index), TRUE);
- if (imagep)
+ EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)texture);
+ U32 num_wearables = gAgentWearables.getWearableCount(wearable_type);
+ const LLTextureEntry *te = getTE(texture);
+ const F32 texel_area_ratio = fabs(te->mScaleS * te->mScaleT);
+ LLViewerFetchedTexture *imagep = NULL;
+ for (U32 wearable_index = 0; wearable_index < num_wearables; wearable_index++)
+ {
+ imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture, wearable_index), TRUE);
+ if (imagep)
+ {
+ const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture((ETextureIndex)texture);
+ const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;
+ if (texture_dict->mIsLocalTexture)
+ {
+ addLocalTextureStats((ETextureIndex)texture, imagep, texel_area_ratio, render_avatar, layer_baked[baked_index]);
+ }
+ }
+ }
+ if (isIndexBakedTexture((ETextureIndex) texture))
{
- const LLTextureEntry *te = getTE(index);
- const F32 texel_area_ratio = fabs(te->mScaleS * te->mScaleT);
const S32 boost_level = getAvatarBakedBoostLevel();
-
+ imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture,0), TRUE);
// Spam if this is a baked texture, not set to default image, without valid host info
- if (isIndexBakedTexture((ETextureIndex)index)
+ if (isIndexBakedTexture((ETextureIndex)texture)
&& imagep->getID() != IMG_DEFAULT_AVATAR
&& !imagep->getTargetHost().isOk())
{
@@ -3982,25 +3997,7 @@ void LLVOAvatar::updateTextures(LLAgent &agent)
<< " on host " << getRegion()->getHost() << llendl;
}
- /* switch(index)
- case TEX_HEAD_BODYPAINT:
- addLocalTextureStats( LOCTEX_HEAD_BODYPAINT, imagep, texel_area_ratio, render_avatar, head_baked ); */
- const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture((ETextureIndex)index);
- if (texture_dict->mIsUsedByBakedTexture)
- {
- const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;
- if (texture_dict->mIsLocalTexture)
- {
- addLocalTextureStats((ETextureIndex)index, imagep, texel_area_ratio, render_avatar, layer_baked[baked_index]);
- }
- else if (texture_dict->mIsBakedTexture)
- {
- if (layer_baked[baked_index])
- {
- addBakedTextureStats( imagep, mPixelArea, texel_area_ratio, boost_level );
- }
- }
- }
+ addBakedTextureStats( imagep, mPixelArea, texel_area_ratio, boost_level );
}
}
@@ -4033,13 +4030,13 @@ void LLVOAvatar::addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel
}
//virtual
-void LLVOAvatar::setImage(const U8 te, LLViewerTexture *imagep)
+void LLVOAvatar::setImage(const U8 te, LLViewerTexture *imagep, const U32 index)
{
setTEImage(te, imagep);
}
//virtual
-LLViewerTexture* LLVOAvatar::getImage(const U8 te) const
+LLViewerTexture* LLVOAvatar::getImage(const U8 te, const U32 index) const
{
return getTEImage(te);
}
@@ -4746,6 +4743,19 @@ BOOL LLVOAvatar::loadAvatar()
return FALSE;
}
}
+
+ // Uncomment to enable avatar_lad.xml debugging.
+/* std::ofstream file;
+ file.open("avatar_lad.log");
+ for( LLViewerVisualParam* param = (LLViewerVisualParam*) getFirstVisualParam();
+ param;
+ param = (LLViewerVisualParam*) getNextVisualParam() )
+ {
+ param->getInfo()->toStream(file);
+ file << std::endl;
+ }
+
+ file.close();*/
return TRUE;
}
@@ -5822,10 +5832,10 @@ void LLVOAvatar::updateMeshTextures()
// if user has never specified a texture, assign the default
for (U32 i=0; i < getNumTEs(); i++)
{
- const LLViewerTexture* te_image = getImage(i);
+ const LLViewerTexture* te_image = getImage(i, 0);
if(!te_image || te_image->getID().isNull() || (te_image->getID() == IMG_DEFAULT))
{
- setImage(i, LLViewerTextureManager::getFetchedTexture(i == TEX_HAIR ? IMG_DEFAULT : IMG_DEFAULT_AVATAR)); // IMG_DEFAULT_AVATAR = a special texture that's never rendered.
+ setImage(i, LLViewerTextureManager::getFetchedTexture(i == TEX_HAIR ? IMG_DEFAULT : IMG_DEFAULT_AVATAR), 0); // IMG_DEFAULT_AVATAR = a special texture that's never rendered.
}
}
@@ -5888,7 +5898,7 @@ void LLVOAvatar::updateMeshTextures()
}
else if (!self_customizing && is_layer_baked[i])
{
- LLViewerFetchedTexture* baked_img = LLViewerTextureManager::staticCastToFetchedTexture(getImage( mBakedTextureDatas[i].mTextureIndex ), TRUE) ;
+ LLViewerFetchedTexture* baked_img = LLViewerTextureManager::staticCastToFetchedTexture(getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ;
if( baked_img->getID() == mBakedTextureDatas[i].mLastTextureIndex )
{
// Even though the file may not be finished loading, we'll consider it loaded and use it (rather than doing compositing).
@@ -5923,7 +5933,7 @@ void LLVOAvatar::updateMeshTextures()
if (!is_layer_baked[BAKED_HAIR] || self_customizing)
{
const LLColor4 color = mTexHairColor ? mTexHairColor->getColor() : LLColor4(1,1,1,1);
- LLViewerTexture* hair_img = getImage( TEX_HAIR );
+ LLViewerTexture* hair_img = getImage( TEX_HAIR, 0 );
for (U32 i = 0; i < mBakedTextureDatas[BAKED_HAIR].mMeshes.size(); i++)
{
mBakedTextureDatas[BAKED_HAIR].mMeshes[i]->setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] );
@@ -5947,7 +5957,10 @@ void LLVOAvatar::updateMeshTextures()
{
const ETextureIndex texture_index = *local_tex_iter;
const BOOL is_baked_ready = (is_layer_baked[baked_index] && mBakedTextureDatas[baked_index].mIsLoaded) || other_culled;
- setLocalTexture(texture_index, getImage(texture_index), is_baked_ready );
+ if (isSelf())
+ {
+ setBakedReady(texture_index, is_baked_ready);
+ }
}
}
removeMissingBakedTextures();
@@ -5963,6 +5976,13 @@ void LLVOAvatar::setLocalTexture( ETextureIndex type, LLViewerTexture* in_tex, B
llassert(0);
}
+//virtual
+void LLVOAvatar::setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index)
+{
+ // invalid for anyone but self
+ llassert(0);
+}
+
void LLVOAvatar::addChat(const LLChat& chat)
{
std::deque<LLChat>::iterator chat_iter;
@@ -6068,9 +6088,9 @@ void LLVOAvatar::releaseComponentTextures()
{
// ! BACKWARDS COMPATIBILITY !
// Detect if the baked hair texture actually wasn't sent, and if so set to default
- if (isTextureDefined(TEX_HAIR_BAKED) && getImage(TEX_HAIR_BAKED)->getID() == getImage(TEX_SKIRT_BAKED)->getID())
+ if (isTextureDefined(TEX_HAIR_BAKED) && getImage(TEX_HAIR_BAKED,0)->getID() == getImage(TEX_SKIRT_BAKED,0)->getID())
{
- if (getImage(TEX_HAIR_BAKED)->getID() != IMG_INVISIBLE)
+ if (getImage(TEX_HAIR_BAKED,0)->getID() != IMG_INVISIBLE)
{
// Regression case of messaging system. Expected 21 textures, received 20. last texture is not valid so set to default
setTETexture(TEX_HAIR_BAKED, IMG_DEFAULT_AVATAR);
@@ -6095,63 +6115,64 @@ void LLVOAvatar::releaseComponentTextures()
}
}
-BOOL LLVOAvatar::teToColorParams( ETextureIndex te, const char* param_name[3] )
+//static
+BOOL LLVOAvatar::teToColorParams( ETextureIndex te, U32 *param_name )
{
switch( te )
{
case TEX_UPPER_SHIRT:
- param_name[0] = "shirt_red";
- param_name[1] = "shirt_green";
- param_name[2] = "shirt_blue";
+ param_name[0] = 803; //"shirt_red";
+ param_name[1] = 804; //"shirt_green";
+ param_name[2] = 805; //"shirt_blue";
break;
case TEX_LOWER_PANTS:
- param_name[0] = "pants_red";
- param_name[1] = "pants_green";
- param_name[2] = "pants_blue";
+ param_name[0] = 806; //"pants_red";
+ param_name[1] = 807; //"pants_green";
+ param_name[2] = 808; //"pants_blue";
break;
case TEX_LOWER_SHOES:
- param_name[0] = "shoes_red";
- param_name[1] = "shoes_green";
- param_name[2] = "shoes_blue";
+ param_name[0] = 812; //"shoes_red";
+ param_name[1] = 813; //"shoes_green";
+ param_name[2] = 817; //"shoes_blue";
break;
case TEX_LOWER_SOCKS:
- param_name[0] = "socks_red";
- param_name[1] = "socks_green";
- param_name[2] = "socks_blue";
+ param_name[0] = 818; //"socks_red";
+ param_name[1] = 819; //"socks_green";
+ param_name[2] = 820; //"socks_blue";
break;
case TEX_UPPER_JACKET:
case TEX_LOWER_JACKET:
- param_name[0] = "jacket_red";
- param_name[1] = "jacket_green";
- param_name[2] = "jacket_blue";
+ param_name[0] = 834; //"jacket_red";
+ param_name[1] = 835; //"jacket_green";
+ param_name[2] = 836; //"jacket_blue";
break;
case TEX_UPPER_GLOVES:
- param_name[0] = "gloves_red";
- param_name[1] = "gloves_green";
- param_name[2] = "gloves_blue";
+ param_name[0] = 827; //"gloves_red";
+ param_name[1] = 829; //"gloves_green";
+ param_name[2] = 830; //"gloves_blue";
break;
case TEX_UPPER_UNDERSHIRT:
- param_name[0] = "undershirt_red";
- param_name[1] = "undershirt_green";
- param_name[2] = "undershirt_blue";
+ param_name[0] = 821; //"undershirt_red";
+ param_name[1] = 822; //"undershirt_green";
+ param_name[2] = 823; //"undershirt_blue";
break;
case TEX_LOWER_UNDERPANTS:
- param_name[0] = "underpants_red";
- param_name[1] = "underpants_green";
- param_name[2] = "underpants_blue";
+ param_name[0] = 824; //"underpants_red";
+ param_name[1] = 825; //"underpants_green";
+ param_name[2] = 826; //"underpants_blue";
break;
case TEX_SKIRT:
- param_name[0] = "skirt_red";
- param_name[1] = "skirt_green";
- param_name[2] = "skirt_blue";
+ param_name[0] = 921; //"skirt_red";
+ param_name[1] = 922; //"skirt_green";
+ param_name[2] = 923; //"skirt_blue";
break;
default:
@@ -6164,7 +6185,7 @@ BOOL LLVOAvatar::teToColorParams( ETextureIndex te, const char* param_name[3] )
void LLVOAvatar::setClothesColor( ETextureIndex te, const LLColor4& new_color, BOOL set_by_user )
{
- const char* param_name[3];
+ U32 param_name[3];
if( teToColorParams( te, param_name ) )
{
setVisualParamWeight( param_name[0], new_color.mV[VX], set_by_user );
@@ -6176,7 +6197,7 @@ void LLVOAvatar::setClothesColor( ETextureIndex te, const LLColor4& new_color, B
LLColor4 LLVOAvatar::getClothesColor( ETextureIndex te )
{
LLColor4 color;
- const char* param_name[3];
+ U32 param_name[3];
if( teToColorParams( te, param_name ) )
{
color.mV[VX] = getVisualParamWeight( param_name[0] );
@@ -6203,7 +6224,8 @@ void LLVOAvatar::dumpAvatarTEs( const std::string& context )
iter++)
{
const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
- const LLViewerTexture* te_image = getImage(iter->first);
+ // TODO: handle multiple textures for self
+ const LLViewerTexture* te_image = getImage(iter->first,0);
if( !te_image )
{
llinfos << " " << texture_dict->mName << ": null ptr" << llendl;
@@ -6250,23 +6272,9 @@ BOOL LLVOAvatar::isWearingWearableType(EWearableType type) const
tex_iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
tex_iter++)
{
- const LLVOAvatarDefines::ETextureIndex index = tex_iter->first;
const LLVOAvatarDictionary::TextureEntry *texture_dict = tex_iter->second;
if (texture_dict->mWearableType == type)
{
- // If you're checking your own clothing, check the component texture
- if (isSelf())
- {
- if (isTextureDefined(index))
- {
- return TRUE;
- }
- else
- {
- return FALSE;
- }
- }
-
// If you're checking another avatar's clothing, you don't have component textures.
// Thus, you must check to see if the corresponding baked texture is defined.
// NOTE: this is a poor substitute if you actually want to know about individual pieces of clothing
@@ -6369,7 +6377,7 @@ void LLVOAvatar::onFirstTEMessageReceived()
// (That is, don't do a transition from unbaked to baked.)
if (layer_baked)
{
- LLViewerFetchedTexture* image = LLViewerTextureManager::staticCastToFetchedTexture(getImage( mBakedTextureDatas[i].mTextureIndex ), TRUE) ;
+ LLViewerFetchedTexture* image = LLViewerTextureManager::staticCastToFetchedTexture(getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ;
mBakedTextureDatas[i].mLastTextureIndex = image->getID();
// If we have more than one texture for the other baked layers, we'll want to call this for them too.
if ( (i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER) )
@@ -6624,8 +6632,8 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture
if (texture_dict->mIsUsedByBakedTexture)
{
const ETextureIndex texture_index = iter->first;
- const LLViewerTexture *baked_img = self->getImage(texture_index);
- if (id == baked_img->getID())
+ const LLViewerTexture *baked_img = self->getImage(texture_index, 0);
+ if (baked_img && id == baked_img->getID())
{
const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;
self->applyMorphMask(aux_src->getData(), aux_src->getWidth(), aux_src->getHeight(), 1, baked_index);
@@ -6634,7 +6642,6 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture
{
LLImageGL::deleteTextures(1, &(self->mBakedTextureDatas[baked_index].mMaskTexName));
}
-
self->mBakedTextureDatas[baked_index].mMaskTexName = gl_name;
found_texture_id = true;
break;
@@ -6712,7 +6719,7 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id )
mHeadMesh1.setTexture( head_baked ); */
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
{
- LLViewerTexture* image_baked = getImage( mBakedTextureDatas[i].mTextureIndex );
+ LLViewerTexture* image_baked = getImage( mBakedTextureDatas[i].mTextureIndex, 0 );
if (id == image_baked->getID())
{
mBakedTextureDatas[i].mIsLoaded = true;
@@ -6724,14 +6731,14 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id )
}
if (mBakedTextureDatas[i].mTexLayerSet)
{
- mBakedTextureDatas[i].mTexLayerSet->destroyComposite();
+ //mBakedTextureDatas[i].mTexLayerSet->destroyComposite();
}
const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i);
for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();
local_tex_iter != baked_dict->mLocalTextures.end();
local_tex_iter++)
{
- setLocalTexture(*local_tex_iter, getImage(*local_tex_iter), TRUE);
+ this->setBakedReady(*local_tex_iter, TRUE);
}
// ! BACKWARDS COMPATIBILITY !
@@ -6787,7 +6794,8 @@ void LLVOAvatar::dumpArchetypeXML( void* )
{
if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex)te) == type)
{
- LLViewerTexture* te_image = avatar->getImage((ETextureIndex)te);
+ // MULTIPLE_WEARABLES: extend to multiple wearables?
+ LLViewerTexture* te_image = avatar->getImage((ETextureIndex)te, 0);
if( te_image )
{
std::string uuid_str;
@@ -7763,7 +7771,7 @@ BOOL LLVOAvatar::isTextureDefined(LLVOAvatarDefines::ETextureIndex te, U32 index
return FALSE;
}
- return (getImage(te)->getID() != IMG_DEFAULT_AVATAR &&
- getImage(te)->getID() != IMG_DEFAULT);
+ return (getImage(te, index)->getID() != IMG_DEFAULT_AVATAR &&
+ getImage(te, index)->getID() != IMG_DEFAULT);
}
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index ef5358198d..1529beeac9 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -268,12 +268,14 @@ private:
public:
void updateHeadOffset();
F32 getPelvisToFoot() const { return mPelvisToFoot; }
+
LLVector3 mHeadOffset; // current head position
LLViewerJoint mRoot;
protected:
static BOOL parseSkeletonFile(const std::string& filename);
void buildCharacter();
BOOL loadAvatar();
+
BOOL setupBone(const LLVOAvatarBoneInfo* info, LLViewerJoint* parent, S32 &current_volume_num, S32 &current_joint_num);
BOOL buildSkeleton(const LLVOAvatarSkeletonInfo *info);
private:
@@ -495,13 +497,15 @@ protected:
protected:
virtual void setLocalTexture(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index = 0);
virtual void addLocalTextureStats(LLVOAvatarDefines::ETextureIndex type, LLViewerFetchedTexture* imagep, F32 texel_area_ratio, BOOL rendered, BOOL covered_by_baked, U32 index = 0);
+ // MULTI-WEARABLE: make self-only?
+ virtual void setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index = 0);
//--------------------------------------------------------------------
// Texture accessors
//--------------------------------------------------------------------
private:
- virtual void setImage(const U8 te, LLViewerTexture *imagep);
- virtual LLViewerTexture* getImage(const U8 te) const;
+ virtual void setImage(const U8 te, LLViewerTexture *imagep, const U32 index);
+ virtual LLViewerTexture* getImage(const U8 te, const U32 index) const;
virtual const LLTextureEntry* getTexEntry(const U8 te_num) const;
virtual void setTexEntry(const U8 index, const LLTextureEntry &te);
@@ -605,7 +609,7 @@ private:
public:
void setClothesColor(LLVOAvatarDefines::ETextureIndex te, const LLColor4& new_color, BOOL set_by_user);
LLColor4 getClothesColor(LLVOAvatarDefines::ETextureIndex te);
- BOOL teToColorParams(LLVOAvatarDefines::ETextureIndex te, const char* param_name[3]);
+ static BOOL teToColorParams(LLVOAvatarDefines::ETextureIndex te, U32 *param_name);
//--------------------------------------------------------------------
// Global colors
@@ -637,7 +641,7 @@ public:
**/
public:
- BOOL isWearingWearableType(EWearableType type ) const;
+ virtual BOOL isWearingWearableType(EWearableType type ) const;
//--------------------------------------------------------------------
// Attachments
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 76a4bfbf0c..457c6fe93e 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -589,7 +589,7 @@ BOOL LLVOAvatarSelf::loadLayersets()
morph_iter++)
{
LLMaskedMorph *morph = *morph_iter;
- LLTexLayer * layer = layer_set->findLayerByName(morph->mLayer);
+ LLTexLayerInterface* layer = layer_set->findLayerByName(morph->mLayer);
if (layer)
{
layer->setHasMorph(TRUE);
@@ -631,6 +631,71 @@ LLJoint *LLVOAvatarSelf::getJoint(const std::string &name)
return LLVOAvatar::getJoint(name);
}
+/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL set_by_user )
+{
+ if (!which_param)
+ {
+ return FALSE;
+ }
+ LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(which_param->getID());
+ return setParamWeight(param,weight,set_by_user);
+}
+
+/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user )
+{
+ if (!param_name)
+ {
+ return FALSE;
+ }
+ LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(param_name);
+ return setParamWeight(param,weight,set_by_user);
+}
+
+/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user )
+{
+ LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(index);
+ return setParamWeight(param,weight,set_by_user);
+}
+
+BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL set_by_user )
+{
+ if (!param)
+ {
+ return FALSE;
+ }
+
+ if (param->getCrossWearable())
+ {
+ EWearableType type = (EWearableType)param->getWearableType();
+ U32 size = gAgentWearables.getWearableCount(type);
+ for (U32 count = 0; count < size; ++count)
+ {
+ LLWearable *wearable = gAgentWearables.getWearable(type,count);
+ if (wearable)
+ {
+ wearable->setVisualParamWeight(param->getID(), weight, set_by_user);
+ }
+ }
+ }
+
+ return LLCharacter::setVisualParamWeight(param,weight,set_by_user);
+}
+
+/*virtual*/
+void LLVOAvatarSelf::updateVisualParams()
+{
+ for (U32 type = 0; type < WT_COUNT; type++)
+ {
+ LLWearable *wearable = gAgentWearables.getTopWearable((EWearableType)type);
+ if (wearable)
+ {
+ wearable->writeToAvatar(FALSE, FALSE);
+ }
+ }
+
+ LLVOAvatar::updateVisualParams();
+}
+
// virtual
void LLVOAvatarSelf::requestStopMotion(LLMotion* motion)
{
@@ -861,6 +926,11 @@ void LLVOAvatarSelf::updateAttachmentVisibility(U32 camera_mode)
}
}
+/*virtual*/ BOOL LLVOAvatarSelf::isWearingWearableType(EWearableType type ) const
+{
+ return gAgentWearables.getWearableCount(type) > 0;
+}
+
//-----------------------------------------------------------------------------
// updatedWearable( EWearableType type )
// forces an update to any baked textures relevant to type.
@@ -1105,6 +1175,25 @@ BOOL LLVOAvatarSelf::getLocalTextureGL(ETextureIndex type, LLViewerTexture** tex
return TRUE;
}
+LLViewerFetchedTexture* LLVOAvatarSelf::getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, U32 index) const
+{
+ if (!isIndexLocalTexture(type))
+ {
+ return NULL;
+ }
+
+ const LLLocalTextureObject *local_tex_obj = getLocalTextureObject(type, index);
+ if (!local_tex_obj)
+ {
+ return NULL;
+ }
+ if (local_tex_obj->getID() == IMG_DEFAULT_AVATAR)
+ {
+ return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR);
+ }
+ return local_tex_obj->getImage();
+}
+
const LLUUID& LLVOAvatarSelf::getLocalTextureID(ETextureIndex type, U32 index) const
{
if (!isIndexLocalTexture(type)) return IMG_DEFAULT_AVATAR;
@@ -1115,7 +1204,8 @@ const LLUUID& LLVOAvatarSelf::getLocalTextureID(ETextureIndex type, U32 index) c
return local_tex_obj->getImage()->getID();
}
return IMG_DEFAULT_AVATAR;
-}
+}
+
//-----------------------------------------------------------------------------
// isLocalTextureDataAvailable()
@@ -1140,7 +1230,12 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset)
local_tex_iter++)
{
const ETextureIndex tex_index = *local_tex_iter;
- ret &= (getLocalDiscardLevel(tex_index) >= 0);
+ const EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index);
+ const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);
+ for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)
+ {
+ ret &= (getLocalDiscardLevel(tex_index, wearable_index) >= 0);
+ }
}
return ret;
}
@@ -1166,9 +1261,15 @@ BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) cons
local_tex_iter != baked_dict->mLocalTextures.end();
local_tex_iter++)
{
- if (getLocalDiscardLevel(*local_tex_iter) != 0)
+ const ETextureIndex tex_index = *local_tex_iter;
+ const EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index);
+ const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);
+ for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)
{
- return FALSE;
+ if (getLocalDiscardLevel(*local_tex_iter, wearable_index) != 0)
+ {
+ return FALSE;
+ }
}
}
return TRUE;
@@ -1181,17 +1282,33 @@ BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) cons
BOOL LLVOAvatarSelf::isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 index) const
{
LLUUID id;
+ BOOL isDefined = TRUE;
if (isIndexLocalTexture(type))
{
- id = getLocalTextureID(type, index);
+ const EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType(type);
+ const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);
+ if (index >= wearable_count)
+ {
+ // invalid index passed in. check all textures of a given type
+ for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)
+ {
+ id = getLocalTextureID(type, wearable_index);
+ isDefined &= (id != IMG_DEFAULT_AVATAR && id != IMG_DEFAULT);
+ }
+ }
+ else
+ {
+ id = getLocalTextureID(type, index);
+ isDefined &= (id != IMG_DEFAULT_AVATAR && id != IMG_DEFAULT);
+ }
}
else
{
id = getTEImage(type)->getID();
+ isDefined &= (id != IMG_DEFAULT_AVATAR && id != IMG_DEFAULT);
}
-
- return (id != IMG_DEFAULT_AVATAR &&
- id != IMG_DEFAULT);
+
+ return isDefined;
}
//-----------------------------------------------------------------------------
@@ -1202,7 +1319,8 @@ void LLVOAvatarSelf::requestLayerSetUploads()
{
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
{
- BOOL layer_baked = isTextureDefined(mBakedTextureDatas[i].mTextureIndex);
+ ETextureIndex tex_index = mBakedTextureDatas[i].mTextureIndex;
+ BOOL layer_baked = isTextureDefined(tex_index, gAgentWearables.getWearableCount(tex_index));
if (!layer_baked && mBakedTextureDatas[i].mTexLayerSet)
{
mBakedTextureDatas[i].mTexLayerSet->requestUpload();
@@ -1277,7 +1395,8 @@ void LLVOAvatarSelf::setupComposites()
{
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
{
- BOOL layer_baked = isTextureDefined(mBakedTextureDatas[i].mTextureIndex);
+ ETextureIndex tex_index = mBakedTextureDatas[i].mTextureIndex;
+ BOOL layer_baked = isTextureDefined(tex_index, gAgentWearables.getWearableCount(tex_index));
if (mBakedTextureDatas[i].mTexLayerSet)
{
mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled(!layer_baked);
@@ -1298,15 +1417,15 @@ void LLVOAvatarSelf::updateComposites()
}
// virtual
-S32 LLVOAvatarSelf::getLocalDiscardLevel(ETextureIndex type, U32 index) const
+S32 LLVOAvatarSelf::getLocalDiscardLevel(ETextureIndex type, U32 wearable_index) const
{
if (!isIndexLocalTexture(type)) return FALSE;
- const LLLocalTextureObject *local_tex_obj = getLocalTextureObject(type, index);
+ const LLLocalTextureObject *local_tex_obj = getLocalTextureObject(type, wearable_index);
if (local_tex_obj)
{
if (type >= 0
- && getLocalTextureID(type,index) != IMG_DEFAULT_AVATAR
+ && local_tex_obj->getID() != IMG_DEFAULT_AVATAR
&& !local_tex_obj->getImage()->isMissingAsset())
{
return local_tex_obj->getImage()->getDiscardLevel();
@@ -1370,7 +1489,7 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te
return;
}
EWearableType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType(type);
- if (!gAgentWearables.getWearable(wearable_type,0))
+ if (!gAgentWearables.getWearable(wearable_type,index))
{
// no wearable is loaded, cannot set the texture.
return;
@@ -1382,6 +1501,13 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te
llerrs << "Unable to create LocalTextureObject for wearable type & index: (" << (U32) wearable_type << ", " << index << ")" << llendl;
return;
}
+
+ LLTexLayerSet *layer_set = getLayerSet(type);
+ if (layer_set)
+ {
+ layer_set->cloneTemplates(local_tex_obj, type, gAgentWearables.getWearable(wearable_type,index));
+ }
+
}
if (!baked_version_ready)
{
@@ -1414,9 +1540,21 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te
tex->setMinDiscardLevel(desired_discard);
}
}
- local_tex_obj->setBakedReady( baked_version_ready );
local_tex_obj->setImage(tex);
+ local_tex_obj->setID(tex->getID());
+ setBakedReady(type,baked_version_ready,index);
}
+//virtual
+void LLVOAvatarSelf::setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index)
+{
+ if (!isIndexLocalTexture(type)) return;
+ LLLocalTextureObject *local_tex_obj = getLocalTextureObject(type,index);
+ if (local_tex_obj)
+ {
+ local_tex_obj->setBakedReady( baked_version_exists );
+ }
+}
+
// virtual
void LLVOAvatarSelf::dumpLocalTextures() const
@@ -1439,7 +1577,8 @@ void LLVOAvatarSelf::dumpLocalTextures() const
const std::string &name = texture_dict->mName;
const LLLocalTextureObject *local_tex_obj = getLocalTextureObject(iter->first, 0);
- if (isTextureDefined(baked_equiv))
+ // index is baked texture - index is not relevant. putting in 0 as placeholder
+ if (isTextureDefined(baked_equiv, 0))
{
#if LL_RELEASE_FOR_DOWNLOAD
// End users don't get to trivially see avatar texture IDs, makes textures
@@ -1499,6 +1638,31 @@ void LLVOAvatarSelf::onLocalTextureLoaded(BOOL success, LLViewerFetchedTexture *
}
}
+/*virtual*/ void LLVOAvatarSelf::setImage(const U8 te, LLViewerTexture *imagep, const U32 index)
+{
+ if (isIndexLocalTexture((ETextureIndex)te))
+ {
+ setLocalTexture((ETextureIndex)te, imagep, FALSE ,index);
+ }
+ else
+ {
+ setTEImage(te,imagep);
+ }
+}
+
+/*virtual*/ LLViewerTexture* LLVOAvatarSelf::getImage(const U8 te, const U32 index) const
+{
+ if (isIndexLocalTexture((ETextureIndex)te))
+ {
+ return getLocalTextureGL((ETextureIndex)te,index);
+ }
+ else
+ {
+ return getTEImage(te);
+ }
+}
+
+
// static
void LLVOAvatarSelf::dumpTotalLocalTextureByteCount()
{
@@ -1517,7 +1681,7 @@ BOOL LLVOAvatarSelf::updateIsFullyLoaded()
loading = TRUE;
}
- if (!isTextureDefined(TEX_HAIR))
+ if (!isTextureDefined(TEX_HAIR, 0))
{
loading = TRUE;
}
@@ -1525,13 +1689,13 @@ BOOL LLVOAvatarSelf::updateIsFullyLoaded()
if (!mPreviousFullyLoaded)
{
if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_LOWER].mTexLayerSet) &&
- (!isTextureDefined(TEX_LOWER_BAKED)))
+ (!isTextureDefined(TEX_LOWER_BAKED, 0)))
{
loading = TRUE;
}
if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_UPPER].mTexLayerSet) &&
- (!isTextureDefined(TEX_UPPER_BAKED)))
+ (!isTextureDefined(TEX_UPPER_BAKED, 0)))
{
loading = TRUE;
}
@@ -1542,11 +1706,11 @@ BOOL LLVOAvatarSelf::updateIsFullyLoaded()
continue;
BakedTextureData& texture_data = mBakedTextureDatas[i];
- if (!isTextureDefined(texture_data.mTextureIndex))
+ if (!isTextureDefined(texture_data.mTextureIndex, 0))
continue;
// Check for the case that texture is defined but not sufficiently loaded to display anything.
- LLViewerTexture* baked_img = getImage( texture_data.mTextureIndex );
+ LLViewerTexture* baked_img = getImage( texture_data.mTextureIndex, 0 );
if (!baked_img || !baked_img->hasGLTexture())
{
loading = TRUE;
@@ -1570,9 +1734,9 @@ const LLUUID& LLVOAvatarSelf::grabLocalTexture(ETextureIndex type, U32 index) co
BOOL LLVOAvatarSelf::canGrabLocalTexture(ETextureIndex type, U32 index) const
{
// Check if the texture hasn't been baked yet.
- if (!isTextureDefined(type))
+ if (!isTextureDefined(type, index))
{
- lldebugs << "getTEImage( " << (U32) type << " )->getID() == IMG_DEFAULT_AVATAR" << llendl;
+ lldebugs << "getTEImage( " << (U32) type << ", " << index << " )->getID() == IMG_DEFAULT_AVATAR" << llendl;
return FALSE;
}
@@ -1596,6 +1760,7 @@ BOOL LLVOAvatarSelf::canGrabLocalTexture(ETextureIndex type, U32 index) const
{
const ETextureIndex t_index = (*iter);
lldebugs << "Checking index " << (U32) t_index << llendl;
+ // MULTI-WEARABLE: old method. replace.
const LLUUID& texture_id = getTEImage( t_index )->getID();
if (texture_id != IMG_DEFAULT_AVATAR)
{
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index 17744cce1b..88eb491f35 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -85,6 +85,16 @@ public:
/*virtual*/ void requestStopMotion(LLMotion* motion);
/*virtual*/ LLJoint* getJoint(const std::string &name);
+ /*virtual*/ BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL set_by_user = FALSE );
+ /*virtual*/ BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user = FALSE );
+ /*virtual*/ BOOL setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user = FALSE );
+ /*virtual*/ void updateVisualParams();
+
+private:
+ // helper function. Passed in param is assumed to be in avatar's parameter list.
+ BOOL setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL set_by_user = FALSE );
+
+
/** Initialization
** **
*******************************************************************************/
@@ -160,31 +170,38 @@ public:
//--------------------------------------------------------------------
public:
/*virtual*/ bool hasPendingBakedUploads() const;
- S32 getLocalDiscardLevel(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const;
+ S32 getLocalDiscardLevel(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
bool areTexturesCurrent() const;
BOOL isLocalTextureDataAvailable(const LLTexLayerSet* layerset) const;
BOOL isLocalTextureDataFinal(const LLTexLayerSet* layerset) const;
- /*virtual*/ BOOL isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const;
+ // If you want to check all textures of a given type, pass gAgentWearables.getWearableCount() for index
+ /*virtual*/ BOOL isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
//--------------------------------------------------------------------
// Local Textures
//--------------------------------------------------------------------
public:
- BOOL getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture** image_gl_pp, U32 index = 0) const;
- const LLUUID& getLocalTextureID(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const;
- void setLocalTextureTE(U8 te, LLViewerTexture* image, BOOL set_by_user, U32 index = 0);
- const LLUUID& grabLocalTexture(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const;
- BOOL canGrabLocalTexture(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const;
+ BOOL getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture** image_gl_pp, U32 index) const;
+ LLViewerFetchedTexture* getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
+ const LLUUID& getLocalTextureID(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
+ void setLocalTextureTE(U8 te, LLViewerTexture* image, BOOL set_by_user, U32 index);
+ const LLUUID& grabLocalTexture(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
+ BOOL canGrabLocalTexture(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
protected:
- /*virtual*/ void setLocalTexture(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index = 0);
+ /*virtual*/ void setLocalTexture(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index);
+ /*virtual*/ void setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index);
void localTextureLoaded(BOOL succcess, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);
void getLocalTextureByteCount(S32* gl_byte_count) const;
- /*virtual*/ void addLocalTextureStats(LLVOAvatarDefines::ETextureIndex i, LLViewerFetchedTexture* imagep, F32 texel_area_ratio, BOOL rendered, BOOL covered_by_baked, U32 index = 0);
- LLLocalTextureObject* getLocalTextureObject(LLVOAvatarDefines::ETextureIndex i, U32 index = 0) const;
+ /*virtual*/ void addLocalTextureStats(LLVOAvatarDefines::ETextureIndex i, LLViewerFetchedTexture* imagep, F32 texel_area_ratio, BOOL rendered, BOOL covered_by_baked, U32 index);
+ LLLocalTextureObject* getLocalTextureObject(LLVOAvatarDefines::ETextureIndex i, U32 index) const;
private:
static void onLocalTextureLoaded(BOOL succcess, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);
+ /*virtual*/ void setImage(const U8 te, LLViewerTexture *imagep, const U32 index);
+ /*virtual*/ LLViewerTexture* getImage(const U8 te, const U32 index) const;
+
+
//--------------------------------------------------------------------
// Baked textures
//--------------------------------------------------------------------
@@ -203,7 +220,7 @@ protected:
public:
void requestLayerSetUploads();
void requestLayerSetUpdate(LLVOAvatarDefines::ETextureIndex i);
-protected:
+public:
LLTexLayerSet* getLayerSet(LLVOAvatarDefines::ETextureIndex index) const;
//--------------------------------------------------------------------
@@ -250,6 +267,7 @@ protected:
**/
public:
+ /*virtual*/ BOOL isWearingWearableType(EWearableType type ) const;
void wearableUpdated(EWearableType type);
//--------------------------------------------------------------------
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index 0d3dd10a01..1675ee1adc 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -44,6 +44,9 @@
#include "llwearable.h"
#include "lldictionary.h"
#include "lltrans.h"
+#include "lltexlayer.h"
+#include "llvisualparam.h"
+#include "lltexglobalcolor.h"
using namespace LLVOAvatarDefines;
@@ -129,17 +132,18 @@ BOOL LLWearable::exportFile(LLFILE* file) const
}
// parameters
- S32 num_parameters = mVisualParamMap.size();
+ S32 num_parameters = mVisualParamIndexMap.size();
if( fprintf( file, "parameters %d\n", num_parameters ) < 0 )
{
return FALSE;
}
- for (param_map_t::const_iterator iter = mVisualParamMap.begin();
- iter != mVisualParamMap.end(); ++iter)
+ for (VisualParamIndexMap_t::const_iterator iter = mVisualParamIndexMap.begin();
+ iter != mVisualParamIndexMap.end(); ++iter)
{
S32 param_id = iter->first;
- F32 param_weight = iter->second;
+ LLVisualParam* param = iter->second;
+ F32 param_weight = param->getWeight();
if( fprintf( file, "%d %s\n", param_id, terse_F32_to_string( param_weight ).c_str() ) < 0 )
{
return FALSE;
@@ -156,7 +160,7 @@ BOOL LLWearable::exportFile(LLFILE* file) const
for (te_map_t::const_iterator iter = mTEMap.begin(); iter != mTEMap.end(); ++iter)
{
S32 te = iter->first;
- const LLUUID& image_id = iter->second.getID();
+ const LLUUID& image_id = iter->second->getID();
if( fprintf( file, "%d %s\n", te, image_id.asString().c_str()) < 0 )
{
return FALSE;
@@ -165,6 +169,42 @@ BOOL LLWearable::exportFile(LLFILE* file) const
return TRUE;
}
+
+void LLWearable::createVisualParams()
+{
+ LLVOAvatar* avatar = gAgent.getAvatarObject();
+ for( LLViewerVisualParam* param = (LLViewerVisualParam*) avatar->getFirstVisualParam();
+ param;
+ param = (LLViewerVisualParam*) avatar->getNextVisualParam() )
+ {
+ if( (param->getWearableType() == mType) )
+ {
+ if( mVisualParamIndexMap[param->getID()] )
+ {
+ delete mVisualParamIndexMap[param->getID()];
+ }
+ mVisualParamIndexMap[param->getID()] = param->cloneParam(this);
+ }
+ }
+
+ // resync driver parameters to point to the newly cloned driven parameters
+ for( VisualParamIndexMap_t::iterator param_iter = mVisualParamIndexMap.begin(); param_iter != mVisualParamIndexMap.end(); param_iter++ )
+ {
+ LLVisualParam* param = param_iter->second;
+ LLVisualParam*(LLWearable::*wearable_function)(S32)const = &LLWearable::getVisualParam;
+ // need this line to disambiguate between versions of LLCharacter::getVisualParam()
+ LLVisualParam*(LLVOAvatarSelf::*avatar_function)(S32)const = &LLVOAvatarSelf::getVisualParam;
+ if(!param->linkDrivenParams(boost::bind(wearable_function,(LLWearable*)this, _1), false))
+ {
+ if( !param->linkDrivenParams(boost::bind(avatar_function,(LLVOAvatarSelf*)avatar,_1 ), true))
+ {
+ llwarns << "could not link driven params for wearable " << getName() << llendl;
+ continue;
+ }
+ }
+ }
+}
+
BOOL LLWearable::importFile( LLFILE* file )
{
// *NOTE: changing the type or size of this buffer will require
@@ -287,7 +327,7 @@ BOOL LLWearable::importFile( LLFILE* file )
}
if( 0 <= type && type < WT_COUNT )
{
- mType = (EWearableType)type;
+ setType((EWearableType)type);
}
else
{
@@ -296,7 +336,6 @@ BOOL LLWearable::importFile( LLFILE* file )
return FALSE;
}
-
// parameters header
S32 num_parameters = 0;
fields_read = fscanf( file, "parameters %d\n", &num_parameters );
@@ -306,6 +345,11 @@ BOOL LLWearable::importFile( LLFILE* file )
return FALSE;
}
+ if( num_parameters != mVisualParamIndexMap.size() )
+ {
+ llwarns << "Wearable parameter mismatch. Reading in " << num_parameters << " from file, but created " << mVisualParamIndexMap.size() << " from avatar parameters. " << llendl;
+ }
+
// parameters
S32 i;
for( i = 0; i < num_parameters; i++ )
@@ -318,7 +362,7 @@ BOOL LLWearable::importFile( LLFILE* file )
llwarns << "Bad Wearable asset: bad parameter, #" << i << llendl;
return FALSE;
}
- mVisualParamMap[param_id] = param_weight;
+ mSavedVisualParamMap[param_id] = param_weight;
}
// textures header
@@ -349,11 +393,25 @@ BOOL LLWearable::importFile( LLFILE* file )
llwarns << "Bad Wearable asset: bad texture uuid: " << text_buffer << llendl;
return FALSE;
}
-
- //TODO: check old values
- mTEMap[te] = LLLocalTextureObject(NULL, NULL, NULL, LLUUID(text_buffer));
+ LLUUID id = LLUUID(text_buffer);
+ LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture( id );
+ if( mTEMap.find(te) != mTEMap.end() )
+ {
+ delete mTEMap[te];
+ }
+ if( mSavedTEMap.find(te) != mSavedTEMap.end() )
+ {
+ delete mSavedTEMap[te];
+ }
+
+ mTEMap[te] = new LLLocalTextureObject(image, LLUUID(text_buffer));
+ mSavedTEMap[te] = new LLLocalTextureObject(image, LLUUID(text_buffer));
+ createLayers(te);
}
+ // copy all saved param values to working params
+ revertValues();
+
return TRUE;
}
@@ -389,13 +447,13 @@ BOOL LLWearable::isOldVersion() const
if( (param->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) )
{
param_count++;
- if( !is_in_map(mVisualParamMap, param->getID() ) )
+ if( !is_in_map(mVisualParamIndexMap, param->getID() ) )
{
return TRUE;
}
}
}
- if( param_count != mVisualParamMap.size() )
+ if( param_count != mVisualParamIndexMap.size() )
{
return TRUE;
}
@@ -442,13 +500,17 @@ BOOL LLWearable::isDirty() const
param;
param = (LLViewerVisualParam*) avatar->getNextVisualParam() )
{
- if( (param->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) )
+ if( (param->getWearableType() == mType)
+ && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE )
+ && !param->getCrossWearable())
{
- F32 weight = get_if_there(mVisualParamMap, param->getID(), param->getDefaultWeight());
- weight = llclamp( weight, param->getMinWeight(), param->getMaxWeight() );
+ F32 current_weight = getVisualParamWeight(param->getID());
+ current_weight = llclamp( current_weight, param->getMinWeight(), param->getMaxWeight() );
+ F32 saved_weight = get_if_there(mSavedVisualParamMap, param->getID(), param->getDefaultWeight());
+ saved_weight = llclamp( saved_weight, param->getMinWeight(), param->getMaxWeight() );
- U8 a = F32_to_U8( param->getWeight(), param->getMinWeight(), param->getMaxWeight() );
- U8 b = F32_to_U8( weight, param->getMinWeight(), param->getMaxWeight() );
+ U8 a = F32_to_U8( saved_weight, param->getMinWeight(), param->getMaxWeight() );
+ U8 b = F32_to_U8( current_weight, param->getMinWeight(), param->getMaxWeight() );
if( a != b )
{
return TRUE;
@@ -460,21 +522,24 @@ BOOL LLWearable::isDirty() const
{
if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType)
{
- LLViewerTexture* avatar_image = avatar->getTEImage( te );
- if( !avatar_image )
- {
- llassert( 0 );
- continue;
- }
-
- te_map_t::const_iterator iter = mTEMap.find(te);
- if(iter != mTEMap.end())
+ te_map_t::const_iterator current_iter = mTEMap.find(te);
+ if(current_iter != mTEMap.end())
{
- const LLUUID& image_id = iter->second.getID();
- if (avatar_image->getID() != image_id)
- {
- return TRUE;
- }
+ const LLUUID& current_image_id = current_iter->second->getID();
+ te_map_t::const_iterator saved_iter = mSavedTEMap.find(te);
+ if(saved_iter != mSavedTEMap.end())
+ {
+ const LLUUID& saved_image_id = saved_iter->second->getID();
+ if (saved_image_id != current_image_id)
+ {
+ return TRUE;
+ }
+ }
+ else
+ {
+ // image found in current image list but not saved image list
+ return FALSE;
+ }
}
}
}
@@ -500,35 +565,47 @@ void LLWearable::setParamsToDefaults()
return;
}
- mVisualParamMap.clear();
for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
{
if( (((LLViewerVisualParam*)param)->getWearableType() == mType ) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) )
{
- mVisualParamMap[param->getID()] = param->getDefaultWeight();
+ setVisualParamWeight(param->getID(),param->getDefaultWeight(), FALSE);
}
}
}
void LLWearable::setTexturesToDefaults()
{
- mTEMap.clear();
for( S32 te = 0; te < TEX_NUM_INDICES; te++ )
{
if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType)
{
- mTEMap[te] = LLLocalTextureObject(NULL, NULL, NULL, LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te));
+ LLUUID id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te);
+ LLViewerFetchedTexture * image = LLViewerTextureManager::getFetchedTexture( id );
+ if( mTEMap.find(te) == mTEMap.end() )
+ {
+ mTEMap[te] = new LLLocalTextureObject(image, id);
+ createLayers(te);
+ }
+ else
+ {
+ // Local Texture Object already created, just set image and UUID
+ LLLocalTextureObject *lto = mTEMap[te];
+ lto->setID(id);
+ lto->setImage(image);
+ }
}
}
}
// Updates the user's avatar's appearance
-void LLWearable::writeToAvatar( BOOL set_by_user )
+void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater )
{
LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
llassert( avatar );
if( !avatar )
{
+ llerrs << "could not get avatar object to write to for wearable " << this->getName() << llendl;
return;
}
@@ -537,10 +614,11 @@ void LLWearable::writeToAvatar( BOOL set_by_user )
// Pull params
for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
{
- if( (((LLViewerVisualParam*)param)->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) )
+ if( (((LLViewerVisualParam*)param)->getWearableType() == mType) )
{
S32 param_id = param->getID();
- F32 weight = get_if_there(mVisualParamMap, param_id, param->getDefaultWeight());
+ F32 weight = getVisualParamWeight(param_id);
+
// only animate with user-originated changes
if (set_by_user)
{
@@ -568,20 +646,20 @@ void LLWearable::writeToAvatar( BOOL set_by_user )
LLUUID image_id;
if(iter != mTEMap.end())
{
- image_id = iter->second.getID();
+ image_id = iter->second->getID();
}
else
{
image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te);
}
LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE );
- avatar->setLocalTextureTE(te, image, set_by_user);
+ // MULTI-WEARABLE: replace hard-coded 0
+ avatar->setLocalTextureTE(te, image, set_by_user, 0);
}
}
- avatar->updateVisualParams();
- if( gFloaterCustomize )
+ if( gFloaterCustomize && update_customize_floater )
{
LLViewerInventoryItem* item;
// MULTI_WEARABLE:
@@ -615,6 +693,7 @@ void LLWearable::writeToAvatar( BOOL set_by_user )
// }
}
+
// Updates the user's avatar's appearance, replacing this wearables' parameters and textures with default values.
// static
void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user )
@@ -645,16 +724,6 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user )
}
}
- // Pull textures
- LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( IMG_DEFAULT_AVATAR );
- for( S32 te = 0; te < TEX_NUM_INDICES; te++ )
- {
- if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == type)
- {
- avatar->setLocalTextureTE(te, image, set_by_user);
- }
- }
-
if( gFloaterCustomize )
{
gFloaterCustomize->setWearable(type, NULL, PERM_ALL, TRUE);
@@ -669,53 +738,11 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user )
// }
}
-
-
-// Updates asset from the user's avatar
-void LLWearable::readFromAvatar()
-{
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- llassert( avatar );
- if( !avatar )
- {
- return;
- }
-
- mDefinitionVersion = LLWearable::sCurrentDefinitionVersion;
-
- mVisualParamMap.clear();
- for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
- {
- if( (((LLViewerVisualParam*)param)->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) )
- {
- mVisualParamMap[param->getID()] = param->getWeight();
- }
- }
-
- mTEMap.clear();
- for( S32 te = 0; te < TEX_NUM_INDICES; te++ )
- {
- if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType)
- {
- LLViewerTexture* image = avatar->getTEImage( te );
- if( image )
- {
- mTEMap[te] = LLLocalTextureObject(NULL, NULL, NULL, image->getID());
- }
- }
- }
-
- //if( gFloaterCustomize )
- //{
- // mDescription = gFloaterCustomize->getWearableDescription( mType );
- //}
-}
-
// Does not copy mAssetID.
// Definition version is current: removes obsolete enties and creates default values for new ones.
void LLWearable::copyDataFrom(const LLWearable* src)
{
- LLVOAvatar* avatar = gAgent.getAvatarObject();
+ LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
llassert( avatar );
if( !avatar )
{
@@ -730,37 +757,55 @@ void LLWearable::copyDataFrom(const LLWearable* src)
mSaleInfo = src->mSaleInfo;
mType = src->mType;
+ mSavedVisualParamMap.clear();
// Deep copy of mVisualParamMap (copies only those params that are current, filling in defaults where needed)
for( LLViewerVisualParam* param = (LLViewerVisualParam*) avatar->getFirstVisualParam();
param;
param = (LLViewerVisualParam*) avatar->getNextVisualParam() )
{
- if( (param->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) )
+ if( (param->getWearableType() == mType) )
{
S32 id = param->getID();
- F32 weight = get_if_there(src->mVisualParamMap, id, param->getDefaultWeight() );
- mVisualParamMap[id] = weight;
+ F32 weight = src->getVisualParamWeight(id);
+ mSavedVisualParamMap[id] = weight;
+
+ // Clones a visual param from src and adds it to this wearable. Value of param is taken from current value of source param, not saved.
+ addVisualParam(param->cloneParam(this));
}
}
+ destroyTextures();
// Deep copy of mTEMap (copies only those tes that are current, filling in defaults where needed)
for( S32 te = 0; te < TEX_NUM_INDICES; te++ )
{
if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType)
{
- te_map_t::const_iterator iter = mTEMap.find(te);
+ te_map_t::const_iterator iter = src->mTEMap.find(te);
LLUUID image_id;
- if(iter != mTEMap.end())
+ LLViewerFetchedTexture *image = NULL;
+ if(iter != src->mTEMap.end())
{
- image_id = iter->second.getID();
+ image = src->getConstLocalTextureObject(te)->getImage();
+ image_id = src->getConstLocalTextureObject(te)->getID();
+ mTEMap[te] = new LLLocalTextureObject(image, image_id);
+ mSavedTEMap[te] = new LLLocalTextureObject(image, image_id);
+ mTEMap[te]->setBakedReady(src->getConstLocalTextureObject(te)->getBakedReady());
+ mTEMap[te]->setDiscard(src->getConstLocalTextureObject(te)->getDiscard());
}
else
{
image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te);
+ image = LLViewerTextureManager::getFetchedTexture( image_id );
+ mTEMap[te] = new LLLocalTextureObject(image, image_id);
+ mSavedTEMap[te] = new LLLocalTextureObject(image, image_id);
}
- mTEMap[te] = LLLocalTextureObject(NULL, NULL, NULL, image_id);
+ createLayers(te);
}
}
+
+ // Probably reduntant, but ensure that the newly created wearable is not dirty by setting current value of params in new wearable
+ // to be the same as the saved values (which were loaded from src at param->cloneParam(this))
+ revertValues();
}
void LLWearable::setItemID(const LLUUID& item_id)
@@ -773,29 +818,263 @@ const LLUUID& LLWearable::getItemID() const
return mItemID;
}
-LLLocalTextureObject* LLWearable::getLocalTextureObject(S32 index) const
+void LLWearable::setType(EWearableType type)
+{
+ mType = type;
+ createVisualParams();
+}
+
+LLLocalTextureObject* LLWearable::getLocalTextureObject(S32 index)
+{
+ te_map_t::iterator iter = mTEMap.find(index);
+ if( iter != mTEMap.end() )
+ {
+ LLLocalTextureObject* lto = iter->second;
+ return lto;
+ }
+ return NULL;
+}
+
+const LLLocalTextureObject* LLWearable::getConstLocalTextureObject(S32 index) const
{
te_map_t::const_iterator iter = mTEMap.find(index);
if( iter != mTEMap.end() )
{
- return (LLLocalTextureObject*) &iter->second;
+ const LLLocalTextureObject* lto = iter->second;
+ return lto;
}
return NULL;
}
void LLWearable::setLocalTextureObject(S32 index, LLLocalTextureObject *lto)
{
+ if( mTEMap.find(index) != mTEMap.end() )
+ {
+ mTEMap.erase(index);
+ }
if( lto )
{
- LLLocalTextureObject obj(*lto);
- mTEMap[index] = obj;
+ mTEMap[index] = new LLLocalTextureObject(*lto);
+ }
+}
+
+
+void LLWearable::addVisualParam(LLVisualParam *param)
+{
+ if( mVisualParamIndexMap[param->getID()] )
+ {
+ delete mVisualParamIndexMap[param->getID()];
+ }
+ mVisualParamIndexMap[param->getID()] = param;
+}
+
+void LLWearable::setVisualParams()
+{
+ LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
+
+ for (VisualParamIndexMap_t::const_iterator iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); iter++)
+ {
+ S32 id = iter->first;
+ LLVisualParam *wearable_param = iter->second;
+ F32 value = wearable_param->getWeight();
+ avatar->setVisualParamWeight(id, value, FALSE);
+ }
+}
+
+
+void LLWearable::setVisualParamWeight(S32 param_index, F32 value, BOOL set_by_user)
+{
+ if( is_in_map(mVisualParamIndexMap, param_index ) )
+ {
+ LLVisualParam *wearable_param = mVisualParamIndexMap[param_index];
+ wearable_param->setWeight(value, set_by_user);
}
else
{
- mTEMap.erase(index);
+ llerrs << "LLWearable::setVisualParam passed invalid parameter index: " << param_index << " for wearable type: " << this->getName() << llendl;
+ }
+}
+
+F32 LLWearable::getVisualParamWeight(S32 param_index) const
+{
+ if( is_in_map(mVisualParamIndexMap, param_index ) )
+ {
+ const LLVisualParam *wearable_param = mVisualParamIndexMap.find(param_index)->second;
+ return wearable_param->getWeight();
+ }
+ else
+ {
+ llwarns << "LLWerable::getVisualParam passed invalid parameter index: " << param_index << " for wearable type: " << this->getName() << llendl;
+ }
+ return (F32)-1.0;
+}
+
+LLVisualParam* LLWearable::getVisualParam(S32 index) const
+{
+ VisualParamIndexMap_t::const_iterator iter = mVisualParamIndexMap.find(index);
+ return (iter == mVisualParamIndexMap.end()) ? NULL : iter->second;
+}
+
+
+void LLWearable::getVisualParams(visualParamCluster_t &list)
+{
+ VisualParamIndexMap_t::iterator iter = mVisualParamIndexMap.begin();
+ VisualParamIndexMap_t::iterator end = mVisualParamIndexMap.end();
+
+ // add all visual params to the passed-in vector
+ for( ; iter != end; ++iter )
+ {
+ list.push_back(iter->second);
+ }
+}
+
+LLColor4 LLWearable::getClothesColor(S32 te)
+{
+ LLColor4 color;
+ U32 param_name[3];
+ if( LLVOAvatar::teToColorParams( (LLVOAvatarDefines::ETextureIndex)te, param_name ) )
+ {
+ for( U8 index = 0; index < 3; index++ )
+ {
+ color.mV[index] = getVisualParamWeight(param_name[index]);
+ }
+ }
+ return color;
+}
+
+void LLWearable::setClothesColor( S32 te, const LLColor4& new_color, BOOL set_by_user )
+{
+ U32 param_name[3];
+ if( LLVOAvatar::teToColorParams( (LLVOAvatarDefines::ETextureIndex)te, param_name ) )
+ {
+ for( U8 index = 0; index < 3; index++ )
+ {
+ setVisualParamWeight(param_name[index], new_color.mV[index], set_by_user);
+ }
+ }
+}
+
+void LLWearable::revertValues()
+{
+ //update saved settings so wearable is no longer dirty
+ for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++)
+ {
+ S32 id = iter->first;
+ F32 value = iter->second;
+ setVisualParamWeight(id, value, TRUE);
+ }
+
+ syncImages(mSavedTEMap, mTEMap);
+
+ if( gFloaterCustomize )
+ {
+ gFloaterCustomize->updateScrollingPanelList(TRUE);
}
}
+BOOL LLWearable::isOnTop()
+{
+ return (this == gAgentWearables.getTopWearable(mType));
+}
+
+void LLWearable::createLayers(S32 te)
+{
+ LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
+ LLTexLayerSet *layer_set = avatar->getLayerSet((ETextureIndex)te);
+ if( layer_set )
+ {
+ layer_set->cloneTemplates(mTEMap[te], (ETextureIndex)te, this);
+ }
+ else
+ {
+ llerrs << "could not find layerset for LTO in wearable!" << llendl;
+ }
+}
+
+void LLWearable::saveValues()
+{
+ //update saved settings so wearable is no longer dirty
+ mSavedVisualParamMap.clear();
+ for (VisualParamIndexMap_t::const_iterator iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); ++iter)
+ {
+ S32 id = iter->first;
+ LLVisualParam *wearable_param = iter->second;
+ F32 value = wearable_param->getWeight();
+ mSavedVisualParamMap[id] = value;
+ }
+
+ // Deep copy of mTEMap (copies only those tes that are current, filling in defaults where needed)
+ syncImages(mTEMap, mSavedTEMap);
+
+ if( gFloaterCustomize )
+ {
+ gFloaterCustomize->updateScrollingPanelList(TRUE);
+ }
+}
+
+void LLWearable::syncImages(te_map_t &src, te_map_t &dst)
+{
+ // Deep copy of src (copies only those tes that are current, filling in defaults where needed)
+ for( S32 te = 0; te < TEX_NUM_INDICES; te++ )
+ {
+ if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType)
+ {
+ te_map_t::const_iterator iter = src.find(te);
+ LLUUID image_id;
+ LLViewerFetchedTexture *image = NULL;
+ LLLocalTextureObject *lto = NULL;
+ if(iter != src.end())
+ {
+ // there's a Local Texture Object in the source image map. Use this to populate the values to store in the destination image map.
+ lto = iter->second;
+ image = lto->getImage();
+ image_id = lto->getID();
+ }
+ else
+ {
+ // there is no Local Texture Object in the source image map. Get defaults values for populating the destination image map.
+ image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te);
+ image = LLViewerTextureManager::getFetchedTexture( image_id );
+ }
+
+ if( dst.find(te) != dst.end() )
+ {
+ // there's already an entry in the destination map for the texture. Just update its values.
+ dst[te]->setImage(image);
+ dst[te]->setID(image_id);
+ }
+ else
+ {
+ // no entry found in the destination map, we need to create a new Local Texture Object
+ dst[te] = new LLLocalTextureObject(image, image_id);
+ }
+
+ if( lto )
+ {
+ // If we pulled values from a Local Texture Object in the source map, make sure the proper flags are set in the new (or updated) entry in the destination map.
+ dst[te]->setBakedReady(lto->getBakedReady());
+ dst[te]->setDiscard(lto->getDiscard());
+ }
+ }
+ }
+}
+
+void LLWearable::destroyTextures()
+{
+ for( te_map_t::iterator iter = mTEMap.begin(); iter != mTEMap.end(); ++iter )
+ {
+ LLLocalTextureObject *lto = iter->second;
+ delete lto;
+ }
+ mTEMap.clear();
+ for( te_map_t::iterator iter = mSavedTEMap.begin(); iter != mSavedTEMap.end(); ++iter )
+ {
+ LLLocalTextureObject *lto = iter->second;
+ delete lto;
+ }
+ mSavedTEMap.clear();
+}
+
struct LLWearableSaveData
{
EWearableType mType;
@@ -882,6 +1161,7 @@ void LLWearable::onSaveNewAssetComplete(const LLUUID& new_asset_id, void* userda
// delete the context data
delete data;
+
}
std::ostream& operator<<(std::ostream &s, const LLWearable &w)
@@ -893,11 +1173,12 @@ std::ostream& operator<<(std::ostream &s, const LLWearable &w)
//w.mSaleInfo
s << " Params:" << "\n";
- for (LLWearable::param_map_t::const_iterator iter = w.mVisualParamMap.begin();
- iter != w.mVisualParamMap.end(); ++iter)
+ for (LLWearable::VisualParamIndexMap_t::const_iterator iter = w.mVisualParamIndexMap.begin();
+ iter != w.mVisualParamIndexMap.end(); ++iter)
{
S32 param_id = iter->first;
- F32 param_weight = iter->second;
+ LLVisualParam *wearable_param = iter->second;
+ F32 param_weight = wearable_param->getWeight();
s << " " << param_id << " " << param_weight << "\n";
}
@@ -906,7 +1187,7 @@ std::ostream& operator<<(std::ostream &s, const LLWearable &w)
iter != w.mTEMap.end(); ++iter)
{
S32 te = iter->first;
- const LLUUID& image_id = iter->second.getID();
+ const LLUUID& image_id = iter->second->getID();
s << " " << te << " " << image_id << "\n";
}
return s;
diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h
index d7b4d3f91e..201f4f91ef 100644
--- a/indra/newview/llwearable.h
+++ b/indra/newview/llwearable.h
@@ -43,6 +43,9 @@
#include "lllocaltextureobject.h"
class LLViewerInventoryItem;
+class LLVisualParam;
+class LLTexGlobalColorInfo;
+class LLTexGlobalColor;
class LLWearable
{
@@ -66,7 +69,7 @@ public:
const LLAssetID& getAssetID() const { return mAssetID; }
const LLTransactionID& getTransactionID() const { return mTransactionID; }
EWearableType getType() const { return mType; }
- void setType(EWearableType type) { mType = type; }
+ void setType(EWearableType type);
const std::string& getName() const { return mName; }
void setName(const std::string& name) { mName = name; }
const std::string& getDescription() const { return mDescription; }
@@ -81,11 +84,12 @@ public:
LLLocalTextureObject* getLocalTextureObject(S32 index) const;
public:
+ typedef std::vector<LLVisualParam*> visualParamCluster_t;
+
BOOL isDirty() const;
BOOL isOldVersion() const;
- void writeToAvatar( BOOL set_by_user );
- void readFromAvatar();
+ void writeToAvatar( BOOL set_by_user, BOOL update_customize_floater = TRUE );
void removeFromAvatar( BOOL set_by_user ) { LLWearable::removeFromAvatar( mType, set_by_user ); }
static void removeFromAvatar( EWearableType type, BOOL set_by_user );
@@ -104,9 +108,36 @@ public:
friend std::ostream& operator<<(std::ostream &s, const LLWearable &w);
void setItemID(const LLUUID& item_id);
+
+ LLLocalTextureObject* getLocalTextureObject(S32 index);
+ const LLLocalTextureObject* getConstLocalTextureObject(S32 index) const;
+
void setLocalTextureObject(S32 index, LLLocalTextureObject *lto);
+ void addVisualParam(LLVisualParam *param);
+ void setVisualParams();
+ void setVisualParamWeight(S32 index, F32 value, BOOL set_by_user);
+ F32 getVisualParamWeight(S32 index) const;
+ LLVisualParam* getVisualParam(S32 index) const;
+ void getVisualParams(visualParamCluster_t &list);
+
+ LLColor4 getClothesColor(S32 te);
+ void setClothesColor( S32 te, const LLColor4& new_color, BOOL set_by_user );
+
+ void revertValues();
+
+ BOOL isOnTop();
+
private:
+ typedef std::map<S32, LLLocalTextureObject*> te_map_t;
+ typedef std::map<S32, LLVisualParam *> VisualParamIndexMap_t;
+
+ void createLayers(S32 te);
+ void createVisualParams();
+ void saveValues();
+ void syncImages(te_map_t &src, te_map_t &dst);
+ void destroyTextures();
+
static S32 sCurrentDefinitionVersion; // Depends on the current state of the avatar_lad.xml.
S32 mDefinitionVersion; // Depends on the state of the avatar_lad.xml when this asset was created.
std::string mName;
@@ -118,9 +149,12 @@ private:
EWearableType mType;
typedef std::map<S32, F32> param_map_t;
- param_map_t mVisualParamMap; // maps visual param id to weight
- typedef std::map<S32, LLLocalTextureObject> te_map_t;
+ param_map_t mSavedVisualParamMap; // last saved version of visual params
+
+ VisualParamIndexMap_t mVisualParamIndexMap;
+
te_map_t mTEMap; // maps TE to LocalTextureObject
+ te_map_t mSavedTEMap; // last saved version of TEMap
LLUUID mItemID; // ID of the inventory item in the agent's inventory
};
diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp
index 1275312676..0257329dc1 100644
--- a/indra/newview/llwearablelist.cpp
+++ b/indra/newview/llwearablelist.cpp
@@ -218,38 +218,19 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID
}
-LLWearable* LLWearableList::createCopyFromAvatar(const LLWearable* old_wearable, const std::string& new_name)
-{
- lldebugs << "LLWearableList::createCopyFromAvatar()" << llendl;
-
- LLWearable *wearable = generateNewWearable();
- wearable->copyDataFrom( old_wearable );
-
- LLPermissions perm(old_wearable->getPermissions());
- perm.setOwnerAndGroup(LLUUID::null, gAgent.getID(), LLUUID::null, true);
- wearable->setPermissions(perm);
- wearable->readFromAvatar(); // update from the avatar
-
- if (!new_name.empty()) wearable->setName(new_name);
-
- // Send to the dataserver
- wearable->saveNewAsset();
-
- return wearable;
-}
-
-
-LLWearable* LLWearableList::createCopy(const LLWearable* old_wearable)
+LLWearable* LLWearableList::createCopy(const LLWearable* old_wearable, const std::string& new_name)
{
lldebugs << "LLWearableList::createCopy()" << llendl;
LLWearable *wearable = generateNewWearable();
wearable->copyDataFrom(old_wearable);
-
+
LLPermissions perm(old_wearable->getPermissions());
perm.setOwnerAndGroup(LLUUID::null, gAgent.getID(), LLUUID::null, true);
wearable->setPermissions(perm);
+ if (!new_name.empty()) wearable->setName(new_name);
+
// Send to the dataserver
wearable->saveNewAsset();
@@ -273,7 +254,6 @@ LLWearable* LLWearableList::createNewWearable( EWearableType type )
wearable->setPermissions(perm);
// Description and sale info have default values.
-
wearable->setParamsToDefaults();
wearable->setTexturesToDefaults();
diff --git a/indra/newview/llwearablelist.h b/indra/newview/llwearablelist.h
index f844c0f443..e5155c66a4 100644
--- a/indra/newview/llwearablelist.h
+++ b/indra/newview/llwearablelist.h
@@ -53,8 +53,7 @@ public:
void(*asset_arrived_callback)(LLWearable*, void* userdata),
void* userdata);
- LLWearable* createCopyFromAvatar(const LLWearable* old_wearable, const std::string& new_name = std::string());
- LLWearable* createCopy(const LLWearable* old_wearable);
+ LLWearable* createCopy(const LLWearable* old_wearable, const std::string& new_name = std::string());
LLWearable* createNewWearable(EWearableType type);
// Callback
diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml
index 3b6d5452e3..ba71754da8 100644
--- a/indra/newview/skins/default/xui/en/floater_customize.xml
+++ b/indra/newview/skins/default/xui/en/floater_customize.xml
@@ -1156,21 +1156,6 @@ scratch and wear it.
width="373">
Located in [PATH]
</text>
- <spinner
- decimal_digits="0"
- follows="left|top|right"
- height="16"
- increment="1"
- initial_value="0"
- label="Item"
- label_width="30"
- layout="topleft"
- left_delta="2"
- max_val="5"
- name="index"
- text_enabled_color="110, 15, 15, 255"
- top_pad="6"
- width="87" />
<text
type="string"
length="1"
@@ -1377,21 +1362,6 @@ scratch and wear it.
width="373">
Located in [PATH]
</text>
- <spinner
- decimal_digits="0"
- follows="left|top|right"
- height="16"
- increment="1"
- initial_value="0"
- label="Item"
- label_width="30"
- layout="topleft"
- left_delta="2"
- max_val="5"
- name="index"
- text_enabled_color="110, 15, 15, 255"
- top_pad="6"
- width="87" />
<text
type="string"
length="1"
@@ -1524,21 +1494,6 @@ scratch and wear it.
width="373">
Located in [PATH]
</text>
- <spinner
- decimal_digits="0"
- follows="left|top|right"
- height="16"
- increment="1"
- initial_value="0"
- label="Item"
- label_width="30"
- layout="topleft"
- left_delta="2"
- max_val="5"
- name="index"
- text_enabled_color="110, 15, 15, 255"
- top_pad="6"
- width="87" />
<text
type="string"
length="1"
@@ -1745,21 +1700,6 @@ scratch and wear it.
width="373">
Located in [PATH]
</text>
- <spinner
- decimal_digits="0"
- follows="left|top|right"
- height="16"
- increment="1"
- initial_value="0"
- label="Item"
- label_width="30"
- layout="topleft"
- left_delta="2"
- max_val="5"
- name="index"
- text_enabled_color="110, 15, 15, 255"
- top_pad="6"
- width="87" />
<text
type="string"
length="1"
@@ -1966,21 +1906,6 @@ scratch and wear it.
width="373">
Located in [PATH]
</text>
- <spinner
- decimal_digits="0"
- follows="left|top|right"
- height="16"
- increment="1"
- initial_value="0"
- label="Item"
- label_width="30"
- layout="topleft"
- left_delta="2"
- max_val="5"
- name="index"
- text_enabled_color="110, 15, 15, 255"
- top_pad="6"
- width="87" />
<text
type="string"
length="1"
@@ -2199,21 +2124,6 @@ scratch and wear it.
width="373">
Located in [PATH]
</text>
- <spinner
- decimal_digits="0"
- follows="left|top|right"
- height="16"
- increment="1"
- initial_value="0"
- label="Item"
- label_width="30"
- layout="topleft"
- left_delta="2"
- max_val="5"
- name="index"
- text_enabled_color="110, 15, 15, 255"
- top_pad="6"
- width="87" />
<text
type="string"
length="1"
@@ -2420,21 +2330,6 @@ scratch and wear it.
width="373">
Located in [PATH]
</text>
- <spinner
- decimal_digits="0"
- follows="left|top|right"
- height="16"
- increment="1"
- initial_value="0"
- label="Item"
- label_width="30"
- layout="topleft"
- left_delta="2"
- max_val="5"
- name="index"
- text_enabled_color="110, 15, 15, 255"
- top_pad="6"
- width="87" />
<text
type="string"
length="1"
@@ -2641,21 +2536,6 @@ scratch and wear it.
width="373">
Located in [PATH]
</text>
- <spinner
- decimal_digits="0"
- follows="left|top|right"
- height="16"
- increment="1"
- initial_value="0"
- label="Item"
- label_width="30"
- layout="topleft"
- left_delta="2"
- max_val="5"
- name="index"
- text_enabled_color="110, 15, 15, 255"
- top_pad="6"
- width="87" />
<text
type="string"
length="1"
@@ -2862,21 +2742,6 @@ scratch and wear it.
width="373">
Located in [PATH]
</text>
- <spinner
- decimal_digits="0"
- follows="left|top|right"
- height="16"
- increment="1"
- initial_value="0"
- label="Item"
- label_width="30"
- layout="topleft"
- left_delta="2"
- max_val="5"
- name="index"
- text_enabled_color="110, 15, 15, 255"
- top_pad="6"
- width="87" />
<text
type="string"
length="1"
@@ -3083,21 +2948,6 @@ scratch and wear it.
width="373">
Located in [PATH]
</text>
- <spinner
- decimal_digits="0"
- follows="left|top|right"
- height="16"
- increment="1"
- initial_value="0"
- label="Item"
- label_width="30"
- layout="topleft"
- left_delta="2"
- max_val="5"
- name="index"
- text_enabled_color="110, 15, 15, 255"
- top_pad="6"
- width="87" />
<text
type="string"
length="1"
@@ -3385,21 +3235,6 @@ scratch and wear it.
width="373">
Located in [PATH]
</text>
- <spinner
- decimal_digits="0"
- follows="left|top|right"
- height="16"
- increment="1"
- initial_value="0"
- label="Item"
- label_width="30"
- layout="topleft"
- left_delta="2"
- max_val="5"
- name="index"
- text_enabled_color="110, 15, 15, 255"
- top_pad="6"
- width="87" />
<text
type="string"
length="1"
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index 72cbd3bcd5..04c7186b5f 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -610,6 +610,14 @@
function="Inventory.DoToSelected"
parameter="wear" />
</menu_item_call>
+ <menu_item_call
+ label="Add"
+ layout="topleft"
+ name="Wearable Add">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="wear_add" />
+ </menu_item_call>
<menu_item_call
label="Take Off"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_alpha.xml b/indra/newview/skins/default/xui/en/panel_edit_alpha.xml
new file mode 100644
index 0000000000..40647e1b81
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_alpha.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+ <panel
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="10"
+ name="edit_alpha_panel"
+ top_pad="10"
+ width="313" >
+ <panel
+ border="true"
+ follows="left|top|right"
+ height="180"
+ left="10"
+ layout="topleft"
+ name="avatar_alpha_color_panel"
+ top="0"
+ width="293" >
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Lower Alpha"
+ layout="topleft"
+ left="10"
+ name="Lower Alpha"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="64" />
+ <check_box
+ control_name="LowerAlphaTextureInvisible"
+ follows="left"
+ height="16"
+ layout="topleft"
+ left_pad="6"
+ name="lower alpha texture invisible"
+ top_delta="4"
+ width="16" />
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Upper Alpha"
+ layout="topleft"
+ left_pad="10"
+ name="Upper Alpha"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="64" />
+ <check_box
+ control_name="UpperAlphaTextureInvisible"
+ follows="left"
+ height="16"
+ layout="topleft"
+ left_pad="6"
+ name="upper alpha texture invisible"
+ top_delta="4"
+ width="16" />
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Head Alpha"
+ layout="topleft"
+ left_pad="10"
+ name="Head Alpha"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="64" />
+ <check_box
+ control_name="HeadAlphaTextureInvisible"
+ follows="left"
+ height="16"
+ layout="topleft"
+ left_pad="6"
+ name="head alpha texture invisible"
+ top_delta="4"
+ width="16" />
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Eye Alpha"
+ layout="topleft"
+ left="10"
+ name="Eye Alpha"
+ tool_tip="Click to choose a picture"
+ top="100"
+ width="64" />
+ <check_box
+ control_name="Eye AlphaTextureInvisible"
+ follows="left"
+ height="16"
+ layout="topleft"
+ left_pad="6"
+ name="eye alpha texture invisible"
+ top_delta="4"
+ width="16" />
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Hair Alpha"
+ layout="topleft"
+ left_pad="10"
+ name="Hair Alpha"
+ tool_tip="Click to choose a picture"
+ top_delta="-4"
+ width="64" />
+ <check_box
+ control_name="HairAlphaTextureInvisible"
+ follows="left"
+ height="16"
+ layout="topleft"
+ left_pad="6"
+ name="hair alpha texture invisible"
+ top_delta="4"
+ width="16" />
+ </panel>
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_edit_eyes.xml b/indra/newview/skins/default/xui/en/panel_edit_eyes.xml
new file mode 100644
index 0000000000..9789da5796
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_eyes.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+ <panel
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="10"
+ name="edit_eyes_panel"
+ top_pad="10"
+ width="313" >
+ <panel
+ border="true"
+ follows="left|top|right"
+ height="100"
+ left="10"
+ layout="topleft"
+ name="avatar_eye_color_panel"
+ top="0"
+ width="293" >
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Iris"
+ layout="topleft"
+ left="8"
+ name="Iris"
+ tool_tip="Click to choose a picture"
+ top_pad="10"
+ width="64" />
+ </panel>
+ <accordion
+ follows="left|top|right|bottom"
+ height ="340"
+ left="10"
+ name="wearable_accordion"
+ top_pad="10"
+ width="303">
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="eyes_main_tab"
+ title="Eyes">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="eyes_main_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ </accordion>
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_edit_gloves.xml b/indra/newview/skins/default/xui/en/panel_edit_gloves.xml
new file mode 100644
index 0000000000..e88c82d406
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_gloves.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+ <panel
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="10"
+ name="edit_gloves_panel"
+ top_pad="10"
+ width="313" >
+ <panel
+ border="true"
+ follows="left|top|right"
+ height="100"
+ left="10"
+ layout="topleft"
+ name="avatar_gloves_color_panel"
+ top="0"
+ width="293" >
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Fabric"
+ layout="topleft"
+ left="10"
+ name="Fabric"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="64" />
+ <color_swatch
+ border_color="0.45098 0.517647 0.607843 1"
+ can_apply_immediately="true"
+ follows="left|top"
+ height="80"
+ label="Color/Tint"
+ layout="topleft"
+ left_pad="10"
+ name="Color/Tint"
+ tool_tip="Click to open Color Picker"
+ top="10"
+ width="64" />
+ </panel>
+ <accordion
+ follows="left|top|right|bottom"
+ height ="340"
+ left="10"
+ name="wearable_accordion"
+ top_pad="10"
+ width="303">
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="gloves_main_tab"
+ title="Gloves">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="gloves_main_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ </accordion>
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_edit_hair.xml b/indra/newview/skins/default/xui/en/panel_edit_hair.xml
new file mode 100644
index 0000000000..d2ee2ebf2a
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_hair.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+ <panel
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="10"
+ name="edit_hair_panel"
+ top_pad="10"
+ width="313" >
+ <panel
+ border="true"
+ follows="left|top|right"
+ height="100"
+ left="10"
+ layout="topleft"
+ name="avatar_hair_color_panel"
+ top="0"
+ width="293" >
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Texture"
+ layout="topleft"
+ left="8"
+ name="Texture"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="64" />
+ </panel>
+ <accordion
+ follows="left|top|right|bottom"
+ height ="340"
+ left="10"
+ name="wearable_accordion"
+ top_pad="10"
+ width="303">
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="hair_color_tab"
+ title="Color">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="hair_color_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="hair_style_tab"
+ title="Style">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="hair_style_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="hair_eyebrows_tab"
+ title="Eyebrows">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="hair_eyebrows_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="hair_facial_tab"
+ title="Facial">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="hair_facial_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ </accordion>
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml
new file mode 100644
index 0000000000..70dab20351
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+ <panel
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="10"
+ name="edit_jacket_panel"
+ top_pad="10"
+ width="313" >
+ <panel
+ border="true"
+ follows="left|top|right"
+ height="100"
+ left="10"
+ layout="topleft"
+ name="avatar_jacket_color_panel"
+ top="0"
+ width="293" >
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Upper Fabric"
+ layout="topleft"
+ left="10"
+ name="Upper Fabric"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="64" />
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Lower Fabric"
+ layout="topleft"
+ left_pad="10"
+ name="Lower Fabric"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="64" />
+ <color_swatch
+ border_color="0.45098 0.517647 0.607843 1"
+ can_apply_immediately="true"
+ follows="left|top"
+ height="80"
+ label="Color/Tint"
+ layout="topleft"
+ left_pad="10"
+ name="Color/Tint"
+ tool_tip="Click to open Color Picker"
+ top="10"
+ width="64" />
+ </panel>
+ <accordion
+ follows="left|top|right|bottom"
+ height ="340"
+ left="10"
+ name="wearable_accordion"
+ top_pad="10"
+ width="303">
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="jacket_main_tab"
+ title="Jacket">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="jacket_main_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ </accordion>
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_edit_pants.xml b/indra/newview/skins/default/xui/en/panel_edit_pants.xml
new file mode 100644
index 0000000000..0748757c70
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_pants.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+ <panel
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="10"
+ name="edit_pants_panel"
+ top_pad="10"
+ width="313" >
+ <panel
+ border="true"
+ follows="left|top|right"
+ height="100"
+ left="10"
+ layout="topleft"
+ name="avatar_pants_color_panel"
+ top="0"
+ width="293" >
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Fabric"
+ layout="topleft"
+ left="10"
+ name="Fabric"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="64" />
+ <color_swatch
+ border_color="0.45098 0.517647 0.607843 1"
+ can_apply_immediately="true"
+ follows="left|top"
+ height="80"
+ label="Color/Tint"
+ layout="topleft"
+ left_pad="10"
+ name="Color/Tint"
+ tool_tip="Click to open Color Picker"
+ top="10"
+ width="64" />
+ </panel>
+ <accordion
+ follows="left|top|right|bottom"
+ height ="340"
+ left="10"
+ name="wearable_accordion"
+ top_pad="10"
+ width="303">
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="pants_main_tab"
+ title="Pants">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="pants_main_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ </accordion>
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_edit_shape.xml b/indra/newview/skins/default/xui/en/panel_edit_shape.xml
new file mode 100644
index 0000000000..a9dfcb82d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_shape.xml
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+ <panel
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="10"
+ name="edit_shape_panel"
+ top_pad="10"
+ width="313" >
+ <panel
+ border="true"
+ follows="top|left"
+ height="50"
+ left="10"
+ layout="topleft"
+ name="avatar_sex_panel"
+ top="10"
+ width="293" >
+ <text
+ follows="top|left"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="gender_text"
+ width="303">
+ Gender:
+ </text>
+ <radio_group
+ follows="all"
+ left="10"
+ height="34"
+ layout="topleft"
+ name="sex_radio"
+ top_pad="3"
+ width="200" >
+ <radio_item
+ follows="all"
+ height="16"
+ label="Female"
+ layout="topleft"
+ left="10"
+ name="radio"
+ width="82" />
+ <radio_item
+ follows="all"
+ height="16"
+ label="Male"
+ layout="topleft"
+ left_pad="10"
+ name="radio2"
+ width="82" />
+ </radio_group>
+ </panel>
+ <accordion
+ follows="left|top|right|bottom"
+ height ="330"
+ left="10"
+ name="wearable_accordion"
+ top_pad="10"
+ width="303">
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="shape_body_tab"
+ title="Body">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="shape_body_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="shape_head_tab"
+ title="Head">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="shape_head_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="shape_eyes_tab"
+ title="Eyes">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="shape_eyes_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="shape_ears_tab"
+ title="Ears">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="shape_ears_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="shape_nose_tab"
+ title="Nose">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="shape_nose_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="shape_mouth_tab"
+ title="Mouth">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="shape_mouth_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="shape_chin_tab"
+ title="Chin">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="shape_chin_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="shape_torso_tab"
+ title="Torso">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="shape_torso_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="shape_legs_tab"
+ title="Legs">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="shape_legs_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ </accordion>
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_edit_shirt.xml b/indra/newview/skins/default/xui/en/panel_edit_shirt.xml
new file mode 100644
index 0000000000..140b5c5f94
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_shirt.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+ <panel
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="10"
+ name="edit_shirt_panel"
+ top_pad="10"
+ width="313" >
+ <panel
+ border="true"
+ follows="left|top|right"
+ height="100"
+ left="10"
+ layout="topleft"
+ name="avatar_shirt_color_panel"
+ top="0"
+ width="293" >
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Fabric"
+ layout="topleft"
+ left="10"
+ name="Fabric"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="64" />
+ <color_swatch
+ border_color="0.45098 0.517647 0.607843 1"
+ can_apply_immediately="true"
+ follows="left|top"
+ height="80"
+ label="Color/Tint"
+ layout="topleft"
+ left_pad="10"
+ name="Color/Tint"
+ tool_tip="Click to open Color Picker"
+ top="10"
+ width="64" />
+ </panel>
+ <accordion
+ follows="left|top|right|bottom"
+ height ="340"
+ left="10"
+ name="wearable_accordion"
+ top_pad="10"
+ width="303">
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="shirt_main_tab"
+ title="Shirt">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="shirt_main_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ </accordion>
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_edit_shoes.xml b/indra/newview/skins/default/xui/en/panel_edit_shoes.xml
new file mode 100644
index 0000000000..01f2c428f1
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_shoes.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+ <panel
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="10"
+ name="edit_shoes_panel"
+ top_pad="10"
+ width="313" >
+ <panel
+ border="true"
+ follows="left|top|right"
+ height="100"
+ left="10"
+ layout="topleft"
+ name="avatar_shoes_color_panel"
+ top="0"
+ width="293" >
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Fabric"
+ layout="topleft"
+ left="10"
+ name="Fabric"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="64" />
+ <color_swatch
+ border_color="0.45098 0.517647 0.607843 1"
+ can_apply_immediately="true"
+ follows="left|top"
+ height="80"
+ label="Color/Tint"
+ layout="topleft"
+ left_pad="10"
+ name="Color/Tint"
+ tool_tip="Click to open Color Picker"
+ top="10"
+ width="64" />
+ </panel>
+ <accordion
+ follows="left|top|right|bottom"
+ height ="340"
+ left="10"
+ name="wearable_accordion"
+ top_pad="10"
+ width="303">
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="shoes_main_tab"
+ title="Shoes">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="shoes_main_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ </accordion>
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_edit_skin.xml b/indra/newview/skins/default/xui/en/panel_edit_skin.xml
new file mode 100644
index 0000000000..1a00277f43
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_skin.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+ <panel
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="10"
+ name="edit_skin_panel"
+ top_pad="10"
+ width="313" >
+ <panel
+ border="true"
+ follows="left|top|right"
+ height="100"
+ left="10"
+ layout="topleft"
+ name="avatar_skin_color_panel"
+ top="0"
+ width="293" >
+ <texture_picker
+ allow_no_texture="true"
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Head Tattoos"
+ layout="topleft"
+ left="10"
+ name="Head Tattoos"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="74" />
+ <texture_picker
+ allow_no_texture="true"
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Upper Tattoos"
+ layout="topleft"
+ left_pad="10"
+ name="Upper Tattoos"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="74" />
+ <texture_picker
+ allow_no_texture="true"
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Lower Tattoos"
+ layout="topleft"
+ left_pad="10"
+ name="Lower Tattoos"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="74" />
+ </panel>
+ <accordion
+ follows="left|top|right|bottom"
+ height ="340"
+ left="10"
+ name="wearable_accordion"
+ top_pad="10"
+ width="303">
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="skin_color_tab"
+ title="Skin Color">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="skin_color_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="skin_face_tab"
+ title="Face Detail">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="skin_face_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="skin_makeup_tab"
+ title="Makeup">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="skin_makeup_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="skin_body_tab"
+ title="Body Detail">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="skin_body_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ </accordion>
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_edit_skirt.xml b/indra/newview/skins/default/xui/en/panel_edit_skirt.xml
new file mode 100644
index 0000000000..c04276525a
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_skirt.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+ <panel
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="10"
+ name="edit_skirt_panel"
+ top_pad="10"
+ width="313" >
+ <panel
+ border="true"
+ follows="left|top|right"
+ height="100"
+ left="10"
+ layout="topleft"
+ name="avatar_skirt_color_panel"
+ top="0"
+ width="293" >
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Fabric"
+ layout="topleft"
+ left="10"
+ name="Fabric"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="64" />
+ <color_swatch
+ border_color="0.45098 0.517647 0.607843 1"
+ can_apply_immediately="true"
+ follows="left|top"
+ height="80"
+ label="Color/Tint"
+ layout="topleft"
+ left_pad="10"
+ name="Color/Tint"
+ tool_tip="Click to open Color Picker"
+ top="10"
+ width="64" />
+ </panel>
+ <accordion
+ follows="left|top|right|bottom"
+ height ="340"
+ left="10"
+ name="wearable_accordion"
+ top_pad="10"
+ width="303">
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="skirt_main_tab"
+ title="Skirt">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="skirt_main_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ </accordion>
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_edit_socks.xml b/indra/newview/skins/default/xui/en/panel_edit_socks.xml
new file mode 100644
index 0000000000..7c95ac637d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_socks.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+ <panel
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="10"
+ name="edit_socks_panel"
+ top_pad="10"
+ width="313" >
+ <panel
+ border="true"
+ follows="left|top|right"
+ height="100"
+ left="10"
+ layout="topleft"
+ name="avatar_socks_color_panel"
+ top="0"
+ width="293" >
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Fabric"
+ layout="topleft"
+ left="10"
+ name="Fabric"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="64" />
+ <color_swatch
+ border_color="0.45098 0.517647 0.607843 1"
+ can_apply_immediately="true"
+ follows="left|top"
+ height="80"
+ label="Color/Tint"
+ layout="topleft"
+ left_pad="10"
+ name="Color/Tint"
+ tool_tip="Click to open Color Picker"
+ top="10"
+ width="64" />
+ </panel>
+ <accordion
+ follows="left|top|right|bottom"
+ height ="340"
+ left="10"
+ name="wearable_accordion"
+ top_pad="10"
+ width="303">
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="socks_main_tab"
+ title="Socks">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="socks_main_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ </accordion>
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml
new file mode 100644
index 0000000000..b214cd3de0
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+ <panel
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="10"
+ name="edit_tattoo_panel"
+ top_pad="10"
+ width="313" >
+ <panel
+ border="true"
+ follows="left|top|right"
+ height="100"
+ left="10"
+ layout="topleft"
+ name="avatar_tattoo_color_panel"
+ top="0"
+ width="293" >
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Head Tattoo"
+ layout="topleft"
+ left="10"
+ name="Head Tattoo"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="64" />
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Upper Tattoo"
+ layout="topleft"
+ left_pad="10"
+ name="Upper Tattoo"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="64" />
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Lower Tattoo"
+ layout="topleft"
+ left_pad="10"
+ name="Lower Tattoo"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="64" />
+ </panel>
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_edit_underpants.xml b/indra/newview/skins/default/xui/en/panel_edit_underpants.xml
new file mode 100644
index 0000000000..5fe1c2caef
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_underpants.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+ <panel
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="10"
+ name="edit_underpants_panel"
+ top_pad="10"
+ width="313" >
+ <panel
+ border="true"
+ follows="left|top|right"
+ height="100"
+ left="10"
+ layout="topleft"
+ name="avatar_underpants_color_panel"
+ top="0"
+ width="293" >
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Fabric"
+ layout="topleft"
+ left="10"
+ name="Fabric"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="64" />
+ <color_swatch
+ border_color="0.45098 0.517647 0.607843 1"
+ can_apply_immediately="true"
+ follows="left|top"
+ height="80"
+ label="Color/Tint"
+ layout="topleft"
+ left_pad="10"
+ name="Color/Tint"
+ tool_tip="Click to open Color Picker"
+ top="10"
+ width="64" />
+ </panel>
+ <accordion
+ follows="left|top|right|bottom"
+ height ="340"
+ left="10"
+ name="wearable_accordion"
+ top_pad="10"
+ width="303">
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="underpants_main_tab"
+ title="Underpants">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="underpants_main_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ </accordion>
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml
new file mode 100644
index 0000000000..097cb14ee6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+ <panel
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="10"
+ name="edit_undershirt_panel"
+ top_pad="10"
+ width="313" >
+ <panel
+ border="true"
+ follows="left|top|right"
+ height="100"
+ left="10"
+ layout="topleft"
+ name="avatar_undershirt_color_panel"
+ top="0"
+ width="293" >
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="80"
+ label="Fabric"
+ layout="topleft"
+ left="10"
+ name="Fabric"
+ tool_tip="Click to choose a picture"
+ top="10"
+ width="64" />
+ <color_swatch
+ border_color="0.45098 0.517647 0.607843 1"
+ can_apply_immediately="true"
+ follows="left|top"
+ height="80"
+ label="Color/Tint"
+ layout="topleft"
+ left_pad="10"
+ name="Color/Tint"
+ tool_tip="Click to open Color Picker"
+ top="10"
+ width="64" />
+ </panel>
+ <accordion
+ follows="left|top|right|bottom"
+ height ="340"
+ left="10"
+ name="wearable_accordion"
+ top_pad="10"
+ width="303">
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ min_height="150"
+ name="undershirt_main_tab"
+ title="Undershirt">
+ <scrolling_panel_list
+ draw_heading="false"
+ follows="all"
+ left="0"
+ name="undershirt_main_param_list"
+ top="0"
+ width="303" />
+ </accordion_tab>
+ </accordion>
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
new file mode 100644
index 0000000000..77b887de9b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
@@ -0,0 +1,365 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ bevel_style="in"
+ follows="all"
+ height="570"
+ label="Wearable"
+ layout="topleft"
+left="0"
+ name="panel_edit_wearable"
+ top="0"
+ width="333">
+ <string
+ name="edit_shape_title">
+ Editing Shape
+ </string>
+ <string
+ name="edit_skin_title">
+ Editing Skin
+ </string>
+ <string
+ name="edit_hair_title">
+ Editing Hair
+ </string>
+ <string
+ name="edit_eyes_title">
+ Editing Eyes
+ </string>
+ <string
+ name="edit_shirt_title">
+ Editing Shirt
+ </string>
+ <string
+ name="edit_pants_title">
+ Editing Pants
+ </string>
+ <string
+ name="edit_shoes_title">
+ Editing Shoes
+ </string>
+ <string
+ name="edit_socks_title">
+ Editing Socks
+ </string>
+ <string
+ name="edit_jacket_title">
+ Editing Jacket
+ </string>
+ <string
+ name="edit_skirt_title">
+ Editing Skirt
+ </string>
+ <string
+ name="edit_gloves_title">
+ Editing Gloves
+ </string>
+ <string
+ name="edit_undershirt_title">
+ Editing Undershirt
+ </string>
+ <string
+ name="edit_underpants_title">
+ Editing Underpants
+ </string>
+ <string
+ name="edit_alpha_title">
+ Editing Alpha Mask
+ </string>
+ <string
+ name="edit_tattoo_title">
+ Editing Tattoo
+ </string>
+ <string
+ name="shape_desc_text">
+ Shape:
+ </string>
+ <string
+ name="skin_desc_text">
+ Skin:
+ </string>
+ <string
+ name="hair_desc_text">
+ Hair:
+ </string>
+ <string
+ name="eyes_desc_text">
+ Eyes:
+ </string>
+ <string
+ name="shirt_desc_text">
+ Shirt:
+ </string>
+ <string
+ name="pants_desc_text">
+ Pants:
+ </string>
+ <string
+ name="shoes_desc_text">
+ Shoes:
+ </string>
+ <string
+ name="socks_desc_text">
+ Socks:
+ </string>
+ <string
+ name="jacket_desc_text">
+ Jacket:
+ </string>
+ <string
+ name="skirt_skirt_desc_text">
+ Skirt:
+ </string>
+ <string
+ name="gloves_desc_text">
+ Gloves:
+ </string>
+ <string
+ name="undershirt_desc_text">
+ Undershirt:
+ </string>
+ <string
+ name="underpants_desc_text">
+ Underpants:
+ </string>
+ <string
+ name="alpha_desc_text">
+ Alpha Mask:
+ </string>
+ <string
+ name="tattoo_desc_text">
+ Tattoo:
+ </string>
+ <button
+ follows="top|left"
+ height="25"
+ width="25"
+ image_overlay="BackArrow_Off"
+ layout="topleft"
+ name="back_btn"
+ picture_style="true"
+ left="10"
+ top="7" />
+ <text
+ follows="top|left"
+ font="SansSerifHugeBold"
+ height="22"
+ layout="topleft"
+ left_pad="15"
+ name="edit_wearable_title"
+ text_color="white"
+ value="Editing Shape"
+ width="270" />
+ <panel
+ border="true"
+ follows="top|left"
+ height="60"
+ label="Shirt"
+ layout="topleft"
+ left="10"
+ name="wearable_type_panel"
+ top_pad="10"
+ width="313">
+ <text
+ follows="top|left"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="description_text"
+ value="Shape:"
+ width="303" />
+ <text_editor
+ follows="all"
+ height="23"
+ left="10"
+ layout="topleft"
+ max_length="300"
+ name="description"
+ width="290" />
+ </panel>
+ <panel
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="0"
+ name="edit_subpanel_container"
+ top_pad="10"
+ width="333">
+ <panel
+ filename="panel_edit_shape.xml"
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="0"
+ name="edit_shape_panel"
+ top="0"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_skin.xml"
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="0"
+ name="edit_skin_panel"
+ top="0"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_hair.xml"
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="0"
+ name="edit_hair_panel"
+ top="0"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_eyes.xml"
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="0"
+ name="edit_eyes_panel"
+ top="0"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_shirt.xml"
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="0"
+ name="edit_shirt_panel"
+ top="0"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_pants.xml"
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="0"
+ name="edit_pants_panel"
+ top="0"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_shoes.xml"
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="0"
+ name="edit_shoes_panel"
+ top="0"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_socks.xml"
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="0"
+ name="edit_socks_panel"
+ top="0"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_jacket.xml"
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="0"
+ name="edit_jacket_panel"
+ top="0"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_skirt.xml"
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="0"
+ name="edit_skirt_panel"
+ top="0"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_gloves.xml"
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="0"
+ name="edit_gloves_panel"
+ top="0"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_undershirt.xml"
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="0"
+ name="edit_undershirt_panel"
+ top="0"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_underpants.xml"
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="0"
+ name="edit_underpants_panel"
+ top="0"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_alpha.xml"
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="0"
+ name="edit_alpha_panel"
+ top="0"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_tattoo.xml"
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="0"
+ name="edit_tattoo_panel"
+ top="0"
+ visible="false"
+ width="333" />
+ </panel>
+ <panel
+ follows="all"
+ height="25"
+ layout="bottom|left|right"
+ left="0"
+ name="button_panel"
+ top_pad="10"
+ width="333" >
+ <button
+ follows="bottomleft"
+ layout="topleft"
+ height="23"
+ label="Save As"
+ left="10"
+ name="save_as_button"
+ top="0"
+ width="100" />
+ <button
+ follows="bottomleft"
+ layout="topleft"
+ height="23"
+ label="Revert"
+ left_pad="10"
+ name="revert_button"
+ width="100" />
+ </panel>
+</panel>