Browse Source

Working on the blender exporter

Panagiotis Christopoulos Charitos 15 years ago
parent
commit
c889274b10
2 changed files with 64 additions and 60 deletions
  1. 20 21
      blenderscripts/main.py
  2. 44 39
      blenderscripts/mesh.py

+ 20 - 21
blenderscripts/main.py

@@ -1,45 +1,44 @@
 print( "\n\n\n\n\n\n\n---- STARTING EXPORTER ----" )
 
 import sys
+import Blender
 
-from common import *
-reload( sys.modules["common"] )
+"""from common import *
+reload( sys.modules["common"] )"""
 
-from mesh import *
-reload( sys.modules["mesh"] )
+import mesh
+reload(sys.modules["mesh"])
 
-from skeleton import *
-reload( sys.modules["skeleton"] )
+import skeleton
+reload(sys.modules["skeleton"])
 
 from material import *
-reload( sys.modules["material"] )
+reload(sys.modules["material"])
 
 
-cmnts = true
-path = "/home/godlike/src/3d_engine/models/imp/"
-epath = "/home/godlike/src/3d_engine/"
+def foo(m):
+	print(m.blMesh)
+
 
 objs = Blender.Object.GetSelected()
 
 if len(objs) < 1:
-	ERROR( "Not selected objs" )
+	raise RuntimeError("Not selected objs")
 
 for obj in objs:
-	mi = mesh_init_t()
-	
-	mi.mesh = GetMesh( obj )
-	mi.skeleton = GetSkeleton( obj )
-	mi.save_path = path
-	mi.write_comments = true
-	mtl = GetMaterial( mi.mesh )
-	mi.material_filename = "models/imp/" + mtl.getName() + ".mtl"
+	mi = mesh.Initializer()
 	
+	mi.blMesh = mesh.getBlMeshFromBlObj(obj)
+	mi.blSkeleton = skeleton.GetSkeleton(obj)
+	mi.saveDir = "/home/godlike/src/anki/models/imp/"
+	#mtl = GetMaterial( mi.mesh )
+	mi.mtlName = "models/imp/imp.mtl"
 	
 	
-	ExportMesh( mi )
+	mesh.export(mi)
 	#ExportSkeleton( path, skel, cmnts )
 	#ExportVWeights( path, mesh, skel, cmnts )
 	#ExportMaterial( path, epath, mtl, cmnts )
 
 
-print( "---- ENDING EXPORTER ----" )
+print("---- ENDING EXPORTER ----")

+ 44 - 39
blenderscripts/mesh.py

@@ -1,4 +1,6 @@
 import sys
+import common
+import os
 from copy import copy
 from Blender import Mathutils
 from Blender.Mathutils import *
@@ -6,32 +8,35 @@ from Numeric import *
 
 
 #=======================================================================================================================
-# MeshInitializer                                                                                                      =
+# Initializer                                                                                                      =
 #=======================================================================================================================
-class MeshInitializer:
-	blMesh = 0  # Blender Mesh
-	blSkeleton = 0 # Blender Armature
-	mtlName = "" # Material name
-	saveDir = "" # the name of the saved file
+class Initializer:
+	def __init__(self):
+		self.blMesh = None  # Blender Mesh
+		self.blSkeleton = None # Blender Armature
+		self.mtlName = "" # Material name
+		self.saveDir = "" # the name of the saved file
 	
 
 #=======================================================================================================================
 # Vert                                                                                                                 =
 #=======================================================================================================================
 class Vert:
-	x = 0.0
-	y = 0.0
-	z = 0.0
-	s = 0.0
-	t = 0.0
-	nextId = -1 # shows the next vertId. Is != -1 if the vert is problematic
+	def __init__(self):
+		self.x = 0.0
+		self.y = 0.0
+		self.z = 0.0
+		self.s = 0.0
+		self.t = 0.0
+		self.nextId = -1 # shows the next vertId. Is != -1 if the vert is problematic
 
 
 #=======================================================================================================================
 # Tri                                                                                                                  =
 #=======================================================================================================================
 class Tri:
-	vertIds[3]
+	def __init__(self):
+		self.vertIds = [-1, -1, -1]
 
 
 #=======================================================================================================================
@@ -117,7 +122,7 @@ def getAnkiVertWeights(mesh, skeleton):
 #=======================================================================================================================
 # getAnkiMeshScript                                                                                                    =
 #=======================================================================================================================
-def	getAnkiMeshScript(mesh, skeleton, mtlName)
+def	getAnkiMeshScript(mesh, skeleton, mtlName):
 	# check verts number
 	vertsNum = len(mesh.verts)
 	if vertsNum < 3:
@@ -125,7 +130,7 @@ def	getAnkiMeshScript(mesh, skeleton, mtlName)
 	
 	# declare some vars
 	ankiVerts = {}
-	ankiTris = {}
+	ankiTris = [Tri() for tri in range(len(mesh.faces))]
 	hasUvs = 0
 
 
