diff options
Diffstat (limited to 'indra')
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 <o) : 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 <o); ~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 ¶m_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 ¶m_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 ¶m_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 ¶m_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*)¶m_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 ¶m_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 ¶m_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 ¤t_volume_num, S32 ¤t_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> |