From fd02f3f4d79090f440d046fc7aa523146fd4acc1 Mon Sep 17 00:00:00 2001 From: Colin Basnett Date: Thu, 9 Mar 2023 01:51:04 -0800 Subject: [PATCH] Now using new BDK addon operators to load the materials --- io_scene_psk_psa/helpers.py | 5 ++++ io_scene_psk_psa/psa/builder.py | 2 +- io_scene_psk_psa/psk/importer.py | 41 +++++++------------------------- 3 files changed, 14 insertions(+), 34 deletions(-) diff --git a/io_scene_psk_psa/helpers.py b/io_scene_psk_psa/helpers.py index 81005be..1773a00 100644 --- a/io_scene_psk_psa/helpers.py +++ b/io_scene_psk_psa/helpers.py @@ -4,6 +4,7 @@ import typing from collections import Counter from typing import List, Iterable +import addon_utils import bpy.types from bpy.types import NlaStrip, Object, AnimData @@ -176,3 +177,7 @@ def get_export_bone_names(armature_object: Object, bone_filter_mode: str, bone_g f'Additional debugging information has been written to the console.') return bone_names + + +def is_bdk_addon_loaded(): + return addon_utils.check('bdk_addon')[1] diff --git a/io_scene_psk_psa/psa/builder.py b/io_scene_psk_psa/psa/builder.py index d23e55c..3ef34eb 100644 --- a/io_scene_psk_psa/psa/builder.py +++ b/io_scene_psk_psa/psa/builder.py @@ -21,7 +21,7 @@ class PsaExportSequence: class PsaBuildOptions: def __init__(self): - self.animation_data: AnimData + self.animation_data: AnimData = None self.sequences: List[PsaExportSequence] = [] self.bone_filter_mode = 'ALL' self.bone_group_indices: List[int] = [] diff --git a/io_scene_psk_psa/psk/importer.py b/io_scene_psk_psa/psk/importer.py index 08ef007..8672165 100644 --- a/io_scene_psk_psa/psk/importer.py +++ b/io_scene_psk_psa/psk/importer.py @@ -1,7 +1,6 @@ import os import sys from math import inf -from pathlib import Path from typing import Optional, List import bmesh @@ -14,8 +13,7 @@ from mathutils import Quaternion, Vector, Matrix from .data import Psk from .reader import read_psk -from ..bdk import UReference -from ..helpers import rgb_to_srgb +from ..helpers import rgb_to_srgb, is_bdk_addon_loaded class PskImportOptions: @@ -55,30 +53,6 @@ class PskImportResult: self.warnings: List[str] = [] -def load_bdk_material(reference: UReference): - if reference is None: - return None - asset_libraries = bpy.context.preferences.filepaths.asset_libraries - asset_library_name = 'bdk-library' - try: - asset_library = next(filter(lambda x: x.name == asset_library_name, asset_libraries)) - except StopIteration: - return None - asset_library_path = Path(asset_library.path) - # TODO: going to be very slow for automation! - blend_files = [fp for fp in asset_library_path.glob(f'**/{reference.package_name}.blend') if fp.is_file()] - if len(blend_files) == 0: - return None - blend_file = str(blend_files[0]) - with bpy.data.libraries.load(blend_file, link=True, relative=False, assets_only=True) as (data_in, data_out): - if reference.object_name in data_in.materials: - data_out.materials = [reference.object_name] - else: - return None - material = bpy.data.materials[reference.object_name] - return material - - def import_psk(psk: Psk, context, options: PskImportOptions) -> PskImportResult: result = PskImportResult() armature_object = None @@ -156,15 +130,16 @@ def import_psk(psk: Psk, context, options: PskImportOptions) -> PskImportResult: if options.should_import_materials: for material_index, psk_material in enumerate(psk.materials): material_name = psk_material.name.decode('utf-8') + material = None if options.should_reuse_materials and material_name in bpy.data.materials: # Material already exists, just re-use it. material = bpy.data.materials[material_name] - elif psk.has_material_references: - # Material does not yet exist, attempt to load it using BDK. - reference = UReference.from_string(psk.material_references[material_index]) - material = load_bdk_material(reference) - else: - material = None + elif is_bdk_addon_loaded() and psk.has_material_references: + # Material does not yet exist and we have the BDK addon installed. + # Attempt to load it using BDK addon's operator. + material_reference = psk.material_references[material_index] + if material_reference and bpy.ops.bdk.link_material(reference=material_reference) == {'FINISHED'}: + material = bpy.data.materials[material_name] mesh_data.materials.append(material) bm = bmesh.new()