[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22427] branches/soc-2009-kazanbas: - 3ds importer working (without the "scale to size" option)

Arystanbek Dyussenov arystan.d at gmail.com
Thu Aug 13 13:14:07 CEST 2009


Revision: 22427
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22427
Author:   kazanbas
Date:     2009-08-13 13:14:06 +0200 (Thu, 13 Aug 2009)

Log Message:
-----------
- 3ds importer working (without the "scale to size" option)
- changing object.matrix now updates object.loc/rot/scale
- added bpy.data.add_lamp()

Modified Paths:
--------------
    branches/soc-2009-kazanbas/release/io/import_3ds.py
    branches/soc-2009-kazanbas/release/io/import_obj.py
    branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_main_api.c
    branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_material_api.c
    branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_mesh_api.c
    branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_object.c

Modified: branches/soc-2009-kazanbas/release/io/import_3ds.py
===================================================================
--- branches/soc-2009-kazanbas/release/io/import_3ds.py	2009-08-13 09:30:36 UTC (rev 22426)
+++ branches/soc-2009-kazanbas/release/io/import_3ds.py	2009-08-13 11:14:06 UTC (rev 22427)
@@ -125,9 +125,14 @@
 
 # Importing modules
 
-from struct import calcsize, unpack
+import os
+import time
+import struct
 
+from import_obj import unpack_face_list, load_image
+
 import bpy
+import Mathutils
 
 # import Blender
 # from Blender import Mesh, Object, Material, Image, Texture, Lamp, Mathutils
@@ -149,7 +154,7 @@
 # except:
 # 	from sets import Set as set
 
-BOUNDS_3DS= []
+BOUNDS_3DS = []
 
 
 #this script imports uvcoords as sticky vertex coords
@@ -157,9 +162,9 @@
 #which shold be more useful.
 
 def createBlenderTexture(material, name, image):
-	texture= bpy.data.textures.new(name)
+	texture = bpy.data.textures.new(name)
 	texture.setType('Image')
-	texture.image= image
+	texture.image = image
 	material.setTexture(0, texture, Texture.TexCo.UV, Texture.MapTo.COL)
 
 
@@ -170,7 +175,7 @@
 
 #Some of the chunks that we will see
 #----- Primary Chunk, at the beginning of each file
-PRIMARY= int('0x4D4D',16)
+PRIMARY = int('0x4D4D',16)
 
 #------ Main Chunks
 OBJECTINFO   =      int('0x3D3D',16);      #This gives the version of the mesh and is found right before the material and object information
@@ -178,8 +183,8 @@
 EDITKEYFRAME=      int('0xB000',16);      #This is the header for all of the key frame info
 
 #------ sub defines of OBJECTINFO
-MATERIAL=45055		#0xAFFF				// This stored the texture info
-OBJECT=16384		#0x4000				// This stores the faces, vertices, etc...
+MATERIAL = 45055		#0xAFFF				// This stored the texture info
+OBJECT = 16384		#0x4000				// This stores the faces, vertices, etc...
 
 #>------ sub defines of MATERIAL
 #------ sub defines of MATERIAL_BLOCK
@@ -213,16 +218,16 @@
 OBJECT_LAMP_LOCAL_SHADOW = int('0x4640',16);	
 OBJECT_LAMP_LOCAL_SHADOW2 = int('0x4641',16);	
 OBJECT_LAMP_SEE_CONE = int('0x4650',16);	
-OBJECT_LAMP_SPOT_RECTANGULAR= int('0x4651',16);
-OBJECT_LAMP_SPOT_OVERSHOOT= int('0x4652',16);
-OBJECT_LAMP_SPOT_PROJECTOR= int('0x4653',16);
-OBJECT_LAMP_EXCLUDE= int('0x4654',16);
-OBJECT_LAMP_RANGE= int('0x4655',16);
-OBJECT_LAMP_ROLL= int('0x4656',16);
-OBJECT_LAMP_SPOT_ASPECT= int('0x4657',16);
-OBJECT_LAMP_RAY_BIAS= int('0x4658',16);
-OBJECT_LAMP_INNER_RANGE= int('0x4659',16);
-OBJECT_LAMP_OUTER_RANGE= int('0x465A',16);
+OBJECT_LAMP_SPOT_RECTANGULAR = int('0x4651',16);
+OBJECT_LAMP_SPOT_OVERSHOOT = int('0x4652',16);
+OBJECT_LAMP_SPOT_PROJECTOR = int('0x4653',16);
+OBJECT_LAMP_EXCLUDE = int('0x4654',16);
+OBJECT_LAMP_RANGE = int('0x4655',16);
+OBJECT_LAMP_ROLL = int('0x4656',16);
+OBJECT_LAMP_SPOT_ASPECT = int('0x4657',16);
+OBJECT_LAMP_RAY_BIAS = int('0x4658',16);
+OBJECT_LAMP_INNER_RANGE = int('0x4659',16);
+OBJECT_LAMP_OUTER_RANGE = int('0x465A',16);
 OBJECT_LAMP_MULTIPLIER = int('0x465B',16);
 OBJECT_LAMP_AMBIENT_LIGHT = int('0x4680',16);
 
