SL-315 - resetSkeleton() work, dae_tool.py can add random joint positions to models

master
Brad Payne (Vir Linden) 2016-05-09 10:25:30 -04:00
parent d69c01ba80
commit 184a5fd82b
3 changed files with 66 additions and 0 deletions

View File

@ -1811,6 +1811,7 @@ void LLVOAvatar::resetSkeleton()
// Stop all animations
// Clear all attachment pos overrides
clearAttachmentPosOverrides();
// Preserve state of tweakable params
@ -1841,6 +1842,7 @@ void LLVOAvatar::resetSkeleton()
#endif
// Restore attachment pos overrides
rebuildAttachmentPosOverrides();
// Restart animations
}
@ -5328,8 +5330,43 @@ void LLVOAvatar::clearAttachmentPosOverrides()
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
//-----------------------------------------------------------------------------

View File

@ -206,6 +206,7 @@ public:
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;

View File

@ -27,6 +27,7 @@ $/LicenseInfo$
"""
import argparse
import random
# Need to pip install numpy and pycollada
import numpy as np
@ -59,12 +60,35 @@ def mesh_lock_offsets(tree, joints):
print joint_node.get("name"),matrix_node.tag,"text",matrix_node.text,len(floats),floats
def mesh_random_offsets(tree, joints):
print "mesh_random_offsets",tree,joints
for joint_node in tree.iter():
if "node" not in joint_node.tag:
continue
if joint_node.get("type") != "JOINT":
continue
if not joint_node.get("name"):
continue
if joint_node.get("name") in joints or "bone" in joints:
for matrix_node in list(joint_node):
if "matrix" in matrix_node.tag:
floats = [float(x) for x in matrix_node.text.split()]
print "randomizing",floats
if len(floats) == 16:
floats[3] += random.uniform(-1.0,1.0)
floats[7] += random.uniform(-1.0,1.0)
floats[11] += random.uniform(-1.0,1.0)
matrix_node.text = " ".join([str(f) for f in floats])
print joint_node.get("name"),matrix_node.tag,"text",matrix_node.text,len(floats),floats
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="process SL animations")
parser.add_argument("--verbose", action="store_true",help="verbose flag")
parser.add_argument("infilename", help="name of a collada (dae) file to input")
parser.add_argument("outfilename", nargs="?", help="name of a collada (dae) file to output", default = None)
parser.add_argument("--lock_offsets", nargs="+", help="tweak position of listed joints to lock their offsets")
parser.add_argument("--random_offsets", nargs="+", help="random offset position for listed joints")
parser.add_argument("--summary", action="store_true", help="print summary info about input file")
args = parser.parse_args()
@ -84,6 +108,10 @@ if __name__ == "__main__":
print "locking offsets for",args.lock_offsets
mesh_lock_offsets(tree, args.lock_offsets)
if args.random_offsets:
print "adding random offsets for",args.random_offsets
mesh_random_offsets(tree, args.random_offsets)
if args.outfilename:
print "writing",args.outfilename
f = open(args.outfilename,"w")