The material slots would end up empty if the BDK texture lookup failed.
This change ensures that a new black material is created if any of the
other lookups fail (local data blocks or BDK asset lookup).
* Now asserting instead of throwing exceptions in some cases where we
don't want to fail gracefully
* Added "export space" option for PSA & PSK exports.
* Removed "Root Motion" option in PSA export, replace with a "Root"
export space.
* Added support for exporting multiple armatures to a PSK (only works
for collection exporter atm)
* More graceful error handling for IO errors (i.e., writing to a
for which the user doesn't have permission)
* Proper handling for slotted actions.
Previously this was not really possible because the PSA import operator
was interactive and required the sequence name list to be populated.
This new operator simply imports everything from the PSA.
Also started using mixin classes instead of ugly class annotation
ammendments. Various other clean-up items as well including using
generators where appropriate instead of returning full lists etc.
All the Python facing operators are now within `bpy.ops.psk` and
`bpy.ops.psa`. Before, they were scattered in a bunch of different
places because I wasn't really paying attention to consistency.
* Added "Active Action" as the sequence type, allowing the user to
select multiple armatures with the same data block and export an
action for each one.
* Added a "Scale" option for PSA export when exporting animations
for an armature that had been scaled on export.
* You are now able to export meshes without materials.
Armature space exporting means that the user doesn't need to manually
move the armature back to origin before exporting, since it was simply
using world-space exporting before.
Also moved all DFS functions into their own file & cleaned up the
usage interface. Added `is_visible` and `is_selected` properties
for better ergonomics.