From 184a5fd82be3a4969ac6547367d1aad458129461 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Mon, 9 May 2016 10:25:30 -0400
Subject: SL-315 - resetSkeleton() work, dae_tool.py can add random joint
 positions to models

---
 indra/newview/llvoavatar.cpp      | 37 +++++++++++++++++++++++++++++++++++++
 indra/newview/llvoavatar.h        |  1 +
 scripts/content_tools/dae_tool.py | 28 ++++++++++++++++++++++++++++
 3 files changed, 66 insertions(+)

diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 979bf96151..22df9c43d7 100755
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -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
 //-----------------------------------------------------------------------------
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index c6bc2fd58f..0a3965a597 100755
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -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;
 	
diff --git a/scripts/content_tools/dae_tool.py b/scripts/content_tools/dae_tool.py
index 8ac6c7582f..823f69cb85 100644
--- a/scripts/content_tools/dae_tool.py
+++ b/scripts/content_tools/dae_tool.py
@@ -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")
-- 
cgit v1.2.3