def exportMesh(meshObject, filepath): result = (False, None) try: LogManager.logMessage("Output: %s" % filepath, Message.LVL_INFO) # get combined mesh override & global settings. meshExportSettings = MeshExportSettings.fromRNA(meshObject) # If modifiers need to be applied, we will need to create a new mesh with flattened modifiers. LogManager.logMessage("Apply Modifier: %s" % meshExportSettings.applyModifiers, Message.LVL_INFO) if (meshExportSettings.applyModifiers): mesh = meshObject.to_mesh(bpy.context.scene, True, 'PREVIEW') cleanUpMesh = True else: mesh = meshObject.data cleanUpMesh = False # prepare mesh. ogreMesh = Mesh(mesh, meshExportSettings) LogManager.logMessage("Shared Vertices: %d" % len(ogreMesh.mSharedVertexBuffer.mVertexData), Message.LVL_INFO); LogManager.logMessage("Submeshes: %d" % len(ogreMesh.mSubMeshDict), Message.LVL_INFO); for index, submesh in enumerate(ogreMesh.mSubMeshDict.values()): if (submesh.mShareVertexBuffer): continue LogManager.logMessage(" [%d]%s: vertices: %d" % (index, submesh.mName if (submesh.mName) else '' , len(submesh.mVertexBuffer.mVertexData)), Message.LVL_INFO); # write mesh. file = open(filepath, "w", encoding="utf8", newline="\n") ogreMesh.serialize(file) file.close() # remove mesh if we created a new one that has modifiers applied. if (cleanUpMesh): bpy.data.meshes.remove(mesh) ogreMesh = None LogManager.logMessage("Done exporting XML.") # check if we need to convert to ogre mesh. if (meshExportSettings.runOgreXMLConverter): globalSettings = bpy.context.scene.ogre_mesh_exporter LogManager.logMessage("Converting mesh to Ogre binary format...") result = convertToOgreMesh(globalSettings.ogreXMLConverterPath, filepath, MeshXMLConverterSettings.fromRNA(meshObject)) else: LogManager.logMessage("Success!") result[0] = True except IOError as err: LogManager.logMessage("I/O error(%d): %s" % (err.errno, err.strerror), Message.LVL_ERROR) except Exception as err: LogManager.logMessage(str(err), Message.LVL_ERROR) except: traceback.print_exc() return result
def exportMesh(meshObject, filepath): result = list() try: LogManager.logMessage("Output: %s.mesh.xml" % filepath, Message.LVL_INFO) # get combined mesh override & global settings. meshExportSettings = MeshExportSettings.fromRNA(meshObject) if (meshExportSettings.runOgreXMLConverter): meshXMLConverterSettings = MeshXMLConverterSettings.fromRNA(meshObject) # get linked armature armatureObject = None ogreSkeleton = None parentObject = meshObject.parent if (parentObject and meshObject.parent_type == 'ARMATURE'): armatureObject = parentObject else: # check modifier stack, use first valid armature modifier. for modifier in meshObject.modifiers: if (modifier.type == 'ARMATURE' and (modifier.use_vertex_groups or modifier.use_bone_envelopes)): armatureObject = modifier.object # Do skeleton export first if armature exist. if (armatureObject): # get skeleton file path and name. if (meshExportSettings.skeletonNameFollowMesh): skeletonFilePath = filepath + '.skeleton.xml'; skeletonName = os.path.basename(filepath) else: dirname = os.path.dirname(filepath) skeletonFilePath = dirname + armatureObject.data.name + '.skeleton.xml'; skeletonName = armatureObject.data.name LogManager.logMessage("Skeleton: " + skeletonName, Message.LVL_INFO); # prepare skeleton. meshInverseMatrix = meshObject.matrix_world.inverted() ogreSkeleton = Skeleton(skeletonName, armatureObject, meshInverseMatrix, meshExportSettings.fixUpAxisToY) LogManager.logMessage("Bones: %d" % len(ogreSkeleton.mBones), Message.LVL_INFO); # write skeleton. file = open(skeletonFilePath, "w", encoding="utf8", newline="\n") ogreSkeleton.serialize(file) file.close() LogManager.logMessage("Done exporting skeleton XML.") # Run XML Converter if needed. if (meshExportSettings.runOgreXMLConverter): globalSettings = bpy.context.scene.ogre_mesh_exporter LogManager.logMessage("Converting skeleton to Ogre binary format...") result.append(executeOgreXMLConverter(globalSettings.ogreXMLConverterPath, skeletonFilePath, meshXMLConverterSettings)) # If modifiers need to be applied, we will need to create a new mesh with flattened modifiers. LogManager.logMessage("Apply Modifier: %s" % meshExportSettings.applyModifiers, Message.LVL_INFO) if (meshExportSettings.applyModifiers): mesh = meshObject.to_mesh(bpy.context.scene, True, 'PREVIEW') cleanUpMesh = True else: mesh = meshObject.data cleanUpMesh = False # prepare mesh. ogreMesh = Mesh(mesh, meshObject.vertex_groups, ogreSkeleton, meshExportSettings) LogManager.logMessage("Shared Vertices: %d" % len(ogreMesh.mSharedVertexBuffer.mVertexData), Message.LVL_INFO); LogManager.logMessage("Submeshes: %d" % len(ogreMesh.mSubMeshDict), Message.LVL_INFO); for index, submesh in enumerate(ogreMesh.mSubMeshDict.values()): if (submesh.mShareVertexBuffer): continue LogManager.logMessage(" [%d]%s: vertices: %d" % (index, submesh.mName if (submesh.mName) else '' , len(submesh.mVertexBuffer.mVertexData)), Message.LVL_INFO); # write mesh. meshFilePath = filepath + ".mesh.xml" file = open(meshFilePath, "w", encoding="utf8", newline="\n") ogreMesh.serialize(file) file.close() # remove mesh if we created a new one that has modifiers applied. if (cleanUpMesh): bpy.data.meshes.remove(mesh) ogreMesh = None LogManager.logMessage("Done exporting mesh XML.") # Run XML Converter if needed. if (meshExportSettings.runOgreXMLConverter): globalSettings = bpy.context.scene.ogre_mesh_exporter LogManager.logMessage("Converting mesh to Ogre binary format...") result.append(executeOgreXMLConverter(globalSettings.ogreXMLConverterPath, meshFilePath, meshXMLConverterSettings)) else: LogManager.logMessage("Success!") except IOError as err: LogManager.logMessage("I/O error(%d): %s" % (err.errno, err.strerror), Message.LVL_ERROR) result.append(False) #~ except Exception as err: #~ LogManager.logMessage(str(err), Message.LVL_ERROR) #~ result.append(False) #~ except: #~ traceback.print_exc() #~ result.append(False) return result
def exportMesh(meshObject, filepath): result = list() try: LogManager.logMessage("Output: %s.mesh.xml" % filepath, Message.LVL_INFO) # get combined mesh override & global settings. meshExportSettings = MeshExportSettings.fromRNA(meshObject) if (meshExportSettings.runOgreXMLConverter): meshXMLConverterSettings = MeshXMLConverterSettings.fromRNA(meshObject) # get linked armature parentObject = meshObject.parent if (parentObject and meshObject.parent_type == 'ARMATURE'): armatureObject = parentObject else: # check modifier stack, use first valid armature modifier. for modifier in meshObject.modifiers: if (modifier.type == 'ARMATURE' and (modifier.use_vertex_groups or modifier.use_bone_envelopes)): armatureObject = modifier.object # Do skeleton export first if armature exist. if (armatureObject): # get skeleton file path and name. if (meshExportSettings.skeletonNameFollowMesh): skeletonFilePath = filepath + '.skeleton.xml'; skeletonName = os.path.basename(filepath) else: dirname = os.path.dirname(filepath) skeletonFilePath = dirname + armatureObject.data.name + '.skeleton.xml'; skeletonName = armatureObject.data.name LogManager.logMessage("Skeleton: " + skeletonName, Message.LVL_INFO); # prepare skeleton. meshInverseMatrix = meshObject.matrix_world.inverted() ogreSkeleton = Skeleton(skeletonName, armatureObject, meshInverseMatrix, meshExportSettings.fixUpAxisToY) LogManager.logMessage("Bones: %d" % len(ogreSkeleton.mBones), Message.LVL_INFO); # write skeleton. file = open(skeletonFilePath, "w", encoding="utf8", newline="\n") ogreSkeleton.serialize(file) file.close() LogManager.logMessage("Done exporting skeleton XML.") # Run XML Converter if needed. if (meshExportSettings.runOgreXMLConverter): globalSettings = bpy.context.scene.ogre_mesh_exporter LogManager.logMessage("Converting skeleton to Ogre binary format...") result.append(executeOgreXMLConverter(globalSettings.ogreXMLConverterPath, skeletonFilePath, meshXMLConverterSettings)) # If modifiers need to be applied, we will need to create a new mesh with flattened modifiers. LogManager.logMessage("Apply Modifier: %s" % meshExportSettings.applyModifiers, Message.LVL_INFO) if (meshExportSettings.applyModifiers): mesh = meshObject.to_mesh(bpy.context.scene, True, 'PREVIEW') cleanUpMesh = True else: mesh = meshObject.data cleanUpMesh = False # prepare mesh. ogreMesh = Mesh(mesh, meshObject.vertex_groups, ogreSkeleton, meshExportSettings) LogManager.logMessage("Shared Vertices: %d" % len(ogreMesh.mSharedVertexBuffer.mVertexData), Message.LVL_INFO); LogManager.logMessage("Submeshes: %d" % len(ogreMesh.mSubMeshDict), Message.LVL_INFO); for index, submesh in enumerate(ogreMesh.mSubMeshDict.values()): if (submesh.mShareVertexBuffer): continue LogManager.logMessage(" [%d]%s: vertices: %d" % (index, submesh.mName if (submesh.mName) else '' , len(submesh.mVertexBuffer.mVertexData)), Message.LVL_INFO); # write mesh. meshFilePath = filepath + ".mesh.xml" file = open(meshFilePath, "w", encoding="utf8", newline="\n") ogreMesh.serialize(file) file.close() # remove mesh if we created a new one that has modifiers applied. if (cleanUpMesh): bpy.data.meshes.remove(mesh) ogreMesh = None LogManager.logMessage("Done exporting mesh XML.") # Run XML Converter if needed. if (meshExportSettings.runOgreXMLConverter): globalSettings = bpy.context.scene.ogre_mesh_exporter LogManager.logMessage("Converting mesh to Ogre binary format...") result.append(executeOgreXMLConverter(globalSettings.ogreXMLConverterPath, meshFilePath, meshXMLConverterSettings)) else: LogManager.logMessage("Success!") except IOError as err: LogManager.logMessage("I/O error(%d): %s" % (err.errno, err.strerror), Message.LVL_ERROR) result.append(False) #~ except Exception as err: #~ LogManager.logMessage(str(err), Message.LVL_ERROR) #~ result.append(False) #~ except: #~ traceback.print_exc() #~ result.append(False) return result