@@ -241,21 +246,21 @@
 OBJECT_TRANS_MATRIX  =   int('0x4160',16); # The Object Matrix
 
 global scn
-scn= None
+scn = None
 
 #the chunk class
 class chunk:
-	ID=0
-	length=0
-	bytes_read=0
+	ID = 0
+	length = 0
+	bytes_read = 0
 
 	#we don't read in the bytes_read, we compute that
 	binary_format='<HI'
 
 	def __init__(self):
-		self.ID=0
-		self.length=0
-		self.bytes_read=0
+		self.ID = 0
+		self.length = 0
+		self.bytes_read = 0
 
 	def dump(self):
 		print('ID: ', self.ID)
@@ -264,95 +269,107 @@
 		print('bytes_read: ', self.bytes_read)
 
 def read_chunk(file, chunk):
-	temp_data=file.read(calcsize(chunk.binary_format))
-	data=unpack(chunk.binary_format, temp_data)
-	chunk.ID=data[0]
-	chunk.length=data[1]
+	temp_data = file.read(struct.calcsize(chunk.binary_format))
+	data = struct.unpack(chunk.binary_format, temp_data)
+	chunk.ID = data[0]
+	chunk.length = data[1]
 	#update the bytes read function
-	chunk.bytes_read=6
+	chunk.bytes_read = 6
 
 	#if debugging
 	#chunk.dump()
 
 def read_string(file):
 	#read in the characters till we get a null character
-	s=''
-	while not s.endswith('\x00'):
-		s+=unpack( '<c', file.read(1) )[0]
+	s = b''
+# 	s = ''
+	while not s.endswith(b'\x00'):
+# 	while not s.endswith('\x00'):
+		s += struct.unpack('<c', file.read(1))[0]
+# 		s += struct.unpack( '<c', file.read(1) )[0]
 		#print 'string: ',s
-	
+
+	s = str(s[:-1], 'ASCII')
+# 	print("read string", s)
+
 	#remove the null character from the string
-	return s[:-1]
+	return s
+# 	return s[:-1]
 
 ######################################################
 # IMPORT
 ######################################################
 def process_next_object_chunk(file, previous_chunk):
-	new_chunk=chunk()
-	temp_chunk=chunk()
+	new_chunk = chunk()
+	temp_chunk = chunk()
 
-	while (previous_chunk.bytes_read<previous_chunk.length):
+	while (previous_chunk.bytes_read < previous_chunk.length):
 		#read the next chunk
 		read_chunk(file, new_chunk)
 
 def skip_to_end(file, skip_chunk):
-	buffer_size=skip_chunk.length-skip_chunk.bytes_read
+	buffer_size = skip_chunk.length - skip_chunk.bytes_read
 	binary_format='%ic' % buffer_size
-	temp_data=file.read(calcsize(binary_format))
-	skip_chunk.bytes_read+=buffer_size
+	temp_data = file.read(struct.calcsize(binary_format))
+	skip_chunk.bytes_read += buffer_size
 
 
 def add_texture_to_material(image, texture, material, mapto):
-	if mapto=='DIFFUSE':
-		map=Texture.MapTo.COL
-	elif mapto=='SPECULAR':
-		map=Texture.MapTo.SPEC
-	elif mapto=='OPACITY':
-		map=Texture.MapTo.ALPHA
-	elif mapto=='BUMP':
-		map=Texture.MapTo.NOR
-	else:
+# 	if mapto=='DIFFUSE':
+# 		map = Texture.MapTo.COL
+# 	elif mapto=='SPECULAR':
+# 		map = Texture.MapTo.SPEC
+# 	elif mapto=='OPACITY':
+# 		map = Texture.MapTo.ALPHA
+# 	elif mapto=='BUMP':
+# 		map = Texture.MapTo.NOR
+# 	else:
+	if mapto not in ("COLOR", "SPECULARITY", "ALPHA", "NORMAL"):
 		print('/tError:  Cannot map to "%s"\n\tassuming diffuse color. modify material "%s" later.' % (mapto, material.name))
-		map=Texture.MapTo.COL
+		mapto = "COLOR"
+# 		map = Texture.MapTo.COL
 
-	if image: texture.setImage(image) # double check its an image.
-	free_tex_slots= [i for i, tex in enumerate( material.getTextures() ) if tex==None]
-	if not free_tex_slots:
-		print('/tError: Cannot add "%s" map. 10 Texture slots alredy used.' % mapto)
-	else:
-		material.setTexture(free_tex_slots[0],texture,Texture.TexCo.UV,map)
+	if image: texture.image = image
+# 	if image: texture.setImage(image) # double check its an image.
 
+	material.add_texture(texture, "UV", mapto)
+# 	free_tex_slots = [i for i, tex in enumerate( material.getTextures() ) if tex == None]
+# 	if not free_tex_slots:
+# 		print('/tError: Cannot add "%s" map. 10 Texture slots alredy used.' % mapto)
+# 	else:
+# 		material.setTexture(free_tex_slots[0],texture,Texture.TexCo.UV,map)
 
