[Bf-extensions-cvs] [191bcee5] master: glTF export: manage collection instances / linked collection / armature proxy

Julien Duroure noreply at git.blender.org
Thu Mar 19 22:44:58 CET 2020


Commit: 191bcee579b30af4098fb2af701470f8b05b6065
Author: Julien Duroure
Date:   Thu Mar 19 22:44:06 2020 +0100
Branches: master
https://developer.blender.org/rBA191bcee579b30af4098fb2af701470f8b05b6065

glTF export: manage collection instances / linked collection / armature proxy

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

M	io_scene_gltf2/__init__.py
M	io_scene_gltf2/blender/exp/gltf2_blender_export.py
M	io_scene_gltf2/blender/exp/gltf2_blender_extract.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_animation_channels.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather_animation_sampler_keyframes.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather_cache.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather_joints.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather_primitives.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 01a4402c..b52fe818 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": (1, 2, 50),
+    "version": (1, 2, 51),
     'blender': (2, 82, 7),
     'location': 'File > Import-Export',
     'description': 'Import-Export as glTF 2.0',
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_export.py b/io_scene_gltf2/blender/exp/gltf2_blender_export.py
index 6d9ab8bb..2989ec31 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_export.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_export.py
@@ -30,7 +30,8 @@ from io_scene_gltf2.io.exp.gltf2_io_user_extensions import export_user_extension
 def save(context, export_settings):
     """Start the glTF 2.0 export and saves to content either to a .gltf or .glb file."""
     if bpy.context.active_object is not None:
-        bpy.ops.object.mode_set(mode='OBJECT')
+        if bpy.context.active_object.mode != "OBJECT": # For linked object, you can't force OBJECT mode
+            bpy.ops.object.mode_set(mode='OBJECT')
 
     original_frame = bpy.context.scene.frame_current
     if not export_settings['gltf_current_frame']:
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_extract.py b/io_scene_gltf2/blender/exp/gltf2_blender_extract.py
index bb7451ad..955c5d13 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_extract.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_extract.py
@@ -423,7 +423,7 @@ def extract_primitive_pack(a, indices, use_tangents):
     return result_primitive
 
 
