diff --git a/io_export_unreal_psk_psa.py b/io_export_unreal_psk_psa.py index 9db878c14e15c998fb33da38b10c704a09d945bf..0d62bb12273faed68d703905a1c47877fa180445 100644 --- a/io_export_unreal_psk_psa.py +++ b/io_export_unreal_psk_psa.py @@ -1756,13 +1756,6 @@ def write_data(path, context): from bpy.props import * -exporttypedata = [] - -# [index,text field,0] #or something like that -exporttypedata.append(("0","PSK","Export PSK")) -exporttypedata.append(("1","PSA","Export PSA")) -exporttypedata.append(("2","ALL","Export ALL")) - bpy.types.Scene.unrealfpsrate = IntProperty( name="fps rate", description="Set the frame per second (fps) for unreal.", @@ -1771,7 +1764,7 @@ bpy.types.Scene.unrealfpsrate = IntProperty( bpy.types.Scene.unrealexport_settings = EnumProperty( name="Export:", description="Select a export settings (psk/psa/all)...", - items = exporttypedata, default = '0') + items = [("0","PSK","Export PSK"),("1","PSA","Export PSA"),("2","ALL","Export ALL")], default = '0') bpy.types.Scene.UEActionSetSettings = EnumProperty( name="Action Set(s) Export Type", @@ -1878,6 +1871,7 @@ class ExportUDKAnimData(bpy.types.Operator): # to the class instance from the operator settings before calling. filepath = StringProperty(name="File Path", description="Filepath used for exporting the PSA file", maxlen= 1024, default= "", subtype='FILE_PATH') + filter_glob = StringProperty(default="*.psk;*.psa", options={'HIDDEN'}) pskexportbool = BoolProperty(name="Export PSK", description="Export Skeletal Mesh", default= True) psaexportbool = BoolProperty(name="Export PSA", description="Export Action Set (Animation Data)", default= True) actionexportall = BoolProperty(name="All Actions", description="This will export all the actions that matches the current armature.", default=False) diff --git a/io_import_scene_unreal_psk.py b/io_import_scene_unreal_psk.py index a3984c7e21d294324945a989e0febbaaefc2c44d..acef7a70df75757a96170a2783838169aabd93ea 100644 --- a/io_import_scene_unreal_psk.py +++ b/io_import_scene_unreal_psk.py @@ -188,6 +188,7 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): indata = unpack('3f',pskfile.read(12)) #print(indata[0],indata[1],indata[2]) verts.extend([(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])) #================================================================================================== @@ -200,10 +201,12 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): 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([indata[0],indata[2],indata[3]]) #print([indata[1],indata[2],indata[3]]) @@ -220,10 +223,12 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): counter = 0 faces = [] faceuv = [] + #the psk values are: nWdgIdx1|WdgIdx2|WdgIdx3|MatIdx|AuxMatIdx|SmthGrp + printlog("nWdgIdx1|WdgIdx2|WdgIdx3|MatIdx|AuxMatIdx|SmthGrp \n") while counter < recCount: counter = counter + 1 - indata = unpack('hhhbbi',pskfile.read(12)) - #the psk values are: nWdgIdx1|WdgIdx2|WdgIdx3|MatIdx|AuxMatIdx|SmthGrp + 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 @@ -244,6 +249,7 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): v2 = UVCoords[indata[2]][2] uv.append([u2,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 @@ -286,6 +292,8 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): 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 = [] nobone = 0 @@ -294,9 +302,11 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): #================================================================================================== counter = 0 print ("---PRASE--BONES---") + printlog("Name|Flgs|NumChld|PrntIdx|Qw|Qx|Qy|Qz|LocX|LocY|LocZ|Lngth|XSize|YSize|ZSize\n") while counter < recCount: indata = unpack('64s3i11f',pskfile.read(120)) #print( "DATA",str(indata)) + bone.append(indata) createbone = md5_bone() @@ -308,6 +318,7 @@ 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") print ("temp_name:", temp_name, "||") createbone.name = temp_name createbone.bone_index = counter @@ -445,8 +456,6 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): #print("rotmatrix:",dir(bone.bindmat.to_matrix().resize_4x4())) #rotmatrix = bone.bindmat.to_matrix().resize_4x4().to_3x3() # XXX, redundant matrix conversion? rotmatrix = bone.bindmat.to_matrix().to_3x3() # XXX, redundant matrix conversion? - - newbone.head.x = bone.bindpos[0] newbone.head.y = bone.bindpos[1] newbone.head.z = bone.bindpos[2] @@ -493,9 +502,14 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): 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]]) #RWghts fields = PntIdx|BoneIdx|Weight RWghts.sort() - printlog( "len(RWghts)=" + 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") + #Tmsh.update_tag() #set the Vertex Colors of the faces @@ -554,7 +568,6 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): materials = [] for matcount in range(materialcount): - #if texturedata != None: matdata = bpy.data.materials.new(materialname + str(matcount)) #mtex = matdata.texture_slots.new() @@ -686,24 +699,44 @@ def pskimport(infile,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): # #=================================================================================================== obmesh = bpy.data.objects.new(objName,me_ob) + #=================================================================================================== + #Mesh Vertex Group bone weight + #=================================================================================================== + print("---- building bone weight mesh ----") + #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) + group = obmesh.vertex_groups.new(bone.name) + for vgroup in obmesh.vertex_groups: + #print(vgroup.name,":",vgroup.index) + for vgp in RWghts: + #bone index + if vgp[1] == vgroup.index: + #print(vgp) + #[vertex id],weight + vgroup.add([vgp[0]], vgp[2], 'ADD') + #check if there is a material to set to if len(materials) > 0: obmesh.active_material = materials[0] #material setup tmp - - bpy.context.scene.objects.link(obmesh) - + print("---- adding mesh to the scene ----") + bpy.context.scene.objects.link(obmesh) bpy.context.scene.update() print ("PSK2Blender completed") #End of def pskimport######################### -def getInputFilename(filename,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): +def getInputFilename(self,filename,importmesh,importbone,bDebugLogPSK,importmultiuvtextures): checktype = filename.split('\\')[-1].split('.')[1] print ("------------",filename) - if checktype.upper() != 'PSK': + if checktype.lower() != 'psk': print (" Selected file = ",filename) raise (IOError, "The selected input file is not a *.psk file") - pskimport(filename,importmesh,importbone,bDebugLogPSK,importmultiuvtextures) + #self.report({'INFO'}, ("Selected file:"+ filename)) + else: + pskimport(filename,importmesh,importbone,bDebugLogPSK,importmultiuvtextures) from bpy.props import * @@ -716,14 +749,15 @@ class IMPORT_OT_psk(bpy.types.Operator): # List of operator properties, the attributes will be assigned # to the class instance from the operator settings before calling. - filepath = StringProperty(name="File Path", description="Filepath used for importing the OBJ file", maxlen= 1024, default= "") + filepath = StringProperty(name="File Path", description="Filepath used for importing the psk file", maxlen= 1024, subtype='FILE_PATH') + filter_glob = StringProperty(default="*.psk", options={'HIDDEN'}) importmesh = BoolProperty(name="Mesh", description="Import mesh only. (not yet build.)", default=True) importbone = BoolProperty(name="Bones", description="Import bones only. Current not working yet.", default=True) importmultiuvtextures = BoolProperty(name="Single UV Texture(s)", description="Single or Multi uv textures.", default=True) bDebugLogPSK = BoolProperty(name="Debug Log.txt", description="Log the output of raw format. It will save in current file dir. Note this just for testing.", default=False) def execute(self, context): - getInputFilename(self.filepath,self.importmesh,self.importbone,self.bDebugLogPSK,self.importmultiuvtextures) + getInputFilename(self,self.filepath,self.importmesh,self.importbone,self.bDebugLogPSK,self.importmultiuvtextures) return {'FINISHED'} def invoke(self, context, event):