diff --git a/.gitignore b/.gitignore index 87a2326..84c2670 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ exports/ # Ignore Krita and Blender backups *.*~ + +# Ignore development files +pipeline/blender_autocomplete/ diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..aefbd80 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "jacqueslucke.blender-development", + "blenderfreetimeprojects.blender-python-code-templates", + "ms-python.vscode-pylance", + "ms-python.python" + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c540aca --- /dev/null +++ b/.vscode/settings.json @@ -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" + } +} \ No newline at end of file diff --git a/README.md b/README.md index 13820c9..42fec2f 100644 --- a/README.md +++ b/README.md @@ -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). +See [automation docs](docs/automation.md) + ## Questions If there are any questions or feedback on these guidelines and conventions, please poke Alan with a sharp, pointy stick. diff --git a/animations/infantry/anims-alan.blend b/animations/infantry/anims-alan.blend index 4ad97d2..772b49a 100644 --- a/animations/infantry/anims-alan.blend +++ b/animations/infantry/anims-alan.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e2bfcbb68a409261c659b674e630f91f624708f997d10c6065a6c0d5e45ef34b -size 3414388 +oid sha256:0c2f61a1922d2dff5eda8c6515f549fbbcace13867b6a391a57163e9b838fe75 +size 3520104 diff --git a/animations/insurrectionist/anims-tommy6.blend b/animations/insurrectionist/anims-tommy6.blend index 9d55595..40199cd 100644 --- a/animations/insurrectionist/anims-tommy6.blend +++ b/animations/insurrectionist/anims-tommy6.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a54553dbe38695573acdda0f8c6ed79c83fffab249e1edbfb0dab44a89a7f815 -size 9833404 +oid sha256:8ffc99bdfebaaa1f4b33f080c8d2f640ad6e06880fa28c8b411db0c6c27ca2ab +size 9842240 diff --git a/docs/automation.md b/docs/automation.md new file mode 100644 index 0000000..43a0005 --- /dev/null +++ b/docs/automation.md @@ -0,0 +1,15 @@ +# Automation + +## Setup +- Ensure you have Blender 3.6 installed (hopefully at the location: `C:\Program Files\Blender Foundation\Blender 3.6`) +- Run the script located at `pipeline/export_all_anims.cmd` + +## Editing +- Ensure Python is installed on your machine +- 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` +- Your workspace is now set up! + +## Resources +- [Blender as a Python Module](https://pypi.org/project/bpy/) diff --git a/pipeline/export_all_anims.cmd b/pipeline/export_all_anims.cmd new file mode 100644 index 0000000..2c0df3e --- /dev/null +++ b/pipeline/export_all_anims.cmd @@ -0,0 +1,3 @@ +set PATH=%PATH%;"C:\Program Files\Blender Foundation\Blender 3.6" +blender ..\animations\infantry\anims-alan.blend --background --python export_anims.py +blender ..\animations\insurrectionist\anims-alan.blend --background --python export_anims.py diff --git a/pipeline/export_anims.py b/pipeline/export_anims.py index 48eba69..b9905a2 100644 --- a/pipeline/export_anims.py +++ b/pipeline/export_anims.py @@ -1,4 +1,58 @@ import bpy +from bpy.types import LayerCollection, Object, NlaTrack + +# 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, and select all objects +for objBase in bpy.context.scene.objects: + obj: Object = objBase + if obj.type == 'ARMATURE': + bpy.context.view_layer.objects.active = obj + if obj.visible_get(): + obj.select_set(True) + + +# EXTREMELY UGLY HACK TO EXIT TWEAK MODE +# see: https://blender.stackexchange.com/questions/316547/how-to-override-context-area-using-script-when-running-blender-using-command-lin +# and https://blender.stackexchange.com/questions/6101/poll-failed-context-incorrect-example-bpy-ops-view3d-background-image-add +def get_view_nla(): # Get any window + for window_manager in bpy.data.window_managers: + for window in window_manager.windows: + for area in window.screen.areas: + area.type = 'NLA_EDITOR' + for region in area.regions: + if region.type == 'WINDOW': + return dict(window=window, workspace=window.workspace, screen=window.screen, area=area, region=region) + raise Exception('NLA context not found.') + +# Forcibly override context to a window so we can access NLA editor +with bpy.context.temp_override(**get_view_nla()): + if bpy.context.scene.is_nla_tweakmode: + bpy.ops.nla.tweakmode_exit() # Exit tweakmode + + +# Go through all NLA tracks, unstar them and mute them +bpy.context.active_object.animation_data.nla_tracks.active = None # Make track inactive +for trackBase in bpy.context.active_object.animation_data.nla_tracks: + track: NlaTrack = trackBase + track.mute = True # Mute all tracks + track.is_solo = False # Disable solo view for all tracks # Get export directory path: str = bpy.data.filepath.replace('\\Shelby', '').replace('\\Tommy', '') @@ -74,22 +128,4 @@ bpy.ops.pose.transforms_clear() # Clear all transforms bpy.ops.object.mode_set(mode='OBJECT') ## FOR DEBUGGING, see https://blender.stackexchange.com/questions/93728/blender-script-run-print-to-console -# from bpy import context -# import builtins as __builtin__ -# def console_print(*args, **kwargs): -# for a in context.screen.areas: -# if a.type == 'CONSOLE': -# c = {} -# c['area'] = a -# c['space_data'] = a.spaces.active -# c['region'] = a.regions[-1] -# c['window'] = context.window -# c['screen'] = context.screen -# s = " ".join([str(arg) for arg in args]) -# for line in s.split("\n"): -# bpy.ops.console.scrollback_append(c, text=line) - -# def print(*args, **kwargs): -# """Console print() function.""" -# console_print(*args, **kwargs) # to py consoles -# __builtin__.print(*args, **kwargs) # to system console +# exit() diff --git a/promotional/itch/background.jpg b/promotional/itch/background.jpg new file mode 100644 index 0000000..8a8fe51 --- /dev/null +++ b/promotional/itch/background.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a6168bc139e3fc149fcdfbc8c41d8448215594e7c182c782f679acd4bd2ddf6 +size 1439581 diff --git a/promotional/itch/cover1.png b/promotional/itch/cover1.png new file mode 100644 index 0000000..4f0b98e --- /dev/null +++ b/promotional/itch/cover1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28033605eac94ad4742adcedf7da3a20bac5af1a7dae2abff780b6d3da017a7d +size 426997 diff --git a/promotional/itch/cover1_bright.png b/promotional/itch/cover1_bright.png new file mode 100644 index 0000000..6d20a0b --- /dev/null +++ b/promotional/itch/cover1_bright.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c86bb1184e31e3e836abf576838868016f02322dfa1838f6670d3693bd37f5f7 +size 539504 diff --git a/promotional/itch/screenshot1.png b/promotional/itch/screenshot1.png new file mode 100644 index 0000000..46a187f --- /dev/null +++ b/promotional/itch/screenshot1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bc01c2583be6d68d7b8eaada415aad04646bd29f8dc528bded09218d507aef2 +size 2645360 diff --git a/promotional/itch/screenshot2.png b/promotional/itch/screenshot2.png new file mode 100644 index 0000000..83dd219 --- /dev/null +++ b/promotional/itch/screenshot2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab60e506f5413415ea7fcff508222c7c4acbd2a6cd94e257889434bc832031c6 +size 2360287