Now using new BDK addon operators to load the materials

This commit is contained in:
Colin Basnett
2023-03-09 01:51:04 -08:00
parent c9d4958800
commit fd02f3f4d7
3 changed files with 14 additions and 34 deletions

View File

@@ -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]

View File

@@ -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] = []

View File

@@ -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()