[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [1000] contrib/py/scripts/addons/ io_export_md3.py: add to contrib/py/scripts/addons/io_export_md3.py
Brendon Murphy
meta.androcto1 at gmail.com
Fri Sep 10 14:58:37 CEST 2010
Revision: 1000
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-extensions&revision=1000
Author: meta-androcto
Date: 2010-09-10 14:58:36 +0200 (Fri, 10 Sep 2010)
Log Message:
-----------
add to contrib/py/scripts/addons/io_export_md3.py
expect a full suite of external game engine exports soon
Added Paths:
-----------
contrib/py/scripts/addons/io_export_md3.py
Added: contrib/py/scripts/addons/io_export_md3.py
===================================================================
--- contrib/py/scripts/addons/io_export_md3.py (rev 0)
+++ contrib/py/scripts/addons/io_export_md3.py 2010-09-10 12:58:36 UTC (rev 1000)
@@ -0,0 +1,674 @@
+
+__author__ = ["Xembie"]
+__version__ = '0.7'
+__url__ = ["www.blender.org"]
+
+"""
+Name: 'Quake Model 3 (.md3)...'
+Blender: 253
+Group: 'Export'
+Tooltip: 'Save a Quake Model 3 File'
+"""
+
+import bpy,struct,math,os
+
+MAX_QPATH = 64
+
+MD3_IDENT = "IDP3"
+MD3_VERSION = 15
+MD3_MAX_TAGS = 16
+MD3_MAX_SURFACES = 32
+MD3_MAX_FRAMES = 1024
+MD3_MAX_SHADERS = 256
+MD3_MAX_VERTICES = 4096
+MD3_MAX_TRIANGLES = 8192
+MD3_XYZ_SCALE = 64.0
+
+class md3Vert:
+ xyz = []
+ normal = 0
+ binaryFormat = "<3hH"
+
+ def __init__(self):
+ self.xyz = [0.0, 0.0, 0.0]
+ self.normal = 0
+
+ def GetSize(self):
+ return struct.calcsize(self.binaryFormat)
+
+ # copied from PhaethonH <phaethon at linux.ucla.edu> md3.py
+ def Decode(self, latlng):
+ lat = (latlng >> 8) & 0xFF;
+ lng = (latlng) & 0xFF;
+ lat *= math.pi / 128;
+ lng *= math.pi / 128;
+ x = math.cos(lat) * math.sin(lng)
+ y = math.sin(lat) * math.sin(lng)
+ z = math.cos(lng)
+ retval = [ x, y, z ]
+ return retval
+
+ # copied from PhaethonH <phaethon at linux.ucla.edu> md3.py
+ def Encode(self, normal):
+ x = normal[0]
+ y = normal[1]
+ z = normal[2]
+ # normalize
+ l = math.sqrt((x*x) + (y*y) + (z*z))
+ if l == 0:
+ return 0
+ x = x/l
+ y = y/l
+ z = z/l
+
+ if (x == 0.0) & (y == 0.0) :
+ if z > 0.0:
+ return 0
+ else:
+ return (128 << 8)
+
+ lng = math.acos(z) * 255 / (2 * math.pi)
+ lat = math.atan2(y, x) * 255 / (2 * math.pi)
+ retval = ((int(lat) & 0xFF) << 8) | (int(lng) & 0xFF)
+ return retval
+
+ def Save(self, file):
+ tmpData = [0] * 4
+ tmpData[0] = int(self.xyz[0] * MD3_XYZ_SCALE)
+ tmpData[1] = int(self.xyz[1] * MD3_XYZ_SCALE)
+ tmpData[2] = int(self.xyz[2] * MD3_XYZ_SCALE)
+ tmpData[3] = self.normal
+ data = struct.pack(self.binaryFormat, tmpData[0], tmpData[1], tmpData[2], tmpData[3])
+ file.write(data)
+
+class md3TexCoord:
+ u = 0.0
+ v = 0.0
+
+ binaryFormat = "<2f"
+
+ def __init__(self):
+ self.u = 0.0
+ self.v = 0.0
+
+ def GetSize(self):
+ return struct.calcsize(self.binaryFormat)
+
+ def Save(self, file):
+ tmpData = [0] * 2
+ tmpData[0] = self.u
+ tmpData[1] = 1.0 - self.v
+ data = struct.pack(self.binaryFormat, tmpData[0], tmpData[1])
+ file.write(data)
+
+class md3Triangle:
+ indexes = []
+
+ binaryFormat = "<3i"
+
+ def __init__(self):
+ self.indexes = [ 0, 0, 0 ]
+
+ def GetSize(self):
+ return struct.calcsize(self.binaryFormat)
+
+ def Save(self, file):
+ tmpData = [0] * 3
+ tmpData[0] = self.indexes[0]
+ tmpData[1] = self.indexes[2] # reverse
+ tmpData[2] = self.indexes[1] # reverse
+ data = struct.pack(self.binaryFormat,tmpData[0], tmpData[1], tmpData[2])
+ file.write(data)
+
+class md3Shader:
+ name = ""
+ index = 0
+
+ binaryFormat = "<%dsi" % MAX_QPATH
+
+ def __init__(self):
+ self.name = ""
+ self.index = 0
+
+ def GetSize(self):
+ return struct.calcsize(self.binaryFormat)
+
+ def Save(self, file):
+ tmpData = [0] * 2
+ tmpData[0] = self.name
+ tmpData[1] = self.index
+ data = struct.pack(self.binaryFormat, tmpData[0], tmpData[1])
+ file.write(data)
+
+class md3Surface:
+ ident = ""
+ name = ""
+ flags = 0
+ numFrames = 0
+ numShaders = 0
+ numVerts = 0
+ numTriangles = 0
+ ofsTriangles = 0
+ ofsShaders = 0
+ ofsUV = 0
+ ofsVerts = 0
+ ofsEnd = 0
+ shaders = []
+ triangles = []
+ uv = []
+ verts = []
+
+ binaryFormat = "<4s%ds10i" % MAX_QPATH # 1 int, name, then 10 ints
+
+ def __init__(self):
+ self.ident = ""
+ self.name = ""
+ self.flags = 0
+ self.numFrames = 0
+ self.numShaders = 0
+ self.numVerts = 0
+ self.numTriangles = 0
+ self.ofsTriangles = 0
+ self.ofsShaders = 0
+ self.ofsUV = 0
+ self.ofsVerts = 0
+ self.ofsEnd
+ self.shaders = []
+ self.triangles = []
+ self.uv = []
+ self.verts = []
+
+ def GetSize(self):
+ sz = struct.calcsize(self.binaryFormat)
+ self.ofsTriangles = sz
+ for t in self.triangles:
+ sz += t.GetSize()
+ self.ofsShaders = sz
+ for s in self.shaders:
+ sz += s.GetSize()
+ self.ofsUV = sz
+ for u in self.uv:
+ sz += u.GetSize()
+ self.ofsVerts = sz
+ for v in self.verts:
+ sz += v.GetSize()
+ self.ofsEnd = sz
+ return self.ofsEnd
+
+ def Save(self, file):
+ self.GetSize()
+ tmpData = [0] * 12
+ tmpData[0] = self.ident
+ tmpData[1] = self.name
+ tmpData[2] = self.flags
+ tmpData[3] = self.numFrames
+ tmpData[4] = self.numShaders
+ tmpData[5] = self.numVerts
+ tmpData[6] = self.numTriangles
+ tmpData[7] = self.ofsTriangles
+ tmpData[8] = self.ofsShaders
+ tmpData[9] = self.ofsUV
+ tmpData[10] = self.ofsVerts
+ tmpData[11] = self.ofsEnd
+ data = struct.pack(self.binaryFormat, tmpData[0],tmpData[1],tmpData[2],tmpData[3],tmpData[4],tmpData[5],tmpData[6],tmpData[7],tmpData[8],tmpData[9],tmpData[10],tmpData[11])
+ file.write(data)
+
+ # write the tri data
+ for t in self.triangles:
+ t.Save(file)
+
+ # save the shader coordinates
+ for s in self.shaders:
+ s.Save(file)
+
+ # save the uv info
+ for u in self.uv:
+ u.Save(file)
+
+ # save the verts
+ for v in self.verts:
+ v.Save(file)
+
+class md3Tag:
+ name = ""
+ origin = []
+ axis = []
+
+ binaryFormat="<%ds3f9f" % MAX_QPATH
+
+ def __init__(self):
+ self.name = ""
+ self.origin = [0, 0, 0]
+ self.axis = [0, 0, 0, 0, 0, 0, 0, 0, 0]
+
+ def GetSize(self):
+ return struct.calcsize(self.binaryFormat)
+
+ def Save(self, file):
+ tmpData = [0] * 13
+ tmpData[0] = self.name
+ tmpData[1] = float(self.origin[0])
+ tmpData[2] = float(self.origin[1])
+ tmpData[3] = float(self.origin[2])
+ tmpData[4] = float(self.axis[0])
+ tmpData[5] = float(self.axis[1])
+ tmpData[6] = float(self.axis[2])
+ tmpData[7] = float(self.axis[3])
+ tmpData[8] = float(self.axis[4])
+ tmpData[9] = float(self.axis[5])
+ tmpData[10] = float(self.axis[6])
+ tmpData[11] = float(self.axis[7])
+ tmpData[12] = float(self.axis[8])
+ data = struct.pack(self.binaryFormat, tmpData[0],tmpData[1],tmpData[2],tmpData[3],tmpData[4],tmpData[5],tmpData[6], tmpData[7], tmpData[8], tmpData[9], tmpData[10], tmpData[11], tmpData[12])
+ file.write(data)
+
+class md3Frame:
+ mins = 0
+ maxs = 0
+ localOrigin = 0
+ radius = 0.0
+ name = ""
+
+ binaryFormat="<3f3f3ff16s"
+
+ def __init__(self):
+ self.mins = [0, 0, 0]
+ self.maxs = [0, 0, 0]
+ self.localOrigin = [0, 0, 0]
+ self.radius = 0.0
+ self.name = ""
+
+ def GetSize(self):
+ return struct.calcsize(self.binaryFormat)
+
+ def Save(self, file):
+ tmpData = [0] * 11
+ tmpData[0] = self.mins[0]
+ tmpData[1] = self.mins[1]
+ tmpData[2] = self.mins[2]
+ tmpData[3] = self.maxs[0]
+ tmpData[4] = self.maxs[1]
+ tmpData[5] = self.maxs[2]
+ tmpData[6] = self.localOrigin[0]
+ tmpData[7] = self.localOrigin[1]
+ tmpData[8] = self.localOrigin[2]
+ tmpData[9] = self.radius
+ tmpData[10] = self.name
+ data = struct.pack(self.binaryFormat, tmpData[0],tmpData[1],tmpData[2],tmpData[3],tmpData[4],tmpData[5],tmpData[6],tmpData[7], tmpData[8], tmpData[9], tmpData[10])
+ file.write(data)
+
+class md3Object:
+ # header structure
+ ident = "" # this is used to identify the file (must be IDP3)
+ version = 0 # the version number of the file (Must be 15)
+ name = ""
+ flags = 0
+ numFrames = 0
+ numTags = 0
+ numSurfaces = 0
+ numSkins = 0
+ ofsFrames = 0
+ ofsTags = 0
+ ofsSurfaces = 0
+ ofsEnd = 0
+ frames = []
+ tags = []
+ surfaces = []
+
+ binaryFormat="<4si%ds9i" % MAX_QPATH # little-endian (<), 17 integers (17i)
+
+ def __init__(self):
+ self.ident = 0
+ self.version = 0
+ self.name = ""
+ self.flags = 0
+ self.numFrames = 0
+ self.numTags = 0
+ self.numSurfaces = 0
+ self.numSkins = 0
+ self.ofsFrames = 0
+ self.ofsTags = 0
+ self.ofsSurfaces = 0
+ self.ofsEnd = 0
+ self.frames = []
+ self.tags = []
+ self.surfaces = []
+
+ def GetSize(self):
+ self.ofsFrames = struct.calcsize(self.binaryFormat)
+ self.ofsTags = self.ofsFrames
+ for f in self.frames:
+ self.ofsTags += f.GetSize()
+ self.ofsSurfaces += self.ofsTags
+ for t in self.tags:
+ self.ofsSurfaces += t.GetSize()
+ self.ofsEnd = self.ofsSurfaces
+ for s in self.surfaces:
+ self.ofsEnd += s.GetSize()
+ return self.ofsEnd
+
+ def Save(self, file):
+ self.GetSize()
+ tmpData = [0] * 12
+ tmpData[0] = self.ident
+ tmpData[1] = self.version
+ tmpData[2] = self.name
+ tmpData[3] = self.flags
+ tmpData[4] = self.numFrames
+ tmpData[5] = self.numTags
+ tmpData[6] = self.numSurfaces
+ tmpData[7] = self.numSkins
+ tmpData[8] = self.ofsFrames
+ tmpData[9] = self.ofsTags
+ tmpData[10] = self.ofsSurfaces
+ tmpData[11] = self.ofsEnd
+
+ data = struct.pack(self.binaryFormat, tmpData[0],tmpData[1],tmpData[2],tmpData[3],tmpData[4],tmpData[5],tmpData[6],tmpData[7], tmpData[8], tmpData[9], tmpData[10], tmpData[11])
+ file.write(data)
+
+ for f in self.frames:
+ f.Save(file)
+
+ for t in self.tags:
+ t.Save(file)
+
+ for s in self.surfaces:
+ s.Save(file)
+
+
+def message(log,msg):
+ if log:
+ log.write(msg + "\n")
+ else:
+ print(msg)
+
+class md3Settings:
+ def __init__(self,
+ savepath,
+ name,
+ logpath,
+ overwrite=True,
+ dumpall=False,
+ ignoreuvs=False,
+ scale=1.0,
+ offsetx=0.0,
+ offsety=0.0,
+ offsetz=0.0):
+ self.savepath = savepath
+ self.name = name
+ self.logpath = logpath
+ self.overwrite = overwrite
+ self.dumpall = dumpall
+ self.ignoreuvs = ignoreuvs
+ self.scale = scale
+ self.offsetx = offsetx
+ self.offsety = offsety
+ self.offsetz = offsetz
+
+def print_md3(log,md3,dumpall):
+ message(log,"Header Information")
+ message(log,"Ident: " + str(md3.ident))
+ message(log,"Version: " + str(md3.version))
+ message(log,"Name: " + md3.name)
+ message(log,"Flags: " + str(md3.flags))
+ message(log,"Number of Frames: " + str(md3.numFrames))
+ message(log,"Number of Tags: " + str(md3.numTags))
+ message(log,"Number of Surfaces: " + str(md3.numSurfaces))
+ message(log,"Number of Skins: " + str(md3.numSkins))
+ message(log,"Offset Frames: " + str(md3.ofsFrames))
+ message(log,"Offset Tags: " + str(md3.ofsTags))
+ message(log,"Offset Surfaces: " + str(md3.ofsSurfaces))
+ message(log,"Offset end: " + str(md3.ofsEnd))
+ if dumpall:
+ message(log,"Frames:")
+ for f in md3.frames:
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list