summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad Payne (Vir Linden) <vir@lindenlab.com>2016-03-25 10:28:30 -0400
committerBrad Payne (Vir Linden) <vir@lindenlab.com>2016-03-25 10:28:30 -0400
commit5574e3bbaa6f4b08030c07bc3fe973f2dcd8ac42 (patch)
tree89f93218e63766353828cf5a0237ad62d4c6e915
parente754cb348daa96690f1eb4914c3fe10c38df1582 (diff)
SL-353, SL-344 - basic avatar_lad validation in skel_tool.py script.
-rw-r--r--scripts/content_tools/skel_tool.py56
1 files changed, 48 insertions, 8 deletions
diff --git a/scripts/content_tools/skel_tool.py b/scripts/content_tools/skel_tool.py
index d46d6ca3f3..e5a7ce5f61 100644
--- a/scripts/content_tools/skel_tool.py
+++ b/scripts/content_tools/skel_tool.py
@@ -91,7 +91,7 @@ def get_element_by_name(tree,name):
else:
return None
-def list_tree(tree):
+def list_skel_tree(tree):
for element in tree.getroot().iter():
if element.tag == "bone":
print element.get("name"),"-",element.get("support")
@@ -155,8 +155,8 @@ def validate_child_order(tree, ogtree, fix=False):
# - corresponding right and left joints should be mirror symmetric.
# - childless elements should be in short form (<bone /> instead of <bone></bone>)
# - digits of precision should be consistent (again, except for old joints)
-def validate_tree(tree, ogtree, reftree, fix=False):
- print "validate_tree"
+def validate_skel_tree(tree, ogtree, reftree, fix=False):
+ print "validate_skel_tree"
(num_bones,num_cvs) = (0,0)
unfixable = 0
defaults = {"connected": "false",
@@ -227,6 +227,36 @@ def validate_tree(tree, ogtree, reftree, fix=False):
print "BAD FILE:", unfixable,"errs could not be fixed"
+# Check contents of avatar_lad file relative to a specified skeleton
+def validate_lad_tree(ladtree,skeltree):
+ print "validate_lad_tree"
+ bone_names = [elt.get("name") for elt in skeltree.iter("bone")]
+ bone_names.append("mScreen")
+ bone_names.append("mRoot")
+ cv_names = [elt.get("name") for elt in skeltree.iter("collision_volume")]
+ #print "bones\n ","\n ".join(sorted(bone_names))
+ #print "cvs\n ","\n ".join(sorted(cv_names))
+ for att in ladtree.iter("attachment_point"):
+ att_name = att.get("name")
+ #print "attachment",att_name
+ joint_name = att.get("joint")
+ if not joint_name in bone_names:
+ print "att",att_name,"linked to invalid joint",joint_name
+ for skel_param in ladtree.iter("param_skeleton"):
+ skel_param_id = skel_param.get("id")
+ skel_param_name = skel_param.get("name")
+ #if not skel_param_name and not skel_param_id:
+ # print "strange skel_param"
+ # print etree.tostring(skel_param)
+ # for k,v in skel_param.attrib.iteritems():
+ # print k,"->",v
+ #print "skel_param",skel_param_name
+ for bone in skel_param.iter("bone"):
+ bone_name = bone.get("name")
+ if not bone_name in bone_names:
+ print "skel param references invalid bone",bone_name
+ print etree.tostring(bone)
+
def remove_joint_by_name(tree, name):
print "remove joint:",name
elt = get_element_by_name(tree,name)
@@ -242,7 +272,7 @@ def remove_joint_by_name(tree, name):
print "parent now:",[e.get("name") for e in list(parent)]
elt = get_element_by_name(tree,name)
-def compare_trees(atree,btree):
+def compare_skel_trees(atree,btree):
diffs = {}
realdiffs = {}
a_missing = set()
@@ -297,6 +327,7 @@ if __name__ == "__main__":
parser = argparse.ArgumentParser(description="process SL animations")
parser.add_argument("--ogfile", help="specify file containing base bones")
parser.add_argument("--ref_file", help="specify another file containing replacements for missing fields")
+ parser.add_argument("--lad_file", help="specify avatar_lad file to check")
parser.add_argument("--aliases", help="specify file containing bone aliases")
parser.add_argument("--validate", action="store_true", help="check specified input file for validity")
parser.add_argument("--fix", action="store_true", help="try to correct errors")
@@ -314,30 +345,39 @@ if __name__ == "__main__":
altree = etree.parse(args.aliases)
aliases = get_aliases(altree)
+ # Parse input files
ogtree = None
reftree = None
+ ladtree = None
if args.ogfile:
ogtree = etree.parse(args.ogfile)
if args.ref_file:
reftree = etree.parse(args.ref_file)
+ if args.lad_file:
+ ladtree = etree.parse(args.lad_file)
+
if args.remove:
for name in args.remove:
remove_joint_by_name(tree,name)
+ # Do processing
if args.validate and ogtree:
- validate_tree(tree, ogtree, reftree)
+ validate_skel_tree(tree, ogtree, reftree)
+
+ if args.validate and ladtree:
+ validate_lad_tree(ladtree, tree)
if args.fix and ogtree:
- validate_tree(tree, ogtree, reftree, True)
+ validate_skel_tree(tree, ogtree, reftree, True)
if args.list and tree:
- list_tree(tree)
+ list_skel_tree(tree)
if args.compare and tree:
compare_tree = etree.parse(args.compare)
- compare_trees(compare_tree,tree)
+ compare_skel_trees(compare_tree,tree)
if args.outfilename:
f = open(args.outfilename,"w")