diff --git a/io_export_unreal_psk_psa.py b/io_export_unreal_psk_psa.py index 1f0fffd2ab6be2a2c63fce7671d6baff53466243..dcc1847faae76e6fae4e7343a351aa1e264d2aa2 100644 --- a/io_export_unreal_psk_psa.py +++ b/io_export_unreal_psk_psa.py @@ -113,7 +113,6 @@ MaterialName = [] # ====================================================================== # TODO: remove this 1am hack nbone = 0 -bDeleteMergeMesh = False exportmessage = "Export Finish" ######################################################################## @@ -607,57 +606,59 @@ def is_1d_face(blender_face,mesh): mesh.vertices[v1].co == mesh.vertices[v2].co or \ mesh.vertices[v2].co == mesh.vertices[v0].co) return False +#blender 2.63 format using the Operators/Commands to merge the meshes into one +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: + cloneobjects.append(selectedobjects[count]) + for i in bpy.data.objects: i.select = False #deselect all objects + count = 0 #reset count + 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] ################################################## # http://en.wikibooks.org/wiki/Blender_3D:_Blending_Into_Python/Cookbook#Triangulate_NMesh -#blender 2.50 format using the Operators/command convert the mesh to tri mesh +#blender 2.63 format using the Operators/Commands to convert the mesh to tri mesh def triangulateNMesh(object): - global bDeleteMergeMesh - bneedtri = False + print("Converting quad to tri mesh...") scene = bpy.context.scene bpy.ops.object.mode_set(mode='OBJECT') for i in scene.objects: i.select = False #deselect all objects object.select = True scene.objects.active = object #set the mesh object to current bpy.ops.object.mode_set(mode='OBJECT') - print("Checking mesh if needs to convert quad to Tri...") - for face in object.data.faces: - if (len(face.vertices) > 3): - bneedtri = True - break - - bpy.ops.object.mode_set(mode='OBJECT') - if bneedtri == True: - print("Converting quad to tri mesh...") - me_da = object.data.copy() #copy data - me_ob = object.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 - for i in scene.objects: i.select = False #deselect all objects - me_ob.select = True - scene.objects.active = me_ob #set the mesh object to current - bpy.ops.object.mode_set(mode='EDIT') #Operators - bpy.ops.mesh.select_all(action='SELECT')#select all the face/vertex/edge - bpy.ops.mesh.quads_convert_to_tris() #Operators - bpy.context.scene.update() - bpy.ops.object.mode_set(mode='OBJECT') # set it in object - bpy.context.scene.unrealtriangulatebool = True - print("Triangulate Mesh Done!") - if bDeleteMergeMesh == True: - print("Remove Merge tmp Mesh [ " ,object.name, " ] from scene!" ) - bpy.ops.object.mode_set(mode='OBJECT') # set it in object - bpy.context.scene.objects.unlink(object) - else: - bpy.context.scene.unrealtriangulatebool = False - print("No need to convert tri mesh.") - me_ob = object + me_da = object.data.copy() #copy data + me_ob = object.copy() #copy object + #note two copy two types else it will use the current data or mesh + me_ob.data = me_da + scene = bpy.context.scene + bpy.context.scene.objects.link(me_ob)#link the object to the scene #current object location + for i in scene.objects: i.select = False #deselect all objects + me_ob.select = True + scene.objects.active = me_ob #set the mesh object to current + bpy.ops.object.mode_set(mode='EDIT') #Operators + bpy.ops.mesh.select_all(action='SELECT')#select all the face/vertex/edge + bpy.ops.mesh.quads_convert_to_tris() #Operators + bpy.context.scene.update() + bpy.ops.object.mode_set(mode='OBJECT') # set it in object + print("Triangulate Mesh Done!") return me_ob #Texture not working still find a way to get it work # Actual object parsing functions def parse_meshes(blender_meshes, psk_file): - global bDeleteMergeMesh, exportmessage + global exportmessage print("Number of Object Meshes:",len(blender_meshes)) for current_obj in blender_meshes: #number of mesh that should be one mesh here #material @@ -689,16 +690,23 @@ def parse_meshes(blender_meshes, psk_file): faceUV = None scene = bpy.context.scene #get current scene EXPORT_APPLY_MODIFIERS = True + currentmeshobject = current_obj; + + current_obj = triangulateNMesh(currentmeshobject) #convert tri incase + bpy.context.scene.objects.unlink(currentmeshobject) me = current_obj.to_mesh(scene, EXPORT_APPLY_MODIFIERS, 'PREVIEW') #apply modified mesh and write mesh + #print(dir(me)) + faceuv = len(me.uv_textures) > 0 #check if has uv texture if faceuv: uv_layer = me.tessface_uv_textures.active.data[:] else: + has_UV = False for face in me.tessfaces: - print("Vertices count:",len(face.vertices)) + #print("Vertices count:",len(face.vertices)) #get or create the current material object_material_index = face.material_index psk_file.GetMatByIndex(object_material_index) @@ -712,13 +720,14 @@ def parse_meshes(blender_meshes, psk_file): if not is_1d_face(face,me):#face , Mesh wedge_list = [] vect_list = [] - faceUV = uv_layer[face.index]#UV TEXTURE + for i in range(3): #UV TEXTURE, VERTICES vert_index = face.vertices[i] vert = me.vertices[vert_index] uv = [] if (has_UV): + faceUV = uv_layer[face.index]#UV TEXTURE if len(faceUV.uv) != 3: print ("WARNING: Current face is missing UV coordinates - writing 0,0...") print ("WARNING: Face has more than 3 UVs - writing 0,0...") @@ -807,10 +816,15 @@ def parse_meshes(blender_meshes, psk_file): #print("smooth:",(current_face.use_smooth)) #not sure if this right #tri.SmoothingGroups + print(face.use_smooth) if face.use_smooth == True: - tri.SmoothingGroups = 1 - else: tri.SmoothingGroups = 0 + else: + tri.SmoothingGroups = 1 + #tri.SmoothingGroups = face.use_smooth + #tri.SmoothingGroups = hex(face.use_smooth) + #print(hex(True)) + print(hex(face.use_smooth)) #tri.SmoothingGroups = 1 tri.MatIndex = object_material_index #print(tri) @@ -864,29 +878,8 @@ def parse_meshes(blender_meshes, psk_file): #bone name, [point id and wieght] #print("Add Vertex Group:",obvgroup.name, " No. Points:",len(vert_list)) psk_file.VertexGroups[obvgroup.name] = vert_list - - #unrealtriangulatebool #this will remove the mesh from the scene - ''' - if (bpy.context.scene.unrealtriangulatebool == True) and (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) - el - ''' - #if bDeleteMergeMesh == True: - #print("Remove Merge 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) - #elif bpy.context.scene.unrealtriangulatebool == True: - #print("Remove tri 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) + #unlink copy of object from scene + bpy.context.scene.objects.unlink(current_obj) def make_fquat(bquat): quat = FQuat() @@ -1473,37 +1466,9 @@ def parse_animation(blender_scene, blender_armatures, psa_file): print("---- Action End ----") print("==== Finish Action Build ====") -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("Index:",count,"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 nbone, exportmessage, bDeleteMergeMesh + global nbone, exportmessage nbone = 0 start_time = time.clock() @@ -1540,7 +1505,9 @@ def fs_callback(filename, context): blender_meshes.append(next_obj) if (next_obj.select): #print("mesh object select") - selectmesh.append(next_obj) + copymesh = next_obj.copy() + bpy.context.scene.objects.link(copymesh) + selectmesh.append(copymesh) if next_obj.type == 'ARMATURE': blender_armature.append(next_obj) if (next_obj.select): @@ -1552,13 +1519,22 @@ def fs_callback(filename, context): print("Checking Mesh Condtion(s):") #if there 1 mesh in scene add to the array if len(blender_meshes) == 1: + mesh = blender_meshes[0] + blender_meshes = [] + blender_meshes.append(mesh.copy()) 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): + if selectmesh[0].location.x != 0 and selectmesh[0].location.y != 0 and selectmesh[0].location.z != 0: + exportmessage = "Error, Mesh Object not Center right should be (0,0,0)." + for mesh in selectmesh:#remove object + bpy.context.scene.objects.unlink(mesh) + return blender_meshes = [] - blender_meshes.append(selectmesh[0]) + copymesh = selectmesh[0] + blender_meshes.append(copymesh) print(" - One Mesh [Select]") - elif (len(blender_meshes) > 1) and (len(selectmesh) >= 1): + elif (len(blender_meshes) > 1) and (len(selectmesh) >= 1):#if there more than one mesh and some area off center check. #code build check for merge mesh before ops print("More than one mesh is selected!") centermesh = [] @@ -1580,42 +1556,50 @@ def fs_callback(filename, context): 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!") + exportmessage = " - Select Mesh(s) For Export!" print(" - Select One Mesh Object!") bmesh = False - bDeleteMergeMesh = False + return print("====================================") print("Checking Armature Condtion(s):") if len(blender_armature) == 1: print(" - One Armature Scene") elif (len(blender_armature) > 1) and (len(selectarmature) == 1): - print(" - One Armature [Select]") - else: print(" - Too Armature Meshes!") - print(" - Select One Armature Object Only!") + print(" - [Select] One Armature!") + else: barmature = False + exportmessage = "None Armature! Create One!" + return bMeshScale = True bMeshCenter = True 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 - else: + elif blender_meshes[0].scale.x != 1 and blender_meshes[0].scale.y != 1 and blender_meshes[0].scale.z != 1: print("Error, Mesh Object not scale right should be (1,1,1).") - bMeshScale = False - if blender_meshes[0].location.x == 0 and blender_meshes[0].location.y == 0 and blender_meshes[0].location.z == 0: + exportmessage = "Error, Mesh Object not scale right should be (1,1,1)." + return + elif blender_meshes[0].location.x == 0 and blender_meshes[0].location.y == 0 and blender_meshes[0].location.z == 0: #print("Okay") bMeshCenter = True - else: + return + elif blender_meshes[0].location.x != 0 and blender_meshes[0].location.y != 0 and blender_meshes[0].location.z != 0: print("Error, Mesh Object not center.",blender_meshes[0].location) + #exportmessage = "Error, Mesh Object not center." + exportmessage = "Error, Mesh Object not center." bMeshCenter = False + return + else: + exportmessage = "Please Select your Meshes that matches that Armature for Export." + return else: bmesh = False bArmatureScale = True @@ -1626,12 +1610,14 @@ def fs_callback(filename, context): bArmatureScale = True else: print("Error, Armature Object not scale right should be (1,1,1).") + exportmessage = "Error, Armature Object not scale right should be (1,1,1)." bArmatureScale = False if blender_armature[0].location.x == 0 and blender_armature[0].location.y == 0 and blender_armature[0].location.z == 0: #print("Okay") bArmatureCenter = True else: print("Error, Armature Object not center.",blender_armature[0].location) + exportmessage = "Error, Armature Object not center." bArmatureCenter = False