diff --git a/io_scene_psk_psa/psk/builder.py b/io_scene_psk_psa/psk/builder.py index 366410a..80b3fe4 100644 --- a/io_scene_psk_psa/psk/builder.py +++ b/io_scene_psk_psa/psk/builder.py @@ -58,11 +58,17 @@ def get_psk_input_objects(context) -> PskInputObjects: return input_objects -def build_psk(context, options: PskBuildOptions) -> Psk: - input_objects = get_psk_input_objects(context) +class PskBuildResult(object): + def __init__(self): + self.psk = None + self.warnings = [] + +def build_psk(context, options: PskBuildOptions) -> PskBuildResult: + input_objects = get_psk_input_objects(context) armature_object: bpy.types.Object = input_objects.armature_object + result = PskBuildResult() psk = Psk() bones = [] @@ -168,6 +174,10 @@ def build_psk(context, options: PskBuildOptions) -> Psk: mesh_object = bpy.data.objects.new('', mesh_data) mesh_object.matrix_world = input_mesh_object.matrix_world + scale = (input_mesh_object.scale.x, input_mesh_object.scale.y, input_mesh_object.scale.z) + if any(map(lambda x: x < 0, scale)): + result.warnings.append(f'Mesh "{input_mesh_object.name}" has negative scaling which may result in inverted normals.') + # Copy the vertex groups for vertex_group in input_mesh_object.vertex_groups: mesh_object.vertex_groups.new(name=vertex_group.name) @@ -278,4 +288,6 @@ def build_psk(context, options: PskBuildOptions) -> Psk: bpy.data.meshes.remove(mesh_data) del mesh_data - return psk + result.psk = psk + + return result diff --git a/io_scene_psk_psa/psk/export/operators.py b/io_scene_psk_psa/psk/export/operators.py index d2ad36c..80e097f 100644 --- a/io_scene_psk_psa/psk/export/operators.py +++ b/io_scene_psk_psa/psk/export/operators.py @@ -163,12 +163,18 @@ class PSK_OT_export(Operator, ExportHelper): options.should_enforce_bone_name_restrictions = pg.should_enforce_bone_name_restrictions try: - psk = build_psk(context, options) - write_psk(psk, self.filepath) - self.report({'INFO'}, f'PSK export successful') + result = build_psk(context, options) + for warning in result.warnings: + self.report({'WARNING'}, warning) + write_psk(result.psk, self.filepath) + if len(result.warnings) > 0: + self.report({'WARNING'}, f'PSK export successful with {len(result.warnings)} warnings') + else: + self.report({'INFO'}, f'PSK export successful') except RuntimeError as e: self.report({'ERROR_INVALID_CONTEXT'}, str(e)) return {'CANCELLED'} + return {'FINISHED'}