Преглед на файлове

Blender support for instances

David Catuhe преди 11 години
родител
ревизия
97b3e331aa
променени са 3 файла, в които са добавени 55 реда и са изтрити 9 реда
  1. 17 0
      Babylon/Loading/Plugins/babylon.babylonFileLoader.js
  2. 34 5
      Exporters/Blender/io_export_babylon.py
  3. 4 4
      babylon.1.12-beta.js

+ 17 - 0
Babylon/Loading/Plugins/babylon.babylonFileLoader.js

@@ -629,6 +629,23 @@ var BABYLON = BABYLON || {};
             mesh.layerMask = 0xFFFFFFFF;
         }
 
+        // Instances
+        if (parsedMesh.instances) {
+            for (var index = 0; index < parsedMesh.instances.length; index++) {
+                var parsedInstance = parsedMesh.instances[index];
+                var instance = mesh.createInstance(parsedInstance.name);
+                instance.position = BABYLON.Vector3.FromArray(parsedInstance.position);
+
+                if (parsedInstance.rotationQuaternion) {
+                    instance.rotationQuaternion = BABYLON.Quaternion.FromArray(parsedInstance.rotationQuaternion);
+                } else if (parsedInstance.rotation) {
+                    instance.rotation = BABYLON.Vector3.FromArray(parsedInstance.rotation);
+                }
+
+                instance.scaling = BABYLON.Vector3.FromArray(parsedInstance.scaling);
+            }
+        }
+
         return mesh;
     };
 

+ 34 - 5
Exporters/Blender/io_export_babylon.py

@@ -45,6 +45,8 @@ class Export_babylon(bpy.types.Operator, ExportHelper):
 
     filename_ext = ".babylon"
     filepath = ""
+
+    alreadyExportedMeshAsInstance = []
     
     # global_scale = FloatProperty(name="Scale", min=0.01, max=1000.0, default=1.0)
 
@@ -85,8 +87,10 @@ class Export_babylon(bpy.types.Operator, ExportHelper):
     def write_color(file_handler, name, color):
         file_handler.write(",\""+name+"\":[" + "%.4f,%.4f,%.4f"%(color.r,color.g,color.b) + "]")
 
-    def write_vector(file_handler, name, vector):
-        file_handler.write(",\""+name+"\":[" + "%.4f,%.4f,%.4f"%(vector.x,vector.z,vector.y) + "]")
+    def write_vector(file_handler, name, vector, noComma=False):
+        if noComma == False:
+            file_handler.write(",")
+        file_handler.write("\""+name+"\":[" + "%.4f,%.4f,%.4f"%(vector.x,vector.z,vector.y) + "]")
 
     def write_quaternion(file_handler, name, quaternion):
         file_handler.write(",\""+name+"\":[" + "%.4f,%.4f,%.4f,%.4f"%(quaternion.x,quaternion.z,quaternion.y, -quaternion.w) + "]")
@@ -695,8 +699,7 @@ class Export_babylon(bpy.types.Operator, ExportHelper):
             first = False
         file_handler.write("]")
 
-        #Export Animations
-        
+        # Export Animations        
         rotAnim = False
         locAnim = False
         scaAnim = False
@@ -722,6 +725,27 @@ class Export_babylon(bpy.types.Operator, ExportHelper):
                 Export_babylon.write_int(file_handler, "autoAnimateTo", bpy.context.scene.frame_end - bpy.context.scene.frame_start + 1)
                 Export_babylon.write_bool(file_handler, "autoAnimateLoop", True)
 
+        # Instances
+        first = True
+        file_handler.write(",\"instances\":[")
+        for other in [object for object in scene.objects]:
+            if other.type == 'MESH' and other != object: 
+                if other.data.name == object.data.name:
+                    Export_babylon.alreadyExportedMeshAsInstance.append(object.data.name)
+                    if first == False:
+                        file_handler.write(",")
+                    file_handler.write("{")
+                    world = other.matrix_world
+
+                    loc, rot, scale = world.decompose()
+                    Export_babylon.write_string(file_handler, "name", other.name, True)
+                    Export_babylon.write_vector(file_handler, "position", loc)
+                    Export_babylon.write_vectorScaled(file_handler, "rotation", rot.to_euler("XYZ"), -1)
+                    Export_babylon.write_vector(file_handler, "scaling", scale)
+
+                    file_handler.write("}")
+                    first = False
+        file_handler.write("]")
 
         # Closing
         file_handler.write("}")
@@ -902,6 +926,8 @@ class Export_babylon(bpy.types.Operator, ExportHelper):
         bpy.ops.screen.animation_cancel()
         currentFrame = bpy.context.scene.frame_current
         bpy.context.scene.frame_set(0)
+
+        Export_babylon.alreadyExportedMeshAsInstance = []
     
         file_handler.write("{")
         file_handler.write("\"autoClear\":true")
@@ -960,8 +986,11 @@ class Export_babylon(bpy.types.Operator, ExportHelper):
         file_handler.write(",\"meshes\":[")
         multiMaterials = []
         first = True
-        for object in [object for object in scene.objects]:
+        for object in [object for object in reversed(scene.objects)]:
             if object.type == 'MESH' or object.type == 'EMPTY':
+                if object.data and object.data.name in Export_babylon.alreadyExportedMeshAsInstance:
+                    continue
+
                 if first != True:
                     file_handler.write(",")
 

Файловите разлики са ограничени, защото са твърде много
+ 4 - 4
babylon.1.12-beta.js