[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22409] branches/soc-2009-kazanbas: - converted 3ds exporter to 2.5 API

Arystanbek Dyussenov arystan.d at gmail.com
Wed Aug 12 18:37:07 CEST 2009


Revision: 22409
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22409
Author:   kazanbas
Date:     2009-08-12 18:37:05 +0200 (Wed, 12 Aug 2009)

Log Message:
-----------
- converted 3ds exporter to 2.5 API
- added Object.is_visible() RNA function to determine if an object is on the visible layer of active scene

Modified Paths:
--------------
    branches/soc-2009-kazanbas/release/io/export_3ds.py
    branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_object_api.c

Modified: branches/soc-2009-kazanbas/release/io/export_3ds.py
===================================================================
--- branches/soc-2009-kazanbas/release/io/export_3ds.py	2009-08-12 15:55:15 UTC (rev 22408)
+++ branches/soc-2009-kazanbas/release/io/export_3ds.py	2009-08-12 16:37:05 UTC (rev 22409)
@@ -47,6 +47,8 @@
 ######################################################
 
 import struct
+import os
+import time
 
 import bpy
 
@@ -142,7 +144,8 @@
 SCL_TRACK_TAG			= int("0xB022",16);
 
 def uv_key(uv):
-	return round(uv.x, 6), round(uv.y, 6)
+	return round(uv[0], 6), round(uv[1], 6)
+# 	return round(uv.x, 6), round(uv.y, 6)
 
 # size defines:	
 SZ_SHORT = 2
@@ -275,7 +278,8 @@
 		return 3
 	
 	def write(self,file):
-		file.write( struct.pack('<3c', chr(int(255*self.r)), chr(int(255*self.g)), chr(int(255*self.b)) ) )
+		file.write( struct.pack('<3B', int(255*self.r), int(255*self.g), int(255*self.b) ) )
+# 		file.write( struct.pack('<3c', chr(int(255*self.r)), chr(int(255*self.g)), chr(int(255*self.b)) ) )
 	
 	def __str__(self):
 		return '{%f, %f, %f}' % (self.r, self.g, self.b)
@@ -427,15 +431,20 @@
 
 def get_material_images(material):
 	# blender utility func.
-	images = []
 	if material:
-		for mtex in material.getTextures():
-			if mtex and mtex.tex.type == Blender.Texture.Types.IMAGE:
-				image = mtex.tex.image
-				if image:
-					images.append(image) # maye want to include info like diffuse, spec here.
-	return images
+		return [s.texture.image for s in material.textures if s and s.texture.type == 'IMAGE' and s.texture.image]
 
+	return []
+# 	images = []
+# 	if material:
+# 		for mtex in material.getTextures():
+# 			if mtex and mtex.tex.type == Blender.Texture.Types.IMAGE:
+# 				image = mtex.tex.image
+# 				if image:
+# 					images.append(image) # maye want to include info like diffuse, spec here.
+# 	return images
+
+
 def make_material_subchunk(id, color):
 	'''Make a material subchunk.
 	
@@ -457,7 +466,8 @@
 	mat_sub = _3ds_chunk(id)
 	
 	def add_image(img):
-		filename = image.filename.split('\\')[-1].split('/')[-1]
+		filename = os.path.basename(image.filename)
+# 		filename = image.filename.split('\\')[-1].split('/')[-1]
 		mat_sub_file = _3ds_chunk(MATMAPFILE)
 		mat_sub_file.add_variable("mapfile", _3ds_string(sane_name(filename)))
 		mat_sub.add_subchunk(mat_sub_file)
@@ -485,9 +495,12 @@
 		material_chunk.add_subchunk(make_material_subchunk(MATSPECULAR, (1,1,1) ))
 	
 	else:
-		material_chunk.add_subchunk(make_material_subchunk(MATAMBIENT, [a*material.amb for a in material.rgbCol] ))
-		material_chunk.add_subchunk(make_material_subchunk(MATDIFFUSE, material.rgbCol))
-		material_chunk.add_subchunk(make_material_subchunk(MATSPECULAR, material.specCol))
+		material_chunk.add_subchunk(make_material_subchunk(MATAMBIENT, [a*material.ambient for a in material.diffuse_color] ))
+# 		material_chunk.add_subchunk(make_material_subchunk(MATAMBIENT, [a*material.amb for a in material.rgbCol] ))
+		material_chunk.add_subchunk(make_material_subchunk(MATDIFFUSE, material.diffuse_color))
+# 		material_chunk.add_subchunk(make_material_subchunk(MATDIFFUSE, material.rgbCol))
+		material_chunk.add_subchunk(make_material_subchunk(MATSPECULAR, material.specular_color))
+# 		material_chunk.add_subchunk(make_material_subchunk(MATSPECULAR, material.specCol))
 		
 		images = get_material_images(material) # can be None
 		if image: images.append(image)
@@ -516,28 +529,38 @@
 	
 	If the mesh contains quads, they will be split into triangles.'''
 	tri_list = []
