[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