Browse Source

Updated Blender exporter to export morph animations.

Again, not to be used yet, very little tested plus code is horrible.
alteredq 14 years ago
parent
commit
5ff33eb3c3

+ 91 - 27
utils/exporters/blender/2.58/scripts/addons/io_mesh_threejs/export_threejs.py

@@ -862,7 +862,8 @@ def handle_texture(id, textures, material, filepath, option_copy_textures):
 # ASCII model generator
 # #####################################################
 
-def generate_ascii_model(meshes, scene,
+def generate_ascii_model(meshes, morphs,
+                         scene,
                          option_vertices,
                          option_vertices_truncate,
                          option_faces,
@@ -875,7 +876,9 @@ def generate_ascii_model(meshes, scene,
                          flipyz,
                          option_scale,
                          option_copy_textures,
-                         filepath):
+                         filepath,
+                         option_animation,
+                         option_frame_step):
 
     vertices = []
 
@@ -935,12 +938,22 @@ def generate_ascii_model(meshes, scene,
             mesh_materials, nmaterial = generate_materials_string(mesh, scene, mesh_extract_colors, object.draw_type, option_copy_textures, filepath, nmaterial)
             materials.append(mesh_materials)
 
-    edges_string = ""
-    nedges = 0
 
     morphTargets_string = ""
     nmorphTarget = 0
 
+    if option_animation:
+        chunks = []
+        for i, morphVertices in enumerate(morphs):
+            morphTarget = '{ "name": "%s_%06d", "vertices": [%s] }' % ("animation", i, morphVertices)
+            chunks.append(morphTarget)
+
+        morphTargets_string = ",\n\t".join(chunks)
+        nmorphTarget = len(morphs)
+
+    edges_string = ""
+    nedges = 0
+
     if option_edges:
         chunks = []
         for edges_mesh, offset in zip(edges, vertex_offsets):
@@ -958,7 +971,7 @@ def generate_ascii_model(meshes, scene,
 
     faces_string, nfaces = generate_faces(normals, uvs, colors, meshes, option_normals, option_colors, option_uv_coords, option_materials, flipyz, option_faces)
 
-    materials_string = ",".join(materials)
+    materials_string = ",\n\n".join(materials)
 
     model_string = TEMPLATE_MODEL_ASCII % {
     "scale" : option_scale,
@@ -999,6 +1012,34 @@ def generate_ascii_model(meshes, scene,
 # Model exporter - export single mesh
 # #####################################################
 
+def extract_meshes(objects, scene, export_single_model, option_scale):
+
+    meshes = []
+
+    for object in objects:
+
+        if object.type == "MESH" and object.THREE_exportGeometry:
+
+            # collapse modifiers into mesh
+
+            mesh = object.to_mesh(scene, True, 'RENDER')
+
+            if not mesh:
+                raise Exception("Error, could not get mesh data from object [%s]" % object.name)
+
+            # that's what Blender's native export_obj.py does
+            # to flip YZ
+
+            if export_single_model:
+                X_ROT = mathutils.Matrix.Rotation(-math.pi/2, 4, 'X')
+                mesh.transform(X_ROT * object.matrix_world)
+
+            mesh.calc_normals()
+            mesh.transform(mathutils.Matrix.Scale(option_scale, 4))
+            meshes.append([mesh, object])
+
+    return meshes
+
 def generate_mesh_string(objects, scene,
                 option_vertices,
                 option_vertices_truncate,
@@ -1013,32 +1054,43 @@ def generate_mesh_string(objects, scene,
                 option_scale,
                 export_single_model,
                 option_copy_textures,
-                filepath):
+                filepath,
+                option_animation,
+                option_frame_step):
 
-    meshes = []
+    meshes = extract_meshes(objects, scene, export_single_model, option_scale)
 
-    for object in objects:
+    morphs = []
+
+    if option_animation:
+
+        original_frame = scene.frame_current # save animation state
+
+        scene_frames = range(scene.frame_start, scene.frame_end + 1, option_frame_step)
 
-        # collapse modifiers into mesh
+        for frame in scene_frames:
+            scene.frame_set(frame, 0.0)
 
-        mesh = object.to_mesh(scene, True, 'RENDER')
+            anim_meshes = extract_meshes(objects, scene, export_single_model, option_scale)
 
-        if not mesh:
-            raise Exception("Error, could not get mesh data from object [%s]" % object.name)
+            frame_vertices = []
 
-        # that's what Blender's native export_obj.py does
-        # to flip YZ
+            for mesh, object in anim_meshes:
+                frame_vertices.extend(mesh.vertices[:])
 
-        if export_single_model:
-            X_ROT = mathutils.Matrix.Rotation(-math.pi/2, 4, 'X')
-            mesh.transform(X_ROT * object.matrix_world)
+            morphVertices = generate_vertices(frame_vertices, option_vertices_truncate, option_vertices)
+            morphs.append(morphVertices)
 
-        mesh.calc_normals()
-        mesh.transform(mathutils.Matrix.Scale(option_scale, 4))
-        meshes.append([mesh, object])
+            # remove temp meshes
 
+            for mesh, object in anim_meshes:
+                bpy.data.meshes.remove(mesh)
 
-    text, model_string = generate_ascii_model(meshes, scene,
+        scene.frame_set(original_frame, 0.0) # restore animation state
+
+
+    text, model_string = generate_ascii_model(meshes, morphs,
+                                scene,
                                 option_vertices,
                                 option_vertices_truncate,
                                 option_faces,
@@ -1051,7 +1103,9 @@ def generate_mesh_string(objects, scene,
                                 flipyz,
                                 option_scale,
                                 option_copy_textures,
-                                filepath)
+                                filepath,
+                                option_animation,
+                                option_frame_step)
 
     # remove temp meshes
 
@@ -1074,7 +1128,9 @@ def export_mesh(objects,
                 flipyz,
                 option_scale,
                 export_single_model,
-                option_copy_textures):
+                option_copy_textures,
+                option_animation,
+                option_frame_step):
 
     """Export single mesh"""
 
@@ -1093,7 +1149,9 @@ def export_mesh(objects,
                 option_scale,
                 export_single_model,
                 option_copy_textures,
-                filepath)
+                filepath,
+                option_animation,
+                option_frame_step)
 
     write_file(filepath, text)
 
@@ -1816,7 +1874,9 @@ def save(operator, context, filepath = "",
                                                         option_scale,
                                                         False,          # export_single_model
                                                         False,          # option_copy_textures
-                                                        filepath)
+                                                        filepath,
+                                                        option_animation,
+                                                        option_frame_step)
 
                         embeds[name] = model_string
 
@@ -1837,7 +1897,9 @@ def save(operator, context, filepath = "",
                                     option_flip_yz,
                                     option_scale,
                                     False,          # export_single_model
-                                    option_copy_textures)
+                                    option_copy_textures,
+                                    option_animation,
+                                    option_frame_step)
 
                     geo_set.add(name)
 
@@ -1866,6 +1928,8 @@ def save(operator, context, filepath = "",
                     option_flip_yz,
                     option_scale,
                     True,            # export_single_model
-                    option_copy_textures)
+                    option_copy_textures,
+                    option_animation,
+                    option_frame_step)
 
     return {'FINISHED'}