Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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