-	do_uv = mesh.faceUV
+	do_uv = len(mesh.uv_textures)
+# 	do_uv = mesh.faceUV
 	
-	if not do_uv:
-		face_uv = None
+# 	if not do_uv:
+# 		face_uv = None
 	
 	img = None
-	for face in mesh.faces:
-		f_v = face.v
+	for i, face in enumerate(mesh.faces):
+		f_v = face.verts
+# 		f_v = face.v
+
+		uf = mesh.active_uv_texture.data[i] if do_uv else None
 		
 		if do_uv:
-			f_uv = face.uv
-			img = face.image
+			f_uv =  (uf.uv1, uf.uv2, uf.uv3, uf.uv4) if face.verts[3] else (uf.uv1, uf.uv2, uf.uv3)
+# 			f_uv = face.uv
+			img = uf.image if uf else None
+# 			img = face.image
 			if img: img = img.name
-		
-		if len(f_v)==3:
-			new_tri = tri_wrapper((f_v[0].index, f_v[1].index, f_v[2].index), face.mat, img)
+
+		if f_v[3] == 0:
+		# if len(f_v)==3:
+			new_tri = tri_wrapper((f_v[0], f_v[1], f_v[2]), face.material_index, img)
+# 			new_tri = tri_wrapper((f_v[0].index, f_v[1].index, f_v[2].index), face.mat, img)
 			if (do_uv): new_tri.faceuvs= uv_key(f_uv[0]), uv_key(f_uv[1]), uv_key(f_uv[2])
 			tri_list.append(new_tri)
 		
 		else: #it's a quad
-			new_tri = tri_wrapper((f_v[0].index, f_v[1].index, f_v[2].index), face.mat, img)
-			new_tri_2 = tri_wrapper((f_v[0].index, f_v[2].index, f_v[3].index), face.mat, img)
+			new_tri = tri_wrapper((f_v[0], f_v[1], f_v[2]), face.material_index, img)
+# 			new_tri = tri_wrapper((f_v[0].index, f_v[1].index, f_v[2].index), face.mat, img)
+			new_tri_2 = tri_wrapper((f_v[0], f_v[2], f_v[3]), face.material_index, img)
+# 			new_tri_2 = tri_wrapper((f_v[0].index, f_v[2].index, f_v[3].index), face.mat, img)
 			
 			if (do_uv):
 				new_tri.faceuvs= uv_key(f_uv[0]), uv_key(f_uv[1]), uv_key(f_uv[2])
@@ -629,7 +652,8 @@
 	face_list = _3ds_array()
 	
 	
-	if mesh.faceUV:
+	if len(mesh.uv_textures):
+# 	if mesh.faceUV:
 		# Gather materials used in this mesh - mat/image pairs
 		unique_mats = {}
 		for i,tri in enumerate(tri_list):
@@ -706,7 +730,8 @@
 	# Extract the triangles from the mesh:
 	tri_list = extract_triangles(mesh)
 	
-	if mesh.faceUV:
+	if len(mesh.uv_textures):
+# 	if mesh.faceUV:
 		# Remove the face UVs and convert it to vertex UV:
 		vert_array, uv_array, tri_list = remove_face_uv(mesh.verts, tri_list)
 	else:
@@ -715,10 +740,13 @@
 		for vert in mesh.verts:
 			vert_array.add(_3ds_point_3d(vert.co))
 		# If the mesh has vertex UVs, create an array of UVs:
-		if mesh.vertexUV:
+		if len(mesh.sticky):
+# 		if mesh.vertexUV:
 			uv_array = _3ds_array()
-			for vert in mesh.verts:
-				uv_array.add(_3ds_point_uv(vert.uvco))
+			for uv in mesh.sticky:
+# 			for vert in mesh.verts:
+				uv_array.add(_3ds_point_uv(uv.co))
+# 				uv_array.add(_3ds_point_uv(vert.uvco))
 		else:
 			# no UV at all:
 			uv_array = None
@@ -878,7 +906,7 @@
 #		return
 
 	# XXX
-	time1 = bpy.sys.time()
+	time1 = time.clock()
 #	time1= Blender.sys.time()
 #	Blender.Window.WaitCursor(1)
 
@@ -909,31 +937,56 @@
 	# each material is added once):
 	materialDict = {}
 	mesh_objects = []
