├── .gitattributes ├── .gitignore ├── README.md ├── application-templates ├── README.md └── blender-media-viewer │ ├── .gitignore │ ├── README.md │ ├── blender_media_viewer.desktop │ ├── blender_media_viewer │ ├── __init__.py │ ├── addons │ │ └── media_viewer │ │ │ ├── __init__.py │ │ │ ├── convert_to_movie.py │ │ │ ├── draw.py │ │ │ ├── gp_opsdata.py │ │ │ ├── gpu_ops.py │ │ │ ├── gpu_opsdata.py │ │ │ ├── log.py │ │ │ ├── ops.py │ │ │ ├── opsdata.py │ │ │ ├── props.py │ │ │ ├── shortcuts.py │ │ │ ├── states.py │ │ │ ├── ui.py │ │ │ └── vars.py │ ├── splash.png │ ├── startup.blend │ └── userpref.blend │ └── docs │ ├── images │ ├── media_view_topbar.jpg │ ├── media_viewer_review.jpg │ └── start_media_viewer.jpg │ └── videos │ ├── file_navigation.mp4 │ ├── filebrowser_extra.mp4 │ ├── overview.mp4 │ ├── screen_navigation.mp4 │ └── toggle_areas.mp4 ├── docs ├── .env.example ├── .vitepress │ ├── config.ts │ └── theme │ │ ├── custom.css │ │ └── index.js ├── README.md ├── addons │ ├── anim_cupboard.md │ ├── asset_pipeline.md │ ├── blender_kitsu.md │ ├── blender_svn.md │ ├── bone_gizmos.md │ ├── cache_manager.md │ ├── contactsheet.md │ ├── easy_weights.md │ ├── geonode_shapekeys.md │ ├── grease_converter.md │ ├── lattice_magic.md │ ├── lighting_overrider.md │ ├── overview.md │ ├── pose_shape_keys.md │ └── render_review.md ├── archive │ └── pipeline-proposal-2019 │ │ ├── asset-publishing │ │ ├── character-pipeline-assistant.md │ │ └── introduction.md │ │ ├── attract-improvements.md │ │ ├── introduction.md │ │ ├── shot-caching │ │ ├── add-on.md │ │ ├── introduction.md │ │ ├── issues.md │ │ ├── structural-ideas.md │ │ └── user-stories.md │ │ └── task-companion-add-on.md ├── index.md ├── media │ ├── README.md │ ├── addons │ │ ├── blender_kitsu │ │ │ ├── context_animation_tools.jpg │ │ │ ├── context_browser.jpg │ │ │ ├── context_lookdev_tools.jpg │ │ │ ├── error_active_project.jpg │ │ │ ├── error_animation.jpg │ │ │ ├── metastrip.001.jpg │ │ │ ├── prefs_anim_tools.jpg │ │ │ ├── prefs_login.jpg │ │ │ ├── prefs_lookdev.jpg │ │ │ ├── prefs_misc.jpg │ │ │ ├── prefs_outdated_media.jpg │ │ │ ├── prefs_project.jpg │ │ │ ├── sqe_init_selection.jpg │ │ │ ├── sqe_init_shot.jpg │ │ │ ├── sqe_link_shot.jpg │ │ │ ├── sqe_metadata.jpg │ │ │ ├── sqe_multi_edit.jpg │ │ │ ├── sqe_multi_edit_advanced.jpg │ │ │ ├── sqe_outdated_overlay.jpg │ │ │ ├── sqe_outdated_scan.jpg │ │ │ ├── sqe_outdated_update.jpg │ │ │ ├── sqe_pull.jpg │ │ │ ├── sqe_pull_entire_edit.jpg │ │ │ ├── sqe_push.jpg │ │ │ ├── sqe_sequence_color_init.jpg │ │ │ └── sqe_sequence_colors.jpg │ │ ├── easy_weights │ │ │ ├── custom_wp_context_menu.png │ │ │ ├── toggle_wp_shortcut.png │ │ │ ├── vg_context_menu.png │ │ │ ├── weight_islands.png │ │ │ └── wp_context_menu_shortcut.png │ │ ├── grease_converter │ │ │ ├── adjustments_panel.jpg │ │ │ └── convert_to_grease_pencil.jpg │ │ ├── lattice_magic │ │ │ ├── camera_lattice.gif │ │ │ ├── lattice_magic.png │ │ │ └── tweak_lattice.gif │ │ └── lighting_overrider │ │ │ ├── json_icon_example.png │ │ │ ├── lighting_override_suffixes.png │ │ │ └── rna_override.png │ ├── archive │ │ └── pipeline-proposal-2019 │ │ │ ├── 01_02_01_D2.anim_contact.mp4 │ │ │ ├── 01_02_01_D2.lighting.adventurous_cache.mp4 │ │ │ ├── 01_02_01_D2.lighting1.mp4 │ │ │ ├── 01_02_01_D2.sim1.mp4 │ │ │ ├── 3-character_pipeline_tool.mp4 │ │ │ ├── attract_asset_list.png │ │ │ ├── attract_contact_sheet.png │ │ │ ├── attract_dashboard.png │ │ │ ├── attract_shot_list.png │ │ │ ├── attract_task_page.png │ │ │ ├── cache_tool.mp4 │ │ │ ├── char_pipeline_01.png │ │ │ ├── char_pipeline_02.png │ │ │ ├── cosmos_shot_caching_notes.png │ │ │ ├── image3.png │ │ │ ├── pipeline_proposal.png │ │ │ ├── pre_production_timeline.png │ │ │ ├── production_timeline.png │ │ │ ├── production_timeline_2.png │ │ │ ├── project_structure.png │ │ │ ├── publish_asset.png │ │ │ ├── publish_char.png │ │ │ ├── publish_poselib.png │ │ │ ├── shot_builder_flow.png │ │ │ └── shot_caching.png │ ├── images │ │ └── hero_banner.jpg │ ├── svn-checkout.mp4 │ ├── svn-commit.mp4 │ ├── svn-update.mp4 │ ├── td-guide │ │ └── server │ │ │ ├── gentoo_server_active_drive.png │ │ │ ├── gentoo_server_ipxe.png │ │ │ ├── gentoo_server_keyboard.png │ │ │ ├── gentoo_server_overview.png │ │ │ └── gentoo_server_set_hostname.png │ └── user-guide │ │ ├── launch_blender.mp4 │ │ └── workstations │ │ ├── discover_store_install.mp4 │ │ ├── discover_store_remove.mp4 │ │ ├── gentoo_boot_menu.png │ │ ├── gentoo_ctrl_c.png │ │ ├── gentoo_installer_boot.png │ │ ├── gentoo_kernal_config_build_new.png │ │ ├── gentoo_kernal_config_saved.png │ │ ├── gentoo_kernel_config_exit.png │ │ ├── gentoo_kernel_config_start.png │ │ ├── gentoo_rootfs.png │ │ └── gentoo_workstation_open_terminal.mp4 ├── naming-conventions │ ├── examples.md │ ├── file-types.md │ ├── in-file-prefixes.md │ └── introduction.md ├── package-lock.json ├── package.json ├── pipeline-overview │ ├── asset-creation │ │ ├── modeling.md │ │ └── rigging.md │ ├── design-principles.md │ ├── editorial-and-previz.md │ ├── infrastructure.md │ └── introduction.md ├── public │ ├── blender-studio-logo-black.svg │ └── blender-studio-logo-white.svg ├── td-guide │ ├── project-setup.md │ └── workstations │ │ ├── installation.md │ │ ├── maintaince.md │ │ └── overview.md └── user-guide │ ├── debugging.md │ ├── project-setup.md │ ├── svn.md │ └── workstations │ ├── installing-software.md │ ├── introduction.md │ ├── running-blender.md │ └── troubleshooting.md ├── scripts-blender ├── README.md └── addons │ ├── anim_cupboard │ ├── .gitignore │ ├── CHANGELOG.MD │ ├── LICENSE │ ├── README.md │ ├── __init__.py │ ├── bone_selection_sets.py │ ├── easy_constraints.py │ ├── fcurve_utils.py │ ├── operators │ │ ├── bake_anim_across_armatures.py │ │ ├── lock_curves.py │ │ └── select_similar_curves.py │ └── warn_about_broken_libraries.py │ ├── asset_pipeline │ ├── .gitignore │ ├── CHANGELOG.MD │ ├── README.md │ ├── TODO.txt │ ├── __init__.py │ ├── api │ │ └── __init__.py │ ├── asset_files.py │ ├── asset_status.py │ ├── builder │ │ ├── __init__.py │ │ ├── asset_builder.py │ │ ├── asset_importer.py │ │ ├── asset_mapping.py │ │ ├── asset_suffix.py │ │ ├── blstarter.py │ │ ├── context.py │ │ ├── hook.py │ │ ├── lock_plan.py │ │ ├── meta_util.py │ │ ├── metadata.py │ │ ├── ops.py │ │ ├── opsdata.py │ │ ├── scripts │ │ │ └── push.py │ │ ├── task_layer.py │ │ ├── ui.py │ │ └── vis.py │ ├── constants.py │ ├── docs │ │ ├── production_config_example │ │ │ ├── hooks.py │ │ │ └── task_layers.py │ │ └── production_config_heist │ │ │ ├── hooks.py │ │ │ └── task_layers.py │ ├── lib_util.py │ ├── prefs.py │ ├── prop_utils.py │ ├── props.py │ ├── sys_utils.py │ ├── tests │ │ ├── __init__.py │ │ └── test_blender_studio_pipeline.py │ ├── updater │ │ ├── __init__.py │ │ ├── asset_updater.py │ │ ├── ops.py │ │ ├── opsdata.py │ │ └── ui.py │ └── util.py │ ├── blender_kitsu │ ├── CHANGELOG.MD │ ├── HISTORY.md │ ├── LICENSE │ ├── README.md │ ├── __init__.py │ ├── anim │ │ ├── __init__.py │ │ ├── ops.py │ │ ├── opsdata.py │ │ └── ui.py │ ├── auth │ │ ├── __init__.py │ │ ├── ops.py │ │ └── ui.py │ ├── bkglobals.py │ ├── cache.py │ ├── context │ │ ├── __init__.py │ │ ├── ops.py │ │ └── ui.py │ ├── exception.py │ ├── filetrees │ │ └── filetree_default.py │ ├── gazu │ │ ├── LICENSE │ │ ├── __init__.py │ │ ├── __version__.py │ │ ├── asset.py │ │ ├── cache.py │ │ ├── casting.py │ │ ├── client.py │ │ ├── context.py │ │ ├── edit.py │ │ ├── encoder.py │ │ ├── entity.py │ │ ├── exception.py │ │ ├── files.py │ │ ├── helpers.py │ │ ├── person.py │ │ ├── playlist.py │ │ ├── project.py │ │ ├── scene.py │ │ ├── shot.py │ │ ├── sorting.py │ │ ├── sync.py │ │ ├── task.py │ │ └── user.py │ ├── generic │ │ ├── __init__.py │ │ └── ops.py │ ├── logger.py │ ├── lookdev │ │ ├── __init__.py │ │ ├── ops.py │ │ ├── opsdata.py │ │ ├── prefs.py │ │ ├── props.py │ │ └── ui.py │ ├── models.py │ ├── playblast │ │ ├── __init__.py │ │ ├── core.py │ │ ├── ops.py │ │ ├── opsdata.py │ │ └── ui.py │ ├── prefs.py │ ├── props.py │ ├── propsdata.py │ ├── res │ │ └── metastrip.mp4 │ ├── shot_builder │ │ ├── __init__.py │ │ ├── anim_setup │ │ │ ├── core.py │ │ │ └── ops.py │ │ ├── asset.py │ │ ├── builder │ │ │ ├── __init__.py │ │ │ ├── build_step.py │ │ │ ├── init_asset.py │ │ │ ├── init_shot.py │ │ │ ├── invoke_hook.py │ │ │ ├── new_scene.py │ │ │ ├── save_file.py │ │ │ └── set_render_settings.py │ │ ├── connectors │ │ │ ├── __init__.py │ │ │ ├── connector.py │ │ │ ├── default.py │ │ │ └── kitsu.py │ │ ├── docs │ │ │ ├── README.md │ │ │ └── examples │ │ │ │ ├── README.md │ │ │ │ ├── assets.py │ │ │ │ ├── config.py │ │ │ │ ├── hooks.py │ │ │ │ ├── shot-builder │ │ │ │ └── README.md │ │ │ │ └── shots.py │ │ ├── editorial │ │ │ ├── __init__.py │ │ │ ├── core.py │ │ │ └── ops.py │ │ ├── hooks.py │ │ ├── operators.py │ │ ├── project.py │ │ ├── render_settings.py │ │ ├── shot.py │ │ ├── sys_utils.py │ │ ├── task_type.py │ │ ├── ui.py │ │ └── vars.py │ ├── sqe │ │ ├── __init__.py │ │ ├── checksqe.py │ │ ├── checkstrip.py │ │ ├── draw.py │ │ ├── ops.py │ │ ├── opsdata.py │ │ ├── pull.py │ │ ├── push.py │ │ └── ui.py │ ├── tasks │ │ ├── __init__.py │ │ ├── ops.py │ │ ├── opsdata.py │ │ └── ui.py │ ├── types.py │ ├── ui.py │ └── util.py │ ├── blender_svn │ ├── .gitignore │ ├── CHANGELOG.MD │ ├── README.md │ ├── __init__.py │ ├── constants.py │ ├── operators │ │ ├── __init__.py │ │ ├── simple_commands.py │ │ ├── svn_commit.py │ │ ├── svn_update.py │ │ └── ui_operators.py │ ├── prefs.py │ ├── props.py │ ├── repository.py │ ├── svn_info.py │ ├── threaded │ │ ├── __init__.py │ │ ├── background_process.py │ │ ├── commit.py │ │ ├── execute_subprocess.py │ │ ├── filebrowser_activate_file.py │ │ ├── redraw_viewport.py │ │ ├── svn_log.py │ │ ├── svn_status.py │ │ └── update.py │ ├── ui │ │ ├── __init__.py │ │ ├── ui_context_menus.py │ │ ├── ui_file_list.py │ │ ├── ui_filebrowser.py │ │ ├── ui_log.py │ │ ├── ui_outdated_warning.py │ │ ├── ui_prefs.py │ │ └── ui_sidebar.py │ ├── util.py │ └── wheels │ │ ├── Send2Trash-1.8.0-py3-none-any.whl │ │ ├── __init__.py │ │ ├── python_dateutil-2.8.2-py2.py3-none-any.whl │ │ ├── six-1.16.0-py2.py3-none-any.whl │ │ └── xmltodict-0.12.0-py2.py3-none-any.whl │ ├── bone_gizmos │ ├── .gitignore │ ├── CHANGELOG.MD │ ├── LICENSE │ ├── README.md │ ├── __init__.py │ ├── bone_gizmo.py │ ├── bone_gizmo_group.py │ ├── bone_gizmo_properties.py │ ├── bone_gizmo_ui.py │ ├── operators.py │ └── shapes.py │ ├── cache_manager │ ├── CHANGELOG.MD │ ├── LICENSE │ ├── README.md │ ├── __init__.py │ ├── cache.py │ ├── cmglobals.py │ ├── logger.py │ ├── models.py │ ├── ops.py │ ├── opsdata.py │ ├── prefs.py │ ├── props.py │ ├── propsdata.py │ └── ui.py │ ├── contactsheet │ ├── .gitignore │ ├── CHANGELOG.MD │ ├── LICENSE │ ├── README.md │ ├── __init__.py │ ├── checksqe.py │ ├── geo.py │ ├── geo_seq.py │ ├── log.py │ ├── ops.py │ ├── opsdata.py │ ├── prefs.py │ ├── props.py │ ├── tests │ │ └── pygame_test.py │ └── ui.py │ ├── easy_weights │ ├── CHANGELOG.MD │ ├── README.md │ ├── __init__.py │ ├── force_apply_mirror.py │ ├── rogue_weights.py │ ├── smart_weight_transfer.py │ ├── toggle_weight_paint.py │ ├── utils │ │ ├── __init__.py │ │ ├── hotkeys.py │ │ └── naming.py │ ├── vertex_group_menu.py │ ├── vertex_group_operators.py │ └── weight_paint_context_menu.py │ ├── geonode_shapekeys │ ├── CHANGELOG.MD │ ├── README.md │ ├── __init__.py │ ├── geonodes.blend │ ├── operators.py │ ├── props.py │ └── ui.py │ ├── grease_converter │ ├── CHANGELOG.MD │ ├── README.md │ ├── __init__.py │ ├── ops.py │ └── ui.py │ ├── lattice_magic │ ├── CHANGELOG.MD │ ├── README.md │ ├── __init__.py │ ├── camera_lattice.py │ ├── operators.py │ ├── tweak_lattice.py │ └── utils.py │ ├── lighting_overrider │ ├── CHANGELOG.MD │ ├── README.md │ ├── TODO.txt │ ├── __init__.py │ ├── categories │ │ ├── __init__.py │ │ ├── motion_blur_settings.py │ │ ├── rig_settings.py │ │ ├── rna_overrides.py │ │ ├── shader_settings.py │ │ └── variable_settings.py │ ├── execution.py │ ├── json_io.py │ ├── lighting_overrider_execution.py │ ├── override_picker.py │ ├── templates.py │ ├── ui.py │ └── utils.py │ ├── pose_shape_keys │ ├── CHANGELOG.MD │ ├── LICENSE │ ├── README.md │ ├── __init__.py │ ├── pose_key.py │ ├── reset_rig.py │ ├── symmetrize_shape_key.py │ ├── ui.py │ └── ui_list.py │ └── render_review │ ├── .gitignore │ ├── CHANGELOG.MD │ ├── LICENSE │ ├── README.md │ ├── __init__.py │ ├── checksqe.py │ ├── draw.py │ ├── exception.py │ ├── kitsu.py │ ├── log.py │ ├── ops.py │ ├── opsdata.py │ ├── prefs.py │ ├── props.py │ ├── ui.py │ ├── util.py │ └── vars.py └── scripts ├── README.md ├── blender-crawl ├── LICENSE ├── README.md ├── blender-crawl │ ├── __main__.py │ └── default-scripts │ │ └── purge.py ├── blender_crawl │ ├── __main__.py │ └── default_scripts │ │ ├── purge.py │ │ └── save.py └── setup.py ├── framegrid └── framegrid.py ├── freesound-credits ├── README.md └── generate_sound_credits.py ├── pipeline-release ├── README.md └── pipeline_release.py └── shotstats ├── gnuplot_chart.tpl ├── playhead.png └── shotstats.py /.gitattributes: -------------------------------------------------------------------------------- 1 | .png filter=lfs diff=lfs merge=lfs -text 2 | .mp4 filter=lfs diff=lfs merge=lfs -text 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # Distribution / packaging 7 | .Python 8 | env/ 9 | build/ 10 | develop-eggs/ 11 | dist/ 12 | downloads/ 13 | eggs/ 14 | .eggs/ 15 | lib/ 16 | lib64/ 17 | parts/ 18 | sdist/ 19 | var/ 20 | /wheels/ # Otherwise wheels folder of blender-svn will be ignored. 21 | *.egg-info/ 22 | .installed.cfg 23 | *.egg 24 | 25 | # PyInstaller 26 | # Usually these files are written by a python script from a template 27 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 28 | *.manifest 29 | *.spec 30 | 31 | # Installer logs 32 | pip-log.txt 33 | pip-delete-this-directory.txt 34 | 35 | # Unit test / coverage reports 36 | htmlcov/ 37 | .tox/ 38 | .coverage 39 | .coverage.* 40 | .cache 41 | nosetests.xml 42 | coverage.xml 43 | *.cover 44 | .hypothesis/ 45 | .pytest_cache/ 46 | 47 | # PyBuilder 48 | target/ 49 | 50 | # pyenv 51 | .python-version 52 | 53 | # dotenv 54 | .env 55 | 56 | # virtualenv 57 | .venv 58 | .venv* 59 | venv/ 60 | ENV/ 61 | 62 | # mypy 63 | .mypy_cache/ 64 | 65 | # IDE settings 66 | .vscode/ 67 | 68 | # Docs 69 | node_modules/ 70 | docs/.vitepress/cache 71 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Blender Studio Pipeline 2 | 3 | The complete collection of documents, add-ons, scripts and tools that make up the Blender Studio pipeline. Learn more at [studio.blender.org](https://studio.blender.org/pipeline/). 4 | -------------------------------------------------------------------------------- /application-templates/README.md: -------------------------------------------------------------------------------- 1 | # Application Templates 2 | 3 | ## blender-media-viewer 4 | 5 | Blender Application Template that makes Blender usable as a Video-Player, Image and Text-Viewer. We currently use this at the weeklies to present our work every Friday. 6 | 7 | Author: Paul Golter 8 | Maintainers: Francesco Siddi, Demeter Dzadik 9 | -------------------------------------------------------------------------------- /application-templates/blender-media-viewer/.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | 58 | # Flask stuff: 59 | instance/ 60 | .webassets-cache 61 | 62 | # Scrapy stuff: 63 | .scrapy 64 | 65 | # Sphinx documentation 66 | docs/_build/ 67 | 68 | # PyBuilder 69 | target/ 70 | 71 | # Jupyter Notebook 72 | .ipynb_checkpoints 73 | 74 | # pyenv 75 | .python-version 76 | 77 | # celery beat schedule file 78 | celerybeat-schedule 79 | 80 | # SageMath parsed files 81 | *.sage.py 82 | 83 | # dotenv 84 | .env 85 | 86 | # virtualenv 87 | .venv 88 | .venv* 89 | venv/ 90 | ENV/ 91 | 92 | # Spyder project settings 93 | .spyderproject 94 | .spyproject 95 | 96 | # Rope project settings 97 | .ropeproject 98 | 99 | # mkdocs documentation 100 | /site 101 | 102 | # mypy 103 | .mypy_cache/ 104 | 105 | # IDE settings 106 | .vscode/ 107 | 108 | # utility bat files: 109 | *jump_in_venv.bat 110 | 111 | #local tests 112 | tests/local* -------------------------------------------------------------------------------- /application-templates/blender-media-viewer/blender_media_viewer/addons/media_viewer/log.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | import logging 22 | 23 | 24 | class LoggerFactory: 25 | 26 | """ 27 | Utility class to streamline logger creation 28 | """ 29 | 30 | @staticmethod 31 | def getLogger(name=__name__): 32 | logger = logging.getLogger(name) 33 | return logger 34 | -------------------------------------------------------------------------------- /application-templates/blender-media-viewer/blender_media_viewer/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/application-templates/blender-media-viewer/blender_media_viewer/splash.png -------------------------------------------------------------------------------- /application-templates/blender-media-viewer/blender_media_viewer/startup.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/application-templates/blender-media-viewer/blender_media_viewer/startup.blend -------------------------------------------------------------------------------- /application-templates/blender-media-viewer/blender_media_viewer/userpref.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/application-templates/blender-media-viewer/blender_media_viewer/userpref.blend -------------------------------------------------------------------------------- /application-templates/blender-media-viewer/docs/images/media_view_topbar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/application-templates/blender-media-viewer/docs/images/media_view_topbar.jpg -------------------------------------------------------------------------------- /application-templates/blender-media-viewer/docs/images/media_viewer_review.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/application-templates/blender-media-viewer/docs/images/media_viewer_review.jpg -------------------------------------------------------------------------------- /application-templates/blender-media-viewer/docs/images/start_media_viewer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/application-templates/blender-media-viewer/docs/images/start_media_viewer.jpg -------------------------------------------------------------------------------- /application-templates/blender-media-viewer/docs/videos/file_navigation.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/application-templates/blender-media-viewer/docs/videos/file_navigation.mp4 -------------------------------------------------------------------------------- /application-templates/blender-media-viewer/docs/videos/filebrowser_extra.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/application-templates/blender-media-viewer/docs/videos/filebrowser_extra.mp4 -------------------------------------------------------------------------------- /application-templates/blender-media-viewer/docs/videos/overview.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/application-templates/blender-media-viewer/docs/videos/overview.mp4 -------------------------------------------------------------------------------- /application-templates/blender-media-viewer/docs/videos/screen_navigation.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/application-templates/blender-media-viewer/docs/videos/screen_navigation.mp4 -------------------------------------------------------------------------------- /application-templates/blender-media-viewer/docs/videos/toggle_areas.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/application-templates/blender-media-viewer/docs/videos/toggle_areas.mp4 -------------------------------------------------------------------------------- /docs/.env.example: -------------------------------------------------------------------------------- 1 | # Env settings for docs publishing 2 | DESTINATION=user@domain:/path/to/destination/ 3 | -------------------------------------------------------------------------------- /docs/.vitepress/theme/custom.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --vp-c-brand: #009eff; 3 | --vp-c-brand-light: #45b8ff; 4 | --vp-c-brand-lighter: #7ac1ee; 5 | --vp-c-brand-dark: #008ae0; 6 | --vp-c-brand-darker: #007ac6; 7 | --vp-local-search-highlight-bg: var(--vp-c-brand-lighter); 8 | 9 | --vp-font-family-base: 'Heebo', ui-sans-serif, 10 | system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 11 | 'Helvetica Neue', Helvetica, Arial, 'Noto Sans', sans-serif, 12 | 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; 13 | --vp-font-family-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Monaco, 14 | Consolas, 'Liberation Mono', 'Courier New', monospace; 15 | } 16 | 17 | .VPNavBar { 18 | background-color: var(--vp-c-bg); 19 | } 20 | 21 | .VPNavBar.has-sidebar { 22 | background-color: transparent; 23 | } 24 | 25 | .VPHero { 26 | background-image: url("/media/images/hero_banner.jpg"); 27 | background-size: cover; 28 | margin-bottom: 2em; 29 | } 30 | 31 | .VPHero .name .clip, 32 | .VPHero .tagline, 33 | .VPHero .text { 34 | color: white; 35 | -webkit-text-fill-color: white; 36 | } 37 | -------------------------------------------------------------------------------- /docs/.vitepress/theme/index.js: -------------------------------------------------------------------------------- 1 | import DefaultTheme from 'vitepress/theme-without-fonts' 2 | import '@fontsource/heebo/variable.css' 3 | import './custom.css' 4 | 5 | export default DefaultTheme 6 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Blender Studio Pipeline Docs 2 | 3 | * Make sure you have NodeJS installed 4 | * `npm install` 5 | * `npm run docs:dev` 6 | * Refer to the [vitepress docs](https://vitepress.dev/) for how to edit the documents 7 | -------------------------------------------------------------------------------- /docs/addons/anim_cupboard.md: -------------------------------------------------------------------------------- 1 | 2 | ## 3 | # Changelog 4 | 5 | 6 | -------------------------------------------------------------------------------- /docs/addons/asset_pipeline.md: -------------------------------------------------------------------------------- 1 | 2 | ## 3 | # Changelog 4 | 5 | 6 | -------------------------------------------------------------------------------- /docs/addons/blender_kitsu.md: -------------------------------------------------------------------------------- 1 | 2 | ## 3 | # Changelog 4 | 5 | 6 | -------------------------------------------------------------------------------- /docs/addons/blender_svn.md: -------------------------------------------------------------------------------- 1 | 2 | ## 3 | # Changelog 4 | 5 | 6 | -------------------------------------------------------------------------------- /docs/addons/bone_gizmos.md: -------------------------------------------------------------------------------- 1 | 2 | ## 3 | # Changelog 4 | 5 | 6 | -------------------------------------------------------------------------------- /docs/addons/cache_manager.md: -------------------------------------------------------------------------------- 1 | 2 | ## 3 | # Changelog 4 | 5 | 6 | -------------------------------------------------------------------------------- /docs/addons/contactsheet.md: -------------------------------------------------------------------------------- 1 | 2 | ## 3 | # Changelog 4 | 5 | 6 | -------------------------------------------------------------------------------- /docs/addons/easy_weights.md: -------------------------------------------------------------------------------- 1 | 2 | ## 3 | # Changelog 4 | 5 | 6 | -------------------------------------------------------------------------------- /docs/addons/geonode_shapekeys.md: -------------------------------------------------------------------------------- 1 | 2 | ## 3 | # Changelog 4 | 5 | 6 | -------------------------------------------------------------------------------- /docs/addons/grease_converter.md: -------------------------------------------------------------------------------- 1 | 2 | ## 3 | # Changelog 4 | 5 | 6 | -------------------------------------------------------------------------------- /docs/addons/lattice_magic.md: -------------------------------------------------------------------------------- 1 | 2 | ## 3 | # Changelog 4 | 5 | -------------------------------------------------------------------------------- /docs/addons/lighting_overrider.md: -------------------------------------------------------------------------------- 1 | 2 | ## 3 | # Changelog 4 | 5 | -------------------------------------------------------------------------------- /docs/addons/overview.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /docs/addons/pose_shape_keys.md: -------------------------------------------------------------------------------- 1 | 2 | ## 3 | # Changelog 4 | 5 | -------------------------------------------------------------------------------- /docs/addons/render_review.md: -------------------------------------------------------------------------------- 1 | 2 | ## 3 | # Changelog 4 | 5 | -------------------------------------------------------------------------------- /docs/archive/pipeline-proposal-2019/shot-caching/add-on.md: -------------------------------------------------------------------------------- 1 | # Proof of concept Add-on 2 | 3 | ::: warning Legacy Documentation 4 | This is a legacy document originally written by Andy in 2019 as part of the Spring production retrospective. 5 | ::: 6 | 7 | This is a proof of concept for a more streamlined caching workflow. It also addresses some shortcomings of Blender's current cache system, namely the lack of property animation. 8 | 9 | ![Shot Builder](/media/archive/pipeline-proposal-2019/cache_tool.mp4) 10 | 11 | This work is largely based on the research below: 12 | 13 | * [Caching Workflow User Stories](user-stories.md) 14 | * [Structural Ideas](structural-ideas.md) 15 | -------------------------------------------------------------------------------- /docs/archive/pipeline-proposal-2019/shot-caching/issues.md: -------------------------------------------------------------------------------- 1 | # Issues and show-stoppers in Blender 2 | 3 | ::: warning Legacy Documentation 4 | This is a legacy document originally written by Andy in 2019 as part of the Spring production retrospective. 5 | ::: 6 | 7 | - Materials need to exist (appended or linked) in blend file before alembic import so names can be matched (could also be an automated post process) 8 | - *Sybrens idea: have some way to automatically (re)map materials based on name, and/or auto-create dummy materials otherwise. Still TBD.* 9 | - Hair curves support of intercept and UV maps not clear (or non-existent) 10 | - Particle hair currently lags one frame behind playback (and render) 11 | - Blender’s hair simulation system does not support sim from alembic cache 12 | - We have to find a workaround for simulating hair, alembic curves (result of anim export) cannot be simulated 13 | - No support for caching animated values (camera cache, driven material values) 14 | - *Design task in [T69046](https://developer.blender.org/T69046)* 15 | 16 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | # https://vitepress.dev/reference/default-theme-home-page 3 | layout: home 4 | 5 | hero: 6 | name: "Blender Studio Pipeline and Tools" 7 | tagline: "Sharing production knowledge based on the Blender open movie projects. Welcome to the official documentation of the Blender-centric pipeline." 8 | actions: 9 | - theme: brand 10 | text: Get Started 11 | link: /pipeline-overview/introduction 12 | - theme: alt 13 | text: User Guide 14 | link: /user-guide/project-setup 15 | 16 | features: 17 | - title: Free Software 18 | details: The Blender Studio pipeline is built entirely on Free and Open Source software, following Blender's mission. 19 | link: https://blender.org 20 | - title: Production-Tested 21 | details: This documentation describes the latest version of the pipeline currently in use at Blender Studio. 22 | - title: Blender-Centric 23 | details: Built around Blender, we are working under the assumtion that it's main/only content creation tool available. 24 | --- 25 | -------------------------------------------------------------------------------- /docs/media/README.md: -------------------------------------------------------------------------------- 1 | # Media Directoy 2 | 3 | Media files (images and videos) can be added here and added to git LFS. 4 | -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/context_animation_tools.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/context_animation_tools.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/context_browser.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/context_browser.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/context_lookdev_tools.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/context_lookdev_tools.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/error_active_project.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/error_active_project.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/error_animation.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/error_animation.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/metastrip.001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/metastrip.001.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/prefs_anim_tools.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/prefs_anim_tools.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/prefs_login.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/prefs_login.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/prefs_lookdev.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/prefs_lookdev.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/prefs_misc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/prefs_misc.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/prefs_outdated_media.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/prefs_outdated_media.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/prefs_project.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/prefs_project.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/sqe_init_selection.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/sqe_init_selection.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/sqe_init_shot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/sqe_init_shot.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/sqe_link_shot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/sqe_link_shot.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/sqe_metadata.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/sqe_metadata.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/sqe_multi_edit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/sqe_multi_edit.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/sqe_multi_edit_advanced.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/sqe_multi_edit_advanced.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/sqe_outdated_overlay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/sqe_outdated_overlay.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/sqe_outdated_scan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/sqe_outdated_scan.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/sqe_outdated_update.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/sqe_outdated_update.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/sqe_pull.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/sqe_pull.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/sqe_pull_entire_edit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/sqe_pull_entire_edit.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/sqe_push.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/sqe_push.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/sqe_sequence_color_init.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/sqe_sequence_color_init.jpg -------------------------------------------------------------------------------- /docs/media/addons/blender_kitsu/sqe_sequence_colors.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/blender_kitsu/sqe_sequence_colors.jpg -------------------------------------------------------------------------------- /docs/media/addons/easy_weights/custom_wp_context_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/easy_weights/custom_wp_context_menu.png -------------------------------------------------------------------------------- /docs/media/addons/easy_weights/toggle_wp_shortcut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/easy_weights/toggle_wp_shortcut.png -------------------------------------------------------------------------------- /docs/media/addons/easy_weights/vg_context_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/easy_weights/vg_context_menu.png -------------------------------------------------------------------------------- /docs/media/addons/easy_weights/weight_islands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/easy_weights/weight_islands.png -------------------------------------------------------------------------------- /docs/media/addons/easy_weights/wp_context_menu_shortcut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/easy_weights/wp_context_menu_shortcut.png -------------------------------------------------------------------------------- /docs/media/addons/grease_converter/adjustments_panel.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/grease_converter/adjustments_panel.jpg -------------------------------------------------------------------------------- /docs/media/addons/grease_converter/convert_to_grease_pencil.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/grease_converter/convert_to_grease_pencil.jpg -------------------------------------------------------------------------------- /docs/media/addons/lattice_magic/camera_lattice.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/lattice_magic/camera_lattice.gif -------------------------------------------------------------------------------- /docs/media/addons/lattice_magic/lattice_magic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/lattice_magic/lattice_magic.png -------------------------------------------------------------------------------- /docs/media/addons/lattice_magic/tweak_lattice.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/lattice_magic/tweak_lattice.gif -------------------------------------------------------------------------------- /docs/media/addons/lighting_overrider/json_icon_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/lighting_overrider/json_icon_example.png -------------------------------------------------------------------------------- /docs/media/addons/lighting_overrider/lighting_override_suffixes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/lighting_overrider/lighting_override_suffixes.png -------------------------------------------------------------------------------- /docs/media/addons/lighting_overrider/rna_override.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/addons/lighting_overrider/rna_override.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/01_02_01_D2.anim_contact.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/01_02_01_D2.anim_contact.mp4 -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/01_02_01_D2.lighting.adventurous_cache.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/01_02_01_D2.lighting.adventurous_cache.mp4 -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/01_02_01_D2.lighting1.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/01_02_01_D2.lighting1.mp4 -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/01_02_01_D2.sim1.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/01_02_01_D2.sim1.mp4 -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/3-character_pipeline_tool.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/3-character_pipeline_tool.mp4 -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/attract_asset_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/attract_asset_list.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/attract_contact_sheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/attract_contact_sheet.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/attract_dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/attract_dashboard.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/attract_shot_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/attract_shot_list.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/attract_task_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/attract_task_page.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/cache_tool.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/cache_tool.mp4 -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/char_pipeline_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/char_pipeline_01.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/char_pipeline_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/char_pipeline_02.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/cosmos_shot_caching_notes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/cosmos_shot_caching_notes.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/image3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/image3.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/pipeline_proposal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/pipeline_proposal.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/pre_production_timeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/pre_production_timeline.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/production_timeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/production_timeline.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/production_timeline_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/production_timeline_2.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/project_structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/project_structure.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/publish_asset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/publish_asset.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/publish_char.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/publish_char.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/publish_poselib.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/publish_poselib.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/shot_builder_flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/shot_builder_flow.png -------------------------------------------------------------------------------- /docs/media/archive/pipeline-proposal-2019/shot_caching.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/archive/pipeline-proposal-2019/shot_caching.png -------------------------------------------------------------------------------- /docs/media/images/hero_banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/images/hero_banner.jpg -------------------------------------------------------------------------------- /docs/media/svn-checkout.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/svn-checkout.mp4 -------------------------------------------------------------------------------- /docs/media/svn-commit.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/svn-commit.mp4 -------------------------------------------------------------------------------- /docs/media/svn-update.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/svn-update.mp4 -------------------------------------------------------------------------------- /docs/media/td-guide/server/gentoo_server_active_drive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/td-guide/server/gentoo_server_active_drive.png -------------------------------------------------------------------------------- /docs/media/td-guide/server/gentoo_server_ipxe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/td-guide/server/gentoo_server_ipxe.png -------------------------------------------------------------------------------- /docs/media/td-guide/server/gentoo_server_keyboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/td-guide/server/gentoo_server_keyboard.png -------------------------------------------------------------------------------- /docs/media/td-guide/server/gentoo_server_overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/td-guide/server/gentoo_server_overview.png -------------------------------------------------------------------------------- /docs/media/td-guide/server/gentoo_server_set_hostname.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/td-guide/server/gentoo_server_set_hostname.png -------------------------------------------------------------------------------- /docs/media/user-guide/launch_blender.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/user-guide/launch_blender.mp4 -------------------------------------------------------------------------------- /docs/media/user-guide/workstations/discover_store_install.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/user-guide/workstations/discover_store_install.mp4 -------------------------------------------------------------------------------- /docs/media/user-guide/workstations/discover_store_remove.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/user-guide/workstations/discover_store_remove.mp4 -------------------------------------------------------------------------------- /docs/media/user-guide/workstations/gentoo_boot_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/user-guide/workstations/gentoo_boot_menu.png -------------------------------------------------------------------------------- /docs/media/user-guide/workstations/gentoo_ctrl_c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/user-guide/workstations/gentoo_ctrl_c.png -------------------------------------------------------------------------------- /docs/media/user-guide/workstations/gentoo_installer_boot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/user-guide/workstations/gentoo_installer_boot.png -------------------------------------------------------------------------------- /docs/media/user-guide/workstations/gentoo_kernal_config_build_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/user-guide/workstations/gentoo_kernal_config_build_new.png -------------------------------------------------------------------------------- /docs/media/user-guide/workstations/gentoo_kernal_config_saved.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/user-guide/workstations/gentoo_kernal_config_saved.png -------------------------------------------------------------------------------- /docs/media/user-guide/workstations/gentoo_kernel_config_exit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/user-guide/workstations/gentoo_kernel_config_exit.png -------------------------------------------------------------------------------- /docs/media/user-guide/workstations/gentoo_kernel_config_start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/user-guide/workstations/gentoo_kernel_config_start.png -------------------------------------------------------------------------------- /docs/media/user-guide/workstations/gentoo_rootfs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/user-guide/workstations/gentoo_rootfs.png -------------------------------------------------------------------------------- /docs/media/user-guide/workstations/gentoo_workstation_open_terminal.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/docs/media/user-guide/workstations/gentoo_workstation_open_terminal.mp4 -------------------------------------------------------------------------------- /docs/naming-conventions/examples.md: -------------------------------------------------------------------------------- 1 | # Examples 2 | 3 | ## Assets 4 | 5 | ```txt 6 | - bark_oak.normal.png 7 | - maps/bark/bark_oak.normal.png 8 | - maps/bark/bark_oak.albedo.png 9 | - maps/bark/bark_birch.normal.png 10 | - bark_oak.albedo.png 11 | - spring.anim_test.blend 12 | ``` 13 | 14 | ## Shots 15 | 16 | ```txt 17 | - 010_110_A.anim.blend 18 | - 010_110_A.anim.mp4 19 | ``` 20 | 21 | ## Export of animation preview 22 | 23 | ```txt 24 | - 011_1140_A.anim.v001.mp4 25 | - 015_1050_A.anim.v001.mp4 26 | ``` 27 | 28 | 29 | ## Edit 30 | 31 | ```txt 32 | - sf-edit.v002.voice_recording.blend 33 | - sf-edit.v002.blend 34 | - sf-edit.v002.mov 35 | - sf-edit.v002.noblur.mkv 36 | - sf-edit.v002.720p.mkv 37 | - sf-edit.v002.voices.lossy.mp3 38 | ``` 39 | -------------------------------------------------------------------------------- /docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blender-studio-pipeline-docs", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "devDependencies": { 7 | "vitepress": "^1.0.0-alpha.75" 8 | }, 9 | "scripts": { 10 | "docs:dev": "vitepress dev", 11 | "docs:build": "vitepress build", 12 | "docs:preview": "vitepress preview", 13 | "docs:publish": "vitepress build && source .env && rsync -ravz -e \"ssh\" .vitepress/dist/ $DESTINATION && rsync -ravz -e \"ssh\" ../dist/ $DESTINATION/download" 14 | }, 15 | "dependencies": { 16 | "@fontsource/heebo": "^4.5.15", 17 | "markdown-it-html5-media": "^0.7.1" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /docs/pipeline-overview/asset-creation/modeling.md: -------------------------------------------------------------------------------- 1 | # Modeling 2 | 3 | ::: warning 4 | 4 June 2023 - The content of this page is currently being edited/updated. 5 | ::: 6 | 7 | 8 | * [Stylized Character Creation Workflow](https://www.youtube.com/watch?v=f-mx-Jfx9lA) 9 | * [Updates](https://www.youtube.com/watch?v=BJHede3Oagw) 10 | -------------------------------------------------------------------------------- /docs/pipeline-overview/design-principles.md: -------------------------------------------------------------------------------- 1 | # Design Principles 2 | Following Blender's mission, Blender Studio pursues creative content creation and knowledge sharing. For this reason, the entire production pipeline is built around free and open source software. When it comes to the final visual content (rendered frames), the only software used is Blender. 3 | 4 | The pipeline and workflows are designed to facilitate a small production unit (10-20 people) so that artists can create and deliver content as quickly and seamlessly as possible. 5 | 6 | ## Editorial-centric workflow 7 | While storytelling is the main driver for a production, and the most direct way to convert it into production processes, is to create and edit. For this reason, the editorial (and previz) department plays a key role during all stages of production. 8 | 9 | ## Pushing Blender Development 10 | Only use add-ons that are workflow/process specific and that won't be beneficial to a wide audience if included in Blender. 11 | Any other feature required to deliver a production should be considered a development target, and designed, reviewed and planned as part of the blender.org public development activities. 12 | 13 | ## Data Management 14 | Rely on Blender's linking system, limit the usage of caching as much as possible. 15 | -------------------------------------------------------------------------------- /docs/pipeline-overview/editorial-and-previz.md: -------------------------------------------------------------------------------- 1 | # Editorial and Previsualization 2 | 3 | At Blender Studio we use the Blender VSE to create and maintain a story edit. A couple of reference links for now: 4 | 5 | * [Charge Previsualization](https://studio.blender.org/blog/charge-previsualization/) 6 | * [Story Pencil](https://www.youtube.com/watch?v=b25kfE6qd_c) - Currently not used at Blender Studio, but worth checking when working with storyboard artists. 7 | -------------------------------------------------------------------------------- /docs/pipeline-overview/infrastructure.md: -------------------------------------------------------------------------------- 1 | # Infrastructure 2 | 3 | ::: warning Work in Progress 4 | 30 Apr. 2023 - The content of this page is currently being edited/updated. 5 | ::: 6 | 7 | 8 | ## Workstations 9 | Artists at Blender Studio use Linux workstations, running Gentoo Linux. While the infrastructure is meant to support other Operating Systems, it's primarily designed to work in an eterogeneous enviroment, where every machine is setup in a similar way. 10 | 11 | Artist workstations double as clients for the render farm. 12 | 13 | * [**Link to reference manual**](/user-guide/workstations/introduction.md) 14 | * [**Link to setup guide**](/td-guide/workstations/overview.md) 15 | 16 | ## Shared storage 17 | We use two shared drives 18 | 19 | * `/render` to store render farm output 20 | * `/shared` to store project and shared data 21 | 22 | **Link to setup guide** 23 | 24 | ## Version Control System 25 | We use SVN. While providing a higher barrier of entry, it provides a robust and efficient way to store and version large binary files during the course of a production. 26 | 27 | This means we need an SVN service (can be in the LAN, or online) 28 | 29 | ## Network/Web Services 30 | 31 | * Syncthing (needs access to /shared) 32 | * Flamenco (**render farm** needs access to /shared and /render) 33 | * Kitsu (**production tracker** can be hosted anywhere) 34 | * Watchtower (needs access to Kitsu) 35 | 36 | ## Other Dependencies 37 | 38 | We rely on the [Blender Buildbot](https://builder.blender.org) infrastructure to provide Blender builds to the workstations. 39 | -------------------------------------------------------------------------------- /docs/pipeline-overview/introduction.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | The goal of this documentation is to describe the pipeline and IT setup used at Blender Studio, in a way that can be replicated in another environment from scratch. 4 | 5 | ## How to read/write the docs 6 | 7 | The documentation features two types of content: 8 | 9 | * **Design docs**: explanations and insight on why things are built in a certain way 10 | * **Guides**, for two audiences: 11 | * users/artists learning how to perform certain workflows 12 | * TDs learning how to deploy and maintain the pipeline in a production environment 13 | 14 | 15 | ## Design Docs 16 | 17 | * Design principles (use Blender as much as possible, use add-ons only when needed, rely on Blender's linking system) 18 | * Infrastructure 19 | * Breakdown per department/workflow 20 | * Editorial and Previz 21 | * Concept design 22 | * Asset creation 23 | * Modeling 24 | * Shading and Texturing 25 | * Rigging 26 | * Shot assembly 27 | * Animation 28 | * Shading and lighting 29 | * Rendering 30 | * Task review 31 | * Coloring 32 | 33 | These topics can be described at a high-level, and *reference* specific tools, add-ons and worfklows in a dedicated section. 34 | 35 | 36 | ## Guides 37 | 38 | Guides are detailed series of instructions that start from the topics described in the Design Docs and deal with them in a practical way. For example: 39 | 40 | * Workstation reference 41 | * Workflows (like Design Docs above, but the practical steps). Depending on the type of production, workflows often need to be changed and tweaked. That part can better be documented on the Blender Studio blog. 42 | * Media Viewer reference 43 | * Infrastructure setup (how to build a studio IT from scratch) 44 | 45 | For "external" tools like Flamenco or Kitsu, the idea is to explain the specific use or customization we do a Blender Studio and refer to the official documentation for the rest. For example: "Install Kitsu by following the official guide". 46 | -------------------------------------------------------------------------------- /docs/td-guide/project-setup.md: -------------------------------------------------------------------------------- 1 | # Project Setup 2 | 3 | ::: warning Work in Progress 4 | 30 Apr. 2023 - The content of this page is currently being edited/updated. 5 | ::: 6 | 7 | * Setup SVN (access for users) 8 | * Setup Kitsu project 9 | * Commit intial folder structure 10 | 11 | ## Project Directory 12 | 13 | ```python 14 | . 15 | ├── config 16 | │ └── asset_pipeline_config 17 | ├── previz # Anything related to early development or pre-production tests 18 | └── pro # All files from the production 19 | ├── promo # Promotional material. Often created near the end of production 20 | ├── animation_test # For pre-production 21 | ├── shot_builder # Studio tool configs 22 | ├── lib # All assets from the production 23 | │   ├── brushes 24 | │   ├── cam # Camera rig & setup 25 | │   ├── char # Characters & character variations 26 | │   ├── env # Environment asset libraries 27 | │   ├── fx # Effects 28 | │   ├── lgt # Lighting setups 29 | │   ├── maps # General textures and HDRIs 30 | │   ├── matlib # Materials 31 | │   ├── nodes # General Node groups 32 | │   ├── poselib # Pose libraries for animation 33 | │   ├── props 34 | │   ├── scripts 35 | │   └── sets 36 | └── shots #Structured into sequences 37 | ``` 38 | 39 | ## Render Directory 40 | 41 | ``` 42 | . 43 | ├── chaches 44 | ├── delivery 45 | │   ├── audio 46 | │   ├── color_preview 47 | │   ├── mux 48 | │   └── video 49 | ├── editorial 50 | │   ├── edit 51 | │   ├── export 52 | │   ├── fonts 53 | │   ├── score 54 | │   └── sfx 55 | ├── farm_output 56 | │   ├── lib 57 | │   └── shots 58 | ├── plates 59 | ├── shot_frames 60 | └── shot_previews 61 | ``` 62 | 63 | ## Shared Directory 64 | 65 | ```python 66 | . 67 | ├── bts # Behind the scenes 68 | ├── concepts # Concept art and paintings 69 | ├── development # Piches and boards 70 | ├── inspiration # Various inspirations & references 71 | ├── music 72 | ├── planning 73 | ├── pr 74 | ├── resources 75 | ├── script # Latest scripts for the movie 76 | ├── shot_packs # Shots for sharing online 77 | ├── training # Training produced for the production 78 | └── videoref # Video shoots from animators 79 | ``` 80 | -------------------------------------------------------------------------------- /docs/td-guide/workstations/overview.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | The workstation section will cover the setup/maintenance of workstations in the Blende Studio Pipeline. This section is intended for IT Professionals, Technical Directors or any technically inclined members of a studio's team. The following is a brief overview of the workstation eco-system. 4 | # Overview 5 | 6 | Blender Studio workstations use the [Gentoo](https://www.gentoo.org/) Operating system. It is a source based distribution, which means you download the source code for every package and compile it yourself. The advantage of Gentoo is that we can much more easily interact with source code and upstream projects. To learn about how to work with Gentoo see the [Gentoo Handbook](https://wiki.gentoo.org/wiki/Handbook:AMD64) 7 | 8 | The Gentoo package manager allows a single computer to compile and serve pre-built packages to a network of computers, this can be useful in a studio environment. This server is called the "Build Server" which provides software to the client systems. 9 | 10 | Here is an overview of how we deploy Gentoo at the Blender Studio: 11 | 12 | ![Gentoo Overview](/media/td-guide/server/gentoo_server_overview.png) 13 | |Name|Description| 14 | |---|---| 15 | |**IPXE File Host**| This is simple a http server that hosts boot images. [IPXE](https://ipxe.org/) is a network based boot loader that can boot over the network| 16 | |**Gentoo Build Server**|Server that serves pre-built packages to a network of computers. It also keeps track of client hardware info and client update error logs| 17 | |**Client System**|Workstations for users within the studio that receive software & updates from Build Server| 18 | 19 | 20 | ::: info Note 21 | Clients do not strictly depend on the Build Server. The build server can be unavailable and all clients will still be able to install packages and work as normal. They will simply not receive any automatic updates or download any precompiled packages if the build server is down. 22 | 23 | After the install process is done, the IPXE file host is only needed for reinstalls or if any of them wants to access it for running MemTest or any other utilities hosted there. 24 | ::: -------------------------------------------------------------------------------- /docs/user-guide/debugging.md: -------------------------------------------------------------------------------- 1 | # Debugging 2 | 3 | Follow these instructions, if Blender crashes immedietley upon opening a file. This is called “a crash on load” in liboverride resync code. 4 | 5 | 1. Found and fixed in main a (potentially) related issue. 6 | 2. File is still broken, not sure why, but it currently makes auto resync of overrides completely freak out. 7 | 3. When this happen, easy work around is to: 8 | - Disable *TEMPORARILY* auto-resync (preferences-> Experimental -> Debugging -> Override Auto Resync) 9 | - Open the broken file 10 | - Manually resync the overrides one by one (right-click on top-level collections in the outliner, Library Override -> Tropubleshoot -> Resync). 11 | - Purge. 12 | - Save. 13 | - Re-enable auto-resync. 14 | - Re-open the file. 15 | 16 | This should solve the problems, or at the very least pin-point more what is the problematic override. 17 | -------------------------------------------------------------------------------- /docs/user-guide/project-setup.md: -------------------------------------------------------------------------------- 1 | # Project Setup 2 | 3 | ::: warning Work in Progress 4 | 30 Apr. 2023 - The content of this page is currently being edited/updated. 5 | ::: 6 | 7 | Write how to set up a project in a fully configured workstation and production enviroment. Probably links to other parts of the reference. 8 | 9 | * Ensure SVN access 10 | * Ensure that Blender is configured with the 'shared' add-ons directory 11 | * Ensure Kitsu access 12 | * Checkout SVN project in the appropriate location 13 | * ... 14 | -------------------------------------------------------------------------------- /docs/user-guide/svn.md: -------------------------------------------------------------------------------- 1 | # Using SVN 2 | 3 | ## Add SVN Repo 4 | ![How to checkout SVN](/media/svn-checkout.mp4) 5 | 1. Launch Rapid SVN 6 | 2. Add Exisitng Repository via Repository>Checkout 7 | 3. Add Repository to your bookmarks 8 | 4. Once Checkout is complete your SVN Repo will appear in the RAPID SVN Client's bookmarks 9 | ## Pull SVN Updates 10 | ![How to update SVN](/media/svn-update.mp4) 11 | 1. Right Click inside SVN Repo and select Update 12 | 2. Select Use Latest under Revision 13 | 3. Click OK to start update 14 | ## Push SVN Commits 15 | ![How to commit to SVN](/media/svn-commit.mp4) 16 | 1. Right Click inside SVN Repo and select Commit 17 | 2. Enter Commit Message 18 | 3. Click OK to commit your changes -------------------------------------------------------------------------------- /docs/user-guide/workstations/introduction.md: -------------------------------------------------------------------------------- 1 | # Introduction: Workstations 2 | 3 | ::: warning Work in Progress 4 | 30 Apr. 2023 - The content of this page is currently being edited/updated. 5 | ::: 6 | 7 | ## Why we installed Gentoo at the studio 8 | 9 | - The old infrastructure we used were not easily scaleable, maintainable, and easy to re-deploy. 10 | - Previously, we had no way to push up updates consistently to computers in the studio. All updates had to be done by the artists themselves. 11 | - With the new system we can easily deploy fixes for program other than Blender. Before this our artists could be stuck with issues that had already been fixed for up to a half a year because we couldn’t update or roll out the fixes ourselves. 12 | 13 | ## Main principles 14 | 15 | Stay true to and expand on “The freedom to create” mantra with the following principles: 16 | 17 | - We should ensure that we have a free (as in freedom) ecosystem that other studios can use. 18 | - The solutions we develop should be shareable and easily deployable elsewhere. 19 | - It should be easy to collaborate with other software projects to solve issues. (Easy to modify and deploy software, including Blender, with custom patches) 20 | - No central point of failure. IE no: “The login server is down so I can’t login to my computer today”. 21 | 22 | ## Limitations 23 | 24 | - While the system is very flexible, we can’t cater to everyone. So while it would be possible to support very exotic setups that some users want, we can’t realistically spend time on it. 25 | - More planning and communication is needed when deploying new software solutions at the studio. (Should make things more structured and organized though…) 26 | - Training and documentation is needed for people to be able to use the system. 27 | 28 | 29 | ## Useful Links 30 | [The Gentoo handbook](https://wiki.gentoo.org/wiki/Handbook:AMD64) -------------------------------------------------------------------------------- /docs/user-guide/workstations/running-blender.md: -------------------------------------------------------------------------------- 1 | # Working with Blender 2 | 3 | ## Launch Blender from Taskbar/Start Menu 4 | 1. Search for Blender in your Application Launcher 5 | 2. The application with the exact name `blender` without any suffix is the latest build. 6 | ![Image of Blender Icon in KDE Taskbar/Start Menu](/media/user-guide/launch_blender.mp4) 7 | 8 | ## Launch Blender from Terminal 9 | 1. Open a new Terminal window 10 | 2. Type command `blender` 11 | ## Roll Back Blender Build 12 | 1. Login as ********root******** user using `su` 13 | 2. Run `rollback_blender.sh` from any folder 14 | 15 | ```powershell 16 | Available builds: 17 | 18 | ID: 1 (2023-03-30 06:10) 19 | ID: 2 (2023-03-30 17:13) 20 | ID: 3 (2023-03-30 17:40) 21 | ID: 4 (2023-04-02 22:07) 22 | ID: 5 (2023-04-03 20:12) 23 | ID: 6 (2023-04-11 20:12) 24 | ID: 7 (2023-04-20 20:12) 25 | 26 | Select which Blender build number to switch to. 27 | (press ENTER to confirm): 28 | ``` 29 | 3. Select a build by enter a number and pressing Enter to confirm 30 | 31 | ## Build Blender Locallly 32 | 33 | 1. Download Git repo 34 | 35 | ```bash 36 | mkdir ~/blender-git 37 | cd ~/blender-git 38 | git clone https://projects.blender.org/blender/blender.git 39 | ``` 40 | 41 | 2. Build Blender 42 | 43 | ```bash 44 | cd ~/blender-git/blender 45 | make update 46 | make 47 | ``` 48 | 49 | 3. Find your built blender `cd ../build_linux` -------------------------------------------------------------------------------- /scripts-blender/addons/anim_cupboard/CHANGELOG.MD: -------------------------------------------------------------------------------- 1 | ## 0.0.3 - 2023-06-19 2 | 3 | ### ADDED 4 | - Add Selection Sets to Animation Panel (#81) 5 | 6 | ### FIXED 7 | - Fix line ends from DOS to UNIX (#68) 8 | 9 | ## 0.0.2 - 2023-06-02 10 | 11 | ### ADDED 12 | - Add release system 13 | 14 | ### FIXED 15 | - Fix Addon Install Instructions 16 | - Fix Addons Spelling and Links (#54) 17 | - Fix crash in update_file_list() 18 | 19 | 20 | -------------------------------------------------------------------------------- /scripts-blender/addons/anim_cupboard/README.md: -------------------------------------------------------------------------------- 1 | # Anim Cupboard 2 | 3 | Miscellaneous operators and tools requested by Blender Studio Animators. 4 | 5 | ## Table of Contents 6 | - [Installation](#installation) 7 | - [Features](#features) 8 | - [Select Similar Curves](#select-similar-curves) 9 | - [Lock Curves](#lock-curves) 10 | - [Easy Constraints](#easy-constraints) 11 | 12 | ## Installation 13 | 1. Download [latest release](../addons/overview) 14 | 2. Launch Blender, navigate to `Edit > Preferences` select `Addons` and then `Install`, 15 | 3. Navigate to the downloaded add-on and select `Install Add-on` 16 | 17 | ## Features 18 | ### Select Similar Curves 19 | 20 | Location: Graph Editor -> Select -> Select Similar Curves 21 | This will set the selection state of all selected bones' curves based on whether they match the transform channel of the active curve. For example, if the active curve is a Y Rotation curve, all Y Rotation curves will be selected, and all others de-selected. 22 | 23 | ### Lock Curves 24 | 25 | Location: Graph Editor -> Channels -> Lock 26 | This operator lets you set the lock state of selected, un-selected or all curves. 27 | 28 | ### Easy Constraints 29 | 30 | Location: 3D Viewport -> Sidebar -> Animation -> Easy Constraints 31 | This UI panel lets animators easily create and manage Copy Transforms constraint set-ups with a VERY minimalistic UI. 32 | In future, other constraint types can be added as well. 33 | -------------------------------------------------------------------------------- /scripts-blender/addons/anim_cupboard/__init__.py: -------------------------------------------------------------------------------- 1 | import importlib 2 | from bpy.utils import register_class, unregister_class 3 | from typing import List 4 | 5 | 6 | from .operators import select_similar_curves 7 | from .operators import lock_curves 8 | from .operators import bake_anim_across_armatures 9 | from . import easy_constraints 10 | from . import warn_about_broken_libraries 11 | from . import bone_selection_sets 12 | 13 | bl_info = { 14 | 'name': "Animation Cupboard", 15 | 'author': "Demeter Dzadik", 16 | "version": (0, 0, 3), 17 | 'blender': (3, 2, 0), 18 | 'description': "Tools to improve animation workflows", 19 | 'location': "Various", 20 | 'category': 'Animation', 21 | # 'doc_url' : "https://gitlab.com/blender/CloudRig/", 22 | } 23 | 24 | modules = ( 25 | select_similar_curves, 26 | lock_curves, 27 | bake_anim_across_armatures, 28 | easy_constraints, 29 | warn_about_broken_libraries, 30 | bone_selection_sets, 31 | ) 32 | 33 | 34 | def register_unregister_modules(modules: List, register: bool): 35 | """Recursively register or unregister modules by looking for either 36 | un/register() functions or lists named `registry` which should be a list of 37 | registerable classes. 38 | """ 39 | register_func = register_class if register else unregister_class 40 | 41 | for m in modules: 42 | if register: 43 | importlib.reload(m) 44 | if hasattr(m, 'registry'): 45 | for c in m.registry: 46 | try: 47 | register_func(c) 48 | except Exception as e: 49 | un = 'un' if not register else '' 50 | print(f"Warning: Failed to {un}register class: {c.__name__}") 51 | print(e) 52 | 53 | if hasattr(m, 'modules'): 54 | register_unregister_modules(m.modules, register) 55 | 56 | if register and hasattr(m, 'register'): 57 | m.register() 58 | elif hasattr(m, 'unregister'): 59 | m.unregister() 60 | 61 | 62 | def register(): 63 | register_unregister_modules(modules, True) 64 | 65 | 66 | def unregister(): 67 | register_unregister_modules(modules, False) 68 | -------------------------------------------------------------------------------- /scripts-blender/addons/anim_cupboard/bone_selection_sets.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | from addon_utils import check, paths 3 | 4 | 5 | import sys 6 | 7 | 8 | addon_enabled = False 9 | 10 | 11 | def check_addon_enabled(): 12 | # Adapted from https://blenderartists.org/t/check-if-add-on-is-enabled-using-python/522226/2 13 | for path in paths(): 14 | for mod_name, mod_path in bpy.path.module_names(path): 15 | if mod_name == 'bone_selection_sets': 16 | is_enabled, is_loaded = check(mod_name) 17 | sys.path.append(dir) 18 | return is_enabled 19 | return False 20 | 21 | 22 | class POSE_PT_selection_sets_view3d(bpy.types.Panel): 23 | bl_label = "Selection Sets" 24 | bl_space_type = 'VIEW_3D' 25 | bl_region_type = 'UI' 26 | bl_category = 'Animation' 27 | 28 | @classmethod 29 | def poll(cls, context): 30 | return context.mode == 'POSE' and context.active_pose_bone 31 | 32 | def draw(self, context): 33 | layout = self.layout 34 | if not check_addon_enabled(): 35 | layout.label(text="Addon 'Bone Selection Sets' not Enabled", icon="ERROR") 36 | return 37 | import bone_selection_sets 38 | from bone_selection_sets import POSE_PT_selection_sets 39 | 40 | POSE_PT_selection_sets.draw(self, context) 41 | 42 | 43 | registry = [ 44 | POSE_PT_selection_sets_view3d, 45 | ] 46 | -------------------------------------------------------------------------------- /scripts-blender/addons/anim_cupboard/fcurve_utils.py: -------------------------------------------------------------------------------- 1 | from typing import List 2 | from bpy.types import Action, PoseBone, FCurve 3 | 4 | 5 | def get_fcurves_of_bone(action: Action, bone_name: str) -> List[FCurve]: 6 | good_curves = [] 7 | 8 | for fc in action.fcurves: 9 | if 'pose.bones' not in fc.data_path: 10 | continue 11 | bone_of_curve = fc.data_path.split('pose.bones["')[1].split('"]')[0] 12 | if bone_name == bone_of_curve: 13 | good_curves.append(fc) 14 | 15 | return good_curves 16 | 17 | 18 | def get_fcurves_of_bones(action: Action, pose_bones: List[PoseBone]) -> List[FCurve]: 19 | 20 | fcurves = [] 21 | for pb in pose_bones: 22 | fcurves.extend(get_fcurves_of_bone(action, pb.name)) 23 | 24 | return fcurves 25 | 26 | 27 | def get_fcurves(context, action: Action, set="ALL") -> List[FCurve]: 28 | """Return a list of FCurves in the given action.""" 29 | 30 | fcurves = action.fcurves 31 | if set == 'ALL': 32 | return fcurves 33 | elif set == 'ACTIVE': 34 | return context.active_editable_fcurve 35 | elif set == 'SELECTED': 36 | # Differs from selected_editable_fcurves because locked curves can be selected but aren't editable. 37 | return [fc for fc in fcurves if fc.select] 38 | elif set == 'UNSELECTED': 39 | return [fc for fc in fcurves if not fc.select] 40 | -------------------------------------------------------------------------------- /scripts-blender/addons/anim_cupboard/operators/select_similar_curves.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | from bpy.types import Operator 3 | from ..fcurve_utils import get_fcurves_of_bones 4 | 5 | 6 | class POSE_OT_select_matching_curves(Operator): 7 | """Set selection of all curves based on whether they match the transformation axis of the active curve""" 8 | bl_idname = "pose.select_matching_curves" 9 | bl_label = "Select Matching Curves" 10 | bl_options = {'REGISTER', 'UNDO'} 11 | 12 | @classmethod 13 | def poll(cls, context): 14 | # Only works in Graph Editor, when there is an active curve. 15 | return context.active_editable_fcurve 16 | 17 | def execute(self, context): 18 | action = context.object.animation_data.action 19 | 20 | fcurves_of_selected_bones = get_fcurves_of_bones( 21 | action, context.selected_pose_bones) 22 | 23 | property_name = context.active_editable_fcurve.data_path.split(".")[-1] 24 | 25 | for fc in fcurves_of_selected_bones: 26 | fc.select = fc.data_path.endswith(property_name) and \ 27 | fc.array_index == context.active_editable_fcurve.array_index 28 | 29 | return {'FINISHED'} 30 | 31 | 32 | def draw_select_matching_curves(self, context): 33 | layout = self.layout 34 | layout.operator(POSE_OT_select_matching_curves.bl_idname) 35 | 36 | 37 | registry = [ 38 | POSE_OT_select_matching_curves 39 | ] 40 | 41 | 42 | def register(): 43 | bpy.types.GRAPH_MT_select.append(draw_select_matching_curves) 44 | 45 | 46 | def unregister(): 47 | bpy.types.GRAPH_MT_select.remove(draw_select_matching_curves) 48 | -------------------------------------------------------------------------------- /scripts-blender/addons/asset_pipeline/.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | 58 | # Flask stuff: 59 | instance/ 60 | .webassets-cache 61 | 62 | # Scrapy stuff: 63 | .scrapy 64 | 65 | # Sphinx documentation 66 | docs/_build/ 67 | 68 | # PyBuilder 69 | target/ 70 | 71 | # Jupyter Notebook 72 | .ipynb_checkpoints 73 | 74 | # pyenv 75 | .python-version 76 | 77 | # celery beat schedule file 78 | celerybeat-schedule 79 | 80 | # SageMath parsed files 81 | *.sage.py 82 | 83 | # dotenv 84 | .env 85 | 86 | # virtualenv 87 | .venv 88 | .venv* 89 | venv/ 90 | ENV/ 91 | 92 | # Spyder project settings 93 | .spyderproject 94 | .spyproject 95 | 96 | # Rope project settings 97 | .ropeproject 98 | 99 | # mkdocs documentation 100 | /site 101 | 102 | # mypy 103 | .mypy_cache/ 104 | 105 | # IDE settings 106 | .vscode/ 107 | 108 | # utility bat files: 109 | *jump_in_venv.bat 110 | 111 | #local tests 112 | tests/local* 113 | 114 | # Production Config Dir. 115 | production_config/* 116 | -------------------------------------------------------------------------------- /scripts-blender/addons/asset_pipeline/CHANGELOG.MD: -------------------------------------------------------------------------------- 1 | ## 0.1.1 - 2023-06-02 2 | 3 | ### FIXED 4 | - Fix Addon Install Instructions 5 | - Fix Addons Spelling and Links (#54) 6 | 7 | 8 | -------------------------------------------------------------------------------- /scripts-blender/addons/asset_pipeline/__init__.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | import logging 22 | 23 | import bpy 24 | 25 | import importlib 26 | 27 | from . import prefs, util, props, api, builder, updater 28 | 29 | bl_info = { 30 | "name": "Asset Pipeline", 31 | "author": "Paul Golter", 32 | "description": "Blender Studio Asset Pipeline Add-on", 33 | "blender": (3, 1, 0), 34 | "version": (0, 1, 1), 35 | "location": "View3D", 36 | "warning": "", 37 | "doc_url": "", 38 | "tracker_url": "", 39 | "category": "Generic", 40 | } 41 | 42 | logger = logging.getLogger("BSP") 43 | 44 | 45 | def reload() -> None: 46 | global util 47 | global prefs 48 | global props 49 | global api 50 | global builder 51 | global updater 52 | 53 | importlib.reload(util) 54 | importlib.reload(prefs) 55 | importlib.reload(props) 56 | importlib.reload(api) 57 | 58 | builder.reload() 59 | updater.reload() 60 | 61 | 62 | _need_reload = "prefs" in locals() 63 | if _need_reload: 64 | reload() 65 | 66 | # ----------------REGISTER--------------. 67 | 68 | 69 | def register() -> None: 70 | prefs.register() 71 | props.register() 72 | builder.register() 73 | updater.register() 74 | 75 | 76 | def unregister() -> None: 77 | builder.unregister() 78 | updater.unregister() 79 | props.unregister() 80 | prefs.unregister() 81 | -------------------------------------------------------------------------------- /scripts-blender/addons/asset_pipeline/api/__init__.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | from ..builder.context import BuildContext 21 | from ..builder.task_layer import TaskLayer 22 | from ..builder.asset_mapping import AssetTransferMapping 23 | from ..builder.hook import hook, Wildcard, DoNotMatch 24 | from ..builder.vis import EnsureObjectVisibility, EnsureCollectionVisibility 25 | 26 | __all__ = ["TaskLayer", 27 | "BuildContext", 28 | "AssetTransferMapping", 29 | "hook", 30 | "Wildcard", 31 | "DoNotMatch", 32 | "EnsureObjectVisibility", 33 | "EnsureCollectionVisibility", 34 | ] 35 | -------------------------------------------------------------------------------- /scripts-blender/addons/asset_pipeline/asset_status.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | from typing import List, Dict, Union, Any, Set, Optional, Tuple 22 | from pathlib import Path 23 | from enum import Enum, auto 24 | 25 | import bpy 26 | 27 | 28 | class AssetStatus(Enum): 29 | REVIEW = 0 30 | APPROVED = 1 31 | DEPRECATED = 2 32 | 33 | 34 | def get_asset_status_as_bl_enum( 35 | self: bpy.types.Operator, context: bpy.types.Context 36 | ) -> List[Tuple[str, str, str]]: 37 | return [(str(item.value), item.name.capitalize(), "") for item in AssetStatus] 38 | -------------------------------------------------------------------------------- /scripts-blender/addons/asset_pipeline/builder/__init__.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | import importlib 21 | 22 | from typing import List, Dict, Union, Any, Set, Optional 23 | 24 | from . import ops, ui 25 | from .context import ProductionContext, AssetContext, BuildContext, UndoContext 26 | from .asset_builder import AssetBuilder 27 | 28 | # Initialize building variables. 29 | PROD_CONTEXT: Optional[ProductionContext] = None 30 | ASSET_CONTEXT: Optional[AssetContext] = None 31 | BUILD_CONTEXT: Optional[BuildContext] = None 32 | ASSET_BUILDER: Optional[AssetBuilder] = None 33 | UNDO_CONTEXT: Optional[UndoContext] = None 34 | 35 | # ----------------REGISTER--------------. 36 | 37 | 38 | def reload() -> None: 39 | global ops 40 | global ui 41 | 42 | importlib.reload(ops) 43 | importlib.reload(ui) 44 | 45 | 46 | def register() -> None: 47 | ops.register() 48 | ui.register() 49 | 50 | 51 | def unregister() -> None: 52 | ui.unregister() 53 | ops.unregister() 54 | -------------------------------------------------------------------------------- /scripts-blender/addons/asset_pipeline/builder/blstarter.py: -------------------------------------------------------------------------------- 1 | # ##### BEGIN GPL LICENSE BLOCK ##### 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 16 | # 17 | # ##### END GPL LICENSE BLOCK ##### 18 | 19 | # 20 | 21 | # This file was made by Jeroen Bakker in the shot-builder repository: 22 | # https://developer.blender.org/diffusion/BSTS/browse/master/shot-builder/shot_builder/sys_utils 23 | import logging 24 | import subprocess 25 | 26 | from pathlib import Path 27 | from typing import List, Dict, Union, Any, Optional 28 | 29 | logger = logging.getLogger("BSP") 30 | 31 | import bpy 32 | 33 | 34 | class BuilderBlenderStarter: 35 | 36 | path: Path = Path(bpy.app.binary_path) 37 | publish_script: Path = Path(__file__).parent.joinpath("scripts/push.py") 38 | 39 | @classmethod 40 | def start_publish(cls, filepath: Path, pickle_path: Path) -> subprocess.Popen: 41 | cmd_str = ( 42 | f'"{cls.path.as_posix()}" "{filepath.as_posix()}"' 43 | ' -b' 44 | # ' --factory-startup' 45 | # f' --addons blender_kitsu,asset_pipeline' 46 | f' -P "{cls.publish_script.as_posix()}"' 47 | f' -- "{pickle_path.as_posix()}"' 48 | ) 49 | popen = subprocess.Popen(cmd_str, shell=True) 50 | return popen 51 | -------------------------------------------------------------------------------- /scripts-blender/addons/asset_pipeline/constants.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | METADATA_EXT = ".xmp" 22 | VERSION_PATTERN = r"v(\d\d\d)" 23 | DELIMITER = "." 24 | TARGET_SUFFIX = ".TARGET" 25 | TASK_SUFFIX = ".TASK" 26 | PUBLISH_SUFFIX = ".PUBLISH" 27 | FULLY_OWNED_SUFFIX = ".FULLY_OWNED" 28 | TRANSFER_SETTINGS_NAME = "TransferSettings" 29 | DEFAULT_ROWS = 3 30 | TIME_FORMAT = r"%Y-%m-%dT%H:%M:%S" 31 | DEFAULT_ASSET_STATUS = "REVIEW" 32 | HOOK_ATTR_NAME = "_asset_builder_rules" 33 | -------------------------------------------------------------------------------- /scripts-blender/addons/asset_pipeline/docs/production_config_example/hooks.py: -------------------------------------------------------------------------------- 1 | from typing import Any, Dict, List, Set, Union, Optional 2 | import bpy 3 | 4 | from asset_pipeline.api import hook, Wildcard, DoNotMatch 5 | 6 | """ 7 | Hooks can be matched with the following parameters. 8 | As match input you can use str, list, WildCard, DoNotMatch 9 | 10 | Examples: 11 | - Global Hooks (No match filter): @hook() 12 | - Hooks for an asset type only: @hook(match_asset_type="Character") 13 | - Hooks for a specific asset: @hook(match_asset: "Sprite") 14 | - Hooks for a task layer only @hook(match_task_layers: ["ShadingTaskLayer", "RiggingTaskLayer"] 15 | - Hooks for an asset and a task layer combination: @hook(macth_asset: "Sprite", match_task_layers: "ShadingTaskLayer") 16 | Note: the decorator needs to be executed. 17 | 18 | It is important to note that the asset-pipeline follows a certain order to execute the hooks. And that is exactly the one of the examples hook described above: 19 | 20 | 1. Global hooks 21 | 2. Asset Type Hooks 22 | 3. Task Layer Hooks 23 | 4. Asset Hooks 24 | 5. Asset + TaskLayer specific Hooks 25 | 26 | 27 | The function itself should always have **\*\*kwargs** as a parameter. The asset-pipeline automatically passes a couple of useful keyword arguments to the function: 28 | - `asset_collection`: bpy.types.Collection 29 | - `context`: bpy.types.Context 30 | - `asset_task`: asset_pipeline.asset_files.AssetTask 31 | - `asset_dir`: asset_pipeline.asset_files.AssetDir 32 | 33 | By exposing these parameters in the hook function you can use them in your code. 34 | """ 35 | 36 | @hook() 37 | def test_hook_A(asset_collection: bpy.types.Collection, **kwargs) -> None: 38 | print("Test Hook A running!") 39 | 40 | 41 | @hook(match_asset="Test") 42 | def test_hook_B(**kwargs) -> None: 43 | print("Test Hook B running!") 44 | 45 | 46 | @hook( 47 | match_asset="Generic Sprite", 48 | match_task_layers="ShadingTaskLayer", 49 | ) 50 | def test_hook_sprite(asset_collection: bpy.types.Collection, **kwargs) -> None: 51 | print(f"Test Hook Sprite {asset_collection} is running!") 52 | -------------------------------------------------------------------------------- /scripts-blender/addons/asset_pipeline/prop_utils.py: -------------------------------------------------------------------------------- 1 | # ##### BEGIN GPL LICENSE BLOCK ##### 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 16 | # 17 | # ##### END GPL LICENSE BLOCK ##### 18 | 19 | # 20 | 21 | from typing import List, Dict, Union, Any, Optional, Tuple, Generator 22 | 23 | import bpy 24 | 25 | 26 | def get_property_group_items( 27 | property_group: bpy.types.PropertyGroup, 28 | ) -> Generator[Tuple[str, bpy.types.Property], None, None]: 29 | 30 | for i in range(len(property_group.bl_rna.properties.items())): 31 | item = property_group.bl_rna.properties.items()[i] 32 | iname, iprop = item 33 | 34 | if iname in ["rna_type", "bl_rna", "name"]: 35 | continue 36 | 37 | yield item 38 | -------------------------------------------------------------------------------- /scripts-blender/addons/asset_pipeline/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/scripts-blender/addons/asset_pipeline/tests/__init__.py -------------------------------------------------------------------------------- /scripts-blender/addons/asset_pipeline/tests/test_blender_studio_pipeline.py: -------------------------------------------------------------------------------- 1 | from asset_pipeline import __version__ 2 | 3 | 4 | def test_version(): 5 | assert __version__ == "0.1.0" 6 | -------------------------------------------------------------------------------- /scripts-blender/addons/asset_pipeline/updater/__init__.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | import importlib 21 | 22 | from typing import List, Dict, Union, Any, Set, Optional 23 | 24 | from . import ops, ui 25 | from .asset_updater import AssetUpdater 26 | 27 | # Initialize variables. 28 | ASSET_UPDATER = AssetUpdater() 29 | 30 | 31 | # ----------------REGISTER--------------. 32 | 33 | 34 | def reload() -> None: 35 | global ops 36 | global ui 37 | 38 | importlib.reload(ops) 39 | importlib.reload(ui) 40 | 41 | 42 | def register() -> None: 43 | ops.register() 44 | ui.register() 45 | 46 | 47 | def unregister() -> None: 48 | ui.unregister() 49 | ops.unregister() 50 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/CHANGELOG.MD: -------------------------------------------------------------------------------- 1 | ## 0.1.2 - 2023-06-19 2 | 3 | ### ADDED 4 | - Add option to cleanup empty actions (#73) 5 | 6 | ### FIXED 7 | - Fix "add_preview_to_comment" 8 | - Fix Keep existing actions during `Check Action Names` (#75) 9 | - Fix bug in frame range calculation (#72) 10 | - Fix line ends from DOS to UNIX (#68) 11 | - Set Custom Thumbnail during Playblast (#77) 12 | - Use Background Thread for Kitsu Login (#79) 13 | - Rename 'Render Thumbnail' to 'Render Still' (#86) 14 | 15 | ### REMOVED 16 | - Remove Metastrip Filepath (#80) 17 | 18 | 19 | ## 0.1.1 - 2023-06-02 20 | 21 | ### ADDED 22 | - Add "FX-" to output collection (#59) 23 | 24 | ### FIXED 25 | - Fix Addon Install Instructions 26 | - Fix "Update output collection" 27 | - Fix PyGPU Key (#60) 28 | - Fix Addons Spelling and Links (#54) 29 | - Make PyGPU enum backwards compatible 30 | - Fix Frame Start & Frame End Calculation (#46) 31 | - Push Seq - restore gen_output_path() (#45) 32 | - Add Operators to cleanup Animation Files (#38) -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/HISTORY.md: -------------------------------------------------------------------------------- 1 | # History 2 | 3 | ### 0.1.0 (2020-03-16) 4 | --- 5 | - -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/anim/__init__.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | import importlib 22 | from blender_kitsu.anim import opsdata, ops, ui 23 | 24 | 25 | # ---------REGISTER ----------. 26 | 27 | 28 | def reload(): 29 | global opsdata 30 | global ops 31 | global ui 32 | 33 | opsdata = importlib.reload(opsdata) 34 | ops = importlib.reload(ops) 35 | ui = importlib.reload(ui) 36 | 37 | 38 | def register(): 39 | ops.register() 40 | ui.register() 41 | 42 | 43 | def unregister(): 44 | ui.unregister() 45 | ops.unregister() 46 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/auth/__init__.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | import importlib 22 | from blender_kitsu.auth import ops, ui 23 | 24 | 25 | # ---------REGISTER ----------. 26 | 27 | 28 | def reload(): 29 | global ops 30 | global ui 31 | 32 | ops = importlib.reload(ops) 33 | ui = importlib.reload(ui) 34 | 35 | 36 | def register(): 37 | ops.register() 38 | ui.register() 39 | 40 | 41 | def unregister(): 42 | ui.unregister() 43 | ops.unregister() 44 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/context/__init__.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | import importlib 22 | from blender_kitsu.context import ops, ui 23 | 24 | 25 | # ---------REGISTER ----------. 26 | 27 | 28 | def reload(): 29 | global ops 30 | global ui 31 | 32 | ops = importlib.reload(ops) 33 | ui = importlib.reload(ui) 34 | 35 | 36 | def register(): 37 | ops.register() 38 | ui.register() 39 | 40 | 41 | def unregister(): 42 | ui.unregister() 43 | ops.unregister() 44 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/exception.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | 22 | class ShotInvalidException(Exception): 23 | """ 24 | Error raised when shot is not valid. For example has no self.id. 25 | """ 26 | 27 | pass 28 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/gazu/__init__.py: -------------------------------------------------------------------------------- 1 | from . import client as raw 2 | from . import cache 3 | from . import helpers 4 | 5 | from . import asset 6 | from . import casting 7 | from . import context 8 | from . import entity 9 | from . import edit 10 | from . import files 11 | from . import project 12 | from . import person 13 | from . import shot 14 | from . import sync 15 | from . import task 16 | from . import user 17 | from . import playlist 18 | 19 | from .exception import AuthFailedException, ParameterException 20 | from .__version__ import __version__ 21 | 22 | 23 | def get_host(client=raw.default_client): 24 | return raw.get_host(client=client) 25 | 26 | 27 | def set_host(url, client=raw.default_client): 28 | raw.set_host(url, client=client) 29 | 30 | 31 | def log_in(email, password, client=raw.default_client): 32 | tokens = {} 33 | try: 34 | tokens = raw.post( 35 | "auth/login", {"email": email, "password": password}, client=client 36 | ) 37 | except ParameterException: 38 | pass 39 | 40 | if not tokens or ( 41 | "login" in tokens and tokens.get("login", False) == False 42 | ): 43 | raise AuthFailedException 44 | else: 45 | raw.set_tokens(tokens, client=client) 46 | return tokens 47 | 48 | 49 | def log_out(client=raw.default_client): 50 | tokens = {} 51 | try: 52 | raw.get("auth/logout", client=client) 53 | except ParameterException: 54 | pass 55 | raw.set_tokens(tokens, client=client) 56 | return tokens 57 | 58 | 59 | def get_event_host(client=raw.default_client): 60 | return raw.get_event_host(client=client) 61 | 62 | 63 | def set_event_host(url, client=raw.default_client): 64 | raw.set_event_host(url, client=client) 65 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/gazu/__version__.py: -------------------------------------------------------------------------------- 1 | __version__ = "0.8.30" 2 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/gazu/edit.py: -------------------------------------------------------------------------------- 1 | from blender_kitsu import gazu 2 | from . import client as raw 3 | from .sorting import sort_by_name 4 | 5 | from .cache import cache 6 | from .helpers import normalize_model_parameter 7 | 8 | default = raw.default_client 9 | 10 | @cache 11 | def get_all_edits(relations=False, client=default): 12 | """ 13 | Retrieve all edit entries. 14 | """ 15 | params = {} 16 | if relations: 17 | params = {"relations": "true"} 18 | path = "edits/all" 19 | edits = raw.fetch_all(path, params, client=client) 20 | return sort_by_name(edits) 21 | 22 | @cache 23 | def get_edit(edit_id, relations=False, client=default): 24 | """ 25 | Retrieve all edit entries. 26 | """ 27 | edit_entry = normalize_model_parameter(edit_id) 28 | params = {} 29 | if relations: 30 | params = {"relations": "true"} 31 | path = f"edits/{edit_entry['id']}" 32 | edit_entry = raw.fetch_all(path, params, client=client) 33 | return edit_entry 34 | 35 | @cache 36 | def get_all_edits_with_tasks(relations=False, client=default): 37 | """ 38 | Retrieve all edit entries. 39 | """ 40 | params = {} 41 | if relations: 42 | params = {"relations": "true"} 43 | path = "edits/with-tasks" 44 | edits_with_tasks = raw.fetch_all(path, params, client=client) 45 | return sort_by_name(edits_with_tasks) 46 | 47 | @cache 48 | def get_all_previews_for_edit(edit, client=default): 49 | """ 50 | Args: 51 | episode (str / dict): The episode dict or the episode ID. 52 | 53 | Returns: 54 | list: Shots which are children of given episode. 55 | """ 56 | edit = normalize_model_parameter(edit) 57 | edit_previews = (raw.fetch_all(f"edits/{edit['id']}/preview-files", client=client)) 58 | for key in [key for key in enumerate(edit_previews.keys())]: 59 | return edit_previews[key[1]] -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/gazu/encoder.py: -------------------------------------------------------------------------------- 1 | import json 2 | import datetime 3 | 4 | 5 | class CustomJSONEncoder(json.JSONEncoder): 6 | """ 7 | This JSON encoder is here to handle dates which are not handled by default. 8 | The standard does not want to assum how you handle dates. 9 | """ 10 | 11 | def default(self, obj): 12 | if isinstance(obj, datetime.datetime): 13 | return obj.isoformat() 14 | 15 | return json.JSONEncoder.default(self, obj) 16 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/gazu/exception.py: -------------------------------------------------------------------------------- 1 | class HostException(Exception): 2 | """ 3 | Error raised when host is not valid. 4 | """ 5 | 6 | pass 7 | 8 | 9 | class AuthFailedException(Exception): 10 | """ 11 | Error raised when user credentials are wrong. 12 | """ 13 | 14 | pass 15 | 16 | 17 | class NotAuthenticatedException(Exception): 18 | """ 19 | Error raised when a 401 error (not authenticated) is sent by the API. 20 | """ 21 | 22 | pass 23 | 24 | 25 | class NotAllowedException(Exception): 26 | """ 27 | Error raised when a 403 error (not authorized) is sent by the API. 28 | """ 29 | 30 | pass 31 | 32 | 33 | class MethodNotAllowedException(Exception): 34 | """ 35 | Error raised when a 405 error (method not handled) is sent by the API. 36 | """ 37 | 38 | pass 39 | 40 | 41 | class RouteNotFoundException(Exception): 42 | """ 43 | Error raised when a 404 error (not found) is sent by the API. 44 | """ 45 | 46 | pass 47 | 48 | 49 | class ServerErrorException(Exception): 50 | """ 51 | Error raised when a 500 error (server error) is sent by the API. 52 | """ 53 | 54 | pass 55 | 56 | 57 | class ParameterException(Exception): 58 | """ 59 | Error raised when a 400 error (argument error) is sent by the API. 60 | """ 61 | 62 | pass 63 | 64 | 65 | class UploadFailedException(Exception): 66 | """ 67 | Error raised when an error while uploading a file, mainly to handle cases 68 | where processing that occurs on the remote server fails. 69 | """ 70 | 71 | pass 72 | 73 | 74 | class TooBigFileException(Exception): 75 | """ 76 | Error raised when a 413 error (payload too big error) is sent by the API. 77 | """ 78 | 79 | pass 80 | 81 | 82 | class TaskStatusNotFound(Exception): 83 | """ 84 | Error raised when a task status is not found. 85 | """ 86 | 87 | pass 88 | 89 | 90 | class DownloadFileException(Exception): 91 | """ 92 | Error raised when a file can't be downloaded. 93 | """ 94 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/gazu/sorting.py: -------------------------------------------------------------------------------- 1 | def sort_by_name(dicts): 2 | """ 3 | Sorting of a list of dicts. The sorting is based on the name field. 4 | 5 | Args: 6 | list: The list of dicts to sort. 7 | 8 | Returns: 9 | Sorted list. 10 | """ 11 | return sorted(dicts, key=lambda k: k.get("name", "").lower()) 12 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/generic/__init__.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | import importlib 22 | from blender_kitsu.generic import ops 23 | 24 | 25 | # ---------REGISTER ----------. 26 | 27 | 28 | def reload(): 29 | global ops 30 | 31 | ops = importlib.reload(ops) 32 | 33 | 34 | def register(): 35 | ops.register() 36 | 37 | 38 | def unregister(): 39 | ops.unregister() 40 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/logger.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | import logging 22 | from typing import List, Tuple 23 | 24 | 25 | class LoggerFactory: 26 | 27 | """ 28 | Utility class to streamline logger creation 29 | """ 30 | 31 | @staticmethod 32 | def getLogger(name="blender-kitsu"): 33 | name = name 34 | logger = logging.getLogger(name) 35 | return logger 36 | 37 | 38 | logger = LoggerFactory.getLogger(__name__) 39 | 40 | 41 | class LoggerLevelManager: 42 | logger_levels: List[Tuple[logging.Logger, int]] = [] 43 | 44 | @classmethod 45 | def configure_levels(cls): 46 | cls.logger_levels = [] 47 | for key in logging.Logger.manager.loggerDict: 48 | if key.startswith("urllib3"): 49 | # Save logger and value. 50 | log = logging.getLogger(key) 51 | cls.logger_levels.append((log, logger.level)) 52 | 53 | log.setLevel(logging.CRITICAL) 54 | 55 | # Set root logger level. 56 | logging.getLogger().setLevel(logging.INFO) 57 | logger.info("Configured logging Levels") 58 | 59 | @classmethod 60 | def restore_levels(cls): 61 | for logger, level in cls.logger_levels: 62 | logger.setLevel(level) 63 | logger.info("Restored logging Levels") 64 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/lookdev/__init__.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | import importlib 22 | from blender_kitsu.lookdev import prefs 23 | from blender_kitsu.lookdev import props 24 | from blender_kitsu.lookdev import opsdata 25 | from blender_kitsu.lookdev import ops 26 | from blender_kitsu.lookdev import ui 27 | 28 | 29 | # ---------REGISTER ----------. 30 | 31 | 32 | def reload(): 33 | global prefs 34 | global props 35 | global opsdata 36 | global ops 37 | global ui 38 | 39 | prefs = importlib.reload(prefs) 40 | props = importlib.reload(props) 41 | opsdata = importlib.reload(opsdata) 42 | ops = importlib.reload(ops) 43 | ui = importlib.reload(ui) 44 | 45 | 46 | def register(): 47 | prefs.register() 48 | props.register() 49 | ops.register() 50 | ui.register() 51 | 52 | 53 | def unregister(): 54 | ops.unregister() 55 | ui.unregister() 56 | props.unregister() 57 | prefs.unregister() 58 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/lookdev/props.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | import bpy 22 | 23 | 24 | class LOOKDEV_property_group_scene(bpy.types.PropertyGroup): 25 | """""" 26 | 27 | # Render settings. 28 | preset_file: bpy.props.StringProperty( # type: ignore 29 | name="Render Settings File", 30 | description="Path to file that is the active render settings preset", 31 | default="", 32 | subtype="FILE_PATH", 33 | ) 34 | 35 | 36 | # ----------------REGISTER--------------. 37 | 38 | classes = [ 39 | LOOKDEV_property_group_scene, 40 | ] 41 | 42 | 43 | def register(): 44 | 45 | for cls in classes: 46 | bpy.utils.register_class(cls) 47 | 48 | # Scene Properties. 49 | bpy.types.Scene.lookdev = bpy.props.PointerProperty( 50 | name="Render Preset", 51 | type=LOOKDEV_property_group_scene, 52 | description="Metadata that is required for lookdev", 53 | ) 54 | 55 | 56 | def unregister(): 57 | for cls in reversed(classes): 58 | bpy.utils.unregister_class(cls) 59 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/playblast/__init__.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2023, Blender Foundation 20 | 21 | import importlib 22 | from blender_kitsu.playblast import ops, ui 23 | 24 | 25 | # ---------REGISTER ----------. 26 | 27 | 28 | def reload(): 29 | global ops 30 | global ui 31 | 32 | ops = importlib.reload(ops) 33 | ui = importlib.reload(ui) 34 | 35 | 36 | def register(): 37 | ops.register() 38 | ui.register() 39 | 40 | 41 | def unregister(): 42 | ui.unregister() 43 | ops.unregister() 44 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/res/metastrip.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/scripts-blender/addons/blender_kitsu/res/metastrip.mp4 -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/anim_setup/core.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | import re 3 | from pathlib import Path 4 | from typing import Set 5 | from blender_kitsu import prefs 6 | from blender_kitsu import cache 7 | 8 | 9 | def animation_workspace_vse_area_add(context:bpy.types.Context): 10 | """Split smallest 3D View in current workspace""" 11 | for workspace in [workspace for workspace in bpy.data.workspaces if workspace.name == "Animation"]: 12 | context.window.workspace = workspace 13 | context.view_layer.update() 14 | areas = workspace.screens[0].areas 15 | view_3d_areas = sorted([area for area in areas if area.ui_type =="VIEW_3D"], key=lambda x: x.width, reverse=False) 16 | small_view_3d = view_3d_areas[0] 17 | with context.temp_override(window=context.window, area=small_view_3d): 18 | bpy.ops.screen.area_split(direction='HORIZONTAL', factor=0.5) 19 | small_view_3d.ui_type = "SEQUENCE_EDITOR" 20 | small_view_3d.spaces[0].view_type = "PREVIEW" 21 | 22 | def animation_workspace_delete_others(): 23 | """Delete any workspace that is not an animation workspace""" 24 | for ws in bpy.data.workspaces: 25 | if ws.name != "Animation": 26 | bpy.ops.workspace.delete({"workspace": ws}) 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/anim_setup/ops.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | from typing import Set 3 | from blender_kitsu.shot_builder.anim_setup.core import animation_workspace_delete_others, animation_workspace_vse_area_add 4 | class ANIM_SETUP_OT_setup_workspaces(bpy.types.Operator): 5 | bl_idname = "anim_setup.setup_workspaces" 6 | bl_label = "Setup Workspace" 7 | bl_description = "Sets up the workspaces for the animation task" 8 | 9 | def execute(self, context: bpy.types.Context) -> Set[str]: 10 | animation_workspace_delete_others(self, context) 11 | self.report({"INFO"}, "Deleted non Animation workspaces") 12 | return {"FINISHED"} 13 | 14 | class ANIM_SETUP_OT_animation_workspace_vse_area_add(bpy.types.Operator): 15 | bl_idname = "anim_setup.animation_workspace_vse_area_add" 16 | bl_label = "Split Viewport" 17 | bl_description = "Split smallest 3D View in current workspace" 18 | 19 | def execute(self, context: bpy.types.Context) -> Set[str]: 20 | animation_workspace_vse_area_add(self, context) 21 | return {"FINISHED"} 22 | 23 | classes = [ 24 | ANIM_SETUP_OT_setup_workspaces, 25 | ANIM_SETUP_OT_animation_workspace_vse_area_add 26 | ] 27 | 28 | 29 | def register(): 30 | for cls in classes: 31 | bpy.utils.register_class(cls) 32 | 33 | def unregister(): 34 | for cls in classes: 35 | bpy.utils.unregister_class(cls) -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/asset.py: -------------------------------------------------------------------------------- 1 | # ##### BEGIN GPL LICENSE BLOCK ##### 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 16 | # 17 | # ##### END GPL LICENSE BLOCK ##### 18 | 19 | # 20 | 21 | 22 | class Asset: 23 | """ 24 | Container to hold data where the asset can be located in the production repository. 25 | 26 | path: absolute path to the blend file containing this asset. 27 | 28 | """ 29 | asset_type = "" 30 | code = "" 31 | name = "" 32 | path = "{production.path}/lib/{asset.asset_type}/{asset.code}/{asset.code}.blend" 33 | collection = "{asset.code}" 34 | 35 | def __str__(self) -> str: 36 | return self.name 37 | 38 | 39 | class AssetRef: 40 | """ 41 | Reference to an asset from an external system. 42 | """ 43 | 44 | def __init__(self, name: str = "", code: str = ""): 45 | self.name = name 46 | self.code = code 47 | 48 | def __str__(self) -> str: 49 | return self.name 50 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/builder/build_step.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | import typing 3 | 4 | from blender_kitsu.shot_builder.project import Production 5 | from blender_kitsu.shot_builder.shot import Shot 6 | from blender_kitsu.shot_builder.task_type import TaskType 7 | from blender_kitsu.shot_builder.render_settings import RenderSettings 8 | from blender_kitsu.shot_builder.asset import Asset 9 | 10 | 11 | class BuildContext: 12 | def __init__(self, context: bpy.types.Context, production: Production, shot: Shot, render_settings: RenderSettings, task_type: TaskType): 13 | self.context = context 14 | self.production = production 15 | self.shot = shot 16 | self.task_type = task_type 17 | self.render_settings = render_settings 18 | self.asset: typing.Optional[Asset] = None 19 | self.scene: typing.Optional[bpy.types.Scene] = None 20 | 21 | def as_dict(self) -> typing.Dict[str, typing.Any]: 22 | return { 23 | 'context': self.context, 24 | 'scene': self.scene, 25 | 'production': self.production, 26 | 'shot': self.shot, 27 | 'task_type': self.task_type, 28 | 'render_settings': self.render_settings, 29 | 'asset': self.asset, 30 | } 31 | 32 | 33 | class BuildStep: 34 | def __str__(self) -> str: 35 | return "unnamed build step" 36 | 37 | def execute(self, build_context: BuildContext) -> None: 38 | raise NotImplementedError() 39 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/builder/init_asset.py: -------------------------------------------------------------------------------- 1 | from blender_kitsu.shot_builder.builder.build_step import BuildStep, BuildContext 2 | from blender_kitsu.shot_builder.asset import * 3 | from blender_kitsu.shot_builder.project import * 4 | from blender_kitsu.shot_builder.shot import * 5 | 6 | import bpy 7 | 8 | import logging 9 | 10 | logger = logging.getLogger(__name__) 11 | 12 | 13 | class InitAssetStep(BuildStep): 14 | def __init__(self, asset: Asset): 15 | self.__asset = asset 16 | 17 | def __str__(self) -> str: 18 | return f"init asset \"{self.__asset.name}\"" 19 | 20 | def execute(self, build_context: BuildContext) -> None: 21 | build_context.asset = self.__asset 22 | self.__asset.path = self.__asset.path.format_map(build_context.as_dict()) 23 | self.__asset.collection = self.__asset.collection.format_map(build_context.as_dict()) 24 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/builder/init_shot.py: -------------------------------------------------------------------------------- 1 | from blender_kitsu.shot_builder.builder.build_step import BuildStep, BuildContext 2 | from blender_kitsu.shot_builder.asset import * 3 | from blender_kitsu.shot_builder.project import * 4 | from blender_kitsu.shot_builder.shot import * 5 | 6 | import bpy 7 | 8 | import logging 9 | 10 | logger = logging.getLogger(__name__) 11 | 12 | 13 | class InitShotStep(BuildStep): 14 | def __str__(self) -> str: 15 | return "init shot" 16 | 17 | def execute(self, build_context: BuildContext) -> None: 18 | shot = build_context.shot 19 | shot.file_path = shot.file_path_format.format_map( 20 | build_context.as_dict()) 21 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/builder/invoke_hook.py: -------------------------------------------------------------------------------- 1 | from blender_kitsu.shot_builder.builder.build_step import BuildStep, BuildContext 2 | from blender_kitsu.shot_builder.hooks import HookFunction 3 | import bpy 4 | 5 | import typing 6 | import types 7 | import logging 8 | 9 | logger = logging.getLogger(__name__) 10 | 11 | 12 | class InvokeHookStep(BuildStep): 13 | def __init__(self, hook: HookFunction): 14 | self._hook = hook 15 | 16 | def __str__(self) -> str: 17 | return f"invoke hook [{self._hook.__name__}]" 18 | 19 | def execute(self, build_context: BuildContext) -> None: 20 | params = build_context.as_dict() 21 | self._hook(**params) # type: ignore 22 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/builder/new_scene.py: -------------------------------------------------------------------------------- 1 | from blender_kitsu.shot_builder.builder.build_step import BuildStep, BuildContext 2 | from blender_kitsu.shot_builder.render_settings import RenderSettings 3 | import bpy 4 | 5 | import logging 6 | 7 | logger = logging.getLogger(__name__) 8 | 9 | 10 | class NewSceneStep(BuildStep): 11 | def __str__(self) -> str: 12 | return f"new scene" 13 | 14 | def execute(self, build_context: BuildContext) -> None: 15 | production = build_context.production 16 | scene_name = production.scene_name_format.format_map( 17 | build_context.as_dict()) 18 | logger.debug(f"create scene with name {scene_name}") 19 | scene = bpy.data.scenes.new(name=scene_name) 20 | 21 | bpy.context.window.scene = scene 22 | build_context.scene = scene 23 | 24 | self.__remove_other_scenes(build_context) 25 | 26 | def __remove_other_scenes(self, build_context: BuildContext) -> None: 27 | for scene in bpy.data.scenes: 28 | if scene != build_context.scene: 29 | logger.debug(f"remove scene {scene.name}") 30 | bpy.data.scenes.remove(scene) 31 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/builder/save_file.py: -------------------------------------------------------------------------------- 1 | from blender_kitsu.shot_builder.builder.build_step import BuildStep, BuildContext 2 | from blender_kitsu.shot_builder.asset import * 3 | from blender_kitsu.shot_builder.project import * 4 | from blender_kitsu.shot_builder.shot import * 5 | import pathlib 6 | 7 | import bpy 8 | 9 | import logging 10 | 11 | logger = logging.getLogger(__name__) 12 | 13 | 14 | 15 | def save_shot_builder_file(file_path: str): 16 | """Save Shot File within Folder of matching name. 17 | Set Shot File to relative Paths.""" 18 | dir_path = pathlib.Path(file_path) 19 | dir_path.mkdir(parents=True, exist_ok=True) 20 | bpy.ops.wm.save_mainfile(filepath=file_path, relative_remap=True) 21 | 22 | class SaveFileStep(BuildStep): 23 | def __str__(self) -> str: 24 | return "save file" 25 | 26 | def execute(self, build_context: BuildContext) -> None: 27 | shot = build_context.shot 28 | file_path = pathlib.Path(shot.file_path) 29 | save_shot_builder_file(file_path) 30 | logger.info(f"save file {shot.file_path}") 31 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/builder/set_render_settings.py: -------------------------------------------------------------------------------- 1 | from blender_kitsu.shot_builder.builder.build_step import BuildStep, BuildContext 2 | import bpy 3 | 4 | import typing 5 | import logging 6 | 7 | logger = logging.getLogger(__name__) 8 | 9 | 10 | class SetRenderSettingsStep(BuildStep): 11 | def __str__(self) -> str: 12 | return f"set render settings" 13 | 14 | def execute(self, build_context: BuildContext) -> None: 15 | scene = typing.cast(bpy.types.Scene, build_context.scene) 16 | render_settings = build_context.render_settings 17 | logger.debug( 18 | f"set render resolution to {render_settings.width}x{render_settings.height}") 19 | scene.render.resolution_x = render_settings.width 20 | scene.render.resolution_y = render_settings.height 21 | scene.render.resolution_percentage = 100 22 | 23 | shot = build_context.shot 24 | scene.frame_start = shot.frame_start 25 | scene.frame_current = shot.frame_start 26 | scene.frame_end = shot.frame_start + shot.frames -1 27 | logger.debug(f"set frame range to ({scene.frame_start}-{scene.frame_end})") 28 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/connectors/__init__.py: -------------------------------------------------------------------------------- 1 | # ##### BEGIN GPL LICENSE BLOCK ##### 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 16 | # 17 | # ##### END GPL LICENSE BLOCK ##### 18 | 19 | # -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/connectors/default.py: -------------------------------------------------------------------------------- 1 | # ##### BEGIN GPL LICENSE BLOCK ##### 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 16 | # 17 | # ##### END GPL LICENSE BLOCK ##### 18 | 19 | # 20 | from blender_kitsu.shot_builder.shot import Shot, ShotRef 21 | from blender_kitsu.shot_builder.asset import Asset, AssetRef 22 | from blender_kitsu.shot_builder.task_type import TaskType 23 | from blender_kitsu.shot_builder.render_settings import RenderSettings 24 | from blender_kitsu.shot_builder.connectors.connector import Connector 25 | from typing import * 26 | 27 | 28 | class DefaultConnector(Connector): 29 | """ 30 | Default connector is a connector that returns the defaults for the shot builder add-on. 31 | """ 32 | 33 | def get_name(self) -> str: 34 | return "unnamed production" 35 | 36 | def get_shots(self) -> List[ShotRef]: 37 | return [] 38 | 39 | def get_assets_for_shot(self, shot: Shot) -> List[AssetRef]: 40 | return [] 41 | 42 | def get_task_types(self) -> List[TaskType]: 43 | return [TaskType("anim"), TaskType("lighting"), TaskType("comp"), TaskType("fx")] 44 | 45 | def get_render_settings(self, shot: Shot) -> RenderSettings: 46 | """ 47 | Retrieve the render settings for the given shot. 48 | """ 49 | return RenderSettings(width=1920, height=1080, frames_per_second=24.0) 50 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/docs/examples/README.md: -------------------------------------------------------------------------------- 1 | # Example configuration files 2 | 3 | This folder contains an example shot builder configuration. It shows the part 4 | that a TD would do to incorporate the shot builder in a production. -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/docs/examples/assets.py: -------------------------------------------------------------------------------- 1 | from blender_kitsu.shot_builder.asset import Asset 2 | 3 | 4 | class SpriteFrightAsset(Asset): 5 | path = "{production.path}/lib/{asset.asset_type}/{asset.code}/{asset.code}.blend" 6 | 7 | 8 | class Character(SpriteFrightAsset): 9 | asset_type = "char" 10 | collection = "CH-{asset.code}" 11 | 12 | 13 | class Ellie(Character): 14 | name = "Ellie" 15 | code = "ellie" 16 | 17 | 18 | class Victoria(Character): 19 | name = "Victoria" 20 | code = "victoria" 21 | 22 | 23 | class Phil(Character): 24 | name = "Phil" 25 | code = "phil" 26 | 27 | 28 | class Rex(Character): 29 | name = "Rex" 30 | code = "rex" 31 | 32 | 33 | class Jay(Character): 34 | name = "Jay" 35 | code = "jay" 36 | 37 | # TODO: Bird character has no asset file yet. 38 | # class Bird(Character): 39 | # name = "Bird" 40 | # code = "bird" 41 | 42 | 43 | class Prop(SpriteFrightAsset): 44 | asset_type = "props" 45 | collection = "PR-{asset.code}" 46 | 47 | 48 | class Boombox(Prop): 49 | name = "Boombox" 50 | code = "boombox" 51 | 52 | 53 | class BBQGrill(Prop): 54 | name = "BBQ Grill" 55 | code = "bbq_grill" 56 | 57 | 58 | # NOTE: NotepadAndPencil is a combined asset. In Kitsu it is defined as a single asset. In the production 59 | # reportitory it is stored as 2 collections in a single file. See `hooks.link_char_prop_for_anim` 60 | # where this is handled. 61 | class NotepadAndPencil(Prop): 62 | name = "Notepad and pencil" 63 | code = "notepad_pencil" 64 | 65 | 66 | class Binoculars(Prop): 67 | name = "Binoculars (Ellie)" 68 | code = "binoculars" 69 | 70 | 71 | class Backpack(Prop): 72 | name = "Backpack (Phil)" 73 | code = "backpack" 74 | 75 | 76 | class Set(SpriteFrightAsset): 77 | asset_type = "sets" 78 | collection = "SE-{asset.code}" 79 | 80 | 81 | class MushroomGrove(Set): 82 | name = "Mushroom grove" 83 | code = "mushroom_grove" 84 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/docs/examples/config.py: -------------------------------------------------------------------------------- 1 | from blender_kitsu.shot_builder.connectors.kitsu import KitsuConnector 2 | 3 | PRODUCTION_NAME = KitsuConnector 4 | SHOTS = KitsuConnector 5 | ASSETS = KitsuConnector 6 | RENDER_SETTINGS = KitsuConnector 7 | 8 | KITSU_PROJECT_ID = "fc77c0b9-bb76-41c3-b843-c9b156f9b3ec" 9 | 10 | # Formatting rules 11 | # ---------------- 12 | 13 | # The name of the scene in blender where the shot is build in. 14 | # SCENE_NAME_FORMAT = "{shot.sequence_code}_{shot.code}.{task_type}" 15 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/docs/examples/shot-builder/README.md: -------------------------------------------------------------------------------- 1 | # Example configuration files 2 | 3 | This folder contains an example shot builder configuration. It shows the part 4 | that a TD would do to incorporate the shot builder in a production. 5 | 6 | 7 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/docs/examples/shots.py: -------------------------------------------------------------------------------- 1 | from blender_kitsu.shot_builder.shot import Shot 2 | from blender_kitsu.shot_builder.project import Production 3 | 4 | 5 | class SpriteFrightShot(Shot): 6 | def get_anim_file_path(self, production: Production, shot: Shot) -> str: 7 | """ 8 | Get the animation file path for this given shot. 9 | """ 10 | return self.file_path_format.format_map({ 11 | 'production': production, 12 | 'shot': shot, 13 | 'task_type': "anim" 14 | }) 15 | 16 | def get_output_collection_name(self, shot: Shot, task_type: str) -> str: 17 | """ 18 | Get the collection name where the output is stored. 19 | """ 20 | return f"{shot.sequence_code}_{shot.code}.{task_type}.output" 21 | 22 | 23 | class Sequence_0002(SpriteFrightShot): 24 | sequence_code = "0002" 25 | 26 | 27 | class Shot_0001_0001_A(Sequence_0002): 28 | name = "001" 29 | code = "0001" 30 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/editorial/__init__.py: -------------------------------------------------------------------------------- 1 | # ##### BEGIN GPL LICENSE BLOCK ##### 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 16 | # 17 | # ##### END GPL LICENSE BLOCK ##### 18 | 19 | # 20 | 21 | import bpy 22 | from blender_kitsu.shot_builder.editorial import ops 23 | 24 | 25 | def register(): 26 | ops.register() 27 | 28 | 29 | def unregister(): 30 | ops.unregister() 31 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/editorial/ops.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | from typing import Set 3 | from blender_kitsu.shot_builder.editorial.core import editorial_export_get_latest 4 | from blender_kitsu import cache, gazu 5 | 6 | 7 | class ANIM_SETUP_OT_load_latest_editorial(bpy.types.Operator): 8 | bl_idname = "asset_setup.load_latest_editorial" 9 | bl_label = "Load Editorial Export" 10 | bl_description = ( 11 | "Loads latest edit from shot_preview_folder " 12 | "Shifts edit so current shot starts at 3d_start metadata shot key from Kitsu" 13 | ) 14 | 15 | def execute(self, context: bpy.types.Context) -> Set[str]: 16 | cache_shot = cache.shot_active_get() 17 | shot = gazu.shot.get_shot(cache_shot.id) # TODO INEFFICENT TO LOAD SHOT TWICE 18 | strips = editorial_export_get_latest(context, shot) 19 | if strips is None: 20 | self.report( 21 | {"ERROR"}, f"No valid editorial export in editorial export path." 22 | ) 23 | return {"CANCELLED"} 24 | 25 | self.report({"INFO"}, f"Loaded latest edit: {strips[0].name}") 26 | return {"FINISHED"} 27 | 28 | 29 | classes = [ 30 | ANIM_SETUP_OT_load_latest_editorial, 31 | ] 32 | 33 | 34 | def register(): 35 | for cls in classes: 36 | bpy.utils.register_class(cls) 37 | 38 | 39 | def unregister(): 40 | for cls in classes: 41 | bpy.utils.unregister_class(cls) 42 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/render_settings.py: -------------------------------------------------------------------------------- 1 | # ##### BEGIN GPL LICENSE BLOCK ##### 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 16 | # 17 | # ##### END GPL LICENSE BLOCK ##### 18 | 19 | # 20 | 21 | from blender_kitsu.shot_builder.asset import Asset 22 | from typing import * 23 | 24 | 25 | class RenderSettings: 26 | def __init__(self, width: int, height: int, frames_per_second: float): 27 | self.width = width 28 | self.height = height 29 | self.frames_per_second = frames_per_second 30 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/shot.py: -------------------------------------------------------------------------------- 1 | # ##### BEGIN GPL LICENSE BLOCK ##### 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 16 | # 17 | # ##### END GPL LICENSE BLOCK ##### 18 | 19 | # 20 | 21 | import typing 22 | 23 | 24 | class Shot: 25 | is_generic = False 26 | kitsu_id = "" 27 | sequence_code = "" 28 | name = "" 29 | code = "" 30 | frame_start = 0 31 | frames = 0 32 | # Frame_end will be stored for debugging only. 33 | frame_end = 0 34 | frames_per_second = 24.0 35 | file_path_format = "{production.path}/shots/{shot.sequence_code}/{shot.name}/{shot.name}.{task_type}.blend" 36 | file_path = "" 37 | 38 | def is_valid(self) -> bool: 39 | """ 40 | Check if this shot contains all data so it could be selected 41 | for shot building. 42 | 43 | When not valid it won't be shown in the shot selection field. 44 | """ 45 | if not self.name: 46 | return False 47 | 48 | if self.frames <= 0: 49 | return False 50 | 51 | return True 52 | 53 | 54 | class ShotRef: 55 | """ 56 | Reference to an asset from an external system. 57 | """ 58 | 59 | def __init__(self, name: str = "", code: str = ""): 60 | self.name = name 61 | self.code = code 62 | 63 | def sync_data(self, shot: Shot) -> None: 64 | pass 65 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/task_type.py: -------------------------------------------------------------------------------- 1 | # ##### BEGIN GPL LICENSE BLOCK ##### 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 16 | # 17 | # ##### END GPL LICENSE BLOCK ##### 18 | 19 | # 20 | 21 | 22 | class TaskType: 23 | def __init__(self, task_name: str): 24 | self.name = task_name 25 | 26 | def __str__(self) -> str: 27 | return self.name 28 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/ui.py: -------------------------------------------------------------------------------- 1 | # ##### BEGIN GPL LICENSE BLOCK ##### 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 16 | # 17 | # ##### END GPL LICENSE BLOCK ##### 18 | 19 | # 20 | import bpy 21 | from typing import * 22 | from blender_kitsu.shot_builder.operators import * 23 | 24 | 25 | def topbar_file_new_draw_handler(self: Any, context: bpy.types.Context) -> None: 26 | layout = self.layout 27 | op = layout.operator( 28 | SHOTBUILDER_OT_NewShotFile.bl_idname, text="Shot File") 29 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/shot_builder/vars.py: -------------------------------------------------------------------------------- 1 | DEFAULT_FRAME_START: int = 101 2 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/sqe/__init__.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | import importlib 22 | from blender_kitsu.sqe import opsdata, checkstrip, pull, push, ops, ui, draw 23 | 24 | 25 | # ---------REGISTER ----------. 26 | 27 | 28 | def reload(): 29 | global opsdata 30 | global checkstrip 31 | global pull 32 | global push 33 | global ops 34 | global ui 35 | global draw 36 | 37 | opsdata = importlib.reload(opsdata) 38 | checkstrip = importlib.reload(checkstrip) 39 | pull = importlib.reload(pull) 40 | push = importlib.reload(push) 41 | ops = importlib.reload(ops) 42 | ui = importlib.reload(ui) 43 | draw = importlib.reload(draw) 44 | 45 | 46 | def register(): 47 | ops.register() 48 | ui.register() 49 | draw.register() 50 | 51 | 52 | def unregister(): 53 | ui.unregister() 54 | ops.unregister() 55 | draw.unregister() 56 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/sqe/pull.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | import bpy 22 | 23 | from blender_kitsu import bkglobals 24 | from blender_kitsu.types import Cache, Sequence, Project, Shot 25 | from blender_kitsu.logger import LoggerFactory 26 | 27 | logger = LoggerFactory.getLogger() 28 | 29 | 30 | def shot_meta(strip: bpy.types.Sequence, shot: Shot, clear_cache: bool = True) -> None: 31 | 32 | if clear_cache: 33 | # Clear cache before pulling. 34 | Cache.clear_all() 35 | 36 | # Update sequence props. 37 | seq = Sequence.by_id(shot.parent_id) 38 | strip.kitsu.sequence_id = seq.id 39 | strip.kitsu.sequence_name = seq.name 40 | 41 | # Update shot props. 42 | strip.kitsu.shot_id = shot.id 43 | strip.kitsu.shot_name = shot.name 44 | strip.kitsu.shot_description = shot.description if shot.description else "" 45 | 46 | # Update project props. 47 | project = Project.by_id(shot.project_id) 48 | strip.kitsu.project_id = project.id 49 | strip.kitsu.project_name = project.name 50 | 51 | # Update meta props. 52 | strip.kitsu.initialized = True 53 | strip.kitsu.linked = True 54 | 55 | # Update strip name. 56 | strip.name = shot.name 57 | 58 | # Log. 59 | logger.info("Pulled meta from shot: %s to strip: %s", shot.name, strip.name) 60 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/tasks/__init__.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | import importlib 22 | from blender_kitsu.tasks import ops, ui 23 | 24 | 25 | # ---------REGISTER ---------- 26 | 27 | 28 | def reload(): 29 | global ops 30 | global ui 31 | 32 | ops = importlib.reload(ops) 33 | ui = importlib.reload(ui) 34 | 35 | 36 | def register(): 37 | ops.register() 38 | ui.register() 39 | 40 | 41 | def unregister(): 42 | ui.unregister() 43 | ops.unregister() 44 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/tasks/opsdata.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | from typing import Any, Dict, List, Tuple, Union 22 | from pathlib import Path 23 | 24 | import bpy 25 | 26 | from blender_kitsu.logger import LoggerFactory 27 | 28 | logger = LoggerFactory.getLogger() 29 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_kitsu/util.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | import re 22 | from typing import Union 23 | 24 | import bpy 25 | 26 | from blender_kitsu import bkglobals 27 | 28 | 29 | def ui_redraw() -> None: 30 | """ 31 | Forces blender to redraw the UI. 32 | """ 33 | for screen in bpy.data.screens: 34 | for area in screen.areas: 35 | area.tag_redraw() 36 | 37 | 38 | def get_version(str_value: str, format: type = str) -> Union[str, int, None]: 39 | match = re.search(bkglobals.VERSION_PATTERN, str_value) 40 | if match: 41 | version = match.group() 42 | if format == str: 43 | return version 44 | if format == int: 45 | return int(version.replace("v", "")) 46 | return None 47 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | 27 | # PyInstaller 28 | # Usually these files are written by a python script from a template 29 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 30 | *.manifest 31 | *.spec 32 | 33 | # Installer logs 34 | pip-log.txt 35 | pip-delete-this-directory.txt 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .coverage.* 42 | .cache 43 | nosetests.xml 44 | coverage.xml 45 | *.cover 46 | .hypothesis/ 47 | .pytest_cache/ 48 | 49 | # Translations 50 | *.mo 51 | *.pot 52 | 53 | # Django stuff: 54 | *.log 55 | local_settings.py 56 | 57 | # Flask stuff: 58 | instance/ 59 | .webassets-cache 60 | 61 | # Scrapy stuff: 62 | .scrapy 63 | 64 | # Sphinx documentation 65 | docs/_build/ 66 | 67 | # PyBuilder 68 | target/ 69 | 70 | # Jupyter Notebook 71 | .ipynb_checkpoints 72 | 73 | # pyenv 74 | .python-version 75 | 76 | # celery beat schedule file 77 | celerybeat-schedule 78 | 79 | # SageMath parsed files 80 | *.sage.py 81 | 82 | # dotenv 83 | .env 84 | 85 | # virtualenv 86 | .venv 87 | .venv* 88 | venv/ 89 | ENV/ 90 | 91 | # Spyder project settings 92 | .spyderproject 93 | .spyproject 94 | 95 | # Rope project settings 96 | .ropeproject 97 | 98 | # mkdocs documentation 99 | /site 100 | 101 | # mypy 102 | .mypy_cache/ 103 | 104 | # IDE settings 105 | .vscode/ 106 | 107 | # utility bat files: 108 | *jump_in_venv.bat 109 | 110 | #local tests 111 | tests/local* 112 | 113 | # Production Config Dir. 114 | production_config/* 115 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/CHANGELOG.MD: -------------------------------------------------------------------------------- 1 | ## 0.2.1 - 2023-06-02 2 | 3 | ### ADDED 4 | - Add a debug UI toggle 5 | - Multi-repository support 6 | 7 | 8 | ### FIXED 9 | - Fix Addon Install Instructions 10 | - Fix Revert operator not working 11 | - Fix Addons Spelling and Links (#54) 12 | - Fix error in writing credentials to file 13 | - Fix URL reading on linux 14 | - Fix crash in update_file_list() 15 | 16 | ## CHANGED 17 | - SVN Cleanup now resets background threads 18 | - Allow context menus to open .blend files 19 | - More restructuring, added a ProcessManager. 20 | - Auto-authenticate when add-on is enabled 21 | - Store credentials on disk 22 | - UX improvements 23 | - Restructure add-on 24 | 25 | ## REMOVED 26 | - Nuke BAT dead code and relevant UI/UX. -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/README.md: -------------------------------------------------------------------------------- 1 | # Blender SVN 2 | blender-svn is a Blender add-on to interact with the Subversion version control system from within Blender. 3 | 4 | [Blender-SVN Demo Video](https://studio.blender.org/films/charge/gallery/?asset=5999) 5 | 6 | ## Installation 7 | 1. Download [latest release](../addons/overview) 8 | 2. Launch Blender, navigate to `Edit > Preferences` select `Addons` and then `Install`, 9 | 3. Navigate to the downloaded add-on and select `Install Add-on` 10 | 4. Make sure you have an SVN client installed, such that typing `svn` in the command line gives a result. 11 | 12 | ## Features 13 | - Open a .blend file that is in an SVN repository, and enter credentials. 14 | - Download updates, commit changes, resolve conflicts, all from within Blender. 15 | - You can also add repositories in the add-on preferences UI. 16 | 17 | - A list shows all files in the repository that are outdated, modified, newly added, replaced, conflicted, etc, with the relevant available operations next to them. 18 | - The file statuses automatically update every few seconds. If you do an SVN operation, the file statuses update immediately. 19 | - Searching for a file name will also show files that aren't modified. 20 | - You can right click on a file to open it. If it's a .blend file, it will open in the current Blender instance, without loading the UI. 21 | 22 | - Entered credentials get saved to disk, so they get preserved even if the add-on gets disabled. 23 | - SVN Log is saved to disk, so a full log is always available and searchable, and you can easily revert a file or the whole repo to an older version. 24 | - If you're working in an outdated file, Blender will show a constant, very aggressive warning, since this could result in wasted work. 25 | 26 | ## Notes 27 | - SVN Checkout is not supported due to limitations with giving progress feedback in the UI for such a long process. Do your checkouts via the command line. 28 | - The speed at which your SVN server can answer requests will greatly affect your experience using the add-on, or any other SVN interface. 29 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/__init__.py: -------------------------------------------------------------------------------- 1 | # SPDX-License-Identifier: GPL-2.0-or-later 2 | # (c) 2021, Blender Foundation - Paul Golter 3 | # (c) 2022, Blender Foundation - Demeter Dzadik 4 | 5 | bl_info = { 6 | "name": "Blender SVN", 7 | "author": "Demeter Dzadik, Paul Golter", 8 | "description": "Blender Add-on to interact with Subversion.", 9 | "blender": (3, 1, 0), 10 | "version": (0, 2, 1), 11 | "location": "View3D", 12 | "warning": "", 13 | "doc_url": "", 14 | "tracker_url": "", 15 | "category": "Generic", 16 | } 17 | 18 | from bpy.utils import register_class, unregister_class 19 | import importlib 20 | 21 | from . import ( 22 | props, 23 | repository, 24 | operators, 25 | threaded, 26 | ui, 27 | prefs, 28 | svn_info, 29 | ) 30 | 31 | modules = [ 32 | props, 33 | operators, 34 | repository, 35 | threaded, 36 | ui, 37 | prefs, 38 | svn_info, 39 | ] 40 | 41 | def register_unregister_modules(modules: list, register: bool): 42 | """Recursively register or unregister modules by looking for either 43 | un/register() functions or lists named `registry` which should be a list of 44 | registerable classes. 45 | """ 46 | register_func = register_class if register else unregister_class 47 | 48 | for m in modules: 49 | if register: 50 | importlib.reload(m) 51 | if hasattr(m, 'registry'): 52 | for c in m.registry: 53 | try: 54 | register_func(c) 55 | except Exception as e: 56 | un = 'un' if not register else '' 57 | print(f"Warning: SVN failed to {un}register class: {c.__name__}") 58 | print(e) 59 | 60 | if hasattr(m, 'modules'): 61 | register_unregister_modules(m.modules, register) 62 | 63 | if register and hasattr(m, 'register'): 64 | m.register() 65 | elif hasattr(m, 'unregister'): 66 | m.unregister() 67 | 68 | def register(): 69 | register_unregister_modules(modules, True) 70 | 71 | def unregister(): 72 | register_unregister_modules(modules, False) 73 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/operators/__init__.py: -------------------------------------------------------------------------------- 1 | from . import ( 2 | simple_commands, 3 | svn_commit, 4 | svn_update, 5 | ui_operators 6 | ) 7 | 8 | modules = [ 9 | simple_commands, 10 | svn_commit, 11 | svn_update, 12 | ui_operators 13 | ] -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/svn_info.py: -------------------------------------------------------------------------------- 1 | from typing import Tuple 2 | from pathlib import Path 3 | import subprocess 4 | 5 | from .threaded.execute_subprocess import execute_command 6 | 7 | def get_svn_info(path: Path or str) -> Tuple[str, str]: 8 | """Use the `svn info` command to get the root dir, the URL, and the relative URL.""" 9 | try: 10 | dirpath_str = str(Path(path).as_posix()) 11 | svn_info = execute_command(dirpath_str, ["svn", "info"]) 12 | except subprocess.CalledProcessError as e: 13 | error_msg = e.stderr.decode() 14 | if "is not a working copy" in error_msg: 15 | return None, None, None 16 | elif "E200009" in error_msg: 17 | # If we're in a folder that wasn't yet added to the repo, 18 | # try again one folder higher. 19 | parent = path.parent 20 | if parent == path: 21 | return None, None 22 | svn_info = get_svn_info(path.parent) 23 | else: 24 | raise e 25 | 26 | lines = svn_info.split("\n") 27 | root_dir = lines[1].split("Working Copy Root Path: ")[1] 28 | # On Windows, for some reason the path has a \r character at the end, 29 | # which breaks absolutely everything. 30 | root_dir = root_dir.replace("\r", "") 31 | 32 | full_url = lines[2].split("URL: ")[1] 33 | relative_url = lines[3].split("Relative URL: ")[1][1:] 34 | base_url = full_url 35 | if len(relative_url) > 1: 36 | base_url = full_url.replace(relative_url, "").strip() 37 | 38 | return root_dir, base_url 39 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/threaded/__init__.py: -------------------------------------------------------------------------------- 1 | from . import ( 2 | background_process, 3 | execute_subprocess, 4 | svn_log, 5 | svn_status, 6 | filebrowser_activate_file, 7 | update, 8 | commit, 9 | redraw_viewport 10 | ) 11 | 12 | modules = [ 13 | background_process, 14 | execute_subprocess, 15 | svn_log, 16 | svn_status, 17 | filebrowser_activate_file, 18 | update, 19 | commit, 20 | redraw_viewport 21 | ] 22 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/threaded/execute_subprocess.py: -------------------------------------------------------------------------------- 1 | # SPDX-License-Identifier: GPL-2.0-or-later 2 | # (c) 2022, Blender Foundation - Demeter Dzadik 3 | 4 | import subprocess 5 | from typing import List 6 | 7 | def get_credential_commands(context) -> List[str]: 8 | repo = context.scene.svn.get_repo(context) 9 | assert (repo.is_cred_entered), "No username or password entered for this repository. The UI shouldn't have allowed you to get into a state where you can press an SVN operation button without having your credentials entered, so this is a bug!" 10 | return ["--username", f"{repo.username}", "--password", f"{repo.password}"] 11 | 12 | 13 | def execute_command(path: str, command: str) -> str: 14 | output_bytes = subprocess.check_output( 15 | command, 16 | shell=False, 17 | cwd=path+"/", 18 | stderr=subprocess.PIPE, 19 | start_new_session=True 20 | ) 21 | 22 | return output_bytes.decode(encoding='utf-8', errors='replace') 23 | 24 | 25 | def execute_svn_command(context, command: List[str], *, ignore_errors=False, print_errors=True, use_cred=False) -> str: 26 | """Execute an svn command in the root of the current svn repository. 27 | So any file paths that are part of the command should be relative to the 28 | SVN root. 29 | """ 30 | repo = context.scene.svn.get_repo(context) 31 | if use_cred: 32 | command += get_credential_commands(context) 33 | 34 | command.append("--non-interactive") 35 | 36 | try: 37 | if repo.is_valid: 38 | return execute_command(repo.directory, command) 39 | except subprocess.CalledProcessError as error: 40 | if ignore_errors: 41 | return "" 42 | else: 43 | err_msg = error.stderr.decode() 44 | if print_errors: 45 | print(f"Command returned error: {command}") 46 | print(err_msg) 47 | raise error 48 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/threaded/filebrowser_activate_file.py: -------------------------------------------------------------------------------- 1 | from .background_process import BackgroundProcess 2 | 3 | class BGP_SVN_Activate_File(BackgroundProcess): 4 | """This crazy hacky method of activating the file with some delay is necessary 5 | because Blender won't let us select the file immediately when changing the 6 | directory - some time needs to pass before the files actually appear. 7 | (This is visible with the naked eye as the file browser is empty for a 8 | brief moment whenever params.dictionary is changed.) 9 | """ 10 | 11 | name = "Activate File" 12 | needs_authentication = False 13 | tick_delay = 0.1 14 | debug = False 15 | 16 | def acquire_output(self, context, prefs): 17 | self.output = "dummy" 18 | 19 | def process_output(self, context, prefs): 20 | if not hasattr(context.scene, 'svn'): 21 | return 22 | 23 | repo = context.scene.svn.get_repo(context) 24 | for area in context.screen.areas: 25 | if area.type == 'FILE_BROWSER': 26 | area.spaces.active.activate_file_by_relative_path( 27 | relative_path=repo.active_file.name) 28 | 29 | self.stop() 30 | 31 | def get_ui_message(self, context): 32 | return "" 33 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/threaded/redraw_viewport.py: -------------------------------------------------------------------------------- 1 | from .background_process import BackgroundProcess, Processes 2 | from ..util import redraw_viewport 3 | 4 | class BGP_SVN_Redraw_Viewport(BackgroundProcess): 5 | name = "Redraw Viewport" 6 | repeat_delay = 1 7 | debug = False 8 | tick_delay = 1 9 | 10 | def tick(self, context, prefs): 11 | redraw_viewport() 12 | 13 | def acquire_output(self, context, prefs): 14 | return "" 15 | 16 | def process_output(self, context, prefs): 17 | return "" 18 | 19 | 20 | def register(): 21 | Processes.start("Redraw Viewport") -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/threaded/update.py: -------------------------------------------------------------------------------- 1 | # SPDX-License-Identifier: GPL-2.0-or-later 2 | # (c) 2023, Blender Foundation - Demeter Dzadik 3 | 4 | from typing import List, Dict, Union, Any, Set, Optional, Tuple 5 | 6 | from .execute_subprocess import execute_svn_command 7 | from .background_process import BackgroundProcess, Processes 8 | 9 | 10 | class BGP_SVN_Update(BackgroundProcess): 11 | name = "Update" 12 | needs_authentication = True 13 | timeout = 5*60 14 | repeat_delay = 0 15 | debug = False 16 | 17 | def acquire_output(self, context, prefs): 18 | Processes.kill('Status') 19 | self.output = execute_svn_command( 20 | context, 21 | ["svn", "up", "--accept", "postpone"], 22 | use_cred=True 23 | ) 24 | 25 | def handle_error(self, context, error): 26 | Processes.start('Status') 27 | super().handle_error(context, error) 28 | 29 | def process_output(self, context, prefs): 30 | print("SVN Update complete:") 31 | print("\n".join(self.output.split("\n")[1:])) 32 | for f in context.scene.svn.get_repo(context).external_files: 33 | if f.status_prediction_type == 'SVN_UP': 34 | f.status_prediction_type = 'SKIP_ONCE' 35 | 36 | Processes.start('Log') 37 | Processes.start('Status') 38 | 39 | 40 | def get_ui_message(self, context) -> str: 41 | """Return a string that should be drawn in the UI for user feedback, 42 | depending on the state of the process.""" 43 | 44 | if self.is_running: 45 | return f"Updating files..." 46 | return "" 47 | 48 | def stop(self): 49 | super().stop() 50 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/ui/__init__.py: -------------------------------------------------------------------------------- 1 | from . import ( 2 | ui_file_list, 3 | ui_sidebar, 4 | ui_filebrowser, 5 | ui_log, 6 | ui_prefs, 7 | ui_outdated_warning, 8 | ui_context_menus 9 | ) 10 | 11 | modules = [ 12 | ui_file_list, 13 | ui_sidebar, 14 | ui_filebrowser, 15 | ui_log, 16 | ui_prefs, 17 | ui_outdated_warning, 18 | ui_context_menus 19 | ] -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/ui/ui_filebrowser.py: -------------------------------------------------------------------------------- 1 | # SPDX-License-Identifier: GPL-2.0-or-later 2 | # (c) 2022, Blender Foundation - Demeter Dzadik 3 | 4 | from bpy.types import Panel 5 | from bl_ui.space_filebrowser import FileBrowserPanel 6 | 7 | from .ui_log import draw_svn_log 8 | from .ui_file_list import draw_repo_file_list 9 | from ..util import get_addon_prefs 10 | 11 | 12 | class FILEBROWSER_PT_SVN_files(FileBrowserPanel, Panel): 13 | bl_space_type = 'FILE_BROWSER' 14 | bl_region_type = 'TOOLS' 15 | bl_category = "Bookmarks" 16 | bl_label = "SVN Files" 17 | 18 | @classmethod 19 | def poll(cls, context): 20 | if not super().poll(context): 21 | return False 22 | 23 | repo = context.scene.svn.get_repo(context) 24 | if not repo: 25 | return False 26 | 27 | return repo.is_filebrowser_directory_in_repo(context) 28 | 29 | def draw(self, context): 30 | layout = self.layout 31 | layout.use_property_split = True 32 | layout.use_property_decorate = False 33 | 34 | # TODO: Get repository of the current file browser's directory. 35 | prefs = get_addon_prefs(context) 36 | if len(prefs.repositories) > 0: 37 | repo = prefs.active_repo 38 | draw_repo_file_list(context, layout, repo) 39 | 40 | 41 | class FILEBROWSER_PT_SVN_log(FileBrowserPanel, Panel): 42 | bl_space_type = 'FILE_BROWSER' 43 | bl_region_type = 'TOOLS' 44 | bl_category = "Bookmarks" 45 | bl_label = "SVN Log" 46 | 47 | @classmethod 48 | def poll(cls, context): 49 | if not super().poll(context): 50 | return False 51 | 52 | repo = context.scene.svn.get_repo(context) 53 | if not repo: 54 | return False 55 | 56 | return repo.get_filebrowser_active_file(context) 57 | 58 | def draw(self, context): 59 | layout = self.layout 60 | layout.use_property_split = True 61 | layout.use_property_decorate = False 62 | 63 | draw_svn_log(context, layout, file_browser=True) 64 | 65 | 66 | registry = [ 67 | FILEBROWSER_PT_SVN_files, 68 | FILEBROWSER_PT_SVN_log 69 | ] 70 | 71 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/ui/ui_outdated_warning.py: -------------------------------------------------------------------------------- 1 | # SPDX-License-Identifier: GPL-2.0-or-later 2 | # (c) 2023, Blender Foundation - Demeter Dzadik 3 | 4 | import bpy 5 | 6 | def draw_outdated_file_warning(self, context): 7 | repo = context.scene.svn.get_repo(context) 8 | if not repo: 9 | return 10 | try: 11 | current_file = repo.current_blend_file 12 | except ValueError: 13 | # This can happen if the svn_directory property wasn't updated yet (not enough time has passed since opening the file) 14 | pass 15 | if not current_file: 16 | # If the current file is not in an SVN repository. 17 | return 18 | 19 | if current_file.status == 'normal' and current_file.repos_status == 'none': 20 | return 21 | 22 | layout = self.layout 23 | row = layout.row() 24 | row.alert = True 25 | 26 | if current_file.status == 'conflicted': 27 | row.operator('svn.resolve_conflict', 28 | text="SVN: This .blend file is conflicted.", icon='ERROR') 29 | elif current_file.repos_status != 'none': 30 | warning = row.operator( 31 | 'svn.custom_tooltip', text="SVN: This .blend file is outdated.", icon='ERROR') 32 | warning.tooltip = "The currently opened .blend file has a newer version available on the remote repository. This means any changes in this file will result in a conflict, and potential loss of data. See the SVN panel for info" 33 | 34 | def register(): 35 | bpy.types.VIEW3D_HT_header.prepend(draw_outdated_file_warning) 36 | 37 | 38 | def unregister(): 39 | bpy.types.VIEW3D_HT_header.remove(draw_outdated_file_warning) 40 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/util.py: -------------------------------------------------------------------------------- 1 | # SPDX-License-Identifier: GPL-2.0-or-later 2 | # (c) 2021, Blender Foundation - Paul Golter 3 | # (c) 2022, Blender Foundation - Demeter Dzadik 4 | 5 | from time import time 6 | 7 | import bpy 8 | 9 | package_name = __package__ 10 | 11 | def get_addon_prefs(context): 12 | return context.preferences.addons[__package__].preferences 13 | 14 | def dots(): 15 | return "." * int((time() % 10) + 3) 16 | 17 | def redraw_viewport(context=None) -> None: 18 | """This causes the sidebar UI to refresh without having to mouse-hover it.""" 19 | context = bpy.context 20 | if not context: 21 | return 22 | for area in context.screen.areas: 23 | if area.type in {'VIEW_3D', 'FILE_BROWSER'}: 24 | area.tag_redraw() 25 | -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/wheels/Send2Trash-1.8.0-py3-none-any.whl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/scripts-blender/addons/blender_svn/wheels/Send2Trash-1.8.0-py3-none-any.whl -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/wheels/python_dateutil-2.8.2-py2.py3-none-any.whl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/scripts-blender/addons/blender_svn/wheels/python_dateutil-2.8.2-py2.py3-none-any.whl -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/wheels/six-1.16.0-py2.py3-none-any.whl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/scripts-blender/addons/blender_svn/wheels/six-1.16.0-py2.py3-none-any.whl -------------------------------------------------------------------------------- /scripts-blender/addons/blender_svn/wheels/xmltodict-0.12.0-py2.py3-none-any.whl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/scripts-blender/addons/blender_svn/wheels/xmltodict-0.12.0-py2.py3-none-any.whl -------------------------------------------------------------------------------- /scripts-blender/addons/bone_gizmos/CHANGELOG.MD: -------------------------------------------------------------------------------- 1 | ## 0.0.2 - 2023-06-02 2 | 3 | ### ADDED 4 | - Add release system 5 | 6 | ### FIXED 7 | - Fix Addon Install Instructions 8 | - Fix Addons Spelling and Links (#54) 9 | 10 | -------------------------------------------------------------------------------- /scripts-blender/addons/cache_manager/CHANGELOG.MD: -------------------------------------------------------------------------------- 1 | ## 0.1.1 - 2023-06-02 2 | 3 | ### FIXED 4 | - Fix Addon Install Instructions 5 | - Fix Addons Spelling and Links (#54) 6 | 7 | 8 | -------------------------------------------------------------------------------- /scripts-blender/addons/cache_manager/README.md: -------------------------------------------------------------------------------- 1 | # Cache Manager 2 | cache-Manager is a Blender Add-on to streamline the alembic cache workflow of assets. 3 | 4 | ## Table of Contents 5 | 6 | - [Installation](#installation) 7 | - [How to Get Started](#how-to-get-started) 8 | - [Features](#features) 9 | 10 | ## Disclaimer 11 | This addon is not used in the production of the Blender-Studio anymore and is not maintained actively. 12 | ## Installation 13 | 1. Download [latest release](../addons/overview) 14 | 2. Launch Blender, navigate to `Edit > Preferences` select `Addons` and then `Install`, 15 | 3. Navigate to the downloaded add-on and select `Install Add-on` 16 | 17 | ## How to get started 18 | After installing the addon you need to setup the addon preferences. 19 | 20 | **Root Cache Directory**: Root directory in which the caches will be exported. Will create subfolders during export 21 | 22 | ## Features 23 | The goal of this add-on was: 24 | 25 | - Automate export of Alembic caches on a collection basis by tagging them as a "cache collection" 26 | - Export of a cacheconfig.json that holds metadata and contains animation values of properties that are not supported by Blender's implementation of Alembic. 27 | - Automate import of the Alembic cache on top of existing assets by using the Mesh Sequence Cache Modifier and Transform Cache Constraint 28 | - Being able to process the cacheconfig.json 29 | - Link in all assets from their source file based on metadata in the cacheconfig.json 30 | - Applying additional animation which is stored in the cacheconfig.json 31 | 32 | 33 | 34 | You can control if modifiers should be disabled / enabled during import /export: 35 | - enable disable modifiers for cache with suffix in modifier name 36 | - modifier_name.cacheoff -> modifier off for export on for import 37 | - modifier_name.cacheon -> modifier on for export off for import 38 | 39 | -------------------------------------------------------------------------------- /scripts-blender/addons/cache_manager/cmglobals.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation 20 | 21 | from typing import List 22 | 23 | MODIFIER_NAME = "cm_cache" 24 | 25 | CACHE_OFF_SUFFIX = ".cacheoff" 26 | CACHE_ON_SUFFIX = ".cacheon" 27 | 28 | CONSTRAINT_NAME = "cm_cache" 29 | 30 | VALID_OBJECT_TYPES = {"MESH", "CAMERA", "EMPTY", "LATTICE"} 31 | CAMERA_TYPES = {"PERSP", "ORTHO", "PANO"} 32 | 33 | _VERSION_PATTERN = "v\d\d\d" 34 | 35 | MODIFIERS_KEEP: List[str] = [ 36 | "SUBSURF", 37 | "PARTICLE_SYSTEM", 38 | "MESH_SEQUENCE_CACHE", 39 | "DATA_TRANSFER", 40 | "NORMAL_EDIT", 41 | "NODES", 42 | ] 43 | CONSTRAINTS_KEEP: List[str] = [ 44 | "TRANSFORM_CACHE", 45 | ] 46 | 47 | DRIVER_VIS_DATA_PATHS: List[str] = [ 48 | "hide_viewport", 49 | "hide_render", 50 | "show_viewport", 51 | "show_render", 52 | ] 53 | 54 | CAM_DATA_PATHS: List[str] = [ 55 | "clip_end", 56 | "clip_start", 57 | "display_size", 58 | "dof.aperture_blades", 59 | "dof.aperture_fstop", 60 | "dof.aperture_ratio", 61 | "dof.aperture_rotation", 62 | "dof.focus_distance", 63 | "lens", 64 | "ortho_scale", 65 | "sensor_fit", 66 | "sensor_height", 67 | "sensor_width", 68 | "shift_x", 69 | "shift_y", 70 | ] 71 | 72 | INSTANCE_TYPES: List[str] = ["NONE", "COLLECTION", "VERTS", "FACES"] 73 | 74 | # "lens_unit", 75 | # "angle", 76 | # "angle_x", 77 | # "angle_y", 78 | -------------------------------------------------------------------------------- /scripts-blender/addons/cache_manager/logger.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation 20 | 21 | import logging 22 | class LoggerFactory: 23 | 24 | """ 25 | Utility class to streamline logger creation 26 | """ 27 | 28 | @staticmethod 29 | def getLogger(name=__name__): 30 | name = name 31 | logger = logging.getLogger(name) 32 | return logger 33 | 34 | 35 | logger = LoggerFactory.getLogger(__name__) 36 | 37 | def gen_processing_string(item: str) -> str: 38 | return f"---Processing {item}".ljust(50, "-") 39 | 40 | 41 | def log_new_lines(multiplier: int) -> None: 42 | print("\n" * multiplier) 43 | -------------------------------------------------------------------------------- /scripts-blender/addons/contactsheet/.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | 58 | # Flask stuff: 59 | instance/ 60 | .webassets-cache 61 | 62 | # Scrapy stuff: 63 | .scrapy 64 | 65 | # Sphinx documentation 66 | docs/_build/ 67 | 68 | # PyBuilder 69 | target/ 70 | 71 | # Jupyter Notebook 72 | .ipynb_checkpoints 73 | 74 | # pyenv 75 | .python-version 76 | 77 | # celery beat schedule file 78 | celerybeat-schedule 79 | 80 | # SageMath parsed files 81 | *.sage.py 82 | 83 | # dotenv 84 | .env 85 | 86 | # virtualenv 87 | .venv 88 | .venv* 89 | venv/ 90 | ENV/ 91 | 92 | # Spyder project settings 93 | .spyderproject 94 | .spyproject 95 | 96 | # Rope project settings 97 | .ropeproject 98 | 99 | # mkdocs documentation 100 | /site 101 | 102 | # mypy 103 | .mypy_cache/ 104 | 105 | # IDE settings 106 | .vscode/ 107 | 108 | # utility bat files: 109 | *jump_in_venv.bat 110 | 111 | #local tests 112 | tests/local* 113 | -------------------------------------------------------------------------------- /scripts-blender/addons/contactsheet/CHANGELOG.MD: -------------------------------------------------------------------------------- 1 | ## 0.1.1 - 2023-06-02 2 | 3 | ### FIXED 4 | - Fix Addon Install Instructions 5 | - Fix Addons Spelling and Links (#54) 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /scripts-blender/addons/contactsheet/README.md: -------------------------------------------------------------------------------- 1 | # Contact Sheet 2 | Blender Add-on to create a contactsheet from sequence editor strips. 3 | 4 | [Contact Sheet Blogpost](https://studio.blender.org/blog/contact-sheet-addon/) 5 | ## Table of Contents 6 | 7 | - [Installation](#installation) 8 | - [Features](#features) 9 | ## Installation 10 | 1. Download [latest release](../addons/overview) 11 | 2. Launch Blender, navigate to `Edit > Preferences` select `Addons` and then `Install`, 12 | 3. Navigate to the downloaded add-on and select `Install Add-on` 13 | 14 | ## Features 15 | After the addon is enabled you will find a `Contactsheet` tab in the Sequence Editor Toolbar. 16 | The 'Make Contactsheet' operator creates a temporary scene and arranges the previously selected sequences in a grid. 17 | If no sequences were selected it takes a continuous row of the top most sequences. 18 | The operator name always shows you how many sequences will be used. 19 | You can overwrite the resolution of the contactsheet by adjusting the X and Y sliders. 20 | The number of rows and columns is automatically calculated. It can also be overwritten by toggling the lock button. 21 | Check the addon preferences there you find some options to customize the contactsheet even more. 22 | 23 | 24 | Create a sym link in your Blender addons directory to the contactsheet/contactsheet folder. 25 | -------------------------------------------------------------------------------- /scripts-blender/addons/contactsheet/__init__.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | import bpy 22 | 23 | from contactsheet import ( 24 | prefs, 25 | props, 26 | opsdata, 27 | ops, 28 | ui, 29 | geo, 30 | geo_seq, 31 | ) 32 | from contactsheet.log import LoggerFactory 33 | 34 | logger = LoggerFactory.getLogger(__name__) 35 | 36 | bl_info = { 37 | "name": "Contactsheet", 38 | "author": "Paul Golter", 39 | "description": "Blender addon to create a contactsheet from sequence editor strips", 40 | "blender": (3, 0, 0), 41 | "version": (0, 1, 1), 42 | "location": "Sequence Editor", 43 | "category": "Sequencer", 44 | } 45 | 46 | _need_reload = "ops" in locals() 47 | 48 | if _need_reload: 49 | import importlib 50 | 51 | geo_seq = importlib.reload(geo_seq) 52 | geo = importlib.reload(geo) 53 | props = importlib.reload(props) 54 | prefs = importlib.reload(prefs) 55 | opsdata = importlib.reload(opsdata) 56 | ops = importlib.reload(ops) 57 | ui = importlib.reload(ui) 58 | 59 | 60 | def register(): 61 | props.register() 62 | prefs.register() 63 | ops.register() 64 | ui.register() 65 | 66 | 67 | def unregister(): 68 | ui.unregister() 69 | ops.unregister() 70 | prefs.unregister() 71 | props.unregister() 72 | 73 | 74 | if __name__ == "__main__": 75 | register() 76 | -------------------------------------------------------------------------------- /scripts-blender/addons/contactsheet/log.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | import logging 22 | 23 | 24 | class LoggerFactory: 25 | 26 | """ 27 | Utility class to streamline logger creation 28 | """ 29 | 30 | @staticmethod 31 | def getLogger(name=__name__): 32 | logger = logging.getLogger(name) 33 | return logger 34 | -------------------------------------------------------------------------------- /scripts-blender/addons/easy_weights/CHANGELOG.MD: -------------------------------------------------------------------------------- 1 | ## 0.1.1 - 2023-06-02 2 | 3 | ## DOCUMENTED 4 | - Initial release 5 | -------------------------------------------------------------------------------- /scripts-blender/addons/easy_weights/utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/scripts-blender/addons/easy_weights/utils/__init__.py -------------------------------------------------------------------------------- /scripts-blender/addons/geonode_shapekeys/CHANGELOG.MD: -------------------------------------------------------------------------------- 1 | ## 0.0.2 - 2023-06-02 2 | 3 | ### FIXED 4 | - Fix Addon Install Instructions 5 | - Fix PyAPI breakage (context overriding) 6 | - Fix Addons Spelling and Links (#54) 7 | - Fix error in writing credentials to file 8 | - Fix another error in disable_modifiers() 9 | - Fix small bug found by MackBo 10 | - Another small bugfix 11 | 12 | ### REMOVED 13 | - Nuke BAT dead code and relevant UI/UX. -------------------------------------------------------------------------------- /scripts-blender/addons/geonode_shapekeys/README.md: -------------------------------------------------------------------------------- 1 | # GeoNode Shape Keys 2 | GeoNode Shape Keys is a Blender Add-on that lets you deform linked and overridden meshes using sculpt mode in a roundabout way using a geometry node set-up. While the current override system doesn't support adding or editing shape keys on overridden meshes, it does allow you to add modifiers, so this add-on leverages that. 3 | ## Table of Contents 4 | 5 | - [Installation](#installation) 6 | - [How to Use](#how-to-use) 7 | 8 | ## Installation 9 | 1. Download [latest release](../addons/overview) 10 | 2. Launch Blender, navigate to `Edit > Preferences` select `Addons` and then `Install`, 11 | 3. Navigate to the downloaded add-on and select `Install Add-on` 12 | 13 | # How to use 14 | The add-on's UI is only visible on linked and overridden meshes. 15 | It can be found under Properties->Object Data->Shape Keys->GeoNode Shape Keys. 16 | The add button will do the following: 17 | - Create a local version of the evaluated object that you can sculpt on 18 | - Create a modifier on the linked object, that will apply your sculpted changes to it 19 | 20 | After creating a set-up, you get a button to conveniently swap between the two objects. 21 | 22 | Removing a list entry should also remove the relevant modifier and object. Otherwise, it will throw a warning. 23 | 24 | The node set-up that applies the deformation relies on a UV map. -------------------------------------------------------------------------------- /scripts-blender/addons/geonode_shapekeys/geonodes.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/scripts-blender/addons/geonode_shapekeys/geonodes.blend -------------------------------------------------------------------------------- /scripts-blender/addons/grease_converter/CHANGELOG.MD: -------------------------------------------------------------------------------- 1 | ## 0.1.1 - 2023-06-02 2 | 3 | ## DOCUMENTED 4 | - Initial release 5 | -------------------------------------------------------------------------------- /scripts-blender/addons/grease_converter/README.md: -------------------------------------------------------------------------------- 1 | # Grease Pencil Converter 2 | grease-converter is a Blender Add-on that can convert annotations to grease pencil objects and vise versa. 3 | 4 | ## Table of Contents 5 | 6 | - [Installation](#installation) 7 | - [How to get Started](#how-to-get-started) 8 | 9 | 10 | ## Installation 11 | 1. Download [latest release](../addons/overview) 12 | 2. Launch Blender, navigate to `Edit > Preferences` select `Addons` and then `Install`, 13 | 3. Navigate to the downloaded add-on and select `Install Add-on` 14 | 15 | ## How to get started 16 | After the add-on is installed you have 2 new operators available. 17 | 18 | - **grease_converter.convert_to_grease_pencil**: 19 | - Located in the 3DView Side Panel (N)-> View -> Annotations Panel 20 | - Converts active annotation to Grease Pencil Object and link it in the active Scene. 21 | ![drawing](/media/addons/grease_converter/convert_to_grease_pencil.jpg) 22 | 23 | 24 | - **grease_converter.convert_to_annotation**: 25 | - Located in the 3DView Header -> Object -> Convert 26 | - Active objects needs to be grease pencil object. Will convert it to Annotation Grease Pencil Object. Uses Tint Color and Stroke Thickness attribute found in the Adjustments Panel for final annotation color and stroke thickness. (Annotations are a simple version of GreasePencil and only support **one* color and stoke thickness per layer) 27 | 28 | ![drawing](/media/addons/grease_converter/adjustments_panel.jpg) 29 | - >**Note**: If the grease pencil object has it's transforms not applied or a parent you will be prompted with a warning as these are not taken in to account yet 30 | -------------------------------------------------------------------------------- /scripts-blender/addons/grease_converter/__init__.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation 20 | 21 | bl_info = { 22 | "name": "Grease Pencil Converter", 23 | "author": "Paul Golter", 24 | "description": "Blender add-on to convert annotations to grease pencil objects and back", 25 | "blender": (3, 0, 0), 26 | "version": (0, 1, 1), 27 | "location": "View3D", 28 | "warning": "", 29 | "doc_url": "", 30 | "tracker_url": "", 31 | "category": "Grease Pencil", 32 | } 33 | 34 | from . import ops, ui 35 | 36 | _need_reload = "ops" in locals() 37 | 38 | if _need_reload: 39 | import importlib 40 | 41 | ops = importlib.reload(ops) 42 | ui = importlib.reload(ui) 43 | 44 | 45 | def register(): 46 | ops.register() 47 | ui.register() 48 | 49 | 50 | def unregister(): 51 | ui.unregister() 52 | ops.unregister() 53 | 54 | 55 | if __name__ == "__main__": 56 | register() 57 | -------------------------------------------------------------------------------- /scripts-blender/addons/grease_converter/ui.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | from typing import Any, Union, Set, List 3 | from .ops import GC_OT_convert_to_grease_pencil, GC_OT_convert_to_annotation 4 | 5 | 6 | class GC_PT_3dview(bpy.types.Panel): 7 | bl_category = "Grease Converter" 8 | bl_label = "Convert" 9 | bl_space_type = "VIEW_3D" 10 | bl_region_type = "UI" 11 | 12 | def draw(self, context: bpy.types.Context) -> None: 13 | layout = self.layout 14 | 15 | box = layout.box() 16 | box.label(text="Active Annotation", icon="OUTLINER_DATA_GREASEPENCIL") 17 | row = box.row(align=True) 18 | row.operator(GC_OT_convert_to_grease_pencil.bl_idname) 19 | 20 | if issubclass(bpy.types.GreasePencil, type(context.active_object.data)): 21 | box = layout.box() 22 | box.label(text="Grease Pencil", icon="OUTLINER_OB_GREASEPENCIL") 23 | row = box.row(align=True) 24 | row.operator(GC_OT_convert_to_annotation.bl_idname) 25 | 26 | 27 | def menu_draw_convert_to_annotation(self: Any, context: bpy.types.Context) -> None: 28 | if not GC_OT_convert_to_annotation.poll(context): 29 | return None 30 | layout = self.layout 31 | layout.operator(GC_OT_convert_to_annotation.bl_idname, icon="STROKE") 32 | 33 | 34 | def menu_draw_convert_to_grease_pencil(self: Any, context: bpy.types.Context) -> None: 35 | if not GC_OT_convert_to_grease_pencil.poll(context): 36 | return None 37 | layout = self.layout 38 | layout.operator( 39 | GC_OT_convert_to_grease_pencil.bl_idname, icon="OUTLINER_OB_GREASEPENCIL" 40 | ) 41 | 42 | 43 | # ---------REGISTER ----------. 44 | 45 | classes: List[Any] = [] 46 | 47 | 48 | def register(): 49 | for cls in classes: 50 | bpy.utils.register_class(cls) 51 | 52 | bpy.types.VIEW3D_MT_object_convert.append(menu_draw_convert_to_annotation) 53 | bpy.types.VIEW3D_PT_grease_pencil.append(menu_draw_convert_to_grease_pencil) 54 | 55 | 56 | def unregister(): 57 | for cls in reversed(classes): 58 | bpy.utils.unregister_class(cls) 59 | 60 | bpy.types.VIEW3D_MT_object_convert.remove(menu_draw_convert_to_annotation) 61 | bpy.types.VIEW3D_PT_grease_pencil.remove(menu_draw_convert_to_grease_pencil) 62 | -------------------------------------------------------------------------------- /scripts-blender/addons/lattice_magic/CHANGELOG.MD: -------------------------------------------------------------------------------- 1 | ## 0.1.1 - 2023-06-02 2 | 3 | ## DOCUMENTED 4 | - Initial release 5 | 6 | 7 | -------------------------------------------------------------------------------- /scripts-blender/addons/lighting_overrider/CHANGELOG.MD: -------------------------------------------------------------------------------- 1 | ## 0.1.1 - 2023-06-02 2 | 3 | ### ADDED 4 | - Add release system 5 | -------------------------------------------------------------------------------- /scripts-blender/addons/lighting_overrider/TODO.txt: -------------------------------------------------------------------------------- 1 | UI 2 | 3 | - show alerts for items that are not found 4 | - automatically select type based on match 5 | 6 | FEATURES 7 | 8 | custom properties 9 | - allow rna overriding of custom properties (see geonodes modifiers) 10 | 11 | remove drivers/animation data 12 | - properly remove drivers/animation data when creating an rna override 13 | 14 | animated overrides 15 | - store animation data in the blend file and write 16 | their rna path to json to allow animated/driven overrides 17 | 18 | execution script 19 | - auto-generate script from modules 20 | 21 | text data-block 22 | - auto-load on file-load if on disk 23 | - jump to file in text editor 24 | 25 | settings interaction 26 | - show dirty per category 27 | 28 | FIXES 29 | 30 | - library flags for RNA overrides 31 | - settings ordering (template) 32 | - search invert (template) 33 | - auto-mute drivers/fcurves whenever necessary !! 34 | -------------------------------------------------------------------------------- /scripts-blender/addons/lighting_overrider/__init__.py: -------------------------------------------------------------------------------- 1 | from . import categories 2 | from .categories import * 3 | from . import templates, json_io, execution, ui, override_picker 4 | 5 | 6 | bl_info = { 7 | "name": "Lighting Overrider", 8 | "author": "Simon Thommes", 9 | "version": (0, 1, 1), 10 | "blender": (3, 0, 0), 11 | "location": "3D Viewport > Sidebar > Overrides", 12 | "description": "Tool for the Blender Studio to create, manage and store local python overrides of linked data on a shot and sequence level.", 13 | "category": "Workflow", 14 | } 15 | 16 | modules = [templates] 17 | modules += [globals()[mod] for mod in categories.__all__] 18 | modules += [json_io, execution, ui, override_picker] 19 | 20 | def register(): 21 | for m in modules: 22 | m.register() 23 | 24 | def unregister(): 25 | for m in modules: 26 | m.unregister() -------------------------------------------------------------------------------- /scripts-blender/addons/lighting_overrider/categories/__init__.py: -------------------------------------------------------------------------------- 1 | __all__ = [ 'variable_settings', 'motion_blur_settings', 'shader_settings', 'rig_settings', 'rna_overrides' ] -------------------------------------------------------------------------------- /scripts-blender/addons/pose_shape_keys/CHANGELOG.MD: -------------------------------------------------------------------------------- 1 | ## 0.0.2 - 2023-06-02 2 | 3 | ## DOCUMENTED 4 | - Initial release -------------------------------------------------------------------------------- /scripts-blender/addons/pose_shape_keys/reset_rig.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | from bpy.props import BoolProperty 3 | from .pose_key import get_deforming_armature 4 | 5 | class CK_OT_reset_rig(bpy.types.Operator): 6 | """Reset all bone transforms and custom properties to their default values""" 7 | bl_idname = "object.posekey_reset_rig" 8 | bl_label = "Reset Rig" 9 | bl_options = {'REGISTER', 'UNDO', 'INTERNAL'} 10 | 11 | reset_transforms: BoolProperty(name="Transforms", default=True, description="Reset bone transforms") 12 | reset_props: BoolProperty(name="Properties", default=True, description="Reset custom properties") 13 | selection_only: BoolProperty(name="Selected Only", default=False, description="Affect selected bones rather than all bones") 14 | 15 | def invoke(self, context, event): 16 | wm = context.window_manager 17 | return wm.invoke_props_dialog(self) 18 | 19 | def execute(self, context): 20 | rigged_ob = context.object 21 | rig = get_deforming_armature(rigged_ob) 22 | bones = rig.pose.bones 23 | if self.selection_only: 24 | bones = context.selected_pose_bones 25 | for pb in bones: 26 | if self.reset_transforms: 27 | pb.location = ((0, 0, 0)) 28 | pb.rotation_euler = ((0, 0, 0)) 29 | pb.rotation_quaternion = ((1, 0, 0, 0)) 30 | pb.scale = ((1, 1, 1)) 31 | 32 | if self.reset_props and len(pb.keys()) > 0: 33 | rna_properties = [prop.identifier for prop in pb.bl_rna.properties if prop.is_runtime] 34 | 35 | # Reset custom property values to their default value 36 | for key in pb.keys(): 37 | if key.startswith("$"): continue 38 | if key in rna_properties: continue # Addon defined property. 39 | 40 | ui_data = None 41 | try: 42 | ui_data = pb.id_properties_ui(key) 43 | if not ui_data: continue 44 | ui_data = ui_data.as_dict() 45 | if not 'default' in ui_data: continue 46 | except TypeError: 47 | # Some properties don't support UI data, and so don't have a default value. (like addon PropertyGroups) 48 | pass 49 | 50 | if not ui_data: continue 51 | 52 | if type(pb[key]) not in (float, int): continue 53 | pb[key] = ui_data['default'] 54 | 55 | return {'FINISHED'} 56 | 57 | registry = [ 58 | CK_OT_reset_rig 59 | ] -------------------------------------------------------------------------------- /scripts-blender/addons/render_review/.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | 58 | # Flask stuff: 59 | instance/ 60 | .webassets-cache 61 | 62 | # Scrapy stuff: 63 | .scrapy 64 | 65 | # Sphinx documentation 66 | docs/_build/ 67 | 68 | # PyBuilder 69 | target/ 70 | 71 | # Jupyter Notebook 72 | .ipynb_checkpoints 73 | 74 | # pyenv 75 | .python-version 76 | 77 | # celery beat schedule file 78 | celerybeat-schedule 79 | 80 | # SageMath parsed files 81 | *.sage.py 82 | 83 | # dotenv 84 | .env 85 | 86 | # virtualenv 87 | .venv 88 | .venv* 89 | venv/ 90 | ENV/ 91 | 92 | # Spyder project settings 93 | .spyderproject 94 | .spyproject 95 | 96 | # Rope project settings 97 | .ropeproject 98 | 99 | # mkdocs documentation 100 | /site 101 | 102 | # mypy 103 | .mypy_cache/ 104 | 105 | # IDE settings 106 | .vscode/ 107 | 108 | # utility bat files: 109 | *jump_in_venv.bat 110 | 111 | #local tests 112 | tests/local* -------------------------------------------------------------------------------- /scripts-blender/addons/render_review/CHANGELOG.MD: -------------------------------------------------------------------------------- 1 | ## 0.1.2 - 2023-06-19 2 | 3 | ### FIXED 4 | - Fix line ends from DOS to UNIX (#68) 5 | 6 | ### REMOVED 7 | - Remove Metastrip Filepath (#80) 8 | 9 | 10 | ## 0.1.1 - 2023-06-02 11 | 12 | ### CHANGED 13 | - Always use Video Editing workspace (#61) 14 | 15 | 16 | -------------------------------------------------------------------------------- /scripts-blender/addons/render_review/README.md: -------------------------------------------------------------------------------- 1 | # Render Review 2 | Blender Add-on to review renders from Flamenco with the Sequence Editor 3 | 4 | ## Table of Contents 5 | - [Installation](#installation) 6 | - [Before you get started](#before-you-get-started) 7 | - [Features](#features) 8 | 9 | ## Installation 10 | 1. Download [latest release](../addons/overview) 11 | 2. Launch Blender, navigate to `Edit > Preferences` select `Addons` and then `Install`, 12 | 3. Navigate to the downloaded add-on and select `Install Add-on` 13 | 14 | After install you need to configure the addon in the addon preferences. 15 | 16 | ## Before you get started 17 | 18 | This addon requires a specific folder structure of the rendering pipeline. This structure is defined by Flamenco 19 | 20 | If you have a different folder structure the addon might not work as 21 | expected. 22 | 23 | ## Features 24 | - Quickly load all versions of a shot or a whole sequence that was rendered with Flamenco in to the Sequence Editor 25 | - Inspect EXR's of selected sequence strip with one click 26 | - Approve render which copies data from the farm_output to the shot_frames folder 27 | - Push a render to the edit which uses the existing .mp4 preview or creates it with ffmpeg 28 | and copies it over to the shot_preview folder with automatic versioning incrementation 29 | - Creation of metadata.json files on approving renders and pushing renders to edit to keep track where a file came from 30 | - Connection to `blender-kitsu` addon, that can be enabled and extends the functionality of some operators 31 | 32 | ## Links 33 | 34 | Flamenco Doc 35 | -------------------------------------------------------------------------------- /scripts-blender/addons/render_review/exception.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | 22 | class NoImageSequenceAvailableException(Exception): 23 | """ 24 | Error raised when trying to gather image sequence in folder but no files are existent 25 | """ 26 | -------------------------------------------------------------------------------- /scripts-blender/addons/render_review/log.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | import logging 22 | 23 | 24 | class LoggerFactory: 25 | 26 | """ 27 | Utility class to streamline logger creation 28 | """ 29 | 30 | @staticmethod 31 | def getLogger(name=__name__): 32 | logger = logging.getLogger(name) 33 | return logger 34 | -------------------------------------------------------------------------------- /scripts-blender/addons/render_review/util.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | import re 22 | from typing import Union, Dict, List, Any 23 | import bpy 24 | from render_review import vars 25 | 26 | 27 | def redraw_ui() -> None: 28 | """ 29 | Forces blender to redraw the UI. 30 | """ 31 | for screen in bpy.data.screens: 32 | for area in screen.areas: 33 | area.tag_redraw() 34 | 35 | 36 | def get_version(str_value: str, format: type = str) -> Union[str, int, None]: 37 | match = re.search(vars.VERSION_PATTERN, str_value) 38 | if match: 39 | version = match.group() 40 | if format == str: 41 | return version 42 | if format == int: 43 | return int(version.replace("v", "")) 44 | return None 45 | -------------------------------------------------------------------------------- /scripts-blender/addons/render_review/vars.py: -------------------------------------------------------------------------------- 1 | # ***** BEGIN GPL LICENSE BLOCK ***** 2 | # 3 | # This program is free software; you can redistribute it and/or 4 | # modify it under the terms of the GNU General Public License 5 | # as published by the Free Software Foundation; either version 2 6 | # of the License, or (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software Foundation, 15 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 | # 17 | # ***** END GPL LICENCE BLOCK ***** 18 | # 19 | # (c) 2021, Blender Foundation - Paul Golter 20 | 21 | # These defaults will be overridden if a Kitsu project is referenced 22 | RESOLUTION = (2048, 858) 23 | VERSION_PATTERN = r"v\d\d\d" 24 | FPS = 24 25 | -------------------------------------------------------------------------------- /scripts/README.md: -------------------------------------------------------------------------------- 1 | # Scripts and utilities 2 | 3 | ## blender-purge 4 | 5 | Command line tool to purge orphan data of many blend files via the console. 6 | 7 | Author: Paul Golter 8 | 9 | 10 | ## freesound-credits 11 | Snippet to generate credits for sounds taken from freesound.org in a VSE sequence. 12 | 13 | Author & Maintainer: Francesco Siddi 14 | -------------------------------------------------------------------------------- /scripts/blender-crawl/blender-crawl/default-scripts/purge.py: -------------------------------------------------------------------------------- 1 | 2 | # ***** BEGIN GPL LICENSE BLOCK ***** 3 | # 4 | # This program is free software; you can redistribute it and/or 5 | # modify it under the terms of the GNU General Public License 6 | # as published by the Free Software Foundation; either version 2 7 | # of the License, or (at your option) any later version. 8 | # 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program; if not, write to the Free Software Foundation, 16 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 | # 18 | # ***** END GPL LICENCE BLOCK ***** 19 | # 20 | # (c) 2021, Blender Foundation 21 | 22 | import bpy 23 | 24 | # Setup prefs. 25 | bpy.context.preferences.filepaths.save_version = 0 #TODO Figure out why this is here 26 | 27 | # Purge. 28 | print("Starting Recursive Purge") 29 | bpy.ops.outliner.orphans_purge(do_local_ids=True, do_linked_ids=True, do_recursive=True) 30 | 31 | # Save. 32 | bpy.ops.wm.save_mainfile() 33 | print("Saved file: %s", bpy.data.filepath) 34 | 35 | # Quit. 36 | print("Closing File") 37 | bpy.ops.wm.quit_blender() 38 | -------------------------------------------------------------------------------- /scripts/blender-crawl/blender_crawl/default_scripts/purge.py: -------------------------------------------------------------------------------- 1 | 2 | # ***** BEGIN GPL LICENSE BLOCK ***** 3 | # 4 | # This program is free software; you can redistribute it and/or 5 | # modify it under the terms of the GNU General Public License 6 | # as published by the Free Software Foundation; either version 2 7 | # of the License, or (at your option) any later version. 8 | # 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program; if not, write to the Free Software Foundation, 16 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 | # 18 | # ***** END GPL LICENCE BLOCK ***** 19 | # 20 | # (c) 2021, Blender Foundation 21 | 22 | import bpy 23 | bpy.ops.outliner.orphans_purge(do_local_ids=True, do_linked_ids=True, do_recursive=True) 24 | bpy.ops.wm.quit_blender() 25 | -------------------------------------------------------------------------------- /scripts/blender-crawl/blender_crawl/default_scripts/save.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | import contextlib 3 | 4 | @contextlib.contextmanager 5 | def override_save_version(): 6 | """Overrides the save version settings""" 7 | save_version = bpy.context.preferences.filepaths.save_version 8 | 9 | try: 10 | bpy.context.preferences.filepaths.save_version = 0 11 | yield 12 | 13 | finally: 14 | bpy.context.preferences.filepaths.save_version = save_version 15 | 16 | 17 | with override_save_version(): 18 | bpy.ops.wm.save_mainfile() 19 | print(f"Saved file: '{bpy.data.filepath}'") 20 | bpy.ops.wm.quit_blender() 21 | -------------------------------------------------------------------------------- /scripts/freesound-credits/README.md: -------------------------------------------------------------------------------- 1 | # Freesound Credits Generator 2 | 3 | Open an editorial file, look for sound strips and collect their credit 4 | and license from Freesound using the API. 5 | 6 | - Generate an API token https://freesound.org/apiv2/apply 7 | - Export FREESOUND_API_KEY with a freesound API token 8 | - Run Blender with Python script that outputs the credits file 9 | 10 | ```plaintext 11 | export FREESOUND_API_KEY= 12 | --background --factory-startup --python generate_sound_credits.py 13 | ``` 14 | -------------------------------------------------------------------------------- /scripts/shotstats/gnuplot_chart.tpl: -------------------------------------------------------------------------------- 1 | set terminal pngcairo transparent enhanced font "arial,10" fontscale 1.0 size {width}, {height} 2 | set output '{tmp_chart_file}' 3 | set key autotitle columnhead 4 | 5 | #set multiplot 6 | #set size 1, 0.5 7 | 8 | #set tics in 9 | #unset tics 10 | #set tic scale 0 11 | 12 | # Display border 13 | set border lt 4 14 | # unset border 15 | 16 | # Set fixed ticks 17 | set xtics 20 18 | 19 | # Set y axis to start at 0 20 | set yrange [0:*] 21 | 22 | # Set x axis to start at frame number 23 | set xrange [{frame_start_number}:*] 24 | 25 | #set origin 0.0,0.5 26 | # unset xtics 27 | # set y2label "speed" textcolor lt 4 28 | set key textcolor variable 29 | #plot '{frames_stats_file}' using 1:3 with lines lt 4 title 'Memory (MB)' 30 | 31 | #set origin 0.0,0.0 32 | plot '{frames_stats_file}' using 1:4 with lines lt 4 title 'Render time (m)' 33 | 34 | #unset multiplot 35 | 36 | -------------------------------------------------------------------------------- /scripts/shotstats/playhead.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Warnakala/blender-studio-tools/abf1f05d0d8fd22ca769047e155f0888b1c89645/scripts/shotstats/playhead.png --------------------------------------------------------------------------------