Updated PSK and PSA export to use new Blender 4.0 bone collections instead of bone groups

This commit is contained in:
Colin Basnett
2023-09-17 21:18:41 -07:00
parent 4db8764677
commit 32e0d89dbd
9 changed files with 94 additions and 89 deletions

View File

@@ -15,7 +15,7 @@ class PskInputObjects(object):
class PskBuildOptions(object):
def __init__(self):
self.bone_filter_mode = 'ALL'
self.bone_group_indices: List[int] = []
self.bone_collection_indices: List[int] = []
self.use_raw_mesh_data = True
self.material_names: List[str] = []
self.should_enforce_bone_name_restrictions = False
@@ -78,7 +78,7 @@ def build_psk(context, options: PskBuildOptions) -> Psk:
psk_bone.rotation = Quaternion.identity()
psk.bones.append(psk_bone)
else:
bone_names = get_export_bone_names(armature_object, options.bone_filter_mode, options.bone_group_indices)
bone_names = get_export_bone_names(armature_object, options.bone_filter_mode, options.bone_collection_indices)
armature_data = typing.cast(Armature, armature_object.data)
bones = [armature_data.bones[bone_name] for bone_name in bone_names]

View File

@@ -4,14 +4,14 @@ from bpy_extras.io_utils import ExportHelper
from ..builder import build_psk, PskBuildOptions, get_psk_input_objects
from ..writer import write_psk
from ...helpers import populate_bone_group_list
from ...helpers import populate_bone_collection_list
def is_bone_filter_mode_item_available(context, identifier):
input_objects = get_psk_input_objects(context)
armature_object = input_objects.armature_object
if identifier == 'BONE_GROUPS':
if not armature_object or not armature_object.pose or not armature_object.pose.bone_groups:
if identifier == 'BONE_COLLECTIONS':
if armature_object is None or armature_object.data is None or len(armature_object.data.collections) == 0:
return False
# else if... you can set up other conditions if you add more options
return True
@@ -94,8 +94,7 @@ class PSK_OT_export(Operator, ExportHelper):
pg = getattr(context.scene, 'psk_export')
# Populate bone groups list.
populate_bone_group_list(input_objects.armature_object, pg.bone_group_list)
populate_bone_collection_list(input_objects.armature_object, pg.bone_collection_list)
try:
populate_material_list(input_objects.mesh_objects, pg.material_list)
@@ -136,10 +135,10 @@ class PSK_OT_export(Operator, ExportHelper):
item_layout.prop_enum(pg, 'bone_filter_mode', item.identifier)
item_layout.enabled = is_bone_filter_mode_item_available(context, identifier)
if pg.bone_filter_mode == 'BONE_GROUPS':
if pg.bone_filter_mode == 'BONE_COLLECTIONS':
row = box.row()
rows = max(3, min(len(pg.bone_group_list), 10))
row.template_list('PSX_UL_bone_group_list', '', pg, 'bone_group_list', pg, 'bone_group_list_index', rows=rows)
rows = max(3, min(len(pg.bone_collection_list), 10))
row.template_list('PSX_UL_bone_collection_list', '', pg, 'bone_collection_list', pg, 'bone_collection_list_index', rows=rows)
box.prop(pg, 'should_enforce_bone_name_restrictions')
@@ -147,7 +146,7 @@ class PSK_OT_export(Operator, ExportHelper):
box = layout.box()
box.label(text='Materials', icon='MATERIAL')
row = box.row()
rows = max(3, min(len(pg.bone_group_list), 10))
rows = max(3, min(len(pg.bone_collection_list), 10))
row.template_list('PSK_UL_materials', '', pg, 'material_list', pg, 'material_list_index', rows=rows)
col = row.column(align=True)
col.operator(PSK_OT_material_list_move_up.bl_idname, text='', icon='TRIA_UP')
@@ -157,7 +156,7 @@ class PSK_OT_export(Operator, ExportHelper):
pg = context.scene.psk_export
options = PskBuildOptions()
options.bone_filter_mode = pg.bone_filter_mode
options.bone_group_indices = [x.index for x in pg.bone_group_list if x.is_selected]
options.bone_collection_indices = [x.index for x in pg.bone_collection_list if x.is_selected]
options.use_raw_mesh_data = pg.use_raw_mesh_data
options.material_names = [m.material_name for m in pg.material_list]
options.should_enforce_bone_name_restrictions = pg.should_enforce_bone_name_restrictions

View File

@@ -1,7 +1,7 @@
from bpy.props import EnumProperty, CollectionProperty, IntProperty, BoolProperty, StringProperty
from bpy.types import PropertyGroup
from ...types import PSX_PG_bone_group_list_item
from ...types import PSX_PG_bone_collection_list_item
class PSK_PG_material_list_item(PropertyGroup):
@@ -16,12 +16,12 @@ class PSK_PG_export(PropertyGroup):
description='',
items=(
('ALL', 'All', 'All bones will be exported'),
('BONE_GROUPS', 'Bone Groups',
'Only bones belonging to the selected bone groups and their ancestors will be exported')
('BONE_COLLECTIONS', 'Bone Collections',
'Only bones belonging to the selected bone collections and their ancestors will be exported')
)
)
bone_group_list: CollectionProperty(type=PSX_PG_bone_group_list_item)
bone_group_list_index: IntProperty(default=0)
bone_collection_list: CollectionProperty(type=PSX_PG_bone_collection_list_item)
bone_collection_list_index: IntProperty(default=0)
use_raw_mesh_data: BoolProperty(default=False, name='Raw Mesh Data', description='No modifiers will be evaluated as part of the exported mesh')
material_list: CollectionProperty(type=PSK_PG_material_list_item)
material_list_index: IntProperty(default=0)