-	for ob in context.selected_objects:
+	for ob in [ob for ob in context.scene.objects if ob.is_visible()]:
 # 	for ob in sce.objects.context:
-		for ob_derived, mat in getDerivedObjects(ob, False):
-			data = getMeshFromObject(ob_derived, None, True, False, sce)
+
+		# get derived objects
+		derived = []
+
+		# ignore dupli children
+		if ob.parent and ob.parent.dupli_type != 'NONE':
+			continue
+
+		if ob.dupli_type != 'NONE':
+			ob.create_dupli_list()
+			derived = [(dob.object, dob.matrix) for dob in ob.dupli_list]
+		else:
+			derived = [(ob, ob.matrix)]
+
+		for ob_derived, mat in derived:
+# 		for ob_derived, mat in getDerivedObjects(ob, False):
+
+			if ob.type not in ('MESH', 'CURVE', 'SURFACE', 'TEXT', 'META'):
+				continue
+
+			data = ob_derived.create_mesh(True, 'PREVIEW')
+# 			data = getMeshFromObject(ob_derived, None, True, False, sce)
 			if data:
-				data.transform(mat, recalc_normals=False)
+				data.transform(mat)
+# 				data.transform(mat, recalc_normals=False)
 				mesh_objects.append((ob_derived, data))
 				mat_ls = data.materials
 				mat_ls_len = len(mat_ls)
+
 				# get material/image tuples.
-				if data.faceUV:
+				if len(data.uv_textures):
+# 				if data.faceUV:
 					if not mat_ls:
 						mat = mat_name = None
 					
-					for f in data.faces:
+					for f, uf in zip(data.faces, data.active_uv_texture.data):
 						if mat_ls:
-							mat_index = f.mat
+							mat_index = f.material_index
+# 							mat_index = f.mat
 							if mat_index >= mat_ls_len:
 								mat_index = f.mat = 0
 							mat = mat_ls[mat_index]
 							if mat:	mat_name = mat.name
 							else:	mat_name = None
 						# else there alredy set to none
-							
-						img = f.image
+
+						img = uf.image
+# 						img = f.image
 						if img:	img_name = img.name
 						else:	img_name = None
 						
@@ -947,8 +1000,10 @@
 					
 					# Why 0 Why!
 					for f in data.faces:
-						if f.mat >= mat_ls_len:
-							f.mat = 0 
+						if f.material_index >= mat_ls_len:
+# 						if f.mat >= mat_ls_len:
+							f.material_index = 0
+# 							f.mat = 0
 	
 	# Make material chunks for all materials used in the meshes:
 	for mat_and_image in materialDict.values():
@@ -980,7 +1035,10 @@
 		# make a kf object node for the object:
 		kfdata.add_subchunk(make_kf_obj_node(ob, name_to_id))
 		'''
-		blender_mesh.verts = None
+# 		if not blender_mesh.users:
+		bpy.data.remove_mesh(blender_mesh)
+# 		blender_mesh.verts = None
+
 		i+=i
 
 	# Create chunks for all empties:
@@ -1013,8 +1071,9 @@
 	file.close()
 	
 	# Debugging only: report the exporting time:
-	Blender.Window.WaitCursor(0)
-	print("3ds export time: %.2f" % (Blender.sys.time() - time1))
+# 	Blender.Window.WaitCursor(0)
+	print("3ds export time: %.2f" % (time.clock() - time1))
+# 	print("3ds export time: %.2f" % (Blender.sys.time() - time1))
 	
 	# Debugging only: dump the chunk hierarchy:
 	#primary.dump()
@@ -1042,7 +1101,7 @@
 	]
 	
 	def execute(self, context):
-		raise Exception("Not doing anything yet.")
+		save_3ds(self.filename, context)
 		return ('FINISHED',)
 	
 	def invoke(self, context, event):

Modified: branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_object_api.c
===================================================================
--- branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_object_api.c	2009-08-12 15:55:15 UTC (rev 22408)
+++ branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_object_api.c	2009-08-12 16:37:05 UTC (rev 22409)
@@ -333,6 +333,11 @@
 	return ob_arm;
 }
 
+int rna_Object_is_visible(Object *ob, bContext *C)
+{
+	return ob->lay & CTX_data_scene(C)->lay;
+}
+
 /*
 static void rna_Mesh_assign_verts_to_group(Object *ob, bDeformGroup *group, int *indices, int totindex, float weight, int assignmode)
 {
@@ -443,6 +448,13 @@
 	func= RNA_def_function(srna, "make_display_list", "rna_Object_make_display_list");
 	RNA_def_function_ui_description(func, "Update object's display data."); /* XXX describe better */
 	RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+
+	/* View */

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list