From 108f7a74b973a11b42aed2a64e2e09f9151a7e00 Mon Sep 17 00:00:00 2001 From: Bastien Montagne <montagne29@wanadoo.fr> Date: Fri, 28 Dec 2012 10:06:57 +0000 Subject: [PATCH] Updated to use UI_UL_list as template_list (also a bunch of style cleanup, still some work to do here!). --- io_export_unreal_psk_psa.py | 77 ++-- io_import_scene_unreal_psa_psk.py | 739 +++++++++++++++--------------- 2 files changed, 426 insertions(+), 390 deletions(-) diff --git a/io_export_unreal_psk_psa.py b/io_export_unreal_psk_psa.py index c619d6a43..e5340a58f 100644 --- a/io_export_unreal_psk_psa.py +++ b/io_export_unreal_psk_psa.py @@ -1966,6 +1966,29 @@ bpy.types.Scene.udk_option_scale = FloatProperty( #=========================================================================== # User interface #=========================================================================== +class EXPORT_UL_UDKlists(bpy.types.UIList): + def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): + if not isinstance(item, (bpy.types.UDKActionSetListPG, bpy.types.UDKObjListPG, bpy.types.UDKMeshListPG, + bpy.types.UDKArmListPG)): + return + if self.layout_type in {'DEFAULT', 'COMPACT'}: + layout.label(item.name, icon_value=icon) + if isinstance(item, bpy.types.UDKActionSetListPG): + layout.prop(item, "bmatch", text="") + layout.prop(item, "bexport", text="") + if isinstance(item, bpy.types.UDKObjListPG): + layout.prop(item, "otype", text="") + layout.prop(item, "bselect", text="") + if isinstance(item, bpy.types.UDKMeshListPG): + layout.prop(item, "bselect", text="") + layout.prop(item, "bexport", text="") + if isinstance(item, bpy.types.UDKArmListPG): + pass # Nothing special here for now... + elif self.layout_type in {'GRID'}: + layout.alignment = 'CENTER' + layout.label("", icon_value=icon) + + class OBJECT_OT_UTSelectedFaceSmooth(bpy.types.Operator): bl_idname = "object.utselectfacesmooth" # XXX, name??? bl_label = "Select Smooth Faces"#"Select Smooth faces" @@ -2202,48 +2225,44 @@ class OBJECT_OT_UTRebuildArmature(bpy.types.Operator): return{'FINISHED'} class UDKActionSetListPG(bpy.types.PropertyGroup): - bool = BoolProperty(default=False) - string = StringProperty() - actionname = StringProperty() - bmatch = BoolProperty(default=False,name="Match", options={"HIDDEN"},description = "This check against bone names and action group names matches and override boolean if true.") - bexport = BoolProperty(default=False,name="Export",description = "Check this to export the animation") - template_list_controls = StringProperty(default="bmatch:bexport", options={"HIDDEN"}) +# boolean = BoolProperty(default=False) + string = StringProperty() + actionname = StringProperty() + bmatch = BoolProperty(default=False,name="Match", options={"HIDDEN"},description = "This check against bone names and action group names matches and override boolean if true.") + bexport = BoolProperty(default=False,name="Export",description = "Check this to export the animation") bpy.utils.register_class(UDKActionSetListPG) bpy.types.Scene.udkas_list = CollectionProperty(type=UDKActionSetListPG) bpy.types.Scene.udkas_list_idx = IntProperty() class UDKObjListPG(bpy.types.PropertyGroup): - bool = BoolProperty(default=False) - string = StringProperty() - bexport = BoolProperty(default=False,name="Export", options={"HIDDEN"},description = "This will be ignore when exported") - bselect = BoolProperty(default=False,name="Select", options={"HIDDEN"},description = "This will be ignore when exported") - otype = StringProperty(name="Type",description = "This will be ignore when exported") - template_list_controls = StringProperty(default="otype:bselect", options={"HIDDEN"}) +# boolean = BoolProperty(default=False) + string = StringProperty() + bexport = BoolProperty(default=False,name="Export", options={"HIDDEN"},description = "This will be ignore when exported") + bselect = BoolProperty(default=False,name="Select", options={"HIDDEN"},description = "This will be ignore when exported") + otype = StringProperty(name="Type",description = "This will be ignore when exported") bpy.utils.register_class(UDKObjListPG) bpy.types.Scene.udkobj_list = CollectionProperty(type=UDKObjListPG) bpy.types.Scene.udkobj_list_idx = IntProperty() class UDKMeshListPG(bpy.types.PropertyGroup): - bool = BoolProperty(default=False) - string = StringProperty() - bexport = BoolProperty(default=False,name="Export", options={"HIDDEN"},description = "This object will be export when true.") - bselect = BoolProperty(default=False,name="Select", options={"HIDDEN"},description = "Make sure you have Mesh is parent to Armature.") - otype = StringProperty(name="Type",description = "This will be ignore when exported") - template_list_controls = StringProperty(default="bselect:bexport", options={"HIDDEN"}) +# boolean = BoolProperty(default=False) + string = StringProperty() + bexport = BoolProperty(default=False,name="Export", options={"HIDDEN"},description = "This object will be export when true.") + bselect = BoolProperty(default=False,name="Select", options={"HIDDEN"},description = "Make sure you have Mesh is parent to Armature.") + otype = StringProperty(name="Type",description = "This will be ignore when exported") bpy.utils.register_class(UDKMeshListPG) bpy.types.Scene.udkmesh_list = CollectionProperty(type=UDKMeshListPG) bpy.types.Scene.udkmesh_list_idx = IntProperty() class UDKArmListPG(bpy.types.PropertyGroup): - bool = BoolProperty(default=False) - string = StringProperty() - bexport = BoolProperty(default=False,name="Export", options={"HIDDEN"},description = "This will be ignore when exported") - bselect = BoolProperty(default=False,name="Select", options={"HIDDEN"},description = "This will be ignore when exported") - otype = StringProperty(name="Type",description = "This will be ignore when exported") - template_list_controls = StringProperty(default="", options={"HIDDEN"}) + boolean = BoolProperty(default=False) + string = StringProperty() + bexport = BoolProperty(default=False,name="Export", options={"HIDDEN"},description = "This will be ignore when exported") + bselect = BoolProperty(default=False,name="Select", options={"HIDDEN"},description = "This will be ignore when exported") + otype = StringProperty(name="Type",description = "This will be ignore when exported") bpy.utils.register_class(UDKArmListPG) bpy.types.Scene.udkArm_list = CollectionProperty(type=UDKArmListPG) @@ -2294,14 +2313,17 @@ class Panel_UDKExport( bpy.types.Panel ): if context.scene.udk_option_selectobjects: layout.operator("object.selobjectpdate") layout.label(text="ARMATURE") - layout.template_list(context.scene, "udkArm_list", context.scene, "udkArm_list_idx",prop_list="template_list_controls", rows=3) + layout.template_list("EXPORT_UL_UDKlists", "", context.scene, "udkArm_list", + context.scene, "udkArm_list_idx", rows=3) layout.label(text="MESH") - layout.template_list(context.scene, "udkmesh_list", context.scene, "udkmesh_list_idx",prop_list="template_list_controls", rows=5) + layout.template_list("EXPORT_UL_UDKlists", "", context.scene, "udkmesh_list", + context.scene, "udkmesh_list_idx", rows=5) layout.prop(context.scene, "udk_option_selectanimations") if context.scene.udk_option_selectanimations: layout.operator("action.setanimupdate") layout.label(text="Action Set(s)") - layout.template_list(context.scene, "udkas_list", context.scene, "udkas_list_idx",prop_list="template_list_controls", rows=5) + layout.template_list("EXPORT_UL_UDKlists", "", context.scene, "udkas_list", + context.scene, "udkas_list_idx", rows=5) test = layout.separator() layout.prop(context.scene, "udk_option_scale") layout.prop(context.scene, "udk_option_rebuildobjects") @@ -2531,7 +2553,6 @@ class OBJECT_OT_ActionSetAnimUpdate(bpy.types.Operator): my_item = my_sett.add() #print(dir(my_item.bmatch)) my_item.name = action.name - my_item.template_list_controls = "bmatch:bexport" if len(bones) == len(action.groups) == count: my_item.bmatch = True else: diff --git a/io_import_scene_unreal_psa_psk.py b/io_import_scene_unreal_psa_psk.py index 408e1fb15..6825511d1 100644 --- a/io_import_scene_unreal_psa_psk.py +++ b/io_import_scene_unreal_psa_psk.py @@ -47,6 +47,7 @@ Imports a *psk file to a new mesh import bpy import mathutils import math +# XXX Yuck! 'from foo import *' is really bad! from mathutils import * from math import * from bpy.props import * @@ -58,7 +59,8 @@ from bpy.props import * bpy.types.Scene.unrealbonesize = FloatProperty( name="Bone Length", description="Bone Length from head to tail distance", - default=1,min=0.001,max=1000) + default=1, min=0.001, max=1000 +) #output log in to txt file DEBUGLOG = False @@ -68,33 +70,35 @@ bonesize = 1.0 from bpy_extras.io_utils import unpack_list, unpack_face_list class md5_bone: - bone_index=0 - name="" - bindpos=[] - bindmat=[] - origmat=[] - head=[] - tail=[] + bone_index = 0 + name = "" + bindpos = [] + bindmat = [] + origmat = [] + head = [] + tail = [] scale = [] - parent="" - parent_index=0 - blenderbone=None - roll=0 + parent = "" + parent_index = 0 + blenderbone = None + roll = 0 def __init__(self): - self.bone_index=0 - self.name="" - self.bindpos=[0.0]*3 - self.scale=[0.0]*3 - self.head=[0.0]*3 - self.tail=[0.0]*3 - self.bindmat=[None]*3 #is this how you initilize a 2d-array - for i in range(3): self.bindmat[i] = [0.0]*3 - self.origmat=[None]*3 #is this how you initilize a 2d-array - for i in range(3): self.origmat[i] = [0.0]*3 - self.parent="" - self.parent_index=0 - self.blenderbone=None + self.bone_index = 0 + self.name = "" + self.bindpos = [0.0] * 3 + self.scale = [0.0] * 3 + self.head = [0.0] * 3 + self.tail = [0.0] * 3 + self.bindmat = [None] * 3 # is this how you initilize a 2d-array + for i in range(3): + self.bindmat[i] = [0.0] * 3 + self.origmat = [None] * 3 #is this how you initilize a 2d-array + for i in range(3): + self.origmat[i] = [0.0] * 3 + self.parent = "" + self.parent_index = 0 + self.blenderbone = None def dump(self): print ("bone index: ", self.bone_index) @@ -104,28 +108,28 @@ class md5_bone: print ("parent: ", self.parent) print ("parent index: ", self.parent_index) print ("blenderbone: ", self.blenderbone) - + def getheadpos(pbone,bones): - pos_head = [0.0]*3 + pos_head = [0.0] * 3 #pos = mathutils.Vector((x,y,z)) * pbone.origmat pos = pbone.bindmat.to_translation() - + """ tmp_bone = pbone while tmp_bone.name != tmp_bone.parent.name: pos = pos * tmp_bone.parent.bindmat tmp_bone = tmp_bone.parent """ - + pos_head[0] = pos.x pos_head[1] = pos.y pos_head[2] = pos.z - + return pos_head - + def gettailpos(pbone,bones): - pos_tail = [0.0]*3 + pos_tail = [0.0] * 3 ischildfound = False childbone = None childbonelist = [] @@ -136,7 +140,7 @@ def gettailpos(pbone,bones): childbonelist.append(bone) if ischildfound: - tmp_head = [0.0]*3 + tmp_head = [0.0] * 3 for bone in childbonelist: tmp_head[0] += bone.head[0] tmp_head[1] += bone.head[1] @@ -147,15 +151,14 @@ def gettailpos(pbone,bones): return tmp_head else: tmp_len = 0.0 - tmp_len += (pbone.head[0] - pbone.parent.head[0])**2 - tmp_len += (pbone.head[1] - pbone.parent.head[1])**2 - tmp_len += (pbone.head[2] - pbone.parent.head[2])**2 - tmp_len = tmp_len**0.5 * 0.5 + tmp_len += (pbone.head[0] - pbone.parent.head[0]) ** 2 + tmp_len += (pbone.head[1] - pbone.parent.head[1]) ** 2 + tmp_len += (pbone.head[2] - pbone.parent.head[2]) ** 2 + tmp_len = tmp_len ** 0.5 * 0.5 pos_tail[0] = pbone.head[0] + tmp_len * pbone.bindmat[0][0] pos_tail[1] = pbone.head[1] + tmp_len * pbone.bindmat[1][0] pos_tail[2] = pbone.head[2] + tmp_len * pbone.bindmat[2][0] - return pos_tail def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): @@ -166,72 +169,72 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): print ("--------------------------------------------------") print (" DEBUG Log:",bDebugLogPSK) print ("Importing file: ", infile) - + pskfile = open(infile,'rb') if (DEBUGLOG): logpath = infile.replace(".psk", ".txt") print("logpath:",logpath) logf = open(logpath,'w') - + def printlog(strdata): if (DEBUGLOG): logf.write(strdata) - + objName = infile.split('\\')[-1].split('.')[0] - + me_ob = bpy.data.meshes.new(objName) print("objName:",objName) printlog(("New Mesh = " + me_ob.name + "\n")) #read general header - indata = unpack('20s3i',pskfile.read(32)) + indata = unpack('20s3i', pskfile.read(32)) #not using the general header at this time #================================================================================================== # vertex point #================================================================================================== #read the PNTS0000 header - indata = unpack('20s3i',pskfile.read(32)) + indata = unpack('20s3i', pskfile.read(32)) recCount = indata[3] - printlog(( "Nbr of PNTS0000 records: " + str(recCount) + "\n")) + printlog(("Nbr of PNTS0000 records: " + str(recCount) + "\n")) counter = 0 verts = [] verts2 = [] while counter < recCount: counter = counter + 1 - indata = unpack('3f',pskfile.read(12)) - #print(indata[0],indata[1],indata[2]) - verts.extend([(indata[0],indata[1],indata[2])]) - verts2.extend([(indata[0],indata[1],indata[2])]) - #print([(indata[0],indata[1],indata[2])]) - printlog(str(indata[0]) + "|" +str(indata[1]) + "|" +str(indata[2]) + "\n") - #Tmsh.vertices.append(NMesh.Vert(indata[0],indata[1],indata[2])) - + indata = unpack('3f', pskfile.read(12)) + #print(indata[0], indata[1], indata[2]) + verts.extend([(indata[0], indata[1], indata[2])]) + verts2.extend([(indata[0], indata[1], indata[2])]) + #print([(indata[0], indata[1], indata[2])]) + printlog(str(indata[0]) + "|" + str(indata[1]) + "|" + str(indata[2]) + "\n") + #Tmsh.vertices.append(NMesh.Vert(indata[0], indata[1], indata[2])) + #================================================================================================== # UV #================================================================================================== #read the VTXW0000 header - indata = unpack('20s3i',pskfile.read(32)) + indata = unpack('20s3i', pskfile.read(32)) recCount = indata[3] - printlog( "Nbr of VTXW0000 records: " + str(recCount)+ "\n") + printlog("Nbr of VTXW0000 records: " + str(recCount)+ "\n") counter = 0 UVCoords = [] #UVCoords record format = [index to PNTS, U coord, v coord] printlog("[index to PNTS, U coord, v coord]\n"); while counter < recCount: counter = counter + 1 - indata = unpack('hhffhh',pskfile.read(16)) - UVCoords.append([indata[0],indata[2],indata[3]]) - printlog(str(indata[0]) + "|" +str(indata[2]) + "|" +str(indata[3])+"\n") - #print('mat index %i',indata(4)) - #print([indata[0],indata[2],indata[3]]) - #print([indata[1],indata[2],indata[3]]) - + indata = unpack('hhffhh', pskfile.read(16)) + UVCoords.append([indata[0], indata[2], indata[3]]) + printlog(str(indata[0]) + "|" + str(indata[2]) + "|" + str(indata[3]) + "\n") + #print('mat index %i', indata(4)) + #print([indata[0], indata[2], indata[3]]) + #print([indata[1], indata[2], indata[3]]) + #================================================================================================== # Face #================================================================================================== #read the FACE0000 header - indata = unpack('20s3i',pskfile.read(32)) + indata = unpack('20s3i', pskfile.read(32)) recCount = indata[3] - printlog( "Nbr of FACE0000 records: "+ str(recCount) + "\n") + printlog("Nbr of FACE0000 records: " + str(recCount) + "\n") #PSK FACE0000 fields: WdgIdx1|WdgIdx2|WdgIdx3|MatIdx|AuxMatIdx|SmthGrp #associate MatIdx to an image, associate SmthGrp to a material SGlist = [] @@ -243,54 +246,55 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): printlog("nWdgIdx1|WdgIdx2|WdgIdx3|MatIdx|AuxMatIdx|SmthGrp \n") while counter < recCount: counter = counter + 1 - indata = unpack('hhhbbi',pskfile.read(12)) - printlog(str(indata[0]) + "|" +str(indata[1]) + "|" +str(indata[2])+ "|" +str(indata[3])+ "|" +str(indata[4])+ "|" +str(indata[5]) + "\n") + indata = unpack('hhhbbi', pskfile.read(12)) + printlog(str(indata[0]) + "|" + str(indata[1]) + "|" + str(indata[2]) + "|" + str(indata[3]) + "|" + + str(indata[4]) + "|" + str(indata[5]) + "\n") #indata[0] = index of UVCoords #UVCoords[indata[0]]=[index to PNTS, U coord, v coord] #UVCoords[indata[0]][0] = index to PNTS PNTSA = UVCoords[indata[2]][0] PNTSB = UVCoords[indata[1]][0] PNTSC = UVCoords[indata[0]][0] - #print(PNTSA,PNTSB,PNTSC) #face id vertex - #faces.extend([0,1,2,0]) - faces.extend([(PNTSA,PNTSB,PNTSC,0)]) + #print(PNTSA, PNTSB, PNTSC) #face id vertex + #faces.extend([0, 1, 2, 0]) + faces.extend([(PNTSA, PNTSB, PNTSC, 0)]) uv = [] u0 = UVCoords[indata[2]][1] v0 = UVCoords[indata[2]][2] - uv.append([u0,1.0 - v0]) + uv.append([u0, 1.0 - v0]) u1 = UVCoords[indata[1]][1] v1 = UVCoords[indata[1]][2] - uv.append([u1,1.0 - v1]) + uv.append([u1, 1.0 - v1]) u2 = UVCoords[indata[0]][1] v2 = UVCoords[indata[0]][2] - uv.append([u2,1.0 - v2]) - faceuv.append([uv,indata[3],indata[4],indata[5]]) - - #print("material:",indata[3]) - #print("UV: ",u0,v0) + uv.append([u2, 1.0 - v2]) + faceuv.append([uv, indata[3], indata[4], indata[5]]) + + #print("material:", indata[3]) + #print("UV: ", u0, v0) #update the uv var of the last item in the Tmsh.faces list # which is the face just added above - ##Tmsh.faces[-1].uv = [(u0,v0),(u1,v1),(u2,v2)] + ##Tmsh.faces[-1].uv = [(u0, v0), (u1, v1), (u2, v2)] #print("smooth:",indata[5]) #collect a list of the smoothing groups facesmooth.append(indata[5]) #print(indata[5]) if SGlist.count(indata[5]) == 0: SGlist.append(indata[5]) - print("smooth:",indata[5]) + print("smooth:", indata[5]) #assign a material index to the face #Tmsh.faces[-1].materialIndex = SGlist.index(indata[5]) - printlog( "Using Materials to represent PSK Smoothing Groups...\n") + printlog("Using Materials to represent PSK Smoothing Groups...\n") #========== # skip something... #========== - + #================================================================================================== # Material #================================================================================================== ## #read the MATT0000 header - indata = unpack('20s3i',pskfile.read(32)) + indata = unpack('20s3i', pskfile.read(32)) recCount = indata[3] printlog("Nbr of MATT0000 records: " + str(recCount) + "\n" ) printlog(" - Not importing any material data now. PSKs are texture wrapped! \n") @@ -298,25 +302,24 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): materialcount = 0 while counter < recCount: counter = counter + 1 - indata = unpack('64s6i',pskfile.read(88)) + indata = unpack('64s6i', pskfile.read(88)) materialcount += 1 - print("Material",counter) - print("Mat name %s",indata[0]) + print("Material", counter) + print("Mat name %s", indata[0]) ## - #================================================================================================== # Bones (Armature) #================================================================================================== #read the REFSKEL0 header - indata = unpack('20s3i',pskfile.read(32)) + indata = unpack('20s3i', pskfile.read(32)) recCount = indata[3] printlog( "Nbr of REFSKEL0 records: " + str(recCount) + "\n") #REFSKEL0 fields - Name|Flgs|NumChld|PrntIdx|Qw|Qx|Qy|Qz|LocX|LocY|LocZ|Lngth|XSize|YSize|ZSize - + Bns = [] bone = [] - + md5_bones = [] bni_dict = {} #================================================================================================== @@ -326,11 +329,11 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): print ("---PRASE--BONES---") printlog("Name|Flgs|NumChld|PrntIdx|Qx|Qy|Qz|Qw|LocX|LocY|LocZ|Lngth|XSize|YSize|ZSize\n") while counter < recCount: - indata = unpack('64s3i11f',pskfile.read(120)) + indata = unpack('64s3i11f', pskfile.read(120)) #print( "DATA",str(indata)) - + bone.append(indata) - + createbone = md5_bone() #temp_name = indata[0][:30] temp_name = indata[0] @@ -339,7 +342,10 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): temp_name = temp_name.rstrip(" ") temp_name = temp_name.strip() temp_name = temp_name.strip( bytes.decode(b'\x00')) - printlog(temp_name + "|" +str(indata[1]) + "|" +str(indata[2])+ "|" +str(indata[3])+ "|" +str(indata[4])+ "|" +str(indata[5]) + "|" +str(indata[6]) + "|" +str(indata[7]) + "|" +str(indata[8])+ "|" +str(indata[9])+ "|" +str(indata[10])+ "|" +str(indata[11]) + "|" +str(indata[12]) + "|" +str(indata[13]) + "|" +str(indata[14])+ "\n") + printlog(temp_name + "|" + str(indata[1]) + "|" + str(indata[2]) + "|" + str(indata[3]) + "|" + + str(indata[4]) + "|" + str(indata[5]) + "|" + str(indata[6]) + "|" + str(indata[7]) + "|" + + str(indata[8]) + "|" + str(indata[9]) + "|" + str(indata[10]) + "|" + str(indata[11]) + "|" + + str(indata[12]) + "|" + str(indata[13]) + "|" + str(indata[14]) + "\n") createbone.name = temp_name createbone.bone_index = counter createbone.parent_index = indata[3] @@ -349,42 +355,42 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): createbone.scale[0] = indata[12] createbone.scale[1] = indata[13] createbone.scale[2] = indata[14] - + bni_dict[createbone.name] = createbone.bone_index - + #w,x,y,z if (counter == 0):#main parent - createbone.bindmat = mathutils.Quaternion((indata[7],-indata[4],-indata[5],-indata[6])).to_matrix() - createbone.origmat = mathutils.Quaternion((indata[7],-indata[4],-indata[5],-indata[6])).to_matrix() + createbone.bindmat = mathutils.Quaternion((indata[7], -indata[4], -indata[5], -indata[6])).to_matrix() + createbone.origmat = mathutils.Quaternion((indata[7], -indata[4], -indata[5], -indata[6])).to_matrix() else: - createbone.bindmat = mathutils.Quaternion((indata[7],-indata[4],-indata[5],-indata[6])).to_matrix() - createbone.origmat = mathutils.Quaternion((indata[7],-indata[4],-indata[5],-indata[6])).to_matrix() + createbone.bindmat = mathutils.Quaternion((indata[7], -indata[4], -indata[5], -indata[6])).to_matrix() + createbone.origmat = mathutils.Quaternion((indata[7], -indata[4], -indata[5], -indata[6])).to_matrix() - createbone.bindmat = mathutils.Matrix.Translation(mathutils.Vector((indata[8],indata[9],indata[10]))) * createbone.bindmat.to_4x4() + createbone.bindmat = mathutils.Matrix.Translation(mathutils.Vector((indata[8], indata[9], indata[10]))) * \ + createbone.bindmat.to_4x4() - md5_bones.append(createbone) counter = counter + 1 bnstr = (str(indata[0])) Bns.append(bnstr) - + for pbone in md5_bones: - pbone.parent = md5_bones[pbone.parent_index] + pbone.parent = md5_bones[pbone.parent_index] for pbone in md5_bones: if pbone.name != pbone.parent.name: - pbone.bindmat = pbone.parent.bindmat * pbone.bindmat + pbone.bindmat = pbone.parent.bindmat * pbone.bindmat #print(pbone.name) #print(pbone.bindmat) #print("end") else: pbone.bindmat = pbone.bindmat - + for pbone in md5_bones: - pbone.head = getheadpos(pbone,md5_bones) - + pbone.head = getheadpos(pbone, md5_bones) + for pbone in md5_bones: - pbone.tail = gettailpos(pbone,md5_bones) + pbone.tail = gettailpos(pbone, md5_bones) for pbone in md5_bones: pbone.parent = md5_bones[pbone.parent_index].name @@ -392,15 +398,15 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): bonecount = 0 for armbone in bone: temp_name = armbone[0][:30] - #print ("BONE NAME: ",len(temp_name)) + #print ("BONE NAME: ", len(temp_name)) temp_name=str((temp_name)) #temp_name = temp_name[1] - #print ("BONE NAME: ",temp_name) - bonecount +=1 + #print ("BONE NAME: ", temp_name) + bonecount += 1 print ("-------------------------") print ("----Creating--Armature---") print ("-------------------------") - + #================================================================================================ #Check armature if exist if so create or update or remove all and addnew bone #================================================================================================ @@ -419,7 +425,8 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): #ob_new.data = armdata bpy.context.scene.objects.link(ob_new) #bpy.ops.object.mode_set(mode='OBJECT') - for i in bpy.context.scene.objects: i.select = False #deselect all objects + for i in bpy.context.scene.objects: + i.select = False #deselect all objects ob_new.select = True #set current armature to edit the bone bpy.context.scene.objects.active = ob_new @@ -436,7 +443,7 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): bpy.ops.object.mode_set(mode='EDIT')#Go to edit mode for the bones newbone = ob_new.data.edit_bones.new(bone.name) #parent the bone - #print("DRI:",dir(newbone)) + #print("DRI:", dir(newbone)) parentbone = None #note bone location is set in the real space or global not local bonesize = bpy.types.Scene.unrealbonesize @@ -444,7 +451,7 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): pos_x = bone.bindpos[0] pos_y = bone.bindpos[1] pos_z = bone.bindpos[2] - #print( "LINKING:" , bone.parent ,"j") + #print("LINKING:" , bone.parent ,"j") parentbone = ob_new.data.edit_bones[bone.parent] newbone.parent = parentbone rotmatrix = bone.bindmat @@ -480,53 +487,59 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): newbone.roll = math.radians(-90.0) """ bpy.context.scene.update() - + #================================================================================================== #END BONE DATA BUILD #================================================================================================== VtxCol = [] for x in range(len(Bns)): #change the overall darkness of each material in a range between 0.1 and 0.9 - tmpVal = ((float(x)+1.0)/(len(Bns))*0.7)+0.1 + tmpVal = ((float(x) + 1.0) / (len(Bns)) * 0.7) + 0.1 tmpVal = int(tmpVal * 256) - tmpCol = [tmpVal,tmpVal,tmpVal,0] + tmpCol = [tmpVal, tmpVal, tmpVal, 0] #Change the color of each material slightly if x % 3 == 0: - if tmpCol[0] < 128: tmpCol[0] += 60 - else: tmpCol[0] -= 60 + if tmpCol[0] < 128: + tmpCol[0] += 60 + else: + tmpCol[0] -= 60 if x % 3 == 1: - if tmpCol[1] < 128: tmpCol[1] += 60 - else: tmpCol[1] -= 60 + if tmpCol[1] < 128: + tmpCol[1] += 60 + else: + tmpCol[1] -= 60 if x % 3 == 2: - if tmpCol[2] < 128: tmpCol[2] += 60 - else: tmpCol[2] -= 60 + if tmpCol[2] < 128: + tmpCol[2] += 60 + else: + tmpCol[2] -= 60 #Add the material to the mesh VtxCol.append(tmpCol) - + #================================================================================================== # Bone Weight #================================================================================================== #read the RAWW0000 header - indata = unpack('20s3i',pskfile.read(32)) + indata = unpack('20s3i', pskfile.read(32)) recCount = indata[3] - printlog( "Nbr of RAWW0000 records: " + str(recCount) +"\n") + printlog("Nbr of RAWW0000 records: " + str(recCount) +"\n") #RAWW0000 fields: Weight|PntIdx|BoneIdx RWghts = [] counter = 0 while counter < recCount: counter = counter + 1 - indata = unpack('fii',pskfile.read(12)) - RWghts.append([indata[1],indata[2],indata[0]]) - #print("weight:",[indata[1],indata[2],indata[0]]) + indata = unpack('fii', pskfile.read(12)) + RWghts.append([indata[1], indata[2], indata[0]]) + #print("weight:", [indata[1], indata[2], indata[0]]) #RWghts fields = PntIdx|BoneIdx|Weight RWghts.sort() - printlog( "Vertex point and groups count =" + str(len(RWghts)) + "\n") + printlog("Vertex point and groups count =" + str(len(RWghts)) + "\n") printlog("PntIdx|BoneIdx|Weight") for vg in RWghts: - printlog( str(vg[0]) + "|" + str(vg[1]) + "|" + str(vg[2]) + "\n") - + printlog(str(vg[0]) + "|" + str(vg[1]) + "|" + str(vg[2]) + "\n") + #Tmsh.update_tag() - + #set the Vertex Colors of the faces #face.v[n] = RWghts[0] #RWghts[1] = index of VtxCol @@ -540,37 +553,36 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): n = n + 1 TmpCol = VtxCol[RWghts[n][1]] #check if a vertex has more than one influence - if n != len(RWghts)-1: - if RWghts[n][0] == RWghts[n+1][0]: + if n != len(RWghts) - 1: + if RWghts[n][0] == RWghts[n + 1][0]: #if there is more than one influence, use the one with the greater influence #for simplicity only 2 influences are checked, 2nd and 3rd influences are usually very small - if RWghts[n][2] < RWghts[n+1][2]: - TmpCol = VtxCol[RWghts[n+1][1]] - Tmsh.faces[x].col.append(NMesh.Col(TmpCol[0],TmpCol[1],TmpCol[2],0)) + if RWghts[n][2] < RWghts[n + 1][2]: + TmpCol = VtxCol[RWghts[n + 1][1]] + Tmsh.faces[x].col.append(NMesh.Col(TmpCol[0], TmpCol[1], TmpCol[2], 0)) """ if (DEBUGLOG): logf.close() #================================================================================================== #Building Mesh #================================================================================================== - print("vertex:",len(verts),"faces:",len(faces)) - print("vertex2:",len(verts2)) + print("vertex:", len(verts), "faces:", len(faces)) + print("vertex2:", len(verts2)) me_ob.vertices.add(len(verts2)) me_ob.tessfaces.add(len(faces)) me_ob.vertices.foreach_set("co", unpack_list(verts2)) - me_ob.tessfaces.foreach_set("vertices_raw",unpack_list( faces)) - + me_ob.tessfaces.foreach_set("vertices_raw", unpack_list( faces)) + for face in me_ob.tessfaces: - face.use_smooth = facesmooth[face.index] - + face.use_smooth = facesmooth[face.index] + """ Material setup coding. First the mesh has to be create first to get the uv texture setup working. -Create material(s) list in the psk pack data from the list.(to do list) -Append the material to the from create the mesh object. -Create Texture(s) - -fae loop for uv assign and assign material index - + -face loop for uv assign and assign material index """ bpy.ops.object.mode_set(mode='OBJECT') #=================================================================================================== @@ -591,9 +603,9 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): #print(dir(mtex)) #print(dir(matdata)) #for texno in range(len( bpy.data.textures)): - #print((bpy.data.textures[texno].name)) + #print((bpy.data.textures[texno].name)) #print(dir(bpy.data.textures[texno])) - #matdata.active_texture = bpy.data.textures[matcount-1] + #matdata.active_texture = bpy.data.textures[matcount - 1] #matdata.texture_coords = 'UV' #matdata.active_texture = texturedata materials.append(matdata) @@ -611,13 +623,13 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): # texturename = "text1" # UNUSED countm = 0 for countm in range(materialcount): - psktexname="psk" + str(countm) + psktexname = "psk" + str(countm) me_ob.uv_textures.new(name=psktexname) countm += 1 print("INIT UV TEXTURE...") _matcount = 0 #for mattexcount in materials: - #print("MATERAIL ID:",_matcount) + #print("MATERAIL ID:", _matcount) _textcount = 0 for uv in me_ob.tessface_uv_textures: # uv texture print("UV TEXTURE ID:",_textcount) @@ -627,25 +639,25 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): if faceuv[face.index][1] == _textcount: #if face index and texture index matches assign it mfaceuv = faceuv[face.index] #face index _uv1 = mfaceuv[0][0] #(0,0) - uv.data[face.index].uv1 = mathutils.Vector((_uv1[0],_uv1[1])) #set them + uv.data[face.index].uv1 = mathutils.Vector((_uv1[0], _uv1[1])) #set them _uv2 = mfaceuv[0][1] #(0,0) - uv.data[face.index].uv2 = mathutils.Vector((_uv2[0],_uv2[1])) #set them + uv.data[face.index].uv2 = mathutils.Vector((_uv2[0], _uv2[1])) #set them _uv3 = mfaceuv[0][2] #(0,0) - uv.data[face.index].uv3 = mathutils.Vector((_uv3[0],_uv3[1])) #set them + uv.data[face.index].uv3 = mathutils.Vector((_uv3[0], _uv3[1])) #set them else: #if not match zero them - uv.data[face.index].uv1 = mathutils.Vector((0,0)) #zero them - uv.data[face.index].uv2 = mathutils.Vector((0,0)) #zero them - uv.data[face.index].uv3 = mathutils.Vector((0,0)) #zero them + uv.data[face.index].uv1 = mathutils.Vector((0, 0)) #zero them + uv.data[face.index].uv2 = mathutils.Vector((0, 0)) #zero them + uv.data[face.index].uv3 = mathutils.Vector((0, 0)) #zero them _textcount += 1 #_matcount += 1 #print(matcount) print("END UV TEXTURE...") - print("UV TEXTURE LEN:",len(texture)) + print("UV TEXTURE LEN:", len(texture)) #for tex in me_ob.uv_textures: - #print("mesh tex:",dir(tex)) + #print("mesh tex:", dir(tex)) #print((tex.name)) - + #for face in me_ob.faces: #print(dir(face)) @@ -660,15 +672,14 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): #print(dir(ob_new.data.bones)) #create bone vertex group #deal with bone id for index number for bone in ob_new.data.bones: - #print("names:",bone.name,":",dir(bone)) - #print("names:",bone.name) + #print("names:", bone.name, ":", dir(bone)) + #print("names:", bone.name) group = obmesh.vertex_groups.new(bone.name) for vgroup in obmesh.vertex_groups: - #print(vgroup.name,":",vgroup.index) + #print(vgroup.name, ":", vgroup.index) for vgp in RWghts: #bone index - if vgp[1] == bni_dict[vgroup.name]: #print(vgp) #[vertex id],weight @@ -678,7 +689,7 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): if len(materials) > 0: obmesh.active_material = materials[0] #material setup tmp print("---- adding mesh to the scene ----") - + bpy.ops.object.mode_set(mode='OBJECT') #bpy.ops.object.select_pattern(extend=True, pattern=obmesh.name, case_sensitive=True) #bpy.ops.object.select_pattern(extend=True, pattern=ob_new.name, case_sensitive=True) @@ -694,26 +705,26 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): obmesh.select = True ob_new.select = True bpy.ops.object.parent_set(type="ARMATURE") - + print ("PSK2Blender completed") #End of def pskimport######################### -def getInputFilenamepsk(self,filename,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): +def getInputFilenamepsk(self, filename, importmesh, importbone, bDebugLogPSK, importmultiuvtextures): checktype = filename.split('\\')[-1].split('.')[1] print ("------------",filename) if checktype.lower() != 'psk': - print (" Selected file = ",filename) + print (" Selected file = ", filename) raise (IOError, "The selected input file is not a *.psk file") #self.report({'INFO'}, ("Selected file:"+ filename)) else: - pskimport(filename,importmesh,importbone,bDebugLogPSK,importmultiuvtextures) - -def getInputFilenamepsa(self,filename,context): + pskimport(filename, importmesh, importbone, bDebugLogPSK, importmultiuvtextures) + +def getInputFilenamepsa(self, filename, context): checktype = filename.split('\\')[-1].split('.')[1] if checktype.lower() != 'psa': - print (" Selected file = ",filename) + print (" Selected file = ", filename) raise (IOError, "The selected input file is not a *.psa file") - #self.report({'INFO'}, ("Selected file:"+ filename)) + #self.report({'INFO'}, ("Selected file:" + filename)) else: psaimport(filename,context) @@ -751,7 +762,7 @@ class IMPORT_OT_psk(bpy.types.Operator): ) bDebugLogPSK = BoolProperty( name="Debug Log.txt", - description="Log the output of raw format. It will save in " \ + description="Log the output of raw format. It will save in " "current file dir. Note this just for testing", default=False, ) @@ -765,13 +776,14 @@ class IMPORT_OT_psk(bpy.types.Operator): def execute(self, context): bpy.types.Scene.unrealbonesize = self.unrealbonesize - getInputFilenamepsk(self,self.filepath,self.importmesh,self.importbone,self.bDebugLogPSK,self.importmultiuvtextures) + getInputFilenamepsk(self, self.filepath, self.importmesh, self.importbone, self.bDebugLogPSK, + self.importmultiuvtextures) return {'FINISHED'} def invoke(self, context, event): wm = context.window_manager wm.fileselect_add(self) - return {'RUNNING_MODAL'} + return {'RUNNING_MODAL'} class psa_bone: name="" @@ -781,7 +793,7 @@ class psa_bone: self.name="" self.Transform=None self.parent=None - + def psaimport(filename,context): print ("--------------------------------------------------") print ("---------SCRIPT EXECUTING PYTHON IMPORTER---------") @@ -791,33 +803,33 @@ def psaimport(filename,context): debug = True if (debug): logpath = filename.replace(".psa", ".txt") - print("logpath:",logpath) - logf = open(logpath,'w') + print("logpath:", logpath) + logf = open(logpath, 'w') def printlog(strdata): if (debug): logf.write(strdata) - def printlogplus(name,data): + def printlogplus(name, data): if (debug): - logf.write(str(name)+'\n') - if isinstance(data,bytes): + logf.write(str(name) + '\n') + if isinstance(data, bytes): logf.write(str(bytes.decode(data).strip(bytes.decode(b'\x00')))) else: logf.write(str(data)) logf.write('\n') - + printlog('-----------Log File------------\n') #General Header - indata = unpack('20s3i',psafile.read(32)) - printlogplus('ChunkID',indata[0]) - printlogplus('TypeFlag',indata[1]) - printlogplus('DataSize',indata[2]) - printlogplus('DataCount',indata[3]) + indata = unpack('20s3i', psafile.read(32)) + printlogplus('ChunkID', indata[0]) + printlogplus('TypeFlag', indata[1]) + printlogplus('DataSize', indata[2]) + printlogplus('DataCount', indata[3]) #Bones Header - indata = unpack('20s3i',psafile.read(32)) - printlogplus('ChunkID',indata[0]) - printlogplus('TypeFlag',indata[1]) - printlogplus('DataSize',indata[2]) - printlogplus('DataCount',indata[3]) + indata = unpack('20s3i', psafile.read(32)) + printlogplus('ChunkID', indata[0]) + printlogplus('TypeFlag', indata[1]) + printlogplus('DataSize', indata[2]) + printlogplus('DataCount', indata[3]) #Bones Data BoneIndex2NamePairMap = {} BoneNotFoundList = [] @@ -826,56 +838,56 @@ def psaimport(filename,context): counter = 0 nobonematch = True while counter < recCount: - indata = unpack('64s3i11f',psafile.read(120)) - #printlogplus('bone',indata[0]) + indata = unpack('64s3i11f', psafile.read(120)) + #printlogplus('bone', indata[0]) bonename = str(bytes.decode(indata[0]).strip(bytes.decode(b'\x00'))) if bonename in bpy.data.armatures['armaturedata'].bones.keys(): BoneIndex2NamePairMap[counter] = bonename - print('find bone',bonename) + print('find bone', bonename) nobonematch = False else: - print('can not find the bone:',bonename) + print('can not find the bone:', bonename) BoneNotFoundList.append(counter) counter += 1 - + if nobonematch: print('no bone was match so skip import!') return - + #Animations Header - indata = unpack('20s3i',psafile.read(32)) - printlogplus('ChunkID',indata[0]) - printlogplus('TypeFlag',indata[1]) - printlogplus('DataSize',indata[2]) - printlogplus('DataCount',indata[3]) + indata = unpack('20s3i', psafile.read(32)) + printlogplus('ChunkID', indata[0]) + printlogplus('TypeFlag', indata[1]) + printlogplus('DataSize', indata[2]) + printlogplus('DataCount', indata[3]) #Animations Data recCount = indata[3] counter = 0 Raw_Key_Nums = 0 Action_List = [] while counter < recCount: - indata = unpack('64s64s4i3f3i',psafile.read(64+64+4*4+3*4+3*4)) - printlogplus('Name',indata[0]) - printlogplus('Group',indata[1]) - printlogplus('totalbones',indata[2]) - printlogplus('NumRawFrames',indata[-1]) + indata = unpack('64s64s4i3f3i', psafile.read(64 + 64 + 4 * 4 + 3 * 4 + 3 * 4)) + printlogplus('Name', indata[0]) + printlogplus('Group', indata[1]) + printlogplus('totalbones', indata[2]) + printlogplus('NumRawFrames', indata[-1]) Name = str(bytes.decode(indata[0]).strip(bytes.decode(b'\x00'))) Group = str(bytes.decode(indata[1]).strip(bytes.decode(b'\x00'))) totalbones = indata[2] NumRawFrames = indata[-1] - + Raw_Key_Nums += indata[2] * indata[-1] Action_List.append((Name,Group,totalbones,NumRawFrames)) - + counter += 1 - + #Raw keys Header Raw_Key_List = [] - indata = unpack('20s3i',psafile.read(32)) - printlogplus('ChunkID',indata[0]) - printlogplus('TypeFlag',indata[1]) - printlogplus('DataSize',indata[2]) - printlogplus('DataCount',indata[3]) + indata = unpack('20s3i', psafile.read(32)) + printlogplus('ChunkID', indata[0]) + printlogplus('TypeFlag', indata[1]) + printlogplus('DataSize', indata[2]) + printlogplus('DataCount', indata[3]) if(Raw_Key_Nums != indata[3]): print('error! Raw_Key_Nums Inconsistent') return @@ -883,39 +895,39 @@ def psaimport(filename,context): recCount = Raw_Key_Nums counter = 0 while counter < recCount: - indata = unpack('3f4f1f',psafile.read(3*4+4*4+4)) + indata = unpack('3f4f1f', psafile.read(3 * 4 + 4 * 4 + 4)) pos = mathutils.Vector((indata[0], indata[1], indata[2])) quat = mathutils.Quaternion((indata[6], indata[3], indata[4], indata[5])) time = indata[7] - Raw_Key_List.append((pos,quat,time)) + Raw_Key_List.append((pos, quat, time)) counter += 1 #Scale keys Header,Scale keys Data,Curve keys Header,Curve keys Data curFilePos = psafile.tell() - psafile.seek(0,2) + psafile.seek(0, 2) endFilePos = psafile.tell() if curFilePos == endFilePos: print('no Scale keys,Curve keys') - + #build the animation line if bpy.ops.object.mode_set.poll(): bpy.ops.object.mode_set(mode='OBJECT', toggle=False) - + NeededBoneMatrix = {} ARMATURE_OBJ = 'ArmObject' ARMATURE_DATA = 'armaturedata' if bpy.context.scene.udk_importarmatureselect: if len(bpy.context.scene.udkas_list) > 0: print("CHECKING ARMATURE...") - #for bone in bpy.data.objects[ARMATURE_OBJ].pose.bones: + #for bone in bpy.data.objects[ARMATURE_OBJ].pose.bones: #for objd in bpy.data.objects: - #print("NAME:",objd.name," TYPE:",objd.type) + #print("NAME:", objd.name, " TYPE:", objd.type) #if objd.type == 'ARMARURE': #print(dir(objd)) armature_list = bpy.context.scene.udkas_list #armature list array armature_idx = bpy.context.scene.udkimportarmature_list_idx #armature index selected ARMATURE_OBJ = bpy.data.objects[armature_list[armature_idx]].name #object armature ARMATURE_DATA = bpy.data.objects[armature_list[armature_idx]].data.name #object data - + for bone in bpy.data.armatures[ARMATURE_DATA].bones: name = bone.name ori_matrix = bone.matrix @@ -928,7 +940,7 @@ def psaimport(filename,context): bone_rest_matrix_inv.resize_4x4() bone_rest_matrix.resize_4x4() NeededBoneMatrix[name] = (bone_rest_matrix,bone_rest_matrix_inv,ori_matrix) - + #build tmp pose bone tree psa_bones = {} for bone in bpy.data.objects[ARMATURE_OBJ].pose.bones: @@ -940,29 +952,29 @@ def psaimport(filename,context): else: _psa_bone.parent = None psa_bones[bone.name] = _psa_bone - + raw_key_index = 0 for raw_action in Action_List: - Name = raw_action[0] - Group = raw_action[1] - Totalbones = raw_action[2] - NumRawFrames = raw_action[3] + Name = raw_action[0] + Group = raw_action[1] + Totalbones = raw_action[2] + NumRawFrames = raw_action[3] context.scene.update() object = bpy.data.objects['ArmObject'] object.animation_data_create() - action = bpy.data.actions.new(name=Name) + action = bpy.data.actions.new(name=Name) object.animation_data.action = action for i in range(NumRawFrames): - context.scene.frame_set(i+1) + context.scene.frame_set(i + 1) pose_bones = object.pose.bones for j in range(Totalbones): if j not in BoneNotFoundList: bName = BoneIndex2NamePairMap[j] - pbone = psa_bones[bName] + pbone = psa_bones[bName] pos = Raw_Key_List[raw_key_index][0] quat = Raw_Key_List[raw_key_index][1] - + mat = Matrix() if pbone.parent != None: quat = quat.conjugated() @@ -978,7 +990,7 @@ def psaimport(filename,context): raw_key_index += 1 #bpy.data.meshes[1] - for bone in pose_bones: + for bone in pose_bones: bone.matrix = psa_bones[bone.name].Transform bone.keyframe_insert("rotation_quaternion") bone.keyframe_insert("location") @@ -986,16 +998,16 @@ def psaimport(filename,context): def whirlSingleBone(pose_bone,quat): bpy.context.scene.update() #record child's matrix and origin rotate - hymat = Quaternion((0.707,-0.707,0,0)).inverted().to_matrix().to_4x4() + hymat = Quaternion((0.707, -0.707, 0, 0)).inverted().to_matrix().to_4x4() children_infos = {} childrens = pose_bone.children for child in childrens: - armmat = bpy.data.armatures['armaturedata'].bones[child.name].matrix.copy().to_4x4() + armmat = bpy.data.armatures['armaturedata'].bones[child.name].matrix.copy().to_4x4() cmat = child.matrix.copy() * armmat.inverted() * hymat.inverted() pos = cmat.to_translation() rotmat = cmat.to_3x3() - children_infos[child] = (armmat,pos,rotmat) - + children_infos[child] = (armmat, pos, rotmat) + #whirl this bone by quat pose_bone.matrix *= quat.to_matrix().to_4x4() pose_bone.keyframe_insert("location") @@ -1003,7 +1015,7 @@ def psaimport(filename,context): bpy.context.scene.update() #set back children bon to original position #reverse whirl child bone by quat.inverse() - + for child in childrens: armmat = children_infos[child][0] pos = children_infos[child][1] @@ -1015,17 +1027,17 @@ def psaimport(filename,context): for bone in pose_bones: if bone.parent != None: - whirlSingleBone(bone,Quaternion((0.707,0,0,-0.707))) + whirlSingleBone(bone,Quaternion((0.707, 0, 0, -0.707))) else: - bone.rotation_quaternion *= Quaternion((0.707,-0.707,0,0))*Quaternion((0.707,0,0,-0.707)) + bone.rotation_quaternion *= Quaternion((0.707, -0.707, 0, 0)) * Quaternion((0.707, 0, 0, -0.707)) bone.keyframe_insert("rotation_quaternion") - + break - + context.scene.frame_set(0) if(debug): logf.close() - + class IMPORT_OT_psa(bpy.types.Operator): '''Load a skeleton anim psa File''' bl_idname = "import_scene.psa" @@ -1048,7 +1060,7 @@ class IMPORT_OT_psa(bpy.types.Operator): def invoke(self, context, event): wm = context.window_manager wm.fileselect_add(self) - return {'RUNNING_MODAL'} + return {'RUNNING_MODAL'} class IMPORT_OT_psa(bpy.types.Operator): '''Load a skeleton anim psa File''' @@ -1072,50 +1084,50 @@ class IMPORT_OT_psa(bpy.types.Operator): def invoke(self, context, event): wm = context.window_manager wm.fileselect_add(self) - return {'RUNNING_MODAL'} + return {'RUNNING_MODAL'} bpy.types.Scene.udk_importpsk = StringProperty( - name = "Import .psk", - description = "Skeleton mesh file path for psk", - default = "") + name = "Import .psk", + description = "Skeleton mesh file path for psk", + default = "") bpy.types.Scene.udk_importpsa = StringProperty( - name = "Import .psa", - description = "Animation Data to Action Set(s) file path for psa", - default = "") + name = "Import .psa", + description = "Animation Data to Action Set(s) file path for psa", + default = "") bpy.types.Scene.udk_importarmatureselect = BoolProperty( - name = "Armature Selected", - description = "Select Armature to Import psa animation data.", - default = False) - -class Panel_UDKImport( bpy.types.Panel ): - - bl_label = "UDK Import" - bl_idname = "OBJECT_PT_udk_import" - bl_space_type = "VIEW_3D" - bl_region_type = "TOOLS" - - filepath = StringProperty( + name = "Armature Selected", + description = "Select Armature to Import psa animation data", + default = False) + +class Panel_UDKImport(bpy.types.Panel): + bl_label = "UDK Import" + bl_idname = "OBJECT_PT_udk_import" + bl_space_type = "VIEW_3D" + bl_region_type = "TOOLS" + + filepath = StringProperty( subtype='FILE_PATH', ) - - #@classmethod - #def poll(cls, context): - # return context.active_object - - def draw(self, context): - layout = self.layout - layout.operator(OBJECT_OT_PSKPath.bl_idname) - - layout.prop(context.scene, "udk_importarmatureselect") - if bpy.context.scene.udk_importarmatureselect: - layout.operator(OBJECT_OT_UDKImportArmature.bl_idname) - layout.template_list(context.scene, "udkimportarmature_list", context.scene, "udkimportarmature_list_idx",prop_list="template_list_controls", rows=5) - layout.operator(OBJECT_OT_PSAPath.bl_idname) - + + #@classmethod + #def poll(cls, context): + # return context.active_object + + def draw(self, context): + layout = self.layout + layout.operator(OBJECT_OT_PSKPath.bl_idname) + + layout.prop(context.scene, "udk_importarmatureselect") + if bpy.context.scene.udk_importarmatureselect: + layout.operator(OBJECT_OT_UDKImportArmature.bl_idname) + layout.template_list("UI_UL_list", "", context.scene, "udkimportarmature_list", + context.scene, "udkimportarmature_list_idx", rows=5) + layout.operator(OBJECT_OT_PSAPath.bl_idname) + class OBJECT_OT_PSKPath(bpy.types.Operator): + """Select .psk file path to import for skeleton mesh""" bl_idname = "object.pskpath" bl_label = "Import PSK Path" - __doc__ = " Select .psk file path to import for skeleton mesh." filepath = StringProperty( subtype='FILE_PATH', @@ -1152,107 +1164,110 @@ class OBJECT_OT_PSKPath(bpy.types.Operator): min=0.001, max=1000, ) - + def execute(self, context): #context.scene.importpskpath = self.properties.filepath bpy.types.Scene.unrealbonesize = self.unrealbonesize - getInputFilenamepsk(self,self.filepath,self.importmesh,self.importbone,self.bDebugLogPSK,self.importmultiuvtextures) + getInputFilenamepsk(self, self.filepath, self.importmesh, self.importbone, self.bDebugLogPSK, + self.importmultiuvtextures) return {'FINISHED'} - + def invoke(self, context, event): #bpy.context.window_manager.fileselect_add(self) wm = context.window_manager wm.fileselect_add(self) return {'RUNNING_MODAL'} - + class UDKImportArmaturePG(bpy.types.PropertyGroup): - bool = BoolProperty(default=False) - string = StringProperty() - bexport = BoolProperty(default=False,name="Export", options={"HIDDEN"},description = "This will be ignore when exported") - bselect = BoolProperty(default=False,name="Select", options={"HIDDEN"},description = "This will be ignore when exported") - otype = StringProperty(name="Type",description = "This will be ignore when exported") - template_list_controls = StringProperty(default="", options={"HIDDEN"}) + #boolean = BoolProperty(default=False) + string = StringProperty() + bexport = BoolProperty(default=False, name="Export", options={"HIDDEN"}, + description = "This will be ignore when exported") + bselect = BoolProperty(default=False, name="Select", options={"HIDDEN"}, + description = "This will be ignore when exported") + otype = StringProperty(name="Type",description = "This will be ignore when exported") bpy.utils.register_class(UDKImportArmaturePG) bpy.types.Scene.udkimportarmature_list = CollectionProperty(type=UDKImportArmaturePG) bpy.types.Scene.udkimportarmature_list_idx = IntProperty() class OBJECT_OT_PSAPath(bpy.types.Operator): - bl_idname = "object.psapath" - bl_label = "Import PSA Path" - __doc__ = " Select .psa file path to import for animation data." + """Select .psa file path to import for animation data""" + bl_idname = "object.psapath" + bl_label = "Import PSA Path" - filepath = StringProperty(name="PSA File Path", description="Filepath used for importing the PSA file", maxlen= 1024, default= "") - filter_glob = StringProperty( + filepath = StringProperty(name="PSA File Path", description="Filepath used for importing the PSA file", + maxlen=1024, default="") + filter_glob = StringProperty( default="*.psa", options={'HIDDEN'}, ) - - def execute(self, context): - #context.scene.importpsapath = self.properties.filepath - getInputFilenamepsa(self,self.filepath,context) - return {'FINISHED'} - - def invoke(self, context, event): - bpy.context.window_manager.fileselect_add(self) - return {'RUNNING_MODAL'} - + + def execute(self, context): + #context.scene.importpsapath = self.properties.filepath + getInputFilenamepsa(self,self.filepath,context) + return {'FINISHED'} + + def invoke(self, context, event): + bpy.context.window_manager.fileselect_add(self) + return {'RUNNING_MODAL'} + class OBJECT_OT_UDKImportArmature(bpy.types.Operator): - bl_idname = "object.udkimportarmature" - bl_label = "Update Armature" - __doc__ = "This will update the filter of the mesh and armature." - - def execute(self, context): - my_objlist = bpy.context.scene.udkimportarmature_list - objectl = [] - for objarm in bpy.context.scene.objects:#list and filter only mesh and armature - if objarm.type == 'ARMATURE': - objectl.append(objarm) - for _objd in objectl:#check if list has in udk list - bfound_obj = False - for _obj in my_objlist: - if _obj.name == _objd.name and _obj.otype == _objd.type: - _obj.bselect = _objd.select - bfound_obj = True - break - if bfound_obj == False: - #print("ADD ARMATURE...") - my_item = my_objlist.add() - my_item.name = _objd.name - my_item.bselect = _objd.select - my_item.otype = _objd.type - removeobject = [] - for _udkobj in my_objlist: - bfound_objv = False - for _objd in bpy.context.scene.objects: #check if there no existing object from sense to remove it - if _udkobj.name == _objd.name and _udkobj.otype == _objd.type: - bfound_objv = True - break - if bfound_objv == False: - removeobject.append(_udkobj) - #print("remove check...") - for _item in removeobject: #loop remove object from udk list object - count = 0 - for _obj in my_objlist: - if _obj.name == _item.name and _obj.otype == _item.otype: - my_objlist.remove(count) - break - count += 1 - return{'FINISHED'} - + """This will update the filter of the mesh and armature""" + bl_idname = "object.udkimportarmature" + bl_label = "Update Armature" + + def execute(self, context): + my_objlist = bpy.context.scene.udkimportarmature_list + objectl = [] + for objarm in bpy.context.scene.objects:#list and filter only mesh and armature + if objarm.type == 'ARMATURE': + objectl.append(objarm) + for _objd in objectl:#check if list has in udk list + bfound_obj = False + for _obj in my_objlist: + if _obj.name == _objd.name and _obj.otype == _objd.type: + _obj.bselect = _objd.select + bfound_obj = True + break + if bfound_obj == False: + #print("ADD ARMATURE...") + my_item = my_objlist.add() + my_item.name = _objd.name + my_item.bselect = _objd.select + my_item.otype = _objd.type + removeobject = [] + for _udkobj in my_objlist: + bfound_objv = False + for _objd in bpy.context.scene.objects: #check if there no existing object from sense to remove it + if _udkobj.name == _objd.name and _udkobj.otype == _objd.type: + bfound_objv = True + break + if bfound_objv == False: + removeobject.append(_udkobj) + #print("remove check...") + for _item in removeobject: #loop remove object from udk list object + count = 0 + for _obj in my_objlist: + if _obj.name == _item.name and _obj.otype == _item.otype: + my_objlist.remove(count) + break + count += 1 + return{'FINISHED'} + class OBJECT_OT_UDKImportA(bpy.types.Operator): - bl_idname = "object.udkimporta" - bl_label = "Update Armature" - __doc__ = "This will update the filter of the mesh and armature." - - def execute(self, context): - for objd in bpy.data.objects: - print("NAME:",objd.name," TYPE:",objd.type) - if objd.type == "ARMATURE": - print(dir(objd)) - print((objd.data.name)) - return{'FINISHED'} - + """This will update the filter of the mesh and armature""" + bl_idname = "object.udkimporta" + bl_label = "Update Armature" + + def execute(self, context): + for objd in bpy.data.objects: + print("NAME:",objd.name," TYPE:",objd.type) + if objd.type == "ARMATURE": + print(dir(objd)) + print((objd.data.name)) + return{'FINISHED'} + def menu_func(self, context): self.layout.operator(IMPORT_OT_psk.bl_idname, text="Skeleton Mesh (.psk)") self.layout.operator(IMPORT_OT_psa.bl_idname, text="Skeleton Anim (.psa)") @@ -1260,7 +1275,7 @@ def menu_func(self, context): def register(): bpy.utils.register_module(__name__) bpy.types.INFO_MT_file_import.append(menu_func) - + def unregister(): bpy.utils.unregister_module(__name__) bpy.types.INFO_MT_file_import.remove(menu_func) @@ -1270,4 +1285,4 @@ if __name__ == "__main__": #note this only read the data and will not be place in the scene #getInputFilename('C:\\blenderfiles\\BotA.psk') -#getInputFilename('C:\\blenderfiles\\AA.PSK') \ No newline at end of file +#getInputFilename('C:\\blenderfiles\\AA.PSK') -- GitLab