+
 def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
 	#print previous_chunk.bytes_read, 'BYTES READ'
-	contextObName= None
-	contextLamp= [None, None] # object, Data
-	contextMaterial= None
-	contextMatrix_rot= None # Blender.Mathutils.Matrix(); contextMatrix.identity()
-	#contextMatrix_tx= None # Blender.Mathutils.Matrix(); contextMatrix.identity()
-	contextMesh_vertls= None
-	contextMesh_facels= None
-	contextMeshMaterials= {} # matname:[face_idxs]
-	contextMeshUV= None
+	contextObName = None
+	contextLamp = [None, None] # object, Data
+	contextMaterial = None
+	contextMatrix_rot = None # Blender.Mathutils.Matrix(); contextMatrix.identity()
+	#contextMatrix_tx = None # Blender.Mathutils.Matrix(); contextMatrix.identity()
+	contextMesh_vertls = None
+	contextMesh_facels = None
+	contextMeshMaterials = {} # matname:[face_idxs]
+	contextMeshUV = None
 	
-	TEXTURE_DICT={}
-	MATDICT={}
-	TEXMODE= Mesh.FaceModes['TEX']
+	TEXTURE_DICT = {}
+	MATDICT = {}
+# 	TEXMODE = Mesh.FaceModes['TEX']
 	
 	# Localspace variable names, faster.
-	STRUCT_SIZE_1CHAR= calcsize('c')
-	STRUCT_SIZE_2FLOAT= calcsize('2f')
-	STRUCT_SIZE_3FLOAT= calcsize('3f')
-	STRUCT_SIZE_UNSIGNED_SHORT= calcsize('H')
-	STRUCT_SIZE_4UNSIGNED_SHORT= calcsize('4H')
-	STRUCT_SIZE_4x3MAT= calcsize('ffffffffffff')
-	_STRUCT_SIZE_4x3MAT= calcsize('fffffffffffff')
-	# STRUCT_SIZE_4x3MAT= calcsize('ffffffffffff')
+	STRUCT_SIZE_1CHAR = struct.calcsize('c')
+	STRUCT_SIZE_2FLOAT = struct.calcsize('2f')
+	STRUCT_SIZE_3FLOAT = struct.calcsize('3f')
+	STRUCT_SIZE_UNSIGNED_SHORT = struct.calcsize('H')
+	STRUCT_SIZE_4UNSIGNED_SHORT = struct.calcsize('4H')
+	STRUCT_SIZE_4x3MAT = struct.calcsize('ffffffffffff')
+	_STRUCT_SIZE_4x3MAT = struct.calcsize('fffffffffffff')
+	# STRUCT_SIZE_4x3MAT = calcsize('ffffffffffff')
 	# print STRUCT_SIZE_4x3MAT, ' STRUCT_SIZE_4x3MAT'
 	
 	def putContextMesh(myContextMesh_vertls, myContextMesh_facels, myContextMeshMaterials):
 		
-		materialFaces= set() # faces that have a material. Can optimize?
+		materialFaces = set() # faces that have a material. Can optimize?
 		
 		# Now make copies with assigned materils.
 		
@@ -363,13 +380,13 @@
 			'''
 			
 			faceVertUsers = [False] * len(myContextMesh_vertls)
-			ok=0
+			ok = 0
 			for fIdx in faces:
 				for vindex in myContextMesh_facels[fIdx]:
 					faceVertUsers[vindex] = True
 					if matName != None: # if matName is none then this is a set(), meaning we are using the untextured faces and do not need to store textured faces.
 						materialFaces.add(fIdx)
-					ok=1
+					ok = 1
 			
 			if not ok:
 				return
@@ -381,370 +398,460 @@
 			myVertMapping = dict( [ (ii, i) for i, ii in enumerate(vertsToUse) ] )
 			
 			tempName= '%s_%s' % (contextObName, matName) # matName may be None.
-			bmesh = bpy.data.meshes.new(tempName)
+			bmesh = bpy.data.add_mesh(tempName)
+# 			bmesh = bpy.data.meshes.new(tempName)
 			
 			if matName == None:
-				img= None
+				img = None
 			else:
 				bmat = MATDICT[matName][1]
-				bmesh.materials= [bmat]
-				try:	img= TEXTURE_DICT[bmat.name]
-				except:	img= None
+				bmesh.add_material(bmat)
+# 				bmesh.materials = [bmat]
+				try:	img = TEXTURE_DICT[bmat.name]
+				except:	img = None
 				
-			bmesh_verts = bmesh.verts
-			bmesh_verts.extend( [Vector()] )
-			bmesh_verts.extend( [myContextMesh_vertls[i] for i in vertsToUse] )
-			# +1 because of DUMMYVERT
-			face_mapping= bmesh.faces.extend( [ [ bmesh_verts[ myVertMapping[vindex]+1] for vindex in myContextMesh_facels[fIdx]] for fIdx in faces ], indexList=True )
+# 			bmesh_verts = bmesh.verts
+			if len(vertsToUse):

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list