[Bf-extensions-cvs] [800399ec] master: glTF exporter: check if object is really instanced in scene before exporting it

Julien Duroure noreply at git.blender.org
Sun Jun 23 09:04:16 CEST 2019


Commit: 800399ec0b77cece262ad884ee6e279fb22551d1
Author: Julien Duroure
Date:   Sun Jun 23 09:03:51 2019 +0200
Branches: master
https://developer.blender.org/rBA800399ec0b77cece262ad884ee6e279fb22551d1

glTF exporter: check if object is really instanced in scene before exporting it

===================================================================

M	io_scene_gltf2/__init__.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather_animation_channel_target.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather_skins.py

===================================================================

diff --git a/io_scene_gltf2/__init__.py b/io_scene_gltf2/__init__.py
index 2b999b50..3b90cc15 100755
--- a/io_scene_gltf2/__init__.py
+++ b/io_scene_gltf2/__init__.py
@@ -15,7 +15,7 @@
 bl_info = {
     'name': 'glTF 2.0 format',
     'author': 'Julien Duroure, Norbert Nopper, Urs Hanselmann, Moritz Becher, Benjamin Schmithüsen, Jim Eckerlein, and many external contributors',
-    "version": (0, 9, 30),
+    "version": (0, 9, 31),
     'blender': (2, 80, 0),
     'location': 'File > Import-Export',
     'description': 'Import-Export as glTF 2.0',
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather.py
index 63254899..013debdc 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather.py
@@ -49,7 +49,7 @@ def __gather_scene(blender_scene, export_settings):
 
     for blender_object in blender_scene.objects:
         if blender_object.parent is None:
-            node = gltf2_blender_gather_nodes.gather_node(blender_object, export_settings)
+            node = gltf2_blender_gather_nodes.gather_node(blender_object, blender_scene, export_settings)
             if node is not None:
                 scene.nodes.append(node)
 
@@ -60,7 +60,7 @@ def __gather_animations(blender_scene, export_settings):
     animations = []
     for blender_object in blender_scene.objects:
         # First check if this object is exported or not. Do not export animation of not exported object
-        obj_node = gltf2_blender_gather_nodes.gather_node(blender_object, export_settings)
+        obj_node = gltf2_blender_gather_nodes.gather_node(blender_object, blender_scene, export_settings)
         if obj_node is not None:
             animations += gltf2_blender_gather_animations.gather_animations(blender_object, export_settings)
     return animations
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_animation_channel_target.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_animation_channel_target.py
index 5b2f28e8..2c458742 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_animation_channel_target.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_animation_channel_target.py
@@ -68,7 +68,7 @@ def __gather_node(channels: typing.Tuple[bpy.types.FCurve],
         if isinstance(blender_bone, bpy.types.PoseBone):
             return gltf2_blender_gather_joints.gather_joint(blender_bone, export_settings)
 
-    return gltf2_blender_gather_nodes.gather_node(blender_object, export_settings)
+    return gltf2_blender_gather_nodes.gather_node(blender_object, None, export_settings)
 
 
 def __gather_path(channels: typing.Tuple[bpy.types.FCurve],
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py
index ae228eb9..dcc1d7ad 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py
@@ -31,13 +31,16 @@ from io_scene_gltf2.io.com import gltf2_io_extensions
 
 
 @cached
-def gather_node(blender_object, export_settings):
-    if not __filter_node(blender_object, export_settings):
+def gather_node(blender_object, blender_scene, export_settings):
+    # If blender_scene is None, we are coming from animation export
+    # Check to know if object is exported is already done, so we don't check
+    # again if object is instanced in scene : this check was already done when exporting object itself
+    if not __filter_node(blender_object, blender_scene, export_settings):
         return None
 
     node = gltf2_io.Node(
         camera=__gather_camera(blender_object, export_settings),
-        children=__gather_children(blender_object, export_settings),
+        children=__gather_children(blender_object, blender_scene, export_settings),
         extensions=__gather_extensions(blender_object, export_settings),
         extras=__gather_extras(blender_object, export_settings),
         matrix=__gather_matrix(blender_object, export_settings),
@@ -66,11 +69,15 @@ def gather_node(blender_object, export_settings):
     return node
 
 
-def __filter_node(blender_object, export_settings):
+def __filter_node(blender_object, blender_scene, export_settings):
     if blender_object.users == 0:
         return False
     if export_settings[gltf2_blender_export_keys.SELECTED] and blender_object.select_get() is False:
         return False
+    if blender_scene is not None:
+        instanced =  any([blender_object.name in layer.objects for layer in blender_scene.view_layers])
+        if instanced is False:
+            return False
 
     return True
 
@@ -82,7 +89,7 @@ def __gather_camera(blender_object, export_settings):
     return gltf2_blender_gather_cameras.gather_camera(blender_object.data, export_settings)
 
 
-def __gather_children(blender_object, export_settings):
+def __gather_children(blender_object, blender_scene, export_settings):
     children = []
     # standard children
     for child_object in blender_object.children:
@@ -91,13 +98,13 @@ def __gather_children(blender_object, export_settings):
             # as the object should be a child of the specific bone,
             # not the Armature object
             continue
-        node = gather_node(child_object, export_settings)
+        node = gather_node(child_object, blender_scene, export_settings)
         if node is not None:
             children.append(node)
     # blender dupli objects
     if blender_object.instance_type == 'COLLECTION' and blender_object.instance_collection:
         for dupli_object in blender_object.instance_collection.objects:
-            node = gather_node(dupli_object, export_settings)
+            node = gather_node(dupli_object, blender_scene, export_settings)
             if node is not None:
                 children.append(node)
 
@@ -124,7 +131,7 @@ def __gather_children(blender_object, export_settings):
             parent_joint = find_parent_joint(root_joints, child.parent_bone)
             if not parent_joint:
                 continue
-            child_node = gather_node(child, export_settings)
+            child_node = gather_node(child, None, export_settings)
             if child_node is None:
                 continue
             blender_bone = blender_object.pose.bones[parent_joint.name]
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_skins.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_skins.py
index 3d2741bd..71682e94 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_skins.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_skins.py
@@ -140,5 +140,5 @@ def __gather_name(blender_object, export_settings):
 
 def __gather_skeleton(blender_object, export_settings):
     # In the future support the result of https://github.com/KhronosGroup/glTF/pull/1195
-    return None  # gltf2_blender_gather_nodes.gather_node(blender_object, export_settings)
+    return None  # gltf2_blender_gather_nodes.gather_node(blender_object, blender_scene, export_settings)



More information about the Bf-extensions-cvs mailing list