Skip to content
This repository has been archived by the owner on Sep 20, 2024. It is now read-only.

Blender: Fix Layout Family Versioning #4228

Merged
merged 4 commits into from
Dec 15, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 63 additions & 20 deletions openpype/hosts/blender/plugins/load/load_layout_blend.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,14 @@ def _remove(self, asset_group):
bpy.data.objects.remove(obj)

def _remove_asset_and_library(self, asset_group):
if not asset_group.get(AVALON_PROPERTY):
return

libpath = asset_group.get(AVALON_PROPERTY).get('libpath')

if not libpath:
return

# Check how many assets use the same library
count = 0
for obj in bpy.data.collections.get(AVALON_CONTAINERS).all_objects:
Expand All @@ -63,10 +69,12 @@ def _remove_asset_and_library(self, asset_group):
# If it is the last object to use that library, remove it
if count == 1:
library = bpy.data.libraries.get(bpy.path.basename(libpath))
bpy.data.libraries.remove(library)
if library:
bpy.data.libraries.remove(library)

def _process(
self, libpath, asset_group, group_name, asset, representation, actions
self, libpath, asset_group, group_name, asset, representation,
actions, anim_instances
):
with bpy.data.libraries.load(
libpath, link=True, relative=False
Expand Down Expand Up @@ -140,12 +148,12 @@ def _process(
elif local_obj.type == 'ARMATURE':
plugin.prepare_data(local_obj.data)

if action is not None:
if action:
if local_obj.animation_data is None:
local_obj.animation_data_create()
local_obj.animation_data.action = action
elif (local_obj.animation_data and
local_obj.animation_data.action is not None):
local_obj.animation_data.action):
plugin.prepare_data(
local_obj.animation_data.action)

Expand All @@ -157,19 +165,26 @@ def _process(
t.id = local_obj

elif local_obj.type == 'EMPTY':
creator_plugin = get_legacy_creator_by_name("CreateAnimation")
if not creator_plugin:
raise ValueError("Creator plugin \"CreateAnimation\" was "
"not found.")

legacy_create(
creator_plugin,
name=local_obj.name.split(':')[-1] + "_animation",
asset=asset,
options={"useSelection": False,
"asset_group": local_obj},
data={"dependencies": representation}
)
if (not anim_instances or
(anim_instances and
local_obj.name not in anim_instances.keys())):
avalon = local_obj.get(AVALON_PROPERTY)
if avalon and avalon.get('family') == 'rig':
creator_plugin = get_legacy_creator_by_name(
"CreateAnimation")
if not creator_plugin:
raise ValueError(
"Creator plugin \"CreateAnimation\" was "
"not found.")

legacy_create(
creator_plugin,
name=local_obj.name.split(':')[-1] + "_animation",
asset=asset,
options={"useSelection": False,
"asset_group": local_obj},
data={"dependencies": representation}
)

if not local_obj.get(AVALON_PROPERTY):
local_obj[AVALON_PROPERTY] = dict()
Expand Down Expand Up @@ -272,7 +287,8 @@ def process_asset(
avalon_container.objects.link(asset_group)

objects = self._process(
libpath, asset_group, group_name, asset, representation, None)
libpath, asset_group, group_name, asset, representation,
None, None)

for child in asset_group.children:
if child.get(AVALON_PROPERTY):
Expand Down Expand Up @@ -352,10 +368,20 @@ def update(self, container: Dict, representation: Dict):
return

actions = {}
anim_instances = {}

for obj in asset_group.children:
obj_meta = obj.get(AVALON_PROPERTY)
if obj_meta.get('family') == 'rig':
# Get animation instance
collections = list(obj.users_collection)
for c in collections:
avalon = c.get(AVALON_PROPERTY)
if avalon and avalon.get('family') == 'animation':
anim_instances[obj.name] = c.name
break

# Get armature's action
rig = None
for child in obj.children:
if child.type == 'ARMATURE':
Expand Down Expand Up @@ -384,9 +410,26 @@ def update(self, container: Dict, representation: Dict):
# If it is the last object to use that library, remove it
if count == 1:
library = bpy.data.libraries.get(bpy.path.basename(group_libpath))
bpy.data.libraries.remove(library)
if library:
bpy.data.libraries.remove(library)

asset = container.get("asset_name").split("_")[0]

self._process(
str(libpath), asset_group, object_name, asset,
str(representation.get("_id")), actions, anim_instances
)

self._process(str(libpath), asset_group, object_name, actions)
# Link the new objects to the animation collection
for inst in anim_instances.keys():
try:
obj = bpy.data.objects[inst]
bpy.data.collections[anim_instances[inst]].objects.link(obj)
except KeyError:
self.log.info(f"Object {inst} does not exist anymore.")
coll = bpy.data.collections.get(anim_instances[inst])
if (coll):
bpy.data.collections.remove(coll)

avalon_container = bpy.data.collections.get(AVALON_CONTAINERS)
for child in asset_group.children:
Expand Down