Asset Pipeline v2 #145

Closed
Nick Alberelli wants to merge 431 commits from (deleted):feature/asset-pipeline-v2 into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
11 changed files with 70 additions and 49 deletions
Showing only changes of commit 7156375d08 - Show all commits

View File

@ -17,14 +17,13 @@ from .naming import (
get_id_type_name,
)
from .task_layer import get_local_task_layers
from pathlib import Path
from typing import Dict
from .. import constants
def ownership_transfer_data_cleanup(
asset_pipe: 'bpy.types.AssetPipeline',
obj: bpy.types.Object,
) -> None:
"""Remove Transfer Data ownership items if the corrisponding data is missing
@ -32,7 +31,7 @@ def ownership_transfer_data_cleanup(
Args:
obj (bpy.types.Object): Object that contains the transfer data
"""
local_task_layer_keys = get_local_task_layers()
local_task_layer_keys = asset_pipe.get_local_task_layers()
transfer_data = obj.transfer_data_ownership
to_remove = []
for transfer_data_item in transfer_data:
@ -65,13 +64,13 @@ def ownership_get(
asset_pipe = scene.asset_pipeline
asset_pipe.temp_transfer_data.clear()
default_task_layer = get_local_task_layers()[0]
default_task_layer = asset_pipe.get_local_task_layers()[0]
for col in asset_pipe.asset_collection.children:
if col.asset_id_owner == "NONE":
col.asset_id_owner = default_task_layer
task_layer_objs = get_task_layer_objects()
task_layer_objs = get_task_layer_objects(asset_pipe)
for obj in local_col.all_objects:
# TODO REPLACE This is expensive to loop over everything again
@ -87,7 +86,7 @@ def ownership_get(
# Skip items that have no owner
if obj.asset_id_owner == "NONE":
continue
ownership_transfer_data_cleanup(obj)
ownership_transfer_data_cleanup(asset_pipe, obj)
init_transfer_data(scene, obj)
@ -111,6 +110,7 @@ def ownership_set(temp_transfer_data: bpy.types.CollectionProperty) -> None:
def get_invalid_objects(
asset_pipe: 'bpy.types.AssetPipeline',
local_col: bpy.types.Collection,
) -> list[bpy.types.Object]:
"""Returns a list of objects not used in the merge processing,
@ -124,8 +124,8 @@ def get_invalid_objects(
Returns:
list[bpy.types.Object]: List of Invalid Objects
"""
local_task_layer_keys = get_local_task_layers()
task_layer_objs = get_task_layer_objects()
local_task_layer_keys = asset_pipe.get_local_task_layers()
task_layer_objs = get_task_layer_objects(asset_pipe)
invalid_obj = []
for obj in local_col.all_objects:
@ -286,9 +286,8 @@ def import_data_from_lib(
return eval(f"bpy.data.{data_category}['{data_name}']")
def get_task_layer_objects():
asset_pipe = bpy.context.scene.asset_pipeline
local_task_layer_keys = get_local_task_layers()
def get_task_layer_objects(asset_pipe):
local_task_layer_keys = asset_pipe.get_local_task_layers()
local_col = asset_pipe.asset_collection
task_layer_objs = []
for col in local_col.children:

View File

@ -2,7 +2,6 @@ import bpy
from bpy_extras.id_map_utils import get_id_reference_map, get_all_referenced_ids
from .util import get_fundamental_id_type
from .. import constants
from .task_layer import get_local_task_layers
def get_shared_ids(collection: bpy.types.Collection) -> list[bpy.types.ID]:
@ -33,9 +32,9 @@ def init_shared_ids(scene: bpy.types.Scene) -> list[bpy.types.ID]:
Returns:
list[bpy.types.ID]: A list of new 'shared_ids' owned by the file's task layer
"""
task_layer_key = get_local_task_layers()[0]
shared_ids = []
asset_pipe = scene.asset_pipeline
task_layer_key = asset_pipe.get_local_task_layers()[0]
shared_ids = []
local_col = asset_pipe.asset_collection
for id in get_shared_ids(local_col):
if id.asset_id_owner == 'NONE':

View File

@ -4,11 +4,6 @@ from .. import constants
from .. import config
def get_local_task_layers():
local_task_layers = bpy.context.scene.asset_pipeline.local_task_layers
return [task_layer.name for task_layer in local_task_layers]
def get_default_task_layer(td_type: str, name=""):
if td_type == constants.ATTRIBUTE_KEY:
if name in config.DEFAULT_OWNERSHIP_ATTRIBUTES:
@ -16,15 +11,20 @@ def get_default_task_layer(td_type: str, name=""):
return config.DEFAULT_OWNERSHIP[td_type]
def get_transfer_data_owner(td_type_key: str, use_default_owner: bool, name=""):
def get_transfer_data_owner(
asset_pipe: 'bpy.types.AssetPipeline',
td_type_key: str,
use_default_owner: bool,
name="",
):
default_tl = get_default_task_layer(td_type_key, name)
if use_default_owner:
return default_tl
else:
if default_tl in get_local_task_layers():
if default_tl in asset_pipe.get_local_task_layers():
return default_tl
else:
return get_local_task_layers()[0]
return asset_pipe.get_local_task_layers()[0]
def draw_task_layer_selection(

View File

@ -9,8 +9,6 @@ from .transfer_util import (
check_transfer_data_entry,
)
from ..task_layer import get_local_task_layers
def copy_transfer_data_ownership(
transfer_data_item, target_obj: bpy.types.Object

View File

@ -222,15 +222,18 @@ def modifier_is_missing(transfer_data_item):
def init_modifiers(scene, obj, use_default_owner: bool):
asset_pipe = scene.asset_pipeline
td_type_key = constants.MODIFIER_KEY
transfer_data = obj.transfer_data_ownership
task_layer_owner = get_transfer_data_owner(td_type_key, use_default_owner)
task_layer_owner = get_transfer_data_owner(
asset_pipe, td_type_key, use_default_owner
)
for mod in obj.modifiers:
mod.name = task_layer_prefix_name_get(mod.name, task_layer_owner)
# Only add new ownership transfer_data_item if vertex group doesn't have an owner
matches = check_transfer_data_entry(transfer_data, mod.name, td_type_key)
if len(matches) == 0:
scene.asset_pipeline.add_temp_transfer_data(
asset_pipe.add_temp_transfer_data(
name=mod.name,
owner=task_layer_owner,
type=td_type_key,
@ -321,13 +324,16 @@ def constraint_is_missing(transfer_data_item):
def init_constraints(scene, obj, use_default_owner: bool):
td_type_key = constants.CONSTRAINT_KEY
transfer_data = obj.transfer_data_ownership
task_layer_owner = get_transfer_data_owner(td_type_key, use_default_owner)
asset_pipe = scene.asset_pipeline
task_layer_owner = get_transfer_data_owner(
asset_pipe, td_type_key, use_default_owner
)
for const in obj.constraints:
const.name = task_layer_prefix_name_get(const.name, task_layer_owner)
# Only add new ownership transfer_data_item if vertex group doesn't have an owner
matches = check_transfer_data_entry(transfer_data, const.name, td_type_key)
if len(matches) == 0:
scene.asset_pipeline.add_temp_transfer_data(
asset_pipe.add_temp_transfer_data(
name=const.name,
owner=task_layer_owner,
type=td_type_key,
@ -412,6 +418,7 @@ def material_slots_is_missing(transfer_data_item):
def init_material_slots(scene, obj, use_default_owner: bool):
asset_pipe = scene.asset_pipeline
td_type_key = constants.MATERIAL_SLOT_KEY
name = constants.MATERIAL_TRANSFER_DATA_ITEM_NAME
transfer_data = obj.transfer_data_ownership
@ -432,9 +439,9 @@ def init_material_slots(scene, obj, use_default_owner: bool):
matches = check_transfer_data_entry(transfer_data, name, td_type_key)
# Only add new ownership transfer_data_item if vertex group doesn't have an owner
if len(matches) == 0:
scene.asset_pipeline.add_temp_transfer_data(
asset_pipe.add_temp_transfer_data(
name=name,
owner=get_transfer_data_owner(td_type_key, use_default_owner),
owner=get_transfer_data_owner(asset_pipe, td_type_key, use_default_owner),
type=td_type_key,
obj=obj,
use_default_owner=use_default_owner,
@ -689,6 +696,7 @@ def attribute_is_missing(transfer_data_item):
def init_attributes(scene, obj, use_default_owner: bool):
asset_pipe = scene.asset_pipeline
if obj.type != "MESH":
return
transfer_data = obj.transfer_data_ownership
@ -697,10 +705,10 @@ def init_attributes(scene, obj, use_default_owner: bool):
# Only add new ownership transfer_data_item if vertex group doesn't have an owner
matches = check_transfer_data_entry(transfer_data, atttribute.name, td_type_key)
if len(matches) == 0:
scene.asset_pipeline.add_temp_transfer_data(
asset_pipe.add_temp_transfer_data(
name=atttribute.name,
owner=get_transfer_data_owner(
td_type_key, use_default_owner, atttribute.name
asset_pipe, td_type_key, use_default_owner, atttribute.name
),
type=td_type_key,
obj=obj,
@ -761,6 +769,7 @@ def parent_is_missing(transfer_data_item):
def init_parent(scene, obj, use_default_owner: bool):
asset_pipe = scene.asset_pipeline
td_type_key = constants.PARENT_KEY
name = constants.PARENT_TRANSFER_DATA_ITEM_NAME
transfer_data = obj.transfer_data_ownership
@ -771,9 +780,9 @@ def init_parent(scene, obj, use_default_owner: bool):
matches = check_transfer_data_entry(transfer_data, name, td_type_key)
# Only add new ownership transfer_data_item if vertex group doesn't have an owner
if len(matches) == 0:
scene.asset_pipeline.add_temp_transfer_data(
asset_pipe.add_temp_transfer_data(
name=name,
owner=get_transfer_data_owner(td_type_key, use_default_owner),
owner=get_transfer_data_owner(asset_pipe, td_type_key, use_default_owner),
type=td_type_key,
obj=obj,
use_default_owner=use_default_owner,

View File

@ -1,6 +1,6 @@
import bpy
from ... import constants
from ..task_layer import draw_task_layer_selection, get_local_task_layers
from ..task_layer import draw_task_layer_selection
def draw_transfer_data_type(
@ -30,7 +30,9 @@ def draw_transfer_data_type(
if transfer_data_item.get("surrender"):
enabled = (
False if transfer_data_item.owner in get_local_task_layers() else True
False
if transfer_data_item.owner in asset_pipe.get_local_task_layers()
else True
)
row.operator(
"assetpipe.update_surrendered_transfer_data"

View File

@ -104,15 +104,18 @@ def transfer_data_item_init(
data_list (bpy.types.CollectionProperty): Collection Property containing a type of possible transfer data e.g. obj.modifiers
td_type_key (str): Key for the transfer data type
"""
asset_pipe = scene.asset_pipeline
transfer_data = obj.transfer_data_ownership
for item in data_list:
# Only add new ownership transfer_data_item if vertex group doesn't have an owner
matches = check_transfer_data_entry(transfer_data, item.name, td_type_key)
if len(matches) == 0:
scene.asset_pipeline.add_temp_transfer_data(
asset_pipe.add_temp_transfer_data(
name=item.name,
owner=get_transfer_data_owner(td_type_key, use_default_owner),
owner=get_transfer_data_owner(
asset_pipe, td_type_key, use_default_owner
),
type=td_type_key,
obj=obj,
use_default_owner=use_default_owner,

View File

@ -5,7 +5,6 @@ from pathlib import Path
from .merge.naming import task_layer_prefix_transfer_data_update
from .merge.task_layer import (
draw_task_layer_selection,
get_local_task_layers,
)
from .merge.publish import get_next_published_file, find_all_published
from .images import save_images
@ -692,6 +691,7 @@ class ASSETPIPE_OT_batch_ownership_change(bpy.types.Operator):
return [item for item in unfiltered_list if self.name_filter in item.name]
def _get_transfer_data_to_update(self, context):
asset_pipe = context.scene.asset_pipeline
objs = self._get_objects(context)
transfer_data_items_to_update = []
if self.data_type == "TRANSFER_DATA":
@ -709,7 +709,7 @@ class ASSETPIPE_OT_batch_ownership_change(bpy.types.Operator):
return [
item
for item in transfer_data_items_to_update
if item.owner in get_local_task_layers()
if item.owner in asset_pipe.get_local_task_layers()
]
return transfer_data_items_to_update
@ -721,12 +721,13 @@ class ASSETPIPE_OT_batch_ownership_change(bpy.types.Operator):
return asset_objs if self.data_source == "ALL" else selected_asset_objs
def _get_filtered_objects(self, context):
asset_pipe = context.scene.asset_pipeline
objs = self._get_objects(context)
if self.filter_owners == "LOCAL" and self.data_type == "OBJECT":
return [
item
for item in self._filter_by_name(context, objs)
if item.asset_id_owner in get_local_task_layers()
if item.asset_id_owner in asset_pipe.get_local_task_layers()
]
if self.filter_owners == "OWNED" and self.data_type == "OBJECT":
return [
@ -803,6 +804,7 @@ class ASSETPIPE_OT_batch_ownership_change(bpy.types.Operator):
bottom_label_split.label(text=f"Change Ownership on {length} {data_type_name}")
def execute(self, context: bpy.types.Context):
asset_pipe = context.scene.asset_pipeline
objs = self._get_filtered_objects(context)
if self.data_type == "OBJECT":
@ -813,7 +815,10 @@ class ASSETPIPE_OT_batch_ownership_change(bpy.types.Operator):
for transfer_data_item_to_update in transfer_data_items_to_update:
if self.surrender_selection:
if transfer_data_item_to_update.owner in get_local_task_layers():
if (
transfer_data_item_to_update.owner
in asset_pipe.get_local_task_layers()
):
transfer_data_item_to_update.surrender = True
continue
transfer_data_item_to_update.owner = self.owner_selection

View File

@ -1,7 +1,6 @@
import bpy
from typing import List
from . import constants
from .merge.task_layer import get_local_task_layers
from .config import get_task_layer_presets_path
from pathlib import Path
from .prefs import get_addon_prefs
@ -130,6 +129,9 @@ class AssetPipeline(bpy.types.PropertyGroup):
new_local_task_layer = self.local_task_layers.add()
new_local_task_layer.name = task_layer.name
def get_local_task_layers(self):
return [task_layer.name for task_layer in self.local_task_layers]
# UI BOOLS: used to show/hide transfer data elements
# The names are also hard coded in constants.py under TRANSFER_DATA_TYPES
# any changes will need to be reflected both here and in that enum

View File

@ -15,7 +15,6 @@ from .merge.transfer_data.transfer_ui import draw_transfer_data
from .merge.shared_ids import get_shared_id_icon
from . import constants
from . import config
from .merge.task_layer import get_local_task_layers
def sync_poll(cls, context):
@ -33,7 +32,8 @@ def sync_invoke(self, context):
self._temp_transfer_data.clear()
self._invalid_objs.clear()
local_col = context.scene.asset_pipeline.asset_collection
asset_pipe = context.scene.asset_pipeline
local_col = asset_pipe.asset_collection
if not local_col:
self.report({'ERROR'}, "Top level collection could not be found")
return {'CANCELLED'}
@ -45,7 +45,7 @@ def sync_invoke(self, context):
ownership_get(local_col, context.scene)
self._invalid_objs = get_invalid_objects(local_col)
self._invalid_objs = get_invalid_objects(asset_pipe, local_col)
self._shared_ids = init_shared_ids(context.scene)
@ -95,9 +95,10 @@ def sync_execute_update_ownership(self, context):
def sync_execute_prepare_sync(self, context):
asset_pipe = context.scene.asset_pipeline
self._current_file = Path(bpy.data.filepath)
self._temp_dir = Path(bpy.app.tempdir).parent
self._task_layer_keys = get_local_task_layers()
self._task_layer_keys = asset_pipe.get_local_task_layers()
# TODO Check if file contains a valid task layer
# if self._task_layer_key == "NONE":
# self.report({'ERROR'}, "Current File Name doesn't contain valid task layer")

View File

@ -5,7 +5,6 @@ from .merge.transfer_data.transfer_ui import draw_transfer_data
from .merge.task_layer import draw_task_layer_selection
from .config import verify_json_data
from . import constants
from .merge.task_layer import get_local_task_layers
class ASSETPIPE_PT_sync(bpy.types.Panel):
@ -131,7 +130,11 @@ class ASSETPIPE_PT_ownership_inspector(bpy.types.Panel):
row.label(text=f"{obj.name}: ", icon="OBJECT_DATA")
if obj.get("asset_id_surrender"):
enabled = False if obj.asset_id_owner in get_local_task_layers() else True
enabled = (
False
if obj.asset_id_owner in asset_pipe.get_local_task_layers()
else True
)
row.operator("assetpipe.update_surrendered_object")
row.enabled = enabled
else: