[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15242] trunk/blender/release/scripts/ ms3d_import.py: bugfix from Markus Ilmola (glome)

Campbell Barton ideasman42 at gmail.com
Mon Jun 16 16:08:59 CEST 2008


Revision: 15242
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15242
Author:   campbellbarton
Date:     2008-06-16 16:08:24 +0200 (Mon, 16 Jun 2008)

Log Message:
-----------
bugfix from Markus Ilmola (glome)
patch was in [#8540] Import scripts for MilkShape3D file formats

Some animations were incorrectly imported and this adds support for weights.

Modified Paths:
--------------
    trunk/blender/release/scripts/ms3d_import.py

Modified: trunk/blender/release/scripts/ms3d_import.py
===================================================================
--- trunk/blender/release/scripts/ms3d_import.py	2008-06-16 09:23:14 UTC (rev 15241)
+++ trunk/blender/release/scripts/ms3d_import.py	2008-06-16 14:08:24 UTC (rev 15242)
@@ -43,28 +43,28 @@
 
 
 # Converts ms3d euler angles to a rotation matrix
-def RM(a):
-	sy = sin(a[2])
-	cy = cos(a[2])
-	sp = sin(a[1])
-	cp = cos(a[1])
-	sr = sin(a[0])
+def RM(a):
+	sy = sin(a[2])
+	cy = cos(a[2])
+	sp = sin(a[1])
+	cp = cos(a[1])
+	sr = sin(a[0])
 	cr = cos(a[0])
-	return Matrix([cp*cy, sr*sp*cy+cr*-sy, cr*sp*cy+-sr*-sy],[cp*sy, sr*sp*sy+cr*cy, cr*sp*sy+-sr*cy], [-sp, sr*cp, cr*cp])
+	return Matrix([cp*cy, cp*sy, -sp], [sr*sp*cy+cr*-sy, sr*sp*sy+cr*cy, sr*cp],[cr*sp*cy+-sr*-sy, cr*sp*sy+-sr*cy, cr*cp])
 
 
 # Converts ms3d euler angles to a quaternion
-def RQ(a):
-	angle = a[2] * 0.5;
-	sy = sin(angle);
-	cy = cos(angle);
-	angle = a[1] * 0.5;
-	sp = sin(angle);
-	cp = cos(angle);
-	angle = a[0] * 0.5;
-	sr = sin(angle);
-	cr = cos(angle);
-	return Quaternion(cr*cp*cy+sr*sp*sy, sr*cp*cy-cr*sp*sy, cr*sp*cy+sr*cp*sy, cr*cp*sy-sr*sp*cy)
+def RQ(a):
+	angle = a[2] * 0.5;
+	sy = sin(angle);
+	cy = cos(angle);
+	angle = a[1] * 0.5;
+	sp = sin(angle);
+	cp = cos(angle);
+	angle = a[0] * 0.5;
+	sr = sin(angle);
+	cr = cos(angle);
+	return Quaternion(cr*cp*cy+sr*sp*sy, sr*cp*cy-cr*sp*sy, cr*sp*cy+sr*cp*sy, cr*cp*sy-sr*sp*cy)
 
 
 # takes a texture filename and tries to load it
@@ -94,15 +94,20 @@
 	except IOError:
 		return "Failed to open the file!"
 
-	# read id
+	# get the file size
+	file.seek(0, os.SEEK_END);
+	fileSize = file.tell();
+	file.seek(0, os.SEEK_SET);
+
+	# read id to check if the file is a MilkShape3D file
 	id = file.read(10)
 	if id!="MS3D000000":
-		return "The file is not a MS3D file!"
+		return "The file is not a MS3D file!"
 
 	# read version
 	version = struct.unpack("i", file.read(4))[0]
 	if version!=4:
-		return "The file has invalid version!"
+		return "The file has invalid version!"
 
 	# Create the mesh
 	scn.objects.selected = []
@@ -118,20 +123,20 @@
 	for i in xrange(numVertices):
 		# skip flags
 		file.read(1)
-
+
 		# read coords
 		coords.append(struct.unpack("fff", file.read(3*4)))
 
 		# read bone ids 
-		boneIds.append(struct.unpack("B", file.read(1))[0])
-
+		boneIds.append(struct.unpack("b", file.read(1))[0])
+
 		# skip refcount		
 		file.read(1)
 
 	# add the vertices to the mesh
 	mesh.verts.extend(coords)
 
-	# read number of triangles
+	# read number of triangles
 	numTriangles = struct.unpack("H", file.read(2))[0]
 	
 	# read triangles
@@ -141,10 +146,10 @@
 		# skip flags
 		file.read(2)
 
-		# read indices (faces)
+		# read indices (faces)
 		faces.append(struct.unpack("HHH", file.read(3*2)))
 
-		# read normals
+		# read normals
 		normals = struct.unpack("fffffffff", file.read(3*3*4))
 
 		# read texture coordinates
@@ -171,35 +176,36 @@
 	for i in xrange(numTriangles):
 		mesh.faces[i].uv = [Vector(uvs[i][0]), Vector(uvs[i][1]), Vector(uvs[i][2])]
 
-	# read number of groups
+	# read number of groups
 	numGroups = struct.unpack("H", file.read(2))[0]
 
 	# read groups
 	for i in xrange(numGroups):
-		# skip flags
+		# skip flags
 		file.read(1)
 
 		# skip name
 		file.read(32)
 
-		# read the number of triangles in the group
+		# read the number of triangles in the group
 		numGroupTriangles = struct.unpack("H", file.read(2))[0]
-
+
 		# read the group triangles
-		if numGroupTriangles > 0:
+		if numGroupTriangles > 0:
 			triangleIndices = struct.unpack(str(numGroupTriangles) + "H", file.read(2*numGroupTriangles));
-
+
 		# read material
-		material = struct.unpack("B", file.read(1))[0]
-		for j in xrange(numGroupTriangles):
-			mesh.faces[triangleIndices[j]].mat = material
+		material = struct.unpack("b", file.read(1))[0]
+		if material>=0:
+			for j in xrange(numGroupTriangles):
+				mesh.faces[triangleIndices[j]].mat = material
 
-	# read the number of materials
-	numMaterials = struct.unpack("H", file.read(2))[0]
+	# read the number of materials
+	numMaterials = struct.unpack("H", file.read(2))[0]
 
 	# read materials
 	for i in xrange(numMaterials):
-		# read name
+		# read name
 		name = uku(file.read(32))
 
 		# create the material
@@ -210,7 +216,7 @@
 		ambient = struct.unpack("ffff", file.read(4*4))[0:3]
 		mat.setAmb((ambient[0]+ambient[1]+ambient[2])/3)
 
-		# read diffuse color
+		# read diffuse color
 		diffuse = struct.unpack("ffff", file.read(4*4))[0:3]
 		mat.setRGBCol(diffuse)
 
@@ -224,7 +230,6 @@
 
 		# read shininess
 		shininess = struct.unpack("f", file.read(4))[0]
-		print "Shininess: " + str(shininess)
 
 		# read transparency		
 		transparency = struct.unpack("f", file.read(4))[0]
@@ -235,7 +240,7 @@
 		# read mode
 		mode = struct.unpack("B", file.read(1))[0]
 
-		# read texturemap
+		# read texturemap
 		texturemap = uku(file.read(128))
 		if len(texturemap)>0:
 			colorTexture = Blender.Texture.New(name + "_texture")
@@ -243,7 +248,7 @@
 			colorTexture.setImage(loadImage(path, texturemap))
 			mat.setTexture(0, colorTexture, Blender.Texture.TexCo.UV, Blender.Texture.MapTo.COL)
 
-		# read alphamap
+		# read alphamap
 		alphamap = uku(file.read(128))
 		if len(alphamap)>0:
 			alphaTexture = Blender.Texture.New(name + "_alpha")
@@ -251,12 +256,12 @@
 			alphaTexture.setImage(loadImage(path, alphamap))
 			mat.setTexture(1, alphaTexture, Blender.Texture.TexCo.UV, Blender.Texture.MapTo.ALPHA)		
 
-	# read animation
-	fps = struct.unpack("f", file.read(4))[0]
-	time = struct.unpack("f", file.read(4))[0]
-	frames = struct.unpack("i", file.read(4))[0]
-
-	# read the number of joints
+	# read animation
+	fps = struct.unpack("f", file.read(4))[0]
+	time = struct.unpack("f", file.read(4))[0]
+	frames = struct.unpack("i", file.read(4))[0]
+
+	# read the number of joints
 	numJoints = struct.unpack("H", file.read(2))[0]
 
 	# create the armature
@@ -272,20 +277,22 @@
 		armature.makeEditable()
 
 	# read joints
+	joints = []
 	rotKeys = {}
-	posKeys = {}
+	posKeys = {}
 	for i in xrange(numJoints):
 		# skip flags
 		file.read(1)
 
-		# read name
+		# read name
 		name = uku(file.read(32))
+		joints.append(name)
 
 		# create the bone
 		bone = Blender.Armature.Editbone()
 		armature.bones[name] = bone
 
-		# read parent
+		# read parent
 		parent = uku(file.read(32))
 		if len(parent)>0:
 			bone.parent = armature.bones[parent]
@@ -295,11 +302,13 @@
 
 		# read position
 		pos = struct.unpack("fff", file.read(3*4))
-
+		
 		# set head
 		if bone.hasParent():
-			bone.head = bone.parent.matrix * Vector(pos) + bone.parent.head
-			bone.matrix = bone.parent.matrix * RM(rot)
+			bone.head =  Vector(pos) * bone.parent.matrix + bone.parent.head
+			tempM = RM(rot) * bone.parent.matrix
+			tempM.transpose;
+			bone.matrix = tempM
 		else:
 			bone.head = Vector(pos)
 			bone.matrix = RM(rot)
@@ -317,24 +326,24 @@
 				vgroup.append(index)
 		mesh.assignVertsToGroup(name, vgroup, 1.0, 1)
 	
-		# read the number of rotation keys
-		numKeyFramesRot = struct.unpack("H", file.read(2))[0]
-			
-		# read the number of postions keys
-		numKeyFramesPos = struct.unpack("H", file.read(2))[0]
-
-		# read rotation keys
+		# read the number of rotation keys
+		numKeyFramesRot = struct.unpack("H", file.read(2))[0]
+			
+		# read the number of postions keys
+		numKeyFramesPos = struct.unpack("H", file.read(2))[0]
+
+		# read rotation keys
 		rotKeys[name] = []		
 		for j in xrange(numKeyFramesRot):
 			# read time
 			time = fps * struct.unpack("f", file.read(4))[0]
 			# read data
 			rotKeys[name].append([time, struct.unpack("fff", file.read(3*4))])
-
-		# read position keys
+
+		# read position keys
 		posKeys[name] = []
 		for j in xrange(numKeyFramesPos):
-			# read time
+			# read time
 			time = fps * struct.unpack("f", file.read(4))[0]
 			# read data
 			posKeys[name].append([time, struct.unpack("fff", file.read(3*4))])
@@ -352,16 +361,114 @@
 
 	# create animation key frames
 	for name, pbone in pose.bones.items():
-		# create position keys
-		for key in posKeys[name]:
+		# create position keys
+		for key in posKeys[name]:
 			pbone.loc = Vector(key[1])
-			pbone.insertKey(armOb, int(key[0]), Blender.Object.Pose.LOC, True)
+			pbone.insertKey(armOb, int(key[0]+0.5), Blender.Object.Pose.LOC, True)
 
-		# create rotation keys
-		for key in rotKeys[name]:
+		# create rotation keys
+		for key in rotKeys[name]:
 			pbone.quat = RQ(key[1])
-			pbone.insertKey(armOb, int(key[0]), Blender.Object.Pose.ROT, True)
+			pbone.insertKey(armOb, int(key[0]+0.5), Blender.Object.Pose.ROT, True)
+
+	# The old format ends here. If there is more data then the file is newer version
+
+	# check to see if there are any comments
+	if file.tell()<fileSize:
+
+		# read sub version
+		subVersion = struct.unpack("i", file.read(4))[0]
+
+		# Is the sub version a supported one
+		if subVersion==1:
+
+			# Group comments
+			numComments = struct.unpack("i", file.read(4))[0]
+			for i in range(numComments):
+				file.read(4) # index
+				size = struct.unpack("i", file.read(4))[0] # comment size
+				if size>0:
+					print "Group comment: " + file.read(size)
+
+			# Material comments
+			numComments = struct.unpack("i", file.read(4))[0]
+			for i in range(numComments):
+				file.read(4) # index
+				size = struct.unpack("i", file.read(4))[0] # comment size
+				if size>0:
+					print "Material comment: " + file.read(size)
+
+			# Joint comments
+			numComments = struct.unpack("i", file.read(4))[0]
+			for i in range(numComments):
+				file.read(4) # index
+				size = struct.unpack("i", file.read(4))[0] # comment size
+				if size>0:
+					print "Joint comment: " + file.read(size)
+
+			# Model comments
+			numComments = struct.unpack("i", file.read(4))[0]
+			for i in range(numComments):
+				file.read(4) # index
+				size = struct.unpack("i", file.read(4))[0] # comment size
+				if size>0:
+					print "Model comment: " + file.read(size)
+
+		# Unknown version give a warning
+		else:
+			print "Warning: Unknown version!"
+
+		
+	# check to see if there is any extra vertex data
+	if file.tell()<fileSize:
+		
+		# read the subversion
+		subVersion = struct.unpack("i", file.read(4))[0]
+
+		# is the version supported
+		if subVersion==2:
+			# read the extra data for each vertex
+			for i in xrange(numVertices):
+				# bone ids
+				ids = struct.unpack("bbb", file.read(3))
+				# weights
+				weights = struct.unpack("BBB", file.read(3))
+				# extra
+				extra = struct.unpack("I", file.read(4))
+				# add extra vertices with weights to deform groups

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list