[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [3691] moving .m3 importer into contrib .

Brendon Murphy meta.androcto1 at gmail.com
Fri Aug 31 01:29:33 CEST 2012


Revision: 3691
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=3691
Author:   meta-androcto
Date:     2012-08-30 23:29:33 +0000 (Thu, 30 Aug 2012)
Log Message:
-----------
moving .m3 importer into contrib. added broken warning.
please note, this addon will be removed from contrib if not fixed before release.

Added Paths:
-----------
    contrib/py/scripts/addons/io_scene_m3/
    contrib/py/scripts/addons/io_scene_m3/__init__.py
    contrib/py/scripts/addons/io_scene_m3/import_m3.py

Removed Paths:
-------------
    trunk/py/scripts/addons/io_scene_m3/

Added: contrib/py/scripts/addons/io_scene_m3/__init__.py
===================================================================
--- contrib/py/scripts/addons/io_scene_m3/__init__.py	                        (rev 0)
+++ contrib/py/scripts/addons/io_scene_m3/__init__.py	2012-08-30 23:29:33 UTC (rev 3691)
@@ -0,0 +1,97 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+bl_info = {
+    'name': 'Import Blizzard M3 format (.m3)',
+    'author': 'Cory Perry',
+    'version': (0, 2, 1),
+    "blender": (2, 5, 7),
+    'location': 'File > Import > Blizzard M3 (.m3)',
+    'description': 'Imports the Blizzard M3 format (.m3)',
+    'warning': 'Broken',
+    'wiki_url': 'http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/'\
+        'Import-Export/M3_Import',
+    'tracker_url': 'http://projects.blender.org/tracker/index.php?'\
+        'func=detail&aid=24017',
+    'category': 'Import-Export'}
+
+
+# To support reload properly, try to access a package var, if it's there,
+# reload everything
+if "bpy" in locals():
+    import imp
+    if 'import_m3' in locals():
+        imp.reload(import_m3)
+#   if 'export_m3' in locals():
+#       imp.reload(export_m3)
+
+import time
+import datetime
+import bpy
+from bpy.props import StringProperty, BoolProperty
+from bpy_extras.io_utils import ImportHelper
+
+
+class ImportM3(bpy.types.Operator, ImportHelper):
+    """Import from M3 file format (.m3)"""
+    bl_idname = 'import_scene.blizzard_m3'
+    bl_label = 'Import M3'
+    bl_options = {'UNDO'}
+
+    filename_ext = '.m3'
+    filter_glob = StringProperty(default='*.m3', options={'HIDDEN'})
+
+    use_image_search = BoolProperty(name='Image Search',
+                        description='Search subdirectories for any associated'\
+                                    'images', default=True)
+
+    def execute(self, context):
+        from . import import_m3
+        print('Importing file', self.filepath)
+        t = time.mktime(datetime.datetime.now().timetuple())
+        with open(self.filepath, 'rb') as file:
+            import_m3.read(file, context, self)
+        t = time.mktime(datetime.datetime.now().timetuple()) - t
+        print('Finished importing in', t, 'seconds')
+        return {'FINISHED'}
+
+
+def menu_func_import(self, context):
+    self.layout.operator(ImportM3.bl_idname, text='Blizzard M3 (.m3)')
+
+
+#def menu_func_export(self, context):
+#   self.layout.operator(ExportM3.bl_idname, text='Blizzard M3 (.m3)')
+
+
+def register():
+    bpy.utils.register_module(__name__)
+    bpy.types.INFO_MT_file_import.append(menu_func_import)
+#   bpy.types.INFO_MT_file_export.append(menu_func_export)
+
+
+def unregister():
+    bpy.utils.unregister_module(__name__)
+    bpy.types.INFO_MT_file_import.remove(menu_func_import)
+#   bpy.types.INFO_MT_file_export.remove(menu_func_export)
+
+
+if __name__ == "__main__":
+    register()

Added: contrib/py/scripts/addons/io_scene_m3/import_m3.py
===================================================================
--- contrib/py/scripts/addons/io_scene_m3/import_m3.py	                        (rev 0)
+++ contrib/py/scripts/addons/io_scene_m3/import_m3.py	2012-08-30 23:29:33 UTC (rev 3691)
@@ -0,0 +1,365 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+__author__ = "Cory Perry (muraj)"
+__version__ = "0.2.1"
+__bpydoc__ = """\
+This script imports m3 format files to Blender.
+
+The m3 file format, used by Blizzard in several games, is based around the
+mdx and m2 file format.  Thanks to the efforts of Volcore, madyavic and the
+people working on libm3, the file format has been reversed engineered
+enough to make this script possible (Thanks guys!).
+
+This script currently imports the following:<br>
+ - Geometry data (vertices, faces, submeshes [in vertex groups])
+ - Model Textures (currently only the first material is supported)
+
+   Blender supports the DDS file format and needs the image in the same
+   directory.  This script will notify you of any missing textures.
+
+TODO:<br>
+ - Documentation & clean up
+ - Full MD34 and MD33 testing (possibly batch importing for a testing suite)
+ - Import *ALL* materials and bind accordingly (currently supports diffuse,
+    specular, and normal.
+ - Adjust vertices to bind pose (import IREF matrices)
+ - Import Bone data
+ - Import Animation data
+
+Usage:<br>
+    Execute this script from the "File->Import" menu and choose a m3 file to
+open.
+
+Notes:<br>
+    Known issue with Thor.m3, seems to add a lot of unecessary verts.
+    Generates the standard verts and faces lists.
+"""
+
+import bpy
+import struct
+import os.path
+from bpy.props import *
+from bpy_extras.image_utils import load_image
+
+##################
+## Struct setup ##
+##################
+verFlag = False        # Version flag (MD34 == True, MD33 == False)
+
+
+class ref:
+    fmt = 'LL'
+
+    def __init__(self, file):
+        global verFlag
+        if verFlag:
+            self.fmt += 'L'    # Extra unknown...
+        _s = file.read(struct.calcsize(self.fmt))
+        self.entries, self.refid = struct.unpack(self.fmt, _s)[:2]
+
+    @classmethod
+    def size(cls):
+        global verFlag
+        return struct.calcsize(cls.fmt + ('L' if verFlag else ''))
+
+
+class animref:
+    fmt = 'HHL'
+
+    def __init__(self, file):
+        _s = file.read(struct.calcsize(self.fmt))
+        self.flags, self.animflags, self.animid = struct.unpack(self.fmt, _s)
+
+
+class Tag:
+    fmt = '4sLLL'
+
+    def __init__(self, file):
+        _s = file.read(struct.calcsize(self.fmt))
+        self.name, self.ofs, self.nTag, self.version = \
+            struct.unpack(self.fmt, _s)
+
+
+class matrix:
+    fmt = 'f' * 16
+
+    def __init__(self, file):
+        _s = file.read(struct.calcsize(self.fmt))
+        self.mat = struct.unpack(self.fmt, _s)
+
+
+class vect:
+    fmt = 'fff'
+
+    def __init__(self, file):
+        _s = file.read(struct.calcsize(self.fmt))
+        self.v = struct.unpack(self.fmt, _s)
+
+
+class vertex:
+    fmt = "4B4b4B%dH4B"
+    ver = {0x020000: 2, 0x060000: 4, 0x0A0000: 6, 0x120000: 8}
+
+    def __init__(self, file, flag):
+        self.pos = vect(file)
+        _fmt = self.fmt % (self.ver[flag])
+        _s = file.read(struct.calcsize(_fmt))
+        _s = struct.unpack(_fmt, _s)
+        self.boneWeight = _s[0:4]
+        self.boneIndex = _s[4:8]
+        self.normal = _s[8:12]
+        self.uv = _s[12:14]
+        self.tan = _s[-4:]    # Skipping the middle ukn value if needed
+        self.boneWeight = [b / 255.0 for b in self.boneWeight]
+        self.normal = [x * 2.0 / 255.0 - 1.0 for x in self.normal]
+        self.tan = [x * 2.0 / 255.0 - 1.0 for x in self.tan]
+        self.uv = [x / 2046.0 for x in self.uv]
+        self.uv[1] = 1.0 - self.uv[1]
+
+    @classmethod
+    def size(cls, flag=0x020000):
+        return struct.calcsize('fff' + cls.fmt % (cls.ver[flag]))
+
+
+class quat:
+    fmt = 'ffff'
+
+    def __init__(self, file):
+        _s = file.read(struct.calcsize(self.fmt))
+        self.v = struct.unpack(self.fmt, _s)
+        #Quats are stored x,y,z,w - this fixes it
+        self.v = [self.v[-1], self.v[0], self.v[1], self.v[2]]
+
+
+class bone:
+
+    def __init__(self, file):
+        file.read(4)    # ukn1
+        self.name = ref(file)
+        self.flag, self.parent, _ = struct.unpack('LhH', file.read(8))
+        self.posid = animref(file)
+        self.pos = vect(file)
+        file.read(4 * 4)    # ukn
+        self.rotid = animref(file)
+        self.rot = quat(file)
+        file.read(4 * 5)    # ukn
+        self.scaleid = animref(file)
+        self.scale = vect(file)
+        vect(file)          # ukn
+        file.read(4 * 6)    # ukn
+
+
+class div:
+
+    def __init__(self, file):
+        self.faces = ref(file)
+        self.regn = ref(file)
+        self.bat = ref(file)
+        self.msec = ref(file)
+        file.read(4)    # ukn
+
+
+class regn:
+    fmt = 'L2H2L6H'
+
+    def __init__(self, file):
+        _s = file.read(struct.calcsize(self.fmt))
+        _ukn1, self.ofsVert, self.nVerts, self.ofsIndex, self.nIndex, \
+            self.boneCount, self.indBone, self.nBone = \
+            struct.unpack(self.fmt, _s)[:8]
+
+
+class mat:
+
+    def __init__(self, file):
+        self.name = ref(file)
+        file.read(4 * 10)    # ukn
+        self.layers = [ref(file) for _ in range(13)]
+        file.read(4 * 15)    # ukn
+
+
+class layr:
+
+    def __init__(self, file):
+        file.read(4)
+        self.name = ref(file)
+        #Rest not implemented.
+
+
+class hdr:
+    fmt = '4sLL'
+
+    def __init__(self, file):
+        _s = file.read(struct.calcsize(self.fmt))
+        self.magic, self.ofsTag, self.nTag = struct.unpack(self.fmt, _s)
+        self.MODLref = ref(file)
+
+
+class MODL:
+
+    def __init__(self, file, flag=20):
+        global verFlag
+        self.name = ref(file)
+        self.ver = struct.unpack('L', file.read(4))[0]
+        self.seqHdr = ref(file)
+        self.seqData = ref(file)

@@ Diff output truncated at 10240 characters. @@


More information about the Bf-extensions-cvs mailing list