@@ -139,14 +144,14 @@ def	getAnkiMeshScript(mesh, skeleton, mtlName)
 			if len(face.verts) != 3:
 				raise RuntimeError("Only triangles are accepted")
 			
-			ankiTris[i] = Tris() # create new tri
+			ankiTris[i] = Tri() # create new tri
 			
 			# for verts in the face
 			for j in [0, 1, 2]:
 				vertId = face.verts[j].index
 			
 				# vert does not exist
-				if not ankiVerts.has_key(vertId)
+				if not ankiVerts.has_key(vertId):
 					ankiVerts[vertId] = Vert()
 					ankiVerts[vertId].x = mesh.verts[vertId].co.x
 					ankiVerts[vertId].y = mesh.verts[vertId].co.y
@@ -157,15 +162,16 @@ def	getAnkiMeshScript(mesh, skeleton, mtlName)
 				
 					ankiTris[i].vertIds[j] = vertId
 				else:
+					prevId = -1
 					while 1:
 						# if in end of the list, create new vert and link list
 						if vertId == -1:
-							ankiVerts[vertsNum] = copy(ankiVerts[vertId])
+							ankiVerts[vertsNum] = copy.copy(ankiVerts[prevId])
 							ankiVerts[vertsNum].s = face.uv[j].x
 							ankiVerts[vertsNum].t = face.uv[j].y
 							ankiVerts[vertsNum].nextId = -1
 	
-							ankiVerts[vertId].nextId = vertsNum
+							ankiVerts[prevId].nextId = vertsNum
 						
 							ankiTris[i].vertIds[j] = vertsNum
 						
@@ -177,6 +183,7 @@ def	getAnkiMeshScript(mesh, skeleton, mtlName)
 							break;
 						# move to next node
 						else:
+							prevId = vertId
 							vertId = ankiVerts[vertId].nextId
 	# no UVs
 	else:
@@ -197,13 +204,11 @@ def	getAnkiMeshScript(mesh, skeleton, mtlName)
 			
 			if len(face.verts) != 3:
 				raise RuntimeError("Only triangles are accepted")
-			
-			ankiTris[i] = Tri()
-			
+		
 			for j in [0, 1, 2]:
 				ankiTris[i].vertIds[j] = face.verts[j].index
-	
-	
+		
+		
 	# write to ftxt
 	
 	# write mtl name
@@ -211,7 +216,8 @@ def	getAnkiMeshScript(mesh, skeleton, mtlName)
 	
 	# write verts
 	ftxt += str(len(ankiVerts)) + "\n"
-	for ankiVert in ankiVerts:
+	for i in range(len(ankiVerts)):
+		ankiVert = ankiVerts[i]
 		ftxt += str(ankiVert.x) + " " + str(ankiVert.y) + " " + str(ankiVert.z) + "\n"
 		
 	# write the tris
@@ -222,38 +228,37 @@ def	getAnkiMeshScript(mesh, skeleton, mtlName)
 	# write the UVs
 	if hasUvs:
 		ftxt += str(len(ankiVerts)) + "\n"
-		for ankiVert in ankiVerts:
-			ftxt += str(ankiVert.s) + " " + str(ankiVert.t) + "\n"
+		for i in range(len(ankiVerts)):
+			ftxt += str(ankiVerts[i].s) + " " + str(ankiVerts[i].t) + "\n"
 	else:
 		ftxt += "0\n"
 	
 	# write the vert weights
-	if skeleton != 0:
-		ftxt += getAnkiVertWeights(meshInit)
+	if skeleton != None:
+		ftxt += getAnkiVertWeights(mesh, skeleton)
 	else:
 		ftxt += "0\n"
+
+	return ftxt
 			
 		
 #=======================================================================================================================
-# exportMesh                                                                                                           =
+# export                                                                                                               =
 #=======================================================================================================================
-def exportMesh(meshInit):
-	mesh = meshInit.mesh
-	skeleton = meshInit.skeleton
+def export(meshInit):
+	mesh = meshInit.blMesh
+	skeleton = meshInit.blSkeleton
 	
 	#check if mesh is the correct class
 	if mesh.__class__.__name__ != "Blender Mesh":
 		raise RuntimeError("The given func param is not a \"Blender Mesh\" class but a \"" + mesh.__class__.__name__ + "\"")
-		return false
 	
-	if skeleton != 0:
+	if skeleton != None:
 		#check if skeleton is the correct class
 		if(skeleton.__class__.__name__ != "Armature"):
 			raise RuntimeError("The given func param is not a \"Armature\" class but a \"" + skeleton.__class__.__name__ + "\"")
-			return false
 	
 	print("Trying to export mesh \"" + mesh.name + "\"")
 	filename = os.path.abspath(meshInit.saveDir + mesh.name + ".mesh")
-	WriteFile(filename, getAnkiMeshScript(mesh, skeleton, meshInit.mtlName))
-	print("Mesh exported!! \"" + filename + "\"")	
-
+	common.WriteFile(filename, getAnkiMeshScript(mesh, skeleton, meshInit.mtlName))
+	print("Mesh exported!! \"" + filename + "\"")