-def extract_primitives(glTF, blender_mesh, blender_object, blender_vertex_groups, modifiers, export_settings):
+def extract_primitives(glTF, blender_mesh, library, blender_object, blender_vertex_groups, modifiers, export_settings):
     """
     Extract primitives from a mesh. Polygons are triangulated and sorted by material.
 
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather.py
index f08a379b..c6fd2c38 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather.py
@@ -51,9 +51,13 @@ def __gather_scene(blender_scene, export_settings):
         nodes=[]
     )
 
-    for blender_object in blender_scene.objects:
-        if blender_object.parent is None:
-            node = gltf2_blender_gather_nodes.gather_node(blender_object, blender_scene, export_settings)
+    for _blender_object in [obj for obj in blender_scene.objects if obj.proxy is None]:
+        if _blender_object.parent is None:
+            blender_object = _blender_object.proxy if _blender_object.proxy else _blender_object
+            node = gltf2_blender_gather_nodes.gather_node(
+                blender_object,
+                blender_object.library.name if blender_object.library else None,
+                blender_scene, None, export_settings)
             if node is not None:
                 scene.nodes.append(node)
 
@@ -66,11 +70,17 @@ def __gather_animations(blender_scene, export_settings):
     animations = []
     merged_tracks = {}
 
-    for blender_object in blender_scene.objects:
+    for _blender_object in blender_scene.objects:
+
+        blender_object = _blender_object.proxy if _blender_object.proxy else _blender_object
+
         # 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, blender_scene, export_settings)
+        obj_node = gltf2_blender_gather_nodes.gather_node(blender_object,
+            blender_object.library.name if blender_object.library else None,
+            blender_scene, None, export_settings)
         if obj_node is not None:
-            animations_, merged_tracks = gltf2_blender_gather_animations.gather_animations(blender_object, merged_tracks, len(animations), export_settings)
+            # Check was done on armature, but use here the _proxy object, because this is where the animation is
+            animations_, merged_tracks = gltf2_blender_gather_animations.gather_animations(_blender_object, merged_tracks, len(animations), export_settings)
             animations += animations_
 
     if export_settings['gltf_nla_strips'] is False:
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 9dfbea34..6edf52cc 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
@@ -72,7 +72,9 @@ def __gather_node(channels: typing.Tuple[bpy.types.FCurve],
                   ) -> gltf2_io.Node:
 
     if driver_obj is not None:
-        return gltf2_blender_gather_nodes.gather_node(driver_obj, None, export_settings)
+        return gltf2_blender_gather_nodes.gather_node(driver_obj,
+            driver_obj.library.name if driver_obj.library else None,
+            None, None, export_settings)
 
     if blender_object.type == "ARMATURE":
         # TODO: get joint from fcurve data_path and gather_joint
@@ -84,13 +86,17 @@ def __gather_node(channels: typing.Tuple[bpy.types.FCurve],
 
         if isinstance(blender_bone, bpy.types.PoseBone):
             if export_settings["gltf_def_bones"] is False:
-                return gltf2_blender_gather_joints.gather_joint(blender_bone, export_settings)
+                obj = blender_object.proxy if blender_object.proxy else blender_object
+                return gltf2_blender_gather_joints.gather_joint(obj, blender_bone, export_settings)
             else:
                 bones, _, _ = gltf2_blender_gather_skins.get_bone_tree(None, blender_object)
                 if blender_bone.name in [b.name for b in bones]:
-                    return gltf2_blender_gather_joints.gather_joint(blender_bone, export_settings)
+                    obj = blender_object.proxy if blender_object.proxy else blender_object
+                    return gltf2_blender_gather_joints.gather_jointb(obj, blender_bone, export_settings)
 
-    return gltf2_blender_gather_nodes.gather_node(blender_object, None, export_settings)
+    return gltf2_blender_gather_nodes.gather_node(blender_object,
+        blender_object.library.name if blender_object.library else None,
+        None, None, export_settings)
 
 
 def __gather_path(channels: typing.Tuple[bpy.types.FCurve],
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_animation_channels.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_animation_channels.py
index 99a0ef91..6868047e 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_animation_channels.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_animation_channels.py
@@ -97,7 +97,8 @@ def gather_animation_channels(blender_action: bpy.types.Action,
 
 
         # Retrieve channels for drivers, if needed
-        drivers_to_manage = gltf2_blender_gather_drivers.get_sk_drivers(blender_object)
+        obj_driver = blender_object.proxy if blender_object.proxy else blender_object
+        drivers_to_manage = gltf2_blender_gather_drivers.get_sk_drivers(obj_driver)
         for obj, fcurves in drivers_to_manage:
             channel = __gather_animation_channel(
                 fcurves,
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_animation_sampler_keyframes.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_animation_sampler_keyframes.py
index 89559719..6fa5a11d 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_animation_sampler_keyframes.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_animation_sampler_keyframes.py
@@ -168,7 +168,8 @@ def get_bone_matrix(blender_object_if_armature: typing.Optional[bpy.types.Object
 
 
         # If some drivers must be evaluated, do it here, to avoid to have to change frame by frame later
-        drivers_to_manage = get_sk_drivers(blender_object_if_armature)
+        obj_driver = blender_object_if_armature.proxy if blender_object_if_armature.proxy else blender_object_if_armature
+        drivers_to_manage = get_sk_drivers(obj_driver)
         for dr_obj, dr_fcurves in drivers_to_manage:
             vals = get_sk_driver_values(dr_obj, frame, dr_fcurves)
 
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_cache.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_cache.py
index e82d5929..7f05f751 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_cache.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_cache.py
@@ -39,7 +39,7 @@ def cached(func):
             export_settings = args[-1]
             cache_key_args = args[:-1]
 
-        __by_name = [bpy.types.Object, bpy.types.Scene, bpy.types.Material, bpy.types.Action, bpy.types.Mesh]
+        __by_name = [bpy.types.Object, bpy.types.Scene, bpy.types.Material, bpy.types.Action, bpy.types.Mesh, bpy.types.PoseBone]
 
         # we make a tuple from the function arguments so that they can be used as a key to the cache
         cache_key = ()
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_joints.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_joints.py
index 6b693575..a95efb91 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_joints.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_joints.py
@@ -24,7 +24,7 @@ from io_scene_gltf2.blender.exp import gltf2_blender_gather_skins
 
 
 @cached
-def gather_joint(blender_bone, export_settings):
+def gather_joint(blender_object, blender_bone, export_settings):
     """
     Generate a glTF2 node from a blender bone, as joints in glTF2 are simply nodes.
 
@@ -59,12 +59,12 @@ def gather_joint(blender_bone, export_settings):
 
     if export_settings["gltf_def_bones"] is False:
         for bone in blender_bone.children:
-            children.append(gather_joint(bone, export_settings))
+            children.append(gather_joint(blender_object, bone, export_settings))
     else:
         _, children

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list