WIP automate animation export

This commit is contained in:
Alan O'Cull 2024-04-15 13:23:17 -04:00
parent 83f3a77a88
commit 78682be732
9 changed files with 101 additions and 2 deletions

3
.gitignore vendored
View File

@ -15,3 +15,6 @@ exports/
# Ignore Krita and Blender backups # Ignore Krita and Blender backups
*.*~ *.*~
# Ignore development files
pipeline/blender_autocomplete/

8
.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,8 @@
{
"recommendations": [
"jacqueslucke.blender-development",
"blenderfreetimeprojects.blender-python-code-templates",
"ms-python.vscode-pylance",
"ms-python.python"
]
}

19
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,19 @@
{
"python.autoComplete.extraPaths": [
"pipeline/blender_autocomplete/3.6"
],
"python.linting.pylintArgs": [
"--init-hook",
"import sys; sys.path.append('pipeline/blender_autocomplete/3.6')"
],
"python.analysis.extraPaths": [
"pipeline/blender_autocomplete/3.6"
],
"blender.addon.moduleName": "BoneJuice",
"blender.addon.loadDirectory": "pipeline",
"blender.addon.reloadOnSave": true,
"blender.addon.sourceDirectory": "pipeline",
"python.analysis.diagnosticSeverityOverrides": {
"reportInvalidTypeForm": "none"
}
}

View File

@ -63,5 +63,7 @@ If you need results from an automated process, see the `pipeline` directory. Eac
For animations, please include the `pipeline/export_anims.py` script in your Blender file. This allows one-click exporting of FBX animations (may be fully automated with a script later). For animations, please include the `pipeline/export_anims.py` script in your Blender file. This allows one-click exporting of FBX animations (may be fully automated with a script later).
See [automation docs](docs/automation.md)
## Questions ## Questions
If there are any questions or feedback on these guidelines and conventions, please poke Alan with a sharp, pointy stick. If there are any questions or feedback on these guidelines and conventions, please poke Alan with a sharp, pointy stick.

BIN
animations/infantry/anims-alan.blend (Stored with Git LFS)

Binary file not shown.

15
docs/automation.md Normal file
View File

@ -0,0 +1,15 @@
# Automation
## Setup
- Add Blender 3.6 to your PATH so it can be run from command-line (putting `blender` in cmd should open Blender 3.6)
- Ensure Python is installed on your machine
- Install Blender as a Python module (you might have to do this as administrator): `pip install bpy==3.6.0`
## Editing
- Ensure you have Visual Studio Code installed
- Open this directory in VS Code and install the recommended plugins
- Open terminal, `cd` into `pipeline`, and run the following command: `$ git clone https://github.com/Korchy/blender_autocomplete.git`
## Resources
- [Blender as a Python Module](https://pypi.org/project/bpy/)

16
pipeline/batch.py Normal file
View File

@ -0,0 +1,16 @@
import bpy
from bpy.app.handlers import persistent
import shutil
blender_bin = shutil.which("blender")
if blender_bin:
print("Found:", blender_bin)
bpy.app.binary_path = blender_bin
else:
print("Unable to find blender!")
@persistent
def load_handler(dummy):
print("Load Handler", bpy.data.filepath)
bpy.app.handlers.load_post(load_handler)

View File

@ -0,0 +1 @@
blender ..\animations\infantry\anims-alan.blend --background --python export_anims.py

View File

@ -1,4 +1,39 @@
import bpy import bpy
from bpy.types import Collection, LayerCollection, Object, Armature
# Enter object mode
bpy.ops.object.mode_set(mode='OBJECT')
# FIRST, toggle collections
collections_exportable = [
"insurrectionist", "infantry", "rigging", "geometry", "grapple", "baton", "helmet", "gun", "jetpack"
]
def toggle_collection(coll: LayerCollection):
# Iterate over all child LayerCollections
for child in coll.children.values():
c: LayerCollection = child
# Force include/exclude character-related collections so they're included/excluded from export
c.exclude = not (c.name in collections_exportable)
if c.name == "insurrectionist" or c.name == "infantry":
bpy.context.view_layer.active_layer_collection = c
toggle_collection(bpy.context.view_layer.layer_collection)
# Find rig to make it active
armatureObj: Object = None
for objBase in bpy.context.scene.objects:
# print(objBase)
obj: Object = objBase
# print(obj.data)
if obj.type == 'ARMATURE':
print("FOUND AN ARMATURE")
armatureObj = obj
obj.select_set(True)
bpy.context.active_object
print(bpy.context.active_object)
#bpy.context.active_object.animation_data.nla_tracks
exit()
# Get export directory # Get export directory
path: str = bpy.data.filepath.replace('\\Shelby', '').replace('\\Tommy', '') path: str = bpy.data.filepath.replace('\\Shelby', '').replace('\\Tommy', '')