From adb6dac127cc2ff9e4cfc979fcfed6de23734c45 Mon Sep 17 00:00:00 2001 From: John Phan <darkneter@gmail.com> Date: Thu, 17 Feb 2011 02:53:48 +0000 Subject: [PATCH] fixed material. --- io_export_unreal_psk_psa.py | 95 +++++++++++++++++++++++++++++++++---- 1 file changed, 87 insertions(+), 8 deletions(-) diff --git a/io_export_unreal_psk_psa.py b/io_export_unreal_psk_psa.py index 1fd4ff7ff..01a8ab794 100644 --- a/io_export_unreal_psk_psa.py +++ b/io_export_unreal_psk_psa.py @@ -18,7 +18,7 @@ bl_info = { "name": "Export Skeleletal Mesh/Animation Data", "author": "Darknet/Optimus_P-Fat/Active_Trash/Sinsoft/VendorX", - "version": (2, 0), + "version": (2, 2), "blender": (2, 5, 6), "api": 31847, "location": "File > Export > Skeletal Mesh/Animation Data (.psk/.psa)", @@ -109,6 +109,7 @@ SIZE_VQUATANIMKEY = 32 SIZE_VVERTEX = 16 SIZE_VPOINT = 12 SIZE_VTRIANGLE = 12 +MaterialName = [] ######################################################################## # Generic Object->Integer mapping @@ -452,7 +453,8 @@ class PSKFile: return self.Materials.Data[mat_index] else: m = VMaterial() - m.MaterialName = "Mat%i" % mat_index + # modified by VendorX + m.MaterialName = MaterialName[mat_index] self.AddMaterial(m) return m @@ -680,10 +682,11 @@ def BoneIndexArmature(blender_armature): #BBCount += 1 break +bDeleteMergeMesh = False # Actual object parsing functions def parse_meshes(blender_meshes, psk_file): #this is use to call the bone name and the index array for group index matches - global bonedata + global bonedata,bDeleteMergeMesh #print("BONE DATA",len(bonedata)) print ("----- parsing meshes -----") print("Number of Object Meshes:",len(blender_meshes)) @@ -694,7 +697,16 @@ def parse_meshes(blender_meshes, psk_file): print("Mesh Name:",current_obj.name) current_mesh = current_obj.data - #if len(current_obj.materials) > 0: + #collect a list of the material names + if len(current_obj.material_slots) > 0: + counter = 0 + while counter < len(current_obj.material_slots): + MaterialName.append(current_obj.material_slots[counter].name) + print("Material Name:",current_obj.material_slots[counter].name) + #create the current material + psk_file.GetMatByIndex(counter) + #print("materials: ",MaterialName[counter]) + counter += 1 # object_mat = current_obj.materials[0] object_material_index = current_obj.active_material_index @@ -925,10 +937,16 @@ def parse_meshes(blender_meshes, psk_file): psk_file.VertexGroups[bonegroup.bone] = vert_list #unrealtriangulatebool #this will remove the mesh from the scene - if (bpy.context.scene.unrealtriangulatebool == True): + if (bpy.context.scene.unrealtriangulatebool == True)or (bDeleteMergeMesh == True): + if bDeleteMergeMesh == True: + print("Removing merge mesh.") print("Remove tmp Mesh [ " ,current_obj.name, " ] from scene >" ,(bpy.context.scene.unrealtriangulatebool )) bpy.ops.object.mode_set(mode='OBJECT') # set it in object bpy.context.scene.objects.unlink(current_obj) + #if bDeleteMergeMesh == True: + #print("Remove merge Mesh [ " ,current_obj.name, " ] from scene") + #bpy.ops.object.mode_set(mode='OBJECT') # set it in object + #bpy.context.scene.objects.unlink(current_obj) def make_fquat(bquat): quat = FQuat() @@ -1471,11 +1489,39 @@ def parse_animation(blender_scene, blender_armatures, psa_file): psa_file.AddAnimation(anim) print("==== Finish Action Build(s) ====") -exportmessage = "Export Finish" +exportmessage = "Export Finish" + +def meshmerge(selectedobjects): + bpy.ops.object.mode_set(mode='OBJECT') + cloneobjects = [] + if len(selectedobjects) > 1: + print("selectedobjects:",len(selectedobjects)) + count = 0 #reset count + for count in range(len( selectedobjects)): + print("Index:",count) + if selectedobjects[count] != None: + me_da = selectedobjects[count].data.copy() #copy data + me_ob = selectedobjects[count].copy() #copy object + #note two copy two types else it will use the current data or mesh + me_ob.data = me_da + bpy.context.scene.objects.link(me_ob)#link the object to the scene #current object location + print("clone object",me_ob.name) + cloneobjects.append(me_ob) + #bpy.ops.object.mode_set(mode='OBJECT') + for i in bpy.data.objects: i.select = False #deselect all objects + count = 0 #reset count + #bpy.ops.object.mode_set(mode='OBJECT') + for count in range(len( cloneobjects)): + if count == 0: + bpy.context.scene.objects.active = cloneobjects[count] + print("Set Active Object:",cloneobjects[count].name) + cloneobjects[count].select = True + bpy.ops.object.join() + return cloneobjects[0] def fs_callback(filename, context): #this deal with repeat export and the reset settings - global bonedata, BBCount, nbone, exportmessage + global bonedata, BBCount, nbone, exportmessage,bDeleteMergeMesh bonedata = []#clear array BBCount = 0 nbone = 0 @@ -1524,16 +1570,47 @@ def fs_callback(filename, context): print("Mesh Count:",len(blender_meshes)," Armature Count:",len(blender_armature)) print("====================================") print("Checking Mesh Condtion(s):") + #if there 1 mesh in scene add to the array if len(blender_meshes) == 1: print(" - One Mesh Scene") + #if there more than one mesh and one mesh select add to array elif (len(blender_meshes) > 1) and (len(selectmesh) == 1): blender_meshes = [] blender_meshes.append(selectmesh[0]) print(" - One Mesh [Select]") + elif (len(blender_meshes) > 1) and (len(selectmesh) >= 1): + #code build check for merge mesh before ops + print("More than one mesh is selected!") + centermesh = [] + notcentermesh = [] + countm = 0 + for countm in range(len(selectmesh)): + #selectmesh[] + if selectmesh[countm].location.x == 0 and selectmesh[countm].location.y == 0 and selectmesh[countm].location.z == 0: + centermesh.append(selectmesh[countm]) + else: + notcentermesh.append(selectmesh[countm]) + if len(centermesh) > 0: + print("center object found") + blender_meshes = [] + selectmesh = [] + countm = 0 + for countm in range(len(centermesh)): + selectmesh.append(centermesh[countm]) + for countm in range(len(notcentermesh)): + selectmesh.append(notcentermesh[countm]) + blender_meshes.append(meshmerge(selectmesh)) + bDeleteMergeMesh = True + else: + bDeleteMergeMesh = False + bmesh = False + print("center object not found") else: print(" - Too Many Meshes!") print(" - Select One Mesh Object!") bmesh = False + bDeleteMergeMesh = False + print("====================================") print("Checking Armature Condtion(s):") if len(blender_armature) == 1: @@ -1546,7 +1623,7 @@ def fs_callback(filename, context): barmature = False bMeshScale = True bMeshCenter = True - if blender_meshes[0] !=None: + if len(blender_meshes) > 0: if blender_meshes[0].scale.x == 1 and blender_meshes[0].scale.y == 1 and blender_meshes[0].scale.z == 1: #print("Okay") bMeshScale = True @@ -1559,6 +1636,8 @@ def fs_callback(filename, context): else: print("Error, Mesh Object not center.",blender_meshes[0].location) bMeshCenter = False + else: + bmesh = False bArmatureScale = True bArmatureCenter = True if blender_armature[0] !=None: -- GitLab