summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authorBrad Payne (Vir Linden) <vir@lindenlab.com>2016-05-21 08:15:28 -0400
committerBrad Payne (Vir Linden) <vir@lindenlab.com>2016-05-21 08:15:28 -0400
commitf47ceb47bbcfd3466813d1653992e1ea418964b5 (patch)
treef3b1c26e835c8ddf40587783095a8b8954717d7b /indra/newview
parentc2ef3b4c7186dbbd95b16520f281b7d58364fb52 (diff)
parenta46fdc10c76ebbf76b4976f0cbb36b649fe4fdd2 (diff)
merged jelly-doll viewer-release into bento
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/CMakeLists.txt2
-rw-r--r--indra/newview/VIEWER_VERSION.txt2
-rw-r--r--indra/newview/app_settings/anim.ini85
-rw-r--r--indra/newview/app_settings/settings.xml33
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl13
-rw-r--r--indra/newview/character/avatar_lad.xml4839
-rw-r--r--indra/newview/character/avatar_skeleton.xml310
-rw-r--r--indra/newview/llagent.cpp6
-rw-r--r--indra/newview/llagentcamera.cpp3
-rw-r--r--indra/newview/llappviewer.cpp4
-rw-r--r--indra/newview/lldrawpoolavatar.cpp122
-rw-r--r--indra/newview/llfloaterbvhpreview.cpp20
-rw-r--r--indra/newview/llfloaterbvhpreview.h4
-rw-r--r--indra/newview/llfloatermodelpreview.cpp154
-rw-r--r--indra/newview/llfloatermodelpreview.h8
-rw-r--r--indra/newview/llfloaterpreference.cpp17
-rw-r--r--indra/newview/llfloaterpreference.h2
-rw-r--r--indra/newview/llpreviewanim.cpp1
-rw-r--r--indra/newview/llskinningutil.cpp364
-rw-r--r--indra/newview/llskinningutil.h50
-rw-r--r--indra/newview/llspatialpartition.cpp11
-rw-r--r--indra/newview/llstartup.cpp5
-rw-r--r--indra/newview/lltoolbarview.cpp6
-rw-r--r--indra/newview/llviewercontrol.cpp16
-rw-r--r--indra/newview/llviewerjoint.cpp7
-rw-r--r--indra/newview/llviewerjoint.h3
-rw-r--r--indra/newview/llviewerjointattachment.cpp1
-rw-r--r--indra/newview/llviewerjointmesh.cpp2
-rw-r--r--indra/newview/llviewermenu.cpp17
-rw-r--r--indra/newview/llviewermenu.h4
-rw-r--r--indra/newview/llviewershadermgr.cpp8
-rw-r--r--indra/newview/llviewerwearable.cpp16
-rw-r--r--indra/newview/llvoavatar.cpp800
-rw-r--r--indra/newview/llvoavatar.h18
-rw-r--r--indra/newview/llvoavatarself.cpp18
-rw-r--r--indra/newview/llvoavatarself.h11
-rw-r--r--indra/newview/llvovolume.cpp83
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences.xml6
-rw-r--r--indra/newview/skins/default/xui/en/menu_attachment_other.xml9
-rw-r--r--indra/newview/skins/default/xui/en/menu_attachment_self.xml7
-rw-r--r--indra/newview/skins/default/xui/en/menu_avatar_other.xml9
-rw-r--r--indra/newview/skins/default/xui/en/menu_avatar_self.xml6
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml10
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml15
-rw-r--r--indra/newview/skins/default/xui/en/panel_notification.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_privacy.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_sound.xml2
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml20
49 files changed, 5889 insertions, 1267 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 8d863631cf..769b86c218 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -533,6 +533,7 @@ set(viewer_SOURCE_FILES
llsidepaneliteminfo.cpp
llsidepaneltaskinfo.cpp
llsidetraypanelcontainer.cpp
+ llskinningutil.cpp
llsky.cpp
llslurl.cpp
llsnapshotlivepreview.cpp
@@ -1137,6 +1138,7 @@ set(viewer_HEADER_FILES
llsidepaneliteminfo.h
llsidepaneltaskinfo.h
llsidetraypanelcontainer.h
+ llskinningutil.h
llsky.h
llslurl.h
llsnapshotlivepreview.h
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index d13e837c8e..0062ac9718 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-4.0.6
+5.0.0
diff --git a/indra/newview/app_settings/anim.ini b/indra/newview/app_settings/anim.ini
index 63c84e544d..c24d2749ef 100644
--- a/indra/newview/app_settings/anim.ini
+++ b/indra/newview/app_settings/anim.ini
@@ -1,87 +1,2 @@
Translations 1.0
-[hip]
- relativepos = firstkey
- relativerot = firstkey
- outname = mPelvis
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[abdomen]
- outname = mTorso
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[chest]
- outname = mChest
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[neckDummy]
- ignore = true
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[neck]
- outname = mNeck
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[head]
- outname = mHead
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[figureHair]
- ignore = true
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[lCollar]
- outname = mCollarLeft
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[lShldr]
- outname = mShoulderLeft
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[lForeArm]
- outname = mElbowLeft
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[lHand]
- outname = mWristLeft
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[rCollar]
- outname = mCollarRight
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[rShldr]
- outname = mShoulderRight
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[rForeArm]
- outname = mElbowRight
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[rHand]
- outname = mWristRight
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[lThigh]
- outname = mHipLeft
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[lShin]
- outname = mKneeLeft
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[lFoot]
- outname = mAnkleLeft
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[rThigh]
- outname = mHipRight
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[rShin]
- outname = mKneeRight
- frame = 0 1 0, 0 0 1, 1 0 0
-
-[rFoot]
- outname = mAnkleRight
- frame = 0 1 0, 0 0 1, 1 0 0 \ No newline at end of file
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index a8d42be2a1..a7a15c9c7b 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -2194,6 +2194,17 @@
<key>Value</key>
<string />
</map>
+ <key>DebugAvatarJoints</key>
+ <map>
+ <key>Comment</key>
+ <string>List of joints to emit additional debugging info about.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
<key>DebugAvatarRezTime</key>
<map>
<key>Comment</key>
@@ -3514,6 +3525,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>IncludeEnhancedSkeleton</key>
+ <map>
+ <key>Comment</key>
+ <string>Include extended skeleton joints when rendering skinned meshes.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>MinObjectsForUnlinkConfirm</key>
<map>
<key>Comment</key>
@@ -14442,6 +14464,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>LogWearableAssetSave</key>
+ <map>
+ <key>Comment</key>
+ <string>Save copy of saved wearables to log dir</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>LogTextureDownloadsToViewerLog</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
index 3060307b21..8f754fe82b 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
@@ -24,8 +24,11 @@
ATTRIBUTE vec4 weight4;
-uniform mat3 matrixPalette[52];
-uniform vec3 translationPalette[52];
+/* BENTO JOINT COUNT LIMITS
+ * Note that the value in these two lines also needs to be updated to value-1 several places below.
+ */
+uniform mat3 matrixPalette[MAX_JOINTS_PER_MESH_OBJECT];
+uniform vec3 translationPalette[MAX_JOINTS_PER_MESH_OBJECT];
mat4 getObjectSkinnedTransform()
{
@@ -34,7 +37,7 @@ mat4 getObjectSkinnedTransform()
vec4 w = fract(weight4);
vec4 index = floor(weight4);
- index = min(index, vec4(51.0));
+ index = min(index, vec4(MAX_JOINTS_PER_MESH_OBJECT-1));
index = max(index, vec4( 0.0));
w *= 1.0/(w.x+w.y+w.z+w.w);
@@ -67,8 +70,8 @@ mat4 getObjectSkinnedTransform()
// If it's AMD make sure the GLSL compiler sees the arrays referenced once by static index. Otherwise it seems to optimise the storage awawy which leads to unfun crashes and artifacts.
mat3 dummy1 = matrixPalette[0];
vec3 dummy2 = translationPalette[0];
- mat3 dummy3 = matrixPalette[51];
- vec3 dummy4 = translationPalette[51];
+ mat3 dummy3 = matrixPalette[MAX_JOINTS_PER_MESH_OBJECT-1];
+ vec3 dummy4 = translationPalette[MAX_JOINTS_PER_MESH_OBJECT-1];
#endif
}
diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index 7f7eaed38a..38bcd88078 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
<linden_avatar
- version="1.0" wearable_definition_version="22">
+ version="2.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
@@ -307,7 +307,7 @@
<attachment_point
id="31"
- group="8"
+ group="9"
name="Center 2"
joint="mScreen"
position="0 0 0"
@@ -318,7 +318,7 @@
<attachment_point
id="32"
- group="8"
+ group="9"
name="Top Right"
joint="mScreen"
position="0 -0.5 0.5"
@@ -329,7 +329,7 @@
<attachment_point
id="33"
- group="8"
+ group="9"
name="Top"
joint="mScreen"
position="0 0 0.5"
@@ -340,7 +340,7 @@
<attachment_point
id="34"
- group="8"
+ group="9"
name="Top Left"
joint="mScreen"
position="0 0.5 0.5"
@@ -351,7 +351,7 @@
<attachment_point
id="35"
- group="8"
+ group="9"
name="Center"
joint="mScreen"
position="0 0 0"
@@ -362,7 +362,7 @@
<attachment_point
id="36"
- group="8"
+ group="9"
name="Bottom Left"
joint="mScreen"
position="0 0.5 -0.5"
@@ -373,7 +373,7 @@
<attachment_point
id="37"
- group="8"
+ group="9"
name="Bottom"
joint="mScreen"
position="0 0 -0.5"
@@ -384,7 +384,7 @@
<attachment_point
id="38"
- group="8"
+ group="9"
name="Bottom Right"
joint="mScreen"
position="0 -0.5 -0.5"
@@ -412,7 +412,161 @@
position="0 0 0"
rotation="0 0 0"
visible_in_first_person="true" />
-
+
+ <!-- BENTO ADDITIONS -->
+
+ <attachment_point
+ id="41"
+ group="8"
+ pie_slice="0"
+ name="Left Ring Finger"
+ joint="mHandRing1Left"
+ position="-0.006 0.019 -0.002"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="42"
+ group="8"
+ pie_slice="1"
+ name="Right Ring Finger"
+ joint="mHandRing1Right"
+ position="-0.006 -0.019 -0.002"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="43"
+ group="8"
+ pie_slice="2"
+ name="Tail Base"
+ joint="mTail1"
+ position="0.000 0.000 0.000"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="44"
+ group="8"
+ pie_slice="3"
+ name="Tail Tip"
+ joint="mTail6"
+ position="-0.025 0.000 0.000"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="45"
+ group="8"
+ pie_slice="4"
+ name="Left Wing"
+ joint="mWing4Left"
+ position="0.000 0.000 0.000"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="46"
+ group="8"
+ pie_slice="5"
+ name="Right Wing"
+ joint="mWing4Right"
+ position="0.000 0.000 0.000"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="47"
+ group="8"
+ pie_slice="6"
+ name="Jaw"
+ joint="mFaceJaw"
+ position="0.000 0.000 0.000"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="48"
+ group="8"
+ pie_slice="7"
+ name="Alt Left Ear"
+ joint="mFaceEar1Left"
+ position="0.000 0.000 0.000"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="49"
+ group="8"
+ pie_slice="8"
+ name="Alt Right Ear"
+ joint="mFaceEar1Right"
+ position="0.000 0.000 0.000"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="50"
+ group="8"
+ pie_slice="9"
+ name="Alt Left Eye"
+ joint="mFaceEyeAltLeft"
+ position="0.000 0.000 0.000"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="51"
+ group="8"
+ pie_slice="10"
+ name="Alt Right Eye"
+ joint="mFaceEyeAltRight"
+ position="0.000 0.000 0.000"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="52"
+ group="8"
+ pie_slice="11"
+ name="Tongue"
+ joint="mFaceTongueTip"
+ position="0.000 0.000 0.000"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="53"
+ group="8"
+ pie_slice="12"
+ name="Groin"
+ joint="mGroin"
+ position="0.000 0.000 0.000"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="54"
+ group="8"
+ pie_slice="13"
+ name="Left Hind Foot"
+ joint="mHindLimb4Left"
+ position="0.000 0.000 0.000"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <attachment_point
+ id="55"
+ group="8"
+ pie_slice="14"
+ name="Right Hind Foot"
+ joint="mHindLimb4Right"
+ position="0.000 0.000 0.000"
+ rotation="0 0 0"
+ visible_in_first_person="true"/>
+
+ <!-- END BENTO -->
+
<param
id="32"
group="1"
@@ -460,8 +614,12 @@
scale="0 0 .05" />
<bone
- name="mPelvis"
- scale="0 0 0" />
+ name="mSpine3"
+ scale="0 0 .05" />
+
+ <bone
+ name="mSpine4"
+ scale="0 0 .05" />
<bone
name="mHipLeft"
@@ -478,6 +636,27 @@
<bone
name="mKneeRight"
scale=".05 .05 .1" />
+
+ <bone
+ name="mHindLimb1Left"
+ scale=".05 .05 0" />
+
+ <bone
+ name="mHindLimb1Right"
+ scale=".05 .05 0" />
+
+ <bone
+ name="mHindLimb2Left"
+ scale=".05 .05 .1" />
+
+ <bone
+ name="mHindLimb2Right"
+ scale=".05 .05 .1" />
+
+ <bone name="mWingsRoot" scale="1 0 0" offset="0 0 0" />
+ <bone name="mWing1Right" scale="0 0 0" offset="0.02 0 0" />
+ <bone name="mWing1Left" scale="0 0 0" offset="0.02 0 0" />
+
</param_skeleton>
</param>
@@ -533,8 +712,12 @@
scale="0 0 0.05" />
<bone
- name="mPelvis"
- scale="0 0 0" />
+ name="mSpine3"
+ scale="0 0 0.05" />
+
+ <bone
+ name="mSpine4"
+ scale="0 0 0.05" />
<bone
name="mHipLeft"
@@ -551,6 +734,22 @@
<bone
name="mKneeRight"
scale="0 0 0.1" />
+
+ <bone
+ name="mHindLimb1Left"
+ scale="0 0 0.1" />
+
+ <bone
+ name="mHindLimb1Right"
+ scale="0 0 0.1" />
+
+ <bone
+ name="mHindLimb2Left"
+ scale="0 0 0.1" />
+
+ <bone
+ name="mHindLimb2Right"
+ scale="0 0 0.1" />
</param_skeleton>
</param>
@@ -606,10 +805,26 @@
scale="0.1 0.1 0" />
<bone
+ name="mSpine3"
+ scale="0.1 0.1 0" />
+
+ <bone
+ name="mSpine4"
+ scale="0.1 0.1 0" />
+
+ <bone
name="mPelvis"
scale="0.1 0.1 0" />
<bone
+ name="mSpine1"
+ scale="0.1 0.1 0" />
+
+ <bone
+ name="mSpine2"
+ scale="0.1 0.1 0" />
+
+ <bone
name="mHipLeft"
scale="0.13 0.13 0" />
@@ -624,6 +839,33 @@
<bone
name="mKneeRight"
scale="0.12 0.12 0" />
+
+ <bone
+ name="mHindLimb1Left"
+ scale="0.13 0.13 0" />
+
+ <bone
+ name="mHindLimb1Right"
+ scale="0.13 0.13 0" />
+
+ <bone
+ name="mHindLimb2Left"
+ scale="0.12 0.12 0" />
+
+ <bone
+ name="mHindLimb2Right"
+ scale="0.12 0.12 0" />
+
+ <bone name="mTail1" scale="0.05 0.1 0.1" />
+ <bone name="mTail2" scale="0.05 0.1 0.1" />
+ <bone name="mTail3" scale="0.05 0.1 0.1" />
+ <bone name="mTail4" scale="0.05 0.1 0.1" />
+ <bone name="mTail5" scale="0.05 0.1 0.1" />
+ <bone name="mTail6" scale="0.05 0 0" />
+
+ <bone name="mWing1Right" scale="0.0 0.0 0.0" offset="-0.01 -0.01 0" />
+ <bone name="mWing1Left" scale="0.0 0.0 0.0" offset="-0.01 0.01 0" />
+
</param_skeleton>
</param>
@@ -662,6 +904,17 @@
<bone
name="mChest"
scale="0.02 0.08 0" />
+
+ <bone
+ name="mWing1Right"
+ scale="0.0 0.0 0.0"
+ offset="0 -0.02 0" />
+
+ <bone
+ name="mWing1Left"
+ scale="0.0 0.0 0.0"
+ offset="0 0.02 0" />
+
</param_skeleton>
</param>
@@ -669,7 +922,7 @@
id="37"
group="0"
name="Hip Width"
- label="Hip Width"
+ label="Hip Width"
wearable="shape"
edit_group="shape_legs"
edit_group_order="3"
@@ -685,6 +938,14 @@
scale="0 0.1 0" />
<bone
+ name="mSpine1"
+ scale="0 0.1 0" />
+
+ <bone
+ name="mSpine2"
+ scale="0 0.1 0" />
+
+ <bone
name="mHipLeft"
scale="0 0 0"
offset="0 .004 0" />
@@ -693,6 +954,21 @@
name="mHipRight"
scale="0 0 0"
offset="0 -.004 0" />
+
+ <bone
+ name="mHindLimb1Left"
+ scale="0 0 0"
+ offset="0 .004 0" />
+
+ <bone
+ name="mHindLimb1Right"
+ scale="0 0 0"
+ offset="0 -.004 0" />
+
+ <bone name="mTail1" scale="0.0 0.05 0" />
+ <bone name="mTail2" scale="0.0 0.02 0" />
+ <bone name="mTail3" scale="0.0 0.01 0" />
+
</param_skeleton>
</param>
@@ -712,7 +988,15 @@
<bone
name="mPelvis"
scale="0 0 0.3" />
- </param_skeleton>
+
+ <bone
+ name="mSpine1"
+ scale="0 0 0.3" />
+
+ <bone
+ name="mSpine2"
+ scale="0 0 0.3" />
+ </param_skeleton>
</param>
<param
@@ -733,10 +1017,26 @@
scale="0 0 .3" />
<bone
+ name="mSpine3"
+ scale="0 0 .3" />
+
+ <bone
+ name="mSpine4"
+ scale="0 0 .3" />
+
+ <bone
name="mPelvis"
scale="0 0 .1" />
<bone
+ name="mSpine1"
+ scale="0 0 .1" />
+
+ <bone
+ name="mSpine2"
+ scale="0 0 .1" />
+
+ <bone
name="mHipLeft"
scale="0 0 -.1" />
@@ -751,6 +1051,22 @@
<bone
name="mKneeLeft"
scale="0 0 -.05" />
+
+ <bone
+ name="mHindLimb1Left"
+ scale="0 0 -.1" />
+
+ <bone
+ name="mHindLimb1Right"
+ scale="0 0 -.1" />
+
+ <bone
+ name="mHindLimb2Right"
+ scale="0 0 -.05" />
+
+ <bone
+ name="mHindLimb2Left"
+ scale="0 0 -.05" />
</param_skeleton>
</param>
@@ -774,6 +1090,77 @@
name="mEyeRight"
scale="0 0 0"
offset="0 -.009 0" />
+
+ <bone
+ name="mFaceEyeAltLeft"
+ scale="0 0 0 "
+ offset="0 .009 0" />
+
+ <bone
+ name="mFaceEyeAltRight"
+ scale="0 0 0 "
+ offset="0 -.009 0" />
+
+ <bone
+ name="mFaceEyeLidLowerLeft"
+ scale="0 0 0 "
+ offset="0 .009 0" />
+
+ <bone
+ name="mFaceEyeLidLowerRight"
+ scale="0 0 0 "
+ offset="0 -.009 0" />
+
+ <bone
+ name="mFaceEyeLidUpperLeft"
+ scale="0 0 0 "
+ offset="0 .009 0" />
+
+ <bone
+ name="mFaceEyeLidUpperRight"
+ scale="0 0 0 "
+ offset="0 -.009 0" />
+
+ <bone
+ name="mFaceEyebrowInnerLeft"
+ scale="0 0 0 "
+ offset="0 .009 0" />
+
+ <bone
+ name="mFaceEyebrowInnerRight"
+ scale="0 0 0 "
+ offset="0 -.009 0" />
+
+ <bone
+ name="mFaceEyebrowCenterLeft"
+ scale="0 0 0 "
+ offset="0 .009 0" />
+
+ <bone
+ name="mFaceEyebrowCenterRight"
+ scale="0 0 0 "
+ offset="0 -.009 0" />
+
+ <bone
+ name="mFaceEyebrowOuterLeft"
+ scale="0 0 0 "
+ offset="0 .005 0" />
+
+ <bone
+ name="mFaceEyebrowOuterRight"
+ scale="0 0 0 "
+ offset="0 -.005 0" />
+
+ <bone
+ name="mFaceEyecornerInnerLeft"
+ scale="0 0 0 "
+ offset="0 .008 0" />
+
+ <bone
+ name="mFaceEyecornerInnerRight"
+ scale="0 0 0 "
+ offset="0 -.008 0" />
+
</param_skeleton>
</param>
@@ -797,6 +1184,156 @@
name="mEyeRight"
scale="0 0 0"
offset="0 0 -.004" />
+
+ <bone
+ name="mFaceEyeAltLeft"
+ scale="0 0 0"
+ offset="0 0 .004" />
+
+ <bone
+ name="mFaceEyeAltRight"
+ scale="0 0 0"
+ offset="0 0 -.004" />
+
+ <bone
+ name="mFaceNoseRight"
+ scale="0 0 0"
+ offset="0 0 -.004" />
+
+ <bone
+ name="mFaceNoseLeft"
+ scale="0 0 0"
+ offset="0 0 .004" />
+
+ <bone
+ name="mFaceEar1Left"
+ scale="0 0 0"
+ offset="0 0 .004" />
+ <bone
+ name="mFaceEar1Right"
+ scale="0 0 0"
+ offset="0 0 -.004" />
+
+ <bone
+ name="mFaceLipUpperLeft"
+ scale="0 0 0"
+ offset="0 0 .004" />
+
+ <bone
+ name="mFaceLipUpperRight"
+ scale="0 0 0"
+ offset="0 0 -.004" />
+
+ <bone
+ name="mFaceLipLowerLeft"
+ scale="0 0 0"
+ offset="0 0 .004" />
+
+ <bone
+ name="mFaceLipLowerRight"
+ scale="0 0 0"
+ offset="0 0 -.004" />
+
+ <bone
+ name="mFaceLipCornerRight"
+ scale="0 0 0"
+ offset="0 0 -.004" />
+
+ <bone
+ name="mFaceLipCornerLeft"
+ scale="0 0 0"
+ offset="0 0 .004" />
+
+ <bone
+ name="mFaceCheekLowerLeft"
+ scale="0 0 0"
+ offset="0 0 .004" />
+
+ <bone
+ name="mFaceCheekLowerRight"
+ scale="0 0 0"
+ offset="0 0 -.004" />
+
+ <bone
+ name="mFaceCheekUpperLeft"
+ scale="0 0 0"
+ offset="0 0 .004" />
+
+ <bone
+ name="mFaceCheekUpperRight"
+ scale="0 0 0"
+ offset="0 0 -.004" />
+
+ <bone
+ name="mFaceEyeLidUpperLeft"
+ scale="0 0 0"
+ offset="0 0 .004" />
+
+ <bone
+ name="mFaceEyeLidUpperRight"
+ scale="0 0 0"
+ offset="0 0 -.004" />
+
+ <bone
+ name="mFaceEyeLidLowerLeft"
+ scale="0 0 0"
+ offset="0 0 .004" />
+
+ <bone
+ name="mFaceEyeLidLowerRight"
+ scale="0 0 0"
+ offset="0 0 -.004" />
+
+ <bone
+ name="mFaceEyebrowInnerLeft"
+ scale="0 0 0"
+ offset="0 0 .004" />
+
+ <bone
+ name="mFaceEyebrowInnerRight"
+ scale="0 0 0"
+ offset="0 0 -.004" />
+
+ <bone
+ name="mFaceEyebrowCenterLeft"
+ scale="0 0 0"
+ offset="0 0 .004" />
+
+ <bone
+ name="mFaceEyebrowCenterRight"
+ scale="0 0 0"
+ offset="0 0 -.004" />
+
+ <bone
+ name="mFaceEyebrowOuterLeft"
+ scale="0 0 0"
+ offset="0 0 .004" />
+
+ <bone
+ name="mFaceEyebrowOuterRight"
+ scale="0 0 0"
+ offset="0 0 -.004" />
+
+ <bone
+ name="mFaceEyecornerInnerRight"
+ scale="0 0 0"
+ offset="0 0 -.004" />
+
+ <bone
+ name="mFaceEyecornerInnerLeft"
+ scale="0 0 0"
+ offset="0 0 0.004" />
+
+ <bone
+ name="mFaceForeheadLeft"
+ scale="0 0 0"
+ offset="0 0 .004" />
+
+ <bone
+ name="mFaceForeheadRight"
+ scale="0 0 0"
+ offset="0 0 -.004" />
+
</param_skeleton>
</param>
@@ -820,6 +1357,102 @@
name="mEyeRight"
scale="0 0 0"
offset=".016 0 0" />
+
+ <bone
+ name="mFaceEyeAltLeft"
+ scale="0 0 0"
+ offset=".016 0 0" />
+
+ <bone
+ name="mFaceEyeAltRight"
+ scale="0 0 0"
+ offset=".016 0 0" />
+
+ <bone
+ name="mFaceRoot"
+ scale="0.25 0 0"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceNoseCenter"
+ scale="0 0 0"
+ offset=".01 0 0" />
+
+ <bone
+ name="mFaceNoseRight"
+ scale="0 0 0"
+ offset=".005 0 0" />
+
+ <bone
+ name="mFaceNoseLeft"
+ scale="0 0 0"
+ offset=".005 0 0" />
+
+ <bone
+ name="mFaceNoseBase"
+ scale="0 0 0"
+ offset=".005 0 0" />
+
+ <bone
+ name="mFaceLipUpperCenter"
+ scale="0 0 0"
+ offset="0.005 0 0" />
+
+ <bone
+ name="mFaceLipLowerCenter"
+ scale="0 0 0"
+ offset="0.01 0 0" />
+
+ <bone
+ name="mFaceLipUpperLeft"
+ scale="0 0 0"
+ offset="0.005 0 0" />
+
+ <bone
+ name="mFaceLipUpperRight"
+ scale="0 0 0"
+ offset="0.005 0 0" />
+
+ <bone
+ name="mFaceLipLowerLeft"
+ scale="0 0 0"
+ offset="0.01 0 0" />
+
+ <bone
+ name="mFaceLipLowerRight"
+ scale="0 0 0"
+ offset="0.01 0 0" />
+
+ <bone
+ name="mFaceLipCornerRight"
+ scale="0 0 0"
+ offset="0.005 0 0" />
+
+ <bone
+ name="mFaceLipCornerLeft"
+ scale="0 0 0"
+ offset="0.005 0 0" />
+
+ <bone
+ name="mFaceCheekLowerLeft"
+ scale="0 0 0"
+ offset="0.007 0 0" />
+
+ <bone
+ name="mFaceCheekLowerRight"
+ scale="0 0 0"
+ offset="-0.007 0 0" />
+
+ <bone
+ name="mFaceTeethUpper"
+ scale="0 0 0"
+ offset="0.015 0 0" />
+
+ <bone
+ name="mFaceTeethLower"
+ scale="0 0 0"
+ offset="0.007 0 0" />
+
</param_skeleton>
</param>
@@ -843,6 +1476,79 @@
name="mEyeRight"
scale="0 0 0"
offset=".005 0 0" />
+ <bone
+ name="mFaceEyeAltLeft"
+ scale="0 0 0"
+ offset=".005 0 0" />
+
+ <bone
+ name="mFaceEyeAltRight"
+ scale="0 0 0"
+ offset=".005 0 0" />
+
+ <bone
+ name="mFaceEyeLidLowerLeft"
+ scale="0 0 0 "
+ offset=".005 0 0" />
+
+ <bone
+ name="mFaceEyeLidLowerRight"
+ scale="0 0 0 "
+ offset=".005 0 0" />
+
+ <bone
+ name="mFaceEyecornerInnerLeft"
+ scale="0 0 0 "
+ offset=".005 0 0" />
+
+ <bone
+ name="mFaceEyecornerInnerRight"
+ scale="0 0 0 "
+ offset=".005 0 0" />
+
+ <bone
+ name="mFaceEyeLidUpperLeft"
+ scale="0 0 0 "
+ offset=".005 0 0" />
+
+ <bone
+ name="mFaceEyeLidUpperRight"
+ scale="0 0 0 "
+ offset=".005 0 0" />
+
+ <bone
+ name="mFaceEyebrowInnerRight"
+ scale="0 0 0 "
+ offset=".002 0 0" />
+
+ <bone
+ name="mFaceEyebrowInnerLeft"
+ scale="0 0 0 "
+ offset=".002 0 0" />
+
+ <bone
+ name="mFaceEyebrowCenterRight"
+ scale="0 0 0 "
+ offset=".001 0 0" />
+
+ <bone
+ name="mFaceEyebrowCenterLeft"
+ scale="0 0 0 "
+ offset=".001 0 0" />
+
+ <bone
+ name="mFaceEyebrowOuterRight"
+ scale="0 0 0 "
+ offset=".0013 0 0" />
+
+ <bone
+ name="mFaceEyebrowOuterLeft"
+ scale="0 0 0 "
+ offset=".0013 0 0" />
+
+
+
+
</param_skeleton>
</param>
@@ -850,7 +1556,7 @@
id="655"
group="1"
name="Head Size"
- label="Head Size"
+ label="Head Size"
wearable="shape"
edit_group="shape_head"
label_min="Small Head"
@@ -859,6 +1565,36 @@
value_min="-.25"
value_max=".10">
<param_skeleton>
+
+ <bone
+ name = "mFaceTeethLower"
+ scale = "1 1 1"
+ offset = "0 0 0" />
+
+ <bone
+ name = "mFaceTeethUpper"
+ scale = "1 1 1"
+ offset = "0 0 0" />
+
+ <bone
+ name = "mFaceEyecornerInnerLeft"
+ scale = "1 1 1"
+ offset = "0 0 0" />
+
+ <bone
+ name = "mFaceEyecornerInnerRight"
+ scale = "1 1 1"
+ offset = "0 0 0" />
+
+ <bone
+ name = "mFaceNoseBridge"
+ scale = "1 1 1"
+ offset = "0 0 0" />
+
+ <bone
+ name = "mFaceNoseBase"
+ scale = "1 1 1"
+ offset = "0 0 0" />
<bone
name="mSkull"
scale="1 1 1"
@@ -870,6 +1606,11 @@
offset="0 0 0" />
<bone
+ name="mFaceRoot"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
name="mEyeLeft"
scale="1 1 1"
offset="0 0 0" />
@@ -878,6 +1619,165 @@
name="mEyeRight"
scale="1 1 1"
offset="0 0 0" />
+
+ <bone
+ name="mFaceEyeAltLeft"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceEyeAltRight"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceForeheadLeft"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceForeheadCenter"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceForeheadRight"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceEyebrowOuterLeft"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceEyebrowCenterLeft"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceEyebrowInnerLeft"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceEyebrowOuterRight"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceEyebrowCenterRight"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceEyebrowInnerRight"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceEyeLidUpperLeft"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceEyeLidLowerLeft"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceEyeLidUpperRight"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceEyeLidLowerRight"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceNoseLeft"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceNoseCenter"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceNoseRight"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceCheekLowerLeft"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceCheekUpperLeft"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceCheekLowerRight"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceCheekUpperRight"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceJaw"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceChin"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceLipUpperLeft"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceLipUpperCenter"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceLipUpperRight"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceLipCornerLeft"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceLipCornerRight"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceLipLowerLeft"
+ scale="1 1 1"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceLipLowerCenter"
+ scale="1 1 1"
+ offset="0 0 0" />
+ <bone
+ name="mFaceLipLowerRight"
+ scale="1 1 1"
+ offset="0 0 0" />
</param_skeleton>
</param>
@@ -951,6 +1851,47 @@
name="mWristLeft"
scale="1 1 1"
offset="0 0 0" />
+
+ <bone name = "mHandThumb1Right" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandThumb2Right" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandThumb3Right" scale = "1 1 1" offset = "0 0 0" />
+
+ <bone name = "mHandIndex1Right" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandIndex2Right" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandIndex3Right" scale = "1 1 1" offset = "0 0 0" />
+
+ <bone name = "mHandMiddle1Right" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandMiddle2Right" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandMiddle3Right" scale = "1 1 1" offset = "0 0 0" />
+
+ <bone name = "mHandRing1Right" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandRing2Right" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandRing3Right" scale = "1 1 1" offset = "0 0 0" />
+
+ <bone name = "mHandPinky1Right" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandPinky2Right" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandPinky3Right" scale = "1 1 1" offset = "0 0 0" />
+
+ <bone name = "mHandThumb1Left" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandThumb2Left" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandThumb3Left" scale = "1 1 1" offset = "0 0 0" />
+
+ <bone name = "mHandIndex1Left" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandIndex2Left" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandIndex3Left" scale = "1 1 1" offset = "0 0 0" />
+
+ <bone name = "mHandMiddle1Left" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandMiddle2Left" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandMiddle3Left" scale = "1 1 1" offset = "0 0 0" />
+
+ <bone name = "mHandRing1Left" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandRing2Left" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandRing3Left" scale = "1 1 1" offset = "0 0 0" />
+
+ <bone name = "mHandPinky1Left" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandPinky2Left" scale = "1 1 1" offset = "0 0 0" />
+ <bone name = "mHandPinky3Left" scale = "1 1 1" offset = "0 0 0" />
+
</param_skeleton>
</param>
@@ -997,6 +1938,47 @@
name="mEyeRight"
scale="0 0 0"
offset="-.005 0 0" />
+
+ <bone
+ name="mFaceEyeAltLeft"
+ scale="0 0 0"
+ offset="-.005 0 0" />
+
+ <bone
+ name="mFaceEyeAltRight"
+ scale="0 0 0"
+ offset="-.005 0 0" />
+
+ <bone
+ name="mFaceEyeLidLowerRight"
+ scale="0 0.7 0.5"
+ offset="-.003 0 -0.003" />
+
+ <bone
+ name="mFaceEyeLidLowerLeft"
+ scale="0 0.7 0.5"
+ offset="-.003 0 -0.003" />
+
+ <bone
+ name="mFaceEyeLidUpperRight"
+ scale="0 0.7 0.5"
+ offset="-.003 0 0.003" />
+
+ <bone
+ name="mFaceEyeLidUpperLeft"
+ scale="0 0.7 0.5"
+ offset="-.003 0 0.003" />
+
+ <bone
+ name="mFaceEyecornerInnerLeft"
+ scale="0 0 0"
+ offset="-0.005 -0.008 0.0" />
+
+ <bone
+ name="mFaceEyecornerInnerRight"
+ scale="0 0 0"
+ offset="-0.005 0.008 0.0" />
+
</param_skeleton>
</param>
@@ -1028,6 +2010,22 @@
<bone
name="mKneeLeft"
scale="0 0 .2" />
+
+ <bone
+ name="mHindLimb1Left"
+ scale="0 0 .2" />
+
+ <bone
+ name="mHindLimb1Right"
+ scale="0 0 .2" />
+
+ <bone
+ name="mHindLimb2Right"
+ scale="0 0 .2" />
+
+ <bone
+ name="mHindLimb2Left"
+ scale="0 0 .2" />
</param_skeleton>
</param>
@@ -1084,7 +2082,8 @@
scale="0 0 .5" />
</param_skeleton>
</param>
- <param
+
+ <param
id="11001"
group="0"
name="Hover"
@@ -1099,12 +2098,2022 @@
camera_distance="2.5">
<param_skeleton />
</param>
+
+ <param
+ id="30002"
+ group="1"
+ name="Nose_Big_Out"
+ value_min="-0.8"
+ value_max="2.5">
+ <param_skeleton>
+ <bone
+ name = "mFaceNoseCenter"
+ offset = "0.01 0.0 0.0"
+ scale = "0.10 0.3 0.0" />
+ <bone
+ name = "mFaceNoseLeft"
+ offset = "0 0.0025 0"
+ scale = "0.0 0.0 0.0" />
+ <bone
+ name = "mFaceNoseRight"
+ offset = "0 -0.0025 0"
+ scale = "0.0 0.0 0.0" />
+ <bone
+ name = "mFaceNoseBridge"
+ offset = "0.006 0.0 0.0"
+ scale = "0.10 0.1 0.0" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30004"
+ group="1"
+ name="Broad_Nostrils"
+ value_min="-.5"
+ value_max="1">
+ <param_skeleton>
+ <bone
+ name = "mFaceNoseLeft"
+ offset = "0 0.005 0"
+ scale = "0.0 0.0 0.0" />
+ <bone
+ name = "mFaceNoseRight"
+ offset = "0 -0.005 0"
+ scale = "0.0 0.0 0.0" />
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30020"
+ group="1"
+ name="Bulbous_Nose"
+ value_min="-.5"
+ value_max="1.5"
+ >
+ <param_skeleton>
+ <bone
+ name = "mFaceNoseCenter"
+ offset = "0.0 0.0 0.0"
+ scale = "0.2 0.4 0.2" />
+ <bone
+ name = "mFaceNoseLeft"
+ scale = "0 0.3 0"
+ offset = "0 0.0015 0"
+ />
+ <bone
+ name = "mFaceNoseRight"
+ scale = "0 0.3 0"
+ offset = "0 -0.0015 0"
+ />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30517"
+ group="1"
+ name="Wide_Nose"
+ value_min="-.5"
+ value_max="1">
+ <param_skeleton>
+ <bone
+ name = "mFaceNoseCenter"
+ offset = "0.00 0.0 0.0"
+ scale = "0.10 0.85 0.0" />
+ <bone
+ name = "mFaceNoseLeft"
+ scale = "0 0 0"
+ offset = "0.001 0.010 0"/>
+ <bone
+ name = "mFaceNoseRight"
+ scale = "0 0 0"
+ offset = "-0.001 -0.01 0" />
+ </param_skeleton>
+ </param>
+ <param
+ id="30656"
+ group="1"
+ name="Crooked_Nose"
+ value_min="-2"
+ value_max="2">
+ <param_skeleton>
+ <bone
+ name = "mFaceNoseCenter"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.009 0.0" />
+
+ <bone
+ name = "mFaceNoseBase"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.007 0.0" />
+
+ <bone
+ name = "mFaceNoseLeft"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.005 0.0"/>
+
+ <bone
+ name = "mFaceNoseRight"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.005 0.0" />
+
+ <bone
+ name = "mFaceLipCornerLeft"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.001 0.0" />
+
+ <bone
+ name = "mFaceLipUpperLeft"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.002 0.0" />
+
+ <bone
+ name = "mFaceLipUpperCenter"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.003 0.0" />
+
+ <bone
+ name = "mFaceLipUpperRight"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.002 0.0" />
+
+ <bone
+ name = "mFaceLipCornerRight"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.001 0.0" />
+
+ <bone
+ name = "mFaceEyebrowInnerRight"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.0008 0.0" />
+
+ <bone
+ name = "mFaceEyebrowInnerLeft"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.0008 0.0" />
+
+ <bone
+ name = "mFaceNoseBridge"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.004 0.0" />
+
+ <bone
+ name = "mFaceTeethUpper"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.003 0.0" />
+
+ <bone
+ name = "mFaceEyecornerInnerRight"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.001 0.0" />
+
+ <bone
+ name = "mFaceEyecornerInnerLeft"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.001 0.0" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30155"
+ group="1"
+ name="Lip Width"
+ value_min="-0.9"
+ value_max="1.3"
+ value_default="0">
+ <param_skeleton>
+ <bone
+ name = "mFaceLipCornerLeft"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.005 0.0" />
+
+ <bone
+ name = "mFaceLipUpperLeft"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.003 0.0" />
+
+ <bone
+ name = "mFaceLipUpperRight"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 -0.003 0.0" />
+
+ <bone
+ name = "mFaceLipLowerLeft"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.003 0.0" />
+
+ <bone
+ name = "mFaceLipLowerRight"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 -0.003 0.0" />
+
+ <bone
+ name = "mFaceLipCornerRight"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 -0.005 0.0" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30653"
+ group="1"
+ name="Tall_Lips"
+ value_min="-1"
+ value_max="2">
+ <param_skeleton>
+ <bone
+ name = "mFaceLipCornerLeft"
+ scale = "0.2 0.00 0.2"
+ offset = "-0.01 0.00 0.0" />
+
+ <bone
+ name = "mFaceLipUpperLeft"
+ scale = "0.2 0.00 0.2"
+ offset = "-0.01 0.00 0.0015" />
+
+ <bone
+ name = "mFaceLipUpperCenter"
+ scale = "0.2 0.00 0.2"
+ offset = "-0.01 0.00 0.0025" />
+
+ <bone
+ name = "mFaceLipUpperRight"
+ scale = "0.2 0.00 0.2"
+ offset = "-0.01 0.00 0.0015" />
+
+ <bone
+ name = "mFaceLipCornerRight"
+ scale = "0.2 0.00 0.2"
+ offset = "-0.01 0.00 0.0" />
+
+ <bone
+ name = "mFaceLipLowerLeft"
+ scale = "0.2 0.00 0.2"
+ offset = "-0.01 0.00 -0.0015" />
+
+ <bone
+ name = "mFaceLipLowerCenter"
+ scale = "0.2 0.00 0.2"
+ offset = "-0.01 0.00 -0.0025" />
+
+ <bone
+ name = "mFaceLipLowerRight"
+ scale = "0.2 0.00 0.2"
+ offset = "-0.01 0.00 -0.0015" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30505"
+ group="1"
+ name="Lip_Thickness"
+ value_min="0"
+ value_max="0.7">
+ <param_skeleton>
+
+ <bone
+ name = "mFaceLipCornerLeft"
+ scale = "0.2 0.00 -0.6"
+ offset = "-0.01 0.00 0.0" />
+
+ <bone
+ name = "mFaceLipUpperLeft"
+ scale = "0.2 0.00 -0.6"
+ offset = "-0.012 0.00 -0.005" />
+
+ <bone
+ name = "mFaceLipUpperCenter"
+ scale = "0.2 0.00 -0.6"
+ offset = "-0.015 0.00 -0.005" />
+
+ <bone
+ name = "mFaceLipUpperRight"
+ scale = "0.2 0.00 -0.6"
+ offset = "-0.012 0.00 -0.005" />
+
+ <bone
+ name = "mFaceLipCornerRight"
+ scale = "0.2 0.00 -0.6"
+ offset = "-0.01 0.00 0.0" />
+
+ <bone
+ name = "mFaceLipLowerLeft"
+ scale = "0.2 0.00 -0.6"
+ offset = "-0.01 0.00 0.008" />
+
+ <bone
+ name = "mFaceLipLowerCenter"
+ scale = "0.2 0.00 -0.6"
+ offset = "-0.01 0.00 0.008" />
+
+ <bone
+ name = "mFaceLipLowerRight"
+ scale = "0.2 0.00 -0.6"
+ offset = "-0.01 0.00 0.008" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="31505"
+ group="1"
+ name="Lip_Thickness"
+ value_min="0"
+ value_max="1">
+ <param_skeleton>
+
+ <bone
+ name = "mFaceLipCornerLeft"
+ scale = "0.2 0.00 0.1"
+ offset = "0.005 0.00 0.0" />
+
+ <bone
+ name = "mFaceLipUpperLeft"
+ scale = "0.2 0.00 0.7"
+ offset = "0.004 0.00 0.006" />
+
+ <bone
+ name = "mFaceLipUpperCenter"
+ scale = "0.2 0.00 0.7"
+ offset = "0.004 0.00 0.006" />
+
+ <bone
+ name = "mFaceLipUpperRight"
+ scale = "0.2 0.00 0.7"
+ offset = "0.004 0.00 0.006" />
+
+ <bone
+ name = "mFaceLipCornerRight"
+ scale = "0.2 0.00 0.1"
+ offset = "0.005 0.00 0.0" />
+
+ <bone
+ name = "mFaceLipLowerLeft"
+ scale = "0.2 0.00 0.3"
+ offset = "0.006 0.00 -0.003" />
+
+ <bone
+ name = "mFaceLipLowerCenter"
+ scale = "0.2 0.00 0.3"
+ offset = "0.006 0.00 -0.003" />
+
+ <bone
+ name = "mFaceLipLowerRight"
+ scale = "0.2 0.00 0.3"
+ offset = "0.006 0.00 -0.003" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30797"
+ group="1"
+ name="Fat_Upper_Lip"
+ value_min="0"
+ value_max="1.5">
+ <param_skeleton>
+
+ <bone
+ name = "mFaceLipCornerLeft"
+ scale = "0 0 0"
+ offset = "-0.002 0.00 0.001" />
+
+ <bone
+ name = "mFaceLipCornerRight"
+ scale = "0 0 0"
+ offset = "-0.002 0.00 0.001" />
+
+ <bone
+ name = "mFaceLipUpperLeft"
+ scale = " 0.1 0 0.6"
+ offset = "-0.006 0.00 0.006" />
+
+ <bone
+ name = "mFaceLipUpperCenter"
+ scale = " 0.1 0 0.4"
+ offset = "-0.006 0.00 0.003" />
+
+ <bone
+ name = "mFaceLipUpperRight"
+ scale = " 0.1 0 0.6"
+ offset = "-0.006 0.00 0.006" />
+
+ <bone
+ name = "mFaceLipLowerLeft"
+ scale = " 0 0 0"
+ offset = "-0.002 0.00 0.001" />
+
+ <bone
+ name = "mFaceLipLowerCenter"
+ scale = " 0 0 0"
+ offset = "-0.002 0.00 0.001" />
+
+ <bone
+ name = "mFaceLipLowerRight"
+ scale = " 0 0 0"
+ offset = "-0.002 0.00 0.001" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30798"
+ group="1"
+ name="Fat_Lower_Lip"
+ value_min="0"
+ value_max="1.5">
+ <param_skeleton>
+
+ <bone
+ name = "mFaceLipCornerLeft"
+ scale = "0 0 0"
+ offset = "-0.002 0.00 -0.002" />
+
+ <bone
+ name = "mFaceLipCornerRight"
+ scale = "0 0 0"
+ offset = "-0.002 0.00 -0.002" />
+
+ <bone
+ name = "mFaceLipUpperLeft"
+ scale = " 0 0 0"
+ offset = "-0.002 0.00 -0.003" />
+
+ <bone
+ name = "mFaceLipUpperCenter"
+ scale = " 0 0 0"
+ offset = "-0.002 0.00 -0.003" />
+
+ <bone
+ name = "mFaceLipUpperRight"
+ scale = " 0 0 0"
+ offset = "-0.002 0.00 -0.003" />
+
+ <bone
+ name = "mFaceLipLowerLeft"
+ scale = " 0.1 0 0.25"
+ offset = "-0.005 0.00 -0.004" />
+
+ <bone
+ name = "mFaceLipLowerCenter"
+ scale = " 0.1 0 0.25"
+ offset = "-0.005 0.00 -0.004" />
+
+ <bone
+ name = "mFaceLipLowerRight"
+ scale = " 0.1 0 0.25"
+ offset = "-0.005 0.00 -0.004" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30506"
+ group="1"
+ name="Mouth_Height"
+ value_min="-2"
+ value_max="2">
+ <param_skeleton>
+
+ <bone
+ name = "mFaceLipCornerLeft"
+ scale = "0 0 0"
+ offset = "0 0 -0.006" />
+
+ <bone
+ name = "mFaceLipCornerRight"
+ scale = "0 0 0"
+ offset = "0 0 -0.006" />
+
+ <bone
+ name = "mFaceLipUpperLeft"
+ scale = " 0 0 0"
+ offset = "0 0 -0.006" />
+
+ <bone
+ name = "mFaceLipUpperCenter"
+ scale = " 0 0 0"
+ offset = "0 0 -0.006" />
+
+ <bone
+ name = "mFaceLipUpperRight"
+ scale = " 0 0 0"
+ offset = "0 0 -0.006" />
+
+ <bone
+ name = "mFaceLipLowerLeft"
+ scale = " 0 0 0"
+ offset = "0 0 -0.006" />
+
+ <bone
+ name = "mFaceLipLowerCenter"
+ scale = " 0 0 0"
+ offset = "0 0 -0.006" />
+
+ <bone
+ name = "mFaceLipLowerRight"
+ scale = " 0 0 0"
+ offset = "0 0 -0.006" />
+
+ <bone
+ name = "mFaceTongueBase"
+ scale = "0.0 0.00 0.0"
+ offset = "0 0 -0.006" />
+
+ <bone
+ name = "mFaceTeethUpper"
+ scale = "0.0 0.00 0.0"
+ offset = "0 0 -0.006" />
+
+ <bone
+ name = "mFaceTeethLower"
+ scale = "0.0 0.00 0.0"
+ offset = "0 0 -0.006" />
+
+ <bone
+ name = "mFaceNoseBase"
+ scale = "0.0 0.00 0.0"
+ offset = "0 0 -0.001" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30658"
+ group="1"
+ name="Frown_Mouth"
+ value_min="0"
+ value_max="1.4">
+ <param_skeleton>
+ <bone
+ name = "mFaceLipCornerLeft"
+ scale = "0 0 0"
+ offset = "0 0 -0.005" />
+
+ <bone
+ name = "mFaceLipCornerRight"
+ scale = "0 0 0"
+ offset = "0 0 -0.005" />
+
+ <bone
+ name = "mFaceLipUpperLeft"
+ scale = "0 0 0"
+ offset = "0 0 0" />
+
+ <bone
+ name = "mFaceLipUpperCenter"
+ scale = "0 0 0"
+ offset = "0 0 0" />
+
+ <bone
+ name = "mFaceLipUpperRight"
+ scale = "0 0 0"
+ offset = "0 0 0" />
+
+ <bone
+ name = "mFaceLipLowerLeft"
+ scale = "0 0 0"
+ offset = "0 0 0.001" />
+
+ <bone
+ name = "mFaceLipLowerCenter"
+ scale = "0 0 0"
+ offset = "0 0 0.002" />
+
+ <bone
+ name = "mFaceLipLowerRight"
+ scale = "0 0 0"
+ offset = "0 0 0.001" />
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30657"
+ group="1"
+ name="Smile_Mouth"
+ value_min="0"
+ value_max="1.4">
+ <param_skeleton>
+
+ <bone
+ name = "mFaceLipCornerLeft"
+ scale = "0 0 0"
+ offset = "0 0.005 0.002" />
+
+ <bone
+ name = "mFaceLipCornerRight"
+ scale = "0 0 0"
+ offset = "0 -0.005 0.002" />
+
+ <bone
+ name = "mFaceLipUpperLeft"
+ scale = "0 0 0"
+ offset = "0 0.002 0" />
+
+ <bone
+ name = "mFaceLipUpperCenter"
+ scale = "0 0 0"
+ offset = "0 0 -0.0005" />
+
+ <bone
+ name = "mFaceLipUpperRight"
+ scale = "0 0 0"
+ offset = "0 -0.002 0" />
+
+ <bone
+ name = "mFaceLipLowerLeft"
+ scale = "0 0 0"
+ offset = "0 0.001 0" />
+
+ <bone
+ name = "mFaceLipLowerCenter"
+ scale = "0 0 0"
+ offset = "0 0 -0.001" />
+
+ <bone
+ name = "mFaceLipLowerRight"
+ scale = "0 0 0"
+ offset = "0 -0.001 0" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30764"
+ group="1"
+ name="Lip_Cleft_Deep"
+ value_min="-1"
+ value_max="1.2">
+ <param_skeleton>
+
+ <bone
+ name = "mFaceLipUpperLeft"
+ scale = "0 0 0"
+ offset = "0 0 0.002" />
+
+ <bone
+ name = "mFaceLipUpperCenter"
+ scale = "0 0 0"
+ offset = "0 0 -0.001" />
+
+ <bone
+ name = "mFaceLipUpperRight"
+ scale = "0 0 0"
+ offset = "0 0 0.002" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30025"
+ group="1"
+ name="Wide_Lip_Cleft"
+ value_min="-.8"
+ value_max="1.5">
+ <param_skeleton>
+
+ <bone
+ name = "mFaceLipUpperLeft"
+ scale = "0 0 0"
+ offset = "0 0.004 0" />
+
+ <bone
+ name = "mFaceLipUpperRight"
+ scale = "0 0 0"
+ offset = "0 -0.004 0" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="31663"
+ group="1"
+ name="Shift_Mouth"
+ value_min="0"
+ value_max="2">
+ <param_skeleton>
+ <bone
+ name = "mFaceNoseCenter"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 -0.003 0.0" />
+
+ <bone
+ name = "mFaceNoseBase"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 -0.004 0.0" />
+
+ <bone
+ name = "mFaceNoseLeft"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 -0.003 0.0"/>
+
+ <bone
+ name = "mFaceNoseRight"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 -0.003 0.0" />
+
+ <bone
+ name = "mFaceLipCornerLeft"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 -0.005 0.0" />
+
+ <bone
+ name = "mFaceLipUpperLeft"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 -0.005 0.0" />
+
+ <bone
+ name = "mFaceLipUpperCenter"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 -0.006 0.0" />
+
+ <bone
+ name = "mFaceLipUpperRight"
+ scale = "0.0 0.00 0.0"
+ offset = "-0.002 -0.005 0.0" />
+
+ <bone
+ name = "mFaceLipCornerRight"
+ scale = "0.0 0.00 0.0"
+ offset = "-0.002 -0.005 0.0" />
+
+ <bone
+ name = "mFaceLipLowerLeft"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 -0.007 0.0" />
+
+ <bone
+ name = "mFaceLipLowerCenter"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 -0.01 0.0" />
+
+ <bone
+ name = "mFaceLipLowerRight"
+ scale = "0.0 0.00 0.0"
+ offset = "-0.002 -0.005 0.0" />
+
+ <bone
+ name = "mFaceTeethUpper"
+ scale = "0.0 0.00 0.0"
+ offset = "-0.002 -0.005 0.0" />
+
+ <bone
+ name = "mFaceTeethLower"
+ scale = "0.0 0.00 0.0"
+ offset = "-0.002 -0.006 0.0" />
+
+
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="32663"
+ group="1"
+ name="Shift_Mouth"
+ value_min="0"
+ value_max="2">
+ <param_skeleton>
+ <bone
+ name = "mFaceNoseCenter"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.003 0.0" />
+
+ <bone
+ name = "mFaceNoseBase"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.004 0.0" />
+
+ <bone
+ name = "mFaceNoseLeft"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.003 0.0"/>
+
+ <bone
+ name = "mFaceNoseRight"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.003 0.0" />
+
+ <bone
+ name = "mFaceLipCornerLeft"
+ scale = "0.0 0.00 0.0"
+ offset = "-0.002 0.005 0.0" />
+
+ <bone
+ name = "mFaceLipUpperLeft"
+ scale = "0.0 0.00 0.0"
+ offset = "-0.002 0.005 0.0" />
+
+ <bone
+ name = "mFaceLipUpperCenter"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.006 0.0" />
+
+ <bone
+ name = "mFaceLipUpperRight"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.005 0.0" />
+
+ <bone
+ name = "mFaceLipCornerRight"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.005 0.0" />
+
+ <bone
+ name = "mFaceLipLowerLeft"
+ scale = "0.0 0.00 0.0"
+ offset = "-0.002 0.005 0.0" />
+
+ <bone
+ name = "mFaceLipLowerCenter"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.01 0.0" />
+
+ <bone
+ name = "mFaceLipLowerRight"
+ scale = "0.0 0.00 0.0"
+ offset = "0.0 0.007 0.0" />
+
+ <bone
+ name = "mFaceTeethUpper"
+ scale = "0.0 0.00 0.0"
+ offset = "-0.002 0.005 0.0" />
+
+ <bone
+ name = "mFaceTeethLower"
+ scale = "0.0 0.00 0.0"
+ offset = "-0.002 0.006 0.0" />
+
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30035"
+ group="1"
+ name="Big_Ears"
+ value_min="-1"
+ value_max="2">
+ <param_skeleton>
+ <bone
+ name = "mFaceEar1Left"
+ scale = "0.55 0.55 0.55"
+ offset = "0.0 -0.002 0.001" />
+ <bone
+ name = "mFaceEar1Right"
+ scale = "0.55 0.55 0.55"
+ offset = "0.0 0.002 0.001" />
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30015"
+ group="1"
+ name="Ears_Out"
+ value_min="-.5"
+ value_max="1.5">
+ <param_skeleton>
+ <!-- Place Holder. Can't do this unless we get rotation offset -->
+ <bone
+ name = "mFaceEar1Left"
+ offset = "0.0 -0.0 0.0"
+ scale = "0.0 0.0 0.0" />
+ <bone
+ name = "mFaceEar1Right"
+ offset = "0.0 0.0 0.0"
+ scale = "0.0 0.0 0.0" />
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30796"
+ group="1"
+ name="Pointy_Ears"
+ value_min="-.4"
+ value_max="3">
+ <param_skeleton>
+ <bone
+ name = "mFaceEar2Left"
+ offset = "-0.0149 0.001 0.016"
+ scale = "0.0 0.0 0.0" />
+ <bone
+ name = "mFaceEar2Right"
+ offset = "-0.0149 -0.001 0.016"
+ scale = "0.0 0.0 0.0" />
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30185"
+ group="1"
+ name="Deep_Chin"
+ value_min="-1"
+ value_max="1">
+ <param_skeleton>
+ <bone
+ name = "mFaceJaw"
+ offset = "0.0 0.00 -0.02"
+ scale = "0.0 0.0 0.0" />
+
+ <bone
+ name = "mFaceLipLowerLeft"
+ offset = "0.0 0.00 0.02"
+ scale = "0.0 0.0 0.0" />
+
+ <bone
+ name = "mFaceLipLowerRight"
+ offset = "0.0 0.00 0.02"
+ scale = "0.0 0.0 0.0" />
+
+ <bone
+ name = "mFaceLipLowerCenter"
+ offset = "0.0 0.00 0.02"
+ scale = "0.0 0.0 0.0" />
+
+ <bone
+ name = "mFaceTongueBase"
+ offset = "0.0 0.00 0.02"
+ scale = "0.0 0.0 0.0" />
+
+ </param_skeleton>
+ </param>
+ <param
+ id="40185"
+ group="1"
+ name="Deep_Chin"
+ value_min="-1"
+ value_max="1">
+ <param_skeleton>
+ <bone
+ name = "mFaceJaw"
+ offset = "0.0 0.00 -0.02"
+ scale = "0.0 0.0 0.0" />
+
+ <bone
+ name = "mFaceLipLowerLeft"
+ offset = "0.0 0.00 0.02"
+ scale = "0.0 0.0 0.0" />
+
+ <bone
+ name = "mFaceLipLowerRight"
+ offset = "0.0 0.00 0.02"
+ scale = "0.0 0.0 0.0" />
+
+ <bone
+ name = "mFaceLipLowerCenter"
+ offset = "0.0 0.00 0.02"
+ scale = "0.0 0.0 0.0" />
+
+ <bone
+ name = "mFaceTongueBase"
+ offset = "0.0 0.00 0.02"
+ scale = "0.0 0.0 0.0" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30760"
+ group="1"
+ name="Jaw_Angle"
+ value_min="-2"
+ value_max="2"
+ value_default="0">
+ <param_skeleton>
+ <bone
+ name = "mFaceJaw"
+ offset = "0.0 0.00 0.03"
+ scale = "0.0 0.0 0.0" />
+
+ <bone
+ name = "mFaceLipLowerLeft"
+ offset = "0.0 0.00 -0.03"
+ scale = "0.0 0.0 0.0" />
+
+ <bone
+ name = "mFaceLipLowerRight"
+ offset = "0.0 0.00 -0.03"
+ scale = "0.0 0.0 0.0" />
+
+ <bone
+ name = "mFaceLipLowerCenter"
+ offset = "0.0 0.00 -0.03"
+ scale = "0.0 0.0 0.0" />
+
+ <bone
+ name = "mFaceTongueBase"
+ offset = "0.0 0.00 -0.03"
+ scale = "0.0 0.0 0.0" />
+
+ <bone
+ name = "mFaceChin"
+ offset = "0.0 0.00 -0.03"
+ scale = "0.0 0.0 0.0" />
+
+ </param_skeleton>
+ </param>
+
+
+ <param
+ id="30665"
+ group="1"
+ name="Jaw_Jut"
+ value_min="-2"
+ value_max="2">
+ <param_skeleton>
+ <bone
+ name = "mFaceJaw"
+ offset = "0.0085 0.00 0"
+ scale = "0.0 0.0 0.0" />
+
+ <bone
+ name = "mFaceTeethLower"
+ offset = "0.008 0 0"
+ scale = "0.0 0.0 0.0" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30006"
+ group="1"
+ name="Bulbous_Nose_Tip"
+ value_min="-1"
+ value_max="1.5">
+ <param_skeleton>
+ <bone
+ name = "mFaceNoseCenter"
+ offset = "0.0 0.00 0.0"
+ scale = "0.1 0.1 0.1" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30007"
+ group="1"
+ name="Weak_Chin"
+ value_min="-.5"
+ value_max=".5">
+ <param_skeleton>
+ <bone
+ name = "mFaceChin"
+ offset = "-0.025 0.00 0.005"
+ scale = "0.0 0.0 0.0" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="40007"
+ group="1"
+ name="Weak_Chin"
+ value_min="-.5"
+ value_max=".5">
+ <param_skeleton>
+ <bone
+ name = "mFaceChin"
+ offset = "-0.025 0.00 0.005"
+ scale = "0.0 0.0 0.0" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30008"
+ group="1"
+ name="Double_Chin"
+ value_min="-.5"
+ value_max="1.5">
+ <param_skeleton>
+ <bone
+ name = "mFaceChin"
+ offset = "-0.002 0.0 -0.01"
+ scale = "0.0 0.0 0.0" />
+
+ </param_skeleton>
+ </param>
+
+
+ <param
+ id="30024"
+ group="1"
+ name="Wide_Eyes"
+ value_min="-1.5"
+ value_max="2">
+ <param_skeleton>
+
+ <bone
+ name="mFaceEyeLidUpperLeft"
+ scale="0 0 0"
+ offset="0 0 .003" />
+
+ <bone
+ name="mFaceEyeLidUpperRight"
+ scale="0 0 0"
+ offset="0 0 .003" />
+
+ <bone
+ name="mFaceEyeLidLowerLeft"
+ scale="0 0 0"
+ offset="0 0 -.003" />
+
+ <bone
+ name="mFaceEyeLidLowerRight"
+ scale="0 0 0"
+ offset="0 0 -.003" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30650"
+ group="1"
+ name="Eyelid_Corner_Up"
+ value_min="-1.3"
+ value_max="1.2">
+ <param_skeleton>
+ <bone
+ name="mFaceEyebrowOuterLeft"
+ scale="0 0 0"
+ offset="0 0 .004" />
+
+ <bone
+ name="mFaceEyebrowOuterRight"
+ scale="0 0 0"
+ offset="0 0 .004" />
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30880"
+ group="1"
+ name="Eyelid_Inner_Corner_Up"
+ value_min="-1.3"
+ value_max="1.2">
+ <param_skeleton>
+ <bone
+ name="mFaceEyecornerInnerLeft"
+ scale="0 0 0"
+ offset="0 0 .004" />
+
+ <bone
+ name="mFaceEyecornerInnerRight"
+ scale="0 0 0"
+ offset="0 0 .004" />
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30765"
+ group="1"
+ name="Puffy_Lower_Lids"
+ value_min="-.3"
+ value_max="2.5">
+ <param_skeleton>
+
+ <bone
+ name="mFaceEyeLidLowerLeft"
+ scale="0.05 0.05 0.05"
+ offset="0 0 .0003" />
+
+ <bone
+ name="mFaceEyeLidLowerRight"
+ scale="0.05 0.05 0.05"
+ offset="0 0 .0003" />
+
+ <bone
+ name="mFaceEyecornerInnerLeft"
+ scale="0.05 0.05 0.05"
+ offset="0 0 0" />
+
+ <bone
+ name="mFaceEyecornerInnerRight"
+ scale="0.05 0.05 0.05"
+ offset="0 0 0" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="31629"
+ group="1"
+ name="Forehead Angle"
+ value_min="0"
+ value_max="1">
+ <param_skeleton>
+
+ <bone
+ name="mFaceForeheadLeft"
+ scale="0 0 0.08"
+ offset="0.02 0 0" />
+
+ <bone
+ name="mFaceForeheadCenter"
+ scale="0.01 0 0.08"
+ offset="0.002 0 0" />
+
+ <bone
+ name="mFaceForeheadRight"
+ scale="0 0 0.08"
+ offset="0.02 0 0" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="41629"
+ group="1"
+ name="Forehead Angle"
+ value_min="0"
+ value_max="1">
+ <param_skeleton>
+
+ <bone
+ name="mFaceForeheadLeft"
+ scale="0 0 0.08"
+ offset="0.02 0 0" />
+
+ <bone
+ name="mFaceForeheadCenter"
+ scale="0.01 0 0.08"
+ offset="0.002 0 0" />
+
+ <bone
+ name="mFaceForeheadRight"
+ scale="0 0 0.08"
+ offset="0.02 0 0" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30647"
+ group="1"
+ name="Squash_Stretch_Head"
+ value_min="-0.5"
+ value_max="1"
+ value_default="0">
+ <param_skeleton>
+
+ <bone
+ name="mFaceRoot"
+ scale="0 -0.07 0.07"
+ offset="0 0 -0.005" />
+
+ <bone
+ name="mFaceEyeLidLowerRight"
+ scale="0 0 0"
+ offset="0 -0.0033 0.0025" />
+
+ <bone
+ name="mFaceEyeLidUpperRight"
+ scale="0 0 0"
+ offset="0 -0.0033 0.002" />
+
+ <bone
+ name="mFaceEyecornerInnerRight"
+ scale="0 0 0"
+ offset="0 -0.0017 0.0025" />
+
+ <bone
+ name="mFaceEyebrowOuterRight"
+ scale="0 0 0"
+ offset="0 -0.004 0.0014" />
+
+ <bone
+ name="mFaceEyebrowCenterRight"
+ scale="0 0 0"
+ offset="0 -0.00377 0.00061" />
+
+ <bone
+ name="mFaceEyebrowInnerRight"
+ scale="0 0 0"
+ offset="0 -0.00225 0.001" />
+
+ <bone
+ name="mFaceLipUpperRight"
+ scale="0 0 0"
+ offset="0 -0.0014 0.007" />
+ <bone
+ name="mFaceLipUpperCenter"
+ scale="0 0 0"
+ offset="0 0 0.007" />
+
+ <bone
+ name="mFaceTeethUpper"
+ scale="0 0 0"
+ offset="0 0 0.007" />
+
+ <bone
+ name="mFaceLipLowerRight"
+ scale="0 0 0"
+ offset="0 0 0.0005" />
+ <bone
+ name="mFaceLipCornerRight"
+ scale="0 0 0"
+ offset="0 -0.00225 0.0075" />
+
+ <bone
+ name="mFaceEyeLidLowerLeft"
+ scale="0 0 0"
+ offset="0 0.0033 0.0025" />
+
+ <bone
+ name="mFaceEyeLidUpperLeft"
+ scale="0 0 0"
+ offset="0 0.0033 0.002" />
+
+ <bone
+ name="mFaceEyecornerInnerLeft"
+ scale="0 0 0"
+ offset="0 0.0017 0.0025" />
+
+ <bone
+ name="mFaceEyebrowOuterLeft"
+ scale="0 0 0"
+ offset="0 0.004 0.0014" />
+
+ <bone
+ name="mFaceEyebrowCenterLeft"
+ scale="0 0 0"
+ offset="0 0.00377 0.00061" />
+
+ <bone
+ name="mFaceEyebrowInnerLeft"
+ scale="0 0 0"
+ offset="0 0.00225 0.001" />
+
+ <bone
+ name="mFaceLipUpperLeft"
+ scale="0 0 0"
+ offset="0 0.0014 0.007" />
+ <bone
+ name="mFaceLipLowerCenter"
+ scale="0 0 0"
+ offset="0 0 0.001" />
+ <bone
+ name="mFaceTeethLower"
+ scale="0 0 0"
+ offset="0 0 0.008" />
+ <bone
+ name="mFaceLipLowerLeft"
+ scale="0 0 0"
+ offset="0 0.000 0.0005" />
+ <bone
+ name="mFaceLipCornerLeft"
+ scale="0 0 0"
+ offset="0 0.00225 0.0075" />
+
+ <bone
+ name="mFaceTongueBase"
+ scale="0 0 0"
+ offset="0 0 0.00" />
+
+ <bone
+ name="mFaceJaw"
+ scale="0 0 0"
+ offset="0 0 0.0085" />
+
+ <bone
+ name="mFaceCheekLowerRight"
+ scale="0 0 0"
+ offset="0 0 0.0085" />
+ <bone
+ name="mFaceCheekLowerLeft"
+ scale="0 0 0"
+ offset="0 0 0.0085" />
+
+ <bone
+ name="mFaceCheekUpperRight"
+ scale="0 0 0"
+ offset="0 0 0.005" />
+ <bone
+ name="mFaceCheekUpperLeft"
+ scale="0 0 0"
+ offset="0 0 0.005" />
+
+ <bone
+ name="mFaceNoseCenter"
+ scale="0 0 0"
+ offset="0 0 0.005" />
+
+ <bone
+ name="mFaceNoseRight"
+ scale="0 0 0"
+ offset="0 0 0.005" />
+
+ <bone
+ name="mFaceNoseLeft"
+ scale="0 0 0"
+ offset="0 0 0.005" />
+
+ <bone
+ name="mFaceNoseBase"
+ scale="0 0 0"
+ offset="0 0 0.006" />
+
+ </param_skeleton>
+ </param>
+ <param
+ id="40647"
+ group="1"
+ name="Squash_Stretch_Head"
+ value_min="-0.5"
+ value_max="1"
+ value_default="0">
+ <param_skeleton>
+
+ <bone
+ name="mFaceRoot"
+ scale="0 -0.07 0.07"
+ offset="0 0 -0.005" />
+
+ <bone
+ name="mFaceEyeLidLowerRight"
+ scale="0 0 0"
+ offset="0 -0.0033 0.0025" />
+
+ <bone
+ name="mFaceEyeLidUpperRight"
+ scale="0 0 0"
+ offset="0 -0.0033 0.002" />
+
+ <bone
+ name="mFaceEyecornerInnerRight"
+ scale="0 0 0"
+ offset="0 -0.0017 0.0025" />
+
+ <bone
+ name="mFaceEyebrowOuterRight"
+ scale="0 0 0"
+ offset="0 -0.004 0.0014" />
+
+ <bone
+ name="mFaceEyebrowCenterRight"
+ scale="0 0 0"
+ offset="0 -0.00377 0.00061" />
+
+ <bone
+ name="mFaceEyebrowInnerRight"
+ scale="0 0 0"
+ offset="0 -0.00225 0.001" />
+
+ <bone
+ name="mFaceLipUpperRight"
+ scale="0 0 0"
+ offset="0 -0.0014 0.007" />
+ <bone
+ name="mFaceLipUpperCenter"
+ scale="0 0 0"
+ offset="0 0 0.007" />
+
+ <bone
+ name="mFaceTeethUpper"
+ scale="0 0 0"
+ offset="0 0 0.007" />
+
+ <bone
+ name="mFaceLipLowerRight"
+ scale="0 0 0"
+ offset="0 -0.00225 0.0005" />
+ <bone
+ name="mFaceLipCornerRight"
+ scale="0 0 0"
+ offset="0 -0.00225 0.0075" />
+
+ <bone
+ name="mFaceEyeLidLowerLeft"
+ scale="0 0 0"
+ offset="0 0.0033 0.0025" />
+
+ <bone
+ name="mFaceEyeLidUpperLeft"
+ scale="0 0 0"
+ offset="0 0.0033 0.002" />
+
+ <bone
+ name="mFaceEyecornerInnerLeft"
+ scale="0 0 0"
+ offset="0 0.0017 0.0025" />
+
+ <bone
+ name="mFaceEyebrowOuterLeft"
+ scale="0 0 0"
+ offset="0 0.004 0.0014" />
+
+ <bone
+ name="mFaceEyebrowCenterLeft"
+ scale="0 0 0"
+ offset="0 0.00377 0.00061" />
+
+ <bone
+ name="mFaceEyebrowInnerLeft"
+ scale="0 0 0"
+ offset="0 0.00225 0.001" />
+
+ <bone
+ name="mFaceLipUpperLeft"
+ scale="0 0 0"
+ offset="0 0.0014 0.007" />
+ <bone
+ name="mFaceLipLowerCenter"
+ scale="0 0 0"
+ offset="0 0 0.001" />
+ <bone
+ name="mFaceTeethLower"
+ scale="0 0 0"
+ offset="0 0 0.008" />
+ <bone
+ name="mFaceLipLowerLeft"
+ scale="0 0 0"
+ offset="0 0.00225 0.0004" />
+ <bone
+ name="mFaceLipCornerLeft"
+ scale="0 0 0"
+ offset="0 0.00225 0.0075" />
+
+ <bone
+ name="mFaceTongueBase"
+ scale="0 0 0"
+ offset="0 0 0.00" />
+
+ <bone
+ name="mFaceJaw"
+ scale="0 0 0"
+ offset="0 0 0.0085" />
+
+ <bone
+ name="mFaceCheekLowerRight"
+ scale="0 0 0"
+ offset="0 0 0.0085" />
+ <bone
+ name="mFaceCheekLowerLeft"
+ scale="0 0 0"
+ offset="0 0 0.0085" />
+
+ <bone
+ name="mFaceCheekUpperRight"
+ scale="0 0 0"
+ offset="0 0 0.005" />
+ <bone
+ name="mFaceCheekUpperLeft"
+ scale="0 0 0"
+ offset="0 0 0.005" />
+
+ <bone
+ name="mFaceNoseCenter"
+ scale="0 0 0"
+ offset="0 0 0.005" />
+
+ <bone
+ name="mFaceNoseRight"
+ scale="0 0 0"
+ offset="0 0 0.005" />
+
+ <bone
+ name="mFaceNoseLeft"
+ scale="0 0 0"
+ offset="0 0 0.005" />
+
+ <bone
+ name="mFaceNoseBase"
+ scale="0 0 0"
+ offset="0 0 0.006" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="32629"
+ group="1"
+ name="Forehead Angle"
+ value_min="0"
+ value_max="1">
+ <param_skeleton>
+
+ <bone
+ name="mFaceForeheadLeft"
+ scale="0 0 0.2"
+ offset="-0.01 0 -0.01" />
+
+ <bone
+ name="mFaceForeheadCenter"
+ scale="0 0 0"
+ offset="-0.001 0 0.001" />
+
+ <bone
+ name="mFaceForeheadRight"
+ scale="0 0 0.2"
+ offset="-0.01 0 -0.01" />
+
+ <bone
+ name="mFaceEyebrowInnerRight"
+ scale="0 0 0"
+ offset="0 0 0.002" />
+
+ <bone
+ name="mFaceEyebrowInnerLeft"
+ scale="0 0 0"
+ offset="0 0 0.002" />
+
+ <bone
+ name="mFaceEyebrowCenterRight"
+ scale="0 0 0"
+ offset="0 0 0.003" />
+
+ <bone
+ name="mFaceEyebrowCenterLeft"
+ scale="0 0 0"
+ offset="0 0 0.003" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="42629"
+ group="1"
+ name="Forehead Angle"
+ value_min="0"
+ value_max="1">
+ <param_skeleton>
+
+ <bone
+ name="mFaceForeheadLeft"
+ scale="0 0 0.2"
+ offset="-0.01 0 -0.01" />
+
+ <bone
+ name="mFaceForeheadCenter"
+ scale="0 0 0"
+ offset="-0.001 0 0.001" />
+
+ <bone
+ name="mFaceForeheadRight"
+ scale="0 0 0.2"
+ offset="-0.01 0 -0.01" />
+
+ <bone
+ name="mFaceEyebrowInnerRight"
+ scale="0 0 0"
+ offset="0 0 0.002" />
+
+ <bone
+ name="mFaceEyebrowInnerLeft"
+ scale="0 0 0"
+ offset="0 0 0.002" />
+
+ <bone
+ name="mFaceEyebrowCenterRight"
+ scale="0 0 0"
+ offset="0 0 0.003" />
+
+ <bone
+ name="mFaceEyebrowCenterLeft"
+ scale="0 0 0"
+ offset="0 0 0.003" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30001"
+ group="1"
+ name="Big_Brow"
+ value_min="-.3"
+ value_max="2">
+ <param_skeleton>
+
+ <bone
+ name="mFaceForeheadCenter"
+ scale="0 0 0"
+ offset="0.007 0 0.001" />
+
+ <bone
+ name="mFaceEyebrowInnerRight"
+ scale="0.1 0 0"
+ offset="0.004 0 0" />
+
+ <bone
+ name="mFaceEyebrowInnerLeft"
+ scale="0.1 0 0"
+ offset="0.004 0 0" />
+
+ <bone
+ name="mFaceEyebrowCenterRight"
+ scale="0.1 0 0"
+ offset="0.004 0 0" />
+
+ <bone
+ name="mFaceEyebrowCenterLeft"
+ scale="0.1 0 0"
+ offset="0.004 0 0" />
+
+ <bone
+ name="mFaceEyebrowOuterRight"
+ scale="0 0 0"
+ offset="0.004 0 0" />
+
+ <bone
+ name="mFaceEyebrowOuterLeft"
+ scale="0 0 0"
+ offset="0.004 0 0" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30011"
+ group="1"
+ name="Noble_Nose_Bridge"
+ value_min="-.5"
+ value_max="1.5">
+ <param_skeleton>
+
+ <bone
+ name="mFaceNoseBridge"
+ scale="0.15 0.01 0.7"
+ offset="0.009 0 -0.006" />
+
+ <bone
+ name="mFaceForeheadCenter"
+ scale="0 0 0"
+ offset="0.001 0 0" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30758"
+ group="1"
+ name="Lower_Bridge_Nose"
+ value_min="-1.5"
+ value_max="1.5">
+ <param_skeleton>
+
+ <bone
+ name="mFaceNoseBridge"
+ scale="0 0 0.2"
+ offset="0.0025 0 -0.001" />
+
+ <bone
+ name="mFaceNoseCenter"
+ scale="0 0 0"
+ offset="0.004 0 0.001" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30027"
+ group="1"
+ name="Wide_Nose_Bridge"
+ value_min="-1.3"
+ value_max="1.2">
+ <param_skeleton>
+
+ <bone
+ name="mFaceNoseBridge"
+ scale="0 0.4 0"
+ offset="0 0 0" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30759"
+ group="1"
+ name="Low_Septum_Nose"
+ value_min="-1"
+ value_max="1.5"
+ value_default="0.5">
+ <param_skeleton>
+
+ <bone
+ name="mFaceNoseBase"
+ scale="0 0 0"
+ offset="0 0 -0.004" />
+
+ </param_skeleton>
+
+ </param>
+
+
+ <param
+ id="30010"
+ group="1"
+ name="Sunken_Cheeks"
+ value_min="-1.5"
+ value_max="3">
+ <param_skeleton>
+
+ <bone
+ name="mFaceCheekLowerLeft"
+ scale="0 0.1 0"
+ offset="0.001 -0.01 0" />
+
+ <bone
+ name="mFaceCheekLowerRight"
+ scale="0 0.1 0"
+ offset="0.001 0.01 0" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30017"
+ group="1"
+ name="Square_Jaw"
+ value_min="-0.5"
+ value_max="1">
+ <param_skeleton>
+
+ <bone
+ name="mFaceJaw"
+ scale="0.0 0.5 0.0"
+ offset="0.0 0.0 0.0" />
+
+ <bone
+ name="mFaceLipLowerRight"
+ scale="0.0 0.0 0.0"
+ offset="0.0 0.0038 0.0" />
+
+ <bone
+ name="mFaceLipLowerLeft"
+ scale="0.0 0.0 0.0"
+ offset="0.0 -0.0038 0.0" />
+
+ </param_skeleton>
+ </param>
+ <param
+ id="40017"
+ group="1"
+ name="Square_Jaw"
+ value_min="-0.5"
+ value_max="1">
+ <param_skeleton>
+
+ <bone
+ name="mFaceJaw"
+ scale="0.0 0.5 0.0"
+ offset="0.0 0.0 0.0" />
+
+ <bone
+ name="mFaceLipLowerRight"
+ scale="0.0 0.0 0.0"
+ offset="0.0 0.0038 0.0" />
+
+ <bone
+ name="mFaceLipLowerLeft"
+ scale="0.0 0.0 0.0"
+ offset="0.0 -0.0038 0.0" />
+
+ </param_skeleton>
+ </param>
+
+
+ <param
+ id="30018"
+ group="1"
+ name="Puffy_Upper_Cheeks"
+ value_min="-1.5"
+ value_max="2.5">
+ <param_skeleton>
+
+ <bone
+ name="mFaceCheekUpperLeft"
+ scale="0.15 0.1 0.1"
+ offset="0.002 0 0.0015" />
+
+ <bone
+ name="mFaceCheekUpperRight"
+ scale="0.15 0.1 0.1"
+ offset="0.002 0 0.0015" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30021"
+ group="1"
+ name="Upper_Eyelid_Fold"
+ value_min="-0.2"
+ value_max="1.3">
+ <param_skeleton>
+
+ <bone
+ name="mFaceEyeLidUpperLeft"
+ scale="0 0 0"
+ offset="0 0 -.006" />
+
+ <bone
+ name="mFaceEyeLidUpperRight"
+ scale="0 0 0"
+ offset="0 0 -.006" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30023"
+ group="1"
+ name="Baggy_Eyes"
+ value_min="-.5"
+ value_max="1.5">
+ <param_skeleton>
+
+ <bone
+ name="mFaceEyeLidLowerLeft"
+ scale="0 0 .5"
+ offset="0 0 -.001" />
+
+ <bone
+ name="mFaceEyeLidLowerRight"
+ scale="0 0 .5"
+ offset="0 0 -.001" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30014"
+ group="1"
+ name="High_Cheek_Bones"
+ value_min="-.5"
+ value_max="1">
+ <param_skeleton>
+
+ <bone
+ name="mFaceCheekUpperLeft"
+ scale="0 0 0"
+ offset="0 0 0.02" />
+
+ <bone
+ name="mFaceCheekUpperRight"
+ scale="0 0 0"
+ offset="0 0 0.02" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30019"
+ group="1"
+ name="Upturned_Nose_Tip"
+ value_min="-1.5"
+ value_max="1">
+ <param_skeleton>
+
+ <bone
+ name="mFaceNoseBase"
+ scale="0 0 0"
+ offset="0.001 0 -0.0015" />
+
+ <bone
+ name="mFaceNoseCenter"
+ scale="0 0 0"
+ offset="-0.002 0 0.004" />
+
+ <bone
+ name="mFaceNoseRight"
+ scale="0 0 0"
+ offset="0.001 0 -0.002" />
+
+ <bone
+ name="mFaceNoseLeft"
+ scale="0 0 0"
+ offset="0.001 0 -0.002" />
+
+ </param_skeleton>
+ </param>
+
+ <param
+ id="30879"
+ group="1"
+ sex="male"
+ name="Male_Package"
+ value_min="-.5"
+ value_max="2">
+ <param_skeleton>
+
+ <bone
+ name = "mGroin"
+ offset = "0.0 0.0 0.0"
+ scale = ".5 .25 .1" />
+
+ </param_skeleton>
+ </param>
+
</skeleton>
<mesh
type="hairMesh"
- lod="0"
+ lod="0"
file_name="avatar_hair.llm"
min_pixel_width="320">
<!-- begin morph targets -->
@@ -1113,7 +4122,7 @@
group="1"
name="Hair_Volume"
label="Hair Volume"
- show_simple="true"
+ show_simple="true"
wearable="hair"
clothing_morph="true"
edit_group="hair_style"
@@ -1920,95 +4929,184 @@
#############
-->
<param
- id="1"
- group="0"
+ id="20001"
+ group="1"
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">
+ value_max="2">
<param_morph />
</param>
<param
- id="2"
- group="0"
+ id="20002"
+ group="1"
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">
+ value_max="2.5">
<param_morph />
</param>
<param
- id="4"
- group="0"
+ id="20517"
+ group="1"
+ name="Wide_Nose"
+ value_min="-.5"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="20020"
+ group="1"
+ name="Bulbous_Nose"
+ value_min="-.5"
+ value_max="1.5">
+ <param_morph />
+ </param>
+
+ <param
+ id="20656"
+ group="1"
+ name="Crooked_Nose"
+ value_min="-2"
+ value_max="2">
+ <param_morph />
+ </param>
+
+ <param
+ id="20004"
+ group="1"
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">
+ value_max="1">
<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"
+ id="20653"
+ group="1"
+ name="Tall_Lips"
value_min="-1"
- value_max="1.5"
- value_default="0.5"
- camera_elevation=".1"
- camera_distance=".3"
- camera_angle="-20">
+ value_max="2">
<param_morph />
</param>
+
+ <param
+ id="20506"
+ group="1"
+ name="Mouth_Height"
+ value_min="-2"
+ value_max="2">
+ <param_morph />
+ </param>
+
+ <param
+ id="20764"
+ group="1"
+ name="Lip_Cleft_Deep"
+ value_min="-.5"
+ value_max="1.2">
+ <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"
+ id="20025"
+ group="1"
+ name="Wide_Lip_Cleft"
+ value_min="-.8"
+ value_max="1.5">
+ <param_morph/>
+ </param>
+
+ <param
+ id="20663"
+ group="1"
+ name="Shift_Mouth"
+ value_min="-2"
+ value_max="2"
+ value_default="0">
+ <param_morph />
+ </param>
+
+ <param
+ id="20035"
+ group="1"
+ name="Big_Ears"
+ value_min="-1"
+ value_max="2">
+ <param_morph/>
+ </param>
+
+ <param
+ id="20015"
+ group="1"
+ name="Ears_Out"
value_min="-.5"
- value_max="1"
- camera_elevation=".1"
- camera_distance=".3"
- camera_angle="-20">
+ value_max="1.5">
+ <param_morph/>
+ </param>
+
+ <param
+ id="20796"
+ group="1"
+ name="Pointy_Ears"
+ value_min="-.4"
+ value_max="3">
+ <param_morph />
+ </param>
+
+ <param
+ id="20185"
+ group="1"
+ name="Deep_Chin"
+ value_min="-1"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="20665"
+ group="1"
+ name="Jaw_Jut"
+ value_min="-2"
+ value_max="2">
+ <param_morph />
+ </param>
+
+ <param
+ id="20024"
+ group="1"
+ name="Wide_Eyes"
+ value_min="-1.5"
+ value_max="2">
+ <param_morph />
+ </param>
+
+ <param
+ id="20650"
+ group="1"
+ name="Eyelid_Corner_Up"
+ value_min="-1.3"
+ value_max="1.2">
+ <param_morph />
+ </param>
+
+ <param
+ id="20765"
+ group="1"
+ name="Puffy_Lower_Lids"
+ value_min="-.3"
+ value_max="2.5">
+ <param_morph />
+ </param>
+
+ <param
+ id="20759"
+ group="1"
+ name="Low_Septum_Nose"
+ value_min="-1"
+ value_max="1.5"
+ value_default="0.5">
<param_morph />
</param>
@@ -2031,111 +5129,56 @@
</param>
<param
- id="6"
- group="0"
+ id="20006"
+ group="1"
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">
+ value_max="1">
<param_morph />
</param>
<param
- id="7"
- group="0"
+ id="20007"
+ group="1"
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">
+ value_max=".5">
<param_morph />
</param>
<param
- id="8"
- group="0"
+ id="20008"
+ group="1"
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">
+ value_max="1.5">
<param_morph />
</param>
<param
- id="10"
- group="0"
+ id="20010"
+ group="1"
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">
+ value_max="3">
<param_morph />
</param>
<param
- id="11"
- group="0"
+ id="20011"
+ group="1"
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">
+ value_max="1.5">
<param_morph />
</param>
<param
- id="758"
- group="0"
+ id="20758"
+ group="1"
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">
+ value_max="1.5">
<param_morph />
</param>
@@ -2175,38 +5218,11 @@
</param>
<param
- id="14"
- group="0"
+ id="20014"
+ group="1"
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">
+ value_max="1">
<param_morph />
</param>
@@ -2229,91 +5245,38 @@
</param>
<param
- id="17"
- group="0"
+ id="20017"
+ group="1"
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">
+ value_max="1">
<param_morph />
</param>
<param
- id="18"
- group="0"
+ id="20018"
+ group="1"
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">
+ value_max="2.5">
<param_morph />
</param>
<param
- id="19"
- group="0"
+ id="20019"
+ group="1"
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">
+ value_max="1">
<param_morph />
</param>
-
+
<param
- id="21"
- group="0"
+ id="20021"
+ group="1"
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">
+ value_max="1.3">
<param_morph />
</param>
@@ -2336,88 +5299,11 @@
</param>
<param
- id="23"
- group="0"
+ id="20023"
+ group="1"
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">
+ value_max="1.5">
<param_morph />
</param>
@@ -2433,20 +5319,11 @@
</param>
<param
- id="27"
- group="0"
+ id="20027"
+ group="1"
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">
+ value_max="1.2">
<param_morph />
</param>
@@ -2517,60 +5394,6 @@
</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"
@@ -2667,24 +5490,6 @@
</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"
@@ -2726,76 +5531,14 @@
</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"
+ id="20880"
+ group="1"
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">
+ value_max="1.2">
<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="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="657"
group="1"
@@ -2899,25 +5642,6 @@
</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="664"
group="0"
name="Pop_Eye"
@@ -2936,40 +5660,12 @@
</param>
<param
- id="760"
- group="0"
+ id="20760"
+ group="1"
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="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">
+ value_default="0">
<param_morph />
</param>
@@ -3413,41 +6109,6 @@
<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"
@@ -3515,41 +6176,6 @@
<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"
@@ -3917,7 +6543,51 @@
group="1"
name="Muscular_Torso"
label="Torso Muscles"
- show_simple="true"
+ sex="male"
+ 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="107"
+ group="1"
+ name="Muscular_Torso"
+ label="Torso Muscles"
+ sex="female"
+ show_simple="true"
wearable="shape"
edit_group="shape_torso"
label_min="Regular"
@@ -5030,21 +7700,12 @@
</param>
<param
- id="879"
- group="0"
+ id="20879"
+ group="1"
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">
+ value_max="2">
<param_morph />
</param>
@@ -9384,6 +12045,825 @@ render_pass="bump">
<driver_parameters>
<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_driver>
+ <driven
+ id="20002" />
+ <driven
+ id="30002" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20004" />
+ <driven
+ id="30004" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20517" />
+ <driven
+ id="30517" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20020" />
+ <driven
+ id="30020" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20656" />
+ <driven
+ id="30656" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20653" />
+ <driven
+ id="30653" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20506" />
+ <driven
+ id="30506" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20764" />
+ <driven
+ id="30764" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20025" />
+ <driven
+ id="30025" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20663" />
+
+ <driven
+ id="31663"
+ min1="-2"
+ max1="-2"
+ max2="-2"
+ min2="0" />
+ <driven
+ id="32663"
+ min1="0"
+ max1="2"
+ max2="2"
+ min2="2" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20035" />
+ <driven
+ id="30035" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20015" />
+ <driven
+ id="30015" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20796" />
+ <driven
+ id="30796" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20185" />
+ <driven
+ id="30185" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20760" />
+ <driven
+ id="30760" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20665" />
+ <driven
+ id="30665" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20006" />
+ <driven
+ id="30006" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20007" />
+ <driven
+ id="30007" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20008" />
+ <driven
+ id="30008" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20024" />
+ <driven
+ id="30024" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20650" />
+ <driven
+ id="30650" />
+ </param_driver>
+ </param>
+
+ <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_driver>
+ <driven
+ id="20880" />
+ <driven
+ id="30880" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20021" />
+ <driven
+ id="30021" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20023" />
+ <driven
+ id="30023" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20765" />
+ <driven
+ id="30765" />
+ </param_driver>
+ </param>
+
+ <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_driver>
+ <driven
+ id="20001" />
+ <driven
+ id="30001" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20011" />
+ <driven
+ id="30011" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20758" />
+ <driven
+ id="30758" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20027" />
+ <driven
+ id="30027" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20759" />
+ <driven
+ id="30759" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20010" />
+ <driven
+ id="30010" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20017" />
+ <driven
+ id="30017" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20018" />
+ <driven
+ id="30018" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20014" />
+ <driven
+ id="30014" />
+ </param_driver>
+ </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_driver>
+ <driven
+ id="20019" />
+ <driven
+ id="30019" />
+ </param_driver>
+ </param>
+
+ <param
id="828"
group="0"
name="Loose Upper Clothing"
@@ -9807,6 +13287,20 @@ render_pass="bump">
max1="1"
max2="1"
min2="1" />
+
+ <driven
+ id="30505"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+ <driven
+ id="31505"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+
</param_driver>
</param>
@@ -9817,8 +13311,8 @@ render_pass="bump">
edit_group="shape_mouth"
edit_group_order="3.2"
name="Lip Ratio"
- label="Lip Ratio"
- show_simple="true"
+ label="Lip Ratio"
+ show_simple="true"
label_min="More Upper Lip"
label_max="More Lower Lip"
value_min="0"
@@ -9841,6 +13335,21 @@ render_pass="bump">
max1="1"
max2="1"
min2="1" />
+
+ <driven
+ id="30797"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="30798"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+
</param_driver>
</param>
@@ -9866,6 +13375,10 @@ render_pass="bump">
<driven
id="30" />
+
+ <driven
+ id="30155" />
+
</param_driver>
</param>
@@ -10548,6 +14061,21 @@ render_pass="bump">
max1="1"
max2="1"
min2="1" />
+
+ <driven
+ id="31629"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="32629"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
+
</param_driver>
</param>
@@ -10574,6 +14102,29 @@ render_pass="bump">
<driven
id="186" />
+
+ <driven
+ min1="-1.3"
+ max1="-1.3"
+ max2="-1.3"
+ min2="1"
+ id="40017" />
+
+ <driven
+ id="40185" />
+
+ <driven
+ id="41629" />
+
+ <driven
+ id="42629" />
+
+ <driven
+ id="40007" />
+
+ <driven
+ id="40647" />
+
</param_driver>
</param>
@@ -10600,6 +14151,10 @@ render_pass="bump">
<driven
id="187" />
+
+ <driven
+ id="30647" />
+
</param_driver>
</param>
@@ -10630,7 +14185,7 @@ render_pass="bump">
min2=".5" />
<driven
- id="106"
+ id="107"
min1=".5"
max1="1"
max2="1"
@@ -10759,7 +14314,22 @@ render_pass="bump">
max1="1"
max2="1"
min2="1" />
+
+ <driven
+ id="30658"
+ min1="0"
+ max1="0"
+ max2="0"
+ min2=".5" />
+
+ <driven
+ id="30657"
+ min1=".5"
+ max1="1"
+ max2="1"
+ min2="1" />
</param_driver>
+
</param>
<param
@@ -10822,7 +14392,7 @@ render_pass="bump">
edit_group="shape_head"
edit_group_order="1"
name="Head Size"
- label="Head Size"
+ label="Head Size"
label_min="Small Head"
label_max="Big Head"
show_simple="true"
@@ -10856,13 +14426,13 @@ render_pass="bump">
edit_group="shape_eyes"
edit_group_order="1"
name="Eye Size"
- label="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"
+ show_simple="true"
camera_elevation=".1"
camera_distance=".35">
<param_driver>
@@ -11169,6 +14739,31 @@ render_pass="bump">
</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_driver>
+ <driven
+ id="20879" />
+
+ <driven
+ id="30879" />
+ </param_driver>
+ </param>
+
+ <param
id="841"
group="0"
name="Bowed_Legs"
diff --git a/indra/newview/character/avatar_skeleton.xml b/indra/newview/character/avatar_skeleton.xml
index 6b07bbc1d3..350ba7b841 100644
--- a/indra/newview/character/avatar_skeleton.xml
+++ b/indra/newview/character/avatar_skeleton.xml
@@ -1,81 +1,229 @@
-<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
-<linden_skeleton version="1.0" num_bones="53" num_collision_volumes="26">
-<bone name="mPelvis" pos="0.000 0.000 1.067" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.000000 1.067015">
- <collision_volume name="PELVIS" pos = "-0.01 0 -0.02" rot="0.000000 8.00000 0.000000" scale="0.12 0.16 0.17"/>
- <collision_volume name="BUTT" pos = "-0.06 0 -0.1" rot="0.000000 0.00000 0.000000" scale="0.1 0.1 0.1"/>
- <bone name="mTorso" pos="0.000 0.000 0.084" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.000000 0.084073">
- <collision_volume name="BELLY" pos = "0.028 0 0.04" rot="0.000000 8.00000 0.000000" scale="0.09 0.13 0.15"/>
- <collision_volume name="LOWER_BACK" pos = "0.0 0.0 0.023" rot="0.000000 0.00000 0.000000" scale="0.09 0.13 0.15"/>
- <collision_volume name="LEFT_HANDLE" pos = "0.0 0.10 0.058" rot="0.000000 0.00000 0.000000" scale="0.05 0.05 0.05"/>
- <collision_volume name="RIGHT_HANDLE" pos = "0.0 -0.10 0.058" rot="0.000000 0.00000 0.000000" scale="0.05 0.05 0.05"/>
- <bone name="mChest" pos="-0.015 0.000 0.205" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.015368 0.000000 0.204877">
- <collision_volume name="CHEST" pos = "0.028 0 0.07" rot="0.000000 -10.00000 0.000000" scale="0.11 0.15 0.2"/>
- <collision_volume name="UPPER_BACK" pos = "0.0 0.0 0.017" rot="0.000000 0.00000 0.000000" scale="0.09 0.13 0.15"/>
- <collision_volume name="LEFT_PEC" pos = "0.119 0.082 0.042" rot="0.000000 4.29000 0.000000" scale="0.05 0.05 0.05"/>
- <collision_volume name="RIGHT_PEC" pos = "0.119 -0.082 0.042" rot="0.000000 4.29000 0.000000" scale="0.05 0.05 0.05"/>
- <bone name="mNeck" pos="-0.010 0.000 0.251" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.009507 0.000000 0.251108">
- <collision_volume name="NECK" pos = "0.0 0 0.02" rot="0.000000 0.000000 0.000000" scale="0.05 0.06 0.08"/>
- <bone name="mHead" pos="0.000 -0.000 0.076" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 -0.000000 0.075630">
- <collision_volume name="HEAD" pos = "0.02 0 0.07" rot="0.000000 0.000000 0.000000" scale="0.11 0.09 0.12"/>
- <bone name="mSkull" pos="0.000 0.000 0.079" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.000000 0.079000">
- </bone>
- <bone name="mEyeRight" pos="0.098 -0.036 0.079" rot="0.000000 0.000000 -0.000000" scale="1.000 1.000 1.000" pivot="0.098466 -0.036000 0.079000">
- </bone>
- <bone name="mEyeLeft" pos="0.098 0.036 0.079" rot="0.000000 -0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.098461 0.036000 0.079000">
- </bone>
- </bone>
- </bone>
- <bone name="mCollarLeft" pos="-0.021 0.085 0.165" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.020927 0.084665 0.165396">
- <collision_volume name="L_CLAVICLE" pos = "0.02 0 0.02" rot="0.000000 0.00000 0.000000" scale="0.07 0.14 0.05"/>
- <bone name="mShoulderLeft" pos="0.000 0.079 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.079000 -0.000000">
- <collision_volume name="L_UPPER_ARM" pos = "0.0 0.12 0.01" rot="-5.000000 0.00000 0.000000" scale="0.05 0.17 0.05"/>
- <bone name="mElbowLeft" pos="0.000 0.248 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.248000 0.000000">
- <collision_volume name="L_LOWER_ARM" pos = "0.0 0.1 0.0" rot="-3.000000 0.00000 0.000000" scale="0.04 0.14 0.04"/>
- <bone name="mWristLeft" pos="-0.000 0.205 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000000 0.204846 0.000000">
- <collision_volume name="L_HAND" pos = "0.01 0.05 0.0" rot="-3.000000 0.00000 -10.000000" scale="0.05 0.08 0.03"/>
- </bone>
- </bone>
- </bone>
- </bone>
- <bone name="mCollarRight" pos="-0.021 -0.085 0.165" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.020927 -0.085000 0.165396">
- <collision_volume name="R_CLAVICLE" pos = "0.02 0 0.02" rot="0.000000 0.00000 0.000000" scale="0.07 0.14 0.05"/>
- <bone name="mShoulderRight" pos="0.000 -0.079 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 -0.079418 -0.000000">
- <collision_volume name="R_UPPER_ARM" pos = "0.0 -0.12 0.01" rot="5.000000 0.00000 0.000000" scale="0.05 0.17 0.05"/>
- <bone name="mElbowRight" pos="0.000 -0.248 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 -0.248000 -0.000000">
- <collision_volume name="R_LOWER_ARM" pos = "0.0 -0.1 0.0" rot="3.000000 0.00000 0.000000" scale="0.04 0.14 0.04"/>
- <bone name="mWristRight" pos="0.000 -0.205 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000000 -0.205000 -0.000000">
- <collision_volume name="R_HAND" pos = "0.01 -0.05 0.0" rot="3.000000 0.00000 10.000000" scale="0.05 0.08 0.03"/>
- </bone>
- </bone>
- </bone>
- </bone>
- </bone>
- </bone>
- <bone name="mHipRight" pos="0.034 -0.129 -0.041" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.033620 -0.128806 -0.041086">
- <collision_volume name="R_UPPER_LEG" pos = "-0.02 0.05 -0.22" rot="0.000000 0.00000 0.000000" scale="0.09 0.09 0.32"/>
- <bone name="mKneeRight" pos="-0.001 0.049 -0.491" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000780 0.048635 -0.490922">
- <collision_volume name="R_LOWER_LEG" pos = "-0.02 0.0 -0.2" rot="0.000000 0.00000 0.000000" scale="0.06 0.06 0.25"/>
- <bone name="mAnkleRight" pos="-0.029 0.000 -0.468" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.028869 0.000000 -0.468494">
- <collision_volume name="R_FOOT" pos = "0.077 0.0 -0.041" rot="0.000000 10.00000 0.000000" scale="0.13 0.05 0.05"/>
- <bone name="mFootRight" pos="0.112 -0.000 -0.061" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.111956 -0.000000 -0.060637">
- <bone name="mToeRight" pos="0.109 0.000 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.105399 -0.010408 -0.000104">
- </bone>
- </bone>
- </bone>
- </bone>
- </bone>
- <bone name="mHipLeft" pos="0.034 0.127 -0.041" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.033757 0.126765 -0.040998">
- <collision_volume name="L_UPPER_LEG" pos = "-0.02 -0.05 -0.22" rot="0.000000 0.00000 0.000000" scale="0.09 0.09 0.32"/>
- <bone name="mKneeLeft" pos="-0.001 -0.046 -0.491" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000887 -0.045568 -0.491053">
- <collision_volume name="L_LOWER_LEG" pos = "-0.02 0.0 -0.2" rot="0.000000 0.00000 0.000000" scale="0.06 0.06 0.25"/>
- <bone name="mAnkleLeft" pos="-0.029 0.001 -0.468" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.028887 0.001378 -0.468449">
- <collision_volume name="L_FOOT" pos = "0.077 0.0 -0.041" rot="0.000000 10.00000 0.000000" scale="0.13 0.05 0.05"/>
- <bone name="mFootLeft" pos="0.112 -0.000 -0.061" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.111956 -0.000000 -0.060620">
- <bone name="mToeLeft" pos="0.109 0.000 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.105387 0.008270 0.000871">
- </bone>
- </bone>
- </bone>
- </bone>
- </bone>
-</bone>
-</linden_skeleton> \ No newline at end of file
+<linden_skeleton num_bones="132" num_collision_volumes="26" version="2.0">
+ <bone aliases="hip avatar_mPelvis" connected="false" end="0.000 0.000 0.084" group="Torso" name="mPelvis" pivot="0.000000 0.000000 1.067015" pos="0.000 0.000 1.067" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="0.030 0.000 0.095" group="Collision" name="PELVIS" pos="-0.01 0 -0.02" rot="0.000000 8.00000 0.000000" scale="0.12 0.16 0.17" support="base"/>
+ <collision_volume end="-0.100 0.000 0.000" group="Collision" name="BUTT" pos="-0.06 0 -0.1" rot="0.000000 0.00000 0.000000" scale="0.1 0.1 0.1" support="base"/>
+ <bone connected="true" end="0.000 0.000 -0.084" group="Spine" name="mSpine1" pivot="0.000000 0.000000 0.084073" pos="0.000 0.000 0.084" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="0.000 0.000 0.084" group="Spine" name="mSpine2" pivot="0.000000 0.000000 -0.084073" pos="0.000 0.000 -0.084" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended">
+ <bone aliases="abdomen avatar_mTorso" connected="true" end="-0.015 0.000 0.205" group="Torso" name="mTorso" pivot="0.000000 0.000000 0.084073" pos="0.000 0.000 0.084" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="0.028 0.000 0.094" group="Collision" name="BELLY" pos="0.028 0 0.04" rot="0.000000 8.00000 0.000000" scale="0.09 0.13 0.15" support="base"/>
+ <collision_volume end="0.000 0.100 0.000" group="Collision" name="LEFT_HANDLE" pos="0.0 0.10 0.058" rot="0.000000 0.00000 0.000000" scale="0.05 0.05 0.05" support="base"/>
+ <collision_volume end="0.000 -0.100 0.000" group="Collision" name="RIGHT_HANDLE" pos="0.0 -0.10 0.058" rot="0.000000 0.00000 0.000000" scale="0.05 0.05 0.05" support="base"/>
+ <collision_volume end="-0.100 0.000 0.000" group="Collision" name="LOWER_BACK" pos="0.0 0.0 0.023" rot="0.000000 0.00000 0.000000" scale="0.09 0.13 0.15" support="base"/>
+ <bone connected="true" end="0.015 0.000 -0.205" group="Spine" name="mSpine3" pivot="-0.015368 0.000000 0.204877" pos="-0.015 0.000 0.205" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.015 0.000 0.205" group="Spine" name="mSpine4" pivot="0.015368 0.000000 -0.204877" pos="0.015 0.000 -0.205" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended">
+ <bone aliases="chest avatar_mChest" connected="true" end="-0.010 0.000 0.250" group="Torso" name="mChest" pivot="-0.015368 0.000000 0.204877" pos="-0.015 0.000 0.205" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="-0.096 0.000 0.152" group="Collision" name="CHEST" pos="0.028 0 0.07" rot="0.000000 -10.00000 0.000000" scale="0.11 0.15 0.2" support="base"/>
+ <collision_volume end="0.080 0.000 -0.006" group="Collision" name="LEFT_PEC" pos="0.119 0.082 0.042" rot="0.000000 4.29000 0.000000" scale="0.05 0.05 0.05" support="base"/>
+ <collision_volume end="0.080 0.000 -0.006" group="Collision" name="RIGHT_PEC" pos="0.119 -0.082 0.042" rot="0.000000 4.29000 0.000000" scale="0.05 0.05 0.05" support="base"/>
+ <collision_volume end="-0.100 0.000 0.000" group="Collision" name="UPPER_BACK" pos="0.0 0.0 0.017" rot="0.000000 0.00000 0.000000" scale="0.09 0.13 0.15" support="base"/>
+ <bone aliases="neck avatar_mNeck" connected="true" end="0.000 0.000 0.077" group="Torso" name="mNeck" pivot="-0.009507 0.000000 0.251108" pos="-0.010 0.000 0.251" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="0.000 0.000 0.080" group="Collision" name="NECK" pos="0.0 0 0.02" rot="0.000000 0.000000 0.000000" scale="0.05 0.06 0.08" support="base"/>
+ <bone aliases="head avatar_mHead" connected="true" end="0.000 0.000 0.079" group="Torso" name="mHead" pivot="0.000000 -0.000000 0.075630" pos="0.000 -0.000 0.076" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="0.000 0.000 0.100" group="Collision" name="HEAD" pos="0.02 0 0.07" rot="0.000000 0.000000 0.000000" scale="0.11 0.09 0.12" support="base"/>
+ <bone aliases="figureHair avatar_mSkull" connected="false" end="0.000 0.000 0.033" group="Extra" name="mSkull" pivot="0.000000 0.000000 0.079000" pos="0.000 0.000 0.079" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base"/>
+ <bone aliases="avatar_mEyeRight" connected="false" end="0.100 0.000 0.000" group="Extra" name="mEyeRight" pivot="0.098466 -0.036000 0.079000" pos="0.098 -0.036 0.079" rot="0.000000 0.000000 -0.000000" scale="1.000 1.000 1.000" support="base"/>
+ <bone aliases="avatar_mEyeLeft" connected="false" end="0.100 0.000 0.000" group="Extra" name="mEyeLeft" pivot="0.098461 0.036000 0.079000" pos="0.098 0.036 0.079" rot="0.000000 -0.000000 0.000000" scale="1.000 1.000 1.000" support="base"/>
+ <bone connected="false" end="0.100 0.000 0.000" group="Face" name="mFaceEyeAltRight" pivot="0.098466 -0.036000 0.079000" pos="0.098 -0.036 0.079" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.100 0.000 0.000" group="Face" name="mFaceEyeAltLeft" pivot="0.098461 0.036000 0.079000" pos="0.098 0.036 0.079" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.020 0.000 0.000" group="Face" name="mFaceRoot" pivot="0.025 0.000 0.045" pos="0.025 0.000 0.045" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="false" end="0.024 0.004 0.018" group="Face" name="mFaceForeheadLeft" pivot="0.061 0.035 0.083" pos="0.061 0.035 0.083" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.024 -0.004 0.018" group="Face" name="mFaceForeheadRight" pivot="0.061 -0.035 0.083" pos="0.061 -0.035 0.083" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.023 0.013 0.000" group="Eyes" name="mFaceEyebrowOuterLeft" pivot="0.064 0.051 0.048" pos="0.064 0.051 0.048" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.027 0.000 0.000" group="Eyes" name="mFaceEyebrowCenterLeft" pivot="0.070 0.043 0.056" pos="0.070 0.043 0.056" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.026 0.000 0.000" group="Eyes" name="mFaceEyebrowInnerLeft" pivot="0.075 0.022 0.051" pos="0.075 0.022 0.051" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.023 -0.013 0.000" group="Eyes" name="mFaceEyebrowOuterRight" pivot="0.064 -0.051 0.048" pos="0.064 -0.051 0.048" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.027 0.000 0.000" group="Eyes" name="mFaceEyebrowCenterRight" pivot="0.070 -0.043 0.056" pos="0.070 -0.043 0.056" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.026 0.000 0.000" group="Eyes" name="mFaceEyebrowInnerRight" pivot="0.075 -0.022 0.051" pos="0.075 -0.022 0.051" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.038 0.000 0.000" group="Eyes" name="mFaceEyeLidUpperLeft" pivot="0.062 0.036 0.039" pos="0.062 0.036 0.039" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.036 0.000 0.000" group="Eyes" name="mFaceEyeLidLowerLeft" pivot="0.061 0.036 0.027" pos="0.061 0.036 0.027" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.038 0.000 0.000" group="Eyes" name="mFaceEyeLidUpperRight" pivot="0.062 -0.036 0.039" pos="0.062 -0.036 0.039" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.036 0.000 0.000" group="Eyes" name="mFaceEyeLidLowerRight" pivot="0.061 -0.036 0.027" pos="0.061 -0.036 0.027" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="-0.019 0.018 0.025" group="Ears" name="mFaceEar1Left" pivot="0.000 0.080 0.002" pos="0.000 0.080 0.002" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="0.000 0.000 0.033" group="Ears" name="mFaceEar2Left" pivot="-0.019 0.018 0.025" pos="-0.019 0.018 0.025" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ <bone connected="false" end="-0.019 -0.018 0.025" group="Ears" name="mFaceEar1Right" pivot="0.000 -0.080 0.002" pos="0.000 -0.080 0.002" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="0.000 0.000 0.033" group="Ears" name="mFaceEar2Right" pivot="-0.019 -0.018 0.025" pos="-0.019 -0.018 0.025" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ <bone connected="false" end="0.015 0.004 0.000" group="Face" name="mFaceNoseLeft" pivot="0.086 0.015 -0.004" pos="0.086 0.015 -0.004" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.025 0.000 0.000" group="Face" name="mFaceNoseCenter" pivot="0.102 0.000 0.000" pos="0.102 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.015 -0.004 0.000" group="Face" name="mFaceNoseRight" pivot="0.086 -0.015 -0.004" pos="0.086 -0.015 -0.004" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.013 0.030 0.000" group="Face" name="mFaceCheekLowerLeft" pivot="0.050 0.034 -0.031" pos="0.050 0.034 -0.031" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.022 0.015 0.001" group="Face" name="mFaceCheekUpperLeft" pivot="0.070 0.034 -0.005" pos="0.070 0.034 -0.005" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.013 -0.030 0.000" group="Face" name="mFaceCheekLowerRight" pivot="0.050 -0.034 -0.031" pos="0.050 -0.034 -0.031" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.022 -0.015 0.001" group="Face" name="mFaceCheekUpperRight" pivot="0.070 -0.034 -0.005" pos="0.070 -0.034 -0.005" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.048 0.003 0.000" group="Lips" name="mFaceLipUpperLeft" pivot="0.058 0.012 -0.033" pos="0.058 0.012 -0.033" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.048 -0.003 0.000" group="Lips" name="mFaceLipUpperRight" pivot="0.058 -0.012 -0.033" pos="0.058 -0.012 -0.033" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.045 0.008 0.000" group="Lips" name="mFaceLipCornerLeft" pivot="0.048 0.024 -0.040" pos="0.048 0.024 -0.040" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.045 -0.008 0.000" group="Lips" name="mFaceLipCornerRight" pivot="0.048 -0.024 -0.040" pos="0.048 -0.024 -0.040" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.044 0.000 -0.021" group="Mouth" name="mFaceJaw" pivot="0.020 0.000 -0.037" pos="0.020 0.000 -0.037" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="0.020 0.000 0.008" group="Mouth" name="mFaceTongueBase" pivot="0.044 0.000 -0.021" pos="0.044 0.000 -0.021" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="0.007 0.000 0.003" group="Mouth" name="mFaceTongueTip" pivot="0.020 0.000 0.008" pos="0.020 0.000 0.008" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ <bone connected="false" end="0.047 0.003 0.000" group="Lips" name="mFaceLipLowerLeft" pivot="0.032 0.014 -0.012" pos="0.032 0.014 -0.012" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.047 -0.003 0.000" group="Lips" name="mFaceLipLowerRight" pivot="0.032 -0.014 -0.012" pos="0.032 -0.014 -0.012" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.048 0.000 0.000" group="Lips" name="mFaceLipLowerCenter" pivot="0.037 0.000 -0.017" pos="0.037 0.000 -0.017" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.021 0.000 -0.018" group="Mouth" name="mFaceChin" pivot="0.053 0.000 -0.032" pos="0.053 0.000 -0.032" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ <bone connected="false" end="0.036 0.000 0.000" group="Face" name="mFaceForeheadCenter" pivot="0.069 0.000 0.065" pos="0.069 0.000 0.065" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.048 0.000 0.000" group="Lips" name="mFaceLipUpperCenter" pivot="0.060 0.000 -0.030" pos="0.060 0.000 -0.030" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.014 0.000 0.000" group="Nose" name="mFaceNoseBase" pivot="0.094 0.000 -0.016" pos="0.094 0.000 -0.016" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.061 0.000 -0.010" group="Mouth" name="mFaceTeethLower" pivot="0.020 0.000 -0.044" pos="0.020 0.000 -0.044" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.061 0.000 0.000" group="Mouth" name="mFaceTeethUpper" pivot="0.020 0.000 -0.030" pos="0.020 0.000 -0.030" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.016 0.000 0.000" group="Face" name="mFaceEyecornerInnerLeft" pivot="0.075 0.017 0.032" pos="0.075 0.017 0.032" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.016 0.000 0.000" group="Face" name="mFaceEyecornerInnerRight" pivot="0.075 -0.017 0.032" pos="0.075 -0.017 0.032" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="0.015 0.000 0.008" group="Nose" name="mFaceNoseBridge" pivot="0.091 0.000 0.020" pos="0.091 0.000 0.020" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ </bone>
+ </bone>
+ <bone aliases="lCollar avatar_mCollarLeft" connected="false" end="0.000 0.079 0.000" group="Arms" name="mCollarLeft" pivot="-0.020927 0.084665 0.165396" pos="-0.021 0.085 0.165" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="0.000 0.100 0.000" group="Collision" name="L_CLAVICLE" pos="0.02 0 0.02" rot="0.000000 0.00000 0.000000" scale="0.07 0.14 0.05" support="base"/>
+ <bone aliases="lShldr avatar_mShoulderLeft" connected="true" end="0.000 0.247 0.000" group="Arms" name="mShoulderLeft" pivot="0.000000 0.079000 -0.000000" pos="0.000 0.079 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="0.000 0.130 -0.003" group="Collision" name="L_UPPER_ARM" pos="0.0 0.12 0.01" rot="-5.000000 0.00000 0.000000" scale="0.05 0.17 0.05" support="base"/>
+ <bone aliases="lForeArm avatar_mElbowLeft" connected="true" end="0.000 0.205 0.000" group="Arms" name="mElbowLeft" pivot="0.000000 0.248000 0.000000" pos="0.000 0.248 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="0.000 0.100 -0.001" group="Collision" name="L_LOWER_ARM" pos="0.0 0.1 0.0" rot="-3.000000 0.00000 0.000000" scale="0.04 0.14 0.04" support="base"/>
+ <bone aliases="lHand avatar_mWristLeft" connected="true" end="0.000 0.060 0.000" group="Arms" name="mWristLeft" pivot="-0.000000 0.204846 0.000000" pos="-0.000 0.205 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="0.005 0.049 -0.001" group="Collision" name="L_HAND" pos="0.01 0.05 0.0" rot="-3.000000 0.00000 -10.000000" scale="0.05 0.08 0.03" support="base"/>
+ <bone connected="false" end="-0.001 0.040 -0.006" group="Hand" name="mHandMiddle1Left" pivot="0.013 0.101 0.015" pos="0.013 0.101 0.015" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.001 0.049 -0.008" group="Hand" name="mHandMiddle2Left" pivot="-0.001 0.040 -0.006" pos="-0.001 0.040 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.002 0.033 -0.006" group="Hand" name="mHandMiddle3Left" pivot="-0.001 0.049 -0.008" pos="-0.001 0.049 -0.008" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ </bone>
+ <bone connected="false" end="0.017 0.036 -0.006" group="Hand" name="mHandIndex1Left" pivot="0.038 0.097 0.015" pos="0.038 0.097 0.015" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="0.014 0.032 -0.006" group="Hand" name="mHandIndex2Left" pivot="0.017 0.036 -0.006" pos="0.017 0.036 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="0.011 0.025 -0.004" group="Hand" name="mHandIndex3Left" pivot="0.014 0.032 -0.006" pos="0.014 0.032 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ </bone>
+ <bone connected="false" end="-0.013 0.038 -0.008" group="Hand" name="mHandRing1Left" pivot="-0.010 0.099 0.009" pos="-0.010 0.099 0.009" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.013 0.040 -0.009" group="Hand" name="mHandRing2Left" pivot="-0.013 0.038 -0.008" pos="-0.013 0.038 -0.008" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.010 0.028 -0.006" group="Hand" name="mHandRing3Left" pivot="-0.013 0.040 -0.009" pos="-0.013 0.040 -0.009" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ </bone>
+ <bone connected="false" end="-0.024 0.025 -0.006" group="Hand" name="mHandPinky1Left" pivot="-0.031 0.095 0.003" pos="-0.031 0.095 0.003" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.015 0.018 -0.004" group="Hand" name="mHandPinky2Left" pivot="-0.024 0.025 -0.006" pos="-0.024 0.025 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.013 0.016 -0.004" group="Hand" name="mHandPinky3Left" pivot="-0.015 0.018 -0.004" pos="-0.015 0.018 -0.004" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ </bone>
+ <bone connected="false" end="0.028 0.032 -0.001" group="Hand" name="mHandThumb1Left" pivot="0.031 0.026 0.004" pos="0.031 0.026 0.004" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="0.023 0.031 -0.001" group="Hand" name="mHandThumb2Left" pivot="0.028 0.032 -0.001" pos="0.028 0.032 -0.001" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="0.015 0.025 0.001" group="Hand" name="mHandThumb3Left" pivot="0.023 0.031 -0.001" pos="0.023 0.031 -0.001" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+ <bone aliases="rCollar avatar_mCollarRight" connected="false" end="0.000 -0.079 0.000" group="Arms" name="mCollarRight" pivot="-0.020927 -0.085000 0.165396" pos="-0.021 -0.085 0.165" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="0.000 -0.100 0.000" group="Collision" name="R_CLAVICLE" pos="0.02 0 0.02" rot="0.000000 0.00000 0.000000" scale="0.07 0.14 0.05" support="base"/>
+ <bone aliases="rShldr avatar_mShoulderRight" connected="true" end="0.000 -0.247 0.000" group="Arms" name="mShoulderRight" pivot="0.000000 -0.079418 -0.000000" pos="0.000 -0.079 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="0.000 -0.130 -0.003" group="Collision" name="R_UPPER_ARM" pos="0.0 -0.12 0.01" rot="5.000000 0.00000 0.000000" scale="0.05 0.17 0.05" support="base"/>
+ <bone aliases="rForeArm avatar_mElbowRight" connected="true" end="0.000 -0.205 0.000" group="Arms" name="mElbowRight" pivot="0.000000 -0.248000 -0.000000" pos="0.000 -0.248 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="0.000 -0.100 -0.001" group="Collision" name="R_LOWER_ARM" pos="0.0 -0.1 0.0" rot="3.000000 0.00000 0.000000" scale="0.04 0.14 0.04" support="base"/>
+ <bone aliases="rHand avatar_mWristRight" connected="true" end="0.000 -0.060 0.000" group="Arms" name="mWristRight" pivot="-0.000000 -0.205000 -0.000000" pos="0.000 -0.205 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="0.005 -0.049 -0.001" group="Collision" name="R_HAND" pos="0.01 -0.05 0.0" rot="3.000000 0.00000 10.000000" scale="0.05 0.08 0.03" support="base"/>
+ <bone connected="false" end="-0.001 -0.040 -0.006" group="Hand" name="mHandMiddle1Right" pivot="0.013 -0.101 0.015" pos="0.013 -0.101 0.015" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.001 -0.049 -0.008" group="Hand" name="mHandMiddle2Right" pivot="-0.001 -0.040 -0.006" pos="-0.001 -0.040 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.002 -0.033 -0.006" group="Hand" name="mHandMiddle3Right" pivot="-0.001 -0.049 -0.008" pos="-0.001 -0.049 -0.008" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ </bone>
+ <bone connected="false" end="0.017 -0.036 -0.006" group="Hand" name="mHandIndex1Right" pivot="0.038 -0.097 0.015" pos="0.038 -0.097 0.015" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="0.014 -0.032 -0.006" group="Hand" name="mHandIndex2Right" pivot="0.017 -0.036 -0.006" pos="0.017 -0.036 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="0.011 -0.025 -0.004" group="Hand" name="mHandIndex3Right" pivot="0.014 -0.032 -0.006" pos="0.014 -0.032 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ </bone>
+ <bone connected="false" end="-0.013 -0.038 -0.008" group="Hand" name="mHandRing1Right" pivot="-0.010 -0.099 0.009" pos="-0.010 -0.099 0.009" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.013 -0.040 -0.009" group="Hand" name="mHandRing2Right" pivot="-0.013 -0.038 -0.008" pos="-0.013 -0.038 -0.008" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.010 -0.028 -0.006" group="Hand" name="mHandRing3Right" pivot="-0.013 -0.040 -0.009" pos="-0.013 -0.040 -0.009" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ </bone>
+ <bone connected="false" end="-0.024 -0.025 -0.006" group="Hand" name="mHandPinky1Right" pivot="-0.031 -0.095 0.003" pos="-0.031 -0.095 0.003" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.015 -0.018 -0.004" group="Hand" name="mHandPinky2Right" pivot="-0.024 -0.025 -0.006" pos="-0.024 -0.025 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.013 -0.016 -0.004" group="Hand" name="mHandPinky3Right" pivot="-0.015 -0.018 -0.004" pos="-0.015 -0.018 -0.004" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ </bone>
+ <bone connected="false" end="0.028 -0.032 -0.001" group="Hand" name="mHandThumb1Right" pivot="0.031 -0.026 0.004" pos="0.031 -0.026 0.004" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="0.023 -0.031 -0.001" group="Hand" name="mHandThumb2Right" pivot="0.028 -0.032 -0.001" pos="0.028 -0.032 -0.001" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="0.015 -0.025 0.001" group="Hand" name="mHandThumb3Right" pivot="0.023 -0.031 -0.001" pos="0.023 -0.031 -0.001" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+ <bone connected="false" end="-0.061 0.000 0.000" group="Wing" name="mWingsRoot" pivot="-0.014 0.000 0.000" pos="-0.014 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="false" end="-0.168 0.169 0.067" group="Wing" name="mWing1Left" pivot="-0.099 0.105 0.181" pos="-0.099 0.105 0.181" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.181 0.183 0.000" group="Wing" name="mWing2Left" pivot="-0.168 0.169 0.067" pos="-0.168 0.169 0.067" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.171 0.173 0.000" group="Wing" name="mWing3Left" pivot="-0.181 0.183 0.000" pos="-0.181 0.183 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.146 0.132 0.000" group="Wing" name="mWing4Left" pivot="-0.171 0.173 0.000" pos="-0.171 0.173 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="true" end="-0.068 0.062 -0.159" group="Wing" name="mWing4FanLeft" pivot="-0.171 0.173 0.000" pos="-0.171 0.173 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ </bone>
+ </bone>
+ <bone connected="false" end="-0.168 -0.169 0.067" group="Wing" name="mWing1Right" pivot="-0.099 -0.105 0.181" pos="-0.099 -0.105 0.181" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.181 -0.183 0.000" group="Wing" name="mWing2Right" pivot="-0.168 -0.169 0.067" pos="-0.168 -0.169 0.067" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.171 -0.173 0.000" group="Wing" name="mWing3Right" pivot="-0.181 -0.183 0.000" pos="-0.181 -0.183 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.146 -0.132 0.000" group="Wing" name="mWing4Right" pivot="-0.171 -0.173 0.000" pos="-0.171 -0.173 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="true" end="-0.068 -0.062 -0.159" group="Wing" name="mWing4FanRight" pivot="-0.171 -0.173 0.000" pos="-0.171 -0.173 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+ <bone aliases="rThigh avatar_mHipRight" connected="false" end="-0.001 0.049 -0.491" group="Legs" name="mHipRight" pivot="0.033620 -0.128806 -0.041086" pos="0.034 -0.129 -0.041" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="0.000 0.000 -0.200" group="Collision" name="R_UPPER_LEG" pos="-0.02 0.05 -0.22" rot="0.000000 0.00000 0.000000" scale="0.09 0.09 0.32" support="base"/>
+ <bone aliases="rShin avatar_mKneeRight" connected="true" end="-0.029 0.000 -0.469" group="Legs" name="mKneeRight" pivot="-0.000780 0.048635 -0.490922" pos="-0.001 0.049 -0.491" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="-0.010 0.000 -0.150" group="Collision" name="R_LOWER_LEG" pos="-0.02 0.0 -0.2" rot="0.000000 0.00000 0.000000" scale="0.06 0.06 0.25" support="base"/>
+ <bone aliases="rFoot avatar_mAnkleRight" connected="true" end="0.112 0.000 -0.061" group="Legs" name="mAnkleRight" pivot="-0.028869 0.000000 -0.468494" pos="-0.029 0.000 -0.468" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="0.089 0.000 -0.026" group="Collision" name="R_FOOT" pos="0.077 0.0 -0.041" rot="0.000000 10.00000 0.000000" scale="0.13 0.05 0.05" support="base"/>
+ <bone aliases="avatar_mFootRight" connected="true" end="0.105 -0.010 -0.000" group="Extra" name="mFootRight" pivot="0.111956 -0.000000 -0.060637" pos="0.112 -0.000 -0.061" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <bone aliases="avatar_mToeRight" connected="true" end="0.020 0.000 0.000" group="Extra" name="mToeRight" pivot="0.105399 -0.010408 -0.000104" pos="0.109 0.000 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base"/>
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+ <bone aliases="lThigh avatar_mHipLeft" connected="false" end="-0.001 -0.046 -0.491" group="Legs" name="mHipLeft" pivot="0.033757 0.126765 -0.040998" pos="0.034 0.127 -0.041" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="0.000 0.000 -0.200" group="Collision" name="L_UPPER_LEG" pos="-0.02 -0.05 -0.22" rot="0.000000 0.00000 0.000000" scale="0.09 0.09 0.32" support="base"/>
+ <bone aliases="lShin avatar_mKneeLeft" connected="true" end="-0.029 0.001 -0.469" group="Legs" name="mKneeLeft" pivot="-0.000887 -0.045568 -0.491053" pos="-0.001 -0.046 -0.491" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="-0.010 0.000 -0.150" group="Collision" name="L_LOWER_LEG" pos="-0.02 0.0 -0.2" rot="0.000000 0.00000 0.000000" scale="0.06 0.06 0.25" support="base"/>
+ <bone aliases="lFoot avatar_mAnkleLeft" connected="true" end="0.112 0.000 -0.061" group="Legs" name="mAnkleLeft" pivot="-0.028887 0.001378 -0.468449" pos="-0.029 0.001 -0.468" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <collision_volume end="0.089 0.000 -0.026" group="Collision" name="L_FOOT" pos="0.077 0.0 -0.041" rot="0.000000 10.00000 0.000000" scale="0.13 0.05 0.05" support="base"/>
+ <bone aliases="avatar_mFootLeft" connected="true" end="0.105 0.008 0.001" group="Extra" name="mFootLeft" pivot="0.111956 -0.000000 -0.060620" pos="0.112 -0.000 -0.061" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
+ <bone aliases="avatar_mToeLeft" connected="true" end="0.020 0.000 0.000" group="Extra" name="mToeLeft" pivot="0.105387 0.008270 0.000871" pos="0.109 0.000 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base"/>
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+ <bone connected="false" end="-0.197 0.000 0.000" group="Tail" name="mTail1" pivot="-0.116 0.000 0.047" pos="-0.116 0.000 0.047" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.168 0.000 0.000" group="Tail" name="mTail2" pivot="-0.197 0.000 0.000" pos="-0.197 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.142 0.000 0.000" group="Tail" name="mTail3" pivot="-0.168 0.000 0.000" pos="-0.168 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.112 0.000 0.000" group="Tail" name="mTail4" pivot="-0.142 0.000 0.000" pos="-0.142 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.094 0.000 0.000" group="Tail" name="mTail5" pivot="-0.112 0.000 0.000" pos="-0.112 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.089 0.000 0.000" group="Tail" name="mTail6" pivot="-0.094 0.000 0.000" pos="-0.094 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+ <bone connected="false" end="0.004 0.000 -0.066" group="Groin" name="mGroin" pivot="0.064 0.000 -0.097" pos="0.064 0.000 -0.097" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ <bone connected="false" end="-0.204 0.000 0.000" group="Limb" name="mHindLimbsRoot" pivot="-0.200 0.000 0.084" pos="-0.200 0.000 0.084" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="false" end="0.002 -0.046 -0.491" group="Limb" name="mHindLimb1Left" pivot="-0.204 0.129 -0.125" pos="-0.204 0.129 -0.125" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.030 -0.003 -0.468" group="Limb" name="mHindLimb2Left" pivot="0.002 -0.046 -0.491" pos="0.002 -0.046 -0.491" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="0.112 0.000 -0.061" group="Limb" name="mHindLimb3Left" pivot="-0.030 -0.003 -0.468" pos="-0.030 -0.003 -0.468" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="0.105 0.008 0.001" group="Limb" name="mHindLimb4Left" pivot="0.112 0.000 -0.061" pos="0.112 0.000 -0.061" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
+ </bone>
+ </bone>
+ </bone>
+ <bone connected="false" end="0.002 0.046 -0.491" group="Limb" name="mHindLimb1Right" pivot="-0.204 -0.129 -0.125" pos="-0.204 -0.129 -0.125" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="-0.030 0.003 -0.468" group="Limb" name="mHindLimb2Right" pivot="0.002 0.046 -0.491" pos="0.002 0.046 -0.491" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="0.112 0.000 -0.061" group="Limb" name="mHindLimb3Right" pivot="-0.030 0.003 -0.468" pos="-0.030 0.003 -0.468" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
+ <bone connected="true" end="0.105 0.008 0.001" group="Limb" name="mHindLimb4Right" pivot="0.112 -0.000 -0.061" pos="0.112 -0.000 -0.061" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="extended" />
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+ </bone>
+</linden_skeleton>
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index d933537d2e..b00c960822 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -4176,6 +4176,8 @@ void LLAgent::setTeleportState(ETeleportState state)
void LLAgent::stopCurrentAnimations()
{
+ LL_DEBUGS("Avatar") << "Stopping current animations" << LL_ENDL;
+
// This function stops all current overriding animations on this
// avatar, propagating this change back to the server.
if (isAgentAvatarValid())
@@ -4193,6 +4195,7 @@ void LLAgent::stopCurrentAnimations()
// don't cancel a ground-sit anim, as viewers
// use this animation's status in
// determining whether we're sitting. ick.
+ LL_DEBUGS("Avatar") << "sit or do-not-disturb animation will not be stopped" << LL_ENDL;
}
else
{
@@ -4222,8 +4225,7 @@ void LLAgent::stopCurrentAnimations()
// re-assert at least the default standing animation, because
// viewers get confused by avs with no associated anims.
- sendAnimationRequest(ANIM_AGENT_STAND,
- ANIM_REQUEST_START);
+ sendAnimationRequest(ANIM_AGENT_STAND, ANIM_REQUEST_START);
}
}
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index fa16f02c16..e335eabd1a 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -1448,6 +1448,7 @@ void LLAgentCamera::updateCamera()
diff.mV[VZ] = 0.f;
}
+ // SL-315
gAgentAvatarp->mPelvisp->setPosition(gAgentAvatarp->mPelvisp->getPosition() + diff);
gAgentAvatarp->mRoot->updateWorldMatrixChildren();
@@ -2144,6 +2145,7 @@ void LLAgentCamera::changeCameraToFollow(BOOL animate)
if (isAgentAvatarValid())
{
+ // SL-315
gAgentAvatarp->mPelvisp->setPosition(LLVector3::zero);
gAgentAvatarp->startMotion( ANIM_AGENT_BODY_NOISE );
gAgentAvatarp->startMotion( ANIM_AGENT_BREATHE_ROT );
@@ -2184,6 +2186,7 @@ void LLAgentCamera::changeCameraToThirdPerson(BOOL animate)
{
if (!gAgentAvatarp->isSitting())
{
+ // SL-315
gAgentAvatarp->mPelvisp->setPosition(LLVector3::zero);
}
gAgentAvatarp->startMotion(ANIM_AGENT_BODY_NOISE);
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index b6d02ea2f8..5287f98827 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -99,6 +99,7 @@
#include "llscenemonitor.h"
#include "llavatarrenderinfoaccountant.h"
#include "lllocalbitmaps.h"
+#include "llskinningutil.h"
// Linden library includes
#include "llavatarnamecache.h"
@@ -799,6 +800,9 @@ bool LLAppViewer::init()
LL_INFOS("InitInfo") << "Configuration initialized." << LL_ENDL ;
+ // initialize skinning util
+ LLSkinningUtil::initClass();
+
//set the max heap size.
initMaxHeapSize() ;
LLCoros::instance().setStackSize(gSavedSettings.getS32("CoroutineStackSize"));
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 4c16c542d6..843cd9b249 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -27,6 +27,7 @@
#include "llviewerprecompiledheaders.h"
#include "lldrawpoolavatar.h"
+#include "llskinningutil.h"
#include "llrender.h"
#include "llvoavatar.h"
@@ -56,8 +57,6 @@ static U32 sDataMask = LLDrawPoolAvatar::VERTEX_DATA_MASK;
static U32 sBufferUsage = GL_STREAM_DRAW_ARB;
static U32 sShaderLevel = 0;
-#define JOINT_COUNT 52
-
LLGLSLShader* LLDrawPoolAvatar::sVertexProgram = NULL;
BOOL LLDrawPoolAvatar::sSkipOpaque = FALSE;
BOOL LLDrawPoolAvatar::sSkipTransparent = FALSE;
@@ -1461,7 +1460,13 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
}
}
-void LLDrawPoolAvatar::getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>& buffer, U32 data_mask, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face)
+void LLDrawPoolAvatar::getRiggedGeometry(
+ LLFace* face,
+ LLPointer<LLVertexBuffer>& buffer,
+ U32 data_mask,
+ const LLMeshSkinInfo* skin,
+ LLVolume* volume,
+ const LLVolumeFace& vol_face)
{
face->setGeomIndex(0);
face->setIndicesIndex(0);
@@ -1470,7 +1475,8 @@ void LLDrawPoolAvatar::getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>
face->setTextureIndex(255);
if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable())
- { //make a new buffer
+ {
+ // make a new buffer
if (sShaderLevel > 0)
{
buffer = new LLVertexBuffer(data_mask, GL_DYNAMIC_DRAW_ARB);
@@ -1482,7 +1488,8 @@ void LLDrawPoolAvatar::getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>
buffer->allocateBuffer(vol_face.mNumVertices, vol_face.mNumIndices, true);
}
else
- { //resize existing buffer
+ {
+ //resize existing buffer
buffer->resizeBuffer(vol_face.mNumVertices, vol_face.mNumIndices);
}
@@ -1496,9 +1503,9 @@ void LLDrawPoolAvatar::getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>
m = m.inverse().transpose();
F32 mat3[] =
- { m.m[0], m.m[1], m.m[2],
- m.m[4], m.m[5], m.m[6],
- m.m[8], m.m[9], m.m[10] };
+ { m.m[0], m.m[1], m.m[2],
+ m.m[4], m.m[5], m.m[6],
+ m.m[8], m.m[9], m.m[10] };
LLMatrix3 mat_normal(mat3);
@@ -1525,26 +1532,37 @@ void LLDrawPoolAvatar::getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>
{
face->clearState(LLFace::TEXTURE_ANIM);
}
-
-
face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true);
buffer->flush();
}
-void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace* face, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face)
+void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(
+ LLVOAvatar* avatar,
+ LLFace* face,
+ const LLMeshSkinInfo* skin,
+ LLVolume* volume,
+ const LLVolumeFace& vol_face)
{
LLVector4a* weight = vol_face.mWeights;
if (!weight)
{
return;
}
+ // FIXME ugly const cast
+ LLSkinningUtil::remapSkinInfoJoints(avatar, const_cast<LLMeshSkinInfo*>(skin));
LLPointer<LLVertexBuffer> buffer = face->getVertexBuffer();
LLDrawable* drawable = face->getDrawable();
U32 data_mask = face->getRiggedVertexBufferDataMask();
+ if (!vol_face.mWeightsRemapped)
+ {
+ LLSkinningUtil::remapSkinWeights(weight, vol_face.mNumVertices, skin);
+ vol_face.mWeightsRemapped = TRUE;
+ }
+
if (buffer.isNull() ||
buffer->getTypeMask() != data_mask ||
buffer->getNumVerts() != vol_face.mNumVertices ||
@@ -1595,60 +1613,19 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
LLVector4a* norm = has_normal ? (LLVector4a*) normal.get() : NULL;
//build matrix palette
- LLMatrix4a mp[JOINT_COUNT];
- LLMatrix4* mat = (LLMatrix4*) mp;
-
- U32 count = llmin((U32) skin->mJointNames.size(), (U32) JOINT_COUNT);
- for (U32 j = 0; j < count; ++j)
- {
- LLJoint* joint = avatar->getJoint(skin->mJointNames[j]);
- if (!joint)
- {
- joint = avatar->getJoint("mPelvis");
- }
- if (joint)
- {
- mat[j] = skin->mInvBindMatrix[j];
- mat[j] *= joint->getWorldMatrix();
- }
- }
+ LLMatrix4a mat[LL_MAX_JOINTS_PER_MESH_OBJECT];
+ U32 count = LLSkinningUtil::getMeshJointCount(skin);
+ LLSkinningUtil::initSkinningMatrixPalette((LLMatrix4*)mat, count, skin, avatar);
+ LLSkinningUtil::checkSkinWeights(weight, buffer->getNumVerts(), skin);
LLMatrix4a bind_shape_matrix;
bind_shape_matrix.loadu(skin->mBindShapeMatrix);
+ const U32 max_joints = LLSkinningUtil::getMaxJointCount();
for (U32 j = 0; j < buffer->getNumVerts(); ++j)
{
LLMatrix4a final_mat;
- final_mat.clear();
-
- S32 idx[4];
-
- LLVector4 wght;
-
- F32 scale = 0.f;
- for (U32 k = 0; k < 4; k++)
- {
- F32 w = weight[j][k];
-
- idx[k] = llclamp((S32) floorf(w), (S32)0, (S32)JOINT_COUNT-1);
-
- wght[k] = w - floorf(w);
- scale += wght[k];
- }
- // This is enforced in unpackVolumeFaces()
- llassert(scale>0.f);
- wght *= 1.f/scale;
-
- for (U32 k = 0; k < 4; k++)
- {
- F32 w = wght[k];
-
- LLMatrix4a src;
- src.setMul(mp[idx[k]], w);
-
- final_mat.add(src);
- }
-
+ LLSkinningUtil::getPerVertexSkinMatrix(weight[j].getF32ptr(), mat, false, final_mat, max_joints);
LLVector4a& v = vol_face.mPositions[j];
LLVector4a t;
@@ -1728,34 +1705,21 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
if (buff)
{
if (sShaderLevel > 0)
- { //upload matrix palette to shader
- LLMatrix4 mat[JOINT_COUNT];
-
- U32 count = llmin((U32) skin->mJointNames.size(), (U32) JOINT_COUNT);
+ {
+ // upload matrix palette to shader
+ LLMatrix4a mat[LL_MAX_JOINTS_PER_MESH_OBJECT];
+ U32 count = LLSkinningUtil::getMeshJointCount(skin);
+ LLSkinningUtil::initSkinningMatrixPalette((LLMatrix4*)mat, count, skin, avatar);
- for (U32 i = 0; i < count; ++i)
- {
- LLJoint* joint = avatar->getJoint(skin->mJointNames[i]);
- if (!joint)
- {
- joint = avatar->getJoint("mPelvis");
- }
- if (joint)
- {
- mat[i] = skin->mInvBindMatrix[i];
- mat[i] *= joint->getWorldMatrix();
- }
- }
-
stop_glerror();
- F32 mp[JOINT_COUNT*9];
+ F32 mp[LL_MAX_JOINTS_PER_MESH_OBJECT*9];
- F32 transp[JOINT_COUNT*3];
+ F32 transp[LL_MAX_JOINTS_PER_MESH_OBJECT*3];
for (U32 i = 0; i < count; ++i)
{
- F32* m = (F32*) mat[i].mMatrix;
+ F32* m = (F32*) mat[i].mMatrix[0].getF32ptr();
U32 idx = i*9;
diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp
index e5df417ca9..d33a138e94 100644
--- a/indra/newview/llfloaterbvhpreview.cpp
+++ b/indra/newview/llfloaterbvhpreview.cpp
@@ -178,6 +178,12 @@ void LLFloaterBvhPreview::setAnimCallbacks()
getChild<LLUICtrl>("ease_out_time")->setValidateBeforeCommit( boost::bind(&LLFloaterBvhPreview::validateEaseOut, this, _1));
}
+std::map <std::string, std::string> LLFloaterBvhPreview::getJointAliases()
+{
+ LLPointer<LLVOAvatar> av = (LLVOAvatar*)mAnimPreview->getDummyAvatar();
+ return av->getJointAliases();
+}
+
//-----------------------------------------------------------------------------
// postBuild()
//-----------------------------------------------------------------------------
@@ -215,6 +221,8 @@ BOOL LLFloaterBvhPreview::postBuild()
getChildView("bad_animation_text")->setVisible(FALSE);
+ mAnimPreview = new LLPreviewAnimation(256, 256);
+
std::string exten = gDirUtilp->getExtension(mFilename);
if (exten == "bvh")
{
@@ -241,8 +249,11 @@ BOOL LLFloaterBvhPreview::postBuild()
file_buffer[file_size] = '\0';
LL_INFOS() << "Loading BVH file " << mFilename << LL_ENDL;
ELoadStatus load_status = E_ST_OK;
- S32 line_number = 0;
- loaderp = new LLBVHLoader(file_buffer, load_status, line_number);
+ S32 line_number = 0;
+
+ std::map<std::string, std::string> joint_alias_map = getJointAliases();
+
+ loaderp = new LLBVHLoader(file_buffer, load_status, line_number, joint_alias_map);
std::string status = getString(STATUS[load_status]);
if(load_status == E_ST_NO_XLT_FILE)
@@ -266,8 +277,6 @@ BOOL LLFloaterBvhPreview::postBuild()
mTransactionID.generate();
mMotionID = mTransactionID.makeAssetID(gAgent.getSecureSessionID());
- mAnimPreview = new LLPreviewAnimation(256, 256);
-
// motion will be returned, but it will be in a load-pending state, as this is a new motion
// this motion will not request an asset transfer until next update, so we have a chance to
// load the keyframe data locally
@@ -280,9 +289,12 @@ BOOL LLFloaterBvhPreview::postBuild()
LLDataPackerBinaryBuffer dp(buffer, buffer_size);
// pass animation data through memory buffer
+ LL_INFOS("BVH") << "Serializing loaderp" << LL_ENDL;
loaderp->serialize(dp);
dp.reset();
+ LL_INFOS("BVH") << "Deserializing motionp" << LL_ENDL;
BOOL success = motionp && motionp->deserialize(dp);
+ LL_INFOS("BVH") << "Done" << LL_ENDL;
delete []buffer;
diff --git a/indra/newview/llfloaterbvhpreview.h b/indra/newview/llfloaterbvhpreview.h
index b81cc6e3a5..20d15d9603 100644
--- a/indra/newview/llfloaterbvhpreview.h
+++ b/indra/newview/llfloaterbvhpreview.h
@@ -109,7 +109,9 @@ public:
S32 status, LLExtStat ext_status);
private:
void setAnimCallbacks() ;
-
+ std::map <std::string, std::string> getJointAliases();
+
+
protected:
void draw();
void resetMotion();
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index ffeebfd256..0f0fafcce6 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -42,7 +42,6 @@
#include "llcombobox.h"
#include "lldatapacker.h"
#include "lldrawable.h"
-#include "lldrawpoolavatar.h"
#include "llrender.h"
#include "llface.h"
#include "lleconomy.h"
@@ -54,6 +53,7 @@
#include "llmeshrepository.h"
#include "llnotificationsutil.h"
#include "llsdutil_math.h"
+#include "llskinningutil.h"
#include "lltextbox.h"
#include "lltoolmgr.h"
#include "llui.h"
@@ -489,10 +489,18 @@ void LLFloaterModelPreview::onClickCalculateBtn()
bool upload_skinweights = childGetValue("upload_skin").asBoolean();
bool upload_joint_positions = childGetValue("upload_joints").asBoolean();
+ if (upload_joint_positions)
+ {
+ // Diagnostic message showing list of joints for which joint offsets are defined.
+ // FIXME - given time, would be much better to put this in the UI, in updateStatusMessages().
+ mModelPreview->getPreviewAvatar()->showAttachmentPosOverrides();
+ }
+
mUploadModelUrl.clear();
gMeshRepo.uploadModel(mModelPreview->mUploadData, mModelPreview->mPreviewScale,
- childGetValue("upload_textures").asBoolean(), upload_skinweights, upload_joint_positions, mUploadModelUrl, false,
+ childGetValue("upload_textures").asBoolean(), upload_skinweights, upload_joint_positions,
+ mUploadModelUrl, false,
getWholeModelFeeObserverHandle());
toggleCalculateButton(false);
@@ -1190,7 +1198,6 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
, mPhysicsSearchLOD( LLModel::LOD_PHYSICS )
, mResetJoints( false )
, mModelNoErrors( true )
-, mRigParityWithScene( false )
, mLastJointUpdate( false )
{
mNeedsUpdate = TRUE;
@@ -1731,6 +1738,20 @@ void LLModelPreview::clearModel(S32 lod)
mScene[lod].clear();
}
+void LLModelPreview::getJointAliases( JointMap& joint_map)
+{
+ // Get all standard skeleton joints from the preview avatar.
+ LLVOAvatar *av = getPreviewAvatar();
+
+ //Joint names and aliases come from avatar_skeleton.xml
+
+ joint_map = av->getJointAliases();
+ for (S32 i = 0; i < av->mNumCollisionVolumes; i++)
+ {
+ joint_map[av->mCollisionVolumes[i].getName()] = av->mCollisionVolumes[i].getName();
+ }
+}
+
void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable_slm)
{
assert_main_thread();
@@ -1773,6 +1794,9 @@ void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable
clearGLODGroup();
}
+ std::map<std::string, std::string> joint_alias_map;
+ getJointAliases(joint_alias_map);
+
mModelLoader = new LLDAELoader(
filename,
lod,
@@ -1783,6 +1807,8 @@ void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable
this,
mJointTransformMap,
mJointsFromNode,
+ joint_alias_map,
+ LLSkinningUtil::getMaxJointCount(),
gSavedSettings.getU32("ImporterModelLimit"),
gSavedSettings.getBOOL("ImporterPreprocessDAE"));
@@ -3307,14 +3333,17 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
LLVector3 pos(vf.mPositions[i].getF32ptr());
const LLModel::weight_list& weight_list = base_mdl->getJointInfluences(pos);
+ llassert(weight_list.size()>0 && weight_list.size() <= 4); // LLModel::loadModel() should guarantee this
LLVector4 w(0,0,0,0);
for (U32 i = 0; i < weight_list.size(); ++i)
{
- F32 wght = llmin(weight_list[i].mWeight, 0.999999f);
+ F32 wght = llclamp(weight_list[i].mWeight, 0.001f, 0.999f);
F32 joint = (F32) weight_list[i].mJointIdx;
w.mV[i] = joint + wght;
+ llassert(w.mV[i]-(S32)w.mV[i]>0.0f); // because weights are non-zero, and range of wt values
+ //should not cause floating point precision issues.
}
*(weights_strider++) = w;
@@ -3368,19 +3397,6 @@ void LLModelPreview::update()
}
//-----------------------------------------------------------------------------
-// getTranslationForJointOffset()
-//-----------------------------------------------------------------------------
-LLVector3 LLModelPreview::getTranslationForJointOffset( std::string joint )
-{
- LLMatrix4 jointTransform;
- if ( mJointTransformMap.find( joint ) != mJointTransformMap.end() )
- {
- jointTransform = mJointTransformMap[joint];
- return jointTransform.getTranslation();
- }
- return LLVector3(0.0f,0.0f,0.0f);
-}
-//-----------------------------------------------------------------------------
// createPreviewAvatar
//-----------------------------------------------------------------------------
void LLModelPreview::createPreviewAvatar( void )
@@ -3509,6 +3525,7 @@ void LLModelPreview::addEmptyFace( LLModel* pTarget )
pTarget->setVolumeFaceData( faceCnt+1, pos, norm, tc, index, buff->getNumVerts(), buff->getNumIndices() );
}
+
//-----------------------------------------------------------------------------
// render()
//-----------------------------------------------------------------------------
@@ -4002,20 +4019,6 @@ BOOL LLModelPreview::render()
LLVector3::z_axis, // up
target_pos); // point of interest
- if (joint_positions)
- {
- LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
- if (shader)
- {
- gDebugProgram.bind();
- }
- getPreviewAvatar()->renderCollisionVolumes();
- if (shader)
- {
- shader->bind();
- }
- }
-
for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter)
{
for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter)
@@ -4040,58 +4043,32 @@ BOOL LLModelPreview::render()
//quick 'n dirty software vertex skinning
//build matrix palette
-
- LLMatrix4 mat[64];
- for (U32 j = 0; j < model->mSkinInfo.mJointNames.size(); ++j)
- {
- LLJoint* joint = getPreviewAvatar()->getJoint(model->mSkinInfo.mJointNames[j]);
- if (joint)
- {
- mat[j] = model->mSkinInfo.mInvBindMatrix[j];
- mat[j] *= joint->getWorldMatrix();
- }
- }
+ LLMatrix4a mat[LL_MAX_JOINTS_PER_MESH_OBJECT];
+ const LLMeshSkinInfo *skin = &model->mSkinInfo;
+ U32 count = LLSkinningUtil::getMeshJointCount(skin);
+ LLSkinningUtil::initSkinningMatrixPalette((LLMatrix4*)mat, count,
+ skin, getPreviewAvatar());
+ LLMatrix4a bind_shape_matrix;
+ bind_shape_matrix.loadu(skin->mBindShapeMatrix);
+ U32 max_joints = LLSkinningUtil::getMaxJointCount();
for (U32 j = 0; j < buffer->getNumVerts(); ++j)
{
- LLMatrix4 final_mat;
- final_mat.mMatrix[0][0] = final_mat.mMatrix[1][1] = final_mat.mMatrix[2][2] = final_mat.mMatrix[3][3] = 0.f;
-
- LLVector4 wght;
- S32 idx[4];
-
- F32 scale = 0.f;
- for (U32 k = 0; k < 4; k++)
- {
- F32 w = weight[j].mV[k];
-
- idx[k] = (S32) floorf(w);
- wght.mV[k] = w - floorf(w);
- scale += wght.mV[k];
- }
-
- wght *= 1.f/scale;
-
- for (U32 k = 0; k < 4; k++)
- {
- F32* src = (F32*) mat[idx[k]].mMatrix;
- F32* dst = (F32*) final_mat.mMatrix;
-
- F32 w = wght.mV[k];
-
- for (U32 l = 0; l < 16; l++)
- {
- dst[l] += src[l]*w;
- }
- }
+ LLMatrix4a final_mat;
+ F32 *wptr = weight[j].mV;
+ LLSkinningUtil::getPerVertexSkinMatrix(wptr, mat, true, final_mat, max_joints);
//VECTORIZE THIS
- LLVector3 v(face.mPositions[j].getF32ptr());
+ LLVector4a& v = face.mPositions[j];
- v = v * model->mSkinInfo.mBindShapeMatrix;
- v = v * final_mat;
+ LLVector4a t;
+ LLVector4a dst;
+ bind_shape_matrix.affineTransform(v, t);
+ final_mat.affineTransform(t, dst);
- position[j] = v;
+ position[j][0] = dst[0];
+ position[j][1] = dst[1];
+ position[j][2] = dst[2];
}
llassert(model->mMaterialList.size() > i);
@@ -4125,6 +4102,22 @@ BOOL LLModelPreview::render()
}
}
}
+
+ if (joint_positions)
+ {
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ if (shader)
+ {
+ gDebugProgram.bind();
+ }
+ getPreviewAvatar()->renderCollisionVolumes();
+ getPreviewAvatar()->renderBones();
+ if (shader)
+ {
+ shader->bind();
+ }
+ }
+
}
}
@@ -4261,7 +4254,14 @@ void LLFloaterModelPreview::refresh()
}
//static
-void LLModelPreview::textureLoadedCallback( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata )
+void LLModelPreview::textureLoadedCallback(
+ BOOL success,
+ LLViewerFetchedTexture *src_vi,
+ LLImageRaw* src,
+ LLImageRaw* src_aux,
+ S32 discard_level,
+ BOOL final,
+ void* userdata )
{
LLModelPreview* preview = (LLModelPreview*) userdata;
preview->refresh();
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index a73ca50260..217ac35888 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -260,6 +260,7 @@ public:
virtual BOOL needsRender() { return mNeedsUpdate; }
void setPreviewLOD(S32 lod);
void clearModel(S32 lod);
+ void getJointAliases(JointMap& joint_map);
void loadModel(std::string filename, S32 lod, bool force_disable_slm = false);
void loadModelCallback(S32 lod);
bool lodsReady() { return !mGenLOD && mLodsQuery.empty(); }
@@ -300,11 +301,7 @@ public:
void setLoadState( U32 state ) { mLoadState = state; }
U32 getLoadState() { return mLoadState; }
- void setRigWithSceneParity( bool state ) { mRigParityWithScene = state; }
- const bool getRigWithSceneParity( void ) const { return mRigParityWithScene; }
- LLVector3 getTranslationForJointOffset( std::string joint );
-
static bool sIgnoreLoadedCallback;
std::vector<S32> mLodsQuery;
@@ -352,7 +349,6 @@ private:
bool mLoading;
U32 mLoadState;
bool mResetJoints;
- bool mRigParityWithScene;
bool mModelNoErrors;
std::map<std::string, bool> mViewOption;
@@ -410,7 +406,7 @@ private:
bool mLastJointUpdate;
- JointSet mJointsFromNode;
+ JointNameSet mJointsFromNode;
JointTransformMap mJointTransformMap;
LLPointer<LLVOAvatar> mPreviewAvatar;
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 36bdcf4d89..8429be2f49 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -364,6 +364,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.AvatarImpostorsEnable", boost::bind(&LLFloaterPreference::onAvatarImpostorsEnable, this));
mCommitCallbackRegistrar.add("Pref.UpdateIndirectMaxComplexity", boost::bind(&LLFloaterPreference::updateMaxComplexity, this));
mCommitCallbackRegistrar.add("Pref.VertexShaderEnable", boost::bind(&LLFloaterPreference::onVertexShaderEnable, this));
+ mCommitCallbackRegistrar.add("Pref.EnhancedSkeletonEnable", boost::bind(&LLFloaterPreference::onEnhancedSkeletonEnable, this, _1));
mCommitCallbackRegistrar.add("Pref.WindowedMod", boost::bind(&LLFloaterPreference::onCommitWindowedMode, this));
mCommitCallbackRegistrar.add("Pref.UpdateSliderText", boost::bind(&LLFloaterPreference::refreshUI,this));
mCommitCallbackRegistrar.add("Pref.QualityPerformance", boost::bind(&LLFloaterPreference::onChangeQuality, this, _2));
@@ -807,6 +808,16 @@ void LLFloaterPreference::onAvatarImpostorsEnable()
refreshEnabledGraphics();
}
+void LLFloaterPreference::onEnhancedSkeletonEnable(LLUICtrl *ctrl)
+{
+ bool enabled = ctrl->getValue().asBoolean();
+ bool curr_enabled = gSavedSettings.getBOOL("IncludeEnhancedSkeleton");
+ if (enabled != curr_enabled)
+ {
+ gSavedSettings.setBOOL("IncludeEnhancedSkeleton",enabled);
+ }
+}
+
//static
void LLFloaterPreference::initDoNotDisturbResponse()
{
@@ -1251,6 +1262,10 @@ void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState()
bool bumpshiny = gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps && LLFeatureManager::getInstance()->isFeatureAvailable("RenderObjectBump");
bumpshiny_ctrl->setEnabled(bumpshiny ? TRUE : FALSE);
+ LLCheckBoxCtrl* ctrl_enhanced_skel = getChild<LLCheckBoxCtrl>("AvatarEnhancedSkeleton");
+ bool enhanced_skel_enabled = gSavedSettings.getBOOL("IncludeEnhancedSkeleton");
+ ctrl_enhanced_skel->setValue(enhanced_skel_enabled);
+
// Avatar Mode
// Enable Avatar Shaders
LLCheckBoxCtrl* ctrl_avatar_vp = getChild<LLCheckBoxCtrl>("AvatarVertexProgram");
@@ -2004,7 +2019,7 @@ void LLFloaterPreference::onClickAutoReplace()
void LLFloaterPreference::onClickSpellChecker()
{
- LLFloaterReg::showInstance("prefs_spellchecker");
+ LLFloaterReg::showInstance("prefs_spellchecker");
}
void LLFloaterPreference::onClickAdvanced()
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index fa0c09e97a..fd45129c72 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -117,6 +117,8 @@ protected:
void onVertexShaderEnable();
// callback for when client turns on impostors
void onAvatarImpostorsEnable();
+ // callback for when enhanced skeleton support checkbox toggled.
+ void onEnhancedSkeletonEnable(LLUICtrl *ctrl);
// callback for commit in the "Single click on land" and "Double click on land" comboboxes.
void onClickActionChange();
diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp
index 35ac0537a3..fb40af1302 100644
--- a/indra/newview/llpreviewanim.cpp
+++ b/indra/newview/llpreviewanim.cpp
@@ -37,6 +37,7 @@
#include "lllineeditor.h"
#include "lluictrlfactory.h"
#include "lluictrlfactory.h"
+#include "lldatapacker.h"
extern LLAgent gAgent;
diff --git a/indra/newview/llskinningutil.cpp b/indra/newview/llskinningutil.cpp
new file mode 100644
index 0000000000..732afdfa9a
--- /dev/null
+++ b/indra/newview/llskinningutil.cpp
@@ -0,0 +1,364 @@
+/**
+* @file llskinningutil.cpp
+* @brief Functions for mesh object skinning
+* @author vir@lindenlab.com
+*
+* $LicenseInfo:firstyear=2015&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2015, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llskinningutil.h"
+#include "llvoavatar.h"
+#include "llviewercontrol.h"
+#include "llmeshrepository.h"
+
+bool LLSkinningUtil::sIncludeEnhancedSkeleton = true;
+
+namespace {
+
+bool get_name_index(const std::string& name, std::vector<std::string>& names, U32& result)
+{
+ std::vector<std::string>::const_iterator find_it =
+ std::find(names.begin(), names.end(), name);
+ if (find_it != names.end())
+ {
+ result = find_it - names.begin();
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+// Find a name table index that is also a valid joint on the
+// avatar. Order of preference is: requested name, mPelvis, first
+// valid match in names table.
+U32 get_valid_joint_index(const std::string& name, LLVOAvatar *avatar, std::vector<std::string>& joint_names)
+{
+ U32 result;
+ if (avatar->getJoint(name) && get_name_index(name,joint_names,result))
+ {
+ return result;
+ }
+ if (get_name_index("mPelvis",joint_names,result))
+ {
+ return result;
+ }
+ for (U32 j=0; j<joint_names.size(); j++)
+ {
+ if (avatar->getJoint(joint_names[j]))
+ {
+ return j;
+ }
+ }
+ // BENTO how to handle?
+ LL_ERRS() << "no valid joints in joint_names" << LL_ENDL;
+ return 0;
+}
+
+// Which joint will stand in for this joint?
+U32 get_proxy_joint_index(U32 joint_index, LLVOAvatar *avatar, std::vector<std::string>& joint_names)
+{
+ bool include_enhanced = LLSkinningUtil::sIncludeEnhancedSkeleton;
+ U32 j_proxy = get_valid_joint_index(joint_names[joint_index], avatar, joint_names);
+ LLJoint *joint = avatar->getJoint(joint_names[j_proxy]);
+ llassert(joint);
+ // Find the first ancestor that's not flagged as extended, or the
+ // last ancestor that's rigged in this mesh, whichever
+ // comes first.
+ while (1)
+ {
+ if (include_enhanced ||
+ joint->getSupport()==LLJoint::SUPPORT_BASE)
+ break;
+ LLJoint *parent = joint->getParent();
+ if (!parent)
+ break;
+ if (!get_name_index(parent->getName(), joint_names, j_proxy))
+ {
+ break;
+ }
+ joint = parent;
+ }
+ return j_proxy;
+}
+
+}
+
+// static
+void LLSkinningUtil::initClass()
+{
+ sIncludeEnhancedSkeleton = gSavedSettings.getBOOL("IncludeEnhancedSkeleton");
+}
+
+// static
+U32 LLSkinningUtil::getMaxJointCount()
+{
+ U32 result = LL_MAX_JOINTS_PER_MESH_OBJECT;
+ if (!sIncludeEnhancedSkeleton)
+ {
+ // BENTO - currently the remap logic does not guarantee joint count <= 52;
+ // if one of the base ancestors is not rigged in a given mesh, an extended
+ // joint can still be included.
+ result = llmin(result,(U32)52);
+ }
+ return result;
+}
+
+// static
+U32 LLSkinningUtil::getMeshJointCount(const LLMeshSkinInfo *skin)
+{
+ return llmin((U32)getMaxJointCount(), (U32)skin->mJointNames.size());
+}
+
+// static
+
+// Destructively remap the joints in skin info based on what joints
+// are known in the avatar, and which are currently supported. This
+// will also populate mJointRemap[] in the skin, which can be used to
+// make the corresponding changes to the integer part of vertex
+// weights.
+//
+// This will throw away joint info for any joints that are not known
+// in the avatar, or not currently flagged to support based on the
+// debug setting for IncludeEnhancedSkeleton.
+//
+
+// BENTO maybe this really only makes sense for new leaf joints? New spine
+// joints may need different logic.
+
+// static
+void LLSkinningUtil::remapSkinInfoJoints(LLVOAvatar *avatar, LLMeshSkinInfo* skin)
+{
+ // skip if already done.
+ if (!skin->mJointRemap.empty())
+ {
+ return;
+ }
+
+ U32 max_joints = getMeshJointCount(skin);
+
+ // Compute the remap
+ std::vector<U32> j_proxy(skin->mJointNames.size());
+ for (U32 j = 0; j < skin->mJointNames.size(); ++j)
+ {
+ U32 j_rep = get_proxy_joint_index(j, avatar, skin->mJointNames);
+ j_proxy[j] = j_rep;
+ }
+ S32 top = 0;
+ std::vector<U32> j_remap(skin->mJointNames.size());
+ // Fill in j_remap for all joints that will be kept.
+ for (U32 j = 0; j < skin->mJointNames.size(); ++j)
+ {
+ if (j_proxy[j] == j)
+ {
+ // Joint will be included
+ j_remap[j] = top;
+ if (top < max_joints-1)
+ {
+ top++;
+ }
+
+
+ }
+ }
+ // Then use j_proxy to fill in j_remap for the joints that will be discarded
+ for (U32 j = 0; j < skin->mJointNames.size(); ++j)
+ {
+ if (j_proxy[j] != j)
+ {
+ j_remap[j] = j_remap[j_proxy[j]];
+ }
+ }
+
+
+ // Apply the remap to mJointNames, mInvBindMatrix, and mAlternateBindMatrix
+ std::vector<std::string> new_joint_names;
+ std::vector<LLMatrix4> new_inv_bind_matrix;
+ std::vector<LLMatrix4> new_alternate_bind_matrix;
+
+ for (U32 j = 0; j < skin->mJointNames.size(); ++j)
+ {
+ if (j_proxy[j] == j && new_joint_names.size() < max_joints)
+ {
+ new_joint_names.push_back(skin->mJointNames[j]);
+ new_inv_bind_matrix.push_back(skin->mInvBindMatrix[j]);
+ if (!skin->mAlternateBindMatrix.empty())
+ {
+ new_alternate_bind_matrix.push_back(skin->mAlternateBindMatrix[j]);
+ }
+ }
+ }
+ llassert(new_joint_names.size() <= max_joints);
+
+ for (U32 j = 0; j < skin->mJointNames.size(); ++j)
+ {
+ if (skin->mJointNames[j] != new_joint_names[j_remap[j]])
+ {
+ LL_DEBUGS("Avatar") << "Starting joint[" << j << "] = " << skin->mJointNames[j] << " j_remap " << j_remap[j] << " ==> " << new_joint_names[j_remap[j]] << LL_ENDL;
+ }
+ }
+
+ skin->mJointNames = new_joint_names;
+ skin->mInvBindMatrix = new_inv_bind_matrix;
+ skin->mAlternateBindMatrix = new_alternate_bind_matrix;
+ skin->mJointRemap = j_remap;
+}
+
+// static
+void LLSkinningUtil::initSkinningMatrixPalette(
+ LLMatrix4* mat,
+ S32 count,
+ const LLMeshSkinInfo* skin,
+ LLVOAvatar *avatar)
+{
+ // BENTO - switching to use Matrix4a and SSE might speed this up.
+ // Note that we are mostly passing Matrix4a's to this routine anyway, just dubiously casted.
+ for (U32 j = 0; j < count; ++j)
+ {
+ LLJoint* joint = avatar->getJoint(skin->mJointNames[j]);
+ mat[j] = skin->mInvBindMatrix[j];
+ if (joint)
+ {
+ mat[j] *= joint->getWorldMatrix();
+ }
+ else
+ {
+ // This shouldn't happen - in mesh upload, skinned
+ // rendering should be disabled unless all joints are
+ // valid. In other cases of skinned rendering, invalid
+ // joints should already have been removed during remap.
+ LL_WARNS_ONCE("Avatar") << "Rigged to invalid joint name " << skin->mJointNames[j] << LL_ENDL;
+ }
+ }
+}
+
+// Transform the weights based on the remap info stored in skin. Note
+// that this is destructive and non-idempotent, so we need to keep
+// track of whether we've done it already. If the desired remapping
+// changes, the viewer must be restarted.
+//
+// static
+void LLSkinningUtil::remapSkinWeights(LLVector4a* weights, U32 num_vertices, const LLMeshSkinInfo* skin)
+{
+ llassert(skin->mJointRemap.size()>0); // Must call remapSkinInfoJoints() first, which this checks for.
+ const U32* remap = &skin->mJointRemap[0];
+ const S32 max_joints = skin->mJointRemap.size();
+ for (U32 j=0; j<num_vertices; j++)
+ {
+ F32 *w = weights[j].getF32ptr();
+
+ for (U32 k=0; k<4; ++k)
+ {
+ S32 i = llfloor(w[k]);
+ F32 f = w[k]-i;
+ i = llclamp(i,0,max_joints-1);
+ w[k] = remap[i] + f;
+ }
+ }
+}
+
+// static
+void LLSkinningUtil::checkSkinWeights(LLVector4a* weights, U32 num_vertices, const LLMeshSkinInfo* skin)
+{
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ const S32 max_joints = skin->mJointNames.size();
+ if (skin->mJointRemap.size()>0)
+ {
+ // Check the weights are consistent with the current remap.
+ for (U32 j=0; j<num_vertices; j++)
+ {
+ F32 *w = weights[j].getF32ptr();
+
+ F32 wsum = 0.0;
+ for (U32 k=0; k<4; ++k)
+ {
+ S32 i = llfloor(w[k]);
+ llassert(i>=0);
+ llassert(i<max_joints);
+ wsum += w[k]-i;
+ }
+ llassert(wsum > 0.0f);
+ }
+ }
+#endif
+}
+
+// static
+void LLSkinningUtil::getPerVertexSkinMatrix(
+ F32* weights,
+ LLMatrix4a* mat,
+ bool handle_bad_scale,
+ LLMatrix4a& final_mat,
+ U32 max_joints)
+{
+ bool valid_weights = true;
+ final_mat.clear();
+
+ S32 idx[4];
+
+ LLVector4 wght;
+
+ F32 scale = 0.f;
+ for (U32 k = 0; k < 4; k++)
+ {
+ F32 w = weights[k];
+
+ // BENTO potential optimizations
+ // - Do clamping in unpackVolumeFaces() (once instead of every time)
+ // - int vs floor: if we know w is
+ // >= 0.0, we can use int instead of floorf; the latter
+ // allegedly has a lot of overhead due to ieeefp error
+ // checking which we should not need.
+ idx[k] = llclamp((S32) floorf(w), (S32)0, (S32)max_joints-1);
+
+ wght[k] = w - floorf(w);
+ scale += wght[k];
+ }
+ if (handle_bad_scale && scale <= 0.f)
+ {
+ wght = LLVector4(1.0f, 0.0f, 0.0f, 0.0f);
+ valid_weights = false;
+ }
+ else
+ {
+ // This is enforced in unpackVolumeFaces()
+ llassert(scale>0.f);
+ wght *= 1.f/scale;
+ }
+
+ for (U32 k = 0; k < 4; k++)
+ {
+ F32 w = wght[k];
+
+ LLMatrix4a src;
+ src.setMul(mat[idx[k]], w);
+
+ final_mat.add(src);
+ }
+ // SL-366 - with weight validation/cleanup code, it should no longer be
+ // possible to hit the bad scale case.
+ llassert(valid_weights);
+}
+
diff --git a/indra/newview/llskinningutil.h b/indra/newview/llskinningutil.h
new file mode 100644
index 0000000000..9a28100dc3
--- /dev/null
+++ b/indra/newview/llskinningutil.h
@@ -0,0 +1,50 @@
+/**
+* @file llskinningutil.h
+* @brief Functions for mesh object skinning
+* @author vir@lindenlab.com
+*
+* $LicenseInfo:firstyear=2015&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2015, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+#ifndef LLSKINNINGUTIL_H
+#define LLSKINNINGUTIL_H
+
+class LLVOAvatar;
+class LLMeshSkinInfo;
+class LLMatrix4a;
+
+class LLSkinningUtil
+{
+public:
+ static void initClass();
+ static U32 getMaxJointCount();
+ static U32 getMeshJointCount(const LLMeshSkinInfo *skin);
+ static void remapSkinInfoJoints(LLVOAvatar *avatar, LLMeshSkinInfo* skin);
+ static void initSkinningMatrixPalette(LLMatrix4* mat, S32 count, const LLMeshSkinInfo* skin, LLVOAvatar *avatar);
+ static void checkSkinWeights(LLVector4a* weights, U32 num_vertices, const LLMeshSkinInfo* skin);
+ static void remapSkinWeights(LLVector4a* weights, U32 num_vertices, const LLMeshSkinInfo* skin);
+ static void getPerVertexSkinMatrix(F32* weights, LLMatrix4a* mat, bool handle_bad_scale, LLMatrix4a& final_mat, U32 max_joints);
+
+ // This is initialized from gSavedSettings at startup and then left alone.
+ static bool sIncludeEnhancedSkeleton;
+};
+
+#endif
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index b0eb4137a7..0fd36766b3 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -3213,6 +3213,11 @@ void renderAvatarCollisionVolumes(LLVOAvatar* avatar)
avatar->renderCollisionVolumes();
}
+void renderAvatarBones(LLVOAvatar* avatar)
+{
+ avatar->renderBones();
+}
+
void renderAgentTarget(LLVOAvatar* avatar)
{
// render these for self only (why, i don't know)
@@ -3371,6 +3376,11 @@ public:
renderAvatarCollisionVolumes(avatar);
}
+ if (avatar && gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_AVATAR_JOINTS))
+ {
+ renderAvatarBones(avatar);
+ }
+
if (avatar && gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_AGENT_TARGET))
{
renderAgentTarget(avatar);
@@ -3661,6 +3671,7 @@ void LLSpatialPartition::renderDebug()
LLPipeline::RENDER_DEBUG_TEXTURE_ANIM |
LLPipeline::RENDER_DEBUG_RAYCAST |
LLPipeline::RENDER_DEBUG_AVATAR_VOLUME |
+ LLPipeline::RENDER_DEBUG_AVATAR_JOINTS |
LLPipeline::RENDER_DEBUG_AGENT_TARGET |
//LLPipeline::RENDER_DEBUG_BUILD_QUEUE |
LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA |
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 88fbd233b8..79b5130bd3 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -28,6 +28,7 @@
#include "llappviewer.h"
#include "llstartup.h"
+#include "llcallstack.h"
#if LL_WINDOWS
# include <process.h> // _spawnl()
@@ -194,6 +195,8 @@
#include "lltoolbarview.h"
#include "llexperiencelog.h"
+#include "llstacktrace.h"
+
#if LL_WINDOWS
#include "lldxhardware.h"
#endif
@@ -1216,7 +1219,7 @@ bool idle_startup()
LLPostProcess::initClass();
display_startup();
- LLAvatarAppearance::initClass();
+ LLAvatarAppearance::initClass("avatar_lad.xml","avatar_skeleton.xml");
display_startup();
LLViewerObject::initVOClasses();
diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp
index fd950864aa..01d799dcd5 100644
--- a/indra/newview/lltoolbarview.cpp
+++ b/indra/newview/lltoolbarview.cpp
@@ -283,7 +283,7 @@ bool LLToolBarView::loadToolbars(bool force_default)
}
BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.left_toolbar.commands)
{
- if (addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_LEFT]))
+ if (!addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_LEFT]))
{
LL_WARNS() << "Error adding command '" << command_params.name() << "' to left toolbar." << LL_ENDL;
}
@@ -298,7 +298,7 @@ bool LLToolBarView::loadToolbars(bool force_default)
}
BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.right_toolbar.commands)
{
- if (addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]))
+ if (!addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]))
{
LL_WARNS() << "Error adding command '" << command_params.name() << "' to right toolbar." << LL_ENDL;
}
@@ -313,7 +313,7 @@ bool LLToolBarView::loadToolbars(bool force_default)
}
BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.bottom_toolbar.commands)
{
- if (addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]))
+ if (!addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]))
{
LL_WARNS() << "Error adding command '" << command_params.name() << "' to bottom toolbar." << LL_ENDL;
}
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 16f40fb747..f2680ce25d 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -67,6 +67,7 @@
#include "llvowlsky.h"
#include "llrender.h"
#include "llnavigationbar.h"
+#include "llnotificationsutil.h"
#include "llfloatertools.h"
#include "llpaneloutfitsinventory.h"
#include "llpanellogin.h"
@@ -119,6 +120,19 @@ static bool handleTerrainDetailChanged(const LLSD& newvalue)
}
+static bool handleDebugAvatarJointsChanged(const LLSD& newvalue)
+{
+ std::string new_string = newvalue.asString();
+ LLJoint::setDebugJointNames(new_string);
+ return true;
+}
+
+static bool handleDeferredDebugSettingChanged(const LLSD& newvalue)
+{
+ LLNotificationsUtil::add("ChangeDeferredDebugSetting");
+ return true;
+}
+
static bool handleSetShaderChanged(const LLSD& newvalue)
{
// changing shader level may invalidate existing cached bump maps, as the shader type determines the format of the bump map it expects - clear and repopulate the bump cache
@@ -741,6 +755,8 @@ void settings_setup_listeners()
gSavedSettings.getControl("SpellCheck")->getSignal()->connect(boost::bind(&handleSpellCheckChanged));
gSavedSettings.getControl("SpellCheckDictionary")->getSignal()->connect(boost::bind(&handleSpellCheckChanged));
gSavedSettings.getControl("LoginLocation")->getSignal()->connect(boost::bind(&handleLoginLocationChanged));
+ gSavedSettings.getControl("IncludeEnhancedSkeleton")->getCommitSignal()->connect(boost::bind(&handleDeferredDebugSettingChanged, _2));
+ gSavedSettings.getControl("DebugAvatarJoints")->getCommitSignal()->connect(boost::bind(&handleDebugAvatarJointsChanged, _2));
}
#if TEST_CACHED_CONTROL
diff --git a/indra/newview/llviewerjoint.cpp b/indra/newview/llviewerjoint.cpp
index e46299f9d2..b7bd131246 100644
--- a/indra/newview/llviewerjoint.cpp
+++ b/indra/newview/llviewerjoint.cpp
@@ -48,14 +48,13 @@ LLViewerJoint::LLViewerJoint() :
LLAvatarJoint()
{ }
-LLViewerJoint::LLViewerJoint(const std::string &name, LLJoint *parent) :
- LLAvatarJoint(name, parent)
-{ }
-
LLViewerJoint::LLViewerJoint(S32 joint_num) :
LLAvatarJoint(joint_num)
{ }
+LLViewerJoint::LLViewerJoint(const std::string &name, LLJoint *parent) :
+ LLAvatarJoint(name, parent)
+{ }
//-----------------------------------------------------------------------------
// ~LLViewerJoint()
diff --git a/indra/newview/llviewerjoint.h b/indra/newview/llviewerjoint.h
index fd262b6e80..abe11bbf5c 100644
--- a/indra/newview/llviewerjoint.h
+++ b/indra/newview/llviewerjoint.h
@@ -44,7 +44,8 @@ class LLViewerJoint :
{
public:
LLViewerJoint();
- LLViewerJoint(S32 joint_num);
+ LLViewerJoint(S32 joint_num);
+
// *TODO: Only used for LLVOAvatarSelf::mScreenp. *DOES NOT INITIALIZE mResetAfterRestoreOldXform*
LLViewerJoint(const std::string &name, LLJoint *parent = NULL);
virtual ~LLViewerJoint();
diff --git a/indra/newview/llviewerjointattachment.cpp b/indra/newview/llviewerjointattachment.cpp
index 888decd3be..66e392ac42 100644
--- a/indra/newview/llviewerjointattachment.cpp
+++ b/indra/newview/llviewerjointattachment.cpp
@@ -352,6 +352,7 @@ void LLViewerJointAttachment::setAttachmentVisibility(BOOL visible)
void LLViewerJointAttachment::setOriginalPosition(LLVector3& position)
{
mOriginalPos = position;
+ // SL-315
setPosition(position);
}
diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp
index bf7cf08c63..43a81ada49 100644
--- a/indra/newview/llviewerjointmesh.cpp
+++ b/indra/newview/llviewerjointmesh.cpp
@@ -203,7 +203,7 @@ void LLViewerJointMesh::uploadJointMatrices()
// DrawElementsBLEND and utility code
//--------------------------------------------------------------------
-// compate_int is used by the qsort function to sort the index array
+// compare_int is used by the qsort function to sort the index array
int compare_int(const void *a, const void *b)
{
if (*(U32*)a < *(U32*)b)
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 99a9ed1d75..0b0d12c5b8 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -187,10 +187,10 @@ LLMenuGL* gDetachSubMenu = NULL;
LLMenuGL* gTakeOffClothes = NULL;
LLContextMenu* gAttachScreenPieMenu = NULL;
LLContextMenu* gAttachPieMenu = NULL;
-LLContextMenu* gAttachBodyPartPieMenus[8];
+LLContextMenu* gAttachBodyPartPieMenus[9];
LLContextMenu* gDetachPieMenu = NULL;
LLContextMenu* gDetachScreenPieMenu = NULL;
-LLContextMenu* gDetachBodyPartPieMenus[8];
+LLContextMenu* gDetachBodyPartPieMenus[9];
//
// Local prototypes
@@ -5998,6 +5998,18 @@ class LLAvatarToggleMyProfile : public view_listener_t
}
};
+class LLAvatarResetSkeleton: public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
+ if(avatar)
+ {
+ avatar->resetSkeleton();
+ }
+ return true;
+ }
+};
class LLAvatarAddContact : public view_listener_t
{
@@ -8984,6 +8996,7 @@ void initialize_menus()
enable.add("Avatar.EnableCall", boost::bind(&LLAvatarActions::canCall));
view_listener_t::addMenu(new LLAvatarReportAbuse(), "Avatar.ReportAbuse");
view_listener_t::addMenu(new LLAvatarToggleMyProfile(), "Avatar.ToggleMyProfile");
+ view_listener_t::addMenu(new LLAvatarResetSkeleton(), "Avatar.ResetSkeleton");
enable.add("Avatar.IsMyProfileOpen", boost::bind(&my_profile_visible));
commit.add("Avatar.OpenMarketplace", boost::bind(&LLWeb::loadURLExternal, gSavedSettings.getString("MarketplaceURL")));
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index b7bdf00157..8ce3c69787 100644
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -188,8 +188,8 @@ extern LLContextMenu* gAttachScreenPieMenu;
extern LLContextMenu* gDetachScreenPieMenu;
extern LLContextMenu* gAttachPieMenu;
extern LLContextMenu* gDetachPieMenu;
-extern LLContextMenu* gAttachBodyPartPieMenus[8];
-extern LLContextMenu* gDetachBodyPartPieMenus[8];
+extern LLContextMenu* gAttachBodyPartPieMenus[9];
+extern LLContextMenu* gDetachBodyPartPieMenus[9];
extern LLMenuItemCallGL* gMutePieMenu;
extern LLMenuItemCallGL* gMuteObjectPieMenu;
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index dafe2cafec..3e0cec0f09 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -27,6 +27,8 @@
#include "llviewerprecompiledheaders.h"
+#include <boost/lexical_cast.hpp>
+
#include "llfeaturemanager.h"
#include "llviewershadermgr.h"
@@ -41,6 +43,8 @@
#include "llsky.h"
#include "llvosky.h"
#include "llrender.h"
+#include "lljoint.h"
+#include "llskinningutil.h"
#ifdef LL_RELEASE_FOR_DOWNLOAD
#define UNIFORM_ERRS LL_WARNS_ONCE("Shader")
@@ -871,7 +875,9 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
shaders.push_back( make_pair( "objects/nonindexedTextureV.glsl", 1 ) );
boost::unordered_map<std::string, std::string> attribs;
-
+ attribs["MAX_JOINTS_PER_MESH_OBJECT"] =
+ boost::lexical_cast<std::string>(LLSkinningUtil::getMaxJointCount());
+
// We no longer have to bind the shaders to global glhandles, they are automatically added to a map now.
for (U32 i = 0; i < shaders.size(); i++)
{
diff --git a/indra/newview/llviewerwearable.cpp b/indra/newview/llviewerwearable.cpp
index 0f73515b5d..8d482b2e34 100644
--- a/indra/newview/llviewerwearable.cpp
+++ b/indra/newview/llviewerwearable.cpp
@@ -70,7 +70,7 @@ private:
};
// Private local functions
-static std::string asset_id_to_filename(const LLUUID &asset_id);
+static std::string asset_id_to_filename(const LLUUID &asset_id, const ELLPath dir_spec);
LLViewerWearable::LLViewerWearable(const LLTransactionID& transaction_id) :
LLWearable(),
@@ -508,7 +508,7 @@ void LLViewerWearable::saveNewAsset() const
// LL_INFOS() << "LLViewerWearable::saveNewAsset() type: " << getTypeName() << LL_ENDL;
//LL_INFOS() << *this << LL_ENDL;
- const std::string filename = asset_id_to_filename(mAssetID);
+ const std::string filename = asset_id_to_filename(mAssetID, LL_PATH_CACHE);
if(! exportFile(filename))
{
std::string buffer = llformat("Unable to save '%s' to wearable file.", mName.c_str());
@@ -520,6 +520,12 @@ void LLViewerWearable::saveNewAsset() const
return;
}
+ if (gSavedSettings.getBOOL("LogWearableAssetSave"))
+ {
+ const std::string log_filename = asset_id_to_filename(mAssetID, LL_PATH_LOGS);
+ exportFile(log_filename);
+ }
+
// save it out to database
if( gAssetStorage )
{
@@ -568,7 +574,7 @@ void LLViewerWearable::onSaveNewAssetComplete(const LLUUID& new_asset_id, void*
}
// Delete temp file
- const std::string src_filename = asset_id_to_filename(new_asset_id);
+ const std::string src_filename = asset_id_to_filename(new_asset_id, LL_PATH_CACHE);
LLFile::remove(src_filename);
// delete the context data
@@ -605,10 +611,10 @@ std::ostream& operator<<(std::ostream &s, const LLViewerWearable &w)
return s;
}
-std::string asset_id_to_filename(const LLUUID &asset_id)
+std::string asset_id_to_filename(const LLUUID &asset_id, const ELLPath dir_spec)
{
std::string asset_id_string;
asset_id.toString(asset_id_string);
- std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,asset_id_string) + ".wbl";
+ std::string filename = gDirUtilp->getExpandedFilename(dir_spec,asset_id_string) + ".wbl";
return filename;
}
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index b9dd43f061..0728509bcd 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -106,6 +106,8 @@
#include "llsdutil.h"
#include "llscenemonitor.h"
#include "llsdserialize.h"
+#include "llcallstack.h"
+#include "llrendersphere.h"
extern F32 SPEED_ADJUST_MAX;
extern F32 SPEED_ADJUST_MAX_SEC;
@@ -214,26 +216,8 @@ struct LLTextureMaskData
**
**/
-//------------------------------------------------------------------------
-// LLVOAvatarBoneInfo
-// Trans/Scale/Rot etc. info about each avatar bone. Used by LLVOAvatarSkeleton.
-//------------------------------------------------------------------------
-struct LLVOAvatarCollisionVolumeInfo : public LLInitParam::Block<LLVOAvatarCollisionVolumeInfo>
-{
- LLVOAvatarCollisionVolumeInfo()
- : name("name"),
- pos("pos"),
- rot("rot"),
- scale("scale")
- {}
-
- Mandatory<std::string> name;
- Mandatory<LLVector3> pos,
- rot,
- scale;
-};
-struct LLAppearanceMessageContents
+struct LLAppearanceMessageContents: public LLRefCount
{
LLAppearanceMessageContents():
mAppearanceVersion(-1),
@@ -253,49 +237,6 @@ struct LLAppearanceMessageContents
bool mHoverOffsetWasSet;
};
-struct LLVOAvatarChildJoint : public LLInitParam::ChoiceBlock<LLVOAvatarChildJoint>
- {
- Alternative<Lazy<struct LLVOAvatarBoneInfo, IS_A_BLOCK> > bone;
- Alternative<LLVOAvatarCollisionVolumeInfo> collision_volume;
-
- LLVOAvatarChildJoint()
- : bone("bone"),
- collision_volume("collision_volume")
- {}
-};
-
-
-
-struct LLVOAvatarBoneInfo : public LLInitParam::Block<LLVOAvatarBoneInfo, LLVOAvatarCollisionVolumeInfo>
-{
- LLVOAvatarBoneInfo()
- : pivot("pivot")
- {}
-
- Mandatory<LLVector3> pivot;
- Multiple<LLVOAvatarChildJoint> children;
-};
-
-//------------------------------------------------------------------------
-// LLVOAvatarSkeletonInfo
-// Overall avatar skeleton
-//------------------------------------------------------------------------
-struct LLVOAvatarSkeletonInfo : public LLInitParam::Block<LLVOAvatarSkeletonInfo>
-{
- LLVOAvatarSkeletonInfo()
- : skeleton_root(""),
- num_bones("num_bones"),
- num_collision_volumes("num_collision_volumes"),
- version("version")
- {}
-
- Mandatory<std::string> version;
- Mandatory<S32> num_bones,
- num_collision_volumes;
- Mandatory<LLVOAvatarChildJoint> skeleton_root;
-};
-
-
//-----------------------------------------------------------------------------
// class LLBodyNoiseMotion
@@ -1111,7 +1052,6 @@ void LLVOAvatar::deleteCachedImages(bool clearAll)
{
if (LLViewerTexLayerSet::sHasCaches)
{
- LL_DEBUGS() << "Deleting layer set caches" << LL_ENDL;
for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
iter != LLCharacter::sInstances.end(); ++iter)
{
@@ -1142,6 +1082,9 @@ void LLVOAvatar::initClass()
gAnimLibrary.animStateSetString(ANIM_AGENT_PELVIS_FIX,"pelvis_fix");
gAnimLibrary.animStateSetString(ANIM_AGENT_TARGET,"target");
gAnimLibrary.animStateSetString(ANIM_AGENT_WALK_ADJUST,"walk_adjust");
+
+ // Where should this be set initially?
+ LLJoint::setDebugJointNames(gSavedSettings.getString("DebugAvatarJoints"));
}
@@ -1395,18 +1338,78 @@ void LLVOAvatar::getSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
newMax.add(buffer);
}
+void render_sphere_and_line(const LLVector3& begin_pos, const LLVector3& end_pos, F32 sphere_scale, const LLVector3& occ_color, const LLVector3& visible_color)
+{
+ // Unoccluded bone portions
+ LLGLDepthTest normal_depth(GL_TRUE);
+
+ // Draw line segment for unoccluded joint
+ gGL.diffuseColor3f(visible_color[0], visible_color[1], visible_color[2]);
+
+ gGL.begin(LLRender::LINES);
+ gGL.vertex3fv(begin_pos.mV);
+ gGL.vertex3fv(end_pos.mV);
+ gGL.end();
+
+
+ // Draw sphere representing joint pos
+ gGL.pushMatrix();
+ gGL.scalef(sphere_scale, sphere_scale, sphere_scale);
+ gSphere.renderGGL();
+ gGL.popMatrix();
+
+ LLGLDepthTest depth_under(GL_TRUE, GL_FALSE, GL_GREATER);
+
+ // Occluded bone portions
+ gGL.diffuseColor3f(occ_color[0], occ_color[1], occ_color[2]);
+
+ gGL.begin(LLRender::LINES);
+ gGL.vertex3fv(begin_pos.mV);
+ gGL.vertex3fv(end_pos.mV);
+ gGL.end();
+
+ // Draw sphere representing joint pos
+ gGL.pushMatrix();
+ gGL.scalef(sphere_scale, sphere_scale, sphere_scale);
+ gSphere.renderGGL();
+ gGL.popMatrix();
+}
+
//-----------------------------------------------------------------------------
// renderCollisionVolumes()
//-----------------------------------------------------------------------------
void LLVOAvatar::renderCollisionVolumes()
{
std::ostringstream ostr;
+
for (S32 i = 0; i < mNumCollisionVolumes; i++)
{
- mCollisionVolumes[i].renderCollision();
ostr << mCollisionVolumes[i].getName() << ", ";
- }
+ LLAvatarJointCollisionVolume& collision_volume = mCollisionVolumes[i];
+
+ collision_volume.updateWorldMatrix();
+
+ gGL.pushMatrix();
+ gGL.multMatrix( &collision_volume.getXform()->getWorldMatrix().mMatrix[0][0] );
+
+ LLVector3 begin_pos(0,0,0);
+ LLVector3 end_pos(collision_volume.getEnd());
+ static F32 sphere_scale = 1.0f;
+ static F32 center_dot_scale = 0.05f;
+
+ static LLVector3 CV_COLOR_OCCLUDED(0.0f, 0.0f, 1.0f);
+ static LLVector3 CV_COLOR_VISIBLE(0.5f, 0.5f, 1.0f);
+ static LLVector3 DOT_COLOR_OCCLUDED(1.0f, 1.0f, 1.0f);
+ static LLVector3 DOT_COLOR_VISIBLE(1.0f, 1.0f, 1.0f);
+
+ render_sphere_and_line(begin_pos, end_pos, sphere_scale, CV_COLOR_OCCLUDED, CV_COLOR_VISIBLE);
+ render_sphere_and_line(begin_pos, end_pos, center_dot_scale, DOT_COLOR_OCCLUDED, DOT_COLOR_VISIBLE);
+
+ gGL.popMatrix();
+ }
+
+
if (mNameText.notNull())
{
LLVector4a unused;
@@ -1418,6 +1421,67 @@ void LLVOAvatar::renderCollisionVolumes()
addDebugText(ostr.str());
}
+void LLVOAvatar::renderBones()
+{
+ LLGLEnable blend(GL_BLEND);
+
+ avatar_joint_list_t::iterator iter = mSkeleton.begin();
+ avatar_joint_list_t::iterator end = mSkeleton.end();
+
+ static LLVector3 BASE_COLOR_OCCLUDED(1.0f, 0.0f, 0.0f);
+ static LLVector3 BASE_COLOR_VISIBLE(0.5f, 0.5f, 0.5f);
+ static LLVector3 EXTENDED_COLOR_OCCLUDED(0.0f, 1.0f, 0.0f);
+ static LLVector3 EXTENDED_COLOR_VISIBLE(0.5f, 0.5f, 0.5f);
+ static LLVector3 RIGGED_COLOR_OCCLUDED(0.0f, 1.0f, 1.0f);
+ static LLVector3 RIGGED_COLOR_VISIBLE(0.5f, 0.5f, 0.5f);
+
+ static F32 SPHERE_SCALEF = 0.001f;
+
+ for (; iter != end; ++iter)
+ {
+ LLJoint* jointp = *iter;
+ if (!jointp)
+ {
+ continue;
+ }
+
+ jointp->updateWorldMatrix();
+ LLJoint::SupportCategory sc = jointp->getSupport();
+ LLVector3 occ_color, visible_color;
+
+ if (jointIsRiggedTo(jointp->getName()))
+ {
+ occ_color = RIGGED_COLOR_OCCLUDED;
+ visible_color = RIGGED_COLOR_VISIBLE;
+ }
+ else
+ {
+ if (sc == LLJoint::SUPPORT_BASE)
+ {
+ occ_color = BASE_COLOR_OCCLUDED;
+ visible_color = BASE_COLOR_VISIBLE;
+ }
+ else
+ {
+ occ_color = EXTENDED_COLOR_OCCLUDED;
+ visible_color = EXTENDED_COLOR_VISIBLE;
+ }
+ }
+ LLVector3 begin_pos(0,0,0);
+ LLVector3 end_pos(jointp->getEnd());
+
+ F32 sphere_scale = SPHERE_SCALEF;
+
+ gGL.pushMatrix();
+ gGL.multMatrix( &jointp->getXform()->getWorldMatrix().mMatrix[0][0] );
+
+ render_sphere_and_line(begin_pos, end_pos, sphere_scale, occ_color, visible_color);
+
+ gGL.popMatrix();
+ }
+}
+
+
void LLVOAvatar::renderJoints()
{
std::ostringstream ostr;
@@ -1525,7 +1589,7 @@ BOOL LLVOAvatar::lineSegmentIntersect(const LLVector4a& start, const LLVector4a&
for (S32 i = 0; i < mNumCollisionVolumes; ++i)
{
mCollisionVolumes[i].updateWorldMatrix();
-
+
glh::matrix4f mat((F32*) mCollisionVolumes[i].getXform()->getWorldMatrix().mMatrix);
glh::matrix4f inverse = mat.inverse();
glh::matrix4f norm_mat = inverse.transpose();
@@ -1734,6 +1798,116 @@ void LLVOAvatar::buildCharacter()
mMeshValid = TRUE;
}
+//-----------------------------------------------------------------------------
+// resetVisualParams()
+//-----------------------------------------------------------------------------
+void LLVOAvatar::resetVisualParams()
+{
+ // Skeletal params
+ {
+ LLAvatarXmlInfo::skeletal_distortion_info_list_t::iterator iter;
+ for (iter = sAvatarXmlInfo->mSkeletalDistortionInfoList.begin();
+ iter != sAvatarXmlInfo->mSkeletalDistortionInfoList.end();
+ ++iter)
+ {
+ LLPolySkeletalDistortionInfo *info = (LLPolySkeletalDistortionInfo*)*iter;
+ LLPolySkeletalDistortion *param = dynamic_cast<LLPolySkeletalDistortion*>(getVisualParam(info->getID()));
+ *param = LLPolySkeletalDistortion(this);
+ llassert(param);
+ if (!param->setInfo(info))
+ {
+ llassert(false);
+ }
+ }
+ }
+
+ // Driver parameters
+ for (LLAvatarXmlInfo::driver_info_list_t::iterator iter = sAvatarXmlInfo->mDriverInfoList.begin();
+ iter != sAvatarXmlInfo->mDriverInfoList.end();
+ ++iter)
+ {
+ LLDriverParamInfo *info = *iter;
+ LLDriverParam *param = dynamic_cast<LLDriverParam*>(getVisualParam(info->getID()));
+ LLDriverParam::entry_list_t driven_list = param->getDrivenList();
+ *param = LLDriverParam(this);
+ llassert(param);
+ if (!param->setInfo(info))
+ {
+ llassert(false);
+ }
+ param->setDrivenList(driven_list);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// resetSkeleton()
+//-----------------------------------------------------------------------------
+void LLVOAvatar::resetSkeleton()
+{
+ LL_DEBUGS("Avatar") << avString() << " reset starts" << LL_ENDL;
+ if (!mLastProcessedAppearance)
+ {
+ LL_WARNS() << "Can't reset avatar; no appearance message has been received yet." << LL_ENDL;
+ return;
+ }
+
+ // Clear all attachment pos overrides
+ clearAttachmentPosOverrides();
+
+ // Note that we call buildSkeleton twice in this function. The first time is
+ // just to get the right scale for the collision volumes, because
+ // this will be used in setting the mJointScales for the
+ // LLPolySkeletalDistortions of which the CVs are children.
+ if( !buildSkeleton(sAvatarSkeletonInfo) )
+ {
+ LL_ERRS() << "Error resetting skeleton" << LL_ENDL;
+ }
+
+ // Reset some params to default state, without propagating changes downstream.
+ resetVisualParams();
+
+ // Now we have to reset the skeleton again, because its state
+ // got clobbered by the resetVisualParams() calls
+ // above.
+ if( !buildSkeleton(sAvatarSkeletonInfo) )
+ {
+ LL_ERRS() << "Error resetting skeleton" << LL_ENDL;
+ }
+
+ // Reset attachment points (buildSkeleton only does bones and CVs)
+ bool ignore_hud_joints = true;
+ initAttachmentPoints(ignore_hud_joints);
+
+ // Fix up collision volumes
+ for (LLVisualParam *param = getFirstVisualParam();
+ param;
+ param = getNextVisualParam())
+ {
+ LLPolyMorphTarget *poly_morph = dynamic_cast<LLPolyMorphTarget*>(param);
+ if (poly_morph)
+ {
+ // This is a kludgy way to correct for the fact that the
+ // collision volumes have been reset out from under the
+ // poly morph sliders.
+ F32 delta_weight = poly_morph->getLastWeight() - poly_morph->getDefaultWeight();
+ poly_morph->applyVolumeChanges(delta_weight);
+ }
+ }
+
+ // Reset tweakable params to preserved state
+ bool slam_params = true;
+ applyParsedAppearanceMessage(*mLastProcessedAppearance, slam_params);
+
+ updateVisualParams();
+
+ // Restore attachment pos overrides
+ rebuildAttachmentPosOverrides();
+
+ // Restart animations
+ resetAnimations();
+
+ LL_DEBUGS("Avatar") << avString() << " reset ends" << LL_ENDL;
+}
//-----------------------------------------------------------------------------
// releaseMeshData()
@@ -1745,8 +1919,6 @@ void LLVOAvatar::releaseMeshData()
return;
}
- LL_DEBUGS() << "Releasing mesh data" << LL_ENDL;
-
// cleanup mesh data
for (avatar_joint_list_t::iterator iter = mMeshLOD.begin();
iter != mMeshLOD.end();
@@ -1956,17 +2128,12 @@ U32 LLVOAvatar::processUpdateMessage(LLMessageSystem *mesgsys,
// Do base class updates...
U32 retval = LLViewerObject::processUpdateMessage(mesgsys, user_data, block_num, update_type, dp);
- //LLTEContents tec;
- //S32 te_retval = parseTEMessage(mesgsys, _PREHASH_ObjectData, block_num, tec);
-
- LL_DEBUGS("Avatar") << avString() << update_type << LL_ENDL;
-
// Print out arrival information once we have name of avatar.
- if (has_name && getNVPair("FirstName"))
- {
- mDebugExistenceTimer.reset();
- debugAvatarRezTime("AvatarRezArrivedNotification","avatar arrived");
- }
+ if (has_name && getNVPair("FirstName"))
+ {
+ mDebugExistenceTimer.reset();
+ debugAvatarRezTime("AvatarRezArrivedNotification","avatar arrived");
+ }
if(retval & LLViewerObject::INVALID_UPDATE)
{
@@ -2074,6 +2241,8 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
return;
}
+ LLScopedContextString str("avatar_idle_update " + getFullname());
+
checkTextureLoading() ;
// force immediate pixel area update on avatars using last frames data (before drawable or camera updates)
@@ -3078,6 +3247,7 @@ void LLVOAvatar::idleUpdateBelowWater()
void LLVOAvatar::slamPosition()
{
gAgent.setPositionAgent(getPositionAgent());
+ // SL-315
mRoot->setWorldPosition(getPositionAgent()); // teleport
setChanged(TRANSLATED);
if (mDrawable.notNull())
@@ -3376,6 +3546,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
mTimeLast = animation_time;
// put the pelvis at slaved position/mRotation
+ // SL-315
mRoot->setWorldPosition( getPositionAgent() ); // first frame
mRoot->setWorldRotation( getRotation() );
}
@@ -3430,6 +3601,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
if (newPosition != mRoot->getXform()->getWorldPosition())
{
mRoot->touch();
+ // SL-315
mRoot->setWorldPosition( newPosition ); // regular update
}
@@ -3593,6 +3765,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
{
LLVector3 pos = mDrawable->getPosition();
pos += getHoverOffset() * mDrawable->getRotation();
+ // SL-315
mRoot->setPosition(pos);
mRoot->setRotation(mDrawable->getRotation());
}
@@ -3623,6 +3796,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
LLVector3 pos = mRoot->getWorldPosition();
pos.mV[VZ] += off_z;
mRoot->touch();
+ // SL-315
mRoot->setWorldPosition(pos);
}
}
@@ -5097,8 +5271,66 @@ bool LLVOAvatar::getRiggedMeshID(LLViewerObject* pVO, LLUUID& mesh_id)
return false;
}
+bool LLVOAvatar::jointIsRiggedTo(const std::string& joint_name)
+{
+ for (attachment_map_t::iterator iter = mAttachmentPoints.begin();
+ iter != mAttachmentPoints.end();
+ ++iter)
+ {
+ LLViewerJointAttachment* attachment = iter->second;
+ for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
+ attachment_iter != attachment->mAttachedObjects.end();
+ ++attachment_iter)
+ {
+ const LLViewerObject* attached_object = (*attachment_iter);
+ if (attached_object && jointIsRiggedTo(joint_name, attached_object))
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+bool LLVOAvatar::jointIsRiggedTo(const std::string& joint_name, const LLViewerObject *vo)
+{
+ // Process all children
+ LLViewerObject::const_child_list_t& children = vo->getChildren();
+ for (LLViewerObject::const_child_list_t::const_iterator it = children.begin();
+ it != children.end(); ++it)
+ {
+ LLViewerObject *childp = *it;
+ if (jointIsRiggedTo(joint_name,childp))
+ {
+ return true;
+ }
+ }
+
+ const LLVOVolume *vobj = dynamic_cast<const LLVOVolume*>(vo);
+ if (!vobj)
+ {
+ return false;
+ }
+
+ LLUUID currentId = vobj->getVolume()->getParams().getSculptID();
+ const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( currentId, vobj );
+
+ if ( vobj && vobj->isAttachment() && vobj->isMesh() && pSkinData )
+ {
+ if (std::find(pSkinData->mJointNames.begin(), pSkinData->mJointNames.end(), joint_name) !=
+ pSkinData->mJointNames.end())
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
void LLVOAvatar::clearAttachmentPosOverrides()
{
+ LLScopedContextString str("clearAttachmentPosOverrides " + getFullname());
+
//Subsequent joints are relative to pelvis
avatar_joint_list_t::iterator iter = mSkeleton.begin();
avatar_joint_list_t::iterator end = mSkeleton.end();
@@ -5106,11 +5338,49 @@ void LLVOAvatar::clearAttachmentPosOverrides()
for (; iter != end; ++iter)
{
LLJoint* pJoint = (*iter);
- pJoint->clearAttachmentPosOverrides();
+ if (pJoint)
+ {
+ pJoint->clearAttachmentPosOverrides();
+ }
}
+
+ // Attachment points
+ for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin();
+ iter != mAttachmentPoints.end();
+ ++iter)
+ {
+ LLViewerJointAttachment *attachment_pt = (*iter).second;
+ if (attachment_pt)
+ {
+ attachment_pt->clearAttachmentPosOverrides();
+ }
+ }
}
//-----------------------------------------------------------------------------
+// rebuildAttachmentPosOverrides
+//-----------------------------------------------------------------------------
+void LLVOAvatar::rebuildAttachmentPosOverrides()
+{
+ LLScopedContextString str("rebuildAttachmentPosOverrides " + getFullname());
+
+ // Attachment points
+ for (attachment_map_t::iterator iter = mAttachmentPoints.begin();
+ iter != mAttachmentPoints.end();
+ ++iter)
+ {
+ LLViewerJointAttachment *attachment_pt = (*iter).second;
+ if (attachment_pt)
+ {
+ for (LLViewerJointAttachment::attachedobjs_vec_t::iterator at_it = attachment_pt->mAttachedObjects.begin();
+ at_it != attachment_pt->mAttachedObjects.end(); ++at_it)
+ {
+ addAttachmentPosOverridesForObject(*at_it);
+ }
+ }
+ }
+}
+//-----------------------------------------------------------------------------
// addAttachmentPosOverridesForObject
//-----------------------------------------------------------------------------
void LLVOAvatar::addAttachmentPosOverridesForObject(LLViewerObject *vo)
@@ -5120,7 +5390,9 @@ void LLVOAvatar::addAttachmentPosOverridesForObject(LLViewerObject *vo)
{
LL_WARNS("Avatar") << "called with invalid avatar" << LL_ENDL;
}
-
+
+ LLScopedContextString str("addAttachmentPosOverridesForObject " + av->getFullname());
+
// Process all children
LLViewerObject::const_child_list_t& children = vo->getChildren();
for (LLViewerObject::const_child_list_t::const_iterator it = children.begin();
@@ -5148,9 +5420,13 @@ void LLVOAvatar::addAttachmentPosOverridesForObject(LLViewerObject *vo)
if ( vobj && vobj->isAttachment() && vobj->isMesh() && pSkinData )
{
const int bindCnt = pSkinData->mAlternateBindMatrix.size();
- if ( bindCnt > 0 )
+ const int jointCnt = pSkinData->mJointNames.size();
+ if ((bindCnt > 0) && (bindCnt != jointCnt))
+ {
+ LL_WARNS_ONCE() << "invalid mesh, bindCnt " << bindCnt << "!= jointCnt " << jointCnt << ", joint overrides will be ignored." << LL_ENDL;
+ }
+ if ((bindCnt > 0) && (bindCnt == jointCnt))
{
- const int jointCnt = pSkinData->mJointNames.size();
const F32 pelvisZOffset = pSkinData->mPelvisOffset;
const LLUUID& mesh_id = pSkinData->mMeshID;
bool fullRig = (jointCnt>=JOINT_COUNT_REQUIRED_FOR_FULLRIG) ? true : false;
@@ -5164,14 +5440,14 @@ void LLVOAvatar::addAttachmentPosOverridesForObject(LLViewerObject *vo)
{
pJoint->setId( currentId );
const LLVector3& jointPos = pSkinData->mAlternateBindMatrix[i].getTranslation();
- //Set the joint position
- pJoint->addAttachmentPosOverride( jointPos, mesh_id, avString() );
-
- //If joint is a pelvis then handle old/new pelvis to foot values
- if ( lookingForJoint == "mPelvis" )
- {
- pelvisGotSet = true;
- }
+ //Set the joint position
+ pJoint->addAttachmentPosOverride( jointPos, mesh_id, avString() );
+
+ //If joint is a pelvis then handle old/new pelvis to foot values
+ if ( lookingForJoint == "mPelvis" )
+ {
+ pelvisGotSet = true;
+ }
}
}
if (pelvisZOffset != 0.0F)
@@ -5191,6 +5467,98 @@ void LLVOAvatar::addAttachmentPosOverridesForObject(LLViewerObject *vo)
}
//-----------------------------------------------------------------------------
+// getAttachmentOverrideNames
+//-----------------------------------------------------------------------------
+void LLVOAvatar::getAttachmentOverrideNames(std::set<std::string>& names) const
+{
+ LLVector3 pos;
+ LLUUID mesh_id;
+
+ // Bones
+ for (avatar_joint_list_t::const_iterator iter = mSkeleton.begin();
+ iter != mSkeleton.end(); ++iter)
+ {
+ const LLJoint* pJoint = (*iter);
+ if (pJoint && pJoint->hasAttachmentPosOverride(pos,mesh_id))
+ {
+ names.insert(pJoint->getName());
+ }
+ }
+
+ // Attachment points
+ for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin();
+ iter != mAttachmentPoints.end();
+ ++iter)
+ {
+ const LLViewerJointAttachment *attachment_pt = (*iter).second;
+ if (attachment_pt && attachment_pt->hasAttachmentPosOverride(pos,mesh_id))
+ {
+ names.insert(attachment_pt->getName());
+ }
+ }
+
+}
+
+//-----------------------------------------------------------------------------
+// showAttachmentPosOverrides
+//-----------------------------------------------------------------------------
+void LLVOAvatar::showAttachmentPosOverrides(bool verbose) const
+{
+ std::set<std::string> joint_names;
+ getAttachmentOverrideNames(joint_names);
+ if (joint_names.size())
+ {
+ std::stringstream ss;
+ std::copy(joint_names.begin(), joint_names.end(), std::ostream_iterator<std::string>(ss, ","));
+ LL_INFOS() << getFullname() << " attachment positions defined for joints: " << ss.str() << "\n" << LL_ENDL;
+ }
+ else
+ {
+ LL_INFOS() << getFullname() << " no attachment positions defined for any joints" << "\n" << LL_ENDL;
+ }
+
+ if (!verbose)
+ {
+ return;
+ }
+
+ LLVector3 pos;
+ LLUUID mesh_id;
+ S32 count = 0;
+
+ // Bones
+ for (avatar_joint_list_t::const_iterator iter = mSkeleton.begin();
+ iter != mSkeleton.end(); ++iter)
+ {
+ const LLJoint* pJoint = (*iter);
+ if (pJoint && pJoint->hasAttachmentPosOverride(pos,mesh_id))
+ {
+ pJoint->showAttachmentPosOverrides(getFullname());
+ count++;
+ }
+ }
+
+ // Attachment points
+ for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin();
+ iter != mAttachmentPoints.end();
+ ++iter)
+ {
+ const LLViewerJointAttachment *attachment_pt = (*iter).second;
+ if (attachment_pt && attachment_pt->hasAttachmentPosOverride(pos,mesh_id))
+ {
+ attachment_pt->showAttachmentPosOverrides(getFullname());
+ count++;
+ }
+ }
+
+ if (count)
+ {
+ LL_DEBUGS("Avatar") << avString() << " end of pos overrides" << LL_ENDL;
+ LL_DEBUGS("Avatar") << "=================================" << LL_ENDL;
+ }
+}
+
+//-----------------------------------------------------------------------------
// resetJointPositionsOnDetach
//-----------------------------------------------------------------------------
void LLVOAvatar::resetJointPositionsOnDetach(LLViewerObject *vo)
@@ -5241,6 +5609,7 @@ void LLVOAvatar::resetJointPositionsOnDetach(const LLUUID& mesh_id)
if ( pJoint && pJoint == pJointPelvis)
{
removePelvisFixup( mesh_id );
+ // SL-315
pJoint->setPosition( LLVector3( 0.0f, 0.0f, 0.0f) );
}
}
@@ -5372,83 +5741,99 @@ BOOL LLVOAvatar::loadSkeletonNode ()
return FALSE;
}
- // ATTACHMENTS
- {
- LLAvatarXmlInfo::attachment_info_list_t::iterator iter;
- for (iter = sAvatarXmlInfo->mAttachmentInfoList.begin();
- iter != sAvatarXmlInfo->mAttachmentInfoList.end();
- ++iter)
- {
- LLAvatarXmlInfo::LLAvatarAttachmentInfo *info = *iter;
- if (!isSelf() && info->mJointName == "mScreen")
- { //don't process screen joint for other avatars
- continue;
- }
+ bool ignore_hud_joints = false;
+ initAttachmentPoints(ignore_hud_joints);
- LLViewerJointAttachment* attachment = new LLViewerJointAttachment();
+ return TRUE;
+}
- attachment->setName(info->mName);
- LLJoint *parentJoint = getJoint(info->mJointName);
- if (!parentJoint)
- {
- LL_WARNS() << "No parent joint by name " << info->mJointName << " found for attachment point " << info->mName << LL_ENDL;
- delete attachment;
- continue;
- }
+//-----------------------------------------------------------------------------
+// initAttachmentPoints(): creates attachment points if needed, sets state based on avatar_lad.xml.
+//-----------------------------------------------------------------------------
+void LLVOAvatar::initAttachmentPoints(bool ignore_hud_joints)
+{
+ LLAvatarXmlInfo::attachment_info_list_t::iterator iter;
+ for (iter = sAvatarXmlInfo->mAttachmentInfoList.begin();
+ iter != sAvatarXmlInfo->mAttachmentInfoList.end();
+ ++iter)
+ {
+ LLAvatarXmlInfo::LLAvatarAttachmentInfo *info = *iter;
+ if (info->mIsHUDAttachment && (!isSelf() || ignore_hud_joints))
+ {
+ //don't process hud joint for other avatars, or when doing a skeleton reset.
+ continue;
+ }
- if (info->mHasPosition)
- {
- attachment->setOriginalPosition(info->mPosition);
- }
-
- if (info->mHasRotation)
- {
- LLQuaternion rotation;
- rotation.setQuat(info->mRotationEuler.mV[VX] * DEG_TO_RAD,
- info->mRotationEuler.mV[VY] * DEG_TO_RAD,
- info->mRotationEuler.mV[VZ] * DEG_TO_RAD);
- attachment->setRotation(rotation);
- }
+ S32 attachmentID = info->mAttachmentID;
+ if (attachmentID < 1 || attachmentID > 255)
+ {
+ LL_WARNS() << "Attachment point out of range [1-255]: " << attachmentID << " on attachment point " << info->mName << LL_ENDL;
+ continue;
+ }
- int group = info->mGroup;
- if (group >= 0)
- {
- if (group < 0 || group >= 9)
- {
- LL_WARNS() << "Invalid group number (" << group << ") for attachment point " << info->mName << LL_ENDL;
- }
- else
- {
- attachment->setGroup(group);
- }
- }
+ LLViewerJointAttachment* attachment = NULL;
+ bool newly_created = false;
+ if (mAttachmentPoints.find(attachmentID) == mAttachmentPoints.end())
+ {
+ attachment = new LLViewerJointAttachment();
+ newly_created = true;
+ }
+ else
+ {
+ attachment = mAttachmentPoints[attachmentID];
+ }
- S32 attachmentID = info->mAttachmentID;
- if (attachmentID < 1 || attachmentID > 255)
- {
- LL_WARNS() << "Attachment point out of range [1-255]: " << attachmentID << " on attachment point " << info->mName << LL_ENDL;
- delete attachment;
- continue;
- }
- if (mAttachmentPoints.find(attachmentID) != mAttachmentPoints.end())
- {
- LL_WARNS() << "Attachment point redefined with id " << attachmentID << " on attachment point " << info->mName << LL_ENDL;
- delete attachment;
- continue;
- }
+ attachment->setName(info->mName);
+ LLJoint *parent_joint = getJoint(info->mJointName);
+ if (!parent_joint)
+ {
+ // If the intended parent for attachment point is unavailable, avatar_lad.xml is corrupt.
+ LL_WARNS() << "No parent joint by name " << info->mJointName << " found for attachment point " << info->mName << LL_ENDL;
+ LL_ERRS() << "Invalid avatar_lad.xml file" << LL_ENDL;
+ }
- attachment->setPieSlice(info->mPieMenuSlice);
- attachment->setVisibleInFirstPerson(info->mVisibleFirstPerson);
- attachment->setIsHUDAttachment(info->mIsHUDAttachment);
+ if (info->mHasPosition)
+ {
+ attachment->setOriginalPosition(info->mPosition);
+ attachment->setDefaultPosition(info->mPosition);
+ }
+
+ if (info->mHasRotation)
+ {
+ LLQuaternion rotation;
+ rotation.setQuat(info->mRotationEuler.mV[VX] * DEG_TO_RAD,
+ info->mRotationEuler.mV[VY] * DEG_TO_RAD,
+ info->mRotationEuler.mV[VZ] * DEG_TO_RAD);
+ attachment->setRotation(rotation);
+ }
- mAttachmentPoints[attachmentID] = attachment;
+ int group = info->mGroup;
+ if (group >= 0)
+ {
+ if (group < 0 || group > 9)
+ {
+ LL_WARNS() << "Invalid group number (" << group << ") for attachment point " << info->mName << LL_ENDL;
+ }
+ else
+ {
+ attachment->setGroup(group);
+ }
+ }
- // now add attachment joint
- parentJoint->addChild(attachment);
- }
- }
+ attachment->setPieSlice(info->mPieMenuSlice);
+ attachment->setVisibleInFirstPerson(info->mVisibleFirstPerson);
+ attachment->setIsHUDAttachment(info->mIsHUDAttachment);
+ // attachment can potentially be animated, needs a number.
+ attachment->setJointNum(mSkeleton.size() + attachmentID - 1);
- return TRUE;
+ if (newly_created)
+ {
+ mAttachmentPoints[attachmentID] = attachment;
+
+ // now add attachment joint
+ parent_joint->addChild(attachment);
+ }
+ }
}
//-----------------------------------------------------------------------------
@@ -6017,6 +6402,7 @@ void LLVOAvatar::sitOnObject(LLViewerObject *sit_object)
// objects to be not rendered for new arrivals. See EXT-6835 and EXT-1655.
sitDown(TRUE);
mRoot->getXform()->setParent(&sit_object->mDrawable->mXform); // LLVOAvatar::sitOnObject
+ // SL-315
mRoot->setPosition(getPosition());
mRoot->updateWorldMatrixChildren();
@@ -6075,6 +6461,7 @@ void LLVOAvatar::getOffObject()
sitDown(FALSE);
mRoot->getXform()->setParent(NULL); // LLVOAvatar::getOffObject
+ // SL-315
mRoot->setPosition(cur_position_world);
mRoot->setRotation(cur_rotation_world);
mRoot->getXform()->update();
@@ -7121,9 +7508,10 @@ void dump_visual_param(apr_file_t* file, LLVisualParam* viewer_param, F32 value)
wtype = vparam->getWearableType();
}
S32 u8_value = F32_to_U8(value,viewer_param->getMinWeight(),viewer_param->getMaxWeight());
- apr_file_printf(file, "\t\t<param id=\"%d\" name=\"%s\" value=\"%.3f\" u8=\"%d\" type=\"%s\" wearable=\"%s\"/>\n",
+ apr_file_printf(file, "\t\t<param id=\"%d\" name=\"%s\" value=\"%.3f\" u8=\"%d\" type=\"%s\" wearable=\"%s\" group=\"%d\"/>\n",
viewer_param->getID(), viewer_param->getName().c_str(), value, u8_value, type_string.c_str(),
- LLWearableType::getTypeName(LLWearableType::EType(wtype)).c_str()
+ LLWearableType::getTypeName(LLWearableType::EType(wtype)).c_str(),
+ viewer_param->getGroup()
// param_location_name(vparam->getParamLocation()).c_str()
);
}
@@ -7190,7 +7578,7 @@ void LLVOAvatar::parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMe
U8 av_u8;
mesgsys->getU8Fast(_PREHASH_AppearanceData, _PREHASH_AppearanceVersion, av_u8, 0);
contents.mAppearanceVersion = av_u8;
- LL_DEBUGS("Avatar") << "appversion set by AppearanceData field: " << contents.mAppearanceVersion << LL_ENDL;
+ //LL_DEBUGS("Avatar") << "appversion set by AppearanceData field: " << contents.mAppearanceVersion << LL_ENDL;
mesgsys->getS32Fast(_PREHASH_AppearanceData, _PREHASH_CofVersion, contents.mCOFVersion, 0);
// For future use:
//mesgsys->getU32Fast(_PREHASH_AppearanceData, _PREHASH_Flags, appearance_flags, 0);
@@ -7202,7 +7590,7 @@ void LLVOAvatar::parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMe
{
LLVector3 hover;
mesgsys->getVector3Fast(_PREHASH_AppearanceHover, _PREHASH_HoverHeight, hover);
- LL_DEBUGS("Avatar") << avString() << " hover received " << hover.mV[ VX ] << "," << hover.mV[ VY ] << "," << hover.mV[ VZ ] << LL_ENDL;
+ //LL_DEBUGS("Avatar") << avString() << " hover received " << hover.mV[ VX ] << "," << hover.mV[ VY ] << "," << hover.mV[ VZ ] << LL_ENDL;
contents.mHoverOffset = hover;
contents.mHoverOffsetWasSet = true;
}
@@ -7212,7 +7600,7 @@ void LLVOAvatar::parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMe
bool drop_visual_params_debug = gSavedSettings.getBOOL("BlockSomeAvatarAppearanceVisualParams") && (ll_rand(2) == 0); // pretend that ~12% of AvatarAppearance messages arrived without a VisualParam block, for testing
if( num_blocks > 1 && !drop_visual_params_debug)
{
- LL_DEBUGS("Avatar") << avString() << " handle visual params, num_blocks " << num_blocks << LL_ENDL;
+ //LL_DEBUGS("Avatar") << avString() << " handle visual params, num_blocks " << num_blocks << LL_ENDL;
LLVisualParam* param = getFirstVisualParam();
llassert(param); // if this ever fires, we should do the same as when num_blocks<=1
@@ -7273,7 +7661,7 @@ void LLVOAvatar::parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMe
{
S32 index = it - contents.mParams.begin();
contents.mParamAppearanceVersion = ll_round(contents.mParamWeights[index]);
- LL_DEBUGS("Avatar") << "appversion req by appearance_version param: " << contents.mParamAppearanceVersion << LL_ENDL;
+ //LL_DEBUGS("Avatar") << "appversion req by appearance_version param: " << contents.mParamAppearanceVersion << LL_ENDL;
}
}
}
@@ -7302,9 +7690,9 @@ bool resolve_appearance_version(const LLAppearanceMessageContents& contents, S32
{
appearance_version = 1;
}
- LL_DEBUGS("Avatar") << "appearance version info - field " << contents.mAppearanceVersion
- << " param: " << contents.mParamAppearanceVersion
- << " final: " << appearance_version << LL_ENDL;
+ //LL_DEBUGS("Avatar") << "appearance version info - field " << contents.mAppearanceVersion
+ // << " param: " << contents.mParamAppearanceVersion
+ // << " final: " << appearance_version << LL_ENDL;
return true;
}
@@ -7313,8 +7701,7 @@ bool resolve_appearance_version(const LLAppearanceMessageContents& contents, S32
//-----------------------------------------------------------------------------
void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
{
- static S32 largestSelfCOFSeen(LLViewerInventoryCategory::VERSION_UNKNOWN);
- LL_DEBUGS("Avatar") << "starts" << LL_ENDL;
+ static S32 largest_self_cof_seen(LLViewerInventoryCategory::VERSION_UNKNOWN);
bool enable_verbose_dumps = gSavedSettings.getBOOL("DebugAvatarAppearanceMessage");
std::string dump_prefix = getFullname() + "_" + (isSelf()?"s":"o") + "_";
@@ -7326,17 +7713,15 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
mLastAppearanceMessageTimer.reset();
- ESex old_sex = getSex();
-
- LLAppearanceMessageContents contents;
- parseAppearanceMessage(mesgsys, contents);
+ LLPointer<LLAppearanceMessageContents> contents(new LLAppearanceMessageContents);
+ parseAppearanceMessage(mesgsys, *contents);
if (enable_verbose_dumps)
{
- dumpAppearanceMsgParams(dump_prefix + "appearance_msg", contents);
+ dumpAppearanceMsgParams(dump_prefix + "appearance_msg", *contents);
}
S32 appearance_version;
- if (!resolve_appearance_version(contents, appearance_version))
+ if (!resolve_appearance_version(*contents, appearance_version))
{
LL_WARNS() << "bad appearance version info, discarding" << LL_ENDL;
return;
@@ -7348,7 +7733,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
return;
}
- S32 this_update_cof_version = contents.mCOFVersion;
+ S32 this_update_cof_version = contents->mCOFVersion;
S32 last_update_request_cof_version = mLastUpdateRequestCOFVersion;
if( isSelf() )
@@ -7357,18 +7742,18 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
<< " last_update_request_cof_version " << last_update_request_cof_version
<< " my_cof_version " << LLAppearanceMgr::instance().getCOFVersion() << LL_ENDL;
- if (largestSelfCOFSeen > this_update_cof_version)
+ if (largest_self_cof_seen > this_update_cof_version)
{
LL_WARNS("Avatar") << "Already processed appearance for COF version " <<
- largestSelfCOFSeen << ", discarding appearance with COF " << this_update_cof_version << LL_ENDL;
+ largest_self_cof_seen << ", discarding appearance with COF " << this_update_cof_version << LL_ENDL;
return;
}
- largestSelfCOFSeen = this_update_cof_version;
+ largest_self_cof_seen = this_update_cof_version;
}
else
{
- LL_DEBUGS("Avatar") << "appearance message received" << LL_ENDL;
+ //LL_DEBUGS("Avatar") << "appearance message received" << LL_ENDL;
}
// Check for stale update.
@@ -7387,7 +7772,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
}
// SUNSHINE CLEANUP - is this case OK now?
- S32 num_params = contents.mParamWeights.size();
+ S32 num_params = contents->mParamWeights.size();
if (num_params <= 1)
{
// In this case, we have no reliable basis for knowing
@@ -7406,7 +7791,17 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
// assumes that cof version is only updated with server-bake
// appearance messages.
mLastUpdateReceivedCOFVersion = this_update_cof_version;
-
+ mLastProcessedAppearance = contents;
+
+ bool slam_params = false;
+ applyParsedAppearanceMessage(*contents, slam_params);
+}
+
+void LLVOAvatar::applyParsedAppearanceMessage(LLAppearanceMessageContents& contents, bool slam_params)
+{
+ S32 num_params = contents.mParamWeights.size();
+ ESex old_sex = getSex();
+
if (applyParsedTEMessage(contents.mTEContents) > 0 && isChanged(TEXTURE))
{
updateVisualComplexity();
@@ -7436,8 +7831,8 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
BOOL is_first_appearance_message = !mFirstAppearanceMessageReceived;
mFirstAppearanceMessageReceived = TRUE;
- LL_DEBUGS("Avatar") << avString() << "processAvatarAppearance start " << mID
- << " first? " << is_first_appearance_message << " self? " << isSelf() << LL_ENDL;
+ //LL_DEBUGS("Avatar") << avString() << "processAvatarAppearance start " << mID
+ // << " first? " << is_first_appearance_message << " self? " << isSelf() << LL_ENDL;
if (is_first_appearance_message )
{
@@ -7450,7 +7845,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
// Apply visual params
if( num_params > 1)
{
- LL_DEBUGS("Avatar") << avString() << " handle visual params, num_params " << num_params << LL_ENDL;
+ //LL_DEBUGS("Avatar") << avString() << " handle visual params, num_params " << num_params << LL_ENDL;
BOOL params_changed = FALSE;
BOOL interp_params = FALSE;
S32 params_changed_count = 0;
@@ -7465,7 +7860,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
params_changed = TRUE;
params_changed_count++;
- if(is_first_appearance_message)
+ if(is_first_appearance_message || slam_params)
{
//LL_DEBUGS("Avatar") << "param slam " << i << " " << newWeight << LL_ENDL;
param->setWeight(newWeight);
@@ -7550,7 +7945,6 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
}
updateMeshTextures();
- //if (enable_verbose_dumps) dumpArchetypeXML(dump_prefix + "process_end");
}
// static
@@ -7681,7 +8075,7 @@ void LLVOAvatar::onInitialBakedTextureLoaded( BOOL success, LLViewerFetchedTextu
if (selfp)
{
- LL_DEBUGS("Avatar") << selfp->avString() << "discard_level " << discard_level << " success " << success << " final " << final << LL_ENDL;
+ //LL_DEBUGS("Avatar") << selfp->avString() << "discard_level " << discard_level << " success " << success << " final " << final << LL_ENDL;
}
if (!success && selfp)
@@ -7699,14 +8093,14 @@ void LLVOAvatar::onBakedTextureLoaded(BOOL success,
LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src,
S32 discard_level, BOOL final, void* userdata)
{
- LL_DEBUGS("Avatar") << "onBakedTextureLoaded: " << src_vi->getID() << LL_ENDL;
+ //LL_DEBUGS("Avatar") << "onBakedTextureLoaded: " << src_vi->getID() << LL_ENDL;
LLUUID id = src_vi->getID();
LLUUID *avatar_idp = (LLUUID *)userdata;
LLVOAvatar *selfp = (LLVOAvatar *)gObjectList.findObject(*avatar_idp);
if (selfp)
{
- LL_DEBUGS("Avatar") << selfp->avString() << "discard_level " << discard_level << " success " << success << " final " << final << " id " << src_vi->getID() << LL_ENDL;
+ //LL_DEBUGS("Avatar") << selfp->avString() << "discard_level " << discard_level << " success " << success << " final " << final << " id " << src_vi->getID() << LL_ENDL;
}
if (selfp && !success)
@@ -7894,6 +8288,7 @@ void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_weara
}
}
+ // Bones
avatar_joint_list_t::iterator iter = mSkeleton.begin();
avatar_joint_list_t::iterator end = mSkeleton.end();
for (; iter != end; ++iter)
@@ -7901,10 +8296,33 @@ void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_weara
LLJoint* pJoint = (*iter);
const LLVector3& pos = pJoint->getPosition();
const LLVector3& scale = pJoint->getScale();
- apr_file_printf( file, "\t\t<joint name=\"%s\" position=\"%f %f %f\" scale=\"%f %f %f\"/>\n",
+ apr_file_printf( file, "\t\t<bone name=\"%s\" position=\"%f %f %f\" scale=\"%f %f %f\"/>\n",
pJoint->getName().c_str(), pos[0], pos[1], pos[2], scale[0], scale[1], scale[2]);
}
+ // Collision volumes
+ for (S32 i = 0; i < mNumCollisionVolumes; i++)
+ {
+ LLAvatarJointCollisionVolume* pJoint = &mCollisionVolumes[i];
+ const LLVector3& pos = pJoint->getPosition();
+ const LLVector3& scale = pJoint->getScale();
+ apr_file_printf( file, "\t\t<collision_volume name=\"%s\" position=\"%f %f %f\" scale=\"%f %f %f\"/>\n",
+ pJoint->getName().c_str(), pos[0], pos[1], pos[2], scale[0], scale[1], scale[2]);
+ }
+
+ // Attachment joints
+ for (LLVOAvatar::attachment_map_t::const_iterator iter = mAttachmentPoints.begin();
+ iter != mAttachmentPoints.end(); ++iter)
+ {
+ LLViewerJointAttachment* pJoint = iter->second;
+ if (!pJoint) continue;
+ const LLVector3& pos = pJoint->getPosition();
+ const LLVector3& scale = pJoint->getScale();
+ apr_file_printf( file, "\t\t<attachment_point name=\"%s\" position=\"%f %f %f\" scale=\"%f %f %f\"/>\n",
+ pJoint->getName().c_str(), pos[0], pos[1], pos[2], scale[0], scale[1], scale[2]);
+ }
+
+ // Joint pos overrides
for (iter = mSkeleton.begin(); iter != end; ++iter)
{
LLJoint* pJoint = (*iter);
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 418cca519d..32a30c3aa8 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -68,13 +68,11 @@ class LLVoiceVisualizer;
class LLHUDNameTag;
class LLHUDEffectSpiral;
class LLTexGlobalColor;
-struct LLVOAvatarBoneInfo;
-struct LLVOAvatarChildJoint;
-//class LLViewerJoint;
+
struct LLAppearanceMessageContents;
-struct LLVOAvatarSkeletonInfo;
class LLViewerJointMesh;
+
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// LLVOAvatar
//
@@ -205,7 +203,12 @@ public:
void addAttachmentPosOverridesForObject(LLViewerObject *vo);
void resetJointPositionsOnDetach(const LLUUID& mesh_id);
void resetJointPositionsOnDetach(LLViewerObject *vo);
+ bool jointIsRiggedTo(const std::string& joint_name);
+ bool jointIsRiggedTo(const std::string& joint_name, const LLViewerObject *vo);
void clearAttachmentPosOverrides();
+ void rebuildAttachmentPosOverrides();
+ void showAttachmentPosOverrides(bool verbose = false) const;
+ void getAttachmentOverrideNames(std::set<std::string>& names) const;
/*virtual*/ const LLUUID& getID() const;
/*virtual*/ void addDebugText(const std::string& text);
@@ -367,7 +370,10 @@ public:
void postPelvisSetRecalc( void );
/*virtual*/ BOOL loadSkeletonNode();
+ void initAttachmentPoints(bool ignore_hud_joints = false);
/*virtual*/ void buildCharacter();
+ void resetVisualParams();
+ void resetSkeleton();
LLVector3 mCurRootToHeadOffset;
LLVector3 mTargetRootToHeadOffset;
@@ -404,6 +410,7 @@ public:
F32 getLastSkinTime() { return mLastSkinTime; }
U32 renderTransparent(BOOL first_pass);
void renderCollisionVolumes();
+ void renderBones();
void renderJoints();
static void deleteCachedImages(bool clearAll=true);
static void destroyGL();
@@ -668,9 +675,12 @@ protected:
** APPEARANCE
**/
+ LLPointer<LLAppearanceMessageContents> mLastProcessedAppearance;
+
public:
void parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMessageContents& msg);
void processAvatarAppearance(LLMessageSystem* mesgsys);
+ void applyParsedAppearanceMessage(LLAppearanceMessageContents& contents, bool slam_params);
void hideSkirt();
void startAppearanceAnimation();
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 5f48898cb1..b6655dd078 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -65,6 +65,7 @@
#include "llsdutil.h"
#include "llstartup.h"
#include "llsdserialize.h"
+#include "llcallstack.h"
#include "llcorehttputil.h"
#if LL_MSVC
@@ -192,6 +193,7 @@ bool update_avatar_rez_metrics()
return true;
gAgentAvatarp->updateAvatarRezMetrics(false);
+
return false;
}
@@ -219,7 +221,6 @@ void LLVOAvatarSelf::initInstance()
{
mDebugBakedTextureTimes[i][0] = -1.0f;
mDebugBakedTextureTimes[i][1] = -1.0f;
- mInitialBakeIDs[i] = LLUUID::null;
}
status &= buildMenus();
@@ -340,6 +341,7 @@ BOOL LLVOAvatarSelf::buildSkeletonSelf(const LLAvatarSkeletonInfo *info)
F32 aspect = LLViewerCamera::getInstance()->getAspect();
LLVector3 scale(1.f, aspect, 1.f);
mScreenp->setScale(scale);
+ // SL-315
mScreenp->setWorldPosition(LLVector3::zero);
// need to update screen agressively when sidebar opens/closes, for example
mScreenp->mUpdateXform = TRUE;
@@ -381,6 +383,10 @@ BOOL LLVOAvatarSelf::buildMenus()
params.name(params.label);
gAttachBodyPartPieMenus[7] = LLUICtrlFactory::create<LLContextMenu> (params);
+ params.label(LLTrans::getString("BodyPartsEnhancedSkeleton"));
+ params.name(params.label);
+ gAttachBodyPartPieMenus[8] = LLUICtrlFactory::create<LLContextMenu>(params);
+
gDetachBodyPartPieMenus[0] = NULL;
params.label(LLTrans::getString("BodyPartsRightArm"));
@@ -409,7 +415,11 @@ BOOL LLVOAvatarSelf::buildMenus()
params.name(params.label);
gDetachBodyPartPieMenus[7] = LLUICtrlFactory::create<LLContextMenu> (params);
- for (S32 i = 0; i < 8; i++)
+ params.label(LLTrans::getString("BodyPartsEnhancedSkeleton"));
+ params.name(params.label);
+ gDetachBodyPartPieMenus[8] = LLUICtrlFactory::create<LLContextMenu>(params);
+
+ for (S32 i = 0; i < 9; i++)
{
if (gAttachBodyPartPieMenus[i])
{
@@ -494,7 +504,7 @@ BOOL LLVOAvatarSelf::buildMenus()
++iter)
{
LLViewerJointAttachment* attachment = iter->second;
- if (attachment && attachment->getGroup() == 8)
+ if (attachment->getGroup() == 9)
{
LLMenuItemCallGL::Params item_params;
std::string sub_piemenu_name = attachment->getName();
@@ -580,7 +590,7 @@ BOOL LLVOAvatarSelf::buildMenus()
}
}
- for (S32 group = 0; group < 8; group++)
+ for (S32 group = 0; group < 9; group++)
{
// skip over groups that don't have sub menus
if (!gAttachBodyPartPieMenus[group] || !gDetachBodyPartPieMenus[group])
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index a9c4ab26a9..f9f90bb323 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -103,17 +103,6 @@ private:
// helper function. Passed in param is assumed to be in avatar's parameter list.
BOOL setParamWeight(const LLViewerVisualParam *param, F32 weight);
-
-
-/** Initialization
- ** **
- *******************************************************************************/
-
-private:
- LLUUID mInitialBakeIDs[6];
- //bool mInitialBakesLoaded;
-
-
/********************************************************************************
** **
** STATE
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 8f0b233f01..465f8fe0d6 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -54,6 +54,7 @@
#include "llspatialpartition.h"
#include "llhudmanager.h"
#include "llflexibleobject.h"
+#include "llskinningutil.h"
#include "llsky.h"
#include "lltexturefetch.h"
#include "llvector4a.h"
@@ -80,7 +81,7 @@
const F32 FORCE_SIMPLE_RENDER_AREA = 512.f;
const F32 FORCE_CULL_AREA = 8.f;
-U32 JOINT_COUNT_REQUIRED_FOR_FULLRIG = 20;
+U32 JOINT_COUNT_REQUIRED_FOR_FULLRIG = 1;
BOOL gAnimateTextures = TRUE;
//extern BOOL gHideSelectedObjects;
@@ -4182,27 +4183,11 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons
}
//build matrix palette
- static const size_t kMaxJoints = 52;
+ static const size_t kMaxJoints = LL_MAX_JOINTS_PER_MESH_OBJECT;
- LLMatrix4a mp[kMaxJoints];
- LLMatrix4* mat = (LLMatrix4*) mp;
-
- U32 maxJoints = llmin(skin->mJointNames.size(), kMaxJoints);
- for (U32 j = 0; j < maxJoints; ++j)
- {
- LLJoint* joint = avatar->getJoint(skin->mJointNames[j]);
- if (!joint)
- {
- // Fall back to a point inside the avatar if mesh is
- // rigged to an unknown joint.
- joint = avatar->getJoint("mPelvis");
- }
- if (joint)
- {
- mat[j] = skin->mInvBindMatrix[j];
- mat[j] *= joint->getWorldMatrix();
- }
- }
+ LLMatrix4a mat[kMaxJoints];
+ U32 maxJoints = LLSkinningUtil::getMeshJointCount(skin);
+ LLSkinningUtil::initSkinningMatrixPalette((LLMatrix4*)mat, maxJoints, skin, avatar);
for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
{
@@ -4214,6 +4199,7 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons
if ( weight )
{
+ LLSkinningUtil::checkSkinWeights(weight, dst_face.mNumVertices, skin);
LLMatrix4a bind_shape_matrix;
bind_shape_matrix.loadu(skin->mBindShapeMatrix);
@@ -4223,40 +4209,11 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons
{
LL_RECORD_BLOCK_TIME(FTM_SKIN_RIGGED);
+ U32 max_joints = LLSkinningUtil::getMaxJointCount();
for (U32 j = 0; j < dst_face.mNumVertices; ++j)
{
LLMatrix4a final_mat;
- final_mat.clear();
-
- S32 idx[4];
-
- LLVector4 wght;
-
- F32 scale = 0.f;
- for (U32 k = 0; k < 4; k++)
- {
- F32 w = weight[j][k];
-
- idx[k] = (S32) floorf(w);
- wght[k] = w - floorf(w);
- scale += wght[k];
- }
- // This is enforced in unpackVolumeFaces()
- llassert(scale>0.f);
- wght *= 1.f / scale;
-
- for (U32 k = 0; k < 4; k++)
- {
- F32 w = wght[k];
-
- LLMatrix4a src;
- // Insure ref'd bone is in our clamped array of mats
- // clamp idx to maxJoints to avoid reading garbage off stack in release
- S32 index = llclamp((S32)idx[k],(S32)0,(S32)kMaxJoints-1);
- src.setMul(mp[index], w);
- final_mat.add(src);
- }
-
+ LLSkinningUtil::getPerVertexSkinMatrix(weight[j].getF32ptr(), mat, false, final_mat, max_joints);
LLVector4a& v = vol_face.mPositions[j];
LLVector4a t;
@@ -4814,13 +4771,22 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
drawablep->clearState(LLDrawable::HAS_ALPHA);
bool rigged = vobj->isAttachment() &&
- vobj->isMesh() &&
- gMeshRepo.getSkinInfo(vobj->getVolume()->getParams().getSculptID(), vobj);
+ vobj->isMesh() &&
+ gMeshRepo.getSkinInfo(vobj->getVolume()->getParams().getSculptID(), vobj);
bool bake_sunlight = LLPipeline::sBakeSunlight && drawablep->isStatic();
bool is_rigged = false;
+ if (rigged && pAvatarVO)
+ {
+ pAvatarVO->addAttachmentPosOverridesForObject(vobj);
+ if (pAvatarVO->isSelf())
+ {
+ //pAvatarVO->showAttachmentPosOverrides();
+ }
+ }
+
//for each face
for (S32 i = 0; i < drawablep->getNumFaces(); i++)
{
@@ -4837,8 +4803,6 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
//sum up face verts and indices
drawablep->updateFaceSize(i);
-
-
if (rigged)
{
if (!facep->isState(LLFace::RIGGED))
@@ -4852,13 +4816,6 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
//get drawpool of avatar with rigged face
LLDrawPoolAvatar* pool = get_avatar_drawpool(vobj);
- // FIXME should this be inside the face loop?
- // doesn't seem to depend on any per-face state.
- if ( pAvatarVO )
- {
- pAvatarVO->addAttachmentPosOverridesForObject(vobj);
- }
-
if (pool)
{
const LLTextureEntry* te = facep->getTextureEntry();
diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index 638a4e2da8..9a9101e0da 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences.xml
@@ -3,7 +3,7 @@
legacy_header_height="18"
positioning="centered"
default_tab_group="1"
- height="460"
+ height="512"
layout="topleft"
name="Preferences"
help_topic="preferences"
@@ -19,7 +19,7 @@
layout="topleft"
right="-105"
name="OK"
- top="433"
+ top="473"
width="90">
<button.commit_callback
function="Pref.OK" />
@@ -40,7 +40,7 @@
<tab_container
follows="all"
halign="left"
- height="410"
+ height="440"
layout="topleft"
left="0"
name="pref core"
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_other.xml b/indra/newview/skins/default/xui/en/menu_attachment_other.xml
index 9e520b2d31..8771660bcf 100644
--- a/indra/newview/skins/default/xui/en/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_other.xml
@@ -40,6 +40,15 @@
function="Avatar.InviteToGroup" />
</menu_item_call>
<menu_item_separator />
+
+ <menu_item_call label="Reset Skeleton"
+ layout="topleft"
+ name="Reset Skeleton">
+ <menu_item_call.on_click
+ function="Avatar.ResetSkeleton" />
+ </menu_item_call>
+
+ <menu_item_separator />
<menu_item_call
enabled="false"
label="Block"
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
index c6ae844d67..ced0dd37b1 100644
--- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -99,6 +99,13 @@ name="Edit Outfit">
<menu_item_call.on_enable
function="Edit.EnableHoverHeight" />
</menu_item_call>
+ <menu_item_call label="Reset Skeleton"
+ layout="topleft"
+ name="Reset Skeleton">
+ <menu_item_call.on_click
+ function="Avatar.ResetSkeleton" />
+ </menu_item_call>
+
<menu_item_call
label="My Friends"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_other.xml b/indra/newview/skins/default/xui/en/menu_avatar_other.xml
index fadacbf3cb..f89c0eadf8 100644
--- a/indra/newview/skins/default/xui/en/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_other.xml
@@ -41,6 +41,15 @@
</menu_item_call>
<menu_item_separator />
+
+ <menu_item_call label="Reset Skeleton"
+ layout="topleft"
+ name="Reset Skeleton">
+ <menu_item_call.on_click
+ function="Avatar.ResetSkeleton" />
+ </menu_item_call>
+
+ <menu_item_separator />
<menu_item_call
enabled="false"
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
index d3b0b07f70..924e8b8454 100644
--- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
@@ -237,6 +237,12 @@
<menu_item_call.on_enable
function="Edit.EnableHoverHeight" />
</menu_item_call>
+ <menu_item_call label="Reset Skeleton"
+ layout="topleft"
+ name="Reset Skeleton">
+ <menu_item_call.on_click
+ function="Avatar.ResetSkeleton" />
+ </menu_item_call>
<menu_item_call
label="My Friends"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 0a492fb37b..ad7aca641b 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -3528,6 +3528,16 @@
parameter="collision skeleton" />
</menu_item_check>
<menu_item_check
+ label="Show Bones"
+ name="Show Bones">
+ <menu_item_check.on_check
+ function="Advanced.CheckInfoDisplay"
+ parameter="joints" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInfoDisplay"
+ parameter="joints" />
+ </menu_item_check>
+ <menu_item_check
label="Display Agent Target"
name="Display Agent Target">
<menu_item_check.on_check
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 492d963653..4daff340ac 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -1416,6 +1416,13 @@ Port settings take effect after you restart [APP_NAME].
<notification
icon="alertmodal.tga"
+ name="ChangeDeferredDebugSetting"
+ type="alertmodal">
+This debug setting change will take effect after you restart [APP_NAME].
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="ChangeSkin"
type="alertmodal">
The new skin will appear after you restart [APP_NAME].
@@ -10354,6 +10361,14 @@ Not enough script resources available to attach object!
</notification>
<notification
+ icon="alertmodal.tga"
+ name="IllegalAttachment"
+ type="notify">
+ <tag>fail</tag>
+ The attachment has requested a nonexistent point on the avatar. It has been attached to the chest instead.
+ </notification>
+
+ <notification
icon="alertmodal.tga"
name="CantDropItemTrialUser"
type="notify">
diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml
index 94c468e1bb..756b8f8102 100644
--- a/indra/newview/skins/default/xui/en/panel_notification.xml
+++ b/indra/newview/skins/default/xui/en/panel_notification.xml
@@ -10,7 +10,6 @@
left="0"
name="notification_panel"
chrome="true"
- show_title="false"
top="0"
height="140"
translate="false"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index a9b8e197bc..9e99916ca0 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -2,7 +2,7 @@
<panel
border="true"
follows="left|top|right|bottom"
- height="418"
+ height="438"
label="Graphics"
layout="topleft"
left="102"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index 323da2be38..284688d4d1 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -16,7 +16,7 @@
</panel.string>
<button
- follows="left|bottom"
+ follows="left|top"
height="23"
label="Clear History"
tool_tip="Clear login image, last location, teleport history, web, and texture cache"
@@ -75,7 +75,7 @@
top_pad="10"
width="350" />
<button
- follows="left|bottom"
+ follows="left|top"
height="23"
label="Block list"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index 615abbaa89..53b74fa645 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -2,7 +2,7 @@
<panel
border="true"
follows="all"
- height="408"
+ height="438"
label="Sounds"
layout="topleft"
left="102"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index ae63546082..72a6f09f92 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2255,6 +2255,7 @@ For AI Character: Get the closest navigable point to the point provided.
<string name="BodyPartsLeftLeg">Left Leg</string>
<string name="BodyPartsTorso">Torso</string>
<string name="BodyPartsRightLeg">Right Leg</string>
+ <string name="BodyPartsEnhancedSkeleton">Enhanced Skeleton</string>
<!-- slider -->
<string name="GraphicsQualityLow">Low</string>
@@ -2476,8 +2477,23 @@ This feature is currently in Beta. Please add your name to this [http://goo.gl/f
<string name="Stomach">Stomach</string>
<string name="Left Pec">Left Pec</string>
<string name="Right Pec">Right Pec</string>
- <string name="Neck">Neck</string>
- <string name="Avatar Center">Avatar Center</string>
+ <string name="Neck">Neck</string>
+ <string name="Avatar Center">Avatar Center</string>
+ <string name="Left Ring Finger">Left Ring Finger</string>
+ <string name="Right Ring Finger">Right Ring Finger</string>
+ <string name="Tail Base">Tail Base</string>
+ <string name="Tail Tip">Tail Tip</string>
+ <string name="Left Wing">Left Wing</string>
+ <string name="Right Wing">Right Wing</string>
+ <string name="Jaw">Jaw</string>
+ <string name="Alt Left Ear">Alt Left Ear</string>
+ <string name="Alt Right Ear">Alt Right Ear</string>
+ <string name="Alt Left Eye">Alt Left Eye</string>
+ <string name="Alt Right Eye">Alt Right Eye</string>
+ <string name="Tongue">Tongue</string>
+ <string name="Groin">Groin</string>
+ <string name="Left Hind Foot">Left Hind Foot</string>
+ <string name="Right Hind Foot">Right Hind Foot</string>
<string name="Invalid Attachment">Invalid Attachment Point</string>
<string name="ATTACHMENT_MISSING_ITEM">Error: missing item</string>
<string name="ATTACHMENT_MISSING_BASE_ITEM">Error: missing base item</string>