LODs are child collections of the asset collection (COL_{asset}_LOD{n}).
Overrides hide the other LOD collections (viewport and render), keeping
the rig, pose and animation; collection instances instance the LOD
collection. Each instance has its own LOD, set per instance or for the
selection in the Loaded panel, kept through save, reload and updates.
Loading shows SCENE_MANAGER_DEFAULT_LOD (0).
The Shot Viewer panel is now "Shot Manager" and starts closed. Code
names and SHOT_VIEWER_* config keys are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
6.5 KiB
6.5 KiB
Melvile Tools: notes for Claude
Blender add-on (Blender 5.2) for the Melvile pipeline at Walking The Dog: Sanity Check,
Rename, Shot Manager and Scene Manager panels in the 3D View sidebar (WTD tab). README.md
is the user guide: keep it up to date with every user-visible change.
Layout and conventions
config.py: every production value (prefixes, formats, patterns, modes). Values are read at run time (config.X, never copied at import) because a studio JSON file can override them (add-on preferences "Config Override", orWTD_SANITY_CONFIG). New tunable values go here, with a comment, and in the README's Configuration table.ui/panel.py: all panels. Operators live with their tool (rename.py,shot_viewer.py,scene_manager/,ui/operators.pyfor the Sanity Check).checks/: sanity checks, auto-registered (see README > For developers).__init__.pydeletes cached submodules on reload, so Reload Scripts picks up every file.- Versions:
blender_manifest.tomlandbl_infoin__init__.py(keep both in sync). - Style: match the surrounding code; short docstrings, few comments, no heavy abstractions.
Working with the user
- Commits: when asked, create a branch from
master, commit there (end with the Co-Authored-By line), and give the user the merge / push / branch-delete commands: they run them themselves. Only commit straight onmasterwhen told to. - Real Blender API facts beat memory: probe in headless Blender before relying on an API.
Testing
Blender binary: macOS /Applications/Blender.app/Contents/MacOS/Blender, Windows
blender.exe from the install folder. Import the add-on in tests by putting the folder
that contains this repo on sys.path and importing the repo folder name (see
dev/test_scene_manager.py).
- Headless:
blender -b --factory-startup --python-exit-code 1 --python <script> -- <args>. Timers do not run in background mode: pump background jobs by hand (scene_manager.ipc._poll()). - UI: run Blender with a window (
--factory-startup <file.blend> --python <script>, a .blend argument avoids the splash), drive it withbpy.app.timers, take screenshots withbpy.ops.screen.screenshot_area, quit withbpy.ops.wm.quit_blender(). A sidebar tab (region.active_panel_category) can only be set once the region has been drawn. - Scene Manager without Libreflow (
dev/):blender -b --factory-startup --python dev/make_test_assets.py -- <workdir>python dev/fake_libreflow.py <workdir>(keep running; restart for a clean state)blender -b --factory-startup --python-exit-code 1 --python dev/test_scene_manager.py -- <workdir>(58 checks, "All checks passed")./_test/publishand/_test/downloadsimulate a new publish and a requested revision reaching this site. The fake server follows the realwtdcmdsreplies; check them against the real Libreflow when one is available.
External pieces
- Libreflow
wtdcmdsextension (commands used by the Scene Manager), on the share:WG/_Dev/GIT/ndemaerschalk/_MELVILE/libreflow_dev_utils/dev/src/wtdcmds/(src/libreflow/extensions/wtdcmds/wtd_cmds.py,BLENDER_ADDON_BRIEF.md). Server address/token:~/.kabaret/ipc/server.json(configLIBREFLOW_SERVER_FILE). - Add Camera Rigs extension:
bpy.ops.object.build_camera_rig(mode=...)builds the Shot Manager cameras. It finds its rigs by therig_idcustom property, not by name. tools_ops.py"Get Oid" uses the separate kabaret Blender client (bpy.ops.kabaret.cmds_call).
Design notes (found by testing)
- Shot Manager: shots are timeline markers bound to cameras, in one scene. Setting
scene.frame_currentdoes not switch the camera (onlyframe_setdoes): setscene.cameraexplicitly. - Scene Manager: tags live on
bpy.types.Libraryonly. Library overrides lose custom properties when they resync, so instances are traced back to their library (empty →instance_collection.library, override →override_library.reference.library). library.reload()invalidates every Python reference to linked and override data: look IDs up again afterwards. In Blender 5.2 it also replaces the Library itself (renamed after its file, custom properties gone):library.update()finds it by path and restores the name and tags.- Removing a library leaves the libraries it linked indirectly (e.g. Blender's
geometry_nodes_essentials.blend):remove_unused_libraries()drops the ones whose data is no longer used, never a managed library. - LODs are child collections of the asset collection (
COL_{asset}_LOD{n}). Overrides switch byhide_viewport/hide_renderon the LOD override collections: Blender stores them as override properties (kept through save, reload and resync) and hidden LODs are not evaluated. Collection instances instance the LOD collection itself. A second override's collections are renamed (.001): match LODs onoverride_library.reference.name. - "Shot Manager" is the user-facing name of what the code calls
shot_viewer(module, operators,SHOT_VIEWER_*config keys kept for existing override files). - Background requests (
scene_manager.ipc.run) hand results back through a timer; in callbacks, find scenes by name (bpy.context.sceneis not reliable in timers).
Real Libreflow (first run, 2026-10-27)
- Kitsu asset types:
main_character,secondary_character,tertiary_character,main_props,secondary_props,set_props,vehicles,bg_location,bg_set,skies,setdress_bank. The fake server uses the same names. - Paths come back as Windows paths with backslashes;
commentcan benull. - Set dressing publishes (
setdress_low) hold a whole layout scene: the set is theenvironmentscollection, next tolights,cameras,characters,_unused. - Tested live: connection, context, casting, load (instance and override), version switch
and update, remove, assetize errors, one request (
car_paulmodeling.blend v001 →Requested). Not tested: an actual assetize publish (it writes to production). New wtdcmds commands need every Libreflow session restarted (a running one keeps the old code and answers 404).
Open points
- Override vs instance per asset type (
SCENE_MANAGER_LINK_MODES), and the file patterns of sets (setdress_lowseen on one asset only): confirm with production. - The server picks the first file matching a pattern even when it is not on this site,
while another matching file is (e.g.
car_paul:modeling/modeling.blendv001 not available,modeling/tes_modeling.blendv002 available). - Values marked TODO in
config.pywait for production specs.