-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 #This script builds a meshfact CS xml file from a basic cal3d cfg file import ConfigParser import os import sys import xml.etree.ElementTree as ET from collections import OrderedDict from StringIO import StringIO from xml.etree import ElementTree from xml.dom import minidom def prettify(elem): rough_string = ElementTree.tostring(elem, 'utf-8') reparsed = minidom.parseString(rough_string) return reparsed.toprettyxml(indent=" ") class MultiOrderedDict(OrderedDict): def __setitem__(self, key, value): if isinstance(value, list) and key in self: self[key].extend(value) else: super(OrderedDict, self).__setitem__(key, value) parser = ConfigParser.RawConfigParser(dict_type=MultiOrderedDict) mesh_file_path = str(sys.argv[1]) mesh_cfg_name = str(sys.argv[2]) mesh_scale_value = str(sys.argv[3]) file_loc = os.path.abspath(".")+'/'+mesh_file_path+'/'+mesh_cfg_name with open(file_loc) as stream: stream = StringIO("[top]\n" + stream.read()) parser.readfp(stream) calskel = parser.get('top','skeleton') calanim = parser.get('top','animation') calmesh = parser.get('top','mesh') #Initialize tree cs_xmltree = ET.ElementTree() #The root node of a cs Mesh Factory file cs_node_meshfact = ET.Element('meshfact') #We set plugin to crystalspace.mesh.loader.factory.sprite.cal3d to #signal for Cal3d as our "mesh engine" cs_node_plugin = ET.SubElement(cs_node_meshfact, 'plugin') cs_node_plugin.text = 'crystalspace.mesh.loader.factory.sprite.cal3d' #All mesh, skeleton, animation, and other data is held in this node cs_node_params = ET.SubElement(cs_node_meshfact, 'params') #Default Options cs_node_options = ET.SubElement(cs_node_params, 'options', {'rotate_x_axis':'yes', 'flip_textures':'no'}) #Set path directory to user given input from stdin cs_node_path = ET.SubElement(cs_node_params, 'path', {'dir':mesh_file_path+"/"}) #Set scale from command line parameter argv[3] cs_node_scale = ET.SubElement(cs_node_params, 'scale', {'value':mesh_scale_value}) #Skeleton data here. Only supports 1 skeleton cs_node_skeleton = ET.SubElement(cs_node_params, 'skeleton', {'file': str(calskel[0]).replace(".xsf",".csf")}) #Animation data here. Supports multiple animations. All set to same travel specs. #TODO add support for other animation types. E.G. "idle" #TODO allow user to set animation names cs_node_animations = [] int_i = 0 for ani in calanim: cs_node_animation = ET.SubElement(cs_node_params, 'animation', {'file':str(ani).replace(".xaf",".caf"), 'name':str('strut'+str(int_i)), 'type':'travel', 'base_vel':'2','min_vel':'0','max_vel':'3'} ) cs_node_animations.append(cs_node_animation) int_i += 1 #Default material; #TODO Some sort of material support cs_node_material = ET.SubElement(cs_node_params, 'material', {'file':'/lib/std/green.gif', 'name':'green'}) #Mesh data here. Supports multiple meshes. #TODO Material support in conjunction with above cs_node_meshes = [] int_i = 0 for mesh in calmesh: cs_node_mesh = ET.SubElement(cs_node_params,'mesh',{'file':str(mesh).replace(".xmf",".cmf"), 'name':os.path.splitext(str(mesh))[0], 'material':'green'}) cs_node_transform = ET.SubElement(cs_node_params,'hardtransform',{'rot_axis_x':'0','rot_axis_y':'1','rot_axis_z':'0','rot_angle':'180'}) output = prettify(cs_node_meshfact) print output #print cs_node_meshfact #ET.dump(cs_node_meshfact) with open("test.cal3d","wb") as fh: fh.write(output) -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQEcBAEBCgAGBQJYsb8tAAoJEA/ylD2heeFp2ZsIAJ/5EIAt/AsaU7TvVZJhj1x8 ATOqrU/9hh2P05W0YH/3ptgk7Pwx+jPUIYSrY/eqkUa+6+oowc1qGG4L/nTVZRRo dV1tzBy11Atzn9ehhw2+vNhs38bH9pgBU96NsPgb4srt5N4oO+TE/DuVh+EgvSEh ylXqV2GHH/ApBCr0QWw0pHZuc7sTuS/GOfH61qEMn3bEwhTGOdlrvS56zN/FSonE L1YYlaVgRPDUQqwDsXGS+wcKMB6eFKQD3CS4Z/+oFgOJxND+ySCMSSNNkVJpKv6k duKArmsIFkQIK47s0aAqvHc1asJUqqEsrShkwsXpTUYtGWWL+6X5G6Z9p/XxbHQ= =DN0B -----END PGP SIGNATURE-----