[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [3601] contrib/py/scripts/addons/ io_scene_ms3d: organized imported data to a group and add an empty as parent.

Alexander Nussbaumer alpha-beta-release at gmx.net
Mon Jul 9 19:16:33 CEST 2012


Revision: 3601
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=3601
Author:   beta-tester
Date:     2012-07-09 17:16:33 +0000 (Mon, 09 Jul 2012)
Log Message:
-----------
organized imported data to a group and add an empty as parent.

and start to implement exporter - not finished yet!

Modified Paths:
--------------
    contrib/py/scripts/addons/io_scene_ms3d/__init__.py
    contrib/py/scripts/addons/io_scene_ms3d/ms3d_export.py
    contrib/py/scripts/addons/io_scene_ms3d/ms3d_import.py
    contrib/py/scripts/addons/io_scene_ms3d/ms3d_spec.py
    contrib/py/scripts/addons/io_scene_ms3d/ms3d_strings.py
    contrib/py/scripts/addons/io_scene_ms3d/ms3d_ui.py
    contrib/py/scripts/addons/io_scene_ms3d/ms3d_utils.py

Modified: contrib/py/scripts/addons/io_scene_ms3d/__init__.py
===================================================================
--- contrib/py/scripts/addons/io_scene_ms3d/__init__.py	2012-07-09 14:32:43 UTC (rev 3600)
+++ contrib/py/scripts/addons/io_scene_ms3d/__init__.py	2012-07-09 17:16:33 UTC (rev 3601)
@@ -23,10 +23,10 @@
         'description': "Import / Export MilkShape3D MS3D files"\
                 " (conform with v1.8.4)",
         'author': "Alexander Nussbaumer",
-        'version': (0, 4, 0, 1),
+        'version': (0, 4, 0, 2),
         'blender': (2, 6, 3, 0),
         'location': "File > Import & File > Export",
-        'warning': "[2012-07-07] currently only the importer is implemented",
+        'warning': "[2012-07-09] currently only the importer is implemented",
         'wiki_url': "http://wiki.blender.org/index.php/Extensions:2.6/Py/"\
                 "Scripts/Import-Export/MilkShape3D_MS3D",
         'tracker_url': "http://projects.blender.org/tracker/index.php"\
@@ -64,7 +64,6 @@
         register_module,
         unregister_module,
         )
