I'm probably missing something dumb... but the first value makes no sense and I have one spare one at the end that also makes no sense... perhaps some screenshots and my current unpacking code will illustrate...
bl_addon_info= {
"name": "Import StarFleet Command Models",
"author": "Bonk",
"version": (0, 1),
"blender": (2, 5, 5),
"api": 31847,
"location": "File > Import > StarFleet Command Model (.mod)",
"description": "Imports a StarFleet Command model file.",
"warning": "The universe may implode at any moment.",
"wiki_url": "http://www.dynaverse.net/wiki/index.php?title=Blender:SFC_Models",
"category": "Import/Export"}
import os
import io
import time
import struct
import chunk
# import array
import bpy
import math
import mathutils
def decodeAsc(byteStr):
print (byteStr.decode("ascii"))
def import_mod(filename,context):
print (filename)
name, ext= os.path.splitext(os.path.basename(filename))
file= open(filename, 'rb')
# Header
try:
modHdrTag, \
modHdrFileSize, \
modHdrVersion, \
modHdrRadius, \
modHdrTotalLODs, \
modHdrLODHyst \
= struct.unpack("<4siIfif", file.read(24))
print ("modHdrTag: " + modHdrTag.decode("ascii"))
print ("modHdrFileSize: %d" % modHdrFileSize)
print ("modHdrVersion: %d" % modHdrVersion)
print ("modHdrRadius: %f" % modHdrRadius)
print ("modHdrTotalLODs: %d" % modHdrTotalLODs)
print ("modHdrLODHyst: %f " % modHdrLODHyst)
modHdrLODTrans \
= struct.unpack("<%df" % modHdrLODHyst, file.read(int(modHdrLODHyst)*4))
print ("modHdrLODTrans:")
print (modHdrLODTrans)
except:
print("Error parsing file header. Boo!")
file.close()
return
# Strings
modStrTag, \
modStrSize \
= struct.unpack("<4si", file.read(8))
modStrSizePadded = 4*(math.ceil(modStrSize/4))
print ("modStrTag: " + modStrTag.decode("ascii"))
print ("modStrSize: %d" % modStrSize)
print ("modStrSizePadded: %d" % modStrSizePadded)
modStrPool \
= struct.unpack("<%ds" % modStrSizePadded, file.read(modStrSizePadded))
modStrStrings = modStrPool[0].split(b'\x00')
modStrList = [x.decode("ascii") for x in modStrStrings]
print ("modStrList: ")
print (modStrList)
# Named Points
modPtsTag, \
modPtsSize \
= struct.unpack("<4si", file.read(8))
modPtsStart = file.tell()
print ("modPtsTag: " + modPtsTag.decode("ascii"))
print ("modPtsSize: %d" % modPtsSize)
modPtsNum = modPtsSize / 16
print ("modPtsNum: %d" % modPtsNum)
modPts = list()
while (file.tell() - modPtsStart < modPtsSize):
modPts.append(struct.unpack("<fffi", file.read(16)))
print ("modPts:")
print (modPts)
# Materials (aieee!)
modMtsTag, \
modMtsSize \
= struct.unpack("<4si", file.read(8))
modMtsStart = file.tell()
print ("modMtsTag: " + modMtsTag.decode("ascii"))
print ("modMtsSize: %d" % modMtsSize)
modMtsFlags = list()
modMts = list()
while (file.tell() - modMtsStart < modMtsSize):
modMtsFlags.append(struct.unpack("<i", file.read(4)))
if modMtsFlags[-1][0] > 20:
modMts.append(struct.unpack("<Ifffiiii", file.read(32)))
else:
modMts.append(struct.unpack("<Ifffii", file.read(24)))
print ("modMtsFlags:")
print (modMtsFlags)
print ("modMts:")
print (modMts)
# Geometries
modModTag, \
modModSize, \
modModVerticesNum, \
modModFacesNum \
= struct.unpack("<4siii", file.read(16))
print ("modModTag: " + modModTag.decode("ascii"))
print ("modModSize: %d" % modModSize)
print ("modModVerticesNum: %d" % modModVerticesNum)
print ("modModFacesNum: %d" % modModFacesNum)
modVtxTag \
= struct.unpack("<4s", file.read(4))
modVtxStart = file.tell()
print ("modVtxTag: " + modVtxTag[0].decode("ascii"))
# print (modVtxTag)
modVtx = list()
while (file.tell() - modVtxStart < modModVerticesNum*12):
modVtx.append(struct.unpack("<fff", file.read(12)))
print ("modVtx: ")
print (modVtx)
modPlyTag, \
modPlySize, \
modPlyVtxCount, \
modPlyMtlIdx, \
= struct.unpack("<4siii", file.read(16))
print ("modPlyTag :")
print (modPlyTag)
print ("modPlySize :")
print (modPlySize)
print ("modPlyVtxCount :")
print (modPlyVtxCount)
print ("modPlyMtlIdx :")
print (modPlyMtlIdx)
from bpy.props import *
class IMPORT_OT_mod(bpy.types.Operator):
'''Import MOD Operator.'''
bl_idname= "import.mod"
bl_label= "Import MOD"
bl_description= "Import a StarFleet Command model."
bl_options= {'REGISTER', 'UNDO'}
filepath= StringProperty(name="File Path", description="Filepath used for importing the model file", maxlen=1024, default="")
def execute(self, context):
import_mod(self.filepath,
context)
return {'FINISHED'}
def invoke(self, context, event):
wm= context.window_manager
wm.add_fileselect(self)
return {'RUNNING_MODAL'}
def menu_func(self, context):
self.layout.operator(IMPORT_OT_mod.bl_idname, text="StarFleet Command Model (.mod)")
def register():
bpy.types.INFO_MT_file_import.append(menu_func)
def unregister():
bpy.types.INFO_MT_file_import.remove(menu_func)
if __name__ == "__main__":
register()
I'm missing something... as far as I can tell the vertex block is just a set of tPoint3s (fff)...