diff --git a/indra/newview/fsfloaterposer.cpp b/indra/newview/fsfloaterposer.cpp
index eba653938d..9b0d95ab55 100644
--- a/indra/newview/fsfloaterposer.cpp
+++ b/indra/newview/fsfloaterposer.cpp
@@ -1192,6 +1192,8 @@ LLSD FSFloaterPoser::createRowForJoint(const std::string& jointName, bool isHead
std::string parameterName = (isHeaderRow ? XML_LIST_HEADER_STRING_PREFIX : XML_LIST_TITLE_STRING_PREFIX) + jointName;
if (hasString(parameterName))
jointValue = getString(parameterName);
+ else
+ return NULL;
LLSD row;
row["columns"][COL_ICON]["column"] = "icon";
@@ -2403,17 +2405,18 @@ bool FSFloaterPoser::writePoseAsBvh(llofstream* fileStream, LLVOAvatar* avatar)
*fileStream << "MOTION" << std::endl;
*fileStream << "Frames: 2" << std::endl;
*fileStream << "Frame Time: 1" << std::endl;
- *fileStream << "0.000000 0.000000 0.000000 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0" << std::endl;
+ writeFirstFrameOfBvhMotion(fileStream, startingJoint);
+ *fileStream << std::endl;
writeBvhMotion(fileStream, avatar, startingJoint);
*fileStream << std::endl;
return true;
}
-bool FSFloaterPoser::writeBvhFragment(llofstream* fileStream, LLVOAvatar* avatar, const FSPoserAnimator::FSPoserJoint* joint, S32 tabStops)
+void FSFloaterPoser::writeBvhFragment(llofstream* fileStream, LLVOAvatar* avatar, const FSPoserAnimator::FSPoserJoint* joint, S32 tabStops)
{
if (!joint)
- return false;
+ return;
auto position = mPoserAnimator.getJointPosition(avatar, *joint);
auto saveAxis = getBvhJointTranslation(joint->jointName());
@@ -2475,32 +2478,44 @@ bool FSFloaterPoser::writeBvhFragment(llofstream* fileStream, LLVOAvatar* avatar
}
else
{
+ // append the End Site offset
*fileStream << getTabs(tabStops + 1) + "End Site" << std::endl;
*fileStream << getTabs(tabStops + 1) + "{" << std::endl;
-
- // append the 'end knot' magic number
- if (strstr(joint->jointName().c_str(), "mHead"))
- *fileStream << getTabs(tabStops + 2) + "OFFSET 0.000000 3.148289 0.000000" << std::endl;
- if (strstr(joint->jointName().c_str(), "mWristLeft"))
- *fileStream << getTabs(tabStops + 2) + "OFFSET 4.106464 0.000000 0.000000" << std::endl;
- if (strstr(joint->jointName().c_str(), "mWristRight"))
- *fileStream << getTabs(tabStops + 2) + "OFFSET -4.106464 0.000000 0.000000" << std::endl;
- if (strstr(joint->jointName().c_str(), "mAnkleLeft"))
- *fileStream << getTabs(tabStops + 2) + "OFFSET 0.000000 -2.463878 4.653993" << std::endl;
- if (strstr(joint->jointName().c_str(), "mAnkleRight"))
- *fileStream << getTabs(tabStops + 2) + "OFFSET 0.000000 -2.463878 4.653993" << std::endl;
-
+ *fileStream << getTabs(tabStops + 2) + "OFFSET " + joint->bvhEndSite() << std::endl;
*fileStream << getTabs(tabStops + 1) + "}" << std::endl;
}
*fileStream << getTabs(tabStops) + "}" << std::endl;
- return true;
}
-bool FSFloaterPoser::writeBvhMotion(llofstream* fileStream, LLVOAvatar* avatar, const FSPoserAnimator::FSPoserJoint* joint)
+void FSFloaterPoser::writeFirstFrameOfBvhMotion(llofstream* fileStream, const FSPoserAnimator::FSPoserJoint* joint)
{
if (!joint)
- return false;
+ return;
+
+ switch (joint->boneType())
+ {
+ case WHOLEAVATAR:
+ *fileStream << "0.000000 0.000000 0.000000 0.0 0.0 0.0";
+ break;
+
+ default:
+ *fileStream << " 0.0 0.0 0.0";
+ break;
+ }
+
+ size_t numberOfBvhChildNodes = joint->bvhChildren().size();
+ for (size_t index = 0; index != numberOfBvhChildNodes; ++index)
+ {
+ auto nextJoint = mPoserAnimator.getPoserJointByName(joint->bvhChildren()[index]);
+ writeFirstFrameOfBvhMotion(fileStream, nextJoint);
+ }
+}
+
+void FSFloaterPoser::writeBvhMotion(llofstream* fileStream, LLVOAvatar* avatar, const FSPoserAnimator::FSPoserJoint* joint)
+{
+ if (!joint)
+ return;
auto rotation = mPoserAnimator.getJointRotation(avatar, *joint, SWAP_NOTHING, NEGATE_NOTHING);
auto position = mPoserAnimator.getJointPosition(avatar, *joint);
@@ -2522,8 +2537,6 @@ bool FSFloaterPoser::writeBvhMotion(llofstream* fileStream, LLVOAvatar* avatar,
auto nextJoint = mPoserAnimator.getPoserJointByName(joint->bvhChildren()[index]);
writeBvhMotion(fileStream, avatar, nextJoint);
}
-
- return true;
}
std::string FSFloaterPoser::vec3ToXYZString(const LLVector3& val)
diff --git a/indra/newview/fsfloaterposer.h b/indra/newview/fsfloaterposer.h
index bd8e4c09db..0dbe809af7 100644
--- a/indra/newview/fsfloaterposer.h
+++ b/indra/newview/fsfloaterposer.h
@@ -386,8 +386,7 @@ class FSFloaterPoser : public LLFloater
/// The avatar owning the supplied joint.
/// The joint whose fragment should be written, and whose child(ren) will also be written.
/// The number of tab-stops to include for formatting purpose.
- /// True if the fragment wrote successfully, otherwise false.
- bool writeBvhFragment(llofstream* fileStream, LLVOAvatar* avatar, const FSPoserAnimator::FSPoserJoint* joint, S32 tabStops);
+ void writeBvhFragment(llofstream* fileStream, LLVOAvatar* avatar, const FSPoserAnimator::FSPoserJoint* joint, S32 tabStops);
///
/// Writes a fragment of the 'single line' representing an animation frame within the BVH file respresenting the positions and/or
@@ -396,8 +395,15 @@ class FSFloaterPoser : public LLFloater
/// The stream to write the position and/or rotation to.
/// The avatar owning the supplied joint.
/// The joint whose position and/or rotation should be written.
- ///
- bool writeBvhMotion(llofstream* fileStream, LLVOAvatar* avatar, const FSPoserAnimator::FSPoserJoint* joint);
+ void writeBvhMotion(llofstream* fileStream, LLVOAvatar* avatar, const FSPoserAnimator::FSPoserJoint* joint);
+
+ ///
+ /// Writes a fragment of the 'single line' representing the first animation frame within the BVH file respresenting the positions and/or
+ /// rotations.
+ ///
+ /// The stream to write the position and/or rotation to.
+ /// The joint whose position and/or rotation should be written.
+ void writeFirstFrameOfBvhMotion(llofstream* fileStream, const FSPoserAnimator::FSPoserJoint* joint);
///
/// Generates a string with the supplied number of tab-chars.
diff --git a/indra/newview/fsposeranimator.h b/indra/newview/fsposeranimator.h
index 109044b58b..7f7ce6e334 100644
--- a/indra/newview/fsposeranimator.h
+++ b/indra/newview/fsposeranimator.h
@@ -118,7 +118,8 @@ class FSPoserAnimator
std::string mMirrorJointName;
E_BoneTypes mBoneList;
std::vector mBvhChildren;
- std::string bvhOffsetMagicNumber;
+ std::string bvhOffsetValue;
+ std::string bvhEndSiteOffset;
bool mDontFlipOnMirror = false;
public:
@@ -148,9 +149,17 @@ class FSPoserAnimator
std::vector bvhChildren() const { return mBvhChildren; }
///
- /// Gets the bvh offset magic number for this joint.
+ /// Gets the bvh offset value for this joint.
///
- std::string bvhOffset() const { return bvhOffsetMagicNumber; }
+ ///
+ /// These values are derived from \newview\character\avatar_skeleton.xml
+ ///
+ std::string bvhOffset() const { return bvhOffsetValue; }
+
+ ///
+ /// Gets the bvh end site offset magic number for this joint.
+ ///
+ std::string bvhEndSite() const { return bvhEndSiteOffset; }
///
/// Creates a new instance of a PoserJoint.
@@ -165,14 +174,16 @@ class FSPoserAnimator
/// The optional array of joints, needed for BVH saving, which are the direct decendent(s) of this joint.
/// The option for whether this joint should rotation-flip it counterpart when mirroring the pose of the entire body.
FSPoserJoint(std::string joint_name, std::string mirror_joint_name, E_BoneTypes bone_list,
- std::vector bhv_children = {}, std::string bvhOffset = "", bool dont_flip_on_mirror = false)
+ std::vector bhv_children = {}, std::string bvhOffset = "", std::string bvhEndSiteValue = "",
+ bool dont_flip_on_mirror = false)
{
mJointName = joint_name;
mMirrorJointName = mirror_joint_name;
mBoneList = bone_list;
mBvhChildren = bhv_children;
- bvhOffsetMagicNumber = bvhOffset;
+ bvhOffsetValue = bvhOffset;
mDontFlipOnMirror = dont_flip_on_mirror;
+ bvhEndSiteOffset = bvhEndSiteValue;
}
};
@@ -186,136 +197,155 @@ class FSPoserAnimator
///
const std::vector PoserJoints{
// head, torso, legs
- { "mHead", "", BODY, {}, "0.000000 3.148285 0.000000" },
- { "mNeck", "", BODY, { "mHead" }, "0.000000 10.266162 -0.273764" },
- { "mPelvis", "", WHOLEAVATAR, { "mTorso", "mHipLeft", "mHipRight" }, "0.000000 0.000000 0.000000" },
- { "mChest", "", BODY, { "mNeck", "mCollarLeft", "mCollarRight" }, "0.000000 8.486693 -0.684411" },
- { "mTorso", "", BODY, { "mChest" }, "0.000000 3.422050 0.000000" },
- { "mCollarLeft", "mCollarRight", BODY, { "mShoulderLeft" }, "3.422053 6.707223 -0.821293" },
- { "mShoulderLeft", "mShoulderRight", BODY, { "mElbowLeft" }, "3.285171 0.000000 0.000000" },
- { "mElbowLeft", "mElbowRight", BODY, { "mWristLeft" }, "10.129278 0.000000 0.000000" },
- { "mWristLeft", "mWristRight", BODY, {}, "8.486692 0.000000 0.000000" },
- { "mCollarRight", "mCollarLeft", BODY, { "mShoulderRight" }, "-3.558935 6.707223 -0.821293", true },
- { "mShoulderRight", "mShoulderLeft", BODY, { "mElbowRight" }, "-3.148289 0.000000 0.000000", true },
- { "mElbowRight", "mElbowLeft", BODY, { "mWristRight" }, "-10.266159 0.000000 0.000000", true },
- { "mWristRight", "mWristLeft", BODY, {}, "-8.349810 0.000000 0.000000", true },
- { "mHipLeft", "mHipRight", BODY, { "mKneeLeft" }, "5.338403 -1.642589 1.368821" },
- { "mKneeLeft", "mKneeRight", BODY, { "mAnkleLeft" }, "-2.053232 -20.121670 0.000000" },
- { "mAnkleLeft", "mAnkleRight", BODY, {}, "0.000000 -19.300380 -1.231939" },
- { "mHipRight", "mHipLeft", BODY, { "mKneeRight" }, "-5.338403 -1.642589 1.368821", true },
- { "mKneeRight", "mKneeLeft", BODY, { "mAnkleRight" }, "2.053232 -20.121670 0.000000", true },
- { "mAnkleRight", "mAnkleLeft", BODY, {}, "0.000000 -19.300380 -1.231939", true },
+ { "mHead", "", BODY, { "mEyeLeft", "mEyeRight", "mFaceRoot" }, "0.000 0.076 0.000" },
+ { "mNeck", "", BODY, { "mHead" }, "0.000 0.251 -0.010" },
+ { "mPelvis", "", WHOLEAVATAR, { "mTorso", "mHipLeft", "mHipRight", "mTail1", "mGroin", "mHindLimbsRoot" }, "0.000000 0.000000 0.000000" },
+ { "mChest", "", BODY, { "mNeck", "mCollarLeft", "mCollarRight", "mWingsRoot" }, "0.000 0.205 -0.015" },
+ { "mTorso", "", BODY, { "mChest" }, "0.000 0.084 0.000" },
+ { "mCollarLeft", "mCollarRight", BODY, { "mShoulderLeft" }, "0.085 0.165 -0.021" },
+ { "mShoulderLeft", "mShoulderRight", BODY, { "mElbowLeft" }, "0.079 0.000 0.000" },
+ { "mElbowLeft", "mElbowRight", BODY, { "mWristLeft" }, "0.248 0.000 0.000" },
+ { "mWristLeft", "mWristRight", BODY, { "mHandThumb1Left", "mHandIndex1Left", "mHandMiddle1Left", "mHandRing1Left", "mHandPinky1Left" }, "0.205 0.000 0.000" },
+ { "mCollarRight", "mCollarLeft", BODY, { "mShoulderRight" }, "-0.085 0.165 -0.021", "", true },
+ { "mShoulderRight", "mShoulderLeft", BODY, { "mElbowRight" }, "-0.079 0.000 0.000", "", true },
+ { "mElbowRight", "mElbowLeft", BODY, { "mWristRight" }, "-0.248 0.000 0.000", "", true },
+ { "mWristRight", "mWristLeft", BODY, { "mHandThumb1Right", "mHandIndex1Right", "mHandMiddle1Right", "mHandRing1Right", "mHandPinky1Right" }, "-0.205 0.000 0.000", "", true },
+ { "mHipLeft", "mHipRight", BODY, { "mKneeLeft" }, "0.127 -0.041 0.034" },
+ { "mKneeLeft", "mKneeRight", BODY, { "mAnkleLeft" }, "-0.046 -0.491 -0.001" },
+ { "mAnkleLeft", "mAnkleRight", BODY, {}, "0.001 -0.468 -0.029", "0.000 -0.061 0.112" },
+ { "mHipRight", "mHipLeft", BODY, { "mKneeRight" }, "-0.129 -0.041 0.034", "0.000 -0.061 0.112", true },
+ { "mKneeRight", "mKneeLeft", BODY, { "mAnkleRight" }, "0.049 -0.491 -0.001", "", true },
+ { "mAnkleRight", "mAnkleLeft", BODY, {}, "0.000 -0.468 -0.029", "0.000 -0.061 0.112", true },
// face
- { "mFaceForeheadLeft", "mFaceForeheadRight", FACE },
- { "mFaceForeheadCenter", "", FACE },
- { "mFaceForeheadRight", "mFaceForeheadLeft", FACE, {}, "", true },
- { "mFaceEyebrowOuterLeft", "mFaceEyebrowOuterRight", FACE },
- { "mFaceEyebrowCenterLeft", "mFaceEyebrowCenterRight", FACE },
- { "mFaceEyebrowInnerLeft", "mFaceEyebrowInnerRight", FACE },
- { "mFaceEyebrowOuterRight", "mFaceEyebrowOuterLeft", FACE, {}, "", true },
- { "mFaceEyebrowCenterRight", "mFaceEyebrowCenterLeft", FACE, {}, "", true },
- { "mFaceEyebrowInnerRight", "mFaceEyebrowInnerLeft", FACE, {}, "", true },
-
- { "mEyeLeft", "mEyeRight", FACE },
- { "mEyeRight", "mEyeLeft", FACE, {}, "", true },
- { "mFaceEyeLidUpperLeft", "mFaceEyeLidUpperRight", FACE },
- { "mFaceEyeLidLowerLeft", "mFaceEyeLidLowerRight", FACE },
- { "mFaceEyeLidUpperRight", "mFaceEyeLidUpperLeft", FACE, {}, "", true },
- { "mFaceEyeLidLowerRight", "mFaceEyeLidLowerLeft", FACE, {}, "", true },
-
- { "mFaceEar1Left", "mFaceEar1Right", FACE },
- { "mFaceEar2Left", "mFaceEar2Right", FACE },
- { "mFaceEar1Right", "mFaceEar1Left", FACE, {}, "", true },
- { "mFaceEar2Right", "mFaceEar2Left", FACE, {}, "", true },
- { "mFaceNoseLeft", "mFaceNoseRight", FACE },
- { "mFaceNoseCenter", "", FACE },
- { "mFaceNoseRight", "mFaceNoseLeft", FACE, {}, "", true },
-
- { "mFaceCheekUpperLeft", "mFaceCheekUpperRight", FACE },
- { "mFaceCheekLowerLeft", "mFaceCheekLowerRight", FACE },
- { "mFaceCheekUpperRight", "mFaceCheekUpperLeft", FACE, {}, "", true },
- { "mFaceCheekLowerRight", "mFaceCheekLowerLeft", FACE, {}, "", true },
- { "mFaceLipUpperLeft", "mFaceLipUpperRight", FACE },
- { "mFaceLipUpperCenter", "", FACE },
- { "mFaceLipUpperRight", "mFaceLipUpperLeft", FACE, {}, "", true },
- { "mFaceLipCornerLeft", "mFaceLipCornerRight", FACE },
- { "mFaceLipCornerRight", "mFaceLipCornerLeft", FACE, {}, "", true },
- { "mFaceTongueBase", "", FACE },
- { "mFaceTongueTip", "", FACE, {}, "", true },
- { "mFaceLipLowerLeft", "mFaceLipLowerRight", FACE },
- { "mFaceLipLowerCenter", "", FACE },
- { "mFaceLipLowerRight", "mFaceLipLowerLeft", FACE, {}, "", true },
- { "mFaceJaw", "", FACE },
+ { "mFaceRoot",
+ "",
+ FACE,
+ {
+ "mFaceForeheadLeft", "mFaceForeheadCenter", "mFaceForeheadRight",
+ "mFaceEyebrowOuterLeft", "mFaceEyebrowCenterLeft", "mFaceEyebrowInnerLeft",
+ "mFaceEyebrowOuterRight", "mFaceEyebrowCenterRight", "mFaceEyebrowInnerRight",
+ "mFaceEyeLidUpperLeft", "mFaceEyeLidLowerLeft",
+ "mFaceEyeLidUpperRight", "mFaceEyeLidLowerRight",
+ "mFaceEar1Left", "mFaceEar1Right",
+ "mFaceNoseLeft", "mFaceNoseCenter", "mFaceNoseRight",
+ "mFaceCheekUpperLeft", "mFaceCheekLowerLeft",
+ "mFaceCheekUpperRight", "mFaceCheekLowerRight",
+ "mFaceJaw", "mFaceTeethUpper"
+ },
+ "0.000 0.045 0.025" },
+ { "mFaceForeheadLeft", "mFaceForeheadRight", FACE, {}, "0.035 0.083 0.061", "0.004 0.018 0.024" },
+ { "mFaceForeheadCenter", "", FACE, {}, "0.000 0.065 0.069", "0.000 0.000 0.036" },
+ { "mFaceForeheadRight", "mFaceForeheadLeft", FACE, {}, "-0.035 0.083 0.061", "-0.004 0.018 0.024", true },
+ { "mFaceEyebrowOuterLeft", "mFaceEyebrowOuterRight", FACE, {}, "0.051 0.048 0.064", "0.013 0.000 0.023" },
+ { "mFaceEyebrowCenterLeft", "mFaceEyebrowCenterRight", FACE, {}, "0.043 0.056 0.070", "0.000 0.000 0.027" },
+ { "mFaceEyebrowInnerLeft", "mFaceEyebrowInnerRight", FACE, {}, "0.022 0.051 0.075", "0.000 0.000 0.026" },
+ { "mFaceEyebrowOuterRight", "mFaceEyebrowOuterLeft", FACE, {}, "-0.051 0.048 0.064", "-0.013 0.000 0.023", true },
+ { "mFaceEyebrowCenterRight", "mFaceEyebrowCenterLeft", FACE, {}, "-0.043 0.056 0.070", "0.000 0.000 0.027", true },
+ { "mFaceEyebrowInnerRight", "mFaceEyebrowInnerLeft", FACE, {}, "-0.022 0.051 0.075", "0.000 0.000 0.026", true },
+
+ { "mEyeLeft", "mEyeRight", FACE, {}, "-0.036 0.079 0.098", "0.000 0.000 0.025" },
+ { "mEyeRight", "mEyeLeft", FACE, {}, "0.036 0.079 0.098", "0.000 0.000 0.025", true },
+ { "mFaceEyeLidUpperLeft", "mFaceEyeLidUpperRight", FACE, {}, "0.036 0.034 0.073", "0.000 0.005 0.027" },
+ { "mFaceEyeLidLowerLeft", "mFaceEyeLidLowerRight", FACE, {}, "0.036 0.034 0.073", "0.000 -0.007 0.024" },
+ { "mFaceEyeLidUpperRight", "mFaceEyeLidUpperLeft", FACE, {}, "-0.036 0.034 0.073", "0.000 0.005 0.027", true },
+ { "mFaceEyeLidLowerRight", "mFaceEyeLidLowerLeft", FACE, {}, "-0.036 0.034 0.073", "0.000 -0.007 0.024", true },
+
+ { "mFaceEar1Left", "mFaceEar1Right", FACE, { "mFaceEar2Left" }, "0.080 0.002 0.000", "" },
+ { "mFaceEar2Left", "mFaceEar2Right", FACE, {}, "0.018 0.025 -0.019", "0.000 0.033 0.000" },
+ { "mFaceEar1Right", "mFaceEar1Left", FACE, { "mFaceEar2Right" }, "-0.080 0.002 0.000", "", true },
+ { "mFaceEar2Right", "mFaceEar2Left", FACE, {}, "-0.018 0.025 -0.019", "0.000 0.033 0.000", true },
+ { "mFaceNoseLeft", "mFaceNoseRight", FACE, {}, "0.015 -0.004 0.086", "0.004 0.000 0.015" },
+ { "mFaceNoseCenter", "", FACE, {}, "0.000 0.000 0.102", "0.000 0.000 0.025" },
+ { "mFaceNoseRight", "mFaceNoseLeft", FACE, {}, "-0.015 -0.004 0.086", "-0.004 0.000 0.015", true },
+
+ { "mFaceCheekUpperLeft", "mFaceCheekUpperRight", FACE, {}, "0.034 -0.005 0.070", "0.015 0.000 0.022" },
+ { "mFaceCheekLowerLeft", "mFaceCheekLowerRight", FACE, {}, "0.034 -0.031 0.050", "0.030 0.000 0.013" },
+ { "mFaceCheekUpperRight", "mFaceCheekUpperLeft", FACE, {}, "-0.034 -0.005 0.070", "-0.015 0.000 0.022", true },
+ { "mFaceCheekLowerRight", "mFaceCheekLowerLeft", FACE, {}, "-0.034 -0.031 0.050", "-0.030 0.000 0.013", true },
+ { "mFaceLipUpperLeft", "mFaceLipUpperRight", FACE, {}, "0.000 -0.003 0.045", "0.015 0.000 0.041" },
+ { "mFaceLipUpperCenter", "", FACE, {}, "0.000 -0.003 0.045", "0.000 0.002 0.043" },
+ { "mFaceLipUpperRight", "mFaceLipUpperLeft", FACE, {}, "0.000 -0.003 0.045", "-0.015 0.000 0.041", true },
+ { "mFaceLipCornerLeft", "mFaceLipCornerRight", FACE, {}, "-0.019 -0.010 0.028", "0.051 0.000 0.045" },
+ { "mFaceLipCornerRight", "mFaceLipCornerLeft", FACE, {}, "0.019 -0.010 0.028", "-0.051 0.000 0.045", true },
+ { "mFaceTeethUpper", "", FACE, { "mFaceLipUpperLeft","mFaceLipUpperCenter", "mFaceLipUpperRight", "mFaceLipCornerLeft", "mFaceLipCornerRight" }, "0.000 -0.030 0.020" },
+ { "mFaceTeethLower", "", FACE, { "mFaceLipLowerLeft", "mFaceLipLowerCenter", "mFaceLipLowerRight", "mFaceTongueBase" }, "0.000 -0.039 0.021" },
+ { "mFaceTongueBase", "", FACE, { "mFaceTongueTip" }, "0.000 0.005 0.039" },
+ { "mFaceTongueTip", "", FACE, {}, "0.000 0.007 0.022", "0.000 0.000 0.010", true },
+ { "mFaceLipLowerLeft", "mFaceLipLowerRight", FACE, {}, "0.000 0.000 0.045", "0.017 0.005 0.034" },
+ { "mFaceLipLowerCenter", "", FACE, {}, "0.000 0.000 0.045", "0.000 0.002 0.040" },
+ { "mFaceLipLowerRight", "mFaceLipLowerLeft", FACE, {}, "0.000 0.000 0.045", "-0.017 0.005 0.034", true },
+ { "mFaceJaw", "", FACE, { "mFaceChin", "mFaceTeethLower" }, "0.000 -0.015 -0.001", "" },
+ { "mFaceChin", "", FACE, {}, "0.000 -0.015 -0.001", "0.000 -0.018 0.021" },
// left hand
- { "mHandThumb1Left", "mHandThumb1Right", HANDS },
- { "mHandThumb2Left", "mHandThumb2Right", HANDS },
- { "mHandThumb3Left", "mHandThumb3Right", HANDS },
- { "mHandIndex1Left", "mHandIndex1Right", HANDS },
- { "mHandIndex2Left", "mHandIndex2Right", HANDS },
- { "mHandIndex3Left", "mHandIndex3Right", HANDS },
- { "mHandMiddle1Left", "mHandMiddle1Right", HANDS },
- { "mHandMiddle2Left", "mHandMiddle2Right", HANDS },
- { "mHandMiddle3Left", "mHandMiddle3Right", HANDS },
- { "mHandRing1Left", "mHandRing1Right", HANDS },
- { "mHandRing2Left", "mHandRing2Right", HANDS },
- { "mHandRing3Left", "mHandRing3Right", HANDS },
- { "mHandPinky1Left", "mHandPinky1Right", HANDS },
- { "mHandPinky2Left", "mHandPinky2Right", HANDS },
- { "mHandPinky3Left", "mHandPinky3Right", HANDS },
+ { "mHandThumb1Left", "mHandThumb1Right", HANDS, { "mHandThumb2Left" }, "0.026 0.004 0.031" },
+ { "mHandThumb2Left", "mHandThumb2Right", HANDS, { "mHandThumb3Left" }, "0.032 -0.001 0.028" },
+ { "mHandThumb3Left", "mHandThumb3Right", HANDS, {}, "0.031 -0.001 0.023", "0.025 0.000 0.015" },
+ { "mHandIndex1Left", "mHandIndex1Right", HANDS, { "mHandIndex2Left" }, "0.097 0.015 0.038" },
+ { "mHandIndex2Left", "mHandIndex2Right", HANDS, { "mHandIndex3Left" }, "0.036 -0.006 0.017" },
+ { "mHandIndex3Left", "mHandIndex3Right", HANDS, {}, "0.032 -0.006 0.014", "0.025 -0.004 0.011" },
+ { "mHandMiddle1Left", "mHandMiddle1Right", HANDS, { "mHandMiddle2Left" }, "0.101 0.015 0.013" },
+ { "mHandMiddle2Left", "mHandMiddle2Right", HANDS, { "mHandMiddle3Left" }, "0.040 -0.006 -0.001" },
+ { "mHandMiddle3Left", "mHandMiddle3Right", HANDS, {}, "0.049 -0.008 -0.001", "0.033 -0.006 -0.002" },
+ { "mHandRing1Left", "mHandRing1Right", HANDS, { "mHandRing2Left" }, "0.099 0.009 -0.010" },
+ { "mHandRing2Left", "mHandRing2Right", HANDS, { "mHandRing3Left" }, "0.038 -0.008 -0.013" },
+ { "mHandRing3Left", "mHandRing3Right", HANDS, {}, "0.040 -0.009 -0.013", "0.028 -0.006 -0.010" },
+ { "mHandPinky1Left", "mHandPinky1Right", HANDS, { "mHandPinky2Left" }, "0.095 0.003 -0.031" },
+ { "mHandPinky2Left", "mHandPinky2Right", HANDS, { "mHandPinky3Left" }, "0.025 -0.006 -0.024" },
+ { "mHandPinky3Left", "mHandPinky3Right", HANDS, {}, "0.018 -0.004 -0.015", "0.016 -0.004 -0.013" },
// right hand
- { "mHandThumb1Right", "mHandThumb1Left", HANDS, {}, "", true },
- { "mHandThumb2Right", "mHandThumb2Left", HANDS, {}, "", true },
- { "mHandThumb3Right", "mHandThumb3Left", HANDS, {}, "", true },
- { "mHandIndex1Right", "mHandIndex1Left", HANDS, {}, "", true },
- { "mHandIndex2Right", "mHandIndex2Left", HANDS, {}, "", true },
- { "mHandIndex3Right", "mHandIndex3Left", HANDS, {}, "", true },
- { "mHandMiddle1Right", "mHandMiddle1Left", HANDS, {}, "", true },
- { "mHandMiddle2Right", "mHandMiddle2Left", HANDS, {}, "", true },
- { "mHandMiddle3Right", "mHandMiddle3Left", HANDS, {}, "", true },
- { "mHandRing1Right", "mHandRing1Left", HANDS, {}, "", true },
- { "mHandRing2Right", "mHandRing2Left", HANDS, {}, "", true },
- { "mHandRing3Right", "mHandRing3Left", HANDS, {}, "", true },
- { "mHandPinky1Right", "mHandPinky1Left", HANDS, {}, "", true },
- { "mHandPinky2Right", "mHandPinky2Left", HANDS, {}, "", true },
- { "mHandPinky3Right", "mHandPinky3Left", HANDS, {}, "", true },
+ { "mHandThumb1Right", "mHandThumb1Left", HANDS, { "mHandThumb2Right" }, "-0.026 0.004 0.031", "", true },
+ { "mHandThumb2Right", "mHandThumb2Left", HANDS, { "mHandThumb3Right" }, "-0.032 -0.001 0.028", "", true },
+ { "mHandThumb3Right", "mHandThumb3Left", HANDS, {}, "-0.031 -0.001 0.023", "-0.025 0.000 0.015", true },
+ { "mHandIndex1Right", "mHandIndex1Left", HANDS, { "mHandIndex2Right" }, "-0.097 0.015 0.038", "", true },
+ { "mHandIndex2Right", "mHandIndex2Left", HANDS, { "mHandIndex3Right" }, "-0.036 -0.006 0.017", "", true },
+ { "mHandIndex3Right", "mHandIndex3Left", HANDS, {}, "-0.032 -0.006 0.014", "-0.025 -0.004 0.011", true },
+ { "mHandMiddle1Right", "mHandMiddle1Left", HANDS, { "mHandMiddle2Right" }, "-0.101 0.015 0.013", "", true },
+ { "mHandMiddle2Right", "mHandMiddle2Left", HANDS, { "mHandMiddle3Right" }, "-0.040 -0.006 -0.001", "", true },
+ { "mHandMiddle3Right", "mHandMiddle3Left", HANDS, {}, "-0.049 -0.008 -0.001", "-0.033 -0.006 -0.002", true },
+ { "mHandRing1Right", "mHandRing1Left", HANDS, { "mHandRing2Right" }, "-0.099 0.009 -0.010", "", true },
+ { "mHandRing2Right", "mHandRing2Left", HANDS, { "mHandRing3Right" }, "-0.038 -0.008 -0.013", "", true },
+ { "mHandRing3Right", "mHandRing3Left", HANDS, {}, "-0.040 -0.009 -0.013", "-0.028 -0.006 -0.010", true },
+ { "mHandPinky1Right", "mHandPinky1Left", HANDS, { "mHandPinky2Right" }, "-0.095 0.003 -0.031", "", true },
+ { "mHandPinky2Right", "mHandPinky2Left", HANDS, { "mHandPinky3Right" }, "-0.025 -0.006 -0.024", "", true },
+ { "mHandPinky3Right", "mHandPinky3Left", HANDS, {}, "-0.018 -0.004 -0.015", "-0.016 -0.004 -0.013", true },
// tail and hind limbs
- { "mTail1", "", MISC },
- { "mTail2", "", MISC },
- { "mTail3", "", MISC },
- { "mTail4", "", MISC },
- { "mTail5", "", MISC },
- { "mTail6", "", MISC },
- { "mGroin", "", MISC },
- { "mHindLimbsRoot", "", MISC },
- { "mHindLimb1Left", "mHindLimb1Right", MISC },
- { "mHindLimb2Left", "mHindLimb2Right", MISC },
- { "mHindLimb3Left", "mHindLimb3Right", MISC },
- { "mHindLimb4Left", "mHindLimb4Right", MISC },
- { "mHindLimb1Right", "mHindLimb1Left", MISC, {}, "", true },
- { "mHindLimb2Right", "mHindLimb2Left", MISC, {}, "", true },
- { "mHindLimb3Right", "mHindLimb3Left", MISC, {}, "", true },
- { "mHindLimb4Right", "mHindLimb4Left", MISC, {}, "", true },
+ { "mTail1", "", MISC, { "mTail2" }, "0.000 0.047 -0.116" },
+ { "mTail2", "", MISC, { "mTail3" }, "0.000 0.000 -0.197" },
+ { "mTail3", "", MISC, { "mTail4" }, "0.000 0.000 -0.168" },
+ { "mTail4", "", MISC, { "mTail5" }, "0.000 0.000 -0.142" },
+ { "mTail5", "", MISC, { "mTail6" }, "0.000 0.000 -0.112" },
+ { "mTail6", "", MISC, {}, "0.000 0.000 -0.094", "0.000 0.000 -0.089" },
+ { "mGroin", "", MISC, {}, "0.000 -0.097 0.064", "0.000 -0.066 0.004" },
+ { "mHindLimbsRoot", "", MISC, { "mHindLimb1Left", "mHindLimb1Right" }, "0.000 0.084 -0.200" },
+ { "mHindLimb1Left", "mHindLimb1Right", MISC, { "mHindLimb2Left" }, "0.129 -0.125 -0.204" },
+ { "mHindLimb2Left", "mHindLimb2Right", MISC, { "mHindLimb3Left" }, "-0.046 -0.491 0.002" },
+ { "mHindLimb3Left", "mHindLimb3Right", MISC, { "mHindLimb4Left" }, "-0.003 -0.468 -0.030" },
+ { "mHindLimb4Left", "mHindLimb4Right", MISC, {}, "0.000 -0.061 0.112", "0.008 0.000 0.105" },
+ { "mHindLimb1Right", "mHindLimb1Left", MISC, { "mHindLimb2Right" }, "-0.129 -0.125 -0.204", "", true },
+ { "mHindLimb2Right", "mHindLimb2Left", MISC, { "mHindLimb3Right" }, "0.046 -0.491 0.002", "", true },
+ { "mHindLimb3Right", "mHindLimb3Left", MISC, { "mHindLimb4Right" }, "0.003 -0.468 -0.030", "", true },
+ { "mHindLimb4Right", "mHindLimb4Left", MISC, {}, "0.000 -0.061 0.112", "-0.008 0.000 0.105", true },
// wings
- { "mWingsRoot", "", MISC },
- { "mWing1Left", "mWing1Right", MISC },
- { "mWing2Left", "mWing2Right", MISC },
- { "mWing3Left", "mWing3Right", MISC },
- { "mWing4Left", "mWing4Right", MISC },
- { "mWing4FanLeft", "mWing4FanRight", MISC },
- { "mWing1Right", "mWing1Left", MISC, {}, "", true },
- { "mWing2Right", "mWing2Left", MISC, {}, "", true },
- { "mWing3Right", "mWing3Left", MISC, {}, "", true },
- { "mWing4Right", "mWing4Left", MISC, {}, "", true },
- { "mWing4FanRight", "mWing4FanLeft", MISC, {}, "", true },
+ { "mWingsRoot", "", MISC, { "mWing1Left", "mWing1Right" }, "0.000 0.000 -0.014" },
+ { "mWing1Left", "mWing1Right", MISC, { "mWing2Left" }, "0.105 0.181 -0.099" },
+ { "mWing2Left", "mWing2Right", MISC, { "mWing3Left" }, "0.169 0.067 -0.168" },
+ { "mWing3Left", "mWing3Right", MISC, { "mWing4Left", "mWing4FanLeft" }, "0.183 0.000 -0.181" },
+ { "mWing4Left", "mWing4Right", MISC, {}, "0.173 0.000 -0.171", "0.132 0.000 -0.146" },
+ { "mWing4FanLeft", "mWing4FanRight", MISC, {}, "0.173 0.000 -0.171", "0.062 -0.159 -0.068" },
+ { "mWing1Right", "mWing1Left", MISC, { "mWing2Right" }, "-0.105 0.181 -0.099", "", true },
+ { "mWing2Right", "mWing2Left", MISC, { "mWing3Right" }, "-0.169 0.067 -0.168", "", true },
+ { "mWing3Right", "mWing3Left", MISC, { "mWing4Right", "mWing4FanRight" }, "-0.183 0.000 -0.181", "", true },
+ { "mWing4Right", "mWing4Left", MISC, {}, "-0.173 0.000 -0.171", "-0.132 0.000 -0.146", true },
+ { "mWing4FanRight", "mWing4FanLeft", MISC, {}, "-0.173 0.000 -0.171", "-0.062 -0.159 -0.068", true },
// Collision Volumes
{ "LEFT_PEC", "RIGHT_PEC", COL_VOLUMES },
- { "RIGHT_PEC", "LEFT_PEC", COL_VOLUMES, {}, "", true },
+ { "RIGHT_PEC", "LEFT_PEC", COL_VOLUMES, {}, "", "", true },
{ "BELLY", "", COL_VOLUMES },
{ "BUTT", "", COL_VOLUMES },
};
diff --git a/indra/newview/skins/default/xui/en/floater_fs_poser.xml b/indra/newview/skins/default/xui/en/floater_fs_poser.xml
index 61db38b42a..3ec5684a08 100644
--- a/indra/newview/skins/default/xui/en/floater_fs_poser.xml
+++ b/indra/newview/skins/default/xui/en/floater_fs_poser.xml
@@ -38,6 +38,8 @@ width="403">
NEGATE_PITCH
NEGATE_PITCH NEGATE_ROLL
NEGATE_PITCH
+ SWAP_YAW_AND_ROLL NEGATE_PITCH
+ SWAP_YAW_AND_ROLL NEGATE_PITCH
SWAP_YAW_AND_ROLL NEGATE_PITCH
SWAP_YAW_AND_ROLL NEGATE_PITCH
SWAP_YAW_AND_ROLL NEGATE_PITCH
@@ -139,7 +141,8 @@ width="403">
Wings
Ears/Nose
-
+
+
Whole Avatar
Torso
Chest