-
 from bpy.types import (
         INFO_MT_file_export,
         INFO_MT_file_import,
@@ -75,13 +74,13 @@
 # registration
 def register():
     register_module(__name__)
-    #INFO_MT_file_export.append(Ms3dExportOperator.menu_func)
+    INFO_MT_file_export.append(Ms3dExportOperator.menu_func)
     INFO_MT_file_import.append(Ms3dImportOperator.menu_func)
 
 
 def unregister():
     unregister_module(__name__)
-    #INFO_MT_file_export.remove(Ms3dExportOperator.menu_func)
+    INFO_MT_file_export.remove(Ms3dExportOperator.menu_func)
     INFO_MT_file_import.remove(Ms3dImportOperator.menu_func)
 
 

Modified: contrib/py/scripts/addons/io_scene_ms3d/ms3d_export.py
===================================================================
--- contrib/py/scripts/addons/io_scene_ms3d/ms3d_export.py	2012-07-09 14:32:43 UTC (rev 3600)
+++ contrib/py/scripts/addons/io_scene_ms3d/ms3d_export.py	2012-07-09 17:16:33 UTC (rev 3601)
@@ -37,15 +37,12 @@
         )
 from mathutils import (
         Vector,
-        Euler,
-        Matrix,
         )
 from os import (
         path,
         )
 from sys import (
         exc_info,
-        float_info,
         )
 from time import (
         time,
@@ -72,12 +69,25 @@
     from io_scene_ms3d.ms3d_spec import (
             Ms3dSpec,
             Ms3dModel,
+            Ms3dModelEx,
+            Ms3dVertex,
+            Ms3dVertexEx2,
+            Ms3dTriangle,
+            Ms3dGroup,
+            Ms3dMaterial,
+            Ms3dJoint,
+            Ms3dJointEx,
+            Ms3dRotationKeyframe,
+            Ms3dTranslationKeyframe,
+            Ms3dComment,
+            Ms3dCommentEx,
             )
     from io_scene_ms3d.ms3d_utils import (
             select_all,
             enable_pose_mode,
             enable_edit_mode,
             pre_setup_environment,
+            post_setup_environment,
             )
     from io_scene_ms3d.ms3d_ui import (
             Ms3dUi,
@@ -86,7 +96,10 @@
 
 
 #import blender stuff
-import bpy
+from bpy import (
+        context,
+        ops,
+        )
 import bmesh
 
 
@@ -104,12 +117,12 @@
     def write(self, blender_context):
         """convert bender content to ms3d content and write it to file"""
 
-        t1 = time.time()
+        t1 = time()
         t2 = None
 
         try:
             # setup environment
-            pre_setup_environment(self)
+            pre_setup_environment(self, blender_context)
 
             # create an empty ms3d template
             ms3d_model = Ms3dModel()
@@ -117,12 +130,12 @@
             # inject blender data to ms3d file
             self.from_blender(blender_context, ms3d_model)
 
-            t2 = time.time()
+            t2 = time()
 
             self.file = None
             try:
                 # write ms3d file to disk
-                self.file = io.FileIO(self.filepath, "wb")
+                self.file = io.FileIO(self.options.filepath, "wb")
 
                 ms3d_model.write(self.file)
                 self.file.flush()
@@ -130,24 +143,37 @@
                 if self.file is not None:
                     self.file.close()
 
-            # finalize/restore environment
-            post_setup_environment(self, False)
+            # if option is set, this time will enlargs the io time
+            if (self.options.prop_verbose):
+                ms3d_model.print_internal()
 
+            post_setup_environment(self, blender_context)
+            # restore active object
+            context.scene.objects.active = self.active_object
+
+            if ((not context.scene.objects.active)
+                    and (context.selected_objects)):
+                context.scene.objects.active \
+                        = context.selected_objects[0]
+
+            # restore pre operator undo state
+            context.user_preferences.edit.use_global_undo = self.undo
+
         except Exception:
-            type, value, traceback = sys.exc_info()
+            type, value, traceback = exc_info()
             print("write - exception in try block\n  type: '{0}'\n"
                     "  value: '{1}'".format(type, value, traceback))
 
             if t2 is None:
-                t2 = time.time()
+                t2 = time()
 
             raise
 
         else:
             pass
 
-        t3 = time.time()
-        print(ms3d_str['SUMMARY_IMPORT'].format(
+        t3 = time()
+        print(ms3d_str['SUMMARY_EXPORT'].format(
                 (t3 - t1), (t2 - t1), (t3 - t2)))
 
         return {"FINISHED"}
@@ -155,25 +181,163 @@
 
     ###########################################################################
     def from_blender(self, blender_context, ms3d_model):
-        """ known limitations:
-            - bones unsupported yet
-            - joints unsupported yet
-            - very bad performance
+        blender_mesh_objects = self.create_geometry(blender_context, ms3d_model)
+        self.create_animation(blender_context, ms3d_model, blender_mesh_objects)
 
-        notes:
-            - interpreating a blender-mesh-objects as ms3d-group
-            - only one material allowed per group in ms3d,
-              maybe sub-split a mesh in to material groups???"""
+    ###########################################################################
+    def create_geometry(self, blender_context, ms3d_model):
+        blender_mesh_objects = []
 
+        if self.options.prop_selected:
+            source = blender_context.selected_objects
+        else:
+            source = blender_context.blend_data.objects
+
+        for blender_object in source:
+            if blender_object and blender_object.type == 'MESH' \
+                    and blender_object.is_visible(blender_context.scene):
+                blender_mesh_objects.append(blender_object)
+
+        blender_scene = blender_context.scene
+
+        blender_to_ms3d_vertices = {}
+        blender_to_ms3d_triangles = {}
+        blender_to_ms3d_groups = {}
+        blender_to_ms3d_materials = {}
+        for blender_mesh_object in blender_mesh_objects:
+            ##########################
+            # i have to use BMesh, because there are several custom data stored.
+            # BMesh doesn't support quads_convert_to_tris()
+            # so, i use that very ugly way:
+            # create a complete copy of mesh and bend object data
+            # to be able to apply operations to it.
+            blender_mesh_backup = blender_mesh_object.data
+
+            # get a temporary mesh with applied modifiers
+            blender_mesh_temp = blender_mesh_object.to_mesh(blender_scene,
+                    self.options.prop_apply_modifier,
+                    self.options.prop_apply_modifier_mode)
+            # assign temporary mesh as new object data
+            blender_mesh_object.data = blender_mesh_temp
+
+            # convert to tris
+            enable_edit_mode(True)
+            select_all(True)
+            if ops.mesh.quads_convert_to_tris.poll():
+                ops.mesh.quads_convert_to_tris()
+            enable_edit_mode(False)
+
+            enable_edit_mode(True)
+            bm = bmesh.from_edit_mesh(blender_mesh_temp)
+
+            layer_texture = bm.faces.layers.tex.get(
+                    ms3d_str['OBJECT_LAYER_TEXTURE'])
+            if layer_texture is None:
+                layer_texture = bm.faces.layers.tex.new(
+                        ms3d_str['OBJECT_LAYER_TEXTURE'])
+
+            layer_smoothing_group = bm.faces.layers.int.get(
+                    ms3d_str['OBJECT_LAYER_SMOOTHING_GROUP'])
+            if layer_smoothing_group is None:
+                layer_smoothing_group = bm.faces.layers.int.new(
+                        ms3d_str['OBJECT_LAYER_SMOOTHING_GROUP'])
+
+            layer_group = bm.faces.layers.int.get(
+                    ms3d_str['OBJECT_LAYER_GROUP'])
+            if layer_group is None:
+                layer_group = bm.faces.layers.int.new(
+                        ms3d_str['OBJECT_LAYER_GROUP'])
+
+            layer_uv = bm.loops.layers.uv.get(ms3d_str['OBJECT_LAYER_UV'])
+            if layer_uv is None:
+                layer_uv = bm.loops.layers.uv.new(ms3d_str['OBJECT_LAYER_UV'])
+
+            for bmv in bm.verts:
+                item = blender_to_ms3d_vertices.get(bmv)
+                if item is None:
+                    index = len(ms3d_model._vertices)
+                    ms3d_vertex = Ms3dVertex()
+                    ms3d_vertex.__index = index
+                    ms3d_vertex._vertex = (self.matrix_coordination_system \
+                            * (bmv.co + blender_mesh_object.location))[:]
+                    ms3d_model._vertices.append(ms3d_vertex)
+                    blender_to_ms3d_vertices[bmv] = ms3d_vertex
+
+            for bmf in bm.faces:
+                item = blender_to_ms3d_triangles.get(bmf)
+                if item is None:
+                    index = len(ms3d_model._triangles)
+                    ms3d_triangle = Ms3dTriangle()
+                    ms3d_triangle.__index = index
+                    bmv0 = bmf.verts[0]
+                    bmv1 = bmf.verts[1]
+                    bmv2 = bmf.verts[2]
+                    ms3d_triangle._vertex_indices = (
+                            blender_to_ms3d_vertices[bmv0].__index,
+                            blender_to_ms3d_vertices[bmv1].__index,
+                            blender_to_ms3d_vertices[bmv2].__index,
+                            )

@@ Diff output truncated at 10240 characters. @@


More information about the Bf-extensions-cvs mailing list