From fd22216d913a621d3719129fc457bf19a409b7ca Mon Sep 17 00:00:00 2001 From: Raincloud Date: Mon, 20 Apr 2026 11:57:06 -0500 Subject: [PATCH] BCON 2026 Austin --- config/bookmarks.txt | 8 +- config/flamenco-manager-info.json | 233 +- config/platform_support.txt | 2 + config/recent-files.txt | 12 +- config/recent-searches.txt | Bin 25611 -> 25660 bytes config/userpref.blend | 4 +- .../blender_org/.blender_ext/index.json | 2 +- ...ser_default.blenderkit_updater_status.json | 14 +- .../.blender_ext/index.json | 2 +- ....zip _ Install entire .zip as an addon.txt | 0 scripts/addons/HoloMARI_MultiRender.py | 5674 ++++++++++++++ ....zip _ Install entire .zip as an addon.txt | 0 scripts/addons/MARI_Advanced/__init__.py | 6829 +++++++++++++++++ .../addons/cc_blender_tools-2_4_0/.gitignore | 9 + ...cc_blender_tools-2_4_0_updater_status.json | 2 +- scripts/addons/delete_withoutConfirm.py | 53 - scripts/addons/flamenco/operators.py | 233 +- .../form_affinity_maya_config_pro/INSTALL.txt | 25 + .../form_affinity_maya_config_pro/README.md | 388 + .../form_affinity_maya_config_pro/__init__.py | 179 + .../blender_manifest.toml | 30 + .../fa_hotkeys_text.txt | 53 + .../keyconfigs/__init__.py | 4 + .../keyconfigs/fa_hotkeys.py | 108 + .../keyconfigs/fa_hotkeys_data.py | 5509 +++++++++++++ .../ops/__init__.py | 4 + .../ops/animation_menu.py | 261 + .../ops/animation_timeline.py | 38 + .../ops/delete_ops.py | 51 + .../ops/deploy_ops.py | 117 + .../ops/marking_menu.py | 333 + .../ops/mesh_select_mode.py | 52 + .../ops/object_select.py | 124 + .../ops/quadview.py | 290 + .../ops/special_tools.py | 97 + .../ops/tab_switcher.py | 174 + .../panels/__init__.py | 90 + .../panels/panel_animation.py | 201 + .../panels/panel_pro.py | 832 ++ .../panels/panel_shelf.py | 879 +++ .../panels/panel_sidebar.py | 735 ++ .../panels/shelf_header.py | 177 + .../portable/config/.gitkeep | 1 + .../portable/config/startup.blend | 3 + .../portable/config/userpref.blend | 3 + .../portable/extensions/.cache/compat.dat | 3 + .../user_default/icon_viewer/__init__.py | 484 ++ .../icon_viewer/blender_manifest.toml | 12 + .../scripts/addons/IconOperator/.gitignore | 1 + .../scripts/addons/IconOperator/__init__.py | 96 + .../presets/interface_theme/Blender_Dark.xml | 6 + .../presets/interface_theme/Blender_Light.xml | 1643 ++++ .../interface_theme/maya_blue_theme.xml | 1534 ++++ .../presets/interface_theme/maya_theme.xml | 1453 ++++ .../interface_theme/maya_theme_gradient.xml | 1534 ++++ .../presets/interface_theme/modo_theme.xml | 1534 ++++ .../presets/interface_theme/sketchup.xml | 1534 ++++ .../interface_theme/white_bg_theme.xml | 1534 ++++ .../scripts/presets/keyconfig/Blender.py | 384 + .../scripts/presets/keyconfig/Blender_27x.py | 106 + .../presets/keyconfig/Industry_Compatible.py | 41 + .../scripts/presets/keyconfig/fa_hotkeys.py | 5509 +++++++++++++ .../utils/__init__.py | 9 + .../utils/compat.py | 79 + .../utils/deploy.py | 105 + .../utils/version.py | 116 + scripts/presets/keyconfig/Blender.py | 18 +- scripts/presets/keyconfig/fa_hotkeys.py | 575 +- .../keyconfig/keymap_data/blender_default.py | 3424 ++++----- .../keymap_data/industry_compatible_data.py | 1181 +-- 70 files changed, 43608 insertions(+), 3142 deletions(-) create mode 100644 scripts/addons/Do not Extract the .zip _ Install entire .zip as an addon.txt create mode 100644 scripts/addons/HoloMARI_MultiRender.py create mode 100644 scripts/addons/MARI_Advanced/Do not Extract the .zip _ Install entire .zip as an addon.txt create mode 100644 scripts/addons/MARI_Advanced/__init__.py create mode 100644 scripts/addons/cc_blender_tools-2_4_0/.gitignore delete mode 100644 scripts/addons/delete_withoutConfirm.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/INSTALL.txt create mode 100644 scripts/addons/form_affinity_maya_config_pro/README.md create mode 100644 scripts/addons/form_affinity_maya_config_pro/__init__.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/blender_manifest.toml create mode 100644 scripts/addons/form_affinity_maya_config_pro/fa_hotkeys_text.txt create mode 100644 scripts/addons/form_affinity_maya_config_pro/keyconfigs/__init__.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/keyconfigs/fa_hotkeys.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/keyconfigs/fa_hotkeys_data.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/ops/__init__.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/ops/animation_menu.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/ops/animation_timeline.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/ops/delete_ops.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/ops/deploy_ops.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/ops/marking_menu.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/ops/mesh_select_mode.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/ops/object_select.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/ops/quadview.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/ops/special_tools.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/ops/tab_switcher.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/panels/__init__.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/panels/panel_animation.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/panels/panel_pro.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/panels/panel_shelf.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/panels/panel_sidebar.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/panels/shelf_header.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/config/.gitkeep create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/config/startup.blend create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/config/userpref.blend create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/extensions/.cache/compat.dat create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/extensions/user_default/icon_viewer/__init__.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/extensions/user_default/icon_viewer/blender_manifest.toml create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/scripts/addons/IconOperator/.gitignore create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/scripts/addons/IconOperator/__init__.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/Blender_Dark.xml create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/Blender_Light.xml create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/maya_blue_theme.xml create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/maya_theme.xml create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/maya_theme_gradient.xml create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/modo_theme.xml create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/sketchup.xml create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/white_bg_theme.xml create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/keyconfig/Blender.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/keyconfig/Blender_27x.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/keyconfig/Industry_Compatible.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/keyconfig/fa_hotkeys.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/utils/__init__.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/utils/compat.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/utils/deploy.py create mode 100644 scripts/addons/form_affinity_maya_config_pro/utils/version.py diff --git a/config/bookmarks.txt b/config/bookmarks.txt index d87a305..151c109 100644 --- a/config/bookmarks.txt +++ b/config/bookmarks.txt @@ -10,13 +10,13 @@ D:\Work\9 iClone\Amazon\ D:\Amazon\00_external-files\ N:\1. CHARACTERS\remapping\ [Recent] +D:\2026-04-14 BCONNA2026_MARI\ +G:\Flamenco\renders\ +C:\Users\Nathan\Downloads\ +D:\portfolio\ P:\250827_FestivalTurf\Blends\animations\02 Preparing the Base\Watering Ground\ P:\250827_FestivalTurf\Assets\Blends\ T:\250827_FestivalTurf\Blends\animations\02 Preparing the Base\ P:\250827_FestivalTurf\Blends\animations\06 Infill And Powerbrooming\ A:\1 Amazon_Active_Projects\260127_Pick-and-Stage_2026_edits\Blends\stills\2025_old\img-BG\ A:\1 Amazon_Active_Projects\260127_Pick-and-Stage_2026_edits\Blends\stills\2025_old\ -A:\1 Amazon_Active_Projects\260326_RSR-Fluid-Unload\Blends\animations\ -P:\250827_FestivalTurf\Assets\ -P:\250827_FestivalTurf\Blends\animations\02 Preparing the Base\bakes\07_compacting\ -P:\250827_FestivalTurf\Blends\animations\02 Preparing the Base\ diff --git a/config/flamenco-manager-info.json b/config/flamenco-manager-info.json index a775d36..d94f814 100644 --- a/config/flamenco-manager-info.json +++ b/config/flamenco-manager-info.json @@ -1,15 +1,15 @@ { "flamenco_version": { - "version": "3.8.5", - "shortversion": "3.8.5", + "version": "3.8.2", + "shortversion": "3.8.2", "name": "Flamenco", - "git": "690bf6ce" + "git": "51a41a19" }, "shared_storage": { - "location": "F:\\jobs", + "location": "R:\\mnt\\user\\Cerberus Max\\Flamenco", "audience": "users", "platform": "windows", - "shaman_enabled": true + "shaman_enabled": false }, "job_types": { "job_types": [ @@ -283,6 +283,197 @@ "etag": "fe38e5ae9b3e640119d0d55fc7cbf4f8f15f2982", "description": "Create a viewport preview/playblast using Cycles OPTIX GPU rendering and generate a video file" }, + { + "name": "HoloMARI", + "label": "HoloMARI (MARI render_one)", + "settings": [ + { + "key": "mari_jobs_json", + "type": "string", + "description": "JSON object with a \"jobs\" array: {\"jobs\":[{\"cam_name\":...,\"H\":...,\"V\":...}, ...]}. Optional \"frame\" per job for ANIM.", + "eval": "__import__('json').dumps({'jobs':[{'cam_name':o.name,'H':int(o['H']),'V':int(o['V'])} for o in C.scene.objects if getattr(o,'type',None)=='CAMERA' and o.name.startswith('MARI_CAMERA') and 'H' in o.keys() and 'V' in o.keys()]})", + "eval_info": { + "show_link_button": true, + "description": "Auto-collect MARI cameras (name MARI_CAMERA*, custom props H,V). Matches MARI Advanced / HoloMARI job JSON." + }, + "required": true, + "visible": "submission" + }, + { + "key": "mari_action", + "type": "string", + "choices": [ + "STILL", + "ANIM" + ], + "default": "STILL", + "description": "MARI action passed to render_one / export_mari: STILL or ANIM", + "visible": "submission" + }, + { + "key": "mari_mode", + "type": "string", + "choices": [ + "CIRCLE", + "FRAME" + ], + "default": "CIRCLE", + "description": "MARI layout mode for export_mari type=FRAME|CIRCLE", + "eval": "(lambda m: 'FRAME' if str(m) == 'FRAME' else 'CIRCLE')(str(getattr(getattr(C.scene, 'mari_props', None), 'frame', 'CIRCLE') or 'CIRCLE'))", + "eval_info": { + "show_link_button": true, + "description": "FRAME vs CIRCLE from scene mari_props.frame" + }, + "required": true, + "visible": "submission" + }, + { + "key": "chunk_size", + "type": "int32", + "default": 1.0, + "description": "Number of MARI render_one units (cameras/frames) per Blender task", + "propargs": { + "max": 4096.0, + "min": 1.0 + }, + "visible": "submission" + }, + { + "key": "frames", + "type": "string", + "description": "Frame range for ANIM expansion. Examples: '47', '1-30'", + "eval": "f'{C.scene.frame_start}-{C.scene.frame_end}'", + "eval_info": { + "show_link_button": true, + "description": "Scene frame range (used when expanding ANIM image sequences)" + }, + "required": true + }, + { + "key": "frame_start", + "type": "int32", + "eval": "C.scene.frame_start", + "visible": "hidden" + }, + { + "key": "frame_end", + "type": "int32", + "eval": "C.scene.frame_end", + "visible": "hidden" + }, + { + "key": "frame_step", + "type": "int32", + "eval": "max(1, C.scene.frame_step)", + "visible": "hidden" + }, + { + "key": "render_output_root", + "type": "string", + "description": "Root folder for MARI output; images go under / (name comes from the scene, not this field).", + "required": true, + "subtype": "dir_path", + "visible": "submission" + }, + { + "key": "add_path_components", + "type": "int32", + "default": 0.0, + "description": "Number of path components of the current blend file to append under the render root", + "propargs": { + "max": 32.0, + "min": 0.0 + }, + "required": true, + "visible": "submission" + }, + { + "key": "render_output_path", + "type": "string", + "description": "Job artifact path (mari_job.txt). MARI JPEG/output folder = render_output_root + MARI folder name.", + "editable": false, + "eval": "str(Path(abspath(settings.render_output_root), last_n_dir_parts(settings.add_path_components), jobname, '{timestamp}', 'mari_job.txt'))", + "subtype": "file_path" + }, + { + "key": "mari_output_dir_abs", + "type": "string", + "description": "Absolute MARI output folder (render root + scene folder name); used by the zip step.", + "editable": false, + "eval": "str(Path(abspath(settings.render_output_root)) / str(getattr(getattr(C.scene, 'mari_props', None), 'render_settings_name', '') or '').strip())", + "visible": "hidden" + }, + { + "key": "mari_output_zip_abs", + "type": "string", + "description": "Absolute path for the final .zip next to the output folder.", + "editable": false, + "eval": "str(Path(abspath(settings.render_output_root)) / (str(getattr(getattr(C.scene, 'mari_props', None), 'render_settings_name', '') or '').strip() + '.zip'))", + "visible": "hidden" + }, + { + "key": "zip_render_output", + "type": "bool", + "default": true, + "description": "After all MARI chunk tasks finish, create a .zip of the output folder (requires a worker that runs misc tasks; uses tar).", + "required": false, + "visible": "submission" + }, + { + "key": "use_cycles_optix", + "type": "bool", + "default": false, + "description": "When enabled, sets Cycles preferences to OPTIX and scene Cycles device to GPU (same idea as cycles_optix_gpu.js).", + "label": "Cycles: OPTIX + GPU device", + "required": false, + "visible": "submission" + }, + { + "key": "experimental_gp3", + "type": "bool", + "description": "Experimental Flag: Grease Pencil 3", + "label": "Experimental: GPv3", + "required": false + }, + { + "key": "experimental_new_anim", + "type": "bool", + "description": "Experimental Flag: New Animation Data-block", + "label": "Experimental: Baklava", + "required": false + }, + { + "key": "blender_args_before", + "type": "string", + "description": "CLI arguments for Blender, placed before the .blend filename", + "label": "Blender CLI args: Before", + "required": false + }, + { + "key": "blender_args_after", + "type": "string", + "description": "CLI arguments for Blender, placed after the .blend filename", + "label": "After", + "required": false + }, + { + "key": "blendfile", + "type": "string", + "description": "Path of the Blend file", + "required": true, + "visible": "web" + }, + { + "key": "format", + "type": "string", + "eval": "C.scene.render.image_settings.file_format", + "required": true, + "visible": "web" + } + ], + "etag": "d19240e637ce81fab40f8e4218ce0249db67d95e", + "description": "MARI Advanced render_one batches (export .mari3d prep + per-camera jobs). Optional Cycles OPTIX+GPU setup (off by default)." + }, { "name": "TalkingHeads Custom Render", "label": "TalkingHeads Custom Render", @@ -326,6 +517,18 @@ "subtype": "dir_path", "visible": "submission" }, + { + "key": "daily_path", + "type": "string", + "description": "Daily folder name under the render root, e.g. 'daily_250813'. If empty, auto-fills to today's date.", + "eval": "__import__('datetime').datetime.now().strftime('daily_%y%m%d')", + "eval_info": { + "show_link_button": true, + "description": "Auto-fill with today's daily folder name" + }, + "required": false, + "visible": "submission" + }, { "key": "use_submodule", "type": "bool", @@ -352,7 +555,7 @@ "type": "string", "description": "Final file path of where render output will be saved", "editable": false, - "eval": "((lambda Path, abspath, os_path, settings_obj, jobname: str(Path(abspath(settings_obj.render_output_root or '//')) / (((str(settings_obj.submodule or '').strip()) if (settings_obj.use_submodule and str(settings_obj.submodule or '').strip()) else ((os_path.basename(os_path.dirname(bpy.data.filepath))) if settings_obj.use_submodule else ''))) / jobname / (jobname + '_######')))(__import__('pathlib').Path, __import__('os').path.abspath, __import__('os').path, settings, (job.name if 'job' in dir() and job and job.name else __import__('os').path.splitext(__import__('os').path.basename(bpy.data.filepath))[0])))", + "eval": "str(Path(abspath(settings.render_output_root or '//'), ((str(settings.submodule or '').strip()) if (settings.use_submodule and str(settings.submodule or '').strip()) else ((__import__('os').path.basename(__import__('os').path.dirname(bpy.data.filepath))) if settings.use_submodule else '')), (settings.daily_path or __import__('datetime').datetime.now().strftime('daily_%y%m%d')), jobname, jobname + '_######'))", "subtype": "file_path" }, { @@ -393,7 +596,7 @@ "visible": "web" } ], - "etag": "5f716e7195e55712daee20c237d95f748e2c3d1e", + "etag": "7773b03fd0d493d6d823d7d45bb3ef7f987384f3", "description": "Render a sequence of frames, and create a preview video file" }, { @@ -431,6 +634,18 @@ "subtype": "dir_path", "visible": "submission" }, + { + "key": "daily_path", + "type": "string", + "description": "Daily folder name under the render root, e.g. 'daily_250813'. If empty, auto-fills to today's date.", + "eval": "__import__('datetime').datetime.now().strftime('daily_%y%m%d')", + "eval_info": { + "show_link_button": true, + "description": "Auto-fill with today's daily folder name" + }, + "required": false, + "visible": "submission" + }, { "key": "use_submodule", "type": "bool", @@ -457,7 +672,7 @@ "type": "string", "description": "Final file path of where render output will be saved", "editable": false, - "eval": "((lambda Path, abspath, os_path, settings_obj, jobname: str(Path(abspath(settings_obj.render_output_root or '//')) / (((str(settings_obj.submodule or '').strip()) if (settings_obj.use_submodule and str(settings_obj.submodule or '').strip()) else ((os_path.basename(os_path.dirname(bpy.data.filepath))) if settings_obj.use_submodule else ''))) / jobname / (jobname + '_######')))(__import__('pathlib').Path, __import__('os').path.abspath, __import__('os').path, settings, (job.name if 'job' in dir() and job and job.name else __import__('os').path.splitext(__import__('os').path.basename(bpy.data.filepath))[0])))", + "eval": "str(Path(abspath(settings.render_output_root or '//'), ((str(settings.submodule or '').strip()) if (settings.use_submodule and str(settings.submodule or '').strip()) else ((__import__('os').path.basename(__import__('os').path.dirname(bpy.data.filepath))) if settings.use_submodule else '')), (settings.daily_path or __import__('datetime').datetime.now().strftime('daily_%y%m%d')), jobname, jobname + '_######'))", "subtype": "file_path" }, { @@ -526,7 +741,7 @@ "visible": "hidden" } ], - "etag": "758c56b672b0970896f30b85ee5165a5c096aec4", + "etag": "5e49db0874b8ee1211f6dbc0a59d66137b6996b2", "description": "OPTIX GPU rendering + extra checkboxes for some experimental features + extra CLI args for Blender" }, { diff --git a/config/platform_support.txt b/config/platform_support.txt index f2cb3f1..c90ce16 100644 --- a/config/platform_support.txt +++ b/config/platform_support.txt @@ -15,3 +15,5 @@ {NVIDIA Corporation/NVIDIA GeForce RTX 4080 SUPER/NVIDIA 595.79}=SUPPORTED {NVIDIA Corporation/NVIDIA GeForce RTX 4080 SUPER/PCIe/SSE2/4.6.0 NVIDIA 595.79}=SUPPORTED {NVIDIA Corporation/NVIDIA GeForce RTX 3090/NVIDIA 595.79}=SUPPORTED +{NVIDIA Corporation/NVIDIA GeForce GTX 1060 with Max-Q Design/NVIDIA 582.28}=SUPPORTED +{Intel/Intel(R) HD Graphics 630/4.6.0 - Build 27.20.100.9664}=SUPPORTED diff --git a/config/recent-files.txt b/config/recent-files.txt index 0f9a423..687992a 100644 --- a/config/recent-files.txt +++ b/config/recent-files.txt @@ -1,3 +1,9 @@ +D:\2026-04-14 BCONNA2026_MARI\Sample Stanford Bunny2.blend +D:\2026-04-14 BCONNA2026_MARI\Sample Stanford Bunny1.blend +C:\Users\Nathan\Downloads\Sample Stanford Bunny1.blend +C:\Users\Nathan\Downloads\Sample Stanford Bunny.blend +D:\portfolio\demo.blend +D:\2025-12-28 ytshorts gigaproj\Blends\animations\FreddyEpstein\FreddyEpstein.blend P:\250827_FestivalTurf\Blends\animations\02 Preparing the Base\06_Watering.blend T:\250827_FestivalTurf\Blends\animations\02 Preparing the Base\06_Watering.blend P:\250827_FestivalTurf\Blends\animations\06 Infill And Powerbrooming\Visual 2B_SPA.blend @@ -192,9 +198,3 @@ P:\260217_Jarvis-Defense\Blends\animations\Shot_4.blend P:\260217_Jarvis-Defense\Blends\animations\comp_RR\Shot_4a_holdout.blend P:\260217_Jarvis-Defense\Blends\animations\comp_RR\Shot_4_comp.blend F:\jobs\Shot_1b-qrzg\Shot_1.flamenco.blend -F:\jobs\Shot_1c-1rui\Shot_1.flamenco.blend -F:\jobs\Shot_7-qlk2\Shot_4.flamenco.blend -P:\260217_Jarvis-Defense\Assets\Blends\3075 Decade Dr.blend -P:\260217_Jarvis-Defense\Blends\animations\comp_RR\Shot_4_holdout.blend -P:\260217_Jarvis-Defense\Blends\animations\Shot_4_redo_fall.blend -P:\250827_FestivalTurf\Blends\animations\01 Develop Your Turf Plan\06_Closing.blend diff --git a/config/recent-searches.txt b/config/recent-searches.txt index 06cd2dfd59cc826787a6da3f518f6e6548d58227..974c8da790a8fd9fe239df782f6317b6000a0c3e 100644 GIT binary patch delta 66 zcmeA^!MNuH key implementation for Blender","archive_hash":"sha256:c12decbae172794c663e3019611f612b13936d41c6988b67d575d8d15f6b67f3","archive_size":179366,"archive_url":"https://extensions.blender.org/download/sha256:c12decbae172794c663e3019611f612b13936d41c6988b67d575d8d15f6b67f3/add-on-chordsong-v1.1.9.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/chordsong/","maintainer":"Cyrill-Vitkovskiy","license":["SPDX:GPL-3.0-or-later"],"tags":["Development"]},{"id":"hdri_lightbrush","schema_version":"1.0.0","name":"HDRI LightBrush","version":"1.0.1","tagline":"Paint HDRIs on 3D sphere for precise studio lighting control","archive_hash":"sha256:2dd62f9b14e0adbeb049c31a26e9b4c36230e6d57140b494c62d2f4d2ed8f5dc","archive_size":144003,"archive_url":"https://extensions.blender.org/download/sha256:2dd62f9b14e0adbeb049c31a26e9b4c36230e6d57140b494c62d2f4d2ed8f5dc/add-on-hdri-lightbrush-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/hdri-lightbrush/","maintainer":"CadTamas","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export HDRI files (.exr, .hdr, .jpg, .png)"},"tags":["Lighting","Paint"]},{"id":"ghostview","schema_version":"1.0.0","name":"GhostView","version":"1.0.2","tagline":"Adjust Window Opacity","archive_hash":"sha256:5cdb7039cbed497381072c413152cc571e9a6d37e92364fd2331d864785c7cc2","archive_size":1997,"archive_url":"https://extensions.blender.org/download/sha256:5cdb7039cbed497381072c413152cc571e9a6d37e92364fd2331d864785c7cc2/add-on-ghostview-v1.0.2-windows-x64-windows-arm64-macos-x64-macos-arm64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ghostview/","maintainer":"JR3DFUL","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64","windows-arm64","macos-x64","macos-arm64"],"tags":["User Interface","System"]},{"id":"gamepadcontrol","schema_version":"1.0.0","name":"Gamepad Control","version":"0.1.2","tagline":"Use gamepads as input device to control Blender","archive_hash":"sha256:91cd1c62ff1c6f009b15f2058627ca927f91ccc237ad1cfd5b59af71bd04cc62","archive_size":4828055,"archive_url":"https://extensions.blender.org/download/sha256:91cd1c62ff1c6f009b15f2058627ca927f91ccc237ad1cfd5b59af71bd04cc62/add-on-gamepadcontrol-v0.1.2-windows-x64.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/gamepadcontrol/","maintainer":"Frank-Moelendoerp","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export settings and controller modes"},"platforms":["windows-x64"],"tags":["System","User Interface"]},{"id":"LightNCreamy","schema_version":"1.0.0","name":"Light N Creamy","version":"1.0.0","tagline":"Modern light and creamy theme","archive_hash":"sha256:928d02674d7730a994fef538991896f42a3581c8ffe7d8cb5dfa60a1023a61f7","archive_size":3828,"archive_url":"https://extensions.blender.org/download/sha256:928d02674d7730a994fef538991896f42a3581c8ffe7d8cb5dfa60a1023a61f7/theme-lightncreamy-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/lightncreamy/","maintainer":"nova3D","license":["SPDX:GPL-2.0-or-later"],"tags":["Light"]},{"id":"PivotTools","schema_version":"1.0.0","name":"Pivot Tools","version":"1.48.13","tagline":"Fast pivot placement with Auto Pick, BBox targets, Saved Pivots","archive_hash":"sha256:c4457381883495799f87d72226140492d101fecadb9f3021309503feb74438f8","archive_size":8530,"archive_url":"https://extensions.blender.org/download/sha256:c4457381883495799f87d72226140492d101fecadb9f3021309503feb74438f8/add-on-pivottools-v1.48.13.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/pivottools/","maintainer":"Quinzy","license":["SPDX:GPL-3.0-or-later"]},{"id":"geo_nodes_guide","schema_version":"1.0.0","name":"Geo Nodes Guide","version":"0.1.0","tagline":"Live documentation and examples for Geometry Nodes","archive_hash":"sha256:4b6c3a38e41845e4af3c48ac96f991023802ec6fb472fb27f1b70252141ed792","archive_size":93537,"archive_url":"https://extensions.blender.org/download/sha256:4b6c3a38e41845e4af3c48ac96f991023802ec6fb472fb27f1b70252141ed792/add-on-geo-nodes-guide-v0.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/geo-nodes-guide/","maintainer":"Addonyte","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","User Interface","Geometry Nodes"]},{"id":"linkforge","schema_version":"1.0.0","name":"LinkForge","version":"1.3.4","tagline":"The Linter & Bridge for Robotics","archive_hash":"sha256:dbecb7d6f4561b7aa90a0094a2b0bbb84fa4746939ef522fd878e53cd64d69fd","archive_size":701639,"archive_url":"https://extensions.blender.org/download/sha256:dbecb7d6f4561b7aa90a0094a2b0bbb84fa4746939ef522fd878e53cd64d69fd/add-on-linkforge-v1.3.4-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/linkforge/","maintainer":"Arouna-Patouossa-Mounchili","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/Export URDF/XACRO files"},"platforms":["windows-x64"],"tags":["Import-Export","Rigging","Physics","Pipeline"]},{"id":"retarget","schema_version":"1.0.0","name":"Retarget","version":"4.0.4","tagline":"Retargeting, convert to Rigify, Action Manager, Animation tools","archive_hash":"sha256:ce962ec2dd929de10cf227e6509cc39eeb776257714565c0b5c9c5ec84ee638b","archive_size":188738,"archive_url":"https://extensions.blender.org/download/sha256:ce962ec2dd929de10cf227e6509cc39eeb776257714565c0b5c9c5ec84ee638b/add-on-retarget-v4.0.4.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/retarget/","maintainer":"KBS-DEV","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Copy the name and length of a FBX file from disk"},"tags":["Animation","Rigging"]},{"id":"lodify_optimizer","schema_version":"1.0.0","name":"LODify","version":"2.9.0","tagline":"Full-Scenario Perf Opt: Textures, Decimation & Viewport Mgmt","archive_hash":"sha256:55fbe2789e591ec0517cb12bcd437c75ec7a245b32356c714941ba2a997a4e62","archive_size":14089942,"archive_url":"https://extensions.blender.org/download/sha256:55fbe2789e591ec0517cb12bcd437c75ec7a245b32356c714941ba2a997a4e62/add-on-lodify-optimizer-v2.9.0-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/lodify-optimizer/","maintainer":"小T_sune","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Required to read and write texture files for resizing"},"platforms":["windows-x64"],"tags":["Object"]},{"id":"red_velvet_theme","schema_version":"1.0.0","name":"Red Velvet Theme","version":"1.0.0","tagline":"A cosmic red cyberpunk-inspired theme","archive_hash":"sha256:befa1a1df17476ad63283489e5f0ec497a548aacde2889e337b4b390444f0ab7","archive_size":5449,"archive_url":"https://extensions.blender.org/download/sha256:befa1a1df17476ad63283489e5f0ec497a548aacde2889e337b4b390444f0ab7/theme-red-velvet-theme-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/red-velvet-theme/","maintainer":"Thunder-Artist","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful","Inspired By"]},{"id":"outliner_preview","schema_version":"1.0.0","name":"Outliner Model Preview","version":"1.1.1","tagline":"Preview selected model in the Outliner","archive_hash":"sha256:723fc74ef862d5adb00696ea998e3b5aebccb0d8b1be265eecaefcbdb630a1b5","archive_size":31912,"archive_url":"https://extensions.blender.org/download/sha256:723fc74ef862d5adb00696ea998e3b5aebccb0d8b1be265eecaefcbdb630a1b5/add-on-outliner-preview-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/outliner-preview/","maintainer":"Shuimeng","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"ftw3dforge_image_projector","schema_version":"1.0.0","name":"FTW3DForge Image Projector","version":"2.1.0","tagline":"Project images onto 3D meshes with real-time preview and baking","archive_hash":"sha256:617174fdbacd5d088f727e257df211836bb8e56a8e133baf2e39ffa937ac8eaf","archive_size":16305,"archive_url":"https://extensions.blender.org/download/sha256:617174fdbacd5d088f727e257df211836bb8e56a8e133baf2e39ffa937ac8eaf/add-on-ftw3dforge-image-projector-v2.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/ftw3dforge-image-projector/","maintainer":"FTW3DForge","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import images from disk"},"tags":["UV","Mesh","Import-Export","Material"]},{"id":"smart_box_select","schema_version":"1.0.0","name":"Smart Box Select","version":"1.0.2","tagline":"Box/Lasso select with object activation","archive_hash":"sha256:3256c8631f9fd181e54271f3779eccfa601f014ce7b69154bb283584049172aa","archive_size":3800,"archive_url":"https://extensions.blender.org/download/sha256:3256c8631f9fd181e54271f3779eccfa601f014ce7b69154bb283584049172aa/add-on-smart-box-select-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/smart-box-select/","maintainer":"R4V3N","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface","3D View"]},{"id":"splashsurf_studio","schema_version":"1.0.0","name":"Splashsurf Studio","version":"1.0.1","tagline":"Surface reconstruction for particle-based fluid simulations","archive_hash":"sha256:86779180fe173ea75d43d3ff7cd72633b36444ed56b7412f5131f20f22696d9c","archive_size":2732095,"archive_url":"https://extensions.blender.org/download/sha256:86779180fe173ea75d43d3ff7cd72633b36444ed56b7412f5131f20f22696d9c/add-on-splashsurf-studio-v1.0.1-windows-x64.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/splashsurf-studio/","maintainer":"Fabian-Löschner","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Add Mesh","Mesh","Object"]},{"id":"global_copy_nodes","schema_version":"1.0.0","name":"Global Copy Nodes","version":"1.0.5","tagline":"Copy nodes across .blend projects","archive_hash":"sha256:64e8888b98b672b768e5a278c44a50912e2ed228472202306bfcf6fc37c7915e","archive_size":21986,"archive_url":"https://extensions.blender.org/download/sha256:64e8888b98b672b768e5a278c44a50912e2ed228472202306bfcf6fc37c7915e/add-on-global-copy-nodes-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/global-copy-nodes/","maintainer":"hisanimations","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Requires reading & writing node copy buffer to disk"},"tags":["System","Node"]},{"id":"overscan_addon","schema_version":"1.0.0","name":"Overscan Addon","version":"1.1.1","tagline":"Adds Overscan to your renders","archive_hash":"sha256:3c95e0eb67926e0a9d4f546b139aca201d56da18403a021f4dbd4c2964a47ddb","archive_size":6772,"archive_url":"https://extensions.blender.org/download/sha256:3c95e0eb67926e0a9d4f546b139aca201d56da18403a021f4dbd4c2964a47ddb/add-on-overscan-addon-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/overscan-addon/","maintainer":"eknath-kambagiri","license":["SPDX:GPL-3.0-or-later"],"tags":["Render"]},{"id":"sidebar_tab_search","schema_version":"1.0.0","name":"Sidebar Tab Search","version":"2.0.0","tagline":"Quick search and switch between Sidebar (N-Panel) tabs","archive_hash":"sha256:dd58ff4da0468f9084a2b77295d57413e93dd46b999e2a64770d11df2a3c8f32","archive_size":24561,"archive_url":"https://extensions.blender.org/download/sha256:dd58ff4da0468f9084a2b77295d57413e93dd46b999e2a64770d11df2a3c8f32/add-on-sidebar-tab-search-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sidebar-tab-search/","maintainer":"McKaa","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","User Interface"]},{"id":"gizmo_resizer","schema_version":"1.0.0","name":"Gizmo Resizer","version":"2.3.0","tagline":"Resize viewport Gizmo with Numpad keys","archive_hash":"sha256:cbbda09ab73548d968c137beea34fe7bcf34d60ba1f2da6d1fda5f592c2faafe","archive_size":15888,"archive_url":"https://extensions.blender.org/download/sha256:cbbda09ab73548d968c137beea34fe7bcf34d60ba1f2da6d1fda5f592c2faafe/add-on-gizmo-resizer-v2.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/gizmo-resizer/","maintainer":"CorentinBileau","license":["SPDX:GPL-3.0-or-later"]},{"id":"Mask_To_Vertex_Color_Pro","schema_version":"1.0.0","name":"MaskToVertexColorPro","version":"2.0.4","tagline":"Mask To VertexColor Pro Tools","archive_hash":"sha256:79eec742a3c6c6d91028f556dec034e26613e44bf3f612dc7ef3579a3a23460a","archive_size":30127,"archive_url":"https://extensions.blender.org/download/sha256:79eec742a3c6c6d91028f556dec034e26613e44bf3f612dc7ef3579a3a23460a/add-on-mask-to-vertex-color-pro-v2.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mask-to-vertex-color-pro/","maintainer":"墨泪MoLei_VFX","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import images are required as masks"},"tags":["Paint","Material"]},{"id":"b_guides","schema_version":"1.0.0","name":"B Guides","version":"1.0.1","tagline":"composition with guides and rulers for the VSE and 3D Viewport","archive_hash":"sha256:d6ca584e4e52414643f5da441ec87ccde6177e522a4bbce281f9861b67825f57","archive_size":24706,"archive_url":"https://extensions.blender.org/download/sha256:d6ca584e4e52414643f5da441ec87ccde6177e522a4bbce281f9861b67825f57/add-on-b-guides-v1.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/b-guides/","maintainer":"Dinesh007","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Camera","Sequencer"]},{"id":"selection_mode_cycler","schema_version":"1.0.0","name":"Selection Mode Cycler","version":"1.1.0","tagline":"Cycles through mesh selection modes in Edit Mode","archive_hash":"sha256:80a605bad154cec84404fa1f3a5b9db50846912d98fe07b5d790a03843d4ba12","archive_size":1414,"archive_url":"https://extensions.blender.org/download/sha256:80a605bad154cec84404fa1f3a5b9db50846912d98fe07b5d790a03843d4ba12/add-on-selection-mode-cycler-v1.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/selection-mode-cycler/","maintainer":"Lise-2","license":["SPDX:GPL-3.0-or-later"]},{"id":"colornova","schema_version":"1.0.0","name":"COLOR-NOVA // SPECTRAL UV | M-87","version":"1.0.1","tagline":"Essential UV contrast. Absolute clarity for professional focus","archive_hash":"sha256:576cbbbabfcee8185c036eecd82778dacc608cf8ca104a7982374b27300662bc","archive_size":6257,"archive_url":"https://extensions.blender.org/download/sha256:576cbbbabfcee8185c036eecd82778dacc608cf8ca104a7982374b27300662bc/theme-colornova-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/colornova/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By","High Contrast","Colorful"]},{"id":"select_similar_geometry","schema_version":"1.0.0","name":"Select Similar Geometry","version":"1.3.0","tagline":"Select objects by percentage of matching vertices","archive_hash":"sha256:549558b40ebcb9135cc6634abaedb5e7fffb8cd901fbc209543e484c79e05d21","archive_size":397646,"archive_url":"https://extensions.blender.org/download/sha256:549558b40ebcb9135cc6634abaedb5e7fffb8cd901fbc209543e484c79e05d21/add-on-select-similar-geometry-v1.3.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/select-similar-geometry/","maintainer":"JuanRomero","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh"]},{"id":"matgeo","schema_version":"1.0.0","name":"MatGeo","version":"1.0.0","tagline":"Convert Materials to Geometry Nodes","archive_hash":"sha256:8c636cfb2e778681acb09b8222e94284a2a90f5735a4344ab7f6cc3bb6272556","archive_size":9103,"archive_url":"https://extensions.blender.org/download/sha256:8c636cfb2e778681acb09b8222e94284a2a90f5735a4344ab7f6cc3bb6272556/add-on-matgeo-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/matgeo/","maintainer":"JR3DFUL","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","Geometry Nodes","Node"]},{"id":"Cross_Select","schema_version":"1.0.0","name":"Cross Select","version":"1.0.9","tagline":"Select scene objects similar like RHINO or CAD","archive_hash":"sha256:ccbb3398ed55e2eca34b16af8e2d6a449b01711f2f912960a62a708b9fd70f9d","archive_size":71100,"archive_url":"https://extensions.blender.org/download/sha256:ccbb3398ed55e2eca34b16af8e2d6a449b01711f2f912960a62a708b9fd70f9d/add-on-cross-select-v1.0.9.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cross-select/","maintainer":"RARA","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","3D View","Scene","Node"]},{"id":"Dark_3d","schema_version":"1.0.0","name":"Dark 3d","version":"1.0.0","tagline":"Shaded Buttons","archive_hash":"sha256:85287c4f042cee529776e3307774d0c0084b76b6d1026a3eb4a526119cbe64ad","archive_size":6664,"archive_url":"https://extensions.blender.org/download/sha256:85287c4f042cee529776e3307774d0c0084b76b6d1026a3eb4a526119cbe64ad/theme-dark-3d-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/dark-3d/","maintainer":"SammyTheBest","license":["SPDX:GPL-3.0-or-later"]},{"id":"bone_math","schema_version":"1.0.0","name":"Bone Math","version":"0.1.0","tagline":"Calculate pole angles, plus other bone related math","archive_hash":"sha256:bffa46d552cc35629cededdab661852c6cfaf195224693423343d36233f9be3c","archive_size":4795,"archive_url":"https://extensions.blender.org/download/sha256:bffa46d552cc35629cededdab661852c6cfaf195224693423343d36233f9be3c/add-on-bone-math-v0.1.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/bone-math/","maintainer":"Xury46","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"surface_diagnostics","schema_version":"1.0.0","name":"Surface Diagnostics","version":"1.4.3","tagline":"Set of tools for diagnosing surface quality","archive_hash":"sha256:962fd2c89467104fae0bf139c1118e079fa7ff65ae8fbf692c741e2ef6c0d103","archive_size":1241115,"archive_url":"https://extensions.blender.org/download/sha256:962fd2c89467104fae0bf139c1118e079fa7ff65ae8fbf692c741e2ef6c0d103/add-on-surface-diagnostics-v1.4.3.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/surface-diagnostics/","maintainer":"JLBöhm","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","3D View","Geometry Nodes"]},{"id":"savepoints","schema_version":"1.0.0","name":"SavePoints","version":"1.5.2","tagline":"Visual version control, easy restore, and automatic timelapse","archive_hash":"sha256:a3299c0dde53838e75fd7f4c75750f4cfc579203ea0382fcc55484f37f9d9cab","archive_size":100533,"archive_url":"https://extensions.blender.org/download/sha256:a3299c0dde53838e75fd7f4c75750f4cfc579203ea0382fcc55484f37f9d9cab/add-on-savepoints-v1.5.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/savepoints/","maintainer":"unclepomedev","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Create version history and move deleted versions to trash"},"tags":["System","Pipeline","Render"]},{"id":"sprite_sheet_maker","schema_version":"1.0.0","name":"Sprite Sheet Maker","version":"4.0.2","tagline":"3D to 2D sprite sheet converter with optional pixelation","archive_hash":"sha256:b7c69101f2d24f799b4a6f289cf86a99a597a8a8a9c12e0db30bfdfc932e7f76","archive_size":7096281,"archive_url":"https://extensions.blender.org/download/sha256:b7c69101f2d24f799b4a6f289cf86a99a597a8a8a9c12e0db30bfdfc932e7f76/add-on-sprite-sheet-maker-v4.0.2-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sprite-sheet-maker/","maintainer":"manas-R.-Makde","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Animation","Render"]},{"id":"kanagawa","schema_version":"1.0.0","name":"Kanagawa","version":"1.0.1","tagline":"kanagawa.nvim for Blender","archive_hash":"sha256:6ed495278dc7aa6b6de08cf43f8407fb6afc06eef1d3c6f093413d156e01f22d","archive_size":6190,"archive_url":"https://extensions.blender.org/download/sha256:6ed495278dc7aa6b6de08cf43f8407fb6afc06eef1d3c6f093413d156e01f22d/theme-kanagawa-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/kanagawa/","maintainer":"timberlinefpv","license":["SPDX:GPL-3.0-or-later"]},{"id":"rendercue","schema_version":"1.0.0","name":"RenderCue","version":"1.1.3","tagline":"Sequence. Queue. Render","archive_hash":"sha256:97fbabec32217c2438adda789ab6ef8a5beac6b90ac06fae3def010b47d2ba2b","archive_size":52378,"archive_url":"https://extensions.blender.org/download/sha256:97fbabec32217c2438adda789ab6ef8a5beac6b90ac06fae3def010b47d2ba2b/add-on-rendercue-v1.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/rendercue/","maintainer":"UsamaSQ","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save renders to user-defined directories","network":"Send render notifications via Webhooks"},"tags":["Render","Pipeline"]},{"id":"io_scene_owm","schema_version":"1.0.0","name":"OWM Import","version":"3.3.0","tagline":"Import files from the Overwatch extraction tools (DataTool)","archive_hash":"sha256:13c5cbe0fe6110056e3a09fa38ff3cf7d3b7b684367b6b96b43cf20f4be6fe44","archive_size":279606,"archive_url":"https://extensions.blender.org/download/sha256:13c5cbe0fe6110056e3a09fa38ff3cf7d3b7b684367b6b96b43cf20f4be6fe44/add-on-io-scene-owm-v3.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-scene-owm/","maintainer":"overtools","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Importing files from disk"},"tags":["Import-Export"]},{"id":"windows_xp_theme","schema_version":"1.0.0","name":"Windows XP","version":"1.0.2","tagline":"A light theme directly inspired by Windows XP","archive_hash":"sha256:181d42a7984e1399b99e221dfe3a90669d4733833768b98876fd2eafc4586bc4","archive_size":6815,"archive_url":"https://extensions.blender.org/download/sha256:181d42a7984e1399b99e221dfe3a90669d4733833768b98876fd2eafc4586bc4/theme-windows-xp-theme-v1.0.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/windows-xp-theme/","maintainer":"Alkalide","license":["SPDX:GPL-3.0-or-later"],"tags":["Light","Colorful","Inspired By"]},{"id":"ZZZ","schema_version":"1.0.0","name":"ZZZ Theme","version":"1.0.1","tagline":"High-contrast dark theme with Zenless Zone Zero's signature","archive_hash":"sha256:c8dabb06a7b621ccd164b2de14001434b7fe9db60528059c65124a879371d29f","archive_size":5472,"archive_url":"https://extensions.blender.org/download/sha256:c8dabb06a7b621ccd164b2de14001434b7fe9db60528059c65124a879371d29f/theme-zzz-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/zzz/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By","High Contrast"]},{"id":"Cyberpunk2077","schema_version":"1.0.0","name":"Cyberpunk 2077","version":"1.2.2","tagline":"A Cyberpunk 2077 theme for Blender","archive_hash":"sha256:ef1b9805013640d1b463f162ff694e152b05a5e6c715154af6b22593d64009ef","archive_size":5852,"archive_url":"https://extensions.blender.org/download/sha256:ef1b9805013640d1b463f162ff694e152b05a5e6c715154af6b22593d64009ef/theme-cyberpunk2077-v1.2.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/cyberpunk2077/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"mintLavender","schema_version":"1.0.0","name":"Mint Lavender Chill","version":"1.0.3","tagline":"A Mint lavender theme for Blender with Lo-fi aesthetics","archive_hash":"sha256:ef19c6ebaa1e1aaaeb81956ecbe44bc70fcaaaa86c33df6f72f0a3e1954970e5","archive_size":5321,"archive_url":"https://extensions.blender.org/download/sha256:ef19c6ebaa1e1aaaeb81956ecbe44bc70fcaaaa86c33df6f72f0a3e1954970e5/theme-mintlavender-v1.0.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/mintlavender/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"sleek_navy","schema_version":"1.0.0","name":"Sleek Navy","version":"1.0.0","tagline":"A clean dark-blue Blender theme","archive_hash":"sha256:d285940ff5d39d4f6a08ac6ce575fbb4c37448322def695c85863b9d272d7420","archive_size":5546,"archive_url":"https://extensions.blender.org/download/sha256:d285940ff5d39d4f6a08ac6ce575fbb4c37448322def695c85863b9d272d7420/theme-sleek-navy-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/sleek-navy/","maintainer":"Martel6ix","license":["SPDX:MIT"]},{"id":"multirow","schema_version":"1.0.0","name":"Multirow","version":"1.0.1","tagline":"Text strips with line break","archive_hash":"sha256:c619e40e99055c804c1033d48d851f0415b75ad22a03b1a1922c8c93159317f1","archive_size":4445,"archive_url":"https://extensions.blender.org/download/sha256:c619e40e99055c804c1033d48d851f0415b75ad22a03b1a1922c8c93159317f1/add-on-multirow-v1.0.1.zip","type":"add-on","blender_version_min":"4.4.3","website":"https://extensions.blender.org/add-ons/multirow/","maintainer":"flakmoppen","license":["SPDX:GPL-3.0-or-later"],"tags":["Sequencer","Text Editor","User Interface"]},{"id":"viewport_camera_positions","schema_version":"1.0.0","name":"Lutaya Viewport Camera","version":"1.0.1","tagline":"Save and switch between camera positions with orthographic views","archive_hash":"sha256:ede7461b4a2d43a0f6f97d17c5d27ef056bc55901608d83dcb46f6c0c832f71b","archive_size":4336,"archive_url":"https://extensions.blender.org/download/sha256:ede7461b4a2d43a0f6f97d17c5d27ef056bc55901608d83dcb46f6c0c832f71b/add-on-viewport-camera-positions-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/viewport-camera-positions/","maintainer":"3D_SHVYREV","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save and load camera position configurations"},"tags":["3D View","Camera"]},{"id":"sequence_loader","schema_version":"1.0.0","name":"Sequence Loader","version":"0.4.0","tagline":"Just-in-time loader for meshio-supported mesh file sequences","archive_hash":"sha256:20c6e8c30cd2c2aa4be1c56817a32562680841c20df0b7a6cff103d543f566ff","archive_size":629459,"archive_url":"https://extensions.blender.org/download/sha256:20c6e8c30cd2c2aa4be1c56817a32562680841c20df0b7a6cff103d543f566ff/add-on-sequence-loader-v0.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sequence-loader/","maintainer":"Stefan-Jeske","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Core functionality to load files from disk"},"tags":["Import-Export"]},{"id":"Studio_Dark","schema_version":"1.0.0","name":"Studio Dark","version":"2.3.1","tagline":"Consistent UI, sharp colors, comfortable contrast, 3 birght lvls","archive_hash":"sha256:3996c81126cbe05087cd1c9d22ef0058e6e91613bb180f084f3338de3da18817","archive_size":5460,"archive_url":"https://extensions.blender.org/download/sha256:3996c81126cbe05087cd1c9d22ef0058e6e91613bb180f084f3338de3da18817/theme-studio-dark-v2.3.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/studio-dark/","maintainer":"3DDinosaur","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"automata_theme","schema_version":"1.0.0","name":"Automata","version":"2.0.0","tagline":"NieR inspired theme","archive_hash":"sha256:7999157fafef87293070f20c98d798e754bf156147cdc753687ffba29bb7a198","archive_size":5950,"archive_url":"https://extensions.blender.org/download/sha256:7999157fafef87293070f20c98d798e754bf156147cdc753687ffba29bb7a198/theme-automata-theme-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/automata-theme/","maintainer":"NSA-Cloud","license":["SPDX:GPL-3.0-or-later"]},{"id":"ani_offset","schema_version":"1.0.0","name":"Ani Offset","version":"3.2.2","tagline":"Propagate pose offsets across selected keyframes","archive_hash":"sha256:6bf4ed70b657094558e0f01616facd761d74d8e7d97b03a55e42cbeec3db3154","archive_size":3526,"archive_url":"https://extensions.blender.org/download/sha256:6bf4ed70b657094558e0f01616facd761d74d8e7d97b03a55e42cbeec3db3154/add-on-ani-offset-v3.2.2.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/ani-offset/","maintainer":"Drika111","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"asset_optimizer","schema_version":"1.0.0","name":"Game Asset Optimizer","version":"1.0.2","tagline":"Optimize 3D models for Unity and Unreal Engine workflows","archive_hash":"sha256:909b4c1e85e93f5c4aefbdd519d14e05a6435dbd5361301373c84c64c3f7fc2b","archive_size":19580,"archive_url":"https://extensions.blender.org/download/sha256:909b4c1e85e93f5c4aefbdd519d14e05a6435dbd5361301373c84c64c3f7fc2b/add-on-asset-optimizer-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/asset-optimizer/","maintainer":"Sudip-Soni","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export optimized assets for Unity and Unreal Engine"},"tags":["Modeling","Mesh","Pipeline"]},{"id":"k_tools_texture_map_loader","schema_version":"1.0.0","name":"K-Tools: Texture Map Loader","version":"1.0.9","tagline":" An easy way to load Texture Sets in your Shader Material","archive_hash":"sha256:62e0fc38604cdc93959225380e2f70070adfe16da37b8c32fb2089f89a881495","archive_size":787239,"archive_url":"https://extensions.blender.org/download/sha256:62e0fc38604cdc93959225380e2f70070adfe16da37b8c32fb2089f89a881495/add-on-k-tools-texture-map-loader-v1.0.9.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/k-tools-texture-map-loader/","maintainer":"Robert-Kezives","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load Node Groups from disk"},"tags":["Material"]},{"id":"turntable_camera","schema_version":"1.0.0","name":"Turntable Camera","version":"0.1.2","tagline":"Camera Turntable Setup","archive_hash":"sha256:fa20577f3c12d4b6dd05802b7aacf3dd8d433753fc19b3bb8da3adb23ac2b3c5","archive_size":17413,"archive_url":"https://extensions.blender.org/download/sha256:fa20577f3c12d4b6dd05802b7aacf3dd8d433753fc19b3bb8da3adb23ac2b3c5/add-on-turntable-camera-v0.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/turntable-camera/","maintainer":"The_Missing_Field","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"copy_paste_nodes","schema_version":"1.0.0","name":"Copy/Paste Nodes","version":"0.1.6","tagline":"Copy nodes to and from the system clipboard as JSON","archive_hash":"sha256:3c09cea629616ed5c8ad8b4944a5c23eb4a9043931070bdff18ea19d630f5975","archive_size":10745,"archive_url":"https://extensions.blender.org/download/sha256:3c09cea629616ed5c8ad8b4944a5c23eb4a9043931070bdff18ea19d630f5975/add-on-copy-paste-nodes-v0.1.6.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/copy-paste-nodes/","maintainer":"david494","license":["SPDX:GPL-3.0-or-later"],"permissions":{"clipboard":"Copy and paste nodes to the clipboard"},"tags":["Node"]},{"id":"mixamo_rig","schema_version":"1.0.0","name":"Mixamo Rig","version":"1.1.9","tagline":"Generate a control rig from Mixamo Fbx skeleton","archive_hash":"sha256:c151cb8edfd8806247fba7bae2ac42c97c4a755862c6ec57f7c87ed530cc1950","archive_size":172274,"archive_url":"https://extensions.blender.org/download/sha256:c151cb8edfd8806247fba7bae2ac42c97c4a755862c6ec57f7c87ed530cc1950/add-on-mixamo-rig-v1.1.9.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.5.999","website":"https://extensions.blender.org/add-ons/mixamo-rig/","maintainer":"tyler.tofu","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Rigging"]},{"id":"img2mat_pro","schema_version":"1.0.0","name":"img2mat_pro","version":"1.10.0","tagline":"Extract color materials and paint palettes from images","archive_hash":"sha256:63cc939853b7d1657b88026f815565e374ed7c8662bbe03c2359be744e855990","archive_size":9875,"archive_url":"https://extensions.blender.org/download/sha256:63cc939853b7d1657b88026f815565e374ed7c8662bbe03c2359be744e855990/add-on-img2mat-pro-v1.10.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/img2mat-pro/","maintainer":"stevewarner","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","User Interface","Pipeline"]},{"id":"anim_reviewer","schema_version":"1.0.0","name":"Anim Reviewer","version":"1.0.3","tagline":"Enhance blender playblast capabilities for animation review","archive_hash":"sha256:09d01a3117cb094810485651788cf5801690a565ce4b30fb2754f472919be5b5","archive_size":1335044,"archive_url":"https://extensions.blender.org/download/sha256:09d01a3117cb094810485651788cf5801690a565ce4b30fb2754f472919be5b5/add-on-anim-reviewer-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/anim-reviewer/","maintainer":"FhyTan","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save playblast videos in specified output folder"},"tags":["3D View","Animation","Camera","Pipeline"]},{"id":"export_render_as_dng","schema_version":"1.0.0","name":"Export Render as DNG","version":"1.0.2","tagline":"Export renders and images as Bayer-style DNG files","archive_hash":"sha256:f856182d2c346ade4c2a86e4969f7f3d4851c9c75c653ae97edb797d9e71df85","archive_size":25960,"archive_url":"https://extensions.blender.org/download/sha256:f856182d2c346ade4c2a86e4969f7f3d4851c9c75c653ae97edb797d9e71df85/add-on-export-render-as-dng-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/export-render-as-dng/","maintainer":"FloBEAUG","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export DNG to disk"}},{"id":"Origin_move_like_maya","schema_version":"1.0.0","name":"Origin_move_like_maya (Press D)","version":"1.4.0","tagline":"Move pivot independently with snapping and gizmo like maya","archive_hash":"sha256:5e718aa81233aba65fd1aa186cb1588d551da1b21509fa373d75f11e29c17534","archive_size":3563,"archive_url":"https://extensions.blender.org/download/sha256:5e718aa81233aba65fd1aa186cb1588d551da1b21509fa373d75f11e29c17534/add-on-origin-move-like-maya-v1.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/origin-move-like-maya/","maintainer":"deepak756","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Modeling","Mesh"]},{"id":"printing_helper","schema_version":"1.0.0","name":"Printing Helper","version":"0.1.2","tagline":"Set the resolution required for printing more simply","archive_hash":"sha256:3c3a5ea8c40c1cf91c3102b5c7d690ef8ae38a6a562daf4f2200574c2faabeae","archive_size":12655,"archive_url":"https://extensions.blender.org/download/sha256:3c3a5ea8c40c1cf91c3102b5c7d690ef8ae38a6a562daf4f2200574c2faabeae/add-on-printing-helper-v0.1.2.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/printing-helper/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"tags":["Render","Camera"]},{"id":"bh_smart_sym","schema_version":"1.0.0","name":"BH Smart Sym","version":"0.9.0","tagline":"Interactive 3D arrows for quick face symmetrize","archive_hash":"sha256:ce7b895d47814b9d85ac9401d04fbd7172df8236fcf2b0313549b8c419e36c34","archive_size":5272,"archive_url":"https://extensions.blender.org/download/sha256:ce7b895d47814b9d85ac9401d04fbd7172df8236fcf2b0313549b8c419e36c34/add-on-bh-smart-sym-v0.9.0.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/bh-smart-sym/","maintainer":"bogatyr4ik","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh"]},{"id":"camera_aspect_ratio_guides","schema_version":"1.0.0","name":"Camera Aspect Ratio Guides","version":"2.0.0","tagline":"Professional composition guides with safe areas","archive_hash":"sha256:50bae340eccf1df4cc77e0a2667e08f8ba9f7c894fce9c5854e0f0dd5b29c394","archive_size":11678,"archive_url":"https://extensions.blender.org/download/sha256:50bae340eccf1df4cc77e0a2667e08f8ba9f7c894fce9c5854e0f0dd5b29c394/add-on-camera-aspect-ratio-guides-v2.0.0.zip","type":"add-on","blender_version_min":"5.0.0","blender_version_max":"5.5.0","website":"https://extensions.blender.org/add-ons/camera-aspect-ratio-guides/","maintainer":"Prince_Eagle","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Modify compositor nodes for render burn-in"},"tags":["Camera","Render","Compositing"]},{"id":"theme_GoldExperience","schema_version":"1.0.0","name":"Gold Experience","version":"1.0.1","tagline":"A theme if you really like yellow","archive_hash":"sha256:db35f8251ffa5d13b313a05f3032c11a991e2a1dfc786b8765db7351d2e54cdb","archive_size":5811,"archive_url":"https://extensions.blender.org/download/sha256:db35f8251ffa5d13b313a05f3032c11a991e2a1dfc786b8765db7351d2e54cdb/theme-theme-goldexperience-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-goldexperience/","maintainer":"lonku","license":["SPDX:GPL-2.0-or-later"],"tags":["Light","Colorful","Inspired By"]},{"id":"catppucin4blender","schema_version":"1.0.0","name":"Catppuccin Theme","version":"5.1.5","tagline":"Catppuccin for Blender","archive_hash":"sha256:07cfa54f72bd154b178e98d4dd49a722de9f35fe2c1104aa214c61116226a875","archive_size":7103,"archive_url":"https://extensions.blender.org/download/sha256:07cfa54f72bd154b178e98d4dd49a722de9f35fe2c1104aa214c61116226a875/theme-catppucin4blender-v5.1.5.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/catppucin4blender/","maintainer":"Albert-Bici","license":["SPDX:GPL-3.0-or-later"],"tags":["Inspired By","Dark","Colorful"]},{"id":"camerafly","schema_version":"1.0.0","name":"Camerafly","version":"2.1.4","tagline":"Fly around with the Dolly Rig of the Camera Rigs Addon","archive_hash":"sha256:f4557b9a94427680ca9642e734b0b41b428c9b7575f114b31a751fbe6710affe","archive_size":22817,"archive_url":"https://extensions.blender.org/download/sha256:f4557b9a94427680ca9642e734b0b41b428c9b7575f114b31a751fbe6710affe/add-on-camerafly-v2.1.4-windows-x64-windows-arm64-macos-arm64-macos-x64-linux-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/camerafly/","maintainer":"MichaelSchieber","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64","windows-arm64","macos-arm64","macos-x64","linux-x64"],"tags":["Camera"]},{"id":"face_angle_analyzer","schema_version":"1.0.0","name":"Face Angle Analyzer","version":"8.9.4","tagline":"Measure and visualize face angles against global axes","archive_hash":"sha256:1baab0b6e6ccf88eae5596845af184a14c4fdaac57d192e1be37163aea553bb0","archive_size":6292,"archive_url":"https://extensions.blender.org/download/sha256:1baab0b6e6ccf88eae5596845af184a14c4fdaac57d192e1be37163aea553bb0/add-on-face-angle-analyzer-v8.9.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/face-angle-analyzer/","maintainer":"Astralis","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface","3D View"]},{"id":"rigi_all","schema_version":"1.0.0","name":"Rigi-All","version":"1.6.0","tagline":"Speeds up the Rigify process","archive_hash":"sha256:f8cc4ee95bbb5e9d028459e6f381e7f1255708c5d38b490cf9e754e5f269ecbd","archive_size":154196,"archive_url":"https://extensions.blender.org/download/sha256:f8cc4ee95bbb5e9d028459e6f381e7f1255708c5d38b490cf9e754e5f269ecbd/add-on-rigi-all-v1.6.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/rigi-all/","maintainer":"hisanimations","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"Quick_Asset_Saver","schema_version":"1.0.0","name":"Quick Asset Manager","version":"2.0.3","tagline":"Quickly Create, Edit, Organize, or Delete your local asset files","archive_hash":"sha256:34196edd29b75d18cca2c3cd001fa751781314ee608d025ef702669cee0b5973","archive_size":66307,"archive_url":"https://extensions.blender.org/download/sha256:34196edd29b75d18cca2c3cd001fa751781314ee608d025ef702669cee0b5973/add-on-quick-asset-saver-v2.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-asset-saver/","maintainer":"Clonephaze","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"To read and write to asset library directories"},"tags":["User Interface","System"]},{"id":"bone_widget","schema_version":"1.0.0","name":"Bone Widget","version":"2.3.3","tagline":"Easily Create Bone Widgets","archive_hash":"sha256:782bc123b494fd568b4400735d59d279e23610c4d57a33b3052ceed893726970","archive_size":293994,"archive_url":"https://extensions.blender.org/download/sha256:782bc123b494fd568b4400735d59d279e23610c4d57a33b3052ceed893726970/add-on-bone-widget-v2.3.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bone-widget/","maintainer":"WayneDixon","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export json and image files from/to disk"},"tags":["Rigging"]},{"id":"toothpaste","schema_version":"1.0.0","name":"ToothPaste (Paste SVGs)","version":"1.1.5","tagline":"Paste SVG from Clipboard as Grease Pencil or Curves","archive_hash":"sha256:ab122c6b6be19062da353b25e8339b847ee12d0c88ed8f39fb5463f52d9e2292","archive_size":122169,"archive_url":"https://extensions.blender.org/download/sha256:ab122c6b6be19062da353b25e8339b847ee12d0c88ed8f39fb5463f52d9e2292/add-on-toothpaste-v1.1.5.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/toothpaste/","maintainer":"Todor-Hlebarov","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import SVG assets and temporary files for text and image support","clipboard":"Paste SVG data from Clipboard"},"tags":["Grease Pencil","Import-Export"]},{"id":"Bone_Animation_Copy_Tool","schema_version":"1.0.0","name":"Bone Animation Copy Tool","version":"1.1.5","tagline":"Copy animation between armatures using bone constraints","archive_hash":"sha256:88a3155787f7257b4d696d7b84b8a64b68e8ac9f456c4bce79edd129b055a5f2","archive_size":9772,"archive_url":"https://extensions.blender.org/download/sha256:88a3155787f7257b4d696d7b84b8a64b68e8ac9f456c4bce79edd129b055a5f2/add-on-bone-animation-copy-tool-v1.1.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bone-animation-copy-tool/","maintainer":"maylog","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"orbiter","schema_version":"1.0.0","name":"Orbiter","version":"1.1.0","tagline":"Orbit around objects in the viewport","archive_hash":"sha256:a50f42981a2273110cb9af1a508b0573f4e08b21f67bb76c5d91ec6ad4af680a","archive_size":3393,"archive_url":"https://extensions.blender.org/download/sha256:a50f42981a2273110cb9af1a508b0573f4e08b21f67bb76c5d91ec6ad4af680a/add-on-orbiter-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/orbiter/","maintainer":"TFMSTYLE","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"spline_generator","schema_version":"1.0.0","name":"Spline Generator","version":"1.0.3","tagline":"Generate parametric spline","archive_hash":"sha256:129cc2a92f5d127bd8d1c15f9766183a1fa25aaa69eda144ef27f47b50315145","archive_size":8307,"archive_url":"https://extensions.blender.org/download/sha256:129cc2a92f5d127bd8d1c15f9766183a1fa25aaa69eda144ef27f47b50315145/add-on-spline-generator-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/spline-generator/","maintainer":"TFMSTYLE","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Add Curve"]},{"id":"beautiful_dream","schema_version":"1.0.0","name":"Beautiful Dream","version":"1.0.4","tagline":"This is a variant of Whispering Ripples","archive_hash":"sha256:b031691f25fe0d394c43a6837bdaaa91868986486dd863d5ea7ddfd178f4fa96","archive_size":5810,"archive_url":"https://extensions.blender.org/download/sha256:b031691f25fe0d394c43a6837bdaaa91868986486dd863d5ea7ddfd178f4fa96/theme-beautiful-dream-v1.0.4.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/beautiful-dream/","maintainer":"KBS-DEV","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"graph_generator","schema_version":"1.0.0","name":"Graph Generator","version":"1.2.2","tagline":"Generate graph between saved keyframes","archive_hash":"sha256:6f8a49aa275a16a70cd75db50d1bbecdc4dc4f0b9d6fd3173a10e7b8967cafe4","archive_size":9526,"archive_url":"https://extensions.blender.org/download/sha256:6f8a49aa275a16a70cd75db50d1bbecdc4dc4f0b9d6fd3173a10e7b8967cafe4/add-on-graph-generator-v1.2.2.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/graph-generator/","maintainer":"TFMSTYLE","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"wisteria","schema_version":"1.0.0","name":"Wisteria","version":"1.0.1","tagline":"Gray with hints of purple","archive_hash":"sha256:d551b27cc0ee87125c02ecc9f22243bf0db7f8f7ffb64a70cca982ecc182a915","archive_size":5690,"archive_url":"https://extensions.blender.org/download/sha256:d551b27cc0ee87125c02ecc9f22243bf0db7f8f7ffb64a70cca982ecc182a915/theme-wisteria-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/wisteria/","maintainer":"cmzw","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"trajectory_anim","schema_version":"1.0.0","name":"Trajectory Anim","version":"1.2.1","tagline":"Animate quickly by drawing trajectory line","archive_hash":"sha256:3185af4b475175a5cddef7f87745943bd3a7224daba5d4416425476a5245bc9d","archive_size":43987,"archive_url":"https://extensions.blender.org/download/sha256:3185af4b475175a5cddef7f87745943bd3a7224daba5d4416425476a5245bc9d/add-on-trajectory-anim-v1.2.1.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/trajectory-anim/","maintainer":"trisnox","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"Analysis_Toolkit","schema_version":"1.0.0","name":"Analysis Toolkit","version":"1.0.1","tagline":"Measurement calculations, illuminance, distance, speed, and more","archive_hash":"sha256:524de12e2a1cb0de369560e7e83aa2a47d45e2ccefdd628d941ebcd23d363823","archive_size":25910,"archive_url":"https://extensions.blender.org/download/sha256:524de12e2a1cb0de369560e7e83aa2a47d45e2ccefdd628d941ebcd23d363823/add-on-analysis-toolkit-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/analysis-toolkit/","maintainer":"K_Naoki","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Camera","Lighting"]},{"id":"ns_toolkit_mesh_cleanup_pro","schema_version":"1.0.0","name":"NS Toolkit - Mesh Cleanup Pro","version":"1.0.1","tagline":"Professional mesh cleanup with topology visualization tools","archive_hash":"sha256:0d7fa13aae7b308929ffd16d4bfc84a9a8dce03fecfd7df152f4ee434646792e","archive_size":9410,"archive_url":"https://extensions.blender.org/download/sha256:0d7fa13aae7b308929ffd16d4bfc84a9a8dce03fecfd7df152f4ee434646792e/add-on-ns-toolkit-mesh-cleanup-pro-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ns-toolkit-mesh-cleanup-pro/","maintainer":"nandur","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"OLED","schema_version":"1.0.0","name":"OLED","version":"1.0.0","tagline":"OLED theme for Blender","archive_hash":"sha256:11f8ca2e68d692cbfef511ce3b84d94dacb60e72c3253e15f010f479f2469eee","archive_size":5707,"archive_url":"https://extensions.blender.org/download/sha256:11f8ca2e68d692cbfef511ce3b84d94dacb60e72c3253e15f010f479f2469eee/theme-oled-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/oled/","maintainer":"NARZ","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","High Contrast"]},{"id":"CYNexusLX490","schema_version":"1.0.0","name":"CyanoNexus LX490","version":"1.0.1","tagline":"Stellar-grade Blender theme – tri-spectrum of CyanoNexus LX490","archive_hash":"sha256:8ea816a51657ede592156a97f26568ca0edcf6a1466e57d23947e0d1146899f9","archive_size":6218,"archive_url":"https://extensions.blender.org/download/sha256:8ea816a51657ede592156a97f26568ca0edcf6a1466e57d23947e0d1146899f9/theme-cynexuslx490-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/cynexuslx490/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","High Contrast"]},{"id":"editorbar","schema_version":"1.0.0","name":"EditorBar","version":"0.4.7","tagline":"Turn Outliner & Properties editors into a toggleable sidebar","archive_hash":"sha256:2ad15ef0f635c03095176b6f64eb24604fe20d2878e41f35612b05ee3b77a08a","archive_size":24251,"archive_url":"https://extensions.blender.org/download/sha256:2ad15ef0f635c03095176b6f64eb24604fe20d2878e41f35612b05ee3b77a08a/add-on-editorbar-v0.4.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/editorbar/","maintainer":"atetraxx","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"manage_file_paths","schema_version":"1.0.0","name":"Manage File Paths","version":"1.0.1","tagline":"A list of image file paths with indicators for missing files","archive_hash":"sha256:934b305fd815c3d3d82f26dbc1bf4a72fa5680df3941e261b42f6e5fe1f38906","archive_size":3273,"archive_url":"https://extensions.blender.org/download/sha256:934b305fd815c3d3d82f26dbc1bf4a72fa5680df3941e261b42f6e5fe1f38906/add-on-manage-file-paths-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/manage-file-paths/","maintainer":"GregZaal","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Check if image files exist on disk"},"tags":["Material","System"]},{"id":"import_meshed_alpha","schema_version":"1.0.0","name":"Import Meshed Alpha","version":"1.0.2","tagline":"Transparency to Geometry","archive_hash":"sha256:e04d8dd1855ec6a1b081b37032241f6ef3519f11ff683e3e837e4b95e88e9924","archive_size":1809862,"archive_url":"https://extensions.blender.org/download/sha256:e04d8dd1855ec6a1b081b37032241f6ef3519f11ff683e3e837e4b95e88e9924/add-on-import-meshed-alpha-v1.0.2-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/import-meshed-alpha/","maintainer":"The_Missing_Field","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Image import"},"platforms":["windows-x64"],"tags":["Mesh","Material"]},{"id":"matcolex","schema_version":"1.0.0","name":"MatColeX","version":"1.7.8","tagline":"Collect, Organize, and Apply Shaders from Your 3D View","archive_hash":"sha256:6b742fd6b14bd16df4a9ff182d73d83b07a2fa6e34780e968114d867d2acb6d5","archive_size":9589,"archive_url":"https://extensions.blender.org/download/sha256:6b742fd6b14bd16df4a9ff182d73d83b07a2fa6e34780e968114d867d2acb6d5/add-on-matcolex-v1.7.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/matcolex/","maintainer":"budijozz","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","3D View","Modeling"]},{"id":"wfc_3d_generator","schema_version":"1.0.0","name":"WFC 3D Generator","version":"1.3.9","tagline":"Simple WFC 3D generator for procedural creation of objects","archive_hash":"sha256:f71d446d70b5d88c030ec4182f9863f2c5373b516f1f362fa44dec2df17d2530","archive_size":68037,"archive_url":"https://extensions.blender.org/download/sha256:f71d446d70b5d88c030ec4182f9863f2c5373b516f1f362fa44dec2df17d2530/add-on-wfc-3d-generator-v1.3.9.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/wfc-3d-generator/","maintainer":"Jonny-B","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export constraints (JSON) from/to disk"},"tags":["Object","Modeling","Render","Game Engine"]},{"id":"blender_dark_aero_theme","schema_version":"1.0.0","name":"Dark Aero","version":"1.0.0","tagline":"This is a Dark Aero Theme for Blender","archive_hash":"sha256:dd91b8fee851865a4e2441bb32cd44003acf85e919f128b477666b3cacbdf8ca","archive_size":7696,"archive_url":"https://extensions.blender.org/download/sha256:dd91b8fee851865a4e2441bb32cd44003acf85e919f128b477666b3cacbdf8ca/theme-blender-dark-aero-theme-v1.0.0.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/blender-dark-aero-theme/","maintainer":"AeroBuoyancy.source","license":["SPDX:GPL-3.0-or-later"]},{"id":"nurbs2mesh","schema_version":"1.0.0","name":"NURBS2Mesh","version":"1.0.3","tagline":"Auto-updating mesh copies from NURBS/Curves","archive_hash":"sha256:6c6d4c2a248679c2f5fbeb3227647baced5bbca6fd23df4e4b8a5b622dd61a35","archive_size":9718,"archive_url":"https://extensions.blender.org/download/sha256:6c6d4c2a248679c2f5fbeb3227647baced5bbca6fd23df4e4b8a5b622dd61a35/add-on-nurbs2mesh-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nurbs2mesh/","maintainer":"Brrainz","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh"]},{"id":"curve_generator","schema_version":"1.0.0","name":"Curve Generator","version":"1.2.1","tagline":"Generate float curves","archive_hash":"sha256:041ae75e03c1d0988b9c4cf0064654b26234b1dca3dbf8f2eea6307aa2b6adac","archive_size":6289,"archive_url":"https://extensions.blender.org/download/sha256:041ae75e03c1d0988b9c4cf0064654b26234b1dca3dbf8f2eea6307aa2b6adac/add-on-curve-generator-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/curve-generator/","maintainer":"TFMSTYLE","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Geometry Nodes","Add Curve"]},{"id":"true_roboanimator","schema_version":"1.0.0","name":"True RoboAnimator","version":"1.0.1","tagline":"Robot motion to wheel RPM with CSV export","archive_hash":"sha256:f7fd9db315107b46866da3bdafc33a5faf41bdf208f02f7a1dc4be162a415606","archive_size":18055,"archive_url":"https://extensions.blender.org/download/sha256:f7fd9db315107b46866da3bdafc33a5faf41bdf208f02f7a1dc4be162a415606/add-on-true-roboanimator-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/true-roboanimator/","maintainer":"danyal-sarfraz","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and write CSV and animation data files"}},{"id":"MaterialHelper","schema_version":"1.0.0","name":"MaterialHelper","version":"1.4.8","tagline":"Make local asset manager your place to create powerful materials","archive_hash":"sha256:e00593caa244175bc415fdfa2dea1236810e0f434ab37c850d751a11fbed8052","archive_size":3926415,"archive_url":"https://extensions.blender.org/download/sha256:e00593caa244175bc415fdfa2dea1236810e0f434ab37c850d751a11fbed8052/add-on-materialhelper-v1.4.8.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/materialhelper/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load preview material file/Access and modify asset catalog file"},"tags":["3D View","Material"]},{"id":"lutiy_timeline","schema_version":"1.0.0","name":"Lutiy Timeline","version":"1.0.1","tagline":"Save and switch between camera frame range","archive_hash":"sha256:7a10d287ecbbb955861d09ae436d12fa9e72f143bef625b1fb0e36dd1748e3bb","archive_size":3790,"archive_url":"https://extensions.blender.org/download/sha256:7a10d287ecbbb955861d09ae436d12fa9e72f143bef625b1fb0e36dd1748e3bb/add-on-lutiy-timeline-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/lutiy-timeline/","maintainer":"3D_SHVYREV","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save and load preset configurations"},"tags":["Animation","Camera","Scene"]},{"id":"py_btn_box","schema_version":"1.0.0","name":"PyBtnBox","version":"5.1.0","tagline":"Use Button To Execute Script","archive_hash":"sha256:064fe1faa509be5bd44f5d0e9b11970e2035508156ba7b2860e8f434c459eeaf","archive_size":14035,"archive_url":"https://extensions.blender.org/download/sha256:064fe1faa509be5bd44f5d0e9b11970e2035508156ba7b2860e8f434c459eeaf/add-on-py-btn-box-v5.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/py-btn-box/","maintainer":"Ou_Chiang","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Need to sync button data from python/json files and folder"},"tags":["System"]},{"id":"mesh_attribute_utils","schema_version":"1.0.0","name":"Mesh Attribute Utils","version":"0.2.0","tagline":"Easily view and edit custom mesh attributes","archive_hash":"sha256:e62f38ee324ba6983ce8963358bc06a9570bca9da8ffa2f38f8f653c23365211","archive_size":8347,"archive_url":"https://extensions.blender.org/download/sha256:e62f38ee324ba6983ce8963358bc06a9570bca9da8ffa2f38f8f653c23365211/add-on-mesh-attribute-utils-v0.2.0.zip","type":"add-on","blender_version_min":"4.5.3","website":"https://extensions.blender.org/add-ons/mesh-attribute-utils/","maintainer":"Hannah-Pascal-Noël","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"theme_updater","schema_version":"1.0.0","name":"Theme Updater","version":"1.0.0","tagline":"Update themes from 4.5 LTS to 5.0","archive_hash":"sha256:b376af83f16f0b089690d87a2b8d1dfaeeaa11578ac9a9ff8214d5e4a0308a21","archive_size":5066,"archive_url":"https://extensions.blender.org/download/sha256:b376af83f16f0b089690d87a2b8d1dfaeeaa11578ac9a9ff8214d5e4a0308a21/add-on-theme-updater-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/theme-updater/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["System"]},{"id":"rotor","schema_version":"1.0.0","name":"rotor","version":"1.3.2","tagline":"rotor","archive_hash":"sha256:93688a3f41cadaf2dd61a8e3a442963482ca64c95f3bf303e041f622a54a46c4","archive_size":42300,"archive_url":"https://extensions.blender.org/download/sha256:93688a3f41cadaf2dd61a8e3a442963482ca64c95f3bf303e041f622a54a46c4/add-on-rotor-v1.3.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/rotor/","maintainer":"niewinny","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","3D View","Mesh"]},{"id":"Blockout","schema_version":"1.0.0","name":"Blockout","version":"1.4.5","tagline":"Blockout","archive_hash":"sha256:14f2efbae5525faa91e3146093b002aef8204472b2dfc0cfd71d9d1e218dd814","archive_size":151513,"archive_url":"https://extensions.blender.org/download/sha256:14f2efbae5525faa91e3146093b002aef8204472b2dfc0cfd71d9d1e218dd814/add-on-blockout-v1.4.5.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/blockout/","maintainer":"niewinny","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Importing node group from disk"},"tags":["Modeling","3D View","Mesh"]},{"id":"geo_bake_batch","schema_version":"1.0.0","name":"Geo Bake Batch","version":"0.0.1","tagline":"Batch tools for Geometry Nodes baking","archive_hash":"sha256:5390dc3576d9fefecd1d048d62041e10f3534e29de64d8ede8c19c63db18bf39","archive_size":2570,"archive_url":"https://extensions.blender.org/download/sha256:5390dc3576d9fefecd1d048d62041e10f3534e29de64d8ede8c19c63db18bf39/add-on-geo-bake-batch-v0.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/geo-bake-batch/","maintainer":"Artyom-Pankratov","license":["SPDX:GPL-3.0-or-later"]},{"id":"restart","schema_version":"1.0.0","name":"Restart","version":"1.0.2","tagline":"Restart Blender","archive_hash":"sha256:35f410b9964af45d4c5becb8048e29e417a485bc371d26e23700ccd5fbba409c","archive_size":2824,"archive_url":"https://extensions.blender.org/download/sha256:35f410b9964af45d4c5becb8048e29e417a485bc371d26e23700ccd5fbba409c/add-on-restart-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/restart/","maintainer":"JR3DFUL","license":["SPDX:GPL-3.0-or-later"],"tags":["System"]},{"id":"camera_sensor_database","schema_version":"1.0.0","name":"Camera Sensor Database","version":"1.0.1","tagline":"Provides a database of camera sensors to choose from in Blender","archive_hash":"sha256:32004b0e9484005e64f5679b470706fc1fb051ee083e7636860edcd2c1d8acd9","archive_size":18406,"archive_url":"https://extensions.blender.org/download/sha256:32004b0e9484005e64f5679b470706fc1fb051ee083e7636860edcd2c1d8acd9/add-on-camera-sensor-database-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/camera-sensor-database/","maintainer":"Manuel-Houben","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"To save the sensor database locally","network":"To download the latest sensor database"},"tags":["Camera"]},{"id":"collection_switcher","schema_version":"1.0.0","name":"Collection Switcher","version":"1.4.0","tagline":"Switch visibility between sub-collections in switchers","archive_hash":"sha256:dbdfecad5e8051a1bd8a8005200ff91c37dab4fb3ffc489d66859be1454519e9","archive_size":1124111,"archive_url":"https://extensions.blender.org/download/sha256:dbdfecad5e8051a1bd8a8005200ff91c37dab4fb3ffc489d66859be1454519e9/add-on-collection-switcher-v1.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/collection-switcher/","maintainer":"Valentin-Komkov","license":["SPDX:GPL-3.0-or-later"]},{"id":"stb_section_toolbox","schema_version":"1.0.0","name":"Section Toolbox","version":"0.0.2","tagline":"Parametric section box and planar cuts with SVG DXF export","archive_hash":"sha256:93dd3b52321132a6c44cfdf0a738628fc156fba3d06d5f8d57fd2f189447f3f7","archive_size":30173,"archive_url":"https://extensions.blender.org/download/sha256:93dd3b52321132a6c44cfdf0a738628fc156fba3d06d5f8d57fd2f189447f3f7/add-on-stb-section-toolbox-v0.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/stb-section-toolbox/","maintainer":"Victor-Calixto","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export SVG and DXF to disk"},"tags":["Modeling","Mesh","Import-Export","Object"]},{"id":"uv_maps_plus","schema_version":"1.0.0","name":"UV Maps+","version":"2026.1.2","tagline":"Reorder UV Maps, Copy/Paste UVs, and exceed the 8-map limit","archive_hash":"sha256:a85d5e6b619544489c39c0b6208a5012907877f0a8c71931d5f9bae813e0e318","archive_size":18036,"archive_url":"https://extensions.blender.org/download/sha256:a85d5e6b619544489c39c0b6208a5012907877f0a8c71931d5f9bae813e0e318/add-on-uv-maps-plus-v2026.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/uv-maps-plus/","maintainer":"JR3DFUL","license":["SPDX:GPL-3.0-or-later"],"tags":["UV","User Interface"]},{"id":"parallax_node","schema_version":"1.0.0","name":"Parallax Node","version":"1.1.1","tagline":"Adds parallax node for shader nodes","archive_hash":"sha256:a2830f8614b8e3ee6d7bcc882eb2a8d3208f069b64dec3d7cfbc9f73dd4a100f","archive_size":12064,"archive_url":"https://extensions.blender.org/download/sha256:a2830f8614b8e3ee6d7bcc882eb2a8d3208f069b64dec3d7cfbc9f73dd4a100f/add-on-parallax-node-v1.1.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/parallax-node/","maintainer":"MultLabs","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","Node"]},{"id":"easy_driver","schema_version":"1.0.0","name":"Easy Driver","version":"1.5.7","tagline":"Technical rigging made easier","archive_hash":"sha256:67bb46459b69c6db2a040f83df1903d0f3f449193b587da175117fa5dbac9b1e","archive_size":41557,"archive_url":"https://extensions.blender.org/download/sha256:67bb46459b69c6db2a040f83df1903d0f3f449193b587da175117fa5dbac9b1e/add-on-easy-driver-v1.5.7.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.2.0","website":"https://extensions.blender.org/add-ons/easy-driver/","maintainer":"NeoEmberArt","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Animation"]},{"id":"hifi_builder","schema_version":"1.0.0","name":"HiFi Architecture Builder v4.5.8","version":"4.5.8","tagline":"One-click architecture, and game engine prep tool","archive_hash":"sha256:509a885bee9c0a8c9949a3f0899dbcd8e4b26c6aa08b7d5b7d20ec2e88404cd5","archive_size":101569,"archive_url":"https://extensions.blender.org/download/sha256:509a885bee9c0a8c9949a3f0899dbcd8e4b26c6aa08b7d5b7d20ec2e88404cd5/add-on-hifi-builder-v4.5.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/hifi-builder/","maintainer":"Malik-Nomi","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh","Modeling","Game Engine","Animation"]},{"id":"secondary_language","schema_version":"1.0.0","name":"Secondary Language","version":"1.1.0","tagline":"Quickly switch to secondary language","archive_hash":"sha256:f4fca123ca687c2b2977fdcef6157718d47d4bae15970ff3e90064948abd6049","archive_size":3939,"archive_url":"https://extensions.blender.org/download/sha256:f4fca123ca687c2b2977fdcef6157718d47d4bae15970ff3e90064948abd6049/add-on-secondary-language-v1.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/secondary-language/","maintainer":"mdlt7z","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"driver_helper","schema_version":"1.0.0","name":"DriverHelper","version":"1.0.1","tagline":"Helps generate driver formulas in the Shape Keys panel","archive_hash":"sha256:5e6937bfd83777793ecc35c0c52351bd45ff842d76fe5914f2c5df9f609d3149","archive_size":2152,"archive_url":"https://extensions.blender.org/download/sha256:5e6937bfd83777793ecc35c0c52351bd45ff842d76fe5914f2c5df9f609d3149/add-on-driver-helper-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/driver-helper/","maintainer":"Zakmen150","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"format_rename","schema_version":"1.0.0","name":"Format Rename","version":"0.0.5","tagline":"Format Rename","archive_hash":"sha256:e808bb2db8a28a7d59edcc17646c4e27d758ece40f258f98a15f162756b14f6e","archive_size":19683,"archive_url":"https://extensions.blender.org/download/sha256:e808bb2db8a28a7d59edcc17646c4e27d758ece40f258f98a15f162756b14f6e/add-on-format-rename-v0.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/format-rename/","maintainer":"Ou_Chiang","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Object","Rigging"]},{"id":"NieR_Automata","schema_version":"1.0.0","name":"YorHa - Operator","version":"1.1.0","tagline":"A Dark Version Of Nier Automata Ui inspired by YorHa-Operator","archive_hash":"sha256:37142058b557023d2d7bd00556c7ddaa53effadc124d7a8576a76383b98c39a1","archive_size":5484,"archive_url":"https://extensions.blender.org/download/sha256:37142058b557023d2d7bd00556c7ddaa53effadc124d7a8576a76383b98c39a1/theme-nier-automata-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/nier-automata/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"layer_comp","schema_version":"1.0.0","name":"LayerComp","version":"1.1.2","tagline":"Layer-based compositing tool, similar to After Effects","archive_hash":"sha256:f36c636a9d17ff8e411dde32f67fadffb4d945ffe4b91f6c9f1515f88070d2b6","archive_size":580509,"archive_url":"https://extensions.blender.org/download/sha256:f36c636a9d17ff8e411dde32f67fadffb4d945ffe4b91f6c9f1515f88070d2b6/add-on-layer-comp-v1.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/layer-comp/","maintainer":"KENKEN","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/Export Blend file from/to disk"},"tags":["Compositing","Node","Render"]},{"id":"select_123","schema_version":"1.0.0","name":"123 Select","version":"1.0.0","tagline":"Switch vertex edge face in Object Mode","archive_hash":"sha256:d2e9f6103ae21032457a7446e69d0739db1ec7484ed632f43e528ace040fed69","archive_size":2138,"archive_url":"https://extensions.blender.org/download/sha256:d2e9f6103ae21032457a7446e69d0739db1ec7484ed632f43e528ace040fed69/add-on-select-123-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/select-123/","maintainer":"Fisch_Tu","license":["SPDX:GPL-3.0-or-later"]},{"id":"ramp_generator","schema_version":"1.0.0","name":"Ramp Generator","version":"1.4.3","tagline":"Generate color ramps","archive_hash":"sha256:66bdec66a8260ec4bdf3341d059ff5e99d34b24a9e67f53c4897b1a27675a38c","archive_size":3932,"archive_url":"https://extensions.blender.org/download/sha256:66bdec66a8260ec4bdf3341d059ff5e99d34b24a9e67f53c4897b1a27675a38c/add-on-ramp-generator-v1.4.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ramp-generator/","maintainer":"TFMSTYLE","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Geometry Nodes","Compositing"]},{"id":"Timelapse_extension","schema_version":"1.0.0","name":"Timelapse","version":"1.0.1","tagline":"Take timed screenshots inside Blender","archive_hash":"sha256:c222a4fdd80114eeac3d556b9c4934f9f38382e25c00115fad1ebed9097474d1","archive_size":3049,"archive_url":"https://extensions.blender.org/download/sha256:c222a4fdd80114eeac3d556b9c4934f9f38382e25c00115fad1ebed9097474d1/add-on-timelapse-extension-v1.0.1.zip","type":"add-on","blender_version_min":"4.5.1","website":"https://extensions.blender.org/add-ons/timelapse-extension/","maintainer":"Silky-Renders","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export png/jpeg to disk"},"tags":["System"]},{"id":"blender_frutiger_aero_theme","schema_version":"1.0.0","name":"Frutiger Aero","version":"1.1.3","tagline":"This is a Frutiger Aero Theme for Blender","archive_hash":"sha256:55211f98e8097958a59f34af945f4a16ce490025f4b50c8edf939aa53b009f11","archive_size":6989,"archive_url":"https://extensions.blender.org/download/sha256:55211f98e8097958a59f34af945f4a16ce490025f4b50c8edf939aa53b009f11/theme-blender-frutiger-aero-theme-v1.1.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/blender-frutiger-aero-theme/","maintainer":"AeroBuoyancy.source","license":["SPDX:GPL-3.0-or-later"]},{"id":"markcam","schema_version":"1.0.0","name":"MarkCam","version":"2.5.0","tagline":"Quick camera-from-view + timeline marker tools","archive_hash":"sha256:e77094449c22c6b3d97280fb4b95ee456fd16c9677c14e2fd36aaf3c5fd4cebd","archive_size":6762,"archive_url":"https://extensions.blender.org/download/sha256:e77094449c22c6b3d97280fb4b95ee456fd16c9677c14e2fd36aaf3c5fd4cebd/add-on-markcam-v2.5.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/markcam/","maintainer":"SomRender","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","Animation"]},{"id":"Work_n_rose","schema_version":"1.0.0","name":"Work_n_rose","version":"1.5.0","tagline":"Dark Mood, 4thegoat","archive_hash":"sha256:6c1622ccf5e23b713a6eed923ebf8b771ec8cdd18d42ec54f9f6cc0b032a0122","archive_size":6148,"archive_url":"https://extensions.blender.org/download/sha256:6c1622ccf5e23b713a6eed923ebf8b771ec8cdd18d42ec54f9f6cc0b032a0122/theme-work-n-rose-v1.5.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/work-n-rose/","maintainer":"Nois3G4te","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"stroke_material_display","schema_version":"1.0.0","name":"Stroke Material Display","version":"1.0.1","tagline":"Display material names of selected Grease Pencil strokes","archive_hash":"sha256:807cb0171624b4fbb0960fd3f2ad455bb4611fd9fbd90b3c52cef01107019317","archive_size":3088,"archive_url":"https://extensions.blender.org/download/sha256:807cb0171624b4fbb0960fd3f2ad455bb4611fd9fbd90b3c52cef01107019317/add-on-stroke-material-display-v1.0.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/stroke-material-display/","maintainer":"JohnNyquist","license":["SPDX:GPL-3.0-or-later"],"tags":["Grease Pencil"]},{"id":"spa_sequencer","schema_version":"1.0.0","name":"SPArk Sequencer","version":"0.1.6","tagline":"Toolset to improve the sequence workflow in Blender","archive_hash":"sha256:2f9ea5309e0f0778d775c896b2b575fadaab20df993c7d453c11704697180b1a","archive_size":73645,"archive_url":"https://extensions.blender.org/download/sha256:2f9ea5309e0f0778d775c896b2b575fadaab20df993c7d453c11704697180b1a/add-on-spa-sequencer-v0.1.6.zip","type":"add-on","blender_version_min":"4.5.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/add-ons/spa-sequencer/","maintainer":"TinyNick","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Sequencer"]},{"id":"compositor_file_output_replacer","schema_version":"1.0.0","name":"Compositor File Output Replacer","version":"1.3.0","tagline":"Find and replace text in File Output node paths","archive_hash":"sha256:fc5ba89eb189670904813d758c2913c22ed3e66f830fc0ba01333ce8c46c8757","archive_size":3158,"archive_url":"https://extensions.blender.org/download/sha256:fc5ba89eb189670904813d758c2913c22ed3e66f830fc0ba01333ce8c46c8757/add-on-compositor-file-output-replacer-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/compositor-file-output-replacer/","maintainer":"a2d4f3s1","license":["SPDX:GPL-3.0-or-later"],"tags":["Compositing","Node"]},{"id":"miunau_slcamera","schema_version":"1.0.0","name":"Second Life-style camera","version":"1.0.4","tagline":"Second Life-style camera with ALT (option)/CTRL/SHIFT keys","archive_hash":"sha256:e52827160361d2ea0b1c7cdf8603879df1b604dada91e2535d0a17abfe5a8e06","archive_size":19907,"archive_url":"https://extensions.blender.org/download/sha256:e52827160361d2ea0b1c7cdf8603879df1b604dada91e2535d0a17abfe5a8e06/add-on-miunau-slcamera-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/miunau-slcamera/","maintainer":"miunau","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"blue_archive_theme","schema_version":"1.0.0","name":"Blue Archive","version":"1.2.1","tagline":"Theme inspired by Blue Archive game UI","archive_hash":"sha256:b8049642276b5da71a498c9433a46b628ec154b050fa27c5e06fe6236b0f1b31","archive_size":5159,"archive_url":"https://extensions.blender.org/download/sha256:b8049642276b5da71a498c9433a46b628ec154b050fa27c5e06fe6236b0f1b31/theme-blue-archive-theme-v1.2.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/blue-archive-theme/","maintainer":"RAZUMNO","license":["SPDX:GPL-3.0-or-later"],"tags":["Light","Inspired By"]},{"id":"toolhub","schema_version":"1.0.0","name":"Tool Hub","version":"1.0.2","tagline":"This add-on searches and pins in a pie-menu","archive_hash":"sha256:cbf1d344e714f273a7e97607576712141e3c7fb7b8c0eea5c17b51072c913ed2","archive_size":26285,"archive_url":"https://extensions.blender.org/download/sha256:cbf1d344e714f273a7e97607576712141e3c7fb7b8c0eea5c17b51072c913ed2/add-on-toolhub-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/toolhub/","maintainer":"Mr.Bir","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"attrio_csv","schema_version":"1.0.0","name":"Attrio CSV","version":"1.0.1","tagline":"Bake and read back Evaluated Dependency Graph Data as CSV","archive_hash":"sha256:1091d651c2b57d2ce9cc7c3b5037a0e2892f568db65e67ffcf57ced8c355cf68","archive_size":161895,"archive_url":"https://extensions.blender.org/download/sha256:1091d651c2b57d2ce9cc7c3b5037a0e2892f568db65e67ffcf57ced8c355cf68/add-on-attrio-csv-v1.0.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/attrio-csv/","maintainer":"sharpened","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Bake","Geometry Nodes"]},{"id":"essential_brush_saver","schema_version":"1.0.0","name":"Essential Brush Saver","version":"1.1.3","tagline":"Automatically save and load essential brush settings","archive_hash":"sha256:c83987bf62b92a0890d9aeae3bcf7b4c31df7d38d6b1991b10a61610f50738a0","archive_size":6069,"archive_url":"https://extensions.blender.org/download/sha256:c83987bf62b92a0890d9aeae3bcf7b4c31df7d38d6b1991b10a61610f50738a0/add-on-essential-brush-saver-v1.1.3.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/essential-brush-saver/","maintainer":"emptybraces","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save/Load configuration data JSON file to/from disk"},"tags":["Paint","Sculpt","System"]},{"id":"space_colonization_tree_generator","schema_version":"1.0.0","name":"Space colonization tree generator","version":"1.0.0","tagline":"A simple add-on which uses the space colonization approach","archive_hash":"sha256:4b3ed3c3d2ff48e8bd3eec520098e42d24937f4167ed3fd9210a870369a9ef83","archive_size":6781,"archive_url":"https://extensions.blender.org/download/sha256:4b3ed3c3d2ff48e8bd3eec520098e42d24937f4167ed3fd9210a870369a9ef83/add-on-space-colonization-tree-generator-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/space-colonization-tree-generator/","maintainer":"LS","license":["SPDX:GPL-3.0-or-later"]},{"id":"SHIRAKUMO_rectangle_tools","schema_version":"1.0.0","name":"Rectangle Tools","version":"1.0.2","tagline":"Tools to more easily draw rectangles in edit mode","archive_hash":"sha256:16aa9da0c9d4eb8d0e7c9b94c1a1e1602a602c75109e2c8beeffb5648719ce9b","archive_size":7349,"archive_url":"https://extensions.blender.org/download/sha256:16aa9da0c9d4eb8d0e7c9b94c1a1e1602a602c75109e2c8beeffb5648719ce9b/add-on-shirakumo-rectangle-tools-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shirakumo-rectangle-tools/","maintainer":"shinmera","license":["SPDX:GPL-3.0-or-later","SPDX:Zlib"],"tags":["Modeling"]},{"id":"bake_instance_animation","schema_version":"1.0.0","name":"Bake Instance Animation (烘焙几何节点实例动画)","version":"1.0.3","tagline":"Bake geometry nodes instance animation to keyframe animation","archive_hash":"sha256:eea61c5dfe87559ead85806327ea8dcf1c3c9a8e650d35650a6b624f82a94ad4","archive_size":8497,"archive_url":"https://extensions.blender.org/download/sha256:eea61c5dfe87559ead85806327ea8dcf1c3c9a8e650d35650a6b624f82a94ad4/add-on-bake-instance-animation-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bake-instance-animation/","maintainer":"ChyiZ_","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Geometry Nodes"]},{"id":"Candymouse","schema_version":"1.0.0","name":"Candymouse","version":"1.1.0","tagline":"A neutral grey theme with colorful accents","archive_hash":"sha256:794db960862d4fbcd1814bcef6241bfbbe915c84de0f8153744ae541881cf75a","archive_size":5785,"archive_url":"https://extensions.blender.org/download/sha256:794db960862d4fbcd1814bcef6241bfbbe915c84de0f8153744ae541881cf75a/theme-candymouse-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/candymouse/","maintainer":"milomouse","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"shiva_img2mat","schema_version":"1.0.0","name":"Image to Mat","version":"1.0.0","tagline":"Generate material from image","archive_hash":"sha256:70a119b9df99d6521deed569f4b68765af8bfeb23b5045f6eacc7e24ffb940b8","archive_size":3150,"archive_url":"https://extensions.blender.org/download/sha256:70a119b9df99d6521deed569f4b68765af8bfeb23b5045f6eacc7e24ffb940b8/add-on-shiva-img2mat-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shiva-img2mat/","maintainer":"SHIVA","license":["SPDX:GPL-3.0-or-later"]},{"id":"easy_tree","schema_version":"1.0.0","name":"Easy Tree","version":"1.0.1","tagline":"Create one-click procedural trees","archive_hash":"sha256:9ba32029650173c303037155c629dd85953699dbd8e62bd5e71da6927c84a4ff","archive_size":17712727,"archive_url":"https://extensions.blender.org/download/sha256:9ba32029650173c303037155c629dd85953699dbd8e62bd5e71da6927c84a4ff/add-on-easy-tree-v1.0.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/easy-tree/","maintainer":"Jacob-Johnston","license":["SPDX:GPL-3.0-or-later"]},{"id":"wheel_o_matic","schema_version":"1.0.0","name":"Wheel-O-Matic","version":"1.0.2","tagline":"Automatic wheel rotation in any direction","archive_hash":"sha256:b1bbffe18d262809b768ff28f1491a0141c71c45ff5789338d737706ee9b29db","archive_size":20178,"archive_url":"https://extensions.blender.org/download/sha256:b1bbffe18d262809b768ff28f1491a0141c71c45ff5789338d737706ee9b29db/add-on-wheel-o-matic-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/wheel-o-matic/","maintainer":"TechArtToolBox","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Animation"]},{"id":"blender_game_tools","schema_version":"1.0.0","name":"Game Tools","version":"0.3.2","tagline":"Game Tools","archive_hash":"sha256:5c62770748af9a4cf620e642b98716e63392012ca9e6a6436b47b5cd3d38f66e","archive_size":249307,"archive_url":"https://extensions.blender.org/download/sha256:5c62770748af9a4cf620e642b98716e63392012ca9e6a6436b47b5cd3d38f66e/add-on-blender-game-tools-v0.3.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blender-game-tools/","maintainer":"Cremuss","license":["SPDX:GPL-3.0-or-later"],"tags":["Bake","UV","Mesh","Pipeline"]},{"id":"keyframe_selected","schema_version":"1.0.0","name":"Keyframe selected","version":"1.3.3","tagline":"Insert or delete keyframes on selected items","archive_hash":"sha256:cfb13e15f9a4bfe2155bba29b9a2f0da5a585ffdd4e96ada00c47083ec1ca0ca","archive_size":6059,"archive_url":"https://extensions.blender.org/download/sha256:cfb13e15f9a4bfe2155bba29b9a2f0da5a585ffdd4e96ada00c47083ec1ca0ca/add-on-keyframe-selected-v1.3.3.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/keyframe-selected/","maintainer":"xbodya13","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"i32_the_mandelbrot_set","schema_version":"1.0.0","name":"i32 the Mandelbrot Set","version":"1.0.2","tagline":"The Mandelbrot set using only Integer Math and Bit Math Nodes","archive_hash":"sha256:2c84bad5a6b5b98820d12d13980e36848eed0cf8359844954d72995722224540","archive_size":43557,"archive_url":"https://extensions.blender.org/download/sha256:2c84bad5a6b5b98820d12d13980e36848eed0cf8359844954d72995722224540/add-on-i32-the-mandelbrot-set-v1.0.2.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/i32-the-mandelbrot-set/","maintainer":"Osipenkov+Art","license":["SPDX:GPL-3.0-or-later"],"tags":["Geometry Nodes"]},{"id":"node_tree_screenshot","schema_version":"1.0.0","name":"Node Tree Screenshot","version":"1.1.0","tagline":"Screenshot utility for large node trees","archive_hash":"sha256:5dfd72b1c8d52f58a1515e1fe709cdeed85b39b109de3730acbdc9c0c8a00242","archive_size":18742705,"archive_url":"https://extensions.blender.org/download/sha256:5dfd72b1c8d52f58a1515e1fe709cdeed85b39b109de3730acbdc9c0c8a00242/add-on-node-tree-screenshot-v1.1.0-windows-x64-macos-arm64-linux-x64.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/node-tree-screenshot/","maintainer":"LukasTönne","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64","macos-arm64","linux-x64"],"tags":["Node"]},{"id":"visual_limits","schema_version":"1.0.0","name":"Visual limits","version":"1.3.2","tagline":"This addon shows rigid body constraint limits in viewport","archive_hash":"sha256:fcb0ca388657a7fe0d2ce862ce5fdaa178c75160ce74e775981bdecc72a2509e","archive_size":2710,"archive_url":"https://extensions.blender.org/download/sha256:fcb0ca388657a7fe0d2ce862ce5fdaa178c75160ce74e775981bdecc72a2509e/add-on-visual-limits-v1.3.2.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/visual-limits/","maintainer":"xbodya13","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"auto_sync_object_data_names","schema_version":"1.0.0","name":"Auto Sync Object Data Names","version":"1.0.0","tagline":"Automatically sync object and data names","archive_hash":"sha256:6da30fc3031f193cbac124155168d944dd62b674ede4465becc262d61288c8ab","archive_size":19044,"archive_url":"https://extensions.blender.org/download/sha256:6da30fc3031f193cbac124155168d944dd62b674ede4465becc262d61288c8ab/add-on-auto-sync-object-data-names-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-sync-object-data-names/","maintainer":"GeeDoubleU","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Pipeline"]},{"id":"Tracker2Nuke","schema_version":"1.0.0","name":"Tracker to Nuke","version":"1.1.0","tagline":"Instantly export Blender tracking data to a Nuke Tracker node","archive_hash":"sha256:b937c0ddfdd9cdea2e22332b540bd2bf7dbd9bd3a9b6dcb2366930a73818029d","archive_size":5120,"archive_url":"https://extensions.blender.org/download/sha256:b937c0ddfdd9cdea2e22332b540bd2bf7dbd9bd3a9b6dcb2366930a73818029d/add-on-tracker2nuke-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/tracker2nuke/","maintainer":"K_Naoki","license":["SPDX:GPL-3.0-or-later"],"tags":["Tracking","Import-Export"]},{"id":"polychase","schema_version":"1.0.0","name":"Polychase","version":"0.0.12","tagline":"Mesh Based Motion Tracking in Blender","archive_hash":"sha256:cec3aef00331262297eab4c4701019b2c8afd246634164fce9fb2ba4ba5d4741","archive_size":6053171,"archive_url":"https://extensions.blender.org/download/sha256:cec3aef00331262297eab4c4701019b2c8afd246634164fce9fb2ba4ba5d4741/add-on-polychase-v0.0.12-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/polychase/","maintainer":"theartful","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Write optical flow database to disk"},"platforms":["windows-x64"],"tags":["Animation","Tracking"]},{"id":"Bone_Aligner","schema_version":"1.0.0","name":"Bone Aligner","version":"1.1.4","tagline":"Quickly align two bones","archive_hash":"sha256:bc842ad69c28089a444998780860f6755b140c8819ff92caebff935ec4180af8","archive_size":2841,"archive_url":"https://extensions.blender.org/download/sha256:bc842ad69c28089a444998780860f6755b140c8819ff92caebff935ec4180af8/add-on-bone-aligner-v1.1.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bone-aligner/","maintainer":"maylog","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"perfectly_normal","schema_version":"1.0.0","name":"Perfectly Normal","version":"0.0.2","tagline":"Manipulate face-corner normals as mesh components","archive_hash":"sha256:e52b80edcba7441d962ececa8db61da530d401f694670d9c03b463347334ce56","archive_size":159727,"archive_url":"https://extensions.blender.org/download/sha256:e52b80edcba7441d962ececa8db61da530d401f694670d9c03b463347334ce56/add-on-perfectly-normal-v0.0.2.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/perfectly-normal/","maintainer":"Seth-Adam-Trowbridge","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write asset resources from/to disk"},"tags":["Mesh","Modeling","Geometry Nodes"]},{"id":"beantextures","schema_version":"1.0.0","name":"Beantextures","version":"1.1.0","tagline":"Addon to help with 2D texture-based animations","archive_hash":"sha256:3273b6d7045724c0e4e1ea3c98924ee1831e5fd2712eb69391fb2f50d465fa59","archive_size":23669,"archive_url":"https://extensions.blender.org/download/sha256:3273b6d7045724c0e4e1ea3c98924ee1831e5fd2712eb69391fb2f50d465fa59/add-on-beantextures-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/beantextures/","maintainer":"daringcuteseal","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import image textures to generated node group"},"tags":["Animation","Node","Rigging"]},{"id":"SmartScene_Toolkit","schema_version":"1.0.0","name":"SmartScene Toolkit","version":"1.4.0","tagline":"Toolkit for smarter parent, hierarchy, mirror operations","archive_hash":"sha256:135648cb28a6598c932adf8b34ef4652026f71e57f0dd2b7e352b88d5dc19b60","archive_size":14746,"archive_url":"https://extensions.blender.org/download/sha256:135648cb28a6598c932adf8b34ef4652026f71e57f0dd2b7e352b88d5dc19b60/add-on-smartscene-toolkit-v1.4.0.zip","type":"add-on","blender_version_min":"4.4.3","website":"https://extensions.blender.org/add-ons/smartscene-toolkit/","maintainer":"Marcus997","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Scene"]},{"id":"Blackboard_Theme","schema_version":"1.0.0","name":"Blackboard_Theme","version":"2.2.5","tagline":"Dark Monochrome","archive_hash":"sha256:6f1acb07f807e7bf6296f176206b54cf65f569e8a5f83700a8856c588a8e0f43","archive_size":5660,"archive_url":"https://extensions.blender.org/download/sha256:6f1acb07f807e7bf6296f176206b54cf65f569e8a5f83700a8856c588a8e0f43/theme-blackboard-theme-v2.2.5.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/blackboard-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"surfacepsycho","schema_version":"1.0.0","name":"Surface Psycho","version":"0.9.4","tagline":"Precision Surface Design","archive_hash":"sha256:7fdfffc0ad4478ee55b83ed737ec0bc0cdf132c68ae42721b5e513860078b340","archive_size":57156920,"archive_url":"https://extensions.blender.org/download/sha256:7fdfffc0ad4478ee55b83ed737ec0bc0cdf132c68ae42721b5e513860078b340/add-on-surfacepsycho-v0.9.4-windows-x64.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/surfacepsycho/","maintainer":"RomainGuimbal","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import and export CAD files"},"platforms":["windows-x64"],"tags":["Modeling","Import-Export","Geometry Nodes","Add Curve"]},{"id":"sync_material_viewport_color","schema_version":"1.0.0","name":"Sync Material Viewport Color","version":"1.0.2","tagline":"Sets diffuse color, metallic and roughness for viewport display","archive_hash":"sha256:1e6302ca53e77ca3163ef07be912988880d13574b20cec5d5fb3735c4eac9cc9","archive_size":7318,"archive_url":"https://extensions.blender.org/download/sha256:1e6302ca53e77ca3163ef07be912988880d13574b20cec5d5fb3735c4eac9cc9/add-on-sync-material-viewport-color-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sync-material-viewport-color/","maintainer":"Qiu-Feng","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Material"]},{"id":"Dim_Fog","schema_version":"1.0.0","name":"Dim Fog","version":"2.0.0","tagline":"Moody & Cozy theme","archive_hash":"sha256:442ee419c1f5439af9cb9643ed06c5ce7461ef565622854ec754642ef45b885c","archive_size":5195,"archive_url":"https://extensions.blender.org/download/sha256:442ee419c1f5439af9cb9643ed06c5ce7461ef565622854ec754642ef45b885c/theme-dim-fog-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/dim-fog/","maintainer":"huleeb","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"ccnc_animation_objects","schema_version":"1.0.0","name":"CCNCAnimationObjects","version":"1.2.3","tagline":"CNC simulation object editor with camera and spark effects","archive_hash":"sha256:51d61dc81125b537f01f25da6b52a6ba1ba694e9c83ef6d1f3a97b47af051d82","archive_size":85342,"archive_url":"https://extensions.blender.org/download/sha256:51d61dc81125b537f01f25da6b52a6ba1ba694e9c83ef6d1f3a97b47af051d82/add-on-ccnc-animation-objects-v1.2.3.zip","type":"add-on","blender_version_min":"4.4.3","website":"https://extensions.blender.org/add-ons/ccnc-animation-objects/","maintainer":"Bitsqueezer","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export CSV files"},"tags":["Modeling","Animation","Camera"]},{"id":"shape_key_utilities_enhanced","schema_version":"1.0.0","name":"Shape Key & Vertex Groups Utilities Enhanced","version":"1.1.1","tagline":"Comprehensive shape key and vertex group management tools","archive_hash":"sha256:f7d756df3bb017b871d7057fb727e79ac98a5e235fc0fa0ad83c7cca78127527","archive_size":21006,"archive_url":"https://extensions.blender.org/download/sha256:f7d756df3bb017b871d7057fb727e79ac98a5e235fc0fa0ad83c7cca78127527/add-on-shape-key-utilities-enhanced-v1.1.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/shape-key-utilities-enhanced/","maintainer":"LeafyBush7","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Object","Modeling"]},{"id":"VAT","schema_version":"1.0.0","name":"Vertex Animation Texture Addon (VAT)","version":"1.0.1","tagline":"Tools for vertex animation textures in Blender","archive_hash":"sha256:5fb62160f6e6642150e74bc02421cd46c338a96d85e28e3e48f6baaad1bfb065","archive_size":8592,"archive_url":"https://extensions.blender.org/download/sha256:5fb62160f6e6642150e74bc02421cd46c338a96d85e28e3e48f6baaad1bfb065/add-on-vat-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/vat/","maintainer":"Flement","license":["SPDX:GPL-3.0-or-later"]},{"id":"VCS","schema_version":"1.0.0","name":"Vertex Color Selector","version":"1.0.9","tagline":"VertexColor Select tool","archive_hash":"sha256:0dd54c9febb5b08d20d9db9797384130169c552db74563214f6f7a589e1555f4","archive_size":8745,"archive_url":"https://extensions.blender.org/download/sha256:0dd54c9febb5b08d20d9db9797384130169c552db74563214f6f7a589e1555f4/add-on-vcs-v1.0.9.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/vcs/","maintainer":"D31","license":["SPDX:GPL-3.0-or-later"]},{"id":"script_manager_pro","schema_version":"1.0.0","name":"Script Manager Pro","version":"0.0.3","tagline":"Manage and run Python scripts with one-click access","archive_hash":"sha256:005a3e75a2bee8f30718c1773d05533e8112101254d7103f56f0dce3c6e12fff","archive_size":3129,"archive_url":"https://extensions.blender.org/download/sha256:005a3e75a2bee8f30718c1773d05533e8112101254d7103f56f0dce3c6e12fff/add-on-script-manager-pro-v0.0.3.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/script-manager-pro/","maintainer":"CemilBerk","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Reads and writes script metadata to a JSON file"}},{"id":"anim_auto_offset","schema_version":"1.0.0","name":"Animation Auto Offset","version":"1.3.2","tagline":"Update all keyframes relatively on transform changes","archive_hash":"sha256:a5fb0219f32e06d2b8e5e8c475228e76c8144988bc6068c966999776e9173ca8","archive_size":15647,"archive_url":"https://extensions.blender.org/download/sha256:a5fb0219f32e06d2b8e5e8c475228e76c8144988bc6068c966999776e9173ca8/add-on-anim-auto-offset-v1.3.2.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/anim-auto-offset/","maintainer":"Marek-Zając","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Sequencer"]},{"id":"auto_wrinkle_map","schema_version":"1.0.0","name":"Auto Wrinkle Map","version":"0.0.7","tagline":"Helps you to create wrinkle maps driven from bones in one click","archive_hash":"sha256:342a46d212aef292c92e9f751b4cd1f97ccaa677acc8e1cdc1ce23f638ef198a","archive_size":10763,"archive_url":"https://extensions.blender.org/download/sha256:342a46d212aef292c92e9f751b4cd1f97ccaa677acc8e1cdc1ce23f638ef198a/add-on-auto-wrinkle-map-v0.0.7.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/auto-wrinkle-map/","maintainer":"Hattiffnat","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Material","Node","Animation"]},{"id":"node_void_keeper","schema_version":"1.0.0","name":"NodeVoidKeeper","version":"1.0.1","tagline":"Keeps your nodes centered at the origin, so you can't lose them","archive_hash":"sha256:a6ac8d276fc301e317c45b4c5ec55672266fb11e0cb2a82f7436c106db8e053d","archive_size":15610,"archive_url":"https://extensions.blender.org/download/sha256:a6ac8d276fc301e317c45b4c5ec55672266fb11e0cb2a82f7436c106db8e053d/add-on-node-void-keeper-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-void-keeper/","maintainer":"MagnumVD","license":["SPDX:GPL-3.0-or-later"],"tags":["Node"]},{"id":"autocam","schema_version":"1.0.0","name":"AutoCam","version":"2.0.6","tagline":"Intuitive camera tools, built for artists","archive_hash":"sha256:375b428c576948a9f8a9311e64c4f4109aa41fec3c1b76b8c79a1b67685b2132","archive_size":67410,"archive_url":"https://extensions.blender.org/download/sha256:375b428c576948a9f8a9311e64c4f4109aa41fec3c1b76b8c79a1b67685b2132/add-on-autocam-v2.0.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/autocam/","maintainer":"RenderRides","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","Animation","Rigging","Render","Add Curve"]},{"id":"additional_batch_rename","schema_version":"1.0.0","name":"Additional Batch Rename","version":"1.1.1","tagline":"Additional batch rename operators","archive_hash":"sha256:c8cbfda2e658806b84e437759fdce84053abfd16266dbd29e5b89a074a305c11","archive_size":15993,"archive_url":"https://extensions.blender.org/download/sha256:c8cbfda2e658806b84e437759fdce84053abfd16266dbd29e5b89a074a305c11/add-on-additional-batch-rename-v1.1.1.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/additional-batch-rename/","maintainer":"Endertainer007","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface","Object"]},{"id":"proceduraltiles","schema_version":"1.0.0","name":"Procedural Tiles","version":"0.0.4","tagline":"A library of shader nodes. +100 NEW NODES","archive_hash":"sha256:4c6040e0c5654c066fa66f48321857d44e26ca1726d3c8c70cd04050cb6efc30","archive_size":4261663,"archive_url":"https://extensions.blender.org/download/sha256:4c6040e0c5654c066fa66f48321857d44e26ca1726d3c8c70cd04050cb6efc30/add-on-proceduraltiles-v0.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/proceduraltiles/","maintainer":"Aisun-Tang","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Material"]},{"id":"simple_gcode_importer","schema_version":"1.0.0","name":"Simple Gcode Importer","version":"1.1.1","tagline":"Import Gcode to blender as paths","archive_hash":"sha256:aa644b0c5f1cb47878c08bddc029da401e9e357c5e82c4b254801e57897c8f29","archive_size":2397,"archive_url":"https://extensions.blender.org/download/sha256:aa644b0c5f1cb47878c08bddc029da401e9e357c5e82c4b254801e57897c8f29/add-on-simple-gcode-importer-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/simple-gcode-importer/","maintainer":"kmnunley","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Pipeline"]},{"id":"controller_link","schema_version":"1.0.0","name":"Controller Link","version":"1.0.1","tagline":"Use a gamepad as input","archive_hash":"sha256:cf2ef139dc3a07eb2185b91e19586bedaaa684d101fe03449d080262e2fe3c8f","archive_size":16281033,"archive_url":"https://extensions.blender.org/download/sha256:cf2ef139dc3a07eb2185b91e19586bedaaa684d101fe03449d080262e2fe3c8f/add-on-controller-link-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/controller-link/","maintainer":"globglob3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Sequencer"]},{"id":"glare_node_controller","schema_version":"1.0.0","name":"Glare Node Controller","version":"2.3.3","tagline":"panel to control Glare","archive_hash":"sha256:e9a4d48813add31c7f4c04198f4ebfba47dc88be90f4f828762e8ae2c3445d68","archive_size":3563,"archive_url":"https://extensions.blender.org/download/sha256:e9a4d48813add31c7f4c04198f4ebfba47dc88be90f4f828762e8ae2c3445d68/add-on-glare-node-controller-v2.3.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/glare-node-controller/","maintainer":"darkstarrd","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Render"]},{"id":"dragonff","schema_version":"1.0.0","name":"DragonFF","version":"1.1.0","tagline":"Add-on to edit RenderWare Formats (.dff, .txd, .col)","archive_hash":"sha256:08df6ba49bc85ea983e1661c1151d3ea2b03d7764e815cc85ffce8af31b8267e","archive_size":225580,"archive_url":"https://extensions.blender.org/download/sha256:08df6ba49bc85ea983e1661c1151d3ea2b03d7764e815cc85ffce8af31b8267e/add-on-dragonff-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dragonff/","maintainer":"Parik","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export DFF/TXD/COL/IPL/IDE from/to disk"},"tags":["Import-Export","3D View","Mesh","Material"]},{"id":"maya_pivot","schema_version":"1.0.0","name":"Maya Pivot","version":"1.0.0","tagline":"Implements a Maya-like pivot system in Blender","archive_hash":"sha256:14893b7a7fdef8ffd4ebb538f770b38257c020ca9a02b39d5f3a49dc674083e2","archive_size":16036,"archive_url":"https://extensions.blender.org/download/sha256:14893b7a7fdef8ffd4ebb538f770b38257c020ca9a02b39d5f3a49dc674083e2/add-on-maya-pivot-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/maya-pivot/","maintainer":"Zinkenite","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Modeling","Mesh"]},{"id":"Blueprint_Paper_Theme","schema_version":"1.0.0","name":"Blueprint_Paper_Theme","version":"2.2.6","tagline":"Technical Drawing","archive_hash":"sha256:c595ff36b50211cc40db65f33c7dc839fe50526be3d2208591546d9ee2046bea","archive_size":5761,"archive_url":"https://extensions.blender.org/download/sha256:c595ff36b50211cc40db65f33c7dc839fe50526be3d2208591546d9ee2046bea/theme-blueprint-paper-theme-v2.2.6.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/blueprint-paper-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"jiggle_physics","schema_version":"1.0.0","name":"Jiggle Physics","version":"4.5.1","tagline":"Add stretchy jiggle physics to your Blender rigs","archive_hash":"sha256:f746d7dbedefd926cc384b2fc65dc8b351201ec64d4ce5ba9e6944643fb4d7ab","archive_size":33411,"archive_url":"https://extensions.blender.org/download/sha256:f746d7dbedefd926cc384b2fc65dc8b351201ec64d4ce5ba9e6944643fb4d7ab/add-on-jiggle-physics-v4.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/jiggle-physics/","maintainer":"naelstrof","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"paws_bakery","schema_version":"1.0.0","name":"PAWS: Bakery","version":"0.5.1","tagline":"Texture Baking tools for Game-Ready pipeline by Pawsgineer","archive_hash":"sha256:3a9a2d5d563d38ff8fd3b76fec281213da773425995b2c5b79c7e69f35e17ad0","archive_size":165829,"archive_url":"https://extensions.blender.org/download/sha256:3a9a2d5d563d38ff8fd3b76fec281213da773425995b2c5b79c7e69f35e17ad0/add-on-paws-bakery-v0.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/paws-bakery/","maintainer":"Steve-Paws","license":["SPDX:GPL-3.0-or-later"],"tags":["Bake","Pipeline","Material"]},{"id":"MakePlanarFacesPlus","schema_version":"1.0.0","name":"Make Planar Faces Plus","version":"1.0.6","tagline":"Powerful Make Planar Faces Operator","archive_hash":"sha256:2d8f1251ee5c2099f2c71222dde827cc7ca31d358904203c28f5c066e1f69a6a","archive_size":257221,"archive_url":"https://extensions.blender.org/download/sha256:2d8f1251ee5c2099f2c71222dde827cc7ca31d358904203c28f5c066e1f69a6a/add-on-makeplanarfacesplus-v1.0.6-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/makeplanarfacesplus/","maintainer":"Anton-Florey","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Mesh"]},{"id":"shape_key_mirror_plus","schema_version":"1.0.0","name":"Shape Key Mirror Plus","version":"1.9.0","tagline":"Mirror shape key deltas across symmetric axes","archive_hash":"sha256:e67a7c722d2ad02a4c1fd5e9d99498193d0e1d604c86f20a45dd44ca5863b339","archive_size":17431,"archive_url":"https://extensions.blender.org/download/sha256:e67a7c722d2ad02a4c1fd5e9d99498193d0e1d604c86f20a45dd44ca5863b339/add-on-shape-key-mirror-plus-v1.9.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shape-key-mirror-plus/","maintainer":"Ciyorie","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"marchingcube","schema_version":"1.0.0","name":"Marching Cube","version":"0.1.0","tagline":"Generate iso-surface meshes using the Marching Cubes algorithm","archive_hash":"sha256:170039384f6ea5ee47454353fa0b6b88491223ed95f9a20bada47625294957e1","archive_size":41468675,"archive_url":"https://extensions.blender.org/download/sha256:170039384f6ea5ee47454353fa0b6b88491223ed95f9a20bada47625294957e1/add-on-marchingcube-v0.1.0-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/marchingcube/","maintainer":"Thomas-Berger","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Add Mesh"]},{"id":"terrainmixer","schema_version":"1.0.0","name":"Terrain Mixer","version":"3.1.2","tagline":"Easy to use shader-based terrain generator for Cycles","archive_hash":"sha256:2a695aac2b7966c0a64077ae76b7cfc1bfff857382250820e367a4be00852efd","archive_size":52570647,"archive_url":"https://extensions.blender.org/download/sha256:2a695aac2b7966c0a64077ae76b7cfc1bfff857382250820e367a4be00852efd/add-on-terrainmixer-v3.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/terrainmixer/","maintainer":"zets","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Easily replace default image files with your own","network":"Documentation and tutorials available online"},"tags":["Add Mesh","Bake","Material"]},{"id":"Viewport_stabilizer","schema_version":"1.0.0","name":"Viewport stabilizer","version":"1.0.2","tagline":"Stabilise 3d point on your screen","archive_hash":"sha256:ddb4f4e4d410fa18b27f934bcce9abcd451c8b494cccccd32f1de206926b9cd1","archive_size":5207,"archive_url":"https://extensions.blender.org/download/sha256:ddb4f4e4d410fa18b27f934bcce9abcd451c8b494cccccd32f1de206926b9cd1/add-on-viewport-stabilizer-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/viewport-stabilizer/","maintainer":"Yaroslav_Yushk","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Tracking"]},{"id":"multiple_camera_render","schema_version":"1.0.0","name":"Multiple Camera Render","version":"4.4.0","tagline":"Sequential rendering from multiple cameras","archive_hash":"sha256:2f475eeea55812da815c61c925b92cd8301733ab82a0fbb8e4e2c4dffaa1e441","archive_size":135372,"archive_url":"https://extensions.blender.org/download/sha256:2f475eeea55812da815c61c925b92cd8301733ab82a0fbb8e4e2c4dffaa1e441/add-on-multiple-camera-render-v4.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/multiple-camera-render/","maintainer":"ivan-perevala","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Writing execution log files inside extension directory"},"tags":["Render","Animation","Camera","3D View"]},{"id":"set_vertex_distance","schema_version":"1.0.0","name":"Set Vertex Distance","version":"1.0.0","tagline":"Set distance between two vertices along a specific axis","archive_hash":"sha256:7fce4c84550565f5013da5d3e9345826e6782a8e71c3a79309db28936a3b321f","archive_size":2537,"archive_url":"https://extensions.blender.org/download/sha256:7fce4c84550565f5013da5d3e9345826e6782a8e71c3a79309db28936a3b321f/add-on-set-vertex-distance-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/set-vertex-distance/","maintainer":"alicoskun","license":["SPDX:GPL-3.0-or-later"]},{"id":"modifer_stack_manager","schema_version":"1.0.0","name":"Modifier Stack Manager","version":"1.1.1","tagline":"A UI List implementation for Blender's modifier stack","archive_hash":"sha256:eb282b5114e718cd50c2c4b61b9a2dbb8ac067a70bed241dbd053a4c0de16996","archive_size":4750,"archive_url":"https://extensions.blender.org/download/sha256:eb282b5114e718cd50c2c4b61b9a2dbb8ac067a70bed241dbd053a4c0de16996/add-on-modifer-stack-manager-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/modifer-stack-manager/","maintainer":"salaivv","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","User Interface"]},{"id":"cloud_midnight_teal","schema_version":"1.0.0","name":"Cloud Guy's Theme","version":"1.0.3","tagline":"Custom theme made by me and a friend","archive_hash":"sha256:410cbdebbcb43282fbe2d27956a41eb2158a33f158e97418997f275a435c5816","archive_size":5920,"archive_url":"https://extensions.blender.org/download/sha256:410cbdebbcb43282fbe2d27956a41eb2158a33f158e97418997f275a435c5816/theme-cloud-midnight-teal-v1.0.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/cloud-midnight-teal/","maintainer":"Cloud-Guy","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"Cad_measure_extension","schema_version":"1.0.0","name":"Cad_Dimensions","version":"2.0.0","tagline":"Extension for a new measuring system","archive_hash":"sha256:fdc1a528d7808c897d7cf3469b09921a5b29174cfa6293400f82a1cd0eb65efb","archive_size":251303,"archive_url":"https://extensions.blender.org/download/sha256:fdc1a528d7808c897d7cf3469b09921a5b29174cfa6293400f82a1cd0eb65efb/add-on-cad-measure-extension-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cad-measure-extension/","maintainer":"Mr.Nobody3d","license":["SPDX:GPL-3.0-or-later"]},{"id":"Bbrush","schema_version":"1.0.0","name":"Bbrush","version":"1.4.9","tagline":"Sculpting using only a pen and keyboard","archive_hash":"sha256:9023336df67d3e06b36a4a3ec2a42ba422ef0735619981623e0afb8aeb20ec79","archive_size":548216,"archive_url":"https://extensions.blender.org/download/sha256:9023336df67d3e06b36a4a3ec2a42ba422ef0735619981623e0afb8aeb20ec79/add-on-bbrush-v1.4.9.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/bbrush/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Keymap file load, View navigation texture load"},"tags":["Sculpt"]},{"id":"geonode_to_shapekey","schema_version":"1.0.0","name":"Geonode To Shapekey","version":"1.1.0","tagline":"Convert geometry nodes to shapekeys. Useful for glTF export","archive_hash":"sha256:4ad895fdcf707fa593d79b1f862427969c832db213732d686c4d7c9da88f28cc","archive_size":5068,"archive_url":"https://extensions.blender.org/download/sha256:4ad895fdcf707fa593d79b1f862427969c832db213732d686c4d7c9da88f28cc/add-on-geonode-to-shapekey-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/geonode-to-shapekey/","maintainer":"Jan-Hendrik-Müller","license":["SPDX:GPL-3.0-or-later"],"tags":["Geometry Nodes","Pipeline"]},{"id":"nocturna_theme","schema_version":"1.0.0","name":"Nocturna","version":"1.2.1","tagline":"Nocturna - A Dark Theme for Blender","archive_hash":"sha256:3fae311dca0321b9cd8e70e6f214a76f088339e3260ca79b4de4bc36617a2fc7","archive_size":5825,"archive_url":"https://extensions.blender.org/download/sha256:3fae311dca0321b9cd8e70e6f214a76f088339e3260ca79b4de4bc36617a2fc7/theme-nocturna-theme-v1.2.1.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/themes/nocturna-theme/","maintainer":"AlejandroSQR","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"better_bend","schema_version":"1.0.0","name":"Better Bend","version":"1.1.0","tagline":"Cinema 4D-style deformers for Blender","archive_hash":"sha256:a7ce330e85d172706da357cd6291d96663c1a1386c758bcb41a1eb7aa41d1a91","archive_size":4729,"archive_url":"https://extensions.blender.org/download/sha256:a7ce330e85d172706da357cd6291d96663c1a1386c758bcb41a1eb7aa41d1a91/add-on-better-bend-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/better-bend/","maintainer":"Lije.Morgan","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh"]},{"id":"capture_thumbnails_from_viewport","schema_version":"1.0.0","name":"Asset Browser: Capture Thumbnail from Viewport","version":"1.0.3","tagline":"Add new thumbnails for you asset based on the current viewport","archive_hash":"sha256:116dd46abed00a8bbe841a48a5872c48905a79f90a09c8a472c30aa0f13c48f6","archive_size":1759,"archive_url":"https://extensions.blender.org/download/sha256:116dd46abed00a8bbe841a48a5872c48905a79f90a09c8a472c30aa0f13c48f6/add-on-capture-thumbnails-from-viewport-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/capture-thumbnails-from-viewport/","maintainer":"Dan-Gry","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Create a .png in temp folder"},"tags":["Pipeline"]},{"id":"skin_weights_copypaster","schema_version":"1.0.0","name":"Skin Weights Copypaster","version":"0.3.3","tagline":"Copies skin weights from one vertex to selection","archive_hash":"sha256:16d5bcface65447e03e57a4cd169d64b200df2e4ac88a9e7290dbc5e3d9324b3","archive_size":16850,"archive_url":"https://extensions.blender.org/download/sha256:16d5bcface65447e03e57a4cd169d64b200df2e4ac88a9e7290dbc5e3d9324b3/add-on-skin-weights-copypaster-v0.3.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/skin-weights-copypaster/","maintainer":"Ihor-Spasivskyi","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"MAD","schema_version":"1.0.0","name":"MAD (Microphone Audio Driver)","version":"0.1.6","tagline":"Use your Microphone as an Animation Driver in Blender","archive_hash":"sha256:fd2c01fb744c526daa1d1a4020d315cbf2568bd18460d528a3dfb0a4daf3232b","archive_size":663187,"archive_url":"https://extensions.blender.org/download/sha256:fd2c01fb744c526daa1d1a4020d315cbf2568bd18460d528a3dfb0a4daf3232b/add-on-mad-v0.1.6-windows-x64-windows-arm64.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/mad/","maintainer":"F1dg3t","license":["SPDX:GPL-3.0-or-later"],"permissions":{"microphone":"Capture audio input for real-time animation"},"platforms":["windows-x64","windows-arm64"],"tags":["Rigging","Animation"]},{"id":"iocgpoly_lip_sync","schema_version":"1.0.0","name":"Lip Sync","version":"2.3.2","tagline":"Automatic lip sync for your Blender models","archive_hash":"sha256:8c761c89173c714eee0114471ed8f13c99b09a811ec11d7dbbce72a9599024a3","archive_size":37476376,"archive_url":"https://extensions.blender.org/download/sha256:8c761c89173c714eee0114471ed8f13c99b09a811ec11d7dbbce72a9599024a3/add-on-iocgpoly-lip-sync-v2.3.2-windows-x64.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/iocgpoly-lip-sync/","maintainer":"Charley3D","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import Models / Extract libs to disk","network":"Need to download Voices Models to enable lip sync"},"platforms":["windows-x64"],"tags":["Animation","Sequencer"]},{"id":"FakeBones","schema_version":"1.0.0","name":"FakeBones","version":"1.0.7","tagline":"enhance armature visualization","archive_hash":"sha256:1c766ee1bf8f385f3f87169b37b3c2447d5620c59a090ff413da6ee6cd30aed1","archive_size":4158,"archive_url":"https://extensions.blender.org/download/sha256:1c766ee1bf8f385f3f87169b37b3c2447d5620c59a090ff413da6ee6cd30aed1/add-on-fakebones-v1.0.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/fakebones/","maintainer":"maylog","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"Steam","schema_version":"1.0.0","name":"Steam","version":"2.0.0","tagline":"Inspired by the old Steam UI. ","archive_hash":"sha256:06fa0615e3c58a9c12322991164b0133e84214310a9241c70f062e5b5f79ca98","archive_size":5570,"archive_url":"https://extensions.blender.org/download/sha256:06fa0615e3c58a9c12322991164b0133e84214310a9241c70f062e5b5f79ca98/theme-steam-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/steam/","maintainer":"ArtinŌr","license":["SPDX:GPL-2.0-or-later"],"tags":["Inspired By"]},{"id":"AnimCurveSorter","schema_version":"1.0.0","name":"Anim Curve Sorter","version":"1.0.2","tagline":"Easily organise your animation curves","archive_hash":"sha256:2952fa50ce39cdff182259c7041e4a276a7524a73813d2adc75f448c3afa1721","archive_size":17382,"archive_url":"https://extensions.blender.org/download/sha256:2952fa50ce39cdff182259c7041e4a276a7524a73813d2adc75f448c3afa1721/add-on-animcurvesorter-v1.0.2.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/animcurvesorter/","maintainer":"Duncan-Readle","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"ccustomnodes","schema_version":"1.0.0","name":"Object Utility Nodes","version":"1.0.4","tagline":"Custom nodes in new node editor","archive_hash":"sha256:17ae56da737287d2b7ba7c350d5c6697fef15227c45deb45ce46b8abfad81180","archive_size":7115868,"archive_url":"https://extensions.blender.org/download/sha256:17ae56da737287d2b7ba7c350d5c6697fef15227c45deb45ce46b8abfad81180/add-on-ccustomnodes-v1.0.4-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ccustomnodes/","maintainer":"Bitsqueezer","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save colorwheel pictures from/to temp folder"},"platforms":["windows-x64"],"tags":["Node"]},{"id":"easymesh_batch_exporter","schema_version":"1.0.0","name":"EasyMesh Batch Exporter","version":"1.5.0","tagline":"Streamlined mesh export for game development workflows","archive_hash":"sha256:a9cd9781b45a61a0727c6c357efdb2fa80f654cd0ed7b6fe745c68c3eab4bae6","archive_size":84118,"archive_url":"https://extensions.blender.org/download/sha256:a9cd9781b45a61a0727c6c357efdb2fa80f654cd0ed7b6fe745c68c3eab4bae6/add-on-easymesh-batch-exporter-v1.5.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/easymesh-batch-exporter/","maintainer":"spec-arte","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export mesh files to the specified directory"},"tags":["Import-Export"]},{"id":"SuperDuperBatchExporter","schema_version":"1.0.0","name":"Super Duper Batch Exporter","version":"2.7.1","tagline":"One click export to multiple files","archive_hash":"sha256:b059d3638a93664d7c57350a0396f57f9b7aef65a30dc8eb91a51f042793edf6","archive_size":27233,"archive_url":"https://extensions.blender.org/download/sha256:b059d3638a93664d7c57350a0396f57f9b7aef65a30dc8eb91a51f042793edf6/add-on-superduperbatchexporter-v2.7.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/superduperbatchexporter/","maintainer":"BastianLS","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export files to disk & create subdirectories in output directory"},"tags":["Import-Export"]},{"id":"measure_and_scale","schema_version":"1.0.0","name":"Measure and Scale","version":"1.1.6","tagline":"Measure and Scale object uniformaly","archive_hash":"sha256:b62e9e246a90461e15f2a8c74fca1afea39f7364793e284ac73b14b21b23f7e5","archive_size":9679,"archive_url":"https://extensions.blender.org/download/sha256:b62e9e246a90461e15f2a8c74fca1afea39f7364793e284ac73b14b21b23f7e5/add-on-measure-and-scale-v1.1.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/measure-and-scale/","maintainer":"Belaid-ZIANE","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling"]},{"id":"Enhanced_Top_Bar","schema_version":"1.0.0","name":"Enhanced Top Bar","version":"1.0.4","tagline":"Easy access to your ViewLayers rendering properties","archive_hash":"sha256:6cafc46869812bea3791ae4a8c67205e4d88da53f8123826710da58d688150c5","archive_size":6863,"archive_url":"https://extensions.blender.org/download/sha256:6cafc46869812bea3791ae4a8c67205e4d88da53f8123826710da58d688150c5/add-on-enhanced-top-bar-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/enhanced-top-bar/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"Mesh2Rig","schema_version":"1.0.0","name":"Mesh2Rig","version":"2.5.0","tagline":"Transfer simulation, shape keys and other to rig animation","archive_hash":"sha256:5c8623854ee991516160767ee929f214a96e367fa416266866479d133652674a","archive_size":16675,"archive_url":"https://extensions.blender.org/download/sha256:5c8623854ee991516160767ee929f214a96e367fa416266866479d133652674a/add-on-mesh2rig-v2.5.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mesh2rig/","maintainer":"Sporenoe3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Animation","Bake","Game Engine","Pipeline"]},{"id":"Individual_Camera_Properties","schema_version":"1.0.0","name":"Individual Camera Properties","version":"0.0.8","tagline":"Resolution, Scene and Render properties for each camera instance","archive_hash":"sha256:68ed807040c7ee2050fc96ffc7bf5e7acd85c26cd9b42664668aa88ed7021872","archive_size":6710,"archive_url":"https://extensions.blender.org/download/sha256:68ed807040c7ee2050fc96ffc7bf5e7acd85c26cd9b42664668aa88ed7021872/add-on-individual-camera-properties-v0.0.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/individual-camera-properties/","maintainer":"Alexander-Bicukow","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"VSE_SRT_Subtitle_Importer_4_2_extension","schema_version":"1.0.0","name":"SRT Subtitle Importer/Exporter","version":"2.0.0","tagline":"Import/Export SRT subtitle files to/from VSE strips","archive_hash":"sha256:53f5b2f01d444edd210bcee5b14b751807cd855e1f8a4a83423e49c9c6e0fe64","archive_size":7448,"archive_url":"https://extensions.blender.org/download/sha256:53f5b2f01d444edd210bcee5b14b751807cd855e1f8a4a83423e49c9c6e0fe64/add-on-vse-srt-subtitle-importer-4-2-extension-v2.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/vse-srt-subtitle-importer-4-2-extension/","maintainer":"PoYakong","license":["SPDX:GPL-3.0-or-later"],"tags":["Sequencer"]},{"id":"DorchaLiath","schema_version":"1.0.0","name":"Dorcha Liath","version":"5.0.1","tagline":"Dark Grey","archive_hash":"sha256:aba960fe244b919144407a104c23e98037803095bc2856c08c8aef58ffaf326d","archive_size":5206,"archive_url":"https://extensions.blender.org/download/sha256:aba960fe244b919144407a104c23e98037803095bc2856c08c8aef58ffaf326d/theme-dorchaliath-v5.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/dorchaliath/","maintainer":"rory-fly","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"QuickCatalogs","schema_version":"1.0.0","name":"Quick Catalogs ( Asset Browser )","version":"1.0.1","tagline":"Make Asset Catalogs from selected Collections","archive_hash":"sha256:e1722de20f9f40adb186d41b6b86681506b8daa0182c92d2353e213b77bb53c4","archive_size":2298,"archive_url":"https://extensions.blender.org/download/sha256:e1722de20f9f40adb186d41b6b86681506b8daa0182c92d2353e213b77bb53c4/add-on-quickcatalogs-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quickcatalogs/","maintainer":"justOniL","license":["SPDX:GPL-3.0-or-later"],"tags":["Pipeline"]},{"id":"import_export_skin_weights","schema_version":"1.0.0","name":"Import Export Skin Weights","version":"1.0.1","tagline":"Import and export skin weights for Blender","archive_hash":"sha256:248b74f7b176819621f0cd33276070b1ad22c2112f80bfc628045dfea16f6412","archive_size":16987,"archive_url":"https://extensions.blender.org/download/sha256:248b74f7b176819621f0cd33276070b1ad22c2112f80bfc628045dfea16f6412/add-on-import-export-skin-weights-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/import-export-skin-weights/","maintainer":"Nguyen-Phuc-Nguyen","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Import-Export"]},{"id":"menace","schema_version":"1.0.0","name":"Menace","version":"2.0.0","tagline":"The official HugeMenace theme for Blender","archive_hash":"sha256:ecbb9abc2836fe097c57fe9a5212dcc1fc9a80e62a932e477cf3509922f4cd3d","archive_size":5448,"archive_url":"https://extensions.blender.org/download/sha256:ecbb9abc2836fe097c57fe9a5212dcc1fc9a80e62a932e477cf3509922f4cd3d/theme-menace-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/menace/","maintainer":"HugeMenace","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"solid_boot","schema_version":"1.0.0","name":"Solid Boot","version":"1.1.0","tagline":"3D Views loaded in Solid Mode rather Material Preview","archive_hash":"sha256:97801936f20f108a733fff22fb754a65b4f6af115b0e070a999df4fa66de80fa","archive_size":15759,"archive_url":"https://extensions.blender.org/download/sha256:97801936f20f108a733fff22fb754a65b4f6af115b0e070a999df4fa66de80fa/add-on-solid-boot-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/solid-boot/","maintainer":"CosmoMídias","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"neon_nexus","schema_version":"1.0.0","name":"Neon Nexus","version":"1.3.0","tagline":"A futuristic neon theme for Blender","archive_hash":"sha256:604c5dfb99da740289269b626215bedd10bf5190621aa82e15dd940cfa74c59a","archive_size":6154,"archive_url":"https://extensions.blender.org/download/sha256:604c5dfb99da740289269b626215bedd10bf5190621aa82e15dd940cfa74c59a/theme-neon-nexus-v1.3.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/neon-nexus/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","High Contrast"]},{"id":"SaveSelection","schema_version":"1.0.0","name":"Save Selection","version":"1.0.5","tagline":"Save selected objects in Blender Format","archive_hash":"sha256:615594aed9531a69fb49db5f928888886812f5ed83a63974a694a21f0e8f769e","archive_size":3694,"archive_url":"https://extensions.blender.org/download/sha256:615594aed9531a69fb49db5f928888886812f5ed83a63974a694a21f0e8f769e/add-on-saveselection-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/saveselection/","maintainer":"Blenderbob","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"grey_orange","schema_version":"1.0.0","name":"Grey Orange","version":"3.0.1","tagline":"Dark neutral grey theme with orange accents","archive_hash":"sha256:709dedcdc1550233f0bec9ca7fa0b78aaab608a61b73b17fe35a1bfdb5da8085","archive_size":6581,"archive_url":"https://extensions.blender.org/download/sha256:709dedcdc1550233f0bec9ca7fa0b78aaab608a61b73b17fe35a1bfdb5da8085/theme-grey-orange-v3.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/grey-orange/","maintainer":"TimoShch","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"Neutro_Laranja","schema_version":"1.0.0","name":"Neutro Laranja","version":"2.0.0","tagline":"Light and Orange","archive_hash":"sha256:0059799f0f8dcc1d1057362542c2df42d57ab22fa716e060615b0344854b9cf7","archive_size":6441,"archive_url":"https://extensions.blender.org/download/sha256:0059799f0f8dcc1d1057362542c2df42d57ab22fa716e060615b0344854b9cf7/theme-neutro-laranja-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/neutro-laranja/","maintainer":"Push","license":["SPDX:GPL-3.0-or-later"]},{"id":"quickj","schema_version":"1.0.0","name":"Quick J ( Connect Vertex Path )","version":"1.2.0","tagline":"Quickly connect vertices under the cursor","archive_hash":"sha256:4c7a02ff221bd957d9d8be2cadf5519a2bc68adb9ca7960abb5bbe246dab1905","archive_size":2524,"archive_url":"https://extensions.blender.org/download/sha256:4c7a02ff221bd957d9d8be2cadf5519a2bc68adb9ca7960abb5bbe246dab1905/add-on-quickj-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quickj/","maintainer":"justOniL","license":["SPDX:GPL-3.0-or-later"],"tags":["Pipeline"]},{"id":"Batch_Material_Helper","schema_version":"1.0.0","name":"Batch Material Helper","version":"1.0.6","tagline":"Helps you quickly modify materials","archive_hash":"sha256:ce7f2ea29bd087f1f26e882133fd0ebf5212ed14fa547fa6c6bf4288f0d38ca5","archive_size":4099,"archive_url":"https://extensions.blender.org/download/sha256:ce7f2ea29bd087f1f26e882133fd0ebf5212ed14fa547fa6c6bf4288f0d38ca5/add-on-batch-material-helper-v1.0.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/batch-material-helper/","maintainer":"maylog","license":["SPDX:GPL-3.0-or-later"],"tags":["Material"]},{"id":"UV_Flatten_Tool","schema_version":"1.0.0","name":"UV_Flatten_Tool","version":"1.0.7","tagline":"Flatten mesh to active UV coordinates and store as shape key","archive_hash":"sha256:ab3b58a97af9c8c1e7d329be2869bca7c4a714e6d57abf7aa37c80c47a82f16b","archive_size":2774,"archive_url":"https://extensions.blender.org/download/sha256:ab3b58a97af9c8c1e7d329be2869bca7c4a714e6d57abf7aa37c80c47a82f16b/add-on-uv-flatten-tool-v1.0.7.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/uv-flatten-tool/","maintainer":"maylog","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"fractal_family","schema_version":"1.0.0","name":"Fractal Family","version":"1.1.6","tagline":"Create fractal curves with ease using complex integer lattices","archive_hash":"sha256:9b6497b8c5234dd27036654f8dbc1f2807466695ee6bc69aefcc3e30fdb6b570","archive_size":16744,"archive_url":"https://extensions.blender.org/download/sha256:9b6497b8c5234dd27036654f8dbc1f2807466695ee6bc69aefcc3e30fdb6b570/add-on-fractal-family-v1.1.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/fractal-family/","maintainer":"imare32","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Curve"]},{"id":"apply_modifiers_with_shape_keys","schema_version":"1.0.0","name":"Apply modifier with shape keys","version":"1.0.4","tagline":"Applies modifiers on objects even if they have shape keys","archive_hash":"sha256:063ae9bfae007c27e2ba34b3d0a990a6bb68d923af828b1d06510c95972881ab","archive_size":19128,"archive_url":"https://extensions.blender.org/download/sha256:063ae9bfae007c27e2ba34b3d0a990a6bb68d923af828b1d06510c95972881ab/add-on-apply-modifiers-with-shape-keys-v1.0.4.zip","type":"add-on","blender_version_min":"4.3.2","website":"https://extensions.blender.org/add-ons/apply-modifiers-with-shape-keys/","maintainer":"Orange Turbine","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Modeling","Rigging"]},{"id":"animation_transform_offset","schema_version":"1.0.0","name":"Animation Transform Offset","version":"1.0.0","tagline":"Transform objects and offset their animations in one go","archive_hash":"sha256:8b5beb3a69b3a1923a4be6dfbd5089b9cca27fdaa23b035d43508c479dbf58fc","archive_size":15793,"archive_url":"https://extensions.blender.org/download/sha256:8b5beb3a69b3a1923a4be6dfbd5089b9cca27fdaa23b035d43508c479dbf58fc/add-on-animation-transform-offset-v1.0.0.zip","type":"add-on","blender_version_min":"4.3.2","website":"https://extensions.blender.org/add-ons/animation-transform-offset/","maintainer":"softyoda","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"multi_user","schema_version":"1.0.0","name":"Multiuser","version":"0.7.4","tagline":"Enable real-time collaborative workflow inside blender","archive_hash":"sha256:8d3be85891043e403cda5da0f527cb1daf9f3480d753beac683a551abc6fdfef","archive_size":2558933,"archive_url":"https://extensions.blender.org/download/sha256:8d3be85891043e403cda5da0f527cb1daf9f3480d753beac683a551abc6fdfef/add-on-multi-user-v0.7.4-windows-x64.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/multi-user/","maintainer":"slumber","license":["SPDX:GPL-3.0-or-later"],"permissions":{"network":"Need to sync scene data to server"},"platforms":["windows-x64"]},{"id":"references_overlays","schema_version":"1.0.0","name":"References Overlays","version":"2.2.8","tagline":"PureRef for Blender. You can add references in the 3D Viewport","archive_hash":"sha256:2e01d8d844ebfc73e5f290cf8ef02ec80c02542879a82f552962788f6808c010","archive_size":14729,"archive_url":"https://extensions.blender.org/download/sha256:2e01d8d844ebfc73e5f290cf8ef02ec80c02542879a82f552962788f6808c010/add-on-references-overlays-v2.2.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/references-overlays/","maintainer":"KENKEN","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import BMP/TIFF/PNG/JPG/JPEG/GIF/MP4/WEBM from/to disk","clipboard":"Paste image from the Clipboard"},"tags":["3D View","User Interface"]},{"id":"altview","schema_version":"1.0.0","name":"AltView","version":"1.0.1","tagline":"Switch views + lock/unlock rotation","archive_hash":"sha256:ea3678752e8e16cf258ae1eb0a2e0701ca228ae523a0163f8d0dbf030546cb60","archive_size":4561,"archive_url":"https://extensions.blender.org/download/sha256:ea3678752e8e16cf258ae1eb0a2e0701ca228ae523a0163f8d0dbf030546cb60/add-on-altview-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.5","website":"https://extensions.blender.org/add-ons/altview/","maintainer":"Iurii-Tiuzhin","license":["SPDX:GPL-3.0-or-later"]},{"id":"remove_static_fcurves","schema_version":"1.0.0","name":"Remove Static FCurves","version":"0.4.0","tagline":"Clean up animation channels that have no data","archive_hash":"sha256:3cd0f3e31abab7e43f94fe836167b818f5e9de0f62563c635abbf2da976b120d","archive_size":6729,"archive_url":"https://extensions.blender.org/download/sha256:3cd0f3e31abab7e43f94fe836167b818f5e9de0f62563c635abbf2da976b120d/add-on-remove-static-fcurves-v0.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/remove-static-fcurves/","maintainer":"lokimckay","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"paint_system","schema_version":"1.0.0","name":"Paint System","version":"2.1.10","tagline":"Addon for adding painting system to blender","archive_hash":"sha256:fd6c46c5b3182528f6552e2d09ca7524cc491e6e004943b82f3e9c8f108f65d5","archive_size":3880164,"archive_url":"https://extensions.blender.org/download/sha256:fd6c46c5b3182528f6552e2d09ca7524cc491e6e004943b82f3e9c8f108f65d5/add-on-paint-system-v2.1.10.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/paint-system/","maintainer":"Tawan-Sunflower","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Loading and saving images / detecting image editors","network":"Update donation information"},"tags":["Paint"]},{"id":"PlaceHelper","schema_version":"1.0.0","name":"Place Helper","version":"1.3.9","tagline":"Easily place objects in Blender","archive_hash":"sha256:1d9da3b2660df6b81dc31cf34e1dd8bd8daa26fd6fde4048107b0348669248f9","archive_size":69644,"archive_url":"https://extensions.blender.org/download/sha256:1d9da3b2660df6b81dc31cf34e1dd8bd8daa26fd6fde4048107b0348669248f9/add-on-placehelper-v1.3.9.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/placehelper/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Modeling","Object"]},{"id":"headsup_warnings","schema_version":"1.0.0","name":"HeadsUp Warnings","version":"1.1.0","tagline":"Display UI warnings to avoid and resolve common mistakes","archive_hash":"sha256:d4d30ca6d12c48a3bfe4873687817d28351c1eb17768db0687f999f96c880880","archive_size":33611,"archive_url":"https://extensions.blender.org/download/sha256:d4d30ca6d12c48a3bfe4873687817d28351c1eb17768db0687f999f96c880880/add-on-headsup-warnings-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/headsup-warnings/","maintainer":"ManuelLuellau","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Check filepaths to validate if Textures are missing"},"tags":["3D View","Compositing","Render"]},{"id":"unlooped","schema_version":"1.0.0","name":"Unlooped","version":"1.0.1","tagline":"Prevent Blender from looping scene playback","archive_hash":"sha256:a254b5faa77745aa3ec6fbd93cfc02d6933dcc20cd4e9f9fe6c853f937b733f4","archive_size":14253,"archive_url":"https://extensions.blender.org/download/sha256:a254b5faa77745aa3ec6fbd93cfc02d6933dcc20cd4e9f9fe6c853f937b733f4/add-on-unlooped-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/unlooped/","maintainer":"dr.sybren","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"Blend95","schema_version":"1.0.0","name":"Blend95","version":"0.9.9","tagline":"90s, xp, old","archive_hash":"sha256:703fb6ee41932457974b4dea4842f5af632cc48b0ed249d41e7ca477a4df993f","archive_size":5908,"archive_url":"https://extensions.blender.org/download/sha256:703fb6ee41932457974b4dea4842f5af632cc48b0ed249d41e7ca477a4df993f/theme-blend95-v0.9.9.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/themes/blend95/","maintainer":"romanasdf1","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"Quick_Studio_Light","schema_version":"1.0.0","name":"Quick Studio Light","version":"1.1.3","tagline":"Simple and fast lighting with improved selection","archive_hash":"sha256:2b26bafdae5d3988f0329dd1a66cf7d4de06798cc91ff8266c4dc79c955051d1","archive_size":82518,"archive_url":"https://extensions.blender.org/download/sha256:2b26bafdae5d3988f0329dd1a66cf7d4de06798cc91ff8266c4dc79c955051d1/add-on-quick-studio-light-v1.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-studio-light/","maintainer":"Shuimeng","license":["SPDX:GPL-3.0-or-later"],"tags":["Lighting","3D View"]},{"id":"hyperfy_tools","schema_version":"1.0.0","name":"Hyperfy Tools","version":"1.5.0","tagline":"Tools for creating Hyperfy assets","archive_hash":"sha256:bbf553172d87314a6cf48554155f8e789f9a39cda2d46f5e92155bbf2d2d857e","archive_size":25418,"archive_url":"https://extensions.blender.org/download/sha256:bbf553172d87314a6cf48554155f8e789f9a39cda2d46f5e92155bbf2d2d857e/add-on-hyperfy-tools-v1.5.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/hyperfy-tools/","maintainer":"HowieDuhzit","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export GLB files from/to disk"},"tags":["Physics","Import-Export","3D View","Game Engine","Object"]},{"id":"typst_importer","schema_version":"1.0.0","name":"Typst Importer","version":"0.3.0","tagline":"Render mathematical equations and code blocks","archive_hash":"sha256:e5c2cbe6c07106c97005b6e503a476921a6c87a35272216af2cd0b82c1c1c928","archive_size":25575164,"archive_url":"https://extensions.blender.org/download/sha256:e5c2cbe6c07106c97005b6e503a476921a6c87a35272216af2cd0b82c1c1c928/add-on-typst-importer-v0.3.0-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/typst-importer/","maintainer":"Jan-Hendrik-Müller","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Importing data files from disk"},"platforms":["windows-x64"],"tags":["Geometry Nodes","Import-Export"]},{"id":"node_align","schema_version":"1.0.0","name":"Node Align(节点对齐)","version":"3.2.1","tagline":"Shift+Q|Ctrl+Q Pie menu-Align Nodes in Multiple Ways(多种方式对齐节点)","archive_hash":"sha256:26edd1b46ecc3fe504ff144369921bd3ac87fbd68f3eef241b053cefba728997","archive_size":23590,"archive_url":"https://extensions.blender.org/download/sha256:26edd1b46ecc3fe504ff144369921bd3ac87fbd68f3eef241b053cefba728997/add-on-node-align-v3.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-align/","maintainer":"W_Cloud","license":["SPDX:GPL-3.0-or-later"],"tags":["Node"]},{"id":"gp_tween","schema_version":"1.0.0","name":"GP Tween (c)","version":"2.4.0","tagline":"Quick Grease Pencil Tweening","archive_hash":"sha256:c5990e9a2ae583535ea2179e225effa84ea7e11a8870cd3c390dc75773116e25","archive_size":169988,"archive_url":"https://extensions.blender.org/download/sha256:c5990e9a2ae583535ea2179e225effa84ea7e11a8870cd3c390dc75773116e25/add-on-gp-tween-v2.4.0.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/gp-tween/","maintainer":"cosmosmythos","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write GP Tween nodegroup asset from/to disk","clipboard":"Copy and Paste GP Tween nodegroup"},"tags":["Grease Pencil","Animation","Geometry Nodes"]},{"id":"time_tracker","schema_version":"1.0.0","name":"Time Tracker","version":"0.2.4","tagline":"This extension tracks your time spent in blend files","archive_hash":"sha256:69178cd1c0f07232a68f85724b0f76e005d221c18a0e466619f49ac957bd87b9","archive_size":23923,"archive_url":"https://extensions.blender.org/download/sha256:69178cd1c0f07232a68f85724b0f76e005d221c18a0e466619f49ac957bd87b9/add-on-time-tracker-v0.2.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/time-tracker/","maintainer":"PhinDev","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save timing data to disk"},"tags":["System"]},{"id":"simple_audio_visualizer","schema_version":"1.0.0","name":"Simple Audio Visualizer","version":"1.2.0","tagline":"Creates a simple audio visualizer","archive_hash":"sha256:311d38d93b5734290ea4e3cb8d5f8ddc8a757ea4376bcf8fa56d183daed76190","archive_size":6391,"archive_url":"https://extensions.blender.org/download/sha256:311d38d93b5734290ea4e3cb8d5f8ddc8a757ea4376bcf8fa56d183daed76190/add-on-simple-audio-visualizer-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/simple-audio-visualizer/","maintainer":"Polyfjord","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import audio from disk"},"tags":["Animation"]},{"id":"easy_clouds","schema_version":"1.0.0","name":"Easy Clouds","version":"2.2.0","tagline":"Procedural clouds that are easy to customize","archive_hash":"sha256:98f8d4ca22c8e8a0ec85e0ad98f0d681fedd8c7f346766a8fb53aa69207eb2fd","archive_size":10614,"archive_url":"https://extensions.blender.org/download/sha256:98f8d4ca22c8e8a0ec85e0ad98f0d681fedd8c7f346766a8fb53aa69207eb2fd/add-on-easy-clouds-v2.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/easy-clouds/","maintainer":"LunarKitten","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","Add Mesh","Node"]},{"id":"MustardSimplify","schema_version":"1.0.0","name":"Mustard Simplify","version":"2025.4.1","tagline":"Tool to simplify scenes for improved viewport performance","archive_hash":"sha256:13e259e69cd0b5187fdf44d66c8dd9108b8ea96f1011c68ca5d29a23848951e1","archive_size":42341,"archive_url":"https://extensions.blender.org/download/sha256:13e259e69cd0b5187fdf44d66c8dd9108b8ea96f1011c68ca5d29a23848951e1/add-on-mustardsimplify-v2025.4.1.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/mustardsimplify/","maintainer":"Mustard","license":["SPDX:GPL-3.0-or-later"],"tags":["Scene"]},{"id":"QuickTools_v3","schema_version":"1.0.0","name":"Grease Pencil QuickTools_v3","version":"1.1.5","tagline":"Grease Pencil Toobar in N sidebar with auto mode switch","archive_hash":"sha256:566feddd3ffbe0628772f24be8c819b7aa40ce1a0dbd3ed24526e5a69d36a8a3","archive_size":53225,"archive_url":"https://extensions.blender.org/download/sha256:566feddd3ffbe0628772f24be8c819b7aa40ce1a0dbd3ed24526e5a69d36a8a3/add-on-quicktools-v3-v1.1.5.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/quicktools-v3/","maintainer":"PongBuster","license":["SPDX:GPL-3.0-or-later"],"tags":["Grease Pencil"]},{"id":"named_attribute_list","schema_version":"1.0.0","name":"Named Attribute List(命名属性列表)","version":"2.8.2","tagline":"Quickly Add Attribute Node in GN and Shader(几何节点和材质里快速添加属性节点)","archive_hash":"sha256:e7291be67f8c4f96f80166a43b8697db2ea70c2c0826e81741f3421905931772","archive_size":98415,"archive_url":"https://extensions.blender.org/download/sha256:e7291be67f8c4f96f80166a43b8697db2ea70c2c0826e81741f3421905931772/add-on-named-attribute-list-v2.8.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/named-attribute-list/","maintainer":"W_Cloud","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Geometry Nodes"]},{"id":"CurveFitting","schema_version":"1.0.0","name":"Curve Fitting","version":"0.3.0","tagline":"Smooth out uneven vertex arrangements keeping original shape","archive_hash":"sha256:4c39752087fdab6108589e4506824701cf6d352f32e6be8f66891362bd382e9a","archive_size":22449,"archive_url":"https://extensions.blender.org/download/sha256:4c39752087fdab6108589e4506824701cf6d352f32e6be8f66891362bd382e9a/add-on-curvefitting-v0.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/curvefitting/","maintainer":"zuda77","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"Utilities_Gadget","schema_version":"1.0.0","name":"Utilities Gadget","version":"1.1.5","tagline":"Batch rendering and model conversio","archive_hash":"sha256:9a56ba155f59e292d1769e1ac3cd3eb641cc9013ead197853fa398757be9d6bc","archive_size":6095,"archive_url":"https://extensions.blender.org/download/sha256:9a56ba155f59e292d1769e1ac3cd3eb641cc9013ead197853fa398757be9d6bc/add-on-utilities-gadget-v1.1.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/utilities-gadget/","maintainer":"HurcaGuari","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"bbone_Tools","schema_version":"1.0.0","name":"the bendybones toolkit","version":"1.6.0","tagline":"a simple toolkit for rigging with bendybones","archive_hash":"sha256:a5560c8e61a605354ae65519f983ac19636fcdcebc5f781bde727d58e7906a79","archive_size":4337,"archive_url":"https://extensions.blender.org/download/sha256:a5560c8e61a605354ae65519f983ac19636fcdcebc5f781bde727d58e7906a79/add-on-bbone-tools-v1.6.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bbone-tools/","maintainer":"Felipe-G","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"viewtools","schema_version":"1.0.0","name":"ViewTools","version":"1.0.0","tagline":"Essential Viewport tools for industrial workflows","archive_hash":"sha256:1d9bb6ed90fc9f289b34e63efb833acb370dd6aaed98a19183c13598236a8922","archive_size":4857,"archive_url":"https://extensions.blender.org/download/sha256:1d9bb6ed90fc9f289b34e63efb833acb370dd6aaed98a19183c13598236a8922/add-on-viewtools-v1.0.0.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/viewtools/","maintainer":"Ishara-Sandeepa","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","User Interface","Mesh","Object"]},{"id":"Coloraide","schema_version":"1.0.0","name":"Coloraide","version":"1.5.1","tagline":"Advanced color picking and color management tools","archive_hash":"sha256:fa5bd04b137b323589d0d5a344d554a52aaff0611bdfeec2611a9c8e4da015ad","archive_size":75163,"archive_url":"https://extensions.blender.org/download/sha256:fa5bd04b137b323589d0d5a344d554a52aaff0611bdfeec2611a9c8e4da015ad/add-on-coloraide-v1.5.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/coloraide/","maintainer":"longiy","license":["SPDX:GPL-3.0-or-later"],"tags":["Paint","Grease Pencil","3D View"]},{"id":"persiantype","schema_version":"1.0.0","name":"Persian type","version":"2.0.1","tagline":"Add Persian/Arabic type directly to Blender","archive_hash":"sha256:f519fd2e627f369686c5b9272526326b5cfb37e2555deb39f1a17299b8f1cb9e","archive_size":1952767,"archive_url":"https://extensions.blender.org/download/sha256:f519fd2e627f369686c5b9272526326b5cfb37e2555deb39f1a17299b8f1cb9e/add-on-persiantype-v2.0.1.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/persiantype/","maintainer":"Damyar","license":["SPDX:GPL-3.0-or-later"]},{"id":"group_input_helper","schema_version":"1.0.0","name":"Group input helper(节点组输入助手)","version":"2.9.5","tagline":"Qucik add/split/merge Group Input node/socket(快速添加拆分合并移动组输入节点接口)","archive_hash":"sha256:4a3215e785b9a1f37faad85c303fab1c079c61c4434c4dc3fdeef4a9f26add9e","archive_size":76003,"archive_url":"https://extensions.blender.org/download/sha256:4a3215e785b9a1f37faad85c303fab1c079c61c4434c4dc3fdeef4a9f26add9e/add-on-group-input-helper-v2.9.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/group-input-helper/","maintainer":"W_Cloud","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Geometry Nodes"]},{"id":"shutdown_after_render","schema_version":"1.0.0","name":"Shutdown after render","version":"0.4.0","tagline":"Automatically shuts down your PC after your render finishes","archive_hash":"sha256:d7dc0b029145c7411cf660ca67d4909104ea13f3fc8bec2474dc5a8942479f1a","archive_size":4087,"archive_url":"https://extensions.blender.org/download/sha256:d7dc0b029145c7411cf660ca67d4909104ea13f3fc8bec2474dc5a8942479f1a/add-on-shutdown-after-render-v0.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shutdown-after-render/","maintainer":"David-Bühler","license":["SPDX:GPL-3.0-or-later"],"tags":["System"]},{"id":"io_scene_pod","schema_version":"1.0.0","name":"UbiSoft Pod formats","version":"0.33.0","tagline":"Import-Export Pod tracks, ghosts, images, and cars","archive_hash":"sha256:ecf3b345fe6a12f7d1adc88191154f3b58fe1e7122ef3502180837108057455c","archive_size":7205910,"archive_url":"https://extensions.blender.org/download/sha256:ecf3b345fe6a12f7d1adc88191154f3b58fe1e7122ef3502180837108057455c/add-on-io-scene-pod-v0.33.0-windows-x64.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/io-scene-pod/","maintainer":"Syroot","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Import-Export","Scene"]},{"id":"has_paint_layers","schema_version":"1.0.0","name":"HAS Paint Layers","version":"0.8.93","tagline":"Layers for texture painting","archive_hash":"sha256:d768c479f5d60b9eba58555db5a1d9d7ff29c402f8b4f7418d5ad34d3c790255","archive_size":68078,"archive_url":"https://extensions.blender.org/download/sha256:d768c479f5d60b9eba58555db5a1d9d7ff29c402f8b4f7418d5ad34d3c790255/add-on-has-paint-layers-v0.8.93.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/has-paint-layers/","maintainer":"Hirourk","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Store temporary images"},"tags":["Paint","Bake"]},{"id":"shapekey_keeper","schema_version":"1.0.0","name":"SKkeeper","version":"1.8.2","tagline":"Applies modifiers while keeping shapekeys and drivers","archive_hash":"sha256:4a02b8366b5b251b36b03b397781572b5ce60e12900d869a419b8969cd1cc678","archive_size":20217,"archive_url":"https://extensions.blender.org/download/sha256:4a02b8366b5b251b36b03b397781572b5ce60e12900d869a419b8969cd1cc678/add-on-shapekey-keeper-v1.8.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shapekey-keeper/","maintainer":"Nidus","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"RetroGrey","schema_version":"1.0.0","name":"RetroGrey","version":"1.3.2","tagline":"Theme inspired by the grey color of 90s computer devices","archive_hash":"sha256:093508a4afdc57a48a7e182be308083fa0f5547c4d6323a7334fbc8535eaac38","archive_size":6800,"archive_url":"https://extensions.blender.org/download/sha256:093508a4afdc57a48a7e182be308083fa0f5547c4d6323a7334fbc8535eaac38/theme-retrogrey-v1.3.2.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/themes/retrogrey/","maintainer":"Oskar_Wasiluk","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"datablock_utils","schema_version":"1.0.0","name":"Data-Block Utilities","version":"1.3.0","tagline":"Show users, merge duplicates, find similar, and more","archive_hash":"sha256:ecbfa6cc02cb6620059c2cac9e6b109532b5626690f5562ac8a1b366412349c1","archive_size":1740275,"archive_url":"https://extensions.blender.org/download/sha256:ecbfa6cc02cb6620059c2cac9e6b109532b5626690f5562ac8a1b366412349c1/add-on-datablock-utils-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/datablock-utils/","maintainer":"Leonardo-Pike-Excell","license":["SPDX:GPL-3.0-or-later"],"tags":["Scene","System"]},{"id":"ambientcg_material_importer","schema_version":"1.0.0","name":"AmbientCG Material Importer","version":"1.4.0","tagline":"One-click material creation from AmbientCG","archive_hash":"sha256:83f901d2671ad425d1a2251ca7ed74a02a4ad87b0870b14a82bb04b76079a082","archive_size":4167,"archive_url":"https://extensions.blender.org/download/sha256:83f901d2671ad425d1a2251ca7ed74a02a4ad87b0870b14a82bb04b76079a082/add-on-ambientcg-material-importer-v1.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ambientcg-material-importer/","maintainer":"Nino-Filiu","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import and cache textures to disk","network":"Makes calls to AmbientCG"},"tags":["Import-Export","Material"]},{"id":"cursor_plus","schema_version":"1.0.0","name":"3D Cursor Plus","version":"1.0.4","tagline":"Axes, undo and few other tools for your 3D Cursor","archive_hash":"sha256:e4f35c9732aa75a941cce0bb25ba82a1c606239bef60513a30bf2339f0c24a47","archive_size":79566,"archive_url":"https://extensions.blender.org/download/sha256:e4f35c9732aa75a941cce0bb25ba82a1c606239bef60513a30bf2339f0c24a47/add-on-cursor-plus-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cursor-plus/","maintainer":"chokavr","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save/Load gizmo presets and Pie menu configuration"},"tags":["3D View"]},{"id":"two_point_perspective","schema_version":"1.0.0","name":"Two-Point Perspective","version":"0.0.2","tagline":"Replaces the active camera with a two-point perspective one","archive_hash":"sha256:5b6e59e62df8879f4341f242cd3a4488dc0fe441f80385a23915d6a3fcb1b3bd","archive_size":17509,"archive_url":"https://extensions.blender.org/download/sha256:5b6e59e62df8879f4341f242cd3a4488dc0fe441f80385a23915d6a3fcb1b3bd/add-on-two-point-perspective-v0.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/two-point-perspective/","maintainer":"Athina-Syntychaki","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"Grid_Dimensions","schema_version":"1.0.0","name":"Grid Dimensions/网格标注","version":"1.1.0","tagline":"Grid Dimensions/网格标注","archive_hash":"sha256:7df9c7f626d9990d222a6dc05613f2cafc6edb4b992b995545f91e11a53f0e80","archive_size":37347,"archive_url":"https://extensions.blender.org/download/sha256:7df9c7f626d9990d222a6dc05613f2cafc6edb4b992b995545f91e11a53f0e80/add-on-grid-dimensions-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/grid-dimensions/","maintainer":"Shuimeng","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"mpfb","schema_version":"1.0.0","name":"MPFB","version":"2.0.14","tagline":"Human character generator and editor","archive_hash":"sha256:c0484d4f74e468262897b575e6535f3d2b14ebb44b68b0b79e5b9121f632e504","archive_size":44911109,"archive_url":"https://extensions.blender.org/download/sha256:c0484d4f74e468262897b575e6535f3d2b14ebb44b68b0b79e5b9121f632e504/add-on-mpfb-v2.0.14.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mpfb/","maintainer":"Joel-Palmius","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load and save data","network":"(optional) Interact with local instance of MakeHuman"},"tags":["Add Mesh","Rigging"]},{"id":"motion_inspector","schema_version":"1.0.0","name":"Motion inspector","version":"0.2.9","tagline":"Inspect F-Curves and animated object movement","archive_hash":"sha256:693f63eb2e2f8bb04e8dbe703dfd7dd1404026ce5dbe2474fe25eae06381db53","archive_size":4834,"archive_url":"https://extensions.blender.org/download/sha256:693f63eb2e2f8bb04e8dbe703dfd7dd1404026ce5dbe2474fe25eae06381db53/add-on-motion-inspector-v0.2.9.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/motion-inspector/","maintainer":"Chalouek-RGBit","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","3D View"]},{"id":"modern_primitive","schema_version":"1.0.0","name":"Modern Primitive","version":"0.0.49","tagline":"Modern Primitive for Non-Destructive Modeling","archive_hash":"sha256:d1115df9d03818b5da49f3eb06a9b3bc43c3bb2b9128c7bb82af162008dce6dc","archive_size":3284821,"archive_url":"https://extensions.blender.org/download/sha256:d1115df9d03818b5da49f3eb06a9b3bc43c3bb2b9128c7bb82af162008dce6dc/add-on-modern-primitive-v0.0.49.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/modern-primitive/","maintainer":"Degarashi","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import Geometry-Node from Add-on Directory"},"tags":["Add Mesh","Modeling"]},{"id":"greasepencil_nudge_frames","schema_version":"1.0.0","name":"Grease Pencil Nudge Frames","version":"0.1.1","tagline":"Modify exposure in the dopesheet with D/F","archive_hash":"sha256:935857f93894275c01154fbf40ac769f5430fdcf5737315d9f84a2aef9922c6f","archive_size":1738,"archive_url":"https://extensions.blender.org/download/sha256:935857f93894275c01154fbf40ac769f5430fdcf5737315d9f84a2aef9922c6f/add-on-greasepencil-nudge-frames-v0.1.1.zip","type":"add-on","blender_version_min":"4.3.1","website":"https://extensions.blender.org/add-ons/greasepencil-nudge-frames/","maintainer":"bergamote","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Grease Pencil"]},{"id":"Non_Destructive_Primitives","schema_version":"1.0.0","name":"ND Primitives","version":"0.2.46","tagline":"Non-Destructive Parametric Primitives in Blender","archive_hash":"sha256:7be2a39d184c099018628d93580fec929a192f3a367d3eb332dbc8231eb8d4f8","archive_size":290494,"archive_url":"https://extensions.blender.org/download/sha256:7be2a39d184c099018628d93580fec929a192f3a367d3eb332dbc8231eb8d4f8/add-on-non-destructive-primitives-v0.2.46.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/non-destructive-primitives/","maintainer":"Dan-Gry","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import Geometry Nodes Objects from Add-on Folder"},"tags":["Modeling","Add Mesh"]},{"id":"node_pinyin","schema_version":"1.0.0","name":"szm/首字母","version":"1.2.0","tagline":"Enable node and modifier search with PinYin/支持节点和修改器的中文拼音搜索","archive_hash":"sha256:f94b8f609474f189ed0735335f7503d47679c8a76ef7ba1be1efeaa169edd3fe","archive_size":40672,"archive_url":"https://extensions.blender.org/download/sha256:f94b8f609474f189ed0735335f7503d47679c8a76ef7ba1be1efeaa169edd3fe/add-on-node-pinyin-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-pinyin/","maintainer":"Xinyu-Zhu","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","User Interface"]},{"id":"proto_game_asset_tools","schema_version":"1.0.0","name":"PROTO Game Asset Tools","version":"2.1.0","tagline":"Tools for game assets, improved export for Unreal, Unity, Godot","archive_hash":"sha256:89a6c88047c3065ee89bbdb569cb2a91a086a4247e7103761d3f53d4f74fe1b4","archive_size":82900,"archive_url":"https://extensions.blender.org/download/sha256:89a6c88047c3065ee89bbdb569cb2a91a086a4247e7103761d3f53d4f74fe1b4/add-on-proto-game-asset-tools-v2.1.0.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.2.0","website":"https://extensions.blender.org/add-ons/proto-game-asset-tools/","maintainer":"PROTOWLF","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export FBX to disk","clipboard":"Copy and paste data"},"tags":["Import-Export","Game Engine"]},{"id":"b_subeditor","schema_version":"1.0.0","name":"B SubEditor","version":"1.0.1","tagline":"Sync subtitles in Text Editor/VSE","archive_hash":"sha256:ecf1dd66d0d2812603227a549d07efe010749e17149f7c3c247b07fa68f3cf5d","archive_size":6393,"archive_url":"https://extensions.blender.org/download/sha256:ecf1dd66d0d2812603227a549d07efe010749e17149f7c3c247b07fa68f3cf5d/add-on-b-subeditor-v1.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/b-subeditor/","maintainer":"Dinesh007","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Requires access to directory with subtitle files"},"tags":["Sequencer","Text Editor","Import-Export"]},{"id":"b_Unicode","schema_version":"1.0.0","name":"B Unicode","version":"1.0.2","tagline":"Access Unicode characters","archive_hash":"sha256:f137e679b67d3dbcd4df6898970484ccad7b89ddc9c43089b980d5a5fbb4819e","archive_size":5304,"archive_url":"https://extensions.blender.org/download/sha256:f137e679b67d3dbcd4df6898970484ccad7b89ddc9c43089b980d5a5fbb4819e/add-on-b-unicode-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/b-unicode/","maintainer":"Dinesh007","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Sequencer","Text Editor"]},{"id":"sco_edgewise","schema_version":"1.0.0","name":"SCO EdgeWise","version":"2.0.3","tagline":"Measure distances, edge lengths, and angles in Edit Mode","archive_hash":"sha256:ef2ce3e214fe26b22ea97acd79d64dc11427aa4e9acd35606b66f104b54d059a","archive_size":137778,"archive_url":"https://extensions.blender.org/download/sha256:ef2ce3e214fe26b22ea97acd79d64dc11427aa4e9acd35606b66f104b54d059a/add-on-sco-edgewise-v2.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sco-edgewise/","maintainer":"BEAST_of_BURDEN","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"font_selector","schema_version":"1.0.0","name":"Font Selector","version":"3.2.2","tagline":"Browse available fonts from blender","archive_hash":"sha256:6f2006ea677059102fc7265f5dd0d9149ba80b93cbcef7d09d06aade32fda3c6","archive_size":1183546,"archive_url":"https://extensions.blender.org/download/sha256:6f2006ea677059102fc7265f5dd0d9149ba80b93cbcef7d09d06aade32fda3c6/add-on-font-selector-v3.2.2.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/font-selector/","maintainer":"tonton_","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Reading and writing json preset files, Reading font files"},"tags":["Import-Export","System"]},{"id":"vertex_overlap","schema_version":"1.0.0","name":"Vertex Overlap","version":"1.1.0","tagline":"Alerts you to overlapping vertices in real-time","archive_hash":"sha256:0c281759e0e4e627b5a6d9f1a134391a04e1a944746ef8472186cf7416eb6f14","archive_size":17220,"archive_url":"https://extensions.blender.org/download/sha256:0c281759e0e4e627b5a6d9f1a134391a04e1a944746ef8472186cf7416eb6f14/add-on-vertex-overlap-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/vertex-overlap/","maintainer":"Shawn-Shipley","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"quick_resolution_setup","schema_version":"1.0.0","name":"Quick Resolution Setup","version":"1.1.0","tagline":"Quick Resolution Setup","archive_hash":"sha256:e90bfb222c33399c8569dc67819d677bca9a5e3cca2c881a8968013e948e40ea","archive_size":23899,"archive_url":"https://extensions.blender.org/download/sha256:e90bfb222c33399c8569dc67819d677bca9a5e3cca2c881a8968013e948e40ea/add-on-quick-resolution-setup-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-resolution-setup/","maintainer":"Hades-Su","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","Render"]},{"id":"audio_notifier","schema_version":"1.0.0","name":"Audio Notifier","version":"1.0.5","tagline":"Audio notifications for success, cancel and warning","archive_hash":"sha256:c268571786d940171942d5e747c1c3424a5d02c184600d11704a8a46b5199541","archive_size":36990,"archive_url":"https://extensions.blender.org/download/sha256:c268571786d940171942d5e747c1c3424a5d02c184600d11704a8a46b5199541/add-on-audio-notifier-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/audio-notifier/","maintainer":"Lauloque","license":["SPDX:GPL-3.0-or-later"],"tags":["System"]},{"id":"k_tools_mode_highlight","schema_version":"1.0.0","name":"K-Tools: Mode Highlight","version":"1.0.8","tagline":"Automatically change the header color based on the current mode","archive_hash":"sha256:7d1e680b0b1d313a1e874bd7f3b1c45503c1207f402da26284cbfddc1426c212","archive_size":4666,"archive_url":"https://extensions.blender.org/download/sha256:7d1e680b0b1d313a1e874bd7f3b1c45503c1207f402da26284cbfddc1426c212/add-on-k-tools-mode-highlight-v1.0.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/k-tools-mode-highlight/","maintainer":"Robert-Kezives","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"xray_selection_tools","schema_version":"1.0.0","name":"X-Ray Selection Tools","version":"4.9.2","tagline":"Box, lasso and circle selection tools with x-ray","archive_hash":"sha256:61acc015891760d42008f94fa7d75d119c0efb1d11e9683cd22136204ed418e8","archive_size":85983,"archive_url":"https://extensions.blender.org/download/sha256:61acc015891760d42008f94fa7d75d119c0efb1d11e9683cd22136204ed418e8/add-on-xray-selection-tools-v4.9.2.zip","type":"add-on","blender_version_min":"4.5.2","website":"https://extensions.blender.org/add-ons/xray-selection-tools/","maintainer":"MarshmallowCirno","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"autokey_highlight","schema_version":"1.0.0","name":"Autokey Highlight","version":"1.0.7","tagline":"Highlights the viewport when autokey is enabled","archive_hash":"sha256:3b250ef260551db38a91e00e8a605747260c47798b1db8a2dffb8fcd8c8fa6e8","archive_size":3186,"archive_url":"https://extensions.blender.org/download/sha256:3b250ef260551db38a91e00e8a605747260c47798b1db8a2dffb8fcd8c8fa6e8/add-on-autokey-highlight-v1.0.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/autokey-highlight/","maintainer":"Lauloque","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","3D View","System"]},{"id":"math_formula","schema_version":"1.0.0","name":"Math Formula","version":"2.2.0","tagline":"Quickly add nodes by typing in a formula","archive_hash":"sha256:9b2cc23847f84b3830e5c9be2d8d5e98904eed0d0f255e69bb14e60d22caba27","archive_size":360600,"archive_url":"https://extensions.blender.org/download/sha256:9b2cc23847f84b3830e5c9be2d8d5e98904eed0d0f255e69bb14e60d22caba27/add-on-math-formula-v2.2.0.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/math-formula/","maintainer":"WannesMalfait","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Loading and writing custom implementations","clipboard":"Pasting formulas from clipboard"},"tags":["Node"]},{"id":"EdgeFlow","schema_version":"1.0.0","name":"EdgeFlow","version":"1.1.2","tagline":"Helps adjusting mesh geometry to curved surfaces","archive_hash":"sha256:4fa53590a837813c72dc9ed0a416f8e3de61352abb262b461974cd9f7092b1c1","archive_size":34350,"archive_url":"https://extensions.blender.org/download/sha256:4fa53590a837813c72dc9ed0a416f8e3de61352abb262b461974cd9f7092b1c1/add-on-edgeflow-v1.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/edgeflow/","maintainer":"Benjamin-Sauder","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"NLATools","schema_version":"1.0.0","name":"Merge NLA Strips","version":"1.2.0","tagline":"Combine selected NLA strips into one","archive_hash":"sha256:fb71b63b597aa5998c41387cb24ccb78fed7944a43e80418f959080090a4d276","archive_size":4416,"archive_url":"https://extensions.blender.org/download/sha256:fb71b63b597aa5998c41387cb24ccb78fed7944a43e80418f959080090a4d276/add-on-nlatools-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nlatools/","maintainer":"Likkez","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Bake"]},{"id":"LightHepler","schema_version":"1.0.0","name":"Light Helper","version":"0.4.6","tagline":"Light Helper","archive_hash":"sha256:a99c5697ffcb22e6d7a64cd17d353137206b38b707519f03afcaa23933ba214d","archive_size":20722,"archive_url":"https://extensions.blender.org/download/sha256:a99c5697ffcb22e6d7a64cd17d353137206b38b707519f03afcaa23933ba214d/add-on-lighthepler-v0.4.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/lighthepler/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"tags":["Lighting"]},{"id":"lattice_helper","schema_version":"1.0.0","name":"Lattice Helper","version":"1.2.5","tagline":"Apply Lattice modifier to object(s) in object/edit mode","archive_hash":"sha256:f55bbabd50eef367d05158fbd122b93c2dacb47732d871f4e67455aafd3259c4","archive_size":12464,"archive_url":"https://extensions.blender.org/download/sha256:f55bbabd50eef367d05158fbd122b93c2dacb47732d871f4e67455aafd3259c4/add-on-lattice-helper-v1.2.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/lattice-helper/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh","Object"]},{"id":"color_randomizer","schema_version":"1.0.0","name":"Color Randomizer","version":"1.3.0","tagline":"Randomly assign colors to objects","archive_hash":"sha256:08820b85193be83b338634efc1e941a944b1666273b9b052771d88f667477944","archive_size":10414,"archive_url":"https://extensions.blender.org/download/sha256:08820b85193be83b338634efc1e941a944b1666273b9b052771d88f667477944/add-on-color-randomizer-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/color-randomizer/","maintainer":"ilumetric","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"lumos","schema_version":"1.0.0","name":"Lumos","version":"3.2.2","tagline":"Bring your lighting to the next level","archive_hash":"sha256:65420e29fe19c6213415f0091bb28b5e3e41d238d9062042157fd286a2cef8ef","archive_size":40153,"archive_url":"https://extensions.blender.org/download/sha256:65420e29fe19c6213415f0091bb28b5e3e41d238d9062042157fd286a2cef8ef/add-on-lumos-v3.2.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/lumos/","maintainer":"Eqkoss","license":["SPDX:GPL-3.0-or-later"],"tags":["Lighting","3D View"]},{"id":"rmKit","schema_version":"1.0.0","name":"rmKit","version":"1.0.13","tagline":"Tools and Utils for Modeling and GameWorkflows","archive_hash":"sha256:25c336e8ad89518cb70c7a460ec07fa94d14bd7ebd6170974817d3ee3240b92c","archive_size":83033,"archive_url":"https://extensions.blender.org/download/sha256:25c336e8ad89518cb70c7a460ec07fa94d14bd7ebd6170974817d3ee3240b92c/add-on-rmkit-v1.0.13.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/rmkit/","maintainer":"Timothee-Yeramian","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Modeling","Mesh","Object","Material"]},{"id":"Duplication_Tool_addon","schema_version":"1.0.0","name":"Duplication Tool","version":"1.0.2","tagline":"Create copies with incremental names and materials","archive_hash":"sha256:691aedb7c878f624519c697a6502fb9fe7ecc7c2f258d3c9ca34ded0c2ff2864","archive_size":3052,"archive_url":"https://extensions.blender.org/download/sha256:691aedb7c878f624519c697a6502fb9fe7ecc7c2f258d3c9ca34ded0c2ff2864/add-on-duplication-tool-addon-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/duplication-tool-addon/","maintainer":"Vinay-chikkam","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","System"]},{"id":"node_runner","schema_version":"1.0.0","name":"Node Runner","version":"1.3.9","tagline":"Import and export nodes as strings","archive_hash":"sha256:ec7a80ff5105f9b5c638b840f48c37b9fd71dccb5f686d9b0fec05ede7ee5d92","archive_size":40616,"archive_url":"https://extensions.blender.org/download/sha256:ec7a80ff5105f9b5c638b840f48c37b9fd71dccb5f686d9b0fec05ede7ee5d92/add-on-node-runner-v1.3.9.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/node-runner/","maintainer":"Noah-Thiering","license":["SPDX:GPL-3.0-or-later"],"permissions":{"clipboard":"Copy Node Runner Hash to clipboard"},"tags":["Node","Material","Geometry Nodes"]},{"id":"sakura_poselib","schema_version":"1.0.0","name":"Sakura Poselib","version":"1.4.4","tagline":"Yet another Pose Library with handful features","archive_hash":"sha256:09a1c37cb2ef33976df34d8629bd0b33ec2e734eb916093128ed0f6dc060102e","archive_size":56108,"archive_url":"https://extensions.blender.org/download/sha256:09a1c37cb2ef33976df34d8629bd0b33ec2e734eb916093128ed0f6dc060102e/add-on-sakura-poselib-v1.4.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sakura-poselib/","maintainer":"Kafuji","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save/Load Poselib data as Json or CSV"},"tags":["Animation"]},{"id":"audio_exporter","schema_version":"1.0.0","name":"Audio Exporter","version":"1.1.0","tagline":"Export audio separate or combined files in VSE","archive_hash":"sha256:4154a825f0d4ffb9b0d47f400bc8c2b6880e853510ad93650bc598c63c9a14be","archive_size":6145,"archive_url":"https://extensions.blender.org/download/sha256:4154a825f0d4ffb9b0d47f400bc8c2b6880e853510ad93650bc598c63c9a14be/add-on-audio-exporter-v1.1.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/audio-exporter/","maintainer":"Dinesh007","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Requires access to directory where it exports audio files"},"tags":["Sequencer"]},{"id":"Shadingplus","schema_version":"1.0.0","name":"Shading +","version":"1.1.2","tagline":"Shading pie for designers and artists","archive_hash":"sha256:46039745f70f4f3bbe2ff5bdfc3acbbd350bc0afb5fcecfdf2e84fefa811c8b8","archive_size":50492480,"archive_url":"https://extensions.blender.org/download/sha256:46039745f70f4f3bbe2ff5bdfc3acbbd350bc0afb5fcecfdf2e84fefa811c8b8/add-on-shadingplus-v1.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shadingplus/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"caustics_baking_addon","schema_version":"1.0.0","name":"Caustics_Baking","version":"3.2.1","tagline":"Caustics Baking with Cycles","archive_hash":"sha256:fa48d2b46ecbed96225423524e8faee3dbc6752f9b8a6a6d8e9a9e56205ff32e","archive_size":42951,"archive_url":"https://extensions.blender.org/download/sha256:fa48d2b46ecbed96225423524e8faee3dbc6752f9b8a6a6d8e9a9e56205ff32e/add-on-caustics-baking-addon-v3.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/caustics-baking-addon/","maintainer":"Benary","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"export images to disk"},"tags":["Bake","Lighting"]},{"id":"brushstroke_tools","schema_version":"1.0.0","name":"Brushstroke Tools","version":"1.2.1","tagline":"Brushstroke painting tools by the Blender Studio","archive_hash":"sha256:1a14a49e8c80e0c349dbb624859106e503eb94bc2506c4057f9d0cd1a45edbf2","archive_size":29637686,"archive_url":"https://extensions.blender.org/download/sha256:1a14a49e8c80e0c349dbb624859106e503eb94bc2506c4057f9d0cd1a45edbf2/add-on-brushstroke-tools-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/brushstroke-tools/","maintainer":"Blender Studio","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write brushstroke asset resources from/to disk"},"tags":["Paint","Geometry Nodes","Material"]},{"id":"node_color_tools","schema_version":"1.0.0","name":"Node Color Tools Pie","version":"1.0.3","tagline":"Quick, organized node colors with pie menu ease","archive_hash":"sha256:e59fd49dbc701c9f45705e7f28dcf4d5d93dc13bf8820a5c8bf813a50c33b1e7","archive_size":4752,"archive_url":"https://extensions.blender.org/download/sha256:e59fd49dbc701c9f45705e7f28dcf4d5d93dc13bf8820a5c8bf813a50c33b1e7/add-on-node-color-tools-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-color-tools/","maintainer":"Lumpengnom","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","User Interface"]},{"id":"mesh_analysis_overlay","schema_version":"1.0.0","name":"Mesh Analysis Overlay","version":"4.1.0","tagline":"Mesh Analysis Overlay","archive_hash":"sha256:08b24bce782c7c8c72d47a3e2c8708a571f19538fed30d57d30fa874f7791a5c","archive_size":18588,"archive_url":"https://extensions.blender.org/download/sha256:08b24bce782c7c8c72d47a3e2c8708a571f19538fed30d57d30fa874f7791a5c/add-on-mesh-analysis-overlay-v4.1.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/mesh-analysis-overlay/","maintainer":"DShot92","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"gamiflow","schema_version":"1.0.0","name":"GamiFlow","version":"1.9.8","tagline":"Easier game asset creation","archive_hash":"sha256:b73a4cf391ebb2dbf02cebdea7cc195812678838cb4b85f8a49c576eae670145","archive_size":162200,"archive_url":"https://extensions.blender.org/download/sha256:b73a4cf391ebb2dbf02cebdea7cc195812678838cb4b85f8a49c576eae670145/add-on-gamiflow-v1.9.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/gamiflow/","maintainer":"Mathieu.Einig","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export FBX files to disk"},"tags":["Import-Export","Object"]},{"id":"Runlevel_Two","schema_version":"1.0.0","name":"Runlevel Two","version":"1.2.0","tagline":"A refined, distraction-free color palette, pleasing to the eye","archive_hash":"sha256:58de5dc3b042dc70479d8315ea628381f1549c6a22c22941a8ac90adabaca1a1","archive_size":5962,"archive_url":"https://extensions.blender.org/download/sha256:58de5dc3b042dc70479d8315ea628381f1549c6a22c22941a8ac90adabaca1a1/theme-runlevel-two-v1.2.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/runlevel-two/","maintainer":"Rene-Smaal","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Accessibility","Colorful"]},{"id":"render_overscan","schema_version":"1.0.0","name":"Render Overscan","version":"0.1.16","tagline":"Applies and manages overscan in renders","archive_hash":"sha256:3fd9bb4da29f3d9a572e6c24e3740c651f50172e5f3e421dacfd0ab28d9428fa","archive_size":3933,"archive_url":"https://extensions.blender.org/download/sha256:3fd9bb4da29f3d9a572e6c24e3740c651f50172e5f3e421dacfd0ab28d9428fa/add-on-render-overscan-v0.1.16.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/render-overscan/","maintainer":"efimpetelin","license":["SPDX:GPL-3.0-or-later"],"tags":["Render"]},{"id":"strip_array","schema_version":"1.0.0","name":"Strip Array","version":"1.1.0","tagline":"Array of duplicated strips, Customizable, Strips Display","archive_hash":"sha256:35813e53db04e787e8a6629b33529766cedc3d78d25111ab200822eda1b577ba","archive_size":4825,"archive_url":"https://extensions.blender.org/download/sha256:35813e53db04e787e8a6629b33529766cedc3d78d25111ab200822eda1b577ba/add-on-strip-array-v1.1.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/strip-array/","maintainer":"Dinesh007","license":["SPDX:GPL-3.0-or-later"],"tags":["Sequencer"]},{"id":"latticemagic","schema_version":"1.0.0","name":"Lattice Magic","version":"1.0.1","tagline":"Lattice-based deforming tools","archive_hash":"sha256:7f888bac24e8ea490446b75a07609e37f257d7cf7ba67c44703f06de0bb1c91e","archive_size":29840,"archive_url":"https://extensions.blender.org/download/sha256:7f888bac24e8ea490446b75a07609e37f257d7cf7ba67c44703f06de0bb1c91e/add-on-latticemagic-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/latticemagic/","maintainer":"Mets","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Animation"]},{"id":"Show_Object_Data_Users_in_Viewport","schema_version":"1.0.0","name":"Show Collection/Object/Data Users in Viewport","version":"1.0.6","tagline":"Show Collection/Object/Data Users in the Viewport","archive_hash":"sha256:9976496cb96fd37b3121f107981be35f6336da4692e00bb43ccdb4582d010699","archive_size":4288,"archive_url":"https://extensions.blender.org/download/sha256:9976496cb96fd37b3121f107981be35f6336da4692e00bb43ccdb4582d010699/add-on-show-object-data-users-in-viewport-v1.0.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/show-object-data-users-in-viewport/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"camera_shakify","schema_version":"1.0.0","name":"Camera Shakify","version":"0.5.1","tagline":"Add captured camera shake/wobble to your cameras","archive_hash":"sha256:40bb62e0960b301fe8c7b1de11ec959b8ce6c55ce03ed720c5c3b21c0c764e36","archive_size":78219,"archive_url":"https://extensions.blender.org/download/sha256:40bb62e0960b301fe8c7b1de11ec959b8ce6c55ce03ed720c5c3b21c0c764e36/add-on-camera-shakify-v0.5.1.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/camera-shakify/","maintainer":"Eat the Future","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Camera"]},{"id":"embroidery_importer","schema_version":"1.0.0","name":"Embroidery Importer","version":"0.9.6","tagline":"Import embroidery files into Blender","archive_hash":"sha256:d9481434abe7dc30e943e794733519035a1e29f8ba1590a23961a658860774f7","archive_size":157512,"archive_url":"https://extensions.blender.org/download/sha256:d9481434abe7dc30e943e794733519035a1e29f8ba1590a23961a658860774f7/add-on-embroidery-importer-v0.9.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/embroidery-importer/","maintainer":"javl","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read embroidery files from disk"},"tags":["Import-Export"]},{"id":"mio3_uv","schema_version":"1.0.0","name":"Mio3 UV","version":"2.1.0","tagline":"UV Edit Assistant Tools","archive_hash":"sha256:6ff059c976995aa12b75c57cb99c991dbb7c1d1456bfda1ba68bd5537c9521cd","archive_size":5201478,"archive_url":"https://extensions.blender.org/download/sha256:6ff059c976995aa12b75c57cb99c991dbb7c1d1456bfda1ba68bd5537c9521cd/add-on-mio3-uv-v2.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/mio3-uv/","maintainer":"mio","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Imports images, nodes, and translations from the bundled files"},"tags":["UV"]},{"id":"S3D_QuickSwitch","schema_version":"1.0.0","name":"Quick Switch","version":"2.1.0","tagline":"Quickly switch between Editor Areas","archive_hash":"sha256:d6b8fe2348c76f91687bfcdedf7264dc605c1eff99562b8a3827151f7d19f380","archive_size":6932,"archive_url":"https://extensions.blender.org/download/sha256:d6b8fe2348c76f91687bfcdedf7264dc605c1eff99562b8a3827151f7d19f380/add-on-s3d-quickswitch-v2.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/s3d-quickswitch/","maintainer":"Silvie3D","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface","Pipeline"]},{"id":"Frigus_Nox","schema_version":"1.0.0","name":"Frigus Nox","version":"1.0.8","tagline":"Frigus Nox theme","archive_hash":"sha256:5bf2f16afce50f77cb329a0dbd80c0d24d1c925365b273e6359714f96876444e","archive_size":5668,"archive_url":"https://extensions.blender.org/download/sha256:5bf2f16afce50f77cb329a0dbd80c0d24d1c925365b273e6359714f96876444e/theme-frigus-nox-v1.0.8.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/frigus-nox/","maintainer":"Cyrill-Vitkovskiy","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"spreadsheet_import","schema_version":"1.0.0","name":"Spreadsheet Import","version":"0.4.0","tagline":"Import data to spreadsheet for use with geometry nodes","archive_hash":"sha256:a339f6a2de9447fd26e59bcc1b4241bd493a251de1ed242579671d6219ac21ba","archive_size":16630,"archive_url":"https://extensions.blender.org/download/sha256:a339f6a2de9447fd26e59bcc1b4241bd493a251de1ed242579671d6219ac21ba/add-on-spreadsheet-import-v0.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/spreadsheet-import/","maintainer":"smonbrogg","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load CSV and JSON files from disk"},"tags":["Import-Export","Geometry Nodes"]},{"id":"Scene_ViewLayer_Switcher","schema_version":"1.0.0","name":"Scene/View/Workspace Switcher","version":"1.1.0","tagline":"Shortcut for Scenes/ViewLayers","archive_hash":"sha256:1d8572fcf0ce5007edd83615b40418230c3ce7be133e005d0986ff065c2a04d0","archive_size":11003,"archive_url":"https://extensions.blender.org/download/sha256:1d8572fcf0ce5007edd83615b40418230c3ce7be133e005d0986ff065c2a04d0/add-on-scene-viewlayer-switcher-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/scene-viewlayer-switcher/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"pohlke","schema_version":"1.0.0","name":"Pohlke","version":"2.0.0","tagline":"One-click standard axonometric and oblique projection cameras","archive_hash":"sha256:c20f9ae11702babf1e09bb0586ff30731f7a5cea7869d0e17a77c0a6ac40ad25","archive_size":16257,"archive_url":"https://extensions.blender.org/download/sha256:c20f9ae11702babf1e09bb0586ff30731f7a5cea7869d0e17a77c0a6ac40ad25/add-on-pohlke-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pohlke/","maintainer":"mononym","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"FishSim","schema_version":"1.0.0","name":"FishSim","version":"4.2.0","tagline":"Fish Swimming Simulation","archive_hash":"sha256:85e0a06c223139250853e1bb7e51fabf47ed7fcd287de89440bad1f6ee2b244a","archive_size":16851312,"archive_url":"https://extensions.blender.org/download/sha256:85e0a06c223139250853e1bb7e51fabf47ed7fcd287de89440bad1f6ee2b244a/add-on-fishsim-v4.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/fishsim/","maintainer":"Nerk","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"sync_render_sets","schema_version":"1.0.0","name":"Sync Render Sets","version":"1.2.1","tagline":"Sync scenes render settings/colorspaces,viewlayers`s passes","archive_hash":"sha256:37cfd9b7c85b37fb0e53ebc7c1148bb0e331e1731059a7d408bfbf40652ee362","archive_size":24219,"archive_url":"https://extensions.blender.org/download/sha256:37cfd9b7c85b37fb0e53ebc7c1148bb0e331e1731059a7d408bfbf40652ee362/add-on-sync-render-sets-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sync-render-sets/","maintainer":"CP-Design","license":["SPDX:GPL-3.0-or-later"],"tags":["Render"]},{"id":"circular_stacker","schema_version":"1.0.0","name":"Circular Stacker","version":"1.0.0","tagline":"Distribute selected objects in a circular (donut) pattern","archive_hash":"sha256:c8beafaa14035e601afd131c1129460d396f3d0260a807d2ca7a1c3552361451","archive_size":3099,"archive_url":"https://extensions.blender.org/download/sha256:c8beafaa14035e601afd131c1129460d396f3d0260a807d2ca7a1c3552361451/add-on-circular-stacker-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/circular-stacker/","maintainer":"Hydrocallis","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"overscan","schema_version":"1.0.0","name":"Overscan Render","version":"1.2.3","tagline":"Render with an overscan","archive_hash":"sha256:6599df781f683d78c2a0f2095b81c8d920e74d4b32d6de19095986afe299e10b","archive_size":3063,"archive_url":"https://extensions.blender.org/download/sha256:6599df781f683d78c2a0f2095b81c8d920e74d4b32d6de19095986afe299e10b/add-on-overscan-v1.2.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/overscan/","maintainer":"Blenderbob","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"Distribute","schema_version":"1.0.0","name":"Distribute","version":"1.1.0","tagline":"Distribute selected objects from first to last on X, Y or Z axis","archive_hash":"sha256:c293bd89069c379b97add283081a9a61727b1f1737a1cd5f042881b21c520e47","archive_size":1692,"archive_url":"https://extensions.blender.org/download/sha256:c293bd89069c379b97add283081a9a61727b1f1737a1cd5f042881b21c520e47/add-on-distribute-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/distribute/","maintainer":"Blenderbob","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"motionpath","schema_version":"1.0.0","name":"Motion Path Creator","version":"2.1.2","tagline":"Create motion paths for bones, vertices, empties and objects","archive_hash":"sha256:6afd3b0e6f7e740b6603a8e5773c306cefe0f26da628685184ef5dda92a2189f","archive_size":6955,"archive_url":"https://extensions.blender.org/download/sha256:6afd3b0e6f7e740b6603a8e5773c306cefe0f26da628685184ef5dda92a2189f/add-on-motionpath-v2.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/motionpath/","maintainer":"Blenderbob","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"fireray","schema_version":"1.0.0","name":"Fire Ray","version":"2.0.0","tagline":"Reality Capture setup and create an empty on a tracked camera","archive_hash":"sha256:ddf5d45609f794693fa8eca42bf8427c0095ba9b7ff032250cb1bde891a3fdb3","archive_size":2709,"archive_url":"https://extensions.blender.org/download/sha256:ddf5d45609f794693fa8eca42bf8427c0095ba9b7ff032250cb1bde891a3fdb3/add-on-fireray-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/fireray/","maintainer":"Blenderbob","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","Tracking"]},{"id":"HDRIRotator","schema_version":"1.0.0","name":"HDRI Rotator","version":"1.1.3","tagline":"Rotate HDRIs, Shadows and Sun from the viewport","archive_hash":"sha256:104ca5af587bb671e13aa9c56a5a6c373e8e6932f101e961cfc261db57c34c0d","archive_size":18375,"archive_url":"https://extensions.blender.org/download/sha256:104ca5af587bb671e13aa9c56a5a6c373e8e6932f101e961cfc261db57c34c0d/add-on-hdrirotator-v1.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/hdrirotator/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["Lighting"]},{"id":"auto_active_camera_switcher","schema_version":"1.0.0","name":"Auto Active Camera Switcher","version":"1.0.2","tagline":"Automatically makes the selected camera the active camera","archive_hash":"sha256:b604674c6f02cc353293796c7c645606a7829ebc8bb80e5ca6dc9843c7342bd5","archive_size":2653,"archive_url":"https://extensions.blender.org/download/sha256:b604674c6f02cc353293796c7c645606a7829ebc8bb80e5ca6dc9843c7342bd5/add-on-auto-active-camera-switcher-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-active-camera-switcher/","maintainer":"Yamato3D-3dnchu.com-","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Camera"]},{"id":"pcb3d_importer","schema_version":"1.0.0","name":"PCB 3D Importer","version":"2.17.4-fix","tagline":"Import PCB 3D Models from KiCad","archive_hash":"sha256:510b600c3155d7afedef450c05a7c1de9ee25fc1d0583ec6f45cfdd5ed374eed","archive_size":85003351,"archive_url":"https://extensions.blender.org/download/sha256:510b600c3155d7afedef450c05a7c1de9ee25fc1d0583ec6f45cfdd5ed374eed/add-on-pcb3d-importer-v2.17.4-fix-windows-x64-windows-arm64-linux-x64-macos-x64-macos-arm64.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/add-ons/pcb3d-importer/","maintainer":"Bobbe","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import .pcb3d files from disk"},"platforms":["windows-x64","windows-arm64","linux-x64","macos-x64","macos-arm64"],"tags":["Import-Export"]},{"id":"AddonProfiler","schema_version":"1.0.0","name":"Add-on Profiler","version":"2.1.0","tagline":"Monitor and capture add-on profiling data","archive_hash":"sha256:3f3f29f987b24e3669ca4ea739f1ded51ee2ded6adad647699eca3f96f99974c","archive_size":5449,"archive_url":"https://extensions.blender.org/download/sha256:3f3f29f987b24e3669ca4ea739f1ded51ee2ded6adad647699eca3f96f99974c/add-on-addonprofiler-v2.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/addonprofiler/","maintainer":"MrClock","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save and process benchmark and profile data"},"tags":["Development"]},{"id":"add_frame_range_presets","schema_version":"1.0.0","name":"Add Frame Range Presets","version":"1.1.3","tagline":"Create preset frame ranges in just a click","archive_hash":"sha256:3977d76fee643f5db538f589fc07c96e7a939a32800d6db73fd6422d146dd1ed","archive_size":16118,"archive_url":"https://extensions.blender.org/download/sha256:3977d76fee643f5db538f589fc07c96e7a939a32800d6db73fd6422d146dd1ed/add-on-add-frame-range-presets-v1.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/add-frame-range-presets/","maintainer":"stoatsnhoney","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"Light_Rain_Theme","schema_version":"1.0.0","name":"Light_Rain_Theme","version":"2.1.6","tagline":"Transparent Light Grey","archive_hash":"sha256:bb060ac5da73111cc4a7559cf34a73ef9a14ca746a7bebe738d3a5ecbd5447b7","archive_size":5630,"archive_url":"https://extensions.blender.org/download/sha256:bb060ac5da73111cc4a7559cf34a73ef9a14ca746a7bebe738d3a5ecbd5447b7/theme-light-rain-theme-v2.1.6.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/light-rain-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"C3DB","schema_version":"1.0.0","name":"3D Cursors Briefcase","version":"0.1.5","tagline":"Store and manage multiple 3D Cursors","archive_hash":"sha256:ada3f81101ccc11fadaa391ca697e11b29e7696dc20f2e4355af9bb4bddd5901","archive_size":6191,"archive_url":"https://extensions.blender.org/download/sha256:ada3f81101ccc11fadaa391ca697e11b29e7696dc20f2e4355af9bb4bddd5901/add-on-c3db-v0.1.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/c3db/","maintainer":"dupoxy","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"cameraide_settings","schema_version":"1.0.0","name":"Cameraide","version":"1.0.7","tagline":"Camera specific Resolution, Frame Range, Output Path & Format","archive_hash":"sha256:2f7ae8e560ed89774fca78dc4f3eb446cc13ac23690f745aa14cd4a60386f43d","archive_size":49695,"archive_url":"https://extensions.blender.org/download/sha256:2f7ae8e560ed89774fca78dc4f3eb446cc13ac23690f745aa14cd4a60386f43d/add-on-cameraide-settings-v1.0.7.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/cameraide-settings/","maintainer":"longiy","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","Render"]},{"id":"simple_bounce_curve","schema_version":"1.0.0","name":"Simple Bounce Curve","version":"1.1.0","tagline":"Creates a simple bounce curve between selected objects","archive_hash":"sha256:d9600617c81ca045b5aeffc5e393a1d09e589d7aca4d6ab15a0845720a93b47b","archive_size":2102,"archive_url":"https://extensions.blender.org/download/sha256:d9600617c81ca045b5aeffc5e393a1d09e589d7aca4d6ab15a0845720a93b47b/add-on-simple-bounce-curve-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/simple-bounce-curve/","maintainer":"Polyfjord","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Object"]},{"id":"org_tayou_bone_vertex_group_merge","schema_version":"1.0.0","name":"Bone and Vertex Group Merge","version":"1.2.0","tagline":"merge selected bones into the active bone","archive_hash":"sha256:54fc936c779fee14a3f05b6640680aaf942bbeceade45f4b351aaf76c8e6eccf","archive_size":1084528,"archive_url":"https://extensions.blender.org/download/sha256:54fc936c779fee14a3f05b6640680aaf942bbeceade45f4b351aaf76c8e6eccf/add-on-org-tayou-bone-vertex-group-merge-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/org-tayou-bone-vertex-group-merge/","maintainer":"Tayou","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"Custom_Grid_Scales","schema_version":"1.0.0","name":"Custom Grid Scales","version":"1.1.0","tagline":"Adds the ability to quickly change between custom grid scales","archive_hash":"sha256:05fa8215b7ed9ded0cca86164f49e09d5cc393e92f80dba4cc6c5c6358588b01","archive_size":2631,"archive_url":"https://extensions.blender.org/download/sha256:05fa8215b7ed9ded0cca86164f49e09d5cc393e92f80dba4cc6c5c6358588b01/add-on-custom-grid-scales-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.1","website":"https://extensions.blender.org/add-ons/custom-grid-scales/","maintainer":"Jacob-Beatty","license":["SPDX:GPL-3.0-or-later"]},{"id":"more_colors","schema_version":"1.0.0","name":"HUE","version":"1.2.1","tagline":"A set of tools to make vertex painting easier","archive_hash":"sha256:db1855a3dcdf74fe16cf3be32f1d047c555680d51c18dd78c001da7e6a4f19c3","archive_size":186803,"archive_url":"https://extensions.blender.org/download/sha256:db1855a3dcdf74fe16cf3be32f1d047c555680d51c18dd78c001da7e6a4f19c3/add-on-more-colors-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/more-colors/","maintainer":"FardreamerLabs","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Mesh","Paint"]},{"id":"thomas_rig_legacy","schema_version":"1.0.0","name":"Thomas Rig Legacy","version":"1.2.2","tagline":"Addon for this rig","archive_hash":"sha256:0e2893a9731bbc6384ef7fe4a75a30d74c751a51661655c03369f7cf6ac2134c","archive_size":10607720,"archive_url":"https://extensions.blender.org/download/sha256:0e2893a9731bbc6384ef7fe4a75a30d74c751a51661655c03369f7cf6ac2134c/add-on-thomas-rig-legacy-v1.2.2-windows-x64-macos-arm64-linux-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/thomas-rig-legacy/","maintainer":"BlueEvilGFX","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"To save the skin to Blender-tmp & read MC textures","network":"To download a skin with the Minecraft/Mojang API"},"platforms":["windows-x64","macos-arm64","linux-x64"],"tags":["Animation","Rigging"]},{"id":"cortecloud_export","schema_version":"1.0.0","name":"CorteCloud Export","version":"1.0.5","tagline":"Manage and Export wood cut list to CorteCloud csv format","archive_hash":"sha256:ac372a5a9e812069840c9b24f86e86af9f625b798445d128732b8dd94890a191","archive_size":20274,"archive_url":"https://extensions.blender.org/download/sha256:ac372a5a9e812069840c9b24f86e86af9f625b798445d128732b8dd94890a191/add-on-cortecloud-export-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cortecloud-export/","maintainer":"Filipe-Rocha-Lopes","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export csv files"}},{"id":"auto_reload","schema_version":"1.0.0","name":"Auto Reload","version":"3.1.2","tagline":"Automatic reload for external files","archive_hash":"sha256:881d502684e842f2b90d1d911128adea6cebc39b31b91dc311ffc3bfb115f7d4","archive_size":21511,"archive_url":"https://extensions.blender.org/download/sha256:881d502684e842f2b90d1d911128adea6cebc39b31b91dc311ffc3bfb115f7d4/add-on-auto-reload-v3.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-reload/","maintainer":"tonton_","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Checking/Reloading external files from current blend"},"tags":["Import-Export","Pipeline"]},{"id":"Colorista","schema_version":"1.0.0","name":"Colorista","version":"1.1.9","tagline":"A convenient color grading add-on designed for colorists","archive_hash":"sha256:07da6c3d687b8a6f88ea120adf93b10cf0a5a88aca12998a2cb02f20380523ef","archive_size":950252,"archive_url":"https://extensions.blender.org/download/sha256:07da6c3d687b8a6f88ea120adf93b10cf0a5a88aca12998a2cb02f20380523ef/add-on-colorista-v1.1.9.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/colorista/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read Node"},"tags":["Modeling","Node","Render","Compositing"]},{"id":"popoti_align_helper","schema_version":"1.0.0","name":"POPOTI Align Helper","version":"1.2.7","tagline":"More friendly alignment based on observation perspective","archive_hash":"sha256:fca6fa04bc5880bf5d8bdce12d49f6cde3b9d5db7f79f957e1ef504cfde4720f","archive_size":95518,"archive_url":"https://extensions.blender.org/download/sha256:fca6fa04bc5880bf5d8bdce12d49f6cde3b9d5db7f79f957e1ef504cfde4720f/add-on-popoti-align-helper-v1.2.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/popoti-align-helper/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Object"]},{"id":"UV_Snapper","schema_version":"1.0.0","name":"UV Snapper","version":"1.1.1","tagline":"Snap selected UVs to a custom atlas","archive_hash":"sha256:e8b8a90172e88ed991b7c3dfae419b660a9209caf9a1de97ab68b2ecd4d744eb","archive_size":236058,"archive_url":"https://extensions.blender.org/download/sha256:e8b8a90172e88ed991b7c3dfae419b660a9209caf9a1de97ab68b2ecd4d744eb/add-on-uv-snapper-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/uv-snapper/","maintainer":"Duncan-Readle","license":["SPDX:GPL-3.0-or-later"],"tags":["UV"]},{"id":"theme_moss","schema_version":"1.0.0","name":"Moss","version":"1.0.5","tagline":"Mossy castle dark theme","archive_hash":"sha256:3475452906c58f1ec3d6b15a961a729cce0e3986ec081e5b6cfc055967ae4078","archive_size":5609,"archive_url":"https://extensions.blender.org/download/sha256:3475452906c58f1ec3d6b15a961a729cce0e3986ec081e5b6cfc055967ae4078/theme-theme-moss-v1.0.5.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-moss/","maintainer":"Sereda","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"mesh_repair_tools","schema_version":"1.0.0","name":"Mesh Repair Tools","version":"4.0.2","tagline":"An integrated toolbox for mesh repair","archive_hash":"sha256:4d7221841bcc5fb23a26835dbfd9b2a87ce2ddcb29215d1f715329a924008fc7","archive_size":13836,"archive_url":"https://extensions.blender.org/download/sha256:4d7221841bcc5fb23a26835dbfd9b2a87ce2ddcb29215d1f715329a924008fc7/add-on-mesh-repair-tools-v4.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mesh-repair-tools/","maintainer":"SineWave","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh","User Interface"]},{"id":"profiling_buddy","schema_version":"1.0.0","name":"Profiling Buddy","version":"1.0.0","tagline":"Adds modifier panel to profile execution times","archive_hash":"sha256:025a1466757a8937bbea1cf5f377272eeb2f259b8be6b1f558d5c642629c78d0","archive_size":1756,"archive_url":"https://extensions.blender.org/download/sha256:025a1466757a8937bbea1cf5f377272eeb2f259b8be6b1f558d5c642629c78d0/add-on-profiling-buddy-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/profiling-buddy/","maintainer":"SimonThommes","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Rigging","Geometry Nodes","User Interface"]},{"id":"Proton","schema_version":"1.0.0","name":"Proton","version":"1.1.0","tagline":"A modern dark theme for Blender with purple accents","archive_hash":"sha256:3bc76322cf8e763fdd823cd1955acc00e92480a9add6c7829a981459d93cad99","archive_size":5141,"archive_url":"https://extensions.blender.org/download/sha256:3bc76322cf8e763fdd823cd1955acc00e92480a9add6c7829a981459d93cad99/theme-proton-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/proton/","maintainer":"VISaberToothIV","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"Neo_Grey_Theme","schema_version":"1.0.0","name":"Neo_Grey_Theme","version":"2.4.5","tagline":"Dust Cloud","archive_hash":"sha256:a52dee9cfc4ddc437826eddf5fc398d50f0b6617b62771a707ed70188949d9a0","archive_size":5653,"archive_url":"https://extensions.blender.org/download/sha256:a52dee9cfc4ddc437826eddf5fc398d50f0b6617b62771a707ed70188949d9a0/theme-neo-grey-theme-v2.4.5.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/neo-grey-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"SMEAR","schema_version":"1.0.0","name":"SMEAR","version":"1.1.8","tagline":"Create smear frames for 3D animations","archive_hash":"sha256:eb035521ff506fa339916040c6184b5d09a124125bdfbb942ce2a50ca1b5b1e5","archive_size":3313751,"archive_url":"https://extensions.blender.org/download/sha256:eb035521ff506fa339916040c6184b5d09a124125bdfbb942ce2a50ca1b5b1e5/add-on-smear-v1.1.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/smear/","maintainer":"Jean-Basset","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"simple_deform_helper","schema_version":"1.0.0","name":"Simple Deform Helper","version":"0.2.7","tagline":"Simple Deform visualization adjustment tool","archive_hash":"sha256:4f8fbd7850d9415c8a5c3180af85d66c7b17c5a83a01a08bab14932525631acb","archive_size":173571,"archive_url":"https://extensions.blender.org/download/sha256:4f8fbd7850d9415c8a5c3180af85d66c7b17c5a83a01a08bab14932525631acb/add-on-simple-deform-helper-v0.2.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/simple-deform-helper/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Object","Mesh"]},{"id":"uv_toolkit","schema_version":"1.0.0","name":"UVToolkit","version":"2.1.4","tagline":"A collection of UV editing tools for Blender","archive_hash":"sha256:39634792bd71b161ed5cf6156b0167937d1a18818c91b24823dbbc8cd51fb859","archive_size":2611931,"archive_url":"https://extensions.blender.org/download/sha256:39634792bd71b161ed5cf6156b0167937d1a18818c91b24823dbbc8cd51fb859/add-on-uv-toolkit-v2.1.4.zip","type":"add-on","blender_version_min":"5.0.0","blender_version_max":"6.0.0","website":"https://extensions.blender.org/add-ons/uv-toolkit/","maintainer":"razed","license":["SPDX:GPL-3.0-or-later"],"tags":["UV","Material"]},{"id":"image_packer","schema_version":"1.0.0","name":"Image Packer","version":"1.0.7","tagline":"Packs images into a single image","archive_hash":"sha256:32ff0572ecfd9fd7af321ae9299f59101c3d222879c7d7aebb2622f1c3f82c2c","archive_size":24146,"archive_url":"https://extensions.blender.org/download/sha256:32ff0572ecfd9fd7af321ae9299f59101c3d222879c7d7aebb2622f1c3f82c2c/add-on-image-packer-v1.0.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/image-packer/","maintainer":"Quint-Vrolijk","license":["SPDX:GPL-3.0-or-later"],"tags":["Paint"]},{"id":"Modal_lattice_resolution","schema_version":"1.0.0","name":"Modal Lattice Resolution","version":"0.3.4","tagline":"Create Lattice or Tweak Resolution from 3D viewport, 'L' keymap","archive_hash":"sha256:13fb4af136685386fb22fe40e68d29c9a7cebdc24d6a5acc2d87ce031e0ad13b","archive_size":7314,"archive_url":"https://extensions.blender.org/download/sha256:13fb4af136685386fb22fe40e68d29c9a7cebdc24d6a5acc2d87ce031e0ad13b/add-on-modal-lattice-resolution-v0.3.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/modal-lattice-resolution/","maintainer":"Tyo79","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Mesh"]},{"id":"you_are_autosave","schema_version":"1.0.0","name":"You Are Autosave","version":"1.5.0","tagline":"Show a warning when you haven't saved in a while","archive_hash":"sha256:7655433433ca018ea03604dc0b8759ce2de9d5c239024017abb8a95b153ee63b","archive_size":17503,"archive_url":"https://extensions.blender.org/download/sha256:7655433433ca018ea03604dc0b8759ce2de9d5c239024017abb8a95b153ee63b/add-on-you-are-autosave-v1.5.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/you-are-autosave/","maintainer":"dr.sybren","license":["SPDX:GPL-3.0-or-later"],"tags":["System"]},{"id":"univ","schema_version":"1.0.0","name":"UniV","version":"3.9.8","tagline":"UV Toolkit","archive_hash":"sha256:b2f60a434fbded2bc1307ad86beeced014409773d69aad4fa1fcfa087f23ea8c","archive_size":538491,"archive_url":"https://extensions.blender.org/download/sha256:b2f60a434fbded2bc1307ad86beeced014409773d69aad4fa1fcfa087f23ea8c/add-on-univ-v3.9.8.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.1.10","website":"https://extensions.blender.org/add-ons/univ/","maintainer":"Oxicid","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Creates and updates icon files in the add-on directory"},"tags":["UV"]},{"id":"gesture_helper","schema_version":"1.0.0","name":"Gesture Helper","version":"2.2.6","tagline":"Quickly use gestures to run the operator or change properties","archive_hash":"sha256:39ac43460689ec3ddfb4ee02ebf6a6695719367bb4962b1629344ed03feefec5","archive_size":1125093,"archive_url":"https://extensions.blender.org/download/sha256:39ac43460689ec3ddfb4ee02ebf6a6695719367bb4962b1629344ed03feefec5/add-on-gesture-helper-v2.2.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/gesture-helper/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/Export Gesture preset"},"tags":["3D View","User Interface"]},{"id":"bone_eyedropper","schema_version":"1.0.0","name":"Bone Eyedropper","version":"1.1.8","tagline":"Eyedrop a bone from active or target and assign it to a property","archive_hash":"sha256:b2b551c815a874247b7d4e8c11b167d331319bea1f7551db5a2ac443642297fd","archive_size":139882,"archive_url":"https://extensions.blender.org/download/sha256:b2b551c815a874247b7d4e8c11b167d331319bea1f7551db5a2ac443642297fd/add-on-bone-eyedropper-v1.1.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bone-eyedropper/","maintainer":"Nifs","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import .blend from disk","clipboard":"Copy property paths to clipboard"},"tags":["3D View","User Interface"]},{"id":"quick_export_extension","schema_version":"1.0.0","name":"Quick Export","version":"1.1.0","tagline":"Exports the active object's collection if it has exporters","archive_hash":"sha256:bc786396fcbd9e0c3f309ea0388a815912111e4417f5f3faeb2e7cc5fc975f76","archive_size":2422,"archive_url":"https://extensions.blender.org/download/sha256:bc786396fcbd9e0c3f309ea0388a815912111e4417f5f3faeb2e7cc5fc975f76/add-on-quick-export-extension-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-export-extension/","maintainer":"Maro3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"Real_Time_Paths","schema_version":"1.0.0","name":"Motion Path Pro","version":"3.1.0","tagline":"Update motion path in real time","archive_hash":"sha256:eaee70d1ffaf5b3454ba6cd5c39d4b779b99bd59c52227aa0fea627276db7ff2","archive_size":15369,"archive_url":"https://extensions.blender.org/download/sha256:eaee70d1ffaf5b3454ba6cd5c39d4b779b99bd59c52227aa0fea627276db7ff2/add-on-real-time-paths-v3.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/real-time-paths/","maintainer":"Hamdi-Amer","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"theme_GreenKM","schema_version":"1.0.0","name":"Green Kode Mono","version":"1.1.6","tagline":"Kinda retro green theme","archive_hash":"sha256:9e27e44e3086d3df5937c923415b4271c6a4d6ff0cf288bb01cc62b362d46567","archive_size":6032,"archive_url":"https://extensions.blender.org/download/sha256:9e27e44e3086d3df5937c923415b4271c6a4d6ff0cf288bb01cc62b362d46567/theme-theme-greenkm-v1.1.6.zip","type":"theme","blender_version_min":"5.0.1","website":"https://extensions.blender.org/themes/theme-greenkm/","maintainer":"DannySi","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"Quellenform_theme","schema_version":"1.0.0","name":"Quellenform's Theme","version":"0.1.0","tagline":"A dark grey theme with a gentle touch of blue and green colors","archive_hash":"sha256:1fd5a7c591b27910c3f584f3954a4b478dc3a4585a3bd8748c4290a7bc1da20d","archive_size":5899,"archive_url":"https://extensions.blender.org/download/sha256:1fd5a7c591b27910c3f584f3954a4b478dc3a4585a3bd8748c4290a7bc1da20d/theme-quellenform-theme-v0.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/quellenform-theme/","maintainer":"quellenform","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"act_game_asset_creation_toolset","schema_version":"1.0.0","name":"ACT: Game Asset Creation Toolset","version":"2025.2.1","tagline":"Tools for easy create and export low-poly game assets","archive_hash":"sha256:e733197281ff010e1b5fd4ddc9c17249becc7a14c759ae87e82fa1bed9deb284","archive_size":49479,"archive_url":"https://extensions.blender.org/download/sha256:e733197281ff010e1b5fd4ddc9c17249becc7a14c759ae87e82fa1bed9deb284/add-on-act-game-asset-creation-toolset-v2025.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/act-game-asset-creation-toolset/","maintainer":"IvanVostrikov","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export FBX/OBJ/GLTF to disk"},"tags":["3D View","Object","UV","Mesh","Import-Export","Modeling"]},{"id":"node_to_python","schema_version":"1.0.0","name":"Node To Python","version":"4.1.0","tagline":"Turn node groups into Python code","archive_hash":"sha256:f706edda81af97285ff5af6e82ee9aff8f71eed30ab3a5c810ba90ca4c08d085","archive_size":81029,"archive_url":"https://extensions.blender.org/download/sha256:f706edda81af97285ff5af6e82ee9aff8f71eed30ab3a5c810ba90ca4c08d085/add-on-node-to-python-v4.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-to-python/","maintainer":"Brendan-Parmer","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Creates and writes to files in a user-specified directory"},"tags":["Development","Compositing","Geometry Nodes","Material","Node"]},{"id":"Eclipse","schema_version":"1.0.0","name":"Eclipse","version":"1.2.2","tagline":"Where Darkness Meets Elegance","archive_hash":"sha256:9b22fcdaed346fdc37aeb5f4686932495b6bbbb70f9ce62d6c6b960bb5894ba7","archive_size":5863,"archive_url":"https://extensions.blender.org/download/sha256:9b22fcdaed346fdc37aeb5f4686932495b6bbbb70f9ce62d6c6b960bb5894ba7/theme-eclipse-v1.2.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/eclipse/","maintainer":"DaoL","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"custom_templates","schema_version":"1.0.0","name":"Custom Templates","version":"1.6.0","tagline":"Use your own .blend files as template options for new projects","archive_hash":"sha256:49a47ee241f407d7efabea8811084ba9f6c1342d61d94b77177401cf5701ea4e","archive_size":10674,"archive_url":"https://extensions.blender.org/download/sha256:49a47ee241f407d7efabea8811084ba9f6c1342d61d94b77177401cf5701ea4e/add-on-custom-templates-v1.6.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/custom-templates/","maintainer":"Francesco-Bellini","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/Export, + from folder, Ensure absolute paths in resources"},"tags":["System","User Interface"]},{"id":"world_apply","schema_version":"1.0.0","name":"World Apply","version":"1.0.1","tagline":"Sync viewport world settings with scene world settings","archive_hash":"sha256:17188904a6800963eae79e35ca53f13c2289c98ad4ef63172d42f250ed33c663","archive_size":2866,"archive_url":"https://extensions.blender.org/download/sha256:17188904a6800963eae79e35ca53f13c2289c98ad4ef63172d42f250ed33c663/add-on-world-apply-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/world-apply/","maintainer":"Baraa-Khaled-Youssef","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read HDRI files stored in Blender's directories"},"tags":["Lighting"]},{"id":"timeline_buttons","schema_version":"1.0.0","name":"Timeline Buttons","version":"1.0.0","tagline":"Put the buttons in timeline to other animation related editors","archive_hash":"sha256:3aac330381de15d2f69641f0f6c7f0dcaec42371e014ca70889cad899d27d815","archive_size":15158,"archive_url":"https://extensions.blender.org/download/sha256:3aac330381de15d2f69641f0f6c7f0dcaec42371e014ca70889cad899d27d815/add-on-timeline-buttons-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/timeline-buttons/","maintainer":"tinkerboi","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"ddslideshow","schema_version":"1.0.0","name":"DDSlideshow","version":"0.0.5","tagline":"Create a Ken Burns Effect slideshow","archive_hash":"sha256:c83b00339fb45a3a50191a3856dead7a9878c5c9101a198ceece181c96d8ab0b","archive_size":7196,"archive_url":"https://extensions.blender.org/download/sha256:c83b00339fb45a3a50191a3856dead7a9878c5c9101a198ceece181c96d8ab0b/add-on-ddslideshow-v0.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ddslideshow/","maintainer":"Michael-Lamertz","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Required to load images for the slideshow"},"tags":["Sequencer"]},{"id":"ikea_browser","schema_version":"1.0.0","name":"IKEA Browser","version":"0.4.0","tagline":"Search and import models from ikea.com","archive_hash":"sha256:b8b619c55c58ab93222c40e46633d3dc1fc3e2ca2ebf26128572164e04ae27b2","archive_size":7016,"archive_url":"https://extensions.blender.org/download/sha256:b8b619c55c58ab93222c40e46633d3dc1fc3e2ca2ebf26128572164e04ae27b2/add-on-ikea-browser-v0.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ikea-browser/","maintainer":"Shish","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Store downloaded models","network":"Download from ikea.com"},"tags":["Import-Export"]},{"id":"bonsai","schema_version":"1.0.0","name":"Bonsai","version":"0.8.4","tagline":"A native Building Information Model authoring platform using IFC","archive_hash":"sha256:93efc79d28e5561f80035afcdb517938b1b066862945dcaeb0df8cc40228af65","archive_size":119643469,"archive_url":"https://extensions.blender.org/download/sha256:93efc79d28e5561f80035afcdb517938b1b066862945dcaeb0df8cc40228af65/add-on-bonsai-v0.8.4-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bonsai/","maintainer":"IfcOpenShell","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load and save IFCs, IDS, BCF, etc from disk","network":"Augin / Cove.Tool integration for VR and environmental analysis","clipboard":"Copy and paste error logs"},"platforms":["windows-x64"],"tags":["3D View","Add Mesh","Animation","Camera","Development","Import-Export","Lighting","Material","Modeling","Mesh","Node","Object","Pipeline","Render","Scene","System","User Interface","UV"]},{"id":"Clean_Blue","schema_version":"1.0.0","name":"Clean Blue","version":"1.4.0","tagline":"This is a pleasant light-colored theme","archive_hash":"sha256:6dde8d3518209c90af4af2a06f162a18c34e7c886e0a557f7c0c93fd811fa63d","archive_size":5811,"archive_url":"https://extensions.blender.org/download/sha256:6dde8d3518209c90af4af2a06f162a18c34e7c886e0a557f7c0c93fd811fa63d/theme-clean-blue-v1.4.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/clean-blue/","maintainer":"DaoL","license":["SPDX:GPL-2.0-or-later"],"tags":["Light"]},{"id":"redsquare","schema_version":"1.0.0","name":"RedSquare V2","version":"1.2.1","tagline":"A theme with basic red tones and a more square-ish type of look","archive_hash":"sha256:05e411805c178dff7b8a4e3a9fe37a15bea260f01e8903d6e17bf1845f20fc8e","archive_size":5707,"archive_url":"https://extensions.blender.org/download/sha256:05e411805c178dff7b8a4e3a9fe37a15bea260f01e8903d6e17bf1845f20fc8e/theme-redsquare-v1.2.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/redsquare/","maintainer":"luccadanielp","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","High Contrast"]},{"id":"mengges_dark_theme","schema_version":"1.0.0","name":"MengGe's Dark Theme","version":"1.2.0","tagline":"Dark Theme Pro Max Ultra Plus Lift","archive_hash":"sha256:f2d43e826c8469ebd6ee3df71eb23af969c9f73ff80b877b2c6036a3c6be25cc","archive_size":5629,"archive_url":"https://extensions.blender.org/download/sha256:f2d43e826c8469ebd6ee3df71eb23af969c9f73ff80b877b2c6036a3c6be25cc/theme-mengges-dark-theme-v1.2.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/mengges-dark-theme/","maintainer":"MengGe_KKD","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"armature_pie","schema_version":"1.0.0","name":"Armature Pie","version":"1.1.2","tagline":"Pick Armatures Comfortably & Solo Collection By Pie Menu","archive_hash":"sha256:f03490659072d00769c5d545524870938508d1b012e6285cd934a34d6b7411da","archive_size":13793,"archive_url":"https://extensions.blender.org/download/sha256:f03490659072d00769c5d545524870938508d1b012e6285cd934a34d6b7411da/add-on-armature-pie-v1.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/armature-pie/","maintainer":"Ou_Chiang","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Rigging"]},{"id":"Elegant_Light_Theme","schema_version":"1.0.0","name":"Elegant_Light_Theme","version":"2.2.7","tagline":"Soft Light","archive_hash":"sha256:e0d1e9fc6050dca6d647f19029cc7a1a81adf22b8827d5da227c60cb2d70e04c","archive_size":5669,"archive_url":"https://extensions.blender.org/download/sha256:e0d1e9fc6050dca6d647f19029cc7a1a81adf22b8827d5da227c60cb2d70e04c/theme-elegant-light-theme-v2.2.7.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/elegant-light-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"livery_helper","schema_version":"1.0.0","name":"LiveryHelper","version":"1.0.3","tagline":"Makes creating, editing and customizing car liveries much easier","archive_hash":"sha256:5f1718454dab8b0507fdd8f1743f5536cb0da9f423e7bc789b664eef19b28cab","archive_size":5198,"archive_url":"https://extensions.blender.org/download/sha256:5f1718454dab8b0507fdd8f1743f5536cb0da9f423e7bc789b664eef19b28cab/add-on-livery-helper-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/livery-helper/","maintainer":"Mast26","license":["SPDX:MIT"],"permissions":{"files":"Loading source livery images"},"tags":["Material"]},{"id":"optiploy","schema_version":"1.0.0","name":"OptiPloy: Rig Spawner","version":"1.8.2","tagline":"Improve your workflow with smarter linking tools","archive_hash":"sha256:8dee57bb226f754c3bcab8986df3eca85ee8148faae759649f48d2374c7e0956","archive_size":41364,"archive_url":"https://extensions.blender.org/download/sha256:8dee57bb226f754c3bcab8986df3eca85ee8148faae759649f48d2374c7e0956/add-on-optiploy-v1.8.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/optiploy/","maintainer":"hisanimations","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and save .blend and folder entries"},"tags":["Pipeline","Animation","Rigging","Import-Export"]},{"id":"io_scene_mvr","schema_version":"1.0.0","name":"Scene MVR (.mvr) and GDTF (.gdtf)","version":"1.5.3","tagline":"My Virtual Rig and General Device Type Format","archive_hash":"sha256:a258859f5e5f15c2c1376ea96258968c4a1ce9d90a9bd867d1c62f8c9f9d8ea1","archive_size":317585,"archive_url":"https://extensions.blender.org/download/sha256:a258859f5e5f15c2c1376ea96258968c4a1ce9d90a9bd867d1c62f8c9f9d8ea1/add-on-io-scene-mvr-v1.5.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-scene-mvr/","maintainer":"NRGSille","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"General Device Type Format and My Virtual Rig files"},"tags":["Import-Export","Scene","Lighting","Tracking","Rigging"]},{"id":"CV_Filter_Channels","schema_version":"1.0.0","name":"Filter_Channels","version":"1.0.8","tagline":"Filter channels in Graph Editor for animation","archive_hash":"sha256:b96b9024aca598c17e2ec30cd33cd25d419cf82d94c51c2e056f2ba3603a9bd2","archive_size":15830,"archive_url":"https://extensions.blender.org/download/sha256:b96b9024aca598c17e2ec30cd33cd25d419cf82d94c51c2e056f2ba3603a9bd2/add-on-cv-filter-channels-v1.0.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cv-filter-channels/","maintainer":"Carles-V","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"right_mouse_navigation","schema_version":"1.0.0","name":"Right Mouse Navigation","version":"2.8.0","tagline":"Game Engine Movement and Menus","archive_hash":"sha256:9974909656bb82cb599949b93df47cabf0b174cd727504254e35fc08a36e222d","archive_size":2200146,"archive_url":"https://extensions.blender.org/download/sha256:9974909656bb82cb599949b93df47cabf0b174cd727504254e35fc08a36e222d/add-on-right-mouse-navigation-v2.8.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/right-mouse-navigation/","maintainer":"SpectralVectors","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Node","User Interface"]},{"id":"texel_density_checker","schema_version":"1.0.0","name":"Texel Density Checker","version":"2025.1.2","tagline":"Toolset for working with Texel Density","archive_hash":"sha256:00e9f4b96ce4966ab59d68182491273a5e2e5205ab0d16ad4abe9c8bbf531a35","archive_size":48357,"archive_url":"https://extensions.blender.org/download/sha256:00e9f4b96ce4966ab59d68182491273a5e2e5205ab0d16ad4abe9c8bbf531a35/add-on-texel-density-checker-v2025.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/texel-density-checker/","maintainer":"IvanVostrikov","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Object","UV"]},{"id":"simple_renaming_panel","schema_version":"1.0.0","name":"Simple Renaming","version":"2.1.5","tagline":"Effortlessly rename multiple objects with this simple addon","archive_hash":"sha256:c5a17fd41ab08ebf1420677c0d26c8dea2fb41786605bd66ce99c93403c69436","archive_size":57204,"archive_url":"https://extensions.blender.org/download/sha256:c5a17fd41ab08ebf1420677c0d26c8dea2fb41786605bd66ce99c93403c69436/add-on-simple-renaming-panel-v2.1.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/simple-renaming-panel/","maintainer":"MatthiasPatscheider","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Scene","User Interface"]},{"id":"auto_switch_theme","schema_version":"1.0.0","name":"Auto Switch Theme","version":"1.0.1","tagline":"Set light and dark themes based on your system appearance","archive_hash":"sha256:e3c92dc4696f87117b7ce31d52ed690c3c302ddeca98b5677788c7d2eaeac6b1","archive_size":11020,"archive_url":"https://extensions.blender.org/download/sha256:e3c92dc4696f87117b7ce31d52ed690c3c302ddeca98b5677788c7d2eaeac6b1/add-on-auto-switch-theme-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-switch-theme/","maintainer":"pablovazquez","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Read existing themes from disk"},"tags":["User Interface"]},{"id":"ik_fk_snapping_tool","schema_version":"1.0.0","name":"IK-FK Snapping Tool","version":"3.0.3","tagline":"Tools to perform IK to FK and FK to IK snapping","archive_hash":"sha256:bc34f92eeab8f922dc6918d3f3f05c8f42ddde0faaffbb3a69c3a164dea16ddd","archive_size":19058,"archive_url":"https://extensions.blender.org/download/sha256:bc34f92eeab8f922dc6918d3f3f05c8f42ddde0faaffbb3a69c3a164dea16ddd/add-on-ik-fk-snapping-tool-v3.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ik-fk-snapping-tool/","maintainer":"Endertainer007","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Rigging"]},{"id":"macos_dark_theme","schema_version":"1.0.0","name":"MacOS Dark Theme","version":"2.0.1","tagline":"The MacOS interface style in Blender","archive_hash":"sha256:5a2b3a93e7d4aad0a6adb3e52f382007e292af49730e5335f018b11c3cfdd4f3","archive_size":17990,"archive_url":"https://extensions.blender.org/download/sha256:5a2b3a93e7d4aad0a6adb3e52f382007e292af49730e5335f018b11c3cfdd4f3/theme-macos-dark-theme-v2.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/macos-dark-theme/","maintainer":"stoatsnhoney","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"openvat","schema_version":"1.0.0","name":"OpenVAT","version":"1.1.0","tagline":"Encode and preview vertex animation textures","archive_hash":"sha256:9ead429665193bae5f97ce5af171ef6cd772aa158f80b6d1c750480d8d9aaec1","archive_size":277888,"archive_url":"https://extensions.blender.org/download/sha256:9ead429665193bae5f97ce5af171ef6cd772aa158f80b6d1c750480d8d9aaec1/add-on-openvat-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/openvat/","maintainer":"sharpened","license":["SPDX:GPL-3.0-or-later"]},{"id":"align2custom","schema_version":"1.0.0","name":"Align 2 Custom","version":"2.1.2","tagline":"Align 3D View to custom orientation or 3D cursor","archive_hash":"sha256:c9c2b3ba9871dc20208c20772006af0644f5ab7aa7f9acf9fc2b03098cbc1856","archive_size":17939,"archive_url":"https://extensions.blender.org/download/sha256:c9c2b3ba9871dc20208c20772006af0644f5ab7aa7f9acf9fc2b03098cbc1856/add-on-align2custom-v2.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/align2custom/","maintainer":"fdaubine","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","3D View"]},{"id":"import_mixamo_root_motion","schema_version":"1.0.0","name":"Import Mixamo - Root Motion","version":"1.0.4","tagline":"Batch Import Fbx (Mixamo) And Apply Root Motion","archive_hash":"sha256:37ac8c15fa31546dbad06acd6775a9450b2fff253189dc566a81dbe914d39898","archive_size":23759,"archive_url":"https://extensions.blender.org/download/sha256:37ac8c15fa31546dbad06acd6775a9450b2fff253189dc566a81dbe914d39898/add-on-import-mixamo-root-motion-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/add-ons/import-mixamo-root-motion/","maintainer":"DevilMayCry","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import FBX from disk"},"tags":["Import-Export"]},{"id":"Quick_Rigid","schema_version":"1.0.0","name":"Quick Rigid","version":"1.2.1","tagline":"Easy access to the most used rigid body settings","archive_hash":"sha256:c63f54b24f264bb2553d8e85b64375a1151628c92ad31b0e3dd1687f0514b8bb","archive_size":1229239,"archive_url":"https://extensions.blender.org/download/sha256:c63f54b24f264bb2553d8e85b64375a1151628c92ad31b0e3dd1687f0514b8bb/add-on-quick-rigid-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-rigid/","maintainer":"nova3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Physics","Object"]},{"id":"geonode_shapekeys","schema_version":"1.0.0","name":"GeoNode Shape Keys","version":"1.0.0","tagline":"Sculpt on linked animated characters","archive_hash":"sha256:2ac8d503b2f7004a7066c9af0432da2327fc471b269e9f90cfb92cd86203442c","archive_size":220787,"archive_url":"https://extensions.blender.org/download/sha256:2ac8d503b2f7004a7066c9af0432da2327fc471b269e9f90cfb92cd86203442c/add-on-geonode-shapekeys-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/geonode-shapekeys/","maintainer":"Mets","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"To load the necessary GeoNodes from its .blend file"},"tags":["Rigging"]},{"id":"mesh_mesh_align_plus","schema_version":"1.0.0","name":"Mesh Align Plus","version":"1.1.0-rc.1","tagline":"Move/align mesh parts+objects based on scene geometry/metrics","archive_hash":"sha256:6177ca247f21143f839cf12aa0fda4b6ef738ef6554ce43c86446348b9bdf719","archive_size":90285,"archive_url":"https://extensions.blender.org/download/sha256:6177ca247f21143f839cf12aa0fda4b6ef738ef6554ce43c86446348b9bdf719/add-on-mesh-mesh-align-plus-v1.1.0-rc.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mesh-mesh-align-plus/","maintainer":"BitByte","license":["SPDX:GPL-2.0-or-later"],"tags":["3D View","Mesh","Modeling","Object","User Interface"]},{"id":"theme_Houdini","schema_version":"1.0.0","name":"Houdini","version":"1.3.0","tagline":"Theme Inspired By SideFX Houdini","archive_hash":"sha256:3d656c2c963edaf5040ca9ffb4f87ba7559b2cf6b3962d66b951a9e21d3dd3b9","archive_size":5502,"archive_url":"https://extensions.blender.org/download/sha256:3d656c2c963edaf5040ca9ffb4f87ba7559b2cf6b3962d66b951a9e21d3dd3b9/theme-theme-houdini-v1.3.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-houdini/","maintainer":"rmantdtg","license":["SPDX:GPL-2.0-or-later"],"tags":["Inspired By"]},{"id":"mio3_copy_weight","schema_version":"1.0.0","name":"Mio3 Copy Weight","version":"1.1.0","tagline":"Copies weights of selected vertices across objects","archive_hash":"sha256:6957c7eb02bbae11a3a5efef3b1470c8471b1864a71c08c69edeb0941249e92e","archive_size":15521,"archive_url":"https://extensions.blender.org/download/sha256:6957c7eb02bbae11a3a5efef3b1470c8471b1864a71c08c69edeb0941249e92e/add-on-mio3-copy-weight-v1.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/mio3-copy-weight/","maintainer":"mio","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"whispering_ripples","schema_version":"1.0.0","name":"Whispering Ripples","version":"1.3.0","tagline":"In the whisper of the night, ripples of creativity flow freely","archive_hash":"sha256:90a7ebd8eb00c189410b2bdb76c9d45863a44284af13ca8a3bf78a42bf1f93e1","archive_size":6168,"archive_url":"https://extensions.blender.org/download/sha256:90a7ebd8eb00c189410b2bdb76c9d45863a44284af13ca8a3bf78a42bf1f93e1/theme-whispering-ripples-v1.3.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/whispering-ripples/","maintainer":"DaoL","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"sequenced_bake","schema_version":"1.0.0","name":"Sequenced Bake","version":"1.1.2","tagline":"Tools for baking material sequences and generating sprite sheets","archive_hash":"sha256:917f041e203e21f2bdfe94fe45f954102fafcd8383092f1e19fa58b0cc63a5e9","archive_size":36274,"archive_url":"https://extensions.blender.org/download/sha256:917f041e203e21f2bdfe94fe45f954102fafcd8383092f1e19fa58b0cc63a5e9/add-on-sequenced-bake-v1.1.2.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/sequenced-bake/","maintainer":"Anthony-OConnell","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Saving and opening image files"},"tags":["Material","Bake","Node"]},{"id":"quick_menu","schema_version":"1.0.0","name":"QuickMenu","version":"2.0.0","tagline":"Quick-Add/Mod & Quick-Cam","archive_hash":"sha256:da1b178cbeb2abab2051e7017964a287d56de4c44dbf8386623af4834adce6d2","archive_size":17449,"archive_url":"https://extensions.blender.org/download/sha256:da1b178cbeb2abab2051e7017964a287d56de4c44dbf8386623af4834adce6d2/add-on-quick-menu-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-menu/","maintainer":"QiuMu","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"auto_track","schema_version":"1.0.0","name":"Auto-tracking","version":"1.0.0","tagline":"VFX motion tracking automation","archive_hash":"sha256:e4dc16bbe23f728ddd3c0a1f9a2389e9708c24d4975d00a77da1a676b8df928d","archive_size":3589,"archive_url":"https://extensions.blender.org/download/sha256:e4dc16bbe23f728ddd3c0a1f9a2389e9708c24d4975d00a77da1a676b8df928d/add-on-auto-track-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-track/","maintainer":"mcd1992","license":["SPDX:GPL-2.0-or-later"],"tags":["Tracking"]},{"id":"snap_bisect","schema_version":"1.0.0","name":"Snap Bisect","version":"1.0.6","tagline":"Bisect operator with snapping to vertices or edge midpoints","archive_hash":"sha256:396b5687b0917b6d0ac5105da9f6d18ecf582483c73a96a2de89a06556e2154a","archive_size":3851,"archive_url":"https://extensions.blender.org/download/sha256:396b5687b0917b6d0ac5105da9f6d18ecf582483c73a96a2de89a06556e2154a/add-on-snap-bisect-v1.0.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/snap-bisect/","maintainer":"AdamDominec","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"shape_key_swapper_extension","schema_version":"1.0.0","name":"ShapeKeySwapper","version":"1.0.3","tagline":"Swap vertex positions between 0 and 1 of the active shape key","archive_hash":"sha256:cdf443f57432608598903ed9f25a0821341ebb75feec8c83ead31545956476e0","archive_size":1941,"archive_url":"https://extensions.blender.org/download/sha256:cdf443f57432608598903ed9f25a0821341ebb75feec8c83ead31545956476e0/add-on-shape-key-swapper-extension-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shape-key-swapper-extension/","maintainer":"Maro3D","license":["SPDX:GPL-2.0-or-later"],"tags":["Mesh"]},{"id":"passpartout_slider","schema_version":"1.0.0","name":"Passpartout Slider","version":"1.0.0","tagline":"Let's you control active camera Passpartout by pressing P","archive_hash":"sha256:7d7cb75097ba7baff6feea1dff47164f2a36cd660d0845353a2ddb44fa134e21","archive_size":1819,"archive_url":"https://extensions.blender.org/download/sha256:7d7cb75097ba7baff6feea1dff47164f2a36cd660d0845353a2ddb44fa134e21/add-on-passpartout-slider-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/passpartout-slider/","maintainer":"Costa","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"Professional_theme","schema_version":"1.0.0","name":"Professional","version":"1.0.3","tagline":"Refined dark theme for professional use","archive_hash":"sha256:9af676f323f68fe8a7d415a434509fe832b3453936e0b78d2e0964194fd41056","archive_size":37056,"archive_url":"https://extensions.blender.org/download/sha256:9af676f323f68fe8a7d415a434509fe832b3453936e0b78d2e0964194fd41056/theme-professional-theme-v1.0.3.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"5.2.0","website":"https://extensions.blender.org/themes/professional-theme/","maintainer":"kame404","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"Piano_White_theme","schema_version":"1.0.0","name":"Piano_White","version":"1.0.2","tagline":"Elegant piano-inspired light theme","archive_hash":"sha256:ceffb5c4723052e8ecc632dc8f875a015e2578bbc1c6f363aea2bc648f6d5c7d","archive_size":36289,"archive_url":"https://extensions.blender.org/download/sha256:ceffb5c4723052e8ecc632dc8f875a015e2578bbc1c6f363aea2bc648f6d5c7d/theme-piano-white-theme-v1.0.2.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/themes/piano-white-theme/","maintainer":"kame404","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"Pastel_Pink_theme","schema_version":"1.0.0","name":"Pastel_Pink","version":"1.0.0","tagline":"Bright and poppy pastel pink Blender theme","archive_hash":"sha256:77fbdcec67eb4bb4614f01c03c3732fff4ee2cd881d6a8d5657161928b5ccfae","archive_size":36506,"archive_url":"https://extensions.blender.org/download/sha256:77fbdcec67eb4bb4614f01c03c3732fff4ee2cd881d6a8d5657161928b5ccfae/theme-pastel-pink-theme-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/themes/pastel-pink-theme/","maintainer":"kame404","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"Midnight_theme","schema_version":"1.0.0","name":"Midnight","version":"1.0.1","tagline":"Midnight blue dark theme","archive_hash":"sha256:66d091dc351d9a044307a6adb9ced1e506a1cc01176d8a2253995b146a9cb69c","archive_size":36944,"archive_url":"https://extensions.blender.org/download/sha256:66d091dc351d9a044307a6adb9ced1e506a1cc01176d8a2253995b146a9cb69c/theme-midnight-theme-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/themes/midnight-theme/","maintainer":"kame404","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"Metaseq_theme","schema_version":"1.0.0","name":"Metaseq","version":"1.0.1","tagline":"Light Metasequoia-style Blender theme","archive_hash":"sha256:1b35a233fdb54e5fdc03fd3648cf96566382be18eda2d010718e3d0fec4cb86c","archive_size":36310,"archive_url":"https://extensions.blender.org/download/sha256:1b35a233fdb54e5fdc03fd3648cf96566382be18eda2d010718e3d0fec4cb86c/theme-metaseq-theme-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/themes/metaseq-theme/","maintainer":"kame404","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"Maya2024_theme","schema_version":"1.0.0","name":"Maya2024","version":"1.0.1","tagline":"Maya-inspired Blender theme","archive_hash":"sha256:bc67a693666efe38635e64ee7f5700d9b2fc9304565a781928bffb080edc78d5","archive_size":36471,"archive_url":"https://extensions.blender.org/download/sha256:bc67a693666efe38635e64ee7f5700d9b2fc9304565a781928bffb080edc78d5/theme-maya2024-theme-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/themes/maya2024-theme/","maintainer":"kame404","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"Graphite_theme","schema_version":"1.0.0","name":"Graphite","version":"1.0.2","tagline":"Dark cool blue-tinted graphite theme","archive_hash":"sha256:d64f4190551b647e04b35fd1736f1bcafab755958893aa7ee2cc747e748cfe40","archive_size":36964,"archive_url":"https://extensions.blender.org/download/sha256:d64f4190551b647e04b35fd1736f1bcafab755958893aa7ee2cc747e748cfe40/theme-graphite-theme-v1.0.2.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/themes/graphite-theme/","maintainer":"kame404","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"Emerald_theme","schema_version":"1.0.0","name":"Emerald","version":"1.0.1","tagline":"Cyber-style green theme","archive_hash":"sha256:8536593147d7aa7c69577dfe3367b75462cb1f33966e8a5eb16ef70e5631061d","archive_size":36939,"archive_url":"https://extensions.blender.org/download/sha256:8536593147d7aa7c69577dfe3367b75462cb1f33966e8a5eb16ef70e5631061d/theme-emerald-theme-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/themes/emerald-theme/","maintainer":"kame404","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"Choco_Mint_theme","schema_version":"1.0.0","name":"Choco_Mint","version":"1.0.1","tagline":"Sweet and cool choco mint ice cream theme","archive_hash":"sha256:a3a1cbe878dffe9a97d71dc7a4fd7f4bd7f90839f5df5c9d56cd2cf7bf69d26a","archive_size":36494,"archive_url":"https://extensions.blender.org/download/sha256:a3a1cbe878dffe9a97d71dc7a4fd7f4bd7f90839f5df5c9d56cd2cf7bf69d26a/theme-choco-mint-theme-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/themes/choco-mint-theme/","maintainer":"kame404","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"keyframe_tools_extension","schema_version":"1.0.0","name":"Keyframe Tools","version":"1.0.7","tagline":"A set of tools for inserting, deleting, and moving keyframes","archive_hash":"sha256:e755c7ebb0df1e234b11a7f6ee93d05f9367913cf29121bdd42ce32fa52e324e","archive_size":11009,"archive_url":"https://extensions.blender.org/download/sha256:e755c7ebb0df1e234b11a7f6ee93d05f9367913cf29121bdd42ce32fa52e324e/add-on-keyframe-tools-extension-v1.0.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/keyframe-tools-extension/","maintainer":"Hydrocallis","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"omUlete","schema_version":"1.0.0","name":"omUlete","version":"0.98.8","tagline":"A stand-alone exporter for the Panda3D .egg format","archive_hash":"sha256:44c9b28bfc67dae7f58edca9527728c860fac7901f7d817a33110d4686f999a0","archive_size":33170,"archive_url":"https://extensions.blender.org/download/sha256:44c9b28bfc67dae7f58edca9527728c860fac7901f7d817a33110d4686f999a0/add-on-omulete-v0.98.8.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/omulete/","maintainer":"Jackson-Sutherland","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"save exported egg files"},"tags":["Import-Export","Game Engine"]},{"id":"custom_output_path","schema_version":"1.0.0","name":"Custom Output Path","version":"1.1.7","tagline":"Customize file output paths with placeholders","archive_hash":"sha256:97f14df19bdc4d19105fb30245dbcb71f77b28fa91b41a81ac7fb098b93b46fc","archive_size":23227,"archive_url":"https://extensions.blender.org/download/sha256:97f14df19bdc4d19105fb30245dbcb71f77b28fa91b41a81ac7fb098b93b46fc/add-on-custom-output-path-v1.1.7.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/custom-output-path/","maintainer":"Shuimeng","license":["SPDX:GPL-3.0-or-later"],"tags":["Compositing","Render"]},{"id":"render_preset","schema_version":"1.0.0","name":"Render Preset","version":"1.3.4","tagline":"Create and use render presets","archive_hash":"sha256:429dcb66ab8906791ae7ec237b9f07990f93ce00738f195f282ebc137142ebd3","archive_size":74565,"archive_url":"https://extensions.blender.org/download/sha256:429dcb66ab8906791ae7ec237b9f07990f93ce00738f195f282ebc137142ebd3/add-on-render-preset-v1.3.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/render-preset/","maintainer":"tonton_","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Reading and writing json preset files in a user-defined location"},"tags":["Render","Pipeline"]},{"id":"mesh_maze","schema_version":"1.0.0","name":"Maze any Mesh","version":"1.2.2","tagline":"Convert any mesh to a maze pattern","archive_hash":"sha256:032c4ec845968791fceba506688f0af05f64566a88fc9f8d3353c4d8aa0589f2","archive_size":18705,"archive_url":"https://extensions.blender.org/download/sha256:032c4ec845968791fceba506688f0af05f64566a88fc9f8d3353c4d8aa0589f2/add-on-mesh-maze-v1.2.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mesh-maze/","maintainer":"elfnorcat","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"Amethyst_theme","schema_version":"1.0.0","name":"Amethyst","version":"1.0.2","tagline":"Cyberpunk-inspired purple theme","archive_hash":"sha256:45ddbb5d9c21e9b9da2dc38a29366630b7745d47b4bb86c4b9afba48f6bf5a4f","archive_size":36951,"archive_url":"https://extensions.blender.org/download/sha256:45ddbb5d9c21e9b9da2dc38a29366630b7745d47b4bb86c4b9afba48f6bf5a4f/theme-amethyst-theme-v1.0.2.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/themes/amethyst-theme/","maintainer":"kame404","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"NodePie","schema_version":"1.0.0","name":"Node Pie","version":"1.2.53","tagline":"Add nodes faster with a pie menu","archive_hash":"sha256:7f4308c2d6cdf3ff6090a588b40281441b859e23178112de427c82f632e676ed","archive_size":431545,"archive_url":"https://extensions.blender.org/download/sha256:7f4308c2d6cdf3ff6090a588b40281441b859e23178112de427c82f632e676ed/add-on-nodepie-v1.2.53.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nodepie/","maintainer":"Strike_Digital","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Reading and writing config files"},"tags":["User Interface","Node"]},{"id":"drag_and_drop_support","schema_version":"1.0.0","name":"Drag and Drop Support","version":"1.3.0","tagline":"Support and improve drag and drop imports in Blender","archive_hash":"sha256:ffca1b51dec3b369d4550b7890bdcfe83ca5e33fbf8b0f77c6feb777640a0980","archive_size":29508,"archive_url":"https://extensions.blender.org/download/sha256:ffca1b51dec3b369d4550b7890bdcfe83ca5e33fbf8b0f77c6feb777640a0980/add-on-drag-and-drop-support-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/drag-and-drop-support/","maintainer":"Natsune-Mochizuki","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import models from the disk"},"tags":["3D View","Import-Export"]},{"id":"deep_gray_something","schema_version":"1.0.0","name":"Deep Gray Something","version":"1.0.1","tagline":"Blender 5 dark theme with blue and green selection highlights","archive_hash":"sha256:c7b1258ab1aec1a1e740e3899353305af318599e29fad0ef83abfdd0e44302c1","archive_size":6009,"archive_url":"https://extensions.blender.org/download/sha256:c7b1258ab1aec1a1e740e3899353305af318599e29fad0ef83abfdd0e44302c1/theme-deep-gray-something-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/deep-gray-something/","maintainer":"blanchsb","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","High Contrast","Accessibility"]},{"id":"matbatchtools","schema_version":"1.0.0","name":"Material Batch Tools","version":"2.3.2","tagline":"Quick batch automation of common material tasks","archive_hash":"sha256:2e401a8e2ad6de13a53c7a9b751d6276cb02b9d9cd1e027d2ff48cd58870a08f","archive_size":35616,"archive_url":"https://extensions.blender.org/download/sha256:2e401a8e2ad6de13a53c7a9b751d6276cb02b9d9cd1e027d2ff48cd58870a08f/add-on-matbatchtools-v2.3.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/matbatchtools/","maintainer":"Theanine3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","Node"]},{"id":"sourceenginecollisiontools","schema_version":"1.0.0","name":"Source Engine Collision Tools","version":"3.1.1","tagline":"Generate & optimize collision models for use in Source Engine","archive_hash":"sha256:cd0beb8c9123274c81dfcad4f43ae3e29cc2efafd7a83533fc1ee370593fcf69","archive_size":68537,"archive_url":"https://extensions.blender.org/download/sha256:cd0beb8c9123274c81dfcad4f43ae3e29cc2efafd7a83533fc1ee370593fcf69/add-on-sourceenginecollisiontools-v3.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sourceenginecollisiontools/","maintainer":"Theanine3D","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export collision-related QC and VMF files"},"tags":["Mesh","Object","Game Engine"]},{"id":"Key_Ops_Toolkit","schema_version":"1.0.0","name":"Key Ops: Toolkit","version":"0.2.52","tagline":"Industri Standard Tools & Shortcuts to Speed Up Blender Workflow","archive_hash":"sha256:794cc4fdcfd23b78d017e3442b03352f1e8abc0faf86610a79e4d0a925033aea","archive_size":291873,"archive_url":"https://extensions.blender.org/download/sha256:794cc4fdcfd23b78d017e3442b03352f1e8abc0faf86610a79e4d0a925033aea/add-on-key-ops-toolkit-v0.2.52.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/key-ops-toolkit/","maintainer":"Dan-Gry","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export/Import .obj files and use of temp folder"},"tags":["Modeling","Mesh","Object","UV","3D View"]},{"id":"hot_node","schema_version":"1.0.0","name":"Hot Node","version":"1.2.1","tagline":"Add nodes like adding node","archive_hash":"sha256:ba974165b67c4820466d70cce8f67242e6d6e8e9bbd6013f833a354cc26ef3f4","archive_size":113483,"archive_url":"https://extensions.blender.org/download/sha256:ba974165b67c4820466d70cce8f67242e6d6e8e9bbd6013f833a354cc26ef3f4/add-on-hot-node-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/hot-node/","maintainer":"Trantor","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Access file system for storing custom nodes"},"tags":["Node","Geometry Nodes","Material"]},{"id":"ZenUVChecker","schema_version":"1.0.0","name":"Zen UV Checker","version":"1.5.1","tagline":"Check the state of UVs on the model easily with Checker Textures","archive_hash":"sha256:82f22c29e599869a3b87b4cde469c47b603e4d68f70539cadb4196961c152e44","archive_size":2989307,"archive_url":"https://extensions.blender.org/download/sha256:82f22c29e599869a3b87b4cde469c47b603e4d68f70539cadb4196961c152e44/add-on-zenuvchecker-v1.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/zenuvchecker/","maintainer":"Sergey_Tyapkin","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Access to folders for importing Checker Textures"},"tags":["UV"]},{"id":"improved_node_search","schema_version":"1.0.0","name":"Improved Node Search","version":"1.0.5","tagline":"Navigate your node tree faster via more node search options","archive_hash":"sha256:a44ed6dbf107e0ef69c008b963ecc776101082c827bd943b9a01cdcc7c3991c4","archive_size":11647,"archive_url":"https://extensions.blender.org/download/sha256:a44ed6dbf107e0ef69c008b963ecc776101082c827bd943b9a01cdcc7c3991c4/add-on-improved-node-search-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/improved-node-search/","maintainer":"Griperis","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","User Interface"]},{"id":"noise_nodes","schema_version":"1.0.0","name":"Noise Nodes","version":"0.7.0","tagline":"Advance Noise Nodes For blender","archive_hash":"sha256:5213c751c997a1fc6905c912a60c254d0b95cdb571b7c3db1058be8b5f3755dc","archive_size":1482042,"archive_url":"https://extensions.blender.org/download/sha256:5213c751c997a1fc6905c912a60c254d0b95cdb571b7c3db1058be8b5f3755dc/add-on-noise-nodes-v0.7.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/noise-nodes/","maintainer":"Haseeb-Ahmed-3","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","Node"]},{"id":"Modifier_List_Fork","schema_version":"1.0.0","name":"Modifier List","version":"1.9.88","tagline":"Enhanced Modifier UI/Features, now with Edit Mesh Modifier","archive_hash":"sha256:3cb1e3fa2c6ac94ef4afd535e13a947379bc215d16084983415f9600b11c7d55","archive_size":164500,"archive_url":"https://extensions.blender.org/download/sha256:3cb1e3fa2c6ac94ef4afd535e13a947379bc215d16084983415f9600b11c7d55/add-on-modifier-list-fork-v1.9.88.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/modifier-list-fork/","maintainer":"Dan-Gry","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save Add-on Prefrences"},"tags":["Modeling","User Interface"]},{"id":"PolyQuilt_Fork","schema_version":"1.0.0","name":"PolyQuilt Retopology Tool","version":"1.45.9","tagline":"Retopology Tool for Blender","archive_hash":"sha256:931a4ae81b0c3fde2e17f498f0b6b7d73b54108abeb806d59b73d6733fa09af5","archive_size":179729,"archive_url":"https://extensions.blender.org/download/sha256:931a4ae81b0c3fde2e17f498f0b6b7d73b54108abeb806d59b73d6733fa09af5/add-on-polyquilt-fork-v1.45.9.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/polyquilt-fork/","maintainer":"Dan-Gry","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling"]},{"id":"clear_filepaths","schema_version":"1.0.0","name":"Clear Filepaths","version":"1.1.2","tagline":"Removes personal filepaths from your .blend file","archive_hash":"sha256:5800df075e83a222323db050bc9b774ad087dbca1b707103dba34ee5901f76a9","archive_size":4114,"archive_url":"https://extensions.blender.org/download/sha256:5800df075e83a222323db050bc9b774ad087dbca1b707103dba34ee5901f76a9/add-on-clear-filepaths-v1.1.2-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/clear-filepaths/","maintainer":"FlailingFog","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Saves a copy of a .blend file without filepaths"},"platforms":["windows-x64"],"tags":["System"]},{"id":"onyx","schema_version":"1.0.0","name":"Onyx","version":"1.1.0","tagline":"A minimalistic dark theme","archive_hash":"sha256:12963bbe3977a90f69a3edb0c21ef72620f162cde4160c70c9811cf2ec419da6","archive_size":5177,"archive_url":"https://extensions.blender.org/download/sha256:12963bbe3977a90f69a3edb0c21ef72620f162cde4160c70c9811cf2ec419da6/theme-onyx-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/onyx/","maintainer":"Aeraglyx","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"incremental_auto_save","schema_version":"1.0.0","name":"Incremental Auto-Save","version":"1.1.1","tagline":"Improvements to Blender's Autosave","archive_hash":"sha256:f97c7e93f3ba3f7f6d8cbe3e0dbc911bb5d0011df70841e4762f80bea70e1cee","archive_size":74530,"archive_url":"https://extensions.blender.org/download/sha256:f97c7e93f3ba3f7f6d8cbe3e0dbc911bb5d0011df70841e4762f80bea70e1cee/add-on-incremental-auto-save-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/incremental-auto-save/","maintainer":"Mets","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save preferences & .blends in chosen directories"},"tags":["System"]},{"id":"tiny_backup","schema_version":"1.0.0","name":"Tiny Backup","version":"1.0.2","tagline":"A minimalistic backup solution","archive_hash":"sha256:00f0e44af81d41ba29b5e95b10fad221791be4b611ed8ce462d5afab4f75cadc","archive_size":13763,"archive_url":"https://extensions.blender.org/download/sha256:00f0e44af81d41ba29b5e95b10fad221791be4b611ed8ce462d5afab4f75cadc/add-on-tiny-backup-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/tiny-backup/","maintainer":"Thane5","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Save backups on disk"},"tags":["System"]},{"id":"Randomize_Bones_Pose","schema_version":"1.0.0","name":"Randomize_Bones_Pose","version":"2.0.0","tagline":"Randomize_Bones_Pose","archive_hash":"sha256:f7cb0958faf3f296809e664f74ec4aec03b39cf1af6d64371b64061f44044bb4","archive_size":16685,"archive_url":"https://extensions.blender.org/download/sha256:f7cb0958faf3f296809e664f74ec4aec03b39cf1af6d64371b64061f44044bb4/add-on-randomize-bones-pose-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/randomize-bones-pose/","maintainer":"IZ.MdVerz","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Rigging"]},{"id":"omniscient","schema_version":"1.0.0","name":"Omniscient Importer","version":"2.3.5","tagline":"Automated scene setup for shots recorded with Omniscient iOS app","archive_hash":"sha256:551f3da30cbb1e8033aec1e4572cf211d530fe5dccde151c8a4b10897fb16b1e","archive_size":119480,"archive_url":"https://extensions.blender.org/download/sha256:551f3da30cbb1e8033aec1e4572cf211d530fe5dccde151c8a4b10897fb16b1e/add-on-omniscient-v2.3.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/omniscient/","maintainer":"Omniscient","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import .omni file from disk"},"tags":["Tracking","Import-Export","Camera","Compositing","Animation","Mesh","Scene"]},{"id":"pose_shape_keys","schema_version":"1.0.0","name":"Pose Shape Keys","version":"1.0.0","tagline":"Preserve your shape keys through weight changes, and much more","archive_hash":"sha256:f90f6365a515d7ddd60f8e8410a4a4d1fb36594ae20e3b989f09d9d4360849f6","archive_size":35835,"archive_url":"https://extensions.blender.org/download/sha256:f90f6365a515d7ddd60f8e8410a4a4d1fb36594ae20e3b989f09d9d4360849f6/add-on-pose-shape-keys-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pose-shape-keys/","maintainer":"Mets","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"select_panel_xdanic","schema_version":"1.0.0","name":"Select panel","version":"0.1.5","tagline":"All selections and more under a panel","archive_hash":"sha256:39f014c0fe720f04cfa525ff9c9e1fa13d899611969efecfe97002fc8a7cb793","archive_size":4058,"archive_url":"https://extensions.blender.org/download/sha256:39f014c0fe720f04cfa525ff9c9e1fa13d899611969efecfe97002fc8a7cb793/add-on-select-panel-xdanic-v0.1.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/select-panel-xdanic/","maintainer":"xdanic","license":["SPDX:GPL-2.0"],"tags":["User Interface"]},{"id":"theme_XP_AliVe","schema_version":"1.0.0","name":"XP_AliVe","version":"1.0.3","tagline":"Blender theme inspired by 2000s","archive_hash":"sha256:c0bffb862dc60fe848872207122feb401e3de59a6cd5cab5f6f7da9549ad5b7a","archive_size":5978,"archive_url":"https://extensions.blender.org/download/sha256:c0bffb862dc60fe848872207122feb401e3de59a6cd5cab5f6f7da9549ad5b7a/theme-theme-xp-alive-v1.0.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-xp-alive/","maintainer":"AliVe","license":["SPDX:GPL-2.0-or-later"],"tags":["Colorful","High Contrast","Inspired By","Accessibility"]},{"id":"MustardUI","schema_version":"1.0.0","name":"MustardUI","version":"2026.4.1","tagline":"Easy-to-use UI for human characters","archive_hash":"sha256:26f0e48a520e8953213593f787eb0525e95a2bdb1eedb895a3565969b4990068","archive_size":484948,"archive_url":"https://extensions.blender.org/download/sha256:26f0e48a520e8953213593f787eb0525e95a2bdb1eedb895a3565969b4990068/add-on-mustardui-v2026.4.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mustardui/","maintainer":"Mustard","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export templates from/to disk"},"tags":["User Interface"]},{"id":"Half_Knife","schema_version":"1.0.0","name":"Half Knife","version":"1.3.85","tagline":"Optimized for fast workflow knife tool for Blender","archive_hash":"sha256:9c03a65b75ae4b8d6b9a3917d4ccd213d005443a56cc38f1519db7a079ab3c83","archive_size":15498,"archive_url":"https://extensions.blender.org/download/sha256:9c03a65b75ae4b8d6b9a3917d4ccd213d005443a56cc38f1519db7a079ab3c83/add-on-half-knife-v1.3.85.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/half-knife/","maintainer":"Dan-Gry","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling"]},{"id":"node_quick_maths","schema_version":"1.0.0","name":"Node Quick Maths","version":"1.2.2","tagline":"A fast way to make long math chains in node editors","archive_hash":"sha256:c68f02a0e467f315f9693de37ff4a3d2d14b26e01ecb895b95759bb04062ceac","archive_size":22432,"archive_url":"https://extensions.blender.org/download/sha256:c68f02a0e467f315f9693de37ff4a3d2d14b26e01ecb895b95759bb04062ceac/add-on-node-quick-maths-v1.2.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-quick-maths/","maintainer":"Zeptofine","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Pipeline","User Interface"]},{"id":"easyweight","schema_version":"1.0.0","name":"EasyWeight","version":"1.0.9","tagline":"Weight Painting Workflow Boosters","archive_hash":"sha256:9334b15aef0668f4405b4c94af24da413100ac0090391cfa68669190e2266ee0","archive_size":42626,"archive_url":"https://extensions.blender.org/download/sha256:9334b15aef0668f4405b4c94af24da413100ac0090391cfa68669190e2266ee0/add-on-easyweight-v1.0.9.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/easyweight/","maintainer":"Mets","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"set_smooth_group","schema_version":"1.0.0","name":"Set Smooth Group","version":"1.1.0","tagline":"Simplify setting smooth groups with sharp edges","archive_hash":"sha256:aaf35ea5fe6627cfbf550e508fb4f21de8a87029ec914be59d765fd793b8273b","archive_size":17228,"archive_url":"https://extensions.blender.org/download/sha256:aaf35ea5fe6627cfbf550e508fb4f21de8a87029ec914be59d765fd793b8273b/add-on-set-smooth-group-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/set-smooth-group/","maintainer":"VIktor-Kom","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh"]},{"id":"toggle_socket_visibility","schema_version":"1.0.0","name":"Toggle Socket Visibility","version":"1.0.0","tagline":"Control which node sockets are visible or not via panel/pop-up","archive_hash":"sha256:948e5bb472ec2fd75345e37139edccd83181925d756a2974a7f22b8beaafe00f","archive_size":7638,"archive_url":"https://extensions.blender.org/download/sha256:948e5bb472ec2fd75345e37139edccd83181925d756a2974a7f22b8beaafe00f/add-on-toggle-socket-visibility-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/toggle-socket-visibility/","maintainer":"quackarooni","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","User Interface"]},{"id":"strange_attractors","schema_version":"1.0.0","name":"Strange Attractors","version":"2.1.0","tagline":"Add Strange Attractor curves","archive_hash":"sha256:466827116b5e4e4fa70a1b4d54597f207da22edb8b3eb693d0690df836738e06","archive_size":11456,"archive_url":"https://extensions.blender.org/download/sha256:466827116b5e4e4fa70a1b4d54597f207da22edb8b3eb693d0690df836738e06/add-on-strange-attractors-v2.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/strange-attractors/","maintainer":"7bitretro","license":["SPDX:GPL-2.0-or-later"],"tags":["Add Curve"]},{"id":"k_tools_view_sync","schema_version":"1.0.0","name":"Sync | Lock Viewport","version":"2.7.0","tagline":"Sync or Lock multiple viewports at once in real-time","archive_hash":"sha256:c4de7444a9f90e3f641eced7a0ee148b04a50bf4d21eb1bc22077ac09eaa0edf","archive_size":46836,"archive_url":"https://extensions.blender.org/download/sha256:c4de7444a9f90e3f641eced7a0ee148b04a50bf4d21eb1bc22077ac09eaa0edf/add-on-k-tools-view-sync-v2.7.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/k-tools-view-sync/","maintainer":"Robert-Kezives","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"universal_multi_importer","schema_version":"1.0.0","name":"Universal Multi Importer","version":"2.4.0","tagline":"Batch Import many file formats at once, Batch process them","archive_hash":"sha256:aa7b344effcad9f906dc44961dbae48ade53fe6cbd5774f1e4fd9445d13f8a4b","archive_size":100703,"archive_url":"https://extensions.blender.org/download/sha256:aa7b344effcad9f906dc44961dbae48ade53fe6cbd5774f1e4fd9445d13f8a4b/add-on-universal-multi-importer-v2.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/universal-multi-importer/","maintainer":"Tilapiatsu","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import Files from disk, save presets to disk"},"tags":["Import-Export","Pipeline"]},{"id":"BAM","schema_version":"1.0.0","name":"[BAM] AutoMat","version":"1.2.1","tagline":"Batch creation of materials from textures folder","archive_hash":"sha256:95fb5bf6be46b48fec1273025e31c522a09491b6d7503ab6343ed24bdcb5e649","archive_size":563501,"archive_url":"https://extensions.blender.org/download/sha256:95fb5bf6be46b48fec1273025e31c522a09491b6d7503ab6343ed24bdcb5e649/add-on-bam-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bam/","maintainer":"AlexeyHRDesign","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","Import-Export"]},{"id":"action_to_scene_range","schema_version":"1.0.0","name":"Action to Scene Range","version":"1.7.0","tagline":"When switching Actions, automatically set the Scene Frame Range","archive_hash":"sha256:bf2cb52492569624d6f1a1a19f4fde207d1ad6a18eab4e8e548da0bc6ace6ecf","archive_size":2520,"archive_url":"https://extensions.blender.org/download/sha256:bf2cb52492569624d6f1a1a19f4fde207d1ad6a18eab4e8e548da0bc6ace6ecf/add-on-action-to-scene-range-v1.7.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/action-to-scene-range/","maintainer":"dr.sybren","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"face_set_operators","schema_version":"1.0.0","name":"Face Set Operators","version":"1.0.0","tagline":"Convert sculpt mode attributes into anything you need","archive_hash":"sha256:73cd9f9c8a1eca7c893947165c061ad38e8f7d189a4ef24e65e03f398826f5e6","archive_size":4650,"archive_url":"https://extensions.blender.org/download/sha256:73cd9f9c8a1eca7c893947165c061ad38e8f7d189a4ef24e65e03f398826f5e6/add-on-face-set-operators-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/face-set-operators/","maintainer":"nickberckley","license":["SPDX:GPL-3.0-or-later"],"tags":["Sculpt","Mesh"]},{"id":"my_best_pie_menu_ever","schema_version":"1.0.0","name":"My Best Pie Menu Ever","version":"2.9.1","tagline":"Quick access to the functions you need","archive_hash":"sha256:dc2b09cf7638d2fa82ebf504c9f76fc269978e6fd7d033d2b0a178fd1d727d6c","archive_size":84510,"archive_url":"https://extensions.blender.org/download/sha256:dc2b09cf7638d2fa82ebf504c9f76fc269978e6fd7d033d2b0a178fd1d727d6c/add-on-my-best-pie-menu-ever-v2.9.1.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/my-best-pie-menu-ever/","maintainer":"emptybraces","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export FBX from/to disk"},"tags":["3D View","User Interface"]},{"id":"mmd_tools","schema_version":"1.0.0","name":"MMD Tools","version":"4.5.10","tagline":"Utility tools for MMD model editing","archive_hash":"sha256:8fac843f5c876c962f8f6ca87446dd61c1a7ac1b5c1ad291db09b6d8ba3636af","archive_size":754920,"archive_url":"https://extensions.blender.org/download/sha256:8fac843f5c876c962f8f6ca87446dd61c1a7ac1b5c1ad291db09b6d8ba3636af/add-on-mmd-tools-v4.5.10.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"6.0.0","website":"https://extensions.blender.org/add-ons/mmd-tools/","maintainer":"MMD","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export PMX/PMD/VMD/VPD from/to disk"},"tags":["3D View","Camera","Import-Export","Material","Mesh","Object","Physics"]},{"id":"bioxelnodes","schema_version":"1.0.0","name":"Bioxel Nodes","version":"1.0.9","tagline":"For scientific volumetric data visualization in Blender","archive_hash":"sha256:9e17324d019913f12e94c9e1ca7304bc1728738406b201275817ffda896e1620","archive_size":28047296,"archive_url":"https://extensions.blender.org/download/sha256:9e17324d019913f12e94c9e1ca7304bc1728738406b201275817ffda896e1620/add-on-bioxelnodes-v1.0.9-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bioxelnodes/","maintainer":"icrdr","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export volume data from/to disk"},"platforms":["windows-x64"],"tags":["Geometry Nodes","Render","Import-Export"]},{"id":"molecularnodes","schema_version":"1.0.0","name":"Molecular Nodes","version":"4.5.11","tagline":"A toolbox for molecular import and animation in Blender","archive_hash":"sha256:f09c91f6e6e20020f943a23438a2b22b761ebfcb3292abcfeca8c34128f34bfd","archive_size":132885115,"archive_url":"https://extensions.blender.org/download/sha256:f09c91f6e6e20020f943a23438a2b22b761ebfcb3292abcfeca8c34128f34bfd/add-on-molecularnodes-v4.5.11-windows-x64.zip","type":"add-on","blender_version_min":"4.5.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/add-ons/molecularnodes/","maintainer":"bradyajohnston","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Importing data files from disk and caching downloads","network":"Downloading structural data from the PDB and AFPDB"},"platforms":["windows-x64"],"tags":["Geometry Nodes","Import-Export"]},{"id":"io_scene_psk_psa","schema_version":"1.0.0","name":"Unreal PSK/PSA (.psk/.psa)","version":"9.1.1","tagline":"Import and export PSK and PSA files used in Unreal Engine","archive_hash":"sha256:14a637bb9da65b67a26f0ca3e6e490f2a855a6f5e38be103adcd69ca316793a1","archive_size":80472,"archive_url":"https://extensions.blender.org/download/sha256:14a637bb9da65b67a26f0ca3e6e490f2a855a6f5e38be103adcd69ca316793a1/add-on-io-scene-psk-psa-v9.1.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/io-scene-psk-psa/","maintainer":"darknation","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and write PSK and PSA files from and to disk"},"tags":["Game Engine","Import-Export"]},{"id":"theme_Plasticity","schema_version":"1.0.0","name":"Plasticity","version":"2.0.0","tagline":"Theme Inspired By Plasticity app","archive_hash":"sha256:784ac771c1ae56b9382a09e8b99d5835033b36c095cda9afd28487f0695a0351","archive_size":6395,"archive_url":"https://extensions.blender.org/download/sha256:784ac771c1ae56b9382a09e8b99d5835033b36c095cda9afd28487f0695a0351/theme-theme-plasticity-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-plasticity/","maintainer":"SHEK","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","High Contrast","Inspired By","Accessibility"]},{"id":"open_stage_blender_dmx","schema_version":"1.0.0","name":"DMX","version":"2.1.8","tagline":"Visualization & programming with GDTF&MVR, OSC, PSN, Networking","archive_hash":"sha256:df5ba03e30ac596e13648d75dc4d54659cc720193967d7712a4dc084b5a91acd","archive_size":2030358,"archive_url":"https://extensions.blender.org/download/sha256:df5ba03e30ac596e13648d75dc4d54659cc720193967d7712a4dc084b5a91acd/add-on-open-stage-blender-dmx-v2.1.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/open-stage-blender-dmx/","maintainer":"Sunova","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import GDTF devices. Import/Export MVR scenes and project data","network":"For GDTF Share, sACN, Art-Net, OSC, PSN, MVR-xchange"},"tags":["Lighting","Animation","Scene","Import-Export","Rigging","Tracking","Sequencer","3D View","Camera"]},{"id":"maze_generator","schema_version":"1.0.0","name":"Maze Generator","version":"0.2.5","tagline":"A Maze generator extension for Blender","archive_hash":"sha256:aa1ee5351cb2468855d86f5a3435a35f4fdf64e1515b0997d755ffa87bf77030","archive_size":22231,"archive_url":"https://extensions.blender.org/download/sha256:aa1ee5351cb2468855d86f5a3435a35f4fdf64e1515b0997d755ffa87bf77030/add-on-maze-generator-v0.2.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/maze-generator/","maintainer":"Leeroy-Majors","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh"]},{"id":"node_group_presets","schema_version":"1.0.0","name":"Node Group Presets","version":"0.8.0","tagline":"Save Node Group values as presets","archive_hash":"sha256:201454f4c0a32eed158502d13a0887141aaf4494647a22b4264802f94272b5a0","archive_size":27634,"archive_url":"https://extensions.blender.org/download/sha256:201454f4c0a32eed158502d13a0887141aaf4494647a22b4264802f94272b5a0/add-on-node-group-presets-v0.8.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-group-presets/","maintainer":"juaum","license":["SPDX:GPL-3.0-or-later"],"permissions":{"clipboard":"Copy/paste presets between nodedroups and across files"},"tags":["Geometry Nodes","Material","Node"]},{"id":"booltron","schema_version":"1.0.0","name":"Booltron","version":"3.3.2","tagline":"Super add-on for superfast booleans","archive_hash":"sha256:f353beedfc46a1f321e1abc02a0294ebdfc9fb2c735d9bb0df5307b2701127b6","archive_size":166040,"archive_url":"https://extensions.blender.org/download/sha256:f353beedfc46a1f321e1abc02a0294ebdfc9fb2c735d9bb0df5307b2701127b6/add-on-booltron-v3.3.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/booltron/","maintainer":"MikhailRachinskiy","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Object"]},{"id":"Dark_Pro","schema_version":"1.0.0","name":"Dark Pro","version":"2.0.2","tagline":"Just a little darker","archive_hash":"sha256:94505d24488f88ab67497abe8c6bcc18c14bb2f6ceb440c6c1954ca5ae5ddd1b","archive_size":5431,"archive_url":"https://extensions.blender.org/download/sha256:94505d24488f88ab67497abe8c6bcc18c14bb2f6ceb440c6c1954ca5ae5ddd1b/theme-dark-pro-v2.0.2.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/themes/dark-pro/","maintainer":"Mahdi.Shalchian","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"quick_groups","schema_version":"1.0.0","name":"Quick Groups (Instances)","version":"1.0.3","tagline":"Group objects with Ctrl+G using instances","archive_hash":"sha256:f9da4f1267c480b5fd252e2d61573e1ebbd3e4fafa723547b93f032d7292d01c","archive_size":6862,"archive_url":"https://extensions.blender.org/download/sha256:f9da4f1267c480b5fd252e2d61573e1ebbd3e4fafa723547b93f032d7292d01c/add-on-quick-groups-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-groups/","maintainer":"MultLabs","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Modeling"]},{"id":"t3d_gn_presets","schema_version":"1.0.0","name":"T3D GN Presets","version":"1.6.0","tagline":"A versatile collection of useful node groups for Geometry Nodes","archive_hash":"sha256:1b5e343d3b335b85caa7be2b9410b8218b777546638cdc5bce6e9f6e774e71cd","archive_size":835788,"archive_url":"https://extensions.blender.org/download/sha256:1b5e343d3b335b85caa7be2b9410b8218b777546638cdc5bce6e9f6e774e71cd/add-on-t3d-gn-presets-v1.6.0.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/t3d-gn-presets/","maintainer":"Tams_3d","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Append node-groups from source file"},"tags":["Geometry Nodes"]},{"id":"per_camera_resolution","schema_version":"1.0.0","name":"Per-Camera Resolution","version":"2.3.2","tagline":"Every camera should have its resolution","archive_hash":"sha256:48cecdfc004417c6d0dee452657d0822dd96ea3897e159d5544d9819f3e54b8f","archive_size":11199,"archive_url":"https://extensions.blender.org/download/sha256:48cecdfc004417c6d0dee452657d0822dd96ea3897e159d5544d9819f3e54b8f/add-on-per-camera-resolution-v2.3.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/per-camera-resolution/","maintainer":"pioverfour","license":["SPDX:GPL-3.0-or-later"],"tags":["Scene","Camera"]},{"id":"synchronize_workspaces","schema_version":"1.0.0","name":"Synchronize Workspaces","version":"1.14.0","tagline":"Synchronize 3D views between workspaces","archive_hash":"sha256:156bb74e7c8e77449d9da5dabb71ef00ad0286447e24968c41173e821ee714b5","archive_size":3974,"archive_url":"https://extensions.blender.org/download/sha256:156bb74e7c8e77449d9da5dabb71ef00ad0286447e24968c41173e821ee714b5/add-on-synchronize-workspaces-v1.14.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/synchronize-workspaces/","maintainer":"MultLabs","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","User Interface"]},{"id":"grease_pencil_tool_wheel","schema_version":"1.0.0","name":"GP Tool Wheel","version":"1.0.11","tagline":"Extended pie menu for selecting Grease Pencil tools quickly","archive_hash":"sha256:c6c1c53b5f17791958cb92a02f38e9cbaf9e578226d0a615e06eeb8a3cb42ba6","archive_size":206402,"archive_url":"https://extensions.blender.org/download/sha256:c6c1c53b5f17791958cb92a02f38e9cbaf9e578226d0a615e06eeb8a3cb42ba6/add-on-grease-pencil-tool-wheel-v1.0.11.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/grease-pencil-tool-wheel/","maintainer":"SietseB","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Grease Pencil"]},{"id":"commotion","schema_version":"1.0.0","name":"Commotion","version":"2.5.0","tagline":"Animation offset tools for motion graphics","archive_hash":"sha256:9554d7ccc6211c666991b03cd72b354173495dc8977320a70874694bf25179eb","archive_size":27868,"archive_url":"https://extensions.blender.org/download/sha256:9554d7ccc6211c666991b03cd72b354173495dc8977320a70874694bf25179eb/add-on-commotion-v2.5.0.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/commotion/","maintainer":"MikhailRachinskiy","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"find_bad_tracks","schema_version":"1.0.0","name":"Find Bad Tracks","version":"1.0.2","tagline":"Highlight motion tracks that move in suspicious directions","archive_hash":"sha256:b9f5373c3ca5119c4f14b9c11f0e92f2a29ff908bbd265803fef2a9d705c97b8","archive_size":25067,"archive_url":"https://extensions.blender.org/download/sha256:b9f5373c3ca5119c4f14b9c11f0e92f2a29ff908bbd265803fef2a9d705c97b8/add-on-find-bad-tracks-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/find-bad-tracks/","maintainer":"Walles","license":["SPDX:GPL-2.0-or-later"],"tags":["Tracking"]},{"id":"cloudrig","schema_version":"1.0.0","name":"CloudRig","version":"2.2.19","tagline":"Rig Generation & Rigging Workflow Tools","archive_hash":"sha256:ff00dfb468f006b3be52c19d3448ab2bf1313d54c6128392a6121162ea1a0d9a","archive_size":3801677,"archive_url":"https://extensions.blender.org/download/sha256:ff00dfb468f006b3be52c19d3448ab2bf1313d54c6128392a6121162ea1a0d9a/add-on-cloudrig-v2.2.19.zip","type":"add-on","blender_version_min":"5.0.0","blender_version_max":"6.0.0","website":"https://extensions.blender.org/add-ons/cloudrig/","maintainer":"Blender Studio","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load widgets/metarigs/preferences from disk","clipboard":"Copy/paste Bone Collections between armatures"},"tags":["Rigging"]},{"id":"theme_drcl","schema_version":"1.0.0","name":"drcl","version":"1.0.3","tagline":"A variation of Dracula dark theme","archive_hash":"sha256:bcb32cf5c1a0bafffdb7e2223b1f5eeedf272750227318ac65d0596748e00040","archive_size":4955,"archive_url":"https://extensions.blender.org/download/sha256:bcb32cf5c1a0bafffdb7e2223b1f5eeedf272750227318ac65d0596748e00040/theme-theme-drcl-v1.0.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-drcl/","maintainer":"Sereda","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Colorful"]},{"id":"YB_Animator_Tool","schema_version":"1.0.0","name":"YB Animator Tool","version":"1.1.3","tagline":"export grease pencil layers as keyframes and CSV","archive_hash":"sha256:7e06d55ad957752bfe87476860bd07b1d2c5609974f8a2e993975eb278768c1b","archive_size":5541,"archive_url":"https://extensions.blender.org/download/sha256:7e06d55ad957752bfe87476860bd07b1d2c5609974f8a2e993975eb278768c1b/add-on-yb-animator-tool-v1.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/yb-animator-tool/","maintainer":"YB_","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Output CSV and sequence diagram"},"tags":["Grease Pencil","Animation","User Interface"]},{"id":"keymesh","schema_version":"1.0.0","name":"Keymesh","version":"2.3.2","tagline":"Create stop-motion animations by sculpting frame-by-frame","archive_hash":"sha256:aa56eec60eee3053668594b2daf513e792d464a7593b3af6a90068f5a607ed2a","archive_size":42763,"archive_url":"https://extensions.blender.org/download/sha256:aa56eec60eee3053668594b2daf513e792d464a7593b3af6a90068f5a607ed2a/add-on-keymesh-v2.3.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/keymesh/","maintainer":"nickberckley","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Store generated pose preview images and/or load them from disk"},"tags":["Animation","Sculpt","Mesh"]},{"id":"node_annotator","schema_version":"1.0.0","name":"Node Annotator","version":"0.4.3","tagline":"Easily create good documentation of your node trees","archive_hash":"sha256:e283048c97db794f392755c44604cb95655cd73fabe7cb3f29add5d440b40411","archive_size":28712,"archive_url":"https://extensions.blender.org/download/sha256:e283048c97db794f392755c44604cb95655cd73fabe7cb3f29add5d440b40411/add-on-node-annotator-v0.4.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-annotator/","maintainer":"FrankFirsching","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Geometry Nodes"]},{"id":"theme_ps","schema_version":"1.0.0","name":"PS","version":"1.1.3","tagline":"Adobe Photoshop inspired light theme","archive_hash":"sha256:1b69c3dabcffcdd76b87ed15724dd2db995821823b72bdea8946c0709854cbc2","archive_size":5663,"archive_url":"https://extensions.blender.org/download/sha256:1b69c3dabcffcdd76b87ed15724dd2db995821823b72bdea8946c0709854cbc2/theme-theme-ps-v1.1.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-ps/","maintainer":"Sereda","license":["SPDX:GPL-2.0-or-later"],"tags":["Inspired By","Light"]},{"id":"toggle_language","schema_version":"1.0.0","name":"Toggle Language","version":"1.6.2","tagline":"One click to toggle UI between two languages","archive_hash":"sha256:67ea3fe811d72c81ad19bd1540b4cb0374446e69ae18a77b01a665d27f2da3fe","archive_size":31213,"archive_url":"https://extensions.blender.org/download/sha256:67ea3fe811d72c81ad19bd1540b4cb0374446e69ae18a77b01a665d27f2da3fe/add-on-toggle-language-v1.6.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/toggle-language/","maintainer":"del1a8dc50179276c0","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"quick_lighting_environment","schema_version":"1.0.0","name":"QLE (Quick Lighting Environment)","version":"1.8.0","tagline":"Adds a Basic Lighting Setup to Your Blender Scene","archive_hash":"sha256:561863f28ac7d0df9e815a800796efaca126ad78cd23741ac28807f262031883","archive_size":105787,"archive_url":"https://extensions.blender.org/download/sha256:561863f28ac7d0df9e815a800796efaca126ad78cd23741ac28807f262031883/add-on-quick-lighting-environment-v1.8.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-lighting-environment/","maintainer":"don1138","license":["SPDX:GPL-3.0-or-later"],"tags":["Lighting"]},{"id":"SB_path_actions","schema_version":"1.0.0","name":"Path Actions","version":"2.6.0","tagline":"Open blend folder in OS explorer, and more","archive_hash":"sha256:19bc2a56bd8ad64ddb1b4c2a82f5faec4af79b151aea66f50c6b47e33e0385b4","archive_size":42150,"archive_url":"https://extensions.blender.org/download/sha256:19bc2a56bd8ad64ddb1b4c2a82f5faec4af79b151aea66f50c6b47e33e0385b4/add-on-sb-path-actions-v2.6.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sb-path-actions/","maintainer":"SamuelBernou","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Open folders, List Blend files","clipboard":"Copy path to files"},"tags":["System","Development"]},{"id":"print3d_toolbox","schema_version":"1.0.0","name":"3D Print Toolbox","version":"1.3.3","tagline":"Utilities for 3D printing","archive_hash":"sha256:95238242a60bac48c4b4a786ddcfde61f84efbe0cc349c95394314bfc4855e28","archive_size":145860,"archive_url":"https://extensions.blender.org/download/sha256:95238242a60bac48c4b4a786ddcfde61f84efbe0cc349c95394314bfc4855e28/add-on-print3d-toolbox-v1.3.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/print3d-toolbox/","maintainer":"MikhailRachinskiy","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export STL, PLY, OBJ files"},"tags":["Mesh"]},{"id":"green_olive","schema_version":"1.0.0","name":"Green Olive","version":"1.0.3","tagline":"A fine-tuned dark green theme","archive_hash":"sha256:c7544cc6ceb987628e3d7cbf49ac394cb9da92228673cebb1664aa2f0beb8cac","archive_size":5774,"archive_url":"https://extensions.blender.org/download/sha256:c7544cc6ceb987628e3d7cbf49ac394cb9da92228673cebb1664aa2f0beb8cac/theme-green-olive-v1.0.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/green-olive/","maintainer":"Liuuzaki","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Accessibility"]},{"id":"fls_blcn","schema_version":"1.0.0","name":"Fast Language Switch","version":"0.0.5","tagline":"Fast change the language of the interface","archive_hash":"sha256:02aecb087b32a2863ac24729708022975fe431cf9a693c30ae706767758229e9","archive_size":2475,"archive_url":"https://extensions.blender.org/download/sha256:02aecb087b32a2863ac24729708022975fe431cf9a693c30ae706767758229e9/add-on-fls-blcn-v0.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/fls-blcn/","maintainer":"Kk","license":["SPDX:GPL-2.0-or-later"],"tags":["System"]},{"id":"theme_xsi","schema_version":"1.0.0","name":"Softimage XSI","version":"5.0.0","tagline":"Community-made theme inspired by Softimage XSI","archive_hash":"sha256:ec047fc1185a8292f84a08d9a69a0d71483f9c53c88b74222dbf4449f6f10443","archive_size":6273,"archive_url":"https://extensions.blender.org/download/sha256:ec047fc1185a8292f84a08d9a69a0d71483f9c53c88b74222dbf4449f6f10443/theme-theme-xsi-v5.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-xsi/","maintainer":"RobWu","license":["SPDX:GPL-3.0-or-later"],"tags":["Inspired By"]},{"id":"theme_white","schema_version":"1.0.0","name":"White","version":"1.0.1","tagline":"Community-made theme","archive_hash":"sha256:1f18c2b22d2a8f1b1ad3113eb3f972ef708bdc7a3e494df61779bf5d7d0689a0","archive_size":6242,"archive_url":"https://extensions.blender.org/download/sha256:1f18c2b22d2a8f1b1ad3113eb3f972ef708bdc7a3e494df61779bf5d7d0689a0/theme-theme-white-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-white/","maintainer":"MultLabs","license":["SPDX:GPL-3.0-or-later"],"tags":["Light","High Contrast"]},{"id":"theme_print_friendly","schema_version":"1.0.0","name":"Print Friendly","version":"2.0.0","tagline":"Community-made theme optimized for printing","archive_hash":"sha256:ec1e53309b01b0d1fd81a4aa72bd636ff411402fe9b56eb4126ef440f5f3ad24","archive_size":5585,"archive_url":"https://extensions.blender.org/download/sha256:ec1e53309b01b0d1fd81a4aa72bd636ff411402fe9b56eb4126ef440f5f3ad24/theme-theme-print-friendly-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-print-friendly/","maintainer":"JasonvanGumster","license":["SPDX:GPL-3.0-or-later"],"tags":["Light","High Contrast"]},{"id":"theme_minimal_dark","schema_version":"1.0.0","name":"Minimal Dark","version":"3.1.2","tagline":"A flat dark theme for Blender","archive_hash":"sha256:b5814ca544a39e7c0b19d07523555e235d0efe856c74a4a912e784ecfaef419a","archive_size":7358,"archive_url":"https://extensions.blender.org/download/sha256:b5814ca544a39e7c0b19d07523555e235d0efe856c74a4a912e784ecfaef419a/theme-theme-minimal-dark-v3.1.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-minimal-dark/","maintainer":"jlampel","license":["SPDX:GPL-2.0-or-later"]},{"id":"theme_maya","schema_version":"1.0.0","name":"Maya","version":"2.0.0","tagline":"Community-made theme inspired by Maya","archive_hash":"sha256:6a6c6eac7b9aaf180bf8583d4c1d2f5b27e01a0581a5fa9782b9abd4a7c4ee1a","archive_size":5859,"archive_url":"https://extensions.blender.org/download/sha256:6a6c6eac7b9aaf180bf8583d4c1d2f5b27e01a0581a5fa9782b9abd4a7c4ee1a/theme-theme-maya-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-maya/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Inspired By","Dark"]},{"id":"theme_deep_grey","schema_version":"1.0.0","name":"Deep Grey","version":"2.0.4","tagline":"A comfortable medium dark theme for Blender","archive_hash":"sha256:5ad9d7a6f9522a7319a43fc55255dc1d482d639d7228eacf3d8c52f42cd248bc","archive_size":5593,"archive_url":"https://extensions.blender.org/download/sha256:5ad9d7a6f9522a7319a43fc55255dc1d482d639d7228eacf3d8c52f42cd248bc/theme-theme-deep-grey-v2.0.4.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-deep-grey/","maintainer":"TheRedWaxPolice","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"skinify_rig","schema_version":"1.0.0","name":"Skinify Rig","version":"0.11.2","tagline":"Creates a mesh object from selected bones","archive_hash":"sha256:26babe1f712c53b6e3a9de6da8a81a768548ed197d41716ed643a25469e3cf61","archive_size":6450,"archive_url":"https://extensions.blender.org/download/sha256:26babe1f712c53b6e3a9de6da8a81a768548ed197d41716ed643a25469e3cf61/add-on-skinify-rig-v0.11.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/skinify-rig/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Object"]},{"id":"f2","schema_version":"1.0.0","name":"F2","version":"1.8.5","tagline":"Extends the 'Make Edge/Face' functionality","archive_hash":"sha256:dc8f19637a61c332b3eb937a6b86e2363511cbb29a9a22ea8571fe7d924ab05c","archive_size":5505,"archive_url":"https://extensions.blender.org/download/sha256:dc8f19637a61c332b3eb937a6b86e2363511cbb29a9a22ea8571fe7d924ab05c/add-on-f2-v1.8.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/f2/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"navigation","schema_version":"1.0.0","name":"3D Navigation","version":"1.3.0","tagline":"Navigate the 3D Viewport from the Sidebar","archive_hash":"sha256:4dab907f3eddb4ba96dfbb5c97f6f525e9cd0f4bfd45d9a21717a728954bf8ed","archive_size":3238,"archive_url":"https://extensions.blender.org/download/sha256:4dab907f3eddb4ba96dfbb5c97f6f525e9cd0f4bfd45d9a21717a728954bf8ed/add-on-navigation-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/navigation/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"amaranth","schema_version":"1.0.0","name":"Amaranth","version":"1.0.31","tagline":"A collection of tools to improve productivity","archive_hash":"sha256:ff9e36d3dbd9c556062449fb6943c55b0753a191a6a4f60a70a2d799411a28f3","archive_size":46492,"archive_url":"https://extensions.blender.org/download/sha256:ff9e36d3dbd9c556062449fb6943c55b0753a191a6a4f60a70a2d799411a28f3/add-on-amaranth-v1.0.31.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/amaranth/","maintainer":"pablovazquez","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Render","Compositing","User Interface","Scene","Lighting"]},{"id":"math_vis_console","schema_version":"1.0.0","name":"Math Vis (Console)","version":"0.2.2","tagline":"Display console defined mathutils variables in the 3D view","archive_hash":"sha256:72e30386a06a1b15500488a709951b085c18ff02bf95d07f126ac3e9ea3d470a","archive_size":6507,"archive_url":"https://extensions.blender.org/download/sha256:72e30386a06a1b15500488a709951b085c18ff02bf95d07f126ac3e9ea3d470a/add-on-math-vis-console-v0.2.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/math-vis-console/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["3D View"]},{"id":"auto_mirror","schema_version":"1.0.0","name":"Auto Mirror","version":"2.5.4","tagline":"Super fast cutting and mirroring for mesh","archive_hash":"sha256:68c7785f641c91905b07b8122af6a0147834e9a7b77285966253b1f770f30cc7","archive_size":3571,"archive_url":"https://extensions.blender.org/download/sha256:68c7785f641c91905b07b8122af6a0147834e9a7b77285966253b1f770f30cc7/add-on-auto-mirror-v2.5.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-mirror/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Mesh"]},{"id":"snap_utilities_line","schema_version":"1.0.0","name":"Snap Line Tool","version":"6.8.1","tagline":"Extends Blender Snap controls","archive_hash":"sha256:8098ef55983b4192e2e711eb1c5542e93bb65996f973b2f5173bdd01093f1dbc","archive_size":32147,"archive_url":"https://extensions.blender.org/download/sha256:8098ef55983b4192e2e711eb1c5542e93bb65996f973b2f5173bdd01093f1dbc/add-on-snap-utilities-line-v6.8.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/snap-utilities-line/","maintainer":"mano-wii","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"looptools","schema_version":"1.0.0","name":"LoopTools","version":"4.7.7","tagline":"Mesh modelling toolkit. Several tools to aid modelling","archive_hash":"sha256:ff1ca3b3fff73094379da8b1fa2c1acbc9d88d26b7dfc73bb9de5941a6b50108","archive_size":30534,"archive_url":"https://extensions.blender.org/download/sha256:ff1ca3b3fff73094379da8b1fa2c1acbc9d88d26b7dfc73bb9de5941a6b50108/add-on-looptools-v4.7.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/looptools/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Mesh"]},{"id":"node_arrange","schema_version":"1.0.0","name":"Node Arrange","version":"1.11.0","tagline":"Arrange node trees with one click","archive_hash":"sha256:a6cd83026ca50744620f1fe1442c7d754e32ce1f6a950cd161867fb0e71473ca","archive_size":1755806,"archive_url":"https://extensions.blender.org/download/sha256:a6cd83026ca50744620f1fe1442c7d754e32ce1f6a950cd161867fb0e71473ca/add-on-node-arrange-v1.11.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-arrange/","maintainer":"Leonardo-Pike-Excell","license":["SPDX:GPL-3.0-or-later"],"tags":["Node"]},{"id":"antlandscape","schema_version":"1.0.0","name":"A.N.T.Landscape","version":"0.2.0","tagline":"Another Noise Tool: Landscape and Displace","archive_hash":"sha256:230571bc14c50952f3af99b70fdb365cf0cee503382975dc38149407a5a4c8c0","archive_size":60899,"archive_url":"https://extensions.blender.org/download/sha256:230571bc14c50952f3af99b70fdb365cf0cee503382975dc38149407a5a4c8c0/add-on-antlandscape-v0.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/antlandscape/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Add Mesh"]},{"id":"material_library","schema_version":"1.0.0","name":"Material Library","version":"0.6.0","tagline":"Material Library VX","archive_hash":"sha256:baf00c107c5f938e6401cc9d30ab2226b2e1a9f8e92607335d19f1e4492e8019","archive_size":594898,"archive_url":"https://extensions.blender.org/download/sha256:baf00c107c5f938e6401cc9d30ab2226b2e1a9f8e92607335d19f1e4492e8019/add-on-material-library-v0.6.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/material-library/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Material"]},{"id":"copy_attributes_menu","schema_version":"1.0.0","name":"Copy Attributes Menu","version":"0.6.3","tagline":"Copy Attributes Menu","archive_hash":"sha256:990bac36be4c6a39c4506c84a689c5ec45e1a4b43995542cd0b058663f190478","archive_size":8270,"archive_url":"https://extensions.blender.org/download/sha256:990bac36be4c6a39c4506c84a689c5ec45e1a4b43995542cd0b058663f190478/add-on-copy-attributes-menu-v0.6.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/copy-attributes-menu/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"material_utilities","schema_version":"1.0.0","name":"Material Utilities","version":"2.2.3","tagline":"Menu of material tools (assign, select..) in the 3D View","archive_hash":"sha256:35e3f516724b522930ca2defb78c8ef38949949aa7cc37b64be2d3522431b739","archive_size":16895,"archive_url":"https://extensions.blender.org/download/sha256:35e3f516724b522930ca2defb78c8ef38949949aa7cc37b64be2d3522431b739/add-on-material-utilities-v2.2.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/material-utilities/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Material"]},{"id":"edit_linked_library","schema_version":"1.0.0","name":"Edit Linked Library","version":"0.9.2","tagline":"Allows editing of objects, collections, and node groups lin . . ","archive_hash":"sha256:db6827e091da07209ffcff97ce271de8af2a8823619d25626472f6bf65ef5234","archive_size":3575,"archive_url":"https://extensions.blender.org/download/sha256:db6827e091da07209ffcff97ce271de8af2a8823619d25626472f6bf65ef5234/add-on-edit-linked-library-v0.9.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/edit-linked-library/","maintainer":"JasonvanGumster","license":["SPDX:GPL-2.0-or-later"],"tags":["Object"]},{"id":"simplify_curves_plus","schema_version":"1.0.0","name":"Simplify Curves+","version":"1.1.3","tagline":"Simplify Curves: 3dview, Dopesheet, Graph","archive_hash":"sha256:57734eb8248818f3db18c2b934a9470b6ccd640066962c38918868ec93446851","archive_size":5943,"archive_url":"https://extensions.blender.org/download/sha256:57734eb8248818f3db18c2b934a9470b6ccd640066962c38918868ec93446851/add-on-simplify-curves-plus-v1.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/simplify-curves-plus/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Curve"]},{"id":"modifier_tools","schema_version":"1.0.0","name":"Modifier Tools","version":"0.2.7","tagline":"Modifiers Specials Show/Hide/Apply Selected","archive_hash":"sha256:68a98d3c992800dbb76d580835be0d4c023696d8fdcb41e590ec0c367876442a","archive_size":2718,"archive_url":"https://extensions.blender.org/download/sha256:68a98d3c992800dbb76d580835be0d4c023696d8fdcb41e590ec0c367876442a/add-on-modifier-tools-v0.2.7.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/modifier-tools/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"extra_mesh_objects","schema_version":"1.0.0","name":"Extra Mesh Objects","version":"0.4.1","tagline":"Add extra mesh object types","archive_hash":"sha256:c85ce4bb2820d5af26b4dad66bf1a0fdeb4bfeffc668c5e4f098f1e416ed434b","archive_size":133442,"archive_url":"https://extensions.blender.org/download/sha256:c85ce4bb2820d5af26b4dad66bf1a0fdeb4bfeffc668c5e4f098f1e416ed434b/add-on-extra-mesh-objects-v0.4.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/extra-mesh-objects/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh"]},{"id":"export_paper_model","schema_version":"1.0.0","name":"Export Paper Model","version":"1.4.2","tagline":"Export printable net of a Mesh object","archive_hash":"sha256:0d49e1413b624fe9e86c1da10824dc8c1c28713a72ff72530550812dfbc56cba","archive_size":35606,"archive_url":"https://extensions.blender.org/download/sha256:0d49e1413b624fe9e86c1da10824dc8c1c28713a72ff72530550812dfbc56cba/add-on-export-paper-model-v1.4.2.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/export-paper-model/","maintainer":"AdamDominec","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export files to disk"},"tags":["Import-Export"]},{"id":"precision_drawing_tools_pdt","schema_version":"1.0.0","name":"Precision Drawing Tools (PDT)","version":"1.5.3","tagline":"Precision Drawing Tools for Accurate Modelling","archive_hash":"sha256:8e64e4ababc06e1a843eb72dd126c422bfb1117934dd4bdc480c2c6a76e37266","archive_size":49495,"archive_url":"https://extensions.blender.org/download/sha256:8e64e4ababc06e1a843eb72dd126c422bfb1117934dd4bdc480c2c6a76e37266/add-on-precision-drawing-tools-pdt-v1.5.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/precision-drawing-tools-pdt/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["3D View"]},{"id":"extra_curve_objectes","schema_version":"1.0.0","name":"Extra Curve Objects","version":"0.2.0","tagline":"Add extra curve object types","archive_hash":"sha256:4ca91ce5563d094694b2c7f1fc9acece8b5ba8f5dd017a49f080e9cfa5553909","archive_size":52956,"archive_url":"https://extensions.blender.org/download/sha256:4ca91ce5563d094694b2c7f1fc9acece8b5ba8f5dd017a49f080e9cfa5553909/add-on-extra-curve-objectes-v0.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/extra-curve-objectes/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Curve"]},{"id":"copy_render_settings","schema_version":"1.0.0","name":"Copy Render Settings","version":"2.0.0","tagline":"Allows to copy a selection of render settings from current . . ","archive_hash":"sha256:dd7074aaddeb16d228f19ce98d3a45f641db108453af72ebb0e43c225bb162e0","archive_size":7786,"archive_url":"https://extensions.blender.org/download/sha256:dd7074aaddeb16d228f19ce98d3a45f641db108453af72ebb0e43c225bb162e0/add-on-copy-render-settings-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/copy-render-settings/","maintainer":"mont29","license":["SPDX:GPL-2.0-or-later"],"tags":["Render"]},{"id":"tinycad_mesh_tools","schema_version":"1.0.0","name":"tinyCAD Mesh tools","version":"1.3.3","tagline":"tinyCAD Mesh tools Add-on","archive_hash":"sha256:a725746d79502e6519273f3b9d7a54f0350e15f6c391c36fc9c1288f75070bd6","archive_size":37134,"archive_url":"https://extensions.blender.org/download/sha256:a725746d79502e6519273f3b9d7a54f0350e15f6c391c36fc9c1288f75070bd6/add-on-tinycad-mesh-tools-v1.3.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/tinycad-mesh-tools/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"collection_manager","schema_version":"1.0.0","name":"Collection Manager","version":"2.24.11","tagline":"Manage collections and their objects","archive_hash":"sha256:2ba8a4d92c886157a7d15482b7459efbc228d9ff296b24966ab564986694dbe5","archive_size":42496,"archive_url":"https://extensions.blender.org/download/sha256:2ba8a4d92c886157a7d15482b7459efbc228d9ff296b24966ab564986694dbe5/add-on-collection-manager-v2.24.11.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/collection-manager/","maintainer":"Imaginer","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"import_palettes","schema_version":"1.0.0","name":"Import Palettes","version":"1.0.5","tagline":"Import Palettes","archive_hash":"sha256:9874614269a5e890d25021308641083531d982fb8603c113090389f382bc4acd","archive_size":4151,"archive_url":"https://extensions.blender.org/download/sha256:9874614269a5e890d25021308641083531d982fb8603c113090389f382bc4acd/add-on-import-palettes-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/import-palettes/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Requires access to directory with color palette files"},"tags":["Import-Export"]},{"id":"autodesk_3ds_format","schema_version":"1.0.0","name":"Autodesk 3D Studio (.3ds)","version":"3.0.1","tagline":"Import-Export 3DS scenes, objects, cameras, lights & animations","archive_hash":"sha256:3a9fad1b399b835401702b4d8ab2cff1bf818ce91299e105bc9e668b7e93e0d9","archive_size":208325,"archive_url":"https://extensions.blender.org/download/sha256:3a9fad1b399b835401702b4d8ab2cff1bf818ce91299e105bc9e668b7e93e0d9/add-on-autodesk-3ds-format-v3.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/autodesk-3ds-format/","maintainer":"NRGSille","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import-Export Autodesk 3DS files"},"tags":["Import-Export","Scene","Object","Camera","Lighting","Animation"]},{"id":"storypencil_storyboard_tools","schema_version":"1.0.0","name":"Storypencil - Storyboard Tools","version":"1.2.0","tagline":"Storyboard tools","archive_hash":"sha256:70b1115a622a4e7d5f29998a7c1acd7f9c1df2f384be025fd2b54e3d1ff9cac6","archive_size":20608,"archive_url":"https://extensions.blender.org/download/sha256:70b1115a622a4e7d5f29998a7c1acd7f9c1df2f384be025fd2b54e3d1ff9cac6/add-on-storypencil-storyboard-tools-v1.2.0.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/storypencil-storyboard-tools/","maintainer":"antoniov","license":["SPDX:GPL-3.0-or-later"],"tags":["Sequencer"]},{"id":"object_color_rules","schema_version":"1.0.0","name":"Object Color Rules","version":"0.0.2","tagline":"Rules for assigning object color (for object & wireframe co . . ","archive_hash":"sha256:e23968a37905a932db8875ef9c9f3d29ca7af69ec2e87d4483ae54cb809d7cd5","archive_size":4057,"archive_url":"https://extensions.blender.org/download/sha256:e23968a37905a932db8875ef9c9f3d29ca7af69ec2e87d4483ae54cb809d7cd5/add-on-object-color-rules-v0.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/object-color-rules/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Object"]},{"id":"stored_views","schema_version":"1.0.0","name":"Stored Views","version":"0.4.0","tagline":"Save and restore views, pov, layers & display configs","archive_hash":"sha256:cec382a11ded631ee31b410725db78fe72e82c377a6077ee9bb7b5af1485e5f0","archive_size":24199,"archive_url":"https://extensions.blender.org/download/sha256:cec382a11ded631ee31b410725db78fe72e82c377a6077ee9bb7b5af1485e5f0/add-on-stored-views-v0.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/stored-views/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Requires access to directory where it stores/reads view presets"},"tags":["3D View"]},{"id":"cell_fracture","schema_version":"1.0.0","name":"Cell Fracture","version":"0.2.1","tagline":"Fractured Object Creation","archive_hash":"sha256:878bbd46e0c735da689101aeed9ebe99f18c0d8d0cbd2e9e17ed8cda6b264fb2","archive_size":9722,"archive_url":"https://extensions.blender.org/download/sha256:878bbd46e0c735da689101aeed9ebe99f18c0d8d0cbd2e9e17ed8cda6b264fb2/add-on-cell-fracture-v0.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cell-fracture/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"import_autocad_dxf_format_dxf","schema_version":"1.0.0","name":"Import AutoCAD DXF Format (.dxf)","version":"0.9.10","tagline":"Import files in the Autocad DXF format (.dxf)","archive_hash":"sha256:bc82f6498e92bbcb637c330f2ed9df431fd193303ddd1fec88994c8e0d1924f3","archive_size":57092,"archive_url":"https://extensions.blender.org/download/sha256:bc82f6498e92bbcb637c330f2ed9df431fd193303ddd1fec88994c8e0d1924f3/add-on-import-autocad-dxf-format-dxf-v0.9.10.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/import-autocad-dxf-format-dxf/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Requires access to directory with .dxf files"},"tags":["Import-Export"]},{"id":"bool_tool","schema_version":"1.0.0","name":"Bool Tool","version":"2.0.0","tagline":"Quick boolean operators and tools for hard surface modeling","archive_hash":"sha256:9d9c73f2f49af05e3a3cfe78daa43676b1005fcbb591dc054d9d04c370f0d85d","archive_size":167487,"archive_url":"https://extensions.blender.org/download/sha256:9d9c73f2f49af05e3a3cfe78daa43676b1005fcbb591dc054d9d04c370f0d85d/add-on-bool-tool-v2.0.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/bool-tool/","maintainer":"nickberckley","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Object"]},{"id":"vdm_brush_baker","schema_version":"1.0.0","name":"VDM Brush Baker","version":"1.0.6","tagline":"Bake vector displacement brushes easily from a plane","archive_hash":"sha256:b704f4dca21c2e929b559d99896c18a373b0599a6ca11b45856d5106ec4d6419","archive_size":5781,"archive_url":"https://extensions.blender.org/download/sha256:b704f4dca21c2e929b559d99896c18a373b0599a6ca11b45856d5106ec4d6419/add-on-vdm-brush-baker-v1.0.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/vdm-brush-baker/","maintainer":"robin.hohni","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Add-on saves textures to disk"},"tags":["Bake","Sculpt"]},{"id":"add_camera_rigs","schema_version":"1.0.0","name":"Add Camera Rigs","version":"1.8.2","tagline":"Adds a Camera Rig with UI","archive_hash":"sha256:b06aa8048718bbea463fc430694b735fd69b934bf8811a02f6fd17d18a7c1f90","archive_size":13706,"archive_url":"https://extensions.blender.org/download/sha256:b06aa8048718bbea463fc430694b735fd69b934bf8811a02f6fd17d18a7c1f90/add-on-add-camera-rigs-v1.8.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/add-camera-rigs/","maintainer":"WayneDixon","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"ivygen","schema_version":"1.0.0","name":"IvyGen","version":"0.1.5","tagline":"Adds generated ivy to a mesh object starting at the 3D cursor","archive_hash":"sha256:7e60967a11cabacb9bca0128e65dcfb96cec8794a934bc7dc2e353ae720cff98","archive_size":7172,"archive_url":"https://extensions.blender.org/download/sha256:7e60967a11cabacb9bca0128e65dcfb96cec8794a934bc7dc2e353ae720cff98/add-on-ivygen-v0.1.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ivygen/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Add Curve"]},{"id":"measureit","schema_version":"1.0.0","name":"MeasureIt","version":"1.8.4","tagline":"Tools for measuring objects","archive_hash":"sha256:85b1836d97e5c2f0311afdf45cf9fd3cefa71bade074963864ce40ee15c26042","archive_size":28891,"archive_url":"https://extensions.blender.org/download/sha256:85b1836d97e5c2f0311afdf45cf9fd3cefa71bade074963864ce40ee15c26042/add-on-measureit-v1.8.4.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/measureit/","maintainer":"antoniov","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"tri_lighting","schema_version":"1.0.0","name":"Tri-lighting","version":"0.2.1","tagline":"Add 3 Point Lighting to Selected / Active Object","archive_hash":"sha256:91bd27546e4be010ed03eb732dcf04500086ba79278c7259ec0912c996b3b04b","archive_size":3531,"archive_url":"https://extensions.blender.org/download/sha256:91bd27546e4be010ed03eb732dcf04500086ba79278c7259ec0912c996b3b04b/add-on-tri-lighting-v0.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/tri-lighting/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Lighting"]},{"id":"grease_pencil_tools","schema_version":"1.0.0","name":"Grease Pencil Tools","version":"2.2.4","tagline":"Extra tools for Grease Pencil","archive_hash":"sha256:de2228934ac042a2aa3cf82af135592b7ef24af5588c12357810ff6b44d5359b","archive_size":51948,"archive_url":"https://extensions.blender.org/download/sha256:de2228934ac042a2aa3cf82af135592b7ef24af5588c12357810ff6b44d5359b/add-on-grease-pencil-tools-v2.2.4.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/grease-pencil-tools/","maintainer":"SamuelBernou","license":["SPDX:GPL-3.0-or-later"],"tags":["Grease Pencil","Object"]},{"id":"tissue","schema_version":"1.0.0","name":"Tissue","version":"0.3.71","tagline":"Tools for Computational Design","archive_hash":"sha256:e2da80e8dc35fa07bd63cc09c71511a8d2766f00bc1ae93ae1416710049b04ad","archive_size":113361,"archive_url":"https://extensions.blender.org/download/sha256:e2da80e8dc35fa07bd63cc09c71511a8d2766f00bc1ae93ae1416710049b04ad/add-on-tissue-v0.3.71.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/tissue/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Mesh"]},{"id":"icon_viewer","schema_version":"1.0.0","name":"Icon Viewer","version":"1.4.2","tagline":"Click an icon to copy its name to the clipboard","archive_hash":"sha256:f8f8edde289718bb022fcaeb8c2f0613730625af41cace80f3906d64779e64fc","archive_size":3814,"archive_url":"https://extensions.blender.org/download/sha256:f8f8edde289718bb022fcaeb8c2f0613730625af41cace80f3906d64779e64fc/add-on-icon-viewer-v1.4.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/icon-viewer/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Development"]},{"id":"magic_uv","schema_version":"1.0.0","name":"Magic UV","version":"6.7.1","tagline":"UV Toolset. See Add-ons Preferences for details","archive_hash":"sha256:09451ad3876aa1a1f693cdce4a5837e9a6c69cfc96cfc292ebc398a529d28571","archive_size":104347,"archive_url":"https://extensions.blender.org/download/sha256:09451ad3876aa1a1f693cdce4a5837e9a6c69cfc96cfc292ebc398a529d28571/add-on-magic-uv-v6.7.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/magic-uv/","maintainer":"nutti","license":["SPDX:GPL-2.0-or-later"],"tags":["UV"]},{"id":"export_autocad_dxf_format_dxf","schema_version":"1.0.0","name":"Export Autocad DXF Format (.dxf)","version":"2.2.4","tagline":"The script exports Blender geometry to DXF format r12 version","archive_hash":"sha256:eb49707876bcf472d440e89206252b90d8c7b9bf919ece6c59a8d7f1181199e7","archive_size":33206,"archive_url":"https://extensions.blender.org/download/sha256:eb49707876bcf472d440e89206252b90d8c7b9bf919ece6c59a8d7f1181199e7/add-on-export-autocad-dxf-format-dxf-v2.2.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/export-autocad-dxf-format-dxf/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Requires access to directory where it exports DXF file"},"tags":["Import-Export"]},{"id":"discombobulator","schema_version":"1.0.0","name":"Discombobulator","version":"0.1.0","tagline":"Add Discombobulator","archive_hash":"sha256:79b9763dd90ec7e7dd0f2b1a6dca0485145f9ac258787c6ba5fafb56d6b45d9d","archive_size":7864,"archive_url":"https://extensions.blender.org/download/sha256:79b9763dd90ec7e7dd0f2b1a6dca0485145f9ac258787c6ba5fafb56d6b45d9d/add-on-discombobulator-v0.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/discombobulator/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Add Mesh"]},{"id":"animall","schema_version":"1.0.0","name":"AnimAll","version":"0.14.0","tagline":"Animate mesh, lattice, curve and surface data","archive_hash":"sha256:85fcb80112f25a194891242708eb3bc8fdd02890b9a6d9fc83502e059e0d1f86","archive_size":8635,"archive_url":"https://extensions.blender.org/download/sha256:85fcb80112f25a194891242708eb3bc8fdd02890b9a6d9fc83502e059e0d1f86/add-on-animall-v0.14.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/animall/","maintainer":"pioverfour","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"blender_id_authentication","schema_version":"1.0.0","name":"Blender ID authentication","version":"2.1.3","tagline":"Stores your Blender ID credentials for usage with other add-ons","archive_hash":"sha256:c082141d5040e928d4691f2f00f020932e36b4a06500a210e06e4c2a014564d5","archive_size":11456,"archive_url":"https://extensions.blender.org/download/sha256:c082141d5040e928d4691f2f00f020932e36b4a06500a210e06e4c2a014564d5/add-on-blender-id-authentication-v2.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blender-id-authentication/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"permissions":{"network":"Requires access to id.blender.org to sync preferences"},"tags":["System"]},{"id":"edit_mesh_tools","schema_version":"1.0.0","name":"Edit Mesh Tools","version":"0.3.6","tagline":"Mesh modelling toolkit. Several tools to aid modelling","archive_hash":"sha256:af6440c98c5f64dbcd492e03d7e8772e3bacad92dfc92b5be8abadacc86e7ee0","archive_size":74410,"archive_url":"https://extensions.blender.org/download/sha256:af6440c98c5f64dbcd492e03d7e8772e3bacad92dfc92b5be8abadacc86e7ee0/add-on-edit-mesh-tools-v0.3.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/edit-mesh-tools/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Mesh"]},{"id":"viewport_pie_menus","schema_version":"1.0.0","name":"3D Viewport Pie Menus","version":"1.7.3","tagline":"Various pie menus to speed up your workflow","archive_hash":"sha256:b6e8d806492c45c7323933bc674a2f41e220ec7f8574214759b76e5f34d3b100","archive_size":110402,"archive_url":"https://extensions.blender.org/download/sha256:b6e8d806492c45c7323933bc674a2f41e220ec7f8574214759b76e5f34d3b100/add-on-viewport-pie-menus-v1.7.3.zip","type":"add-on","blender_version_min":"5.0.0","blender_version_max":"6.0.0","website":"https://extensions.blender.org/add-ons/viewport-pie-menus/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"To load brush icons from disk"},"tags":["User Interface"]},{"id":"bsurfaces_gpl_edition","schema_version":"1.0.0","name":"Bsurfaces GPL Edition","version":"1.8.4","tagline":"Modeling and retopology tool","archive_hash":"sha256:a521277138cf2bac92655e3e684f0714aafca25dd86fc5adc2e0f274df34dd6e","archive_size":31781,"archive_url":"https://extensions.blender.org/download/sha256:a521277138cf2bac92655e3e684f0714aafca25dd86fc5adc2e0f274df34dd6e/add-on-bsurfaces-gpl-edition-v1.8.4.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/bsurfaces-gpl-edition/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"curve_tools","schema_version":"1.0.0","name":"Curve Tools","version":"0.4.6","tagline":"Adds some functionality for bezier/nurbs curve/surface modeling","archive_hash":"sha256:af1e26d5e38c0c024598898e31e35373c978505a1942deb12588ef87ad85696f","archive_size":55633,"archive_url":"https://extensions.blender.org/download/sha256:af1e26d5e38c0c024598898e31e35373c978505a1942deb12588ef87ad85696f/add-on-curve-tools-v0.4.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/curve-tools/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Add Curve"]},{"id":"power_sequencer","schema_version":"1.0.0","name":"Power Sequencer","version":"2.0.4","tagline":"Video editing tools for content creators","archive_hash":"sha256:895f02298c1c616f4d115184e7d71de3b82a61aa95f3d524cceaedf3d3f1ff5a","archive_size":97495,"archive_url":"https://extensions.blender.org/download/sha256:895f02298c1c616f4d115184e7d71de3b82a61aa95f3d524cceaedf3d3f1ff5a/add-on-power-sequencer-v2.0.4.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/power-sequencer/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Sequencer"]},{"id":"dynamic_sky","schema_version":"1.0.0","name":"Dynamic Sky","version":"1.0.6","tagline":"Creates Dynamic Sky for Cycles","archive_hash":"sha256:2f8d1fc2e0c71287e42b4f91d52d270da8f4d7da8033305b2a1790f742fa374f","archive_size":4358,"archive_url":"https://extensions.blender.org/download/sha256:2f8d1fc2e0c71287e42b4f91d52d270da8f4d7da8033305b2a1790f742fa374f/add-on-dynamic-sky-v1.0.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dynamic-sky/","maintainer":"Dynamic Sky","license":["SPDX:GPL-2.0-or-later"],"tags":["Lighting"]},{"id":"vrm","schema_version":"1.0.0","name":"VRM format","version":"3.26.3","tagline":"VRM import, export and editing capabilities","archive_hash":"sha256:cf7e506ecea109bb35af9c807e8d64e0fee9314f8a90d48ff73d1a05e2ede639","archive_size":1563364,"archive_url":"https://extensions.blender.org/download/sha256:cf7e506ecea109bb35af9c807e8d64e0fee9314f8a90d48ff73d1a05e2ede639/add-on-vrm-v3.26.3.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.2.0","website":"https://extensions.blender.org/add-ons/vrm/","maintainer":"saturday06","license":["SPDX:MIT","SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export VRM from/to disk"},"tags":["Import-Export","Animation","Modeling","Material","Physics"]},{"id":"io_scene_max","schema_version":"1.0.0","name":"Import Autodesk MAX (.max)","version":"1.7.5","tagline":"Import 3DSMAX meshes & materials","archive_hash":"sha256:59840441d615e04517b32d6ee1501a348df079f909fb08a6cb3896677c7486a7","archive_size":83827,"archive_url":"https://extensions.blender.org/download/sha256:59840441d615e04517b32d6ee1501a348df079f909fb08a6cb3896677c7486a7/add-on-io-scene-max-v1.7.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-scene-max/","maintainer":"NRGSille","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import Autodesk MAX files"},"tags":["Import-Export","Mesh","Material"]},{"id":"sun_position","schema_version":"1.0.0","name":"Sun Position","version":"4.4.0","tagline":"Show the position of the Sun with objects or an environment","archive_hash":"sha256:b8a83c2ff04fad709687de51065faf6add52e824ec06fef22b4a95fe98955856","archive_size":26592,"archive_url":"https://extensions.blender.org/download/sha256:b8a83c2ff04fad709687de51065faf6add52e824ec06fef22b4a95fe98955856/add-on-sun-position-v4.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sun-position/","maintainer":"pioverfour","license":["SPDX:GPL-3.0-or-later"],"tags":["Lighting"]},{"id":"gruvbox_light","schema_version":"1.0.0","name":"Gruvbox Light","version":"1.7.0","tagline":"Gruvbox light theme","archive_hash":"sha256:0cf1134eacd9b4fe8b1cf336bdd8510fc984fd8c322427145a498982b0167664","archive_size":5434,"archive_url":"https://extensions.blender.org/download/sha256:0cf1134eacd9b4fe8b1cf336bdd8510fc984fd8c322427145a498982b0167664/theme-gruvbox-light-v1.7.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/gruvbox-light/","maintainer":"Eleuth","license":["SPDX:GPL-2.0-or-later"],"tags":["Light"]},{"id":"gruvbox_dark","schema_version":"1.0.0","name":"Gruvbox Dark","version":"1.7.1","tagline":"Gruvbox dark theme","archive_hash":"sha256:54617fdf9c8a883c2425c9ccf3dbee6b745cb258b94e59776b932ef4b98289ae","archive_size":5232,"archive_url":"https://extensions.blender.org/download/sha256:54617fdf9c8a883c2425c9ccf3dbee6b745cb258b94e59776b932ef4b98289ae/theme-gruvbox-dark-v1.7.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/gruvbox-dark/","maintainer":"Eleuth","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"phoenixart_fusion_theme","schema_version":"1.0.0","name":"PhoenixArt Fusion Theme","version":"4.0.3","tagline":"Based on Blackmagic Fusion Theme","archive_hash":"sha256:19029c154eba46e528b33dd7a18a3633507df051e0341358651a0030eedcd066","archive_size":6404,"archive_url":"https://extensions.blender.org/download/sha256:19029c154eba46e528b33dd7a18a3633507df051e0341358651a0030eedcd066/theme-phoenixart-fusion-theme-v4.0.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/phoenixart-fusion-theme/","maintainer":"phoenixart","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"alien_pink_theme","schema_version":"1.0.0","name":"Alien Pink","version":"6.0.0","tagline":"Stylish and vibrant theme designed specially for you","archive_hash":"sha256:cef37705d005e9f1ff988d0d620d646bfaac30532cb2d2fbce97885245906641","archive_size":6709,"archive_url":"https://extensions.blender.org/download/sha256:cef37705d005e9f1ff988d0d620d646bfaac30532cb2d2fbce97885245906641/theme-alien-pink-theme-v6.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/alien-pink-theme/","maintainer":"Alumx","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","High Contrast"]},{"id":"copy_object_name_to_data","schema_version":"1.0.0","name":"Copy Object Name to Data","version":"1.1.1","tagline":"A simple operator to copy object names to object data","archive_hash":"sha256:686fd6616844730398773fa942ffc42bcc478622a1441b51c70ba28853274c03","archive_size":14363,"archive_url":"https://extensions.blender.org/download/sha256:686fd6616844730398773fa942ffc42bcc478622a1441b51c70ba28853274c03/add-on-copy-object-name-to-data-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/copy-object-name-to-data/","maintainer":"Xury46","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","User Interface"]},{"id":"nd","schema_version":"1.0.0","name":"ND","version":"2.1.0","tagline":"Non-Destructive Modeling Toolkit","archive_hash":"sha256:6c83f44f13327ea5fc52ffbe5dd770b8f905bac92174e2794eb06e1c244947c5","archive_size":1546886,"archive_url":"https://extensions.blender.org/download/sha256:6c83f44f13327ea5fc52ffbe5dd770b8f905bac92174e2794eb06e1c244947c5/add-on-nd-v2.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nd/","maintainer":"HugeMenace","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import built-in and custom assets"},"tags":["3D View","Lighting","Material","Modeling","Mesh","Object","Scene","UV"]},{"id":"io_export_after_effects","schema_version":"1.0.0","name":"Export: Adobe After Effects (.jsx)","version":"0.2.1","tagline":"Export cameras, images and empties to Adobe After Effects","archive_hash":"sha256:8c1caea017a582d3e9725fb2d96a17546a9877704d42676471097a59225049b4","archive_size":16102,"archive_url":"https://extensions.blender.org/download/sha256:8c1caea017a582d3e9725fb2d96a17546a9877704d42676471097a59225049b4/add-on-io-export-after-effects-v0.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-export-after-effects/","maintainer":"Les Fées Spéciales","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Export JSX file to disk"},"tags":["Import-Export"]},{"id":"textify","schema_version":"1.0.0","name":"Textify","version":"1.8.0","tagline":"Streamline and Enhance Blender’s Text Editor","archive_hash":"sha256:e4d15e15e77034233bc82abbc9fe46839b3ec79d1ba9f567bc0b0ce14d1e67b4","archive_size":1851559,"archive_url":"https://extensions.blender.org/download/sha256:e4d15e15e77034233bc82abbc9fe46839b3ec79d1ba9f567bc0b0ce14d1e67b4/add-on-textify-v1.8.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/textify/","maintainer":"Jishnu-kv","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write settings, and manage scripts on disk","clipboard":"Copy class bl_idname and identifiers to clipboard"},"tags":["Text Editor","Development"]},{"id":"Bagapie","schema_version":"1.0.0","name":"Bagapie","version":"11.0.8","tagline":"50+ tools : Scattering, Ivy Gen, Random Array, Architecture","archive_hash":"sha256:5f1be93c7b9d48f75d16a497e1c85a12f10be59db4098196b0f38f6da0a3a6ad","archive_size":10833664,"archive_url":"https://extensions.blender.org/download/sha256:5f1be93c7b9d48f75d16a497e1c85a12f10be59db4098196b0f38f6da0a3a6ad/add-on-bagapie-v11.0.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bagapie/","maintainer":"Kiara_Bagattini","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Create, setup and add assets libraries","network":"Open web browser for documentation and tutorials"},"tags":["Modeling","Node"]},{"id":"y_projectionnode_form_camera_f1","schema_version":"1.0.0","name":"ProjectionNode from Camera","version":"1.3.0","tagline":"Creates a material specified in the Background Image of Camera","archive_hash":"sha256:6fc076e3124099bdad58988605f36ae44a27d2b65932aee2d0fc8b91aedf0d75","archive_size":9289,"archive_url":"https://extensions.blender.org/download/sha256:6fc076e3124099bdad58988605f36ae44a27d2b65932aee2d0fc8b91aedf0d75/add-on-y-projectionnode-form-camera-f1-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/y-projectionnode-form-camera-f1/","maintainer":"Yukimituki","license":["SPDX:GPL-2.0-or-later"],"tags":["Node","Material"]},{"id":"Shadow","schema_version":"1.0.0","name":"Shadow","version":"5.0.2","tagline":"Dark theme","archive_hash":"sha256:0325c737f887420efd31225df8a6d79c7645b4bff72dec4787605ed2d6fbf84b","archive_size":5744,"archive_url":"https://extensions.blender.org/download/sha256:0325c737f887420efd31225df8a6d79c7645b4bff72dec4787605ed2d6fbf84b/theme-shadow-v5.0.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/shadow/","maintainer":"--Shadow--","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","High Contrast"]},{"id":"ucupaint","schema_version":"1.0.0","name":"Ucupaint","version":"2.4.5","tagline":"Layer based painting for Eevee and Cycles","archive_hash":"sha256:9fd5fc4c8f12cdf4ce240dc84f6524fccce11fca72c47094f257631fca3b7b3b","archive_size":2067468,"archive_url":"https://extensions.blender.org/download/sha256:9fd5fc4c8f12cdf4ce240dc84f6524fccce11fca72c47094f257631fca3b7b3b/add-on-ucupaint-v2.4.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ucupaint/","maintainer":"ucupumar","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Access to filesystem for loading and saving images","network":"Access to the network to update contributors and sponsors list"},"tags":["Node","Material","Paint","Bake"]},{"id":"Industrial_AOV_Connector","schema_version":"1.0.0","name":"Industrial AOV Connector","version":"5.1.0","tagline":"Auto generate outputs for advanced compositing","archive_hash":"sha256:edcfdf0a2e8bc0bfd90dc961d351ddbd9303f4af985de5d21ff67a499f2c30bb","archive_size":218597,"archive_url":"https://extensions.blender.org/download/sha256:edcfdf0a2e8bc0bfd90dc961d351ddbd9303f4af985de5d21ff67a499f2c30bb/add-on-industrial-aov-connector-v5.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/industrial-aov-connector/","maintainer":"Roland-Vyens","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Delete Useless Default Renders button need this"},"tags":["Compositing","Import-Export","Pipeline","Render"]},{"id":"hdr_rotation","schema_version":"1.0.0","name":"Hdr Rotation","version":"1.0.7","tagline":"Rotation HDR by Shift+Right Drag in 3D View","archive_hash":"sha256:d78bada4fd2f4eb6cab6b30872006264b900ca91631b6a7ddc9a07111053fc68","archive_size":6585,"archive_url":"https://extensions.blender.org/download/sha256:d78bada4fd2f4eb6cab6b30872006264b900ca91631b6a7ddc9a07111053fc68/add-on-hdr-rotation-v1.0.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/hdr-rotation/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","Render"]},{"id":"Dark_Purple_Green","schema_version":"1.0.0","name":"DarkPurpleGreen","version":"1.0.1","tagline":"Dark minimal neon theme","archive_hash":"sha256:ca96f25e8529fc306169b9a85a8e62826401ebb4bd26bd4eb4ff5bbec813e9d4","archive_size":5871,"archive_url":"https://extensions.blender.org/download/sha256:ca96f25e8529fc306169b9a85a8e62826401ebb4bd26bd4eb4ff5bbec813e9d4/theme-dark-purple-green-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/dark-purple-green/","maintainer":"MSBH","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"node_editor_switcher","schema_version":"1.0.0","name":"Node Editor Switcher","version":"1.1.0","tagline":"Pie menu, shortcuts and buttons to switch between node editors","archive_hash":"sha256:2b7228d52b2d984301f9437453eafd0854c0547e15902e231640f2c6877a48e3","archive_size":2134,"archive_url":"https://extensions.blender.org/download/sha256:2b7228d52b2d984301f9437453eafd0854c0547e15902e231640f2c6877a48e3/add-on-node-editor-switcher-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-editor-switcher/","maintainer":"Victor-09","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Pipeline","User Interface"]},{"id":"Adapta_Nokto","schema_version":"1.0.0","name":"Adapta Nokto","version":"1.1.3","tagline":"Adapta Nokto theme","archive_hash":"sha256:42c3ec72557e2cb64a04370064b50047bf36904d186c438a040d636e53c40fb4","archive_size":5612,"archive_url":"https://extensions.blender.org/download/sha256:42c3ec72557e2cb64a04370064b50047bf36904d186c438a040d636e53c40fb4/theme-adapta-nokto-v1.1.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/adapta-nokto/","maintainer":"Cyrill-Vitkovskiy","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"browser_scroll_resize","schema_version":"1.0.0","name":"Browser Scroll Resize","version":"1.0.1","tagline":"Resize File Size Thumbnail on Browsers with Mouse Wheel","archive_hash":"sha256:ed662d549b82d1aa22020c683b0d92d65757d72f4001058d236893c7f632a5da","archive_size":2729,"archive_url":"https://extensions.blender.org/download/sha256:ed662d549b82d1aa22020c683b0d92d65757d72f4001058d236893c7f632a5da/add-on-browser-scroll-resize-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/browser-scroll-resize/","maintainer":"Barrunterio","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"secret_paint","schema_version":"1.0.0","name":"Secret Paint","version":"1.7.31","tagline":"Select an object, select a surface, paint","archive_hash":"sha256:7ce82e1a12de023b756912ea5542b01f4dcd05be5fdb85b5eefbe2f91c3279f6","archive_size":1950644,"archive_url":"https://extensions.blender.org/download/sha256:7ce82e1a12de023b756912ea5542b01f4dcd05be5fdb85b5eefbe2f91c3279f6/add-on-secret-paint-v1.7.31.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/secret-paint/","maintainer":"orencloud","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export objects and biomes to external blend files","network":"Update from GitHub if installed as addon rather than extension"},"tags":["Modeling","Add Curve"]},{"id":"delete_line_shortcut","schema_version":"1.0.0","name":"Delete Line Shortcut","version":"1.2.2","tagline":"Shortcut to delete a line and copy its content","archive_hash":"sha256:e327da024c4d02910dc501b3c5a0445326654775e04750b9458fd7dc7153f7ab","archive_size":15764,"archive_url":"https://extensions.blender.org/download/sha256:e327da024c4d02910dc501b3c5a0445326654775e04750b9458fd7dc7153f7ab/add-on-delete-line-shortcut-v1.2.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/delete-line-shortcut/","maintainer":"matej.zeman02","license":["SPDX:GPL-3.0-or-later"],"permissions":{"clipboard":"Add-on can read and write to the system clipboard."},"tags":["User Interface","Text Editor"]},{"id":"keyframe_visibility","schema_version":"1.0.0","name":"Keyframe Visibility","version":"1.0.2","tagline":"Batch keyframe visibility for objects","archive_hash":"sha256:d34a97ea3d6f6776991474da0e4794e6c124ec9a0262abfe4aeef65e35670f84","archive_size":4295,"archive_url":"https://extensions.blender.org/download/sha256:d34a97ea3d6f6776991474da0e4794e6c124ec9a0262abfe4aeef65e35670f84/add-on-keyframe-visibility-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/keyframe-visibility/","maintainer":"hisanimations","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","3D View"]},{"id":"midnight_blue_theme","schema_version":"1.0.0","name":"Midnight Blue","version":"1.0.1","tagline":"Blender blues after midnight","archive_hash":"sha256:8ab6dd7c85f7451cc8a7fe41dcb95b5a474a01f9a336a841e8f11e28555d9928","archive_size":5982,"archive_url":"https://extensions.blender.org/download/sha256:8ab6dd7c85f7451cc8a7fe41dcb95b5a474a01f9a336a841e8f11e28555d9928/theme-midnight-blue-theme-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/midnight-blue-theme/","maintainer":"cmzw","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"bulk_asset_tools","schema_version":"1.0.0","name":"Bulk Asset Tools","version":"1.7.3","tagline":"Manage your asset libraries with ease","archive_hash":"sha256:3f3141412450034efdc8f02cde18a99a3a4fe2b3116ca70a3a62d38da6e93e6d","archive_size":10636,"archive_url":"https://extensions.blender.org/download/sha256:3f3141412450034efdc8f02cde18a99a3a4fe2b3116ca70a3a62d38da6e93e6d/add-on-bulk-asset-tools-v1.7.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bulk-asset-tools/","maintainer":"guitargeek","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Add-on expects to have access to filesytem."},"tags":["User Interface"]},{"id":"blender_path_maker","schema_version":"1.0.0","name":"Path Maker","version":"1.4.5","tagline":"Replaces custom tags in the Output Path","archive_hash":"sha256:1c222d219c83a66f87ab9f573d682c584de029ed23c7ef3b44f5f89f66a0d926","archive_size":4822,"archive_url":"https://extensions.blender.org/download/sha256:1c222d219c83a66f87ab9f573d682c584de029ed23c7ef3b44f5f89f66a0d926/add-on-blender-path-maker-v1.4.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blender-path-maker/","maintainer":"thornydre","license":["SPDX:GPL-3.0-or-later"],"tags":["Render"]},{"id":"SelectsAllIslandsUDIM","schema_version":"1.0.0","name":"Selects all UV islands on one UDIM","version":"1.2.0","tagline":"Highlighting UV-islands and faces of the corresponding UDIM","archive_hash":"sha256:3ead06399c6676eeb55ccd18d122a9d4fc7d1cba004290de7ddaaf9f8c5b930f","archive_size":3781,"archive_url":"https://extensions.blender.org/download/sha256:3ead06399c6676eeb55ccd18d122a9d4fc7d1cba004290de7ddaaf9f8c5b930f/add-on-selectsallislandsudim-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/selectsallislandsudim/","maintainer":"Ailex","license":["SPDX:GPL-3.0-or-later"],"tags":["UV"]},{"id":"lightpainter","schema_version":"1.0.0","name":"Light Painter","version":"1.5.6","tagline":"Do not place your lights, paint them","archive_hash":"sha256:961e640c2676b2285bc51c3ee08478eac669227ea8d48192667e1e9e0c19af3a","archive_size":112051,"archive_url":"https://extensions.blender.org/download/sha256:961e640c2676b2285bc51c3ee08478eac669227ea8d48192667e1e9e0c19af3a/add-on-lightpainter-v1.5.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/lightpainter/","maintainer":"SMagnusson","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Lighting","Object"]},{"id":"ContextPie","schema_version":"1.0.0","name":"Context Pie","version":"0.9.40","tagline":"Context sensitive pie menu for a simple, fast workflow","archive_hash":"sha256:e6f08e6823425bdd995d954a05bdcad9f4a43fceefecf2ce5961e120f67e4bb5","archive_size":152529,"archive_url":"https://extensions.blender.org/download/sha256:e6f08e6823425bdd995d954a05bdcad9f4a43fceefecf2ce5961e120f67e4bb5/add-on-contextpie-v0.9.40.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/contextpie/","maintainer":"BastianLS","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface","3D View","UV"]},{"id":"orient_and_origin_to_selected","schema_version":"1.0.0","name":"Orient and Origin to Selected","version":"1.2.0","tagline":"Quickly manipulate the object origin","archive_hash":"sha256:f2f35569453161aa07e2d9c3ae6fe618538c6af7f659f910bb7bdfb8a4fc3521","archive_size":42615,"archive_url":"https://extensions.blender.org/download/sha256:f2f35569453161aa07e2d9c3ae6fe618538c6af7f659f910bb7bdfb8a4fc3521/add-on-orient-and-origin-to-selected-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/orient-and-origin-to-selected/","maintainer":"Orange Turbine","license":["SPDX:GPL-2.0-or-later"],"tags":["Modeling","Mesh","Object"]},{"id":"screencast_keys","schema_version":"1.0.0","name":"Screencast Keys","version":"4.2.2","tagline":"Display keys pressed in Blender","archive_hash":"sha256:dc9f079d49cf18058646a0d8c0efc88c2928554f6960cf1bff5fbabf6dd48bc4","archive_size":39054,"archive_url":"https://extensions.blender.org/download/sha256:dc9f079d49cf18058646a0d8c0efc88c2928554f6960cf1bff5fbabf6dd48bc4/add-on-screencast-keys-v4.2.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/screencast-keys/","maintainer":"nutti","license":["SPDX:GPL-3.0-or-later"],"tags":["System","User Interface"]},{"id":"Gold_Pro_Theme","schema_version":"1.0.0","name":"Gold Pro","version":"1.1.4","tagline":"Professional blender theme with Gold :)","archive_hash":"sha256:c74e7b313e8e3fc7abb1e1ef91af4a93dfcb61110e767cb9d720746798a64e5d","archive_size":5514,"archive_url":"https://extensions.blender.org/download/sha256:c74e7b313e8e3fc7abb1e1ef91af4a93dfcb61110e767cb9d720746798a64e5d/theme-gold-pro-theme-v1.1.4.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/gold-pro-theme/","maintainer":"EmanuelFerro","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"lfs_camera_plane","schema_version":"1.0.0","name":"Camera Plane","version":"3.0.0","tagline":"Import images and stick them to the camera","archive_hash":"sha256:45c0ae27888061c5eb7a1035e2fa4ca6062e8612c941c8b369d66c83703814c4","archive_size":17262,"archive_url":"https://extensions.blender.org/download/sha256:45c0ae27888061c5eb7a1035e2fa4ca6062e8612c941c8b369d66c83703814c4/add-on-lfs-camera-plane-v3.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/lfs-camera-plane/","maintainer":"Les Fées Spéciales","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import images from disk"},"tags":["3D View","Import-Export","Object","Camera"]},{"id":"Wireframe_Color_Tools","schema_version":"1.0.0","name":"Wireframe Color Tools","version":"1.0.0","tagline":"Change Object Colors based on different kinds of methods","archive_hash":"sha256:e1290c2cfb2b6ce2346f12679eed8f6cc2e522c90f40889e056e28f11f3832a9","archive_size":3122,"archive_url":"https://extensions.blender.org/download/sha256:e1290c2cfb2b6ce2346f12679eed8f6cc2e522c90f40889e056e28f11f3832a9/add-on-wireframe-color-tools-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/wireframe-color-tools/","maintainer":"Lumpengnom","license":["SPDX:GPL-2.0-or-later"],"tags":["3D View","Material","Object"]},{"id":"neutral_grey","schema_version":"1.0.0","name":"Neutral Grey","version":"2.0.3","tagline":"A neutral grey theme for Blender","archive_hash":"sha256:d8b3c0b0c41cb7cc9a7ab555f6f7d7722bfab1756c62f85924aeb51edbb76454","archive_size":5558,"archive_url":"https://extensions.blender.org/download/sha256:d8b3c0b0c41cb7cc9a7ab555f6f7d7722bfab1756c62f85924aeb51edbb76454/theme-neutral-grey-v2.0.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/neutral-grey/","maintainer":"scopelma","license":["SPDX:GPL-2.0-or-later"],"tags":["Light","Accessibility"]},{"id":"deep_dark_sea","schema_version":"1.0.0","name":"Deep Dark Sea","version":"3.0.0","tagline":"Darker than the default dark","archive_hash":"sha256:59391a10f0750d676911eb3daf9e717504355033e9851de584d430e30c1c5298","archive_size":6219,"archive_url":"https://extensions.blender.org/download/sha256:59391a10f0750d676911eb3daf9e717504355033e9851de584d430e30c1c5298/theme-deep-dark-sea-v3.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/deep-dark-sea/","maintainer":"nickberckley","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","High Contrast"]},{"id":"border_buddy","schema_version":"1.0.0","name":"Border Buddy","version":"0.1.1","tagline":"Your buddy that helps to preserve borders","archive_hash":"sha256:1806735a0d626fabbda5d37bbb2ed03841da49abc956a18dddf9274875bffaf4","archive_size":2579,"archive_url":"https://extensions.blender.org/download/sha256:1806735a0d626fabbda5d37bbb2ed03841da49abc956a18dddf9274875bffaf4/add-on-border-buddy-v0.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/border-buddy/","maintainer":"SimonThommes","license":["SPDX:GPL-2.0-or-later"],"tags":["Render"]},{"id":"bake_shape_keys","schema_version":"1.0.0","name":"Bake Shape Keys","version":"1.4.0","tagline":"Feature-set for shape keys and shape key animations","archive_hash":"sha256:883e86f28541be0cd3e0a59abdc8fd0ea531d10186181d38cdaca590d17ee0dd","archive_size":14241,"archive_url":"https://extensions.blender.org/download/sha256:883e86f28541be0cd3e0a59abdc8fd0ea531d10186181d38cdaca590d17ee0dd/add-on-bake-shape-keys-v1.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bake-shape-keys/","maintainer":"nickberckley","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Mesh"]},{"id":"matalogue","schema_version":"1.0.0","name":"Matalogue","version":"1.5.1","tagline":"All your node trees in one list","archive_hash":"sha256:b1911aa0cbe55456ccd3c16a38aed01c687f205d5ca86c69903ef36aca7c90d9","archive_size":13431,"archive_url":"https://extensions.blender.org/download/sha256:b1911aa0cbe55456ccd3c16a38aed01c687f205d5ca86c69903ef36aca7c90d9/add-on-matalogue-v1.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/matalogue/","maintainer":"GregZaal","license":["SPDX:GPL-3.0-or-later"],"tags":["Node"]},{"id":"poly_copy_paste","schema_version":"1.0.0","name":"Poly Copy Paste","version":"1.0.3","tagline":"Copy / Cut / Paste polygons with Ctrl+C / Ctrl+X / Ctrl+V","archive_hash":"sha256:b40714c0b14ccb768539ac4906e03ef91cd167361be51985671a49c608732942","archive_size":3131,"archive_url":"https://extensions.blender.org/download/sha256:b40714c0b14ccb768539ac4906e03ef91cd167361be51985671a49c608732942/add-on-poly-copy-paste-v1.0.3.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/poly-copy-paste/","maintainer":"Fisch_Tu","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"NieR_Automata_UI","schema_version":"1.0.0","name":"NieR_Automata_UI","version":"1.2.5","tagline":"Glory to Mankind","archive_hash":"sha256:ac111a56629c2026293ff3a025c06b1d2b187ec0164848a1088570a68495e2aa","archive_size":5812,"archive_url":"https://extensions.blender.org/download/sha256:ac111a56629c2026293ff3a025c06b1d2b187ec0164848a1088570a68495e2aa/theme-nier-automata-ui-v1.2.5.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/nier-automata-ui/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Light","Colorful"]},{"id":"io_xnalara","schema_version":"1.0.0","name":"XPS Import/Export","version":"2.2.7","tagline":"Import-Export for XNALara/XPS files","archive_hash":"sha256:0e41580bdae0bdcf091e8ebb74b7bde910f8f011cc27443081c364351e8debc6","archive_size":174281,"archive_url":"https://extensions.blender.org/download/sha256:0e41580bdae0bdcf091e8ebb74b7bde910f8f011cc27443081c364351e8debc6/add-on-io-xnalara-v2.2.7.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/io-xnalara/","maintainer":"maylog","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Pipeline"]},{"id":"preset_startup_manager","schema_version":"1.0.0","name":"Startup Preset Manager","version":"2.10.0","tagline":"Custom startup file creation / hot reloading","archive_hash":"sha256:09db3bb39ffa07a51635b7af748221c1b45c4fca6d49174d2a57366652609ca8","archive_size":4684,"archive_url":"https://extensions.blender.org/download/sha256:09db3bb39ffa07a51635b7af748221c1b45c4fca6d49174d2a57366652609ca8/add-on-preset-startup-manager-v2.10.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/preset-startup-manager/","maintainer":"Gruff-Wright","license":["SPDX:GPL-3.0-or-later"],"tags":["Pipeline","Scene","System"]},{"id":"time_theme_switcher","schema_version":"1.0.0","name":"Time Theme Switcher","version":"1.0.0","tagline":"Switches between light and dark UI themes at scheduled times","archive_hash":"sha256:0f1d64ae1814f5b2110db105154b7c84343c39648f2196a6d7eeaee8bab95010","archive_size":18346,"archive_url":"https://extensions.blender.org/download/sha256:0f1d64ae1814f5b2110db105154b7c84343c39648f2196a6d7eeaee8bab95010/add-on-time-theme-switcher-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/time-theme-switcher/","maintainer":"CosmoMídias","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read existing themes from disk"},"tags":["User Interface"]},{"id":"k_tools_render_preset_manager","schema_version":"1.0.0","name":"K-Tools: Render Preset Manager","version":"1.3.0","tagline":"Save and Load Blender's Settings","archive_hash":"sha256:83b9bd96debc115a202aa3f718ad8215d2801caa237297765303223ff1b0aebc","archive_size":84603,"archive_url":"https://extensions.blender.org/download/sha256:83b9bd96debc115a202aa3f718ad8215d2801caa237297765303223ff1b0aebc/add-on-k-tools-render-preset-manager-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/k-tools-render-preset-manager/","maintainer":"Robert-Kezives","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export .JSON text files from/to disk"},"tags":["Render"]},{"id":"use_for_rendering_plus","schema_version":"1.0.0","name":"View Layer Plus","version":"1.2.5","tagline":"Seamlessly extend View Layers management","archive_hash":"sha256:b31aaf82ee670ea35a0933557a29c6f6d898af0324a38c4ad221c0030345fb25","archive_size":63199,"archive_url":"https://extensions.blender.org/download/sha256:b31aaf82ee670ea35a0933557a29c6f6d898af0324a38c4ad221c0030345fb25/add-on-use-for-rendering-plus-v1.2.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/use-for-rendering-plus/","maintainer":"Trukas","license":["SPDX:GPL-3.0-or-later"],"tags":["Compositing","User Interface"]},{"id":"mass_keyframe","schema_version":"1.0.0","name":"Mass Keyframe","version":"1.1.0","tagline":"Keyframe properties better","archive_hash":"sha256:21612219b928ef3e430c745c961bc378d73f0b952cc081abb504358d1909d506","archive_size":426822,"archive_url":"https://extensions.blender.org/download/sha256:21612219b928ef3e430c745c961bc378d73f0b952cc081abb504358d1909d506/add-on-mass-keyframe-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mass-keyframe/","maintainer":"StratosDerg","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Sequencer"]},{"id":"vectart_import","schema_version":"1.0.0","name":"Vectart Import","version":"1.0.4","tagline":"Import and preview vector files with layer management","archive_hash":"sha256:a0f709c6d57a880254aad49f8a9c7ca8de03c922b8a1983f0f477cfb0adb5cf1","archive_size":19068,"archive_url":"https://extensions.blender.org/download/sha256:a0f709c6d57a880254aad49f8a9c7ca8de03c922b8a1983f0f477cfb0adb5cf1/add-on-vectart-import-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/vectart-import/","maintainer":"Dimona-Patrick-243","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Required to read and import SVG files from the disk"},"tags":["Modeling","Object"]},{"id":"extrude_along_path","schema_version":"1.0.0","name":"Extrude Along Path","version":"2.2.0","tagline":"Extrude or Rake profile geometry Along a defined Path","archive_hash":"sha256:5afb06c2fbffb81d72e4041aa2b56e04fc2ed0cd0fca7bbe12d57cd4abe73283","archive_size":15621,"archive_url":"https://extensions.blender.org/download/sha256:5afb06c2fbffb81d72e4041aa2b56e04fc2ed0cd0fca7bbe12d57cd4abe73283/add-on-extrude-along-path-v2.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/extrude-along-path/","maintainer":"RobbieK","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh"]},{"id":"dimensions_and_lines","schema_version":"1.0.0","name":"Dimensions and Lines","version":"1.1.0","tagline":"create technical drawings, dimensions and lines","archive_hash":"sha256:b2d368e76a9a41d82b65766fcbc002042ff3383ad40d8e8619ae88bf20d64c30","archive_size":75526,"archive_url":"https://extensions.blender.org/download/sha256:b2d368e76a9a41d82b65766fcbc002042ff3383ad40d8e8619ae88bf20d64c30/add-on-dimensions-and-lines-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dimensions-and-lines/","maintainer":"jan.holinka","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","3D View","Mesh"]},{"id":"textures_autosave","schema_version":"1.0.0","name":"Autosave Textures","version":"1.0.1","tagline":"Save all modified image textures on blendfile (auto-)save","archive_hash":"sha256:86990c248d92cb1c1c9fee66a3d5e9ec215017bc0cd45acefbf8645823bde938","archive_size":2642,"archive_url":"https://extensions.blender.org/download/sha256:86990c248d92cb1c1c9fee66a3d5e9ec215017bc0cd45acefbf8645823bde938/add-on-textures-autosave-v1.0.1.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/textures-autosave/","maintainer":"mont29","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Write image files to disk"},"tags":["Pipeline","Paint"]},{"id":"csv_importer","schema_version":"1.0.0","name":"CSV Importer","version":"0.2.2","tagline":"import csv data to meshes in Blender","archive_hash":"sha256:631249d12f3617113e2f22fa4006a9a96fdb9774e9a0d3a61fb660656314937b","archive_size":46529057,"archive_url":"https://extensions.blender.org/download/sha256:631249d12f3617113e2f22fa4006a9a96fdb9774e9a0d3a61fb660656314937b/add-on-csv-importer-v0.2.2-windows-x64.zip","type":"add-on","blender_version_min":"4.2.5","website":"https://extensions.blender.org/add-ons/csv-importer/","maintainer":"Jan-Hendrik-Müller","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Importing data files from disk"},"platforms":["windows-x64"],"tags":["Geometry Nodes","Import-Export"]},{"id":"Auto_Sort_Collections","schema_version":"1.0.0","name":"Auto Sort Collections","version":"1.0.2","tagline":"Automatic organisation of collections","archive_hash":"sha256:c21b2a4bdb1d839d061c311adafc14ed795aab37dc9a35b32d555e1c651d6079","archive_size":9665,"archive_url":"https://extensions.blender.org/download/sha256:c21b2a4bdb1d839d061c311adafc14ed795aab37dc9a35b32d555e1c651d6079/add-on-auto-sort-collections-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-sort-collections/","maintainer":"Shuimeng","license":["SPDX:GPL-3.0-or-later"],"tags":["Scene"]},{"id":"Cake_Particles","schema_version":"1.0.0","name":"Cake_Particles","version":"5.0.0","tagline":"Bake particles simulation into keyframed animations","archive_hash":"sha256:f1c2e3f5f97bfa3432cc2fb85af35ca6cb05e4ecd7d6dd619522cc36aa80b42f","archive_size":9459,"archive_url":"https://extensions.blender.org/download/sha256:f1c2e3f5f97bfa3432cc2fb85af35ca6cb05e4ecd7d6dd619522cc36aa80b42f/add-on-cake-particles-v5.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cake-particles/","maintainer":"scaryplasmon","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Bake","Physics","Object"]},{"id":"Quick_Character_Selector","schema_version":"1.0.0","name":"Quick Character Selector","version":"1.1.0","tagline":"Seleccion rapida de armatures","archive_hash":"sha256:b1eee352e175dbb52f8c6298a00f15f0d28d1b396f341529a61b73654120fbad","archive_size":1581,"archive_url":"https://extensions.blender.org/download/sha256:b1eee352e175dbb52f8c6298a00f15f0d28d1b396f341529a61b73654120fbad/add-on-quick-character-selector-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-character-selector/","maintainer":"MatiasMartin","license":["SPDX:GPL-2.0-or-later"],"tags":["Object","Animation"]},{"id":"momo","schema_version":"1.0.0","name":"Momo Light","version":"5.0.5","tagline":"Momo Light - theme inspired by Modo","archive_hash":"sha256:cf00fdad2d18855ecc66619205364da458738a82a0d1e2257ca3011de6fa7f7c","archive_size":6482,"archive_url":"https://extensions.blender.org/download/sha256:cf00fdad2d18855ecc66619205364da458738a82a0d1e2257ca3011de6fa7f7c/theme-momo-v5.0.5.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/momo/","maintainer":"TimoShch","license":["SPDX:GPL-2.0-or-later"],"tags":["Inspired By"]},{"id":"k_tools_visibility_check","schema_version":"1.0.0","name":"Visibility Check","version":"2.5.2","tagline":"Check for mismatched objects in viewport and render view","archive_hash":"sha256:c3af61e03cbe782d82b521d4b2d9eef50c98d6c25ffcb8984f8c8f439fc07913","archive_size":6511,"archive_url":"https://extensions.blender.org/download/sha256:c3af61e03cbe782d82b521d4b2d9eef50c98d6c25ffcb8984f8c8f439fc07913/add-on-k-tools-visibility-check-v2.5.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/k-tools-visibility-check/","maintainer":"Robert-Kezives","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Render"]},{"id":"boltfactory","schema_version":"1.0.0","name":"BoltFactory","version":"0.7.1","tagline":"Add a bolt or nut","archive_hash":"sha256:b75f6f946b5c29f7a2122737da891917cd9c862e85b37daef82c662a348223b3","archive_size":35319,"archive_url":"https://extensions.blender.org/download/sha256:b75f6f946b5c29f7a2122737da891917cd9c862e85b37daef82c662a348223b3/add-on-boltfactory-v0.7.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/boltfactory/","maintainer":"Bolt Factory","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh"]},{"id":"dynamic_context_menu","schema_version":"1.0.0","name":"Dynamic Context Menu","version":"1.9.4","tagline":"Object Mode Context Sensitive Spacebar Menu","archive_hash":"sha256:d5489ad11a246fcac650b86b3beb5137f1506a7d09092028acfbc86b8cdc90b5","archive_size":15679,"archive_url":"https://extensions.blender.org/download/sha256:d5489ad11a246fcac650b86b3beb5137f1506a7d09092028acfbc86b8cdc90b5/add-on-dynamic-context-menu-v1.9.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dynamic-context-menu/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["User Interface"]},{"id":"open_linked","schema_version":"1.0.0","name":"Open Linked","version":"1.0.1","tagline":"Open linked blends from the Outliner","archive_hash":"sha256:699f9ce0e8f8cac5fa94fbfa0b7991a3d0511da33dfa84f83d0be7754ecb70c3","archive_size":40897,"archive_url":"https://extensions.blender.org/download/sha256:699f9ce0e8f8cac5fa94fbfa0b7991a3d0511da33dfa84f83d0be7754ecb70c3/add-on-open-linked-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/open-linked/","maintainer":"polygoniq","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Add-on expects to have access to filesytem."},"tags":["User Interface"]},{"id":"theme_CrimsonAttack","schema_version":"1.0.0","name":"Crimson Attack","version":"1.0.0","tagline":"A Red hue'd version of blue invasion","archive_hash":"sha256:c797984cfd094d88741f76100340a6885e11d0d815da2ad8d15676f99f3d620c","archive_size":6231,"archive_url":"https://extensions.blender.org/download/sha256:c797984cfd094d88741f76100340a6885e11d0d815da2ad8d15676f99f3d620c/theme-theme-crimsonattack-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-crimsonattack/","maintainer":"zaq","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Colorful","Inspired By"]},{"id":"mat_helperr","schema_version":"1.0.0","name":"MAT Helper","version":"1.2.1","tagline":"Smart PBR texture importer for UModel .mat & .json exports","archive_hash":"sha256:3386ada34896c54c73e1cffe52a1de9fdedc5a475324ddbcd08b6fa60691b9b6","archive_size":4011,"archive_url":"https://extensions.blender.org/download/sha256:3386ada34896c54c73e1cffe52a1de9fdedc5a475324ddbcd08b6fa60691b9b6/add-on-mat-helperr-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mat-helperr/","maintainer":"maylog","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","Import-Export"]},{"id":"texops","schema_version":"1.0.0","name":"TexOps","version":"1.0.0","tagline":"Texture Conversion, Generation, and Manipulation Operations","archive_hash":"sha256:4cfbd79aabfde50762d0d555d7a795eec480b59333309062828345550d85abc9","archive_size":94059,"archive_url":"https://extensions.blender.org/download/sha256:4cfbd79aabfde50762d0d555d7a795eec480b59333309062828345550d85abc9/add-on-texops-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/texops/","maintainer":"JR3DFUL","license":["SPDX:GPL-3.0-or-later"],"tags":["Paint","Bake","Import-Export","User Interface"]},{"id":"viewport_fps","schema_version":"1.0.0","name":"Viewport FPS","version":"1.0.2","tagline":"Displays frames per second in current 3D viewport","archive_hash":"sha256:842eed9027d319486dd87aa88e48af6ca0a1c3077b9639ddd5f66e0b050f269f","archive_size":3040,"archive_url":"https://extensions.blender.org/download/sha256:842eed9027d319486dd87aa88e48af6ca0a1c3077b9639ddd5f66e0b050f269f/add-on-viewport-fps-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/viewport-fps/","maintainer":"Pazelock","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","User Interface","System"]},{"id":"VibeyTM_Pro","schema_version":"1.0.0","name":"Vibey™ Pro","version":"0.0.1","tagline":"Visually exciting yet fully functional","archive_hash":"sha256:dad4cca29ed2bbf3aa50a4b11551bf7474d3d0b0f8c12be6f1e5f271f448af92","archive_size":18840,"archive_url":"https://extensions.blender.org/download/sha256:dad4cca29ed2bbf3aa50a4b11551bf7474d3d0b0f8c12be6f1e5f271f448af92/theme-vibeytm-pro-v0.0.1.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/vibeytm-pro/","maintainer":"Fedor-Rezhenov","license":["SPDX:GPL-3.0-or-later"]},{"id":"Three_d_Cursor_Snap","schema_version":"1.0.0","name":"Three d Cursor Snap","version":"1.2.0","tagline":"Move 3d cursor like gizmo to snap vertex, edge and face","archive_hash":"sha256:5b7031eb3fdc8b85bb272c2483239741932434b3fe6403fc0eedaa2a64e9ef55","archive_size":3579,"archive_url":"https://extensions.blender.org/download/sha256:5b7031eb3fdc8b85bb272c2483239741932434b3fe6403fc0eedaa2a64e9ef55/add-on-three-d-cursor-snap-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/three-d-cursor-snap/","maintainer":"deepak756","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Modeling","Mesh"]},{"id":"gzm_mod","schema_version":"1.0.0","name":"GZM 3D model format","version":"1.0.3","tagline":"Import-export 3D models for the GZM game","archive_hash":"sha256:49ed3044e575709e90770ead44db7c0b618422dc401841c29cfa80a866462afd","archive_size":556667,"archive_url":"https://extensions.blender.org/download/sha256:49ed3044e575709e90770ead44db7c0b618422dc401841c29cfa80a866462afd/add-on-gzm-mod-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/gzm-mod/","maintainer":"777-tanks","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"batch_camera_render","schema_version":"1.0.0","name":"Batch Render Cameras","version":"1.8.1","tagline":"Render animations from multiple selected cameras","archive_hash":"sha256:434b02361608b8094de3835047e64168b9cea4cb20fac1183bbb67f2cd243036","archive_size":3228,"archive_url":"https://extensions.blender.org/download/sha256:434b02361608b8094de3835047e64168b9cea4cb20fac1183bbb67f2cd243036/add-on-batch-camera-render-v1.8.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/batch-camera-render/","maintainer":"Mahdi.Shalchian","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Create output folders for rendered frames"},"tags":["Render","Camera"]},{"id":"blur_hdri","schema_version":"1.0.0","name":"Blur HDRI","version":"0.0.6","tagline":"Blur HDRI Images by creating a new node with a Gaussian Blur","archive_hash":"sha256:d893a7111221c64c88360aa678326f0ee64fdbbb71fb7e7d98ae20be34edb6d7","archive_size":23644138,"archive_url":"https://extensions.blender.org/download/sha256:d893a7111221c64c88360aa678326f0ee64fdbbb71fb7e7d98ae20be34edb6d7/add-on-blur-hdri-v0.0.6-windows-x64.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/blur-hdri/","maintainer":"Jan-Hendrik-Müller","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Importing data files from disk"},"platforms":["windows-x64"],"tags":["Material","Lighting"]},{"id":"node_editor_pro","schema_version":"1.0.0","name":"Node Editor Pro","version":"0.5.0","tagline":"Organize nodes with auto-layout, snap and cleanup","archive_hash":"sha256:ba6cd0cbb08dcfa05a99680f6c27a29ba090bf795bb057589372e3d9b08c3f7c","archive_size":4809,"archive_url":"https://extensions.blender.org/download/sha256:ba6cd0cbb08dcfa05a99680f6c27a29ba090bf795bb057589372e3d9b08c3f7c/add-on-node-editor-pro-v0.5.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-editor-pro/","maintainer":"the_visual_geek","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","User Interface"]},{"id":"data_scale","schema_version":"1.0.0","name":"ID Tools","version":"1.2.0","tagline":"Assortment of tools for the manipulation of data-blocks","archive_hash":"sha256:6aee14fa7c34487d34a4822ffacc829876382eccf7a8ae6382f84cdc9a61e646","archive_size":22974,"archive_url":"https://extensions.blender.org/download/sha256:6aee14fa7c34487d34a4822ffacc829876382eccf7a8ae6382f84cdc9a61e646/add-on-data-scale-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/data-scale/","maintainer":"hisanimations","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Temporarily create .blend files to weigh them"},"tags":["Import-Export"]},{"id":"anim_offset_pro","schema_version":"1.0.0","name":"Anim Offset Pro","version":"1.3.0","tagline":"Offset poses across animation keyframes","archive_hash":"sha256:dd1d412f81e9e875bfb4c58d445cd64f904953febf61f05417ca0cf86d7c0ecd","archive_size":5091,"archive_url":"https://extensions.blender.org/download/sha256:dd1d412f81e9e875bfb4c58d445cd64f904953febf61f05417ca0cf86d7c0ecd/add-on-anim-offset-pro-v1.3.0.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/anim-offset-pro/","maintainer":"Drika111.","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"dynamic_render_border","schema_version":"1.0.0","name":"Dynamic Render Border","version":"1.0.1","tagline":"Addon to create dynamic render borders for animations","archive_hash":"sha256:b7ad62a75bfeb6066efe981c1afaec3a7e048d134903c2f50e0aea695b184986","archive_size":7352,"archive_url":"https://extensions.blender.org/download/sha256:b7ad62a75bfeb6066efe981c1afaec3a7e048d134903c2f50e0aea695b184986/add-on-dynamic-render-border-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dynamic-render-border/","maintainer":"tobiaskummer","license":["SPDX:GPL-3.0-or-later"],"tags":["Render","Animation"]},{"id":"shapeFitter","schema_version":"1.0.0","name":"Shape Fitter","version":"1.3.0","tagline":"Fit primitive shapes to verticies","archive_hash":"sha256:c99bad96a5f3278319ab9ea0e6a30c727a88ec34392034650c8b58f42d311aee","archive_size":10012,"archive_url":"https://extensions.blender.org/download/sha256:c99bad96a5f3278319ab9ea0e6a30c727a88ec34392034650c8b58f42d311aee/add-on-shapefitter-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shapefitter/","maintainer":"pfalkingham","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh","Object"]},{"id":"trimmer","schema_version":"1.0.0","name":"Trimmer","version":"0.3.0","tagline":"Simplified texturing workflow for trim-sheets","archive_hash":"sha256:fd310ab53bf5e974d603924e68067671b23084859b99f2d6d52e878efb3ddff5","archive_size":12275,"archive_url":"https://extensions.blender.org/download/sha256:fd310ab53bf5e974d603924e68067671b23084859b99f2d6d52e878efb3ddff5/add-on-trimmer-v0.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/trimmer/","maintainer":"LaXHeXLuX","license":["SPDX:GPL-3.0-or-later"],"tags":["UV"]},{"id":"camera_viewer","schema_version":"1.0.0","name":"Camera Viewer","version":"1.1.4","tagline":"You can preview the camera view directly in the 3D viewport","archive_hash":"sha256:9545f50ff8d23fb6a1a6c1b1b0bc3e47f64be484d731091e81b7619a2b56fe79","archive_size":11337,"archive_url":"https://extensions.blender.org/download/sha256:9545f50ff8d23fb6a1a6c1b1b0bc3e47f64be484d731091e81b7619a2b56fe79/add-on-camera-viewer-v1.1.4.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/camera-viewer/","maintainer":"KENKEN","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","User Interface"]},{"id":"polyzamboni","schema_version":"1.0.0","name":"PolyZamboni","version":"1.2.2","tagline":"Papercraft in Blender","archive_hash":"sha256:1ae944f663de2898d1401cede5ca6368b941ee738d647321dc298db32d13871c","archive_size":14292071,"archive_url":"https://extensions.blender.org/download/sha256:1ae944f663de2898d1401cede5ca6368b941ee738d647321dc298db32d13871c/add-on-polyzamboni-v1.2.2-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/polyzamboni/","maintainer":"Anton-Florey","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export PDF/SVG to disk"},"platforms":["windows-x64"],"tags":["3D View","Import-Export"]},{"id":"meshstats","schema_version":"1.0.0","name":"Meshstats","version":"1.3.2","tagline":"Mesh statistics","archive_hash":"sha256:54bbc62131198db4c4c7f3f74276ef835cf8719d3ea57598e8dfac3758652421","archive_size":55105,"archive_url":"https://extensions.blender.org/download/sha256:54bbc62131198db4c4c7f3f74276ef835cf8719d3ea57598e8dfac3758652421/add-on-meshstats-v1.3.2.zip","type":"add-on","blender_version_min":"4.2.2","website":"https://extensions.blender.org/add-ons/meshstats/","maintainer":"muhuk","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"requin_blue_theme","schema_version":"1.0.0","name":"Requin Blue","version":"1.2.0","tagline":"This is a Blender theme with a major blue color","archive_hash":"sha256:f9719297e08b25c93ad28a52aaed35103e3484588373d059096c87514dd7fa42","archive_size":6733,"archive_url":"https://extensions.blender.org/download/sha256:f9719297e08b25c93ad28a52aaed35103e3484588373d059096c87514dd7fa42/theme-requin-blue-theme-v1.2.0.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"6.0.0","website":"https://extensions.blender.org/themes/requin-blue-theme/","maintainer":"MozzarellaARC","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"auto_dark_mode","schema_version":"1.0.0","name":"Auto Dark Mode","version":"3.0.0","tagline":"Automatically follow the system light/dark mode","archive_hash":"sha256:a1e8a5f58f1bbeed52f5afcb6ed5b36c45f1e3642419becf8f6472967963260b","archive_size":11993,"archive_url":"https://extensions.blender.org/download/sha256:a1e8a5f58f1bbeed52f5afcb6ed5b36c45f1e3642419becf8f6472967963260b/add-on-auto-dark-mode-v3.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-dark-mode/","maintainer":"dprice","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read installed themes"},"tags":["System","User Interface"]},{"id":"blue_genes","schema_version":"1.0.0","name":"Blue Genes","version":"1.0.3","tagline":"Dark Blue, Readable Daily Driver","archive_hash":"sha256:dbd30beb266dff2448d87b8e592e1afce7330b5d79ec4c1ef7a4b3c3d1c9e61e","archive_size":5997,"archive_url":"https://extensions.blender.org/download/sha256:dbd30beb266dff2448d87b8e592e1afce7330b5d79ec4c1ef7a4b3c3d1c9e61e/theme-blue-genes-v1.0.3.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/blue-genes/","maintainer":"SpectralVectors","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Colorful"]},{"id":"save_with_versioning","schema_version":"1.0.0","name":"Save with Versioning","version":"2.1.0","tagline":"Save incremental and use published files for asset linking","archive_hash":"sha256:7481617c63e770530f3e37d0d3519eaca1b3cd7589e21ddedc4f26912f50b6ff","archive_size":20710,"archive_url":"https://extensions.blender.org/download/sha256:7481617c63e770530f3e37d0d3519eaca1b3cd7589e21ddedc4f26912f50b6ff/add-on-save-with-versioning-v2.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/save-with-versioning/","maintainer":"DShot92","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save .blend files"},"tags":["Pipeline"]},{"id":"is_key_free","schema_version":"1.0.0","name":"Is key Free","version":"1.1.3","tagline":"Find free shortcuts, inform about used and print a key list","archive_hash":"sha256:68b702bfc895175d2b3dad64880e2249e97b8f461510bf20e9ab6951fcc67d3a","archive_size":5471,"archive_url":"https://extensions.blender.org/download/sha256:68b702bfc895175d2b3dad64880e2249e97b8f461510bf20e9ab6951fcc67d3a/add-on-is-key-free-v1.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/is-key-free/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Development"]},{"id":"node_presets","schema_version":"1.0.0","name":"Node Presets","version":"1.1.0","tagline":"Add node groups directly to the node editors","archive_hash":"sha256:0b875c6c78c02bf6ab79cf82310a587cfc8dfe790aec158102a35dd22f1c8c04","archive_size":2398,"archive_url":"https://extensions.blender.org/download/sha256:0b875c6c78c02bf6ab79cf82310a587cfc8dfe790aec158102a35dd22f1c8c04/add-on-node-presets-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-presets/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Node"]},{"id":"align_tools","schema_version":"1.0.0","name":"Align Tools","version":"0.3.6","tagline":"Align Selected Objects to Active Object","archive_hash":"sha256:741ca75b391bda65d2dc22160b4f594b7d4ed9a8772dd055535b7c2c7eb9b9de","archive_size":6743,"archive_url":"https://extensions.blender.org/download/sha256:741ca75b391bda65d2dc22160b4f594b7d4ed9a8772dd055535b7c2c7eb9b9de/add-on-align-tools-v0.3.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/align-tools/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"archimesh","schema_version":"1.0.0","name":"Archimesh","version":"1.2.5","tagline":"Generate rooms, doors, windows, and other architecture objects","archive_hash":"sha256:44745a86dd472e296e06cd45c511e002a1105512a73009cb0018c87611d18d87","archive_size":323488,"archive_url":"https://extensions.blender.org/download/sha256:44745a86dd472e296e06cd45c511e002a1105512a73009cb0018c87611d18d87/add-on-archimesh-v1.2.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/archimesh/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Add Mesh"]},{"id":"scatter_objects","schema_version":"1.0.0","name":"Scatter Objects","version":"0.2.0","tagline":"Distribute object instances on another object","archive_hash":"sha256:3fda488f56523b799e3937c802119f1da986391e193cb4d443177e6e132c764b","archive_size":6876,"archive_url":"https://extensions.blender.org/download/sha256:3fda488f56523b799e3937c802119f1da986391e193cb4d443177e6e132c764b/add-on-scatter-objects-v0.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/scatter-objects/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Object"]},{"id":"sapling_tree_gen","schema_version":"1.0.0","name":"Sapling Tree Gen","version":"0.3.7","tagline":"Adds a parametric tree","archive_hash":"sha256:27a478262e1c86612a9c3daffe7f4dce2802f5bc2294033462e5adc6d9c0080f","archive_size":36296,"archive_url":"https://extensions.blender.org/download/sha256:27a478262e1c86612a9c3daffe7f4dce2802f5bc2294033462e5adc6d9c0080f/add-on-sapling-tree-gen-v0.3.7.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/sapling-tree-gen/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Curve"]},{"id":"node_group_utilities","schema_version":"1.0.0","name":"Node Group Utilities","version":"2.1.1","tagline":"Extra options and functions for node groups","archive_hash":"sha256:00fcf7000ecc7fc01b96293030269439cc6ef72809f5be80f806b7cb18afa4a5","archive_size":67952,"archive_url":"https://extensions.blender.org/download/sha256:00fcf7000ecc7fc01b96293030269439cc6ef72809f5be80f806b7cb18afa4a5/add-on-node-group-utilities-v2.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-group-utilities/","maintainer":"Baraa-Khaled-Youssef","license":["SPDX:GPL-2.0-or-later"],"tags":["Node","Material"]},{"id":"flatterer","schema_version":"1.0.0","name":"Flatterer","version":"1.6.0","tagline":"Flat mesh to SVG exporter for laser cutters","archive_hash":"sha256:61241ed38f522af0152439c07d8654caf30a67e45f6b5298e8797061460a2559","archive_size":383844,"archive_url":"https://extensions.blender.org/download/sha256:61241ed38f522af0152439c07d8654caf30a67e45f6b5298e8797061460a2559/add-on-flatterer-v1.6.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/flatterer/","maintainer":"dr.sybren","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export SVG files to disk"},"tags":["Import-Export"]},{"id":"bombsquad_tools","schema_version":"1.0.0","name":"BombSquad Tools","version":"3.0.12","tagline":"Tools for creating BombSquad game assets","archive_hash":"sha256:0c5f2f5b01dd02165f9cb72b00f570636d75d62cbeed706bf10f90b4eff5cd00","archive_size":39147,"archive_url":"https://extensions.blender.org/download/sha256:0c5f2f5b01dd02165f9cb72b00f570636d75d62cbeed706bf10f90b4eff5cd00/add-on-bombsquad-tools-v3.0.12.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bombsquad-tools/","maintainer":"aryan02420","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export .bob, .cob, and .json files"},"tags":["Import-Export","Scene"]},{"id":"vertex_group_assistant","schema_version":"1.0.0","name":"Vertex Group Assistant","version":"1.0.2","tagline":"Simplifies clothing rigging for avatars","archive_hash":"sha256:a566528f6aad3e2971e874bad0c48e4094102f23ccb5ae92790b7803055d102c","archive_size":3846,"archive_url":"https://extensions.blender.org/download/sha256:a566528f6aad3e2971e874bad0c48e4094102f23ccb5ae92790b7803055d102c/add-on-vertex-group-assistant-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/vertex-group-assistant/","maintainer":"Maro3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"blender_Run_Scripts_From_Folder","schema_version":"1.0.0","name":"Run Scripts From Folder","version":"0.0.7","tagline":"Execute script from Script Directiories","archive_hash":"sha256:cb458bdebbfcdb64b6a2262ca9fa83f7b23e062f39e305e6b95cc5b81d84cb47","archive_size":2464,"archive_url":"https://extensions.blender.org/download/sha256:cb458bdebbfcdb64b6a2262ca9fa83f7b23e062f39e305e6b95cc5b81d84cb47/add-on-blender-run-scripts-from-folder-v0.0.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blender-run-scripts-from-folder/","maintainer":"Alexander-Bicukow","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read .py files from disk"},"tags":["System"]},{"id":"convert_rotation_mode","schema_version":"1.0.0","name":"Convert Rotation Mode","version":"1.5.1","tagline":"Change rotation mode whilst preserving animation","archive_hash":"sha256:63ecb6db33c6cd21d98609286cfb3a780571cff3e5e8c6acb536cdb783fc3aec","archive_size":23134,"archive_url":"https://extensions.blender.org/download/sha256:63ecb6db33c6cd21d98609286cfb3a780571cff3e5e8c6acb536cdb783fc3aec/add-on-convert-rotation-mode-v1.5.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/convert-rotation-mode/","maintainer":"Lauloque","license":["SPDX:GPL-3.0-or-later"],"permissions":{"clipboard":"Copy and paste bone transforms"},"tags":["Animation","3D View","Bake"]},{"id":"bdvd_SharpBlade","schema_version":"1.0.0","name":"Sharp Blade","version":"5.2.0","tagline":"Easy on the eyes, deep in the blue. Create freely","archive_hash":"sha256:b2b2199a00b52df8ad291b2625da12c478524e19c480cddc8ba04bbc46362e24","archive_size":5892,"archive_url":"https://extensions.blender.org/download/sha256:b2b2199a00b52df8ad291b2625da12c478524e19c480cddc8ba04bbc46362e24/theme-bdvd-sharpblade-v5.2.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/bdvd-sharpblade/","maintainer":"bdvd","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Colorful"]},{"id":"dynamic_brush_menus","schema_version":"1.0.0","name":"Dynamic Brush Menus","version":"1.1.10","tagline":"Fast access to brushes & tools in Sculpt and Paint Modes","archive_hash":"sha256:ee971938173591236df0a08db5ebced525052b70fd0f69dbeae64598622fb400","archive_size":15222,"archive_url":"https://extensions.blender.org/download/sha256:ee971938173591236df0a08db5ebced525052b70fd0f69dbeae64598622fb400/add-on-dynamic-brush-menus-v1.1.10.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dynamic-brush-menus/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["User Interface"]},{"id":"visibility_handler","schema_version":"1.0.0","name":"Visibility handler","version":"1.1.3","tagline":"Copy visibility from viewport to render settings or vice versa","archive_hash":"sha256:44a76b38bbb79f925e0354bc1609856c500f0b1d084a14488516558f2c26219c","archive_size":8680,"archive_url":"https://extensions.blender.org/download/sha256:44a76b38bbb79f925e0354bc1609856c500f0b1d084a14488516558f2c26219c/add-on-visibility-handler-v1.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/visibility-handler/","maintainer":"DanielBystedt","license":["SPDX:GPL-2.0-or-later"],"tags":["Render"]},{"id":"image_sequence_to_mp4_video_converter","schema_version":"1.0.0","name":"Image Sequence to MP4 Video Converter","version":"1.0.3","tagline":"Convert image sequences to MP4 with custom resolution","archive_hash":"sha256:463d624dba76193ecf576cea46f8ea024372178e917036d0252b15fc7154f08d","archive_size":8152,"archive_url":"https://extensions.blender.org/download/sha256:463d624dba76193ecf576cea46f8ea024372178e917036d0252b15fc7154f08d/add-on-image-sequence-to-mp4-video-converter-v1.0.3.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/image-sequence-to-mp4-video-converter/","maintainer":"Prince_Eagle","license":["SPDX:GPL-3.0-or-later"],"tags":["Render"]},{"id":"vertex_group_hierarchy_sorter","schema_version":"1.0.0","name":"Vertex Group Hierarchy Sorter","version":"1.0.4","tagline":"List vertex groups in armature hierarchy order","archive_hash":"sha256:943c36cb19536f4658439ef967455e8ae927620ebcd5421a1b3fe202823258b1","archive_size":15156,"archive_url":"https://extensions.blender.org/download/sha256:943c36cb19536f4658439ef967455e8ae927620ebcd5421a1b3fe202823258b1/add-on-vertex-group-hierarchy-sorter-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/vertex-group-hierarchy-sorter/","maintainer":"Cloud-Guy","license":["SPDX:GPL-3.0-or-later"]},{"id":"expLODe","schema_version":"1.0.0","name":"expLODe","version":"1.0.2","tagline":"LOD automation script using Python and Blender","archive_hash":"sha256:e22b3e3e5986a89f0dc6febba53631b2e527fe759efe5745d3968f2053323c74","archive_size":22275,"archive_url":"https://extensions.blender.org/download/sha256:e22b3e3e5986a89f0dc6febba53631b2e527fe759efe5745d3968f2053323c74/add-on-explode-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/explode/","maintainer":"Rainma22","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export FBX from/to disk"},"tags":["Import-Export"]},{"id":"render_notifications_extension","schema_version":"1.0.0","name":"Render Notifications","version":"1.2.2","tagline":"Notifies you via Discord, desktop, or webhook on render events","archive_hash":"sha256:5ac923b73c553303352a38de784606aefa0580e2fa9002a33e09d956fb12c85e","archive_size":2804206,"archive_url":"https://extensions.blender.org/download/sha256:5ac923b73c553303352a38de784606aefa0580e2fa9002a33e09d956fb12c85e/add-on-render-notifications-extension-v1.2.2-windows-x64.zip","type":"add-on","blender_version_min":"4.3.2","website":"https://extensions.blender.org/add-ons/render-notifications-extension/","maintainer":"JimmyNoStar","license":["SPDX:GPL-3.0-or-later"],"permissions":{"network":"Needed to send notifications via webhooks and Discord"},"platforms":["windows-x64"],"tags":["Render","System"]},{"id":"armature_deform_with_linked_groups","schema_version":"1.0.0","name":"Armature Deform with Linked Groups","version":"1.0.0","tagline":"Create an armature deformation using linked vertices","archive_hash":"sha256:1047c0266831c6a13fad2563b7e4e173338e13905b92be26f9ac48666eabc4b2","archive_size":4824,"archive_url":"https://extensions.blender.org/download/sha256:1047c0266831c6a13fad2563b7e4e173338e13905b92be26f9ac48666eabc4b2/add-on-armature-deform-with-linked-groups-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/armature-deform-with-linked-groups/","maintainer":"Suchaaver","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Animation","Mesh"]},{"id":"LinkageMarkingMenu","schema_version":"1.0.0","name":"Linkage Marking Menu","version":"1.0.5","tagline":"Customizable Marking Menu for Object and Edit modes","archive_hash":"sha256:30ab484d65284197c16c36b34413ebfbb48743700ecf1c39f361e9bb60f6cd4c","archive_size":18953,"archive_url":"https://extensions.blender.org/download/sha256:30ab484d65284197c16c36b34413ebfbb48743700ecf1c39f361e9bb60f6cd4c/add-on-linkagemarkingmenu-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/linkagemarkingmenu/","maintainer":"Linkage","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"eevee_projectors","schema_version":"1.0.0","name":"Eevee Projectors","version":"1.1.1","tagline":"Fake Projector lights in Eeve","archive_hash":"sha256:f43016da2aba44eeb36dbcadee9116495c46721e33580af67fa487ae7305749e","archive_size":285870,"archive_url":"https://extensions.blender.org/download/sha256:f43016da2aba44eeb36dbcadee9116495c46721e33580af67fa487ae7305749e/add-on-eevee-projectors-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/eevee-projectors/","maintainer":"F1dg3t","license":["SPDX:GPL-3.0-or-later"],"tags":["Lighting","Object"]},{"id":"Arma3ObjectBuilder","schema_version":"1.0.0","name":"Arma 3 Object Builder","version":"2.5.1","tagline":"Comprehensive add-on for modding Arma 3","archive_hash":"sha256:9bf51396006c9788afc8072b9d57bb832057cad18022c6bc426211b420396009","archive_size":270830,"archive_url":"https://extensions.blender.org/download/sha256:9bf51396006c9788afc8072b9d57bb832057cad18022c6bc426211b420396009/add-on-arma3objectbuilder-v2.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/arma3objectbuilder/","maintainer":"MrClock","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export operations on supported file formats"},"tags":["Import-Export","Game Engine","Object"]},{"id":"gp_to_curves","schema_version":"1.0.0","name":"Grease Pencil to Curves","version":"0.4.5","tagline":"Quickly convert Grease Pencil strokes to simple curves and hair","archive_hash":"sha256:42d5a745d6c1f48a82610aa686c21ad41e2036bd9f8edd6c71dd0742034f6ad5","archive_size":6977,"archive_url":"https://extensions.blender.org/download/sha256:42d5a745d6c1f48a82610aa686c21ad41e2036bd9f8edd6c71dd0742034f6ad5/add-on-gp-to-curves-v0.4.5.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/gp-to-curves/","maintainer":"DadsCastle","license":["SPDX:GPL-3.0-or-later"],"tags":["Grease Pencil","Add Curve","Modeling"]},{"id":"RigFlex","schema_version":"1.0.0","name":"RigFlex Simple Soft Body Simulation for Armatures","version":"4.2.1","tagline":"Simple Soft Body Simulation for Armatures","archive_hash":"sha256:c225c679634d5872fa6f6baf1e0bf513ececa90e8243cd30747fc825e743b064","archive_size":8750,"archive_url":"https://extensions.blender.org/download/sha256:c225c679634d5872fa6f6baf1e0bf513ececa90e8243cd30747fc825e743b064/add-on-rigflex-v4.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/rigflex/","maintainer":"Nerk","license":["SPDX:GPL-2.0-or-later"],"tags":["Animation","Physics","Rigging"]},{"id":"FavoriteObjects","schema_version":"1.0.0","name":"Favorite Objects","version":"1.0.5","tagline":"Mark your favorite objects and select them from the Viewport","archive_hash":"sha256:88b3d6b72968ba21a2771608335635237bd9bb56338423aab049bd0a9e6e01c6","archive_size":5933,"archive_url":"https://extensions.blender.org/download/sha256:88b3d6b72968ba21a2771608335635237bd9bb56338423aab049bd0a9e6e01c6/add-on-favoriteobjects-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/favoriteobjects/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling"]},{"id":"property_chart","schema_version":"1.0.0","name":"Property Chart","version":"0.1.2","tagline":"Edit properties simultaneously for selected objects/sequencer","archive_hash":"sha256:9239bce660c04eb8a3a4bd5f5bca5f3291fb6ad13cee1cf2cca2386f00cda9ed","archive_size":2959,"archive_url":"https://extensions.blender.org/download/sha256:9239bce660c04eb8a3a4bd5f5bca5f3291fb6ad13cee1cf2cca2386f00cda9ed/add-on-property-chart-v0.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/property-chart/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["System"]},{"id":"randomizer","schema_version":"1.0.0","name":"Material Randomizer Pro","version":"1.10.0","tagline":"Material Randomization Tools","archive_hash":"sha256:8747ea7cad63a28ebba701b426f306ad6fc1bf8c66f7486c222a40120f902d46","archive_size":10795,"archive_url":"https://extensions.blender.org/download/sha256:8747ea7cad63a28ebba701b426f306ad6fc1bf8c66f7486c222a40120f902d46/add-on-randomizer-v1.10.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/randomizer/","maintainer":"lambdawalker","license":["SPDX:GPL-3.0-or-later"]},{"id":"Connecter","schema_version":"1.0.0","name":"Connecter","version":"0.6.20","tagline":"Streamlined Asset Management: Import & Export with Connecter DAM","archive_hash":"sha256:4aac3920620b8a259d6736a7f48668d44dd1a23fb8de2df3be0c51de2b799310","archive_size":392369,"archive_url":"https://extensions.blender.org/download/sha256:4aac3920620b8a259d6736a7f48668d44dd1a23fb8de2df3be0c51de2b799310/add-on-connecter-v0.6.20-windows-x64-windows-arm64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/connecter/","maintainer":"DesignConnected","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export blend files from/to disk"},"platforms":["windows-x64","windows-arm64"],"tags":["Import-Export"]},{"id":"render_multiple_instances","schema_version":"1.0.0","name":"Render Multiple Instances","version":"3.2.1","tagline":"Render animations and Flipbooks faster with multiple instances","archive_hash":"sha256:d4d4a14874541dcbf6cccf740ee21a142e9ae8a5b46bab532ba3822a0cc0c2dc","archive_size":8380,"archive_url":"https://extensions.blender.org/download/sha256:d4d4a14874541dcbf6cccf740ee21a142e9ae8a5b46bab532ba3822a0cc0c2dc/add-on-render-multiple-instances-v3.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/render-multiple-instances/","maintainer":"DShot92","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save and read exports images"},"tags":["Render","Pipeline"]},{"id":"turnaround_camera","schema_version":"1.0.0","name":"Turnaround Camera","version":"0.3.0","tagline":"Add a camera rotation around selected object","archive_hash":"sha256:e9bfadd7d4d9e7dcfde9d0effa1815f9170561a81b63bee549b066c31aa48efa","archive_size":3237,"archive_url":"https://extensions.blender.org/download/sha256:e9bfadd7d4d9e7dcfde9d0effa1815f9170561a81b63bee549b066c31aa48efa/add-on-turnaround-camera-v0.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/turnaround-camera/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Animation"]},{"id":"carver","schema_version":"1.0.0","name":"Carver","version":"1.2.3","tagline":"Multiple tools to carve or to create objects","archive_hash":"sha256:4c0b7c0c2906e09ee96fd2d5bb0d36f0be439a41f6f222ae48f38c317262ac3b","archive_size":29032,"archive_url":"https://extensions.blender.org/download/sha256:4c0b7c0c2906e09ee96fd2d5bb0d36f0be439a41f6f222ae48f38c317262ac3b/add-on-carver-v1.2.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/carver/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"armature_to_mesh","schema_version":"1.0.0","name":"Armature to Mesh","version":"1.0.1","tagline":"Convert armature bones to a mesh","archive_hash":"sha256:b04fd6cb484cb6dc854c7487ddd33fea3959f36a4e309cad2a9f0c02a58c98c5","archive_size":4401,"archive_url":"https://extensions.blender.org/download/sha256:b04fd6cb484cb6dc854c7487ddd33fea3959f36a4e309cad2a9f0c02a58c98c5/add-on-armature-to-mesh-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/armature-to-mesh/","maintainer":"SamRog94","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Rigging"]},{"id":"Dark_Chocolate_Theme","schema_version":"1.0.0","name":"Dark_Chocolate_Theme","version":"1.0.2","tagline":"Mellow Sombre","archive_hash":"sha256:aaf94d2e18556d5043b12f476401a875badf0ad139551f3b92703529af2defb7","archive_size":5684,"archive_url":"https://extensions.blender.org/download/sha256:aaf94d2e18556d5043b12f476401a875badf0ad139551f3b92703529af2defb7/theme-dark-chocolate-theme-v1.0.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/dark-chocolate-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"dynamic_color_palette","schema_version":"1.0.0","name":"Dynamic Color Palette","version":"2.0.7","tagline":"Generate palette textures and assign colors via UV lookup","archive_hash":"sha256:7824202f96097081a0180dcb468e5f1a1a05d0ba66bc4c7308d567dc4453ee1f","archive_size":58478,"archive_url":"https://extensions.blender.org/download/sha256:7824202f96097081a0180dcb468e5f1a1a05d0ba66bc4c7308d567dc4453ee1f/add-on-dynamic-color-palette-v2.0.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dynamic-color-palette/","maintainer":"fwdotcom","license":["SPDX:GPL-3.0-or-later"]},{"id":"blender2ue_rig_exporter","schema_version":"1.0.0","name":"Rig UE5 Exporter","version":"0.0.3","tagline":"Export rig to UE5","archive_hash":"sha256:27f0d4a4c359a53af0d2887d8ed485dbb8016f2a70a420af46dc30b461a3f533","archive_size":50459,"archive_url":"https://extensions.blender.org/download/sha256:27f0d4a4c359a53af0d2887d8ed485dbb8016f2a70a420af46dc30b461a3f533/add-on-blender2ue-rig-exporter-v0.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blender2ue-rig-exporter/","maintainer":"Wiffzackius","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export STL, PLY, OBJ files"},"tags":["Import-Export"]},{"id":"cut_sym","schema_version":"1.0.0","name":"Cut Sym","version":"0.0.3","tagline":"Symmetrically cut mesh objects into two halves","archive_hash":"sha256:e7d6c45ec0e1b64bc1befa7bd9cc9ec57d3e9c6e9113f1b15760fd897d63b593","archive_size":5150,"archive_url":"https://extensions.blender.org/download/sha256:e7d6c45ec0e1b64bc1befa7bd9cc9ec57d3e9c6e9113f1b15760fd897d63b593/add-on-cut-sym-v0.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cut-sym/","maintainer":"Wiffzackius","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"max","schema_version":"1.0.0","name":"Max","version":"1.0.0","tagline":"Theme inspired by Max","archive_hash":"sha256:f62edb2ecc200f93bc0eee27b851c0e7ed4d4ad2b43a49e86e7fd1e5f8bbf654","archive_size":5445,"archive_url":"https://extensions.blender.org/download/sha256:f62edb2ecc200f93bc0eee27b851c0e7ed4d4ad2b43a49e86e7fd1e5f8bbf654/theme-max-v1.0.0.zip","type":"theme","blender_version_min":"4.5.0","website":"https://extensions.blender.org/themes/max/","maintainer":"Dabidzhi","license":["SPDX:GPL-3.0-or-later"],"tags":["Inspired By","Dark"]},{"id":"nuke_camera_exporter","schema_version":"1.0.0","name":"Export to Nuke Script","version":"1.0.0","tagline":"Export cameras and empties to Nuke with exact matrix data","archive_hash":"sha256:aff488b5d0e3af9424f25247e187a46095f282a1b81004209d2c1c06a1c1754e","archive_size":2631,"archive_url":"https://extensions.blender.org/download/sha256:aff488b5d0e3af9424f25247e187a46095f282a1b81004209d2c1c06a1c1754e/add-on-nuke-camera-exporter-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nuke-camera-exporter/","maintainer":"Vicky_at_24fps","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"transform_tools_core_yiws","schema_version":"1.0.0","name":"Transform Tools Core","version":"0.9.7","tagline":"Advanced gizmo control & precision transformations for Blender","archive_hash":"sha256:b3df6889d59994f6562bc421f5be6b263fb3d9d2f6057cbd4aa92457a9b12a58","archive_size":23454,"archive_url":"https://extensions.blender.org/download/sha256:b3df6889d59994f6562bc421f5be6b263fb3d9d2f6057cbd4aa92457a9b12a58/add-on-transform-tools-core-yiws-v0.9.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/transform-tools-core-yiws/","maintainer":"yasser-idris","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"clamp_psx_dark","schema_version":"1.0.0","name":"Clamp PSX Dark","version":"1.0.0","tagline":"Retro PlayStation inspired dark theme for Blender 4.5","archive_hash":"sha256:49284abe0ed2ccfdfb9309386b7cfc2e33f644ca01b28939ccdf578b0be09fd3","archive_size":5757,"archive_url":"https://extensions.blender.org/download/sha256:49284abe0ed2ccfdfb9309386b7cfc2e33f644ca01b28939ccdf578b0be09fd3/theme-clamp-psx-dark-v1.0.0.zip","type":"theme","blender_version_min":"4.5.0","website":"https://extensions.blender.org/themes/clamp-psx-dark/","maintainer":"Gadzhimuslimov-Kamil-R","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"show_curve_length","schema_version":"1.0.0","name":"Show Curve Length","version":"1.0.0","tagline":"Shows the length of Curve Splines","archive_hash":"sha256:2c47eb86236963878ade7320ddeed43a7ba2939a77b4676f960b0752956ebe45","archive_size":8644,"archive_url":"https://extensions.blender.org/download/sha256:2c47eb86236963878ade7320ddeed43a7ba2939a77b4676f960b0752956ebe45/add-on-show-curve-length-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/show-curve-length/","maintainer":"Giambattista-Caltabiano","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"psx_theme","schema_version":"1.0.0","name":"PS1 Classic","version":"2.0.2","tagline":"Retro PlayStation 1 inspired Blender theme","archive_hash":"sha256:7fa72c88d46ca2e952e8bd6aade1ed34e91b4d163ede5e6132337759ff716496","archive_size":5909,"archive_url":"https://extensions.blender.org/download/sha256:7fa72c88d46ca2e952e8bd6aade1ed34e91b4d163ede5e6132337759ff716496/theme-psx-theme-v2.0.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/psx-theme/","maintainer":"Fawkek","license":["SPDX:GPL-2.0-or-later"],"tags":["Light","Inspired By","Colorful"]},{"id":"pro_3d_dimension_tool","schema_version":"1.0.0","name":"Pro 3D Dimension Tool","version":"1.4.1","tagline":"Professional 3D dimensioning tool for Blender","archive_hash":"sha256:50647875cc65f7c5b8a19e4628bbdf433414d4955326b2faafdf43c05b0440f5","archive_size":22336,"archive_url":"https://extensions.blender.org/download/sha256:50647875cc65f7c5b8a19e4628bbdf433414d4955326b2faafdf43c05b0440f5/add-on-pro-3d-dimension-tool-v1.4.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pro-3d-dimension-tool/","maintainer":"DUONG-HOANG","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Modeling"]},{"id":"depotkit","schema_version":"1.0.0","name":"DepotKit","version":"2.0.0","tagline":"Collect & organise all external assets in your .blend file","archive_hash":"sha256:1f393895e26b435763fc0e5071679f4834cc912a280560174506daa55d62253f","archive_size":8223,"archive_url":"https://extensions.blender.org/download/sha256:1f393895e26b435763fc0e5071679f4834cc912a280560174506daa55d62253f/add-on-depotkit-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/depotkit/","maintainer":"BHiMAX","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Reads and writes texture files from disk"}},{"id":"io_mesh_threejs_objectloader","schema_version":"1.0.0","name":"three.js ObjectLoader","version":"1.0.1","tagline":"Import/Export three.js ObjectLoader JSON format 4+","archive_hash":"sha256:e0be2eff5d961f6095c52a3cabcde4b9f2bce0185c0126055e858310b89fd909","archive_size":12558,"archive_url":"https://extensions.blender.org/download/sha256:e0be2eff5d961f6095c52a3cabcde4b9f2bce0185c0126055e858310b89fd909/add-on-io-mesh-threejs-objectloader-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-mesh-threejs-objectloader/","maintainer":"crwde","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import and export JSON files to disk"},"tags":["Import-Export"]},{"id":"Studio_Mid","schema_version":"1.0.0","name":"Studio Mid","version":"2.3.1","tagline":"Consistent UI, sharp colors, comfortable contrast, 3 birght lvls","archive_hash":"sha256:d18a3ebf27049a93385053c515e81ce6916c98f45ec25c52f91f42b13ac4b296","archive_size":5463,"archive_url":"https://extensions.blender.org/download/sha256:d18a3ebf27049a93385053c515e81ce6916c98f45ec25c52f91f42b13ac4b296/theme-studio-mid-v2.3.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/studio-mid/","maintainer":"3DDinosaur","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"Studio_Light","schema_version":"1.0.0","name":"Studio Light","version":"2.3.1","tagline":"Consistent UI, sharp colors, comfortable contrast, 3 birght lvls","archive_hash":"sha256:f798ba1ae93c58d0ab0767c6efafcad4bdc4cd322761af3d3a6df93c0615f272","archive_size":5456,"archive_url":"https://extensions.blender.org/download/sha256:f798ba1ae93c58d0ab0767c6efafcad4bdc4cd322761af3d3a6df93c0615f272/theme-studio-light-v2.3.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/studio-light/","maintainer":"3DDinosaur","license":["SPDX:GPL-2.0-or-later"],"tags":["Light"]},{"id":"separate_by_collision","schema_version":"1.0.0","name":"Separate by Collision","version":"1.1.1","tagline":"Separate by loose parts, but parts are joined if they collide","archive_hash":"sha256:37e2bfdda0594f88a2fdd0d63ccf956e83279d6c63a2a9f41283014f5dbbd2c4","archive_size":7932,"archive_url":"https://extensions.blender.org/download/sha256:37e2bfdda0594f88a2fdd0d63ccf956e83279d6c63a2a9f41283014f5dbbd2c4/add-on-separate-by-collision-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/separate-by-collision/","maintainer":"Hattiffnat","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"texture_manager","schema_version":"1.0.0","name":"Texture File Path Editor","version":"2.0.0","tagline":"Manage, relink, gather and inspect all texture paths","archive_hash":"sha256:360a7361316d393bd1b27884693e83dc058a8dad0e73ad7759a9f3ddebccdef6","archive_size":8447,"archive_url":"https://extensions.blender.org/download/sha256:360a7361316d393bd1b27884693e83dc058a8dad0e73ad7759a9f3ddebccdef6/add-on-texture-manager-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/texture-manager/","maintainer":"BHiMAX","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Reads and writes texture files from disk"}},{"id":"pbr_lookdev","schema_version":"1.0.0","name":"PBR Lookdev","version":"4.1.0","tagline":"Layered PBR materials with masks, overlays and UDIM","archive_hash":"sha256:608cb8db43eefe76d406d3e50226e83ef4dd07dc5445ed0303ab7b2ac33f136c","archive_size":29427,"archive_url":"https://extensions.blender.org/download/sha256:608cb8db43eefe76d406d3e50226e83ef4dd07dc5445ed0303ab7b2ac33f136c/add-on-pbr-lookdev-v4.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pbr-lookdev/","maintainer":"BHiMAX","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Texture path scanning and image loading"},"tags":["Material","Node","Render"]},{"id":"smart_mesh_cleaner_pro","schema_version":"1.0.0","name":"Smart Mesh Cleaner Pro","version":"3.5.1","tagline":"Professional cleanup tool with Smart Trash Bin & Restore","archive_hash":"sha256:394046bce0e5bd2704912578dafd9aa6f988c7a752908f6b6e0e56706f870567","archive_size":7537,"archive_url":"https://extensions.blender.org/download/sha256:394046bce0e5bd2704912578dafd9aa6f988c7a752908f6b6e0e56706f870567/add-on-smart-mesh-cleaner-pro-v3.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/smart-mesh-cleaner-pro/","maintainer":"Igor-Garcia","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Scene"]},{"id":"Zbrush","schema_version":"1.0.0","name":"Zbrush","version":"1.0.0","tagline":"A Zbrush theme for Blender","archive_hash":"sha256:0c37a691759dbe938203acf0f09d372225b4daf7dac25389fbae27d0ba240fbb","archive_size":5659,"archive_url":"https://extensions.blender.org/download/sha256:0c37a691759dbe938203acf0f09d372225b4daf7dac25389fbae27d0ba240fbb/theme-zbrush-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/zbrush/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"nodot_names","schema_version":"1.0.0","name":"NoDot Names","version":"2.0.2","tagline":"Naming conventions, presets, validation","archive_hash":"sha256:2662bb0f9bd2380590683fae7db38935fc601c4c1beb0e543d1fd04ea154a192","archive_size":27903,"archive_url":"https://extensions.blender.org/download/sha256:2662bb0f9bd2380590683fae7db38935fc601c4c1beb0e543d1fd04ea154a192/add-on-nodot-names-v2.0.2.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/nodot-names/","maintainer":"Jordan-Moss","license":["SPDX:GPL-3.0-or-later"],"tags":["Pipeline","Scene","Object"]},{"id":"gray_core_master_Wana","schema_version":"1.0.0","name":"灰核主控 (Gray Core Master)","version":"1.0.0","tagline":"gray dark theme for Blender","archive_hash":"sha256:98c1732221b159820e50556a191b5fae7dae004c3b4108aa24f501a68c7d2f1f","archive_size":6960,"archive_url":"https://extensions.blender.org/download/sha256:98c1732221b159820e50556a191b5fae7dae004c3b4108aa24f501a68c7d2f1f/theme-gray-core-master-wana-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/gray-core-master-wana/","maintainer":"WA-w","license":["SPDX:GPL-3.0-or-later"]},{"id":"uvo_overlays","schema_version":"1.0.0","name":"UVO","version":"1.1.0","tagline":"Dynamic overlays for the UV Editor","archive_hash":"sha256:84b3881e1f31acbbb52104b3beed19a87da5c086e24fac27a12a06ee94a8896c","archive_size":49202,"archive_url":"https://extensions.blender.org/download/sha256:84b3881e1f31acbbb52104b3beed19a87da5c086e24fac27a12a06ee94a8896c/add-on-uvo-overlays-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/uvo-overlays/","maintainer":"Dmytro-Zuievskyi","license":["SPDX:GPL-3.0-or-later"],"tags":["UV","Modeling"]},{"id":"xbox_controller_camera","schema_version":"1.0.0","name":"Xbox Controller Camera","version":"1.0.0","tagline":"Control the 3D viewport camera with an Xbox controller","archive_hash":"sha256:aedc77bf7fab0aeedfdd1fa5f89371b5a116e41d8e8f31b50cadce389f43a458","archive_size":7872,"archive_url":"https://extensions.blender.org/download/sha256:aedc77bf7fab0aeedfdd1fa5f89371b5a116e41d8e8f31b50cadce389f43a458/add-on-xbox-controller-camera-v1.0.0-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/xbox-controller-camera/","maintainer":"marie.marthenorman","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["3D View","Camera"]},{"id":"latex_text_generator","schema_version":"1.0.0","name":"LaTeX Text Generator","version":"1.0.1","tagline":"Generate customizable 3D text from LaTeX notation","archive_hash":"sha256:ece0a47d4fbf9975f973d51aa619095547a0d941b686393df880846ee7d9a039","archive_size":860703,"archive_url":"https://extensions.blender.org/download/sha256:ece0a47d4fbf9975f973d51aa619095547a0d941b686393df880846ee7d9a039/add-on-latex-text-generator-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/latex-text-generator/","maintainer":"katterkie","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import custom font files from disk"},"tags":["Add Curve"]},{"id":"arkit_blendshape_tools","schema_version":"1.0.0","name":"ARKit Blendshape Helper","version":"0.7.5","tagline":"Facilitate the process of working with ARKit blendshapes","archive_hash":"sha256:22564818659cfcbf43e77aaf7628d57c51c090ffcef98b9d44bd18b9e601ee1e","archive_size":6171,"archive_url":"https://extensions.blender.org/download/sha256:22564818659cfcbf43e77aaf7628d57c51c090ffcef98b9d44bd18b9e601ee1e/add-on-arkit-blendshape-tools-v0.7.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/arkit-blendshape-tools/","maintainer":"SummonAngelus","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"sculpting_planar_clo","schema_version":"1.0.0","name":"Sculpting Planar","version":"1.0.2","tagline":"Classic Planar (Scrape/Fill Brush)","archive_hash":"sha256:327153b4d50409c6e546d17768728886881260cdcfa08e0df8999850eeadb280","archive_size":7448,"archive_url":"https://extensions.blender.org/download/sha256:327153b4d50409c6e546d17768728886881260cdcfa08e0df8999850eeadb280/add-on-sculpting-planar-clo-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sculpting-planar-clo/","maintainer":"clo1to5","license":["SPDX:GPL-3.0-or-later"]},{"id":"batch_exporter","schema_version":"1.0.0","name":"Monty Batch Exporter","version":"1.0.0","tagline":"Batch-export objects, collections, or scenes as individual files","archive_hash":"sha256:5260d4eb47b59d16ce96e69865e79c701a64226fff8b27d699876a2083a47823","archive_size":20852,"archive_url":"https://extensions.blender.org/download/sha256:5260d4eb47b59d16ce96e69865e79c701a64226fff8b27d699876a2083a47823/add-on-batch-exporter-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/batch-exporter/","maintainer":"Diego-Montufar-Perez","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export files to disk"},"tags":["Import-Export","Pipeline"]},{"id":"AE_Flow_Dark","schema_version":"1.0.0","name":"AE_Flow_Dark","version":"1.0.0","tagline":"Dark Mood, 4thegoat","archive_hash":"sha256:d1c93ecd7eca84ba9cf379de2ffc7505e79d94f2f2018c7da7e128a4a6e5c6b1","archive_size":5775,"archive_url":"https://extensions.blender.org/download/sha256:d1c93ecd7eca84ba9cf379de2ffc7505e79d94f2f2018c7da7e128a4a6e5c6b1/theme-ae-flow-dark-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/ae-flow-dark/","maintainer":"Nois3G4te","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"propgon_uv_trim","schema_version":"1.0.0","name":"PropGon UV Trim","version":"2.1.3","tagline":"UV Trimsheet tools for layout, fitting and texel density","archive_hash":"sha256:3b413ab655498a4615f2dc8c9651f2514d67bbe072f7d4c8ae24f32bdc7ec3f1","archive_size":43502,"archive_url":"https://extensions.blender.org/download/sha256:3b413ab655498a4615f2dc8c9651f2514d67bbe072f7d4c8ae24f32bdc7ec3f1/add-on-propgon-uv-trim-v2.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/propgon-uv-trim/","maintainer":"PropGon","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save and load TrimSheet presets and ID maps to disk"},"tags":["UV","Mesh"]},{"id":"goblend","schema_version":"1.0.0","name":"Goblend: Export to Godot","version":"2.0.2","tagline":"Highly customizable export of complex scenes to Godot","archive_hash":"sha256:a8d0b6a04b5d2ae2d2c2f8325bd323b24a4c719a53afb243f4e608ed39a10893","archive_size":92571,"archive_url":"https://extensions.blender.org/download/sha256:a8d0b6a04b5d2ae2d2c2f8325bd323b24a4c719a53afb243f4e608ed39a10893/add-on-goblend-v2.0.2.zip","type":"add-on","blender_version_min":"4.5.7","website":"https://extensions.blender.org/add-ons/goblend/","maintainer":"Togira","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export gltf, read Godot scene files, create textures"},"tags":["Game Engine","Import-Export"]},{"id":"image_dimensions_viewer","schema_version":"1.0.0","name":"Image Dimensions Viewer","version":"1.0.0","tagline":"Displays image dimensions in Node and Image Editors","archive_hash":"sha256:73f178f668da9da03c70738cdf09c249114e06f33c37bba37bfe8395130f15db","archive_size":4894,"archive_url":"https://extensions.blender.org/download/sha256:73f178f668da9da03c70738cdf09c249114e06f33c37bba37bfe8395130f15db/add-on-image-dimensions-viewer-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/image-dimensions-viewer/","maintainer":"Pazelock","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"Blender_Darker","schema_version":"1.0.0","name":"Darker","version":"1.0.1","tagline":"Blender Dark but well... darker","archive_hash":"sha256:5e356f36b12f0398c67cb3afc93a86d616e23d28f8c703f43e876f6f33c29107","archive_size":5572,"archive_url":"https://extensions.blender.org/download/sha256:5e356f36b12f0398c67cb3afc93a86d616e23d28f8c703f43e876f6f33c29107/theme-blender-darker-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/blender-darker/","maintainer":"FlorianW","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","High Contrast"]},{"id":"dynamic_rig_ui","schema_version":"1.0.0","name":"Dynamic Rig UI","version":"1.0.1","tagline":"Dynamic Rig UI driven by bone collections and custom properties","archive_hash":"sha256:688fae94a0b2cfb8c55da4f0208f0aaa8c2d1d926e437c5334b0ef8df3dc39f7","archive_size":33793,"archive_url":"https://extensions.blender.org/download/sha256:688fae94a0b2cfb8c55da4f0208f0aaa8c2d1d926e437c5334b0ef8df3dc39f7/add-on-dynamic-rig-ui-v1.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/dynamic-rig-ui/","maintainer":"Samy_Rodriguez","license":["SPDX:GPL-3.0-or-later"]},{"id":"auto_paint_boundaries","schema_version":"1.0.0","name":"Auto Paint Boundaries","version":"1.1.1","tagline":"Paint cleanly inside smart, selection-limited regions","archive_hash":"sha256:5db1c2668d80db2e149ac3dd75fc2d15b7a6603e2da184468bd3588f29edb496","archive_size":14645,"archive_url":"https://extensions.blender.org/download/sha256:5db1c2668d80db2e149ac3dd75fc2d15b7a6603e2da184468bd3588f29edb496/add-on-auto-paint-boundaries-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-paint-boundaries/","maintainer":"Clonephaze","license":["SPDX:GPL-3.0-or-later"],"tags":["Paint"]},{"id":"BRVLayers","schema_version":"1.0.0","name":"Batch Render View Layers","version":"1.2.3","tagline":"Batch Render View Layers","archive_hash":"sha256:63187cc826a44655a1f20a4647aacf7c6967bf7007b91ceeb7291725dff35f17","archive_size":4335,"archive_url":"https://extensions.blender.org/download/sha256:63187cc826a44655a1f20a4647aacf7c6967bf7007b91ceeb7291725dff35f17/add-on-brvlayers-v1.2.3.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/brvlayers/","maintainer":"chenkin123","license":["SPDX:GPL-3.0-or-later"],"tags":["Render"]},{"id":"sprocket_tools","schema_version":"1.0.0","name":"Sprocket Tools","version":"1.0.2","tagline":"Import and export Sprocket tank blueprints","archive_hash":"sha256:ede8a6a611179c585c1ad09cf5240fb1ea1cda37ecc994ce2c9817ef73f2758b","archive_size":392332,"archive_url":"https://extensions.blender.org/download/sha256:ede8a6a611179c585c1ad09cf5240fb1ea1cda37ecc994ce2c9817ef73f2758b/add-on-sprocket-tools-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sprocket-tools/","maintainer":"Brian-Marshall","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Required to import/export Sprocket blueprint data"},"tags":["Game Engine","Import-Export"]},{"id":"isometric_scene_setup","schema_version":"1.0.0","name":"Isometric Scene Setup","version":"1.0.1","tagline":"Isometric scene setup and 2D normal map rendering","archive_hash":"sha256:1e9dea02be61e0e956e7686afab62bd16494e620ace389f495cb7de2934bdda4","archive_size":5255,"archive_url":"https://extensions.blender.org/download/sha256:1e9dea02be61e0e956e7686afab62bd16494e620ace389f495cb7de2934bdda4/add-on-isometric-scene-setup-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/isometric-scene-setup/","maintainer":"RafaelPasquay","license":["SPDX:GPL-3.0-or-later","SPDX:MIT"],"tags":["Camera","Render","Scene"]},{"id":"gruvbox_green_theme","schema_version":"1.0.0","name":"Gruvbox Green Theme","version":"1.0.1","tagline":"A gruvbox theme that is using aqua / green as the primary color","archive_hash":"sha256:f557ec7c47635202c1a700091f1c35cb931aff8f7c5791200d988f9f3a30e85e","archive_size":6478,"archive_url":"https://extensions.blender.org/download/sha256:f557ec7c47635202c1a700091f1c35cb931aff8f7c5791200d988f9f3a30e85e/theme-gruvbox-green-theme-v1.0.1.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/gruvbox-green-theme/","maintainer":"Edin-Spiegel","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"batch_texture_converter","schema_version":"1.0.0","name":"Batch Texture Converter","version":"1.1.0","tagline":"Bulk texture conversion with color space and alpha splitting","archive_hash":"sha256:93fd5b7addd7d32213938f448fafd1bbc342f27c6eba53f55104ce79dbe2080a","archive_size":4400,"archive_url":"https://extensions.blender.org/download/sha256:93fd5b7addd7d32213938f448fafd1bbc342f27c6eba53f55104ce79dbe2080a/add-on-batch-texture-converter-v1.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/batch-texture-converter/","maintainer":"maylog","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and write local files"},"tags":["Import-Export"]},{"id":"stmap_exporter","schema_version":"1.0.0","name":"STMap Exporter","version":"1.1.0","tagline":"STMap Exporter for All Distortion Models","archive_hash":"sha256:19b8aaa06074c695d069c27288c0703b4f8d6be6046d4a4e663bcb18d94c4a61","archive_size":8942,"archive_url":"https://extensions.blender.org/download/sha256:19b8aaa06074c695d069c27288c0703b4f8d6be6046d4a4e663bcb18d94c4a61/add-on-stmap-exporter-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/stmap-exporter/","maintainer":"K_Naoki","license":["SPDX:GPL-3.0-or-later"],"tags":["Tracking","Import-Export"]},{"id":"softviz_pro","schema_version":"1.0.0","name":"SoftViz Pro","version":"1.2.0","tagline":"GPU-accelerated heatmap visualizer for Proportional Editing","archive_hash":"sha256:3f84cef289f013863d16b9a80df390e0c24b5b9deb9c094e6f1749bbc9d946f9","archive_size":5456,"archive_url":"https://extensions.blender.org/download/sha256:3f84cef289f013863d16b9a80df390e0c24b5b9deb9c094e6f1749bbc9d946f9/add-on-softviz-pro-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/softviz-pro/","maintainer":"Niels-Couvreur","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","3D View"]},{"id":"script_launcher","schema_version":"1.0.0","name":"Script Launcher","version":"1.2.0","tagline":"Manage and run Python scripts from multiple root folders","archive_hash":"sha256:91ef1b99bb67b6e65ed5dea7b2c9a7799fe6423b951bc4214c27357156ad4bce","archive_size":8018,"archive_url":"https://extensions.blender.org/download/sha256:91ef1b99bb67b6e65ed5dea7b2c9a7799fe6423b951bc4214c27357156ad4bce/add-on-script-launcher-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/script-launcher/","maintainer":"a2d4f3s1","license":["SPDX:GPL-3.0-or-later"],"tags":["Development","Pipeline"]},{"id":"momentum","schema_version":"1.0.0","name":"Momentum","version":"1.0.1","tagline":"quickly add configurable follow-through to animations","archive_hash":"sha256:1d8f3e962baabeb2f028ae92952bc9f3fbffc0c390c2889859534dab616f7383","archive_size":16133,"archive_url":"https://extensions.blender.org/download/sha256:1d8f3e962baabeb2f028ae92952bc9f3fbffc0c390c2889859534dab616f7383/add-on-momentum-v1.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/momentum/","maintainer":"Isaac-Burke","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"lily_lime_theme","schema_version":"1.0.0","name":"LiLy Lime","version":"1.0.0","tagline":"A fresh LiLy Lime-inspired light theme for Blender","archive_hash":"sha256:64af2baa0f398da24c045d1e33265dfcc174fc2e2df0c23dbbdfb10e331829bb","archive_size":9509,"archive_url":"https://extensions.blender.org/download/sha256:64af2baa0f398da24c045d1e33265dfcc174fc2e2df0c23dbbdfb10e331829bb/theme-lily-lime-theme-v1.0.0.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/lily-lime-theme/","maintainer":"Eridanus-Epsilon","license":["SPDX:MIT"],"tags":["Light","Colorful","Inspired By"]},{"id":"Solemn_Theme","schema_version":"1.0.0","name":"Solemn","version":"1.0.2","tagline":"A clean and dark theme","archive_hash":"sha256:0f7caef8efb90ffae3d103e127069a34b9e6672847248c06aaf86114aa24578f","archive_size":6767,"archive_url":"https://extensions.blender.org/download/sha256:0f7caef8efb90ffae3d103e127069a34b9e6672847248c06aaf86114aa24578f/theme-solemn-theme-v1.0.2.zip","type":"theme","blender_version_min":"5.0.1","website":"https://extensions.blender.org/themes/solemn-theme/","maintainer":"czod","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"Dark_Max_Pro","schema_version":"1.0.0","name":"Dark Max Pro","version":"1.0.0","tagline":"Pro Dark Max","archive_hash":"sha256:fbdab60a32fc45ac3a8de80366bea7dd8fb2903d315daf9714e496f7516f3f6e","archive_size":5433,"archive_url":"https://extensions.blender.org/download/sha256:fbdab60a32fc45ac3a8de80366bea7dd8fb2903d315daf9714e496f7516f3f6e/theme-dark-max-pro-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/dark-max-pro/","maintainer":"PedroAmorim","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"gp_select","schema_version":"1.0.0","name":"Gp Select","version":"1.6.0","tagline":"Grease Pencil,Weight/Rig,reorder,Rename,lock,Duplicate,Mask,Hide","archive_hash":"sha256:26f089f73598f43f4958940565d9f658804ef84cdffc0425532a3c95a459e446","archive_size":26430,"archive_url":"https://extensions.blender.org/download/sha256:26f089f73598f43f4958940565d9f658804ef84cdffc0425532a3c95a459e446/add-on-gp-select-v1.6.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/gp-select/","maintainer":"HissatsuClaw","license":["SPDX:GPL-3.0-or-later"],"tags":["Grease Pencil","Rigging"]},{"id":"stop_motion_style_animator","schema_version":"1.0.0","name":"Stop Motion Animator","version":"0.3.1","tagline":"Convert animations into stop-motion style","archive_hash":"sha256:264e8e39a2015709778e8c3fbb8c70585aabd438ee9737b9df538d1f9ad24917","archive_size":3004,"archive_url":"https://extensions.blender.org/download/sha256:264e8e39a2015709778e8c3fbb8c70585aabd438ee9737b9df538d1f9ad24917/add-on-stop-motion-style-animator-v0.3.1.zip","type":"add-on","blender_version_min":"5.0.0","blender_version_max":"5.2.0","website":"https://extensions.blender.org/add-ons/stop-motion-style-animator/","maintainer":"Copperhead","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"object_reporter","schema_version":"1.0.0","name":"Object Reporter","version":"2.4.5","tagline":"Report, edit, select and export objects by custom properties","archive_hash":"sha256:7691ac2222aebcc83143312b391bb43f44683972a68d6216a69b50d4eef7adfa","archive_size":71155,"archive_url":"https://extensions.blender.org/download/sha256:7691ac2222aebcc83143312b391bb43f44683972a68d6216a69b50d4eef7adfa/add-on-object-reporter-v2.4.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/object-reporter/","maintainer":"Justinas-Dudenas","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export object property reports to CSV files on disk"},"tags":["Object"]},{"id":"frame_range_renderer","schema_version":"1.0.0","name":"Frame Range Renderer","version":"1.0.0","tagline":"Render specific frames or frame ranges from the Output panel","archive_hash":"sha256:36b5912e8efd5943a737161e6076a0fc4c5dd0aa949bb60850dd6d1e45d2da53","archive_size":8126,"archive_url":"https://extensions.blender.org/download/sha256:36b5912e8efd5943a737161e6076a0fc4c5dd0aa949bb60850dd6d1e45d2da53/add-on-frame-range-renderer-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/frame-range-renderer/","maintainer":"AndreasResch","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Writes output images to disk"}},{"id":"soleshapper","schema_version":"1.0.0","name":"SoleShapper","version":"2.0.1","tagline":"Procedural shoe sole designer with noise deformation","archive_hash":"sha256:3724521212c5bf026c78f3dccef1cee697355dceac3847de85350f9cdf8d3ae7","archive_size":23584,"archive_url":"https://extensions.blender.org/download/sha256:3724521212c5bf026c78f3dccef1cee697355dceac3847de85350f9cdf8d3ae7/add-on-soleshapper-v2.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/soleshapper/","maintainer":"David-Orrick","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import OBJ meshes and export STL or OBJ"},"tags":["Add Mesh"]},{"id":"edge_length_measure","schema_version":"1.0.0","name":"Edge Length Measure","version":"1.0.0","tagline":"Measure mesh edge lengths in Object Mode","archive_hash":"sha256:1fb1319bf07728a6c8cd4478f28a8ebb03072f0f2f10a2f7392c8586bfb73a0e","archive_size":16761,"archive_url":"https://extensions.blender.org/download/sha256:1fb1319bf07728a6c8cd4478f28a8ebb03072f0f2f10a2f7392c8586bfb73a0e/add-on-edge-length-measure-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/edge-length-measure/","maintainer":"binary-angel","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Mesh","Modeling"]},{"id":"tu_addon_id","schema_version":"1.0.0","name":"GeneradorMapsPbr","version":"1.0.0","tagline":"Make texture metallic,specular,Roughtness,NormalMap,Height","archive_hash":"sha256:0b37d42af8905161a45836f5c1be098f1f22b9b171f46995b3c9828791ebe37b","archive_size":6065,"archive_url":"https://extensions.blender.org/download/sha256:0b37d42af8905161a45836f5c1be098f1f22b9b171f46995b3c9828791ebe37b/add-on-tu-addon-id-v1.0.0.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/tu-addon-id/","maintainer":"Fran-Dominguez-Leiva-2","license":["SPDX:GPL-3.0-or-later"]},{"id":"doblux_geometry_node_group_execute","schema_version":"1.0.0","name":"DOBLUX Button to execute Geometry Node Group","version":"1.1.1","tagline":"one-click execution of any open Geometry Node group","archive_hash":"sha256:2975816a00a2d28d2f8cb8f9ba6c7598208d07ce1e72e6795c847847b4495344","archive_size":2014,"archive_url":"https://extensions.blender.org/download/sha256:2975816a00a2d28d2f8cb8f9ba6c7598208d07ce1e72e6795c847847b4495344/add-on-doblux-geometry-node-group-execute-v1.1.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/doblux-geometry-node-group-execute/","maintainer":"Dan-Oak","license":["SPDX:GPL-3.0-or-later"],"tags":["Geometry Nodes","User Interface"]},{"id":"soundPlanes","schema_version":"1.0.0","name":"Sound Planes","version":"1.0.0","tagline":"Auto-Add Sounds To The Sequencer Using Planes","archive_hash":"sha256:3bb89caa2ad1864541e5240df8bae3646656d6507ba6fd1f230ca74dcb684e58","archive_size":13414,"archive_url":"https://extensions.blender.org/download/sha256:3bb89caa2ad1864541e5240df8bae3646656d6507ba6fd1f230ca74dcb684e58/add-on-soundplanes-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/soundplanes/","maintainer":"nifi","license":["SPDX:GPL-3.0-or-later"],"tags":["Sequencer"]},{"id":"Crunchyroll_Dark","schema_version":"1.0.0","name":"Crunchyroll Dark","version":"1.0.0","tagline":"A Crunchyroll theme for Blender","archive_hash":"sha256:c8ce1657172ae7e855e8820d924070caab3bfeedb20a47fc12ec2abbbed17c55","archive_size":5471,"archive_url":"https://extensions.blender.org/download/sha256:c8ce1657172ae7e855e8820d924070caab3bfeedb20a47fc12ec2abbbed17c55/theme-crunchyroll-dark-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/crunchyroll-dark/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"EyeZen","schema_version":"1.0.0","name":"Eye Zen","version":"1.0.3","tagline":"A Relaxing Theme","archive_hash":"sha256:822e900972709f7402a5021b569ec8cc29074656d7a7037fc0a1434023287362","archive_size":5767,"archive_url":"https://extensions.blender.org/download/sha256:822e900972709f7402a5021b569ec8cc29074656d7a7037fc0a1434023287362/theme-eyezen-v1.0.3.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/eyezen/","maintainer":"Sakuta-Narukami","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Print"]},{"id":"sculpt_navigation","schema_version":"1.0.0","name":"Sculpt Navigation","version":"1.0.2","tagline":"ZBrush/3D-Coat style viewport navigation","archive_hash":"sha256:b9c5607fb3e7bf4d199efe55b4025172ec47e5c8e55997ae99ec4de5f11f3c36","archive_size":40766,"archive_url":"https://extensions.blender.org/download/sha256:b9c5607fb3e7bf4d199efe55b4025172ec47e5c8e55997ae99ec4de5f11f3c36/add-on-sculpt-navigation-v1.0.2.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/sculpt-navigation/","maintainer":"Cuzmic","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Sculpt"]},{"id":"Dark_Pro_Max_Theme","schema_version":"1.0.0","name":"Dark_Pro_Max_Theme","version":"1.1.1","tagline":"Ultra Plus alternate of default Dark","archive_hash":"sha256:cbcd532114ba2f6fbf37f30b353be9cab54e955182a483dbb2783ff1c67ea223","archive_size":5740,"archive_url":"https://extensions.blender.org/download/sha256:cbcd532114ba2f6fbf37f30b353be9cab54e955182a483dbb2783ff1c67ea223/theme-dark-pro-max-theme-v1.1.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/dark-pro-max-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"output_setup_helper","schema_version":"1.0.0","name":"Output Setup Helper","version":"5.0.1","tagline":"Auto setup render outputs and denoising for multi-pass renders","archive_hash":"sha256:2ae18a2f31ec11e134586c3dfae4df83732dbc5c42a39171a04ab3f6c4f2c848","archive_size":4450,"archive_url":"https://extensions.blender.org/download/sha256:2ae18a2f31ec11e134586c3dfae4df83732dbc5c42a39171a04ab3f6c4f2c848/add-on-output-setup-helper-v5.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/output-setup-helper/","maintainer":"lukas.remis","license":["SPDX:GPL-3.0-or-later"],"tags":["Compositing","Render","Pipeline"]},{"id":"reflex_potentials","schema_version":"1.0.0","name":"Reflex Potentials","version":"1.0.3","tagline":"Reflex Potentials","archive_hash":"sha256:f41f8e3805cf75f8cb732dc24733ab839f5b7d633d136bcc59f40635245b1890","archive_size":35482,"archive_url":"https://extensions.blender.org/download/sha256:f41f8e3805cf75f8cb732dc24733ab839f5b7d633d136bcc59f40635245b1890/add-on-reflex-potentials-v1.0.3.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/reflex-potentials/","maintainer":"dartmeadow","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"blender_source_theme","schema_version":"1.0.0","name":"Source","version":"1.0.0","tagline":"This is a Source Engine Based theme for Blender","archive_hash":"sha256:5a6aaaf773d46c437c98caef00c0dfede6a26d4b2ffdd0853fa099fdfe95ac49","archive_size":6684,"archive_url":"https://extensions.blender.org/download/sha256:5a6aaaf773d46c437c98caef00c0dfede6a26d4b2ffdd0853fa099fdfe95ac49/theme-blender-source-theme-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/blender-source-theme/","maintainer":"AeroBuoyancy.source","license":["SPDX:GPL-3.0-or-later"]},{"id":"Blueprint_Theme","schema_version":"1.0.0","name":"Blueprint_Theme","version":"1.0.5","tagline":"True Blueprint Colour","archive_hash":"sha256:9c0b2afa9a2cc5a70fb6c9085f6c1d95c4daac13eb1988ae67da0619b3d581b0","archive_size":5724,"archive_url":"https://extensions.blender.org/download/sha256:9c0b2afa9a2cc5a70fb6c9085f6c1d95c4daac13eb1988ae67da0619b3d581b0/theme-blueprint-theme-v1.0.5.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/blueprint-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"Nostalgia_2bit_UI","schema_version":"1.0.0","name":"Nostalgia_2bit_UI","version":"1.2.8","tagline":"Hi-fi alternate of default Light","archive_hash":"sha256:bf250124530c4772c1f2e2d50b4b7a6fef48626b18922e23784b32227c73469f","archive_size":5628,"archive_url":"https://extensions.blender.org/download/sha256:bf250124530c4772c1f2e2d50b4b7a6fef48626b18922e23784b32227c73469f/theme-nostalgia-2bit-ui-v1.2.8.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/nostalgia-2bit-ui/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"BLeQ_Extension","schema_version":"1.0.0","name":"BLeQ","version":"1.0.5","tagline":"Renderqueue / 3DHomePage / Hardwaremonitor / Tools","archive_hash":"sha256:286cefdc0eaeabc2e348c1e26ac7c5eaec9946603e3570aa5382a1704132c0ac","archive_size":35304,"archive_url":"https://extensions.blender.org/download/sha256:286cefdc0eaeabc2e348c1e26ac7c5eaec9946603e3570aa5382a1704132c0ac/add-on-bleq-extension-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bleq-extension/","maintainer":"Christian-Makarski","license":["SPDX:GPL-3.0-or-later"]},{"id":"driver_copy_io","schema_version":"1.0.0","name":"Driver Copy IO","version":"2.1.1","tagline":"Copy/Paste drivers via JSON using full path","archive_hash":"sha256:58a88728287093155bb2f61c7a7e526c2923c0889872d4613bf2db867dba207d","archive_size":21147,"archive_url":"https://extensions.blender.org/download/sha256:58a88728287093155bb2f61c7a7e526c2923c0889872d4613bf2db867dba207d/add-on-driver-copy-io-v2.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/driver-copy-io/","maintainer":"a2d4f3s1","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Rigging"]},{"id":"modifier_manager","schema_version":"1.0.0","name":"Modifier Manager","version":"1.0.2","tagline":"Manage your modifiers from right click menu","archive_hash":"sha256:0e03355dba011e705ff220940779f32169080136f625866173e8a79077f87f29","archive_size":11707,"archive_url":"https://extensions.blender.org/download/sha256:0e03355dba011e705ff220940779f32169080136f625866173e8a79077f87f29/add-on-modifier-manager-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/modifier-manager/","maintainer":"KewlSheet","license":["SPDX:GPL-3.0-or-later"]},{"id":"mockup_screenshoter","schema_version":"1.0.0","name":"Mockup Screenshoter","version":"0.9.1","tagline":"Capture your screen to make mockups in Penpot","archive_hash":"sha256:16c2d787b49297921eebec6f3bebf1727606c435f1053f6ed6eab55280bbd96e","archive_size":6437,"archive_url":"https://extensions.blender.org/download/sha256:16c2d787b49297921eebec6f3bebf1727606c435f1053f6ed6eab55280bbd96e/add-on-mockup-screenshoter-v0.9.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/mockup-screenshoter/","maintainer":"Blender","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Create temporary folder for the screen captures","clipboard":"Copy Penpot-ready json into the clipboard"},"tags":["Development"]},{"id":"b3d_ui_langloop","schema_version":"1.0.0","name":"B3D UI Language Loop","version":"1.0.3","tagline":"Quickly cycle Blender interface languages with a shortcut","archive_hash":"sha256:63bf8c9073919e21a7eb49b352d02a54f71057cfe26adce7f9d2337ac9a0b866","archive_size":6240,"archive_url":"https://extensions.blender.org/download/sha256:63bf8c9073919e21a7eb49b352d02a54f71057cfe26adce7f9d2337ac9a0b866/add-on-b3d-ui-langloop-v1.0.3.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/b3d-ui-langloop/","maintainer":"楊景貴","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"tree_clipper","schema_version":"1.0.0","name":"Tree Clipper","version":"0.1.6","tagline":"Export and import Blender node trees as JSON","archive_hash":"sha256:e67f50a0da6699a7257e93f10be341f5e3461d070d808c2281264d8d0ac8de44","archive_size":52846,"archive_url":"https://extensions.blender.org/download/sha256:e67f50a0da6699a7257e93f10be341f5e3461d070d808c2281264d8d0ac8de44/add-on-tree-clipper-v0.1.6.zip","type":"add-on","blender_version_min":"5.0.0","blender_version_max":"5.2.0","website":"https://extensions.blender.org/add-ons/tree-clipper/","maintainer":"Lars-Helge-Scheel","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Node"]},{"id":"shapingrecorder","schema_version":"1.0.0","name":"Shaping Recorder","version":"0.7.5","tagline":"Record mesh shaping and viewport moves, replay interpolated","archive_hash":"sha256:a10c5e07c373447ad896741da47cc8a4fc831852c2f09261b57c120f2f8c3596","archive_size":38248,"archive_url":"https://extensions.blender.org/download/sha256:a10c5e07c373447ad896741da47cc8a4fc831852c2f09261b57c120f2f8c3596/add-on-shapingrecorder-v0.7.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shapingrecorder/","maintainer":"darkstarrd","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and write image sequences"},"tags":["Modeling"]},{"id":"reforge","schema_version":"1.0.0","name":"Reforge","version":"0.5.2","tagline":"Reforge Blender scenes into Defold assets","archive_hash":"sha256:15bd625739050ad3a4b3641ebdebfac6298330c02dee5d0b1bc08eb96b47f811","archive_size":16167,"archive_url":"https://extensions.blender.org/download/sha256:15bd625739050ad3a4b3641ebdebfac6298330c02dee5d0b1bc08eb96b47f811/add-on-reforge-v0.5.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/reforge/","maintainer":"Alexander-Bulatov","license":["SPDX:GPL-3.0-or-later"]},{"id":"comparable","schema_version":"1.0.0","name":"Comparable","version":"1.0.2","tagline":"Compare two objects or collections in one click","archive_hash":"sha256:b72d64fdb22b697a07806b75fcf932348475e326fc38b27d9230ddc0aae2116d","archive_size":3981,"archive_url":"https://extensions.blender.org/download/sha256:b72d64fdb22b697a07806b75fcf932348475e326fc38b27d9230ddc0aae2116d/add-on-comparable-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/comparable/","maintainer":"ffuthoni","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"screenwriter","schema_version":"1.0.0","name":"Screenwriter","version":"1.0.0","tagline":"Screenplay formatting and syncing tools for Blender","archive_hash":"sha256:ea16e42750bde882d4e1ceed7a74d55e020bb52bed06816615f9d5e162f6c2c6","archive_size":7307,"archive_url":"https://extensions.blender.org/download/sha256:ea16e42750bde882d4e1ceed7a74d55e020bb52bed06816615f9d5e162f6c2c6/add-on-screenwriter-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/screenwriter/","maintainer":"zhengyang237","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Reading and writing .fountain files"}},{"id":"image_zoom_overlay","schema_version":"1.0.0","name":"Image Zoom Overlay","version":"1.0.0","tagline":"Display zoom level in Image Editor with quick presets","archive_hash":"sha256:96407335647d7191ba1522818bd6f5b9e15be10fd896c50a18a5330e4d09e154","archive_size":2896,"archive_url":"https://extensions.blender.org/download/sha256:96407335647d7191ba1522818bd6f5b9e15be10fd896c50a18a5330e4d09e154/add-on-image-zoom-overlay-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/image-zoom-overlay/","maintainer":"pikok85","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Access to image editor display settings"},"tags":["User Interface"]},{"id":"pataz_notes","schema_version":"1.0.0","name":"Pataz Notes","version":"5.1.1","tagline":"Anotate your blend files","archive_hash":"sha256:41e6e18fe44ba530a0525c3f1543a54589096fe017ad1dac108aa96a03ab72b0","archive_size":4385,"archive_url":"https://extensions.blender.org/download/sha256:41e6e18fe44ba530a0525c3f1543a54589096fe017ad1dac108aa96a03ab72b0/add-on-pataz-notes-v5.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pataz-notes/","maintainer":"zanqdo","license":["SPDX:GPL-3.0-or-later"],"tags":["Pipeline"]},{"id":"omoospace","schema_version":"1.0.0","name":"Omoospace","version":"0.2.2","tagline":"Manage your project files in omoospace's way","archive_hash":"sha256:ea1b57339370dc90b75597d163f687fc308e620cb947046f3b047226d510bb0e","archive_size":1788795,"archive_url":"https://extensions.blender.org/download/sha256:ea1b57339370dc90b75597d163f687fc308e620cb947046f3b047226d510bb0e/add-on-omoospace-v0.2.2-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/omoospace/","maintainer":"icrdr","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Manage your project files in omoospace's way"},"platforms":["windows-x64"],"tags":["Pipeline"]},{"id":"export_curve_to_json","schema_version":"1.0.0","name":"Export Curve To Json","version":"1.0.2","tagline":"File import/export for curves with JSON","archive_hash":"sha256:3646464bdf053849db751b2222790836064e5e268c70ef559f89bacde467c115","archive_size":18907,"archive_url":"https://extensions.blender.org/download/sha256:3646464bdf053849db751b2222790836064e5e268c70ef559f89bacde467c115/add-on-export-curve-to-json-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/export-curve-to-json/","maintainer":"Quint-Vrolijk","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"sculpting_extra_meshes_curve","schema_version":"1.0.0","name":"Sculpting Extra Meshes + Curve","version":"1.3.0","tagline":"Add primitives, join, boolean, mirror while in Sculpt Mode","archive_hash":"sha256:5b0c372464b0ca743651f1ffa4682f0c4ce322be119d3df59e3d71854ddbf3cf","archive_size":4205,"archive_url":"https://extensions.blender.org/download/sha256:5b0c372464b0ca743651f1ffa4682f0c4ce322be119d3df59e3d71854ddbf3cf/add-on-sculpting-extra-meshes-curve-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sculpting-extra-meshes-curve/","maintainer":"pixldg","license":["SPDX:GPL-3.0-or-later"],"tags":["Sculpt"]},{"id":"global_custom_properties","schema_version":"1.0.0","name":"Global Custom Properties","version":"1.0.0","tagline":"Reusable Custom Properties on Objects and Collections","archive_hash":"sha256:9775ca35a3b7fb12a8c36dcbde85c8497a0ddd8938ec180416d9f23d9907d128","archive_size":18782,"archive_url":"https://extensions.blender.org/download/sha256:9775ca35a3b7fb12a8c36dcbde85c8497a0ddd8938ec180416d9f23d9907d128/add-on-global-custom-properties-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/global-custom-properties/","maintainer":"1hue","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"curve_fillet_tool","schema_version":"1.0.0","name":"NURBS/Poly Fillet Tool","version":"1.0.0","tagline":"Fillet and 'unfillet' for paths","archive_hash":"sha256:07d671b719e336aba5192208baf4951d2db3cf161e56350c3fb405fb3b6b1df7","archive_size":17360,"archive_url":"https://extensions.blender.org/download/sha256:07d671b719e336aba5192208baf4951d2db3cf161e56350c3fb405fb3b6b1df7/add-on-curve-fillet-tool-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.5","website":"https://extensions.blender.org/add-ons/curve-fillet-tool/","maintainer":"zaphod","license":["SPDX:GPL-3.0-or-later"]},{"id":"bagapaste","schema_version":"1.0.0","name":"BagaPaste","version":"1.0.3","tagline":"Paste clipboard images/URLs as planes or reference images","archive_hash":"sha256:9a306ef1bf9ebf07f6d7f2470655930ab2e00ac86cf1bd718b215ad3290f2569","archive_size":18406,"archive_url":"https://extensions.blender.org/download/sha256:9a306ef1bf9ebf07f6d7f2470655930ab2e00ac86cf1bd718b215ad3290f2569/add-on-bagapaste-v1.0.3.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/bagapaste/","maintainer":"Kiara_Bagattini","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save clipboard or downloaded images to disk before importing","network":"Download images when the clipboard contains an HTTP/HTTPS URL","clipboard":"Read image/file/text data from the system clipboard"},"tags":["Import-Export","3D View"]},{"id":"time_stretch_sync","schema_version":"1.0.0","name":"Time Stretch Sync","version":"1.1.0","tagline":"Sync timeline range, playline and operators with timestretching","archive_hash":"sha256:347dd396d927096a9f8c361e79214b2a612a5ca8208274a667ee207195f5df4c","archive_size":13493,"archive_url":"https://extensions.blender.org/download/sha256:347dd396d927096a9f8c361e79214b2a612a5ca8208274a667ee207195f5df4c/add-on-time-stretch-sync-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/time-stretch-sync/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"render_subcollections","schema_version":"1.0.0","name":"Render Subcollections","version":"1.0.1","tagline":"Automatically renders subcollections one by one","archive_hash":"sha256:54f2c7f20d243d96a7575d8083e92de190a0ceb9149e3757491c82cad3833066","archive_size":3353,"archive_url":"https://extensions.blender.org/download/sha256:54f2c7f20d243d96a7575d8083e92de190a0ceb9149e3757491c82cad3833066/add-on-render-subcollections-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/render-subcollections/","maintainer":"Nico-Peters","license":["SPDX:GPL-3.0-or-later"],"tags":["Render","Camera"]},{"id":"Dissolve2EdgeVertices","schema_version":"1.0.0","name":"Dissolve 2-Edge Vertices","version":"1.1.0","tagline":"Dissolve vertices with two edges to clean up mesh topology","archive_hash":"sha256:6bfec11aea3f67f68c75897824e690f2110b5a0a84f57b8c9681e1b46a60241a","archive_size":1920,"archive_url":"https://extensions.blender.org/download/sha256:6bfec11aea3f67f68c75897824e690f2110b5a0a84f57b8c9681e1b46a60241a/add-on-dissolve2edgevertices-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dissolve2edgevertices/","maintainer":"Jackal","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"beyond_channel_packer","schema_version":"1.0.0","name":"Beyond Channel Packer","version":"1.0.2","tagline":"Pack image channels (RGBA) in the Image Editor","archive_hash":"sha256:713e336af49bf826e91aead72025eadd114580927d24e33e0493583e187b7e77","archive_size":22143,"archive_url":"https://extensions.blender.org/download/sha256:713e336af49bf826e91aead72025eadd114580927d24e33e0493583e187b7e77/add-on-beyond-channel-packer-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.9.999","website":"https://extensions.blender.org/add-ons/beyond-channel-packer/","maintainer":"tyler.tofu","license":["SPDX:GPL-3.0-or-later"],"tags":["UV","Paint"]},{"id":"keyboard_layout_emulation","schema_version":"1.0.0","name":"Keyboard Layout Emulation","version":"1.0.2","tagline":"Emulate QWERTY keyboard shortcuts on non-QWERTY keyboard layouts","archive_hash":"sha256:16913e50665a8e293b248d82aec64859f67c4c0932a3ef41b765cbcb603b2e04","archive_size":32090,"archive_url":"https://extensions.blender.org/download/sha256:16913e50665a8e293b248d82aec64859f67c4c0932a3ef41b765cbcb603b2e04/add-on-keyboard-layout-emulation-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/keyboard-layout-emulation/","maintainer":"endorh","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export keyboard layouts/add-on preferences"},"tags":["User Interface"]},{"id":"majik_blender_edu_teacher","schema_version":"1.0.0","name":"Majik Blender Edu","version":"1.1.4","tagline":"Submission integrity tool for educators to verify students' work","archive_hash":"sha256:fc1007990be6653f524611f8c7f1daf8b043dcb0bc55d7fb103d26612786446f","archive_size":3743388,"archive_url":"https://extensions.blender.org/download/sha256:fc1007990be6653f524611f8c7f1daf8b043dcb0bc55d7fb103d26612786446f/add-on-majik-blender-edu-teacher-v1.1.4-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/majik-blender-edu-teacher/","maintainer":"Zelijah","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write keys and logs as JSON for integrity verification","network":"Access required for JSON file analysis"},"platforms":["windows-x64"],"tags":["Pipeline"]},{"id":"theme_elsyiun_like","schema_version":"1.0.0","name":"elsyiun like","version":"1.1.0","tagline":"A flat dark theme that is easy on the eyes","archive_hash":"sha256:698be24bb24b0957bd8ac858be0d019e4626c7ede5f06adc3de376a5f84d77d1","archive_size":5639,"archive_url":"https://extensions.blender.org/download/sha256:698be24bb24b0957bd8ac858be0d019e4626c7ede5f06adc3de376a5f84d77d1/theme-theme-elsyiun-like-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-elsyiun-like/","maintainer":"modekichi","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"only_blends_mixer","schema_version":"1.0.0","name":"OnlyBlends.Mixer","version":"0.5.1","tagline":"An extension to turn Blender into a Mixer... of Sounds","archive_hash":"sha256:2bf6bf06b206c1739952ca80b9a7836bf1f5953586c48e027c90911ab1def39c","archive_size":187225,"archive_url":"https://extensions.blender.org/download/sha256:2bf6bf06b206c1739952ca80b9a7836bf1f5953586c48e027c90911ab1def39c/add-on-only-blends-mixer-v0.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/only-blends-mixer/","maintainer":"Zulhakar","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Pipeline"]},{"id":"viewport_navigation_display","schema_version":"1.0.0","name":"Viewport Navigation Display","version":"1.2.1","tagline":"Visualize and control other viewports from TOP view","archive_hash":"sha256:3764c677ad34d57510e22257ff61646ab4ec8a25d2599486588d2bf9ab2bba01","archive_size":44446,"archive_url":"https://extensions.blender.org/download/sha256:3764c677ad34d57510e22257ff61646ab4ec8a25d2599486588d2bf9ab2bba01/add-on-viewport-navigation-display-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/viewport-navigation-display/","maintainer":"Cristiano-Tosoni","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Camera","User Interface"]},{"id":"asset_shelf_shortcut_display","schema_version":"1.0.0","name":"Asset Shelf Shortcut Display","version":"1.0.0","tagline":"Adds a line with hotkey/shortcut of the asset in the shelf","archive_hash":"sha256:8eeb7d53d48732f8fe36fcb22dd4685718d47021f0fec383a35f1f3360a571ad","archive_size":2816,"archive_url":"https://extensions.blender.org/download/sha256:8eeb7d53d48732f8fe36fcb22dd4685718d47021f0fec383a35f1f3360a571ad/add-on-asset-shelf-shortcut-display-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/asset-shelf-shortcut-display/","maintainer":"The-Loose-Spirit","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"quick_signs","schema_version":"1.0.0","name":"QuickSigns","version":"1.0.1","tagline":"Create 3D text signs with Google Fonts integration","archive_hash":"sha256:d24a17ff92d6a2bbcbc7767c5c4f0a92eee7c6a564e900db4fd993545f9d9959","archive_size":9089,"archive_url":"https://extensions.blender.org/download/sha256:d24a17ff92d6a2bbcbc7767c5c4f0a92eee7c6a564e900db4fd993545f9d9959/add-on-quick-signs-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-signs/","maintainer":"Marin-Brouwers","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and write font files to local storage","network":"Access Google Fonts API for font search and download"},"tags":["Import-Export"]},{"id":"dy_pack_master","schema_version":"1.0.0","name":"dy Pack Master","version":"1.0.1","tagline":"Make Blender projects portable for render farms","archive_hash":"sha256:5e8694b0e3747a1ee4878161bb239392d2eeb7f97da21e3dd0cef0774137724f","archive_size":34845,"archive_url":"https://extensions.blender.org/download/sha256:5e8694b0e3747a1ee4878161bb239392d2eeb7f97da21e3dd0cef0774137724f/add-on-dy-pack-master-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dy-pack-master/","maintainer":"cdordelly","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Copies and localizes external assets to project directory"},"tags":["Pipeline","Import-Export","System"]},{"id":"cycles_bake_info","schema_version":"1.0.0","name":"Bake Info","version":"1.0.2","tagline":"fast bake checkup","archive_hash":"sha256:ac46bdb997c1f31bb513c45af62890576fcf93a8f6e4e4d115bc9298d3d914c5","archive_size":1581,"archive_url":"https://extensions.blender.org/download/sha256:ac46bdb997c1f31bb513c45af62890576fcf93a8f6e4e4d115bc9298d3d914c5/add-on-cycles-bake-info-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cycles-bake-info/","maintainer":"Chalouek-RGBit","license":["SPDX:GPL-3.0-or-later"],"tags":["Render","User Interface"]},{"id":"Areas_by_Materials","schema_version":"1.0.0","name":"Areas by Materials","version":"1.6.0","tagline":"Displays information about areas of materials in selection","archive_hash":"sha256:55b3fb12411af2e76d28b97b666ec38f77cbad30ccc4d2830b075ec1224aa6c9","archive_size":3609,"archive_url":"https://extensions.blender.org/download/sha256:55b3fb12411af2e76d28b97b666ec38f77cbad30ccc4d2830b075ec1224aa6c9/add-on-areas-by-materials-v1.6.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/areas-by-materials/","maintainer":"Justinas-Dudenas","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Object","User Interface"]},{"id":"quill","schema_version":"1.0.0","name":"Quill Import/Export","version":"1.4.3","tagline":"Import and export Quill VR illustrations and animations","archive_hash":"sha256:09f2abfdb519569f037a3e90be91f067908621d706978c43bdf344336e543519","archive_size":52313,"archive_url":"https://extensions.blender.org/download/sha256:09f2abfdb519569f037a3e90be91f067908621d706978c43bdf344336e543519/add-on-quill-v1.4.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quill/","maintainer":"Joan-Charmant","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export Quill projects from/to disk"},"tags":["Import-Export"]},{"id":"splats","schema_version":"1.0.0","name":"Splats","version":"1.0.1","tagline":"Generate multi-view training data for Gaussian Splatting","archive_hash":"sha256:9171a58e9149ed9fe05a0bfc1c702a20e9055b51a36600664bc8ec19675229f2","archive_size":15856,"archive_url":"https://extensions.blender.org/download/sha256:9171a58e9149ed9fe05a0bfc1c702a20e9055b51a36600664bc8ec19675229f2/add-on-splats-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/splats/","maintainer":"Dev.Patel","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export PLY point clouds and render output files"},"tags":["Render","Camera"]},{"id":"export_curve_as_svg","schema_version":"1.0.0","name":"Export Curve as SVG","version":"1.0.0","tagline":"Export selected Bezier and Poly curves as SVG files","archive_hash":"sha256:1ab1dd210d80ff5c6d6fc5fc3b2bb481e571c28e736be2a028a5568ad2d6d990","archive_size":16937,"archive_url":"https://extensions.blender.org/download/sha256:1ab1dd210d80ff5c6d6fc5fc3b2bb481e571c28e736be2a028a5568ad2d6d990/add-on-export-curve-as-svg-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/export-curve-as-svg/","maintainer":"Gilberto.R","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"asset_library_tools","schema_version":"1.0.0","name":"Asset Library Tools","version":"1.0.0","tagline":"Filter assets by tags and catalogue backups for asset libraries","archive_hash":"sha256:b4984647ddd947e4d1cecf108759494135e2c2c4f6049d0125e89634163cdc37","archive_size":15607,"archive_url":"https://extensions.blender.org/download/sha256:b4984647ddd947e4d1cecf108759494135e2c2c4f6049d0125e89634163cdc37/add-on-asset-library-tools-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/asset-library-tools/","maintainer":"Akhil_Alukkaran","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and write tag indexes and catalogue backup files"},"tags":["System","User Interface","Pipeline"]},{"id":"redlix_theme","schema_version":"1.0.0","name":"Redlix Theme","version":"1.0.0","tagline":"Cooperative brutalist framework - retro-futuristic design system","archive_hash":"sha256:532550a1d2fda385ae83d56b42e3ac32e2cb3a5134ed92e488515515ef562ec8","archive_size":4968,"archive_url":"https://extensions.blender.org/download/sha256:532550a1d2fda385ae83d56b42e3ac32e2cb3a5134ed92e488515515ef562ec8/theme-redlix-theme-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/redlix-theme/","maintainer":"redlix","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Colorful"]},{"id":"ftw_flattening_toolset","schema_version":"1.0.0","name":"FTW Flattening Toolset","version":"2.0.0","tagline":"UV workflow: flattening, curve alignment, scaling, UV transfer","archive_hash":"sha256:65ae1e56ade1c60e2b996a508114b1444d51a333a52f2022f79715b62e57838a","archive_size":1176759,"archive_url":"https://extensions.blender.org/download/sha256:65ae1e56ade1c60e2b996a508114b1444d51a333a52f2022f79715b62e57838a/add-on-ftw-flattening-toolset-v2.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/ftw-flattening-toolset/","maintainer":"FTW3DForge","license":["SPDX:GPL-3.0-or-later"]},{"id":"folded_paper_engine","schema_version":"1.0.0","name":"Folded Paper Engine","version":"1.0.9","tagline":"Define gameplay in Blender and play in Godot with a few clicks","archive_hash":"sha256:a39e163e5a7474b155fb9ece5e01077e573ba876db37ddd8306fab9c216a886c","archive_size":13999,"archive_url":"https://extensions.blender.org/download/sha256:a39e163e5a7474b155fb9ece5e01077e573ba876db37ddd8306fab9c216a886c/add-on-folded-paper-engine-v1.0.9.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/folded-paper-engine/","maintainer":"Papercraft-Games","license":["SPDX:GPL-3.0-or-later","SPDX:MIT"],"tags":["Import-Export","Game Engine","Pipeline"]},{"id":"gather_resources","schema_version":"1.0.0","name":"Gather Resources","version":"0.5.2","tagline":"Collect project media into a local folder","archive_hash":"sha256:455025f49d9ca76e33425cdceb6e30cbe7e1a2cfbb5b0537725c30e2d8257db3","archive_size":10373,"archive_url":"https://extensions.blender.org/download/sha256:455025f49d9ca76e33425cdceb6e30cbe7e1a2cfbb5b0537725c30e2d8257db3/add-on-gather-resources-v0.5.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/gather-resources/","maintainer":"Digital-Art-Freedom","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read project media files and copy them into a local directory"},"tags":["System","Pipeline"]},{"id":"character_pipeline_tracker","schema_version":"1.0.0","name":"Character Pipeline Tracker","version":"1.0.0","tagline":"Track and automate character creation pipeline stages","archive_hash":"sha256:4e8acd00d33375fbfb878d7293f79e438e4a61e866619e509a5044ebfee79010","archive_size":27555,"archive_url":"https://extensions.blender.org/download/sha256:4e8acd00d33375fbfb878d7293f79e438e4a61e866619e509a5044ebfee79010/add-on-character-pipeline-tracker-v1.0.0.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/character-pipeline-tracker/","maintainer":"Evgeny-Lisichik","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Mesh"]},{"id":"spine_io","schema_version":"1.0.0","name":"Spine IO","version":"0.0.3","tagline":"Export bone-driven Spine 4.3 JSON files","archive_hash":"sha256:502a89baf7a6ff0517c018ea7b76dff9f65432437b3b8ba46a525c671344278e","archive_size":29815,"archive_url":"https://extensions.blender.org/download/sha256:502a89baf7a6ff0517c018ea7b76dff9f65432437b3b8ba46a525c671344278e/add-on-spine-io-v0.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/spine-io/","maintainer":"Digital-Art-Freedom","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read textures and write Spine JSON"},"tags":["Import-Export","Rigging","Animation"]},{"id":"cam_tools","schema_version":"1.0.0","name":"Cam Tools","version":"1.1.0","tagline":"Streamlined camera workflow toolkit","archive_hash":"sha256:1140c5de02db1814f024ce9838b0aa772901ccccb320b6c79613932d61b8fc3c","archive_size":39272,"archive_url":"https://extensions.blender.org/download/sha256:1140c5de02db1814f024ce9838b0aa772901ccccb320b6c79613932d61b8fc3c/add-on-cam-tools-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cam-tools/","maintainer":"Akhil_Alukkaran","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"camfree","schema_version":"1.0.0","name":"CamFree","version":"1.0.5","tagline":"Fly/Walk Navigation on Cameras with Constraints","archive_hash":"sha256:e5cdbf82af653ffcdd8c2cf598c5f965e47d3b69c86965fa9b085c68e4a43344","archive_size":2409,"archive_url":"https://extensions.blender.org/download/sha256:e5cdbf82af653ffcdd8c2cf598c5f965e47d3b69c86965fa9b085c68e4a43344/add-on-camfree-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/camfree/","maintainer":"JR3DFUL","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"sort_viewlayers_rmb","schema_version":"1.0.0","name":"RMB Sort View Layers Alphabetically in Outliner-Scenes","version":"0.0.2","tagline":"RMB Sort View Layers Alphabetically in Outliner-Scenes","archive_hash":"sha256:c42858f387228d7ec906bb1a5f8705345fc8cad07a4ba7399ab28ac6431034e0","archive_size":2908,"archive_url":"https://extensions.blender.org/download/sha256:c42858f387228d7ec906bb1a5f8705345fc8cad07a4ba7399ab28ac6431034e0/add-on-sort-viewlayers-rmb-v0.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sort-viewlayers-rmb/","maintainer":"RobWu","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"voda_theme_cinnamon","schema_version":"1.0.0","name":"Cinnamon","version":"2.0.0","tagline":"Cinnamon-Orange themed Blender with a gradiented kick","archive_hash":"sha256:37cf32055dda8411ddadfbf84483f1345b652048cc16d0d2dbc795dd746f6849","archive_size":6616,"archive_url":"https://extensions.blender.org/download/sha256:37cf32055dda8411ddadfbf84483f1345b652048cc16d0d2dbc795dd746f6849/theme-voda-theme-cinnamon-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/voda-theme-cinnamon/","maintainer":"VaVo","license":["SPDX:CC0-1.0"]},{"id":"khellstr_light","schema_version":"1.0.0","name":"khellstr light theme","version":"1.0.0","tagline":"Balanced Light Theme for Blender","archive_hash":"sha256:817c6c7b8803549b6a2fece4d17f27a340435060de45406a7513e8c942e11e6d","archive_size":6493,"archive_url":"https://extensions.blender.org/download/sha256:817c6c7b8803549b6a2fece4d17f27a340435060de45406a7513e8c942e11e6d/theme-khellstr-light-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/khellstr-light/","maintainer":"Kimmo-Hellström","license":["SPDX:GPL-3.0-or-later"]},{"id":"Black","schema_version":"1.0.0","name":"Black","version":"5.0.4","tagline":"A black theme, probably the blackest one","archive_hash":"sha256:3167d027740b8693d0a97af41ee0fbedfde3fc378c8900ddb43adf5935600f64","archive_size":5200,"archive_url":"https://extensions.blender.org/download/sha256:3167d027740b8693d0a97af41ee0fbedfde3fc378c8900ddb43adf5935600f64/theme-black-v5.0.4.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/black/","maintainer":"Gurra","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"root_maker","schema_version":"1.0.0","name":"RootMaker","version":"1.0.1","tagline":"Create root bone & bake into actions","archive_hash":"sha256:f8e66008152054ac78b47b34971c07a9bfd32ca9e9760e9ac831028a00a85cb3","archive_size":6592,"archive_url":"https://extensions.blender.org/download/sha256:f8e66008152054ac78b47b34971c07a9bfd32ca9e9760e9ac831028a00a85cb3/add-on-root-maker-v1.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/root-maker/","maintainer":"manas-R.-Makde","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Rigging","Bake"]},{"id":"MetahumanToManny","schema_version":"1.0.0","name":"MetaHumanToManny","version":"1.2.0","tagline":"Clean up MetaHuman meshes and match them to UE5 Manny","archive_hash":"sha256:9eb54b9b250930f984e4a919a2aa20d6b684470a8ab20e8ab4453da6266d4685","archive_size":21164,"archive_url":"https://extensions.blender.org/download/sha256:9eb54b9b250930f984e4a919a2aa20d6b684470a8ab20e8ab4453da6266d4685/add-on-metahumantomanny-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/metahumantomanny/","maintainer":"hakan-erunsal","license":["SPDX:GPL-3.0-or-later"]},{"id":"cad_helper","schema_version":"1.0.0","name":"CAD-Helper","version":"0.6.1","tagline":"Blender Extension to manage imported CAD assemblies","archive_hash":"sha256:804afafdbf62291c0d075c6662d7161631eb329f3f7078382df3b1af3980bee6","archive_size":34745,"archive_url":"https://extensions.blender.org/download/sha256:804afafdbf62291c0d075c6662d7161631eb329f3f7078382df3b1af3980bee6/add-on-cad-helper-v0.6.1-windows-x64-macos-arm64-linux-x64.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/cad-helper/","maintainer":"BsIngA","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64","macos-arm64","linux-x64"],"tags":["Object"]},{"id":"import_png_palette","schema_version":"1.0.0","name":"Import PNG Palette","version":"1.0.2","tagline":"Import PNG images as color palettes for Blender","archive_hash":"sha256:3f4b526b1790cc37067789a1a1c46d51fc09bf466d397828627fd367e34a4ee4","archive_size":2035,"archive_url":"https://extensions.blender.org/download/sha256:3f4b526b1790cc37067789a1a1c46d51fc09bf466d397828627fd367e34a4ee4/add-on-import-png-palette-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/import-png-palette/","maintainer":"Ruuubick","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Paint"]},{"id":"momo_dark","schema_version":"1.0.0","name":"Momo Dark","version":"5.0.2","tagline":"Momo Dark - theme inspired by Modo","archive_hash":"sha256:00dc1ddf0046e027e30a6143f3664013b7ca51d810da3220cc210d8bd6a39b36","archive_size":6454,"archive_url":"https://extensions.blender.org/download/sha256:00dc1ddf0046e027e30a6143f3664013b7ca51d810da3220cc210d8bd6a39b36/theme-momo-dark-v5.0.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/momo-dark/","maintainer":"TimoShch","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"rss_theme_cyberpunk","schema_version":"1.0.0","name":"RedSavStudios: Cyberpunk","version":"0.5.5","tagline":"A dark blue cyberpunk-inspired theme with neon highlights","archive_hash":"sha256:9fc403b95ae68202e260f4cd7dba2359ad4e50ace0e4fcab020edacb5366435c","archive_size":5501,"archive_url":"https://extensions.blender.org/download/sha256:9fc403b95ae68202e260f4cd7dba2359ad4e50ace0e4fcab020edacb5366435c/theme-rss-theme-cyberpunk-v0.5.5.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/rss-theme-cyberpunk/","maintainer":"Reddraconi","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"rss_theme_nord","schema_version":"1.0.0","name":"RedSavStudios: Nord (Aurora)","version":"0.5.2","tagline":"Nord Theme With Aurora Accents","archive_hash":"sha256:0e8c6afd497618aef1fa42511aff6cfab32311c162b4f8f0d9291f59523cfd50","archive_size":5196,"archive_url":"https://extensions.blender.org/download/sha256:0e8c6afd497618aef1fa42511aff6cfab32311c162b4f8f0d9291f59523cfd50/theme-rss-theme-nord-v0.5.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/rss-theme-nord/","maintainer":"Reddraconi","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"randomize_noise_offset","schema_version":"1.0.0","name":"Randomize Noise Offset","version":"1.0.3","tagline":"Randomize Noise Offset for F-Curves","archive_hash":"sha256:538013b0bbec8281cf30abafee96389d0ad3664b48b733d9b3784b674e63a6e9","archive_size":2500,"archive_url":"https://extensions.blender.org/download/sha256:538013b0bbec8281cf30abafee96389d0ad3664b48b733d9b3784b674e63a6e9/add-on-randomize-noise-offset-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/randomize-noise-offset/","maintainer":"a.a.andrusenko","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"mirror_image","schema_version":"1.0.0","name":"Mirror Image","version":"1.0.0","tagline":"Applies mirroring to the active image","archive_hash":"sha256:12acdb21a3cd9f1e05202ae384499c80949d8ed3d352cd8a0ddfe70dcac21f46","archive_size":2540,"archive_url":"https://extensions.blender.org/download/sha256:12acdb21a3cd9f1e05202ae384499c80949d8ed3d352cd8a0ddfe70dcac21f46/add-on-mirror-image-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mirror-image/","maintainer":"R4V3N","license":["SPDX:GPL-3.0-or-later"],"tags":["Paint"]},{"id":"toggle_orbit_method","schema_version":"1.0.0","name":"Toggle Orbit Method (Turntable / Trackball)","version":"1.0.0","tagline":"Quickly toggles between Turntable and Trackball orbit modes","archive_hash":"sha256:c22d1bfd2e9bb48344aae7cb61efa209a06174146e3f1b6436a638b3064019c4","archive_size":1369,"archive_url":"https://extensions.blender.org/download/sha256:c22d1bfd2e9bb48344aae7cb61efa209a06174146e3f1b6436a638b3064019c4/add-on-toggle-orbit-method-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/toggle-orbit-method/","maintainer":"ArgelliKa","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"blender_vnf_exporter_extension","schema_version":"1.0.0","name":"VNF Export Extension","version":"1.0.0","tagline":"Export blender mesh to openscad vnf","archive_hash":"sha256:a5520b1cd82ed825022faadc413ba1db1dd8c9b8d16fafb7c198583ccbe6c23e","archive_size":14400,"archive_url":"https://extensions.blender.org/download/sha256:a5520b1cd82ed825022faadc413ba1db1dd8c9b8d16fafb7c198583ccbe6c23e/add-on-blender-vnf-exporter-extension-v1.0.0-windows-x64-linux-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blender-vnf-exporter-extension/","maintainer":"runerback","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export .scad to disk"},"platforms":["windows-x64","linux-x64"],"tags":["Import-Export"]},{"id":"vray_arena_setup","schema_version":"1.0.0","name":"Vray Arena Setup","version":"2.5.0","tagline":"Export VRay Cosmos assets, scene textures, and stage cube setup","archive_hash":"sha256:608feab71c8d9f0726372656513c23c24ebad88707929a9f3c89d85a64d6185f","archive_size":6050,"archive_url":"https://extensions.blender.org/download/sha256:608feab71c8d9f0726372656513c23c24ebad88707929a9f3c89d85a64d6185f/add-on-vray-arena-setup-v2.5.0.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/vray-arena-setup/","maintainer":"Darsh","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and write project and resources directories"},"tags":["Import-Export","Material"]},{"id":"Minimal","schema_version":"1.0.0","name":"Minimal","version":"1.0.0","tagline":"Dark minimal theme","archive_hash":"sha256:5cfd4ece8439e754c284703a3b92e967094ac3c05e5a145738e911139b4238fb","archive_size":5620,"archive_url":"https://extensions.blender.org/download/sha256:5cfd4ece8439e754c284703a3b92e967094ac3c05e5a145738e911139b4238fb/theme-minimal-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/minimal/","maintainer":"A7medKhaled.me","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"auto_track_weights","schema_version":"1.0.0","name":"Auto Track Weights","version":"0.2.1","tagline":"Automatically adjust the weights of tracking markers","archive_hash":"sha256:90e5cf8f11558a00e14a383e30cda0fd9ca1d40bc76e514f8f42b7be3c67c6be","archive_size":2415,"archive_url":"https://extensions.blender.org/download/sha256:90e5cf8f11558a00e14a383e30cda0fd9ca1d40bc76e514f8f42b7be3c67c6be/add-on-auto-track-weights-v0.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-track-weights/","maintainer":"david494","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","Tracking"]},{"id":"batch_bone_constraints","schema_version":"1.0.0","name":"Batch Bone Constraints","version":"1.1.4","tagline":"Batch bone constraints to the selected multiple armatures","archive_hash":"sha256:a73d426532da74e03772365f62a32e85637622da7cfe4fb77f469923e13604ee","archive_size":6589,"archive_url":"https://extensions.blender.org/download/sha256:a73d426532da74e03772365f62a32e85637622da7cfe4fb77f469923e13604ee/add-on-batch-bone-constraints-v1.1.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/batch-bone-constraints/","maintainer":"distinctive-mark","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Animation"]},{"id":"theme_BlueInvasion","schema_version":"1.0.0","name":"Blue Invasion","version":"1.0.3-1","tagline":"A theme inspired by Winamp's blue invasion theme","archive_hash":"sha256:aaa50db52785b547c7902f7dea3808dbd06ba8a27b989b96de0640590a7863f2","archive_size":6165,"archive_url":"https://extensions.blender.org/download/sha256:aaa50db52785b547c7902f7dea3808dbd06ba8a27b989b96de0640590a7863f2/theme-theme-blueinvasion-v1.0.3-1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-blueinvasion/","maintainer":"zaq","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Colorful","Inspired By"]},{"id":"trident","schema_version":"1.0.0","name":"TRIDENT","version":"0.2.1","tagline":"3D UMAP/t-SNE embeddings into Blender","archive_hash":"sha256:85c8367127d76c0c21514615439d0b4fdfdb08e3034f146ad890f6cf4d29c66a","archive_size":128117,"archive_url":"https://extensions.blender.org/download/sha256:85c8367127d76c0c21514615439d0b4fdfdb08e3034f146ad890f6cf4d29c66a/add-on-trident-v0.2.1-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/trident/","maintainer":"ccordi","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write data files and build outputs"},"platforms":["windows-x64"],"tags":["3D View","Object"]},{"id":"FrameFlowBlender","schema_version":"1.0.0","name":"Frame Flow Beta","version":"1.4.1","tagline":"Advanced Node Frame Add-on for Blender","archive_hash":"sha256:24848e275ae2a587be4a8048afbc32f1b67e46ef0aba693ca65a34de20bc495f","archive_size":922364,"archive_url":"https://extensions.blender.org/download/sha256:24848e275ae2a587be4a8048afbc32f1b67e46ef0aba693ca65a34de20bc495f/add-on-frameflowblender-v1.4.1.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/frameflowblender/","maintainer":"abhi.01","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Text Editor"]},{"id":"pataz_thumbnail_toolz","schema_version":"1.0.0","name":"Pataz Thumbnail Toolz","version":"1.0.0","tagline":"Tools for managing asset thumbnails","archive_hash":"sha256:ef3ba866311125fd57ed6598dea3be8acc70608f3d95ff817d4c8444012774ac","archive_size":2763,"archive_url":"https://extensions.blender.org/download/sha256:ef3ba866311125fd57ed6598dea3be8acc70608f3d95ff817d4c8444012774ac/add-on-pataz-thumbnail-toolz-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pataz-thumbnail-toolz/","maintainer":"zanqdo","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save and load files from disk"},"tags":["Pipeline"]},{"id":"io_scene_jsbsim","schema_version":"1.0.0","name":"JSBSim Viewer","version":"0.2.3","tagline":"Import and visualize JSBSim FDM aircraft XML metrics","archive_hash":"sha256:3d97352d2c89e76944575b20004a05aeb07c771412a6ffda6b375f973b8dff5f","archive_size":6721,"archive_url":"https://extensions.blender.org/download/sha256:3d97352d2c89e76944575b20004a05aeb07c771412a6ffda6b375f973b8dff5f/add-on-io-scene-jsbsim-v0.2.3.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"6.0.0","website":"https://extensions.blender.org/add-ons/io-scene-jsbsim/","maintainer":"RenanMsV","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"multi_adjust","schema_version":"1.0.0","name":"Multi Adjust","version":"1.0.1","tagline":"Edits properties of multiple things together","archive_hash":"sha256:b5717e7f3f3e02a8b55acea1caaa10c0aef618f992f9dc109510c1ee2de4abed","archive_size":9515,"archive_url":"https://extensions.blender.org/download/sha256:b5717e7f3f3e02a8b55acea1caaa10c0aef618f992f9dc109510c1ee2de4abed/add-on-multi-adjust-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/multi-adjust/","maintainer":"Brrainz","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling"]},{"id":"replace_with_copy","schema_version":"1.0.0","name":"Replace With Copy","version":"1.0.1","tagline":"Batch replace multiple objects with a template","archive_hash":"sha256:b1827d0b0ae7e87cce0f4e4ecf4ce8e861d14dc183d5bb387226167ef66fbabf","archive_size":4116,"archive_url":"https://extensions.blender.org/download/sha256:b1827d0b0ae7e87cce0f4e4ecf4ce8e861d14dc183d5bb387226167ef66fbabf/add-on-replace-with-copy-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/replace-with-copy/","maintainer":"Brrainz","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling"]},{"id":"sierpinski_triangle","schema_version":"1.0.0","name":"Sierpinski Triangle","version":"1.0.4","tagline":"This add-on creates Sierpinski triangles","archive_hash":"sha256:4f6badeb029f38d3680bec40b1a7a61aafd7b35487849a09875c844bd7e01b05","archive_size":4106,"archive_url":"https://extensions.blender.org/download/sha256:4f6badeb029f38d3680bec40b1a7a61aafd7b35487849a09875c844bd7e01b05/add-on-sierpinski-triangle-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sierpinski-triangle/","maintainer":"Jonny-B","license":["SPDX:GPL-3.0-or-later"]},{"id":"light_generator","schema_version":"1.0.0","name":"Light Generator","version":"1.2.0","tagline":"Generate lights with advanced distribution","archive_hash":"sha256:1b687666b01727e8e8c91ab7a06f03c641cd840d002bcb59714e73d8ba877a05","archive_size":5837,"archive_url":"https://extensions.blender.org/download/sha256:1b687666b01727e8e8c91ab7a06f03c641cd840d002bcb59714e73d8ba877a05/add-on-light-generator-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/light-generator/","maintainer":"TFMSTYLE","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Lighting"]},{"id":"nfc_card_keychain_generator","schema_version":"1.0.0","name":"NFC Card and Keychain Generator","version":"1.2.2","tagline":"Generate customizable 3D-printable cards, tags, and keychains","archive_hash":"sha256:61fc9b726002f7cd17ffb5b1e54bfa1827e8edf538881e72749f4faf931dc384","archive_size":513576,"archive_url":"https://extensions.blender.org/download/sha256:61fc9b726002f7cd17ffb5b1e54bfa1827e8edf538881e72749f4faf931dc384/add-on-nfc-card-keychain-generator-v1.2.2.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/nfc-card-keychain-generator/","maintainer":"Clonephaze","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"For custom SVG import and file saving operations"},"tags":["Modeling","Object"]},{"id":"Physical_Motion_Blur","schema_version":"1.0.0","name":"Physical Motion Blur","version":"1.1.0","tagline":"Adds intuitive shutter speed and angle controls for motion blur","archive_hash":"sha256:b74e16e526349842371e5b688e7f95e4fbaf60284d413c025c30de5989a51438","archive_size":2605,"archive_url":"https://extensions.blender.org/download/sha256:b74e16e526349842371e5b688e7f95e4fbaf60284d413c025c30de5989a51438/add-on-physical-motion-blur-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/physical-motion-blur/","maintainer":"K_Naoki","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","Render","Animation"]},{"id":"utility_materials","schema_version":"1.0.0","name":"Utility Materials","version":"1.1.5","tagline":"Industrial design theme in the Utility Materials universe","archive_hash":"sha256:1060b83f61823e30cac6147ad365e0e2532132ba85719a73fb8a881b1daee82f","archive_size":5294,"archive_url":"https://extensions.blender.org/download/sha256:1060b83f61823e30cac6147ad365e0e2532132ba85719a73fb8a881b1daee82f/theme-utility-materials-v1.1.5.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/utility-materials/","maintainer":"Utility-Materials","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"AddShaderAttribute","schema_version":"1.0.0","name":"Add Shader Attribute","version":"0.3.0","tagline":"Add attribute directly in shader nodetree","archive_hash":"sha256:94c6c429e385ec1bdd70aab48b4664b72ab7e4af3336b4acc96be2d3f4d02707","archive_size":2591,"archive_url":"https://extensions.blender.org/download/sha256:94c6c429e385ec1bdd70aab48b4664b72ab7e4af3336b4acc96be2d3f4d02707/add-on-addshaderattribute-v0.3.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/addshaderattribute/","maintainer":"atticuslv","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","Node"]},{"id":"all_objects_into_assets","schema_version":"1.0.0","name":"All Objects into Assets","version":"1.0.4","tagline":"Create collection assets and catalogs automatically","archive_hash":"sha256:10d9d4dfc45855e34afbec1e7fc88d8576ab201701abf0d4c5876eac65dd52a7","archive_size":9361,"archive_url":"https://extensions.blender.org/download/sha256:10d9d4dfc45855e34afbec1e7fc88d8576ab201701abf0d4c5876eac65dd52a7/add-on-all-objects-into-assets-v1.0.4.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/all-objects-into-assets/","maintainer":"StellArc","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write asset library catalogs file"}},{"id":"goldsrc_model_helper","schema_version":"1.0.0","name":"GS Model Helper","version":"2.2.0","tagline":"A set of tools for working with Goldsource models in Blender","archive_hash":"sha256:074531c7e337f1e88d36dfdec5ad2f698b8d18aa7e916008120c6105846b98df","archive_size":7626,"archive_url":"https://extensions.blender.org/download/sha256:074531c7e337f1e88d36dfdec5ad2f698b8d18aa7e916008120c6105846b98df/add-on-goldsrc-model-helper-v2.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/goldsrc-model-helper/","maintainer":"DaKashi","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Required to rename and clean up materials/textures"}},{"id":"pjavel_theme","schema_version":"1.0.0","name":"Pjavel Theme","version":"1.2.0","tagline":"Green accent theme","archive_hash":"sha256:c44781868a1af9a7f5c716e182d487c848d207ea01aff695f79d55f06266b254","archive_size":18642,"archive_url":"https://extensions.blender.org/download/sha256:c44781868a1af9a7f5c716e182d487c848d207ea01aff695f79d55f06266b254/theme-pjavel-theme-v1.2.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/pjavel-theme/","maintainer":"Zexyp","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"text_editor_for_development","schema_version":"1.0.0","name":"Text editor for Development","version":"1.0.7","tagline":"Text editor enhancements for add-on development","archive_hash":"sha256:132e0df040832a572a759c89205edf203a296822af651a7db49a3c99d1a1edf2","archive_size":340600,"archive_url":"https://extensions.blender.org/download/sha256:132e0df040832a572a759c89205edf203a296822af651a7db49a3c99d1a1edf2/add-on-text-editor-for-development-v1.0.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/text-editor-for-development/","maintainer":"Martin-Lorentzon","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Specify folder to preview for file-browsing/editing","network":"Clone remote Git repositories for add-on templates"},"tags":["Text Editor","Development"]},{"id":"bfds","schema_version":"1.0.0","name":"BFDS fire simulations","version":"7.0.0","tagline":"Create and manage NIST FDS fire simulations","archive_hash":"sha256:27de24b26775e38e30d5813ad436c3aaa8b38429728ebc191446eaa71491ccb6","archive_size":370951,"archive_url":"https://extensions.blender.org/download/sha256:27de24b26775e38e30d5813ad436c3aaa8b38429728ebc191446eaa71491ccb6/add-on-bfds-v7.0.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/bfds/","maintainer":"emanuele.gissi","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export FDS files from/to disk","network":"Display geographic positions, convert coordinates"},"tags":["Import-Export"]},{"id":"sciblend","schema_version":"1.0.0","name":"SciBlend","version":"1.1.2","tagline":"Scientific visualization tools for Blender","archive_hash":"sha256:a0ea43e82838e33a8fbd691bdabd3342242093dd484a1909d70e3bc024da554d","archive_size":143536802,"archive_url":"https://extensions.blender.org/download/sha256:a0ea43e82838e33a8fbd691bdabd3342242093dd484a1909d70e3bc024da554d/add-on-sciblend-v1.1.2-windows-x64.zip","type":"add-on","blender_version_min":"4.5.1","website":"https://extensions.blender.org/add-ons/sciblend/","maintainer":"José-Marín","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Import-Export"]},{"id":"navigation_puck_addon","schema_version":"1.0.0","name":"Navigation Puck Addon","version":"1.0.1","tagline":"Navigation Puck like in Sketchbook Pro","archive_hash":"sha256:a0b4620698e8a925607fd3288d0738f4c20ecd5397c9d8c35ad7199981e15e51","archive_size":14528,"archive_url":"https://extensions.blender.org/download/sha256:a0b4620698e8a925607fd3288d0738f4c20ecd5397c9d8c35ad7199981e15e51/add-on-navigation-puck-addon-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/navigation-puck-addon/","maintainer":"IliaVerpa","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface","3D View"]},{"id":"midicontroller","schema_version":"1.0.0","name":"MidiController","version":"0.1.6","tagline":"Control objects properties through midi","archive_hash":"sha256:bb2e01e67b347e8b11cce2b30d2b037fb5eb45e183815c5c5d546a03941d08a0","archive_size":165336,"archive_url":"https://extensions.blender.org/download/sha256:bb2e01e67b347e8b11cce2b30d2b037fb5eb45e183815c5c5d546a03941d08a0/add-on-midicontroller-v0.1.6-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/midicontroller/","maintainer":"Eldin-Zenderink","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["User Interface","Animation"]},{"id":"mc_animaker","schema_version":"1.0.0","name":"MC Animaker","version":"1.4.0","tagline":"Bring your Blender animations to life in Minecraft","archive_hash":"sha256:b3533f2c1b1ff605d0c162023d27096d92c4ff705577f72738ebc4981701c830","archive_size":183928,"archive_url":"https://extensions.blender.org/download/sha256:b3533f2c1b1ff605d0c162023d27096d92c4ff705577f72738ebc4981701c830/add-on-mc-animaker-v1.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mc-animaker/","maintainer":"Priqnot","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import Resource Packs and Export Minecraft Datapack Files"},"tags":["Game Engine","Import-Export"]},{"id":"smart_transform","schema_version":"1.0.0","name":"Smart Transform","version":"1.0.2","tagline":"filter objects by size or transforms, and more tools","archive_hash":"sha256:7b4fa468f7ad58552ec1b6be1d2f2c3f0ed2bfe19da271042e38a661c4cfdd11","archive_size":2671,"archive_url":"https://extensions.blender.org/download/sha256:7b4fa468f7ad58552ec1b6be1d2f2c3f0ed2bfe19da271042e38a661c4cfdd11/add-on-smart-transform-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/smart-transform/","maintainer":"Claz_Arts","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"animated_brush","schema_version":"1.0.0","name":"Animated Texture Brush","version":"1.0.2","tagline":"Randomly cycles image sequence texture while painting","archive_hash":"sha256:8903fadaf19661e63c6b7b60b805b2e11121e567ce9eb51f42f81b0aba76c7be","archive_size":2467,"archive_url":"https://extensions.blender.org/download/sha256:8903fadaf19661e63c6b7b60b805b2e11121e567ce9eb51f42f81b0aba76c7be/add-on-animated-brush-v1.0.2.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/animated-brush/","maintainer":"Kvendy","license":["SPDX:GPL-3.0-or-later"],"tags":["Paint"]},{"id":"lod_gen","schema_version":"1.0.0","name":"LODGen","version":"0.0.5","tagline":"Generate LODs for Games in 3 Clicks or Less","archive_hash":"sha256:0f2ab6b571315bee02068eb61a0ff972c25beea69acf0d2f0aec8a0b8dcc5128","archive_size":15434,"archive_url":"https://extensions.blender.org/download/sha256:0f2ab6b571315bee02068eb61a0ff972c25beea69acf0d2f0aec8a0b8dcc5128/add-on-lod-gen-v0.0.5.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/lod-gen/","maintainer":"F1dg3t","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh"]},{"id":"LostSelection","schema_version":"1.0.0","name":"Lost Selection","version":"0.2.0","tagline":"Set of usefull extra selection operators","archive_hash":"sha256:b86837ae75d5de7867114f1a0b038fa522a5628bfcbc9073a4083570f857fcb4","archive_size":32205,"archive_url":"https://extensions.blender.org/download/sha256:b86837ae75d5de7867114f1a0b038fa522a5628bfcbc9073a4083570f857fcb4/add-on-lostselection-v0.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/lostselection/","maintainer":"niewinny","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Mesh"]},{"id":"reset_workspace","schema_version":"1.0.0","name":"Reset Workspace","version":"0.0.4","tagline":"Reset the user interface (with your startup file interface)","archive_hash":"sha256:35cef23e81719101cd3d7616c08d4804c419417c57abd7be68d11b296d1f9a32","archive_size":5093,"archive_url":"https://extensions.blender.org/download/sha256:35cef23e81719101cd3d7616c08d4804c419417c57abd7be68d11b296d1f9a32/add-on-reset-workspace-v0.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/reset-workspace/","maintainer":"Trukas","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"edit_instanced_collection","schema_version":"1.0.0","name":"Edit Instanced Collection","version":"0.0.5","tagline":"Quickly find the instanced collection source","archive_hash":"sha256:82b58677725d9892cf2e272a657f498903a17aa057cb0a432dababc18f8db6e3","archive_size":6971,"archive_url":"https://extensions.blender.org/download/sha256:82b58677725d9892cf2e272a657f498903a17aa057cb0a432dababc18f8db6e3/add-on-edit-instanced-collection-v0.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/edit-instanced-collection/","maintainer":"Trukas","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","User Interface"]},{"id":"add_std_paper_size","schema_version":"1.0.0","name":"Add Std Paper-Format","version":"0.1.0","tagline":"Blender add-on to add planes with standardized paper formats","archive_hash":"sha256:d8699b5786b94d157a53a2322b82da1c49fcf833f42d36a3fd143d7d51796ed4","archive_size":19785,"archive_url":"https://extensions.blender.org/download/sha256:d8699b5786b94d157a53a2322b82da1c49fcf833f42d36a3fd143d7d51796ed4/add-on-add-std-paper-size-v0.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/add-std-paper-size/","maintainer":"BsIngA","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh"]},{"id":"Blueprint_Film_Theme","schema_version":"1.0.0","name":"Blueprint_Film_Theme","version":"2.2.6","tagline":"Translucent Aqua","archive_hash":"sha256:86191cf09c337b9e1fcef89b24988f855f2ea05fef764f05f6965ebc87692145","archive_size":5735,"archive_url":"https://extensions.blender.org/download/sha256:86191cf09c337b9e1fcef89b24988f855f2ea05fef764f05f6965ebc87692145/theme-blueprint-film-theme-v2.2.6.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/blueprint-film-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"pbsu_addon_3ds","schema_version":"1.0.0","name":"PBSU 3D Studio (.3ds)","version":"1.0.1","tagline":"Import/export 3DS scenes, objects, cameras, lights & anims","archive_hash":"sha256:347858569d753e688770e2f73c1d75b9787ccb69ce86e6fdbb08d06483a4814d","archive_size":42631,"archive_url":"https://extensions.blender.org/download/sha256:347858569d753e688770e2f73c1d75b9787ccb69ce86e6fdbb08d06483a4814d/add-on-pbsu-addon-3ds-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pbsu-addon-3ds/","maintainer":"Arturo-Cervantes","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import and export Autodesk 3DS files"},"tags":["Import-Export","Scene","Object","Camera","Lighting","Animation"]},{"id":"on_screen_numpad","schema_version":"1.0.0","name":"On-Screen Numpad","version":"1.2.1","tagline":"No need to leave the mouse to enter numbers","archive_hash":"sha256:4c16d0f6f007afdadcf931efbba4ae2d31924a3a9e13aeacf05531202de5b71d","archive_size":23277,"archive_url":"https://extensions.blender.org/download/sha256:4c16d0f6f007afdadcf931efbba4ae2d31924a3a9e13aeacf05531202de5b71d/add-on-on-screen-numpad-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"6.0.0","website":"https://extensions.blender.org/add-ons/on-screen-numpad/","maintainer":"Pluglug","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"Sakura_Rig_GUI","schema_version":"1.0.0","name":"Sakura's Rig Interfaces","version":"3.1.0","tagline":"A control script for use with Sakura's Rigs","archive_hash":"sha256:98421bd610dd89103aa63177dd25a3bb04e8a71899ad0c93dcba026908e07bf0","archive_size":23119,"archive_url":"https://extensions.blender.org/download/sha256:98421bd610dd89103aa63177dd25a3bb04e8a71899ad0c93dcba026908e07bf0/add-on-sakura-rig-gui-v3.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sakura-rig-gui/","maintainer":"SakuraSedaia","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save and Store Player Skin Information and Downloaded Rigs","network":"Download Minecraft Skin Information from minecraft.net"},"tags":["Rigging","User Interface"]},{"id":"EMU3BM","schema_version":"1.0.0","name":"Toggle Emulate 3 Button Mouse","version":"1.4.0","tagline":"Toggle Emulate 3 Button Mouse","archive_hash":"sha256:4403771643b6e2cae32cecd67a98fea219c3b89a72424207fc3c9640574d2593","archive_size":1343,"archive_url":"https://extensions.blender.org/download/sha256:4403771643b6e2cae32cecd67a98fea219c3b89a72424207fc3c9640574d2593/add-on-emu3bm-v1.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/emu3bm/","maintainer":"chenkin123","license":["SPDX:GPL-3.0-or-later"],"tags":["System"]},{"id":"BL_EasyCrop","schema_version":"1.0.0","name":"BL Easy Crop","version":"2.0.3","tagline":"Use handles for easy cropping in the Blender VSE Preview window","archive_hash":"sha256:f63200c2f634b927cc0ccf82af20aa4298f36f5f5bfbcfdfc85f20adf4a2d9da","archive_size":31082,"archive_url":"https://extensions.blender.org/download/sha256:f63200c2f634b927cc0ccf82af20aa4298f36f5f5bfbcfdfc85f20adf4a2d9da/add-on-bl-easycrop-v2.0.3.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/bl-easycrop/","maintainer":"usrname0","license":["SPDX:GPL-3.0-or-later"],"tags":["Sequencer","User Interface"]},{"id":"SHIRAKUMO_sf3_io","schema_version":"1.0.0","name":"Shirakumo SF3 IO","version":"1.1.0","tagline":"Export/Import support for Simple File Format Family (SF3) files","archive_hash":"sha256:ea929db922904ace800e75192ed57225db3c960f44e2d6b419bddb4041f2116c","archive_size":24064,"archive_url":"https://extensions.blender.org/download/sha256:ea929db922904ace800e75192ed57225db3c960f44e2d6b419bddb4041f2116c/add-on-shirakumo-sf3-io-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shirakumo-sf3-io/","maintainer":"shinmera","license":["SPDX:GPL-3.0-or-later","SPDX:Zlib"],"permissions":{"files":"Import/export SF3 from/to disk"},"tags":["Import-Export"]},{"id":"normalize_resize_handles","schema_version":"1.0.0","name":"Normalize and Resize Curve Handles","version":"1.0.1","tagline":"Normalize and resize all selected bezier curve handles","archive_hash":"sha256:38d20ad9da74d2f832b4d2cf7ecbe874dc208c2cfacf2f1849ac85aed7751b4a","archive_size":1537,"archive_url":"https://extensions.blender.org/download/sha256:38d20ad9da74d2f832b4d2cf7ecbe874dc208c2cfacf2f1849ac85aed7751b4a/add-on-normalize-resize-handles-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/normalize-resize-handles/","maintainer":"TomasCJ","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling"]},{"id":"FocalLengthTweaker","schema_version":"1.0.0","name":"Focal Length Tweaker","version":"1.0.1","tagline":"Control viewport and camera focal length with your mouse","archive_hash":"sha256:2cae7c140124fbcc68d9fa8b93b5152d9d81f1e3eaf26ff14fc906dc6d99b833","archive_size":9686,"archive_url":"https://extensions.blender.org/download/sha256:2cae7c140124fbcc68d9fa8b93b5152d9d81f1e3eaf26ff14fc906dc6d99b833/add-on-focallengthtweaker-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/focallengthtweaker/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","User Interface"]},{"id":"Zeratul_Theme","schema_version":"1.0.0","name":"Zeratul_Theme","version":"3.1.8","tagline":"Invisible Shadow Warrior","archive_hash":"sha256:f4466e17351aff934bb73b3e0c5ba4a98e92dd0d4ba8b882d4e47ce4a48466d0","archive_size":5668,"archive_url":"https://extensions.blender.org/download/sha256:f4466e17351aff934bb73b3e0c5ba4a98e92dd0d4ba8b882d4e47ce4a48466d0/theme-zeratul-theme-v3.1.8.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/zeratul-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"Prussian_Blueprint_Theme","schema_version":"1.0.0","name":"Prussian_Blueprint_Theme","version":"2.2.1","tagline":"Blueprint True Color","archive_hash":"sha256:482f3d41ae95cf10ab32d9ad57bed3093edb67334ed7043511174da53c6558d3","archive_size":5748,"archive_url":"https://extensions.blender.org/download/sha256:482f3d41ae95cf10ab32d9ad57bed3093edb67334ed7043511174da53c6558d3/theme-prussian-blueprint-theme-v2.2.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/prussian-blueprint-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"render_webhook","schema_version":"1.0.0","name":"Render Webhook","version":"1.0.2","tagline":"Sends a message after render events to a webhook","archive_hash":"sha256:38cc7b54f014a6cd7d3c2d6f4928372749fb2a57ffd1b87df4fbc34550c6ed58","archive_size":2567,"archive_url":"https://extensions.blender.org/download/sha256:38cc7b54f014a6cd7d3c2d6f4928372749fb2a57ffd1b87df4fbc34550c6ed58/add-on-render-webhook-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/render-webhook/","maintainer":"vignette","license":["SPDX:GPL-3.0-or-later"],"permissions":{"network":"Sending HTTP requests to provided webhook URL"},"tags":["Render","Pipeline"]},{"id":"Prussian_Blue_Pink_Theme","schema_version":"1.0.0","name":"Prussian_Blue_Pink_Theme","version":"2.1.0","tagline":"Nobiscum Deus","archive_hash":"sha256:6a745c8e64585bb668ee043aae3bc9bbe3196eabca082e27581645c0da576356","archive_size":5758,"archive_url":"https://extensions.blender.org/download/sha256:6a745c8e64585bb668ee043aae3bc9bbe3196eabca082e27581645c0da576356/theme-prussian-blue-pink-theme-v2.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/prussian-blue-pink-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"Prussian_Blue_Theme","schema_version":"1.0.0","name":"Prussian_Blue_Theme","version":"2.1.0","tagline":"Nobiscum Deus","archive_hash":"sha256:14590a27309685bd49ad5c1aabbfd273b137578094be7850af79d66ae855e135","archive_size":5687,"archive_url":"https://extensions.blender.org/download/sha256:14590a27309685bd49ad5c1aabbfd273b137578094be7850af79d66ae855e135/theme-prussian-blue-theme-v2.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/prussian-blue-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"Clip_Tools","schema_version":"1.0.0","name":"Clip Tools","version":"1.0.3","tagline":"Add a simple tool to the Movie Clip Editor","archive_hash":"sha256:d349847bf1ec2be9a84678e356b11815f070ea75f15550a52f18b1ab737bd391","archive_size":7924,"archive_url":"https://extensions.blender.org/download/sha256:d349847bf1ec2be9a84678e356b11815f070ea75f15550a52f18b1ab737bd391/add-on-clip-tools-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/clip-tools/","maintainer":"K_Naoki","license":["SPDX:GPL-3.0-or-later"],"tags":["Tracking","Camera","3D View"]},{"id":"Merge_selected_cameras","schema_version":"1.0.0","name":"Merge Selected Cameras","version":"1.1.1","tagline":"Create one animated camera from your photogrammetry sequence","archive_hash":"sha256:37e9a6363b92571e6fd33f41edf887d72f63a4e64b6c0a9ca0c5014ea6a0b37d","archive_size":4219,"archive_url":"https://extensions.blender.org/download/sha256:37e9a6363b92571e6fd33f41edf887d72f63a4e64b6c0a9ca0c5014ea6a0b37d/add-on-merge-selected-cameras-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/merge-selected-cameras/","maintainer":"K_Naoki","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","Tracking","3D View"]},{"id":"only_blends_gamepad","schema_version":"1.0.0","name":"OnlyBlends.Gamepad","version":"0.5.1-1","tagline":"Integrate Controller like Gamepads and other inputs via Nodes","archive_hash":"sha256:af3b4e9117c2afae95c3b7c2477983255b38d5688e53182b6116af29704f4629","archive_size":76590,"archive_url":"https://extensions.blender.org/download/sha256:af3b4e9117c2afae95c3b7c2477983255b38d5688e53182b6116af29704f4629/add-on-only-blends-gamepad-v0.5.1-1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/only-blends-gamepad/","maintainer":"Zulhakar","license":["SPDX:GPL-3.0-or-later"],"tags":["Game Engine","Node"]},{"id":"Scene_Duration_Display","schema_version":"1.0.0","name":"Scene Duration Display","version":"1.1.1","tagline":"Displays and syncs timeline duration. Set preview range with I/O","archive_hash":"sha256:ecb84336ac892b588d1fcbdb40da045ce82c73b4869630d9fec11d4cf872a940","archive_size":2361,"archive_url":"https://extensions.blender.org/download/sha256:ecb84336ac892b588d1fcbdb40da045ce82c73b4869630d9fec11d4cf872a940/add-on-scene-duration-display-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/scene-duration-display/","maintainer":"K_Naoki","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"Gray50","schema_version":"1.0.0","name":"Gray50","version":"1.0.4","tagline":"Remake of Blender3.3 light theme","archive_hash":"sha256:91811b6899d561616cd2ae8d9c9f597eb88bbf9c06108d78a6ce4725e5abeb3f","archive_size":6142,"archive_url":"https://extensions.blender.org/download/sha256:91811b6899d561616cd2ae8d9c9f597eb88bbf9c06108d78a6ce4725e5abeb3f/theme-gray50-v1.0.4.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/gray50/","maintainer":"Nick2321","license":["SPDX:GPL-2.0-or-later"],"tags":["Light","Inspired By"]},{"id":"bl_reset_custom_properties","schema_version":"1.0.0","name":"Reset Custom Properties","version":"1.0.4","tagline":"Reset custom properties to their default values","archive_hash":"sha256:f616677a285d385eb5ae5b60791f7d33656fb6914326eac58ae1b3d069a533b4","archive_size":5646,"archive_url":"https://extensions.blender.org/download/sha256:f616677a285d385eb5ae5b60791f7d33656fb6914326eac58ae1b3d069a533b4/add-on-bl-reset-custom-properties-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bl-reset-custom-properties/","maintainer":"Lauloque","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","3D View"]},{"id":"nla_batch_editor","schema_version":"1.0.0","name":"NLA Batch Editor","version":"1.1.0","tagline":"Batch editing for NLA Editor","archive_hash":"sha256:ab1e67b8b7f624dde678548ea94bf0378a597deccecd8745a14e130cd79770cd","archive_size":20602,"archive_url":"https://extensions.blender.org/download/sha256:ab1e67b8b7f624dde678548ea94bf0378a597deccecd8745a14e130cd79770cd/add-on-nla-batch-editor-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nla-batch-editor/","maintainer":"c4205m","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"color_grid_texture_gen","schema_version":"1.0.0","name":"Color Grid Texture Generator","version":"0.1.2","tagline":"Generate customizable color grid textures","archive_hash":"sha256:f5e0ad6b318cca21a773d071af6df303b1d4ec419bdd514e086aca95bc510a9f","archive_size":28692,"archive_url":"https://extensions.blender.org/download/sha256:f5e0ad6b318cca21a773d071af6df303b1d4ec419bdd514e086aca95bc510a9f/add-on-color-grid-texture-gen-v0.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/color-grid-texture-gen/","maintainer":"andersmmg","license":["SPDX:GPL-3.0-or-later"],"permissions":{"clipboard":"Read Coolors URL from clipboard"},"tags":["Material","UV"]},{"id":"io_import_build_map","schema_version":"1.0.0","name":"BUILD Map Importer","version":"1.4.1","tagline":"Import BUILD Engine maps as used in Duke Nukem 3D, Blood, etc","archive_hash":"sha256:d167ef8d1580c381dd1ef6378302b7918d493e67c7317be3fafaea9cf70d6c54","archive_size":57108,"archive_url":"https://extensions.blender.org/download/sha256:d167ef8d1580c381dd1ef6378302b7918d493e67c7317be3fafaea9cf70d6c54/add-on-io-import-build-map-v1.4.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-import-build-map/","maintainer":"Jens.Ne","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import .map files and textures from filesystem"},"tags":["Import-Export","Mesh","Material"]},{"id":"distribute_grease_pencil_strokes","schema_version":"1.0.0","name":"Align-Distribute Grease Pencil Strokes","version":"2.1.0","tagline":"Align-Distribute Grease Pencil strokes","archive_hash":"sha256:e8075d9b8af883ab77be48eb51d424acf51860f408970ec54393f29ec45f1ab2","archive_size":13284,"archive_url":"https://extensions.blender.org/download/sha256:e8075d9b8af883ab77be48eb51d424acf51860f408970ec54393f29ec45f1ab2/add-on-distribute-grease-pencil-strokes-v2.1.0.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/distribute-grease-pencil-strokes/","maintainer":"JohnNyquist","license":["SPDX:GPL-3.0-or-later"],"tags":["Grease Pencil"]},{"id":"BL_FastStart","schema_version":"1.0.0","name":"BL Fast Start (MP4/MOV)","version":"1.9.3","tagline":"A checkbox to add a 'Fast Start' copy of MP4/MOV renders","archive_hash":"sha256:e1954e4b7c112e82249144fe3d2c6a17ab77a256c63f5f3d82c424812197c4a4","archive_size":23184,"archive_url":"https://extensions.blender.org/download/sha256:e1954e4b7c112e82249144fe3d2c6a17ab77a256c63f5f3d82c424812197c4a4/add-on-bl-faststart-v1.9.3.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/bl-faststart/","maintainer":"usrname0","license":["SPDX:GPL-3.0-or-later"],"tags":["Render","User Interface"]},{"id":"quantum_void_fluoamber","schema_version":"1.0.0","name":"Quantum Void FluoAmber","version":"1.0.2","tagline":"A monochromatic dark theme with accent","archive_hash":"sha256:6506841912f52525e1ae2d12d9ce2ac9316676f0bc7684374ab3847731dad70f","archive_size":3205,"archive_url":"https://extensions.blender.org/download/sha256:6506841912f52525e1ae2d12d9ce2ac9316676f0bc7684374ab3847731dad70f/theme-quantum-void-fluoamber-v1.0.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/quantum-void-fluoamber/","maintainer":"Dimona-Patrick-243","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"vectart_animation","schema_version":"1.0.0","name":"Vectart Animation","version":"1.1.4","tagline":"Animation tools for VectArt curves and objects","archive_hash":"sha256:d35ccba3d1fc4ca478edbebdc2620409071d1ebbb4e70d02218a5e15a06972eb","archive_size":22398,"archive_url":"https://extensions.blender.org/download/sha256:d35ccba3d1fc4ca478edbebdc2620409071d1ebbb4e70d02218a5e15a06972eb/add-on-vectart-animation-v1.1.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/vectart-animation/","maintainer":"Dimona-Patrick-243","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"blueprints","schema_version":"1.0.0","name":"Blueprints","version":"1.0.3","tagline":"Manage background images ","archive_hash":"sha256:f148d686256514f105c8dfe1b240b8c189b148b47ae426c485ae35ab7d77aaa9","archive_size":3264,"archive_url":"https://extensions.blender.org/download/sha256:f148d686256514f105c8dfe1b240b8c189b148b47ae426c485ae35ab7d77aaa9/add-on-blueprints-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blueprints/","maintainer":"Blenderbob","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling"]},{"id":"batch_render_actions","schema_version":"1.0.0","name":"Batch Render Actions","version":"1.0.2","tagline":"Render each animation action to its own folder","archive_hash":"sha256:c91187783a22ac88e4847f57bc33f32f5d7954fb6564886839e9b44a4cd05cff","archive_size":2413,"archive_url":"https://extensions.blender.org/download/sha256:c91187783a22ac88e4847f57bc33f32f5d7954fb6564886839e9b44a4cd05cff/add-on-batch-render-actions-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/batch-render-actions/","maintainer":"Padraig-O-Cinneide","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Render"]},{"id":"rmKit_uv","schema_version":"1.0.0","name":"rmKitUV","version":"2.0.0","tagline":"Collection of Tools","archive_hash":"sha256:cd75170fc5d652ba6e52a70939949480ea78a7417b7608e7c2d2c1fb48b3360e","archive_size":259364,"archive_url":"https://extensions.blender.org/download/sha256:cd75170fc5d652ba6e52a70939949480ea78a7417b7608e7c2d2c1fb48b3360e/add-on-rmkit-uv-v2.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/rmkit-uv/","maintainer":"Timothee-Yeramian","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"read/write hotspots to disk"},"tags":["Mesh","UV","Material"]},{"id":"to_square","schema_version":"1.0.0","name":"To Square","version":"2.2.1","tagline":"Square the selection","archive_hash":"sha256:3b16a9910f54d5a29418388ee1f20a1ff5fefbc30628c0c83cb15063d2364688","archive_size":43737,"archive_url":"https://extensions.blender.org/download/sha256:3b16a9910f54d5a29418388ee1f20a1ff5fefbc30628c0c83cb15063d2364688/add-on-to-square-v2.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/to-square/","maintainer":"Jean-Yves-Grosbeau","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"acreplay_importer","schema_version":"1.0.0","name":"AC Replay Importer","version":"0.3.0","tagline":"Animate your cars using Assetto Corsa replays","archive_hash":"sha256:4d91f27fa56cd998c9b2b8ee421d537627413a2dd0d98358ce8a0260fb5b00da","archive_size":8688,"archive_url":"https://extensions.blender.org/download/sha256:4d91f27fa56cd998c9b2b8ee421d537627413a2dd0d98358ce8a0260fb5b00da/add-on-acreplay-importer-v0.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/acreplay-importer/","maintainer":"abchouhan","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import CSV from disk"},"tags":["Animation"]},{"id":"dynamic_head_property_manager","schema_version":"1.0.0","name":"Dynamic Head Property Manager","version":"1.0.7","tagline":"Manage custom facial properties for Roblox Bundles","archive_hash":"sha256:ca7ee4063be416c9a82c1552a97efbf4227b4ce210826547e2b8cd164a418e5b","archive_size":26446,"archive_url":"https://extensions.blender.org/download/sha256:ca7ee4063be416c9a82c1552a97efbf4227b4ce210826547e2b8cd164a418e5b/add-on-dynamic-head-property-manager-v1.0.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dynamic-head-property-manager/","maintainer":"Cloud-Guy","license":["SPDX:GPL-3.0-or-later"]},{"id":"enhanced_svg","schema_version":"1.0.0","name":"Enhanced SVG","version":"0.1.8","tagline":"Import SVG with accurate colors and path processing","archive_hash":"sha256:a65d052cf43ccc95fbd475eecdde5ecfb343e9c69dbaae6a3cc6dfca2899f3b2","archive_size":4067305,"archive_url":"https://extensions.blender.org/download/sha256:a65d052cf43ccc95fbd475eecdde5ecfb343e9c69dbaae6a3cc6dfca2899f3b2/add-on-enhanced-svg-v0.1.8-windows-x64.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/enhanced-svg/","maintainer":"Jan-Hendrik-Müller","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Importing data files from disk"},"platforms":["windows-x64"],"tags":["Import-Export"]},{"id":"M2V","schema_version":"1.0.0","name":"MIDI To Visuals","version":"1.2.0","tagline":"With MIDI file as input create somes 3D animations in blender","archive_hash":"sha256:41df46ef9449fb6aa01515bbdc077007b472e024683bf1f62241fda5b7342ae1","archive_size":41169,"archive_url":"https://extensions.blender.org/download/sha256:41df46ef9449fb6aa01515bbdc077007b472e024683bf1f62241fda5b7342ae1/add-on-m2v-v1.2.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/m2v/","maintainer":"Patochun","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"separate_loose_plus","schema_version":"1.0.0","name":"Separate Loose Plus","version":"1.0.0","tagline":"Enhanced mesh separation tools with object tracking","archive_hash":"sha256:944ad096034743a6fef458b743b445f076abd55dd41698eb83f6d94d6085b7a5","archive_size":1973,"archive_url":"https://extensions.blender.org/download/sha256:944ad096034743a6fef458b743b445f076abd55dd41698eb83f6d94d6085b7a5/add-on-separate-loose-plus-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/separate-loose-plus/","maintainer":"RobbieK","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"bve_import_export","schema_version":"1.0.0","name":"BVE Import/Export","version":"5.1.3","tagline":"Import/Export DirectX X (.x) or Export CSV files for BVE/OpenBVE","archive_hash":"sha256:23092e0894371d7d2fdf638fec806a949100f719eb7d39f7be2a87d693add984","archive_size":22514,"archive_url":"https://extensions.blender.org/download/sha256:23092e0894371d7d2fdf638fec806a949100f719eb7d39f7be2a87d693add984/add-on-bve-import-export-v5.1.3.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/bve-import-export/","maintainer":"Kusaanko","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export model file from/to disk"},"tags":["Import-Export"]},{"id":"symple","schema_version":"1.0.0","name":"Symple (symmetry groups)","version":"0.1.2","tagline":"Create figures with spherical symmetry with ease","archive_hash":"sha256:d896c95bba01abaaf56f2c5f6c741c51b63ca097915427aa7ade2315094376c3","archive_size":29123,"archive_url":"https://extensions.blender.org/download/sha256:d896c95bba01abaaf56f2c5f6c741c51b63ca097915427aa7ade2315094376c3/add-on-symple-v0.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/symple/","maintainer":"Martín-Torres-Valverde","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh","Modeling","Object"]},{"id":"select_by_index","schema_version":"1.0.0","name":"Select By Index","version":"1.3.0","tagline":"Select all vertices, edges, or faces within an index range","archive_hash":"sha256:bd41c77ef889b5b84174a0cf88c41ebd6526046f82eb196fc9528ed43232e050","archive_size":3131,"archive_url":"https://extensions.blender.org/download/sha256:bd41c77ef889b5b84174a0cf88c41ebd6526046f82eb196fc9528ed43232e050/add-on-select-by-index-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/select-by-index/","maintainer":"Eric-Banker","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"blender_lut_exporter","schema_version":"1.0.0","name":"LUT Exporter and Importer","version":"2.0.1","tagline":"Converts adjustment layer into LUT .cube file and back","archive_hash":"sha256:7e0e7b2b951f02114cebb97c5c44ffeacb93b28278107b3ac87b9e5b6f064bcd","archive_size":5588,"archive_url":"https://extensions.blender.org/download/sha256:7e0e7b2b951f02114cebb97c5c44ffeacb93b28278107b3ac87b9e5b6f064bcd/add-on-blender-lut-exporter-v2.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/blender-lut-exporter/","maintainer":"ichlubna","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Sequencer"]},{"id":"arc_edge","schema_version":"1.0.0","name":"Arc Edge","version":"1.1.0","tagline":"Arc Edge","archive_hash":"sha256:2a3d3700534566d81d8202a795db594b1e36f407368276319a1141e67419bb4f","archive_size":10986,"archive_url":"https://extensions.blender.org/download/sha256:2a3d3700534566d81d8202a795db594b1e36f407368276319a1141e67419bb4f/add-on-arc-edge-v1.1.0.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/arc-edge/","maintainer":"dartmeadow","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Curve"]},{"id":"Render_from_Terminal","schema_version":"1.0.0","name":"Render from Terminal","version":"0.1.5","tagline":"Create script to launch render from terminal","archive_hash":"sha256:4d6f2ccd813bb51a7082467919ea0b4bc95fd31d1df952747a00ed4e5fa7d0d3","archive_size":10030,"archive_url":"https://extensions.blender.org/download/sha256:4d6f2ccd813bb51a7082467919ea0b4bc95fd31d1df952747a00ed4e5fa7d0d3/add-on-render-from-terminal-v0.1.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/render-from-terminal/","maintainer":"nukkio","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Create script to render from terminal"},"tags":["Render","Pipeline"]},{"id":"Fabnodes","schema_version":"1.0.0","name":"Fabnodes","version":"0.0.3","tagline":"Generates G-Code from geometry node attributes","archive_hash":"sha256:ca120a678f58ef1c62a12dd4b1ac055d79d7cbdf76bf6f22b609224a62ac2281","archive_size":5343,"archive_url":"https://extensions.blender.org/download/sha256:ca120a678f58ef1c62a12dd4b1ac055d79d7cbdf76bf6f22b609224a62ac2281/add-on-fabnodes-v0.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/fabnodes/","maintainer":"luigipacheco","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Geometry Nodes"]},{"id":"substance_textures_importer","schema_version":"1.0.0","name":"Substance Textures Importer","version":"7.2.0","tagline":"Import & autoassign images from 3D painting tools like Substance","archive_hash":"sha256:625b71a17605867443eb678fbe9a3f79653e01c45ed73573d957343fe868ebae","archive_size":35651,"archive_url":"https://extensions.blender.org/download/sha256:625b71a17605867443eb678fbe9a3f79653e01c45ed73573d957343fe868ebae/add-on-substance-textures-importer-v7.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/substance-textures-importer/","maintainer":"Cosmin_Planchon","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import images from disk & read/write customs presets"},"tags":["Material","Import-Export","Node"]},{"id":"slot_link","schema_version":"1.0.0","name":"Slot Link","version":"0.0.11","tagline":"Easily manage projects with multiple separate animations","archive_hash":"sha256:aec6c11bef46dadb552838b00e82a63637ee4dd0c77f21a5fef886317a5a6bab","archive_size":21217,"archive_url":"https://extensions.blender.org/download/sha256:aec6c11bef46dadb552838b00e82a63637ee4dd0c77f21a5fef886317a5a6bab/add-on-slot-link-v0.0.11.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/slot-link/","maintainer":"mars","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","User Interface","Import-Export"]},{"id":"mesh_planes_pro","schema_version":"1.0.0","name":"Mesh Planes Pro","version":"2.0.1","tagline":"Ultimate Background Removal for Faster, Seamless Renders","archive_hash":"sha256:5691d05b04840ede23b7116782821e73d1fd34364c1bda4a69d3daa923832d8b","archive_size":2471909,"archive_url":"https://extensions.blender.org/download/sha256:5691d05b04840ede23b7116782821e73d1fd34364c1bda4a69d3daa923832d8b/add-on-mesh-planes-pro-v2.0.1.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/mesh-planes-pro/","maintainer":"Prince_Eagle","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load node groups from blend file"},"tags":["Material","Node","Render","Mesh"]},{"id":"developer_utilities","schema_version":"1.0.0","name":"Developer Utilities","version":"1.1.0","tagline":"Make life of addon developers easier","archive_hash":"sha256:31a9dead337ef9cd554b62f096c7b056a7b182030d4adac874f2f04b4183479c","archive_size":9006,"archive_url":"https://extensions.blender.org/download/sha256:31a9dead337ef9cd554b62f096c7b056a7b182030d4adac874f2f04b4183479c/add-on-developer-utilities-v1.1.0.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/developer-utilities/","maintainer":"scorpion81","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Open source files of addons for editing"},"tags":["Development"]},{"id":"srtm_terrain_importer","schema_version":"1.0.0","name":"SRTM Terrain Importer","version":"1.0.5","tagline":"Import SRTM elevation data as accurate 3D terrain","archive_hash":"sha256:72299885ab8bb5623bd3643e4b918cf2e29c56fe6010ead0f55e61796498f454","archive_size":6645,"archive_url":"https://extensions.blender.org/download/sha256:72299885ab8bb5623bd3643e4b918cf2e29c56fe6010ead0f55e61796498f454/add-on-srtm-terrain-importer-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/srtm-terrain-importer/","maintainer":"NicolasPriniotakis","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import SRTM HGT files from disk"},"tags":["Import-Export"]},{"id":"Industrial_Light_AOV_Splitter","schema_version":"1.0.0","name":"Industrial Light AOV Splitter","version":"1.0.1","tagline":"Auto create better light aovs (diffuse_env, specular_env...)","archive_hash":"sha256:5b7398df324fbb2836e0c12d070cab2db098a040e86caae4a1c3253c7bd968e7","archive_size":8954,"archive_url":"https://extensions.blender.org/download/sha256:5b7398df324fbb2836e0c12d070cab2db098a040e86caae4a1c3253c7bd968e7/add-on-industrial-light-aov-splitter-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/industrial-light-aov-splitter/","maintainer":"Roland-Vyens","license":["SPDX:GPL-3.0-or-later"],"tags":["Compositing","Import-Export","Pipeline","Render"]},{"id":"servo_animation","schema_version":"1.0.0","name":"Servo Animation","version":"2.1.1","tagline":"Export your Blender animation to servo position values","archive_hash":"sha256:407fa6cac99b8ce6dcac652d729c71be13aafb4b930ecb00fba42ec5971189d4","archive_size":161106,"archive_url":"https://extensions.blender.org/download/sha256:407fa6cac99b8ce6dcac652d729c71be13aafb4b930ecb00fba42ec5971189d4/add-on-servo-animation-v2.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/servo-animation/","maintainer":"timhendriks93","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Import-Export","Rigging"]},{"id":"ac_tools","schema_version":"1.0.0","name":"AC Tools","version":"0.1.5","tagline":"AC Tools for track modding","archive_hash":"sha256:8bcf1e9e218c5cfea0b850e0d9957ee1d4c136dcf608e189f7a25a786bea32dd","archive_size":30842,"archive_url":"https://extensions.blender.org/download/sha256:8bcf1e9e218c5cfea0b850e0d9957ee1d4c136dcf608e189f7a25a786bea32dd/add-on-ac-tools-v0.1.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ac-tools/","maintainer":"PhinDev","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export FBX from/to disk, Manage track folders"},"tags":["Development","Object","User Interface"]},{"id":"img_alpha_to_bsdf","schema_version":"1.0.0","name":"Connect image alpha","version":"1.0.6","tagline":"Connecting image alpha to shader alpha","archive_hash":"sha256:a0d765b49e728e95012895af1bb54d12c3b4ac68ab649115685c8b4d9eb65e02","archive_size":2692,"archive_url":"https://extensions.blender.org/download/sha256:a0d765b49e728e95012895af1bb54d12c3b4ac68ab649115685c8b4d9eb65e02/add-on-img-alpha-to-bsdf-v1.0.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/img-alpha-to-bsdf/","maintainer":"Snakyboopface","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","User Interface","Material"]},{"id":"link_parents","schema_version":"1.0.0","name":"Link Parents","version":"1.2.1","tagline":"Link objects parents & edit Parent Inverse Matrix in UI","archive_hash":"sha256:23a8fa704f6f5c9ae99e6bf5d8b1ac3dbc4d85b6800146f5a5c8679eb60e9395","archive_size":2883,"archive_url":"https://extensions.blender.org/download/sha256:23a8fa704f6f5c9ae99e6bf5d8b1ac3dbc4d85b6800146f5a5c8679eb60e9395/add-on-link-parents-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/link-parents/","maintainer":"Trukas","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Rigging","User Interface"]},{"id":"sco_buttobjects","schema_version":"1.0.0","name":"SCO ButtObjects","version":"2.0.5","tagline":"Easily align Objects in your scene by Active Object or 3D Cursor","archive_hash":"sha256:4be2b8965bf52ef563b88da4e5588bf1fe220ab8f487ad136dec1c3eb78537bb","archive_size":138673,"archive_url":"https://extensions.blender.org/download/sha256:4be2b8965bf52ef563b88da4e5588bf1fe220ab8f487ad136dec1c3eb78537bb/add-on-sco-buttobjects-v2.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sco-buttobjects/","maintainer":"BEAST_of_BURDEN","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"Grid_Layout","schema_version":"1.0.0","name":"Grid Layout","version":"1.5.7","tagline":"Tools to help layout your UV layout","archive_hash":"sha256:33e8a16f02eb0d5f1063024efd5b24a7c7e5f9426a3de4377decaf00838db03c","archive_size":10399,"archive_url":"https://extensions.blender.org/download/sha256:33e8a16f02eb0d5f1063024efd5b24a7c7e5f9426a3de4377decaf00838db03c/add-on-grid-layout-v1.5.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/grid-layout/","maintainer":"Hodgson3d","license":["SPDX:GPL-3.0-or-later"],"tags":["UV"]},{"id":"povable","schema_version":"1.0.0","name":"POV@Ble","version":"0.1.8","tagline":"Persistence of Vision addon for Blender","archive_hash":"sha256:ff1b57fb994db2e4fbc95088ac6bb1741c3e6e9adef1f0e1f1ae16187cbc7830","archive_size":329019,"archive_url":"https://extensions.blender.org/download/sha256:ff1b57fb994db2e4fbc95088ac6bb1741c3e6e9adef1f0e1f1ae16187cbc7830/add-on-povable-v0.1.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/povable/","maintainer":"POVαBle","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Requires access to directories with binary executables and sound"},"tags":["Render","Pipeline","Import-Export","Text Editor","Development","User Interface","Scene","Modeling","Object","Material","Mesh","Add Curve","Camera","Lighting","Bake"]},{"id":"b_palettes","schema_version":"1.0.0","name":"B Palettes","version":"1.1.0","tagline":"Import/Export Color Palettes","archive_hash":"sha256:59bdbb835628977b5fcd1c88f53fc0d340766f97ef2d2ed477be34d813c53ae6","archive_size":5538,"archive_url":"https://extensions.blender.org/download/sha256:59bdbb835628977b5fcd1c88f53fc0d340766f97ef2d2ed477be34d813c53ae6/add-on-b-palettes-v1.1.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/b-palettes/","maintainer":"Dinesh007","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Requires access to directory with color palette files"},"tags":["Import-Export"]},{"id":"import_files_svg_cuts_directory","schema_version":"1.0.0","name":"Import SVG Cuts Directory","version":"1.0.1","tagline":"Import object based on a directory of SVG cuts","archive_hash":"sha256:bdfe34a8b5e59c0d98342756cfc0ef9185622bd161a3642ba1a43ed0818b6cfb","archive_size":5958242,"archive_url":"https://extensions.blender.org/download/sha256:bdfe34a8b5e59c0d98342756cfc0ef9185622bd161a3642ba1a43ed0818b6cfb/add-on-import-files-svg-cuts-directory-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/import-files-svg-cuts-directory/","maintainer":"Benedikt-Schaber","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import directory of SVGs from disk"},"tags":["Import-Export"]},{"id":"Selected_Bones_To_Vertex_Group","schema_version":"1.0.0","name":"Selected_Bones_To_Vertex_Group","version":"1.0.1","tagline":"Add or delete selected bone to selected mesh","archive_hash":"sha256:e5e49539892d63b5b1ffb7108f7f6cca2884cc598010405d88b2009f40faa9b0","archive_size":2074,"archive_url":"https://extensions.blender.org/download/sha256:e5e49539892d63b5b1ffb7108f7f6cca2884cc598010405d88b2009f40faa9b0/add-on-selected-bones-to-vertex-group-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/selected-bones-to-vertex-group/","maintainer":"mochi_Lin","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"highlighter","schema_version":"1.0.0","name":"Highlighter","version":"0.1.0","tagline":"Syntax highlighting for text objects","archive_hash":"sha256:3fec762b7df4f2667d391a68a55a5b4c78c356d64855104b16d03af7802f3046","archive_size":1209500,"archive_url":"https://extensions.blender.org/download/sha256:3fec762b7df4f2667d391a68a55a5b4c78c356d64855104b16d03af7802f3046/add-on-highlighter-v0.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/highlighter/","maintainer":"pioverfour","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Curve","Text Editor"]},{"id":"frame_focus","schema_version":"1.0.0","name":"Frame Focus","version":"2.0.1","tagline":"List All Frame Nodes And Focus Easily","archive_hash":"sha256:6b86148b65108e75bd979d3f7e65befe9afd032a9c5225fc75ac46aef7c027bc","archive_size":6600,"archive_url":"https://extensions.blender.org/download/sha256:6b86148b65108e75bd979d3f7e65befe9afd032a9c5225fc75ac46aef7c027bc/add-on-frame-focus-v2.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/frame-focus/","maintainer":"Ou_Chiang","license":["SPDX:GPL-3.0-or-later"],"tags":["Node"]},{"id":"neigh_context_switcher","schema_version":"1.0.0","name":"Context Switcher","version":"1.1.2","tagline":"Quick workspace and editor switching via popup at mouse location","archive_hash":"sha256:dd2fa9266d0ced26efe9504e624e8af214c3a2571c74899bc8703b1d9e96101d","archive_size":2365,"archive_url":"https://extensions.blender.org/download/sha256:dd2fa9266d0ced26efe9504e624e8af214c3a2571c74899bc8703b1d9e96101d/add-on-neigh-context-switcher-v1.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/neigh-context-switcher/","maintainer":"Neigh","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"SelectModeKeymaps","schema_version":"1.0.0","name":"Select Mode Keymaps","version":"1.0.1","tagline":"Assign keymaps to toggle Object/Edit Mode and Select Modes","archive_hash":"sha256:2700fa8cc6cb035f7458c079b5e3561e9e93bf6a2e967c2f7ba5607db88fa573","archive_size":5772,"archive_url":"https://extensions.blender.org/download/sha256:2700fa8cc6cb035f7458c079b5e3561e9e93bf6a2e967c2f7ba5607db88fa573/add-on-selectmodekeymaps-v1.0.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/selectmodekeymaps/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"skin_mesh_to_bone","schema_version":"1.0.0","name":"Skin Mesh To Bone","version":"1.0.2","tagline":"Skins selected meshes to a bone on the active armature","archive_hash":"sha256:f8e66dc89bd268aefc76ad3d05727f43f34ab9e043103d0443c061c72d707faf","archive_size":3048,"archive_url":"https://extensions.blender.org/download/sha256:f8e66dc89bd268aefc76ad3d05727f43f34ab9e043103d0443c061c72d707faf/add-on-skin-mesh-to-bone-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/skin-mesh-to-bone/","maintainer":"darknation","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"Faster_FBX_Exporter","schema_version":"1.0.0","name":"Faster FBX Exporter","version":"0.2.4","tagline":"Faster .fbx Exporter for Static Objects With Modifiers","archive_hash":"sha256:d60922038603e42f00b429ba8f8af2026bbd84c80437c7b7c52ea3d34a9c5d60","archive_size":94222,"archive_url":"https://extensions.blender.org/download/sha256:d60922038603e42f00b429ba8f8af2026bbd84c80437c7b7c52ea3d34a9c5d60/add-on-faster-fbx-exporter-v0.2.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/faster-fbx-exporter/","maintainer":"Dan-Gry","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export .fbx files"},"tags":["Import-Export"]},{"id":"copyshapekeys","schema_version":"1.0.0","name":"ShapeKey Copy","version":"3.4.1","tagline":"Copy shapekeys from one mesh to another","archive_hash":"sha256:769278803ab26c411354aec6ded13c4017af8c85a8e9e23eba44434c1467d24b","archive_size":7196,"archive_url":"https://extensions.blender.org/download/sha256:769278803ab26c411354aec6ded13c4017af8c85a8e9e23eba44434c1467d24b/add-on-copyshapekeys-v3.4.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/copyshapekeys/","maintainer":"Blenderbob","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Animation"]},{"id":"Control_Render_Regions","schema_version":"1.0.0","name":"Control Render Regions","version":"1.0.12","tagline":"Manage renders in region","archive_hash":"sha256:e78ea3e3ee8ce9bfee2d4f8894f8338e338fc524f1eba8f3b03ce7fc06967c2d","archive_size":7059441,"archive_url":"https://extensions.blender.org/download/sha256:e78ea3e3ee8ce9bfee2d4f8894f8338e338fc524f1eba8f3b03ce7fc06967c2d/add-on-control-render-regions-v1.0.12-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/control-render-regions/","maintainer":"nukkio","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Create script to render from terminal and render regions"},"platforms":["windows-x64"],"tags":["Render","Pipeline"]},{"id":"Night_Rain_Theme","schema_version":"1.0.0","name":"Night_Rain_Theme","version":"2.1.6","tagline":"Transparent Dark Grey","archive_hash":"sha256:1f2dce88c9965cbf2c7d102077a6e3a8a1cc1b7d672c3f131c2c6016eb67790c","archive_size":5654,"archive_url":"https://extensions.blender.org/download/sha256:1f2dce88c9965cbf2c7d102077a6e3a8a1cc1b7d672c3f131c2c6016eb67790c/theme-night-rain-theme-v2.1.6.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/night-rain-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"nla_midi_copier","schema_version":"1.0.0","name":"NLA Midi Copier","version":"1.2.0","tagline":"NLA and Graph Editor tools for syncing animation to midi files","archive_hash":"sha256:4acdaac298dd38372982087e4cacfa908780bd4993be62204d9df9b194fc30b2","archive_size":115530,"archive_url":"https://extensions.blender.org/download/sha256:4acdaac298dd38372982087e4cacfa908780bd4993be62204d9df9b194fc30b2/add-on-nla-midi-copier-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nla-midi-copier/","maintainer":"Cornerback24","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read midi files from disk"},"tags":["Animation"]},{"id":"blender_mqo","schema_version":"1.0.0","name":"MQO (Metasequoia) Format File Importer/Exporter","version":"2.0.0","tagline":"Import/Export MQO format files","archive_hash":"sha256:986c8ad77c5e90ec3b63e5b7653a7966e97f0ada40b47416f6412c6e3afbd171","archive_size":21616,"archive_url":"https://extensions.blender.org/download/sha256:986c8ad77c5e90ec3b63e5b7653a7966e97f0ada40b47416f6412c6e3afbd171/add-on-blender-mqo-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blender-mqo/","maintainer":"nutti","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/Export MQO from/to disk"},"tags":["Import-Export"]},{"id":"core_debug_tools","schema_version":"1.0.0","name":"Core Debug Tools","version":"0.1.0","tagline":"Debugging utilities for core Blender developers","archive_hash":"sha256:f21387eea0b95445be76e9b6eee95c7ad807451aefdc65a36dce7a11d262ad20","archive_size":629513,"archive_url":"https://extensions.blender.org/download/sha256:f21387eea0b95445be76e9b6eee95c7ad807451aefdc65a36dce7a11d262ad20/add-on-core-debug-tools-v0.1.0.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/core-debug-tools/","maintainer":"JacquesLucke","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Build temporary html files to view in the browser"},"tags":["Development"]},{"id":"twformats","schema_version":"1.0.0","name":"Teeworlds and DDNet Map import","version":"0.4.1","tagline":"Import Teeworlds and DDNet maps","archive_hash":"sha256:a4137b2d611a4cf25828c185a44fe21ffb370637fe8c02413681b372a8d463f5","archive_size":9592799,"archive_url":"https://extensions.blender.org/download/sha256:a4137b2d611a4cf25828c185a44fe21ffb370637fe8c02413681b372a8d463f5/add-on-twformats-v0.4.1-linux-x64-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/twformats/","maintainer":"Patiga","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export files from/to disk"},"platforms":["linux-x64","windows-x64"],"tags":["Import-Export"]},{"id":"Graphite_Mono_Theme","schema_version":"1.0.0","name":"Graphite_Mono_Theme","version":"3.2.5","tagline":"Steel Grey","archive_hash":"sha256:b2b750b037ef43f3b6ee3ecd5993f89517c0939cd5bc24cb5d8cd2630a250f55","archive_size":5858,"archive_url":"https://extensions.blender.org/download/sha256:b2b750b037ef43f3b6ee3ecd5993f89517c0939cd5bc24cb5d8cd2630a250f55/theme-graphite-mono-theme-v3.2.5.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/graphite-mono-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"io_import_pixelart","schema_version":"1.0.0","name":"Import Pixel Art","version":"1.2.1","tagline":"Imports pixel art as colored cubes or squares for each pixel","archive_hash":"sha256:de95c730dc8ef2457d0ee54e90c95acfb3232a91bc6c7e6fa321c0bd9f33f4d1","archive_size":5860,"archive_url":"https://extensions.blender.org/download/sha256:de95c730dc8ef2457d0ee54e90c95acfb3232a91bc6c7e6fa321c0bd9f33f4d1/add-on-io-import-pixelart-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-import-pixelart/","maintainer":"bloody_albatross","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import pixel art from disk"},"tags":["Import-Export"]},{"id":"scene_workspaces","schema_version":"1.0.0","name":"Scene Workspaces","version":"1.1.1","tagline":"Filter and sort your workspaces, scene by scene","archive_hash":"sha256:7466088a97d7e6ed393001712fe09d88e13315c379e91458582a28a0e890ba0a","archive_size":8786,"archive_url":"https://extensions.blender.org/download/sha256:7466088a97d7e6ed393001712fe09d88e13315c379e91458582a28a0e890ba0a/add-on-scene-workspaces-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/scene-workspaces/","maintainer":"Francesco-Bellini","license":["SPDX:GPL-3.0-or-later"],"tags":["Scene","System","User Interface"]},{"id":"clean_game_asset_exporter","schema_version":"1.0.0","name":"Clean Game Asset Exporter","version":"1.0.0","tagline":"Game asset exporter for the Defold game engine","archive_hash":"sha256:377a5cbde66f7ea39b861f3062a7ec5c919c8e0a515aeeb8add9e06ae5aacea3","archive_size":4988,"archive_url":"https://extensions.blender.org/download/sha256:377a5cbde66f7ea39b861f3062a7ec5c919c8e0a515aeeb8add9e06ae5aacea3/add-on-clean-game-asset-exporter-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/clean-game-asset-exporter/","maintainer":"DeBolt","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export game asset files to disk"},"tags":["Game Engine","Import-Export"]},{"id":"aligning_horizontally_mini","schema_version":"1.0.0","name":"Aligning Horizontally Mini","version":"1.0.1","tagline":"Align selected objects in a customizable grid in the 3D viewport","archive_hash":"sha256:15eaa29ad5ba5afbc4ac5c3d63966ab75f89c85de7a8444359bdabee860d3f35","archive_size":3511,"archive_url":"https://extensions.blender.org/download/sha256:15eaa29ad5ba5afbc4ac5c3d63966ab75f89c85de7a8444359bdabee860d3f35/add-on-aligning-horizontally-mini-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/aligning-horizontally-mini/","maintainer":"Hydrocallis","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Object"]},{"id":"lead_edge_maze_ash_creator","schema_version":"1.0.0","name":"Lead Edge Maze Ash Creator","version":"2.4.1","tagline":"Lead Edge Maze Ash","archive_hash":"sha256:003291b86247ce09847fd955f2f3fcc0433162af279eb1d262a35e0fd36fb541","archive_size":11149,"archive_url":"https://extensions.blender.org/download/sha256:003291b86247ce09847fd955f2f3fcc0433162af279eb1d262a35e0fd36fb541/add-on-lead-edge-maze-ash-creator-v2.4.1.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/lead-edge-maze-ash-creator/","maintainer":"dartmeadow","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"f1dg3t_blender_red","schema_version":"1.0.0","name":"F1dg3t Red","version":"1.1.0","tagline":"Perfect for Shadow State 2","archive_hash":"sha256:0288b146cc76cd0f5bbe25c87639a1a150e9298cf64c66eb7ae2f55d60953680","archive_size":6491,"archive_url":"https://extensions.blender.org/download/sha256:0288b146cc76cd0f5bbe25c87639a1a150e9298cf64c66eb7ae2f55d60953680/theme-f1dg3t-blender-red-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/f1dg3t-blender-red/","maintainer":"F1dg3t","license":["SPDX:GPL-2.0-or-later"],"tags":["Inspired By","Dark"]},{"id":"VMD","schema_version":"1.0.0","name":"vmdesk","version":"5.0.0","tagline":"Interactive editor environment in 3D Viewport","archive_hash":"sha256:4a46a8587281dd636ab45759fbbd1a66868e1be0691d6422e246b105dd483b5a","archive_size":10169041,"archive_url":"https://extensions.blender.org/download/sha256:4a46a8587281dd636ab45759fbbd1a66868e1be0691d6422e246b105dd483b5a/add-on-vmd-v5.0.0.zip","type":"add-on","blender_version_min":"5.0.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/add-ons/vmd/","maintainer":"Y.T-LAW","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export from disk to user-supplied path","clipboard":"Copy and paste from shortcut/UI"},"tags":["3D View","Modeling","Mesh","Object","User Interface"]},{"id":"govietools","schema_version":"1.0.0","name":"Govie Tools","version":"1.0.20","tagline":"Optimize your model for use in the Govie Editor","archive_hash":"sha256:31c648371553204133ff0827b8bb33bad0edbbfa50964a5d329a797a10973476","archive_size":123018,"archive_url":"https://extensions.blender.org/download/sha256:31c648371553204133ff0827b8bb33bad0edbbfa50964a5d329a797a10973476/add-on-govietools-v1.0.20.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/govietools/","maintainer":"3D-Interaction-Technologies","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export GLB to disk"},"tags":["Scene","Import-Export"]},{"id":"microscopynodes","schema_version":"1.0.0","name":"Microscopy Nodes","version":"2.2.7","tagline":"Handling microscopy data in Blender, up to 5D volumes","archive_hash":"sha256:d9894dd92a9ca652515a89a256760e33b6c7cf321720101feedaef8d462ef28b","archive_size":49077670,"archive_url":"https://extensions.blender.org/download/sha256:d9894dd92a9ca652515a89a256760e33b6c7cf321720101feedaef8d462ef28b/add-on-microscopynodes-v2.2.7-windows-x64.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/microscopynodes/","maintainer":"Aafke-Gros","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Importing data files from disk, writing to cache folder","network":"Loading OME-zarr files from the internet from a given URL"},"platforms":["windows-x64"],"tags":["Import-Export"]},{"id":"new_object_from_selected_geometry","schema_version":"1.0.0","name":"New Object From Selected Geometry","version":"1.0.2","tagline":"Creates a new object from the selected geometry in Edit mode","archive_hash":"sha256:c6ce3d5ff406b1cb933740ad87fff0d80debe984357fe92e6912a4f5a988b75f","archive_size":13392,"archive_url":"https://extensions.blender.org/download/sha256:c6ce3d5ff406b1cb933740ad87fff0d80debe984357fe92e6912a4f5a988b75f/add-on-new-object-from-selected-geometry-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/new-object-from-selected-geometry/","maintainer":"Giambattista-Caltabiano","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"Metaseq_Classic_theme","schema_version":"1.0.0","name":"Metaseq_Classic","version":"1.0.1","tagline":"Classic light Metasequoia-style theme","archive_hash":"sha256:281bbe6290ac35dc88de14f3ab67a96363905332a152f9d7f33844659f51cf5a","archive_size":36342,"archive_url":"https://extensions.blender.org/download/sha256:281bbe6290ac35dc88de14f3ab67a96363905332a152f9d7f33844659f51cf5a/theme-metaseq-classic-theme-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"5.1.0","website":"https://extensions.blender.org/themes/metaseq-classic-theme/","maintainer":"kame404","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"Xromm_Tools","schema_version":"1.0.0","name":"XROMM toolkit","version":"0.9.6","tagline":"XROMM toolkit for Blender","archive_hash":"sha256:c6fc2917029a34d1f2ee919a7c966e1e948cd0454d8be8d89885459a179da771","archive_size":18986,"archive_url":"https://extensions.blender.org/download/sha256:c6fc2917029a34d1f2ee919a7c966e1e948cd0454d8be8d89885459a179da771/add-on-xromm-tools-v0.9.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/xromm-tools/","maintainer":"pfalkingham","license":["SPDX:GPL-3.0-or-later"],"tags":["Pipeline"]},{"id":"io_scene_ase","schema_version":"1.0.0","name":"ASCII Scene Export (.ase)","version":"2.2.1","tagline":"Export .ase files used in Unreal Engine 1 & 2","archive_hash":"sha256:7ed06a0042081fc7058a3016d15bce6af441b92156770f532393e370fc916494","archive_size":13786,"archive_url":"https://extensions.blender.org/download/sha256:7ed06a0042081fc7058a3016d15bce6af441b92156770f532393e370fc916494/add-on-io-scene-ase-v2.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-scene-ase/","maintainer":"darknation","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export .ase files to disk"},"tags":["Game Engine","Import-Export"]},{"id":"blender_magicavoxel","schema_version":"1.0.0","name":"MagicaVoxel VOX format","version":"1.5.7","tagline":"Importer addon for MagicaVoxel vox files","archive_hash":"sha256:30f41041bb989380687699ec6b47ec6457e438c922ff71be6e93f99b68fe8d0d","archive_size":24371,"archive_url":"https://extensions.blender.org/download/sha256:30f41041bb989380687699ec6b47ec6457e438c922ff71be6e93f99b68fe8d0d/add-on-blender-magicavoxel-v1.5.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blender-magicavoxel/","maintainer":"AstrorEnales","license":["SPDX:GPL-3.0-or-later","SPDX:MIT"],"permissions":{"files":"Import VOX from disk"},"tags":["Import-Export"]},{"id":"odyssey_eobet_remix","schema_version":"1.0.0","name":"Odyssey eobet Remix","version":"2.0.1","tagline":"Theme highlighting the active object","archive_hash":"sha256:44250497cdad4efef753edd6470c5a7bd411e7b9a7d9828a6cb5d071d99bf743","archive_size":5970,"archive_url":"https://extensions.blender.org/download/sha256:44250497cdad4efef753edd6470c5a7bd411e7b9a7d9828a6cb5d071d99bf743/theme-odyssey-eobet-remix-v2.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/odyssey-eobet-remix/","maintainer":"eobet","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"PieMenu_Everywhere","schema_version":"1.0.0","name":"PieMenu Everywhere","version":"1.4.5","tagline":"Maximize your efficiency with PieMenu Everywhere","archive_hash":"sha256:1a79638d9774eef739be1adc281c65600c588f3915f7d9f6a20c2cbac8b07e84","archive_size":438388,"archive_url":"https://extensions.blender.org/download/sha256:1a79638d9774eef739be1adc281c65600c588f3915f7d9f6a20c2cbac8b07e84/add-on-piemenu-everywhere-v1.4.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/piemenu-everywhere/","maintainer":"DeathShot-747","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface","Pipeline","3D View","Node"]},{"id":"Partybots_converter","schema_version":"1.0.0","name":"Partybots converter","version":"1.0.4","tagline":"This is a addon to build partybots maps","archive_hash":"sha256:c2c2e36e9997df032739b03d49854e547fa142684c193a7332d816e68d68ab00","archive_size":5333,"archive_url":"https://extensions.blender.org/download/sha256:c2c2e36e9997df032739b03d49854e547fa142684c193a7332d816e68d68ab00/add-on-partybots-converter-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/partybots-converter/","maintainer":"vuyghu2020","license":["SPDX:GPL-3.0-or-later"],"permissions":{"clipboard":"To write the compiled output to the clipbord"},"tags":["3D View","Object","Game Engine"]},{"id":"add_airfoil","schema_version":"1.0.0","name":"Add Airfoil","version":"2.0.0","tagline":"Import Airfoil Dat Files into Blender","archive_hash":"sha256:118dfa0e9d40af8486bea8e149e0db5518db051681aba4165d699df9868f73ae","archive_size":2356,"archive_url":"https://extensions.blender.org/download/sha256:118dfa0e9d40af8486bea8e149e0db5518db051681aba4165d699df9868f73ae/add-on-add-airfoil-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/add-airfoil/","maintainer":"Nerk","license":["SPDX:GPL-2.0-or-later"],"tags":["Import-Export","Mesh"]},{"id":"atomic_blender_cluster","schema_version":"1.0.0","name":"Atomic Blender Cluster","version":"1.0.0","tagline":"Creating atom clusters or nanoparticles in Blender","archive_hash":"sha256:77b6176aaf69f70917b353e0f5bf183f1f0ad4ff70cc4bf92d72471fe2647d18","archive_size":11917,"archive_url":"https://extensions.blender.org/download/sha256:77b6176aaf69f70917b353e0f5bf183f1f0ad4ff70cc4bf92d72471fe2647d18/add-on-atomic-blender-cluster-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/atomic-blender-cluster/","maintainer":"Blendphys","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh"]},{"id":"add_positive_cube","schema_version":"1.0.0","name":"Add Positive Cube","version":"1.1.0","tagline":"Adds a cube with its origin at the corner","archive_hash":"sha256:860bb8ffe1cce3f120ce334b0a6daba5d2d296c84fc12445839e96d288a541a2","archive_size":1913,"archive_url":"https://extensions.blender.org/download/sha256:860bb8ffe1cce3f120ce334b0a6daba5d2d296c84fc12445839e96d288a541a2/add-on-add-positive-cube-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/add-positive-cube/","maintainer":"jefftml","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh","3D View"]},{"id":"theme_modo","schema_version":"1.0.0","name":"Modo","version":"2.0.0","tagline":"Community-made theme inspired by Modo","archive_hash":"sha256:b9021a0edcfc6e68474ae1bb6a8257bd83b766c97e17020f4db723ed403ebc0f","archive_size":5822,"archive_url":"https://extensions.blender.org/download/sha256:b9021a0edcfc6e68474ae1bb6a8257bd83b766c97e17020f4db723ed403ebc0f/theme-theme-modo-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-modo/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Inspired By","Dark"]},{"id":"stl_format_legacy","schema_version":"1.0.0","name":"STL format (legacy)","version":"1.1.4","tagline":"Import-Export STL files","archive_hash":"sha256:ae6e839285861f6e14022ea7b5b74a93760d2055d4cc43ea63fb1951918cc1e6","archive_size":7513,"archive_url":"https://extensions.blender.org/download/sha256:ae6e839285861f6e14022ea7b5b74a93760d2055d4cc43ea63fb1951918cc1e6/add-on-stl-format-legacy-v1.1.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/stl-format-legacy/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Add-on expects to have access to filesytem."},"tags":["Import-Export"]},{"id":"atomic_blender_pdb_xyz","schema_version":"1.0.0","name":"Atomic Blender PDB/XYZ","version":"1.9.1","tagline":"Importing atoms listed in PDB and XYZ files into Blender","archive_hash":"sha256:d8ec654a526001a29d0c4f7450b33d27ccc9c74fed9d665d8a8e61a052c1c268","archive_size":51000,"archive_url":"https://extensions.blender.org/download/sha256:d8ec654a526001a29d0c4f7450b33d27ccc9c74fed9d665d8a8e61a052c1c268/add-on-atomic-blender-pdb-xyz-v1.9.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/atomic-blender-pdb-xyz/","maintainer":"Blendphys","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Add-on expects to have access to filesytem."},"tags":["Import-Export"]},{"id":"geodesic_domes","schema_version":"1.0.0","name":"Geodesic Domes","version":"0.3.6","tagline":"Create geodesic dome type objects","archive_hash":"sha256:7ebd015a85ae9d7d93dcc8942b12da6b120949b550ef97d09b273388926118f0","archive_size":25222,"archive_url":"https://extensions.blender.org/download/sha256:7ebd015a85ae9d7d93dcc8942b12da6b120949b550ef97d09b273388926118f0/add-on-geodesic-domes-v0.3.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/geodesic-domes/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Add Mesh"]},{"id":"ui_animation_render","schema_version":"1.0.0","name":"UI Animation Render","version":"0.1.0","tagline":"Render animations of the Blender UI","archive_hash":"sha256:4cc58957a66ebe8d6649a4d2028ad6217c67b78e121e5e73e62ef739bf85eb29","archive_size":2426,"archive_url":"https://extensions.blender.org/download/sha256:4cc58957a66ebe8d6649a4d2028ad6217c67b78e121e5e73e62ef739bf85eb29/add-on-ui-animation-render-v0.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ui-animation-render/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Render"]},{"id":"pov_at_ble","schema_version":"1.0.0","name":"POV@Ble (Legacy)","version":"0.1.6","tagline":"Persistence of Vision addon for Blender","archive_hash":"sha256:8bb572ce8ae30011dc8ba065980fe18c9f49b836b754b49578ab49c889ca0339","archive_size":302310,"archive_url":"https://extensions.blender.org/download/sha256:8bb572ce8ae30011dc8ba065980fe18c9f49b836b754b49578ab49c889ca0339/add-on-pov-at-ble-v0.1.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pov-at-ble/","maintainer":"POVαBle","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Requires access to directories with binary executables and sound"},"tags":["Render"]},{"id":"inset_straight_skeleton","schema_version":"1.0.0","name":"Inset Straight Skeleton","version":"1.1.0","tagline":"Make an inset inside selection using straight skeleton algo . . ","archive_hash":"sha256:1b7ac6364ed7bc8736a2fa5bd7da0f2c07a527a6b0a50aed4801671eddc5c553","archive_size":33199,"archive_url":"https://extensions.blender.org/download/sha256:1b7ac6364ed7bc8736a2fa5bd7da0f2c07a527a6b0a50aed4801671eddc5c553/add-on-inset-straight-skeleton-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/inset-straight-skeleton/","maintainer":"howardt","license":["SPDX:GPL-2.0-or-later"],"tags":["Mesh"]},{"id":"refine_tracking_solution","schema_version":"1.0.0","name":"Refine tracking solution","version":"1.1.6","tagline":"Refine motion solution by adjusting track weight","archive_hash":"sha256:d04ac43654a33c8c0a78c935479cefc4c052cae6092c565ef8bcefc412418a1f","archive_size":2210,"archive_url":"https://extensions.blender.org/download/sha256:d04ac43654a33c8c0a78c935479cefc4c052cae6092c565ef8bcefc412418a1f/add-on-refine-tracking-solution-v1.1.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/refine-tracking-solution/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Tracking"]},{"id":"assign_shape_keys","schema_version":"1.0.0","name":"Assign Shape Keys","version":"1.0.2","tagline":"Assigns one or more Bezier curves as shape keys to another . . ","archive_hash":"sha256:a4e428cf15b9d642308a6b1fab414544e2a061abb6758c78214c42889d0de7e1","archive_size":10143,"archive_url":"https://extensions.blender.org/download/sha256:a4e428cf15b9d642308a6b1fab414544e2a061abb6758c78214c42889d0de7e1/add-on-assign-shape-keys-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/assign-shape-keys/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Add Curve"]},{"id":"export_pointcache_formatpc2","schema_version":"1.0.0","name":"Export Pointcache Format(.pc2)","version":"1.1.4","tagline":"Export mesh Pointcache data (.pc2)","archive_hash":"sha256:5302170dc699eeaa9eb0528daba03574f99e178726cba33fda104885fd0f7805","archive_size":2683,"archive_url":"https://extensions.blender.org/download/sha256:5302170dc699eeaa9eb0528daba03574f99e178726cba33fda104885fd0f7805/add-on-export-pointcache-formatpc2-v1.1.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/export-pointcache-formatpc2/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Requires access to directory where it exports .pc2 file"},"tags":["Import-Export"]},{"id":"corrective_shape_keys","schema_version":"1.0.0","name":"Corrective Shape Keys","version":"1.0.0","tagline":"Creates a corrective shape key for the current pose","archive_hash":"sha256:23c5d539e6623f6ea266d5ca43738db668191314263480e4400944b1ed04ff19","archive_size":4821,"archive_url":"https://extensions.blender.org/download/sha256:23c5d539e6623f6ea266d5ca43738db668191314263480e4400944b1ed04ff19/add-on-corrective-shape-keys-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/corrective-shape-keys/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Animation"]},{"id":"freestyle_svg_exporter","schema_version":"1.0.0","name":"Freestyle SVG Exporter","version":"1.0.0","tagline":"Exports Freestyle's stylized edges in SVG format","archive_hash":"sha256:d72191a8ca5847a38e6114d6e66aa07573191ef76b14bea192efe2759921b60b","archive_size":7691,"archive_url":"https://extensions.blender.org/download/sha256:d72191a8ca5847a38e6114d6e66aa07573191ef76b14bea192efe2759921b60b/add-on-freestyle-svg-exporter-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/freestyle-svg-exporter/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Render"]},{"id":"edit_operator_source","schema_version":"1.0.0","name":"Edit Operator Source","version":"1.2.4","tagline":"Opens source file of chosen operator or call locations","archive_hash":"sha256:d1d29b06f1e0fe08fe8fa5e8802d4b3a7680af75652ca3f5f2b5f98c8d167ebc","archive_size":2897,"archive_url":"https://extensions.blender.org/download/sha256:d1d29b06f1e0fe08fe8fa5e8802d4b3a7680af75652ca3f5f2b5f98c8d167ebc/add-on-edit-operator-source-v1.2.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/edit-operator-source/","maintainer":"scorpion81","license":["SPDX:GPL-2.0-or-later"],"tags":["Development"]},{"id":"newtek_mdd_format","schema_version":"1.0.0","name":"NewTek MDD format","version":"1.0.3","tagline":"Import-Export MDD as mesh shape keys","archive_hash":"sha256:100f9d821900bd61ab16ffef061f9bde2162564f06ab01f07659e83cba142759","archive_size":4368,"archive_url":"https://extensions.blender.org/download/sha256:100f9d821900bd61ab16ffef061f9bde2162564f06ab01f07659e83cba142759/add-on-newtek-mdd-format-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/newtek-mdd-format/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Requires access to directory with MDD format files"},"tags":["Import-Export"]},{"id":"demo_mode","schema_version":"1.0.0","name":"Demo Mode","version":"1.0.0","tagline":"Demo mode lets you select multiple blend files and loop ove . . ","archive_hash":"sha256:d54b9643f49a26032c9bdb35050143a818f9d0db629435a9a78e8d17198dde62","archive_size":9071,"archive_url":"https://extensions.blender.org/download/sha256:d54b9643f49a26032c9bdb35050143a818f9d0db629435a9a78e8d17198dde62/add-on-demo-mode-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/demo-mode/","maintainer":"campbell","license":["SPDX:GPL-2.0-or-later"],"tags":["System"]},{"id":"scene_information","schema_version":"1.0.0","name":"Scene Information","version":"0.3.1","tagline":"Show information about the .blend","archive_hash":"sha256:fdb4bfdbc9e07e2ab29404de0cbd8e746a09b271ec4359d2934063c30ff7afe6","archive_size":1816,"archive_url":"https://extensions.blender.org/download/sha256:fdb4bfdbc9e07e2ab29404de0cbd8e746a09b271ec4359d2934063c30ff7afe6/add-on-scene-information-v0.3.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/scene-information/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["System"]},{"id":"paint_palettes","schema_version":"1.0.0","name":"Paint Palettes","version":"0.9.4","tagline":"Palettes for color and weight paint modes","archive_hash":"sha256:8c144a176ec5f4bfc530a2847a6bbb460ddd6f10048226605da97ed51ef24321","archive_size":6133,"archive_url":"https://extensions.blender.org/download/sha256:8c144a176ec5f4bfc530a2847a6bbb460ddd6f10048226605da97ed51ef24321/add-on-paint-palettes-v0.9.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/paint-palettes/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Paint"]},{"id":"nuke_animation_format_chan","schema_version":"1.0.0","name":"Nuke Animation Format (.chan)","version":"1.0.0","tagline":"Import/Export object's animation with nuke","archive_hash":"sha256:9b6eed1f16c02a3ab7647f1f18160df19035a25c4a7fac6d05c70ea7a6de90c9","archive_size":4340,"archive_url":"https://extensions.blender.org/download/sha256:9b6eed1f16c02a3ab7647f1f18160df19035a25c4a7fac6d05c70ea7a6de90c9/add-on-nuke-animation-format-chan-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nuke-animation-format-chan/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Import-Export"]},{"id":"btracer","schema_version":"1.0.0","name":"BTracer","version":"1.2.4","tagline":"Tools for converting/animating objects/particles into curves","archive_hash":"sha256:5a29e1daf2b2a0d8e652c84c9b56c25b1f950d92c8a24b03de5b3aa9bdb98064","archive_size":17367,"archive_url":"https://extensions.blender.org/download/sha256:5a29e1daf2b2a0d8e652c84c9b56c25b1f950d92c8a24b03de5b3aa9bdb98064/add-on-btracer-v1.2.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/btracer/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Add Curve"]},{"id":"web3d_x3d_vrml2_format","schema_version":"1.0.0","name":"Web3D X3D/VRML2 format","version":"2.5.1","tagline":"Import-Export X3D, Import VRML2","archive_hash":"sha256:74bcf2cb912af4be5db550f9486b4a0470b4513ef61d4df07ba091edd1441604","archive_size":100153,"archive_url":"https://extensions.blender.org/download/sha256:74bcf2cb912af4be5db550f9486b4a0470b4513ef61d4df07ba091edd1441604/add-on-web3d-x3d-vrml2-format-v2.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/web3d-x3d-vrml2-format/","maintainer":"Bujus_Krachus","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Required to access files for import/export","network":"Required to download web resources for import"},"tags":["Import-Export"]},{"id":"export_camera_animation","schema_version":"1.0.0","name":"Export Camera Animation","version":"0.1.2","tagline":"Export Cameras & Markers to a Python script","archive_hash":"sha256:fae5cacd489f79872e1dd8cce0b5ad8080f6bdfdc4633133d069157ac3d790ed","archive_size":2057,"archive_url":"https://extensions.blender.org/download/sha256:fae5cacd489f79872e1dd8cce0b5ad8080f6bdfdc4633133d069157ac3d790ed/add-on-export-camera-animation-v0.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/export-camera-animation/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Requires access to directory where it exports .py file"},"tags":["Import-Export"]},{"id":"cadbase_library","schema_version":"1.0.0","name":"CADBase Library","version":"0.3.0","tagline":"Add-on enables data sync with remote storage (cloud)","archive_hash":"sha256:395e335930e4537a2d742750f571c2dbf12c6a9475d2deb22bbe92bfe819f7be","archive_size":190158,"archive_url":"https://extensions.blender.org/download/sha256:395e335930e4537a2d742750f571c2dbf12c6a9475d2deb22bbe92bfe819f7be/add-on-cadbase-library-v0.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cadbase-library/","maintainer":"mnnxp","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export library data from/to disk","network":"Need to to sync library data with a remote server","clipboard":"Copy component link to clipboard"},"tags":["Import-Export"]},{"id":"forts_map","schema_version":"1.0.0","name":"Forts Map Importer","version":"1.0.1","tagline":"Import Forts Map","archive_hash":"sha256:4657348ef634c9404c900accbe3cbc7799952cb8416f5afd6f24939483de4b66","archive_size":4234,"archive_url":"https://extensions.blender.org/download/sha256:4657348ef634c9404c900accbe3cbc7799952cb8416f5afd6f24939483de4b66/add-on-forts-map-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/forts-map/","maintainer":"Gonnetz","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Import-Export"]},{"id":"democap_tools","schema_version":"1.0.0","name":"DEMoCap Tools","version":"1.0.4","tagline":"Tools for importing DEMoCap motion captures into Blender","archive_hash":"sha256:645fcf063891b4973ac5b1cd96e8ae229586ea53a08ec4650191b4f892d9ba0e","archive_size":114185,"archive_url":"https://extensions.blender.org/download/sha256:645fcf063891b4973ac5b1cd96e8ae229586ea53a08ec4650191b4f892d9ba0e/add-on-democap-tools-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/democap-tools/","maintainer":"DragonDreams","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Loading motion capture files","network":"Connect to DEMoCap (Live Connection)"},"tags":["Import-Export","3D View","Object","Animation"]},{"id":"dragengine_tools","schema_version":"1.0.0","name":"Drag[en]gine Import/Export","version":"1.29.1","tagline":"Import/Export Drag[en]gine Resources including helper tools","archive_hash":"sha256:b72e32bc0067170ec0865d3dc1eef9a487235043d566b286c85456f00189b14a","archive_size":115706,"archive_url":"https://extensions.blender.org/download/sha256:b72e32bc0067170ec0865d3dc1eef9a487235043d566b286c85456f00189b14a/add-on-dragengine-tools-v1.29.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dragengine-tools/","maintainer":"DragonDreams","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Importing/Exporting resources"},"tags":["Import-Export","3D View","Mesh","Object","Animation"]}],"version":"v1"} \ No newline at end of file +{"blocklist":[],"data":[{"id":"bezier_curve_editor","schema_version":"1.0.0","name":"Bezier Curve Editor","version":"1.0.6","tagline":"An editor for editing and applying easing curves","archive_hash":"sha256:b5ebbf0790fc2fb8024b206806e74b2fc2c7dae2e348021fa3a93e99ec95605b","archive_size":34930,"archive_url":"https://extensions.blender.org/download/sha256:b5ebbf0790fc2fb8024b206806e74b2fc2c7dae2e348021fa3a93e99ec95605b/add-on-bezier-curve-editor-v1.0.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bezier-curve-editor/","maintainer":"IcedDog","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","User Interface"]},{"id":"simple_camera_match","schema_version":"1.0.0","name":"Simple Camera Match","version":"1.0.6","tagline":"Simple Camera Match - Blender插件","archive_hash":"sha256:290f04c8ea1ffabe2107cec70f3695418c8e2ffd97a67380dc3d9e5090bc6c15","archive_size":26744,"archive_url":"https://extensions.blender.org/download/sha256:290f04c8ea1ffabe2107cec70f3695418c8e2ffd97a67380dc3d9e5090bc6c15/add-on-simple-camera-match-v1.0.6-windows-arm64-windows-x64-macos-arm64-macos-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/simple-camera-match/","maintainer":"MingWitty","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-arm64","windows-x64","macos-arm64","macos-x64"],"tags":["Object","3D View","Scene"]},{"id":"cut_sym","schema_version":"1.0.0","name":"Cut Sym","version":"0.0.3","tagline":"Symmetrically cut mesh objects into two halves","archive_hash":"sha256:e7d6c45ec0e1b64bc1befa7bd9cc9ec57d3e9c6e9113f1b15760fd897d63b593","archive_size":5150,"archive_url":"https://extensions.blender.org/download/sha256:e7d6c45ec0e1b64bc1befa7bd9cc9ec57d3e9c6e9113f1b15760fd897d63b593/add-on-cut-sym-v0.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cut-sym/","maintainer":"Wiffzackius","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"org_eridanus_emotion","schema_version":"1.0.0","name":"E Motion","version":"0.3.7","tagline":"Motion editing and curve manipulation","archive_hash":"sha256:c6698a4b8d99b4df2ad21ff1c8fb4834f998d36e5854f8848cb96f8d4cc49d80","archive_size":126660,"archive_url":"https://extensions.blender.org/download/sha256:c6698a4b8d99b4df2ad21ff1c8fb4834f998d36e5854f8848cb96f8d4cc49d80/add-on-org-eridanus-emotion-v0.3.7.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/org-eridanus-emotion/","maintainer":"Eridanus-Epsilon","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"o_oo_math_controller","schema_version":"1.0.0","name":"Math Controller","version":"0.4.8","tagline":"Add math group node that acts according to written formulas","archive_hash":"sha256:f5f60ca30c53c4794c251b8eca14c48f6cfd8e9f12de81be63663c16cb761c4a","archive_size":31880,"archive_url":"https://extensions.blender.org/download/sha256:f5f60ca30c53c4794c251b8eca14c48f6cfd8e9f12de81be63663c16cb761c4a/add-on-o-oo-math-controller-v0.4.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/o-oo-math-controller/","maintainer":"o_oo_gote510","license":["SPDX:GPL-3.0-or-later"],"tags":["Node"]},{"id":"Decentraland_Theme","schema_version":"1.0.0","name":"Decentraland Theme","version":"1.0.0","tagline":"Deep black theme with Decentraland brand colors","archive_hash":"sha256:3e1165a4850e986bcafbaf888ac43e17b441a1a176ddf1f9406ff8443f6d9e64","archive_size":5681,"archive_url":"https://extensions.blender.org/download/sha256:3e1165a4850e986bcafbaf888ac43e17b441a1a176ddf1f9406ff8443f6d9e64/theme-decentraland-theme-v1.0.0.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/decentraland-theme/","maintainer":"Decentraland-Foundation","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"sculpt_mask_facesets_tools","schema_version":"1.0.0","name":"Sculpt Mask FaceSets Tools","version":"1.0.0","tagline":"This is a Blender sculpting support tools","archive_hash":"sha256:5846b16d90b6dcda0833a576e725ab8e8b3bbd4bd4d23adf51d4cde7eab409c1","archive_size":11172,"archive_url":"https://extensions.blender.org/download/sha256:5846b16d90b6dcda0833a576e725ab8e8b3bbd4bd4d23adf51d4cde7eab409c1/add-on-sculpt-mask-facesets-tools-v1.0.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/sculpt-mask-facesets-tools/","maintainer":"Seaway","license":["SPDX:GPL-3.0-or-later"],"tags":["Sculpt"]},{"id":"decentraland_tools","schema_version":"1.0.0","name":"Decentraland Tools","version":"1.9.0","tagline":"Scenes, Wearables, and Emotes directly in Blender","archive_hash":"sha256:5f1b326cb0909b1041f1d397e6c2fc008088dc07cffda0ce21740273159d271f","archive_size":2320459,"archive_url":"https://extensions.blender.org/download/sha256:5f1b326cb0909b1041f1d397e6c2fc008088dc07cffda0ce21740273159d271f/add-on-decentraland-tools-v1.9.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/decentraland-tools/","maintainer":"Decentraland-Foundation","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export glTF files and Decentraland assets","network":"Open Decentraland documentation URLs in browser"},"tags":["Object","Import-Export"]},{"id":"two_point_ex","schema_version":"1.0.0","name":"Two Point Ex","version":"1.0.0","tagline":"A retro theme inspired by Blender 2.2x and before","archive_hash":"sha256:862589b1ae300cc5d200cdf9f952068e7532641704b058b3e1b6daf20cd55ba4","archive_size":5902,"archive_url":"https://extensions.blender.org/download/sha256:862589b1ae300cc5d200cdf9f952068e7532641704b058b3e1b6daf20cd55ba4/theme-two-point-ex-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/two-point-ex/","maintainer":"eyecandy","license":["SPDX:GPL-3.0-or-later"],"tags":["Light","Inspired By"]},{"id":"render_profiler","schema_version":"1.0.0","name":"Render Profiler","version":"0.9.4","tagline":"Profile and analyze Blender render/viewport performance","archive_hash":"sha256:b8c9f95f6d2bd70e6f93ecda2f391b6a39293b3dc06262706f54cbe4e610bbb8","archive_size":38861,"archive_url":"https://extensions.blender.org/download/sha256:b8c9f95f6d2bd70e6f93ecda2f391b6a39293b3dc06262706f54cbe4e610bbb8/add-on-render-profiler-v0.9.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/render-profiler/","maintainer":"MultLabs","license":["SPDX:GPL-3.0-or-later"],"tags":["Render","System"]},{"id":"storytools","schema_version":"1.0.0","name":"Storytools - Storyboard Tools","version":"3.3.2","tagline":"Set of tools for Storyboarding and 2D animation","archive_hash":"sha256:39e117d36abdcfe8580294db16bb9198ad1a81f49873c0a38e5752343e2e444b","archive_size":303524,"archive_url":"https://extensions.blender.org/download/sha256:39e117d36abdcfe8580294db16bb9198ad1a81f49873c0a38e5752343e2e444b/add-on-storytools-v3.3.2.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/storytools/","maintainer":"SamuelBernou","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Grease Pencil","3D View"]},{"id":"pseudo_rendering_farm","schema_version":"1.0.0","name":"Pseudo Rendering Farm","version":"1.1.0","tagline":"Spawns multiple background processes to render the current file","archive_hash":"sha256:fe2816cdd82930351427801978b2b527ab061229c7efa22333b5e578892b7c80","archive_size":5221,"archive_url":"https://extensions.blender.org/download/sha256:fe2816cdd82930351427801978b2b527ab061229c7efa22333b5e578892b7c80/add-on-pseudo-rendering-farm-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pseudo-rendering-farm/","maintainer":"mklimenko","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Required to manage output files and temporary benchmark data"},"tags":["Render"]},{"id":"home_builder_5","schema_version":"1.0.0","name":"Home Builder 5","version":"5.1.0","tagline":"Design interior spaces with parametric cabinets","archive_hash":"sha256:cac7209d15f87230ea980632dddf4f9deb885ff7cbc2711cf345bd660391c035","archive_size":24089015,"archive_url":"https://extensions.blender.org/download/sha256:cac7209d15f87230ea980632dddf4f9deb885ff7cbc2711cf345bd660391c035/add-on-home-builder-5-v5.1.0-windows-x64.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/home-builder-5/","maintainer":"AndrewPeel","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save/load project files, export PDFs and layouts"},"platforms":["windows-x64"],"tags":["Add Mesh","Scene"]},{"id":"softviz_pro","schema_version":"1.0.0","name":"SoftViz Pro","version":"1.2.0","tagline":"GPU-accelerated heatmap visualizer for Proportional Editing","archive_hash":"sha256:3f84cef289f013863d16b9a80df390e0c24b5b9deb9c094e6f1749bbc9d946f9","archive_size":5456,"archive_url":"https://extensions.blender.org/download/sha256:3f84cef289f013863d16b9a80df390e0c24b5b9deb9c094e6f1749bbc9d946f9/add-on-softviz-pro-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/softviz-pro/","maintainer":"Niels-Couvreur","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","3D View"]},{"id":"theme_property_finder","schema_version":"1.0.0","name":"Theme Property Finder","version":"1.0.0","tagline":"Find and sync theme properties across all editors instantly","archive_hash":"sha256:7fd51c82c5dc21aca4e525cdbae5394c4415e7b44d036639ed33495fac94ef2d","archive_size":4442,"archive_url":"https://extensions.blender.org/download/sha256:7fd51c82c5dc21aca4e525cdbae5394c4415e7b44d036639ed33495fac94ef2d/add-on-theme-property-finder-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/theme-property-finder/","maintainer":"Nanomanpro","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"alias_repowered","schema_version":"1.0.0","name":"Alias Repowered","version":"1.0.0","tagline":"Classic theme inspired by Alias Poweranimator","archive_hash":"sha256:b2d913d82657c2b4f5e91eb61d5fe3ed131b2601234714a2b6aefc7adc91a525","archive_size":5471,"archive_url":"https://extensions.blender.org/download/sha256:b2d913d82657c2b4f5e91eb61d5fe3ed131b2601234714a2b6aefc7adc91a525/theme-alias-repowered-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/alias-repowered/","maintainer":"Tetrabunz","license":["SPDX:GPL-3.0-or-later"],"tags":["Inspired By","Light"]},{"id":"shapekey_axis_control","schema_version":"1.0.0","name":"ShapeKey Axis Control","version":"4.0.42","tagline":"Control shape keys using a 2D Axis HUD Joystick","archive_hash":"sha256:612c61ada4461e4fb063fbfdd9dccb8e20166a9a4b24ba90d95761022d650cee","archive_size":9690484,"archive_url":"https://extensions.blender.org/download/sha256:612c61ada4461e4fb063fbfdd9dccb8e20166a9a4b24ba90d95761022d650cee/add-on-shapekey-axis-control-v4.0.42.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shapekey-axis-control/","maintainer":"Axnise","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Rigging"]},{"id":"e_topology_smooth","schema_version":"1.0.0","name":"E Topology Smooth","version":"2.7.8","tagline":"Mesh topology smoothing with G0-G4 continuity analysis","archive_hash":"sha256:cd781bedfd0c453a40d1a3393b8a0a4ad5f7bb631de60dab2b9312974dedbd2d","archive_size":35864648,"archive_url":"https://extensions.blender.org/download/sha256:cd781bedfd0c453a40d1a3393b8a0a4ad5f7bb631de60dab2b9312974dedbd2d/add-on-e-topology-smooth-v2.7.8-windows-x64.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/e-topology-smooth/","maintainer":"Eridanus-Epsilon","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Mesh","Modeling"]},{"id":"grease_mesh","schema_version":"1.0.0","name":"Grease Mesh","version":"1.0.4","tagline":"Easy toolbox for creating meshes from Grease Pencil","archive_hash":"sha256:a151fee1d46ede54cf041b0832dfff2712ed8403178d6153023e41fa6d6a2f31","archive_size":37211,"archive_url":"https://extensions.blender.org/download/sha256:a151fee1d46ede54cf041b0832dfff2712ed8403178d6153023e41fa6d6a2f31/add-on-grease-mesh-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/grease-mesh/","maintainer":"Tonis","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Grease Pencil","Modeling"]},{"id":"palette","schema_version":"1.0.0","name":"Palette","version":"1.1.5","tagline":"Load 600+ terminal palettes as complete Blender UI themes","archive_hash":"sha256:bf9563590e4eb6603e3d33bc4dd54bcc272dc3ed28bcd9bffb751e1ec337230c","archive_size":53305,"archive_url":"https://extensions.blender.org/download/sha256:bf9563590e4eb6603e3d33bc4dd54bcc272dc3ed28bcd9bffb751e1ec337230c/add-on-palette-v1.1.5.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/palette/","maintainer":"NXSTYNATE","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Caches themes locally","network":"Downloads color schemes from GitHub repositories"},"tags":["User Interface"]},{"id":"b_onion_skin","schema_version":"1.0.0","name":"B Onion Skin","version":"1.0.0","tagline":"Onion skinning for 3D animation","archive_hash":"sha256:6e976d6e74649431a61224918b7d505da2b5620419e3def201841386c1277fc9","archive_size":10458,"archive_url":"https://extensions.blender.org/download/sha256:6e976d6e74649431a61224918b7d505da2b5620419e3def201841386c1277fc9/add-on-b-onion-skin-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/b-onion-skin/","maintainer":"Dinesh007","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"import_paint_brush","schema_version":"1.0.0","name":"Import Paint Brushes","version":"0.4.0","tagline":"Parsing several brush formats of painting software","archive_hash":"sha256:8757073919c0d49df138f4ebe5c4c126e4a68acdeb4622188637bfc1ca37abdf","archive_size":29373,"archive_url":"https://extensions.blender.org/download/sha256:8757073919c0d49df138f4ebe5c4c126e4a68acdeb4622188637bfc1ca37abdf/add-on-import-paint-brush-v0.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/import-paint-brush/","maintainer":"chsh2","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import brush files from disk"},"tags":["Import-Export","Paint","Sculpt","Grease Pencil"]},{"id":"sculpt_navigation","schema_version":"1.0.0","name":"Sculpt Navigation","version":"1.0.2","tagline":"ZBrush/3D-Coat style viewport navigation","archive_hash":"sha256:b9c5607fb3e7bf4d199efe55b4025172ec47e5c8e55997ae99ec4de5f11f3c36","archive_size":40766,"archive_url":"https://extensions.blender.org/download/sha256:b9c5607fb3e7bf4d199efe55b4025172ec47e5c8e55997ae99ec4de5f11f3c36/add-on-sculpt-navigation-v1.0.2.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/sculpt-navigation/","maintainer":"Cuzmic","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Sculpt"]},{"id":"texture_mixer","schema_version":"1.0.0","name":"Texture Mixer","version":"0.1.1","tagline":"Layer-based PBR mixing and texture management","archive_hash":"sha256:b32909cebb5fe5369de8344f38d6ee6f7aca7d8e75305ad168e0002fb2a5971b","archive_size":287099,"archive_url":"https://extensions.blender.org/download/sha256:b32909cebb5fe5369de8344f38d6ee6f7aca7d8e75305ad168e0002fb2a5971b/add-on-texture-mixer-v0.1.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/texture-mixer/","maintainer":"MoonRaider","license":["SPDX:GPL-3.0-or-later"]},{"id":"delete_empty_nla_tracks","schema_version":"1.0.0","name":"Delete Empty NLA Tracks","version":"1.0.0","tagline":"Remove empty NLA tracks from all objects","archive_hash":"sha256:e49031699498ec0f3bfd8904a6a29b30e0848f2d6443915298b63552999b6624","archive_size":2118,"archive_url":"https://extensions.blender.org/download/sha256:e49031699498ec0f3bfd8904a6a29b30e0848f2d6443915298b63552999b6624/add-on-delete-empty-nla-tracks-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/delete-empty-nla-tracks/","maintainer":"Rikokenz","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"Cyberpunk_2077_UI","schema_version":"1.0.0","name":"Cyberpunk_2077_UI","version":"2.0.3","tagline":"Colorful Futuristic Dystopian","archive_hash":"sha256:524990d9be34fd70f5c07591edbb92f4338385d7af01f6a70d177e903945ca79","archive_size":5660,"archive_url":"https://extensions.blender.org/download/sha256:524990d9be34fd70f5c07591edbb92f4338385d7af01f6a70d177e903945ca79/theme-cyberpunk-2077-ui-v2.0.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/cyberpunk-2077-ui/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"smart_selection_propagation","schema_version":"1.0.0","name":"Smart Selection Propagation","version":"1.0.0","tagline":"Advanced topology-based selection of similar mesh elements","archive_hash":"sha256:e297789ec5d939ad212de504908c143b963108c3bc4c2b28f23a87fccab6da13","archive_size":6632,"archive_url":"https://extensions.blender.org/download/sha256:e297789ec5d939ad212de504908c143b963108c3bc4c2b28f23a87fccab6da13/add-on-smart-selection-propagation-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/smart-selection-propagation/","maintainer":"atrxi","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling","3D View"]},{"id":"ROSE2_theme","schema_version":"1.0.0","name":"theme ROSE","version":"1.0.0","tagline":"Soft pink theme, dark","archive_hash":"sha256:22a391c485c6efc8c7d4dfe060ff17d177d47fcf205abaa0763fc474e609b640","archive_size":6432,"archive_url":"https://extensions.blender.org/download/sha256:22a391c485c6efc8c7d4dfe060ff17d177d47fcf205abaa0763fc474e609b640/theme-rose2-theme-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/rose2-theme/","maintainer":"5Lunes","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"arknights_endfield_theme","schema_version":"1.0.0","name":"Arknights: Endfield","version":"1.0.1","tagline":"Theme inspired by Arknights: Endfield game UI","archive_hash":"sha256:8c151906dba63d9240bb2fa29b0024df03bfd516d5bc665d260d19b7e2de7d52","archive_size":5545,"archive_url":"https://extensions.blender.org/download/sha256:8c151906dba63d9240bb2fa29b0024df03bfd516d5bc665d260d19b7e2de7d52/theme-arknights-endfield-theme-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/arknights-endfield-theme/","maintainer":"RAZUMNO","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"motion_sounds","schema_version":"1.0.0","name":"Motion Sounds","version":"0.9.0","tagline":"Add sounds to your animation based on motion events","archive_hash":"sha256:62f25e1acafc6b4af5389f1b9d4e685ef0cb44062b74bff00ff70e08109d90e0","archive_size":187022,"archive_url":"https://extensions.blender.org/download/sha256:62f25e1acafc6b4af5389f1b9d4e685ef0cb44062b74bff00ff70e08109d90e0/add-on-motion-sounds-v0.9.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/motion-sounds/","maintainer":"Jan-Hendrik-Müller","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Sequencer"]},{"id":"fk_ik_snapping_tools","schema_version":"1.0.0","name":"FK/IK Snapping Tools","version":"1.0.0","tagline":"Seamlessly snap FK controls to IK and vice versa","archive_hash":"sha256:002108bd615d7e54428eac30c42e80215c917e61d904ddbd33da0eb3c84118f2","archive_size":3458,"archive_url":"https://extensions.blender.org/download/sha256:002108bd615d7e54428eac30c42e80215c917e61d904ddbd33da0eb3c84118f2/add-on-fk-ik-snapping-tools-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/fk-ik-snapping-tools/","maintainer":"atrxi","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Rigging"]},{"id":"gv_point_cloud_exporter","schema_version":"1.0.0","name":"PointCloud and Splat Exporter (.ply, .splat)","version":"0.1.2","tagline":"Export PointCloud and Splat data to PLY and SPLAT format","archive_hash":"sha256:b90aded08f08dc965ba8967b19b55e808de53e30df52231cb5d12c3941c21433","archive_size":15659,"archive_url":"https://extensions.blender.org/download/sha256:b90aded08f08dc965ba8967b19b55e808de53e30df52231cb5d12c3941c21433/add-on-gv-point-cloud-exporter-v0.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/gv-point-cloud-exporter/","maintainer":"GiancarloV","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export files on disk","network":"Send anonymous usage analytics to Plausible Analytics. (Opt-In)"},"tags":["Import-Export"]},{"id":"ThreeMF_io","schema_version":"1.0.0","name":"3MF Import/Export","version":"2.5.1","tagline":"Import and export 3D Manufacturing Format (3MF) files","archive_hash":"sha256:c9185a00289d0486ebdda5e5f92caf3ce515c97ec93cbf3cd5c2ffea96aa5b20","archive_size":287217,"archive_url":"https://extensions.blender.org/download/sha256:c9185a00289d0486ebdda5e5f92caf3ce515c97ec93cbf3cd5c2ffea96aa5b20/add-on-threemf-io-v2.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/threemf-io/","maintainer":"Clonephaze","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"For import and export of 3MF files"},"tags":["Import-Export"]},{"id":"SilhouetteToole","schema_version":"1.0.0","name":"SilhouetteToole","version":"1.9.3","tagline":"One-click viewport silhouette mode","archive_hash":"sha256:3d21f4e70cbc54a5ad89ce8169dcec502cad3d4d5a96c3cbd899ddee1ec82bc9","archive_size":2042,"archive_url":"https://extensions.blender.org/download/sha256:3d21f4e70cbc54a5ad89ce8169dcec502cad3d4d5a96c3cbd899ddee1ec82bc9/add-on-silhouettetoole-v1.9.3.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/silhouettetoole/","maintainer":"Quinzy","license":["SPDX:GPL-3.0-or-later"]},{"id":"tetrominode","schema_version":"1.0.0","name":"Tetrominode","version":"0.4.6","tagline":"Play Tetris in Blender using Geometry Nodes","archive_hash":"sha256:c0f2fdedf0d3999ac0734992540b50bda5a982a38503097fd9b6521186bced0a","archive_size":254981,"archive_url":"https://extensions.blender.org/download/sha256:c0f2fdedf0d3999ac0734992540b50bda5a982a38503097fd9b6521186bced0a/add-on-tetrominode-v0.4.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/tetrominode/","maintainer":"darkstarrd","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Animation"]},{"id":"modular_tree","schema_version":"1.0.0","name":"Modular Tree","version":"5.5.0","tagline":"Procedural node based 3D tree generation","archive_hash":"sha256:ca71341d8ca1cf0d1da72a9d4591da0d90a4f83f6c8329de59c47e46da566453","archive_size":3442853,"archive_url":"https://extensions.blender.org/download/sha256:ca71341d8ca1cf0d1da72a9d4591da0d90a4f83f6c8329de59c47e46da566453/add-on-modular-tree-v5.5.0-windows-x64.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/modular-tree/","maintainer":"Brandyn-Britton","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export pivot painter textures"},"platforms":["windows-x64"],"tags":["Mesh","Add Curve"]},{"id":"Expecto_Patronum_Theme","schema_version":"1.0.0","name":"Expecto_Patronum_Theme","version":"1.0.6","tagline":"Airy Guardian Spirit","archive_hash":"sha256:c843ac141ec8c1d6a15f00621dd77da18617e2868441fbfff7c0a3d291faed85","archive_size":5749,"archive_url":"https://extensions.blender.org/download/sha256:c843ac141ec8c1d6a15f00621dd77da18617e2868441fbfff7c0a3d291faed85/theme-expecto-patronum-theme-v1.0.6.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/expecto-patronum-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"oebs_icon_viewer","schema_version":"1.0.0","name":"OEBS Icon Viewer","version":"1.4.0","tagline":"Browse and Search Blender Icons","archive_hash":"sha256:4e795ee297e73aaec5f6e3c8409241de1854dc6e4b287b474b306f0e043a3042","archive_size":11719,"archive_url":"https://extensions.blender.org/download/sha256:4e795ee297e73aaec5f6e3c8409241de1854dc6e4b287b474b306f0e043a3042/add-on-oebs-icon-viewer-v1.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/oebs-icon-viewer/","maintainer":"Eric-Mwangi","license":["SPDX:GPL-3.0-or-later"],"permissions":{"clipboard":"To copy icon names to the clipboard"},"tags":["Development","System"]},{"id":"easeit","schema_version":"1.0.0","name":"Easeit","version":"1.0.1","tagline":"Quickly apply easing presets to animation keyframes","archive_hash":"sha256:beea61edf4d85ca09c8e7653f893bd9bef25e7aecb7324931522fa2312400c3f","archive_size":60285,"archive_url":"https://extensions.blender.org/download/sha256:beea61edf4d85ca09c8e7653f893bd9bef25e7aecb7324931522fa2312400c3f/add-on-easeit-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/easeit/","maintainer":"AndyCuccaro","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"siemen_lens_blender_autotrack","schema_version":"1.0.0","name":"AutoTrack","version":"4.0.4","tagline":"Automatic 3D Tracking and Solving","archive_hash":"sha256:6097085a5b3b78bef65b34dff9d5e8e06959224e547d6c9dcf4150ab818c2253","archive_size":19471,"archive_url":"https://extensions.blender.org/download/sha256:6097085a5b3b78bef65b34dff9d5e8e06959224e547d6c9dcf4150ab818c2253/add-on-siemen-lens-blender-autotrack-v4.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/siemen-lens-blender-autotrack/","maintainer":"Siemen-Lens","license":["SPDX:GPL-3.0-or-later"],"tags":["Tracking","Animation","Compositing","3D View"]},{"id":"node_note","schema_version":"1.0.0","name":"Node Note/节点随记","version":"1.3.0","tagline":"Powerful node notes with text and images/强大的节点图文笔记工具","archive_hash":"sha256:10862308477beaf193562f2ccc6668133d26d9540c4937d59cb66ab22fe9e29d","archive_size":34076,"archive_url":"https://extensions.blender.org/download/sha256:10862308477beaf193562f2ccc6668133d26d9540c4937d59cb66ab22fe9e29d/add-on-node-note-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-note/","maintainer":"W_Cloud","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import image or use font from disk","clipboard":"Paste text/image from the clipboard and copy text to clipboard"},"tags":["Node"]},{"id":"local_view_collection","schema_version":"1.0.0","name":"Local View by collection","version":"1.0.1","tagline":"Quickly isolate into local view the objects of a collection","archive_hash":"sha256:b3787414e05eb4fec2321dfa8869b24a904daca1a94537c0624733dd171b9e7b","archive_size":5631,"archive_url":"https://extensions.blender.org/download/sha256:b3787414e05eb4fec2321dfa8869b24a904daca1a94537c0624733dd171b9e7b/add-on-local-view-collection-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/local-view-collection/","maintainer":"D3W3","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Object","User Interface"]},{"id":"SimpleMIDI","schema_version":"1.0.0","name":"SimpleMIDI","version":"0.1.13","tagline":"Control object parameters through MIDI Input","archive_hash":"sha256:1c9001d8ced49c7dd63ec3c88c69f3095eff57dd00b6d45f136dd6a00b67db16","archive_size":279077,"archive_url":"https://extensions.blender.org/download/sha256:1c9001d8ced49c7dd63ec3c88c69f3095eff57dd00b6d45f136dd6a00b67db16/add-on-simplemidi-v0.1.13-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/simplemidi/","maintainer":"yadu","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Imports and exports JSON for target maps"},"platforms":["windows-x64"],"tags":["User Interface","Animation"]},{"id":"theme_mockup","schema_version":"1.0.0","name":"Mockup","version":"1.0.0","tagline":"Mockups to use with the (low-fi) Design System components","archive_hash":"sha256:e3588ff217ac36cfab5f0046a6f305b6cd21005a3b6039564169ab070569674e","archive_size":5395,"archive_url":"https://extensions.blender.org/download/sha256:e3588ff217ac36cfab5f0046a6f305b6cd21005a3b6039564169ab070569674e/theme-theme-mockup-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-mockup/","maintainer":"Blender","license":["SPDX:GPL-3.0-or-later"],"tags":["Light","High Contrast"]},{"id":"topology_doctor","schema_version":"1.0.0","name":"Topology Doctor","version":"1.0.0","tagline":"One-click topology analysis and repair assistant","archive_hash":"sha256:79c03ca9c72968c3badfb6ecd2e4aba1fbc6fd8818681c453ddc95ad1f4ad3dd","archive_size":16947,"archive_url":"https://extensions.blender.org/download/sha256:79c03ca9c72968c3badfb6ecd2e4aba1fbc6fd8818681c453ddc95ad1f4ad3dd/add-on-topology-doctor-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/topology-doctor/","maintainer":"Arman-Jangmiri","license":["SPDX:GPL-3.0-or-later"],"permissions":{"clipboard":"Required to copy the topology analysis report text to clipboard"}},{"id":"mio3_flex","schema_version":"1.0.0","name":"Mio3 Flex","version":"1.0.4","tagline":"Reshape meshes into smooth freeform curves using paths","archive_hash":"sha256:bf945d9b3e16c43a7c073367785f0ec7e1fb274283ab31398dd8cd6b66334f05","archive_size":30030,"archive_url":"https://extensions.blender.org/download/sha256:bf945d9b3e16c43a7c073367785f0ec7e1fb274283ab31398dd8cd6b66334f05/add-on-mio3-flex-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mio3-flex/","maintainer":"mio","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"chordsong","schema_version":"1.0.0","name":"Chord Song","version":"1.2.2","tagline":"Vim-like key implementation for Blender","archive_hash":"sha256:59187c73ba4d7fc9a1a1ba41db532f6b8be979aae250bc2c8ad2aea6b0bb4d4a","archive_size":182295,"archive_url":"https://extensions.blender.org/download/sha256:59187c73ba4d7fc9a1a1ba41db532f6b8be979aae250bc2c8ad2aea6b0bb4d4a/add-on-chordsong-v1.2.2.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/chordsong/","maintainer":"Cyrill-Vitkovskiy","license":["SPDX:GPL-3.0-or-later"],"tags":["Development"]},{"id":"hdri_lightbrush","schema_version":"1.0.0","name":"HDRI LightBrush","version":"1.0.1","tagline":"Paint HDRIs on 3D sphere for precise studio lighting control","archive_hash":"sha256:2dd62f9b14e0adbeb049c31a26e9b4c36230e6d57140b494c62d2f4d2ed8f5dc","archive_size":144003,"archive_url":"https://extensions.blender.org/download/sha256:2dd62f9b14e0adbeb049c31a26e9b4c36230e6d57140b494c62d2f4d2ed8f5dc/add-on-hdri-lightbrush-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/hdri-lightbrush/","maintainer":"CadTamas","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export HDRI files (.exr, .hdr, .jpg, .png)"},"tags":["Lighting","Paint"]},{"id":"ghostview","schema_version":"1.0.0","name":"GhostView","version":"1.0.2","tagline":"Adjust Window Opacity","archive_hash":"sha256:5cdb7039cbed497381072c413152cc571e9a6d37e92364fd2331d864785c7cc2","archive_size":1997,"archive_url":"https://extensions.blender.org/download/sha256:5cdb7039cbed497381072c413152cc571e9a6d37e92364fd2331d864785c7cc2/add-on-ghostview-v1.0.2-windows-x64-windows-arm64-macos-x64-macos-arm64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ghostview/","maintainer":"JR3DFUL","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64","windows-arm64","macos-x64","macos-arm64"],"tags":["User Interface","System"]},{"id":"gamepadcontrol","schema_version":"1.0.0","name":"Gamepad Control","version":"0.1.2","tagline":"Use gamepads as input device to control Blender","archive_hash":"sha256:91cd1c62ff1c6f009b15f2058627ca927f91ccc237ad1cfd5b59af71bd04cc62","archive_size":4828055,"archive_url":"https://extensions.blender.org/download/sha256:91cd1c62ff1c6f009b15f2058627ca927f91ccc237ad1cfd5b59af71bd04cc62/add-on-gamepadcontrol-v0.1.2-windows-x64.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/gamepadcontrol/","maintainer":"Frank-Moelendoerp","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export settings and controller modes"},"platforms":["windows-x64"],"tags":["System","User Interface"]},{"id":"LightNCreamy","schema_version":"1.0.0","name":"Light N Creamy","version":"1.0.0","tagline":"Modern light and creamy theme","archive_hash":"sha256:928d02674d7730a994fef538991896f42a3581c8ffe7d8cb5dfa60a1023a61f7","archive_size":3828,"archive_url":"https://extensions.blender.org/download/sha256:928d02674d7730a994fef538991896f42a3581c8ffe7d8cb5dfa60a1023a61f7/theme-lightncreamy-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/lightncreamy/","maintainer":"nova3D","license":["SPDX:GPL-2.0-or-later"],"tags":["Light"]},{"id":"PivotTools","schema_version":"1.0.0","name":"Pivot Tools","version":"1.48.13","tagline":"Fast pivot placement with Auto Pick, BBox targets, Saved Pivots","archive_hash":"sha256:c4457381883495799f87d72226140492d101fecadb9f3021309503feb74438f8","archive_size":8530,"archive_url":"https://extensions.blender.org/download/sha256:c4457381883495799f87d72226140492d101fecadb9f3021309503feb74438f8/add-on-pivottools-v1.48.13.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/pivottools/","maintainer":"Quinzy","license":["SPDX:GPL-3.0-or-later"]},{"id":"geo_nodes_guide","schema_version":"1.0.0","name":"Geo Nodes Guide","version":"0.1.0","tagline":"Live documentation and examples for Geometry Nodes","archive_hash":"sha256:4b6c3a38e41845e4af3c48ac96f991023802ec6fb472fb27f1b70252141ed792","archive_size":93537,"archive_url":"https://extensions.blender.org/download/sha256:4b6c3a38e41845e4af3c48ac96f991023802ec6fb472fb27f1b70252141ed792/add-on-geo-nodes-guide-v0.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/geo-nodes-guide/","maintainer":"Addonyte","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","User Interface","Geometry Nodes"]},{"id":"linkforge","schema_version":"1.0.0","name":"LinkForge","version":"1.3.4","tagline":"The Linter & Bridge for Robotics","archive_hash":"sha256:dbecb7d6f4561b7aa90a0094a2b0bbb84fa4746939ef522fd878e53cd64d69fd","archive_size":701639,"archive_url":"https://extensions.blender.org/download/sha256:dbecb7d6f4561b7aa90a0094a2b0bbb84fa4746939ef522fd878e53cd64d69fd/add-on-linkforge-v1.3.4-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/linkforge/","maintainer":"Arouna-Patouossa-Mounchili","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/Export URDF/XACRO files"},"platforms":["windows-x64"],"tags":["Import-Export","Rigging","Physics","Pipeline"]},{"id":"retarget","schema_version":"1.0.0","name":"Retarget","version":"4.0.4","tagline":"Retargeting, convert to Rigify, Action Manager, Animation tools","archive_hash":"sha256:ce962ec2dd929de10cf227e6509cc39eeb776257714565c0b5c9c5ec84ee638b","archive_size":188738,"archive_url":"https://extensions.blender.org/download/sha256:ce962ec2dd929de10cf227e6509cc39eeb776257714565c0b5c9c5ec84ee638b/add-on-retarget-v4.0.4.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/retarget/","maintainer":"KBS-DEV","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Copy the name and length of a FBX file from disk"},"tags":["Animation","Rigging"]},{"id":"lodify_optimizer","schema_version":"1.0.0","name":"LODify","version":"2.9.0","tagline":"Full-Scenario Perf Opt: Textures, Decimation & Viewport Mgmt","archive_hash":"sha256:55fbe2789e591ec0517cb12bcd437c75ec7a245b32356c714941ba2a997a4e62","archive_size":14089942,"archive_url":"https://extensions.blender.org/download/sha256:55fbe2789e591ec0517cb12bcd437c75ec7a245b32356c714941ba2a997a4e62/add-on-lodify-optimizer-v2.9.0-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/lodify-optimizer/","maintainer":"小T_sune","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Required to read and write texture files for resizing"},"platforms":["windows-x64"],"tags":["Object"]},{"id":"red_velvet_theme","schema_version":"1.0.0","name":"Red Velvet Theme","version":"1.0.0","tagline":"A cosmic red cyberpunk-inspired theme","archive_hash":"sha256:befa1a1df17476ad63283489e5f0ec497a548aacde2889e337b4b390444f0ab7","archive_size":5449,"archive_url":"https://extensions.blender.org/download/sha256:befa1a1df17476ad63283489e5f0ec497a548aacde2889e337b4b390444f0ab7/theme-red-velvet-theme-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/red-velvet-theme/","maintainer":"Thunder-Artist","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful","Inspired By"]},{"id":"outliner_preview","schema_version":"1.0.0","name":"Outliner Model Preview","version":"1.1.2","tagline":"Preview selected model in the Outliner","archive_hash":"sha256:5d90d71e30ad7414deedd8ec6cf6cb035bc10f3cf2c072c301c4692270f13ac2","archive_size":29372,"archive_url":"https://extensions.blender.org/download/sha256:5d90d71e30ad7414deedd8ec6cf6cb035bc10f3cf2c072c301c4692270f13ac2/add-on-outliner-preview-v1.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/outliner-preview/","maintainer":"Shuimeng","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"ftw3dforge_image_projector","schema_version":"1.0.0","name":"FTW3DForge Image Projector","version":"2.1.0","tagline":"Project images onto 3D meshes with real-time preview and baking","archive_hash":"sha256:617174fdbacd5d088f727e257df211836bb8e56a8e133baf2e39ffa937ac8eaf","archive_size":16305,"archive_url":"https://extensions.blender.org/download/sha256:617174fdbacd5d088f727e257df211836bb8e56a8e133baf2e39ffa937ac8eaf/add-on-ftw3dforge-image-projector-v2.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/ftw3dforge-image-projector/","maintainer":"FTW3DForge","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import images from disk"},"tags":["UV","Mesh","Import-Export","Material"]},{"id":"smart_box_select","schema_version":"1.0.0","name":"Smart Box Select","version":"1.0.2","tagline":"Box/Lasso select with object activation","archive_hash":"sha256:3256c8631f9fd181e54271f3779eccfa601f014ce7b69154bb283584049172aa","archive_size":3800,"archive_url":"https://extensions.blender.org/download/sha256:3256c8631f9fd181e54271f3779eccfa601f014ce7b69154bb283584049172aa/add-on-smart-box-select-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/smart-box-select/","maintainer":"R4V3N","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface","3D View"]},{"id":"splashsurf_studio","schema_version":"1.0.0","name":"Splashsurf Studio","version":"1.0.1","tagline":"Surface reconstruction for particle-based fluid simulations","archive_hash":"sha256:86779180fe173ea75d43d3ff7cd72633b36444ed56b7412f5131f20f22696d9c","archive_size":2732095,"archive_url":"https://extensions.blender.org/download/sha256:86779180fe173ea75d43d3ff7cd72633b36444ed56b7412f5131f20f22696d9c/add-on-splashsurf-studio-v1.0.1-windows-x64.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/splashsurf-studio/","maintainer":"Fabian-Löschner","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Add Mesh","Mesh","Object"]},{"id":"global_copy_nodes","schema_version":"1.0.0","name":"Global Copy Nodes","version":"1.0.5","tagline":"Copy nodes across .blend projects","archive_hash":"sha256:64e8888b98b672b768e5a278c44a50912e2ed228472202306bfcf6fc37c7915e","archive_size":21986,"archive_url":"https://extensions.blender.org/download/sha256:64e8888b98b672b768e5a278c44a50912e2ed228472202306bfcf6fc37c7915e/add-on-global-copy-nodes-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/global-copy-nodes/","maintainer":"hisanimations","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Requires reading & writing node copy buffer to disk"},"tags":["System","Node"]},{"id":"overscan_addon","schema_version":"1.0.0","name":"Overscan Addon","version":"1.1.1","tagline":"Adds Overscan to your renders","archive_hash":"sha256:3c95e0eb67926e0a9d4f546b139aca201d56da18403a021f4dbd4c2964a47ddb","archive_size":6772,"archive_url":"https://extensions.blender.org/download/sha256:3c95e0eb67926e0a9d4f546b139aca201d56da18403a021f4dbd4c2964a47ddb/add-on-overscan-addon-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/overscan-addon/","maintainer":"eknath-kambagiri","license":["SPDX:GPL-3.0-or-later"],"tags":["Render"]},{"id":"sidebar_tab_search","schema_version":"1.0.0","name":"Sidebar Tab Search","version":"2.0.0","tagline":"Quick search and switch between Sidebar (N-Panel) tabs","archive_hash":"sha256:dd58ff4da0468f9084a2b77295d57413e93dd46b999e2a64770d11df2a3c8f32","archive_size":24561,"archive_url":"https://extensions.blender.org/download/sha256:dd58ff4da0468f9084a2b77295d57413e93dd46b999e2a64770d11df2a3c8f32/add-on-sidebar-tab-search-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sidebar-tab-search/","maintainer":"McKaa","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","User Interface"]},{"id":"gizmo_resizer","schema_version":"1.0.0","name":"Gizmo Resizer","version":"2.3.0","tagline":"Resize viewport Gizmo with Numpad keys","archive_hash":"sha256:cbbda09ab73548d968c137beea34fe7bcf34d60ba1f2da6d1fda5f592c2faafe","archive_size":15888,"archive_url":"https://extensions.blender.org/download/sha256:cbbda09ab73548d968c137beea34fe7bcf34d60ba1f2da6d1fda5f592c2faafe/add-on-gizmo-resizer-v2.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/gizmo-resizer/","maintainer":"CorentinBileau","license":["SPDX:GPL-3.0-or-later"]},{"id":"Mask_To_Vertex_Color_Pro","schema_version":"1.0.0","name":"MaskToVertexColorPro","version":"2.0.4","tagline":"Mask To VertexColor Pro Tools","archive_hash":"sha256:79eec742a3c6c6d91028f556dec034e26613e44bf3f612dc7ef3579a3a23460a","archive_size":30127,"archive_url":"https://extensions.blender.org/download/sha256:79eec742a3c6c6d91028f556dec034e26613e44bf3f612dc7ef3579a3a23460a/add-on-mask-to-vertex-color-pro-v2.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mask-to-vertex-color-pro/","maintainer":"墨泪MoLei_VFX","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import images are required as masks"},"tags":["Paint","Material"]},{"id":"b_guides","schema_version":"1.0.0","name":"B Guides","version":"1.0.1","tagline":"composition with guides and rulers for the VSE and 3D Viewport","archive_hash":"sha256:d6ca584e4e52414643f5da441ec87ccde6177e522a4bbce281f9861b67825f57","archive_size":24706,"archive_url":"https://extensions.blender.org/download/sha256:d6ca584e4e52414643f5da441ec87ccde6177e522a4bbce281f9861b67825f57/add-on-b-guides-v1.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/b-guides/","maintainer":"Dinesh007","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Camera","Sequencer"]},{"id":"selection_mode_cycler","schema_version":"1.0.0","name":"Selection Mode Cycler","version":"1.1.0","tagline":"Cycles through mesh selection modes in Edit Mode","archive_hash":"sha256:80a605bad154cec84404fa1f3a5b9db50846912d98fe07b5d790a03843d4ba12","archive_size":1414,"archive_url":"https://extensions.blender.org/download/sha256:80a605bad154cec84404fa1f3a5b9db50846912d98fe07b5d790a03843d4ba12/add-on-selection-mode-cycler-v1.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/selection-mode-cycler/","maintainer":"Lise-2","license":["SPDX:GPL-3.0-or-later"]},{"id":"colornova","schema_version":"1.0.0","name":"COLOR-NOVA // SPECTRAL UV | M-87","version":"1.0.1","tagline":"Essential UV contrast. Absolute clarity for professional focus","archive_hash":"sha256:576cbbbabfcee8185c036eecd82778dacc608cf8ca104a7982374b27300662bc","archive_size":6257,"archive_url":"https://extensions.blender.org/download/sha256:576cbbbabfcee8185c036eecd82778dacc608cf8ca104a7982374b27300662bc/theme-colornova-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/colornova/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By","High Contrast","Colorful"]},{"id":"select_similar_geometry","schema_version":"1.0.0","name":"Select Similar Geometry","version":"1.3.0","tagline":"Select objects by percentage of matching vertices","archive_hash":"sha256:549558b40ebcb9135cc6634abaedb5e7fffb8cd901fbc209543e484c79e05d21","archive_size":397646,"archive_url":"https://extensions.blender.org/download/sha256:549558b40ebcb9135cc6634abaedb5e7fffb8cd901fbc209543e484c79e05d21/add-on-select-similar-geometry-v1.3.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/select-similar-geometry/","maintainer":"JuanRomero","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh"]},{"id":"matgeo","schema_version":"1.0.0","name":"MatGeo","version":"1.0.0","tagline":"Convert Materials to Geometry Nodes","archive_hash":"sha256:8c636cfb2e778681acb09b8222e94284a2a90f5735a4344ab7f6cc3bb6272556","archive_size":9103,"archive_url":"https://extensions.blender.org/download/sha256:8c636cfb2e778681acb09b8222e94284a2a90f5735a4344ab7f6cc3bb6272556/add-on-matgeo-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/matgeo/","maintainer":"JR3DFUL","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","Geometry Nodes","Node"]},{"id":"Cross_Select","schema_version":"1.0.0","name":"Cross Select","version":"1.0.9","tagline":"Select scene objects similar like RHINO or CAD","archive_hash":"sha256:ccbb3398ed55e2eca34b16af8e2d6a449b01711f2f912960a62a708b9fd70f9d","archive_size":71100,"archive_url":"https://extensions.blender.org/download/sha256:ccbb3398ed55e2eca34b16af8e2d6a449b01711f2f912960a62a708b9fd70f9d/add-on-cross-select-v1.0.9.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cross-select/","maintainer":"RARA","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","3D View","Scene","Node"]},{"id":"Dark_3d","schema_version":"1.0.0","name":"Dark 3d","version":"1.0.0","tagline":"Shaded Buttons","archive_hash":"sha256:85287c4f042cee529776e3307774d0c0084b76b6d1026a3eb4a526119cbe64ad","archive_size":6664,"archive_url":"https://extensions.blender.org/download/sha256:85287c4f042cee529776e3307774d0c0084b76b6d1026a3eb4a526119cbe64ad/theme-dark-3d-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/dark-3d/","maintainer":"SammyTheBest","license":["SPDX:GPL-3.0-or-later"]},{"id":"bone_math","schema_version":"1.0.0","name":"Bone Math","version":"0.1.0","tagline":"Calculate pole angles, plus other bone related math","archive_hash":"sha256:bffa46d552cc35629cededdab661852c6cfaf195224693423343d36233f9be3c","archive_size":4795,"archive_url":"https://extensions.blender.org/download/sha256:bffa46d552cc35629cededdab661852c6cfaf195224693423343d36233f9be3c/add-on-bone-math-v0.1.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/bone-math/","maintainer":"Xury46","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"surface_diagnostics","schema_version":"1.0.0","name":"Surface Diagnostics","version":"1.4.3","tagline":"Set of tools for diagnosing surface quality","archive_hash":"sha256:962fd2c89467104fae0bf139c1118e079fa7ff65ae8fbf692c741e2ef6c0d103","archive_size":1241115,"archive_url":"https://extensions.blender.org/download/sha256:962fd2c89467104fae0bf139c1118e079fa7ff65ae8fbf692c741e2ef6c0d103/add-on-surface-diagnostics-v1.4.3.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/surface-diagnostics/","maintainer":"JLBöhm","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","3D View","Geometry Nodes"]},{"id":"savepoints","schema_version":"1.0.0","name":"SavePoints","version":"1.5.2","tagline":"Visual version control, easy restore, and automatic timelapse","archive_hash":"sha256:a3299c0dde53838e75fd7f4c75750f4cfc579203ea0382fcc55484f37f9d9cab","archive_size":100533,"archive_url":"https://extensions.blender.org/download/sha256:a3299c0dde53838e75fd7f4c75750f4cfc579203ea0382fcc55484f37f9d9cab/add-on-savepoints-v1.5.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/savepoints/","maintainer":"unclepomedev","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Create version history and move deleted versions to trash"},"tags":["System","Pipeline","Render"]},{"id":"sprite_sheet_maker","schema_version":"1.0.0","name":"Sprite Sheet Maker","version":"5.1.3","tagline":"3D to 2D sprite sheet converter with optional pixelation","archive_hash":"sha256:1ebd51e6eaa59edb3736f8090624a57edbb06650ec8efbba70a9472e9d1ba331","archive_size":7189069,"archive_url":"https://extensions.blender.org/download/sha256:1ebd51e6eaa59edb3736f8090624a57edbb06650ec8efbba70a9472e9d1ba331/add-on-sprite-sheet-maker-v5.1.3-windows-x64.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/sprite-sheet-maker/","maintainer":"manas-R.-Makde","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Animation","Render"]},{"id":"kanagawa","schema_version":"1.0.0","name":"Kanagawa","version":"1.0.1","tagline":"kanagawa.nvim for Blender","archive_hash":"sha256:6ed495278dc7aa6b6de08cf43f8407fb6afc06eef1d3c6f093413d156e01f22d","archive_size":6190,"archive_url":"https://extensions.blender.org/download/sha256:6ed495278dc7aa6b6de08cf43f8407fb6afc06eef1d3c6f093413d156e01f22d/theme-kanagawa-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/kanagawa/","maintainer":"timberlinefpv","license":["SPDX:GPL-3.0-or-later"]},{"id":"rendercue","schema_version":"1.0.0","name":"RenderCue","version":"1.1.3","tagline":"Sequence. Queue. Render","archive_hash":"sha256:97fbabec32217c2438adda789ab6ef8a5beac6b90ac06fae3def010b47d2ba2b","archive_size":52378,"archive_url":"https://extensions.blender.org/download/sha256:97fbabec32217c2438adda789ab6ef8a5beac6b90ac06fae3def010b47d2ba2b/add-on-rendercue-v1.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/rendercue/","maintainer":"UsamaSQ","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save renders to user-defined directories","network":"Send render notifications via Webhooks"},"tags":["Render","Pipeline"]},{"id":"io_scene_owm","schema_version":"1.0.0","name":"OWM Import","version":"3.3.0","tagline":"Import files from the Overwatch extraction tools (DataTool)","archive_hash":"sha256:13c5cbe0fe6110056e3a09fa38ff3cf7d3b7b684367b6b96b43cf20f4be6fe44","archive_size":279606,"archive_url":"https://extensions.blender.org/download/sha256:13c5cbe0fe6110056e3a09fa38ff3cf7d3b7b684367b6b96b43cf20f4be6fe44/add-on-io-scene-owm-v3.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-scene-owm/","maintainer":"overtools","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Importing files from disk"},"tags":["Import-Export"]},{"id":"windows_xp_theme","schema_version":"1.0.0","name":"Windows XP","version":"1.0.2","tagline":"A light theme directly inspired by Windows XP","archive_hash":"sha256:181d42a7984e1399b99e221dfe3a90669d4733833768b98876fd2eafc4586bc4","archive_size":6815,"archive_url":"https://extensions.blender.org/download/sha256:181d42a7984e1399b99e221dfe3a90669d4733833768b98876fd2eafc4586bc4/theme-windows-xp-theme-v1.0.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/windows-xp-theme/","maintainer":"Alkalide","license":["SPDX:GPL-3.0-or-later"],"tags":["Light","Colorful","Inspired By"]},{"id":"ZZZ","schema_version":"1.0.0","name":"ZZZ Theme","version":"1.0.1","tagline":"High-contrast dark theme with Zenless Zone Zero's signature","archive_hash":"sha256:c8dabb06a7b621ccd164b2de14001434b7fe9db60528059c65124a879371d29f","archive_size":5472,"archive_url":"https://extensions.blender.org/download/sha256:c8dabb06a7b621ccd164b2de14001434b7fe9db60528059c65124a879371d29f/theme-zzz-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/zzz/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By","High Contrast"]},{"id":"Cyberpunk2077","schema_version":"1.0.0","name":"Cyberpunk 2077","version":"1.2.2","tagline":"A Cyberpunk 2077 theme for Blender","archive_hash":"sha256:ef1b9805013640d1b463f162ff694e152b05a5e6c715154af6b22593d64009ef","archive_size":5852,"archive_url":"https://extensions.blender.org/download/sha256:ef1b9805013640d1b463f162ff694e152b05a5e6c715154af6b22593d64009ef/theme-cyberpunk2077-v1.2.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/cyberpunk2077/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"mintLavender","schema_version":"1.0.0","name":"Mint Lavender Chill","version":"1.0.3","tagline":"A Mint lavender theme for Blender with Lo-fi aesthetics","archive_hash":"sha256:ef19c6ebaa1e1aaaeb81956ecbe44bc70fcaaaa86c33df6f72f0a3e1954970e5","archive_size":5321,"archive_url":"https://extensions.blender.org/download/sha256:ef19c6ebaa1e1aaaeb81956ecbe44bc70fcaaaa86c33df6f72f0a3e1954970e5/theme-mintlavender-v1.0.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/mintlavender/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"sleek_navy","schema_version":"1.0.0","name":"Sleek Navy","version":"1.0.0","tagline":"A clean dark-blue Blender theme","archive_hash":"sha256:d285940ff5d39d4f6a08ac6ce575fbb4c37448322def695c85863b9d272d7420","archive_size":5546,"archive_url":"https://extensions.blender.org/download/sha256:d285940ff5d39d4f6a08ac6ce575fbb4c37448322def695c85863b9d272d7420/theme-sleek-navy-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/sleek-navy/","maintainer":"Martel6ix","license":["SPDX:MIT"]},{"id":"multirow","schema_version":"1.0.0","name":"Multirow","version":"1.0.1","tagline":"Text strips with line break","archive_hash":"sha256:c619e40e99055c804c1033d48d851f0415b75ad22a03b1a1922c8c93159317f1","archive_size":4445,"archive_url":"https://extensions.blender.org/download/sha256:c619e40e99055c804c1033d48d851f0415b75ad22a03b1a1922c8c93159317f1/add-on-multirow-v1.0.1.zip","type":"add-on","blender_version_min":"4.4.3","website":"https://extensions.blender.org/add-ons/multirow/","maintainer":"flakmoppen","license":["SPDX:GPL-3.0-or-later"],"tags":["Sequencer","Text Editor","User Interface"]},{"id":"viewport_camera_positions","schema_version":"1.0.0","name":"Lutaya Viewport Camera","version":"1.0.1","tagline":"Save and switch between camera positions with orthographic views","archive_hash":"sha256:ede7461b4a2d43a0f6f97d17c5d27ef056bc55901608d83dcb46f6c0c832f71b","archive_size":4336,"archive_url":"https://extensions.blender.org/download/sha256:ede7461b4a2d43a0f6f97d17c5d27ef056bc55901608d83dcb46f6c0c832f71b/add-on-viewport-camera-positions-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/viewport-camera-positions/","maintainer":"3D_SHVYREV","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save and load camera position configurations"},"tags":["3D View","Camera"]},{"id":"sequence_loader","schema_version":"1.0.0","name":"Sequence Loader","version":"0.4.0","tagline":"Just-in-time loader for meshio-supported mesh file sequences","archive_hash":"sha256:20c6e8c30cd2c2aa4be1c56817a32562680841c20df0b7a6cff103d543f566ff","archive_size":629459,"archive_url":"https://extensions.blender.org/download/sha256:20c6e8c30cd2c2aa4be1c56817a32562680841c20df0b7a6cff103d543f566ff/add-on-sequence-loader-v0.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sequence-loader/","maintainer":"Stefan-Jeske","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Core functionality to load files from disk"},"tags":["Import-Export"]},{"id":"Studio_Dark","schema_version":"1.0.0","name":"Studio Dark","version":"2.3.2","tagline":"Consistent UI, sharp colors, comfortable contrast, 3 birght lvls","archive_hash":"sha256:ac9e87297142f750595aab5f192ff870a734b15fc46dd80b25e754e28f2f2eb9","archive_size":5455,"archive_url":"https://extensions.blender.org/download/sha256:ac9e87297142f750595aab5f192ff870a734b15fc46dd80b25e754e28f2f2eb9/theme-studio-dark-v2.3.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/studio-dark/","maintainer":"3DDinosaur","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"khellstr_light","schema_version":"1.0.0","name":"khellstr light theme","version":"1.0.1","tagline":"Balanced Light Theme for Blender","archive_hash":"sha256:fd1b0e695748382dee2b796e33a2996b98e1573bcd67803e501538158730aefc","archive_size":6567,"archive_url":"https://extensions.blender.org/download/sha256:fd1b0e695748382dee2b796e33a2996b98e1573bcd67803e501538158730aefc/theme-khellstr-light-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/khellstr-light/","maintainer":"khellstr","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"automata_theme","schema_version":"1.0.0","name":"Automata","version":"2.0.0","tagline":"NieR inspired theme","archive_hash":"sha256:7999157fafef87293070f20c98d798e754bf156147cdc753687ffba29bb7a198","archive_size":5950,"archive_url":"https://extensions.blender.org/download/sha256:7999157fafef87293070f20c98d798e754bf156147cdc753687ffba29bb7a198/theme-automata-theme-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/automata-theme/","maintainer":"NSA-Cloud","license":["SPDX:GPL-3.0-or-later"]},{"id":"ani_offset","schema_version":"1.0.0","name":"Ani Offset","version":"3.2.2","tagline":"Propagate pose offsets across selected keyframes","archive_hash":"sha256:6bf4ed70b657094558e0f01616facd761d74d8e7d97b03a55e42cbeec3db3154","archive_size":3526,"archive_url":"https://extensions.blender.org/download/sha256:6bf4ed70b657094558e0f01616facd761d74d8e7d97b03a55e42cbeec3db3154/add-on-ani-offset-v3.2.2.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/ani-offset/","maintainer":"Drika111","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"asset_optimizer","schema_version":"1.0.0","name":"Game Asset Optimizer","version":"1.0.2","tagline":"Optimize 3D models for Unity and Unreal Engine workflows","archive_hash":"sha256:909b4c1e85e93f5c4aefbdd519d14e05a6435dbd5361301373c84c64c3f7fc2b","archive_size":19580,"archive_url":"https://extensions.blender.org/download/sha256:909b4c1e85e93f5c4aefbdd519d14e05a6435dbd5361301373c84c64c3f7fc2b/add-on-asset-optimizer-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/asset-optimizer/","maintainer":"Sudip-Soni","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export optimized assets for Unity and Unreal Engine"},"tags":["Modeling","Mesh","Pipeline"]},{"id":"k_tools_texture_map_loader","schema_version":"1.0.0","name":"K-Tools: Texture Map Loader","version":"1.5.0","tagline":" An easy way to load Texture Sets in your Shader Material","archive_hash":"sha256:397237f886853b05fb9da2dba1f3f03cd65c172f3b74da9ae227f8584feaca8f","archive_size":1112095,"archive_url":"https://extensions.blender.org/download/sha256:397237f886853b05fb9da2dba1f3f03cd65c172f3b74da9ae227f8584feaca8f/add-on-k-tools-texture-map-loader-v1.5.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/k-tools-texture-map-loader/","maintainer":"Robert-Kezives","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load Node Groups from disk"},"tags":["Material"]},{"id":"turntable_camera","schema_version":"1.0.0","name":"Turntable Camera","version":"0.1.2","tagline":"Camera Turntable Setup","archive_hash":"sha256:fa20577f3c12d4b6dd05802b7aacf3dd8d433753fc19b3bb8da3adb23ac2b3c5","archive_size":17413,"archive_url":"https://extensions.blender.org/download/sha256:fa20577f3c12d4b6dd05802b7aacf3dd8d433753fc19b3bb8da3adb23ac2b3c5/add-on-turntable-camera-v0.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/turntable-camera/","maintainer":"The_Missing_Field","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"copy_paste_nodes","schema_version":"1.0.0","name":"Copy/Paste Nodes","version":"0.1.6","tagline":"Copy nodes to and from the system clipboard as JSON","archive_hash":"sha256:3c09cea629616ed5c8ad8b4944a5c23eb4a9043931070bdff18ea19d630f5975","archive_size":10745,"archive_url":"https://extensions.blender.org/download/sha256:3c09cea629616ed5c8ad8b4944a5c23eb4a9043931070bdff18ea19d630f5975/add-on-copy-paste-nodes-v0.1.6.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/copy-paste-nodes/","maintainer":"david494","license":["SPDX:GPL-3.0-or-later"],"permissions":{"clipboard":"Copy and paste nodes to the clipboard"},"tags":["Node"]},{"id":"mixamo_rig","schema_version":"1.0.0","name":"Mixamo Rig","version":"1.2.1","tagline":"Generate a control rig from Mixamo Fbx skeleton","archive_hash":"sha256:bfdc0fdae59253e1022f2f82689f2caaeab8765081937ad73fc6e960fe5e0fe0","archive_size":178040,"archive_url":"https://extensions.blender.org/download/sha256:bfdc0fdae59253e1022f2f82689f2caaeab8765081937ad73fc6e960fe5e0fe0/add-on-mixamo-rig-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.5.999","website":"https://extensions.blender.org/add-ons/mixamo-rig/","maintainer":"tyler.tofu","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Rigging"]},{"id":"img2mat_pro","schema_version":"1.0.0","name":"img2mat_pro","version":"1.10.0","tagline":"Extract color materials and paint palettes from images","archive_hash":"sha256:63cc939853b7d1657b88026f815565e374ed7c8662bbe03c2359be744e855990","archive_size":9875,"archive_url":"https://extensions.blender.org/download/sha256:63cc939853b7d1657b88026f815565e374ed7c8662bbe03c2359be744e855990/add-on-img2mat-pro-v1.10.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/img2mat-pro/","maintainer":"stevewarner","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","User Interface","Pipeline"]},{"id":"anim_reviewer","schema_version":"1.0.0","name":"Anim Reviewer","version":"1.0.3","tagline":"Enhance blender playblast capabilities for animation review","archive_hash":"sha256:09d01a3117cb094810485651788cf5801690a565ce4b30fb2754f472919be5b5","archive_size":1335044,"archive_url":"https://extensions.blender.org/download/sha256:09d01a3117cb094810485651788cf5801690a565ce4b30fb2754f472919be5b5/add-on-anim-reviewer-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/anim-reviewer/","maintainer":"FhyTan","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save playblast videos in specified output folder"},"tags":["3D View","Animation","Camera","Pipeline"]},{"id":"export_render_as_dng","schema_version":"1.0.0","name":"Export Render as DNG","version":"1.0.2","tagline":"Export renders and images as Bayer-style DNG files","archive_hash":"sha256:f856182d2c346ade4c2a86e4969f7f3d4851c9c75c653ae97edb797d9e71df85","archive_size":25960,"archive_url":"https://extensions.blender.org/download/sha256:f856182d2c346ade4c2a86e4969f7f3d4851c9c75c653ae97edb797d9e71df85/add-on-export-render-as-dng-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/export-render-as-dng/","maintainer":"FloBEAUG","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export DNG to disk"}},{"id":"Origin_move_like_maya","schema_version":"1.0.0","name":"Origin_move_like_maya (Press D)","version":"1.4.0","tagline":"Move pivot independently with snapping and gizmo like maya","archive_hash":"sha256:5e718aa81233aba65fd1aa186cb1588d551da1b21509fa373d75f11e29c17534","archive_size":3563,"archive_url":"https://extensions.blender.org/download/sha256:5e718aa81233aba65fd1aa186cb1588d551da1b21509fa373d75f11e29c17534/add-on-origin-move-like-maya-v1.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/origin-move-like-maya/","maintainer":"deepak756","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Modeling","Mesh"]},{"id":"printing_helper","schema_version":"1.0.0","name":"Printing Helper","version":"0.1.2","tagline":"Set the resolution required for printing more simply","archive_hash":"sha256:3c3a5ea8c40c1cf91c3102b5c7d690ef8ae38a6a562daf4f2200574c2faabeae","archive_size":12655,"archive_url":"https://extensions.blender.org/download/sha256:3c3a5ea8c40c1cf91c3102b5c7d690ef8ae38a6a562daf4f2200574c2faabeae/add-on-printing-helper-v0.1.2.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/printing-helper/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"tags":["Render","Camera"]},{"id":"bh_smart_sym","schema_version":"1.0.0","name":"BH Smart Sym","version":"0.9.0","tagline":"Interactive 3D arrows for quick face symmetrize","archive_hash":"sha256:ce7b895d47814b9d85ac9401d04fbd7172df8236fcf2b0313549b8c419e36c34","archive_size":5272,"archive_url":"https://extensions.blender.org/download/sha256:ce7b895d47814b9d85ac9401d04fbd7172df8236fcf2b0313549b8c419e36c34/add-on-bh-smart-sym-v0.9.0.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/bh-smart-sym/","maintainer":"bogatyr4ik","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh"]},{"id":"theme_GoldExperience","schema_version":"1.0.0","name":"Gold Experience","version":"1.0.1","tagline":"A theme if you really like yellow","archive_hash":"sha256:db35f8251ffa5d13b313a05f3032c11a991e2a1dfc786b8765db7351d2e54cdb","archive_size":5811,"archive_url":"https://extensions.blender.org/download/sha256:db35f8251ffa5d13b313a05f3032c11a991e2a1dfc786b8765db7351d2e54cdb/theme-theme-goldexperience-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-goldexperience/","maintainer":"lonku","license":["SPDX:GPL-2.0-or-later"],"tags":["Light","Colorful","Inspired By"]},{"id":"catppucin4blender","schema_version":"1.0.0","name":"Catppuccin Theme","version":"5.1.5","tagline":"Catppuccin for Blender","archive_hash":"sha256:07cfa54f72bd154b178e98d4dd49a722de9f35fe2c1104aa214c61116226a875","archive_size":7103,"archive_url":"https://extensions.blender.org/download/sha256:07cfa54f72bd154b178e98d4dd49a722de9f35fe2c1104aa214c61116226a875/theme-catppucin4blender-v5.1.5.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/catppucin4blender/","maintainer":"Albert-Bici","license":["SPDX:GPL-3.0-or-later"],"tags":["Inspired By","Dark","Colorful"]},{"id":"camerafly","schema_version":"1.0.0","name":"Camerafly","version":"2.1.4","tagline":"Fly around with the Dolly Rig of the Camera Rigs Addon","archive_hash":"sha256:f4557b9a94427680ca9642e734b0b41b428c9b7575f114b31a751fbe6710affe","archive_size":22817,"archive_url":"https://extensions.blender.org/download/sha256:f4557b9a94427680ca9642e734b0b41b428c9b7575f114b31a751fbe6710affe/add-on-camerafly-v2.1.4-windows-x64-windows-arm64-macos-arm64-macos-x64-linux-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/camerafly/","maintainer":"MichaelSchieber","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64","windows-arm64","macos-arm64","macos-x64","linux-x64"],"tags":["Camera"]},{"id":"face_angle_analyzer","schema_version":"1.0.0","name":"Face Angle Analyzer","version":"8.9.4","tagline":"Measure and visualize face angles against global axes","archive_hash":"sha256:1baab0b6e6ccf88eae5596845af184a14c4fdaac57d192e1be37163aea553bb0","archive_size":6292,"archive_url":"https://extensions.blender.org/download/sha256:1baab0b6e6ccf88eae5596845af184a14c4fdaac57d192e1be37163aea553bb0/add-on-face-angle-analyzer-v8.9.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/face-angle-analyzer/","maintainer":"Astralis","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface","3D View"]},{"id":"rigi_all","schema_version":"1.0.0","name":"Rigi-All","version":"1.6.0","tagline":"Speeds up the Rigify process","archive_hash":"sha256:f8cc4ee95bbb5e9d028459e6f381e7f1255708c5d38b490cf9e754e5f269ecbd","archive_size":154196,"archive_url":"https://extensions.blender.org/download/sha256:f8cc4ee95bbb5e9d028459e6f381e7f1255708c5d38b490cf9e754e5f269ecbd/add-on-rigi-all-v1.6.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/rigi-all/","maintainer":"hisanimations","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"Quick_Asset_Saver","schema_version":"1.0.0","name":"Quick Asset Manager","version":"2.0.3","tagline":"Quickly Create, Edit, Organize, or Delete your local asset files","archive_hash":"sha256:34196edd29b75d18cca2c3cd001fa751781314ee608d025ef702669cee0b5973","archive_size":66307,"archive_url":"https://extensions.blender.org/download/sha256:34196edd29b75d18cca2c3cd001fa751781314ee608d025ef702669cee0b5973/add-on-quick-asset-saver-v2.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-asset-saver/","maintainer":"Clonephaze","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"To read and write to asset library directories"},"tags":["User Interface","System"]},{"id":"bone_widget","schema_version":"1.0.0","name":"Bone Widget","version":"2.3.3","tagline":"Easily Create Bone Widgets","archive_hash":"sha256:782bc123b494fd568b4400735d59d279e23610c4d57a33b3052ceed893726970","archive_size":293994,"archive_url":"https://extensions.blender.org/download/sha256:782bc123b494fd568b4400735d59d279e23610c4d57a33b3052ceed893726970/add-on-bone-widget-v2.3.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bone-widget/","maintainer":"WayneDixon","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export json and image files from/to disk"},"tags":["Rigging"]},{"id":"toothpaste","schema_version":"1.0.0","name":"ToothPaste (Paste SVGs)","version":"1.1.5","tagline":"Paste SVG from Clipboard as Grease Pencil or Curves","archive_hash":"sha256:ab122c6b6be19062da353b25e8339b847ee12d0c88ed8f39fb5463f52d9e2292","archive_size":122169,"archive_url":"https://extensions.blender.org/download/sha256:ab122c6b6be19062da353b25e8339b847ee12d0c88ed8f39fb5463f52d9e2292/add-on-toothpaste-v1.1.5.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/toothpaste/","maintainer":"Todor-Hlebarov","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import SVG assets and temporary files for text and image support","clipboard":"Paste SVG data from Clipboard"},"tags":["Grease Pencil","Import-Export"]},{"id":"Bone_Animation_Copy_Tool","schema_version":"1.0.0","name":"Bone Animation Copy Tool","version":"1.1.5","tagline":"Copy animation between armatures using bone constraints","archive_hash":"sha256:88a3155787f7257b4d696d7b84b8a64b68e8ac9f456c4bce79edd129b055a5f2","archive_size":9772,"archive_url":"https://extensions.blender.org/download/sha256:88a3155787f7257b4d696d7b84b8a64b68e8ac9f456c4bce79edd129b055a5f2/add-on-bone-animation-copy-tool-v1.1.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bone-animation-copy-tool/","maintainer":"maylog","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"orbiter","schema_version":"1.0.0","name":"Orbiter","version":"1.1.0","tagline":"Orbit around objects in the viewport","archive_hash":"sha256:a50f42981a2273110cb9af1a508b0573f4e08b21f67bb76c5d91ec6ad4af680a","archive_size":3393,"archive_url":"https://extensions.blender.org/download/sha256:a50f42981a2273110cb9af1a508b0573f4e08b21f67bb76c5d91ec6ad4af680a/add-on-orbiter-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/orbiter/","maintainer":"TFMSTYLE","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"spline_generator","schema_version":"1.0.0","name":"Spline Generator","version":"1.0.3","tagline":"Generate parametric spline","archive_hash":"sha256:129cc2a92f5d127bd8d1c15f9766183a1fa25aaa69eda144ef27f47b50315145","archive_size":8307,"archive_url":"https://extensions.blender.org/download/sha256:129cc2a92f5d127bd8d1c15f9766183a1fa25aaa69eda144ef27f47b50315145/add-on-spline-generator-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/spline-generator/","maintainer":"TFMSTYLE","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Add Curve"]},{"id":"beautiful_dream","schema_version":"1.0.0","name":"Beautiful Dream","version":"1.0.4","tagline":"This is a variant of Whispering Ripples","archive_hash":"sha256:b031691f25fe0d394c43a6837bdaaa91868986486dd863d5ea7ddfd178f4fa96","archive_size":5810,"archive_url":"https://extensions.blender.org/download/sha256:b031691f25fe0d394c43a6837bdaaa91868986486dd863d5ea7ddfd178f4fa96/theme-beautiful-dream-v1.0.4.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/beautiful-dream/","maintainer":"KBS-DEV","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"graph_generator","schema_version":"1.0.0","name":"Graph Generator","version":"1.2.2","tagline":"Generate graph between saved keyframes","archive_hash":"sha256:6f8a49aa275a16a70cd75db50d1bbecdc4dc4f0b9d6fd3173a10e7b8967cafe4","archive_size":9526,"archive_url":"https://extensions.blender.org/download/sha256:6f8a49aa275a16a70cd75db50d1bbecdc4dc4f0b9d6fd3173a10e7b8967cafe4/add-on-graph-generator-v1.2.2.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/graph-generator/","maintainer":"TFMSTYLE","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"wisteria","schema_version":"1.0.0","name":"Wisteria","version":"1.0.1","tagline":"Gray with hints of purple","archive_hash":"sha256:d551b27cc0ee87125c02ecc9f22243bf0db7f8f7ffb64a70cca982ecc182a915","archive_size":5690,"archive_url":"https://extensions.blender.org/download/sha256:d551b27cc0ee87125c02ecc9f22243bf0db7f8f7ffb64a70cca982ecc182a915/theme-wisteria-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/wisteria/","maintainer":"cmzw","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"trajectory_anim","schema_version":"1.0.0","name":"Trajectory Anim","version":"1.2.1","tagline":"Animate quickly by drawing trajectory line","archive_hash":"sha256:3185af4b475175a5cddef7f87745943bd3a7224daba5d4416425476a5245bc9d","archive_size":43987,"archive_url":"https://extensions.blender.org/download/sha256:3185af4b475175a5cddef7f87745943bd3a7224daba5d4416425476a5245bc9d/add-on-trajectory-anim-v1.2.1.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/trajectory-anim/","maintainer":"trisnox","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"Analysis_Toolkit","schema_version":"1.0.0","name":"Analysis Toolkit","version":"1.0.1","tagline":"Measurement calculations, illuminance, distance, speed, and more","archive_hash":"sha256:524de12e2a1cb0de369560e7e83aa2a47d45e2ccefdd628d941ebcd23d363823","archive_size":25910,"archive_url":"https://extensions.blender.org/download/sha256:524de12e2a1cb0de369560e7e83aa2a47d45e2ccefdd628d941ebcd23d363823/add-on-analysis-toolkit-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/analysis-toolkit/","maintainer":"K_Naoki","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Camera","Lighting"]},{"id":"ns_toolkit_mesh_cleanup_pro","schema_version":"1.0.0","name":"NS Toolkit - Mesh Cleanup Pro","version":"1.0.1","tagline":"Professional mesh cleanup with topology visualization tools","archive_hash":"sha256:0d7fa13aae7b308929ffd16d4bfc84a9a8dce03fecfd7df152f4ee434646792e","archive_size":9410,"archive_url":"https://extensions.blender.org/download/sha256:0d7fa13aae7b308929ffd16d4bfc84a9a8dce03fecfd7df152f4ee434646792e/add-on-ns-toolkit-mesh-cleanup-pro-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ns-toolkit-mesh-cleanup-pro/","maintainer":"nandur","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"OLED","schema_version":"1.0.0","name":"OLED","version":"1.0.0","tagline":"OLED theme for Blender","archive_hash":"sha256:11f8ca2e68d692cbfef511ce3b84d94dacb60e72c3253e15f010f479f2469eee","archive_size":5707,"archive_url":"https://extensions.blender.org/download/sha256:11f8ca2e68d692cbfef511ce3b84d94dacb60e72c3253e15f010f479f2469eee/theme-oled-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/oled/","maintainer":"NARZ","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","High Contrast"]},{"id":"CYNexusLX490","schema_version":"1.0.0","name":"CyanoNexus LX490","version":"1.0.1","tagline":"Stellar-grade Blender theme – tri-spectrum of CyanoNexus LX490","archive_hash":"sha256:8ea816a51657ede592156a97f26568ca0edcf6a1466e57d23947e0d1146899f9","archive_size":6218,"archive_url":"https://extensions.blender.org/download/sha256:8ea816a51657ede592156a97f26568ca0edcf6a1466e57d23947e0d1146899f9/theme-cynexuslx490-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/cynexuslx490/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","High Contrast"]},{"id":"editorbar","schema_version":"1.0.0","name":"EditorBar","version":"0.4.7","tagline":"Turn Outliner & Properties editors into a toggleable sidebar","archive_hash":"sha256:2ad15ef0f635c03095176b6f64eb24604fe20d2878e41f35612b05ee3b77a08a","archive_size":24251,"archive_url":"https://extensions.blender.org/download/sha256:2ad15ef0f635c03095176b6f64eb24604fe20d2878e41f35612b05ee3b77a08a/add-on-editorbar-v0.4.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/editorbar/","maintainer":"atetraxx","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"manage_file_paths","schema_version":"1.0.0","name":"Manage File Paths","version":"1.0.1","tagline":"A list of image file paths with indicators for missing files","archive_hash":"sha256:934b305fd815c3d3d82f26dbc1bf4a72fa5680df3941e261b42f6e5fe1f38906","archive_size":3273,"archive_url":"https://extensions.blender.org/download/sha256:934b305fd815c3d3d82f26dbc1bf4a72fa5680df3941e261b42f6e5fe1f38906/add-on-manage-file-paths-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/manage-file-paths/","maintainer":"GregZaal","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Check if image files exist on disk"},"tags":["Material","System"]},{"id":"import_meshed_alpha","schema_version":"1.0.0","name":"Import Meshed Alpha","version":"1.0.2","tagline":"Transparency to Geometry","archive_hash":"sha256:e04d8dd1855ec6a1b081b37032241f6ef3519f11ff683e3e837e4b95e88e9924","archive_size":1809862,"archive_url":"https://extensions.blender.org/download/sha256:e04d8dd1855ec6a1b081b37032241f6ef3519f11ff683e3e837e4b95e88e9924/add-on-import-meshed-alpha-v1.0.2-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/import-meshed-alpha/","maintainer":"The_Missing_Field","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Image import"},"platforms":["windows-x64"],"tags":["Mesh","Material"]},{"id":"matcolex","schema_version":"1.0.0","name":"MatColeX","version":"1.7.8","tagline":"Collect, Organize, and Apply Shaders from Your 3D View","archive_hash":"sha256:6b742fd6b14bd16df4a9ff182d73d83b07a2fa6e34780e968114d867d2acb6d5","archive_size":9589,"archive_url":"https://extensions.blender.org/download/sha256:6b742fd6b14bd16df4a9ff182d73d83b07a2fa6e34780e968114d867d2acb6d5/add-on-matcolex-v1.7.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/matcolex/","maintainer":"budijozz","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","3D View","Modeling"]},{"id":"wfc_3d_generator","schema_version":"1.0.0","name":"WFC 3D Generator","version":"1.3.9","tagline":"Simple WFC 3D generator for procedural creation of objects","archive_hash":"sha256:f71d446d70b5d88c030ec4182f9863f2c5373b516f1f362fa44dec2df17d2530","archive_size":68037,"archive_url":"https://extensions.blender.org/download/sha256:f71d446d70b5d88c030ec4182f9863f2c5373b516f1f362fa44dec2df17d2530/add-on-wfc-3d-generator-v1.3.9.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/wfc-3d-generator/","maintainer":"Jonny-B","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export constraints (JSON) from/to disk"},"tags":["Object","Modeling","Render","Game Engine"]},{"id":"blender_dark_aero_theme","schema_version":"1.0.0","name":"Dark Aero","version":"1.0.0","tagline":"This is a Dark Aero Theme for Blender","archive_hash":"sha256:dd91b8fee851865a4e2441bb32cd44003acf85e919f128b477666b3cacbdf8ca","archive_size":7696,"archive_url":"https://extensions.blender.org/download/sha256:dd91b8fee851865a4e2441bb32cd44003acf85e919f128b477666b3cacbdf8ca/theme-blender-dark-aero-theme-v1.0.0.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/blender-dark-aero-theme/","maintainer":"AeroBuoyancy.source","license":["SPDX:GPL-3.0-or-later"]},{"id":"nurbs2mesh","schema_version":"1.0.0","name":"NURBS2Mesh","version":"1.0.3","tagline":"Auto-updating mesh copies from NURBS/Curves","archive_hash":"sha256:6c6d4c2a248679c2f5fbeb3227647baced5bbca6fd23df4e4b8a5b622dd61a35","archive_size":9718,"archive_url":"https://extensions.blender.org/download/sha256:6c6d4c2a248679c2f5fbeb3227647baced5bbca6fd23df4e4b8a5b622dd61a35/add-on-nurbs2mesh-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nurbs2mesh/","maintainer":"Brrainz","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh"]},{"id":"curve_generator","schema_version":"1.0.0","name":"Curve Generator","version":"1.2.1","tagline":"Generate float curves","archive_hash":"sha256:041ae75e03c1d0988b9c4cf0064654b26234b1dca3dbf8f2eea6307aa2b6adac","archive_size":6289,"archive_url":"https://extensions.blender.org/download/sha256:041ae75e03c1d0988b9c4cf0064654b26234b1dca3dbf8f2eea6307aa2b6adac/add-on-curve-generator-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/curve-generator/","maintainer":"TFMSTYLE","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Geometry Nodes","Add Curve"]},{"id":"true_roboanimator","schema_version":"1.0.0","name":"True RoboAnimator","version":"1.0.1","tagline":"Robot motion to wheel RPM with CSV export","archive_hash":"sha256:f7fd9db315107b46866da3bdafc33a5faf41bdf208f02f7a1dc4be162a415606","archive_size":18055,"archive_url":"https://extensions.blender.org/download/sha256:f7fd9db315107b46866da3bdafc33a5faf41bdf208f02f7a1dc4be162a415606/add-on-true-roboanimator-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/true-roboanimator/","maintainer":"danyal-sarfraz","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and write CSV and animation data files"}},{"id":"MaterialHelper","schema_version":"1.0.0","name":"MaterialHelper","version":"1.4.8","tagline":"Make local asset manager your place to create powerful materials","archive_hash":"sha256:e00593caa244175bc415fdfa2dea1236810e0f434ab37c850d751a11fbed8052","archive_size":3926415,"archive_url":"https://extensions.blender.org/download/sha256:e00593caa244175bc415fdfa2dea1236810e0f434ab37c850d751a11fbed8052/add-on-materialhelper-v1.4.8.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/materialhelper/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load preview material file/Access and modify asset catalog file"},"tags":["3D View","Material"]},{"id":"lutiy_timeline","schema_version":"1.0.0","name":"Lutiy Timeline","version":"1.0.1","tagline":"Save and switch between camera frame range","archive_hash":"sha256:7a10d287ecbbb955861d09ae436d12fa9e72f143bef625b1fb0e36dd1748e3bb","archive_size":3790,"archive_url":"https://extensions.blender.org/download/sha256:7a10d287ecbbb955861d09ae436d12fa9e72f143bef625b1fb0e36dd1748e3bb/add-on-lutiy-timeline-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/lutiy-timeline/","maintainer":"3D_SHVYREV","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save and load preset configurations"},"tags":["Animation","Camera","Scene"]},{"id":"py_btn_box","schema_version":"1.0.0","name":"PyBtnBox","version":"5.1.0","tagline":"Use Button To Execute Script","archive_hash":"sha256:064fe1faa509be5bd44f5d0e9b11970e2035508156ba7b2860e8f434c459eeaf","archive_size":14035,"archive_url":"https://extensions.blender.org/download/sha256:064fe1faa509be5bd44f5d0e9b11970e2035508156ba7b2860e8f434c459eeaf/add-on-py-btn-box-v5.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/py-btn-box/","maintainer":"Ou_Chiang","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Need to sync button data from python/json files and folder"},"tags":["System"]},{"id":"mesh_attribute_utils","schema_version":"1.0.0","name":"Mesh Attribute Utils","version":"0.2.0","tagline":"Easily view and edit custom mesh attributes","archive_hash":"sha256:e62f38ee324ba6983ce8963358bc06a9570bca9da8ffa2f38f8f653c23365211","archive_size":8347,"archive_url":"https://extensions.blender.org/download/sha256:e62f38ee324ba6983ce8963358bc06a9570bca9da8ffa2f38f8f653c23365211/add-on-mesh-attribute-utils-v0.2.0.zip","type":"add-on","blender_version_min":"4.5.3","website":"https://extensions.blender.org/add-ons/mesh-attribute-utils/","maintainer":"Hannah-Pascal-Noël","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"theme_updater","schema_version":"1.0.0","name":"Theme Updater","version":"1.0.0","tagline":"Update themes from 4.5 LTS to 5.0","archive_hash":"sha256:b376af83f16f0b089690d87a2b8d1dfaeeaa11578ac9a9ff8214d5e4a0308a21","archive_size":5066,"archive_url":"https://extensions.blender.org/download/sha256:b376af83f16f0b089690d87a2b8d1dfaeeaa11578ac9a9ff8214d5e4a0308a21/add-on-theme-updater-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/theme-updater/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["System"]},{"id":"rotor","schema_version":"1.0.0","name":"rotor","version":"1.3.2","tagline":"rotor","archive_hash":"sha256:93688a3f41cadaf2dd61a8e3a442963482ca64c95f3bf303e041f622a54a46c4","archive_size":42300,"archive_url":"https://extensions.blender.org/download/sha256:93688a3f41cadaf2dd61a8e3a442963482ca64c95f3bf303e041f622a54a46c4/add-on-rotor-v1.3.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/rotor/","maintainer":"niewinny","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","3D View","Mesh"]},{"id":"Blockout","schema_version":"1.0.0","name":"Blockout","version":"1.4.5","tagline":"Blockout","archive_hash":"sha256:14f2efbae5525faa91e3146093b002aef8204472b2dfc0cfd71d9d1e218dd814","archive_size":151513,"archive_url":"https://extensions.blender.org/download/sha256:14f2efbae5525faa91e3146093b002aef8204472b2dfc0cfd71d9d1e218dd814/add-on-blockout-v1.4.5.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/blockout/","maintainer":"niewinny","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Importing node group from disk"},"tags":["Modeling","3D View","Mesh"]},{"id":"geo_bake_batch","schema_version":"1.0.0","name":"Geo Bake Batch","version":"0.0.1","tagline":"Batch tools for Geometry Nodes baking","archive_hash":"sha256:5390dc3576d9fefecd1d048d62041e10f3534e29de64d8ede8c19c63db18bf39","archive_size":2570,"archive_url":"https://extensions.blender.org/download/sha256:5390dc3576d9fefecd1d048d62041e10f3534e29de64d8ede8c19c63db18bf39/add-on-geo-bake-batch-v0.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/geo-bake-batch/","maintainer":"Artyom-Pankratov","license":["SPDX:GPL-3.0-or-later"]},{"id":"restart","schema_version":"1.0.0","name":"Restart","version":"1.0.2","tagline":"Restart Blender","archive_hash":"sha256:35f410b9964af45d4c5becb8048e29e417a485bc371d26e23700ccd5fbba409c","archive_size":2824,"archive_url":"https://extensions.blender.org/download/sha256:35f410b9964af45d4c5becb8048e29e417a485bc371d26e23700ccd5fbba409c/add-on-restart-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/restart/","maintainer":"JR3DFUL","license":["SPDX:GPL-3.0-or-later"],"tags":["System"]},{"id":"camera_sensor_database","schema_version":"1.0.0","name":"Camera Sensor Database","version":"1.0.1","tagline":"Provides a database of camera sensors to choose from in Blender","archive_hash":"sha256:32004b0e9484005e64f5679b470706fc1fb051ee083e7636860edcd2c1d8acd9","archive_size":18406,"archive_url":"https://extensions.blender.org/download/sha256:32004b0e9484005e64f5679b470706fc1fb051ee083e7636860edcd2c1d8acd9/add-on-camera-sensor-database-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/camera-sensor-database/","maintainer":"Manuel-Houben","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"To save the sensor database locally","network":"To download the latest sensor database"},"tags":["Camera"]},{"id":"collection_switcher","schema_version":"1.0.0","name":"Collection Switcher","version":"1.4.0","tagline":"Switch visibility between sub-collections in switchers","archive_hash":"sha256:dbdfecad5e8051a1bd8a8005200ff91c37dab4fb3ffc489d66859be1454519e9","archive_size":1124111,"archive_url":"https://extensions.blender.org/download/sha256:dbdfecad5e8051a1bd8a8005200ff91c37dab4fb3ffc489d66859be1454519e9/add-on-collection-switcher-v1.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/collection-switcher/","maintainer":"Valentin-Komkov","license":["SPDX:GPL-3.0-or-later"]},{"id":"stb_section_toolbox","schema_version":"1.0.0","name":"Section Toolbox","version":"0.0.2","tagline":"Parametric section box and planar cuts with SVG DXF export","archive_hash":"sha256:93dd3b52321132a6c44cfdf0a738628fc156fba3d06d5f8d57fd2f189447f3f7","archive_size":30173,"archive_url":"https://extensions.blender.org/download/sha256:93dd3b52321132a6c44cfdf0a738628fc156fba3d06d5f8d57fd2f189447f3f7/add-on-stb-section-toolbox-v0.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/stb-section-toolbox/","maintainer":"Victor-Calixto","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export SVG and DXF to disk"},"tags":["Modeling","Mesh","Import-Export","Object"]},{"id":"uv_maps_plus","schema_version":"1.0.0","name":"UV Maps+","version":"2026.1.2","tagline":"Reorder UV Maps, Copy/Paste UVs, and exceed the 8-map limit","archive_hash":"sha256:a85d5e6b619544489c39c0b6208a5012907877f0a8c71931d5f9bae813e0e318","archive_size":18036,"archive_url":"https://extensions.blender.org/download/sha256:a85d5e6b619544489c39c0b6208a5012907877f0a8c71931d5f9bae813e0e318/add-on-uv-maps-plus-v2026.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/uv-maps-plus/","maintainer":"JR3DFUL","license":["SPDX:GPL-3.0-or-later"],"tags":["UV","User Interface"]},{"id":"parallax_node","schema_version":"1.0.0","name":"Parallax Node","version":"1.1.1","tagline":"Adds parallax node for shader nodes","archive_hash":"sha256:a2830f8614b8e3ee6d7bcc882eb2a8d3208f069b64dec3d7cfbc9f73dd4a100f","archive_size":12064,"archive_url":"https://extensions.blender.org/download/sha256:a2830f8614b8e3ee6d7bcc882eb2a8d3208f069b64dec3d7cfbc9f73dd4a100f/add-on-parallax-node-v1.1.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/parallax-node/","maintainer":"MultLabs","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","Node"]},{"id":"easy_driver","schema_version":"1.0.0","name":"Easy Driver","version":"1.5.7","tagline":"Technical rigging made easier","archive_hash":"sha256:67bb46459b69c6db2a040f83df1903d0f3f449193b587da175117fa5dbac9b1e","archive_size":41557,"archive_url":"https://extensions.blender.org/download/sha256:67bb46459b69c6db2a040f83df1903d0f3f449193b587da175117fa5dbac9b1e/add-on-easy-driver-v1.5.7.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.2.0","website":"https://extensions.blender.org/add-ons/easy-driver/","maintainer":"NeoEmberArt","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Animation"]},{"id":"hifi_builder","schema_version":"1.0.0","name":"HiFi Architecture Builder v4.5.8","version":"4.5.8","tagline":"One-click architecture, and game engine prep tool","archive_hash":"sha256:509a885bee9c0a8c9949a3f0899dbcd8e4b26c6aa08b7d5b7d20ec2e88404cd5","archive_size":101569,"archive_url":"https://extensions.blender.org/download/sha256:509a885bee9c0a8c9949a3f0899dbcd8e4b26c6aa08b7d5b7d20ec2e88404cd5/add-on-hifi-builder-v4.5.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/hifi-builder/","maintainer":"Malik-Nomi","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh","Modeling","Game Engine","Animation"]},{"id":"secondary_language","schema_version":"1.0.0","name":"Secondary Language","version":"1.1.0","tagline":"Quickly switch to secondary language","archive_hash":"sha256:f4fca123ca687c2b2977fdcef6157718d47d4bae15970ff3e90064948abd6049","archive_size":3939,"archive_url":"https://extensions.blender.org/download/sha256:f4fca123ca687c2b2977fdcef6157718d47d4bae15970ff3e90064948abd6049/add-on-secondary-language-v1.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/secondary-language/","maintainer":"mdlt7z","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"driver_helper","schema_version":"1.0.0","name":"DriverHelper","version":"1.0.1","tagline":"Helps generate driver formulas in the Shape Keys panel","archive_hash":"sha256:5e6937bfd83777793ecc35c0c52351bd45ff842d76fe5914f2c5df9f609d3149","archive_size":2152,"archive_url":"https://extensions.blender.org/download/sha256:5e6937bfd83777793ecc35c0c52351bd45ff842d76fe5914f2c5df9f609d3149/add-on-driver-helper-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/driver-helper/","maintainer":"Zakmen150","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"format_rename","schema_version":"1.0.0","name":"Format Rename","version":"0.0.5","tagline":"Format Rename","archive_hash":"sha256:e808bb2db8a28a7d59edcc17646c4e27d758ece40f258f98a15f162756b14f6e","archive_size":19683,"archive_url":"https://extensions.blender.org/download/sha256:e808bb2db8a28a7d59edcc17646c4e27d758ece40f258f98a15f162756b14f6e/add-on-format-rename-v0.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/format-rename/","maintainer":"Ou_Chiang","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Object","Rigging"]},{"id":"NieR_Automata","schema_version":"1.0.0","name":"YorHa - Operator","version":"1.1.0","tagline":"A Dark Version Of Nier Automata Ui inspired by YorHa-Operator","archive_hash":"sha256:37142058b557023d2d7bd00556c7ddaa53effadc124d7a8576a76383b98c39a1","archive_size":5484,"archive_url":"https://extensions.blender.org/download/sha256:37142058b557023d2d7bd00556c7ddaa53effadc124d7a8576a76383b98c39a1/theme-nier-automata-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/nier-automata/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"layer_comp","schema_version":"1.0.0","name":"LayerComp","version":"1.1.2","tagline":"Layer-based compositing tool, similar to After Effects","archive_hash":"sha256:f36c636a9d17ff8e411dde32f67fadffb4d945ffe4b91f6c9f1515f88070d2b6","archive_size":580509,"archive_url":"https://extensions.blender.org/download/sha256:f36c636a9d17ff8e411dde32f67fadffb4d945ffe4b91f6c9f1515f88070d2b6/add-on-layer-comp-v1.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/layer-comp/","maintainer":"KENKEN","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/Export Blend file from/to disk"},"tags":["Compositing","Node","Render"]},{"id":"select_123","schema_version":"1.0.0","name":"123 Select","version":"1.0.0","tagline":"Switch vertex edge face in Object Mode","archive_hash":"sha256:d2e9f6103ae21032457a7446e69d0739db1ec7484ed632f43e528ace040fed69","archive_size":2138,"archive_url":"https://extensions.blender.org/download/sha256:d2e9f6103ae21032457a7446e69d0739db1ec7484ed632f43e528ace040fed69/add-on-select-123-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/select-123/","maintainer":"Fisch_Tu","license":["SPDX:GPL-3.0-or-later"]},{"id":"ramp_generator","schema_version":"1.0.0","name":"Ramp Generator","version":"1.4.3","tagline":"Generate color ramps","archive_hash":"sha256:66bdec66a8260ec4bdf3341d059ff5e99d34b24a9e67f53c4897b1a27675a38c","archive_size":3932,"archive_url":"https://extensions.blender.org/download/sha256:66bdec66a8260ec4bdf3341d059ff5e99d34b24a9e67f53c4897b1a27675a38c/add-on-ramp-generator-v1.4.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ramp-generator/","maintainer":"TFMSTYLE","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Geometry Nodes","Compositing"]},{"id":"Timelapse_extension","schema_version":"1.0.0","name":"Timelapse","version":"1.0.1","tagline":"Take timed screenshots inside Blender","archive_hash":"sha256:c222a4fdd80114eeac3d556b9c4934f9f38382e25c00115fad1ebed9097474d1","archive_size":3049,"archive_url":"https://extensions.blender.org/download/sha256:c222a4fdd80114eeac3d556b9c4934f9f38382e25c00115fad1ebed9097474d1/add-on-timelapse-extension-v1.0.1.zip","type":"add-on","blender_version_min":"4.5.1","website":"https://extensions.blender.org/add-ons/timelapse-extension/","maintainer":"Silky-Renders","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export png/jpeg to disk"},"tags":["System"]},{"id":"blender_frutiger_aero_theme","schema_version":"1.0.0","name":"Frutiger Aero","version":"1.1.3","tagline":"This is a Frutiger Aero Theme for Blender","archive_hash":"sha256:55211f98e8097958a59f34af945f4a16ce490025f4b50c8edf939aa53b009f11","archive_size":6989,"archive_url":"https://extensions.blender.org/download/sha256:55211f98e8097958a59f34af945f4a16ce490025f4b50c8edf939aa53b009f11/theme-blender-frutiger-aero-theme-v1.1.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/blender-frutiger-aero-theme/","maintainer":"AeroBuoyancy.source","license":["SPDX:GPL-3.0-or-later"]},{"id":"markcam","schema_version":"1.0.0","name":"MarkCam","version":"2.5.0","tagline":"Quick camera-from-view + timeline marker tools","archive_hash":"sha256:e77094449c22c6b3d97280fb4b95ee456fd16c9677c14e2fd36aaf3c5fd4cebd","archive_size":6762,"archive_url":"https://extensions.blender.org/download/sha256:e77094449c22c6b3d97280fb4b95ee456fd16c9677c14e2fd36aaf3c5fd4cebd/add-on-markcam-v2.5.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/markcam/","maintainer":"SomRender","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","Animation"]},{"id":"Work_n_rose","schema_version":"1.0.0","name":"Work_n_rose","version":"1.5.0","tagline":"Dark Mood, 4thegoat","archive_hash":"sha256:6c1622ccf5e23b713a6eed923ebf8b771ec8cdd18d42ec54f9f6cc0b032a0122","archive_size":6148,"archive_url":"https://extensions.blender.org/download/sha256:6c1622ccf5e23b713a6eed923ebf8b771ec8cdd18d42ec54f9f6cc0b032a0122/theme-work-n-rose-v1.5.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/work-n-rose/","maintainer":"Nois3G4te","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"stroke_material_display","schema_version":"1.0.0","name":"Stroke Material Display","version":"1.0.1","tagline":"Display material names of selected Grease Pencil strokes","archive_hash":"sha256:807cb0171624b4fbb0960fd3f2ad455bb4611fd9fbd90b3c52cef01107019317","archive_size":3088,"archive_url":"https://extensions.blender.org/download/sha256:807cb0171624b4fbb0960fd3f2ad455bb4611fd9fbd90b3c52cef01107019317/add-on-stroke-material-display-v1.0.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/stroke-material-display/","maintainer":"JohnNyquist","license":["SPDX:GPL-3.0-or-later"],"tags":["Grease Pencil"]},{"id":"spa_sequencer","schema_version":"1.0.0","name":"SPArk Sequencer","version":"0.1.6","tagline":"Toolset to improve the sequence workflow in Blender","archive_hash":"sha256:2f9ea5309e0f0778d775c896b2b575fadaab20df993c7d453c11704697180b1a","archive_size":73645,"archive_url":"https://extensions.blender.org/download/sha256:2f9ea5309e0f0778d775c896b2b575fadaab20df993c7d453c11704697180b1a/add-on-spa-sequencer-v0.1.6.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/spa-sequencer/","maintainer":"TinyNick","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Sequencer"]},{"id":"compositor_file_output_replacer","schema_version":"1.0.0","name":"Compositor File Output Replacer","version":"1.3.0","tagline":"Find and replace text in File Output node paths","archive_hash":"sha256:fc5ba89eb189670904813d758c2913c22ed3e66f830fc0ba01333ce8c46c8757","archive_size":3158,"archive_url":"https://extensions.blender.org/download/sha256:fc5ba89eb189670904813d758c2913c22ed3e66f830fc0ba01333ce8c46c8757/add-on-compositor-file-output-replacer-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/compositor-file-output-replacer/","maintainer":"a2d4f3s1","license":["SPDX:GPL-3.0-or-later"],"tags":["Compositing","Node"]},{"id":"miunau_slcamera","schema_version":"1.0.0","name":"Second Life-style camera","version":"1.0.4","tagline":"Second Life-style camera with ALT (option)/CTRL/SHIFT keys","archive_hash":"sha256:e52827160361d2ea0b1c7cdf8603879df1b604dada91e2535d0a17abfe5a8e06","archive_size":19907,"archive_url":"https://extensions.blender.org/download/sha256:e52827160361d2ea0b1c7cdf8603879df1b604dada91e2535d0a17abfe5a8e06/add-on-miunau-slcamera-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/miunau-slcamera/","maintainer":"miunau","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"blue_archive_theme","schema_version":"1.0.0","name":"Blue Archive","version":"1.2.1","tagline":"Theme inspired by Blue Archive game UI","archive_hash":"sha256:b8049642276b5da71a498c9433a46b628ec154b050fa27c5e06fe6236b0f1b31","archive_size":5159,"archive_url":"https://extensions.blender.org/download/sha256:b8049642276b5da71a498c9433a46b628ec154b050fa27c5e06fe6236b0f1b31/theme-blue-archive-theme-v1.2.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/blue-archive-theme/","maintainer":"RAZUMNO","license":["SPDX:GPL-3.0-or-later"],"tags":["Light","Inspired By"]},{"id":"toolhub","schema_version":"1.0.0","name":"Tool Hub","version":"1.0.2","tagline":"This add-on searches and pins in a pie-menu","archive_hash":"sha256:cbf1d344e714f273a7e97607576712141e3c7fb7b8c0eea5c17b51072c913ed2","archive_size":26285,"archive_url":"https://extensions.blender.org/download/sha256:cbf1d344e714f273a7e97607576712141e3c7fb7b8c0eea5c17b51072c913ed2/add-on-toolhub-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/toolhub/","maintainer":"Mr.Bir","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"attrio_csv","schema_version":"1.0.0","name":"Attrio CSV","version":"1.0.1","tagline":"Bake and read back Evaluated Dependency Graph Data as CSV","archive_hash":"sha256:1091d651c2b57d2ce9cc7c3b5037a0e2892f568db65e67ffcf57ced8c355cf68","archive_size":161895,"archive_url":"https://extensions.blender.org/download/sha256:1091d651c2b57d2ce9cc7c3b5037a0e2892f568db65e67ffcf57ced8c355cf68/add-on-attrio-csv-v1.0.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/attrio-csv/","maintainer":"sharpened","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Bake","Geometry Nodes"]},{"id":"essential_brush_saver","schema_version":"1.0.0","name":"Essential Brush Saver","version":"1.1.3","tagline":"Automatically save and load essential brush settings","archive_hash":"sha256:c83987bf62b92a0890d9aeae3bcf7b4c31df7d38d6b1991b10a61610f50738a0","archive_size":6069,"archive_url":"https://extensions.blender.org/download/sha256:c83987bf62b92a0890d9aeae3bcf7b4c31df7d38d6b1991b10a61610f50738a0/add-on-essential-brush-saver-v1.1.3.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/essential-brush-saver/","maintainer":"emptybraces","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save/Load configuration data JSON file to/from disk"},"tags":["Paint","Sculpt","System"]},{"id":"space_colonization_tree_generator","schema_version":"1.0.0","name":"Space colonization tree generator","version":"1.0.0","tagline":"A simple add-on which uses the space colonization approach","archive_hash":"sha256:4b3ed3c3d2ff48e8bd3eec520098e42d24937f4167ed3fd9210a870369a9ef83","archive_size":6781,"archive_url":"https://extensions.blender.org/download/sha256:4b3ed3c3d2ff48e8bd3eec520098e42d24937f4167ed3fd9210a870369a9ef83/add-on-space-colonization-tree-generator-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/space-colonization-tree-generator/","maintainer":"LS","license":["SPDX:GPL-3.0-or-later"]},{"id":"SHIRAKUMO_rectangle_tools","schema_version":"1.0.0","name":"Rectangle Tools","version":"1.0.2","tagline":"Tools to more easily draw rectangles in edit mode","archive_hash":"sha256:16aa9da0c9d4eb8d0e7c9b94c1a1e1602a602c75109e2c8beeffb5648719ce9b","archive_size":7349,"archive_url":"https://extensions.blender.org/download/sha256:16aa9da0c9d4eb8d0e7c9b94c1a1e1602a602c75109e2c8beeffb5648719ce9b/add-on-shirakumo-rectangle-tools-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shirakumo-rectangle-tools/","maintainer":"shinmera","license":["SPDX:GPL-3.0-or-later","SPDX:Zlib"],"tags":["Modeling"]},{"id":"bake_instance_animation","schema_version":"1.0.0","name":"Bake Instance Animation (烘焙几何节点实例动画)","version":"1.0.3","tagline":"Bake geometry nodes instance animation to keyframe animation","archive_hash":"sha256:eea61c5dfe87559ead85806327ea8dcf1c3c9a8e650d35650a6b624f82a94ad4","archive_size":8497,"archive_url":"https://extensions.blender.org/download/sha256:eea61c5dfe87559ead85806327ea8dcf1c3c9a8e650d35650a6b624f82a94ad4/add-on-bake-instance-animation-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bake-instance-animation/","maintainer":"ChyiZ_","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Geometry Nodes"]},{"id":"Candymouse","schema_version":"1.0.0","name":"Candymouse","version":"1.1.1","tagline":"A neutral grey theme with colorful accents","archive_hash":"sha256:2dfe337a92a3ca1a4cfd8f4f7c9c3f1fa4319a8a5e2e631826cf4aaaf83aff85","archive_size":5848,"archive_url":"https://extensions.blender.org/download/sha256:2dfe337a92a3ca1a4cfd8f4f7c9c3f1fa4319a8a5e2e631826cf4aaaf83aff85/theme-candymouse-v1.1.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/candymouse/","maintainer":"milomouse","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"shiva_img2mat","schema_version":"1.0.0","name":"Image to Mat","version":"1.0.0","tagline":"Generate material from image","archive_hash":"sha256:70a119b9df99d6521deed569f4b68765af8bfeb23b5045f6eacc7e24ffb940b8","archive_size":3150,"archive_url":"https://extensions.blender.org/download/sha256:70a119b9df99d6521deed569f4b68765af8bfeb23b5045f6eacc7e24ffb940b8/add-on-shiva-img2mat-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shiva-img2mat/","maintainer":"SHIVA","license":["SPDX:GPL-3.0-or-later"]},{"id":"easy_tree","schema_version":"1.0.0","name":"Easy Tree","version":"1.0.1","tagline":"Create one-click procedural trees","archive_hash":"sha256:9ba32029650173c303037155c629dd85953699dbd8e62bd5e71da6927c84a4ff","archive_size":17712727,"archive_url":"https://extensions.blender.org/download/sha256:9ba32029650173c303037155c629dd85953699dbd8e62bd5e71da6927c84a4ff/add-on-easy-tree-v1.0.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/easy-tree/","maintainer":"Jacob-Johnston","license":["SPDX:GPL-3.0-or-later"]},{"id":"wheel_o_matic","schema_version":"1.0.0","name":"Wheel-O-Matic","version":"1.0.2","tagline":"Automatic wheel rotation in any direction","archive_hash":"sha256:b1bbffe18d262809b768ff28f1491a0141c71c45ff5789338d737706ee9b29db","archive_size":20178,"archive_url":"https://extensions.blender.org/download/sha256:b1bbffe18d262809b768ff28f1491a0141c71c45ff5789338d737706ee9b29db/add-on-wheel-o-matic-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/wheel-o-matic/","maintainer":"TechArtToolBox","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Animation"]},{"id":"blender_game_tools","schema_version":"1.0.0","name":"Game Tools","version":"0.3.2","tagline":"Game Tools","archive_hash":"sha256:5c62770748af9a4cf620e642b98716e63392012ca9e6a6436b47b5cd3d38f66e","archive_size":249307,"archive_url":"https://extensions.blender.org/download/sha256:5c62770748af9a4cf620e642b98716e63392012ca9e6a6436b47b5cd3d38f66e/add-on-blender-game-tools-v0.3.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blender-game-tools/","maintainer":"Cremuss","license":["SPDX:GPL-3.0-or-later"],"tags":["Bake","UV","Mesh","Pipeline"]},{"id":"keyframe_selected","schema_version":"1.0.0","name":"Keyframe selected","version":"1.3.3","tagline":"Insert or delete keyframes on selected items","archive_hash":"sha256:cfb13e15f9a4bfe2155bba29b9a2f0da5a585ffdd4e96ada00c47083ec1ca0ca","archive_size":6059,"archive_url":"https://extensions.blender.org/download/sha256:cfb13e15f9a4bfe2155bba29b9a2f0da5a585ffdd4e96ada00c47083ec1ca0ca/add-on-keyframe-selected-v1.3.3.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/keyframe-selected/","maintainer":"xbodya13","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"i32_the_mandelbrot_set","schema_version":"1.0.0","name":"i32 the Mandelbrot Set","version":"1.0.2","tagline":"The Mandelbrot set using only Integer Math and Bit Math Nodes","archive_hash":"sha256:2c84bad5a6b5b98820d12d13980e36848eed0cf8359844954d72995722224540","archive_size":43557,"archive_url":"https://extensions.blender.org/download/sha256:2c84bad5a6b5b98820d12d13980e36848eed0cf8359844954d72995722224540/add-on-i32-the-mandelbrot-set-v1.0.2.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/i32-the-mandelbrot-set/","maintainer":"Osipenkov+Art","license":["SPDX:GPL-3.0-or-later"],"tags":["Geometry Nodes"]},{"id":"node_tree_screenshot","schema_version":"1.0.0","name":"Node Tree Screenshot","version":"1.1.1","tagline":"Screenshot utility for large node trees","archive_hash":"sha256:fc9713b92bebdc4c88b0ded0666306c45dea3e28621f0b9a0e89133033df8d56","archive_size":18742702,"archive_url":"https://extensions.blender.org/download/sha256:fc9713b92bebdc4c88b0ded0666306c45dea3e28621f0b9a0e89133033df8d56/add-on-node-tree-screenshot-v1.1.1-windows-x64-macos-arm64-linux-x64.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/node-tree-screenshot/","maintainer":"LukasTönne","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64","macos-arm64","linux-x64"],"tags":["Node"]},{"id":"visual_limits","schema_version":"1.0.0","name":"Visual limits","version":"1.3.2","tagline":"This addon shows rigid body constraint limits in viewport","archive_hash":"sha256:fcb0ca388657a7fe0d2ce862ce5fdaa178c75160ce74e775981bdecc72a2509e","archive_size":2710,"archive_url":"https://extensions.blender.org/download/sha256:fcb0ca388657a7fe0d2ce862ce5fdaa178c75160ce74e775981bdecc72a2509e/add-on-visual-limits-v1.3.2.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/visual-limits/","maintainer":"xbodya13","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"auto_sync_object_data_names","schema_version":"1.0.0","name":"Auto Sync Object Data Names","version":"1.0.0","tagline":"Automatically sync object and data names","archive_hash":"sha256:6da30fc3031f193cbac124155168d944dd62b674ede4465becc262d61288c8ab","archive_size":19044,"archive_url":"https://extensions.blender.org/download/sha256:6da30fc3031f193cbac124155168d944dd62b674ede4465becc262d61288c8ab/add-on-auto-sync-object-data-names-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-sync-object-data-names/","maintainer":"GeeDoubleU","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Pipeline"]},{"id":"Tracker2Nuke","schema_version":"1.0.0","name":"Tracker to Nuke","version":"1.1.0","tagline":"Instantly export Blender tracking data to a Nuke Tracker node","archive_hash":"sha256:b937c0ddfdd9cdea2e22332b540bd2bf7dbd9bd3a9b6dcb2366930a73818029d","archive_size":5120,"archive_url":"https://extensions.blender.org/download/sha256:b937c0ddfdd9cdea2e22332b540bd2bf7dbd9bd3a9b6dcb2366930a73818029d/add-on-tracker2nuke-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/tracker2nuke/","maintainer":"K_Naoki","license":["SPDX:GPL-3.0-or-later"],"tags":["Tracking","Import-Export"]},{"id":"polychase","schema_version":"1.0.0","name":"Polychase","version":"0.0.12","tagline":"Mesh Based Motion Tracking in Blender","archive_hash":"sha256:cec3aef00331262297eab4c4701019b2c8afd246634164fce9fb2ba4ba5d4741","archive_size":6053171,"archive_url":"https://extensions.blender.org/download/sha256:cec3aef00331262297eab4c4701019b2c8afd246634164fce9fb2ba4ba5d4741/add-on-polychase-v0.0.12-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/polychase/","maintainer":"theartful","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Write optical flow database to disk"},"platforms":["windows-x64"],"tags":["Animation","Tracking"]},{"id":"Bone_Aligner","schema_version":"1.0.0","name":"Bone Aligner","version":"1.1.4","tagline":"Quickly align two bones","archive_hash":"sha256:bc842ad69c28089a444998780860f6755b140c8819ff92caebff935ec4180af8","archive_size":2841,"archive_url":"https://extensions.blender.org/download/sha256:bc842ad69c28089a444998780860f6755b140c8819ff92caebff935ec4180af8/add-on-bone-aligner-v1.1.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bone-aligner/","maintainer":"maylog","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"perfectly_normal","schema_version":"1.0.0","name":"Perfectly Normal","version":"0.0.2","tagline":"Manipulate face-corner normals as mesh components","archive_hash":"sha256:e52b80edcba7441d962ececa8db61da530d401f694670d9c03b463347334ce56","archive_size":159727,"archive_url":"https://extensions.blender.org/download/sha256:e52b80edcba7441d962ececa8db61da530d401f694670d9c03b463347334ce56/add-on-perfectly-normal-v0.0.2.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/perfectly-normal/","maintainer":"Seth-Adam-Trowbridge","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write asset resources from/to disk"},"tags":["Mesh","Modeling","Geometry Nodes"]},{"id":"beantextures","schema_version":"1.0.0","name":"Beantextures","version":"1.1.0","tagline":"Addon to help with 2D texture-based animations","archive_hash":"sha256:3273b6d7045724c0e4e1ea3c98924ee1831e5fd2712eb69391fb2f50d465fa59","archive_size":23669,"archive_url":"https://extensions.blender.org/download/sha256:3273b6d7045724c0e4e1ea3c98924ee1831e5fd2712eb69391fb2f50d465fa59/add-on-beantextures-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/beantextures/","maintainer":"daringcuteseal","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import image textures to generated node group"},"tags":["Animation","Node","Rigging"]},{"id":"SmartScene_Toolkit","schema_version":"1.0.0","name":"SmartScene Toolkit","version":"1.4.0","tagline":"Toolkit for smarter parent, hierarchy, mirror operations","archive_hash":"sha256:135648cb28a6598c932adf8b34ef4652026f71e57f0dd2b7e352b88d5dc19b60","archive_size":14746,"archive_url":"https://extensions.blender.org/download/sha256:135648cb28a6598c932adf8b34ef4652026f71e57f0dd2b7e352b88d5dc19b60/add-on-smartscene-toolkit-v1.4.0.zip","type":"add-on","blender_version_min":"4.4.3","website":"https://extensions.blender.org/add-ons/smartscene-toolkit/","maintainer":"Marcus997","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Scene"]},{"id":"Blackboard_Theme","schema_version":"1.0.0","name":"Blackboard_Theme","version":"2.2.5","tagline":"Dark Monochrome","archive_hash":"sha256:6f1acb07f807e7bf6296f176206b54cf65f569e8a5f83700a8856c588a8e0f43","archive_size":5660,"archive_url":"https://extensions.blender.org/download/sha256:6f1acb07f807e7bf6296f176206b54cf65f569e8a5f83700a8856c588a8e0f43/theme-blackboard-theme-v2.2.5.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/blackboard-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"surfacepsycho","schema_version":"1.0.0","name":"Surface Psycho","version":"0.9.5","tagline":"Precision Surface Design","archive_hash":"sha256:b874721cde1be402364a8174cd2faac7fb8d52661776c8498be59ac3958ea25c","archive_size":51690024,"archive_url":"https://extensions.blender.org/download/sha256:b874721cde1be402364a8174cd2faac7fb8d52661776c8498be59ac3958ea25c/add-on-surfacepsycho-v0.9.5-windows-x64.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/surfacepsycho/","maintainer":"RomainGuimbal","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import and export CAD files"},"platforms":["windows-x64"],"tags":["Modeling","Import-Export","Geometry Nodes","Add Curve"]},{"id":"sync_material_viewport_color","schema_version":"1.0.0","name":"Sync Material Viewport Color","version":"1.0.2","tagline":"Sets diffuse color, metallic and roughness for viewport display","archive_hash":"sha256:1e6302ca53e77ca3163ef07be912988880d13574b20cec5d5fb3735c4eac9cc9","archive_size":7318,"archive_url":"https://extensions.blender.org/download/sha256:1e6302ca53e77ca3163ef07be912988880d13574b20cec5d5fb3735c4eac9cc9/add-on-sync-material-viewport-color-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sync-material-viewport-color/","maintainer":"Qiu-Feng","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Material"]},{"id":"Dim_Fog","schema_version":"1.0.0","name":"Dim Fog","version":"2.0.0","tagline":"Moody & Cozy theme","archive_hash":"sha256:442ee419c1f5439af9cb9643ed06c5ce7461ef565622854ec754642ef45b885c","archive_size":5195,"archive_url":"https://extensions.blender.org/download/sha256:442ee419c1f5439af9cb9643ed06c5ce7461ef565622854ec754642ef45b885c/theme-dim-fog-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/dim-fog/","maintainer":"huleeb","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"ccnc_animation_objects","schema_version":"1.0.0","name":"CCNCAnimationObjects","version":"1.2.3","tagline":"CNC simulation object editor with camera and spark effects","archive_hash":"sha256:51d61dc81125b537f01f25da6b52a6ba1ba694e9c83ef6d1f3a97b47af051d82","archive_size":85342,"archive_url":"https://extensions.blender.org/download/sha256:51d61dc81125b537f01f25da6b52a6ba1ba694e9c83ef6d1f3a97b47af051d82/add-on-ccnc-animation-objects-v1.2.3.zip","type":"add-on","blender_version_min":"4.4.3","website":"https://extensions.blender.org/add-ons/ccnc-animation-objects/","maintainer":"Bitsqueezer","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export CSV files"},"tags":["Modeling","Animation","Camera"]},{"id":"shape_key_utilities_enhanced","schema_version":"1.0.0","name":"Shape Key & Vertex Groups Utilities Enhanced","version":"1.1.1","tagline":"Comprehensive shape key and vertex group management tools","archive_hash":"sha256:f7d756df3bb017b871d7057fb727e79ac98a5e235fc0fa0ad83c7cca78127527","archive_size":21006,"archive_url":"https://extensions.blender.org/download/sha256:f7d756df3bb017b871d7057fb727e79ac98a5e235fc0fa0ad83c7cca78127527/add-on-shape-key-utilities-enhanced-v1.1.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/shape-key-utilities-enhanced/","maintainer":"LeafyBush7","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Object","Modeling"]},{"id":"VAT","schema_version":"1.0.0","name":"Vertex Animation Texture Addon (VAT)","version":"1.0.1","tagline":"Tools for vertex animation textures in Blender","archive_hash":"sha256:5fb62160f6e6642150e74bc02421cd46c338a96d85e28e3e48f6baaad1bfb065","archive_size":8592,"archive_url":"https://extensions.blender.org/download/sha256:5fb62160f6e6642150e74bc02421cd46c338a96d85e28e3e48f6baaad1bfb065/add-on-vat-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/vat/","maintainer":"Flement","license":["SPDX:GPL-3.0-or-later"]},{"id":"VCS","schema_version":"1.0.0","name":"Vertex Color Selector","version":"1.0.9","tagline":"VertexColor Select tool","archive_hash":"sha256:0dd54c9febb5b08d20d9db9797384130169c552db74563214f6f7a589e1555f4","archive_size":8745,"archive_url":"https://extensions.blender.org/download/sha256:0dd54c9febb5b08d20d9db9797384130169c552db74563214f6f7a589e1555f4/add-on-vcs-v1.0.9.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/vcs/","maintainer":"D31","license":["SPDX:GPL-3.0-or-later"]},{"id":"script_manager_pro","schema_version":"1.0.0","name":"Script Manager Pro","version":"0.0.3","tagline":"Manage and run Python scripts with one-click access","archive_hash":"sha256:005a3e75a2bee8f30718c1773d05533e8112101254d7103f56f0dce3c6e12fff","archive_size":3129,"archive_url":"https://extensions.blender.org/download/sha256:005a3e75a2bee8f30718c1773d05533e8112101254d7103f56f0dce3c6e12fff/add-on-script-manager-pro-v0.0.3.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/script-manager-pro/","maintainer":"CemilBerk","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Reads and writes script metadata to a JSON file"}},{"id":"anim_auto_offset","schema_version":"1.0.0","name":"Animation Auto Offset","version":"1.3.2","tagline":"Update all keyframes relatively on transform changes","archive_hash":"sha256:a5fb0219f32e06d2b8e5e8c475228e76c8144988bc6068c966999776e9173ca8","archive_size":15647,"archive_url":"https://extensions.blender.org/download/sha256:a5fb0219f32e06d2b8e5e8c475228e76c8144988bc6068c966999776e9173ca8/add-on-anim-auto-offset-v1.3.2.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/anim-auto-offset/","maintainer":"Marek-Zając","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Sequencer"]},{"id":"auto_wrinkle_map","schema_version":"1.0.0","name":"Auto Wrinkle Map","version":"0.0.7","tagline":"Helps you to create wrinkle maps driven from bones in one click","archive_hash":"sha256:342a46d212aef292c92e9f751b4cd1f97ccaa677acc8e1cdc1ce23f638ef198a","archive_size":10763,"archive_url":"https://extensions.blender.org/download/sha256:342a46d212aef292c92e9f751b4cd1f97ccaa677acc8e1cdc1ce23f638ef198a/add-on-auto-wrinkle-map-v0.0.7.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/auto-wrinkle-map/","maintainer":"Hattiffnat","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Material","Node","Animation"]},{"id":"node_void_keeper","schema_version":"1.0.0","name":"NodeVoidKeeper","version":"1.0.1","tagline":"Keeps your nodes centered at the origin, so you can't lose them","archive_hash":"sha256:a6ac8d276fc301e317c45b4c5ec55672266fb11e0cb2a82f7436c106db8e053d","archive_size":15610,"archive_url":"https://extensions.blender.org/download/sha256:a6ac8d276fc301e317c45b4c5ec55672266fb11e0cb2a82f7436c106db8e053d/add-on-node-void-keeper-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-void-keeper/","maintainer":"MagnumVD","license":["SPDX:GPL-3.0-or-later"],"tags":["Node"]},{"id":"autocam","schema_version":"1.0.0","name":"AutoCam","version":"2.0.6","tagline":"Intuitive camera tools, built for artists","archive_hash":"sha256:375b428c576948a9f8a9311e64c4f4109aa41fec3c1b76b8c79a1b67685b2132","archive_size":67410,"archive_url":"https://extensions.blender.org/download/sha256:375b428c576948a9f8a9311e64c4f4109aa41fec3c1b76b8c79a1b67685b2132/add-on-autocam-v2.0.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/autocam/","maintainer":"RenderRides","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","Animation","Rigging","Render","Add Curve"]},{"id":"additional_batch_rename","schema_version":"1.0.0","name":"Additional Batch Rename","version":"1.1.1","tagline":"Additional batch rename operators","archive_hash":"sha256:c8cbfda2e658806b84e437759fdce84053abfd16266dbd29e5b89a074a305c11","archive_size":15993,"archive_url":"https://extensions.blender.org/download/sha256:c8cbfda2e658806b84e437759fdce84053abfd16266dbd29e5b89a074a305c11/add-on-additional-batch-rename-v1.1.1.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/additional-batch-rename/","maintainer":"Endertainer007","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface","Object"]},{"id":"proceduraltiles","schema_version":"1.0.0","name":"Procedural Tiles","version":"0.0.4","tagline":"A library of shader nodes. +100 NEW NODES","archive_hash":"sha256:4c6040e0c5654c066fa66f48321857d44e26ca1726d3c8c70cd04050cb6efc30","archive_size":4261663,"archive_url":"https://extensions.blender.org/download/sha256:4c6040e0c5654c066fa66f48321857d44e26ca1726d3c8c70cd04050cb6efc30/add-on-proceduraltiles-v0.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/proceduraltiles/","maintainer":"Aisun-Tang","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Material"]},{"id":"simple_gcode_importer","schema_version":"1.0.0","name":"Simple Gcode Importer","version":"1.1.1","tagline":"Import Gcode to blender as paths","archive_hash":"sha256:aa644b0c5f1cb47878c08bddc029da401e9e357c5e82c4b254801e57897c8f29","archive_size":2397,"archive_url":"https://extensions.blender.org/download/sha256:aa644b0c5f1cb47878c08bddc029da401e9e357c5e82c4b254801e57897c8f29/add-on-simple-gcode-importer-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/simple-gcode-importer/","maintainer":"kmnunley","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Pipeline"]},{"id":"controller_link","schema_version":"1.0.0","name":"Controller Link","version":"1.0.1","tagline":"Use a gamepad as input","archive_hash":"sha256:cf2ef139dc3a07eb2185b91e19586bedaaa684d101fe03449d080262e2fe3c8f","archive_size":16281033,"archive_url":"https://extensions.blender.org/download/sha256:cf2ef139dc3a07eb2185b91e19586bedaaa684d101fe03449d080262e2fe3c8f/add-on-controller-link-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/controller-link/","maintainer":"globglob3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Sequencer"]},{"id":"glare_node_controller","schema_version":"1.0.0","name":"Glare Node Controller","version":"2.3.3","tagline":"panel to control Glare","archive_hash":"sha256:e9a4d48813add31c7f4c04198f4ebfba47dc88be90f4f828762e8ae2c3445d68","archive_size":3563,"archive_url":"https://extensions.blender.org/download/sha256:e9a4d48813add31c7f4c04198f4ebfba47dc88be90f4f828762e8ae2c3445d68/add-on-glare-node-controller-v2.3.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/glare-node-controller/","maintainer":"darkstarrd","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Render"]},{"id":"dragonff","schema_version":"1.0.0","name":"DragonFF","version":"1.1.0","tagline":"Add-on to edit RenderWare Formats (.dff, .txd, .col)","archive_hash":"sha256:08df6ba49bc85ea983e1661c1151d3ea2b03d7764e815cc85ffce8af31b8267e","archive_size":225580,"archive_url":"https://extensions.blender.org/download/sha256:08df6ba49bc85ea983e1661c1151d3ea2b03d7764e815cc85ffce8af31b8267e/add-on-dragonff-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dragonff/","maintainer":"Parik","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export DFF/TXD/COL/IPL/IDE from/to disk"},"tags":["Import-Export","3D View","Mesh","Material"]},{"id":"maya_pivot","schema_version":"1.0.0","name":"Maya Pivot","version":"1.0.0","tagline":"Implements a Maya-like pivot system in Blender","archive_hash":"sha256:14893b7a7fdef8ffd4ebb538f770b38257c020ca9a02b39d5f3a49dc674083e2","archive_size":16036,"archive_url":"https://extensions.blender.org/download/sha256:14893b7a7fdef8ffd4ebb538f770b38257c020ca9a02b39d5f3a49dc674083e2/add-on-maya-pivot-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/maya-pivot/","maintainer":"Zinkenite","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Modeling","Mesh"]},{"id":"Blueprint_Paper_Theme","schema_version":"1.0.0","name":"Blueprint_Paper_Theme","version":"2.2.6","tagline":"Technical Drawing","archive_hash":"sha256:c595ff36b50211cc40db65f33c7dc839fe50526be3d2208591546d9ee2046bea","archive_size":5761,"archive_url":"https://extensions.blender.org/download/sha256:c595ff36b50211cc40db65f33c7dc839fe50526be3d2208591546d9ee2046bea/theme-blueprint-paper-theme-v2.2.6.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/blueprint-paper-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"jiggle_physics","schema_version":"1.0.0","name":"Jiggle Physics","version":"4.5.1","tagline":"Add stretchy jiggle physics to your Blender rigs","archive_hash":"sha256:f746d7dbedefd926cc384b2fc65dc8b351201ec64d4ce5ba9e6944643fb4d7ab","archive_size":33411,"archive_url":"https://extensions.blender.org/download/sha256:f746d7dbedefd926cc384b2fc65dc8b351201ec64d4ce5ba9e6944643fb4d7ab/add-on-jiggle-physics-v4.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/jiggle-physics/","maintainer":"naelstrof","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"paws_bakery","schema_version":"1.0.0","name":"PAWS: Bakery","version":"0.5.1","tagline":"Texture Baking tools for Game-Ready pipeline by Pawsgineer","archive_hash":"sha256:3a9a2d5d563d38ff8fd3b76fec281213da773425995b2c5b79c7e69f35e17ad0","archive_size":165829,"archive_url":"https://extensions.blender.org/download/sha256:3a9a2d5d563d38ff8fd3b76fec281213da773425995b2c5b79c7e69f35e17ad0/add-on-paws-bakery-v0.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/paws-bakery/","maintainer":"Steve-Paws","license":["SPDX:GPL-3.0-or-later"],"tags":["Bake","Pipeline","Material"]},{"id":"MakePlanarFacesPlus","schema_version":"1.0.0","name":"Make Planar Faces Plus","version":"1.0.5","tagline":"Powerful Make Planar Faces Operator","archive_hash":"sha256:ebd3d131ddbeb455169c617c257722872a7db6e7d4e0af6a03828cccae813b62","archive_size":229833,"archive_url":"https://extensions.blender.org/download/sha256:ebd3d131ddbeb455169c617c257722872a7db6e7d4e0af6a03828cccae813b62/add-on-makeplanarfacesplus-v1.0.5-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/makeplanarfacesplus/","maintainer":"Anton-Florey","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Mesh"]},{"id":"shape_key_mirror_plus","schema_version":"1.0.0","name":"Shape Key Mirror Plus","version":"1.9.0","tagline":"Mirror shape key deltas across symmetric axes","archive_hash":"sha256:e67a7c722d2ad02a4c1fd5e9d99498193d0e1d604c86f20a45dd44ca5863b339","archive_size":17431,"archive_url":"https://extensions.blender.org/download/sha256:e67a7c722d2ad02a4c1fd5e9d99498193d0e1d604c86f20a45dd44ca5863b339/add-on-shape-key-mirror-plus-v1.9.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shape-key-mirror-plus/","maintainer":"Ciyorie","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"marchingcube","schema_version":"1.0.0","name":"Marching Cube","version":"0.1.0","tagline":"Generate iso-surface meshes using the Marching Cubes algorithm","archive_hash":"sha256:170039384f6ea5ee47454353fa0b6b88491223ed95f9a20bada47625294957e1","archive_size":41468675,"archive_url":"https://extensions.blender.org/download/sha256:170039384f6ea5ee47454353fa0b6b88491223ed95f9a20bada47625294957e1/add-on-marchingcube-v0.1.0-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/marchingcube/","maintainer":"Thomas-Berger","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Add Mesh"]},{"id":"terrainmixer","schema_version":"1.0.0","name":"Terrain Mixer","version":"3.1.2","tagline":"Easy to use shader-based terrain generator for Cycles","archive_hash":"sha256:2a695aac2b7966c0a64077ae76b7cfc1bfff857382250820e367a4be00852efd","archive_size":52570647,"archive_url":"https://extensions.blender.org/download/sha256:2a695aac2b7966c0a64077ae76b7cfc1bfff857382250820e367a4be00852efd/add-on-terrainmixer-v3.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/terrainmixer/","maintainer":"zets","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Easily replace default image files with your own","network":"Documentation and tutorials available online"},"tags":["Add Mesh","Bake","Material"]},{"id":"Viewport_stabilizer","schema_version":"1.0.0","name":"Viewport stabilizer","version":"1.0.2","tagline":"Stabilise 3d point on your screen","archive_hash":"sha256:ddb4f4e4d410fa18b27f934bcce9abcd451c8b494cccccd32f1de206926b9cd1","archive_size":5207,"archive_url":"https://extensions.blender.org/download/sha256:ddb4f4e4d410fa18b27f934bcce9abcd451c8b494cccccd32f1de206926b9cd1/add-on-viewport-stabilizer-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/viewport-stabilizer/","maintainer":"Yaroslav_Yushk","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Tracking"]},{"id":"multiple_camera_render","schema_version":"1.0.0","name":"Multiple Camera Render","version":"4.4.0","tagline":"Sequential rendering from multiple cameras","archive_hash":"sha256:2f475eeea55812da815c61c925b92cd8301733ab82a0fbb8e4e2c4dffaa1e441","archive_size":135372,"archive_url":"https://extensions.blender.org/download/sha256:2f475eeea55812da815c61c925b92cd8301733ab82a0fbb8e4e2c4dffaa1e441/add-on-multiple-camera-render-v4.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/multiple-camera-render/","maintainer":"ivan-perevala","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Writing execution log files inside extension directory"},"tags":["Render","Animation","Camera","3D View"]},{"id":"set_vertex_distance","schema_version":"1.0.0","name":"Set Vertex Distance","version":"1.0.0","tagline":"Set distance between two vertices along a specific axis","archive_hash":"sha256:7fce4c84550565f5013da5d3e9345826e6782a8e71c3a79309db28936a3b321f","archive_size":2537,"archive_url":"https://extensions.blender.org/download/sha256:7fce4c84550565f5013da5d3e9345826e6782a8e71c3a79309db28936a3b321f/add-on-set-vertex-distance-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/set-vertex-distance/","maintainer":"alicoskun","license":["SPDX:GPL-3.0-or-later"]},{"id":"modifer_stack_manager","schema_version":"1.0.0","name":"Modifier Stack Manager","version":"1.1.1","tagline":"A UI List implementation for Blender's modifier stack","archive_hash":"sha256:eb282b5114e718cd50c2c4b61b9a2dbb8ac067a70bed241dbd053a4c0de16996","archive_size":4750,"archive_url":"https://extensions.blender.org/download/sha256:eb282b5114e718cd50c2c4b61b9a2dbb8ac067a70bed241dbd053a4c0de16996/add-on-modifer-stack-manager-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/modifer-stack-manager/","maintainer":"salaivv","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","User Interface"]},{"id":"cloud_midnight_teal","schema_version":"1.0.0","name":"Cloud Guy's Theme","version":"1.0.3","tagline":"Custom theme made by me and a friend","archive_hash":"sha256:410cbdebbcb43282fbe2d27956a41eb2158a33f158e97418997f275a435c5816","archive_size":5920,"archive_url":"https://extensions.blender.org/download/sha256:410cbdebbcb43282fbe2d27956a41eb2158a33f158e97418997f275a435c5816/theme-cloud-midnight-teal-v1.0.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/cloud-midnight-teal/","maintainer":"Cloud-Guy","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"Cad_measure_extension","schema_version":"1.0.0","name":"Cad_Dimensions","version":"2.0.0","tagline":"Extension for a new measuring system","archive_hash":"sha256:fdc1a528d7808c897d7cf3469b09921a5b29174cfa6293400f82a1cd0eb65efb","archive_size":251303,"archive_url":"https://extensions.blender.org/download/sha256:fdc1a528d7808c897d7cf3469b09921a5b29174cfa6293400f82a1cd0eb65efb/add-on-cad-measure-extension-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cad-measure-extension/","maintainer":"Mr.Nobody3d","license":["SPDX:GPL-3.0-or-later"]},{"id":"Bbrush","schema_version":"1.0.0","name":"Bbrush","version":"1.4.9","tagline":"Sculpting using only a pen and keyboard","archive_hash":"sha256:9023336df67d3e06b36a4a3ec2a42ba422ef0735619981623e0afb8aeb20ec79","archive_size":548216,"archive_url":"https://extensions.blender.org/download/sha256:9023336df67d3e06b36a4a3ec2a42ba422ef0735619981623e0afb8aeb20ec79/add-on-bbrush-v1.4.9.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/bbrush/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Keymap file load, View navigation texture load"},"tags":["Sculpt"]},{"id":"geonode_to_shapekey","schema_version":"1.0.0","name":"Geonode To Shapekey","version":"1.2.0","tagline":"Convert geometry nodes to shapekeys. Useful for glTF export","archive_hash":"sha256:f4b3cd3f8cbb88efd704e56fbb15ddf6de088ae8c3e57e4b06091d0457fd7392","archive_size":4974,"archive_url":"https://extensions.blender.org/download/sha256:f4b3cd3f8cbb88efd704e56fbb15ddf6de088ae8c3e57e4b06091d0457fd7392/add-on-geonode-to-shapekey-v1.2.0.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/geonode-to-shapekey/","maintainer":"Jan-Hendrik-Müller","license":["SPDX:GPL-3.0-or-later"],"tags":["Geometry Nodes","Pipeline"]},{"id":"better_bend","schema_version":"1.0.0","name":"Better Bend","version":"1.1.0","tagline":"Cinema 4D-style deformers for Blender","archive_hash":"sha256:a7ce330e85d172706da357cd6291d96663c1a1386c758bcb41a1eb7aa41d1a91","archive_size":4729,"archive_url":"https://extensions.blender.org/download/sha256:a7ce330e85d172706da357cd6291d96663c1a1386c758bcb41a1eb7aa41d1a91/add-on-better-bend-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/better-bend/","maintainer":"Lije.Morgan","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh"]},{"id":"capture_thumbnails_from_viewport","schema_version":"1.0.0","name":"Asset Browser: Capture Thumbnail from Viewport","version":"1.0.3","tagline":"Add new thumbnails for you asset based on the current viewport","archive_hash":"sha256:116dd46abed00a8bbe841a48a5872c48905a79f90a09c8a472c30aa0f13c48f6","archive_size":1759,"archive_url":"https://extensions.blender.org/download/sha256:116dd46abed00a8bbe841a48a5872c48905a79f90a09c8a472c30aa0f13c48f6/add-on-capture-thumbnails-from-viewport-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/capture-thumbnails-from-viewport/","maintainer":"Dan-Gry","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Create a .png in temp folder"},"tags":["Pipeline"]},{"id":"skin_weights_copypaster","schema_version":"1.0.0","name":"Skin Weights Copypaster","version":"0.3.3","tagline":"Copies skin weights from one vertex to selection","archive_hash":"sha256:16d5bcface65447e03e57a4cd169d64b200df2e4ac88a9e7290dbc5e3d9324b3","archive_size":16850,"archive_url":"https://extensions.blender.org/download/sha256:16d5bcface65447e03e57a4cd169d64b200df2e4ac88a9e7290dbc5e3d9324b3/add-on-skin-weights-copypaster-v0.3.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/skin-weights-copypaster/","maintainer":"Ihor-Spasivskyi","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"MAD","schema_version":"1.0.0","name":"MAD (Microphone Audio Driver)","version":"0.1.6","tagline":"Use your Microphone as an Animation Driver in Blender","archive_hash":"sha256:fd2c01fb744c526daa1d1a4020d315cbf2568bd18460d528a3dfb0a4daf3232b","archive_size":663187,"archive_url":"https://extensions.blender.org/download/sha256:fd2c01fb744c526daa1d1a4020d315cbf2568bd18460d528a3dfb0a4daf3232b/add-on-mad-v0.1.6-windows-x64-windows-arm64.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/mad/","maintainer":"F1dg3t","license":["SPDX:GPL-3.0-or-later"],"permissions":{"microphone":"Capture audio input for real-time animation"},"platforms":["windows-x64","windows-arm64"],"tags":["Rigging","Animation"]},{"id":"iocgpoly_lip_sync","schema_version":"1.0.0","name":"Lip Sync","version":"2.3.2","tagline":"Automatic lip sync for your Blender models","archive_hash":"sha256:8c761c89173c714eee0114471ed8f13c99b09a811ec11d7dbbce72a9599024a3","archive_size":37476376,"archive_url":"https://extensions.blender.org/download/sha256:8c761c89173c714eee0114471ed8f13c99b09a811ec11d7dbbce72a9599024a3/add-on-iocgpoly-lip-sync-v2.3.2-windows-x64.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/iocgpoly-lip-sync/","maintainer":"Charley3D","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import Models / Extract libs to disk","network":"Need to download Voices Models to enable lip sync"},"platforms":["windows-x64"],"tags":["Animation","Sequencer"]},{"id":"FakeBones","schema_version":"1.0.0","name":"FakeBones","version":"1.0.7","tagline":"enhance armature visualization","archive_hash":"sha256:1c766ee1bf8f385f3f87169b37b3c2447d5620c59a090ff413da6ee6cd30aed1","archive_size":4158,"archive_url":"https://extensions.blender.org/download/sha256:1c766ee1bf8f385f3f87169b37b3c2447d5620c59a090ff413da6ee6cd30aed1/add-on-fakebones-v1.0.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/fakebones/","maintainer":"maylog","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"Steam","schema_version":"1.0.0","name":"Steam","version":"2.0.0","tagline":"Inspired by the old Steam UI. ","archive_hash":"sha256:06fa0615e3c58a9c12322991164b0133e84214310a9241c70f062e5b5f79ca98","archive_size":5570,"archive_url":"https://extensions.blender.org/download/sha256:06fa0615e3c58a9c12322991164b0133e84214310a9241c70f062e5b5f79ca98/theme-steam-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/steam/","maintainer":"ArtinŌr","license":["SPDX:GPL-2.0-or-later"],"tags":["Inspired By"]},{"id":"AnimCurveSorter","schema_version":"1.0.0","name":"Anim Curve Sorter","version":"1.0.2","tagline":"Easily organise your animation curves","archive_hash":"sha256:2952fa50ce39cdff182259c7041e4a276a7524a73813d2adc75f448c3afa1721","archive_size":17382,"archive_url":"https://extensions.blender.org/download/sha256:2952fa50ce39cdff182259c7041e4a276a7524a73813d2adc75f448c3afa1721/add-on-animcurvesorter-v1.0.2.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/animcurvesorter/","maintainer":"Duncan-Readle","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"ccustomnodes","schema_version":"1.0.0","name":"Object Utility Nodes","version":"1.0.4","tagline":"Custom nodes in new node editor","archive_hash":"sha256:17ae56da737287d2b7ba7c350d5c6697fef15227c45deb45ce46b8abfad81180","archive_size":7115868,"archive_url":"https://extensions.blender.org/download/sha256:17ae56da737287d2b7ba7c350d5c6697fef15227c45deb45ce46b8abfad81180/add-on-ccustomnodes-v1.0.4-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ccustomnodes/","maintainer":"Bitsqueezer","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save colorwheel pictures from/to temp folder"},"platforms":["windows-x64"],"tags":["Node"]},{"id":"easymesh_batch_exporter","schema_version":"1.0.0","name":"EasyMesh Batch Exporter","version":"1.5.0","tagline":"Streamlined mesh export for game development workflows","archive_hash":"sha256:a9cd9781b45a61a0727c6c357efdb2fa80f654cd0ed7b6fe745c68c3eab4bae6","archive_size":84118,"archive_url":"https://extensions.blender.org/download/sha256:a9cd9781b45a61a0727c6c357efdb2fa80f654cd0ed7b6fe745c68c3eab4bae6/add-on-easymesh-batch-exporter-v1.5.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/easymesh-batch-exporter/","maintainer":"spec-arte","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export mesh files to the specified directory"},"tags":["Import-Export"]},{"id":"SuperDuperBatchExporter","schema_version":"1.0.0","name":"Super Duper Batch Exporter","version":"2.7.1","tagline":"One click export to multiple files","archive_hash":"sha256:b059d3638a93664d7c57350a0396f57f9b7aef65a30dc8eb91a51f042793edf6","archive_size":27233,"archive_url":"https://extensions.blender.org/download/sha256:b059d3638a93664d7c57350a0396f57f9b7aef65a30dc8eb91a51f042793edf6/add-on-superduperbatchexporter-v2.7.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/superduperbatchexporter/","maintainer":"BastianLS","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export files to disk & create subdirectories in output directory"},"tags":["Import-Export"]},{"id":"measure_and_scale","schema_version":"1.0.0","name":"Measure and Scale","version":"1.1.6","tagline":"Measure and Scale object uniformaly","archive_hash":"sha256:b62e9e246a90461e15f2a8c74fca1afea39f7364793e284ac73b14b21b23f7e5","archive_size":9679,"archive_url":"https://extensions.blender.org/download/sha256:b62e9e246a90461e15f2a8c74fca1afea39f7364793e284ac73b14b21b23f7e5/add-on-measure-and-scale-v1.1.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/measure-and-scale/","maintainer":"Belaid-ZIANE","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling"]},{"id":"Enhanced_Top_Bar","schema_version":"1.0.0","name":"Enhanced Top Bar","version":"1.0.4","tagline":"Easy access to your ViewLayers rendering properties","archive_hash":"sha256:6cafc46869812bea3791ae4a8c67205e4d88da53f8123826710da58d688150c5","archive_size":6863,"archive_url":"https://extensions.blender.org/download/sha256:6cafc46869812bea3791ae4a8c67205e4d88da53f8123826710da58d688150c5/add-on-enhanced-top-bar-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/enhanced-top-bar/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"Mesh2Rig","schema_version":"1.0.0","name":"Mesh2Rig","version":"2.5.0","tagline":"Transfer simulation, shape keys and other to rig animation","archive_hash":"sha256:5c8623854ee991516160767ee929f214a96e367fa416266866479d133652674a","archive_size":16675,"archive_url":"https://extensions.blender.org/download/sha256:5c8623854ee991516160767ee929f214a96e367fa416266866479d133652674a/add-on-mesh2rig-v2.5.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mesh2rig/","maintainer":"Sporenoe3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Animation","Bake","Game Engine","Pipeline"]},{"id":"Individual_Camera_Properties","schema_version":"1.0.0","name":"Individual Camera Properties","version":"0.0.8","tagline":"Resolution, Scene and Render properties for each camera instance","archive_hash":"sha256:68ed807040c7ee2050fc96ffc7bf5e7acd85c26cd9b42664668aa88ed7021872","archive_size":6710,"archive_url":"https://extensions.blender.org/download/sha256:68ed807040c7ee2050fc96ffc7bf5e7acd85c26cd9b42664668aa88ed7021872/add-on-individual-camera-properties-v0.0.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/individual-camera-properties/","maintainer":"Alexander-Bicukow","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"VSE_SRT_Subtitle_Importer_4_2_extension","schema_version":"1.0.0","name":"SRT Subtitle Importer/Exporter","version":"2.0.0","tagline":"Import/Export SRT subtitle files to/from VSE strips","archive_hash":"sha256:53f5b2f01d444edd210bcee5b14b751807cd855e1f8a4a83423e49c9c6e0fe64","archive_size":7448,"archive_url":"https://extensions.blender.org/download/sha256:53f5b2f01d444edd210bcee5b14b751807cd855e1f8a4a83423e49c9c6e0fe64/add-on-vse-srt-subtitle-importer-4-2-extension-v2.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/vse-srt-subtitle-importer-4-2-extension/","maintainer":"PoYakong","license":["SPDX:GPL-3.0-or-later"],"tags":["Sequencer"]},{"id":"DorchaLiath","schema_version":"1.0.0","name":"Dorcha Liath","version":"5.0.1","tagline":"Dark Grey","archive_hash":"sha256:aba960fe244b919144407a104c23e98037803095bc2856c08c8aef58ffaf326d","archive_size":5206,"archive_url":"https://extensions.blender.org/download/sha256:aba960fe244b919144407a104c23e98037803095bc2856c08c8aef58ffaf326d/theme-dorchaliath-v5.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/dorchaliath/","maintainer":"rory-fly","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"QuickCatalogs","schema_version":"1.0.0","name":"Quick Catalogs ( Asset Browser )","version":"1.0.1","tagline":"Make Asset Catalogs from selected Collections","archive_hash":"sha256:e1722de20f9f40adb186d41b6b86681506b8daa0182c92d2353e213b77bb53c4","archive_size":2298,"archive_url":"https://extensions.blender.org/download/sha256:e1722de20f9f40adb186d41b6b86681506b8daa0182c92d2353e213b77bb53c4/add-on-quickcatalogs-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quickcatalogs/","maintainer":"justOniL","license":["SPDX:GPL-3.0-or-later"],"tags":["Pipeline"]},{"id":"import_export_skin_weights","schema_version":"1.0.0","name":"Import Export Skin Weights","version":"1.0.1","tagline":"Import and export skin weights for Blender","archive_hash":"sha256:248b74f7b176819621f0cd33276070b1ad22c2112f80bfc628045dfea16f6412","archive_size":16987,"archive_url":"https://extensions.blender.org/download/sha256:248b74f7b176819621f0cd33276070b1ad22c2112f80bfc628045dfea16f6412/add-on-import-export-skin-weights-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/import-export-skin-weights/","maintainer":"Nguyen-Phuc-Nguyen","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Import-Export"]},{"id":"menace","schema_version":"1.0.0","name":"Menace","version":"2.0.0","tagline":"The official HugeMenace theme for Blender","archive_hash":"sha256:ecbb9abc2836fe097c57fe9a5212dcc1fc9a80e62a932e477cf3509922f4cd3d","archive_size":5448,"archive_url":"https://extensions.blender.org/download/sha256:ecbb9abc2836fe097c57fe9a5212dcc1fc9a80e62a932e477cf3509922f4cd3d/theme-menace-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/menace/","maintainer":"HugeMenace","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"solid_boot","schema_version":"1.0.0","name":"Solid Boot","version":"1.1.0","tagline":"3D Views loaded in Solid Mode rather Material Preview","archive_hash":"sha256:97801936f20f108a733fff22fb754a65b4f6af115b0e070a999df4fa66de80fa","archive_size":15759,"archive_url":"https://extensions.blender.org/download/sha256:97801936f20f108a733fff22fb754a65b4f6af115b0e070a999df4fa66de80fa/add-on-solid-boot-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/solid-boot/","maintainer":"CosmoMídias","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"neon_nexus","schema_version":"1.0.0","name":"Neon Nexus","version":"1.3.0","tagline":"A futuristic neon theme for Blender","archive_hash":"sha256:604c5dfb99da740289269b626215bedd10bf5190621aa82e15dd940cfa74c59a","archive_size":6154,"archive_url":"https://extensions.blender.org/download/sha256:604c5dfb99da740289269b626215bedd10bf5190621aa82e15dd940cfa74c59a/theme-neon-nexus-v1.3.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/neon-nexus/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","High Contrast"]},{"id":"SaveSelection","schema_version":"1.0.0","name":"Save Selection","version":"1.0.5","tagline":"Save selected objects in Blender Format","archive_hash":"sha256:615594aed9531a69fb49db5f928888886812f5ed83a63974a694a21f0e8f769e","archive_size":3694,"archive_url":"https://extensions.blender.org/download/sha256:615594aed9531a69fb49db5f928888886812f5ed83a63974a694a21f0e8f769e/add-on-saveselection-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/saveselection/","maintainer":"Blenderbob","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"grey_orange","schema_version":"1.0.0","name":"Grey Orange","version":"3.0.2","tagline":"Dark neutral grey theme with orange accents","archive_hash":"sha256:2ec8fdf114eb1122ce48f9c5ced7e91284f606987db1dbaa14087bac316e059a","archive_size":6653,"archive_url":"https://extensions.blender.org/download/sha256:2ec8fdf114eb1122ce48f9c5ced7e91284f606987db1dbaa14087bac316e059a/theme-grey-orange-v3.0.2.zip","type":"theme","blender_version_min":"5.1.0","website":"https://extensions.blender.org/themes/grey-orange/","maintainer":"TimoShch","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"Neutro_Laranja","schema_version":"1.0.0","name":"Neutro Laranja","version":"2.0.0","tagline":"Light and Orange","archive_hash":"sha256:0059799f0f8dcc1d1057362542c2df42d57ab22fa716e060615b0344854b9cf7","archive_size":6441,"archive_url":"https://extensions.blender.org/download/sha256:0059799f0f8dcc1d1057362542c2df42d57ab22fa716e060615b0344854b9cf7/theme-neutro-laranja-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/neutro-laranja/","maintainer":"Push","license":["SPDX:GPL-3.0-or-later"]},{"id":"quickj","schema_version":"1.0.0","name":"Quick J ( Connect Vertex Path )","version":"1.2.0","tagline":"Quickly connect vertices under the cursor","archive_hash":"sha256:4c7a02ff221bd957d9d8be2cadf5519a2bc68adb9ca7960abb5bbe246dab1905","archive_size":2524,"archive_url":"https://extensions.blender.org/download/sha256:4c7a02ff221bd957d9d8be2cadf5519a2bc68adb9ca7960abb5bbe246dab1905/add-on-quickj-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quickj/","maintainer":"justOniL","license":["SPDX:GPL-3.0-or-later"],"tags":["Pipeline"]},{"id":"Batch_Material_Helper","schema_version":"1.0.0","name":"Batch Material Helper","version":"1.0.6","tagline":"Helps you quickly modify materials","archive_hash":"sha256:ce7f2ea29bd087f1f26e882133fd0ebf5212ed14fa547fa6c6bf4288f0d38ca5","archive_size":4099,"archive_url":"https://extensions.blender.org/download/sha256:ce7f2ea29bd087f1f26e882133fd0ebf5212ed14fa547fa6c6bf4288f0d38ca5/add-on-batch-material-helper-v1.0.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/batch-material-helper/","maintainer":"maylog","license":["SPDX:GPL-3.0-or-later"],"tags":["Material"]},{"id":"UV_Flatten_Tool","schema_version":"1.0.0","name":"UV_Flatten_Tool","version":"1.0.7","tagline":"Flatten mesh to active UV coordinates and store as shape key","archive_hash":"sha256:ab3b58a97af9c8c1e7d329be2869bca7c4a714e6d57abf7aa37c80c47a82f16b","archive_size":2774,"archive_url":"https://extensions.blender.org/download/sha256:ab3b58a97af9c8c1e7d329be2869bca7c4a714e6d57abf7aa37c80c47a82f16b/add-on-uv-flatten-tool-v1.0.7.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/uv-flatten-tool/","maintainer":"maylog","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"fractal_family","schema_version":"1.0.0","name":"Fractal Family","version":"1.1.6","tagline":"Create fractal curves with ease using complex integer lattices","archive_hash":"sha256:9b6497b8c5234dd27036654f8dbc1f2807466695ee6bc69aefcc3e30fdb6b570","archive_size":16744,"archive_url":"https://extensions.blender.org/download/sha256:9b6497b8c5234dd27036654f8dbc1f2807466695ee6bc69aefcc3e30fdb6b570/add-on-fractal-family-v1.1.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/fractal-family/","maintainer":"imare32","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Curve"]},{"id":"apply_modifiers_with_shape_keys","schema_version":"1.0.0","name":"Apply modifier with shape keys","version":"1.0.4","tagline":"Applies modifiers on objects even if they have shape keys","archive_hash":"sha256:063ae9bfae007c27e2ba34b3d0a990a6bb68d923af828b1d06510c95972881ab","archive_size":19128,"archive_url":"https://extensions.blender.org/download/sha256:063ae9bfae007c27e2ba34b3d0a990a6bb68d923af828b1d06510c95972881ab/add-on-apply-modifiers-with-shape-keys-v1.0.4.zip","type":"add-on","blender_version_min":"4.3.2","website":"https://extensions.blender.org/add-ons/apply-modifiers-with-shape-keys/","maintainer":"Orange Turbine","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Modeling","Rigging"]},{"id":"animation_transform_offset","schema_version":"1.0.0","name":"Animation Transform Offset","version":"1.0.0","tagline":"Transform objects and offset their animations in one go","archive_hash":"sha256:8b5beb3a69b3a1923a4be6dfbd5089b9cca27fdaa23b035d43508c479dbf58fc","archive_size":15793,"archive_url":"https://extensions.blender.org/download/sha256:8b5beb3a69b3a1923a4be6dfbd5089b9cca27fdaa23b035d43508c479dbf58fc/add-on-animation-transform-offset-v1.0.0.zip","type":"add-on","blender_version_min":"4.3.2","website":"https://extensions.blender.org/add-ons/animation-transform-offset/","maintainer":"softyoda","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"multi_user","schema_version":"1.0.0","name":"Multiuser","version":"0.7.4","tagline":"Enable real-time collaborative workflow inside blender","archive_hash":"sha256:8d3be85891043e403cda5da0f527cb1daf9f3480d753beac683a551abc6fdfef","archive_size":2558933,"archive_url":"https://extensions.blender.org/download/sha256:8d3be85891043e403cda5da0f527cb1daf9f3480d753beac683a551abc6fdfef/add-on-multi-user-v0.7.4-windows-x64.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/multi-user/","maintainer":"slumber","license":["SPDX:GPL-3.0-or-later"],"permissions":{"network":"Need to sync scene data to server"},"platforms":["windows-x64"]},{"id":"references_overlays","schema_version":"1.0.0","name":"References Overlays","version":"2.2.8","tagline":"PureRef for Blender. You can add references in the 3D Viewport","archive_hash":"sha256:2e01d8d844ebfc73e5f290cf8ef02ec80c02542879a82f552962788f6808c010","archive_size":14729,"archive_url":"https://extensions.blender.org/download/sha256:2e01d8d844ebfc73e5f290cf8ef02ec80c02542879a82f552962788f6808c010/add-on-references-overlays-v2.2.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/references-overlays/","maintainer":"KENKEN","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import BMP/TIFF/PNG/JPG/JPEG/GIF/MP4/WEBM from/to disk","clipboard":"Paste image from the Clipboard"},"tags":["3D View","User Interface"]},{"id":"altview","schema_version":"1.0.0","name":"AltView","version":"1.0.1","tagline":"Switch views + lock/unlock rotation","archive_hash":"sha256:ea3678752e8e16cf258ae1eb0a2e0701ca228ae523a0163f8d0dbf030546cb60","archive_size":4561,"archive_url":"https://extensions.blender.org/download/sha256:ea3678752e8e16cf258ae1eb0a2e0701ca228ae523a0163f8d0dbf030546cb60/add-on-altview-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.5","website":"https://extensions.blender.org/add-ons/altview/","maintainer":"Iurii-Tiuzhin","license":["SPDX:GPL-3.0-or-later"]},{"id":"remove_static_fcurves","schema_version":"1.0.0","name":"Remove Static FCurves","version":"0.4.0","tagline":"Clean up animation channels that have no data","archive_hash":"sha256:3cd0f3e31abab7e43f94fe836167b818f5e9de0f62563c635abbf2da976b120d","archive_size":6729,"archive_url":"https://extensions.blender.org/download/sha256:3cd0f3e31abab7e43f94fe836167b818f5e9de0f62563c635abbf2da976b120d/add-on-remove-static-fcurves-v0.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/remove-static-fcurves/","maintainer":"lokimckay","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"paint_system","schema_version":"1.0.0","name":"Paint System","version":"2.1.10","tagline":"Addon for adding painting system to blender","archive_hash":"sha256:fd6c46c5b3182528f6552e2d09ca7524cc491e6e004943b82f3e9c8f108f65d5","archive_size":3880164,"archive_url":"https://extensions.blender.org/download/sha256:fd6c46c5b3182528f6552e2d09ca7524cc491e6e004943b82f3e9c8f108f65d5/add-on-paint-system-v2.1.10.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/paint-system/","maintainer":"Tawan-Sunflower","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Loading and saving images / detecting image editors","network":"Update donation information"},"tags":["Paint"]},{"id":"PlaceHelper","schema_version":"1.0.0","name":"Place Helper","version":"1.3.9","tagline":"Easily place objects in Blender","archive_hash":"sha256:1d9da3b2660df6b81dc31cf34e1dd8bd8daa26fd6fde4048107b0348669248f9","archive_size":69644,"archive_url":"https://extensions.blender.org/download/sha256:1d9da3b2660df6b81dc31cf34e1dd8bd8daa26fd6fde4048107b0348669248f9/add-on-placehelper-v1.3.9.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/placehelper/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Modeling","Object"]},{"id":"headsup_warnings","schema_version":"1.0.0","name":"HeadsUp Warnings","version":"1.1.0","tagline":"Display UI warnings to avoid and resolve common mistakes","archive_hash":"sha256:d4d30ca6d12c48a3bfe4873687817d28351c1eb17768db0687f999f96c880880","archive_size":33611,"archive_url":"https://extensions.blender.org/download/sha256:d4d30ca6d12c48a3bfe4873687817d28351c1eb17768db0687f999f96c880880/add-on-headsup-warnings-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/headsup-warnings/","maintainer":"ManuelLuellau","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Check filepaths to validate if Textures are missing"},"tags":["3D View","Compositing","Render"]},{"id":"unlooped","schema_version":"1.0.0","name":"Unlooped","version":"1.0.1","tagline":"Prevent Blender from looping scene playback","archive_hash":"sha256:a254b5faa77745aa3ec6fbd93cfc02d6933dcc20cd4e9f9fe6c853f937b733f4","archive_size":14253,"archive_url":"https://extensions.blender.org/download/sha256:a254b5faa77745aa3ec6fbd93cfc02d6933dcc20cd4e9f9fe6c853f937b733f4/add-on-unlooped-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/unlooped/","maintainer":"dr.sybren","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"Blend95","schema_version":"1.0.0","name":"Blend95","version":"0.9.8","tagline":"90s, xp, old","archive_hash":"sha256:ef525a7eaa10d1236f4d98da6350c0bc067208326c037a3c0a54d58504b9c1c9","archive_size":6935,"archive_url":"https://extensions.blender.org/download/sha256:ef525a7eaa10d1236f4d98da6350c0bc067208326c037a3c0a54d58504b9c1c9/theme-blend95-v0.9.8.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/blend95/","maintainer":"romanasdf1","license":["SPDX:GPL-3.0-or-later"]},{"id":"Quick_Studio_Light","schema_version":"1.0.0","name":"Quick Studio Light","version":"1.1.3","tagline":"Simple and fast lighting with improved selection","archive_hash":"sha256:2b26bafdae5d3988f0329dd1a66cf7d4de06798cc91ff8266c4dc79c955051d1","archive_size":82518,"archive_url":"https://extensions.blender.org/download/sha256:2b26bafdae5d3988f0329dd1a66cf7d4de06798cc91ff8266c4dc79c955051d1/add-on-quick-studio-light-v1.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-studio-light/","maintainer":"Shuimeng","license":["SPDX:GPL-3.0-or-later"],"tags":["Lighting","3D View"]},{"id":"hyperfy_tools","schema_version":"1.0.0","name":"Hyperfy Tools","version":"1.5.0","tagline":"Tools for creating Hyperfy assets","archive_hash":"sha256:bbf553172d87314a6cf48554155f8e789f9a39cda2d46f5e92155bbf2d2d857e","archive_size":25418,"archive_url":"https://extensions.blender.org/download/sha256:bbf553172d87314a6cf48554155f8e789f9a39cda2d46f5e92155bbf2d2d857e/add-on-hyperfy-tools-v1.5.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/hyperfy-tools/","maintainer":"HowieDuhzit","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export GLB files from/to disk"},"tags":["Physics","Import-Export","3D View","Game Engine","Object"]},{"id":"typst_importer","schema_version":"1.0.0","name":"Typst Importer","version":"0.3.0","tagline":"Render mathematical equations and code blocks","archive_hash":"sha256:e5c2cbe6c07106c97005b6e503a476921a6c87a35272216af2cd0b82c1c1c928","archive_size":25575164,"archive_url":"https://extensions.blender.org/download/sha256:e5c2cbe6c07106c97005b6e503a476921a6c87a35272216af2cd0b82c1c1c928/add-on-typst-importer-v0.3.0-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/typst-importer/","maintainer":"Jan-Hendrik-Müller","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Importing data files from disk"},"platforms":["windows-x64"],"tags":["Geometry Nodes","Import-Export"]},{"id":"node_align","schema_version":"1.0.0","name":"Node Align(节点对齐)","version":"3.2.1","tagline":"Shift+Q|Ctrl+Q Pie menu-Align Nodes in Multiple Ways(多种方式对齐节点)","archive_hash":"sha256:26edd1b46ecc3fe504ff144369921bd3ac87fbd68f3eef241b053cefba728997","archive_size":23590,"archive_url":"https://extensions.blender.org/download/sha256:26edd1b46ecc3fe504ff144369921bd3ac87fbd68f3eef241b053cefba728997/add-on-node-align-v3.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-align/","maintainer":"W_Cloud","license":["SPDX:GPL-3.0-or-later"],"tags":["Node"]},{"id":"gp_tween","schema_version":"1.0.0","name":"GP Tween (c)","version":"2.4.0","tagline":"Quick Grease Pencil Tweening","archive_hash":"sha256:c5990e9a2ae583535ea2179e225effa84ea7e11a8870cd3c390dc75773116e25","archive_size":169988,"archive_url":"https://extensions.blender.org/download/sha256:c5990e9a2ae583535ea2179e225effa84ea7e11a8870cd3c390dc75773116e25/add-on-gp-tween-v2.4.0.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/gp-tween/","maintainer":"cosmosmythos","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write GP Tween nodegroup asset from/to disk","clipboard":"Copy and Paste GP Tween nodegroup"},"tags":["Grease Pencil","Animation","Geometry Nodes"]},{"id":"time_tracker","schema_version":"1.0.0","name":"Time Tracker","version":"0.2.4","tagline":"This extension tracks your time spent in blend files","archive_hash":"sha256:69178cd1c0f07232a68f85724b0f76e005d221c18a0e466619f49ac957bd87b9","archive_size":23923,"archive_url":"https://extensions.blender.org/download/sha256:69178cd1c0f07232a68f85724b0f76e005d221c18a0e466619f49ac957bd87b9/add-on-time-tracker-v0.2.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/time-tracker/","maintainer":"PhinDev","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save timing data to disk"},"tags":["System"]},{"id":"simple_audio_visualizer","schema_version":"1.0.0","name":"Simple Audio Visualizer","version":"1.2.0","tagline":"Creates a simple audio visualizer","archive_hash":"sha256:311d38d93b5734290ea4e3cb8d5f8ddc8a757ea4376bcf8fa56d183daed76190","archive_size":6391,"archive_url":"https://extensions.blender.org/download/sha256:311d38d93b5734290ea4e3cb8d5f8ddc8a757ea4376bcf8fa56d183daed76190/add-on-simple-audio-visualizer-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/simple-audio-visualizer/","maintainer":"Polyfjord","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import audio from disk"},"tags":["Animation"]},{"id":"easy_clouds","schema_version":"1.0.0","name":"Easy Clouds","version":"2.2.0","tagline":"Procedural clouds that are easy to customize","archive_hash":"sha256:98f8d4ca22c8e8a0ec85e0ad98f0d681fedd8c7f346766a8fb53aa69207eb2fd","archive_size":10614,"archive_url":"https://extensions.blender.org/download/sha256:98f8d4ca22c8e8a0ec85e0ad98f0d681fedd8c7f346766a8fb53aa69207eb2fd/add-on-easy-clouds-v2.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/easy-clouds/","maintainer":"LunarKitten","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","Add Mesh","Node"]},{"id":"MustardSimplify","schema_version":"1.0.0","name":"Mustard Simplify","version":"2025.4.1","tagline":"Tool to simplify scenes for improved viewport performance","archive_hash":"sha256:13e259e69cd0b5187fdf44d66c8dd9108b8ea96f1011c68ca5d29a23848951e1","archive_size":42341,"archive_url":"https://extensions.blender.org/download/sha256:13e259e69cd0b5187fdf44d66c8dd9108b8ea96f1011c68ca5d29a23848951e1/add-on-mustardsimplify-v2025.4.1.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/mustardsimplify/","maintainer":"Mustard","license":["SPDX:GPL-3.0-or-later"],"tags":["Scene"]},{"id":"QuickTools_v3","schema_version":"1.0.0","name":"Grease Pencil QuickTools_v3","version":"1.1.5","tagline":"Grease Pencil Toobar in N sidebar with auto mode switch","archive_hash":"sha256:566feddd3ffbe0628772f24be8c819b7aa40ce1a0dbd3ed24526e5a69d36a8a3","archive_size":53225,"archive_url":"https://extensions.blender.org/download/sha256:566feddd3ffbe0628772f24be8c819b7aa40ce1a0dbd3ed24526e5a69d36a8a3/add-on-quicktools-v3-v1.1.5.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/quicktools-v3/","maintainer":"PongBuster","license":["SPDX:GPL-3.0-or-later"],"tags":["Grease Pencil"]},{"id":"named_attribute_list","schema_version":"1.0.0","name":"Named Attribute List(命名属性列表)","version":"2.8.2","tagline":"Quickly Add Attribute Node in GN and Shader(几何节点和材质里快速添加属性节点)","archive_hash":"sha256:e7291be67f8c4f96f80166a43b8697db2ea70c2c0826e81741f3421905931772","archive_size":98415,"archive_url":"https://extensions.blender.org/download/sha256:e7291be67f8c4f96f80166a43b8697db2ea70c2c0826e81741f3421905931772/add-on-named-attribute-list-v2.8.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/named-attribute-list/","maintainer":"W_Cloud","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Geometry Nodes"]},{"id":"CurveFitting","schema_version":"1.0.0","name":"Curve Fitting","version":"0.3.0","tagline":"Smooth out uneven vertex arrangements keeping original shape","archive_hash":"sha256:4c39752087fdab6108589e4506824701cf6d352f32e6be8f66891362bd382e9a","archive_size":22449,"archive_url":"https://extensions.blender.org/download/sha256:4c39752087fdab6108589e4506824701cf6d352f32e6be8f66891362bd382e9a/add-on-curvefitting-v0.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/curvefitting/","maintainer":"zuda77","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"Utilities_Gadget","schema_version":"1.0.0","name":"Utilities Gadget","version":"1.1.5","tagline":"Batch rendering and model conversio","archive_hash":"sha256:9a56ba155f59e292d1769e1ac3cd3eb641cc9013ead197853fa398757be9d6bc","archive_size":6095,"archive_url":"https://extensions.blender.org/download/sha256:9a56ba155f59e292d1769e1ac3cd3eb641cc9013ead197853fa398757be9d6bc/add-on-utilities-gadget-v1.1.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/utilities-gadget/","maintainer":"HurcaGuari","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"bbone_Tools","schema_version":"1.0.0","name":"the bendybones toolkit","version":"1.6.0","tagline":"a simple toolkit for rigging with bendybones","archive_hash":"sha256:a5560c8e61a605354ae65519f983ac19636fcdcebc5f781bde727d58e7906a79","archive_size":4337,"archive_url":"https://extensions.blender.org/download/sha256:a5560c8e61a605354ae65519f983ac19636fcdcebc5f781bde727d58e7906a79/add-on-bbone-tools-v1.6.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bbone-tools/","maintainer":"Felipe-G","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"viewtools","schema_version":"1.0.0","name":"ViewTools","version":"1.0.0","tagline":"Essential Viewport tools for industrial workflows","archive_hash":"sha256:1d9bb6ed90fc9f289b34e63efb833acb370dd6aaed98a19183c13598236a8922","archive_size":4857,"archive_url":"https://extensions.blender.org/download/sha256:1d9bb6ed90fc9f289b34e63efb833acb370dd6aaed98a19183c13598236a8922/add-on-viewtools-v1.0.0.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/viewtools/","maintainer":"Ishara-Sandeepa","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","User Interface","Mesh","Object"]},{"id":"Coloraide","schema_version":"1.0.0","name":"Coloraide","version":"1.5.1","tagline":"Advanced color picking and color management tools","archive_hash":"sha256:fa5bd04b137b323589d0d5a344d554a52aaff0611bdfeec2611a9c8e4da015ad","archive_size":75163,"archive_url":"https://extensions.blender.org/download/sha256:fa5bd04b137b323589d0d5a344d554a52aaff0611bdfeec2611a9c8e4da015ad/add-on-coloraide-v1.5.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/coloraide/","maintainer":"longiy","license":["SPDX:GPL-3.0-or-later"],"tags":["Paint","Grease Pencil","3D View"]},{"id":"persiantype","schema_version":"1.0.0","name":"Persian type","version":"2.0.1","tagline":"Add Persian/Arabic type directly to Blender","archive_hash":"sha256:f519fd2e627f369686c5b9272526326b5cfb37e2555deb39f1a17299b8f1cb9e","archive_size":1952767,"archive_url":"https://extensions.blender.org/download/sha256:f519fd2e627f369686c5b9272526326b5cfb37e2555deb39f1a17299b8f1cb9e/add-on-persiantype-v2.0.1.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/persiantype/","maintainer":"Damyar","license":["SPDX:GPL-3.0-or-later"]},{"id":"group_input_helper","schema_version":"1.0.0","name":"Group input helper(节点组输入助手)","version":"2.9.5","tagline":"Qucik add/split/merge Group Input node/socket(快速添加拆分合并移动组输入节点接口)","archive_hash":"sha256:4a3215e785b9a1f37faad85c303fab1c079c61c4434c4dc3fdeef4a9f26add9e","archive_size":76003,"archive_url":"https://extensions.blender.org/download/sha256:4a3215e785b9a1f37faad85c303fab1c079c61c4434c4dc3fdeef4a9f26add9e/add-on-group-input-helper-v2.9.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/group-input-helper/","maintainer":"W_Cloud","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Geometry Nodes"]},{"id":"shutdown_after_render","schema_version":"1.0.0","name":"Shutdown after render","version":"0.4.0","tagline":"Automatically shuts down your PC after your render finishes","archive_hash":"sha256:d7dc0b029145c7411cf660ca67d4909104ea13f3fc8bec2474dc5a8942479f1a","archive_size":4087,"archive_url":"https://extensions.blender.org/download/sha256:d7dc0b029145c7411cf660ca67d4909104ea13f3fc8bec2474dc5a8942479f1a/add-on-shutdown-after-render-v0.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shutdown-after-render/","maintainer":"David-Bühler","license":["SPDX:GPL-3.0-or-later"],"tags":["System"]},{"id":"io_scene_pod","schema_version":"1.0.0","name":"UbiSoft Pod formats","version":"0.34.0","tagline":"Import-Export Pod tracks, ghosts, images, and cars","archive_hash":"sha256:f1cbbc62328176590533cc79db64b475b1fc60809afa87d753ac1b0544d9bf21","archive_size":7255923,"archive_url":"https://extensions.blender.org/download/sha256:f1cbbc62328176590533cc79db64b475b1fc60809afa87d753ac1b0544d9bf21/add-on-io-scene-pod-v0.34.0-windows-x64.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/io-scene-pod/","maintainer":"Syroot","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Import-Export","Scene"]},{"id":"has_paint_layers","schema_version":"1.0.0","name":"HAS Paint Layers","version":"0.8.93","tagline":"Layers for texture painting","archive_hash":"sha256:d768c479f5d60b9eba58555db5a1d9d7ff29c402f8b4f7418d5ad34d3c790255","archive_size":68078,"archive_url":"https://extensions.blender.org/download/sha256:d768c479f5d60b9eba58555db5a1d9d7ff29c402f8b4f7418d5ad34d3c790255/add-on-has-paint-layers-v0.8.93.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/has-paint-layers/","maintainer":"Hirourk","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Store temporary images"},"tags":["Paint","Bake"]},{"id":"shapekey_keeper","schema_version":"1.0.0","name":"SKkeeper","version":"1.8.2","tagline":"Applies modifiers while keeping shapekeys and drivers","archive_hash":"sha256:4a02b8366b5b251b36b03b397781572b5ce60e12900d869a419b8969cd1cc678","archive_size":20217,"archive_url":"https://extensions.blender.org/download/sha256:4a02b8366b5b251b36b03b397781572b5ce60e12900d869a419b8969cd1cc678/add-on-shapekey-keeper-v1.8.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shapekey-keeper/","maintainer":"Nidus","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"datablock_utils","schema_version":"1.0.0","name":"Data-Block Utilities","version":"1.3.0","tagline":"Show users, merge duplicates, find similar, and more","archive_hash":"sha256:ecbfa6cc02cb6620059c2cac9e6b109532b5626690f5562ac8a1b366412349c1","archive_size":1740275,"archive_url":"https://extensions.blender.org/download/sha256:ecbfa6cc02cb6620059c2cac9e6b109532b5626690f5562ac8a1b366412349c1/add-on-datablock-utils-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/datablock-utils/","maintainer":"Leonardo-Pike-Excell","license":["SPDX:GPL-3.0-or-later"],"tags":["Scene","System"]},{"id":"ambientcg_material_importer","schema_version":"1.0.0","name":"AmbientCG Material Importer","version":"1.4.0","tagline":"One-click material creation from AmbientCG","archive_hash":"sha256:83f901d2671ad425d1a2251ca7ed74a02a4ad87b0870b14a82bb04b76079a082","archive_size":4167,"archive_url":"https://extensions.blender.org/download/sha256:83f901d2671ad425d1a2251ca7ed74a02a4ad87b0870b14a82bb04b76079a082/add-on-ambientcg-material-importer-v1.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ambientcg-material-importer/","maintainer":"Nino-Filiu","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import and cache textures to disk","network":"Makes calls to AmbientCG"},"tags":["Import-Export","Material"]},{"id":"cursor_plus","schema_version":"1.0.0","name":"3D Cursor Plus","version":"1.0.4","tagline":"Axes, undo and few other tools for your 3D Cursor","archive_hash":"sha256:e4f35c9732aa75a941cce0bb25ba82a1c606239bef60513a30bf2339f0c24a47","archive_size":79566,"archive_url":"https://extensions.blender.org/download/sha256:e4f35c9732aa75a941cce0bb25ba82a1c606239bef60513a30bf2339f0c24a47/add-on-cursor-plus-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cursor-plus/","maintainer":"chokavr","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save/Load gizmo presets and Pie menu configuration"},"tags":["3D View"]},{"id":"two_point_perspective","schema_version":"1.0.0","name":"Two-Point Perspective","version":"0.0.2","tagline":"Replaces the active camera with a two-point perspective one","archive_hash":"sha256:5b6e59e62df8879f4341f242cd3a4488dc0fe441f80385a23915d6a3fcb1b3bd","archive_size":17509,"archive_url":"https://extensions.blender.org/download/sha256:5b6e59e62df8879f4341f242cd3a4488dc0fe441f80385a23915d6a3fcb1b3bd/add-on-two-point-perspective-v0.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/two-point-perspective/","maintainer":"Athina-Syntychaki","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"Grid_Dimensions","schema_version":"1.0.0","name":"Grid Dimensions/网格标注","version":"1.1.2","tagline":"Grid Dimensions/网格标注","archive_hash":"sha256:1f61463cc6ea7a08297e7c7b6f268eba1a0240c07b2912628fcd4a1b5bb14053","archive_size":34880,"archive_url":"https://extensions.blender.org/download/sha256:1f61463cc6ea7a08297e7c7b6f268eba1a0240c07b2912628fcd4a1b5bb14053/add-on-grid-dimensions-v1.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/grid-dimensions/","maintainer":"Shuimeng","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"mpfb","schema_version":"1.0.0","name":"MPFB","version":"2.0.14","tagline":"Human character generator and editor","archive_hash":"sha256:c0484d4f74e468262897b575e6535f3d2b14ebb44b68b0b79e5b9121f632e504","archive_size":44911109,"archive_url":"https://extensions.blender.org/download/sha256:c0484d4f74e468262897b575e6535f3d2b14ebb44b68b0b79e5b9121f632e504/add-on-mpfb-v2.0.14.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mpfb/","maintainer":"Joel-Palmius","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load and save data","network":"(optional) Interact with local instance of MakeHuman"},"tags":["Add Mesh","Rigging"]},{"id":"motion_inspector","schema_version":"1.0.0","name":"Motion inspector","version":"0.2.9","tagline":"Inspect F-Curves and animated object movement","archive_hash":"sha256:693f63eb2e2f8bb04e8dbe703dfd7dd1404026ce5dbe2474fe25eae06381db53","archive_size":4834,"archive_url":"https://extensions.blender.org/download/sha256:693f63eb2e2f8bb04e8dbe703dfd7dd1404026ce5dbe2474fe25eae06381db53/add-on-motion-inspector-v0.2.9.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/motion-inspector/","maintainer":"Chalouek-RGBit","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","3D View"]},{"id":"modern_primitive","schema_version":"1.0.0","name":"Modern Primitive","version":"0.0.51","tagline":"Modern Primitive for Non-Destructive Modeling","archive_hash":"sha256:04458354e346165f3ea8dbf00f994a2ef173a97285fe4ceb065ec6d3def7d5a6","archive_size":3422896,"archive_url":"https://extensions.blender.org/download/sha256:04458354e346165f3ea8dbf00f994a2ef173a97285fe4ceb065ec6d3def7d5a6/add-on-modern-primitive-v0.0.51.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/modern-primitive/","maintainer":"Degarashi","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import Geometry-Node from Add-on Directory"},"tags":["Add Mesh","Modeling"]},{"id":"greasepencil_nudge_frames","schema_version":"1.0.0","name":"Grease Pencil Nudge Frames","version":"0.1.1","tagline":"Modify exposure in the dopesheet with D/F","archive_hash":"sha256:935857f93894275c01154fbf40ac769f5430fdcf5737315d9f84a2aef9922c6f","archive_size":1738,"archive_url":"https://extensions.blender.org/download/sha256:935857f93894275c01154fbf40ac769f5430fdcf5737315d9f84a2aef9922c6f/add-on-greasepencil-nudge-frames-v0.1.1.zip","type":"add-on","blender_version_min":"4.3.1","website":"https://extensions.blender.org/add-ons/greasepencil-nudge-frames/","maintainer":"bergamote","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Grease Pencil"]},{"id":"Non_Destructive_Primitives","schema_version":"1.0.0","name":"ND Primitives","version":"0.2.46","tagline":"Non-Destructive Parametric Primitives in Blender","archive_hash":"sha256:7be2a39d184c099018628d93580fec929a192f3a367d3eb332dbc8231eb8d4f8","archive_size":290494,"archive_url":"https://extensions.blender.org/download/sha256:7be2a39d184c099018628d93580fec929a192f3a367d3eb332dbc8231eb8d4f8/add-on-non-destructive-primitives-v0.2.46.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/non-destructive-primitives/","maintainer":"Dan-Gry","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import Geometry Nodes Objects from Add-on Folder"},"tags":["Modeling","Add Mesh"]},{"id":"node_pinyin","schema_version":"1.0.0","name":"szm/首字母","version":"1.2.0","tagline":"Enable node and modifier search with PinYin/支持节点和修改器的中文拼音搜索","archive_hash":"sha256:f94b8f609474f189ed0735335f7503d47679c8a76ef7ba1be1efeaa169edd3fe","archive_size":40672,"archive_url":"https://extensions.blender.org/download/sha256:f94b8f609474f189ed0735335f7503d47679c8a76ef7ba1be1efeaa169edd3fe/add-on-node-pinyin-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-pinyin/","maintainer":"Xinyu-Zhu","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","User Interface"]},{"id":"proto_game_asset_tools","schema_version":"1.0.0","name":"PROTO Game Asset Tools","version":"2.1.0","tagline":"Tools for game assets, improved export for Unreal, Unity, Godot","archive_hash":"sha256:89a6c88047c3065ee89bbdb569cb2a91a086a4247e7103761d3f53d4f74fe1b4","archive_size":82900,"archive_url":"https://extensions.blender.org/download/sha256:89a6c88047c3065ee89bbdb569cb2a91a086a4247e7103761d3f53d4f74fe1b4/add-on-proto-game-asset-tools-v2.1.0.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.2.0","website":"https://extensions.blender.org/add-ons/proto-game-asset-tools/","maintainer":"PROTOWLF","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export FBX to disk","clipboard":"Copy and paste data"},"tags":["Import-Export","Game Engine"]},{"id":"b_subeditor","schema_version":"1.0.0","name":"B SubEditor","version":"1.0.1","tagline":"Sync subtitles in Text Editor/VSE","archive_hash":"sha256:ecf1dd66d0d2812603227a549d07efe010749e17149f7c3c247b07fa68f3cf5d","archive_size":6393,"archive_url":"https://extensions.blender.org/download/sha256:ecf1dd66d0d2812603227a549d07efe010749e17149f7c3c247b07fa68f3cf5d/add-on-b-subeditor-v1.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/b-subeditor/","maintainer":"Dinesh007","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Requires access to directory with subtitle files"},"tags":["Sequencer","Text Editor","Import-Export"]},{"id":"b_Unicode","schema_version":"1.0.0","name":"B Unicode","version":"1.0.2","tagline":"Access Unicode characters","archive_hash":"sha256:f137e679b67d3dbcd4df6898970484ccad7b89ddc9c43089b980d5a5fbb4819e","archive_size":5304,"archive_url":"https://extensions.blender.org/download/sha256:f137e679b67d3dbcd4df6898970484ccad7b89ddc9c43089b980d5a5fbb4819e/add-on-b-unicode-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/b-unicode/","maintainer":"Dinesh007","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Sequencer","Text Editor"]},{"id":"sco_edgewise","schema_version":"1.0.0","name":"SCO EdgeWise","version":"2.0.3","tagline":"Measure distances, edge lengths, and angles in Edit Mode","archive_hash":"sha256:ef2ce3e214fe26b22ea97acd79d64dc11427aa4e9acd35606b66f104b54d059a","archive_size":137778,"archive_url":"https://extensions.blender.org/download/sha256:ef2ce3e214fe26b22ea97acd79d64dc11427aa4e9acd35606b66f104b54d059a/add-on-sco-edgewise-v2.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sco-edgewise/","maintainer":"BEAST_of_BURDEN","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"font_selector","schema_version":"1.0.0","name":"Font Selector","version":"3.2.2","tagline":"Browse available fonts from blender","archive_hash":"sha256:6f2006ea677059102fc7265f5dd0d9149ba80b93cbcef7d09d06aade32fda3c6","archive_size":1183546,"archive_url":"https://extensions.blender.org/download/sha256:6f2006ea677059102fc7265f5dd0d9149ba80b93cbcef7d09d06aade32fda3c6/add-on-font-selector-v3.2.2.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/font-selector/","maintainer":"tonton_","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Reading and writing json preset files, Reading font files"},"tags":["Import-Export","System"]},{"id":"vertex_overlap","schema_version":"1.0.0","name":"Vertex Overlap","version":"1.1.0","tagline":"Alerts you to overlapping vertices in real-time","archive_hash":"sha256:0c281759e0e4e627b5a6d9f1a134391a04e1a944746ef8472186cf7416eb6f14","archive_size":17220,"archive_url":"https://extensions.blender.org/download/sha256:0c281759e0e4e627b5a6d9f1a134391a04e1a944746ef8472186cf7416eb6f14/add-on-vertex-overlap-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/vertex-overlap/","maintainer":"Shawn-Shipley","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"quick_resolution_setup","schema_version":"1.0.0","name":"Quick Resolution Setup","version":"1.1.0","tagline":"Quick Resolution Setup","archive_hash":"sha256:e90bfb222c33399c8569dc67819d677bca9a5e3cca2c881a8968013e948e40ea","archive_size":23899,"archive_url":"https://extensions.blender.org/download/sha256:e90bfb222c33399c8569dc67819d677bca9a5e3cca2c881a8968013e948e40ea/add-on-quick-resolution-setup-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-resolution-setup/","maintainer":"Hades-Su","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","Render"]},{"id":"audio_notifier","schema_version":"1.0.0","name":"Audio Notifier","version":"1.0.5","tagline":"Audio notifications for success, cancel and warning","archive_hash":"sha256:c268571786d940171942d5e747c1c3424a5d02c184600d11704a8a46b5199541","archive_size":36990,"archive_url":"https://extensions.blender.org/download/sha256:c268571786d940171942d5e747c1c3424a5d02c184600d11704a8a46b5199541/add-on-audio-notifier-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/audio-notifier/","maintainer":"Lauloque","license":["SPDX:GPL-3.0-or-later"],"tags":["System"]},{"id":"k_tools_mode_highlight","schema_version":"1.0.0","name":"K-Tools: Mode Highlight","version":"1.0.8","tagline":"Automatically change the header color based on the current mode","archive_hash":"sha256:7d1e680b0b1d313a1e874bd7f3b1c45503c1207f402da26284cbfddc1426c212","archive_size":4666,"archive_url":"https://extensions.blender.org/download/sha256:7d1e680b0b1d313a1e874bd7f3b1c45503c1207f402da26284cbfddc1426c212/add-on-k-tools-mode-highlight-v1.0.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/k-tools-mode-highlight/","maintainer":"Robert-Kezives","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"xray_selection_tools","schema_version":"1.0.0","name":"X-Ray Selection Tools","version":"4.9.2","tagline":"Box, lasso and circle selection tools with x-ray","archive_hash":"sha256:61acc015891760d42008f94fa7d75d119c0efb1d11e9683cd22136204ed418e8","archive_size":85983,"archive_url":"https://extensions.blender.org/download/sha256:61acc015891760d42008f94fa7d75d119c0efb1d11e9683cd22136204ed418e8/add-on-xray-selection-tools-v4.9.2.zip","type":"add-on","blender_version_min":"4.5.2","website":"https://extensions.blender.org/add-ons/xray-selection-tools/","maintainer":"MarshmallowCirno","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"autokey_highlight","schema_version":"1.0.0","name":"Autokey Highlight","version":"1.0.7","tagline":"Highlights the viewport when autokey is enabled","archive_hash":"sha256:3b250ef260551db38a91e00e8a605747260c47798b1db8a2dffb8fcd8c8fa6e8","archive_size":3186,"archive_url":"https://extensions.blender.org/download/sha256:3b250ef260551db38a91e00e8a605747260c47798b1db8a2dffb8fcd8c8fa6e8/add-on-autokey-highlight-v1.0.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/autokey-highlight/","maintainer":"Lauloque","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","3D View","System"]},{"id":"math_formula","schema_version":"1.0.0","name":"Math Formula","version":"2.2.0","tagline":"Quickly add nodes by typing in a formula","archive_hash":"sha256:9b2cc23847f84b3830e5c9be2d8d5e98904eed0d0f255e69bb14e60d22caba27","archive_size":360600,"archive_url":"https://extensions.blender.org/download/sha256:9b2cc23847f84b3830e5c9be2d8d5e98904eed0d0f255e69bb14e60d22caba27/add-on-math-formula-v2.2.0.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/math-formula/","maintainer":"WannesMalfait","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Loading and writing custom implementations","clipboard":"Pasting formulas from clipboard"},"tags":["Node"]},{"id":"EdgeFlow","schema_version":"1.0.0","name":"EdgeFlow","version":"1.1.2","tagline":"Helps adjusting mesh geometry to curved surfaces","archive_hash":"sha256:4fa53590a837813c72dc9ed0a416f8e3de61352abb262b461974cd9f7092b1c1","archive_size":34350,"archive_url":"https://extensions.blender.org/download/sha256:4fa53590a837813c72dc9ed0a416f8e3de61352abb262b461974cd9f7092b1c1/add-on-edgeflow-v1.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/edgeflow/","maintainer":"Benjamin-Sauder","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"NLATools","schema_version":"1.0.0","name":"Merge NLA Strips","version":"1.2.0","tagline":"Combine selected NLA strips into one","archive_hash":"sha256:fb71b63b597aa5998c41387cb24ccb78fed7944a43e80418f959080090a4d276","archive_size":4416,"archive_url":"https://extensions.blender.org/download/sha256:fb71b63b597aa5998c41387cb24ccb78fed7944a43e80418f959080090a4d276/add-on-nlatools-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nlatools/","maintainer":"Likkez","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Bake"]},{"id":"LightHepler","schema_version":"1.0.0","name":"Light Helper","version":"0.4.6","tagline":"Light Helper","archive_hash":"sha256:a99c5697ffcb22e6d7a64cd17d353137206b38b707519f03afcaa23933ba214d","archive_size":20722,"archive_url":"https://extensions.blender.org/download/sha256:a99c5697ffcb22e6d7a64cd17d353137206b38b707519f03afcaa23933ba214d/add-on-lighthepler-v0.4.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/lighthepler/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"tags":["Lighting"]},{"id":"lattice_helper","schema_version":"1.0.0","name":"Lattice Helper","version":"1.2.5","tagline":"Apply Lattice modifier to object(s) in object/edit mode","archive_hash":"sha256:f55bbabd50eef367d05158fbd122b93c2dacb47732d871f4e67455aafd3259c4","archive_size":12464,"archive_url":"https://extensions.blender.org/download/sha256:f55bbabd50eef367d05158fbd122b93c2dacb47732d871f4e67455aafd3259c4/add-on-lattice-helper-v1.2.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/lattice-helper/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh","Object"]},{"id":"color_randomizer","schema_version":"1.0.0","name":"Color Randomizer","version":"1.3.0","tagline":"Randomly assign colors to objects","archive_hash":"sha256:08820b85193be83b338634efc1e941a944b1666273b9b052771d88f667477944","archive_size":10414,"archive_url":"https://extensions.blender.org/download/sha256:08820b85193be83b338634efc1e941a944b1666273b9b052771d88f667477944/add-on-color-randomizer-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/color-randomizer/","maintainer":"ilumetric","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"lumos","schema_version":"1.0.0","name":"Lumos","version":"3.2.2","tagline":"Bring your lighting to the next level","archive_hash":"sha256:65420e29fe19c6213415f0091bb28b5e3e41d238d9062042157fd286a2cef8ef","archive_size":40153,"archive_url":"https://extensions.blender.org/download/sha256:65420e29fe19c6213415f0091bb28b5e3e41d238d9062042157fd286a2cef8ef/add-on-lumos-v3.2.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/lumos/","maintainer":"Eqkoss","license":["SPDX:GPL-3.0-or-later"],"tags":["Lighting","3D View"]},{"id":"rmKit","schema_version":"1.0.0","name":"rmKit","version":"1.0.13","tagline":"Tools and Utils for Modeling and GameWorkflows","archive_hash":"sha256:25c336e8ad89518cb70c7a460ec07fa94d14bd7ebd6170974817d3ee3240b92c","archive_size":83033,"archive_url":"https://extensions.blender.org/download/sha256:25c336e8ad89518cb70c7a460ec07fa94d14bd7ebd6170974817d3ee3240b92c/add-on-rmkit-v1.0.13.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/rmkit/","maintainer":"Timothee-Yeramian","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Modeling","Mesh","Object","Material"]},{"id":"Duplication_Tool_addon","schema_version":"1.0.0","name":"Duplication Tool","version":"1.0.2","tagline":"Create copies with incremental names and materials","archive_hash":"sha256:691aedb7c878f624519c697a6502fb9fe7ecc7c2f258d3c9ca34ded0c2ff2864","archive_size":3052,"archive_url":"https://extensions.blender.org/download/sha256:691aedb7c878f624519c697a6502fb9fe7ecc7c2f258d3c9ca34ded0c2ff2864/add-on-duplication-tool-addon-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/duplication-tool-addon/","maintainer":"Vinay-chikkam","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","System"]},{"id":"node_runner","schema_version":"1.0.0","name":"Node Runner","version":"1.3.9","tagline":"Import and export nodes as strings","archive_hash":"sha256:ec7a80ff5105f9b5c638b840f48c37b9fd71dccb5f686d9b0fec05ede7ee5d92","archive_size":40616,"archive_url":"https://extensions.blender.org/download/sha256:ec7a80ff5105f9b5c638b840f48c37b9fd71dccb5f686d9b0fec05ede7ee5d92/add-on-node-runner-v1.3.9.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/node-runner/","maintainer":"Noah-Thiering","license":["SPDX:GPL-3.0-or-later"],"permissions":{"clipboard":"Copy Node Runner Hash to clipboard"},"tags":["Node","Material","Geometry Nodes"]},{"id":"sakura_poselib","schema_version":"1.0.0","name":"Sakura Poselib","version":"1.4.4","tagline":"Yet another Pose Library with handful features","archive_hash":"sha256:09a1c37cb2ef33976df34d8629bd0b33ec2e734eb916093128ed0f6dc060102e","archive_size":56108,"archive_url":"https://extensions.blender.org/download/sha256:09a1c37cb2ef33976df34d8629bd0b33ec2e734eb916093128ed0f6dc060102e/add-on-sakura-poselib-v1.4.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sakura-poselib/","maintainer":"Kafuji","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save/Load Poselib data as Json or CSV"},"tags":["Animation"]},{"id":"audio_exporter","schema_version":"1.0.0","name":"Audio Exporter","version":"1.1.0","tagline":"Export audio separate or combined files in VSE","archive_hash":"sha256:4154a825f0d4ffb9b0d47f400bc8c2b6880e853510ad93650bc598c63c9a14be","archive_size":6145,"archive_url":"https://extensions.blender.org/download/sha256:4154a825f0d4ffb9b0d47f400bc8c2b6880e853510ad93650bc598c63c9a14be/add-on-audio-exporter-v1.1.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/audio-exporter/","maintainer":"Dinesh007","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Requires access to directory where it exports audio files"},"tags":["Sequencer"]},{"id":"Shadingplus","schema_version":"1.0.0","name":"Shading +","version":"1.1.2","tagline":"Shading pie for designers and artists","archive_hash":"sha256:46039745f70f4f3bbe2ff5bdfc3acbbd350bc0afb5fcecfdf2e84fefa811c8b8","archive_size":50492480,"archive_url":"https://extensions.blender.org/download/sha256:46039745f70f4f3bbe2ff5bdfc3acbbd350bc0afb5fcecfdf2e84fefa811c8b8/add-on-shadingplus-v1.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shadingplus/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"caustics_baking_addon","schema_version":"1.0.0","name":"Caustics_Baking","version":"3.2.1","tagline":"Caustics Baking with Cycles","archive_hash":"sha256:fa48d2b46ecbed96225423524e8faee3dbc6752f9b8a6a6d8e9a9e56205ff32e","archive_size":42951,"archive_url":"https://extensions.blender.org/download/sha256:fa48d2b46ecbed96225423524e8faee3dbc6752f9b8a6a6d8e9a9e56205ff32e/add-on-caustics-baking-addon-v3.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/caustics-baking-addon/","maintainer":"Benary","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"export images to disk"},"tags":["Bake","Lighting"]},{"id":"brushstroke_tools","schema_version":"1.0.0","name":"Brushstroke Tools","version":"1.2.1","tagline":"Brushstroke painting tools by the Blender Studio","archive_hash":"sha256:1a14a49e8c80e0c349dbb624859106e503eb94bc2506c4057f9d0cd1a45edbf2","archive_size":29637686,"archive_url":"https://extensions.blender.org/download/sha256:1a14a49e8c80e0c349dbb624859106e503eb94bc2506c4057f9d0cd1a45edbf2/add-on-brushstroke-tools-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/brushstroke-tools/","maintainer":"Blender Studio","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write brushstroke asset resources from/to disk"},"tags":["Paint","Geometry Nodes","Material"]},{"id":"node_color_tools","schema_version":"1.0.0","name":"Node Color Tools Pie","version":"1.0.3","tagline":"Quick, organized node colors with pie menu ease","archive_hash":"sha256:e59fd49dbc701c9f45705e7f28dcf4d5d93dc13bf8820a5c8bf813a50c33b1e7","archive_size":4752,"archive_url":"https://extensions.blender.org/download/sha256:e59fd49dbc701c9f45705e7f28dcf4d5d93dc13bf8820a5c8bf813a50c33b1e7/add-on-node-color-tools-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-color-tools/","maintainer":"Lumpengnom","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","User Interface"]},{"id":"mesh_analysis_overlay","schema_version":"1.0.0","name":"Mesh Analysis Overlay","version":"4.1.0","tagline":"Mesh Analysis Overlay","archive_hash":"sha256:08b24bce782c7c8c72d47a3e2c8708a571f19538fed30d57d30fa874f7791a5c","archive_size":18588,"archive_url":"https://extensions.blender.org/download/sha256:08b24bce782c7c8c72d47a3e2c8708a571f19538fed30d57d30fa874f7791a5c/add-on-mesh-analysis-overlay-v4.1.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/mesh-analysis-overlay/","maintainer":"DShot92","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"gamiflow","schema_version":"1.0.0","name":"GamiFlow","version":"1.9.8","tagline":"Easier game asset creation","archive_hash":"sha256:b73a4cf391ebb2dbf02cebdea7cc195812678838cb4b85f8a49c576eae670145","archive_size":162200,"archive_url":"https://extensions.blender.org/download/sha256:b73a4cf391ebb2dbf02cebdea7cc195812678838cb4b85f8a49c576eae670145/add-on-gamiflow-v1.9.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/gamiflow/","maintainer":"Mathieu.Einig","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export FBX files to disk"},"tags":["Import-Export","Object"]},{"id":"Runlevel_Two","schema_version":"1.0.0","name":"Runlevel Two","version":"1.2.0","tagline":"A refined, distraction-free color palette, pleasing to the eye","archive_hash":"sha256:58de5dc3b042dc70479d8315ea628381f1549c6a22c22941a8ac90adabaca1a1","archive_size":5962,"archive_url":"https://extensions.blender.org/download/sha256:58de5dc3b042dc70479d8315ea628381f1549c6a22c22941a8ac90adabaca1a1/theme-runlevel-two-v1.2.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/runlevel-two/","maintainer":"Rene-Smaal","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Accessibility","Colorful"]},{"id":"render_overscan","schema_version":"1.0.0","name":"Render Overscan","version":"0.1.16","tagline":"Applies and manages overscan in renders","archive_hash":"sha256:3fd9bb4da29f3d9a572e6c24e3740c651f50172e5f3e421dacfd0ab28d9428fa","archive_size":3933,"archive_url":"https://extensions.blender.org/download/sha256:3fd9bb4da29f3d9a572e6c24e3740c651f50172e5f3e421dacfd0ab28d9428fa/add-on-render-overscan-v0.1.16.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/render-overscan/","maintainer":"efimpetelin","license":["SPDX:GPL-3.0-or-later"],"tags":["Render"]},{"id":"strip_array","schema_version":"1.0.0","name":"Strip Array","version":"1.1.0","tagline":"Array of duplicated strips, Customizable, Strips Display","archive_hash":"sha256:35813e53db04e787e8a6629b33529766cedc3d78d25111ab200822eda1b577ba","archive_size":4825,"archive_url":"https://extensions.blender.org/download/sha256:35813e53db04e787e8a6629b33529766cedc3d78d25111ab200822eda1b577ba/add-on-strip-array-v1.1.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/strip-array/","maintainer":"Dinesh007","license":["SPDX:GPL-3.0-or-later"],"tags":["Sequencer"]},{"id":"latticemagic","schema_version":"1.0.0","name":"Lattice Magic","version":"1.0.1","tagline":"Lattice-based deforming tools","archive_hash":"sha256:7f888bac24e8ea490446b75a07609e37f257d7cf7ba67c44703f06de0bb1c91e","archive_size":29840,"archive_url":"https://extensions.blender.org/download/sha256:7f888bac24e8ea490446b75a07609e37f257d7cf7ba67c44703f06de0bb1c91e/add-on-latticemagic-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/latticemagic/","maintainer":"Mets","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Animation"]},{"id":"Show_Object_Data_Users_in_Viewport","schema_version":"1.0.0","name":"Show Collection/Object/Data Users in Viewport","version":"1.0.6","tagline":"Show Collection/Object/Data Users in the Viewport","archive_hash":"sha256:9976496cb96fd37b3121f107981be35f6336da4692e00bb43ccdb4582d010699","archive_size":4288,"archive_url":"https://extensions.blender.org/download/sha256:9976496cb96fd37b3121f107981be35f6336da4692e00bb43ccdb4582d010699/add-on-show-object-data-users-in-viewport-v1.0.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/show-object-data-users-in-viewport/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"camera_shakify","schema_version":"1.0.0","name":"Camera Shakify","version":"0.5.1","tagline":"Add captured camera shake/wobble to your cameras","archive_hash":"sha256:40bb62e0960b301fe8c7b1de11ec959b8ce6c55ce03ed720c5c3b21c0c764e36","archive_size":78219,"archive_url":"https://extensions.blender.org/download/sha256:40bb62e0960b301fe8c7b1de11ec959b8ce6c55ce03ed720c5c3b21c0c764e36/add-on-camera-shakify-v0.5.1.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/camera-shakify/","maintainer":"Eat the Future","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Camera"]},{"id":"embroidery_importer","schema_version":"1.0.0","name":"Embroidery Importer","version":"0.9.6","tagline":"Import embroidery files into Blender","archive_hash":"sha256:d9481434abe7dc30e943e794733519035a1e29f8ba1590a23961a658860774f7","archive_size":157512,"archive_url":"https://extensions.blender.org/download/sha256:d9481434abe7dc30e943e794733519035a1e29f8ba1590a23961a658860774f7/add-on-embroidery-importer-v0.9.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/embroidery-importer/","maintainer":"javl","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read embroidery files from disk"},"tags":["Import-Export"]},{"id":"mio3_uv","schema_version":"1.0.0","name":"Mio3 UV","version":"2.1.0","tagline":"UV Edit Assistant Tools","archive_hash":"sha256:6ff059c976995aa12b75c57cb99c991dbb7c1d1456bfda1ba68bd5537c9521cd","archive_size":5201478,"archive_url":"https://extensions.blender.org/download/sha256:6ff059c976995aa12b75c57cb99c991dbb7c1d1456bfda1ba68bd5537c9521cd/add-on-mio3-uv-v2.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/mio3-uv/","maintainer":"mio","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Imports images, nodes, and translations from the bundled files"},"tags":["UV"]},{"id":"S3D_QuickSwitch","schema_version":"1.0.0","name":"Quick Switch","version":"2.1.0","tagline":"Quickly switch between Editor Areas","archive_hash":"sha256:d6b8fe2348c76f91687bfcdedf7264dc605c1eff99562b8a3827151f7d19f380","archive_size":6932,"archive_url":"https://extensions.blender.org/download/sha256:d6b8fe2348c76f91687bfcdedf7264dc605c1eff99562b8a3827151f7d19f380/add-on-s3d-quickswitch-v2.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/s3d-quickswitch/","maintainer":"Silvie3D","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface","Pipeline"]},{"id":"Frigus_Nox","schema_version":"1.0.0","name":"Frigus Nox","version":"1.0.8","tagline":"Frigus Nox theme","archive_hash":"sha256:5bf2f16afce50f77cb329a0dbd80c0d24d1c925365b273e6359714f96876444e","archive_size":5668,"archive_url":"https://extensions.blender.org/download/sha256:5bf2f16afce50f77cb329a0dbd80c0d24d1c925365b273e6359714f96876444e/theme-frigus-nox-v1.0.8.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/frigus-nox/","maintainer":"Cyrill-Vitkovskiy","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"spreadsheet_import","schema_version":"1.0.0","name":"Spreadsheet Import","version":"0.4.0","tagline":"Import data to spreadsheet for use with geometry nodes","archive_hash":"sha256:a339f6a2de9447fd26e59bcc1b4241bd493a251de1ed242579671d6219ac21ba","archive_size":16630,"archive_url":"https://extensions.blender.org/download/sha256:a339f6a2de9447fd26e59bcc1b4241bd493a251de1ed242579671d6219ac21ba/add-on-spreadsheet-import-v0.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/spreadsheet-import/","maintainer":"smonbrogg","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load CSV and JSON files from disk"},"tags":["Import-Export","Geometry Nodes"]},{"id":"Scene_ViewLayer_Switcher","schema_version":"1.0.0","name":"Scene/View/Workspace Switcher","version":"1.1.0","tagline":"Shortcut for Scenes/ViewLayers","archive_hash":"sha256:1d8572fcf0ce5007edd83615b40418230c3ce7be133e005d0986ff065c2a04d0","archive_size":11003,"archive_url":"https://extensions.blender.org/download/sha256:1d8572fcf0ce5007edd83615b40418230c3ce7be133e005d0986ff065c2a04d0/add-on-scene-viewlayer-switcher-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/scene-viewlayer-switcher/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"pohlke","schema_version":"1.0.0","name":"Pohlke","version":"2.0.0","tagline":"One-click standard axonometric and oblique projection cameras","archive_hash":"sha256:c20f9ae11702babf1e09bb0586ff30731f7a5cea7869d0e17a77c0a6ac40ad25","archive_size":16257,"archive_url":"https://extensions.blender.org/download/sha256:c20f9ae11702babf1e09bb0586ff30731f7a5cea7869d0e17a77c0a6ac40ad25/add-on-pohlke-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pohlke/","maintainer":"mononym","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"FishSim","schema_version":"1.0.0","name":"FishSim","version":"4.2.0","tagline":"Fish Swimming Simulation","archive_hash":"sha256:85e0a06c223139250853e1bb7e51fabf47ed7fcd287de89440bad1f6ee2b244a","archive_size":16851312,"archive_url":"https://extensions.blender.org/download/sha256:85e0a06c223139250853e1bb7e51fabf47ed7fcd287de89440bad1f6ee2b244a/add-on-fishsim-v4.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/fishsim/","maintainer":"Nerk","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"sync_render_sets","schema_version":"1.0.0","name":"Sync Render Sets","version":"1.2.1","tagline":"Sync scenes render settings/colorspaces,viewlayers`s passes","archive_hash":"sha256:37cfd9b7c85b37fb0e53ebc7c1148bb0e331e1731059a7d408bfbf40652ee362","archive_size":24219,"archive_url":"https://extensions.blender.org/download/sha256:37cfd9b7c85b37fb0e53ebc7c1148bb0e331e1731059a7d408bfbf40652ee362/add-on-sync-render-sets-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sync-render-sets/","maintainer":"CP-Design","license":["SPDX:GPL-3.0-or-later"],"tags":["Render"]},{"id":"circular_stacker","schema_version":"1.0.0","name":"Circular Stacker","version":"1.0.0","tagline":"Distribute selected objects in a circular (donut) pattern","archive_hash":"sha256:c8beafaa14035e601afd131c1129460d396f3d0260a807d2ca7a1c3552361451","archive_size":3099,"archive_url":"https://extensions.blender.org/download/sha256:c8beafaa14035e601afd131c1129460d396f3d0260a807d2ca7a1c3552361451/add-on-circular-stacker-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/circular-stacker/","maintainer":"Hydrocallis","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"overscan","schema_version":"1.0.0","name":"Overscan Render","version":"1.2.3","tagline":"Render with an overscan","archive_hash":"sha256:6599df781f683d78c2a0f2095b81c8d920e74d4b32d6de19095986afe299e10b","archive_size":3063,"archive_url":"https://extensions.blender.org/download/sha256:6599df781f683d78c2a0f2095b81c8d920e74d4b32d6de19095986afe299e10b/add-on-overscan-v1.2.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/overscan/","maintainer":"Blenderbob","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"Distribute","schema_version":"1.0.0","name":"Distribute","version":"1.1.0","tagline":"Distribute selected objects from first to last on X, Y or Z axis","archive_hash":"sha256:c293bd89069c379b97add283081a9a61727b1f1737a1cd5f042881b21c520e47","archive_size":1692,"archive_url":"https://extensions.blender.org/download/sha256:c293bd89069c379b97add283081a9a61727b1f1737a1cd5f042881b21c520e47/add-on-distribute-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/distribute/","maintainer":"Blenderbob","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"motionpath","schema_version":"1.0.0","name":"Motion Path Creator","version":"2.1.2","tagline":"Create motion paths for bones, vertices, empties and objects","archive_hash":"sha256:6afd3b0e6f7e740b6603a8e5773c306cefe0f26da628685184ef5dda92a2189f","archive_size":6955,"archive_url":"https://extensions.blender.org/download/sha256:6afd3b0e6f7e740b6603a8e5773c306cefe0f26da628685184ef5dda92a2189f/add-on-motionpath-v2.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/motionpath/","maintainer":"Blenderbob","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"fireray","schema_version":"1.0.0","name":"Fire Ray","version":"2.0.0","tagline":"Reality Capture setup and create an empty on a tracked camera","archive_hash":"sha256:ddf5d45609f794693fa8eca42bf8427c0095ba9b7ff032250cb1bde891a3fdb3","archive_size":2709,"archive_url":"https://extensions.blender.org/download/sha256:ddf5d45609f794693fa8eca42bf8427c0095ba9b7ff032250cb1bde891a3fdb3/add-on-fireray-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/fireray/","maintainer":"Blenderbob","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","Tracking"]},{"id":"HDRIRotator","schema_version":"1.0.0","name":"HDRI Rotator","version":"1.1.3","tagline":"Rotate HDRIs, Shadows and Sun from the viewport","archive_hash":"sha256:104ca5af587bb671e13aa9c56a5a6c373e8e6932f101e961cfc261db57c34c0d","archive_size":18375,"archive_url":"https://extensions.blender.org/download/sha256:104ca5af587bb671e13aa9c56a5a6c373e8e6932f101e961cfc261db57c34c0d/add-on-hdrirotator-v1.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/hdrirotator/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["Lighting"]},{"id":"auto_active_camera_switcher","schema_version":"1.0.0","name":"Auto Active Camera Switcher","version":"1.0.2","tagline":"Automatically makes the selected camera the active camera","archive_hash":"sha256:b604674c6f02cc353293796c7c645606a7829ebc8bb80e5ca6dc9843c7342bd5","archive_size":2653,"archive_url":"https://extensions.blender.org/download/sha256:b604674c6f02cc353293796c7c645606a7829ebc8bb80e5ca6dc9843c7342bd5/add-on-auto-active-camera-switcher-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-active-camera-switcher/","maintainer":"Yamato3D-3dnchu.com-","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Camera"]},{"id":"AddonProfiler","schema_version":"1.0.0","name":"Add-on Profiler","version":"2.1.0","tagline":"Monitor and capture add-on profiling data","archive_hash":"sha256:3f3f29f987b24e3669ca4ea739f1ded51ee2ded6adad647699eca3f96f99974c","archive_size":5449,"archive_url":"https://extensions.blender.org/download/sha256:3f3f29f987b24e3669ca4ea739f1ded51ee2ded6adad647699eca3f96f99974c/add-on-addonprofiler-v2.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/addonprofiler/","maintainer":"MrClock","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save and process benchmark and profile data"},"tags":["Development"]},{"id":"add_frame_range_presets","schema_version":"1.0.0","name":"Add Frame Range Presets","version":"1.1.3","tagline":"Create preset frame ranges in just a click","archive_hash":"sha256:3977d76fee643f5db538f589fc07c96e7a939a32800d6db73fd6422d146dd1ed","archive_size":16118,"archive_url":"https://extensions.blender.org/download/sha256:3977d76fee643f5db538f589fc07c96e7a939a32800d6db73fd6422d146dd1ed/add-on-add-frame-range-presets-v1.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/add-frame-range-presets/","maintainer":"stoatsnhoney","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"Light_Rain_Theme","schema_version":"1.0.0","name":"Light_Rain_Theme","version":"2.1.6","tagline":"Transparent Light Grey","archive_hash":"sha256:bb060ac5da73111cc4a7559cf34a73ef9a14ca746a7bebe738d3a5ecbd5447b7","archive_size":5630,"archive_url":"https://extensions.blender.org/download/sha256:bb060ac5da73111cc4a7559cf34a73ef9a14ca746a7bebe738d3a5ecbd5447b7/theme-light-rain-theme-v2.1.6.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/light-rain-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"C3DB","schema_version":"1.0.0","name":"3D Cursors Briefcase","version":"0.1.5","tagline":"Store and manage multiple 3D Cursors","archive_hash":"sha256:ada3f81101ccc11fadaa391ca697e11b29e7696dc20f2e4355af9bb4bddd5901","archive_size":6191,"archive_url":"https://extensions.blender.org/download/sha256:ada3f81101ccc11fadaa391ca697e11b29e7696dc20f2e4355af9bb4bddd5901/add-on-c3db-v0.1.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/c3db/","maintainer":"dupoxy","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"cameraide_settings","schema_version":"1.0.0","name":"Cameraide","version":"1.0.7","tagline":"Camera specific Resolution, Frame Range, Output Path & Format","archive_hash":"sha256:2f7ae8e560ed89774fca78dc4f3eb446cc13ac23690f745aa14cd4a60386f43d","archive_size":49695,"archive_url":"https://extensions.blender.org/download/sha256:2f7ae8e560ed89774fca78dc4f3eb446cc13ac23690f745aa14cd4a60386f43d/add-on-cameraide-settings-v1.0.7.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/cameraide-settings/","maintainer":"longiy","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","Render"]},{"id":"simple_bounce_curve","schema_version":"1.0.0","name":"Simple Bounce Curve","version":"1.1.0","tagline":"Creates a simple bounce curve between selected objects","archive_hash":"sha256:d9600617c81ca045b5aeffc5e393a1d09e589d7aca4d6ab15a0845720a93b47b","archive_size":2102,"archive_url":"https://extensions.blender.org/download/sha256:d9600617c81ca045b5aeffc5e393a1d09e589d7aca4d6ab15a0845720a93b47b/add-on-simple-bounce-curve-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/simple-bounce-curve/","maintainer":"Polyfjord","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Object"]},{"id":"org_tayou_bone_vertex_group_merge","schema_version":"1.0.0","name":"Bone and Vertex Group Merge","version":"1.4.0","tagline":"merge selected bones into the active bone","archive_hash":"sha256:87dedaeec7c07e9209396d150ecd036ec1ec569c7f002b5983bab631c15fe858","archive_size":1085822,"archive_url":"https://extensions.blender.org/download/sha256:87dedaeec7c07e9209396d150ecd036ec1ec569c7f002b5983bab631c15fe858/add-on-org-tayou-bone-vertex-group-merge-v1.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/org-tayou-bone-vertex-group-merge/","maintainer":"Tayou","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"Custom_Grid_Scales","schema_version":"1.0.0","name":"Custom Grid Scales","version":"1.1.0","tagline":"Adds the ability to quickly change between custom grid scales","archive_hash":"sha256:05fa8215b7ed9ded0cca86164f49e09d5cc393e92f80dba4cc6c5c6358588b01","archive_size":2631,"archive_url":"https://extensions.blender.org/download/sha256:05fa8215b7ed9ded0cca86164f49e09d5cc393e92f80dba4cc6c5c6358588b01/add-on-custom-grid-scales-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.1","website":"https://extensions.blender.org/add-ons/custom-grid-scales/","maintainer":"Jacob-Beatty","license":["SPDX:GPL-3.0-or-later"]},{"id":"more_colors","schema_version":"1.0.0","name":"HUE","version":"1.2.1","tagline":"A set of tools to make vertex painting easier","archive_hash":"sha256:db1855a3dcdf74fe16cf3be32f1d047c555680d51c18dd78c001da7e6a4f19c3","archive_size":186803,"archive_url":"https://extensions.blender.org/download/sha256:db1855a3dcdf74fe16cf3be32f1d047c555680d51c18dd78c001da7e6a4f19c3/add-on-more-colors-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/more-colors/","maintainer":"FardreamerLabs","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Mesh","Paint"]},{"id":"thomas_rig_legacy","schema_version":"1.0.0","name":"Thomas Rig Legacy","version":"1.2.2","tagline":"Addon for this rig","archive_hash":"sha256:0e2893a9731bbc6384ef7fe4a75a30d74c751a51661655c03369f7cf6ac2134c","archive_size":10607720,"archive_url":"https://extensions.blender.org/download/sha256:0e2893a9731bbc6384ef7fe4a75a30d74c751a51661655c03369f7cf6ac2134c/add-on-thomas-rig-legacy-v1.2.2-windows-x64-macos-arm64-linux-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/thomas-rig-legacy/","maintainer":"BlueEvilGFX","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"To save the skin to Blender-tmp & read MC textures","network":"To download a skin with the Minecraft/Mojang API"},"platforms":["windows-x64","macos-arm64","linux-x64"],"tags":["Animation","Rigging"]},{"id":"cortecloud_export","schema_version":"1.0.0","name":"CorteCloud Export","version":"1.0.5","tagline":"Manage and Export wood cut list to CorteCloud csv format","archive_hash":"sha256:ac372a5a9e812069840c9b24f86e86af9f625b798445d128732b8dd94890a191","archive_size":20274,"archive_url":"https://extensions.blender.org/download/sha256:ac372a5a9e812069840c9b24f86e86af9f625b798445d128732b8dd94890a191/add-on-cortecloud-export-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cortecloud-export/","maintainer":"Filipe-Rocha-Lopes","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export csv files"}},{"id":"auto_reload","schema_version":"1.0.0","name":"Auto Reload","version":"3.1.2","tagline":"Automatic reload for external files","archive_hash":"sha256:881d502684e842f2b90d1d911128adea6cebc39b31b91dc311ffc3bfb115f7d4","archive_size":21511,"archive_url":"https://extensions.blender.org/download/sha256:881d502684e842f2b90d1d911128adea6cebc39b31b91dc311ffc3bfb115f7d4/add-on-auto-reload-v3.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-reload/","maintainer":"tonton_","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Checking/Reloading external files from current blend"},"tags":["Import-Export","Pipeline"]},{"id":"Colorista","schema_version":"1.0.0","name":"Colorista","version":"1.1.9","tagline":"A convenient color grading add-on designed for colorists","archive_hash":"sha256:07da6c3d687b8a6f88ea120adf93b10cf0a5a88aca12998a2cb02f20380523ef","archive_size":950252,"archive_url":"https://extensions.blender.org/download/sha256:07da6c3d687b8a6f88ea120adf93b10cf0a5a88aca12998a2cb02f20380523ef/add-on-colorista-v1.1.9.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/colorista/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read Node"},"tags":["Modeling","Node","Render","Compositing"]},{"id":"popoti_align_helper","schema_version":"1.0.0","name":"POPOTI Align Helper","version":"1.2.7","tagline":"More friendly alignment based on observation perspective","archive_hash":"sha256:fca6fa04bc5880bf5d8bdce12d49f6cde3b9d5db7f79f957e1ef504cfde4720f","archive_size":95518,"archive_url":"https://extensions.blender.org/download/sha256:fca6fa04bc5880bf5d8bdce12d49f6cde3b9d5db7f79f957e1ef504cfde4720f/add-on-popoti-align-helper-v1.2.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/popoti-align-helper/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Object"]},{"id":"UV_Snapper","schema_version":"1.0.0","name":"UV Snapper","version":"1.1.1","tagline":"Snap selected UVs to a custom atlas","archive_hash":"sha256:e8b8a90172e88ed991b7c3dfae419b660a9209caf9a1de97ab68b2ecd4d744eb","archive_size":236058,"archive_url":"https://extensions.blender.org/download/sha256:e8b8a90172e88ed991b7c3dfae419b660a9209caf9a1de97ab68b2ecd4d744eb/add-on-uv-snapper-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/uv-snapper/","maintainer":"Duncan-Readle","license":["SPDX:GPL-3.0-or-later"],"tags":["UV"]},{"id":"theme_moss","schema_version":"1.0.0","name":"Moss","version":"1.0.5","tagline":"Mossy castle dark theme","archive_hash":"sha256:3475452906c58f1ec3d6b15a961a729cce0e3986ec081e5b6cfc055967ae4078","archive_size":5609,"archive_url":"https://extensions.blender.org/download/sha256:3475452906c58f1ec3d6b15a961a729cce0e3986ec081e5b6cfc055967ae4078/theme-theme-moss-v1.0.5.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-moss/","maintainer":"Sereda","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"mesh_repair_tools","schema_version":"1.0.0","name":"Mesh Repair Tools","version":"4.0.2","tagline":"An integrated toolbox for mesh repair","archive_hash":"sha256:4d7221841bcc5fb23a26835dbfd9b2a87ce2ddcb29215d1f715329a924008fc7","archive_size":13836,"archive_url":"https://extensions.blender.org/download/sha256:4d7221841bcc5fb23a26835dbfd9b2a87ce2ddcb29215d1f715329a924008fc7/add-on-mesh-repair-tools-v4.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mesh-repair-tools/","maintainer":"SineWave","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh","User Interface"]},{"id":"profiling_buddy","schema_version":"1.0.0","name":"Profiling Buddy","version":"1.0.0","tagline":"Adds modifier panel to profile execution times","archive_hash":"sha256:025a1466757a8937bbea1cf5f377272eeb2f259b8be6b1f558d5c642629c78d0","archive_size":1756,"archive_url":"https://extensions.blender.org/download/sha256:025a1466757a8937bbea1cf5f377272eeb2f259b8be6b1f558d5c642629c78d0/add-on-profiling-buddy-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/profiling-buddy/","maintainer":"SimonThommes","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Rigging","Geometry Nodes","User Interface"]},{"id":"Proton","schema_version":"1.0.0","name":"Proton","version":"1.1.0","tagline":"A modern dark theme for Blender with purple accents","archive_hash":"sha256:3bc76322cf8e763fdd823cd1955acc00e92480a9add6c7829a981459d93cad99","archive_size":5141,"archive_url":"https://extensions.blender.org/download/sha256:3bc76322cf8e763fdd823cd1955acc00e92480a9add6c7829a981459d93cad99/theme-proton-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/proton/","maintainer":"VISaberToothIV","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"Neo_Grey_Theme","schema_version":"1.0.0","name":"Neo_Grey_Theme","version":"2.4.5","tagline":"Dust Cloud","archive_hash":"sha256:a52dee9cfc4ddc437826eddf5fc398d50f0b6617b62771a707ed70188949d9a0","archive_size":5653,"archive_url":"https://extensions.blender.org/download/sha256:a52dee9cfc4ddc437826eddf5fc398d50f0b6617b62771a707ed70188949d9a0/theme-neo-grey-theme-v2.4.5.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/neo-grey-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"SMEAR","schema_version":"1.0.0","name":"SMEAR","version":"1.1.8","tagline":"Create smear frames for 3D animations","archive_hash":"sha256:eb035521ff506fa339916040c6184b5d09a124125bdfbb942ce2a50ca1b5b1e5","archive_size":3313751,"archive_url":"https://extensions.blender.org/download/sha256:eb035521ff506fa339916040c6184b5d09a124125bdfbb942ce2a50ca1b5b1e5/add-on-smear-v1.1.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/smear/","maintainer":"Jean-Basset","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"simple_deform_helper","schema_version":"1.0.0","name":"Simple Deform Helper","version":"0.2.7","tagline":"Simple Deform visualization adjustment tool","archive_hash":"sha256:4f8fbd7850d9415c8a5c3180af85d66c7b17c5a83a01a08bab14932525631acb","archive_size":173571,"archive_url":"https://extensions.blender.org/download/sha256:4f8fbd7850d9415c8a5c3180af85d66c7b17c5a83a01a08bab14932525631acb/add-on-simple-deform-helper-v0.2.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/simple-deform-helper/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Object","Mesh"]},{"id":"uv_toolkit","schema_version":"1.0.0","name":"UVToolkit","version":"2.1.4","tagline":"A collection of UV editing tools for Blender","archive_hash":"sha256:39634792bd71b161ed5cf6156b0167937d1a18818c91b24823dbbc8cd51fb859","archive_size":2611931,"archive_url":"https://extensions.blender.org/download/sha256:39634792bd71b161ed5cf6156b0167937d1a18818c91b24823dbbc8cd51fb859/add-on-uv-toolkit-v2.1.4.zip","type":"add-on","blender_version_min":"5.0.0","blender_version_max":"6.0.0","website":"https://extensions.blender.org/add-ons/uv-toolkit/","maintainer":"razed","license":["SPDX:GPL-3.0-or-later"],"tags":["UV","Material"]},{"id":"image_packer","schema_version":"1.0.0","name":"Image Packer","version":"1.0.7","tagline":"Packs images into a single image","archive_hash":"sha256:32ff0572ecfd9fd7af321ae9299f59101c3d222879c7d7aebb2622f1c3f82c2c","archive_size":24146,"archive_url":"https://extensions.blender.org/download/sha256:32ff0572ecfd9fd7af321ae9299f59101c3d222879c7d7aebb2622f1c3f82c2c/add-on-image-packer-v1.0.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/image-packer/","maintainer":"Quint-Vrolijk","license":["SPDX:GPL-3.0-or-later"],"tags":["Paint"]},{"id":"Modal_lattice_resolution","schema_version":"1.0.0","name":"Modal Lattice Resolution","version":"0.3.4","tagline":"Create Lattice or Tweak Resolution from 3D viewport, 'L' keymap","archive_hash":"sha256:13fb4af136685386fb22fe40e68d29c9a7cebdc24d6a5acc2d87ce031e0ad13b","archive_size":7314,"archive_url":"https://extensions.blender.org/download/sha256:13fb4af136685386fb22fe40e68d29c9a7cebdc24d6a5acc2d87ce031e0ad13b/add-on-modal-lattice-resolution-v0.3.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/modal-lattice-resolution/","maintainer":"Tyo79","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Mesh"]},{"id":"you_are_autosave","schema_version":"1.0.0","name":"You Are Autosave","version":"1.5.0","tagline":"Show a warning when you haven't saved in a while","archive_hash":"sha256:7655433433ca018ea03604dc0b8759ce2de9d5c239024017abb8a95b153ee63b","archive_size":17503,"archive_url":"https://extensions.blender.org/download/sha256:7655433433ca018ea03604dc0b8759ce2de9d5c239024017abb8a95b153ee63b/add-on-you-are-autosave-v1.5.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/you-are-autosave/","maintainer":"dr.sybren","license":["SPDX:GPL-3.0-or-later"],"tags":["System"]},{"id":"univ","schema_version":"1.0.0","name":"UniV","version":"3.9.8","tagline":"UV Toolkit","archive_hash":"sha256:b2f60a434fbded2bc1307ad86beeced014409773d69aad4fa1fcfa087f23ea8c","archive_size":538491,"archive_url":"https://extensions.blender.org/download/sha256:b2f60a434fbded2bc1307ad86beeced014409773d69aad4fa1fcfa087f23ea8c/add-on-univ-v3.9.8.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.1.10","website":"https://extensions.blender.org/add-ons/univ/","maintainer":"Oxicid","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Creates and updates icon files in the add-on directory"},"tags":["UV"]},{"id":"gesture_helper","schema_version":"1.0.0","name":"Gesture Helper","version":"2.2.6","tagline":"Quickly use gestures to run the operator or change properties","archive_hash":"sha256:39ac43460689ec3ddfb4ee02ebf6a6695719367bb4962b1629344ed03feefec5","archive_size":1125093,"archive_url":"https://extensions.blender.org/download/sha256:39ac43460689ec3ddfb4ee02ebf6a6695719367bb4962b1629344ed03feefec5/add-on-gesture-helper-v2.2.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/gesture-helper/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/Export Gesture preset"},"tags":["3D View","User Interface"]},{"id":"bone_eyedropper","schema_version":"1.0.0","name":"Bone Eyedropper","version":"1.1.8","tagline":"Eyedrop a bone from active or target and assign it to a property","archive_hash":"sha256:b2b551c815a874247b7d4e8c11b167d331319bea1f7551db5a2ac443642297fd","archive_size":139882,"archive_url":"https://extensions.blender.org/download/sha256:b2b551c815a874247b7d4e8c11b167d331319bea1f7551db5a2ac443642297fd/add-on-bone-eyedropper-v1.1.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bone-eyedropper/","maintainer":"Nifs","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import .blend from disk","clipboard":"Copy property paths to clipboard"},"tags":["3D View","User Interface"]},{"id":"quick_export_extension","schema_version":"1.0.0","name":"Quick Export","version":"1.1.0","tagline":"Exports the active object's collection if it has exporters","archive_hash":"sha256:bc786396fcbd9e0c3f309ea0388a815912111e4417f5f3faeb2e7cc5fc975f76","archive_size":2422,"archive_url":"https://extensions.blender.org/download/sha256:bc786396fcbd9e0c3f309ea0388a815912111e4417f5f3faeb2e7cc5fc975f76/add-on-quick-export-extension-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-export-extension/","maintainer":"Maro3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"Real_Time_Paths","schema_version":"1.0.0","name":"Motion Path Pro","version":"3.1.0","tagline":"Update motion path in real time","archive_hash":"sha256:eaee70d1ffaf5b3454ba6cd5c39d4b779b99bd59c52227aa0fea627276db7ff2","archive_size":15369,"archive_url":"https://extensions.blender.org/download/sha256:eaee70d1ffaf5b3454ba6cd5c39d4b779b99bd59c52227aa0fea627276db7ff2/add-on-real-time-paths-v3.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/real-time-paths/","maintainer":"Hamdi-Amer","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"theme_GreenKM","schema_version":"1.0.0","name":"Green Kode Mono","version":"1.1.6","tagline":"Kinda retro green theme","archive_hash":"sha256:9e27e44e3086d3df5937c923415b4271c6a4d6ff0cf288bb01cc62b362d46567","archive_size":6032,"archive_url":"https://extensions.blender.org/download/sha256:9e27e44e3086d3df5937c923415b4271c6a4d6ff0cf288bb01cc62b362d46567/theme-theme-greenkm-v1.1.6.zip","type":"theme","blender_version_min":"5.0.1","website":"https://extensions.blender.org/themes/theme-greenkm/","maintainer":"DannySi","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"Quellenform_theme","schema_version":"1.0.0","name":"Quellenform's Theme","version":"0.1.0","tagline":"A dark grey theme with a gentle touch of blue and green colors","archive_hash":"sha256:1fd5a7c591b27910c3f584f3954a4b478dc3a4585a3bd8748c4290a7bc1da20d","archive_size":5899,"archive_url":"https://extensions.blender.org/download/sha256:1fd5a7c591b27910c3f584f3954a4b478dc3a4585a3bd8748c4290a7bc1da20d/theme-quellenform-theme-v0.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/quellenform-theme/","maintainer":"quellenform","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"act_game_asset_creation_toolset","schema_version":"1.0.0","name":"ACT: Game Asset Creation Toolset","version":"2025.2.1","tagline":"Tools for easy create and export low-poly game assets","archive_hash":"sha256:e733197281ff010e1b5fd4ddc9c17249becc7a14c759ae87e82fa1bed9deb284","archive_size":49479,"archive_url":"https://extensions.blender.org/download/sha256:e733197281ff010e1b5fd4ddc9c17249becc7a14c759ae87e82fa1bed9deb284/add-on-act-game-asset-creation-toolset-v2025.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/act-game-asset-creation-toolset/","maintainer":"IvanVostrikov","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export FBX/OBJ/GLTF to disk"},"tags":["3D View","Object","UV","Mesh","Import-Export","Modeling"]},{"id":"node_to_python","schema_version":"1.0.0","name":"Node To Python","version":"4.1.0","tagline":"Turn node groups into Python code","archive_hash":"sha256:f706edda81af97285ff5af6e82ee9aff8f71eed30ab3a5c810ba90ca4c08d085","archive_size":81029,"archive_url":"https://extensions.blender.org/download/sha256:f706edda81af97285ff5af6e82ee9aff8f71eed30ab3a5c810ba90ca4c08d085/add-on-node-to-python-v4.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-to-python/","maintainer":"Brendan-Parmer","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Creates and writes to files in a user-specified directory"},"tags":["Development","Compositing","Geometry Nodes","Material","Node"]},{"id":"Eclipse","schema_version":"1.0.0","name":"Eclipse","version":"1.2.2","tagline":"Where Darkness Meets Elegance","archive_hash":"sha256:9b22fcdaed346fdc37aeb5f4686932495b6bbbb70f9ce62d6c6b960bb5894ba7","archive_size":5863,"archive_url":"https://extensions.blender.org/download/sha256:9b22fcdaed346fdc37aeb5f4686932495b6bbbb70f9ce62d6c6b960bb5894ba7/theme-eclipse-v1.2.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/eclipse/","maintainer":"DaoL","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"custom_templates","schema_version":"1.0.0","name":"Custom Templates","version":"1.6.0","tagline":"Use your own .blend files as template options for new projects","archive_hash":"sha256:49a47ee241f407d7efabea8811084ba9f6c1342d61d94b77177401cf5701ea4e","archive_size":10674,"archive_url":"https://extensions.blender.org/download/sha256:49a47ee241f407d7efabea8811084ba9f6c1342d61d94b77177401cf5701ea4e/add-on-custom-templates-v1.6.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/custom-templates/","maintainer":"Francesco-Bellini","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/Export, + from folder, Ensure absolute paths in resources"},"tags":["System","User Interface"]},{"id":"world_apply","schema_version":"1.0.0","name":"World Apply","version":"1.0.1","tagline":"Sync viewport world settings with scene world settings","archive_hash":"sha256:17188904a6800963eae79e35ca53f13c2289c98ad4ef63172d42f250ed33c663","archive_size":2866,"archive_url":"https://extensions.blender.org/download/sha256:17188904a6800963eae79e35ca53f13c2289c98ad4ef63172d42f250ed33c663/add-on-world-apply-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/world-apply/","maintainer":"Baraa-Khaled-Youssef","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read HDRI files stored in Blender's directories"},"tags":["Lighting"]},{"id":"timeline_buttons","schema_version":"1.0.0","name":"Timeline Buttons","version":"1.0.0","tagline":"Put the buttons in timeline to other animation related editors","archive_hash":"sha256:3aac330381de15d2f69641f0f6c7f0dcaec42371e014ca70889cad899d27d815","archive_size":15158,"archive_url":"https://extensions.blender.org/download/sha256:3aac330381de15d2f69641f0f6c7f0dcaec42371e014ca70889cad899d27d815/add-on-timeline-buttons-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/timeline-buttons/","maintainer":"tinkerboi","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"ddslideshow","schema_version":"1.0.0","name":"DDSlideshow","version":"0.0.5","tagline":"Create a Ken Burns Effect slideshow","archive_hash":"sha256:c83b00339fb45a3a50191a3856dead7a9878c5c9101a198ceece181c96d8ab0b","archive_size":7196,"archive_url":"https://extensions.blender.org/download/sha256:c83b00339fb45a3a50191a3856dead7a9878c5c9101a198ceece181c96d8ab0b/add-on-ddslideshow-v0.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ddslideshow/","maintainer":"Michael-Lamertz","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Required to load images for the slideshow"},"tags":["Sequencer"]},{"id":"ikea_browser","schema_version":"1.0.0","name":"IKEA Browser","version":"0.4.0","tagline":"Search and import models from ikea.com","archive_hash":"sha256:b8b619c55c58ab93222c40e46633d3dc1fc3e2ca2ebf26128572164e04ae27b2","archive_size":7016,"archive_url":"https://extensions.blender.org/download/sha256:b8b619c55c58ab93222c40e46633d3dc1fc3e2ca2ebf26128572164e04ae27b2/add-on-ikea-browser-v0.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ikea-browser/","maintainer":"Shish","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Store downloaded models","network":"Download from ikea.com"},"tags":["Import-Export"]},{"id":"bonsai","schema_version":"1.0.0","name":"Bonsai","version":"0.8.5","tagline":"A native Building Information Model authoring platform using IFC","archive_hash":"sha256:81c0cfc9a6204e13fdd4391daef6e91ed8033488fde69ca5933b3535f490514f","archive_size":123569083,"archive_url":"https://extensions.blender.org/download/sha256:81c0cfc9a6204e13fdd4391daef6e91ed8033488fde69ca5933b3535f490514f/add-on-bonsai-v0.8.5-windows-x64.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/bonsai/","maintainer":"IfcOpenShell","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load and save IFCs, IDS, BCF, etc from disk","network":"Augin / Cove.Tool integration for VR and environmental analysis","clipboard":"Copy and paste error logs"},"platforms":["windows-x64"],"tags":["3D View","Add Mesh","Animation","Camera","Development","Import-Export","Lighting","Material","Modeling","Mesh","Node","Object","Pipeline","Render","Scene","System","User Interface","UV"]},{"id":"Clean_Blue","schema_version":"1.0.0","name":"Clean Blue","version":"1.4.0","tagline":"This is a pleasant light-colored theme","archive_hash":"sha256:6dde8d3518209c90af4af2a06f162a18c34e7c886e0a557f7c0c93fd811fa63d","archive_size":5811,"archive_url":"https://extensions.blender.org/download/sha256:6dde8d3518209c90af4af2a06f162a18c34e7c886e0a557f7c0c93fd811fa63d/theme-clean-blue-v1.4.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/clean-blue/","maintainer":"DaoL","license":["SPDX:GPL-2.0-or-later"],"tags":["Light"]},{"id":"redsquare","schema_version":"1.0.0","name":"RedSquare V2","version":"1.2.1","tagline":"A theme with basic red tones and a more square-ish type of look","archive_hash":"sha256:05e411805c178dff7b8a4e3a9fe37a15bea260f01e8903d6e17bf1845f20fc8e","archive_size":5707,"archive_url":"https://extensions.blender.org/download/sha256:05e411805c178dff7b8a4e3a9fe37a15bea260f01e8903d6e17bf1845f20fc8e/theme-redsquare-v1.2.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/redsquare/","maintainer":"luccadanielp","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","High Contrast"]},{"id":"mengges_dark_theme","schema_version":"1.0.0","name":"MengGe's Dark Theme","version":"1.2.0","tagline":"Dark Theme Pro Max Ultra Plus Lift","archive_hash":"sha256:f2d43e826c8469ebd6ee3df71eb23af969c9f73ff80b877b2c6036a3c6be25cc","archive_size":5629,"archive_url":"https://extensions.blender.org/download/sha256:f2d43e826c8469ebd6ee3df71eb23af969c9f73ff80b877b2c6036a3c6be25cc/theme-mengges-dark-theme-v1.2.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/mengges-dark-theme/","maintainer":"MengGe_KKD","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"armature_pie","schema_version":"1.0.0","name":"Armature Pie","version":"1.1.2","tagline":"Pick Armatures Comfortably & Solo Collection By Pie Menu","archive_hash":"sha256:f03490659072d00769c5d545524870938508d1b012e6285cd934a34d6b7411da","archive_size":13793,"archive_url":"https://extensions.blender.org/download/sha256:f03490659072d00769c5d545524870938508d1b012e6285cd934a34d6b7411da/add-on-armature-pie-v1.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/armature-pie/","maintainer":"Ou_Chiang","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Rigging"]},{"id":"Elegant_Light_Theme","schema_version":"1.0.0","name":"Elegant_Light_Theme","version":"2.2.7","tagline":"Soft Light","archive_hash":"sha256:e0d1e9fc6050dca6d647f19029cc7a1a81adf22b8827d5da227c60cb2d70e04c","archive_size":5669,"archive_url":"https://extensions.blender.org/download/sha256:e0d1e9fc6050dca6d647f19029cc7a1a81adf22b8827d5da227c60cb2d70e04c/theme-elegant-light-theme-v2.2.7.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/elegant-light-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"livery_helper","schema_version":"1.0.0","name":"LiveryHelper","version":"1.0.3","tagline":"Makes creating, editing and customizing car liveries much easier","archive_hash":"sha256:5f1718454dab8b0507fdd8f1743f5536cb0da9f423e7bc789b664eef19b28cab","archive_size":5198,"archive_url":"https://extensions.blender.org/download/sha256:5f1718454dab8b0507fdd8f1743f5536cb0da9f423e7bc789b664eef19b28cab/add-on-livery-helper-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/livery-helper/","maintainer":"Mast26","license":["SPDX:MIT"],"permissions":{"files":"Loading source livery images"},"tags":["Material"]},{"id":"optiploy","schema_version":"1.0.0","name":"OptiPloy: Rig Spawner","version":"1.8.2","tagline":"Improve your workflow with smarter linking tools","archive_hash":"sha256:8dee57bb226f754c3bcab8986df3eca85ee8148faae759649f48d2374c7e0956","archive_size":41364,"archive_url":"https://extensions.blender.org/download/sha256:8dee57bb226f754c3bcab8986df3eca85ee8148faae759649f48d2374c7e0956/add-on-optiploy-v1.8.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/optiploy/","maintainer":"hisanimations","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and save .blend and folder entries"},"tags":["Pipeline","Animation","Rigging","Import-Export"]},{"id":"io_scene_mvr","schema_version":"1.0.0","name":"Scene MVR (.mvr) and GDTF (.gdtf)","version":"1.5.3","tagline":"My Virtual Rig and General Device Type Format","archive_hash":"sha256:a258859f5e5f15c2c1376ea96258968c4a1ce9d90a9bd867d1c62f8c9f9d8ea1","archive_size":317585,"archive_url":"https://extensions.blender.org/download/sha256:a258859f5e5f15c2c1376ea96258968c4a1ce9d90a9bd867d1c62f8c9f9d8ea1/add-on-io-scene-mvr-v1.5.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-scene-mvr/","maintainer":"NRGSille","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"General Device Type Format and My Virtual Rig files"},"tags":["Import-Export","Scene","Lighting","Tracking","Rigging"]},{"id":"CV_Filter_Channels","schema_version":"1.0.0","name":"Filter_Channels","version":"1.0.8","tagline":"Filter channels in Graph Editor for animation","archive_hash":"sha256:b96b9024aca598c17e2ec30cd33cd25d419cf82d94c51c2e056f2ba3603a9bd2","archive_size":15830,"archive_url":"https://extensions.blender.org/download/sha256:b96b9024aca598c17e2ec30cd33cd25d419cf82d94c51c2e056f2ba3603a9bd2/add-on-cv-filter-channels-v1.0.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cv-filter-channels/","maintainer":"Carles-V","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"right_mouse_navigation","schema_version":"1.0.0","name":"Right Mouse Navigation","version":"2.8.0","tagline":"Game Engine Movement and Menus","archive_hash":"sha256:9974909656bb82cb599949b93df47cabf0b174cd727504254e35fc08a36e222d","archive_size":2200146,"archive_url":"https://extensions.blender.org/download/sha256:9974909656bb82cb599949b93df47cabf0b174cd727504254e35fc08a36e222d/add-on-right-mouse-navigation-v2.8.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/right-mouse-navigation/","maintainer":"SpectralVectors","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Node","User Interface"]},{"id":"texel_density_checker","schema_version":"1.0.0","name":"Texel Density Checker","version":"2025.1.2","tagline":"Toolset for working with Texel Density","archive_hash":"sha256:00e9f4b96ce4966ab59d68182491273a5e2e5205ab0d16ad4abe9c8bbf531a35","archive_size":48357,"archive_url":"https://extensions.blender.org/download/sha256:00e9f4b96ce4966ab59d68182491273a5e2e5205ab0d16ad4abe9c8bbf531a35/add-on-texel-density-checker-v2025.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/texel-density-checker/","maintainer":"IvanVostrikov","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Object","UV"]},{"id":"simple_renaming_panel","schema_version":"1.0.0","name":"Simple Renaming","version":"2.1.5","tagline":"Effortlessly rename multiple objects with this simple addon","archive_hash":"sha256:c5a17fd41ab08ebf1420677c0d26c8dea2fb41786605bd66ce99c93403c69436","archive_size":57204,"archive_url":"https://extensions.blender.org/download/sha256:c5a17fd41ab08ebf1420677c0d26c8dea2fb41786605bd66ce99c93403c69436/add-on-simple-renaming-panel-v2.1.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/simple-renaming-panel/","maintainer":"MatthiasPatscheider","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Scene","User Interface"]},{"id":"auto_switch_theme","schema_version":"1.0.0","name":"Auto Switch Theme","version":"1.0.1","tagline":"Set light and dark themes based on your system appearance","archive_hash":"sha256:e3c92dc4696f87117b7ce31d52ed690c3c302ddeca98b5677788c7d2eaeac6b1","archive_size":11020,"archive_url":"https://extensions.blender.org/download/sha256:e3c92dc4696f87117b7ce31d52ed690c3c302ddeca98b5677788c7d2eaeac6b1/add-on-auto-switch-theme-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-switch-theme/","maintainer":"pablovazquez","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Read existing themes from disk"},"tags":["User Interface"]},{"id":"ik_fk_snapping_tool","schema_version":"1.0.0","name":"IK-FK Snapping Tool","version":"3.0.3","tagline":"Tools to perform IK to FK and FK to IK snapping","archive_hash":"sha256:bc34f92eeab8f922dc6918d3f3f05c8f42ddde0faaffbb3a69c3a164dea16ddd","archive_size":19058,"archive_url":"https://extensions.blender.org/download/sha256:bc34f92eeab8f922dc6918d3f3f05c8f42ddde0faaffbb3a69c3a164dea16ddd/add-on-ik-fk-snapping-tool-v3.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ik-fk-snapping-tool/","maintainer":"Endertainer007","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Rigging"]},{"id":"macos_dark_theme","schema_version":"1.0.0","name":"MacOS Dark Theme","version":"2.0.1","tagline":"The MacOS interface style in Blender","archive_hash":"sha256:5a2b3a93e7d4aad0a6adb3e52f382007e292af49730e5335f018b11c3cfdd4f3","archive_size":17990,"archive_url":"https://extensions.blender.org/download/sha256:5a2b3a93e7d4aad0a6adb3e52f382007e292af49730e5335f018b11c3cfdd4f3/theme-macos-dark-theme-v2.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/macos-dark-theme/","maintainer":"stoatsnhoney","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"openvat","schema_version":"1.0.0","name":"OpenVAT","version":"1.1.0","tagline":"Encode and preview vertex animation textures","archive_hash":"sha256:9ead429665193bae5f97ce5af171ef6cd772aa158f80b6d1c750480d8d9aaec1","archive_size":277888,"archive_url":"https://extensions.blender.org/download/sha256:9ead429665193bae5f97ce5af171ef6cd772aa158f80b6d1c750480d8d9aaec1/add-on-openvat-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/openvat/","maintainer":"sharpened","license":["SPDX:GPL-3.0-or-later"]},{"id":"align2custom","schema_version":"1.0.0","name":"Align 2 Custom","version":"2.1.2","tagline":"Align 3D View to custom orientation or 3D cursor","archive_hash":"sha256:c9c2b3ba9871dc20208c20772006af0644f5ab7aa7f9acf9fc2b03098cbc1856","archive_size":17939,"archive_url":"https://extensions.blender.org/download/sha256:c9c2b3ba9871dc20208c20772006af0644f5ab7aa7f9acf9fc2b03098cbc1856/add-on-align2custom-v2.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/align2custom/","maintainer":"fdaubine","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","3D View"]},{"id":"import_mixamo_root_motion","schema_version":"1.0.0","name":"Import Mixamo - Root Motion","version":"1.0.3","tagline":"Batch Import Fbx (Mixamo) And Apply Root Motion","archive_hash":"sha256:2ac0f138d09124b8dbf5b0c6816f0e17da6bc2ec373808d00b6a34dd672736b3","archive_size":23046,"archive_url":"https://extensions.blender.org/download/sha256:2ac0f138d09124b8dbf5b0c6816f0e17da6bc2ec373808d00b6a34dd672736b3/add-on-import-mixamo-root-motion-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/import-mixamo-root-motion/","maintainer":"DevilMayCry","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import FBX from disk"},"tags":["Import-Export"]},{"id":"Quick_Rigid","schema_version":"1.0.0","name":"Quick Rigid","version":"1.2.1","tagline":"Easy access to the most used rigid body settings","archive_hash":"sha256:c63f54b24f264bb2553d8e85b64375a1151628c92ad31b0e3dd1687f0514b8bb","archive_size":1229239,"archive_url":"https://extensions.blender.org/download/sha256:c63f54b24f264bb2553d8e85b64375a1151628c92ad31b0e3dd1687f0514b8bb/add-on-quick-rigid-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-rigid/","maintainer":"nova3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Physics","Object"]},{"id":"geonode_shapekeys","schema_version":"1.0.0","name":"GeoNode Shape Keys","version":"1.0.0","tagline":"Sculpt on linked animated characters","archive_hash":"sha256:2ac8d503b2f7004a7066c9af0432da2327fc471b269e9f90cfb92cd86203442c","archive_size":220787,"archive_url":"https://extensions.blender.org/download/sha256:2ac8d503b2f7004a7066c9af0432da2327fc471b269e9f90cfb92cd86203442c/add-on-geonode-shapekeys-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/geonode-shapekeys/","maintainer":"Mets","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"To load the necessary GeoNodes from its .blend file"},"tags":["Rigging"]},{"id":"mesh_mesh_align_plus","schema_version":"1.0.0","name":"Mesh Align Plus","version":"1.1.0-rc.1","tagline":"Move/align mesh parts+objects based on scene geometry/metrics","archive_hash":"sha256:6177ca247f21143f839cf12aa0fda4b6ef738ef6554ce43c86446348b9bdf719","archive_size":90285,"archive_url":"https://extensions.blender.org/download/sha256:6177ca247f21143f839cf12aa0fda4b6ef738ef6554ce43c86446348b9bdf719/add-on-mesh-mesh-align-plus-v1.1.0-rc.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mesh-mesh-align-plus/","maintainer":"BitByte","license":["SPDX:GPL-2.0-or-later"],"tags":["3D View","Mesh","Modeling","Object","User Interface"]},{"id":"theme_Houdini","schema_version":"1.0.0","name":"Houdini","version":"1.3.0","tagline":"Theme Inspired By SideFX Houdini","archive_hash":"sha256:3d656c2c963edaf5040ca9ffb4f87ba7559b2cf6b3962d66b951a9e21d3dd3b9","archive_size":5502,"archive_url":"https://extensions.blender.org/download/sha256:3d656c2c963edaf5040ca9ffb4f87ba7559b2cf6b3962d66b951a9e21d3dd3b9/theme-theme-houdini-v1.3.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-houdini/","maintainer":"rmantdtg","license":["SPDX:GPL-2.0-or-later"],"tags":["Inspired By"]},{"id":"mio3_copy_weight","schema_version":"1.0.0","name":"Mio3 Copy Weight","version":"1.1.0","tagline":"Copies weights of selected vertices across objects","archive_hash":"sha256:6957c7eb02bbae11a3a5efef3b1470c8471b1864a71c08c69edeb0941249e92e","archive_size":15521,"archive_url":"https://extensions.blender.org/download/sha256:6957c7eb02bbae11a3a5efef3b1470c8471b1864a71c08c69edeb0941249e92e/add-on-mio3-copy-weight-v1.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/mio3-copy-weight/","maintainer":"mio","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"whispering_ripples","schema_version":"1.0.0","name":"Whispering Ripples","version":"1.3.0","tagline":"In the whisper of the night, ripples of creativity flow freely","archive_hash":"sha256:90a7ebd8eb00c189410b2bdb76c9d45863a44284af13ca8a3bf78a42bf1f93e1","archive_size":6168,"archive_url":"https://extensions.blender.org/download/sha256:90a7ebd8eb00c189410b2bdb76c9d45863a44284af13ca8a3bf78a42bf1f93e1/theme-whispering-ripples-v1.3.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/whispering-ripples/","maintainer":"DaoL","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"sequenced_bake","schema_version":"1.0.0","name":"Sequenced Bake","version":"1.1.2","tagline":"Tools for baking material sequences and generating sprite sheets","archive_hash":"sha256:917f041e203e21f2bdfe94fe45f954102fafcd8383092f1e19fa58b0cc63a5e9","archive_size":36274,"archive_url":"https://extensions.blender.org/download/sha256:917f041e203e21f2bdfe94fe45f954102fafcd8383092f1e19fa58b0cc63a5e9/add-on-sequenced-bake-v1.1.2.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/sequenced-bake/","maintainer":"Anthony-OConnell","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Saving and opening image files"},"tags":["Material","Bake","Node"]},{"id":"quick_menu","schema_version":"1.0.0","name":"QuickMenu","version":"2.0.0","tagline":"Quick-Add/Mod & Quick-Cam","archive_hash":"sha256:da1b178cbeb2abab2051e7017964a287d56de4c44dbf8386623af4834adce6d2","archive_size":17449,"archive_url":"https://extensions.blender.org/download/sha256:da1b178cbeb2abab2051e7017964a287d56de4c44dbf8386623af4834adce6d2/add-on-quick-menu-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-menu/","maintainer":"QiuMu","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"auto_track","schema_version":"1.0.0","name":"Auto-tracking","version":"1.0.0","tagline":"VFX motion tracking automation","archive_hash":"sha256:e4dc16bbe23f728ddd3c0a1f9a2389e9708c24d4975d00a77da1a676b8df928d","archive_size":3589,"archive_url":"https://extensions.blender.org/download/sha256:e4dc16bbe23f728ddd3c0a1f9a2389e9708c24d4975d00a77da1a676b8df928d/add-on-auto-track-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-track/","maintainer":"mcd1992","license":["SPDX:GPL-2.0-or-later"],"tags":["Tracking"]},{"id":"snap_bisect","schema_version":"1.0.0","name":"Snap Bisect","version":"1.0.6","tagline":"Bisect operator with snapping to vertices or edge midpoints","archive_hash":"sha256:396b5687b0917b6d0ac5105da9f6d18ecf582483c73a96a2de89a06556e2154a","archive_size":3851,"archive_url":"https://extensions.blender.org/download/sha256:396b5687b0917b6d0ac5105da9f6d18ecf582483c73a96a2de89a06556e2154a/add-on-snap-bisect-v1.0.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/snap-bisect/","maintainer":"AdamDominec","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"shape_key_swapper_extension","schema_version":"1.0.0","name":"ShapeKeySwapper","version":"1.0.3","tagline":"Swap vertex positions between 0 and 1 of the active shape key","archive_hash":"sha256:cdf443f57432608598903ed9f25a0821341ebb75feec8c83ead31545956476e0","archive_size":1941,"archive_url":"https://extensions.blender.org/download/sha256:cdf443f57432608598903ed9f25a0821341ebb75feec8c83ead31545956476e0/add-on-shape-key-swapper-extension-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shape-key-swapper-extension/","maintainer":"Maro3D","license":["SPDX:GPL-2.0-or-later"],"tags":["Mesh"]},{"id":"passpartout_slider","schema_version":"1.0.0","name":"Passpartout Slider","version":"1.0.0","tagline":"Let's you control active camera Passpartout by pressing P","archive_hash":"sha256:7d7cb75097ba7baff6feea1dff47164f2a36cd660d0845353a2ddb44fa134e21","archive_size":1819,"archive_url":"https://extensions.blender.org/download/sha256:7d7cb75097ba7baff6feea1dff47164f2a36cd660d0845353a2ddb44fa134e21/add-on-passpartout-slider-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/passpartout-slider/","maintainer":"Costa","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"Professional_theme","schema_version":"1.0.0","name":"Professional","version":"1.0.3","tagline":"Refined dark theme for professional use","archive_hash":"sha256:9af676f323f68fe8a7d415a434509fe832b3453936e0b78d2e0964194fd41056","archive_size":37056,"archive_url":"https://extensions.blender.org/download/sha256:9af676f323f68fe8a7d415a434509fe832b3453936e0b78d2e0964194fd41056/theme-professional-theme-v1.0.3.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"5.2.0","website":"https://extensions.blender.org/themes/professional-theme/","maintainer":"kame404","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"keyframe_tools_extension","schema_version":"1.0.0","name":"Keyframe Tools","version":"1.0.7","tagline":"A set of tools for inserting, deleting, and moving keyframes","archive_hash":"sha256:e755c7ebb0df1e234b11a7f6ee93d05f9367913cf29121bdd42ce32fa52e324e","archive_size":11009,"archive_url":"https://extensions.blender.org/download/sha256:e755c7ebb0df1e234b11a7f6ee93d05f9367913cf29121bdd42ce32fa52e324e/add-on-keyframe-tools-extension-v1.0.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/keyframe-tools-extension/","maintainer":"Hydrocallis","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"omUlete","schema_version":"1.0.0","name":"omUlete","version":"0.98.8","tagline":"A stand-alone exporter for the Panda3D .egg format","archive_hash":"sha256:44c9b28bfc67dae7f58edca9527728c860fac7901f7d817a33110d4686f999a0","archive_size":33170,"archive_url":"https://extensions.blender.org/download/sha256:44c9b28bfc67dae7f58edca9527728c860fac7901f7d817a33110d4686f999a0/add-on-omulete-v0.98.8.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/omulete/","maintainer":"Jackson-Sutherland","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"save exported egg files"},"tags":["Import-Export","Game Engine"]},{"id":"custom_output_path","schema_version":"1.0.0","name":"Custom Output Path","version":"1.1.7","tagline":"Customize file output paths with placeholders","archive_hash":"sha256:97f14df19bdc4d19105fb30245dbcb71f77b28fa91b41a81ac7fb098b93b46fc","archive_size":23227,"archive_url":"https://extensions.blender.org/download/sha256:97f14df19bdc4d19105fb30245dbcb71f77b28fa91b41a81ac7fb098b93b46fc/add-on-custom-output-path-v1.1.7.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/custom-output-path/","maintainer":"Shuimeng","license":["SPDX:GPL-3.0-or-later"],"tags":["Compositing","Render"]},{"id":"render_preset","schema_version":"1.0.0","name":"Render Preset","version":"1.3.4","tagline":"Create and use render presets","archive_hash":"sha256:429dcb66ab8906791ae7ec237b9f07990f93ce00738f195f282ebc137142ebd3","archive_size":74565,"archive_url":"https://extensions.blender.org/download/sha256:429dcb66ab8906791ae7ec237b9f07990f93ce00738f195f282ebc137142ebd3/add-on-render-preset-v1.3.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/render-preset/","maintainer":"tonton_","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Reading and writing json preset files in a user-defined location"},"tags":["Render","Pipeline"]},{"id":"mesh_maze","schema_version":"1.0.0","name":"Maze any Mesh","version":"1.2.2","tagline":"Convert any mesh to a maze pattern","archive_hash":"sha256:032c4ec845968791fceba506688f0af05f64566a88fc9f8d3353c4d8aa0589f2","archive_size":18705,"archive_url":"https://extensions.blender.org/download/sha256:032c4ec845968791fceba506688f0af05f64566a88fc9f8d3353c4d8aa0589f2/add-on-mesh-maze-v1.2.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mesh-maze/","maintainer":"elfnorcat","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"NodePie","schema_version":"1.0.0","name":"Node Pie","version":"1.2.53","tagline":"Add nodes faster with a pie menu","archive_hash":"sha256:7f4308c2d6cdf3ff6090a588b40281441b859e23178112de427c82f632e676ed","archive_size":431545,"archive_url":"https://extensions.blender.org/download/sha256:7f4308c2d6cdf3ff6090a588b40281441b859e23178112de427c82f632e676ed/add-on-nodepie-v1.2.53.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nodepie/","maintainer":"Strike_Digital","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Reading and writing config files"},"tags":["User Interface","Node"]},{"id":"drag_and_drop_support","schema_version":"1.0.0","name":"Drag and Drop Support","version":"1.3.0","tagline":"Support and improve drag and drop imports in Blender","archive_hash":"sha256:ffca1b51dec3b369d4550b7890bdcfe83ca5e33fbf8b0f77c6feb777640a0980","archive_size":29508,"archive_url":"https://extensions.blender.org/download/sha256:ffca1b51dec3b369d4550b7890bdcfe83ca5e33fbf8b0f77c6feb777640a0980/add-on-drag-and-drop-support-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/drag-and-drop-support/","maintainer":"Natsune-Mochizuki","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import models from the disk"},"tags":["3D View","Import-Export"]},{"id":"deep_gray_something","schema_version":"1.0.0","name":"Deep Gray Something","version":"1.0.1","tagline":"Blender 5 dark theme with blue and green selection highlights","archive_hash":"sha256:c7b1258ab1aec1a1e740e3899353305af318599e29fad0ef83abfdd0e44302c1","archive_size":6009,"archive_url":"https://extensions.blender.org/download/sha256:c7b1258ab1aec1a1e740e3899353305af318599e29fad0ef83abfdd0e44302c1/theme-deep-gray-something-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/deep-gray-something/","maintainer":"blanchsb","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","High Contrast","Accessibility"]},{"id":"matbatchtools","schema_version":"1.0.0","name":"Material Batch Tools","version":"2.3.2","tagline":"Quick batch automation of common material tasks","archive_hash":"sha256:2e401a8e2ad6de13a53c7a9b751d6276cb02b9d9cd1e027d2ff48cd58870a08f","archive_size":35616,"archive_url":"https://extensions.blender.org/download/sha256:2e401a8e2ad6de13a53c7a9b751d6276cb02b9d9cd1e027d2ff48cd58870a08f/add-on-matbatchtools-v2.3.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/matbatchtools/","maintainer":"Theanine3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","Node"]},{"id":"sourceenginecollisiontools","schema_version":"1.0.0","name":"Source Engine Collision Tools","version":"3.1.1","tagline":"Generate & optimize collision models for use in Source Engine","archive_hash":"sha256:cd0beb8c9123274c81dfcad4f43ae3e29cc2efafd7a83533fc1ee370593fcf69","archive_size":68537,"archive_url":"https://extensions.blender.org/download/sha256:cd0beb8c9123274c81dfcad4f43ae3e29cc2efafd7a83533fc1ee370593fcf69/add-on-sourceenginecollisiontools-v3.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sourceenginecollisiontools/","maintainer":"Theanine3D","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export collision-related QC and VMF files"},"tags":["Mesh","Object","Game Engine"]},{"id":"Key_Ops_Toolkit","schema_version":"1.0.0","name":"Key Ops: Toolkit","version":"0.2.52","tagline":"Industri Standard Tools & Shortcuts to Speed Up Blender Workflow","archive_hash":"sha256:794cc4fdcfd23b78d017e3442b03352f1e8abc0faf86610a79e4d0a925033aea","archive_size":291873,"archive_url":"https://extensions.blender.org/download/sha256:794cc4fdcfd23b78d017e3442b03352f1e8abc0faf86610a79e4d0a925033aea/add-on-key-ops-toolkit-v0.2.52.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/key-ops-toolkit/","maintainer":"Dan-Gry","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export/Import .obj files and use of temp folder"},"tags":["Modeling","Mesh","Object","UV","3D View"]},{"id":"hot_node","schema_version":"1.0.0","name":"Hot Node","version":"1.2.1","tagline":"Add nodes like adding node","archive_hash":"sha256:ba974165b67c4820466d70cce8f67242e6d6e8e9bbd6013f833a354cc26ef3f4","archive_size":113483,"archive_url":"https://extensions.blender.org/download/sha256:ba974165b67c4820466d70cce8f67242e6d6e8e9bbd6013f833a354cc26ef3f4/add-on-hot-node-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/hot-node/","maintainer":"Trantor","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Access file system for storing custom nodes"},"tags":["Node","Geometry Nodes","Material"]},{"id":"ZenUVChecker","schema_version":"1.0.0","name":"Zen UV Checker","version":"1.5.1","tagline":"Check the state of UVs on the model easily with Checker Textures","archive_hash":"sha256:82f22c29e599869a3b87b4cde469c47b603e4d68f70539cadb4196961c152e44","archive_size":2989307,"archive_url":"https://extensions.blender.org/download/sha256:82f22c29e599869a3b87b4cde469c47b603e4d68f70539cadb4196961c152e44/add-on-zenuvchecker-v1.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/zenuvchecker/","maintainer":"Sergey_Tyapkin","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Access to folders for importing Checker Textures"},"tags":["UV"]},{"id":"improved_node_search","schema_version":"1.0.0","name":"Improved Node Search","version":"1.0.5","tagline":"Navigate your node tree faster via more node search options","archive_hash":"sha256:a44ed6dbf107e0ef69c008b963ecc776101082c827bd943b9a01cdcc7c3991c4","archive_size":11647,"archive_url":"https://extensions.blender.org/download/sha256:a44ed6dbf107e0ef69c008b963ecc776101082c827bd943b9a01cdcc7c3991c4/add-on-improved-node-search-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/improved-node-search/","maintainer":"Griperis","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","User Interface"]},{"id":"noise_nodes","schema_version":"1.0.0","name":"Noise Nodes","version":"0.7.0","tagline":"Advance Noise Nodes For blender","archive_hash":"sha256:5213c751c997a1fc6905c912a60c254d0b95cdb571b7c3db1058be8b5f3755dc","archive_size":1482042,"archive_url":"https://extensions.blender.org/download/sha256:5213c751c997a1fc6905c912a60c254d0b95cdb571b7c3db1058be8b5f3755dc/add-on-noise-nodes-v0.7.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/noise-nodes/","maintainer":"Haseeb-Ahmed-3","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","Node"]},{"id":"Modifier_List_Fork","schema_version":"1.0.0","name":"Modifier List","version":"1.9.88","tagline":"Enhanced Modifier UI/Features, now with Edit Mesh Modifier","archive_hash":"sha256:3cb1e3fa2c6ac94ef4afd535e13a947379bc215d16084983415f9600b11c7d55","archive_size":164500,"archive_url":"https://extensions.blender.org/download/sha256:3cb1e3fa2c6ac94ef4afd535e13a947379bc215d16084983415f9600b11c7d55/add-on-modifier-list-fork-v1.9.88.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/modifier-list-fork/","maintainer":"Dan-Gry","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save Add-on Prefrences"},"tags":["Modeling","User Interface"]},{"id":"PolyQuilt_Fork","schema_version":"1.0.0","name":"PolyQuilt Retopology Tool","version":"1.45.9","tagline":"Retopology Tool for Blender","archive_hash":"sha256:931a4ae81b0c3fde2e17f498f0b6b7d73b54108abeb806d59b73d6733fa09af5","archive_size":179729,"archive_url":"https://extensions.blender.org/download/sha256:931a4ae81b0c3fde2e17f498f0b6b7d73b54108abeb806d59b73d6733fa09af5/add-on-polyquilt-fork-v1.45.9.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/polyquilt-fork/","maintainer":"Dan-Gry","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling"]},{"id":"clear_filepaths","schema_version":"1.0.0","name":"Clear Filepaths","version":"1.1.2","tagline":"Removes personal filepaths from your .blend file","archive_hash":"sha256:5800df075e83a222323db050bc9b774ad087dbca1b707103dba34ee5901f76a9","archive_size":4114,"archive_url":"https://extensions.blender.org/download/sha256:5800df075e83a222323db050bc9b774ad087dbca1b707103dba34ee5901f76a9/add-on-clear-filepaths-v1.1.2-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/clear-filepaths/","maintainer":"FlailingFog","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Saves a copy of a .blend file without filepaths"},"platforms":["windows-x64"],"tags":["System"]},{"id":"onyx","schema_version":"1.0.0","name":"Onyx","version":"1.1.0","tagline":"A minimalistic dark theme","archive_hash":"sha256:12963bbe3977a90f69a3edb0c21ef72620f162cde4160c70c9811cf2ec419da6","archive_size":5177,"archive_url":"https://extensions.blender.org/download/sha256:12963bbe3977a90f69a3edb0c21ef72620f162cde4160c70c9811cf2ec419da6/theme-onyx-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/onyx/","maintainer":"Aeraglyx","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"professional_plus","schema_version":"1.0.0","name":"Professional Plus","version":"1.4.0","tagline":"Professional theme with more vivid colors: ✨ PROFESSIONAL PLUS","archive_hash":"sha256:e108953aa81a87fa4f892505b856f08a3bf284cac635776c5c58d0fccff261cd","archive_size":5976,"archive_url":"https://extensions.blender.org/download/sha256:e108953aa81a87fa4f892505b856f08a3bf284cac635776c5c58d0fccff261cd/theme-professional-plus-v1.4.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/professional-plus/","maintainer":"Alessandro-Vecchio","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","High Contrast"]},{"id":"incremental_auto_save","schema_version":"1.0.0","name":"Incremental Auto-Save","version":"1.1.1","tagline":"Improvements to Blender's Autosave","archive_hash":"sha256:f97c7e93f3ba3f7f6d8cbe3e0dbc911bb5d0011df70841e4762f80bea70e1cee","archive_size":74530,"archive_url":"https://extensions.blender.org/download/sha256:f97c7e93f3ba3f7f6d8cbe3e0dbc911bb5d0011df70841e4762f80bea70e1cee/add-on-incremental-auto-save-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/incremental-auto-save/","maintainer":"Mets","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save preferences & .blends in chosen directories"},"tags":["System"]},{"id":"tiny_backup","schema_version":"1.0.0","name":"Tiny Backup","version":"1.0.2","tagline":"A minimalistic backup solution","archive_hash":"sha256:00f0e44af81d41ba29b5e95b10fad221791be4b611ed8ce462d5afab4f75cadc","archive_size":13763,"archive_url":"https://extensions.blender.org/download/sha256:00f0e44af81d41ba29b5e95b10fad221791be4b611ed8ce462d5afab4f75cadc/add-on-tiny-backup-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/tiny-backup/","maintainer":"Thane5","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Save backups on disk"},"tags":["System"]},{"id":"Randomize_Bones_Pose","schema_version":"1.0.0","name":"Randomize_Bones_Pose","version":"2.0.0","tagline":"Randomize_Bones_Pose","archive_hash":"sha256:f7cb0958faf3f296809e664f74ec4aec03b39cf1af6d64371b64061f44044bb4","archive_size":16685,"archive_url":"https://extensions.blender.org/download/sha256:f7cb0958faf3f296809e664f74ec4aec03b39cf1af6d64371b64061f44044bb4/add-on-randomize-bones-pose-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/randomize-bones-pose/","maintainer":"IZ.MdVerz","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Rigging"]},{"id":"omniscient","schema_version":"1.0.0","name":"Omniscient Importer","version":"2.3.5","tagline":"Automated scene setup for shots recorded with Omniscient iOS app","archive_hash":"sha256:551f3da30cbb1e8033aec1e4572cf211d530fe5dccde151c8a4b10897fb16b1e","archive_size":119480,"archive_url":"https://extensions.blender.org/download/sha256:551f3da30cbb1e8033aec1e4572cf211d530fe5dccde151c8a4b10897fb16b1e/add-on-omniscient-v2.3.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/omniscient/","maintainer":"Omniscient","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import .omni file from disk"},"tags":["Tracking","Import-Export","Camera","Compositing","Animation","Mesh","Scene"]},{"id":"pose_shape_keys","schema_version":"1.0.0","name":"Pose Shape Keys","version":"1.0.0","tagline":"Preserve your shape keys through weight changes, and much more","archive_hash":"sha256:f90f6365a515d7ddd60f8e8410a4a4d1fb36594ae20e3b989f09d9d4360849f6","archive_size":35835,"archive_url":"https://extensions.blender.org/download/sha256:f90f6365a515d7ddd60f8e8410a4a4d1fb36594ae20e3b989f09d9d4360849f6/add-on-pose-shape-keys-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pose-shape-keys/","maintainer":"Mets","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"select_panel_xdanic","schema_version":"1.0.0","name":"Select panel","version":"0.1.5","tagline":"All selections and more under a panel","archive_hash":"sha256:39f014c0fe720f04cfa525ff9c9e1fa13d899611969efecfe97002fc8a7cb793","archive_size":4058,"archive_url":"https://extensions.blender.org/download/sha256:39f014c0fe720f04cfa525ff9c9e1fa13d899611969efecfe97002fc8a7cb793/add-on-select-panel-xdanic-v0.1.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/select-panel-xdanic/","maintainer":"xdanic","license":["SPDX:GPL-2.0"],"tags":["User Interface"]},{"id":"theme_XP_AliVe","schema_version":"1.0.0","name":"XP_AliVe","version":"1.0.3","tagline":"Blender theme inspired by 2000s","archive_hash":"sha256:c0bffb862dc60fe848872207122feb401e3de59a6cd5cab5f6f7da9549ad5b7a","archive_size":5978,"archive_url":"https://extensions.blender.org/download/sha256:c0bffb862dc60fe848872207122feb401e3de59a6cd5cab5f6f7da9549ad5b7a/theme-theme-xp-alive-v1.0.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-xp-alive/","maintainer":"AliVe","license":["SPDX:GPL-2.0-or-later"],"tags":["Colorful","High Contrast","Inspired By","Accessibility"]},{"id":"MustardUI","schema_version":"1.0.0","name":"MustardUI","version":"2026.4.1","tagline":"Easy-to-use UI for human characters","archive_hash":"sha256:26f0e48a520e8953213593f787eb0525e95a2bdb1eedb895a3565969b4990068","archive_size":484948,"archive_url":"https://extensions.blender.org/download/sha256:26f0e48a520e8953213593f787eb0525e95a2bdb1eedb895a3565969b4990068/add-on-mustardui-v2026.4.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mustardui/","maintainer":"Mustard","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export templates from/to disk"},"tags":["User Interface"]},{"id":"Half_Knife","schema_version":"1.0.0","name":"Half Knife","version":"1.3.85","tagline":"Optimized for fast workflow knife tool for Blender","archive_hash":"sha256:9c03a65b75ae4b8d6b9a3917d4ccd213d005443a56cc38f1519db7a079ab3c83","archive_size":15498,"archive_url":"https://extensions.blender.org/download/sha256:9c03a65b75ae4b8d6b9a3917d4ccd213d005443a56cc38f1519db7a079ab3c83/add-on-half-knife-v1.3.85.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/half-knife/","maintainer":"Dan-Gry","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling"]},{"id":"node_quick_maths","schema_version":"1.0.0","name":"Node Quick Maths","version":"1.2.2","tagline":"A fast way to make long math chains in node editors","archive_hash":"sha256:c68f02a0e467f315f9693de37ff4a3d2d14b26e01ecb895b95759bb04062ceac","archive_size":22432,"archive_url":"https://extensions.blender.org/download/sha256:c68f02a0e467f315f9693de37ff4a3d2d14b26e01ecb895b95759bb04062ceac/add-on-node-quick-maths-v1.2.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-quick-maths/","maintainer":"Zeptofine","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Pipeline","User Interface"]},{"id":"easyweight","schema_version":"1.0.0","name":"EasyWeight","version":"1.0.9","tagline":"Weight Painting Workflow Boosters","archive_hash":"sha256:9334b15aef0668f4405b4c94af24da413100ac0090391cfa68669190e2266ee0","archive_size":42626,"archive_url":"https://extensions.blender.org/download/sha256:9334b15aef0668f4405b4c94af24da413100ac0090391cfa68669190e2266ee0/add-on-easyweight-v1.0.9.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/easyweight/","maintainer":"Mets","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"set_smooth_group","schema_version":"1.0.0","name":"Set Smooth Group","version":"1.1.0","tagline":"Simplify setting smooth groups with sharp edges","archive_hash":"sha256:aaf35ea5fe6627cfbf550e508fb4f21de8a87029ec914be59d765fd793b8273b","archive_size":17228,"archive_url":"https://extensions.blender.org/download/sha256:aaf35ea5fe6627cfbf550e508fb4f21de8a87029ec914be59d765fd793b8273b/add-on-set-smooth-group-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/set-smooth-group/","maintainer":"VIktor-Kom","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh"]},{"id":"toggle_socket_visibility","schema_version":"1.0.0","name":"Toggle Socket Visibility","version":"1.0.0","tagline":"Control which node sockets are visible or not via panel/pop-up","archive_hash":"sha256:948e5bb472ec2fd75345e37139edccd83181925d756a2974a7f22b8beaafe00f","archive_size":7638,"archive_url":"https://extensions.blender.org/download/sha256:948e5bb472ec2fd75345e37139edccd83181925d756a2974a7f22b8beaafe00f/add-on-toggle-socket-visibility-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/toggle-socket-visibility/","maintainer":"quackarooni","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","User Interface"]},{"id":"strange_attractors","schema_version":"1.0.0","name":"Strange Attractors","version":"2.1.0","tagline":"Add Strange Attractor curves","archive_hash":"sha256:466827116b5e4e4fa70a1b4d54597f207da22edb8b3eb693d0690df836738e06","archive_size":11456,"archive_url":"https://extensions.blender.org/download/sha256:466827116b5e4e4fa70a1b4d54597f207da22edb8b3eb693d0690df836738e06/add-on-strange-attractors-v2.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/strange-attractors/","maintainer":"7bitretro","license":["SPDX:GPL-2.0-or-later"],"tags":["Add Curve"]},{"id":"k_tools_view_sync","schema_version":"1.0.0","name":"Sync | Lock Viewport","version":"2.7.0","tagline":"Sync or Lock multiple viewports at once in real-time","archive_hash":"sha256:c4de7444a9f90e3f641eced7a0ee148b04a50bf4d21eb1bc22077ac09eaa0edf","archive_size":46836,"archive_url":"https://extensions.blender.org/download/sha256:c4de7444a9f90e3f641eced7a0ee148b04a50bf4d21eb1bc22077ac09eaa0edf/add-on-k-tools-view-sync-v2.7.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/k-tools-view-sync/","maintainer":"Robert-Kezives","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"universal_multi_importer","schema_version":"1.0.0","name":"Universal Multi Importer","version":"2.4.0","tagline":"Batch Import many file formats at once, Batch process them","archive_hash":"sha256:aa7b344effcad9f906dc44961dbae48ade53fe6cbd5774f1e4fd9445d13f8a4b","archive_size":100703,"archive_url":"https://extensions.blender.org/download/sha256:aa7b344effcad9f906dc44961dbae48ade53fe6cbd5774f1e4fd9445d13f8a4b/add-on-universal-multi-importer-v2.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/universal-multi-importer/","maintainer":"Tilapiatsu","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import Files from disk, save presets to disk"},"tags":["Import-Export","Pipeline"]},{"id":"BAM","schema_version":"1.0.0","name":"[BAM] AutoMat","version":"1.2.1","tagline":"Batch creation of materials from textures folder","archive_hash":"sha256:95fb5bf6be46b48fec1273025e31c522a09491b6d7503ab6343ed24bdcb5e649","archive_size":563501,"archive_url":"https://extensions.blender.org/download/sha256:95fb5bf6be46b48fec1273025e31c522a09491b6d7503ab6343ed24bdcb5e649/add-on-bam-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bam/","maintainer":"AlexeyHRDesign","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","Import-Export"]},{"id":"action_to_scene_range","schema_version":"1.0.0","name":"Action to Scene Range","version":"1.7.0","tagline":"When switching Actions, automatically set the Scene Frame Range","archive_hash":"sha256:bf2cb52492569624d6f1a1a19f4fde207d1ad6a18eab4e8e548da0bc6ace6ecf","archive_size":2520,"archive_url":"https://extensions.blender.org/download/sha256:bf2cb52492569624d6f1a1a19f4fde207d1ad6a18eab4e8e548da0bc6ace6ecf/add-on-action-to-scene-range-v1.7.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/action-to-scene-range/","maintainer":"dr.sybren","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"face_set_operators","schema_version":"1.0.0","name":"Face Set Operators","version":"1.0.0","tagline":"Convert sculpt mode attributes into anything you need","archive_hash":"sha256:73cd9f9c8a1eca7c893947165c061ad38e8f7d189a4ef24e65e03f398826f5e6","archive_size":4650,"archive_url":"https://extensions.blender.org/download/sha256:73cd9f9c8a1eca7c893947165c061ad38e8f7d189a4ef24e65e03f398826f5e6/add-on-face-set-operators-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/face-set-operators/","maintainer":"nickberckley","license":["SPDX:GPL-3.0-or-later"],"tags":["Sculpt","Mesh"]},{"id":"my_best_pie_menu_ever","schema_version":"1.0.0","name":"My Best Pie Menu Ever","version":"2.9.1","tagline":"Quick access to the functions you need","archive_hash":"sha256:dc2b09cf7638d2fa82ebf504c9f76fc269978e6fd7d033d2b0a178fd1d727d6c","archive_size":84510,"archive_url":"https://extensions.blender.org/download/sha256:dc2b09cf7638d2fa82ebf504c9f76fc269978e6fd7d033d2b0a178fd1d727d6c/add-on-my-best-pie-menu-ever-v2.9.1.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/my-best-pie-menu-ever/","maintainer":"emptybraces","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export FBX from/to disk"},"tags":["3D View","User Interface"]},{"id":"mmd_tools","schema_version":"1.0.0","name":"MMD Tools","version":"4.5.10","tagline":"Utility tools for MMD model editing","archive_hash":"sha256:8fac843f5c876c962f8f6ca87446dd61c1a7ac1b5c1ad291db09b6d8ba3636af","archive_size":754920,"archive_url":"https://extensions.blender.org/download/sha256:8fac843f5c876c962f8f6ca87446dd61c1a7ac1b5c1ad291db09b6d8ba3636af/add-on-mmd-tools-v4.5.10.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"6.0.0","website":"https://extensions.blender.org/add-ons/mmd-tools/","maintainer":"MMD","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export PMX/PMD/VMD/VPD from/to disk"},"tags":["3D View","Camera","Import-Export","Material","Mesh","Object","Physics"]},{"id":"bioxelnodes","schema_version":"1.0.0","name":"Bioxel Nodes","version":"1.0.9","tagline":"For scientific volumetric data visualization in Blender","archive_hash":"sha256:9e17324d019913f12e94c9e1ca7304bc1728738406b201275817ffda896e1620","archive_size":28047296,"archive_url":"https://extensions.blender.org/download/sha256:9e17324d019913f12e94c9e1ca7304bc1728738406b201275817ffda896e1620/add-on-bioxelnodes-v1.0.9-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bioxelnodes/","maintainer":"icrdr","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export volume data from/to disk"},"platforms":["windows-x64"],"tags":["Geometry Nodes","Render","Import-Export"]},{"id":"molecularnodes","schema_version":"1.0.0","name":"Molecular Nodes","version":"4.5.12","tagline":"A toolbox for molecular import and animation in Blender","archive_hash":"sha256:d7523ae0233d3ec67215e5101fa60cae9e5ccf60bb224aa49ae1473e6136a3a4","archive_size":132599384,"archive_url":"https://extensions.blender.org/download/sha256:d7523ae0233d3ec67215e5101fa60cae9e5ccf60bb224aa49ae1473e6136a3a4/add-on-molecularnodes-v4.5.12-windows-x64.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/molecularnodes/","maintainer":"bradyajohnston","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Importing data files from disk and caching downloads","network":"Downloading structural data from the PDB and AFPDB"},"platforms":["windows-x64"],"tags":["Geometry Nodes","Import-Export"]},{"id":"io_scene_psk_psa","schema_version":"1.0.0","name":"Unreal PSK/PSA (.psk/.psa)","version":"9.1.2","tagline":"Import and export PSK and PSA files used in Unreal Engine","archive_hash":"sha256:a134bfa33f54804b9434149dea11472fc6ea43bb851a72d07df3511c843a4a4d","archive_size":80731,"archive_url":"https://extensions.blender.org/download/sha256:a134bfa33f54804b9434149dea11472fc6ea43bb851a72d07df3511c843a4a4d/add-on-io-scene-psk-psa-v9.1.2.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/io-scene-psk-psa/","maintainer":"darknation","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and write PSK and PSA files from and to disk"},"tags":["Game Engine","Import-Export"]},{"id":"theme_Plasticity","schema_version":"1.0.0","name":"Plasticity","version":"2.0.0","tagline":"Theme Inspired By Plasticity app","archive_hash":"sha256:784ac771c1ae56b9382a09e8b99d5835033b36c095cda9afd28487f0695a0351","archive_size":6395,"archive_url":"https://extensions.blender.org/download/sha256:784ac771c1ae56b9382a09e8b99d5835033b36c095cda9afd28487f0695a0351/theme-theme-plasticity-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-plasticity/","maintainer":"SHEK","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","High Contrast","Inspired By","Accessibility"]},{"id":"open_stage_blender_dmx","schema_version":"1.0.0","name":"DMX","version":"2.1.8","tagline":"Visualization & programming with GDTF&MVR, OSC, PSN, Networking","archive_hash":"sha256:df5ba03e30ac596e13648d75dc4d54659cc720193967d7712a4dc084b5a91acd","archive_size":2030358,"archive_url":"https://extensions.blender.org/download/sha256:df5ba03e30ac596e13648d75dc4d54659cc720193967d7712a4dc084b5a91acd/add-on-open-stage-blender-dmx-v2.1.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/open-stage-blender-dmx/","maintainer":"Sunova","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import GDTF devices. Import/Export MVR scenes and project data","network":"For GDTF Share, sACN, Art-Net, OSC, PSN, MVR-xchange"},"tags":["Lighting","Animation","Scene","Import-Export","Rigging","Tracking","Sequencer","3D View","Camera"]},{"id":"maze_generator","schema_version":"1.0.0","name":"Maze Generator","version":"0.2.5","tagline":"A Maze generator extension for Blender","archive_hash":"sha256:aa1ee5351cb2468855d86f5a3435a35f4fdf64e1515b0997d755ffa87bf77030","archive_size":22231,"archive_url":"https://extensions.blender.org/download/sha256:aa1ee5351cb2468855d86f5a3435a35f4fdf64e1515b0997d755ffa87bf77030/add-on-maze-generator-v0.2.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/maze-generator/","maintainer":"Leeroy-Majors","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh"]},{"id":"node_group_presets","schema_version":"1.0.0","name":"Node Group Presets","version":"0.8.0","tagline":"Save Node Group values as presets","archive_hash":"sha256:201454f4c0a32eed158502d13a0887141aaf4494647a22b4264802f94272b5a0","archive_size":27634,"archive_url":"https://extensions.blender.org/download/sha256:201454f4c0a32eed158502d13a0887141aaf4494647a22b4264802f94272b5a0/add-on-node-group-presets-v0.8.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-group-presets/","maintainer":"juaum","license":["SPDX:GPL-3.0-or-later"],"permissions":{"clipboard":"Copy/paste presets between nodedroups and across files"},"tags":["Geometry Nodes","Material","Node"]},{"id":"booltron","schema_version":"1.0.0","name":"Booltron","version":"3.3.2","tagline":"Super add-on for superfast booleans","archive_hash":"sha256:f353beedfc46a1f321e1abc02a0294ebdfc9fb2c735d9bb0df5307b2701127b6","archive_size":166040,"archive_url":"https://extensions.blender.org/download/sha256:f353beedfc46a1f321e1abc02a0294ebdfc9fb2c735d9bb0df5307b2701127b6/add-on-booltron-v3.3.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/booltron/","maintainer":"MikhailRachinskiy","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Object"]},{"id":"quick_groups","schema_version":"1.0.0","name":"Quick Groups (Instances)","version":"1.0.3","tagline":"Group objects with Ctrl+G using instances","archive_hash":"sha256:f9da4f1267c480b5fd252e2d61573e1ebbd3e4fafa723547b93f032d7292d01c","archive_size":6862,"archive_url":"https://extensions.blender.org/download/sha256:f9da4f1267c480b5fd252e2d61573e1ebbd3e4fafa723547b93f032d7292d01c/add-on-quick-groups-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-groups/","maintainer":"MultLabs","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Modeling"]},{"id":"t3d_gn_presets","schema_version":"1.0.0","name":"T3D GN Presets","version":"1.6.0","tagline":"A versatile collection of useful node groups for Geometry Nodes","archive_hash":"sha256:1b5e343d3b335b85caa7be2b9410b8218b777546638cdc5bce6e9f6e774e71cd","archive_size":835788,"archive_url":"https://extensions.blender.org/download/sha256:1b5e343d3b335b85caa7be2b9410b8218b777546638cdc5bce6e9f6e774e71cd/add-on-t3d-gn-presets-v1.6.0.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/t3d-gn-presets/","maintainer":"Tams_3d","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Append node-groups from source file"},"tags":["Geometry Nodes"]},{"id":"per_camera_resolution","schema_version":"1.0.0","name":"Per-Camera Resolution","version":"2.3.2","tagline":"Every camera should have its resolution","archive_hash":"sha256:48cecdfc004417c6d0dee452657d0822dd96ea3897e159d5544d9819f3e54b8f","archive_size":11199,"archive_url":"https://extensions.blender.org/download/sha256:48cecdfc004417c6d0dee452657d0822dd96ea3897e159d5544d9819f3e54b8f/add-on-per-camera-resolution-v2.3.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/per-camera-resolution/","maintainer":"pioverfour","license":["SPDX:GPL-3.0-or-later"],"tags":["Scene","Camera"]},{"id":"synchronize_workspaces","schema_version":"1.0.0","name":"Synchronize Workspaces","version":"1.14.0","tagline":"Synchronize 3D views between workspaces","archive_hash":"sha256:156bb74e7c8e77449d9da5dabb71ef00ad0286447e24968c41173e821ee714b5","archive_size":3974,"archive_url":"https://extensions.blender.org/download/sha256:156bb74e7c8e77449d9da5dabb71ef00ad0286447e24968c41173e821ee714b5/add-on-synchronize-workspaces-v1.14.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/synchronize-workspaces/","maintainer":"MultLabs","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","User Interface"]},{"id":"grease_pencil_tool_wheel","schema_version":"1.0.0","name":"GP Tool Wheel","version":"1.0.11","tagline":"Extended pie menu for selecting Grease Pencil tools quickly","archive_hash":"sha256:c6c1c53b5f17791958cb92a02f38e9cbaf9e578226d0a615e06eeb8a3cb42ba6","archive_size":206402,"archive_url":"https://extensions.blender.org/download/sha256:c6c1c53b5f17791958cb92a02f38e9cbaf9e578226d0a615e06eeb8a3cb42ba6/add-on-grease-pencil-tool-wheel-v1.0.11.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/grease-pencil-tool-wheel/","maintainer":"SietseB","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Grease Pencil"]},{"id":"commotion","schema_version":"1.0.0","name":"Commotion","version":"2.5.0","tagline":"Animation offset tools for motion graphics","archive_hash":"sha256:9554d7ccc6211c666991b03cd72b354173495dc8977320a70874694bf25179eb","archive_size":27868,"archive_url":"https://extensions.blender.org/download/sha256:9554d7ccc6211c666991b03cd72b354173495dc8977320a70874694bf25179eb/add-on-commotion-v2.5.0.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/commotion/","maintainer":"MikhailRachinskiy","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"find_bad_tracks","schema_version":"1.0.0","name":"Find Bad Tracks","version":"1.0.2","tagline":"Highlight motion tracks that move in suspicious directions","archive_hash":"sha256:b9f5373c3ca5119c4f14b9c11f0e92f2a29ff908bbd265803fef2a9d705c97b8","archive_size":25067,"archive_url":"https://extensions.blender.org/download/sha256:b9f5373c3ca5119c4f14b9c11f0e92f2a29ff908bbd265803fef2a9d705c97b8/add-on-find-bad-tracks-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/find-bad-tracks/","maintainer":"Walles","license":["SPDX:GPL-2.0-or-later"],"tags":["Tracking"]},{"id":"cloudrig","schema_version":"1.0.0","name":"CloudRig","version":"2.2.19","tagline":"Rig Generation & Rigging Workflow Tools","archive_hash":"sha256:ff00dfb468f006b3be52c19d3448ab2bf1313d54c6128392a6121162ea1a0d9a","archive_size":3801677,"archive_url":"https://extensions.blender.org/download/sha256:ff00dfb468f006b3be52c19d3448ab2bf1313d54c6128392a6121162ea1a0d9a/add-on-cloudrig-v2.2.19.zip","type":"add-on","blender_version_min":"5.0.0","blender_version_max":"6.0.0","website":"https://extensions.blender.org/add-ons/cloudrig/","maintainer":"Blender Studio","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load widgets/metarigs/preferences from disk","clipboard":"Copy/paste Bone Collections between armatures"},"tags":["Rigging"]},{"id":"theme_drcl","schema_version":"1.0.0","name":"drcl","version":"1.0.3","tagline":"A variation of Dracula dark theme","archive_hash":"sha256:bcb32cf5c1a0bafffdb7e2223b1f5eeedf272750227318ac65d0596748e00040","archive_size":4955,"archive_url":"https://extensions.blender.org/download/sha256:bcb32cf5c1a0bafffdb7e2223b1f5eeedf272750227318ac65d0596748e00040/theme-theme-drcl-v1.0.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-drcl/","maintainer":"Sereda","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Colorful"]},{"id":"YB_Animator_Tool","schema_version":"1.0.0","name":"YB Animator Tool","version":"1.1.3","tagline":"export grease pencil layers as keyframes and CSV","archive_hash":"sha256:7e06d55ad957752bfe87476860bd07b1d2c5609974f8a2e993975eb278768c1b","archive_size":5541,"archive_url":"https://extensions.blender.org/download/sha256:7e06d55ad957752bfe87476860bd07b1d2c5609974f8a2e993975eb278768c1b/add-on-yb-animator-tool-v1.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/yb-animator-tool/","maintainer":"YB_","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Output CSV and sequence diagram"},"tags":["Grease Pencil","Animation","User Interface"]},{"id":"keymesh","schema_version":"1.0.0","name":"Keymesh","version":"2.3.2","tagline":"Create stop-motion animations by sculpting frame-by-frame","archive_hash":"sha256:aa56eec60eee3053668594b2daf513e792d464a7593b3af6a90068f5a607ed2a","archive_size":42763,"archive_url":"https://extensions.blender.org/download/sha256:aa56eec60eee3053668594b2daf513e792d464a7593b3af6a90068f5a607ed2a/add-on-keymesh-v2.3.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/keymesh/","maintainer":"nickberckley","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Store generated pose preview images and/or load them from disk"},"tags":["Animation","Sculpt","Mesh"]},{"id":"node_annotator","schema_version":"1.0.0","name":"Node Annotator","version":"0.4.3","tagline":"Easily create good documentation of your node trees","archive_hash":"sha256:e283048c97db794f392755c44604cb95655cd73fabe7cb3f29add5d440b40411","archive_size":28712,"archive_url":"https://extensions.blender.org/download/sha256:e283048c97db794f392755c44604cb95655cd73fabe7cb3f29add5d440b40411/add-on-node-annotator-v0.4.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-annotator/","maintainer":"FrankFirsching","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Geometry Nodes"]},{"id":"theme_ps","schema_version":"1.0.0","name":"PS","version":"1.1.3","tagline":"Adobe Photoshop inspired light theme","archive_hash":"sha256:1b69c3dabcffcdd76b87ed15724dd2db995821823b72bdea8946c0709854cbc2","archive_size":5663,"archive_url":"https://extensions.blender.org/download/sha256:1b69c3dabcffcdd76b87ed15724dd2db995821823b72bdea8946c0709854cbc2/theme-theme-ps-v1.1.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-ps/","maintainer":"Sereda","license":["SPDX:GPL-2.0-or-later"],"tags":["Inspired By","Light"]},{"id":"toggle_language","schema_version":"1.0.0","name":"Toggle Language","version":"1.6.2","tagline":"One click to toggle UI between two languages","archive_hash":"sha256:67ea3fe811d72c81ad19bd1540b4cb0374446e69ae18a77b01a665d27f2da3fe","archive_size":31213,"archive_url":"https://extensions.blender.org/download/sha256:67ea3fe811d72c81ad19bd1540b4cb0374446e69ae18a77b01a665d27f2da3fe/add-on-toggle-language-v1.6.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/toggle-language/","maintainer":"del1a8dc50179276c0","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"quick_lighting_environment","schema_version":"1.0.0","name":"QLE (Quick Lighting Environment)","version":"1.8.0","tagline":"Adds a Basic Lighting Setup to Your Blender Scene","archive_hash":"sha256:561863f28ac7d0df9e815a800796efaca126ad78cd23741ac28807f262031883","archive_size":105787,"archive_url":"https://extensions.blender.org/download/sha256:561863f28ac7d0df9e815a800796efaca126ad78cd23741ac28807f262031883/add-on-quick-lighting-environment-v1.8.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-lighting-environment/","maintainer":"don1138","license":["SPDX:GPL-3.0-or-later"],"tags":["Lighting"]},{"id":"SB_path_actions","schema_version":"1.0.0","name":"Path Actions","version":"2.8.0","tagline":"Open blend folder in OS explorer, and more","archive_hash":"sha256:91c1735d381921e54a17fedd9b81dc79c77735d9b4feb7e2b12df75a2ddd8d53","archive_size":42828,"archive_url":"https://extensions.blender.org/download/sha256:91c1735d381921e54a17fedd9b81dc79c77735d9b4feb7e2b12df75a2ddd8d53/add-on-sb-path-actions-v2.8.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sb-path-actions/","maintainer":"SamuelBernou","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Open folders, List Blend files","clipboard":"Copy path to files"},"tags":["System","Development"]},{"id":"print3d_toolbox","schema_version":"1.0.0","name":"3D Print Toolbox","version":"1.3.3","tagline":"Utilities for 3D printing","archive_hash":"sha256:95238242a60bac48c4b4a786ddcfde61f84efbe0cc349c95394314bfc4855e28","archive_size":145860,"archive_url":"https://extensions.blender.org/download/sha256:95238242a60bac48c4b4a786ddcfde61f84efbe0cc349c95394314bfc4855e28/add-on-print3d-toolbox-v1.3.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/print3d-toolbox/","maintainer":"MikhailRachinskiy","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export STL, PLY, OBJ files"},"tags":["Mesh"]},{"id":"green_olive","schema_version":"1.0.0","name":"Green Olive","version":"1.0.3","tagline":"A fine-tuned dark green theme","archive_hash":"sha256:c7544cc6ceb987628e3d7cbf49ac394cb9da92228673cebb1664aa2f0beb8cac","archive_size":5774,"archive_url":"https://extensions.blender.org/download/sha256:c7544cc6ceb987628e3d7cbf49ac394cb9da92228673cebb1664aa2f0beb8cac/theme-green-olive-v1.0.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/green-olive/","maintainer":"Liuuzaki","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Accessibility"]},{"id":"fls_blcn","schema_version":"1.0.0","name":"Fast Language Switch","version":"0.0.5","tagline":"Fast change the language of the interface","archive_hash":"sha256:02aecb087b32a2863ac24729708022975fe431cf9a693c30ae706767758229e9","archive_size":2475,"archive_url":"https://extensions.blender.org/download/sha256:02aecb087b32a2863ac24729708022975fe431cf9a693c30ae706767758229e9/add-on-fls-blcn-v0.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/fls-blcn/","maintainer":"Kk","license":["SPDX:GPL-2.0-or-later"],"tags":["System"]},{"id":"theme_xsi","schema_version":"1.0.0","name":"Softimage XSI","version":"5.0.0","tagline":"Community-made theme inspired by Softimage XSI","archive_hash":"sha256:ec047fc1185a8292f84a08d9a69a0d71483f9c53c88b74222dbf4449f6f10443","archive_size":6273,"archive_url":"https://extensions.blender.org/download/sha256:ec047fc1185a8292f84a08d9a69a0d71483f9c53c88b74222dbf4449f6f10443/theme-theme-xsi-v5.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-xsi/","maintainer":"RobWu","license":["SPDX:GPL-3.0-or-later"],"tags":["Inspired By"]},{"id":"theme_white","schema_version":"1.0.0","name":"White","version":"1.0.1","tagline":"Community-made theme","archive_hash":"sha256:1f18c2b22d2a8f1b1ad3113eb3f972ef708bdc7a3e494df61779bf5d7d0689a0","archive_size":6242,"archive_url":"https://extensions.blender.org/download/sha256:1f18c2b22d2a8f1b1ad3113eb3f972ef708bdc7a3e494df61779bf5d7d0689a0/theme-theme-white-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-white/","maintainer":"MultLabs","license":["SPDX:GPL-3.0-or-later"],"tags":["Light","High Contrast"]},{"id":"theme_print_friendly","schema_version":"1.0.0","name":"Print Friendly","version":"2.0.0","tagline":"Community-made theme optimized for printing","archive_hash":"sha256:ec1e53309b01b0d1fd81a4aa72bd636ff411402fe9b56eb4126ef440f5f3ad24","archive_size":5585,"archive_url":"https://extensions.blender.org/download/sha256:ec1e53309b01b0d1fd81a4aa72bd636ff411402fe9b56eb4126ef440f5f3ad24/theme-theme-print-friendly-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-print-friendly/","maintainer":"JasonvanGumster","license":["SPDX:GPL-3.0-or-later"],"tags":["Light","High Contrast"]},{"id":"theme_minimal_dark","schema_version":"1.0.0","name":"Minimal Dark","version":"3.1.2","tagline":"A flat dark theme for Blender","archive_hash":"sha256:b5814ca544a39e7c0b19d07523555e235d0efe856c74a4a912e784ecfaef419a","archive_size":7358,"archive_url":"https://extensions.blender.org/download/sha256:b5814ca544a39e7c0b19d07523555e235d0efe856c74a4a912e784ecfaef419a/theme-theme-minimal-dark-v3.1.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-minimal-dark/","maintainer":"jlampel","license":["SPDX:GPL-2.0-or-later"]},{"id":"theme_maya","schema_version":"1.0.0","name":"Maya","version":"2.0.0","tagline":"Community-made theme inspired by Maya","archive_hash":"sha256:6a6c6eac7b9aaf180bf8583d4c1d2f5b27e01a0581a5fa9782b9abd4a7c4ee1a","archive_size":5859,"archive_url":"https://extensions.blender.org/download/sha256:6a6c6eac7b9aaf180bf8583d4c1d2f5b27e01a0581a5fa9782b9abd4a7c4ee1a/theme-theme-maya-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-maya/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Inspired By","Dark"]},{"id":"theme_deep_grey","schema_version":"1.0.0","name":"Deep Grey","version":"2.0.4","tagline":"A comfortable medium dark theme for Blender","archive_hash":"sha256:5ad9d7a6f9522a7319a43fc55255dc1d482d639d7228eacf3d8c52f42cd248bc","archive_size":5593,"archive_url":"https://extensions.blender.org/download/sha256:5ad9d7a6f9522a7319a43fc55255dc1d482d639d7228eacf3d8c52f42cd248bc/theme-theme-deep-grey-v2.0.4.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-deep-grey/","maintainer":"TheRedWaxPolice","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"skinify_rig","schema_version":"1.0.0","name":"Skinify Rig","version":"0.11.2","tagline":"Creates a mesh object from selected bones","archive_hash":"sha256:26babe1f712c53b6e3a9de6da8a81a768548ed197d41716ed643a25469e3cf61","archive_size":6450,"archive_url":"https://extensions.blender.org/download/sha256:26babe1f712c53b6e3a9de6da8a81a768548ed197d41716ed643a25469e3cf61/add-on-skinify-rig-v0.11.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/skinify-rig/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Object"]},{"id":"f2","schema_version":"1.0.0","name":"F2","version":"1.8.5","tagline":"Extends the 'Make Edge/Face' functionality","archive_hash":"sha256:dc8f19637a61c332b3eb937a6b86e2363511cbb29a9a22ea8571fe7d924ab05c","archive_size":5505,"archive_url":"https://extensions.blender.org/download/sha256:dc8f19637a61c332b3eb937a6b86e2363511cbb29a9a22ea8571fe7d924ab05c/add-on-f2-v1.8.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/f2/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"navigation","schema_version":"1.0.0","name":"3D Navigation","version":"1.3.0","tagline":"Navigate the 3D Viewport from the Sidebar","archive_hash":"sha256:4dab907f3eddb4ba96dfbb5c97f6f525e9cd0f4bfd45d9a21717a728954bf8ed","archive_size":3238,"archive_url":"https://extensions.blender.org/download/sha256:4dab907f3eddb4ba96dfbb5c97f6f525e9cd0f4bfd45d9a21717a728954bf8ed/add-on-navigation-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/navigation/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"amaranth","schema_version":"1.0.0","name":"Amaranth","version":"1.0.31","tagline":"A collection of tools to improve productivity","archive_hash":"sha256:ff9e36d3dbd9c556062449fb6943c55b0753a191a6a4f60a70a2d799411a28f3","archive_size":46492,"archive_url":"https://extensions.blender.org/download/sha256:ff9e36d3dbd9c556062449fb6943c55b0753a191a6a4f60a70a2d799411a28f3/add-on-amaranth-v1.0.31.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/amaranth/","maintainer":"pablovazquez","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Render","Compositing","User Interface","Scene","Lighting"]},{"id":"math_vis_console","schema_version":"1.0.0","name":"Math Vis (Console)","version":"0.2.2","tagline":"Display console defined mathutils variables in the 3D view","archive_hash":"sha256:72e30386a06a1b15500488a709951b085c18ff02bf95d07f126ac3e9ea3d470a","archive_size":6507,"archive_url":"https://extensions.blender.org/download/sha256:72e30386a06a1b15500488a709951b085c18ff02bf95d07f126ac3e9ea3d470a/add-on-math-vis-console-v0.2.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/math-vis-console/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["3D View"]},{"id":"auto_mirror","schema_version":"1.0.0","name":"Auto Mirror","version":"2.5.4","tagline":"Super fast cutting and mirroring for mesh","archive_hash":"sha256:68c7785f641c91905b07b8122af6a0147834e9a7b77285966253b1f770f30cc7","archive_size":3571,"archive_url":"https://extensions.blender.org/download/sha256:68c7785f641c91905b07b8122af6a0147834e9a7b77285966253b1f770f30cc7/add-on-auto-mirror-v2.5.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-mirror/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Mesh"]},{"id":"boltfactory","schema_version":"1.0.0","name":"BoltFactory","version":"0.7.1","tagline":"Add a bolt or nut","archive_hash":"sha256:b75f6f946b5c29f7a2122737da891917cd9c862e85b37daef82c662a348223b3","archive_size":35319,"archive_url":"https://extensions.blender.org/download/sha256:b75f6f946b5c29f7a2122737da891917cd9c862e85b37daef82c662a348223b3/add-on-boltfactory-v0.7.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/boltfactory/","maintainer":"Bolt Factory","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh"]},{"id":"snap_utilities_line","schema_version":"1.0.0","name":"Snap Line Tool","version":"6.8.1","tagline":"Extends Blender Snap controls","archive_hash":"sha256:8098ef55983b4192e2e711eb1c5542e93bb65996f973b2f5173bdd01093f1dbc","archive_size":32147,"archive_url":"https://extensions.blender.org/download/sha256:8098ef55983b4192e2e711eb1c5542e93bb65996f973b2f5173bdd01093f1dbc/add-on-snap-utilities-line-v6.8.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/snap-utilities-line/","maintainer":"mano-wii","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"looptools","schema_version":"1.0.0","name":"LoopTools","version":"4.7.7","tagline":"Mesh modelling toolkit. Several tools to aid modelling","archive_hash":"sha256:ff1ca3b3fff73094379da8b1fa2c1acbc9d88d26b7dfc73bb9de5941a6b50108","archive_size":30534,"archive_url":"https://extensions.blender.org/download/sha256:ff1ca3b3fff73094379da8b1fa2c1acbc9d88d26b7dfc73bb9de5941a6b50108/add-on-looptools-v4.7.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/looptools/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Mesh"]},{"id":"node_arrange","schema_version":"1.0.0","name":"Node Arrange","version":"1.11.0","tagline":"Arrange node trees with one click","archive_hash":"sha256:a6cd83026ca50744620f1fe1442c7d754e32ce1f6a950cd161867fb0e71473ca","archive_size":1755806,"archive_url":"https://extensions.blender.org/download/sha256:a6cd83026ca50744620f1fe1442c7d754e32ce1f6a950cd161867fb0e71473ca/add-on-node-arrange-v1.11.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-arrange/","maintainer":"Leonardo-Pike-Excell","license":["SPDX:GPL-3.0-or-later"],"tags":["Node"]},{"id":"antlandscape","schema_version":"1.0.0","name":"A.N.T.Landscape","version":"0.2.0","tagline":"Another Noise Tool: Landscape and Displace","archive_hash":"sha256:230571bc14c50952f3af99b70fdb365cf0cee503382975dc38149407a5a4c8c0","archive_size":60899,"archive_url":"https://extensions.blender.org/download/sha256:230571bc14c50952f3af99b70fdb365cf0cee503382975dc38149407a5a4c8c0/add-on-antlandscape-v0.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/antlandscape/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Add Mesh"]},{"id":"material_library","schema_version":"1.0.0","name":"Material Library","version":"0.6.0","tagline":"Material Library VX","archive_hash":"sha256:baf00c107c5f938e6401cc9d30ab2226b2e1a9f8e92607335d19f1e4492e8019","archive_size":594898,"archive_url":"https://extensions.blender.org/download/sha256:baf00c107c5f938e6401cc9d30ab2226b2e1a9f8e92607335d19f1e4492e8019/add-on-material-library-v0.6.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/material-library/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Material"]},{"id":"copy_attributes_menu","schema_version":"1.0.0","name":"Copy Attributes Menu","version":"0.6.3","tagline":"Copy Attributes Menu","archive_hash":"sha256:990bac36be4c6a39c4506c84a689c5ec45e1a4b43995542cd0b058663f190478","archive_size":8270,"archive_url":"https://extensions.blender.org/download/sha256:990bac36be4c6a39c4506c84a689c5ec45e1a4b43995542cd0b058663f190478/add-on-copy-attributes-menu-v0.6.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/copy-attributes-menu/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"material_utilities","schema_version":"1.0.0","name":"Material Utilities","version":"2.2.3","tagline":"Menu of material tools (assign, select..) in the 3D View","archive_hash":"sha256:35e3f516724b522930ca2defb78c8ef38949949aa7cc37b64be2d3522431b739","archive_size":16895,"archive_url":"https://extensions.blender.org/download/sha256:35e3f516724b522930ca2defb78c8ef38949949aa7cc37b64be2d3522431b739/add-on-material-utilities-v2.2.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/material-utilities/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Material"]},{"id":"edit_linked_library","schema_version":"1.0.0","name":"Edit Linked Library","version":"0.9.2","tagline":"Allows editing of objects, collections, and node groups lin . . ","archive_hash":"sha256:db6827e091da07209ffcff97ce271de8af2a8823619d25626472f6bf65ef5234","archive_size":3575,"archive_url":"https://extensions.blender.org/download/sha256:db6827e091da07209ffcff97ce271de8af2a8823619d25626472f6bf65ef5234/add-on-edit-linked-library-v0.9.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/edit-linked-library/","maintainer":"JasonvanGumster","license":["SPDX:GPL-2.0-or-later"],"tags":["Object"]},{"id":"simplify_curves_plus","schema_version":"1.0.0","name":"Simplify Curves+","version":"1.1.3","tagline":"Simplify Curves: 3dview, Dopesheet, Graph","archive_hash":"sha256:57734eb8248818f3db18c2b934a9470b6ccd640066962c38918868ec93446851","archive_size":5943,"archive_url":"https://extensions.blender.org/download/sha256:57734eb8248818f3db18c2b934a9470b6ccd640066962c38918868ec93446851/add-on-simplify-curves-plus-v1.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/simplify-curves-plus/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Curve"]},{"id":"modifier_tools","schema_version":"1.0.0","name":"Modifier Tools","version":"0.2.7","tagline":"Modifiers Specials Show/Hide/Apply Selected","archive_hash":"sha256:68a98d3c992800dbb76d580835be0d4c023696d8fdcb41e590ec0c367876442a","archive_size":2718,"archive_url":"https://extensions.blender.org/download/sha256:68a98d3c992800dbb76d580835be0d4c023696d8fdcb41e590ec0c367876442a/add-on-modifier-tools-v0.2.7.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/modifier-tools/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"extra_mesh_objects","schema_version":"1.0.0","name":"Extra Mesh Objects","version":"0.4.1","tagline":"Add extra mesh object types","archive_hash":"sha256:c85ce4bb2820d5af26b4dad66bf1a0fdeb4bfeffc668c5e4f098f1e416ed434b","archive_size":133442,"archive_url":"https://extensions.blender.org/download/sha256:c85ce4bb2820d5af26b4dad66bf1a0fdeb4bfeffc668c5e4f098f1e416ed434b/add-on-extra-mesh-objects-v0.4.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/extra-mesh-objects/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh"]},{"id":"export_paper_model","schema_version":"1.0.0","name":"Export Paper Model","version":"1.4.2","tagline":"Export printable net of a Mesh object","archive_hash":"sha256:0d49e1413b624fe9e86c1da10824dc8c1c28713a72ff72530550812dfbc56cba","archive_size":35606,"archive_url":"https://extensions.blender.org/download/sha256:0d49e1413b624fe9e86c1da10824dc8c1c28713a72ff72530550812dfbc56cba/add-on-export-paper-model-v1.4.2.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/export-paper-model/","maintainer":"AdamDominec","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export files to disk"},"tags":["Import-Export"]},{"id":"precision_drawing_tools_pdt","schema_version":"1.0.0","name":"Precision Drawing Tools (PDT)","version":"1.5.3","tagline":"Precision Drawing Tools for Accurate Modelling","archive_hash":"sha256:8e64e4ababc06e1a843eb72dd126c422bfb1117934dd4bdc480c2c6a76e37266","archive_size":49495,"archive_url":"https://extensions.blender.org/download/sha256:8e64e4ababc06e1a843eb72dd126c422bfb1117934dd4bdc480c2c6a76e37266/add-on-precision-drawing-tools-pdt-v1.5.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/precision-drawing-tools-pdt/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["3D View"]},{"id":"extra_curve_objectes","schema_version":"1.0.0","name":"Extra Curve Objects","version":"0.2.0","tagline":"Add extra curve object types","archive_hash":"sha256:4ca91ce5563d094694b2c7f1fc9acece8b5ba8f5dd017a49f080e9cfa5553909","archive_size":52956,"archive_url":"https://extensions.blender.org/download/sha256:4ca91ce5563d094694b2c7f1fc9acece8b5ba8f5dd017a49f080e9cfa5553909/add-on-extra-curve-objectes-v0.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/extra-curve-objectes/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Curve"]},{"id":"copy_render_settings","schema_version":"1.0.0","name":"Copy Render Settings","version":"2.0.0","tagline":"Allows to copy a selection of render settings from current . . ","archive_hash":"sha256:dd7074aaddeb16d228f19ce98d3a45f641db108453af72ebb0e43c225bb162e0","archive_size":7786,"archive_url":"https://extensions.blender.org/download/sha256:dd7074aaddeb16d228f19ce98d3a45f641db108453af72ebb0e43c225bb162e0/add-on-copy-render-settings-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/copy-render-settings/","maintainer":"mont29","license":["SPDX:GPL-2.0-or-later"],"tags":["Render"]},{"id":"tinycad_mesh_tools","schema_version":"1.0.0","name":"tinyCAD Mesh tools","version":"1.3.3","tagline":"tinyCAD Mesh tools Add-on","archive_hash":"sha256:a725746d79502e6519273f3b9d7a54f0350e15f6c391c36fc9c1288f75070bd6","archive_size":37134,"archive_url":"https://extensions.blender.org/download/sha256:a725746d79502e6519273f3b9d7a54f0350e15f6c391c36fc9c1288f75070bd6/add-on-tinycad-mesh-tools-v1.3.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/tinycad-mesh-tools/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"collection_manager","schema_version":"1.0.0","name":"Collection Manager","version":"2.24.11","tagline":"Manage collections and their objects","archive_hash":"sha256:2ba8a4d92c886157a7d15482b7459efbc228d9ff296b24966ab564986694dbe5","archive_size":42496,"archive_url":"https://extensions.blender.org/download/sha256:2ba8a4d92c886157a7d15482b7459efbc228d9ff296b24966ab564986694dbe5/add-on-collection-manager-v2.24.11.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/collection-manager/","maintainer":"Imaginer","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"autodesk_3ds_format","schema_version":"1.0.0","name":"Autodesk 3D Studio (.3ds)","version":"3.0.1","tagline":"Import-Export 3DS scenes, objects, cameras, lights & animations","archive_hash":"sha256:3a9fad1b399b835401702b4d8ab2cff1bf818ce91299e105bc9e668b7e93e0d9","archive_size":208325,"archive_url":"https://extensions.blender.org/download/sha256:3a9fad1b399b835401702b4d8ab2cff1bf818ce91299e105bc9e668b7e93e0d9/add-on-autodesk-3ds-format-v3.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/autodesk-3ds-format/","maintainer":"NRGSille","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import-Export Autodesk 3DS files"},"tags":["Import-Export","Scene","Object","Camera","Lighting","Animation"]},{"id":"storypencil_storyboard_tools","schema_version":"1.0.0","name":"Storypencil - Storyboard Tools","version":"1.2.0","tagline":"Storyboard tools","archive_hash":"sha256:70b1115a622a4e7d5f29998a7c1acd7f9c1df2f384be025fd2b54e3d1ff9cac6","archive_size":20608,"archive_url":"https://extensions.blender.org/download/sha256:70b1115a622a4e7d5f29998a7c1acd7f9c1df2f384be025fd2b54e3d1ff9cac6/add-on-storypencil-storyboard-tools-v1.2.0.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/storypencil-storyboard-tools/","maintainer":"antoniov","license":["SPDX:GPL-3.0-or-later"],"tags":["Sequencer"]},{"id":"object_color_rules","schema_version":"1.0.0","name":"Object Color Rules","version":"0.0.2","tagline":"Rules for assigning object color (for object & wireframe co . . ","archive_hash":"sha256:e23968a37905a932db8875ef9c9f3d29ca7af69ec2e87d4483ae54cb809d7cd5","archive_size":4057,"archive_url":"https://extensions.blender.org/download/sha256:e23968a37905a932db8875ef9c9f3d29ca7af69ec2e87d4483ae54cb809d7cd5/add-on-object-color-rules-v0.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/object-color-rules/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Object"]},{"id":"stored_views","schema_version":"1.0.0","name":"Stored Views","version":"0.4.0","tagline":"Save and restore views, pov, layers & display configs","archive_hash":"sha256:cec382a11ded631ee31b410725db78fe72e82c377a6077ee9bb7b5af1485e5f0","archive_size":24199,"archive_url":"https://extensions.blender.org/download/sha256:cec382a11ded631ee31b410725db78fe72e82c377a6077ee9bb7b5af1485e5f0/add-on-stored-views-v0.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/stored-views/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Requires access to directory where it stores/reads view presets"},"tags":["3D View"]},{"id":"cell_fracture","schema_version":"1.0.0","name":"Cell Fracture","version":"0.2.1","tagline":"Fractured Object Creation","archive_hash":"sha256:878bbd46e0c735da689101aeed9ebe99f18c0d8d0cbd2e9e17ed8cda6b264fb2","archive_size":9722,"archive_url":"https://extensions.blender.org/download/sha256:878bbd46e0c735da689101aeed9ebe99f18c0d8d0cbd2e9e17ed8cda6b264fb2/add-on-cell-fracture-v0.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cell-fracture/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"import_autocad_dxf_format_dxf","schema_version":"1.0.0","name":"Import AutoCAD DXF Format (.dxf)","version":"0.9.10","tagline":"Import files in the Autocad DXF format (.dxf)","archive_hash":"sha256:bc82f6498e92bbcb637c330f2ed9df431fd193303ddd1fec88994c8e0d1924f3","archive_size":57092,"archive_url":"https://extensions.blender.org/download/sha256:bc82f6498e92bbcb637c330f2ed9df431fd193303ddd1fec88994c8e0d1924f3/add-on-import-autocad-dxf-format-dxf-v0.9.10.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/import-autocad-dxf-format-dxf/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Requires access to directory with .dxf files"},"tags":["Import-Export"]},{"id":"bool_tool","schema_version":"1.0.0","name":"Bool Tool","version":"2.0.0","tagline":"Quick boolean operators and tools for hard surface modeling","archive_hash":"sha256:9d9c73f2f49af05e3a3cfe78daa43676b1005fcbb591dc054d9d04c370f0d85d","archive_size":167487,"archive_url":"https://extensions.blender.org/download/sha256:9d9c73f2f49af05e3a3cfe78daa43676b1005fcbb591dc054d9d04c370f0d85d/add-on-bool-tool-v2.0.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/bool-tool/","maintainer":"nickberckley","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Object"]},{"id":"vdm_brush_baker","schema_version":"1.0.0","name":"VDM Brush Baker","version":"1.0.6","tagline":"Bake vector displacement brushes easily from a plane","archive_hash":"sha256:b704f4dca21c2e929b559d99896c18a373b0599a6ca11b45856d5106ec4d6419","archive_size":5781,"archive_url":"https://extensions.blender.org/download/sha256:b704f4dca21c2e929b559d99896c18a373b0599a6ca11b45856d5106ec4d6419/add-on-vdm-brush-baker-v1.0.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/vdm-brush-baker/","maintainer":"robin.hohni","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Add-on saves textures to disk"},"tags":["Bake","Sculpt"]},{"id":"add_camera_rigs","schema_version":"1.0.0","name":"Add Camera Rigs","version":"1.8.2","tagline":"Adds a Camera Rig with UI","archive_hash":"sha256:b06aa8048718bbea463fc430694b735fd69b934bf8811a02f6fd17d18a7c1f90","archive_size":13706,"archive_url":"https://extensions.blender.org/download/sha256:b06aa8048718bbea463fc430694b735fd69b934bf8811a02f6fd17d18a7c1f90/add-on-add-camera-rigs-v1.8.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/add-camera-rigs/","maintainer":"WayneDixon","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"ivygen","schema_version":"1.0.0","name":"IvyGen","version":"0.1.5","tagline":"Adds generated ivy to a mesh object starting at the 3D cursor","archive_hash":"sha256:7e60967a11cabacb9bca0128e65dcfb96cec8794a934bc7dc2e353ae720cff98","archive_size":7172,"archive_url":"https://extensions.blender.org/download/sha256:7e60967a11cabacb9bca0128e65dcfb96cec8794a934bc7dc2e353ae720cff98/add-on-ivygen-v0.1.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ivygen/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Add Curve"]},{"id":"measureit","schema_version":"1.0.0","name":"MeasureIt","version":"1.8.4","tagline":"Tools for measuring objects","archive_hash":"sha256:85b1836d97e5c2f0311afdf45cf9fd3cefa71bade074963864ce40ee15c26042","archive_size":28891,"archive_url":"https://extensions.blender.org/download/sha256:85b1836d97e5c2f0311afdf45cf9fd3cefa71bade074963864ce40ee15c26042/add-on-measureit-v1.8.4.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/measureit/","maintainer":"antoniov","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"tri_lighting","schema_version":"1.0.0","name":"Tri-lighting","version":"0.2.1","tagline":"Add 3 Point Lighting to Selected / Active Object","archive_hash":"sha256:91bd27546e4be010ed03eb732dcf04500086ba79278c7259ec0912c996b3b04b","archive_size":3531,"archive_url":"https://extensions.blender.org/download/sha256:91bd27546e4be010ed03eb732dcf04500086ba79278c7259ec0912c996b3b04b/add-on-tri-lighting-v0.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/tri-lighting/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Lighting"]},{"id":"grease_pencil_tools","schema_version":"1.0.0","name":"Grease Pencil Tools","version":"2.2.4","tagline":"Extra tools for Grease Pencil","archive_hash":"sha256:de2228934ac042a2aa3cf82af135592b7ef24af5588c12357810ff6b44d5359b","archive_size":51948,"archive_url":"https://extensions.blender.org/download/sha256:de2228934ac042a2aa3cf82af135592b7ef24af5588c12357810ff6b44d5359b/add-on-grease-pencil-tools-v2.2.4.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/grease-pencil-tools/","maintainer":"SamuelBernou","license":["SPDX:GPL-3.0-or-later"],"tags":["Grease Pencil","Object"]},{"id":"tissue","schema_version":"1.0.0","name":"Tissue","version":"0.3.71","tagline":"Tools for Computational Design","archive_hash":"sha256:e2da80e8dc35fa07bd63cc09c71511a8d2766f00bc1ae93ae1416710049b04ad","archive_size":113361,"archive_url":"https://extensions.blender.org/download/sha256:e2da80e8dc35fa07bd63cc09c71511a8d2766f00bc1ae93ae1416710049b04ad/add-on-tissue-v0.3.71.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/tissue/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Mesh"]},{"id":"icon_viewer","schema_version":"1.0.0","name":"Icon Viewer","version":"1.4.2","tagline":"Click an icon to copy its name to the clipboard","archive_hash":"sha256:f8f8edde289718bb022fcaeb8c2f0613730625af41cace80f3906d64779e64fc","archive_size":3814,"archive_url":"https://extensions.blender.org/download/sha256:f8f8edde289718bb022fcaeb8c2f0613730625af41cace80f3906d64779e64fc/add-on-icon-viewer-v1.4.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/icon-viewer/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Development"]},{"id":"magic_uv","schema_version":"1.0.0","name":"Magic UV","version":"6.7.1","tagline":"UV Toolset. See Add-ons Preferences for details","archive_hash":"sha256:09451ad3876aa1a1f693cdce4a5837e9a6c69cfc96cfc292ebc398a529d28571","archive_size":104347,"archive_url":"https://extensions.blender.org/download/sha256:09451ad3876aa1a1f693cdce4a5837e9a6c69cfc96cfc292ebc398a529d28571/add-on-magic-uv-v6.7.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/magic-uv/","maintainer":"nutti","license":["SPDX:GPL-2.0-or-later"],"tags":["UV"]},{"id":"export_autocad_dxf_format_dxf","schema_version":"1.0.0","name":"Export Autocad DXF Format (.dxf)","version":"2.2.4","tagline":"The script exports Blender geometry to DXF format r12 version","archive_hash":"sha256:eb49707876bcf472d440e89206252b90d8c7b9bf919ece6c59a8d7f1181199e7","archive_size":33206,"archive_url":"https://extensions.blender.org/download/sha256:eb49707876bcf472d440e89206252b90d8c7b9bf919ece6c59a8d7f1181199e7/add-on-export-autocad-dxf-format-dxf-v2.2.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/export-autocad-dxf-format-dxf/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Requires access to directory where it exports DXF file"},"tags":["Import-Export"]},{"id":"discombobulator","schema_version":"1.0.0","name":"Discombobulator","version":"0.1.0","tagline":"Add Discombobulator","archive_hash":"sha256:79b9763dd90ec7e7dd0f2b1a6dca0485145f9ac258787c6ba5fafb56d6b45d9d","archive_size":7864,"archive_url":"https://extensions.blender.org/download/sha256:79b9763dd90ec7e7dd0f2b1a6dca0485145f9ac258787c6ba5fafb56d6b45d9d/add-on-discombobulator-v0.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/discombobulator/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Add Mesh"]},{"id":"animall","schema_version":"1.0.0","name":"AnimAll","version":"0.14.0","tagline":"Animate mesh, lattice, curve and surface data","archive_hash":"sha256:85fcb80112f25a194891242708eb3bc8fdd02890b9a6d9fc83502e059e0d1f86","archive_size":8635,"archive_url":"https://extensions.blender.org/download/sha256:85fcb80112f25a194891242708eb3bc8fdd02890b9a6d9fc83502e059e0d1f86/add-on-animall-v0.14.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/animall/","maintainer":"pioverfour","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"blender_id_authentication","schema_version":"1.0.0","name":"Blender ID authentication","version":"2.1.3","tagline":"Stores your Blender ID credentials for usage with other add-ons","archive_hash":"sha256:c082141d5040e928d4691f2f00f020932e36b4a06500a210e06e4c2a014564d5","archive_size":11456,"archive_url":"https://extensions.blender.org/download/sha256:c082141d5040e928d4691f2f00f020932e36b4a06500a210e06e4c2a014564d5/add-on-blender-id-authentication-v2.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blender-id-authentication/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"permissions":{"network":"Requires access to id.blender.org to sync preferences"},"tags":["System"]},{"id":"edit_mesh_tools","schema_version":"1.0.0","name":"Edit Mesh Tools","version":"0.3.6","tagline":"Mesh modelling toolkit. Several tools to aid modelling","archive_hash":"sha256:af6440c98c5f64dbcd492e03d7e8772e3bacad92dfc92b5be8abadacc86e7ee0","archive_size":74410,"archive_url":"https://extensions.blender.org/download/sha256:af6440c98c5f64dbcd492e03d7e8772e3bacad92dfc92b5be8abadacc86e7ee0/add-on-edit-mesh-tools-v0.3.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/edit-mesh-tools/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Mesh"]},{"id":"viewport_pie_menus","schema_version":"1.0.0","name":"3D Viewport Pie Menus","version":"1.7.3","tagline":"Various pie menus to speed up your workflow","archive_hash":"sha256:b6e8d806492c45c7323933bc674a2f41e220ec7f8574214759b76e5f34d3b100","archive_size":110402,"archive_url":"https://extensions.blender.org/download/sha256:b6e8d806492c45c7323933bc674a2f41e220ec7f8574214759b76e5f34d3b100/add-on-viewport-pie-menus-v1.7.3.zip","type":"add-on","blender_version_min":"5.0.0","blender_version_max":"6.0.0","website":"https://extensions.blender.org/add-ons/viewport-pie-menus/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"To load brush icons from disk"},"tags":["User Interface"]},{"id":"bsurfaces_gpl_edition","schema_version":"1.0.0","name":"Bsurfaces GPL Edition","version":"1.8.4","tagline":"Modeling and retopology tool","archive_hash":"sha256:a521277138cf2bac92655e3e684f0714aafca25dd86fc5adc2e0f274df34dd6e","archive_size":31781,"archive_url":"https://extensions.blender.org/download/sha256:a521277138cf2bac92655e3e684f0714aafca25dd86fc5adc2e0f274df34dd6e/add-on-bsurfaces-gpl-edition-v1.8.4.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/bsurfaces-gpl-edition/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"curve_tools","schema_version":"1.0.0","name":"Curve Tools","version":"0.4.6","tagline":"Adds some functionality for bezier/nurbs curve/surface modeling","archive_hash":"sha256:af1e26d5e38c0c024598898e31e35373c978505a1942deb12588ef87ad85696f","archive_size":55633,"archive_url":"https://extensions.blender.org/download/sha256:af1e26d5e38c0c024598898e31e35373c978505a1942deb12588ef87ad85696f/add-on-curve-tools-v0.4.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/curve-tools/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Add Curve"]},{"id":"power_sequencer","schema_version":"1.0.0","name":"Power Sequencer","version":"2.0.4","tagline":"Video editing tools for content creators","archive_hash":"sha256:895f02298c1c616f4d115184e7d71de3b82a61aa95f3d524cceaedf3d3f1ff5a","archive_size":97495,"archive_url":"https://extensions.blender.org/download/sha256:895f02298c1c616f4d115184e7d71de3b82a61aa95f3d524cceaedf3d3f1ff5a/add-on-power-sequencer-v2.0.4.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/power-sequencer/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Sequencer"]},{"id":"dynamic_sky","schema_version":"1.0.0","name":"Dynamic Sky","version":"1.0.6","tagline":"Creates Dynamic Sky for Cycles","archive_hash":"sha256:2f8d1fc2e0c71287e42b4f91d52d270da8f4d7da8033305b2a1790f742fa374f","archive_size":4358,"archive_url":"https://extensions.blender.org/download/sha256:2f8d1fc2e0c71287e42b4f91d52d270da8f4d7da8033305b2a1790f742fa374f/add-on-dynamic-sky-v1.0.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dynamic-sky/","maintainer":"Dynamic Sky","license":["SPDX:GPL-2.0-or-later"],"tags":["Lighting"]},{"id":"vrm","schema_version":"1.0.0","name":"VRM format","version":"3.26.5","tagline":"VRM import, export and editing capabilities","archive_hash":"sha256:28ea50d4222190fdd328fa3ad153250403f0cbbd14e0299c9904661b5dce0b4b","archive_size":1564027,"archive_url":"https://extensions.blender.org/download/sha256:28ea50d4222190fdd328fa3ad153250403f0cbbd14e0299c9904661b5dce0b4b/add-on-vrm-v3.26.5.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.2.0","website":"https://extensions.blender.org/add-ons/vrm/","maintainer":"saturday06","license":["SPDX:MIT","SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export VRM from/to disk"},"tags":["Import-Export","Animation","Modeling","Material","Physics"]},{"id":"io_scene_max","schema_version":"1.0.0","name":"Import Autodesk MAX (.max)","version":"1.7.5","tagline":"Import 3DSMAX meshes & materials","archive_hash":"sha256:59840441d615e04517b32d6ee1501a348df079f909fb08a6cb3896677c7486a7","archive_size":83827,"archive_url":"https://extensions.blender.org/download/sha256:59840441d615e04517b32d6ee1501a348df079f909fb08a6cb3896677c7486a7/add-on-io-scene-max-v1.7.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-scene-max/","maintainer":"NRGSille","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import Autodesk MAX files"},"tags":["Import-Export","Mesh","Material"]},{"id":"sun_position","schema_version":"1.0.0","name":"Sun Position","version":"4.4.0","tagline":"Show the position of the Sun with objects or an environment","archive_hash":"sha256:b8a83c2ff04fad709687de51065faf6add52e824ec06fef22b4a95fe98955856","archive_size":26592,"archive_url":"https://extensions.blender.org/download/sha256:b8a83c2ff04fad709687de51065faf6add52e824ec06fef22b4a95fe98955856/add-on-sun-position-v4.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sun-position/","maintainer":"pioverfour","license":["SPDX:GPL-3.0-or-later"],"tags":["Lighting"]},{"id":"gruvbox_light","schema_version":"1.0.0","name":"Gruvbox Light","version":"1.7.0","tagline":"Gruvbox light theme","archive_hash":"sha256:0cf1134eacd9b4fe8b1cf336bdd8510fc984fd8c322427145a498982b0167664","archive_size":5434,"archive_url":"https://extensions.blender.org/download/sha256:0cf1134eacd9b4fe8b1cf336bdd8510fc984fd8c322427145a498982b0167664/theme-gruvbox-light-v1.7.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/gruvbox-light/","maintainer":"Eleuth","license":["SPDX:GPL-2.0-or-later"],"tags":["Light"]},{"id":"gruvbox_dark","schema_version":"1.0.0","name":"Gruvbox Dark","version":"1.7.1","tagline":"Gruvbox dark theme","archive_hash":"sha256:54617fdf9c8a883c2425c9ccf3dbee6b745cb258b94e59776b932ef4b98289ae","archive_size":5232,"archive_url":"https://extensions.blender.org/download/sha256:54617fdf9c8a883c2425c9ccf3dbee6b745cb258b94e59776b932ef4b98289ae/theme-gruvbox-dark-v1.7.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/gruvbox-dark/","maintainer":"Eleuth","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"phoenixart_fusion_theme","schema_version":"1.0.0","name":"PhoenixArt Fusion Theme","version":"4.0.3","tagline":"Based on Blackmagic Fusion Theme","archive_hash":"sha256:19029c154eba46e528b33dd7a18a3633507df051e0341358651a0030eedcd066","archive_size":6404,"archive_url":"https://extensions.blender.org/download/sha256:19029c154eba46e528b33dd7a18a3633507df051e0341358651a0030eedcd066/theme-phoenixart-fusion-theme-v4.0.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/phoenixart-fusion-theme/","maintainer":"phoenixart","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"alien_pink_theme","schema_version":"1.0.0","name":"Alien Pink","version":"6.0.0","tagline":"Stylish and vibrant theme designed specially for you","archive_hash":"sha256:cef37705d005e9f1ff988d0d620d646bfaac30532cb2d2fbce97885245906641","archive_size":6709,"archive_url":"https://extensions.blender.org/download/sha256:cef37705d005e9f1ff988d0d620d646bfaac30532cb2d2fbce97885245906641/theme-alien-pink-theme-v6.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/alien-pink-theme/","maintainer":"Alumx","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","High Contrast"]},{"id":"copy_object_name_to_data","schema_version":"1.0.0","name":"Copy Object Name to Data","version":"1.1.1","tagline":"A simple operator to copy object names to object data","archive_hash":"sha256:686fd6616844730398773fa942ffc42bcc478622a1441b51c70ba28853274c03","archive_size":14363,"archive_url":"https://extensions.blender.org/download/sha256:686fd6616844730398773fa942ffc42bcc478622a1441b51c70ba28853274c03/add-on-copy-object-name-to-data-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/copy-object-name-to-data/","maintainer":"Xury46","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","User Interface"]},{"id":"nd","schema_version":"1.0.0","name":"ND","version":"2.1.0","tagline":"Non-Destructive Modeling Toolkit","archive_hash":"sha256:6c83f44f13327ea5fc52ffbe5dd770b8f905bac92174e2794eb06e1c244947c5","archive_size":1546886,"archive_url":"https://extensions.blender.org/download/sha256:6c83f44f13327ea5fc52ffbe5dd770b8f905bac92174e2794eb06e1c244947c5/add-on-nd-v2.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nd/","maintainer":"HugeMenace","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import built-in and custom assets"},"tags":["3D View","Lighting","Material","Modeling","Mesh","Object","Scene","UV"]},{"id":"io_export_after_effects","schema_version":"1.0.0","name":"Export: Adobe After Effects (.jsx)","version":"0.2.1","tagline":"Export cameras, images and empties to Adobe After Effects","archive_hash":"sha256:8c1caea017a582d3e9725fb2d96a17546a9877704d42676471097a59225049b4","archive_size":16102,"archive_url":"https://extensions.blender.org/download/sha256:8c1caea017a582d3e9725fb2d96a17546a9877704d42676471097a59225049b4/add-on-io-export-after-effects-v0.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-export-after-effects/","maintainer":"Les Fées Spéciales","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Export JSX file to disk"},"tags":["Import-Export"]},{"id":"textify","schema_version":"1.0.0","name":"Textify","version":"1.8.0","tagline":"Streamline and Enhance Blender’s Text Editor","archive_hash":"sha256:e4d15e15e77034233bc82abbc9fe46839b3ec79d1ba9f567bc0b0ce14d1e67b4","archive_size":1851559,"archive_url":"https://extensions.blender.org/download/sha256:e4d15e15e77034233bc82abbc9fe46839b3ec79d1ba9f567bc0b0ce14d1e67b4/add-on-textify-v1.8.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/textify/","maintainer":"Jishnu-kv","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write settings, and manage scripts on disk","clipboard":"Copy class bl_idname and identifiers to clipboard"},"tags":["Text Editor","Development"]},{"id":"Bagapie","schema_version":"1.0.0","name":"Bagapie","version":"11.0.8","tagline":"50+ tools : Scattering, Ivy Gen, Random Array, Architecture","archive_hash":"sha256:5f1be93c7b9d48f75d16a497e1c85a12f10be59db4098196b0f38f6da0a3a6ad","archive_size":10833664,"archive_url":"https://extensions.blender.org/download/sha256:5f1be93c7b9d48f75d16a497e1c85a12f10be59db4098196b0f38f6da0a3a6ad/add-on-bagapie-v11.0.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bagapie/","maintainer":"Kiara_Bagattini","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Create, setup and add assets libraries","network":"Open web browser for documentation and tutorials"},"tags":["Modeling","Node"]},{"id":"y_projectionnode_form_camera_f1","schema_version":"1.0.0","name":"ProjectionNode from Camera","version":"1.3.0","tagline":"Creates a material specified in the Background Image of Camera","archive_hash":"sha256:6fc076e3124099bdad58988605f36ae44a27d2b65932aee2d0fc8b91aedf0d75","archive_size":9289,"archive_url":"https://extensions.blender.org/download/sha256:6fc076e3124099bdad58988605f36ae44a27d2b65932aee2d0fc8b91aedf0d75/add-on-y-projectionnode-form-camera-f1-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/y-projectionnode-form-camera-f1/","maintainer":"Yukimituki","license":["SPDX:GPL-2.0-or-later"],"tags":["Node","Material"]},{"id":"Shadow","schema_version":"1.0.0","name":"Shadow","version":"5.0.2","tagline":"Dark theme","archive_hash":"sha256:0325c737f887420efd31225df8a6d79c7645b4bff72dec4787605ed2d6fbf84b","archive_size":5744,"archive_url":"https://extensions.blender.org/download/sha256:0325c737f887420efd31225df8a6d79c7645b4bff72dec4787605ed2d6fbf84b/theme-shadow-v5.0.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/shadow/","maintainer":"--Shadow--","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","High Contrast"]},{"id":"ucupaint","schema_version":"1.0.0","name":"Ucupaint","version":"2.4.5","tagline":"Layer based painting for Eevee and Cycles","archive_hash":"sha256:9fd5fc4c8f12cdf4ce240dc84f6524fccce11fca72c47094f257631fca3b7b3b","archive_size":2067468,"archive_url":"https://extensions.blender.org/download/sha256:9fd5fc4c8f12cdf4ce240dc84f6524fccce11fca72c47094f257631fca3b7b3b/add-on-ucupaint-v2.4.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ucupaint/","maintainer":"ucupumar","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Access to filesystem for loading and saving images","network":"Access to the network to update contributors and sponsors list"},"tags":["Node","Material","Paint","Bake"]},{"id":"Industrial_AOV_Connector","schema_version":"1.0.0","name":"Industrial AOV Connector","version":"5.1.0","tagline":"Auto generate outputs for advanced compositing","archive_hash":"sha256:edcfdf0a2e8bc0bfd90dc961d351ddbd9303f4af985de5d21ff67a499f2c30bb","archive_size":218597,"archive_url":"https://extensions.blender.org/download/sha256:edcfdf0a2e8bc0bfd90dc961d351ddbd9303f4af985de5d21ff67a499f2c30bb/add-on-industrial-aov-connector-v5.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/industrial-aov-connector/","maintainer":"Roland-Vyens","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Delete Useless Default Renders button need this"},"tags":["Compositing","Import-Export","Pipeline","Render"]},{"id":"hdr_rotation","schema_version":"1.0.0","name":"Hdr Rotation","version":"1.0.7","tagline":"Rotation HDR by Shift+Right Drag in 3D View","archive_hash":"sha256:d78bada4fd2f4eb6cab6b30872006264b900ca91631b6a7ddc9a07111053fc68","archive_size":6585,"archive_url":"https://extensions.blender.org/download/sha256:d78bada4fd2f4eb6cab6b30872006264b900ca91631b6a7ddc9a07111053fc68/add-on-hdr-rotation-v1.0.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/hdr-rotation/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","Render"]},{"id":"Dark_Purple_Green","schema_version":"1.0.0","name":"DarkPurpleGreen","version":"1.0.1","tagline":"Dark minimal neon theme","archive_hash":"sha256:ca96f25e8529fc306169b9a85a8e62826401ebb4bd26bd4eb4ff5bbec813e9d4","archive_size":5871,"archive_url":"https://extensions.blender.org/download/sha256:ca96f25e8529fc306169b9a85a8e62826401ebb4bd26bd4eb4ff5bbec813e9d4/theme-dark-purple-green-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/dark-purple-green/","maintainer":"MSBH","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"node_editor_switcher","schema_version":"1.0.0","name":"Node Editor Switcher","version":"1.1.0","tagline":"Pie menu, shortcuts and buttons to switch between node editors","archive_hash":"sha256:2b7228d52b2d984301f9437453eafd0854c0547e15902e231640f2c6877a48e3","archive_size":2134,"archive_url":"https://extensions.blender.org/download/sha256:2b7228d52b2d984301f9437453eafd0854c0547e15902e231640f2c6877a48e3/add-on-node-editor-switcher-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-editor-switcher/","maintainer":"Victor-09","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Pipeline","User Interface"]},{"id":"Adapta_Nokto","schema_version":"1.0.0","name":"Adapta Nokto","version":"1.1.3","tagline":"Adapta Nokto theme","archive_hash":"sha256:42c3ec72557e2cb64a04370064b50047bf36904d186c438a040d636e53c40fb4","archive_size":5612,"archive_url":"https://extensions.blender.org/download/sha256:42c3ec72557e2cb64a04370064b50047bf36904d186c438a040d636e53c40fb4/theme-adapta-nokto-v1.1.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/adapta-nokto/","maintainer":"Cyrill-Vitkovskiy","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"browser_scroll_resize","schema_version":"1.0.0","name":"Browser Scroll Resize","version":"1.0.1","tagline":"Resize File Size Thumbnail on Browsers with Mouse Wheel","archive_hash":"sha256:ed662d549b82d1aa22020c683b0d92d65757d72f4001058d236893c7f632a5da","archive_size":2729,"archive_url":"https://extensions.blender.org/download/sha256:ed662d549b82d1aa22020c683b0d92d65757d72f4001058d236893c7f632a5da/add-on-browser-scroll-resize-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/browser-scroll-resize/","maintainer":"Barrunterio","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"secret_paint","schema_version":"1.0.0","name":"Secret Paint","version":"1.7.31","tagline":"Select an object, select a surface, paint","archive_hash":"sha256:7ce82e1a12de023b756912ea5542b01f4dcd05be5fdb85b5eefbe2f91c3279f6","archive_size":1950644,"archive_url":"https://extensions.blender.org/download/sha256:7ce82e1a12de023b756912ea5542b01f4dcd05be5fdb85b5eefbe2f91c3279f6/add-on-secret-paint-v1.7.31.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/secret-paint/","maintainer":"orencloud","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export objects and biomes to external blend files","network":"Update from GitHub if installed as addon rather than extension"},"tags":["Modeling","Add Curve"]},{"id":"delete_line_shortcut","schema_version":"1.0.0","name":"Delete Line Shortcut","version":"1.2.2","tagline":"Shortcut to delete a line and copy its content","archive_hash":"sha256:e327da024c4d02910dc501b3c5a0445326654775e04750b9458fd7dc7153f7ab","archive_size":15764,"archive_url":"https://extensions.blender.org/download/sha256:e327da024c4d02910dc501b3c5a0445326654775e04750b9458fd7dc7153f7ab/add-on-delete-line-shortcut-v1.2.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/delete-line-shortcut/","maintainer":"matej.zeman02","license":["SPDX:GPL-3.0-or-later"],"permissions":{"clipboard":"Add-on can read and write to the system clipboard."},"tags":["User Interface","Text Editor"]},{"id":"keyframe_visibility","schema_version":"1.0.0","name":"Keyframe Visibility","version":"1.0.2","tagline":"Batch keyframe visibility for objects","archive_hash":"sha256:d34a97ea3d6f6776991474da0e4794e6c124ec9a0262abfe4aeef65e35670f84","archive_size":4295,"archive_url":"https://extensions.blender.org/download/sha256:d34a97ea3d6f6776991474da0e4794e6c124ec9a0262abfe4aeef65e35670f84/add-on-keyframe-visibility-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/keyframe-visibility/","maintainer":"hisanimations","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","3D View"]},{"id":"midnight_blue_theme","schema_version":"1.0.0","name":"Midnight Blue","version":"1.0.1","tagline":"Blender blues after midnight","archive_hash":"sha256:8ab6dd7c85f7451cc8a7fe41dcb95b5a474a01f9a336a841e8f11e28555d9928","archive_size":5982,"archive_url":"https://extensions.blender.org/download/sha256:8ab6dd7c85f7451cc8a7fe41dcb95b5a474a01f9a336a841e8f11e28555d9928/theme-midnight-blue-theme-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/midnight-blue-theme/","maintainer":"cmzw","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"bulk_asset_tools","schema_version":"1.0.0","name":"Bulk Asset Tools","version":"1.7.3","tagline":"Manage your asset libraries with ease","archive_hash":"sha256:3f3141412450034efdc8f02cde18a99a3a4fe2b3116ca70a3a62d38da6e93e6d","archive_size":10636,"archive_url":"https://extensions.blender.org/download/sha256:3f3141412450034efdc8f02cde18a99a3a4fe2b3116ca70a3a62d38da6e93e6d/add-on-bulk-asset-tools-v1.7.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bulk-asset-tools/","maintainer":"guitargeek","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Add-on expects to have access to filesytem."},"tags":["User Interface"]},{"id":"blender_path_maker","schema_version":"1.0.0","name":"Path Maker","version":"1.4.5","tagline":"Replaces custom tags in the Output Path","archive_hash":"sha256:1c222d219c83a66f87ab9f573d682c584de029ed23c7ef3b44f5f89f66a0d926","archive_size":4822,"archive_url":"https://extensions.blender.org/download/sha256:1c222d219c83a66f87ab9f573d682c584de029ed23c7ef3b44f5f89f66a0d926/add-on-blender-path-maker-v1.4.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blender-path-maker/","maintainer":"thornydre","license":["SPDX:GPL-3.0-or-later"],"tags":["Render"]},{"id":"SelectsAllIslandsUDIM","schema_version":"1.0.0","name":"Selects all UV islands on one UDIM","version":"1.2.0","tagline":"Highlighting UV-islands and faces of the corresponding UDIM","archive_hash":"sha256:3ead06399c6676eeb55ccd18d122a9d4fc7d1cba004290de7ddaaf9f8c5b930f","archive_size":3781,"archive_url":"https://extensions.blender.org/download/sha256:3ead06399c6676eeb55ccd18d122a9d4fc7d1cba004290de7ddaaf9f8c5b930f/add-on-selectsallislandsudim-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/selectsallislandsudim/","maintainer":"Ailex","license":["SPDX:GPL-3.0-or-later"],"tags":["UV"]},{"id":"lightpainter","schema_version":"1.0.0","name":"Light Painter","version":"1.5.6","tagline":"Do not place your lights, paint them","archive_hash":"sha256:961e640c2676b2285bc51c3ee08478eac669227ea8d48192667e1e9e0c19af3a","archive_size":112051,"archive_url":"https://extensions.blender.org/download/sha256:961e640c2676b2285bc51c3ee08478eac669227ea8d48192667e1e9e0c19af3a/add-on-lightpainter-v1.5.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/lightpainter/","maintainer":"SMagnusson","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Lighting","Object"]},{"id":"ContextPie","schema_version":"1.0.0","name":"Context Pie","version":"0.9.40","tagline":"Context sensitive pie menu for a simple, fast workflow","archive_hash":"sha256:e6f08e6823425bdd995d954a05bdcad9f4a43fceefecf2ce5961e120f67e4bb5","archive_size":152529,"archive_url":"https://extensions.blender.org/download/sha256:e6f08e6823425bdd995d954a05bdcad9f4a43fceefecf2ce5961e120f67e4bb5/add-on-contextpie-v0.9.40.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/contextpie/","maintainer":"BastianLS","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface","3D View","UV"]},{"id":"orient_and_origin_to_selected","schema_version":"1.0.0","name":"Orient and Origin to Selected","version":"1.2.0","tagline":"Quickly manipulate the object origin","archive_hash":"sha256:f2f35569453161aa07e2d9c3ae6fe618538c6af7f659f910bb7bdfb8a4fc3521","archive_size":42615,"archive_url":"https://extensions.blender.org/download/sha256:f2f35569453161aa07e2d9c3ae6fe618538c6af7f659f910bb7bdfb8a4fc3521/add-on-orient-and-origin-to-selected-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/orient-and-origin-to-selected/","maintainer":"Orange Turbine","license":["SPDX:GPL-2.0-or-later"],"tags":["Modeling","Mesh","Object"]},{"id":"screencast_keys","schema_version":"1.0.0","name":"Screencast Keys","version":"4.2.2","tagline":"Display keys pressed in Blender","archive_hash":"sha256:dc9f079d49cf18058646a0d8c0efc88c2928554f6960cf1bff5fbabf6dd48bc4","archive_size":39054,"archive_url":"https://extensions.blender.org/download/sha256:dc9f079d49cf18058646a0d8c0efc88c2928554f6960cf1bff5fbabf6dd48bc4/add-on-screencast-keys-v4.2.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/screencast-keys/","maintainer":"nutti","license":["SPDX:GPL-3.0-or-later"],"tags":["System","User Interface"]},{"id":"Gold_Pro_Theme","schema_version":"1.0.0","name":"Gold Pro","version":"1.1.4","tagline":"Professional blender theme with Gold :)","archive_hash":"sha256:c74e7b313e8e3fc7abb1e1ef91af4a93dfcb61110e767cb9d720746798a64e5d","archive_size":5514,"archive_url":"https://extensions.blender.org/download/sha256:c74e7b313e8e3fc7abb1e1ef91af4a93dfcb61110e767cb9d720746798a64e5d/theme-gold-pro-theme-v1.1.4.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/gold-pro-theme/","maintainer":"EmanuelFerro","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"lfs_camera_plane","schema_version":"1.0.0","name":"Camera Plane","version":"3.0.1","tagline":"Import images and stick them to the camera","archive_hash":"sha256:38ae1b667ba8ed24f14ba4fd1d8f2509dbb327b1b0c22ed17fbd4f7f3b250028","archive_size":17283,"archive_url":"https://extensions.blender.org/download/sha256:38ae1b667ba8ed24f14ba4fd1d8f2509dbb327b1b0c22ed17fbd4f7f3b250028/add-on-lfs-camera-plane-v3.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/lfs-camera-plane/","maintainer":"Les Fées Spéciales","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import images from disk"},"tags":["3D View","Import-Export","Object","Camera"]},{"id":"Wireframe_Color_Tools","schema_version":"1.0.0","name":"Wireframe Color Tools","version":"1.0.0","tagline":"Change Object Colors based on different kinds of methods","archive_hash":"sha256:e1290c2cfb2b6ce2346f12679eed8f6cc2e522c90f40889e056e28f11f3832a9","archive_size":3122,"archive_url":"https://extensions.blender.org/download/sha256:e1290c2cfb2b6ce2346f12679eed8f6cc2e522c90f40889e056e28f11f3832a9/add-on-wireframe-color-tools-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/wireframe-color-tools/","maintainer":"Lumpengnom","license":["SPDX:GPL-2.0-or-later"],"tags":["3D View","Material","Object"]},{"id":"neutral_grey","schema_version":"1.0.0","name":"Neutral Grey","version":"2.0.3","tagline":"A neutral grey theme for Blender","archive_hash":"sha256:d8b3c0b0c41cb7cc9a7ab555f6f7d7722bfab1756c62f85924aeb51edbb76454","archive_size":5558,"archive_url":"https://extensions.blender.org/download/sha256:d8b3c0b0c41cb7cc9a7ab555f6f7d7722bfab1756c62f85924aeb51edbb76454/theme-neutral-grey-v2.0.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/neutral-grey/","maintainer":"scopelma","license":["SPDX:GPL-2.0-or-later"],"tags":["Light","Accessibility"]},{"id":"deep_dark_sea","schema_version":"1.0.0","name":"Deep Dark Sea","version":"3.0.0","tagline":"Darker than the default dark","archive_hash":"sha256:59391a10f0750d676911eb3daf9e717504355033e9851de584d430e30c1c5298","archive_size":6219,"archive_url":"https://extensions.blender.org/download/sha256:59391a10f0750d676911eb3daf9e717504355033e9851de584d430e30c1c5298/theme-deep-dark-sea-v3.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/deep-dark-sea/","maintainer":"nickberckley","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","High Contrast"]},{"id":"border_buddy","schema_version":"1.0.0","name":"Border Buddy","version":"0.1.1","tagline":"Your buddy that helps to preserve borders","archive_hash":"sha256:1806735a0d626fabbda5d37bbb2ed03841da49abc956a18dddf9274875bffaf4","archive_size":2579,"archive_url":"https://extensions.blender.org/download/sha256:1806735a0d626fabbda5d37bbb2ed03841da49abc956a18dddf9274875bffaf4/add-on-border-buddy-v0.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/border-buddy/","maintainer":"SimonThommes","license":["SPDX:GPL-2.0-or-later"],"tags":["Render"]},{"id":"bake_shape_keys","schema_version":"1.0.0","name":"Bake Shape Keys","version":"1.4.0","tagline":"Feature-set for shape keys and shape key animations","archive_hash":"sha256:883e86f28541be0cd3e0a59abdc8fd0ea531d10186181d38cdaca590d17ee0dd","archive_size":14241,"archive_url":"https://extensions.blender.org/download/sha256:883e86f28541be0cd3e0a59abdc8fd0ea531d10186181d38cdaca590d17ee0dd/add-on-bake-shape-keys-v1.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bake-shape-keys/","maintainer":"nickberckley","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Mesh"]},{"id":"matalogue","schema_version":"1.0.0","name":"Matalogue","version":"1.5.1","tagline":"All your node trees in one list","archive_hash":"sha256:b1911aa0cbe55456ccd3c16a38aed01c687f205d5ca86c69903ef36aca7c90d9","archive_size":13431,"archive_url":"https://extensions.blender.org/download/sha256:b1911aa0cbe55456ccd3c16a38aed01c687f205d5ca86c69903ef36aca7c90d9/add-on-matalogue-v1.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/matalogue/","maintainer":"GregZaal","license":["SPDX:GPL-3.0-or-later"],"tags":["Node"]},{"id":"poly_copy_paste","schema_version":"1.0.0","name":"Poly Copy Paste","version":"1.0.3","tagline":"Copy / Cut / Paste polygons with Ctrl+C / Ctrl+X / Ctrl+V","archive_hash":"sha256:b40714c0b14ccb768539ac4906e03ef91cd167361be51985671a49c608732942","archive_size":3131,"archive_url":"https://extensions.blender.org/download/sha256:b40714c0b14ccb768539ac4906e03ef91cd167361be51985671a49c608732942/add-on-poly-copy-paste-v1.0.3.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/poly-copy-paste/","maintainer":"Fisch_Tu","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"NieR_Automata_UI","schema_version":"1.0.0","name":"NieR_Automata_UI","version":"1.2.5","tagline":"Glory to Mankind","archive_hash":"sha256:ac111a56629c2026293ff3a025c06b1d2b187ec0164848a1088570a68495e2aa","archive_size":5812,"archive_url":"https://extensions.blender.org/download/sha256:ac111a56629c2026293ff3a025c06b1d2b187ec0164848a1088570a68495e2aa/theme-nier-automata-ui-v1.2.5.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/nier-automata-ui/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Light","Colorful"]},{"id":"io_xnalara","schema_version":"1.0.0","name":"XPS Import/Export","version":"2.2.7","tagline":"Import-Export for XNALara/XPS files","archive_hash":"sha256:0e41580bdae0bdcf091e8ebb74b7bde910f8f011cc27443081c364351e8debc6","archive_size":174281,"archive_url":"https://extensions.blender.org/download/sha256:0e41580bdae0bdcf091e8ebb74b7bde910f8f011cc27443081c364351e8debc6/add-on-io-xnalara-v2.2.7.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/io-xnalara/","maintainer":"maylog","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Pipeline"]},{"id":"preset_startup_manager","schema_version":"1.0.0","name":"Startup Preset Manager","version":"2.10.0","tagline":"Custom startup file creation / hot reloading","archive_hash":"sha256:09db3bb39ffa07a51635b7af748221c1b45c4fca6d49174d2a57366652609ca8","archive_size":4684,"archive_url":"https://extensions.blender.org/download/sha256:09db3bb39ffa07a51635b7af748221c1b45c4fca6d49174d2a57366652609ca8/add-on-preset-startup-manager-v2.10.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/preset-startup-manager/","maintainer":"Gruff-Wright","license":["SPDX:GPL-3.0-or-later"],"tags":["Pipeline","Scene","System"]},{"id":"time_theme_switcher","schema_version":"1.0.0","name":"Time Theme Switcher","version":"1.0.0","tagline":"Switches between light and dark UI themes at scheduled times","archive_hash":"sha256:0f1d64ae1814f5b2110db105154b7c84343c39648f2196a6d7eeaee8bab95010","archive_size":18346,"archive_url":"https://extensions.blender.org/download/sha256:0f1d64ae1814f5b2110db105154b7c84343c39648f2196a6d7eeaee8bab95010/add-on-time-theme-switcher-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/time-theme-switcher/","maintainer":"CosmoMídias","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read existing themes from disk"},"tags":["User Interface"]},{"id":"camera_aspect_ratio_guides","schema_version":"1.0.0","name":"Camera Aspect Ratio Guides","version":"2.0.0","tagline":"Professional composition guides with safe areas","archive_hash":"sha256:50bae340eccf1df4cc77e0a2667e08f8ba9f7c894fce9c5854e0f0dd5b29c394","archive_size":11678,"archive_url":"https://extensions.blender.org/download/sha256:50bae340eccf1df4cc77e0a2667e08f8ba9f7c894fce9c5854e0f0dd5b29c394/add-on-camera-aspect-ratio-guides-v2.0.0.zip","type":"add-on","blender_version_min":"5.0.0","blender_version_max":"5.5.0","website":"https://extensions.blender.org/add-ons/camera-aspect-ratio-guides/","maintainer":"Prince_Eagle","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Modify compositor nodes for render burn-in"},"tags":["Camera","Render","Compositing"]},{"id":"k_tools_render_preset_manager","schema_version":"1.0.0","name":"K-Tools: Render Preset Manager","version":"1.3.0","tagline":"Save and Load Blender's Settings","archive_hash":"sha256:83b9bd96debc115a202aa3f718ad8215d2801caa237297765303223ff1b0aebc","archive_size":84603,"archive_url":"https://extensions.blender.org/download/sha256:83b9bd96debc115a202aa3f718ad8215d2801caa237297765303223ff1b0aebc/add-on-k-tools-render-preset-manager-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/k-tools-render-preset-manager/","maintainer":"Robert-Kezives","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export .JSON text files from/to disk"},"tags":["Render"]},{"id":"use_for_rendering_plus","schema_version":"1.0.0","name":"View Layer Plus","version":"1.2.5","tagline":"Seamlessly extend View Layers management","archive_hash":"sha256:b31aaf82ee670ea35a0933557a29c6f6d898af0324a38c4ad221c0030345fb25","archive_size":63199,"archive_url":"https://extensions.blender.org/download/sha256:b31aaf82ee670ea35a0933557a29c6f6d898af0324a38c4ad221c0030345fb25/add-on-use-for-rendering-plus-v1.2.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/use-for-rendering-plus/","maintainer":"Trukas","license":["SPDX:GPL-3.0-or-later"],"tags":["Compositing","User Interface"]},{"id":"mass_keyframe","schema_version":"1.0.0","name":"Mass Keyframe","version":"1.1.8","tagline":"Keyframe properties better","archive_hash":"sha256:ac70facdf6a32075a6a00ce88dcd6ffee75597560080d154e60db3ded67a6b48","archive_size":386198,"archive_url":"https://extensions.blender.org/download/sha256:ac70facdf6a32075a6a00ce88dcd6ffee75597560080d154e60db3ded67a6b48/add-on-mass-keyframe-v1.1.8.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/mass-keyframe/","maintainer":"StratosDerg","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Sequencer"]},{"id":"vectart_import","schema_version":"1.0.0","name":"Vectart Import","version":"1.0.4","tagline":"Import and preview vector files with layer management","archive_hash":"sha256:a0f709c6d57a880254aad49f8a9c7ca8de03c922b8a1983f0f477cfb0adb5cf1","archive_size":19068,"archive_url":"https://extensions.blender.org/download/sha256:a0f709c6d57a880254aad49f8a9c7ca8de03c922b8a1983f0f477cfb0adb5cf1/add-on-vectart-import-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/vectart-import/","maintainer":"Dimona-Patrick-243","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Required to read and import SVG files from the disk"},"tags":["Modeling","Object"]},{"id":"extrude_along_path","schema_version":"1.0.0","name":"Extrude Along Path","version":"2.2.0","tagline":"Extrude or Rake profile geometry Along a defined Path","archive_hash":"sha256:5afb06c2fbffb81d72e4041aa2b56e04fc2ed0cd0fca7bbe12d57cd4abe73283","archive_size":15621,"archive_url":"https://extensions.blender.org/download/sha256:5afb06c2fbffb81d72e4041aa2b56e04fc2ed0cd0fca7bbe12d57cd4abe73283/add-on-extrude-along-path-v2.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/extrude-along-path/","maintainer":"RobbieK","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh"]},{"id":"dimensions_and_lines","schema_version":"1.0.0","name":"Dimensions and Lines","version":"1.1.0","tagline":"create technical drawings, dimensions and lines","archive_hash":"sha256:b2d368e76a9a41d82b65766fcbc002042ff3383ad40d8e8619ae88bf20d64c30","archive_size":75526,"archive_url":"https://extensions.blender.org/download/sha256:b2d368e76a9a41d82b65766fcbc002042ff3383ad40d8e8619ae88bf20d64c30/add-on-dimensions-and-lines-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dimensions-and-lines/","maintainer":"jan.holinka","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","3D View","Mesh"]},{"id":"textures_autosave","schema_version":"1.0.0","name":"Autosave Textures","version":"1.0.1","tagline":"Save all modified image textures on blendfile (auto-)save","archive_hash":"sha256:86990c248d92cb1c1c9fee66a3d5e9ec215017bc0cd45acefbf8645823bde938","archive_size":2642,"archive_url":"https://extensions.blender.org/download/sha256:86990c248d92cb1c1c9fee66a3d5e9ec215017bc0cd45acefbf8645823bde938/add-on-textures-autosave-v1.0.1.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/textures-autosave/","maintainer":"mont29","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Write image files to disk"},"tags":["Pipeline","Paint"]},{"id":"csv_importer","schema_version":"1.0.0","name":"CSV Importer","version":"0.2.2","tagline":"import csv data to meshes in Blender","archive_hash":"sha256:631249d12f3617113e2f22fa4006a9a96fdb9774e9a0d3a61fb660656314937b","archive_size":46529057,"archive_url":"https://extensions.blender.org/download/sha256:631249d12f3617113e2f22fa4006a9a96fdb9774e9a0d3a61fb660656314937b/add-on-csv-importer-v0.2.2-windows-x64.zip","type":"add-on","blender_version_min":"4.2.5","website":"https://extensions.blender.org/add-ons/csv-importer/","maintainer":"Jan-Hendrik-Müller","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Importing data files from disk"},"platforms":["windows-x64"],"tags":["Geometry Nodes","Import-Export"]},{"id":"Auto_Sort_Collections","schema_version":"1.0.0","name":"Auto Sort Collections","version":"1.0.2","tagline":"Automatic organisation of collections","archive_hash":"sha256:c21b2a4bdb1d839d061c311adafc14ed795aab37dc9a35b32d555e1c651d6079","archive_size":9665,"archive_url":"https://extensions.blender.org/download/sha256:c21b2a4bdb1d839d061c311adafc14ed795aab37dc9a35b32d555e1c651d6079/add-on-auto-sort-collections-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-sort-collections/","maintainer":"Shuimeng","license":["SPDX:GPL-3.0-or-later"],"tags":["Scene"]},{"id":"Cake_Particles","schema_version":"1.0.0","name":"Cake_Particles","version":"5.0.0","tagline":"Bake particles simulation into keyframed animations","archive_hash":"sha256:f1c2e3f5f97bfa3432cc2fb85af35ca6cb05e4ecd7d6dd619522cc36aa80b42f","archive_size":9459,"archive_url":"https://extensions.blender.org/download/sha256:f1c2e3f5f97bfa3432cc2fb85af35ca6cb05e4ecd7d6dd619522cc36aa80b42f/add-on-cake-particles-v5.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cake-particles/","maintainer":"scaryplasmon","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Bake","Physics","Object"]},{"id":"Quick_Character_Selector","schema_version":"1.0.0","name":"Quick Character Selector","version":"1.1.0","tagline":"Seleccion rapida de armatures","archive_hash":"sha256:b1eee352e175dbb52f8c6298a00f15f0d28d1b396f341529a61b73654120fbad","archive_size":1581,"archive_url":"https://extensions.blender.org/download/sha256:b1eee352e175dbb52f8c6298a00f15f0d28d1b396f341529a61b73654120fbad/add-on-quick-character-selector-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-character-selector/","maintainer":"MatiasMartin","license":["SPDX:GPL-2.0-or-later"],"tags":["Object","Animation"]},{"id":"momo","schema_version":"1.0.0","name":"Momo Light","version":"5.0.6","tagline":"Momo Light - theme inspired by Modo","archive_hash":"sha256:c2db79e4c561c2e622d5320a0fa8ce635d92afd4143f6f9a37084fef068ce6f3","archive_size":6451,"archive_url":"https://extensions.blender.org/download/sha256:c2db79e4c561c2e622d5320a0fa8ce635d92afd4143f6f9a37084fef068ce6f3/theme-momo-v5.0.6.zip","type":"theme","blender_version_min":"5.1.0","website":"https://extensions.blender.org/themes/momo/","maintainer":"TimoShch","license":["SPDX:GPL-2.0-or-later"],"tags":["Inspired By"]},{"id":"k_tools_visibility_check","schema_version":"1.0.0","name":"Visibility Check","version":"2.5.2","tagline":"Check for mismatched objects in viewport and render view","archive_hash":"sha256:c3af61e03cbe782d82b521d4b2d9eef50c98d6c25ffcb8984f8c8f439fc07913","archive_size":6511,"archive_url":"https://extensions.blender.org/download/sha256:c3af61e03cbe782d82b521d4b2d9eef50c98d6c25ffcb8984f8c8f439fc07913/add-on-k-tools-visibility-check-v2.5.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/k-tools-visibility-check/","maintainer":"Robert-Kezives","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Render"]},{"id":"dynamic_context_menu","schema_version":"1.0.0","name":"Dynamic Context Menu","version":"1.9.4","tagline":"Object Mode Context Sensitive Spacebar Menu","archive_hash":"sha256:d5489ad11a246fcac650b86b3beb5137f1506a7d09092028acfbc86b8cdc90b5","archive_size":15679,"archive_url":"https://extensions.blender.org/download/sha256:d5489ad11a246fcac650b86b3beb5137f1506a7d09092028acfbc86b8cdc90b5/add-on-dynamic-context-menu-v1.9.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dynamic-context-menu/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["User Interface"]},{"id":"import_palettes","schema_version":"1.0.0","name":"Import Palettes","version":"1.0.5","tagline":"Import Palettes","archive_hash":"sha256:9874614269a5e890d25021308641083531d982fb8603c113090389f382bc4acd","archive_size":4151,"archive_url":"https://extensions.blender.org/download/sha256:9874614269a5e890d25021308641083531d982fb8603c113090389f382bc4acd/add-on-import-palettes-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/import-palettes/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Requires access to directory with color palette files"},"tags":["Import-Export"]},{"id":"open_linked","schema_version":"1.0.0","name":"Open Linked","version":"1.0.1","tagline":"Open linked blends from the Outliner","archive_hash":"sha256:699f9ce0e8f8cac5fa94fbfa0b7991a3d0511da33dfa84f83d0be7754ecb70c3","archive_size":40897,"archive_url":"https://extensions.blender.org/download/sha256:699f9ce0e8f8cac5fa94fbfa0b7991a3d0511da33dfa84f83d0be7754ecb70c3/add-on-open-linked-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/open-linked/","maintainer":"polygoniq","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Add-on expects to have access to filesytem."},"tags":["User Interface"]},{"id":"roreddos_theme","schema_version":"1.0.0","name":"RoReddosTheme","version":"1.0.1","tagline":"A clean, dark minimal theme with deep red accents","archive_hash":"sha256:c7b99319e2e9c63d79392a16ff1411a3514d4053c6996be06e4c27074eaf7514","archive_size":5908,"archive_url":"https://extensions.blender.org/download/sha256:c7b99319e2e9c63d79392a16ff1411a3514d4053c6996be06e4c27074eaf7514/theme-roreddos-theme-v1.0.1.zip","type":"theme","blender_version_min":"5.1.0","website":"https://extensions.blender.org/themes/roreddos-theme/","maintainer":"RoReddo","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"edge_length_measure","schema_version":"1.0.0","name":"Edge Length Measure","version":"1.0.0","tagline":"Measure mesh edge lengths in Object Mode","archive_hash":"sha256:1fb1319bf07728a6c8cd4478f28a8ebb03072f0f2f10a2f7392c8586bfb73a0e","archive_size":16761,"archive_url":"https://extensions.blender.org/download/sha256:1fb1319bf07728a6c8cd4478f28a8ebb03072f0f2f10a2f7392c8586bfb73a0e/add-on-edge-length-measure-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/edge-length-measure/","maintainer":"binary-angel","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Mesh","Modeling"]},{"id":"theme_CrimsonAttack","schema_version":"1.0.0","name":"Crimson Attack","version":"1.0.0","tagline":"A Red hue'd version of blue invasion","archive_hash":"sha256:c797984cfd094d88741f76100340a6885e11d0d815da2ad8d15676f99f3d620c","archive_size":6231,"archive_url":"https://extensions.blender.org/download/sha256:c797984cfd094d88741f76100340a6885e11d0d815da2ad8d15676f99f3d620c/theme-theme-crimsonattack-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-crimsonattack/","maintainer":"zaq","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Colorful","Inspired By"]},{"id":"mat_helperr","schema_version":"1.0.0","name":"MAT Helper","version":"1.2.1","tagline":"Smart PBR texture importer for UModel .mat & .json exports","archive_hash":"sha256:3386ada34896c54c73e1cffe52a1de9fdedc5a475324ddbcd08b6fa60691b9b6","archive_size":4011,"archive_url":"https://extensions.blender.org/download/sha256:3386ada34896c54c73e1cffe52a1de9fdedc5a475324ddbcd08b6fa60691b9b6/add-on-mat-helperr-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mat-helperr/","maintainer":"maylog","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","Import-Export"]},{"id":"texops","schema_version":"1.0.0","name":"TexOps","version":"1.0.0","tagline":"Texture Conversion, Generation, and Manipulation Operations","archive_hash":"sha256:4cfbd79aabfde50762d0d555d7a795eec480b59333309062828345550d85abc9","archive_size":94059,"archive_url":"https://extensions.blender.org/download/sha256:4cfbd79aabfde50762d0d555d7a795eec480b59333309062828345550d85abc9/add-on-texops-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/texops/","maintainer":"JR3DFUL","license":["SPDX:GPL-3.0-or-later"],"tags":["Paint","Bake","Import-Export","User Interface"]},{"id":"viewport_fps","schema_version":"1.0.0","name":"Viewport FPS","version":"1.0.2","tagline":"Displays frames per second in current 3D viewport","archive_hash":"sha256:842eed9027d319486dd87aa88e48af6ca0a1c3077b9639ddd5f66e0b050f269f","archive_size":3040,"archive_url":"https://extensions.blender.org/download/sha256:842eed9027d319486dd87aa88e48af6ca0a1c3077b9639ddd5f66e0b050f269f/add-on-viewport-fps-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/viewport-fps/","maintainer":"Pazelock","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","User Interface","System"]},{"id":"VibeyTM_Pro","schema_version":"1.0.0","name":"Vibey™ Pro","version":"0.0.1","tagline":"Visually exciting yet fully functional","archive_hash":"sha256:dad4cca29ed2bbf3aa50a4b11551bf7474d3d0b0f8c12be6f1e5f271f448af92","archive_size":18840,"archive_url":"https://extensions.blender.org/download/sha256:dad4cca29ed2bbf3aa50a4b11551bf7474d3d0b0f8c12be6f1e5f271f448af92/theme-vibeytm-pro-v0.0.1.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/vibeytm-pro/","maintainer":"Fedor-Rezhenov","license":["SPDX:GPL-3.0-or-later"]},{"id":"Three_d_Cursor_Snap","schema_version":"1.0.0","name":"Three d Cursor Snap","version":"1.2.0","tagline":"Move 3d cursor like gizmo to snap vertex, edge and face","archive_hash":"sha256:5b7031eb3fdc8b85bb272c2483239741932434b3fe6403fc0eedaa2a64e9ef55","archive_size":3579,"archive_url":"https://extensions.blender.org/download/sha256:5b7031eb3fdc8b85bb272c2483239741932434b3fe6403fc0eedaa2a64e9ef55/add-on-three-d-cursor-snap-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/three-d-cursor-snap/","maintainer":"deepak756","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Modeling","Mesh"]},{"id":"gzm_mod","schema_version":"1.0.0","name":"GZM 3D model format","version":"1.0.3","tagline":"Import-export 3D models for the GZM game","archive_hash":"sha256:49ed3044e575709e90770ead44db7c0b618422dc401841c29cfa80a866462afd","archive_size":556667,"archive_url":"https://extensions.blender.org/download/sha256:49ed3044e575709e90770ead44db7c0b618422dc401841c29cfa80a866462afd/add-on-gzm-mod-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/gzm-mod/","maintainer":"777-tanks","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"batch_camera_render","schema_version":"1.0.0","name":"Batch Render Cameras","version":"1.8.1","tagline":"Render animations from multiple selected cameras","archive_hash":"sha256:434b02361608b8094de3835047e64168b9cea4cb20fac1183bbb67f2cd243036","archive_size":3228,"archive_url":"https://extensions.blender.org/download/sha256:434b02361608b8094de3835047e64168b9cea4cb20fac1183bbb67f2cd243036/add-on-batch-camera-render-v1.8.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/batch-camera-render/","maintainer":"Mahdi.Shalchian","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Create output folders for rendered frames"},"tags":["Render","Camera"]},{"id":"blur_hdri","schema_version":"1.0.0","name":"Blur HDRI","version":"0.0.8","tagline":"Blur HDRI Images by creating a new node with a Gaussian Blur","archive_hash":"sha256:090146de88bdd5a8fbd99114ae7ae34f2c7984ddce47ee98cc4e3b365029b63b","archive_size":7821082,"archive_url":"https://extensions.blender.org/download/sha256:090146de88bdd5a8fbd99114ae7ae34f2c7984ddce47ee98cc4e3b365029b63b/add-on-blur-hdri-v0.0.8-windows-x64.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/blur-hdri/","maintainer":"Jan-Hendrik-Müller","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Importing data files from disk"},"platforms":["windows-x64"],"tags":["Material","Lighting"]},{"id":"node_editor_pro","schema_version":"1.0.0","name":"Node Editor Pro","version":"0.5.0","tagline":"Organize nodes with auto-layout, snap and cleanup","archive_hash":"sha256:ba6cd0cbb08dcfa05a99680f6c27a29ba090bf795bb057589372e3d9b08c3f7c","archive_size":4809,"archive_url":"https://extensions.blender.org/download/sha256:ba6cd0cbb08dcfa05a99680f6c27a29ba090bf795bb057589372e3d9b08c3f7c/add-on-node-editor-pro-v0.5.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-editor-pro/","maintainer":"the_visual_geek","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","User Interface"]},{"id":"data_scale","schema_version":"1.0.0","name":"ID Tools","version":"1.2.0","tagline":"Assortment of tools for the manipulation of data-blocks","archive_hash":"sha256:6aee14fa7c34487d34a4822ffacc829876382eccf7a8ae6382f84cdc9a61e646","archive_size":22974,"archive_url":"https://extensions.blender.org/download/sha256:6aee14fa7c34487d34a4822ffacc829876382eccf7a8ae6382f84cdc9a61e646/add-on-data-scale-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/data-scale/","maintainer":"hisanimations","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Temporarily create .blend files to weigh them"},"tags":["Import-Export"]},{"id":"anim_offset_pro","schema_version":"1.0.0","name":"Anim Offset Pro","version":"1.3.0","tagline":"Offset poses across animation keyframes","archive_hash":"sha256:dd1d412f81e9e875bfb4c58d445cd64f904953febf61f05417ca0cf86d7c0ecd","archive_size":5091,"archive_url":"https://extensions.blender.org/download/sha256:dd1d412f81e9e875bfb4c58d445cd64f904953febf61f05417ca0cf86d7c0ecd/add-on-anim-offset-pro-v1.3.0.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/anim-offset-pro/","maintainer":"Drika111.","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"dynamic_render_border","schema_version":"1.0.0","name":"Dynamic Render Border","version":"1.0.1","tagline":"Addon to create dynamic render borders for animations","archive_hash":"sha256:b7ad62a75bfeb6066efe981c1afaec3a7e048d134903c2f50e0aea695b184986","archive_size":7352,"archive_url":"https://extensions.blender.org/download/sha256:b7ad62a75bfeb6066efe981c1afaec3a7e048d134903c2f50e0aea695b184986/add-on-dynamic-render-border-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dynamic-render-border/","maintainer":"tobiaskummer","license":["SPDX:GPL-3.0-or-later"],"tags":["Render","Animation"]},{"id":"shapeFitter","schema_version":"1.0.0","name":"Shape Fitter","version":"1.3.0","tagline":"Fit primitive shapes to verticies","archive_hash":"sha256:c99bad96a5f3278319ab9ea0e6a30c727a88ec34392034650c8b58f42d311aee","archive_size":10012,"archive_url":"https://extensions.blender.org/download/sha256:c99bad96a5f3278319ab9ea0e6a30c727a88ec34392034650c8b58f42d311aee/add-on-shapefitter-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shapefitter/","maintainer":"pfalkingham","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh","Object"]},{"id":"trimmer","schema_version":"1.0.0","name":"Trimmer","version":"0.3.0","tagline":"Simplified texturing workflow for trim-sheets","archive_hash":"sha256:fd310ab53bf5e974d603924e68067671b23084859b99f2d6d52e878efb3ddff5","archive_size":12275,"archive_url":"https://extensions.blender.org/download/sha256:fd310ab53bf5e974d603924e68067671b23084859b99f2d6d52e878efb3ddff5/add-on-trimmer-v0.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/trimmer/","maintainer":"LaXHeXLuX","license":["SPDX:GPL-3.0-or-later"],"tags":["UV"]},{"id":"camera_viewer","schema_version":"1.0.0","name":"Camera Viewer","version":"1.1.4","tagline":"You can preview the camera view directly in the 3D viewport","archive_hash":"sha256:9545f50ff8d23fb6a1a6c1b1b0bc3e47f64be484d731091e81b7619a2b56fe79","archive_size":11337,"archive_url":"https://extensions.blender.org/download/sha256:9545f50ff8d23fb6a1a6c1b1b0bc3e47f64be484d731091e81b7619a2b56fe79/add-on-camera-viewer-v1.1.4.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/camera-viewer/","maintainer":"KENKEN","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","User Interface"]},{"id":"meshstats","schema_version":"1.0.0","name":"Meshstats","version":"1.3.2","tagline":"Mesh statistics","archive_hash":"sha256:54bbc62131198db4c4c7f3f74276ef835cf8719d3ea57598e8dfac3758652421","archive_size":55105,"archive_url":"https://extensions.blender.org/download/sha256:54bbc62131198db4c4c7f3f74276ef835cf8719d3ea57598e8dfac3758652421/add-on-meshstats-v1.3.2.zip","type":"add-on","blender_version_min":"4.2.2","website":"https://extensions.blender.org/add-ons/meshstats/","maintainer":"muhuk","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"requin_blue_theme","schema_version":"1.0.0","name":"Requin Blue","version":"1.2.0","tagline":"This is a Blender theme with a major blue color","archive_hash":"sha256:f9719297e08b25c93ad28a52aaed35103e3484588373d059096c87514dd7fa42","archive_size":6733,"archive_url":"https://extensions.blender.org/download/sha256:f9719297e08b25c93ad28a52aaed35103e3484588373d059096c87514dd7fa42/theme-requin-blue-theme-v1.2.0.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"6.0.0","website":"https://extensions.blender.org/themes/requin-blue-theme/","maintainer":"MozzarellaARC","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"auto_dark_mode","schema_version":"1.0.0","name":"Auto Dark Mode","version":"3.0.0","tagline":"Automatically follow the system light/dark mode","archive_hash":"sha256:a1e8a5f58f1bbeed52f5afcb6ed5b36c45f1e3642419becf8f6472967963260b","archive_size":11993,"archive_url":"https://extensions.blender.org/download/sha256:a1e8a5f58f1bbeed52f5afcb6ed5b36c45f1e3642419becf8f6472967963260b/add-on-auto-dark-mode-v3.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-dark-mode/","maintainer":"dprice","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read installed themes"},"tags":["System","User Interface"]},{"id":"blue_genes","schema_version":"1.0.0","name":"Blue Genes","version":"1.0.3","tagline":"Dark Blue, Readable Daily Driver","archive_hash":"sha256:dbd30beb266dff2448d87b8e592e1afce7330b5d79ec4c1ef7a4b3c3d1c9e61e","archive_size":5997,"archive_url":"https://extensions.blender.org/download/sha256:dbd30beb266dff2448d87b8e592e1afce7330b5d79ec4c1ef7a4b3c3d1c9e61e/theme-blue-genes-v1.0.3.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/blue-genes/","maintainer":"SpectralVectors","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Colorful"]},{"id":"save_with_versioning","schema_version":"1.0.0","name":"Save with Versioning","version":"2.1.0","tagline":"Save incremental and use published files for asset linking","archive_hash":"sha256:7481617c63e770530f3e37d0d3519eaca1b3cd7589e21ddedc4f26912f50b6ff","archive_size":20710,"archive_url":"https://extensions.blender.org/download/sha256:7481617c63e770530f3e37d0d3519eaca1b3cd7589e21ddedc4f26912f50b6ff/add-on-save-with-versioning-v2.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/save-with-versioning/","maintainer":"DShot92","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save .blend files"},"tags":["Pipeline"]},{"id":"is_key_free","schema_version":"1.0.0","name":"Is key Free","version":"1.1.3","tagline":"Find free shortcuts, inform about used and print a key list","archive_hash":"sha256:68b702bfc895175d2b3dad64880e2249e97b8f461510bf20e9ab6951fcc67d3a","archive_size":5471,"archive_url":"https://extensions.blender.org/download/sha256:68b702bfc895175d2b3dad64880e2249e97b8f461510bf20e9ab6951fcc67d3a/add-on-is-key-free-v1.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/is-key-free/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Development"]},{"id":"node_presets","schema_version":"1.0.0","name":"Node Presets","version":"1.1.0","tagline":"Add node groups directly to the node editors","archive_hash":"sha256:0b875c6c78c02bf6ab79cf82310a587cfc8dfe790aec158102a35dd22f1c8c04","archive_size":2398,"archive_url":"https://extensions.blender.org/download/sha256:0b875c6c78c02bf6ab79cf82310a587cfc8dfe790aec158102a35dd22f1c8c04/add-on-node-presets-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-presets/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Node"]},{"id":"align_tools","schema_version":"1.0.0","name":"Align Tools","version":"0.3.6","tagline":"Align Selected Objects to Active Object","archive_hash":"sha256:741ca75b391bda65d2dc22160b4f594b7d4ed9a8772dd055535b7c2c7eb9b9de","archive_size":6743,"archive_url":"https://extensions.blender.org/download/sha256:741ca75b391bda65d2dc22160b4f594b7d4ed9a8772dd055535b7c2c7eb9b9de/add-on-align-tools-v0.3.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/align-tools/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"archimesh","schema_version":"1.0.0","name":"Archimesh","version":"1.2.5","tagline":"Generate rooms, doors, windows, and other architecture objects","archive_hash":"sha256:44745a86dd472e296e06cd45c511e002a1105512a73009cb0018c87611d18d87","archive_size":323488,"archive_url":"https://extensions.blender.org/download/sha256:44745a86dd472e296e06cd45c511e002a1105512a73009cb0018c87611d18d87/add-on-archimesh-v1.2.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/archimesh/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Add Mesh"]},{"id":"scatter_objects","schema_version":"1.0.0","name":"Scatter Objects","version":"0.2.0","tagline":"Distribute object instances on another object","archive_hash":"sha256:3fda488f56523b799e3937c802119f1da986391e193cb4d443177e6e132c764b","archive_size":6876,"archive_url":"https://extensions.blender.org/download/sha256:3fda488f56523b799e3937c802119f1da986391e193cb4d443177e6e132c764b/add-on-scatter-objects-v0.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/scatter-objects/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Object"]},{"id":"sapling_tree_gen","schema_version":"1.0.0","name":"Sapling Tree Gen","version":"0.3.7","tagline":"Adds a parametric tree","archive_hash":"sha256:27a478262e1c86612a9c3daffe7f4dce2802f5bc2294033462e5adc6d9c0080f","archive_size":36296,"archive_url":"https://extensions.blender.org/download/sha256:27a478262e1c86612a9c3daffe7f4dce2802f5bc2294033462e5adc6d9c0080f/add-on-sapling-tree-gen-v0.3.7.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/sapling-tree-gen/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Curve"]},{"id":"node_group_utilities","schema_version":"1.0.0","name":"Node Group Utilities","version":"2.1.1","tagline":"Extra options and functions for node groups","archive_hash":"sha256:00fcf7000ecc7fc01b96293030269439cc6ef72809f5be80f806b7cb18afa4a5","archive_size":67952,"archive_url":"https://extensions.blender.org/download/sha256:00fcf7000ecc7fc01b96293030269439cc6ef72809f5be80f806b7cb18afa4a5/add-on-node-group-utilities-v2.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-group-utilities/","maintainer":"Baraa-Khaled-Youssef","license":["SPDX:GPL-2.0-or-later"],"tags":["Node","Material"]},{"id":"flatterer","schema_version":"1.0.0","name":"Flatterer","version":"1.6.0","tagline":"Flat mesh to SVG exporter for laser cutters","archive_hash":"sha256:61241ed38f522af0152439c07d8654caf30a67e45f6b5298e8797061460a2559","archive_size":383844,"archive_url":"https://extensions.blender.org/download/sha256:61241ed38f522af0152439c07d8654caf30a67e45f6b5298e8797061460a2559/add-on-flatterer-v1.6.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/flatterer/","maintainer":"dr.sybren","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export SVG files to disk"},"tags":["Import-Export"]},{"id":"bombsquad_tools","schema_version":"1.0.0","name":"BombSquad Tools","version":"3.0.12","tagline":"Tools for creating BombSquad game assets","archive_hash":"sha256:0c5f2f5b01dd02165f9cb72b00f570636d75d62cbeed706bf10f90b4eff5cd00","archive_size":39147,"archive_url":"https://extensions.blender.org/download/sha256:0c5f2f5b01dd02165f9cb72b00f570636d75d62cbeed706bf10f90b4eff5cd00/add-on-bombsquad-tools-v3.0.12.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bombsquad-tools/","maintainer":"aryan02420","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export .bob, .cob, and .json files"},"tags":["Import-Export","Scene"]},{"id":"vertex_group_assistant","schema_version":"1.0.0","name":"Vertex Group Assistant","version":"1.0.2","tagline":"Simplifies clothing rigging for avatars","archive_hash":"sha256:a566528f6aad3e2971e874bad0c48e4094102f23ccb5ae92790b7803055d102c","archive_size":3846,"archive_url":"https://extensions.blender.org/download/sha256:a566528f6aad3e2971e874bad0c48e4094102f23ccb5ae92790b7803055d102c/add-on-vertex-group-assistant-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/vertex-group-assistant/","maintainer":"Maro3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"blender_Run_Scripts_From_Folder","schema_version":"1.0.0","name":"Run Scripts From Folder","version":"0.0.7","tagline":"Execute script from Script Directiories","archive_hash":"sha256:cb458bdebbfcdb64b6a2262ca9fa83f7b23e062f39e305e6b95cc5b81d84cb47","archive_size":2464,"archive_url":"https://extensions.blender.org/download/sha256:cb458bdebbfcdb64b6a2262ca9fa83f7b23e062f39e305e6b95cc5b81d84cb47/add-on-blender-run-scripts-from-folder-v0.0.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blender-run-scripts-from-folder/","maintainer":"Alexander-Bicukow","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read .py files from disk"},"tags":["System"]},{"id":"convert_rotation_mode","schema_version":"1.0.0","name":"Convert Rotation Mode","version":"1.5.1","tagline":"Change rotation mode whilst preserving animation","archive_hash":"sha256:63ecb6db33c6cd21d98609286cfb3a780571cff3e5e8c6acb536cdb783fc3aec","archive_size":23134,"archive_url":"https://extensions.blender.org/download/sha256:63ecb6db33c6cd21d98609286cfb3a780571cff3e5e8c6acb536cdb783fc3aec/add-on-convert-rotation-mode-v1.5.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/convert-rotation-mode/","maintainer":"Lauloque","license":["SPDX:GPL-3.0-or-later"],"permissions":{"clipboard":"Copy and paste bone transforms"},"tags":["Animation","3D View","Bake"]},{"id":"bdvd_SharpBlade","schema_version":"1.0.0","name":"Sharp Blade","version":"5.2.0","tagline":"Easy on the eyes, deep in the blue. Create freely","archive_hash":"sha256:b2b2199a00b52df8ad291b2625da12c478524e19c480cddc8ba04bbc46362e24","archive_size":5892,"archive_url":"https://extensions.blender.org/download/sha256:b2b2199a00b52df8ad291b2625da12c478524e19c480cddc8ba04bbc46362e24/theme-bdvd-sharpblade-v5.2.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/bdvd-sharpblade/","maintainer":"bdvd","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Colorful"]},{"id":"dynamic_brush_menus","schema_version":"1.0.0","name":"Dynamic Brush Menus","version":"1.1.10","tagline":"Fast access to brushes & tools in Sculpt and Paint Modes","archive_hash":"sha256:ee971938173591236df0a08db5ebced525052b70fd0f69dbeae64598622fb400","archive_size":15222,"archive_url":"https://extensions.blender.org/download/sha256:ee971938173591236df0a08db5ebced525052b70fd0f69dbeae64598622fb400/add-on-dynamic-brush-menus-v1.1.10.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dynamic-brush-menus/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["User Interface"]},{"id":"visibility_handler","schema_version":"1.0.0","name":"Visibility handler","version":"1.1.3","tagline":"Copy visibility from viewport to render settings or vice versa","archive_hash":"sha256:44a76b38bbb79f925e0354bc1609856c500f0b1d084a14488516558f2c26219c","archive_size":8680,"archive_url":"https://extensions.blender.org/download/sha256:44a76b38bbb79f925e0354bc1609856c500f0b1d084a14488516558f2c26219c/add-on-visibility-handler-v1.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/visibility-handler/","maintainer":"DanielBystedt","license":["SPDX:GPL-2.0-or-later"],"tags":["Render"]},{"id":"image_sequence_to_mp4_video_converter","schema_version":"1.0.0","name":"Image Sequence to MP4 Video Converter","version":"1.0.3","tagline":"Convert image sequences to MP4 with custom resolution","archive_hash":"sha256:463d624dba76193ecf576cea46f8ea024372178e917036d0252b15fc7154f08d","archive_size":8152,"archive_url":"https://extensions.blender.org/download/sha256:463d624dba76193ecf576cea46f8ea024372178e917036d0252b15fc7154f08d/add-on-image-sequence-to-mp4-video-converter-v1.0.3.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/image-sequence-to-mp4-video-converter/","maintainer":"Prince_Eagle","license":["SPDX:GPL-3.0-or-later"],"tags":["Render"]},{"id":"vertex_group_hierarchy_sorter","schema_version":"1.0.0","name":"Vertex Group Hierarchy Sorter","version":"1.0.4","tagline":"List vertex groups in armature hierarchy order","archive_hash":"sha256:943c36cb19536f4658439ef967455e8ae927620ebcd5421a1b3fe202823258b1","archive_size":15156,"archive_url":"https://extensions.blender.org/download/sha256:943c36cb19536f4658439ef967455e8ae927620ebcd5421a1b3fe202823258b1/add-on-vertex-group-hierarchy-sorter-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/vertex-group-hierarchy-sorter/","maintainer":"Cloud-Guy","license":["SPDX:GPL-3.0-or-later"]},{"id":"expLODe","schema_version":"1.0.0","name":"expLODe","version":"1.0.2","tagline":"LOD automation script using Python and Blender","archive_hash":"sha256:e22b3e3e5986a89f0dc6febba53631b2e527fe759efe5745d3968f2053323c74","archive_size":22275,"archive_url":"https://extensions.blender.org/download/sha256:e22b3e3e5986a89f0dc6febba53631b2e527fe759efe5745d3968f2053323c74/add-on-explode-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/explode/","maintainer":"Rainma22","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export FBX from/to disk"},"tags":["Import-Export"]},{"id":"render_notifications_extension","schema_version":"1.0.0","name":"Render Notifications","version":"1.2.4","tagline":"Notifies you via Discord, desktop, or webhook on render events","archive_hash":"sha256:0e2b217863840587974ec233e1a7357d12de7577b5572a35950f605b557ff906","archive_size":5694796,"archive_url":"https://extensions.blender.org/download/sha256:0e2b217863840587974ec233e1a7357d12de7577b5572a35950f605b557ff906/add-on-render-notifications-extension-v1.2.4-windows-x64.zip","type":"add-on","blender_version_min":"4.3.2","website":"https://extensions.blender.org/add-ons/render-notifications-extension/","maintainer":"JimmyNoStar","license":["SPDX:GPL-3.0-or-later"],"permissions":{"network":"Needed to send notifications via webhooks and Discord"},"platforms":["windows-x64"],"tags":["Render","System"]},{"id":"armature_deform_with_linked_groups","schema_version":"1.0.0","name":"Armature Deform with Linked Groups","version":"1.0.0","tagline":"Create an armature deformation using linked vertices","archive_hash":"sha256:1047c0266831c6a13fad2563b7e4e173338e13905b92be26f9ac48666eabc4b2","archive_size":4824,"archive_url":"https://extensions.blender.org/download/sha256:1047c0266831c6a13fad2563b7e4e173338e13905b92be26f9ac48666eabc4b2/add-on-armature-deform-with-linked-groups-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/armature-deform-with-linked-groups/","maintainer":"Suchaaver","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Animation","Mesh"]},{"id":"LinkageMarkingMenu","schema_version":"1.0.0","name":"Linkage Marking Menu","version":"1.0.5","tagline":"Customizable Marking Menu for Object and Edit modes","archive_hash":"sha256:30ab484d65284197c16c36b34413ebfbb48743700ecf1c39f361e9bb60f6cd4c","archive_size":18953,"archive_url":"https://extensions.blender.org/download/sha256:30ab484d65284197c16c36b34413ebfbb48743700ecf1c39f361e9bb60f6cd4c/add-on-linkagemarkingmenu-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/linkagemarkingmenu/","maintainer":"Linkage","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"eevee_projectors","schema_version":"1.0.0","name":"Eevee Projectors","version":"1.1.1","tagline":"Fake Projector lights in Eeve","archive_hash":"sha256:f43016da2aba44eeb36dbcadee9116495c46721e33580af67fa487ae7305749e","archive_size":285870,"archive_url":"https://extensions.blender.org/download/sha256:f43016da2aba44eeb36dbcadee9116495c46721e33580af67fa487ae7305749e/add-on-eevee-projectors-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/eevee-projectors/","maintainer":"F1dg3t","license":["SPDX:GPL-3.0-or-later"],"tags":["Lighting","Object"]},{"id":"Arma3ObjectBuilder","schema_version":"1.0.0","name":"Arma 3 Object Builder","version":"2.5.1","tagline":"Comprehensive add-on for modding Arma 3","archive_hash":"sha256:9bf51396006c9788afc8072b9d57bb832057cad18022c6bc426211b420396009","archive_size":270830,"archive_url":"https://extensions.blender.org/download/sha256:9bf51396006c9788afc8072b9d57bb832057cad18022c6bc426211b420396009/add-on-arma3objectbuilder-v2.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/arma3objectbuilder/","maintainer":"MrClock","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export operations on supported file formats"},"tags":["Import-Export","Game Engine","Object"]},{"id":"gp_to_curves","schema_version":"1.0.0","name":"Grease Pencil to Curves","version":"0.4.5","tagline":"Quickly convert Grease Pencil strokes to simple curves and hair","archive_hash":"sha256:42d5a745d6c1f48a82610aa686c21ad41e2036bd9f8edd6c71dd0742034f6ad5","archive_size":6977,"archive_url":"https://extensions.blender.org/download/sha256:42d5a745d6c1f48a82610aa686c21ad41e2036bd9f8edd6c71dd0742034f6ad5/add-on-gp-to-curves-v0.4.5.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/gp-to-curves/","maintainer":"DadsCastle","license":["SPDX:GPL-3.0-or-later"],"tags":["Grease Pencil","Add Curve","Modeling"]},{"id":"RigFlex","schema_version":"1.0.0","name":"RigFlex Simple Soft Body Simulation for Armatures","version":"4.2.1","tagline":"Simple Soft Body Simulation for Armatures","archive_hash":"sha256:c225c679634d5872fa6f6baf1e0bf513ececa90e8243cd30747fc825e743b064","archive_size":8750,"archive_url":"https://extensions.blender.org/download/sha256:c225c679634d5872fa6f6baf1e0bf513ececa90e8243cd30747fc825e743b064/add-on-rigflex-v4.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/rigflex/","maintainer":"Nerk","license":["SPDX:GPL-2.0-or-later"],"tags":["Animation","Physics","Rigging"]},{"id":"FavoriteObjects","schema_version":"1.0.0","name":"Favorite Objects","version":"1.0.5","tagline":"Mark your favorite objects and select them from the Viewport","archive_hash":"sha256:88b3d6b72968ba21a2771608335635237bd9bb56338423aab049bd0a9e6e01c6","archive_size":5933,"archive_url":"https://extensions.blender.org/download/sha256:88b3d6b72968ba21a2771608335635237bd9bb56338423aab049bd0a9e6e01c6/add-on-favoriteobjects-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/favoriteobjects/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling"]},{"id":"property_chart","schema_version":"1.0.0","name":"Property Chart","version":"0.1.2","tagline":"Edit properties simultaneously for selected objects/sequencer","archive_hash":"sha256:9239bce660c04eb8a3a4bd5f5bca5f3291fb6ad13cee1cf2cca2386f00cda9ed","archive_size":2959,"archive_url":"https://extensions.blender.org/download/sha256:9239bce660c04eb8a3a4bd5f5bca5f3291fb6ad13cee1cf2cca2386f00cda9ed/add-on-property-chart-v0.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/property-chart/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["System"]},{"id":"flow_navigation","schema_version":"1.0.0","name":"Flow Navigation Lite","version":"1.3.6","tagline":"Essential navigation with auto-focus and clipping","archive_hash":"sha256:46518666eabf94bee77355f07246e3cb75a6dc1294f85f4e56ff54b62cba4d83","archive_size":70762,"archive_url":"https://extensions.blender.org/download/sha256:46518666eabf94bee77355f07246e3cb75a6dc1294f85f4e56ff54b62cba4d83/add-on-flow-navigation-v1.3.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/flow-navigation/","maintainer":"CG_Flow","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Camera"]},{"id":"randomizer","schema_version":"1.0.0","name":"Material Randomizer Pro","version":"1.10.0","tagline":"Material Randomization Tools","archive_hash":"sha256:8747ea7cad63a28ebba701b426f306ad6fc1bf8c66f7486c222a40120f902d46","archive_size":10795,"archive_url":"https://extensions.blender.org/download/sha256:8747ea7cad63a28ebba701b426f306ad6fc1bf8c66f7486c222a40120f902d46/add-on-randomizer-v1.10.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/randomizer/","maintainer":"lambdawalker","license":["SPDX:GPL-3.0-or-later"]},{"id":"Connecter","schema_version":"1.0.0","name":"Connecter","version":"0.6.20","tagline":"Streamlined Asset Management: Import & Export with Connecter DAM","archive_hash":"sha256:4aac3920620b8a259d6736a7f48668d44dd1a23fb8de2df3be0c51de2b799310","archive_size":392369,"archive_url":"https://extensions.blender.org/download/sha256:4aac3920620b8a259d6736a7f48668d44dd1a23fb8de2df3be0c51de2b799310/add-on-connecter-v0.6.20-windows-x64-windows-arm64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/connecter/","maintainer":"DesignConnected","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export blend files from/to disk"},"platforms":["windows-x64","windows-arm64"],"tags":["Import-Export"]},{"id":"render_multiple_instances","schema_version":"1.0.0","name":"Render Multiple Instances","version":"3.2.1","tagline":"Render animations and Flipbooks faster with multiple instances","archive_hash":"sha256:d4d4a14874541dcbf6cccf740ee21a142e9ae8a5b46bab532ba3822a0cc0c2dc","archive_size":8380,"archive_url":"https://extensions.blender.org/download/sha256:d4d4a14874541dcbf6cccf740ee21a142e9ae8a5b46bab532ba3822a0cc0c2dc/add-on-render-multiple-instances-v3.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/render-multiple-instances/","maintainer":"DShot92","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save and read exports images"},"tags":["Render","Pipeline"]},{"id":"turnaround_camera","schema_version":"1.0.0","name":"Turnaround Camera","version":"0.3.0","tagline":"Add a camera rotation around selected object","archive_hash":"sha256:e9bfadd7d4d9e7dcfde9d0effa1815f9170561a81b63bee549b066c31aa48efa","archive_size":3237,"archive_url":"https://extensions.blender.org/download/sha256:e9bfadd7d4d9e7dcfde9d0effa1815f9170561a81b63bee549b066c31aa48efa/add-on-turnaround-camera-v0.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/turnaround-camera/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Animation"]},{"id":"carver","schema_version":"1.0.0","name":"Carver","version":"1.2.3","tagline":"Multiple tools to carve or to create objects","archive_hash":"sha256:4c0b7c0c2906e09ee96fd2d5bb0d36f0be439a41f6f222ae48f38c317262ac3b","archive_size":29032,"archive_url":"https://extensions.blender.org/download/sha256:4c0b7c0c2906e09ee96fd2d5bb0d36f0be439a41f6f222ae48f38c317262ac3b/add-on-carver-v1.2.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/carver/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"eye_animation","schema_version":"1.0.0","name":"Eye Animation","version":"2.0.0","tagline":"Eye position and blinking tool with keyframe controls","archive_hash":"sha256:1b9dc1648e32ac9b7890904c7df6fdb6a029bbb1250bf79eaccda310b5d3d53e","archive_size":5308,"archive_url":"https://extensions.blender.org/download/sha256:1b9dc1648e32ac9b7890904c7df6fdb6a029bbb1250bf79eaccda310b5d3d53e/add-on-eye-animation-v2.0.0.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/eye-animation/","maintainer":"Affe_mit_Waffe","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"PinkPinkPink","schema_version":"1.0.0","name":"PinkPinkPink","version":"1.1.0","tagline":"Pink Blender Theme","archive_hash":"sha256:99e666d5352cc017b6e9813f448a16758204e1db707c40c2418eb0dbc7f99f09","archive_size":5254,"archive_url":"https://extensions.blender.org/download/sha256:99e666d5352cc017b6e9813f448a16758204e1db707c40c2418eb0dbc7f99f09/theme-pinkpinkpink-v1.1.0.zip","type":"theme","blender_version_min":"5.1.0","website":"https://extensions.blender.org/themes/pinkpinkpink/","maintainer":"Livbaire","license":["SPDX:GPL-2.0-or-later"],"tags":["Light","Colorful"]},{"id":"maze_generator_pro","schema_version":"1.0.0","name":"Maze Generator Pro","version":"1.0.1","tagline":"3D maze generator: 7 algorithms, 12 presets, themes, physics","archive_hash":"sha256:7bfe13d375cad99674d5c9d8172c749426c5e793665eef34423d70e647aed133","archive_size":22388,"archive_url":"https://extensions.blender.org/download/sha256:7bfe13d375cad99674d5c9d8172c749426c5e793665eef34423d70e647aed133/add-on-maze-generator-pro-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/maze-generator-pro/","maintainer":"BasharatLeoGill","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh"]},{"id":"blink_bg","schema_version":"1.0.0","name":"Blink BG","version":"1.0.1","tagline":"Control camera BG image alpha/depth","archive_hash":"sha256:80aab1029fbb423ff6e7eee7d4a339717fcf58cf322c47f4fed818ba7d1f42ee","archive_size":4185,"archive_url":"https://extensions.blender.org/download/sha256:80aab1029fbb423ff6e7eee7d4a339717fcf58cf322c47f4fed818ba7d1f42ee/add-on-blink-bg-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blink-bg/","maintainer":"K_Naoki","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","3D View"]},{"id":"armature_to_mesh","schema_version":"1.0.0","name":"Armature to Mesh","version":"1.0.2","tagline":"Convert armature bones to a mesh","archive_hash":"sha256:1c3b0eefddab10ac0c3a5d2a5069193eb6d7ba45f8d2c99254335d1cd6dc57f7","archive_size":4719,"archive_url":"https://extensions.blender.org/download/sha256:1c3b0eefddab10ac0c3a5d2a5069193eb6d7ba45f8d2c99254335d1cd6dc57f7/add-on-armature-to-mesh-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/armature-to-mesh/","maintainer":"SamRog94","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Rigging"]},{"id":"Dark_Chocolate_Theme","schema_version":"1.0.0","name":"Dark_Chocolate_Theme","version":"1.0.2","tagline":"Mellow Sombre","archive_hash":"sha256:aaf94d2e18556d5043b12f476401a875badf0ad139551f3b92703529af2defb7","archive_size":5684,"archive_url":"https://extensions.blender.org/download/sha256:aaf94d2e18556d5043b12f476401a875badf0ad139551f3b92703529af2defb7/theme-dark-chocolate-theme-v1.0.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/dark-chocolate-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"uvcp_addon","schema_version":"1.0.0","name":"UV Coordinate Palette","version":"1.0.0","tagline":"UV tool for storing coordinates of the 2D Cursor in a palette","archive_hash":"sha256:f4a3e5c38063a1a788323eedb14f49536bd9887b55839bc193ec6d48890d3150","archive_size":4498,"archive_url":"https://extensions.blender.org/download/sha256:f4a3e5c38063a1a788323eedb14f49536bd9887b55839bc193ec6d48890d3150/add-on-uvcp-addon-v1.0.0.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/uvcp-addon/","maintainer":"Oleksandr-Gubanov","license":["SPDX:GPL-3.0-or-later"],"tags":["UV"]},{"id":"dynamic_color_palette","schema_version":"1.0.0","name":"Dynamic Color Palette","version":"2.1.1","tagline":"Generate palette textures and assign colors via UV lookup","archive_hash":"sha256:7ae98a692d022f747a9aaa5e1ebcbbcc1e7d33d9d7ce68467793f2ca20179472","archive_size":65751,"archive_url":"https://extensions.blender.org/download/sha256:7ae98a692d022f747a9aaa5e1ebcbbcc1e7d33d9d7ce68467793f2ca20179472/add-on-dynamic-color-palette-v2.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dynamic-color-palette/","maintainer":"fwdotcom","license":["SPDX:GPL-3.0-or-later"]},{"id":"blender2ue_rig_exporter","schema_version":"1.0.0","name":"Rig UE5 Exporter","version":"0.0.3","tagline":"Export rig to UE5","archive_hash":"sha256:27f0d4a4c359a53af0d2887d8ed485dbb8016f2a70a420af46dc30b461a3f533","archive_size":50459,"archive_url":"https://extensions.blender.org/download/sha256:27f0d4a4c359a53af0d2887d8ed485dbb8016f2a70a420af46dc30b461a3f533/add-on-blender2ue-rig-exporter-v0.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blender2ue-rig-exporter/","maintainer":"Wiffzackius","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export STL, PLY, OBJ files"},"tags":["Import-Export"]},{"id":"pin_solver","schema_version":"1.0.0","name":"PinSolver","version":"1.0.2","tagline":"Interactive camera alignment","archive_hash":"sha256:9c0e27f3d46ef6c8e8664a7efc4a47227403b9d78c78e3c256a29d6c25a58edd","archive_size":40096206,"archive_url":"https://extensions.blender.org/download/sha256:9c0e27f3d46ef6c8e8664a7efc4a47227403b9d78c78e3c256a29d6c25a58edd/add-on-pin-solver-v1.0.2-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pin-solver/","maintainer":"K_Naoki","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Tracking","Camera","3D View"]},{"id":"max","schema_version":"1.0.0","name":"Max","version":"1.0.0","tagline":"Theme inspired by Max","archive_hash":"sha256:f62edb2ecc200f93bc0eee27b851c0e7ed4d4ad2b43a49e86e7fd1e5f8bbf654","archive_size":5445,"archive_url":"https://extensions.blender.org/download/sha256:f62edb2ecc200f93bc0eee27b851c0e7ed4d4ad2b43a49e86e7fd1e5f8bbf654/theme-max-v1.0.0.zip","type":"theme","blender_version_min":"4.5.0","website":"https://extensions.blender.org/themes/max/","maintainer":"Dabidzhi","license":["SPDX:GPL-3.0-or-later"],"tags":["Inspired By","Dark"]},{"id":"nuke_camera_exporter","schema_version":"1.0.0","name":"Export to Nuke Script","version":"1.0.0","tagline":"Export cameras and empties to Nuke with exact matrix data","archive_hash":"sha256:aff488b5d0e3af9424f25247e187a46095f282a1b81004209d2c1c06a1c1754e","archive_size":2631,"archive_url":"https://extensions.blender.org/download/sha256:aff488b5d0e3af9424f25247e187a46095f282a1b81004209d2c1c06a1c1754e/add-on-nuke-camera-exporter-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nuke-camera-exporter/","maintainer":"Vicky_at_24fps","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"transform_tools_core_yiws","schema_version":"1.0.0","name":"Transform Tools Core","version":"0.9.7","tagline":"Advanced gizmo control & precision transformations for Blender","archive_hash":"sha256:b3df6889d59994f6562bc421f5be6b263fb3d9d2f6057cbd4aa92457a9b12a58","archive_size":23454,"archive_url":"https://extensions.blender.org/download/sha256:b3df6889d59994f6562bc421f5be6b263fb3d9d2f6057cbd4aa92457a9b12a58/add-on-transform-tools-core-yiws-v0.9.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/transform-tools-core-yiws/","maintainer":"yasser-idris","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"clamp_psx_dark","schema_version":"1.0.0","name":"Clamp PSX Dark","version":"1.0.0","tagline":"Retro PlayStation inspired dark theme for Blender 4.5","archive_hash":"sha256:49284abe0ed2ccfdfb9309386b7cfc2e33f644ca01b28939ccdf578b0be09fd3","archive_size":5757,"archive_url":"https://extensions.blender.org/download/sha256:49284abe0ed2ccfdfb9309386b7cfc2e33f644ca01b28939ccdf578b0be09fd3/theme-clamp-psx-dark-v1.0.0.zip","type":"theme","blender_version_min":"4.5.0","website":"https://extensions.blender.org/themes/clamp-psx-dark/","maintainer":"Gadzhimuslimov-Kamil-R","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"show_curve_length","schema_version":"1.0.0","name":"Show Curve Length","version":"1.0.0","tagline":"Shows the length of Curve Splines","archive_hash":"sha256:2c47eb86236963878ade7320ddeed43a7ba2939a77b4676f960b0752956ebe45","archive_size":8644,"archive_url":"https://extensions.blender.org/download/sha256:2c47eb86236963878ade7320ddeed43a7ba2939a77b4676f960b0752956ebe45/add-on-show-curve-length-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/show-curve-length/","maintainer":"Giambattista-Caltabiano","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"psx_theme","schema_version":"1.0.0","name":"PS1 Classic","version":"2.0.2","tagline":"Retro PlayStation 1 inspired Blender theme","archive_hash":"sha256:7fa72c88d46ca2e952e8bd6aade1ed34e91b4d163ede5e6132337759ff716496","archive_size":5909,"archive_url":"https://extensions.blender.org/download/sha256:7fa72c88d46ca2e952e8bd6aade1ed34e91b4d163ede5e6132337759ff716496/theme-psx-theme-v2.0.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/psx-theme/","maintainer":"Fawkek","license":["SPDX:GPL-2.0-or-later"],"tags":["Light","Inspired By","Colorful"]},{"id":"pro_3d_dimension_tool","schema_version":"1.0.0","name":"Pro 3D Dimension Tool","version":"1.4.1","tagline":"Professional 3D dimensioning tool for Blender","archive_hash":"sha256:50647875cc65f7c5b8a19e4628bbdf433414d4955326b2faafdf43c05b0440f5","archive_size":22336,"archive_url":"https://extensions.blender.org/download/sha256:50647875cc65f7c5b8a19e4628bbdf433414d4955326b2faafdf43c05b0440f5/add-on-pro-3d-dimension-tool-v1.4.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pro-3d-dimension-tool/","maintainer":"DUONG-HOANG","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Modeling"]},{"id":"depotkit","schema_version":"1.0.0","name":"DepotKit","version":"2.0.0","tagline":"Collect & organise all external assets in your .blend file","archive_hash":"sha256:1f393895e26b435763fc0e5071679f4834cc912a280560174506daa55d62253f","archive_size":8223,"archive_url":"https://extensions.blender.org/download/sha256:1f393895e26b435763fc0e5071679f4834cc912a280560174506daa55d62253f/add-on-depotkit-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/depotkit/","maintainer":"BHiMAX","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Reads and writes texture files from disk"}},{"id":"io_mesh_threejs_objectloader","schema_version":"1.0.0","name":"three.js ObjectLoader","version":"1.0.1","tagline":"Import/Export three.js ObjectLoader JSON format 4+","archive_hash":"sha256:e0be2eff5d961f6095c52a3cabcde4b9f2bce0185c0126055e858310b89fd909","archive_size":12558,"archive_url":"https://extensions.blender.org/download/sha256:e0be2eff5d961f6095c52a3cabcde4b9f2bce0185c0126055e858310b89fd909/add-on-io-mesh-threejs-objectloader-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-mesh-threejs-objectloader/","maintainer":"crwde","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import and export JSON files to disk"},"tags":["Import-Export"]},{"id":"Studio_Mid","schema_version":"1.0.0","name":"Studio Mid","version":"2.3.2","tagline":"Consistent UI, sharp colors, comfortable contrast, 3 birght lvls","archive_hash":"sha256:48d02f6a85f3838fa0140e0b8fab16df8a2f8caf651addf5565f1528f2e1c858","archive_size":5467,"archive_url":"https://extensions.blender.org/download/sha256:48d02f6a85f3838fa0140e0b8fab16df8a2f8caf651addf5565f1528f2e1c858/theme-studio-mid-v2.3.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/studio-mid/","maintainer":"3DDinosaur","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"Studio_Light","schema_version":"1.0.0","name":"Studio Light","version":"2.3.2","tagline":"Consistent UI, sharp colors, comfortable contrast, 3 birght lvls","archive_hash":"sha256:353050bde017d0828a8f922d9e335023ca4b6b996ab6c3db49102d5edbdaaed7","archive_size":5453,"archive_url":"https://extensions.blender.org/download/sha256:353050bde017d0828a8f922d9e335023ca4b6b996ab6c3db49102d5edbdaaed7/theme-studio-light-v2.3.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/studio-light/","maintainer":"3DDinosaur","license":["SPDX:GPL-2.0-or-later"],"tags":["Light"]},{"id":"separate_by_collision","schema_version":"1.0.0","name":"Separate by Collision","version":"1.1.1","tagline":"Separate by loose parts, but parts are joined if they collide","archive_hash":"sha256:37e2bfdda0594f88a2fdd0d63ccf956e83279d6c63a2a9f41283014f5dbbd2c4","archive_size":7932,"archive_url":"https://extensions.blender.org/download/sha256:37e2bfdda0594f88a2fdd0d63ccf956e83279d6c63a2a9f41283014f5dbbd2c4/add-on-separate-by-collision-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/separate-by-collision/","maintainer":"Hattiffnat","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"texture_manager","schema_version":"1.0.0","name":"Texture File Path Editor","version":"2.0.0","tagline":"Manage, relink, gather and inspect all texture paths","archive_hash":"sha256:360a7361316d393bd1b27884693e83dc058a8dad0e73ad7759a9f3ddebccdef6","archive_size":8447,"archive_url":"https://extensions.blender.org/download/sha256:360a7361316d393bd1b27884693e83dc058a8dad0e73ad7759a9f3ddebccdef6/add-on-texture-manager-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/texture-manager/","maintainer":"BHiMAX","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Reads and writes texture files from disk"}},{"id":"pbr_lookdev","schema_version":"1.0.0","name":"PBR Lookdev","version":"4.2.0","tagline":"Layered PBR materials with masks, overlays and UDIM","archive_hash":"sha256:23178c40069bcb0f4fbba61ecc9a3c4fc03b2400de31126b4995cb773a54002e","archive_size":36640,"archive_url":"https://extensions.blender.org/download/sha256:23178c40069bcb0f4fbba61ecc9a3c4fc03b2400de31126b4995cb773a54002e/add-on-pbr-lookdev-v4.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pbr-lookdev/","maintainer":"BHiMAX","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Texture path scanning and image loading"},"tags":["Material","Node","Render"]},{"id":"smart_mesh_cleaner_pro","schema_version":"1.0.0","name":"Smart Mesh Cleaner Pro","version":"3.5.1","tagline":"Professional cleanup tool with Smart Trash Bin & Restore","archive_hash":"sha256:394046bce0e5bd2704912578dafd9aa6f988c7a752908f6b6e0e56706f870567","archive_size":7537,"archive_url":"https://extensions.blender.org/download/sha256:394046bce0e5bd2704912578dafd9aa6f988c7a752908f6b6e0e56706f870567/add-on-smart-mesh-cleaner-pro-v3.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/smart-mesh-cleaner-pro/","maintainer":"Igor-Garcia","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Scene"]},{"id":"Zbrush","schema_version":"1.0.0","name":"Zbrush","version":"1.0.0","tagline":"A Zbrush theme for Blender","archive_hash":"sha256:0c37a691759dbe938203acf0f09d372225b4daf7dac25389fbae27d0ba240fbb","archive_size":5659,"archive_url":"https://extensions.blender.org/download/sha256:0c37a691759dbe938203acf0f09d372225b4daf7dac25389fbae27d0ba240fbb/theme-zbrush-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/zbrush/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"nodot_names","schema_version":"1.0.0","name":"NoDot Names","version":"2.0.2","tagline":"Naming conventions, presets, validation","archive_hash":"sha256:2662bb0f9bd2380590683fae7db38935fc601c4c1beb0e543d1fd04ea154a192","archive_size":27903,"archive_url":"https://extensions.blender.org/download/sha256:2662bb0f9bd2380590683fae7db38935fc601c4c1beb0e543d1fd04ea154a192/add-on-nodot-names-v2.0.2.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/nodot-names/","maintainer":"Jordan-Moss","license":["SPDX:GPL-3.0-or-later"],"tags":["Pipeline","Scene","Object"]},{"id":"gray_core_master_Wana","schema_version":"1.0.0","name":"灰核主控 (Gray Core Master)","version":"1.0.0","tagline":"gray dark theme for Blender","archive_hash":"sha256:98c1732221b159820e50556a191b5fae7dae004c3b4108aa24f501a68c7d2f1f","archive_size":6960,"archive_url":"https://extensions.blender.org/download/sha256:98c1732221b159820e50556a191b5fae7dae004c3b4108aa24f501a68c7d2f1f/theme-gray-core-master-wana-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/gray-core-master-wana/","maintainer":"WA-w","license":["SPDX:GPL-3.0-or-later"]},{"id":"uvo_overlays","schema_version":"1.0.0","name":"UVO","version":"1.1.0","tagline":"Dynamic overlays for the UV Editor","archive_hash":"sha256:84b3881e1f31acbbb52104b3beed19a87da5c086e24fac27a12a06ee94a8896c","archive_size":49202,"archive_url":"https://extensions.blender.org/download/sha256:84b3881e1f31acbbb52104b3beed19a87da5c086e24fac27a12a06ee94a8896c/add-on-uvo-overlays-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/uvo-overlays/","maintainer":"Dmytro-Zuievskyi","license":["SPDX:GPL-3.0-or-later"],"tags":["UV","Modeling"]},{"id":"xbox_controller_camera","schema_version":"1.0.0","name":"Xbox Controller Camera","version":"1.0.0","tagline":"Control the 3D viewport camera with an Xbox controller","archive_hash":"sha256:aedc77bf7fab0aeedfdd1fa5f89371b5a116e41d8e8f31b50cadce389f43a458","archive_size":7872,"archive_url":"https://extensions.blender.org/download/sha256:aedc77bf7fab0aeedfdd1fa5f89371b5a116e41d8e8f31b50cadce389f43a458/add-on-xbox-controller-camera-v1.0.0-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/xbox-controller-camera/","maintainer":"marie.marthenorman","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["3D View","Camera"]},{"id":"latex_text_generator","schema_version":"1.0.0","name":"LaTeX Text Generator","version":"1.0.1","tagline":"Generate customizable 3D text from LaTeX notation","archive_hash":"sha256:ece0a47d4fbf9975f973d51aa619095547a0d941b686393df880846ee7d9a039","archive_size":860703,"archive_url":"https://extensions.blender.org/download/sha256:ece0a47d4fbf9975f973d51aa619095547a0d941b686393df880846ee7d9a039/add-on-latex-text-generator-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/latex-text-generator/","maintainer":"katterkie","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import custom font files from disk"},"tags":["Add Curve"]},{"id":"arkit_blendshape_tools","schema_version":"1.0.0","name":"ARKit Blendshape Helper","version":"0.7.5","tagline":"Facilitate the process of working with ARKit blendshapes","archive_hash":"sha256:22564818659cfcbf43e77aaf7628d57c51c090ffcef98b9d44bd18b9e601ee1e","archive_size":6171,"archive_url":"https://extensions.blender.org/download/sha256:22564818659cfcbf43e77aaf7628d57c51c090ffcef98b9d44bd18b9e601ee1e/add-on-arkit-blendshape-tools-v0.7.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/arkit-blendshape-tools/","maintainer":"SummonAngelus","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"sculpting_planar_clo","schema_version":"1.0.0","name":"Sculpting Planar","version":"1.0.2","tagline":"Classic Planar (Scrape/Fill Brush)","archive_hash":"sha256:327153b4d50409c6e546d17768728886881260cdcfa08e0df8999850eeadb280","archive_size":7448,"archive_url":"https://extensions.blender.org/download/sha256:327153b4d50409c6e546d17768728886881260cdcfa08e0df8999850eeadb280/add-on-sculpting-planar-clo-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sculpting-planar-clo/","maintainer":"clo1to5","license":["SPDX:GPL-3.0-or-later"]},{"id":"batch_exporter","schema_version":"1.0.0","name":"Monty Batch Exporter","version":"1.0.0","tagline":"Batch-export objects, collections, or scenes as individual files","archive_hash":"sha256:5260d4eb47b59d16ce96e69865e79c701a64226fff8b27d699876a2083a47823","archive_size":20852,"archive_url":"https://extensions.blender.org/download/sha256:5260d4eb47b59d16ce96e69865e79c701a64226fff8b27d699876a2083a47823/add-on-batch-exporter-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/batch-exporter/","maintainer":"Diego-Montufar-Perez","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export files to disk"},"tags":["Import-Export","Pipeline"]},{"id":"AE_Flow_Dark","schema_version":"1.0.0","name":"AE_Flow_Dark","version":"1.0.0","tagline":"Dark Mood, 4thegoat","archive_hash":"sha256:d1c93ecd7eca84ba9cf379de2ffc7505e79d94f2f2018c7da7e128a4a6e5c6b1","archive_size":5775,"archive_url":"https://extensions.blender.org/download/sha256:d1c93ecd7eca84ba9cf379de2ffc7505e79d94f2f2018c7da7e128a4a6e5c6b1/theme-ae-flow-dark-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/ae-flow-dark/","maintainer":"Nois3G4te","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"propgon_uv_trim","schema_version":"1.0.0","name":"PropGon UV Trim","version":"2.1.3","tagline":"UV Trimsheet tools for layout, fitting and texel density","archive_hash":"sha256:3b413ab655498a4615f2dc8c9651f2514d67bbe072f7d4c8ae24f32bdc7ec3f1","archive_size":43502,"archive_url":"https://extensions.blender.org/download/sha256:3b413ab655498a4615f2dc8c9651f2514d67bbe072f7d4c8ae24f32bdc7ec3f1/add-on-propgon-uv-trim-v2.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/propgon-uv-trim/","maintainer":"PropGon","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save and load TrimSheet presets and ID maps to disk"},"tags":["UV","Mesh"]},{"id":"goblend","schema_version":"1.0.0","name":"Goblend: Export to Godot","version":"2.0.2","tagline":"Highly customizable export of complex scenes to Godot","archive_hash":"sha256:a8d0b6a04b5d2ae2d2c2f8325bd323b24a4c719a53afb243f4e608ed39a10893","archive_size":92571,"archive_url":"https://extensions.blender.org/download/sha256:a8d0b6a04b5d2ae2d2c2f8325bd323b24a4c719a53afb243f4e608ed39a10893/add-on-goblend-v2.0.2.zip","type":"add-on","blender_version_min":"4.5.7","website":"https://extensions.blender.org/add-ons/goblend/","maintainer":"Togira","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export gltf, read Godot scene files, create textures"},"tags":["Game Engine","Import-Export"]},{"id":"image_dimensions_viewer","schema_version":"1.0.0","name":"Image Dimensions Viewer","version":"1.0.0","tagline":"Displays image dimensions in Node and Image Editors","archive_hash":"sha256:73f178f668da9da03c70738cdf09c249114e06f33c37bba37bfe8395130f15db","archive_size":4894,"archive_url":"https://extensions.blender.org/download/sha256:73f178f668da9da03c70738cdf09c249114e06f33c37bba37bfe8395130f15db/add-on-image-dimensions-viewer-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/image-dimensions-viewer/","maintainer":"Pazelock","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"Blender_Darker","schema_version":"1.0.0","name":"Darker","version":"1.0.1","tagline":"Blender Dark but well... darker","archive_hash":"sha256:5e356f36b12f0398c67cb3afc93a86d616e23d28f8c703f43e876f6f33c29107","archive_size":5572,"archive_url":"https://extensions.blender.org/download/sha256:5e356f36b12f0398c67cb3afc93a86d616e23d28f8c703f43e876f6f33c29107/theme-blender-darker-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/blender-darker/","maintainer":"FlorianW","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","High Contrast"]},{"id":"dynamic_rig_ui","schema_version":"1.0.0","name":"Dynamic Rig UI","version":"1.0.1","tagline":"Dynamic Rig UI driven by bone collections and custom properties","archive_hash":"sha256:688fae94a0b2cfb8c55da4f0208f0aaa8c2d1d926e437c5334b0ef8df3dc39f7","archive_size":33793,"archive_url":"https://extensions.blender.org/download/sha256:688fae94a0b2cfb8c55da4f0208f0aaa8c2d1d926e437c5334b0ef8df3dc39f7/add-on-dynamic-rig-ui-v1.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/dynamic-rig-ui/","maintainer":"Samy_Rodriguez","license":["SPDX:GPL-3.0-or-later"]},{"id":"auto_paint_boundaries","schema_version":"1.0.0","name":"Auto Paint Boundaries","version":"1.1.1","tagline":"Paint cleanly inside smart, selection-limited regions","archive_hash":"sha256:5db1c2668d80db2e149ac3dd75fc2d15b7a6603e2da184468bd3588f29edb496","archive_size":14645,"archive_url":"https://extensions.blender.org/download/sha256:5db1c2668d80db2e149ac3dd75fc2d15b7a6603e2da184468bd3588f29edb496/add-on-auto-paint-boundaries-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-paint-boundaries/","maintainer":"Clonephaze","license":["SPDX:GPL-3.0-or-later"],"tags":["Paint"]},{"id":"BRVLayers","schema_version":"1.0.0","name":"Batch Render View Layers","version":"1.2.3","tagline":"Batch Render View Layers","archive_hash":"sha256:63187cc826a44655a1f20a4647aacf7c6967bf7007b91ceeb7291725dff35f17","archive_size":4335,"archive_url":"https://extensions.blender.org/download/sha256:63187cc826a44655a1f20a4647aacf7c6967bf7007b91ceeb7291725dff35f17/add-on-brvlayers-v1.2.3.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/brvlayers/","maintainer":"chenkin123","license":["SPDX:GPL-3.0-or-later"],"tags":["Render"]},{"id":"sprocket_tools","schema_version":"1.0.0","name":"Sprocket Tools","version":"1.0.2","tagline":"Import and export Sprocket tank blueprints","archive_hash":"sha256:ede8a6a611179c585c1ad09cf5240fb1ea1cda37ecc994ce2c9817ef73f2758b","archive_size":392332,"archive_url":"https://extensions.blender.org/download/sha256:ede8a6a611179c585c1ad09cf5240fb1ea1cda37ecc994ce2c9817ef73f2758b/add-on-sprocket-tools-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sprocket-tools/","maintainer":"Brian-Marshall","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Required to import/export Sprocket blueprint data"},"tags":["Game Engine","Import-Export"]},{"id":"isometric_scene_setup","schema_version":"1.0.0","name":"Isometric Scene Setup","version":"1.0.1","tagline":"Isometric scene setup and 2D normal map rendering","archive_hash":"sha256:1e9dea02be61e0e956e7686afab62bd16494e620ace389f495cb7de2934bdda4","archive_size":5255,"archive_url":"https://extensions.blender.org/download/sha256:1e9dea02be61e0e956e7686afab62bd16494e620ace389f495cb7de2934bdda4/add-on-isometric-scene-setup-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/isometric-scene-setup/","maintainer":"RafaelPasquay","license":["SPDX:GPL-3.0-or-later","SPDX:MIT"],"tags":["Camera","Render","Scene"]},{"id":"gruvbox_green_theme","schema_version":"1.0.0","name":"Gruvbox Green Theme","version":"1.0.1","tagline":"A gruvbox theme that is using aqua / green as the primary color","archive_hash":"sha256:f557ec7c47635202c1a700091f1c35cb931aff8f7c5791200d988f9f3a30e85e","archive_size":6478,"archive_url":"https://extensions.blender.org/download/sha256:f557ec7c47635202c1a700091f1c35cb931aff8f7c5791200d988f9f3a30e85e/theme-gruvbox-green-theme-v1.0.1.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/gruvbox-green-theme/","maintainer":"Edin-Spiegel","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"batch_texture_converter","schema_version":"1.0.0","name":"Batch Texture Converter","version":"1.1.0","tagline":"Bulk texture conversion with color space and alpha splitting","archive_hash":"sha256:93fd5b7addd7d32213938f448fafd1bbc342f27c6eba53f55104ce79dbe2080a","archive_size":4400,"archive_url":"https://extensions.blender.org/download/sha256:93fd5b7addd7d32213938f448fafd1bbc342f27c6eba53f55104ce79dbe2080a/add-on-batch-texture-converter-v1.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/batch-texture-converter/","maintainer":"maylog","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and write local files"},"tags":["Import-Export"]},{"id":"stmap_exporter","schema_version":"1.0.0","name":"STMap Exporter","version":"1.1.0","tagline":"STMap Exporter for All Distortion Models","archive_hash":"sha256:19b8aaa06074c695d069c27288c0703b4f8d6be6046d4a4e663bcb18d94c4a61","archive_size":8942,"archive_url":"https://extensions.blender.org/download/sha256:19b8aaa06074c695d069c27288c0703b4f8d6be6046d4a4e663bcb18d94c4a61/add-on-stmap-exporter-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/stmap-exporter/","maintainer":"K_Naoki","license":["SPDX:GPL-3.0-or-later"],"tags":["Tracking","Import-Export"]},{"id":"script_launcher","schema_version":"1.0.0","name":"Script Launcher","version":"1.2.0","tagline":"Manage and run Python scripts from multiple root folders","archive_hash":"sha256:91ef1b99bb67b6e65ed5dea7b2c9a7799fe6423b951bc4214c27357156ad4bce","archive_size":8018,"archive_url":"https://extensions.blender.org/download/sha256:91ef1b99bb67b6e65ed5dea7b2c9a7799fe6423b951bc4214c27357156ad4bce/add-on-script-launcher-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/script-launcher/","maintainer":"a2d4f3s1","license":["SPDX:GPL-3.0-or-later"],"tags":["Development","Pipeline"]},{"id":"momentum","schema_version":"1.0.0","name":"Momentum","version":"1.0.1","tagline":"quickly add configurable follow-through to animations","archive_hash":"sha256:1d8f3e962baabeb2f028ae92952bc9f3fbffc0c390c2889859534dab616f7383","archive_size":16133,"archive_url":"https://extensions.blender.org/download/sha256:1d8f3e962baabeb2f028ae92952bc9f3fbffc0c390c2889859534dab616f7383/add-on-momentum-v1.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/momentum/","maintainer":"Isaac-Burke","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"lily_lime_theme","schema_version":"1.0.0","name":"LiLy Lime","version":"1.0.0","tagline":"A fresh LiLy Lime-inspired light theme for Blender","archive_hash":"sha256:64af2baa0f398da24c045d1e33265dfcc174fc2e2df0c23dbbdfb10e331829bb","archive_size":9509,"archive_url":"https://extensions.blender.org/download/sha256:64af2baa0f398da24c045d1e33265dfcc174fc2e2df0c23dbbdfb10e331829bb/theme-lily-lime-theme-v1.0.0.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/lily-lime-theme/","maintainer":"Eridanus-Epsilon","license":["SPDX:MIT"],"tags":["Light","Colorful","Inspired By"]},{"id":"Solemn_Theme","schema_version":"1.0.0","name":"Solemn","version":"1.0.2","tagline":"A clean and dark theme","archive_hash":"sha256:0f7caef8efb90ffae3d103e127069a34b9e6672847248c06aaf86114aa24578f","archive_size":6767,"archive_url":"https://extensions.blender.org/download/sha256:0f7caef8efb90ffae3d103e127069a34b9e6672847248c06aaf86114aa24578f/theme-solemn-theme-v1.0.2.zip","type":"theme","blender_version_min":"5.0.1","website":"https://extensions.blender.org/themes/solemn-theme/","maintainer":"czod","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"Dark_Max_Pro","schema_version":"1.0.0","name":"Dark Max Pro","version":"1.0.0","tagline":"Pro Dark Max","archive_hash":"sha256:fbdab60a32fc45ac3a8de80366bea7dd8fb2903d315daf9714e496f7516f3f6e","archive_size":5433,"archive_url":"https://extensions.blender.org/download/sha256:fbdab60a32fc45ac3a8de80366bea7dd8fb2903d315daf9714e496f7516f3f6e/theme-dark-max-pro-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/dark-max-pro/","maintainer":"PedroAmorim","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"gp_select","schema_version":"1.0.0","name":"Gp Select","version":"1.6.3","tagline":"Grease Pencil,Weight/Rig,reorder,Rename,lock,Duplicate,Mask,Hide","archive_hash":"sha256:00ea4ccf00cf381874eeade2d264370e6357160aed85c8dcdde1738d4b0f8a04","archive_size":26609,"archive_url":"https://extensions.blender.org/download/sha256:00ea4ccf00cf381874eeade2d264370e6357160aed85c8dcdde1738d4b0f8a04/add-on-gp-select-v1.6.3.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/gp-select/","maintainer":"HissatsuClaw","license":["SPDX:GPL-3.0-or-later"],"tags":["Grease Pencil","Rigging"]},{"id":"stop_motion_style_animator","schema_version":"1.0.0","name":"Stop Motion Animator","version":"0.3.1","tagline":"Convert animations into stop-motion style","archive_hash":"sha256:264e8e39a2015709778e8c3fbb8c70585aabd438ee9737b9df538d1f9ad24917","archive_size":3004,"archive_url":"https://extensions.blender.org/download/sha256:264e8e39a2015709778e8c3fbb8c70585aabd438ee9737b9df538d1f9ad24917/add-on-stop-motion-style-animator-v0.3.1.zip","type":"add-on","blender_version_min":"5.0.0","blender_version_max":"5.2.0","website":"https://extensions.blender.org/add-ons/stop-motion-style-animator/","maintainer":"Copperhead","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"object_reporter","schema_version":"1.0.0","name":"Object Reporter","version":"2.4.5","tagline":"Report, edit, select and export objects by custom properties","archive_hash":"sha256:7691ac2222aebcc83143312b391bb43f44683972a68d6216a69b50d4eef7adfa","archive_size":71155,"archive_url":"https://extensions.blender.org/download/sha256:7691ac2222aebcc83143312b391bb43f44683972a68d6216a69b50d4eef7adfa/add-on-object-reporter-v2.4.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/object-reporter/","maintainer":"Justinas-Dudenas","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export object property reports to CSV files on disk"},"tags":["Object"]},{"id":"robotics_animation_bone_coordinate_exporter","schema_version":"1.0.0","name":"Robotics Animation Bone Coordinate Exporter","version":"1.1.0","tagline":"Export armature animation data for robotics use","archive_hash":"sha256:5f4923122596a5f4b5e504883d816a490813c643f8125f35ad67f841653a6bea","archive_size":1886,"archive_url":"https://extensions.blender.org/download/sha256:5f4923122596a5f4b5e504883d816a490813c643f8125f35ad67f841653a6bea/add-on-robotics-animation-bone-coordinate-exporter-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/robotics-animation-bone-coordinate-exporter/","maintainer":"Kiran-Kumawat","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Import-Export","Rigging"]},{"id":"frame_range_renderer","schema_version":"1.0.0","name":"Frame Range Renderer","version":"1.0.0","tagline":"Render specific frames or frame ranges from the Output panel","archive_hash":"sha256:36b5912e8efd5943a737161e6076a0fc4c5dd0aa949bb60850dd6d1e45d2da53","archive_size":8126,"archive_url":"https://extensions.blender.org/download/sha256:36b5912e8efd5943a737161e6076a0fc4c5dd0aa949bb60850dd6d1e45d2da53/add-on-frame-range-renderer-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/frame-range-renderer/","maintainer":"AndreasResch","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Writes output images to disk"}},{"id":"soleshapper","schema_version":"1.0.0","name":"SoleShapper","version":"2.0.1","tagline":"Procedural shoe sole designer with noise deformation","archive_hash":"sha256:3724521212c5bf026c78f3dccef1cee697355dceac3847de85350f9cdf8d3ae7","archive_size":23584,"archive_url":"https://extensions.blender.org/download/sha256:3724521212c5bf026c78f3dccef1cee697355dceac3847de85350f9cdf8d3ae7/add-on-soleshapper-v2.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/soleshapper/","maintainer":"David-Orrick","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import OBJ meshes and export STL or OBJ"},"tags":["Add Mesh"]},{"id":"tu_addon_id","schema_version":"1.0.0","name":"GeneradorMapsPbr","version":"1.0.0","tagline":"Make texture metallic,specular,Roughtness,NormalMap,Height","archive_hash":"sha256:0b37d42af8905161a45836f5c1be098f1f22b9b171f46995b3c9828791ebe37b","archive_size":6065,"archive_url":"https://extensions.blender.org/download/sha256:0b37d42af8905161a45836f5c1be098f1f22b9b171f46995b3c9828791ebe37b/add-on-tu-addon-id-v1.0.0.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/tu-addon-id/","maintainer":"Fran-Dominguez-Leiva-2","license":["SPDX:GPL-3.0-or-later"]},{"id":"doblux_geometry_node_group_execute","schema_version":"1.0.0","name":"DOBLUX Button to execute Geometry Node Group","version":"1.1.1","tagline":"one-click execution of any open Geometry Node group","archive_hash":"sha256:2975816a00a2d28d2f8cb8f9ba6c7598208d07ce1e72e6795c847847b4495344","archive_size":2014,"archive_url":"https://extensions.blender.org/download/sha256:2975816a00a2d28d2f8cb8f9ba6c7598208d07ce1e72e6795c847847b4495344/add-on-doblux-geometry-node-group-execute-v1.1.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/doblux-geometry-node-group-execute/","maintainer":"Dan-Oak","license":["SPDX:GPL-3.0-or-later"],"tags":["Geometry Nodes","User Interface"]},{"id":"soundPlanes","schema_version":"1.0.0","name":"Sound Planes","version":"1.0.0","tagline":"Auto-Add Sounds To The Sequencer Using Planes","archive_hash":"sha256:3bb89caa2ad1864541e5240df8bae3646656d6507ba6fd1f230ca74dcb684e58","archive_size":13414,"archive_url":"https://extensions.blender.org/download/sha256:3bb89caa2ad1864541e5240df8bae3646656d6507ba6fd1f230ca74dcb684e58/add-on-soundplanes-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/soundplanes/","maintainer":"nifi","license":["SPDX:GPL-3.0-or-later"],"tags":["Sequencer"]},{"id":"Crunchyroll_Dark","schema_version":"1.0.0","name":"Crunchyroll Dark","version":"1.0.0","tagline":"A Crunchyroll theme for Blender","archive_hash":"sha256:c8ce1657172ae7e855e8820d924070caab3bfeedb20a47fc12ec2abbbed17c55","archive_size":5471,"archive_url":"https://extensions.blender.org/download/sha256:c8ce1657172ae7e855e8820d924070caab3bfeedb20a47fc12ec2abbbed17c55/theme-crunchyroll-dark-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/crunchyroll-dark/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"EyeZen","schema_version":"1.0.0","name":"Eye Zen","version":"1.0.3","tagline":"A Relaxing Theme","archive_hash":"sha256:822e900972709f7402a5021b569ec8cc29074656d7a7037fc0a1434023287362","archive_size":5767,"archive_url":"https://extensions.blender.org/download/sha256:822e900972709f7402a5021b569ec8cc29074656d7a7037fc0a1434023287362/theme-eyezen-v1.0.3.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/eyezen/","maintainer":"Sakuta-Narukami","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Print"]},{"id":"Dark_Pro_Max_Theme","schema_version":"1.0.0","name":"Dark_Pro_Max_Theme","version":"1.1.1","tagline":"Ultra Plus alternate of default Dark","archive_hash":"sha256:cbcd532114ba2f6fbf37f30b353be9cab54e955182a483dbb2783ff1c67ea223","archive_size":5740,"archive_url":"https://extensions.blender.org/download/sha256:cbcd532114ba2f6fbf37f30b353be9cab54e955182a483dbb2783ff1c67ea223/theme-dark-pro-max-theme-v1.1.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/dark-pro-max-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"output_setup_helper","schema_version":"1.0.0","name":"Output Setup Helper","version":"5.0.1","tagline":"Auto setup render outputs and denoising for multi-pass renders","archive_hash":"sha256:2ae18a2f31ec11e134586c3dfae4df83732dbc5c42a39171a04ab3f6c4f2c848","archive_size":4450,"archive_url":"https://extensions.blender.org/download/sha256:2ae18a2f31ec11e134586c3dfae4df83732dbc5c42a39171a04ab3f6c4f2c848/add-on-output-setup-helper-v5.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/output-setup-helper/","maintainer":"lukas.remis","license":["SPDX:GPL-3.0-or-later"],"tags":["Compositing","Render","Pipeline"]},{"id":"reflex_potentials","schema_version":"1.0.0","name":"Reflex Potentials","version":"1.0.3","tagline":"Reflex Potentials","archive_hash":"sha256:f41f8e3805cf75f8cb732dc24733ab839f5b7d633d136bcc59f40635245b1890","archive_size":35482,"archive_url":"https://extensions.blender.org/download/sha256:f41f8e3805cf75f8cb732dc24733ab839f5b7d633d136bcc59f40635245b1890/add-on-reflex-potentials-v1.0.3.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/reflex-potentials/","maintainer":"dartmeadow","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"blender_source_theme","schema_version":"1.0.0","name":"Source","version":"1.0.0","tagline":"This is a Source Engine Based theme for Blender","archive_hash":"sha256:5a6aaaf773d46c437c98caef00c0dfede6a26d4b2ffdd0853fa099fdfe95ac49","archive_size":6684,"archive_url":"https://extensions.blender.org/download/sha256:5a6aaaf773d46c437c98caef00c0dfede6a26d4b2ffdd0853fa099fdfe95ac49/theme-blender-source-theme-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/blender-source-theme/","maintainer":"AeroBuoyancy.source","license":["SPDX:GPL-3.0-or-later"]},{"id":"Blueprint_Theme","schema_version":"1.0.0","name":"Blueprint_Theme","version":"1.0.5","tagline":"True Blueprint Colour","archive_hash":"sha256:9c0b2afa9a2cc5a70fb6c9085f6c1d95c4daac13eb1988ae67da0619b3d581b0","archive_size":5724,"archive_url":"https://extensions.blender.org/download/sha256:9c0b2afa9a2cc5a70fb6c9085f6c1d95c4daac13eb1988ae67da0619b3d581b0/theme-blueprint-theme-v1.0.5.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/blueprint-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"Nostalgia_2bit_UI","schema_version":"1.0.0","name":"Nostalgia_2bit_UI","version":"1.2.8","tagline":"Hi-fi alternate of default Light","archive_hash":"sha256:bf250124530c4772c1f2e2d50b4b7a6fef48626b18922e23784b32227c73469f","archive_size":5628,"archive_url":"https://extensions.blender.org/download/sha256:bf250124530c4772c1f2e2d50b4b7a6fef48626b18922e23784b32227c73469f/theme-nostalgia-2bit-ui-v1.2.8.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/nostalgia-2bit-ui/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"BLeQ_Extension","schema_version":"1.0.0","name":"BLeQ","version":"1.0.5","tagline":"Renderqueue / 3DHomePage / Hardwaremonitor / Tools","archive_hash":"sha256:286cefdc0eaeabc2e348c1e26ac7c5eaec9946603e3570aa5382a1704132c0ac","archive_size":35304,"archive_url":"https://extensions.blender.org/download/sha256:286cefdc0eaeabc2e348c1e26ac7c5eaec9946603e3570aa5382a1704132c0ac/add-on-bleq-extension-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bleq-extension/","maintainer":"Christian-Makarski","license":["SPDX:GPL-3.0-or-later"]},{"id":"driver_copy_io","schema_version":"1.0.0","name":"Driver Copy IO","version":"2.1.1","tagline":"Copy/Paste drivers via JSON using full path","archive_hash":"sha256:58a88728287093155bb2f61c7a7e526c2923c0889872d4613bf2db867dba207d","archive_size":21147,"archive_url":"https://extensions.blender.org/download/sha256:58a88728287093155bb2f61c7a7e526c2923c0889872d4613bf2db867dba207d/add-on-driver-copy-io-v2.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/driver-copy-io/","maintainer":"a2d4f3s1","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Rigging"]},{"id":"modifier_manager","schema_version":"1.0.0","name":"Modifier Manager","version":"1.0.2","tagline":"Manage your modifiers from right click menu","archive_hash":"sha256:0e03355dba011e705ff220940779f32169080136f625866173e8a79077f87f29","archive_size":11707,"archive_url":"https://extensions.blender.org/download/sha256:0e03355dba011e705ff220940779f32169080136f625866173e8a79077f87f29/add-on-modifier-manager-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/modifier-manager/","maintainer":"KewlSheet","license":["SPDX:GPL-3.0-or-later"]},{"id":"mockup_screenshoter","schema_version":"1.0.0","name":"Mockup Screenshoter","version":"0.9.1","tagline":"Capture your screen to make mockups in Penpot","archive_hash":"sha256:16c2d787b49297921eebec6f3bebf1727606c435f1053f6ed6eab55280bbd96e","archive_size":6437,"archive_url":"https://extensions.blender.org/download/sha256:16c2d787b49297921eebec6f3bebf1727606c435f1053f6ed6eab55280bbd96e/add-on-mockup-screenshoter-v0.9.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/mockup-screenshoter/","maintainer":"Blender","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Create temporary folder for the screen captures","clipboard":"Copy Penpot-ready json into the clipboard"},"tags":["Development"]},{"id":"b3d_ui_langloop","schema_version":"1.0.0","name":"B3D UI Language Loop","version":"1.0.3","tagline":"Quickly cycle Blender interface languages with a shortcut","archive_hash":"sha256:63bf8c9073919e21a7eb49b352d02a54f71057cfe26adce7f9d2337ac9a0b866","archive_size":6240,"archive_url":"https://extensions.blender.org/download/sha256:63bf8c9073919e21a7eb49b352d02a54f71057cfe26adce7f9d2337ac9a0b866/add-on-b3d-ui-langloop-v1.0.3.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/b3d-ui-langloop/","maintainer":"楊景貴","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"tree_clipper","schema_version":"1.0.0","name":"Tree Clipper","version":"0.1.6","tagline":"Export and import Blender node trees as JSON","archive_hash":"sha256:e67f50a0da6699a7257e93f10be341f5e3461d070d808c2281264d8d0ac8de44","archive_size":52846,"archive_url":"https://extensions.blender.org/download/sha256:e67f50a0da6699a7257e93f10be341f5e3461d070d808c2281264d8d0ac8de44/add-on-tree-clipper-v0.1.6.zip","type":"add-on","blender_version_min":"5.0.0","blender_version_max":"5.2.0","website":"https://extensions.blender.org/add-ons/tree-clipper/","maintainer":"Lars-Helge-Scheel","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Node"]},{"id":"shapingrecorder","schema_version":"1.0.0","name":"Shaping Recorder","version":"0.7.5","tagline":"Record mesh shaping and viewport moves, replay interpolated","archive_hash":"sha256:a10c5e07c373447ad896741da47cc8a4fc831852c2f09261b57c120f2f8c3596","archive_size":38248,"archive_url":"https://extensions.blender.org/download/sha256:a10c5e07c373447ad896741da47cc8a4fc831852c2f09261b57c120f2f8c3596/add-on-shapingrecorder-v0.7.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shapingrecorder/","maintainer":"darkstarrd","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and write image sequences"},"tags":["Modeling"]},{"id":"reforge","schema_version":"1.0.0","name":"Reforge","version":"0.5.2","tagline":"Reforge Blender scenes into Defold assets","archive_hash":"sha256:15bd625739050ad3a4b3641ebdebfac6298330c02dee5d0b1bc08eb96b47f811","archive_size":16167,"archive_url":"https://extensions.blender.org/download/sha256:15bd625739050ad3a4b3641ebdebfac6298330c02dee5d0b1bc08eb96b47f811/add-on-reforge-v0.5.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/reforge/","maintainer":"Alexander-Bulatov","license":["SPDX:GPL-3.0-or-later"]},{"id":"comparable","schema_version":"1.0.0","name":"Comparable","version":"1.0.2","tagline":"Compare two objects or collections in one click","archive_hash":"sha256:b72d64fdb22b697a07806b75fcf932348475e326fc38b27d9230ddc0aae2116d","archive_size":3981,"archive_url":"https://extensions.blender.org/download/sha256:b72d64fdb22b697a07806b75fcf932348475e326fc38b27d9230ddc0aae2116d/add-on-comparable-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/comparable/","maintainer":"ffuthoni","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"screenwriter","schema_version":"1.0.0","name":"Screenwriter","version":"1.0.0","tagline":"Screenplay formatting and syncing tools for Blender","archive_hash":"sha256:ea16e42750bde882d4e1ceed7a74d55e020bb52bed06816615f9d5e162f6c2c6","archive_size":7307,"archive_url":"https://extensions.blender.org/download/sha256:ea16e42750bde882d4e1ceed7a74d55e020bb52bed06816615f9d5e162f6c2c6/add-on-screenwriter-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/screenwriter/","maintainer":"zhengyang237","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Reading and writing .fountain files"}},{"id":"image_zoom_overlay","schema_version":"1.0.0","name":"Image Zoom Overlay","version":"1.0.0","tagline":"Display zoom level in Image Editor with quick presets","archive_hash":"sha256:96407335647d7191ba1522818bd6f5b9e15be10fd896c50a18a5330e4d09e154","archive_size":2896,"archive_url":"https://extensions.blender.org/download/sha256:96407335647d7191ba1522818bd6f5b9e15be10fd896c50a18a5330e4d09e154/add-on-image-zoom-overlay-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/image-zoom-overlay/","maintainer":"pikok85","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Access to image editor display settings"},"tags":["User Interface"]},{"id":"pataz_notes","schema_version":"1.0.0","name":"Pataz Notes","version":"5.1.1","tagline":"Anotate your blend files","archive_hash":"sha256:41e6e18fe44ba530a0525c3f1543a54589096fe017ad1dac108aa96a03ab72b0","archive_size":4385,"archive_url":"https://extensions.blender.org/download/sha256:41e6e18fe44ba530a0525c3f1543a54589096fe017ad1dac108aa96a03ab72b0/add-on-pataz-notes-v5.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pataz-notes/","maintainer":"zanqdo","license":["SPDX:GPL-3.0-or-later"],"tags":["Pipeline"]},{"id":"omoospace","schema_version":"1.0.0","name":"Omoospace","version":"0.2.2","tagline":"Manage your project files in omoospace's way","archive_hash":"sha256:ea1b57339370dc90b75597d163f687fc308e620cb947046f3b047226d510bb0e","archive_size":1788795,"archive_url":"https://extensions.blender.org/download/sha256:ea1b57339370dc90b75597d163f687fc308e620cb947046f3b047226d510bb0e/add-on-omoospace-v0.2.2-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/omoospace/","maintainer":"icrdr","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Manage your project files in omoospace's way"},"platforms":["windows-x64"],"tags":["Pipeline"]},{"id":"export_curve_to_json","schema_version":"1.0.0","name":"Export Curve To Json","version":"1.0.2","tagline":"File import/export for curves with JSON","archive_hash":"sha256:3646464bdf053849db751b2222790836064e5e268c70ef559f89bacde467c115","archive_size":18907,"archive_url":"https://extensions.blender.org/download/sha256:3646464bdf053849db751b2222790836064e5e268c70ef559f89bacde467c115/add-on-export-curve-to-json-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/export-curve-to-json/","maintainer":"Quint-Vrolijk","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"sculpting_extra_meshes_curve","schema_version":"1.0.0","name":"Sculpting Extra Meshes + Curve","version":"1.3.0","tagline":"Add primitives, join, boolean, mirror while in Sculpt Mode","archive_hash":"sha256:5b0c372464b0ca743651f1ffa4682f0c4ce322be119d3df59e3d71854ddbf3cf","archive_size":4205,"archive_url":"https://extensions.blender.org/download/sha256:5b0c372464b0ca743651f1ffa4682f0c4ce322be119d3df59e3d71854ddbf3cf/add-on-sculpting-extra-meshes-curve-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sculpting-extra-meshes-curve/","maintainer":"pixldg","license":["SPDX:GPL-3.0-or-later"],"tags":["Sculpt"]},{"id":"global_custom_properties","schema_version":"1.0.0","name":"Global Custom Properties","version":"1.0.0","tagline":"Reusable Custom Properties on Objects and Collections","archive_hash":"sha256:9775ca35a3b7fb12a8c36dcbde85c8497a0ddd8938ec180416d9f23d9907d128","archive_size":18782,"archive_url":"https://extensions.blender.org/download/sha256:9775ca35a3b7fb12a8c36dcbde85c8497a0ddd8938ec180416d9f23d9907d128/add-on-global-custom-properties-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/global-custom-properties/","maintainer":"1hue","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"curve_fillet_tool","schema_version":"1.0.0","name":"NURBS/Poly Fillet Tool","version":"1.0.0","tagline":"Fillet and 'unfillet' for paths","archive_hash":"sha256:07d671b719e336aba5192208baf4951d2db3cf161e56350c3fb405fb3b6b1df7","archive_size":17360,"archive_url":"https://extensions.blender.org/download/sha256:07d671b719e336aba5192208baf4951d2db3cf161e56350c3fb405fb3b6b1df7/add-on-curve-fillet-tool-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.5","website":"https://extensions.blender.org/add-ons/curve-fillet-tool/","maintainer":"zaphod","license":["SPDX:GPL-3.0-or-later"]},{"id":"bagapaste","schema_version":"1.0.0","name":"BagaPaste","version":"1.0.3","tagline":"Paste clipboard images/URLs as planes or reference images","archive_hash":"sha256:9a306ef1bf9ebf07f6d7f2470655930ab2e00ac86cf1bd718b215ad3290f2569","archive_size":18406,"archive_url":"https://extensions.blender.org/download/sha256:9a306ef1bf9ebf07f6d7f2470655930ab2e00ac86cf1bd718b215ad3290f2569/add-on-bagapaste-v1.0.3.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/bagapaste/","maintainer":"Kiara_Bagattini","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save clipboard or downloaded images to disk before importing","network":"Download images when the clipboard contains an HTTP/HTTPS URL","clipboard":"Read image/file/text data from the system clipboard"},"tags":["Import-Export","3D View"]},{"id":"time_stretch_sync","schema_version":"1.0.0","name":"Time Stretch Sync","version":"1.1.0","tagline":"Sync timeline range, playline and operators with timestretching","archive_hash":"sha256:347dd396d927096a9f8c361e79214b2a612a5ca8208274a667ee207195f5df4c","archive_size":13493,"archive_url":"https://extensions.blender.org/download/sha256:347dd396d927096a9f8c361e79214b2a612a5ca8208274a667ee207195f5df4c/add-on-time-stretch-sync-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/time-stretch-sync/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"render_subcollections","schema_version":"1.0.0","name":"Render Subcollections","version":"1.0.1","tagline":"Automatically renders subcollections one by one","archive_hash":"sha256:54f2c7f20d243d96a7575d8083e92de190a0ceb9149e3757491c82cad3833066","archive_size":3353,"archive_url":"https://extensions.blender.org/download/sha256:54f2c7f20d243d96a7575d8083e92de190a0ceb9149e3757491c82cad3833066/add-on-render-subcollections-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/render-subcollections/","maintainer":"Nico-Peters","license":["SPDX:GPL-3.0-or-later"],"tags":["Render","Camera"]},{"id":"Dissolve2EdgeVertices","schema_version":"1.0.0","name":"Dissolve 2-Edge Vertices","version":"1.1.0","tagline":"Dissolve vertices with two edges to clean up mesh topology","archive_hash":"sha256:6bfec11aea3f67f68c75897824e690f2110b5a0a84f57b8c9681e1b46a60241a","archive_size":1920,"archive_url":"https://extensions.blender.org/download/sha256:6bfec11aea3f67f68c75897824e690f2110b5a0a84f57b8c9681e1b46a60241a/add-on-dissolve2edgevertices-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dissolve2edgevertices/","maintainer":"Jackal","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"beyond_channel_packer","schema_version":"1.0.0","name":"Beyond Channel Packer","version":"1.0.2","tagline":"Pack image channels (RGBA) in the Image Editor","archive_hash":"sha256:713e336af49bf826e91aead72025eadd114580927d24e33e0493583e187b7e77","archive_size":22143,"archive_url":"https://extensions.blender.org/download/sha256:713e336af49bf826e91aead72025eadd114580927d24e33e0493583e187b7e77/add-on-beyond-channel-packer-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.9.999","website":"https://extensions.blender.org/add-ons/beyond-channel-packer/","maintainer":"tyler.tofu","license":["SPDX:GPL-3.0-or-later"],"tags":["UV","Paint"]},{"id":"keyboard_layout_emulation","schema_version":"1.0.0","name":"Keyboard Layout Emulation","version":"1.0.3","tagline":"Emulate QWERTY keyboard shortcuts on non-QWERTY keyboard layouts","archive_hash":"sha256:c4ed772b0cffafb6d31351fbe724e8d800a9810598aa3e93d8361516946dee18","archive_size":32203,"archive_url":"https://extensions.blender.org/download/sha256:c4ed772b0cffafb6d31351fbe724e8d800a9810598aa3e93d8361516946dee18/add-on-keyboard-layout-emulation-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/keyboard-layout-emulation/","maintainer":"endorh","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export keyboard layouts/add-on preferences"},"tags":["User Interface"]},{"id":"majik_blender_edu_teacher","schema_version":"1.0.0","name":"Majik Blender Edu","version":"1.1.4","tagline":"Submission integrity tool for educators to verify students' work","archive_hash":"sha256:fc1007990be6653f524611f8c7f1daf8b043dcb0bc55d7fb103d26612786446f","archive_size":3743388,"archive_url":"https://extensions.blender.org/download/sha256:fc1007990be6653f524611f8c7f1daf8b043dcb0bc55d7fb103d26612786446f/add-on-majik-blender-edu-teacher-v1.1.4-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/majik-blender-edu-teacher/","maintainer":"Zelijah","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write keys and logs as JSON for integrity verification","network":"Access required for JSON file analysis"},"platforms":["windows-x64"],"tags":["Pipeline"]},{"id":"theme_elsyiun_like","schema_version":"1.0.0","name":"elsyiun like","version":"1.1.0","tagline":"A flat dark theme that is easy on the eyes","archive_hash":"sha256:698be24bb24b0957bd8ac858be0d019e4626c7ede5f06adc3de376a5f84d77d1","archive_size":5639,"archive_url":"https://extensions.blender.org/download/sha256:698be24bb24b0957bd8ac858be0d019e4626c7ede5f06adc3de376a5f84d77d1/theme-theme-elsyiun-like-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-elsyiun-like/","maintainer":"modekichi","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"only_blends_mixer","schema_version":"1.0.0","name":"OnlyBlends.Mixer","version":"0.5.1","tagline":"An extension to turn Blender into a Mixer... of Sounds","archive_hash":"sha256:2bf6bf06b206c1739952ca80b9a7836bf1f5953586c48e027c90911ab1def39c","archive_size":187225,"archive_url":"https://extensions.blender.org/download/sha256:2bf6bf06b206c1739952ca80b9a7836bf1f5953586c48e027c90911ab1def39c/add-on-only-blends-mixer-v0.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/only-blends-mixer/","maintainer":"Zulhakar","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Pipeline"]},{"id":"viewport_navigation_display","schema_version":"1.0.0","name":"Viewport Navigation Display","version":"1.2.1","tagline":"Visualize and control other viewports from TOP view","archive_hash":"sha256:3764c677ad34d57510e22257ff61646ab4ec8a25d2599486588d2bf9ab2bba01","archive_size":44446,"archive_url":"https://extensions.blender.org/download/sha256:3764c677ad34d57510e22257ff61646ab4ec8a25d2599486588d2bf9ab2bba01/add-on-viewport-navigation-display-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/viewport-navigation-display/","maintainer":"Cristiano-Tosoni","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Camera","User Interface"]},{"id":"asset_shelf_shortcut_display","schema_version":"1.0.0","name":"Asset Shelf Shortcut Display","version":"1.0.0","tagline":"Adds a line with hotkey/shortcut of the asset in the shelf","archive_hash":"sha256:8eeb7d53d48732f8fe36fcb22dd4685718d47021f0fec383a35f1f3360a571ad","archive_size":2816,"archive_url":"https://extensions.blender.org/download/sha256:8eeb7d53d48732f8fe36fcb22dd4685718d47021f0fec383a35f1f3360a571ad/add-on-asset-shelf-shortcut-display-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/asset-shelf-shortcut-display/","maintainer":"The-Loose-Spirit","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"quick_signs","schema_version":"1.0.0","name":"QuickSigns","version":"1.0.1","tagline":"Create 3D text signs with Google Fonts integration","archive_hash":"sha256:d24a17ff92d6a2bbcbc7767c5c4f0a92eee7c6a564e900db4fd993545f9d9959","archive_size":9089,"archive_url":"https://extensions.blender.org/download/sha256:d24a17ff92d6a2bbcbc7767c5c4f0a92eee7c6a564e900db4fd993545f9d9959/add-on-quick-signs-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quick-signs/","maintainer":"Marin-Brouwers","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and write font files to local storage","network":"Access Google Fonts API for font search and download"},"tags":["Import-Export"]},{"id":"dy_pack_master","schema_version":"1.0.0","name":"dy Pack Master","version":"1.0.1","tagline":"Make Blender projects portable for render farms","archive_hash":"sha256:5e8694b0e3747a1ee4878161bb239392d2eeb7f97da21e3dd0cef0774137724f","archive_size":34845,"archive_url":"https://extensions.blender.org/download/sha256:5e8694b0e3747a1ee4878161bb239392d2eeb7f97da21e3dd0cef0774137724f/add-on-dy-pack-master-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dy-pack-master/","maintainer":"cdordelly","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Copies and localizes external assets to project directory"},"tags":["Pipeline","Import-Export","System"]},{"id":"cycles_bake_info","schema_version":"1.0.0","name":"Bake Info","version":"1.0.2","tagline":"fast bake checkup","archive_hash":"sha256:ac46bdb997c1f31bb513c45af62890576fcf93a8f6e4e4d115bc9298d3d914c5","archive_size":1581,"archive_url":"https://extensions.blender.org/download/sha256:ac46bdb997c1f31bb513c45af62890576fcf93a8f6e4e4d115bc9298d3d914c5/add-on-cycles-bake-info-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cycles-bake-info/","maintainer":"Chalouek-RGBit","license":["SPDX:GPL-3.0-or-later"],"tags":["Render","User Interface"]},{"id":"Areas_by_Materials","schema_version":"1.0.0","name":"Areas by Materials","version":"1.6.0","tagline":"Displays information about areas of materials in selection","archive_hash":"sha256:55b3fb12411af2e76d28b97b666ec38f77cbad30ccc4d2830b075ec1224aa6c9","archive_size":3609,"archive_url":"https://extensions.blender.org/download/sha256:55b3fb12411af2e76d28b97b666ec38f77cbad30ccc4d2830b075ec1224aa6c9/add-on-areas-by-materials-v1.6.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/areas-by-materials/","maintainer":"Justinas-Dudenas","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Object","User Interface"]},{"id":"quill","schema_version":"1.0.0","name":"Quill Import/Export","version":"1.4.3","tagline":"Import and export Quill VR illustrations and animations","archive_hash":"sha256:09f2abfdb519569f037a3e90be91f067908621d706978c43bdf344336e543519","archive_size":52313,"archive_url":"https://extensions.blender.org/download/sha256:09f2abfdb519569f037a3e90be91f067908621d706978c43bdf344336e543519/add-on-quill-v1.4.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quill/","maintainer":"Joan-Charmant","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export Quill projects from/to disk"},"tags":["Import-Export"]},{"id":"splats","schema_version":"1.0.0","name":"Splats","version":"1.0.1","tagline":"Generate multi-view training data for Gaussian Splatting","archive_hash":"sha256:9171a58e9149ed9fe05a0bfc1c702a20e9055b51a36600664bc8ec19675229f2","archive_size":15856,"archive_url":"https://extensions.blender.org/download/sha256:9171a58e9149ed9fe05a0bfc1c702a20e9055b51a36600664bc8ec19675229f2/add-on-splats-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/splats/","maintainer":"Dev.Patel","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export PLY point clouds and render output files"},"tags":["Render","Camera"]},{"id":"export_curve_as_svg","schema_version":"1.0.0","name":"Export Curve as SVG","version":"1.0.0","tagline":"Export selected Bezier and Poly curves as SVG files","archive_hash":"sha256:1ab1dd210d80ff5c6d6fc5fc3b2bb481e571c28e736be2a028a5568ad2d6d990","archive_size":16937,"archive_url":"https://extensions.blender.org/download/sha256:1ab1dd210d80ff5c6d6fc5fc3b2bb481e571c28e736be2a028a5568ad2d6d990/add-on-export-curve-as-svg-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/export-curve-as-svg/","maintainer":"Gilberto.R","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"asset_library_tools","schema_version":"1.0.0","name":"Asset Library Tools","version":"1.0.0","tagline":"Filter assets by tags and catalogue backups for asset libraries","archive_hash":"sha256:b4984647ddd947e4d1cecf108759494135e2c2c4f6049d0125e89634163cdc37","archive_size":15607,"archive_url":"https://extensions.blender.org/download/sha256:b4984647ddd947e4d1cecf108759494135e2c2c4f6049d0125e89634163cdc37/add-on-asset-library-tools-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/asset-library-tools/","maintainer":"Akhil_Alukkaran","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and write tag indexes and catalogue backup files"},"tags":["System","User Interface","Pipeline"]},{"id":"redlix_theme","schema_version":"1.0.0","name":"Redlix Theme","version":"1.0.0","tagline":"Cooperative brutalist framework - retro-futuristic design system","archive_hash":"sha256:532550a1d2fda385ae83d56b42e3ac32e2cb3a5134ed92e488515515ef562ec8","archive_size":4968,"archive_url":"https://extensions.blender.org/download/sha256:532550a1d2fda385ae83d56b42e3ac32e2cb3a5134ed92e488515515ef562ec8/theme-redlix-theme-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/redlix-theme/","maintainer":"redlix","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Colorful"]},{"id":"ftw_flattening_toolset","schema_version":"1.0.0","name":"FTW Flattening Toolset","version":"2.0.0","tagline":"UV workflow: flattening, curve alignment, scaling, UV transfer","archive_hash":"sha256:65ae1e56ade1c60e2b996a508114b1444d51a333a52f2022f79715b62e57838a","archive_size":1176759,"archive_url":"https://extensions.blender.org/download/sha256:65ae1e56ade1c60e2b996a508114b1444d51a333a52f2022f79715b62e57838a/add-on-ftw-flattening-toolset-v2.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/ftw-flattening-toolset/","maintainer":"FTW3DForge","license":["SPDX:GPL-3.0-or-later"]},{"id":"folded_paper_engine","schema_version":"1.0.0","name":"Folded Paper Engine","version":"1.0.10","tagline":"Define gameplay in Blender and play in Godot with a few clicks","archive_hash":"sha256:fa5f52bae6f37f701ea69be7b44ac9dde456aa6bcf1943613265b28ec8b7a294","archive_size":14003,"archive_url":"https://extensions.blender.org/download/sha256:fa5f52bae6f37f701ea69be7b44ac9dde456aa6bcf1943613265b28ec8b7a294/add-on-folded-paper-engine-v1.0.10.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/folded-paper-engine/","maintainer":"Papercraft-Games","license":["SPDX:GPL-3.0-or-later","SPDX:MIT"],"tags":["Import-Export","Game Engine","Pipeline"]},{"id":"gather_resources","schema_version":"1.0.0","name":"Gather Resources","version":"0.5.2","tagline":"Collect project media into a local folder","archive_hash":"sha256:455025f49d9ca76e33425cdceb6e30cbe7e1a2cfbb5b0537725c30e2d8257db3","archive_size":10373,"archive_url":"https://extensions.blender.org/download/sha256:455025f49d9ca76e33425cdceb6e30cbe7e1a2cfbb5b0537725c30e2d8257db3/add-on-gather-resources-v0.5.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/gather-resources/","maintainer":"Digital-Art-Freedom","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read project media files and copy them into a local directory"},"tags":["System","Pipeline"]},{"id":"character_pipeline_tracker","schema_version":"1.0.0","name":"Character Pipeline Tracker","version":"1.0.0","tagline":"Track and automate character creation pipeline stages","archive_hash":"sha256:4e8acd00d33375fbfb878d7293f79e438e4a61e866619e509a5044ebfee79010","archive_size":27555,"archive_url":"https://extensions.blender.org/download/sha256:4e8acd00d33375fbfb878d7293f79e438e4a61e866619e509a5044ebfee79010/add-on-character-pipeline-tracker-v1.0.0.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/character-pipeline-tracker/","maintainer":"Evgeny-Lisichik","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Mesh"]},{"id":"spine_io","schema_version":"1.0.0","name":"Spine IO","version":"0.0.3","tagline":"Export bone-driven Spine 4.3 JSON files","archive_hash":"sha256:502a89baf7a6ff0517c018ea7b76dff9f65432437b3b8ba46a525c671344278e","archive_size":29815,"archive_url":"https://extensions.blender.org/download/sha256:502a89baf7a6ff0517c018ea7b76dff9f65432437b3b8ba46a525c671344278e/add-on-spine-io-v0.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/spine-io/","maintainer":"Digital-Art-Freedom","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read textures and write Spine JSON"},"tags":["Import-Export","Rigging","Animation"]},{"id":"cam_tools","schema_version":"1.0.0","name":"Cam Tools","version":"1.1.0","tagline":"Streamlined camera workflow toolkit","archive_hash":"sha256:1140c5de02db1814f024ce9838b0aa772901ccccb320b6c79613932d61b8fc3c","archive_size":39272,"archive_url":"https://extensions.blender.org/download/sha256:1140c5de02db1814f024ce9838b0aa772901ccccb320b6c79613932d61b8fc3c/add-on-cam-tools-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cam-tools/","maintainer":"Akhil_Alukkaran","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"camfree","schema_version":"1.0.0","name":"CamFree","version":"1.0.5","tagline":"Fly/Walk Navigation on Cameras with Constraints","archive_hash":"sha256:e5cdbf82af653ffcdd8c2cf598c5f965e47d3b69c86965fa9b085c68e4a43344","archive_size":2409,"archive_url":"https://extensions.blender.org/download/sha256:e5cdbf82af653ffcdd8c2cf598c5f965e47d3b69c86965fa9b085c68e4a43344/add-on-camfree-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/camfree/","maintainer":"JR3DFUL","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"sort_viewlayers_rmb","schema_version":"1.0.0","name":"RMB Sort View Layers Alphabetically in Outliner-Scenes","version":"0.0.2","tagline":"RMB Sort View Layers Alphabetically in Outliner-Scenes","archive_hash":"sha256:c42858f387228d7ec906bb1a5f8705345fc8cad07a4ba7399ab28ac6431034e0","archive_size":2908,"archive_url":"https://extensions.blender.org/download/sha256:c42858f387228d7ec906bb1a5f8705345fc8cad07a4ba7399ab28ac6431034e0/add-on-sort-viewlayers-rmb-v0.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sort-viewlayers-rmb/","maintainer":"RobWu","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"voda_theme_cinnamon","schema_version":"1.0.0","name":"Cinnamon","version":"2.0.0","tagline":"Cinnamon-Orange themed Blender with a gradiented kick","archive_hash":"sha256:37cf32055dda8411ddadfbf84483f1345b652048cc16d0d2dbc795dd746f6849","archive_size":6616,"archive_url":"https://extensions.blender.org/download/sha256:37cf32055dda8411ddadfbf84483f1345b652048cc16d0d2dbc795dd746f6849/theme-voda-theme-cinnamon-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/voda-theme-cinnamon/","maintainer":"VaVo","license":["SPDX:CC0-1.0"]},{"id":"Black","schema_version":"1.0.0","name":"Black","version":"5.0.4","tagline":"A black theme, probably the blackest one","archive_hash":"sha256:3167d027740b8693d0a97af41ee0fbedfde3fc378c8900ddb43adf5935600f64","archive_size":5200,"archive_url":"https://extensions.blender.org/download/sha256:3167d027740b8693d0a97af41ee0fbedfde3fc378c8900ddb43adf5935600f64/theme-black-v5.0.4.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/black/","maintainer":"Gurra","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"root_maker","schema_version":"1.0.0","name":"RootMaker","version":"1.0.1","tagline":"Create root bone & bake into actions","archive_hash":"sha256:f8e66008152054ac78b47b34971c07a9bfd32ca9e9760e9ac831028a00a85cb3","archive_size":6592,"archive_url":"https://extensions.blender.org/download/sha256:f8e66008152054ac78b47b34971c07a9bfd32ca9e9760e9ac831028a00a85cb3/add-on-root-maker-v1.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/root-maker/","maintainer":"manas-R.-Makde","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Rigging","Bake"]},{"id":"MetahumanToManny","schema_version":"1.0.0","name":"MetaHumanToManny","version":"1.2.0","tagline":"Clean up MetaHuman meshes and match them to UE5 Manny","archive_hash":"sha256:9eb54b9b250930f984e4a919a2aa20d6b684470a8ab20e8ab4453da6266d4685","archive_size":21164,"archive_url":"https://extensions.blender.org/download/sha256:9eb54b9b250930f984e4a919a2aa20d6b684470a8ab20e8ab4453da6266d4685/add-on-metahumantomanny-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/metahumantomanny/","maintainer":"hakan-erunsal","license":["SPDX:GPL-3.0-or-later"]},{"id":"cad_helper","schema_version":"1.0.0","name":"CAD-Helper","version":"0.6.1","tagline":"Blender Extension to manage imported CAD assemblies","archive_hash":"sha256:804afafdbf62291c0d075c6662d7161631eb329f3f7078382df3b1af3980bee6","archive_size":34745,"archive_url":"https://extensions.blender.org/download/sha256:804afafdbf62291c0d075c6662d7161631eb329f3f7078382df3b1af3980bee6/add-on-cad-helper-v0.6.1-windows-x64-macos-arm64-linux-x64.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/cad-helper/","maintainer":"BsIngA","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64","macos-arm64","linux-x64"],"tags":["Object"]},{"id":"import_png_palette","schema_version":"1.0.0","name":"Import PNG Palette","version":"1.0.2","tagline":"Import PNG images as color palettes for Blender","archive_hash":"sha256:3f4b526b1790cc37067789a1a1c46d51fc09bf466d397828627fd367e34a4ee4","archive_size":2035,"archive_url":"https://extensions.blender.org/download/sha256:3f4b526b1790cc37067789a1a1c46d51fc09bf466d397828627fd367e34a4ee4/add-on-import-png-palette-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/import-png-palette/","maintainer":"Ruuubick","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Paint"]},{"id":"momo_dark","schema_version":"1.0.0","name":"Momo Dark","version":"5.0.3","tagline":"Momo Dark - theme inspired by Modo","archive_hash":"sha256:1c3d772ddb40f65df60081d1682149b80fc86bc6283ec1699f164f84c8ef93dd","archive_size":6506,"archive_url":"https://extensions.blender.org/download/sha256:1c3d772ddb40f65df60081d1682149b80fc86bc6283ec1699f164f84c8ef93dd/theme-momo-dark-v5.0.3.zip","type":"theme","blender_version_min":"5.1.0","website":"https://extensions.blender.org/themes/momo-dark/","maintainer":"TimoShch","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"rss_theme_cyberpunk","schema_version":"1.0.0","name":"RedSavStudios: Cyberpunk","version":"0.5.5","tagline":"A dark blue cyberpunk-inspired theme with neon highlights","archive_hash":"sha256:9fc403b95ae68202e260f4cd7dba2359ad4e50ace0e4fcab020edacb5366435c","archive_size":5501,"archive_url":"https://extensions.blender.org/download/sha256:9fc403b95ae68202e260f4cd7dba2359ad4e50ace0e4fcab020edacb5366435c/theme-rss-theme-cyberpunk-v0.5.5.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/rss-theme-cyberpunk/","maintainer":"Reddraconi","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"rss_theme_nord","schema_version":"1.0.0","name":"RedSavStudios: Nord (Aurora)","version":"0.5.2","tagline":"Nord Theme With Aurora Accents","archive_hash":"sha256:0e8c6afd497618aef1fa42511aff6cfab32311c162b4f8f0d9291f59523cfd50","archive_size":5196,"archive_url":"https://extensions.blender.org/download/sha256:0e8c6afd497618aef1fa42511aff6cfab32311c162b4f8f0d9291f59523cfd50/theme-rss-theme-nord-v0.5.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/rss-theme-nord/","maintainer":"Reddraconi","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"randomize_noise_offset","schema_version":"1.0.0","name":"Randomize Noise Offset","version":"1.0.3","tagline":"Randomize Noise Offset for F-Curves","archive_hash":"sha256:538013b0bbec8281cf30abafee96389d0ad3664b48b733d9b3784b674e63a6e9","archive_size":2500,"archive_url":"https://extensions.blender.org/download/sha256:538013b0bbec8281cf30abafee96389d0ad3664b48b733d9b3784b674e63a6e9/add-on-randomize-noise-offset-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/randomize-noise-offset/","maintainer":"a.a.andrusenko","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"mirror_image","schema_version":"1.0.0","name":"Mirror Image","version":"1.0.0","tagline":"Applies mirroring to the active image","archive_hash":"sha256:12acdb21a3cd9f1e05202ae384499c80949d8ed3d352cd8a0ddfe70dcac21f46","archive_size":2540,"archive_url":"https://extensions.blender.org/download/sha256:12acdb21a3cd9f1e05202ae384499c80949d8ed3d352cd8a0ddfe70dcac21f46/add-on-mirror-image-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mirror-image/","maintainer":"R4V3N","license":["SPDX:GPL-3.0-or-later"],"tags":["Paint"]},{"id":"toggle_orbit_method","schema_version":"1.0.0","name":"Toggle Orbit Method (Turntable / Trackball)","version":"1.0.0","tagline":"Quickly toggles between Turntable and Trackball orbit modes","archive_hash":"sha256:c22d1bfd2e9bb48344aae7cb61efa209a06174146e3f1b6436a638b3064019c4","archive_size":1369,"archive_url":"https://extensions.blender.org/download/sha256:c22d1bfd2e9bb48344aae7cb61efa209a06174146e3f1b6436a638b3064019c4/add-on-toggle-orbit-method-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/toggle-orbit-method/","maintainer":"ArgelliKa","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"blender_vnf_exporter_extension","schema_version":"1.0.0","name":"VNF Export Extension","version":"1.0.0","tagline":"Export blender mesh to openscad vnf","archive_hash":"sha256:a5520b1cd82ed825022faadc413ba1db1dd8c9b8d16fafb7c198583ccbe6c23e","archive_size":14400,"archive_url":"https://extensions.blender.org/download/sha256:a5520b1cd82ed825022faadc413ba1db1dd8c9b8d16fafb7c198583ccbe6c23e/add-on-blender-vnf-exporter-extension-v1.0.0-windows-x64-linux-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blender-vnf-exporter-extension/","maintainer":"runerback","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export .scad to disk"},"platforms":["windows-x64","linux-x64"],"tags":["Import-Export"]},{"id":"vray_arena_setup","schema_version":"1.0.0","name":"Vray Arena Setup","version":"2.5.0","tagline":"Export VRay Cosmos assets, scene textures, and stage cube setup","archive_hash":"sha256:608feab71c8d9f0726372656513c23c24ebad88707929a9f3c89d85a64d6185f","archive_size":6050,"archive_url":"https://extensions.blender.org/download/sha256:608feab71c8d9f0726372656513c23c24ebad88707929a9f3c89d85a64d6185f/add-on-vray-arena-setup-v2.5.0.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/vray-arena-setup/","maintainer":"Darsh","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and write project and resources directories"},"tags":["Import-Export","Material"]},{"id":"Minimal","schema_version":"1.0.0","name":"Minimal","version":"1.0.0","tagline":"Dark minimal theme","archive_hash":"sha256:5cfd4ece8439e754c284703a3b92e967094ac3c05e5a145738e911139b4238fb","archive_size":5620,"archive_url":"https://extensions.blender.org/download/sha256:5cfd4ece8439e754c284703a3b92e967094ac3c05e5a145738e911139b4238fb/theme-minimal-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/minimal/","maintainer":"A7medKhaled.me","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"auto_track_weights","schema_version":"1.0.0","name":"Auto Track Weights","version":"0.2.1","tagline":"Automatically adjust the weights of tracking markers","archive_hash":"sha256:90e5cf8f11558a00e14a383e30cda0fd9ca1d40bc76e514f8f42b7be3c67c6be","archive_size":2415,"archive_url":"https://extensions.blender.org/download/sha256:90e5cf8f11558a00e14a383e30cda0fd9ca1d40bc76e514f8f42b7be3c67c6be/add-on-auto-track-weights-v0.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/auto-track-weights/","maintainer":"david494","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","Tracking"]},{"id":"batch_bone_constraints","schema_version":"1.0.0","name":"Batch Bone Constraints","version":"1.1.4","tagline":"Batch bone constraints to the selected multiple armatures","archive_hash":"sha256:a73d426532da74e03772365f62a32e85637622da7cfe4fb77f469923e13604ee","archive_size":6589,"archive_url":"https://extensions.blender.org/download/sha256:a73d426532da74e03772365f62a32e85637622da7cfe4fb77f469923e13604ee/add-on-batch-bone-constraints-v1.1.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/batch-bone-constraints/","maintainer":"distinctive-mark","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Animation"]},{"id":"theme_BlueInvasion","schema_version":"1.0.0","name":"Blue Invasion","version":"1.0.3-1","tagline":"A theme inspired by Winamp's blue invasion theme","archive_hash":"sha256:aaa50db52785b547c7902f7dea3808dbd06ba8a27b989b96de0640590a7863f2","archive_size":6165,"archive_url":"https://extensions.blender.org/download/sha256:aaa50db52785b547c7902f7dea3808dbd06ba8a27b989b96de0640590a7863f2/theme-theme-blueinvasion-v1.0.3-1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-blueinvasion/","maintainer":"zaq","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Colorful","Inspired By"]},{"id":"trident","schema_version":"1.0.0","name":"TRIDENT","version":"0.2.1","tagline":"3D UMAP/t-SNE embeddings into Blender","archive_hash":"sha256:85c8367127d76c0c21514615439d0b4fdfdb08e3034f146ad890f6cf4d29c66a","archive_size":128117,"archive_url":"https://extensions.blender.org/download/sha256:85c8367127d76c0c21514615439d0b4fdfdb08e3034f146ad890f6cf4d29c66a/add-on-trident-v0.2.1-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/trident/","maintainer":"ccordi","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write data files and build outputs"},"platforms":["windows-x64"],"tags":["3D View","Object"]},{"id":"FrameFlowBlender","schema_version":"1.0.0","name":"Frame Flow Beta","version":"1.4.1","tagline":"Advanced Node Frame Add-on for Blender","archive_hash":"sha256:24848e275ae2a587be4a8048afbc32f1b67e46ef0aba693ca65a34de20bc495f","archive_size":922364,"archive_url":"https://extensions.blender.org/download/sha256:24848e275ae2a587be4a8048afbc32f1b67e46ef0aba693ca65a34de20bc495f/add-on-frameflowblender-v1.4.1.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/frameflowblender/","maintainer":"abhi.01","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","Text Editor"]},{"id":"pataz_thumbnail_toolz","schema_version":"1.0.0","name":"Pataz Thumbnail Toolz","version":"1.0.0","tagline":"Tools for managing asset thumbnails","archive_hash":"sha256:ef3ba866311125fd57ed6598dea3be8acc70608f3d95ff817d4c8444012774ac","archive_size":2763,"archive_url":"https://extensions.blender.org/download/sha256:ef3ba866311125fd57ed6598dea3be8acc70608f3d95ff817d4c8444012774ac/add-on-pataz-thumbnail-toolz-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pataz-thumbnail-toolz/","maintainer":"zanqdo","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save and load files from disk"},"tags":["Pipeline"]},{"id":"io_scene_jsbsim","schema_version":"1.0.0","name":"JSBSim Viewer","version":"0.2.3","tagline":"Import and visualize JSBSim FDM aircraft XML metrics","archive_hash":"sha256:3d97352d2c89e76944575b20004a05aeb07c771412a6ffda6b375f973b8dff5f","archive_size":6721,"archive_url":"https://extensions.blender.org/download/sha256:3d97352d2c89e76944575b20004a05aeb07c771412a6ffda6b375f973b8dff5f/add-on-io-scene-jsbsim-v0.2.3.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"6.0.0","website":"https://extensions.blender.org/add-ons/io-scene-jsbsim/","maintainer":"RenanMsV","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"multi_adjust","schema_version":"1.0.0","name":"Multi Adjust","version":"1.0.1","tagline":"Edits properties of multiple things together","archive_hash":"sha256:b5717e7f3f3e02a8b55acea1caaa10c0aef618f992f9dc109510c1ee2de4abed","archive_size":9515,"archive_url":"https://extensions.blender.org/download/sha256:b5717e7f3f3e02a8b55acea1caaa10c0aef618f992f9dc109510c1ee2de4abed/add-on-multi-adjust-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/multi-adjust/","maintainer":"Brrainz","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling"]},{"id":"replace_with_copy","schema_version":"1.0.0","name":"Replace With Copy","version":"1.0.1","tagline":"Batch replace multiple objects with a template","archive_hash":"sha256:b1827d0b0ae7e87cce0f4e4ecf4ce8e861d14dc183d5bb387226167ef66fbabf","archive_size":4116,"archive_url":"https://extensions.blender.org/download/sha256:b1827d0b0ae7e87cce0f4e4ecf4ce8e861d14dc183d5bb387226167ef66fbabf/add-on-replace-with-copy-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/replace-with-copy/","maintainer":"Brrainz","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling"]},{"id":"sierpinski_triangle","schema_version":"1.0.0","name":"Sierpinski Triangle","version":"1.0.4","tagline":"This add-on creates Sierpinski triangles","archive_hash":"sha256:4f6badeb029f38d3680bec40b1a7a61aafd7b35487849a09875c844bd7e01b05","archive_size":4106,"archive_url":"https://extensions.blender.org/download/sha256:4f6badeb029f38d3680bec40b1a7a61aafd7b35487849a09875c844bd7e01b05/add-on-sierpinski-triangle-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sierpinski-triangle/","maintainer":"Jonny-B","license":["SPDX:GPL-3.0-or-later"]},{"id":"light_generator","schema_version":"1.0.0","name":"Light Generator","version":"1.2.0","tagline":"Generate lights with advanced distribution","archive_hash":"sha256:1b687666b01727e8e8c91ab7a06f03c641cd840d002bcb59714e73d8ba877a05","archive_size":5837,"archive_url":"https://extensions.blender.org/download/sha256:1b687666b01727e8e8c91ab7a06f03c641cd840d002bcb59714e73d8ba877a05/add-on-light-generator-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/light-generator/","maintainer":"TFMSTYLE","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Lighting"]},{"id":"nfc_card_keychain_generator","schema_version":"1.0.0","name":"NFC Card and Keychain Generator","version":"1.2.2","tagline":"Generate customizable 3D-printable cards, tags, and keychains","archive_hash":"sha256:61fc9b726002f7cd17ffb5b1e54bfa1827e8edf538881e72749f4faf931dc384","archive_size":513576,"archive_url":"https://extensions.blender.org/download/sha256:61fc9b726002f7cd17ffb5b1e54bfa1827e8edf538881e72749f4faf931dc384/add-on-nfc-card-keychain-generator-v1.2.2.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/nfc-card-keychain-generator/","maintainer":"Clonephaze","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"For custom SVG import and file saving operations"},"tags":["Modeling","Object"]},{"id":"Physical_Motion_Blur","schema_version":"1.0.0","name":"Physical Motion Blur","version":"1.1.0","tagline":"Adds intuitive shutter speed and angle controls for motion blur","archive_hash":"sha256:b74e16e526349842371e5b688e7f95e4fbaf60284d413c025c30de5989a51438","archive_size":2605,"archive_url":"https://extensions.blender.org/download/sha256:b74e16e526349842371e5b688e7f95e4fbaf60284d413c025c30de5989a51438/add-on-physical-motion-blur-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/physical-motion-blur/","maintainer":"K_Naoki","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","Render","Animation"]},{"id":"utility_materials","schema_version":"1.0.0","name":"Utility Materials","version":"1.1.5","tagline":"Industrial design theme in the Utility Materials universe","archive_hash":"sha256:1060b83f61823e30cac6147ad365e0e2532132ba85719a73fb8a881b1daee82f","archive_size":5294,"archive_url":"https://extensions.blender.org/download/sha256:1060b83f61823e30cac6147ad365e0e2532132ba85719a73fb8a881b1daee82f/theme-utility-materials-v1.1.5.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/utility-materials/","maintainer":"Utility-Materials","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"AddShaderAttribute","schema_version":"1.0.0","name":"Add Shader Attribute","version":"0.3.0","tagline":"Add attribute directly in shader nodetree","archive_hash":"sha256:94c6c429e385ec1bdd70aab48b4664b72ab7e4af3336b4acc96be2d3f4d02707","archive_size":2591,"archive_url":"https://extensions.blender.org/download/sha256:94c6c429e385ec1bdd70aab48b4664b72ab7e4af3336b4acc96be2d3f4d02707/add-on-addshaderattribute-v0.3.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/addshaderattribute/","maintainer":"atticuslv","license":["SPDX:GPL-3.0-or-later"],"tags":["Material","Node"]},{"id":"all_objects_into_assets","schema_version":"1.0.0","name":"All Objects into Assets","version":"1.0.4","tagline":"Create collection assets and catalogs automatically","archive_hash":"sha256:10d9d4dfc45855e34afbec1e7fc88d8576ab201701abf0d4c5876eac65dd52a7","archive_size":9361,"archive_url":"https://extensions.blender.org/download/sha256:10d9d4dfc45855e34afbec1e7fc88d8576ab201701abf0d4c5876eac65dd52a7/add-on-all-objects-into-assets-v1.0.4.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/all-objects-into-assets/","maintainer":"StellArc","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write asset library catalogs file"}},{"id":"goldsrc_model_helper","schema_version":"1.0.0","name":"GS Model Helper","version":"2.2.0","tagline":"A set of tools for working with Goldsource models in Blender","archive_hash":"sha256:074531c7e337f1e88d36dfdec5ad2f698b8d18aa7e916008120c6105846b98df","archive_size":7626,"archive_url":"https://extensions.blender.org/download/sha256:074531c7e337f1e88d36dfdec5ad2f698b8d18aa7e916008120c6105846b98df/add-on-goldsrc-model-helper-v2.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/goldsrc-model-helper/","maintainer":"DaKashi","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Required to rename and clean up materials/textures"}},{"id":"pjavel_theme","schema_version":"1.0.0","name":"Pjavel Theme","version":"1.2.1","tagline":"Green accent theme","archive_hash":"sha256:70470964d0dfa3434f29805cfdd504dc71477dab4e38c0539d660d28bacb61bb","archive_size":18640,"archive_url":"https://extensions.blender.org/download/sha256:70470964d0dfa3434f29805cfdd504dc71477dab4e38c0539d660d28bacb61bb/theme-pjavel-theme-v1.2.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/pjavel-theme/","maintainer":"Zexyp","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"text_editor_for_development","schema_version":"1.0.0","name":"Text editor for Development","version":"1.0.7","tagline":"Text editor enhancements for add-on development","archive_hash":"sha256:132e0df040832a572a759c89205edf203a296822af651a7db49a3c99d1a1edf2","archive_size":340600,"archive_url":"https://extensions.blender.org/download/sha256:132e0df040832a572a759c89205edf203a296822af651a7db49a3c99d1a1edf2/add-on-text-editor-for-development-v1.0.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/text-editor-for-development/","maintainer":"Martin-Lorentzon","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Specify folder to preview for file-browsing/editing","network":"Clone remote Git repositories for add-on templates"},"tags":["Text Editor","Development"]},{"id":"bfds","schema_version":"1.0.0","name":"BFDS fire simulations","version":"7.0.0","tagline":"Create and manage NIST FDS fire simulations","archive_hash":"sha256:27de24b26775e38e30d5813ad436c3aaa8b38429728ebc191446eaa71491ccb6","archive_size":370951,"archive_url":"https://extensions.blender.org/download/sha256:27de24b26775e38e30d5813ad436c3aaa8b38429728ebc191446eaa71491ccb6/add-on-bfds-v7.0.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/bfds/","maintainer":"emanuele.gissi","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export FDS files from/to disk","network":"Display geographic positions, convert coordinates"},"tags":["Import-Export"]},{"id":"sciblend","schema_version":"1.0.0","name":"SciBlend","version":"1.1.2","tagline":"Scientific visualization tools for Blender","archive_hash":"sha256:a0ea43e82838e33a8fbd691bdabd3342242093dd484a1909d70e3bc024da554d","archive_size":143536802,"archive_url":"https://extensions.blender.org/download/sha256:a0ea43e82838e33a8fbd691bdabd3342242093dd484a1909d70e3bc024da554d/add-on-sciblend-v1.1.2-windows-x64.zip","type":"add-on","blender_version_min":"4.5.1","website":"https://extensions.blender.org/add-ons/sciblend/","maintainer":"José-Marín","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Import-Export"]},{"id":"navigation_puck_addon","schema_version":"1.0.0","name":"Navigation Puck Addon","version":"1.0.1","tagline":"Navigation Puck like in Sketchbook Pro","archive_hash":"sha256:a0b4620698e8a925607fd3288d0738f4c20ecd5397c9d8c35ad7199981e15e51","archive_size":14528,"archive_url":"https://extensions.blender.org/download/sha256:a0b4620698e8a925607fd3288d0738f4c20ecd5397c9d8c35ad7199981e15e51/add-on-navigation-puck-addon-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/navigation-puck-addon/","maintainer":"IliaVerpa","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface","3D View"]},{"id":"midicontroller","schema_version":"1.0.0","name":"MidiController","version":"0.1.7","tagline":"Control objects properties through midi","archive_hash":"sha256:635cc40eca6b181d6bbba19839ebf15fd006620056ed3344c7cc505079ea8127","archive_size":270990,"archive_url":"https://extensions.blender.org/download/sha256:635cc40eca6b181d6bbba19839ebf15fd006620056ed3344c7cc505079ea8127/add-on-midicontroller-v0.1.7-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/midicontroller/","maintainer":"Eldin-Zenderink","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["User Interface","Animation"]},{"id":"mc_animaker","schema_version":"1.0.0","name":"MC Animaker","version":"1.4.0","tagline":"Bring your Blender animations to life in Minecraft","archive_hash":"sha256:b3533f2c1b1ff605d0c162023d27096d92c4ff705577f72738ebc4981701c830","archive_size":183928,"archive_url":"https://extensions.blender.org/download/sha256:b3533f2c1b1ff605d0c162023d27096d92c4ff705577f72738ebc4981701c830/add-on-mc-animaker-v1.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mc-animaker/","maintainer":"Priqnot","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import Resource Packs and Export Minecraft Datapack Files"},"tags":["Game Engine","Import-Export"]},{"id":"smart_transform","schema_version":"1.0.0","name":"Smart Transform","version":"1.0.2","tagline":"filter objects by size or transforms, and more tools","archive_hash":"sha256:7b4fa468f7ad58552ec1b6be1d2f2c3f0ed2bfe19da271042e38a661c4cfdd11","archive_size":2671,"archive_url":"https://extensions.blender.org/download/sha256:7b4fa468f7ad58552ec1b6be1d2f2c3f0ed2bfe19da271042e38a661c4cfdd11/add-on-smart-transform-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/smart-transform/","maintainer":"Claz_Arts","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"animated_brush","schema_version":"1.0.0","name":"Animated Texture Brush","version":"1.0.2","tagline":"Randomly cycles image sequence texture while painting","archive_hash":"sha256:8903fadaf19661e63c6b7b60b805b2e11121e567ce9eb51f42f81b0aba76c7be","archive_size":2467,"archive_url":"https://extensions.blender.org/download/sha256:8903fadaf19661e63c6b7b60b805b2e11121e567ce9eb51f42f81b0aba76c7be/add-on-animated-brush-v1.0.2.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/animated-brush/","maintainer":"Kvendy","license":["SPDX:GPL-3.0-or-later"],"tags":["Paint"]},{"id":"lod_gen","schema_version":"1.0.0","name":"LODGen","version":"0.0.5","tagline":"Generate LODs for Games in 3 Clicks or Less","archive_hash":"sha256:0f2ab6b571315bee02068eb61a0ff972c25beea69acf0d2f0aec8a0b8dcc5128","archive_size":15434,"archive_url":"https://extensions.blender.org/download/sha256:0f2ab6b571315bee02068eb61a0ff972c25beea69acf0d2f0aec8a0b8dcc5128/add-on-lod-gen-v0.0.5.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/lod-gen/","maintainer":"F1dg3t","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh"]},{"id":"LostSelection","schema_version":"1.0.0","name":"Lost Selection","version":"0.2.0","tagline":"Set of usefull extra selection operators","archive_hash":"sha256:b86837ae75d5de7867114f1a0b038fa522a5628bfcbc9073a4083570f857fcb4","archive_size":32205,"archive_url":"https://extensions.blender.org/download/sha256:b86837ae75d5de7867114f1a0b038fa522a5628bfcbc9073a4083570f857fcb4/add-on-lostselection-v0.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/lostselection/","maintainer":"niewinny","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Mesh"]},{"id":"reset_workspace","schema_version":"1.0.0","name":"Reset Workspace","version":"0.0.4","tagline":"Reset the user interface (with your startup file interface)","archive_hash":"sha256:35cef23e81719101cd3d7616c08d4804c419417c57abd7be68d11b296d1f9a32","archive_size":5093,"archive_url":"https://extensions.blender.org/download/sha256:35cef23e81719101cd3d7616c08d4804c419417c57abd7be68d11b296d1f9a32/add-on-reset-workspace-v0.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/reset-workspace/","maintainer":"Trukas","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"edit_instanced_collection","schema_version":"1.0.0","name":"Edit Instanced Collection","version":"0.0.5","tagline":"Quickly find the instanced collection source","archive_hash":"sha256:82b58677725d9892cf2e272a657f498903a17aa057cb0a432dababc18f8db6e3","archive_size":6971,"archive_url":"https://extensions.blender.org/download/sha256:82b58677725d9892cf2e272a657f498903a17aa057cb0a432dababc18f8db6e3/add-on-edit-instanced-collection-v0.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/edit-instanced-collection/","maintainer":"Trukas","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","User Interface"]},{"id":"add_std_paper_size","schema_version":"1.0.0","name":"Add Std Paper-Format","version":"0.1.0","tagline":"Blender add-on to add planes with standardized paper formats","archive_hash":"sha256:d8699b5786b94d157a53a2322b82da1c49fcf833f42d36a3fd143d7d51796ed4","archive_size":19785,"archive_url":"https://extensions.blender.org/download/sha256:d8699b5786b94d157a53a2322b82da1c49fcf833f42d36a3fd143d7d51796ed4/add-on-add-std-paper-size-v0.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/add-std-paper-size/","maintainer":"BsIngA","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh"]},{"id":"Blueprint_Film_Theme","schema_version":"1.0.0","name":"Blueprint_Film_Theme","version":"2.2.6","tagline":"Translucent Aqua","archive_hash":"sha256:86191cf09c337b9e1fcef89b24988f855f2ea05fef764f05f6965ebc87692145","archive_size":5735,"archive_url":"https://extensions.blender.org/download/sha256:86191cf09c337b9e1fcef89b24988f855f2ea05fef764f05f6965ebc87692145/theme-blueprint-film-theme-v2.2.6.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/blueprint-film-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"pbsu_addon_3ds","schema_version":"1.0.0","name":"PBSU 3D Studio (.3ds)","version":"1.0.1","tagline":"Import/export 3DS scenes, objects, cameras, lights & anims","archive_hash":"sha256:347858569d753e688770e2f73c1d75b9787ccb69ce86e6fdbb08d06483a4814d","archive_size":42631,"archive_url":"https://extensions.blender.org/download/sha256:347858569d753e688770e2f73c1d75b9787ccb69ce86e6fdbb08d06483a4814d/add-on-pbsu-addon-3ds-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pbsu-addon-3ds/","maintainer":"Arturo-Cervantes","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import and export Autodesk 3DS files"},"tags":["Import-Export","Scene","Object","Camera","Lighting","Animation"]},{"id":"on_screen_numpad","schema_version":"1.0.0","name":"On-Screen Numpad","version":"1.2.1","tagline":"No need to leave the mouse to enter numbers","archive_hash":"sha256:4c16d0f6f007afdadcf931efbba4ae2d31924a3a9e13aeacf05531202de5b71d","archive_size":23277,"archive_url":"https://extensions.blender.org/download/sha256:4c16d0f6f007afdadcf931efbba4ae2d31924a3a9e13aeacf05531202de5b71d/add-on-on-screen-numpad-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"6.0.0","website":"https://extensions.blender.org/add-ons/on-screen-numpad/","maintainer":"Pluglug","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"Sakura_Rig_GUI","schema_version":"1.0.0","name":"Sakura's Rig Interfaces","version":"3.1.0","tagline":"A control script for use with Sakura's Rigs","archive_hash":"sha256:98421bd610dd89103aa63177dd25a3bb04e8a71899ad0c93dcba026908e07bf0","archive_size":23119,"archive_url":"https://extensions.blender.org/download/sha256:98421bd610dd89103aa63177dd25a3bb04e8a71899ad0c93dcba026908e07bf0/add-on-sakura-rig-gui-v3.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sakura-rig-gui/","maintainer":"SakuraSedaia","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save and Store Player Skin Information and Downloaded Rigs","network":"Download Minecraft Skin Information from minecraft.net"},"tags":["Rigging","User Interface"]},{"id":"EMU3BM","schema_version":"1.0.0","name":"Toggle Emulate 3 Button Mouse","version":"1.4.0","tagline":"Toggle Emulate 3 Button Mouse","archive_hash":"sha256:4403771643b6e2cae32cecd67a98fea219c3b89a72424207fc3c9640574d2593","archive_size":1343,"archive_url":"https://extensions.blender.org/download/sha256:4403771643b6e2cae32cecd67a98fea219c3b89a72424207fc3c9640574d2593/add-on-emu3bm-v1.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/emu3bm/","maintainer":"chenkin123","license":["SPDX:GPL-3.0-or-later"],"tags":["System"]},{"id":"BL_EasyCrop","schema_version":"1.0.0","name":"BL Easy Crop","version":"2.0.3","tagline":"Use handles for easy cropping in the Blender VSE Preview window","archive_hash":"sha256:f63200c2f634b927cc0ccf82af20aa4298f36f5f5bfbcfdfc85f20adf4a2d9da","archive_size":31082,"archive_url":"https://extensions.blender.org/download/sha256:f63200c2f634b927cc0ccf82af20aa4298f36f5f5bfbcfdfc85f20adf4a2d9da/add-on-bl-easycrop-v2.0.3.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/bl-easycrop/","maintainer":"usrname0","license":["SPDX:GPL-3.0-or-later"],"tags":["Sequencer","User Interface"]},{"id":"SHIRAKUMO_sf3_io","schema_version":"1.0.0","name":"Shirakumo SF3 IO","version":"1.1.0","tagline":"Export/Import support for Simple File Format Family (SF3) files","archive_hash":"sha256:ea929db922904ace800e75192ed57225db3c960f44e2d6b419bddb4041f2116c","archive_size":24064,"archive_url":"https://extensions.blender.org/download/sha256:ea929db922904ace800e75192ed57225db3c960f44e2d6b419bddb4041f2116c/add-on-shirakumo-sf3-io-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/shirakumo-sf3-io/","maintainer":"shinmera","license":["SPDX:GPL-3.0-or-later","SPDX:Zlib"],"permissions":{"files":"Import/export SF3 from/to disk"},"tags":["Import-Export"]},{"id":"normalize_resize_handles","schema_version":"1.0.0","name":"Normalize and Resize Curve Handles","version":"1.0.1","tagline":"Normalize and resize all selected bezier curve handles","archive_hash":"sha256:38d20ad9da74d2f832b4d2cf7ecbe874dc208c2cfacf2f1849ac85aed7751b4a","archive_size":1537,"archive_url":"https://extensions.blender.org/download/sha256:38d20ad9da74d2f832b4d2cf7ecbe874dc208c2cfacf2f1849ac85aed7751b4a/add-on-normalize-resize-handles-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/normalize-resize-handles/","maintainer":"TomasCJ","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling"]},{"id":"FocalLengthTweaker","schema_version":"1.0.0","name":"Focal Length Tweaker","version":"1.0.1","tagline":"Control viewport and camera focal length with your mouse","archive_hash":"sha256:2cae7c140124fbcc68d9fa8b93b5152d9d81f1e3eaf26ff14fc906dc6d99b833","archive_size":9686,"archive_url":"https://extensions.blender.org/download/sha256:2cae7c140124fbcc68d9fa8b93b5152d9d81f1e3eaf26ff14fc906dc6d99b833/add-on-focallengthtweaker-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/focallengthtweaker/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","User Interface"]},{"id":"Zeratul_Theme","schema_version":"1.0.0","name":"Zeratul_Theme","version":"3.1.8","tagline":"Invisible Shadow Warrior","archive_hash":"sha256:f4466e17351aff934bb73b3e0c5ba4a98e92dd0d4ba8b882d4e47ce4a48466d0","archive_size":5668,"archive_url":"https://extensions.blender.org/download/sha256:f4466e17351aff934bb73b3e0c5ba4a98e92dd0d4ba8b882d4e47ce4a48466d0/theme-zeratul-theme-v3.1.8.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/zeratul-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"Prussian_Blueprint_Theme","schema_version":"1.0.0","name":"Prussian_Blueprint_Theme","version":"2.2.1","tagline":"Blueprint True Color","archive_hash":"sha256:482f3d41ae95cf10ab32d9ad57bed3093edb67334ed7043511174da53c6558d3","archive_size":5748,"archive_url":"https://extensions.blender.org/download/sha256:482f3d41ae95cf10ab32d9ad57bed3093edb67334ed7043511174da53c6558d3/theme-prussian-blueprint-theme-v2.2.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/prussian-blueprint-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"render_webhook","schema_version":"1.0.0","name":"Render Webhook","version":"1.0.2","tagline":"Sends a message after render events to a webhook","archive_hash":"sha256:38cc7b54f014a6cd7d3c2d6f4928372749fb2a57ffd1b87df4fbc34550c6ed58","archive_size":2567,"archive_url":"https://extensions.blender.org/download/sha256:38cc7b54f014a6cd7d3c2d6f4928372749fb2a57ffd1b87df4fbc34550c6ed58/add-on-render-webhook-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/render-webhook/","maintainer":"vignette","license":["SPDX:GPL-3.0-or-later"],"permissions":{"network":"Sending HTTP requests to provided webhook URL"},"tags":["Render","Pipeline"]},{"id":"Prussian_Blue_Pink_Theme","schema_version":"1.0.0","name":"Prussian_Blue_Pink_Theme","version":"2.1.0","tagline":"Nobiscum Deus","archive_hash":"sha256:6a745c8e64585bb668ee043aae3bc9bbe3196eabca082e27581645c0da576356","archive_size":5758,"archive_url":"https://extensions.blender.org/download/sha256:6a745c8e64585bb668ee043aae3bc9bbe3196eabca082e27581645c0da576356/theme-prussian-blue-pink-theme-v2.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/prussian-blue-pink-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"Prussian_Blue_Theme","schema_version":"1.0.0","name":"Prussian_Blue_Theme","version":"2.1.0","tagline":"Nobiscum Deus","archive_hash":"sha256:14590a27309685bd49ad5c1aabbfd273b137578094be7850af79d66ae855e135","archive_size":5687,"archive_url":"https://extensions.blender.org/download/sha256:14590a27309685bd49ad5c1aabbfd273b137578094be7850af79d66ae855e135/theme-prussian-blue-theme-v2.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/prussian-blue-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"id":"Clip_Tools","schema_version":"1.0.0","name":"Clip Tools","version":"1.0.3","tagline":"Add a simple tool to the Movie Clip Editor","archive_hash":"sha256:d349847bf1ec2be9a84678e356b11815f070ea75f15550a52f18b1ab737bd391","archive_size":7924,"archive_url":"https://extensions.blender.org/download/sha256:d349847bf1ec2be9a84678e356b11815f070ea75f15550a52f18b1ab737bd391/add-on-clip-tools-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/clip-tools/","maintainer":"K_Naoki","license":["SPDX:GPL-3.0-or-later"],"tags":["Tracking","Camera","3D View"]},{"id":"Merge_selected_cameras","schema_version":"1.0.0","name":"Merge Selected Cameras","version":"1.1.1","tagline":"Create one animated camera from your photogrammetry sequence","archive_hash":"sha256:37e9a6363b92571e6fd33f41edf887d72f63a4e64b6c0a9ca0c5014ea6a0b37d","archive_size":4219,"archive_url":"https://extensions.blender.org/download/sha256:37e9a6363b92571e6fd33f41edf887d72f63a4e64b6c0a9ca0c5014ea6a0b37d/add-on-merge-selected-cameras-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/merge-selected-cameras/","maintainer":"K_Naoki","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","Tracking","3D View"]},{"id":"only_blends_gamepad","schema_version":"1.0.0","name":"OnlyBlends.Gamepad","version":"0.5.1-1","tagline":"Integrate Controller like Gamepads and other inputs via Nodes","archive_hash":"sha256:af3b4e9117c2afae95c3b7c2477983255b38d5688e53182b6116af29704f4629","archive_size":76590,"archive_url":"https://extensions.blender.org/download/sha256:af3b4e9117c2afae95c3b7c2477983255b38d5688e53182b6116af29704f4629/add-on-only-blends-gamepad-v0.5.1-1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/only-blends-gamepad/","maintainer":"Zulhakar","license":["SPDX:GPL-3.0-or-later"],"tags":["Game Engine","Node"]},{"id":"Scene_Duration_Display","schema_version":"1.0.0","name":"Scene Duration Display","version":"1.1.1","tagline":"Displays and syncs timeline duration. Set preview range with I/O","archive_hash":"sha256:ecb84336ac892b588d1fcbdb40da045ce82c73b4869630d9fec11d4cf872a940","archive_size":2361,"archive_url":"https://extensions.blender.org/download/sha256:ecb84336ac892b588d1fcbdb40da045ce82c73b4869630d9fec11d4cf872a940/add-on-scene-duration-display-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/scene-duration-display/","maintainer":"K_Naoki","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"Gray50","schema_version":"1.0.0","name":"Gray50","version":"1.0.5","tagline":"Remake of Blender3.3 light theme","archive_hash":"sha256:8ec0cca80b65f3bfdd8de29e8d4ad88d85b8a48b27a6e1060a3c569fc78f4305","archive_size":6142,"archive_url":"https://extensions.blender.org/download/sha256:8ec0cca80b65f3bfdd8de29e8d4ad88d85b8a48b27a6e1060a3c569fc78f4305/theme-gray50-v1.0.5.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/gray50/","maintainer":"Nick2321","license":["SPDX:GPL-2.0-or-later"],"tags":["Light","Inspired By"]},{"id":"bl_reset_custom_properties","schema_version":"1.0.0","name":"Reset Custom Properties","version":"1.0.4","tagline":"Reset custom properties to their default values","archive_hash":"sha256:f616677a285d385eb5ae5b60791f7d33656fb6914326eac58ae1b3d069a533b4","archive_size":5646,"archive_url":"https://extensions.blender.org/download/sha256:f616677a285d385eb5ae5b60791f7d33656fb6914326eac58ae1b3d069a533b4/add-on-bl-reset-custom-properties-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bl-reset-custom-properties/","maintainer":"Lauloque","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","3D View"]},{"id":"nla_batch_editor","schema_version":"1.0.0","name":"NLA Batch Editor","version":"1.1.0","tagline":"Batch editing for NLA Editor","archive_hash":"sha256:ab1e67b8b7f624dde678548ea94bf0378a597deccecd8745a14e130cd79770cd","archive_size":20602,"archive_url":"https://extensions.blender.org/download/sha256:ab1e67b8b7f624dde678548ea94bf0378a597deccecd8745a14e130cd79770cd/add-on-nla-batch-editor-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nla-batch-editor/","maintainer":"c4205m","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"color_grid_texture_gen","schema_version":"1.0.0","name":"Color Grid Texture Generator","version":"0.1.2","tagline":"Generate customizable color grid textures","archive_hash":"sha256:f5e0ad6b318cca21a773d071af6df303b1d4ec419bdd514e086aca95bc510a9f","archive_size":28692,"archive_url":"https://extensions.blender.org/download/sha256:f5e0ad6b318cca21a773d071af6df303b1d4ec419bdd514e086aca95bc510a9f/add-on-color-grid-texture-gen-v0.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/color-grid-texture-gen/","maintainer":"andersmmg","license":["SPDX:GPL-3.0-or-later"],"permissions":{"clipboard":"Read Coolors URL from clipboard"},"tags":["Material","UV"]},{"id":"io_import_build_map","schema_version":"1.0.0","name":"BUILD Map Importer","version":"1.4.1","tagline":"Import BUILD Engine maps as used in Duke Nukem 3D, Blood, etc","archive_hash":"sha256:d167ef8d1580c381dd1ef6378302b7918d493e67c7317be3fafaea9cf70d6c54","archive_size":57108,"archive_url":"https://extensions.blender.org/download/sha256:d167ef8d1580c381dd1ef6378302b7918d493e67c7317be3fafaea9cf70d6c54/add-on-io-import-build-map-v1.4.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-import-build-map/","maintainer":"Jens.Ne","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import .map files and textures from filesystem"},"tags":["Import-Export","Mesh","Material"]},{"id":"distribute_grease_pencil_strokes","schema_version":"1.0.0","name":"Align-Distribute Grease Pencil Strokes","version":"2.1.0","tagline":"Align-Distribute Grease Pencil strokes","archive_hash":"sha256:e8075d9b8af883ab77be48eb51d424acf51860f408970ec54393f29ec45f1ab2","archive_size":13284,"archive_url":"https://extensions.blender.org/download/sha256:e8075d9b8af883ab77be48eb51d424acf51860f408970ec54393f29ec45f1ab2/add-on-distribute-grease-pencil-strokes-v2.1.0.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/distribute-grease-pencil-strokes/","maintainer":"JohnNyquist","license":["SPDX:GPL-3.0-or-later"],"tags":["Grease Pencil"]},{"id":"BL_FastStart","schema_version":"1.0.0","name":"BL Fast Start (MP4/MOV)","version":"1.9.3","tagline":"A checkbox to add a 'Fast Start' copy of MP4/MOV renders","archive_hash":"sha256:e1954e4b7c112e82249144fe3d2c6a17ab77a256c63f5f3d82c424812197c4a4","archive_size":23184,"archive_url":"https://extensions.blender.org/download/sha256:e1954e4b7c112e82249144fe3d2c6a17ab77a256c63f5f3d82c424812197c4a4/add-on-bl-faststart-v1.9.3.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/bl-faststart/","maintainer":"usrname0","license":["SPDX:GPL-3.0-or-later"],"tags":["Render","User Interface"]},{"id":"quantum_void_fluoamber","schema_version":"1.0.0","name":"Quantum Void FluoAmber","version":"1.0.2","tagline":"A monochromatic dark theme with accent","archive_hash":"sha256:6506841912f52525e1ae2d12d9ce2ac9316676f0bc7684374ab3847731dad70f","archive_size":3205,"archive_url":"https://extensions.blender.org/download/sha256:6506841912f52525e1ae2d12d9ce2ac9316676f0bc7684374ab3847731dad70f/theme-quantum-void-fluoamber-v1.0.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/quantum-void-fluoamber/","maintainer":"Dimona-Patrick-243","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"vectart_animation","schema_version":"1.0.0","name":"Vectart Animation","version":"1.1.4","tagline":"Animation tools for VectArt curves and objects","archive_hash":"sha256:d35ccba3d1fc4ca478edbebdc2620409071d1ebbb4e70d02218a5e15a06972eb","archive_size":22398,"archive_url":"https://extensions.blender.org/download/sha256:d35ccba3d1fc4ca478edbebdc2620409071d1ebbb4e70d02218a5e15a06972eb/add-on-vectart-animation-v1.1.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/vectart-animation/","maintainer":"Dimona-Patrick-243","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"blueprints","schema_version":"1.0.0","name":"Blueprints","version":"1.0.3","tagline":"Manage background images ","archive_hash":"sha256:f148d686256514f105c8dfe1b240b8c189b148b47ae426c485ae35ab7d77aaa9","archive_size":3264,"archive_url":"https://extensions.blender.org/download/sha256:f148d686256514f105c8dfe1b240b8c189b148b47ae426c485ae35ab7d77aaa9/add-on-blueprints-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blueprints/","maintainer":"Blenderbob","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling"]},{"id":"tracking_toolkit","schema_version":"1.0.0","name":"Tracking Toolkit","version":"2.0.0","tagline":"Use OpenXR trackers and devices directly in Blender","archive_hash":"sha256:651a5d45a08e2b0a3e873ea539df74862aad01140c3b0c8d8ca608f9c2df1973","archive_size":24151690,"archive_url":"https://extensions.blender.org/download/sha256:651a5d45a08e2b0a3e873ea539df74862aad01140c3b0c8d8ca608f9c2df1973/add-on-tracking-toolkit-v2.0.0-windows-x64.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/tracking-toolkit/","maintainer":"EthanPorcaro","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load custom shapes for tracker models"},"platforms":["windows-x64"],"tags":["Animation","Tracking"]},{"id":"batch_render_actions","schema_version":"1.0.0","name":"Batch Render Actions","version":"1.0.2","tagline":"Render each animation action to its own folder","archive_hash":"sha256:c91187783a22ac88e4847f57bc33f32f5d7954fb6564886839e9b44a4cd05cff","archive_size":2413,"archive_url":"https://extensions.blender.org/download/sha256:c91187783a22ac88e4847f57bc33f32f5d7954fb6564886839e9b44a4cd05cff/add-on-batch-render-actions-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/batch-render-actions/","maintainer":"Padraig-O-Cinneide","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Render"]},{"id":"rmKit_uv","schema_version":"1.0.0","name":"rmKitUV","version":"2.0.0","tagline":"Collection of Tools","archive_hash":"sha256:cd75170fc5d652ba6e52a70939949480ea78a7417b7608e7c2d2c1fb48b3360e","archive_size":259364,"archive_url":"https://extensions.blender.org/download/sha256:cd75170fc5d652ba6e52a70939949480ea78a7417b7608e7c2d2c1fb48b3360e/add-on-rmkit-uv-v2.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/rmkit-uv/","maintainer":"Timothee-Yeramian","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"read/write hotspots to disk"},"tags":["Mesh","UV","Material"]},{"id":"to_square","schema_version":"1.0.0","name":"To Square","version":"2.2.1","tagline":"Square the selection","archive_hash":"sha256:3b16a9910f54d5a29418388ee1f20a1ff5fefbc30628c0c83cb15063d2364688","archive_size":43737,"archive_url":"https://extensions.blender.org/download/sha256:3b16a9910f54d5a29418388ee1f20a1ff5fefbc30628c0c83cb15063d2364688/add-on-to-square-v2.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/to-square/","maintainer":"Jean-Yves-Grosbeau","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"acreplay_importer","schema_version":"1.0.0","name":"AC Replay Importer","version":"0.3.0","tagline":"Animate your cars using Assetto Corsa replays","archive_hash":"sha256:4d91f27fa56cd998c9b2b8ee421d537627413a2dd0d98358ce8a0260fb5b00da","archive_size":8688,"archive_url":"https://extensions.blender.org/download/sha256:4d91f27fa56cd998c9b2b8ee421d537627413a2dd0d98358ce8a0260fb5b00da/add-on-acreplay-importer-v0.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/acreplay-importer/","maintainer":"abchouhan","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import CSV from disk"},"tags":["Animation"]},{"id":"dynamic_head_property_manager","schema_version":"1.0.0","name":"Dynamic Head Property Manager","version":"1.0.7","tagline":"Manage custom facial properties for Roblox Bundles","archive_hash":"sha256:ca7ee4063be416c9a82c1552a97efbf4227b4ce210826547e2b8cd164a418e5b","archive_size":26446,"archive_url":"https://extensions.blender.org/download/sha256:ca7ee4063be416c9a82c1552a97efbf4227b4ce210826547e2b8cd164a418e5b/add-on-dynamic-head-property-manager-v1.0.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dynamic-head-property-manager/","maintainer":"Cloud-Guy","license":["SPDX:GPL-3.0-or-later"]},{"id":"enhanced_svg","schema_version":"1.0.0","name":"Enhanced SVG","version":"0.2.1","tagline":"Import SVG with accurate colors and path processing","archive_hash":"sha256:ad35a3a2817fe767ac253deec0e979180e7458d3bd9026e47515ba76f45b2506","archive_size":4041067,"archive_url":"https://extensions.blender.org/download/sha256:ad35a3a2817fe767ac253deec0e979180e7458d3bd9026e47515ba76f45b2506/add-on-enhanced-svg-v0.2.1-windows-x64.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/enhanced-svg/","maintainer":"Jan-Hendrik-Müller","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Importing data files from disk"},"platforms":["windows-x64"],"tags":["Import-Export"]},{"id":"M2V","schema_version":"1.0.0","name":"MIDI To Visuals","version":"1.2.0","tagline":"With MIDI file as input create somes 3D animations in blender","archive_hash":"sha256:41df46ef9449fb6aa01515bbdc077007b472e024683bf1f62241fda5b7342ae1","archive_size":41169,"archive_url":"https://extensions.blender.org/download/sha256:41df46ef9449fb6aa01515bbdc077007b472e024683bf1f62241fda5b7342ae1/add-on-m2v-v1.2.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/m2v/","maintainer":"Patochun","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"separate_loose_plus","schema_version":"1.0.0","name":"Separate Loose Plus","version":"1.0.0","tagline":"Enhanced mesh separation tools with object tracking","archive_hash":"sha256:944ad096034743a6fef458b743b445f076abd55dd41698eb83f6d94d6085b7a5","archive_size":1973,"archive_url":"https://extensions.blender.org/download/sha256:944ad096034743a6fef458b743b445f076abd55dd41698eb83f6d94d6085b7a5/add-on-separate-loose-plus-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/separate-loose-plus/","maintainer":"RobbieK","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"bve_import_export","schema_version":"1.0.0","name":"BVE Import/Export","version":"5.1.3","tagline":"Import/Export DirectX X (.x) or Export CSV files for BVE/OpenBVE","archive_hash":"sha256:23092e0894371d7d2fdf638fec806a949100f719eb7d39f7be2a87d693add984","archive_size":22514,"archive_url":"https://extensions.blender.org/download/sha256:23092e0894371d7d2fdf638fec806a949100f719eb7d39f7be2a87d693add984/add-on-bve-import-export-v5.1.3.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/bve-import-export/","maintainer":"Kusaanko","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export model file from/to disk"},"tags":["Import-Export"]},{"id":"symple","schema_version":"1.0.0","name":"Symple (symmetry groups)","version":"0.1.2","tagline":"Create figures with spherical symmetry with ease","archive_hash":"sha256:d896c95bba01abaaf56f2c5f6c741c51b63ca097915427aa7ade2315094376c3","archive_size":29123,"archive_url":"https://extensions.blender.org/download/sha256:d896c95bba01abaaf56f2c5f6c741c51b63ca097915427aa7ade2315094376c3/add-on-symple-v0.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/symple/","maintainer":"Martín-Torres-Valverde","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh","Modeling","Object"]},{"id":"select_by_index","schema_version":"1.0.0","name":"Select By Index","version":"1.3.0","tagline":"Select all vertices, edges, or faces within an index range","archive_hash":"sha256:bd41c77ef889b5b84174a0cf88c41ebd6526046f82eb196fc9528ed43232e050","archive_size":3131,"archive_url":"https://extensions.blender.org/download/sha256:bd41c77ef889b5b84174a0cf88c41ebd6526046f82eb196fc9528ed43232e050/add-on-select-by-index-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/select-by-index/","maintainer":"Eric-Banker","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"blender_lut_exporter","schema_version":"1.0.0","name":"LUT Exporter and Importer","version":"2.0.1","tagline":"Converts adjustment layer into LUT .cube file and back","archive_hash":"sha256:7e0e7b2b951f02114cebb97c5c44ffeacb93b28278107b3ac87b9e5b6f064bcd","archive_size":5588,"archive_url":"https://extensions.blender.org/download/sha256:7e0e7b2b951f02114cebb97c5c44ffeacb93b28278107b3ac87b9e5b6f064bcd/add-on-blender-lut-exporter-v2.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/blender-lut-exporter/","maintainer":"ichlubna","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Sequencer"]},{"id":"arc_edge","schema_version":"1.0.0","name":"Arc Edge","version":"1.1.0","tagline":"Arc Edge","archive_hash":"sha256:2a3d3700534566d81d8202a795db594b1e36f407368276319a1141e67419bb4f","archive_size":10986,"archive_url":"https://extensions.blender.org/download/sha256:2a3d3700534566d81d8202a795db594b1e36f407368276319a1141e67419bb4f/add-on-arc-edge-v1.1.0.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/arc-edge/","maintainer":"dartmeadow","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Curve"]},{"id":"Render_from_Terminal","schema_version":"1.0.0","name":"Render from Terminal","version":"0.1.5","tagline":"Create script to launch render from terminal","archive_hash":"sha256:4d6f2ccd813bb51a7082467919ea0b4bc95fd31d1df952747a00ed4e5fa7d0d3","archive_size":10030,"archive_url":"https://extensions.blender.org/download/sha256:4d6f2ccd813bb51a7082467919ea0b4bc95fd31d1df952747a00ed4e5fa7d0d3/add-on-render-from-terminal-v0.1.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/render-from-terminal/","maintainer":"nukkio","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Create script to render from terminal"},"tags":["Render","Pipeline"]},{"id":"Fabnodes","schema_version":"1.0.0","name":"Fabnodes","version":"0.0.3","tagline":"Generates G-Code from geometry node attributes","archive_hash":"sha256:ca120a678f58ef1c62a12dd4b1ac055d79d7cbdf76bf6f22b609224a62ac2281","archive_size":5343,"archive_url":"https://extensions.blender.org/download/sha256:ca120a678f58ef1c62a12dd4b1ac055d79d7cbdf76bf6f22b609224a62ac2281/add-on-fabnodes-v0.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/fabnodes/","maintainer":"luigipacheco","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Geometry Nodes"]},{"id":"substance_textures_importer","schema_version":"1.0.0","name":"Substance Textures Importer","version":"7.2.0","tagline":"Import & autoassign images from 3D painting tools like Substance","archive_hash":"sha256:625b71a17605867443eb678fbe9a3f79653e01c45ed73573d957343fe868ebae","archive_size":35651,"archive_url":"https://extensions.blender.org/download/sha256:625b71a17605867443eb678fbe9a3f79653e01c45ed73573d957343fe868ebae/add-on-substance-textures-importer-v7.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/substance-textures-importer/","maintainer":"Cosmin_Planchon","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import images from disk & read/write customs presets"},"tags":["Material","Import-Export","Node"]},{"id":"slot_link","schema_version":"1.0.0","name":"Slot Link","version":"0.0.11","tagline":"Easily manage projects with multiple separate animations","archive_hash":"sha256:aec6c11bef46dadb552838b00e82a63637ee4dd0c77f21a5fef886317a5a6bab","archive_size":21217,"archive_url":"https://extensions.blender.org/download/sha256:aec6c11bef46dadb552838b00e82a63637ee4dd0c77f21a5fef886317a5a6bab/add-on-slot-link-v0.0.11.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/slot-link/","maintainer":"mars","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","User Interface","Import-Export"]},{"id":"mesh_planes_pro","schema_version":"1.0.0","name":"Mesh Planes Pro","version":"2.0.1","tagline":"Ultimate Background Removal for Faster, Seamless Renders","archive_hash":"sha256:5691d05b04840ede23b7116782821e73d1fd34364c1bda4a69d3daa923832d8b","archive_size":2471909,"archive_url":"https://extensions.blender.org/download/sha256:5691d05b04840ede23b7116782821e73d1fd34364c1bda4a69d3daa923832d8b/add-on-mesh-planes-pro-v2.0.1.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/mesh-planes-pro/","maintainer":"Prince_Eagle","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load node groups from blend file"},"tags":["Material","Node","Render","Mesh"]},{"id":"developer_utilities","schema_version":"1.0.0","name":"Developer Utilities","version":"1.1.0","tagline":"Make life of addon developers easier","archive_hash":"sha256:31a9dead337ef9cd554b62f096c7b056a7b182030d4adac874f2f04b4183479c","archive_size":9006,"archive_url":"https://extensions.blender.org/download/sha256:31a9dead337ef9cd554b62f096c7b056a7b182030d4adac874f2f04b4183479c/add-on-developer-utilities-v1.1.0.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/developer-utilities/","maintainer":"scorpion81","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Open source files of addons for editing"},"tags":["Development"]},{"id":"srtm_terrain_importer","schema_version":"1.0.0","name":"SRTM Terrain Importer","version":"1.0.5","tagline":"Import SRTM elevation data as accurate 3D terrain","archive_hash":"sha256:72299885ab8bb5623bd3643e4b918cf2e29c56fe6010ead0f55e61796498f454","archive_size":6645,"archive_url":"https://extensions.blender.org/download/sha256:72299885ab8bb5623bd3643e4b918cf2e29c56fe6010ead0f55e61796498f454/add-on-srtm-terrain-importer-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/srtm-terrain-importer/","maintainer":"NicolasPriniotakis","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import SRTM HGT files from disk"},"tags":["Import-Export"]},{"id":"Industrial_Light_AOV_Splitter","schema_version":"1.0.0","name":"Industrial Light AOV Splitter","version":"1.0.1","tagline":"Auto create better light aovs (diffuse_env, specular_env...)","archive_hash":"sha256:5b7398df324fbb2836e0c12d070cab2db098a040e86caae4a1c3253c7bd968e7","archive_size":8954,"archive_url":"https://extensions.blender.org/download/sha256:5b7398df324fbb2836e0c12d070cab2db098a040e86caae4a1c3253c7bd968e7/add-on-industrial-light-aov-splitter-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/industrial-light-aov-splitter/","maintainer":"Roland-Vyens","license":["SPDX:GPL-3.0-or-later"],"tags":["Compositing","Import-Export","Pipeline","Render"]},{"id":"servo_animation","schema_version":"1.0.0","name":"Servo Animation","version":"2.1.1","tagline":"Export your Blender animation to servo position values","archive_hash":"sha256:407fa6cac99b8ce6dcac652d729c71be13aafb4b930ecb00fba42ec5971189d4","archive_size":161106,"archive_url":"https://extensions.blender.org/download/sha256:407fa6cac99b8ce6dcac652d729c71be13aafb4b930ecb00fba42ec5971189d4/add-on-servo-animation-v2.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/servo-animation/","maintainer":"timhendriks93","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Import-Export","Rigging"]},{"id":"ac_tools","schema_version":"1.0.0","name":"AC Tools","version":"0.1.5","tagline":"AC Tools for track modding","archive_hash":"sha256:8bcf1e9e218c5cfea0b850e0d9957ee1d4c136dcf608e189f7a25a786bea32dd","archive_size":30842,"archive_url":"https://extensions.blender.org/download/sha256:8bcf1e9e218c5cfea0b850e0d9957ee1d4c136dcf608e189f7a25a786bea32dd/add-on-ac-tools-v0.1.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ac-tools/","maintainer":"PhinDev","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export FBX from/to disk, Manage track folders"},"tags":["Development","Object","User Interface"]},{"id":"img_alpha_to_bsdf","schema_version":"1.0.0","name":"Connect image alpha","version":"1.0.6","tagline":"Connecting image alpha to shader alpha","archive_hash":"sha256:a0d765b49e728e95012895af1bb54d12c3b4ac68ab649115685c8b4d9eb65e02","archive_size":2692,"archive_url":"https://extensions.blender.org/download/sha256:a0d765b49e728e95012895af1bb54d12c3b4ac68ab649115685c8b4d9eb65e02/add-on-img-alpha-to-bsdf-v1.0.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/img-alpha-to-bsdf/","maintainer":"Snakyboopface","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","User Interface","Material"]},{"id":"link_parents","schema_version":"1.0.0","name":"Link Parents","version":"1.2.1","tagline":"Link objects parents & edit Parent Inverse Matrix in UI","archive_hash":"sha256:23a8fa704f6f5c9ae99e6bf5d8b1ac3dbc4d85b6800146f5a5c8679eb60e9395","archive_size":2883,"archive_url":"https://extensions.blender.org/download/sha256:23a8fa704f6f5c9ae99e6bf5d8b1ac3dbc4d85b6800146f5a5c8679eb60e9395/add-on-link-parents-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/link-parents/","maintainer":"Trukas","license":["SPDX:GPL-3.0-or-later"],"tags":["Object","Rigging","User Interface"]},{"id":"sco_buttobjects","schema_version":"1.0.0","name":"SCO ButtObjects","version":"2.0.5","tagline":"Easily align Objects in your scene by Active Object or 3D Cursor","archive_hash":"sha256:4be2b8965bf52ef563b88da4e5588bf1fe220ab8f487ad136dec1c3eb78537bb","archive_size":138673,"archive_url":"https://extensions.blender.org/download/sha256:4be2b8965bf52ef563b88da4e5588bf1fe220ab8f487ad136dec1c3eb78537bb/add-on-sco-buttobjects-v2.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sco-buttobjects/","maintainer":"BEAST_of_BURDEN","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"Grid_Layout","schema_version":"1.0.0","name":"Grid Layout","version":"1.5.7","tagline":"Tools to help layout your UV layout","archive_hash":"sha256:33e8a16f02eb0d5f1063024efd5b24a7c7e5f9426a3de4377decaf00838db03c","archive_size":10399,"archive_url":"https://extensions.blender.org/download/sha256:33e8a16f02eb0d5f1063024efd5b24a7c7e5f9426a3de4377decaf00838db03c/add-on-grid-layout-v1.5.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/grid-layout/","maintainer":"Hodgson3d","license":["SPDX:GPL-3.0-or-later"],"tags":["UV"]},{"id":"povable","schema_version":"1.0.0","name":"POV@Ble","version":"0.1.8","tagline":"Persistence of Vision addon for Blender","archive_hash":"sha256:ff1b57fb994db2e4fbc95088ac6bb1741c3e6e9adef1f0e1f1ae16187cbc7830","archive_size":329019,"archive_url":"https://extensions.blender.org/download/sha256:ff1b57fb994db2e4fbc95088ac6bb1741c3e6e9adef1f0e1f1ae16187cbc7830/add-on-povable-v0.1.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/povable/","maintainer":"POVαBle","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Requires access to directories with binary executables and sound"},"tags":["Render","Pipeline","Import-Export","Text Editor","Development","User Interface","Scene","Modeling","Object","Material","Mesh","Add Curve","Camera","Lighting","Bake"]},{"id":"b_palettes","schema_version":"1.0.0","name":"B Palettes","version":"1.1.0","tagline":"Import/Export Color Palettes","archive_hash":"sha256:59bdbb835628977b5fcd1c88f53fc0d340766f97ef2d2ed477be34d813c53ae6","archive_size":5538,"archive_url":"https://extensions.blender.org/download/sha256:59bdbb835628977b5fcd1c88f53fc0d340766f97ef2d2ed477be34d813c53ae6/add-on-b-palettes-v1.1.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/b-palettes/","maintainer":"Dinesh007","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Requires access to directory with color palette files"},"tags":["Import-Export"]},{"id":"import_files_svg_cuts_directory","schema_version":"1.0.0","name":"Import SVG Cuts Directory","version":"1.0.1","tagline":"Import object based on a directory of SVG cuts","archive_hash":"sha256:bdfe34a8b5e59c0d98342756cfc0ef9185622bd161a3642ba1a43ed0818b6cfb","archive_size":5958242,"archive_url":"https://extensions.blender.org/download/sha256:bdfe34a8b5e59c0d98342756cfc0ef9185622bd161a3642ba1a43ed0818b6cfb/add-on-import-files-svg-cuts-directory-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/import-files-svg-cuts-directory/","maintainer":"Benedikt-Schaber","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import directory of SVGs from disk"},"tags":["Import-Export"]},{"id":"Selected_Bones_To_Vertex_Group","schema_version":"1.0.0","name":"Selected_Bones_To_Vertex_Group","version":"1.0.1","tagline":"Add or delete selected bone to selected mesh","archive_hash":"sha256:e5e49539892d63b5b1ffb7108f7f6cca2884cc598010405d88b2009f40faa9b0","archive_size":2074,"archive_url":"https://extensions.blender.org/download/sha256:e5e49539892d63b5b1ffb7108f7f6cca2884cc598010405d88b2009f40faa9b0/add-on-selected-bones-to-vertex-group-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/selected-bones-to-vertex-group/","maintainer":"mochi_Lin","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"highlighter","schema_version":"1.0.0","name":"Highlighter","version":"0.1.0","tagline":"Syntax highlighting for text objects","archive_hash":"sha256:3fec762b7df4f2667d391a68a55a5b4c78c356d64855104b16d03af7802f3046","archive_size":1209500,"archive_url":"https://extensions.blender.org/download/sha256:3fec762b7df4f2667d391a68a55a5b4c78c356d64855104b16d03af7802f3046/add-on-highlighter-v0.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/highlighter/","maintainer":"pioverfour","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Curve","Text Editor"]},{"id":"frame_focus","schema_version":"1.0.0","name":"Frame Focus","version":"2.0.1","tagline":"List All Frame Nodes And Focus Easily","archive_hash":"sha256:6b86148b65108e75bd979d3f7e65befe9afd032a9c5225fc75ac46aef7c027bc","archive_size":6600,"archive_url":"https://extensions.blender.org/download/sha256:6b86148b65108e75bd979d3f7e65befe9afd032a9c5225fc75ac46aef7c027bc/add-on-frame-focus-v2.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/frame-focus/","maintainer":"Ou_Chiang","license":["SPDX:GPL-3.0-or-later"],"tags":["Node"]},{"id":"neigh_context_switcher","schema_version":"1.0.0","name":"Context Switcher","version":"1.1.2","tagline":"Quick workspace and editor switching via popup at mouse location","archive_hash":"sha256:dd2fa9266d0ced26efe9504e624e8af214c3a2571c74899bc8703b1d9e96101d","archive_size":2365,"archive_url":"https://extensions.blender.org/download/sha256:dd2fa9266d0ced26efe9504e624e8af214c3a2571c74899bc8703b1d9e96101d/add-on-neigh-context-switcher-v1.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/neigh-context-switcher/","maintainer":"Neigh","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"SelectModeKeymaps","schema_version":"1.0.0","name":"Select Mode Keymaps","version":"1.0.1","tagline":"Assign keymaps to toggle Object/Edit Mode and Select Modes","archive_hash":"sha256:2700fa8cc6cb035f7458c079b5e3561e9e93bf6a2e967c2f7ba5607db88fa573","archive_size":5772,"archive_url":"https://extensions.blender.org/download/sha256:2700fa8cc6cb035f7458c079b5e3561e9e93bf6a2e967c2f7ba5607db88fa573/add-on-selectmodekeymaps-v1.0.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/selectmodekeymaps/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"skin_mesh_to_bone","schema_version":"1.0.0","name":"Skin Mesh To Bone","version":"1.0.2","tagline":"Skins selected meshes to a bone on the active armature","archive_hash":"sha256:f8e66dc89bd268aefc76ad3d05727f43f34ab9e043103d0443c061c72d707faf","archive_size":3048,"archive_url":"https://extensions.blender.org/download/sha256:f8e66dc89bd268aefc76ad3d05727f43f34ab9e043103d0443c061c72d707faf/add-on-skin-mesh-to-bone-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/skin-mesh-to-bone/","maintainer":"darknation","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"Faster_FBX_Exporter","schema_version":"1.0.0","name":"Faster FBX Exporter","version":"0.2.4","tagline":"Faster .fbx Exporter for Static Objects With Modifiers","archive_hash":"sha256:d60922038603e42f00b429ba8f8af2026bbd84c80437c7b7c52ea3d34a9c5d60","archive_size":94222,"archive_url":"https://extensions.blender.org/download/sha256:d60922038603e42f00b429ba8f8af2026bbd84c80437c7b7c52ea3d34a9c5d60/add-on-faster-fbx-exporter-v0.2.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/faster-fbx-exporter/","maintainer":"Dan-Gry","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export .fbx files"},"tags":["Import-Export"]},{"id":"copyshapekeys","schema_version":"1.0.0","name":"ShapeKey Copy","version":"3.4.1","tagline":"Copy shapekeys from one mesh to another","archive_hash":"sha256:769278803ab26c411354aec6ded13c4017af8c85a8e9e23eba44434c1467d24b","archive_size":7196,"archive_url":"https://extensions.blender.org/download/sha256:769278803ab26c411354aec6ded13c4017af8c85a8e9e23eba44434c1467d24b/add-on-copyshapekeys-v3.4.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/copyshapekeys/","maintainer":"Blenderbob","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Animation"]},{"id":"Control_Render_Regions","schema_version":"1.0.0","name":"Control Render Regions","version":"1.0.12","tagline":"Manage renders in region","archive_hash":"sha256:e78ea3e3ee8ce9bfee2d4f8894f8338e338fc524f1eba8f3b03ce7fc06967c2d","archive_size":7059441,"archive_url":"https://extensions.blender.org/download/sha256:e78ea3e3ee8ce9bfee2d4f8894f8338e338fc524f1eba8f3b03ce7fc06967c2d/add-on-control-render-regions-v1.0.12-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/control-render-regions/","maintainer":"nukkio","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Create script to render from terminal and render regions"},"platforms":["windows-x64"],"tags":["Render","Pipeline"]},{"id":"Night_Rain_Theme","schema_version":"1.0.0","name":"Night_Rain_Theme","version":"2.1.6","tagline":"Transparent Dark Grey","archive_hash":"sha256:1f2dce88c9965cbf2c7d102077a6e3a8a1cc1b7d672c3f131c2c6016eb67790c","archive_size":5654,"archive_url":"https://extensions.blender.org/download/sha256:1f2dce88c9965cbf2c7d102077a6e3a8a1cc1b7d672c3f131c2c6016eb67790c/theme-night-rain-theme-v2.1.6.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/night-rain-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"nla_midi_copier","schema_version":"1.0.0","name":"NLA Midi Copier","version":"1.2.0","tagline":"NLA and Graph Editor tools for syncing animation to midi files","archive_hash":"sha256:4acdaac298dd38372982087e4cacfa908780bd4993be62204d9df9b194fc30b2","archive_size":115530,"archive_url":"https://extensions.blender.org/download/sha256:4acdaac298dd38372982087e4cacfa908780bd4993be62204d9df9b194fc30b2/add-on-nla-midi-copier-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nla-midi-copier/","maintainer":"Cornerback24","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read midi files from disk"},"tags":["Animation"]},{"id":"blender_mqo","schema_version":"1.0.0","name":"MQO (Metasequoia) Format File Importer/Exporter","version":"2.0.0","tagline":"Import/Export MQO format files","archive_hash":"sha256:986c8ad77c5e90ec3b63e5b7653a7966e97f0ada40b47416f6412c6e3afbd171","archive_size":21616,"archive_url":"https://extensions.blender.org/download/sha256:986c8ad77c5e90ec3b63e5b7653a7966e97f0ada40b47416f6412c6e3afbd171/add-on-blender-mqo-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blender-mqo/","maintainer":"nutti","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/Export MQO from/to disk"},"tags":["Import-Export"]},{"id":"core_debug_tools","schema_version":"1.0.0","name":"Core Debug Tools","version":"0.1.0","tagline":"Debugging utilities for core Blender developers","archive_hash":"sha256:f21387eea0b95445be76e9b6eee95c7ad807451aefdc65a36dce7a11d262ad20","archive_size":629513,"archive_url":"https://extensions.blender.org/download/sha256:f21387eea0b95445be76e9b6eee95c7ad807451aefdc65a36dce7a11d262ad20/add-on-core-debug-tools-v0.1.0.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/core-debug-tools/","maintainer":"JacquesLucke","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Build temporary html files to view in the browser"},"tags":["Development"]},{"id":"twformats","schema_version":"1.0.0","name":"Teeworlds and DDNet Map import","version":"0.4.1","tagline":"Import Teeworlds and DDNet maps","archive_hash":"sha256:a4137b2d611a4cf25828c185a44fe21ffb370637fe8c02413681b372a8d463f5","archive_size":9592799,"archive_url":"https://extensions.blender.org/download/sha256:a4137b2d611a4cf25828c185a44fe21ffb370637fe8c02413681b372a8d463f5/add-on-twformats-v0.4.1-linux-x64-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/twformats/","maintainer":"Patiga","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export files from/to disk"},"platforms":["linux-x64","windows-x64"],"tags":["Import-Export"]},{"id":"Graphite_Mono_Theme","schema_version":"1.0.0","name":"Graphite_Mono_Theme","version":"3.2.5","tagline":"Steel Grey","archive_hash":"sha256:b2b750b037ef43f3b6ee3ecd5993f89517c0939cd5bc24cb5d8cd2630a250f55","archive_size":5858,"archive_url":"https://extensions.blender.org/download/sha256:b2b750b037ef43f3b6ee3ecd5993f89517c0939cd5bc24cb5d8cd2630a250f55/theme-graphite-mono-theme-v3.2.5.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/graphite-mono-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"io_import_pixelart","schema_version":"1.0.0","name":"Import Pixel Art","version":"1.2.1","tagline":"Imports pixel art as colored cubes or squares for each pixel","archive_hash":"sha256:de95c730dc8ef2457d0ee54e90c95acfb3232a91bc6c7e6fa321c0bd9f33f4d1","archive_size":5860,"archive_url":"https://extensions.blender.org/download/sha256:de95c730dc8ef2457d0ee54e90c95acfb3232a91bc6c7e6fa321c0bd9f33f4d1/add-on-io-import-pixelart-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-import-pixelart/","maintainer":"bloody_albatross","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import pixel art from disk"},"tags":["Import-Export"]},{"id":"scene_workspaces","schema_version":"1.0.0","name":"Scene Workspaces","version":"1.1.1","tagline":"Filter and sort your workspaces, scene by scene","archive_hash":"sha256:7466088a97d7e6ed393001712fe09d88e13315c379e91458582a28a0e890ba0a","archive_size":8786,"archive_url":"https://extensions.blender.org/download/sha256:7466088a97d7e6ed393001712fe09d88e13315c379e91458582a28a0e890ba0a/add-on-scene-workspaces-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/scene-workspaces/","maintainer":"Francesco-Bellini","license":["SPDX:GPL-3.0-or-later"],"tags":["Scene","System","User Interface"]},{"id":"clean_game_asset_exporter","schema_version":"1.0.0","name":"Clean Game Asset Exporter","version":"1.0.0","tagline":"Game asset exporter for the Defold game engine","archive_hash":"sha256:377a5cbde66f7ea39b861f3062a7ec5c919c8e0a515aeeb8add9e06ae5aacea3","archive_size":4988,"archive_url":"https://extensions.blender.org/download/sha256:377a5cbde66f7ea39b861f3062a7ec5c919c8e0a515aeeb8add9e06ae5aacea3/add-on-clean-game-asset-exporter-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/clean-game-asset-exporter/","maintainer":"DeBolt","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export game asset files to disk"},"tags":["Game Engine","Import-Export"]},{"id":"aligning_horizontally_mini","schema_version":"1.0.0","name":"Aligning Horizontally Mini","version":"1.0.1","tagline":"Align selected objects in a customizable grid in the 3D viewport","archive_hash":"sha256:15eaa29ad5ba5afbc4ac5c3d63966ab75f89c85de7a8444359bdabee860d3f35","archive_size":3511,"archive_url":"https://extensions.blender.org/download/sha256:15eaa29ad5ba5afbc4ac5c3d63966ab75f89c85de7a8444359bdabee860d3f35/add-on-aligning-horizontally-mini-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/aligning-horizontally-mini/","maintainer":"Hydrocallis","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Object"]},{"id":"lead_edge_maze_ash_creator","schema_version":"1.0.0","name":"Lead Edge Maze Ash Creator","version":"2.4.1","tagline":"Lead Edge Maze Ash","archive_hash":"sha256:003291b86247ce09847fd955f2f3fcc0433162af279eb1d262a35e0fd36fb541","archive_size":11149,"archive_url":"https://extensions.blender.org/download/sha256:003291b86247ce09847fd955f2f3fcc0433162af279eb1d262a35e0fd36fb541/add-on-lead-edge-maze-ash-creator-v2.4.1.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/lead-edge-maze-ash-creator/","maintainer":"dartmeadow","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"f1dg3t_blender_red","schema_version":"1.0.0","name":"F1dg3t Red","version":"1.1.0","tagline":"Perfect for Shadow State 2","archive_hash":"sha256:0288b146cc76cd0f5bbe25c87639a1a150e9298cf64c66eb7ae2f55d60953680","archive_size":6491,"archive_url":"https://extensions.blender.org/download/sha256:0288b146cc76cd0f5bbe25c87639a1a150e9298cf64c66eb7ae2f55d60953680/theme-f1dg3t-blender-red-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/f1dg3t-blender-red/","maintainer":"F1dg3t","license":["SPDX:GPL-2.0-or-later"],"tags":["Inspired By","Dark"]},{"id":"VMD","schema_version":"1.0.0","name":"vmdesk","version":"5.1.1","tagline":"Interactive editor environment in 3D Viewport","archive_hash":"sha256:b63f78078b96d5d4c65cbc648e81ee051d9297c204cd8cd1132ae77ba91c46a4","archive_size":10179640,"archive_url":"https://extensions.blender.org/download/sha256:b63f78078b96d5d4c65cbc648e81ee051d9297c204cd8cd1132ae77ba91c46a4/add-on-vmd-v5.1.1.zip","type":"add-on","blender_version_min":"5.1.0","blender_version_max":"5.2.0","website":"https://extensions.blender.org/add-ons/vmd/","maintainer":"Y.T-LAW","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export from disk to user-supplied path","clipboard":"Copy and paste from shortcut/UI"},"tags":["3D View","Modeling","Mesh","Object","User Interface"]},{"id":"govietools","schema_version":"1.0.0","name":"Govie Tools","version":"1.0.20","tagline":"Optimize your model for use in the Govie Editor","archive_hash":"sha256:31c648371553204133ff0827b8bb33bad0edbbfa50964a5d329a797a10973476","archive_size":123018,"archive_url":"https://extensions.blender.org/download/sha256:31c648371553204133ff0827b8bb33bad0edbbfa50964a5d329a797a10973476/add-on-govietools-v1.0.20.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/govietools/","maintainer":"3D-Interaction-Technologies","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export GLB to disk"},"tags":["Scene","Import-Export"]},{"id":"microscopynodes","schema_version":"1.0.0","name":"Microscopy Nodes","version":"2.2.8","tagline":"Handling microscopy data in Blender, up to 5D volumes","archive_hash":"sha256:099042f041c914621a76d201e137293bb6df83c1b6460f18fbe7e3b6972d4101","archive_size":42496465,"archive_url":"https://extensions.blender.org/download/sha256:099042f041c914621a76d201e137293bb6df83c1b6460f18fbe7e3b6972d4101/add-on-microscopynodes-v2.2.8-windows-x64.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/microscopynodes/","maintainer":"Aafke-Gros","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Importing data files from disk, writing to cache folder","network":"Loading OME-zarr files from the internet from a given URL"},"platforms":["windows-x64"],"tags":["Import-Export"]},{"id":"new_object_from_selected_geometry","schema_version":"1.0.0","name":"New Object From Selected Geometry","version":"1.0.2","tagline":"Creates a new object from the selected geometry in Edit mode","archive_hash":"sha256:c6ce3d5ff406b1cb933740ad87fff0d80debe984357fe92e6912a4f5a988b75f","archive_size":13392,"archive_url":"https://extensions.blender.org/download/sha256:c6ce3d5ff406b1cb933740ad87fff0d80debe984357fe92e6912a4f5a988b75f/add-on-new-object-from-selected-geometry-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/new-object-from-selected-geometry/","maintainer":"Giambattista-Caltabiano","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"Xromm_Tools","schema_version":"1.0.0","name":"XROMM toolkit","version":"0.9.6","tagline":"XROMM toolkit for Blender","archive_hash":"sha256:c6fc2917029a34d1f2ee919a7c966e1e948cd0454d8be8d89885459a179da771","archive_size":18986,"archive_url":"https://extensions.blender.org/download/sha256:c6fc2917029a34d1f2ee919a7c966e1e948cd0454d8be8d89885459a179da771/add-on-xromm-tools-v0.9.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/xromm-tools/","maintainer":"pfalkingham","license":["SPDX:GPL-3.0-or-later"],"tags":["Pipeline"]},{"id":"io_scene_ase","schema_version":"1.0.0","name":"ASCII Scene Export (.ase)","version":"2.2.1","tagline":"Export .ase files used in Unreal Engine 1 & 2","archive_hash":"sha256:7ed06a0042081fc7058a3016d15bce6af441b92156770f532393e370fc916494","archive_size":13786,"archive_url":"https://extensions.blender.org/download/sha256:7ed06a0042081fc7058a3016d15bce6af441b92156770f532393e370fc916494/add-on-io-scene-ase-v2.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-scene-ase/","maintainer":"darknation","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export .ase files to disk"},"tags":["Game Engine","Import-Export"]},{"id":"blender_magicavoxel","schema_version":"1.0.0","name":"MagicaVoxel VOX format","version":"1.5.7","tagline":"Importer addon for MagicaVoxel vox files","archive_hash":"sha256:30f41041bb989380687699ec6b47ec6457e438c922ff71be6e93f99b68fe8d0d","archive_size":24371,"archive_url":"https://extensions.blender.org/download/sha256:30f41041bb989380687699ec6b47ec6457e438c922ff71be6e93f99b68fe8d0d/add-on-blender-magicavoxel-v1.5.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blender-magicavoxel/","maintainer":"AstrorEnales","license":["SPDX:GPL-3.0-or-later","SPDX:MIT"],"permissions":{"files":"Import VOX from disk"},"tags":["Import-Export"]},{"id":"odyssey_eobet_remix","schema_version":"1.0.0","name":"Odyssey eobet Remix","version":"2.0.1","tagline":"Theme highlighting the active object","archive_hash":"sha256:44250497cdad4efef753edd6470c5a7bd411e7b9a7d9828a6cb5d071d99bf743","archive_size":5970,"archive_url":"https://extensions.blender.org/download/sha256:44250497cdad4efef753edd6470c5a7bd411e7b9a7d9828a6cb5d071d99bf743/theme-odyssey-eobet-remix-v2.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/odyssey-eobet-remix/","maintainer":"eobet","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"PieMenu_Everywhere","schema_version":"1.0.0","name":"PieMenu Everywhere","version":"1.4.5","tagline":"Maximize your efficiency with PieMenu Everywhere","archive_hash":"sha256:1a79638d9774eef739be1adc281c65600c588f3915f7d9f6a20c2cbac8b07e84","archive_size":438388,"archive_url":"https://extensions.blender.org/download/sha256:1a79638d9774eef739be1adc281c65600c588f3915f7d9f6a20c2cbac8b07e84/add-on-piemenu-everywhere-v1.4.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/piemenu-everywhere/","maintainer":"DeathShot-747","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface","Pipeline","3D View","Node"]},{"id":"Partybots_converter","schema_version":"1.0.0","name":"Partybots converter","version":"1.0.4","tagline":"This is a addon to build partybots maps","archive_hash":"sha256:c2c2e36e9997df032739b03d49854e547fa142684c193a7332d816e68d68ab00","archive_size":5333,"archive_url":"https://extensions.blender.org/download/sha256:c2c2e36e9997df032739b03d49854e547fa142684c193a7332d816e68d68ab00/add-on-partybots-converter-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/partybots-converter/","maintainer":"vuyghu2020","license":["SPDX:GPL-3.0-or-later"],"permissions":{"clipboard":"To write the compiled output to the clipbord"},"tags":["3D View","Object","Game Engine"]},{"id":"add_airfoil","schema_version":"1.0.0","name":"Add Airfoil","version":"2.0.0","tagline":"Import Airfoil Dat Files into Blender","archive_hash":"sha256:118dfa0e9d40af8486bea8e149e0db5518db051681aba4165d699df9868f73ae","archive_size":2356,"archive_url":"https://extensions.blender.org/download/sha256:118dfa0e9d40af8486bea8e149e0db5518db051681aba4165d699df9868f73ae/add-on-add-airfoil-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/add-airfoil/","maintainer":"Nerk","license":["SPDX:GPL-2.0-or-later"],"tags":["Import-Export","Mesh"]},{"id":"atomic_blender_cluster","schema_version":"1.0.0","name":"Atomic Blender Cluster","version":"1.0.0","tagline":"Creating atom clusters or nanoparticles in Blender","archive_hash":"sha256:77b6176aaf69f70917b353e0f5bf183f1f0ad4ff70cc4bf92d72471fe2647d18","archive_size":11917,"archive_url":"https://extensions.blender.org/download/sha256:77b6176aaf69f70917b353e0f5bf183f1f0ad4ff70cc4bf92d72471fe2647d18/add-on-atomic-blender-cluster-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/atomic-blender-cluster/","maintainer":"Blendphys","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh"]},{"id":"add_positive_cube","schema_version":"1.0.0","name":"Add Positive Cube","version":"1.1.0","tagline":"Adds a cube with its origin at the corner","archive_hash":"sha256:860bb8ffe1cce3f120ce334b0a6daba5d2d296c84fc12445839e96d288a541a2","archive_size":1913,"archive_url":"https://extensions.blender.org/download/sha256:860bb8ffe1cce3f120ce334b0a6daba5d2d296c84fc12445839e96d288a541a2/add-on-add-positive-cube-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/add-positive-cube/","maintainer":"jefftml","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh","3D View"]},{"id":"theme_modo","schema_version":"1.0.0","name":"Modo","version":"2.0.0","tagline":"Community-made theme inspired by Modo","archive_hash":"sha256:b9021a0edcfc6e68474ae1bb6a8257bd83b766c97e17020f4db723ed403ebc0f","archive_size":5822,"archive_url":"https://extensions.blender.org/download/sha256:b9021a0edcfc6e68474ae1bb6a8257bd83b766c97e17020f4db723ed403ebc0f/theme-theme-modo-v2.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-modo/","maintainer":"Community","license":["SPDX:GPL-3.0-or-later"],"tags":["Inspired By","Dark"]},{"id":"stl_format_legacy","schema_version":"1.0.0","name":"STL format (legacy)","version":"1.1.4","tagline":"Import-Export STL files","archive_hash":"sha256:ae6e839285861f6e14022ea7b5b74a93760d2055d4cc43ea63fb1951918cc1e6","archive_size":7513,"archive_url":"https://extensions.blender.org/download/sha256:ae6e839285861f6e14022ea7b5b74a93760d2055d4cc43ea63fb1951918cc1e6/add-on-stl-format-legacy-v1.1.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/stl-format-legacy/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Add-on expects to have access to filesytem."},"tags":["Import-Export"]},{"id":"atomic_blender_pdb_xyz","schema_version":"1.0.0","name":"Atomic Blender PDB/XYZ","version":"1.9.1","tagline":"Importing atoms listed in PDB and XYZ files into Blender","archive_hash":"sha256:d8ec654a526001a29d0c4f7450b33d27ccc9c74fed9d665d8a8e61a052c1c268","archive_size":51000,"archive_url":"https://extensions.blender.org/download/sha256:d8ec654a526001a29d0c4f7450b33d27ccc9c74fed9d665d8a8e61a052c1c268/add-on-atomic-blender-pdb-xyz-v1.9.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/atomic-blender-pdb-xyz/","maintainer":"Blendphys","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Add-on expects to have access to filesytem."},"tags":["Import-Export"]},{"id":"geodesic_domes","schema_version":"1.0.0","name":"Geodesic Domes","version":"0.3.6","tagline":"Create geodesic dome type objects","archive_hash":"sha256:7ebd015a85ae9d7d93dcc8942b12da6b120949b550ef97d09b273388926118f0","archive_size":25222,"archive_url":"https://extensions.blender.org/download/sha256:7ebd015a85ae9d7d93dcc8942b12da6b120949b550ef97d09b273388926118f0/add-on-geodesic-domes-v0.3.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/geodesic-domes/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Add Mesh"]},{"id":"ui_animation_render","schema_version":"1.0.0","name":"UI Animation Render","version":"0.1.0","tagline":"Render animations of the Blender UI","archive_hash":"sha256:4cc58957a66ebe8d6649a4d2028ad6217c67b78e121e5e73e62ef739bf85eb29","archive_size":2426,"archive_url":"https://extensions.blender.org/download/sha256:4cc58957a66ebe8d6649a4d2028ad6217c67b78e121e5e73e62ef739bf85eb29/add-on-ui-animation-render-v0.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/ui-animation-render/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Render"]},{"id":"pov_at_ble","schema_version":"1.0.0","name":"POV@Ble (Legacy)","version":"0.1.6","tagline":"Persistence of Vision addon for Blender","archive_hash":"sha256:8bb572ce8ae30011dc8ba065980fe18c9f49b836b754b49578ab49c889ca0339","archive_size":302310,"archive_url":"https://extensions.blender.org/download/sha256:8bb572ce8ae30011dc8ba065980fe18c9f49b836b754b49578ab49c889ca0339/add-on-pov-at-ble-v0.1.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pov-at-ble/","maintainer":"POVαBle","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Requires access to directories with binary executables and sound"},"tags":["Render"]},{"id":"inset_straight_skeleton","schema_version":"1.0.0","name":"Inset Straight Skeleton","version":"1.1.0","tagline":"Make an inset inside selection using straight skeleton algo . . ","archive_hash":"sha256:1b7ac6364ed7bc8736a2fa5bd7da0f2c07a527a6b0a50aed4801671eddc5c553","archive_size":33199,"archive_url":"https://extensions.blender.org/download/sha256:1b7ac6364ed7bc8736a2fa5bd7da0f2c07a527a6b0a50aed4801671eddc5c553/add-on-inset-straight-skeleton-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/inset-straight-skeleton/","maintainer":"howardt","license":["SPDX:GPL-2.0-or-later"],"tags":["Mesh"]},{"id":"refine_tracking_solution","schema_version":"1.0.0","name":"Refine tracking solution","version":"1.1.6","tagline":"Refine motion solution by adjusting track weight","archive_hash":"sha256:d04ac43654a33c8c0a78c935479cefc4c052cae6092c565ef8bcefc412418a1f","archive_size":2210,"archive_url":"https://extensions.blender.org/download/sha256:d04ac43654a33c8c0a78c935479cefc4c052cae6092c565ef8bcefc412418a1f/add-on-refine-tracking-solution-v1.1.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/refine-tracking-solution/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Tracking"]},{"id":"assign_shape_keys","schema_version":"1.0.0","name":"Assign Shape Keys","version":"1.0.2","tagline":"Assigns one or more Bezier curves as shape keys to another . . ","archive_hash":"sha256:a4e428cf15b9d642308a6b1fab414544e2a061abb6758c78214c42889d0de7e1","archive_size":10143,"archive_url":"https://extensions.blender.org/download/sha256:a4e428cf15b9d642308a6b1fab414544e2a061abb6758c78214c42889d0de7e1/add-on-assign-shape-keys-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/assign-shape-keys/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Add Curve"]},{"id":"export_pointcache_formatpc2","schema_version":"1.0.0","name":"Export Pointcache Format(.pc2)","version":"1.1.4","tagline":"Export mesh Pointcache data (.pc2)","archive_hash":"sha256:5302170dc699eeaa9eb0528daba03574f99e178726cba33fda104885fd0f7805","archive_size":2683,"archive_url":"https://extensions.blender.org/download/sha256:5302170dc699eeaa9eb0528daba03574f99e178726cba33fda104885fd0f7805/add-on-export-pointcache-formatpc2-v1.1.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/export-pointcache-formatpc2/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Requires access to directory where it exports .pc2 file"},"tags":["Import-Export"]},{"id":"corrective_shape_keys","schema_version":"1.0.0","name":"Corrective Shape Keys","version":"1.0.0","tagline":"Creates a corrective shape key for the current pose","archive_hash":"sha256:23c5d539e6623f6ea266d5ca43738db668191314263480e4400944b1ed04ff19","archive_size":4821,"archive_url":"https://extensions.blender.org/download/sha256:23c5d539e6623f6ea266d5ca43738db668191314263480e4400944b1ed04ff19/add-on-corrective-shape-keys-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/corrective-shape-keys/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Animation"]},{"id":"freestyle_svg_exporter","schema_version":"1.0.0","name":"Freestyle SVG Exporter","version":"1.0.0","tagline":"Exports Freestyle's stylized edges in SVG format","archive_hash":"sha256:d72191a8ca5847a38e6114d6e66aa07573191ef76b14bea192efe2759921b60b","archive_size":7691,"archive_url":"https://extensions.blender.org/download/sha256:d72191a8ca5847a38e6114d6e66aa07573191ef76b14bea192efe2759921b60b/add-on-freestyle-svg-exporter-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/freestyle-svg-exporter/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Render"]},{"id":"edit_operator_source","schema_version":"1.0.0","name":"Edit Operator Source","version":"1.2.4","tagline":"Opens source file of chosen operator or call locations","archive_hash":"sha256:d1d29b06f1e0fe08fe8fa5e8802d4b3a7680af75652ca3f5f2b5f98c8d167ebc","archive_size":2897,"archive_url":"https://extensions.blender.org/download/sha256:d1d29b06f1e0fe08fe8fa5e8802d4b3a7680af75652ca3f5f2b5f98c8d167ebc/add-on-edit-operator-source-v1.2.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/edit-operator-source/","maintainer":"scorpion81","license":["SPDX:GPL-2.0-or-later"],"tags":["Development"]},{"id":"newtek_mdd_format","schema_version":"1.0.0","name":"NewTek MDD format","version":"1.0.3","tagline":"Import-Export MDD as mesh shape keys","archive_hash":"sha256:100f9d821900bd61ab16ffef061f9bde2162564f06ab01f07659e83cba142759","archive_size":4368,"archive_url":"https://extensions.blender.org/download/sha256:100f9d821900bd61ab16ffef061f9bde2162564f06ab01f07659e83cba142759/add-on-newtek-mdd-format-v1.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/newtek-mdd-format/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Requires access to directory with MDD format files"},"tags":["Import-Export"]},{"id":"demo_mode","schema_version":"1.0.0","name":"Demo Mode","version":"1.0.0","tagline":"Demo mode lets you select multiple blend files and loop ove . . ","archive_hash":"sha256:d54b9643f49a26032c9bdb35050143a818f9d0db629435a9a78e8d17198dde62","archive_size":9071,"archive_url":"https://extensions.blender.org/download/sha256:d54b9643f49a26032c9bdb35050143a818f9d0db629435a9a78e8d17198dde62/add-on-demo-mode-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/demo-mode/","maintainer":"campbell","license":["SPDX:GPL-2.0-or-later"],"tags":["System"]},{"id":"scene_information","schema_version":"1.0.0","name":"Scene Information","version":"0.3.1","tagline":"Show information about the .blend","archive_hash":"sha256:fdb4bfdbc9e07e2ab29404de0cbd8e746a09b271ec4359d2934063c30ff7afe6","archive_size":1816,"archive_url":"https://extensions.blender.org/download/sha256:fdb4bfdbc9e07e2ab29404de0cbd8e746a09b271ec4359d2934063c30ff7afe6/add-on-scene-information-v0.3.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/scene-information/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["System"]},{"id":"paint_palettes","schema_version":"1.0.0","name":"Paint Palettes","version":"0.9.4","tagline":"Palettes for color and weight paint modes","archive_hash":"sha256:8c144a176ec5f4bfc530a2847a6bbb460ddd6f10048226605da97ed51ef24321","archive_size":6133,"archive_url":"https://extensions.blender.org/download/sha256:8c144a176ec5f4bfc530a2847a6bbb460ddd6f10048226605da97ed51ef24321/add-on-paint-palettes-v0.9.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/paint-palettes/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Paint"]},{"id":"nuke_animation_format_chan","schema_version":"1.0.0","name":"Nuke Animation Format (.chan)","version":"1.0.0","tagline":"Import/Export object's animation with nuke","archive_hash":"sha256:9b6eed1f16c02a3ab7647f1f18160df19035a25c4a7fac6d05c70ea7a6de90c9","archive_size":4340,"archive_url":"https://extensions.blender.org/download/sha256:9b6eed1f16c02a3ab7647f1f18160df19035a25c4a7fac6d05c70ea7a6de90c9/add-on-nuke-animation-format-chan-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nuke-animation-format-chan/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Import-Export"]},{"id":"btracer","schema_version":"1.0.0","name":"BTracer","version":"1.2.4","tagline":"Tools for converting/animating objects/particles into curves","archive_hash":"sha256:5a29e1daf2b2a0d8e652c84c9b56c25b1f950d92c8a24b03de5b3aa9bdb98064","archive_size":17367,"archive_url":"https://extensions.blender.org/download/sha256:5a29e1daf2b2a0d8e652c84c9b56c25b1f950d92c8a24b03de5b3aa9bdb98064/add-on-btracer-v1.2.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/btracer/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"tags":["Add Curve"]},{"id":"web3d_x3d_vrml2_format","schema_version":"1.0.0","name":"Web3D X3D/VRML2 format","version":"2.5.1","tagline":"Import-Export X3D, Import VRML2","archive_hash":"sha256:74bcf2cb912af4be5db550f9486b4a0470b4513ef61d4df07ba091edd1441604","archive_size":100153,"archive_url":"https://extensions.blender.org/download/sha256:74bcf2cb912af4be5db550f9486b4a0470b4513ef61d4df07ba091edd1441604/add-on-web3d-x3d-vrml2-format-v2.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/web3d-x3d-vrml2-format/","maintainer":"Bujus_Krachus","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Required to access files for import/export","network":"Required to download web resources for import"},"tags":["Import-Export"]},{"id":"export_camera_animation","schema_version":"1.0.0","name":"Export Camera Animation","version":"0.1.2","tagline":"Export Cameras & Markers to a Python script","archive_hash":"sha256:fae5cacd489f79872e1dd8cce0b5ad8080f6bdfdc4633133d069157ac3d790ed","archive_size":2057,"archive_url":"https://extensions.blender.org/download/sha256:fae5cacd489f79872e1dd8cce0b5ad8080f6bdfdc4633133d069157ac3d790ed/add-on-export-camera-animation-v0.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/export-camera-animation/","maintainer":"Community","license":["SPDX:GPL-2.0-or-later"],"permissions":{"files":"Requires access to directory where it exports .py file"},"tags":["Import-Export"]},{"id":"cadbase_library","schema_version":"1.0.0","name":"CADBase Library","version":"0.3.0","tagline":"Add-on enables data sync with remote storage (cloud)","archive_hash":"sha256:395e335930e4537a2d742750f571c2dbf12c6a9475d2deb22bbe92bfe819f7be","archive_size":190158,"archive_url":"https://extensions.blender.org/download/sha256:395e335930e4537a2d742750f571c2dbf12c6a9475d2deb22bbe92bfe819f7be/add-on-cadbase-library-v0.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cadbase-library/","maintainer":"mnnxp","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export library data from/to disk","network":"Need to to sync library data with a remote server","clipboard":"Copy component link to clipboard"},"tags":["Import-Export"]},{"id":"forts_map","schema_version":"1.0.0","name":"Forts Map Importer","version":"1.0.1","tagline":"Import Forts Map","archive_hash":"sha256:4657348ef634c9404c900accbe3cbc7799952cb8416f5afd6f24939483de4b66","archive_size":4234,"archive_url":"https://extensions.blender.org/download/sha256:4657348ef634c9404c900accbe3cbc7799952cb8416f5afd6f24939483de4b66/add-on-forts-map-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/forts-map/","maintainer":"Gonnetz","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Import-Export"]},{"id":"democap_tools","schema_version":"1.0.0","name":"DEMoCap Tools","version":"1.0.4","tagline":"Tools for importing DEMoCap motion captures into Blender","archive_hash":"sha256:645fcf063891b4973ac5b1cd96e8ae229586ea53a08ec4650191b4f892d9ba0e","archive_size":114185,"archive_url":"https://extensions.blender.org/download/sha256:645fcf063891b4973ac5b1cd96e8ae229586ea53a08ec4650191b4f892d9ba0e/add-on-democap-tools-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/democap-tools/","maintainer":"DragonDreams","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Loading motion capture files","network":"Connect to DEMoCap (Live Connection)"},"tags":["Import-Export","3D View","Object","Animation"]},{"id":"dragengine_tools","schema_version":"1.0.0","name":"Drag[en]gine Import/Export","version":"1.29.1","tagline":"Import/Export Drag[en]gine Resources including helper tools","archive_hash":"sha256:b72e32bc0067170ec0865d3dc1eef9a487235043d566b286c85456f00189b14a","archive_size":115706,"archive_url":"https://extensions.blender.org/download/sha256:b72e32bc0067170ec0865d3dc1eef9a487235043d566b286c85456f00189b14a/add-on-dragengine-tools-v1.29.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dragengine-tools/","maintainer":"DragonDreams","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Importing/Exporting resources"},"tags":["Import-Export","3D View","Mesh","Object","Animation"]}],"version":"v1"} \ No newline at end of file diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/bl_ext.user_default.blenderkit_updater_status.json b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/bl_ext.user_default.blenderkit_updater_status.json index 2687bab..413e40f 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/bl_ext.user_default.blenderkit_updater_status.json +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/bl_ext.user_default.blenderkit_updater_status.json @@ -1,9 +1,17 @@ { - "last_check": "2026-04-02 12:41:20.491300", + "last_check": "2026-04-12 17:36:29.915633", "backup_date": "April-2-2026", - "update_ready": false, + "update_ready": true, "ignore": false, "just_restored": false, "just_updated": false, - "version_text": {} + "version_text": { + "link": "https://github.com/BlenderKit/BlenderKit/releases/download/v3.19.2.260411/blenderkit-v3.19.2.260411.zip", + "version": [ + 3, + 19, + 2, + 260411 + ] + } } \ No newline at end of file diff --git a/extensions/www_blenderkit_com/.blender_ext/index.json b/extensions/www_blenderkit_com/.blender_ext/index.json index 0799e0b..4a5921e 100644 --- a/extensions/www_blenderkit_com/.blender_ext/index.json +++ b/extensions/www_blenderkit_com/.blender_ext/index.json @@ -1 +1 @@ -{"data":[{"id":"blenderkit","name":"BlenderKit [FREE]","tagline":"BlenderKit official add-on","version":"3.19.1-260402","type":"add-on","archive_size":38761984,"archive_hash":"sha256:030ca5e4512902e7da7f1ae1ae58d3f60d9bca673ad671f9af451269d5d25d8c","archive_url":"https://www.blenderkit.com/addon-download/blenderkit.zip","blender_version_min":"4.2.0","maintainer":"Petr Dlouhý","tags":["blenderkit"],"license":["gpl"],"website":"https://www.blenderkit.com/get-blenderkit/","schema_version":"1.0.0"},{"id":"threed_print_prep_wizard","name":"3D Print Prep Wizard [FREE]","tagline":"Auto-detect thin walls, non-watertight meshes, overhangs; offer fixes","version":"0.1.1","type":"add-on","archive_size":3221,"archive_hash":"sha256:290e3502ded6546478da53ca321a15e1594a2b2bcef260bc02bc9cfcbcd28c31","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/bd4dac1f-f36d-4316-8680-efe9f4bb23d1/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Soroush Amelzendedel","tags":["3DPrint","MeshRepair","Workflow","Utility","Addon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a85bc12b-33c3-46d0-a7b7-ed15cc5689c3/","schema_version":"1.0.0"},{"id":"ThreeMF_io","name":"3MF Import/Export with Material/Paint data [FREE]","tagline":"Import and export 3MF - Material and Paint supported, Orca/Bambu Prusa/Super slicers all supported, many features included.","version":"2.1.0","type":"add-on","archive_size":213125,"archive_hash":"sha256:d8c1351cd01e5a3c21e0ab6674c8b4f5260bebe6002157564dba08133d43f45c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9630ecf0-e687-4aa8-b725-cd91a7023704/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Clonephaze Smith","tags":["3mf","multicolor","3d","print","import","export"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9a5b095b-304a-461f-b3ec-6e4a8044f9c0/","schema_version":"1.0.0"},{"id":"ActionBlocks","name":"Action Blocks - Preview [FREE]","tagline":"Use nodes to quickly create animation variations, block outs, game cinematics, background assets, instructional videos and animatics using animation and mocap libraries such as Mixamo or your own Action assets.","version":"2.0.2","type":"add-on","archive_size":2854741,"archive_hash":"sha256:d925ad69670118b04c21d28ab90bc39e60c434b8b6ba403d59b863459b51c812","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/81dbf135-1be2-4ffe-a9c5-b039e4cf4103/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Other Realms","tags":["Animation","nodes","mocap"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0b612037-1902-43e0-9a4c-1189bf7315de/","schema_version":"1.0.0"},{"id":"addon_install_button","name":"Add-on Install button [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"1.0.1","type":"add-on","archive_size":1751,"archive_hash":"sha256:a048d9b9d6565cd2529473da667423ad920b7eed03114ce6ecdc801a6377e12b","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6c24661e-b400-4caa-8152-e69f7323bf86/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Grimmotron","tags":["UI","legacy","install","button"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/11a6fbc6-93ea-4e3a-a61f-d3b54878701a/","schema_version":"1.0.0"},{"id":"advanced_plot_equation","name":"Advanced Plot Equation [FREE]","tagline":"Plot explicit, parametric curves & surfaces in Blender","version":"1.3.0","type":"add-on","archive_size":951033,"archive_hash":"sha256:66e4575e3eb0739897f1ea0fda81ae9c9884fb525b355b651ff31adc5c1305a5","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9ccce277-2d26-445d-96b1-4c7b5d3c5ba9/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Soroush Amelzendedel","tags":["plotting","visualization"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f1f71ba8-847f-4dd4-a0b6-fc957ff608be/","schema_version":"1.0.0"},{"id":"ai_material_generator","name":"AI Material Generator [FREE]","tagline":"Generate seamless PBR materials from text prompts","version":"0.2.0","type":"add-on","archive_size":3855,"archive_hash":"sha256:87a4d1d421f9065336845998c3ac5f4967d4b521f2d0f3ac8b6f020747a5b1dc","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f63360ca-ffdf-4ad3-bbd3-1f769c0392eb/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Soroush Amelzendedel","tags":["Material","PBR","Textures","AI","StableDiffusion","HuggingFace"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5db37e26-e59f-4638-bf34-1993d171ac70/","schema_version":"1.0.0"},{"id":"render_estimator","name":"Animation Render Time Estimation [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"2.3.0","type":"add-on","archive_size":3561,"archive_hash":"sha256:f40d8268bc11f6b7b294dbd9c0f2e14322365857fc5aaa0be35e84fd82dcedea","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/395dad33-5261-443a-9d42-11dc2de83075/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"UnicornHunter MC","tags":["render","animation","time","progress"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/27990883-4149-4ae1-9a9e-a25ffdb50f16/","schema_version":"1.0.0"},{"id":"annotate_to_christmas_lights_gn","name":"Annotate to Christmas Lights (GN) [FREE]","tagline":"Convert Annotate strokes into non-destructive Christmas lights with Geometry Nodes: spacing, wire radius, palettes/random colors, align-to-curve & random roll, plus custom bulb assemblies (children supported).","version":"0.4.5","type":"add-on","archive_size":9390,"archive_hash":"sha256:d283cea78c26d58101e5ba437df4a2e0ac222065039dd4ff33a9f0edb03c7b16","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f9a3918a-02d1-426b-ba81-03df1a150136/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Soroush Amelzendedel","tags":["GeometryNodes","GreasePencil","Annotate","Lighting","Procedural"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b865fd92-7f89-4ca8-8e86-de85511de369/","schema_version":"1.0.0"},{"id":"SK0001","name":"Arrange objects evenly in a circle [FREE]","tagline":"The addon arranges all selected objects evenly in a circle. The radius and orientation of the circle (X, Y, Z axis) can be controlled.","version":"1.0.0","type":"add-on","archive_size":1497,"archive_hash":"sha256:89883f484061eeaa1d810a7675211f87a62807f7d59e7e6bc4f10ed949595421","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/8d448a51-4290-4168-9891-a20db1909950/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Steffen","tags":["circle","align","even","objects","round","circular","automation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5f94585d-ce76-49e1-b390-4fd6696c2d80/","schema_version":"1.0.0"},{"id":"aspect_ratio","name":"Aspect Ratio [FREE]","tagline":"A Blender addon for managing aspect ratios and camera settings with an intuitive interface and quick access pie menu.","version":"1.0.2","type":"add-on","archive_size":7039,"archive_hash":"sha256:d9323c5ba0a4a3d6443a0091369f3e77a541dcfe14910bf13c54b90c97c55e97","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/24a7395a-67d2-46aa-a21a-613f801a21f4/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Dimona Patrick","tags":["Render","render"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/13ae67a5-e751-4e40-99f0-b3e4631d9f97/","schema_version":"1.0.0"},{"id":"babylon_scene_preview","name":"Babylon Scene Preview Pro [FREE]","tagline":"All-in-one .glb exporter & live-preview with screenshot + grid toggle + Blender-style grid.","version":"0.2.3","type":"add-on","archive_size":3489,"archive_hash":"sha256:ee0eb525953c0cf7c259636f1b747bc94c5e5f324bd61a1b54fd3c68bfa608bd","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e827736b-8659-4afa-a9de-bf4974f06fb5/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Soroush Amelzendedel","tags":["glTF","Export","Live","Preview","Screenshot","Grid"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/1bfa2a9d-f914-4264-9629-ae083b18789d/","schema_version":"1.0.0"},{"id":"Bagapie","name":"BagaPie [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"10.4.7","type":"add-on","archive_size":10378340,"archive_hash":"sha256:c80359064314761b9fb4bc3198e36d80ac64d4634f2aa2e54210988836d6cad6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/8ee1a84e-fe6e-44a7-b710-be7c9355ed45/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Antoine Bagattini","tags":["scatter","ivy","architecture","addon","free","array","window","stairs","environment","scattering"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/fd109ea6-b261-4aaa-b572-c69ee296d86c/","schema_version":"1.0.0"},{"id":"basedplayblast","name":"BasedPlayblast [FREE]","tagline":"Easily create playblasts within Blender and Flamenco","version":"2.6.2","type":"add-on","archive_size":48968,"archive_hash":"sha256:c359a24fccb10b9d8df2941b0d75435eb0f7ac89db61836edb6d993b86354952","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d0f24e8e-5666-4821-81f7-b68d63379f03/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"RaincloudTheDragon","tags":["Animation","Render","Workflow","Video"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/967c5989-0d66-402a-a1ca-56be2299f718/","schema_version":"1.0.0"},{"id":"batch_render_manager","name":"batch_render_manager [FREE]","tagline":"A Blender addon for efficient batch rendering from multiple cameras with advanced project management features.","version":"1.0.0","type":"add-on","archive_size":14882,"archive_hash":"sha256:9be8f16641985d1efab5f68c4d5c3a1b36c5a0f7a373df1a2f5aa3f13e5a909b","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f1bb5147-c249-4eea-b7f5-98b2599cfa59/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Dimona Patrick","tags":["batch","management","rendering","render"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/476811fa-611c-4869-8653-14a830376e63/","schema_version":"1.0.0"},{"id":"BRVLayers","name":"Batch Render View Layers [FREE]","tagline":"Create multiple render jobs, each with its own specific View Layer, Camera, and Frame Range.","version":"1.2.3","type":"add-on","archive_size":4335,"archive_hash":"sha256:63187cc826a44655a1f20a4647aacf7c6967bf7007b91ceeb7291725dff35f17","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6090842f-0113-4d5d-a1c2-fab6f6a877ab/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Kin Chen","tags":["Batch","Render","ViewLayer","Queue"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/052f32bc-4fdb-412c-8eb9-cd158434f84e/","schema_version":"1.0.0"},{"id":"shader_switcher","name":"Blender Shader Switcher Addon [FREE]","tagline":"The Ultimate Shader & Color Switcher Node System\nMake your shader setups smarter, cleaner, and ultra-flexible — without node clutter.","version":"4.0.2","type":"add-on","archive_size":11114,"archive_hash":"sha256:03b4aed110d4613695a60fd94fd8f7a8d98c358dd5f2b2a813afc093ff642640","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cbff50ec-bbc5-40d4-99c3-633e110c502c/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Aimen Zaied","tags":["Node","ShaderEditor","Materials","Shading"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/3466f4d7-caf6-45a9-b9ac-b3bcaccc9920/","schema_version":"1.0.0"},{"id":"BLeQ_Extension_Pro","name":"BLeQ Extension Pro [FREE]","tagline":"The Extension offers a simple queue manager and will provide more free features in the future. Other than that it provides a bridge between the free standalone app BLeQ and Blender, so you can work on your project while rendering in the background.","version":"1.0.10","type":"add-on","archive_size":250484,"archive_hash":"sha256:bf085ebb4ee8bbfd3e719d16347eb37a4db4d93c356e9af640cf6e815df0cc16","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/185528b1-8b6e-49d5-82ad-57aa1036d5de/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Christian Makarski","tags":["Queue","Pipeline","Renderqueue","Sequence","Rendersequence","chain","Rendermanage"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d7529892-10a8-4f96-86de-933d584bb9f5/","schema_version":"1.0.0"},{"id":"fbx_vault","name":"Bulk FBX Importer [FREE]","tagline":"FBX Vault is a bulk FBX importer for Blender that lets you load multiple FBX files at once, saving time and streamlining your workflow.","version":"1.0.0","type":"add-on","archive_size":1858,"archive_hash":"sha256:3c9b99fda4e7b5345fbf151c0db1fc14bdb7bcce44f65753ba4c14bb8f4d0666","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/7723df72-9455-4901-b89e-4fdf1aae86c9/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Zuhaib Khoso","tags":["addon","tool","fbx","blender","import","management","bulk"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/87284cbd-2f95-44d8-9e38-c7ccaa07354c/","schema_version":"1.0.0"},{"id":"Cad_measure_extension","name":"Cad measuring tool [FREE]","tagline":"It's a geo nodes based tool that lets you make measurements and render them with ease","version":"2.0.0","type":"add-on","archive_size":251303,"archive_hash":"sha256:fdc1a528d7808c897d7cf3469b09921a5b29174cfa6293400f82a1cd0eb65efb","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4747fbe1-c279-4462-8854-2f6175d70c38/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Mr.Nobody covers.mp4","tags":["blender","measure","geonodes","geometry"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/87bc995f-2eff-4b3f-8561-fb73086b4c9a/","schema_version":"1.0.0"},{"id":"Cake_Particles","name":"Cake Particles [FREE]","tagline":"Allows you to bake the motion of particles into key-framed objects animations. (❁´◡`❁)","version":"4.3.0","type":"add-on","archive_size":6791,"archive_hash":"sha256:eab0f22f85eeb43acd57024e2f967002c09f335c83a8163bcc64ff0005fa7510","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/671368cd-1458-4197-81d1-9049ada81ac1/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Scary Plasmon","tags":["Animation","Objects","Simulation","Physics","Baking"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/82e87770-6569-4873-bef5-8621a1fecdc9/","schema_version":"1.0.0"},{"id":"SK0005","name":"Camera bookmark manager [FREE]","tagline":"Remember camera positions and orientation and conveniently assign them to another camera.","version":"1.0.0","type":"add-on","archive_size":1838,"archive_hash":"sha256:c066fafb8e07e092ad7f5f806f042f71662cc6183657be1ef1f2a0c861cc08f5","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6bcc1463-538f-46c1-8dff-a765955fa97b/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Steffen","tags":["camera","bookmark","manager","position","rotation","workflow","animation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/1a9af258-e75e-44c8-81e9-869249addb8d/","schema_version":"1.0.0"},{"id":"nfc_card_keychain_generator","name":"Card/Keychain w/ Custom Design and QR Generation and opt. NFC Cavity for 3D Printing [FREE]","tagline":"This add-on lets you design 3D-printable housings for NFC chips. You can add your own logos or icons (Wi-Fi symbol, social media logo, etc.), or use the built-in QR generator to put a backup code directly on the surface of the print.","version":"1.2.2","type":"add-on","archive_size":513576,"archive_hash":"sha256:61fc9b726002f7cd17ffb5b1e54bfa1827e8edf538881e72749f4faf931dc384","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/992bef23-da87-44ec-a710-bc61d13aa8b9/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Clonephaze Smith","tags":["nfc","qr","card","generator","keychain","custom"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/09bd7d56-efdb-4e25-b4d8-68c8ee65f422/","schema_version":"1.0.0"},{"id":"centerocd","name":"CenterOCD [FREE]","tagline":"CenterOCD is a simple Blender addon that aligns selected objects above the grid center based on their combined bounding box center while preserving their spacing, helping keep your scenes clean and perfectly organized.","version":"1.0.0","type":"add-on","archive_size":1490,"archive_hash":"sha256:607cf00fe41582b4eaeb640cb6ad8dc9944731be643022c810fbb2a799abef0b","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3753d182-5607-44fe-a376-6bdbf0bde2f5/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Mostafa Heikal","tags":["align","center","grid","haykol"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8a92d1eb-c1c8-4357-886d-5c765a1214d1/","schema_version":"1.0.0"},{"id":"cgaxis_blender_addon","name":"Cgaxis Add-On For Blender - Browse & Import Assets Directly In Blender [FREE]","tagline":"Browse 12,500+ Premium Assets directly in Blender and Get started for free - over 120 assets are available at no cost.","version":"1.0.0","type":"add-on","archive_size":135827,"archive_hash":"sha256:d2d49d2c9665add7c55181a343759dde9bfa5de723d4bb3075b93694822d46ac","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2c135e35-0484-4805-8562-7d9eb8705471/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"CGAxis","tags":["assets","pbr","material","3d","models","hdri","decals","browser","imperfections","plugin"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f8432983-2d65-4d16-a7ef-36ee5fcc7220/","schema_version":"1.0.0"},{"id":"img_alpha_to_bsdf","name":"Connect image alpha [FREE]","tagline":"Connecting image alpha to shader alpha","version":"1.0.6","type":"add-on","archive_size":2692,"archive_hash":"sha256:a0d765b49e728e95012895af1bb54d12c3b4ac68ab649115685c8b4d9eb65e02","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b4b1a347-b3e0-4ec8-96e8-7039f03d475a/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Snaky Boop face","tags":["automation","automate","node","material","image","alpha","QofL"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5d0c171c-9ff3-4834-b610-0b39d8fd0191/","schema_version":"1.0.0"},{"id":"Copy_transforms_extension","name":"Copy Transforms [FREE]","tagline":"The Copy Transforms add-on mimic the Autodesk Maya copy transform functions. The operations only work in Object Mode and can be done between objects, lights and cameras. Plug-in updated to version 2.0.","version":"2.0.0","type":"add-on","archive_size":1925,"archive_hash":"sha256:0b5ea205238edbd92d77f10ac909b9e66fda38c14bdc05a52e4253c10bece865","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ea9ad2d2-eb15-4da2-b5e5-531c34a7e8c4/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Luiz Lobato","tags":["Object","transforms","location","rotation","scale","copy","camera","lights"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e4d8305e-3eca-477f-8b08-afa17bf621ce/","schema_version":"1.0.0"},{"id":"CountDown3d","name":"Countdown 3d [FREE]","tagline":"Quickly add customizable 3D timers (countdown or count‑up) to your Blender viewport.","version":"1.5.0","type":"add-on","archive_size":4799,"archive_hash":"sha256:49bbf5981614ed4fef283a4501654b98312dc61ea0790cab12e856f66f875a84","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a8071da5-87fe-4105-9961-f926ec69b81b/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Fabio Malvaldi","tags":["3D","Countdown","Customizable","UI","Python","Script","Animation","TextObject","counter","Timer"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/cafb5d64-82e6-45d5-ae1f-2a6c504a3838/","schema_version":"1.0.0"},{"id":"Delete_Loose","name":"Delete Loose [FREE]","tagline":"with this handy addon, you eliminate smaller and loose parts of a mesh while keeping the largest parts intact. In object mode, go to Object ---> click delete loose. It operates on the selected layer and leaves the largest mesh by volume intact.","version":"1.2.3","type":"add-on","archive_size":2391,"archive_hash":"sha256:9fdf99f92ab399377ec92a0d3bf25bce5891384b9a0ed61ce8def18314b60f58","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d46ee8be-144e-4a60-be40-4b348539e4e0/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Łukasz Wilkoń","tags":["cleaning","cleanup","topology","fix","fixing"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a88d7b63-11e7-4415-b717-8944eef0bd63/","schema_version":"1.0.0"},{"id":"delete_static_animation_channels","name":"Delete Static Animation Channels [FREE]","tagline":"Automatically identify and remove redundant F-Curves with constant keyframe values to clean up and optimize your animation data on a click.","version":"1.0.0","type":"add-on","archive_size":2873,"archive_hash":"sha256:9d0cb8dbcfadb9e4e70c7ba952299be23f179d4d458951db659f0a5a551f7670","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0e649649-adc7-40c7-b56b-b0a0f22d94f6/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Vaishakh Vinod","tags":["Animation","graph","cleanup","fcurve","mocap","motioncapture"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f7a51ab2-f758-464f-817b-ad010cb643bd/","schema_version":"1.0.0"},{"id":"easy_batch_render","name":"Easy Batch Render [FREE]","tagline":"Easiest Blender Addon Available for Batch Render !!\nAutomatically render all Blender files from a folder with one click","version":"1.0.1","type":"add-on","archive_size":6875,"archive_hash":"sha256:15e7ff505530560cfdb9177046e0d8473413f8a80777e46f4ff50bcbc6ad0142","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a426042c-2fcd-4829-a53e-7527987b17fd/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Vaishakh Vinod","tags":["Render","Pipeline","Workflow","Batch","Automation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/03b93d66-510b-441b-a0d3-14b5935f5e32/","schema_version":"1.0.0"},{"id":"easy_scatter_tool","name":"Easy Scatter Tool [FREE]","tagline":"Easy Scatter Tool is a Blender add-on that scatters one object across the surface of another mesh.","version":"1.0.0","type":"add-on","archive_size":4790,"archive_hash":"sha256:2aad46cd10d876e3ab5d5f69a927c9b423a0f2d14eb47fbedbd6c380f65293cc","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a7cdf987-8b42-47e9-a066-3e407ebf0512/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Jungle Ham","tags":["Object","Modeling","Workflow"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f31d8f0b-ee2b-45ec-9f4b-4aae75a7160f/","schema_version":"1.0.0"},{"id":"facemesh_capture","name":"FaceMesh Capture (MediaPipe) [FREE]","tagline":"Create a textured FaceMesh from webcam or photo using MediaPipe, with live tracking and real-time updates for mesh creation. Perfect for facial recognition, animation, and 3D modeling.","version":"0.4.0","type":"add-on","archive_size":11286,"archive_hash":"sha256:8714eff32dcda7ff8fc554d0714ae815805c17f6def1b4e45027d6ff0e3a9dc8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/aa5efe63-320f-4551-af8c-e3bd2070cb2d/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Soroush Amelzendedel","tags":["Mesh","Animation","3DView","UV"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9b174a1c-d3c5-4979-b36a-cbfc40616f5e/","schema_version":"1.0.0"},{"id":"flicker_light_fixed","name":"Flickering Light Simulator [FREE]","tagline":"Customizable flickering light animation with multilingual support","version":"2.0.0","type":"add-on","archive_size":4059,"archive_hash":"sha256:77bbac7d17fd132350d9bf065ef2c2de2f4f575fec639d72149d7cb0d5ab77d3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2ad04975-a7e3-40f3-84a5-adfac5baf07c/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Fabio Malvaldi","tags":["Light","Flicker","Animation","Localization","UI"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7d69be65-9004-4469-bd9c-beb29e1ec99b/","schema_version":"1.0.0"},{"id":"FlowProManager","name":"Flow5 - The Ultimate Asset Tool [FREE]","tagline":"Flow5 is the amazing (and FREE!) workflow tool that helps you with building your scenes, creating asset libraries, manage your assets and even more! Already trusted by thousands of users\n\nLearn more at: https://polyspaace.com/addons/flow","version":"5.0.0","type":"add-on","archive_size":25883632,"archive_hash":"sha256:ee9f76ec9d62951f7b6be33eb4ee99f29167b11ad6b699b6f3eaaa0ae124cd81","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2891cad9-7a8d-405f-900b-880632488fdd/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"polyspaace","tags":["assets","flow","workflow","scatter","asset_browser","asset_library","polyspaace"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/542f1515-6422-4da3-bf4d-05803f890e1b/","schema_version":"1.0.0"},{"id":"graph_editor_timeline_controls","name":"Graph Editor Timeline Controls [FREE]","tagline":"Adds Timeline playback controls (Play, Reverse, Pause, Frame Start/End, Current Frame) directly into the Graph Editor header for faster animation workflow.","version":"1.0.0","type":"add-on","archive_size":2292946,"archive_hash":"sha256:b77a68f7e34b9c5f9c66fafef6825a0575fe8605c8da51a567dff3cd94fa358f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f2c93a71-097b-4054-8067-f2b58e3b2572/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"NOOB 3D","tags":["animation","graph","editor","timeline","playback","ui","workflow","keyframe","animation","userinterface"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/26a86759-a4b3-4545-ad67-106a89737f54/","schema_version":"1.0.0"},{"id":"item_transform","name":"item transform [FREE]","tagline":"A Blender addon that provides quick transform operations for selected objects with an intuitive interface and additional utility functions.","version":"1.0.2","type":"add-on","archive_size":6957,"archive_hash":"sha256:6a78724c1d6cb68d9a691c6f2e8403844860a064f9257d0b22eac7a124bc7ecf","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cccfe7d1-1df5-4927-87af-a10e00a1c34e/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Dimona Patrick","tags":["Modeling","Object"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b97c7a3c-93cb-4cea-8186-6e1cbcb47bd5/","schema_version":"1.0.0"},{"id":"joinforce_render","name":"JoinForce Animation Render [FREE]","tagline":"This add-on helps you use all your computers to render animation all together, like network rendering but limited to a local or shared folder (e.g., a NAS drive). Collaborate with others and speed up your production.\n\nPreparation → Render → Collect.","version":"1.3.1","type":"add-on","archive_size":6538,"archive_hash":"sha256:afe900cdb0a244c3f4aadab240cbfc5ce0942f68673803924e7ed72d4023d406","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/21a1e2f2-a21d-4ea2-87a6-01d906bc50a1/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Liam Xee","tags":["pipeline","Batch","rendering","animation","cloud","Production","Computing","Workstation","Team","Network"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/74798440-6854-4a90-9872-ec08da8d0ce3/","schema_version":"1.0.0"},{"id":"k_tools_render_preset_manager","name":"K-Tools Render Preset Manager [FREE]","tagline":"An easy and intuitive for saving, loading, and managing complete render setting profiles for Cycles, EEVEE, and Workbench. This tool is designed to streamline your workflow, allowing for quick, consistent, and reversible changes to your rende","version":"1.1.1","type":"add-on","archive_size":54772,"archive_hash":"sha256:2ef9d7ad94bce0ff2e811677230a5daa4f8fc607fa1123478d923f624fa933d0","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6f054995-d5d9-4718-90b7-5c191d22a671/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Robert Kezives","tags":["render","preset","cycles","addon","load","save"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8626f2ca-193c-4f15-8011-200c5d0a2e9b/","schema_version":"1.0.0"},{"id":"marker_highlight_pro","name":"Marker Highlight Pro [FREE]","tagline":"allows you to add highlight color to your marker text for easy navigation in the timeline.\n\nselect marker then press n to be able to set the color of the marker highlight","version":"1.0.0","type":"add-on","archive_size":2046,"archive_hash":"sha256:46ac6e96e5eb3cda09a1ad70342f492abcc28b276ceba020a2c891e50c016820","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1745b88d-d4cf-4386-b84d-747b41186e07/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"saman","tags":["marker","color","markercolor","colour","coloured","markermanager"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e5ceb861-fa61-4aec-8605-f585df3ebf48/","schema_version":"1.0.0"},{"id":"SK0002","name":"Material Organizer [FREE]","tagline":"Overview of all materials in the scene. Easy deletion of unused materials. The list can also be sorted by name, used or unused, procedural, and size. Finally, a tidy material library again - very helpful, especially in large and complex scenes.","version":"1.0.0","type":"add-on","archive_size":2026,"archive_hash":"sha256:07c076a2f8e842a5eb167a7e90f64a5805ccd2582d78625da664d833a61e1b82","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4e5281c0-822c-4625-a151-02acbe8fd7e5/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Steffen","tags":["Material","organizer","overview","delete","help","sort","list","shader"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/21a85005-f5d1-4f4b-9e9a-5087838d1a44/","schema_version":"1.0.0"},{"id":"material_overrider_plus","name":"Material Overrider Plus [FREE]","tagline":"What this add-on does\n\nThis tool allows you to apply a material override while keeping specific objects or collections untouched. Instead of overriding the entire scene, you decide exactly what gets affected.","version":"1.0.0","type":"add-on","archive_size":3357,"archive_hash":"sha256:e2d67029d11cce5015292769e3e51198c442b955e0d127c0c4d74714ea1e4f30","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6cac86f1-2bc6-4f5f-92d9-488dd33c7a17/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Brahim Houari","tags":["override","materialoverride","overrider"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/41e0e1c8-7940-4ebe-9ed5-67a9144c7365/","schema_version":"1.0.0"},{"id":"ColorFromMaterial","name":"Material Viewport Color from Nodes [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"0.1.3","type":"add-on","archive_size":23002,"archive_hash":"sha256:bb0e68146c79fe2c4b5c1c6e91cb5945c9303dc3a4f9920d2e1ba60d5561a936","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/88edb35c-c79a-4263-9cc9-082f6282f1a6/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Spencer Magnusson","tags":["color","material","metallic","roughness","viewport","workbench"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/15250641-5030-4e65-8988-385adbee7a04/","schema_version":"1.0.0"},{"id":"math_3d_equations_pro","name":"Math 3D Equations Pro [FREE]","tagline":"Math 3D Equations Pro lets you turn math formulas into 3D geometry: plot functions, parametric curves/surfaces, implicit fields (with marching cubes), and strange attractors directly inside Blender.","version":"1.3.0","type":"add-on","archive_size":10274,"archive_hash":"sha256:1293382cde627aa9f16c8c25e9e2e2775ee8b1793ebf672f87ccbc60e5f672cf","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0bb57bc4-d52a-4d17-a038-3c6b44fca17f/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Soroush Amelzendedel","tags":["Mesh","Curves","Math","Procedural","Scientific","Visualization"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0b934918-ccac-45f9-9502-5190908b13c9/","schema_version":"1.0.0"},{"id":"maya_viewport_operation","name":"Maya Viewport Operations [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"1.0.0","type":"add-on","archive_size":18860,"archive_hash":"sha256:67f88925c3fee1af6c056e2b82ef80dc18167d8735381c3af54434a5dedc6c9d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c1148a64-7337-4872-86b7-57a990df5300/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"TinkerBoi","tags":["maya","smooth","preview"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/427e1d25-6b74-487b-bb39-856e70a74ea5/","schema_version":"1.0.0"},{"id":"maze_generator","name":"Maze Generator [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"1.11.0","type":"add-on","archive_size":6240,"archive_hash":"sha256:40c08393a2402f4a5f24c4b12f3baae24eba9b7d97b48a72283e7e94c3892669","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f1ed3d85-db05-4f7f-a0e8-f7d87cae2e39/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Giorgi Samukashvili","tags":["Procedural","Maze","Modeling","Geometry","Nodes","Curves","Addon","Blender","Game","Algorithm"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/88fb5e50-584d-4b24-ad32-5f2c24634963/","schema_version":"1.0.0"},{"id":"measure_and_scale","name":"Measure and Scale [FREE]","tagline":"Measure and Scale object uniformaly","version":"1.1.4","type":"add-on","archive_size":8680,"archive_hash":"sha256:355656e1c08f41bfb3eb4886ddd61af3476e0a8a0fa667dfe8635f207d5d8263","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/78183613-8e2a-4d4e-ad99-76c342df4080/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"belaid ziane","tags":["modeling","measurements","scale"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/82da7c42-ce33-4be3-82ea-a58b31880502/","schema_version":"1.0.0"},{"id":"MeLiDA","name":"MeLiDA - Measure LiDAR System [FREE]","tagline":"MeLiDA integrates LiDAR sensors with Blender to create professional surveys of buildings, structures, and their relics—built for architects, constructors, conservators of monuments, archaeologists and engineers.","version":"0.1.0-beta","type":"add-on","archive_size":107115,"archive_hash":"sha256:fc2a66562a83772e8752a1d4acad647634ef20c09e117578924b3adc62d249f5","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/44944eb3-0fb2-4ec9-9fea-88c9e6edc23b/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"MeLiDA","tags":["point_cloud","laser_scan","survey","building_surveys","LiDAR","scanning","measure_device","stl_14p","stl_19p","d500_lidar_kit"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/20da5129-5479-4f45-a450-ef70cfc0ee5e/","schema_version":"1.0.0"},{"id":"multi_object_export","name":"Multi Object Export [FREE]","tagline":"Export multiple selected objects individually in one click using Blender's native exporters.","version":"1.3.0","type":"add-on","archive_size":7107,"archive_hash":"sha256:54acc7d04a2938e3da46c303d15f131960209d60c4e91fb8792410ff4342c04f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/16a86afb-d33f-488c-a772-1308bf8241b6/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Fabio Malvaldi","tags":["Object","Workflow","Export","MultiExport"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/125220ca-109c-4105-9ac3-cac4fedc9985/","schema_version":"1.0.0"},{"id":"music_generator","name":"Music Generator [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"1.0.0","type":"add-on","archive_size":93889081,"archive_hash":"sha256:e91db7197c1eecad6e40aee9fcfff703406b6b0dd67a75466a9854bbd46d9ae1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/46174bc3-0515-46b9-b0cc-4aa0f24e6cd1/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Music","Audio","Generation","Sequencer","Sound","AI","MusicGen","Gradio","Synthesis","Creation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9076e710-cedc-4b37-92b2-16b38fa0997b/","schema_version":"1.0.0"},{"id":"node_color_tools","name":"Node Color Tools Pie [FREE]","tagline":"Elevate your workflow with the Pie Menus of Node Color Tools Pie, the add-on for managing node colors in Blender. Designed for clarity and speed, this tool allows you to color multiple nodes at once, making it easier to navigate complex node trees.","version":"1.0.3","type":"add-on","archive_size":4752,"archive_hash":"sha256:e59fd49dbc701c9f45705e7f28dcf4d5d93dc13bf8820a5c8bf813a50c33b1e7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/66128702-2ca7-413d-b245-accb9e1b447b/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Johannes Kollmer","tags":["Colors","UserInterface","UI","Organize","Pie","PieMenu","Menu","Nodes","Node"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/37d15d8e-ba8d-470d-8c06-f8d7c75424c9/","schema_version":"1.0.0"},{"id":"number_generator","name":"Number Generator [FREE]","tagline":"Create sequential numbers as text objects","version":"0.1.0","type":"add-on","archive_size":2339,"archive_hash":"sha256:dbf74bb429c01aaa0b0a77e6ca987c3e75093c20daa3bf71e94c40c06606625e","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b66a740b-80a7-4e7a-abe0-da229ded13b1/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Soroush Amelzendedel","tags":["Number","Generator","Text","Objects"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/fd9d56d5-2d05-4d8d-8b8e-87c759253481/","schema_version":"1.0.0"},{"id":"object_mode_hierarchy_select","name":"Object Mode v1.2 – Hierarchy Selection [FREE]","tagline":"Hold O + Click anywhere to instantly select the full object hierarchy (parent + all children) and transform everything at once without using the Outliner.","version":"1.2.0","type":"add-on","archive_size":2151,"archive_hash":"sha256:be32fd600bda98a29f0a7bd587e6540f59c663791bcad58312d46a708fe26514","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cc89f3e2-5e33-40fb-9fff-9563c7041e29/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Vincent Ilagan","tags":["object_mode","hierarchy","selection","workflow","tool","transform","animation","utility","blender","addon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/67ab12d4-3e48-4bce-affb-30a6b6095fb2/","schema_version":"1.0.0"},{"id":"pomodoro_timer","name":"Pomodoro Timer [FREE]","tagline":"Boost your productivity with this amazing N-Panel widget! If your computer cannot render faster, work smarter! This add-on integrates seamlessly into Blender, offering structured work sessions and breaks to keep you immersed in creative projects!","version":"1.0.0","type":"add-on","archive_size":5004,"archive_hash":"sha256:3ae73f0701bbae44934d253689dea84f7858f61f3a5e88c02966623c911cede3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6c8e140d-7f72-448a-b5eb-3aaf7fcedb99/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"DJ SOLANA","tags":["Pomodoro","Timer","Boost","Focus","Concentration","Productivity","Efficiency","Smart","Creative","Workflow"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e382a037-62c0-4266-a312-9c4fecf2e494/","schema_version":"1.0.0"},{"id":"procedural_scatter_brush","name":"Procedural Scatter Brush [FREE]","tagline":"Scatter objects on surfaces using brush strokes","version":"0.1.6","type":"add-on","archive_size":3522,"archive_hash":"sha256:14afe4d18a7065311a9bf825c16e8227af69e960371242b5e7e73d58999445f2","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/94e7c35b-9a6c-468a-a74f-358dbc770073/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Soroush Amelzendedel","tags":["ScatterBrush","Procedural","Geometry","Tool","Instancing"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/55e372d8-5d9d-4e43-aa7f-1bb8dbf70be5/","schema_version":"1.0.0"},{"id":"SK0003","name":"Project time tracker [FREE]","tagline":"Saves the time you spend working on different projects so you can always keep track of whether you are still within the agreed time frame.","version":"1.0.0","type":"add-on","archive_size":2587,"archive_hash":"sha256:bd88afe070d59e6df44c4d7e2f6a264508f31cb96d67edda45d5dc5adbd22dab","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/19070979-b821-42c8-9d22-92057c438066/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Steffen","tags":["time","tracker","project","budget","client","organize"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b062a8ff-c085-45ff-bd8b-1c260d6fe20d/","schema_version":"1.0.0"},{"id":"quad_bridge","name":"Quad Bridge [FREE]","tagline":"Quad edge flow without any hurdle,\nworks on every N-M cases where N and M are greater than 1 and N is not equal to M,","version":"1.1.0","type":"add-on","archive_size":5948,"archive_hash":"sha256:7cd0d15de0a31d89fa52284f109c191164e99f4ac31ef151f9b32f5d362413c9","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6ccd02f6-fd7a-40dc-8551-fde00f771788/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"abd3d","tags":["Mesh","Modeling","Bridge","quad","join","edgeloop","loops","retopology"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8da31723-08d8-48bc-803d-550657841ee8/","schema_version":"1.0.0"},{"id":"Quick_Asset_Saver","name":"Quick Asset Saver [FREE]","tagline":"Streamline saving assets to your local asset libraries.","version":"1.2.1","type":"add-on","archive_size":18728,"archive_hash":"sha256:f5710d0d86aeb99567189c11210f8a3c7f711e116a93d9afdb496f0bbd109326","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4a8e5e72-5d5b-43e2-8cb2-e7a8d53c34e4/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Clonephaze Smith","tags":["UserInterface","System"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a8dd11c1-54ce-4497-9691-5d5846af5939/","schema_version":"1.0.0"},{"id":"quick_groups","name":"Quick Groups (Instances) [FREE]","tagline":"Group objects with Ctrl+G using instances","version":"1.0.3","type":"add-on","archive_size":6862,"archive_hash":"sha256:f9da4f1267c480b5fd252e2d61573e1ebbd3e4fafa723547b93f032d7292d01c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1a7bb8b0-cd62-4216-ad5d-33e1139fd10c/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"John Wick","tags":["Object","Modeling"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d275c96d-a459-4904-a843-58f21b2f9ab6/","schema_version":"1.0.0"},{"id":"bake_material_lite","name":"QuickMat Bake Lite - Material to Texture Converter [FREE]","tagline":"Bake procedural materials into image textures in one click. Simple, fast, and essential for exporting Blender materials.","version":"1.3.0","type":"add-on","archive_size":3248,"archive_hash":"sha256:9a6d7fcdf5ab075c3731d5253413f71fc7b5b92c4e8ccec5ebbb2d8100380720","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6ac3962a-6b6c-4cb4-b4ae-d2e0e1a4fe6a/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Studio156","tags":["bake","baking","texture","textures","export","material","procedural","render","uv","image"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/6541c818-0c1d-4d3d-bb66-668309193c5e/","schema_version":"1.0.0"},{"id":"quick_origin","name":"Quick Origin Power Suite: Ultimate Pivot & Alignment Tools [FREE]","tagline":"Stop tedious alignment! 1-Click Origin to Bottom, World Snap, Smart Bake, and Batch Copy for game dev and asset creation.","version":"1.0.0","type":"add-on","archive_size":3266,"archive_hash":"sha256:d1bbf787a368b4f2dd956c1cb14710bc9b3caa76fd1ca56b9a4fbdc56b4ea6c2","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/96371023-31d6-48cd-8214-343e0b980ae4/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"NovaStrikes","tags":["Object"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/30272b4a-f645-4447-9880-44b5f3934a65/","schema_version":"1.0.0"},{"id":"quickundo","name":"QuickUndo: Sidebar Undo/Redo for All Modes [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"1.0.0","type":"add-on","archive_size":2768,"archive_hash":"sha256:9895a4ce788ff7ef200361eb3f8a7cc24d58ff38928cbde3e2ca90d8e338858e","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2b634e76-a618-43d6-a37c-c743ed04e844/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Elodie Anglade","tags":["undo","ui","tablet","ux","ipad","sidecar"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/df248e69-51d6-4847-bd63-5718b152ff90/","schema_version":"1.0.0"},{"id":"random_design_for_abstract_art","name":"Random Design For Abstract Art 1.1.4 [FREE]","tagline":"Generate abstract art with randomized shapes, remixable layouts, and smart arrangements like wave or spiral. Enhance with creative effects like Biopunk, Ectoplasm, Alien, one-click transparency, and randomized vibrant color harmonies.","version":"1.1.4","type":"add-on","archive_size":182021,"archive_hash":"sha256:d62a0e5ac70943ea42fa5d54d7e047792b45b16cb0e602f8278369c3e1fb5500","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/712f172f-5cdd-43ca-bcec-32b0129bd801/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Jacques Durocher","tags":["geometry","nodes","random","primitives","organic","instances","design","abstract"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/287f4b56-b2ec-436e-8b6e-032e8cf8361f/","schema_version":"1.0.0"},{"id":"Randomize_Bones_Pose","name":"Randomize_Bones_Pose [FREE]","tagline":"Inject spontaneity into your character and particle animations by effortlessly randomizing the rotation, location, and scale of bones. With a single click, witness your characters take on dynamic, unexpected poses that breathe life into your projects","version":"2.0.0","type":"add-on","archive_size":16684,"archive_hash":"sha256:5b3b0b59abad0e887e6b5b9511ef3ef64830b75e0ddfabaabdbdf82283efabdb","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/799484e5-be09-4cfb-8d2c-71ca49ffe1ee/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"IZ. MdVerz","tags":["Animation","Rigging","random","bone","bones","armatuer","particle","dance","character","pose"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b5b1d26c-d9e0-4945-94e1-b0923ec3ce04/","schema_version":"1.0.0"},{"id":"rastercrafter","name":"Raster Crafter v1.3.3 [FREE]","tagline":"Transform images into art with adaptive resolution & displacement driven by fractal image detail, or alpha maps; waves flutter; gradual resolution, displacement & gap; echo morphing; Perlin & fBM noise; full light control; true kaleidoscope;","version":"1.3.3","type":"add-on","archive_size":161147,"archive_hash":"sha256:9efc25e28b0dd1199d59f501ad1625e046cbb5616c1634660e6166bf96076199","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/706dc323-491c-46da-bc43-4e8fb2f09500/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Jacques Durocher","tags":["image","rastering","abstract","art","mosaic","grunge","pixel","creative","displace","fractal"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a2d0027b-8cc7-450e-9e6e-18e4c8e7f734/","schema_version":"1.0.0"},{"id":"reflectiveaudiomachine","name":"Reflective Audio Machine v1.0 [FREE]","tagline":"Reflective Audio Machine - Turn Your Music Into 3D Visuals in Blender\n\nReflective Audio Machine transforms any wav file into dynamic 3D motion. Load your audio, adjust a few parameters, and watch your objects pulse, move, and animate in perfect sync.","version":"1.3.3","type":"add-on","archive_size":36299712,"archive_hash":"sha256:0d910390338685ee17978ab494316f8e00fa047c0d6c5564973fa51d4ebdf9fd","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b997882f-dae8-49b2-ba68-6203b225d5f9/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Jacques Durocher","tags":["audio","sound","music","wav","visualisation","reaction","react","animation","pulse","wave"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/11608830-074c-4fc8-94ba-4fbd90a87531/","schema_version":"1.0.0"},{"id":"render_commander","name":"Render Commander [FREE]","tagline":"Background render launcher for Cycles & EEVEE","version":"1.1.4","type":"add-on","archive_size":2242819,"archive_hash":"sha256:e2f5e18e076d6b78f38c8257b7a73af15ffbfda62abb7880de7e92ee512fed8a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b3d197eb-36ff-4b84-bcfe-035ee1ae4b2d/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Nadir Perazzo","tags":["rendering","commandline","cycles","eevee","parallel","background","render","multi_gpu","presets","notifications"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4a787fcb-d366-4df8-9e1c-b06cd88f2a19/","schema_version":"1.0.0"},{"id":"rendermanager","name":"Render Manager [FREE]","tagline":"Render Manager - A render queue management tool for Blender. Create multiple jobs with different frame ranges and save paths, run sequential renders, and continue working without interruption.","version":"1.7.0","type":"add-on","archive_size":4101,"archive_hash":"sha256:d657357fbdb72f75d28157d2d98cc0dd58e93e7e9966f1dba9121b8ca4da4530","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/41afa7ce-b9fd-4db3-aaa5-5dd200765adb/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Vixymiles","tags":["Render","Animation","Queue","Manager","Workflow","Productivity","Batch","Sequential"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e774a939-504a-42db-ab02-36e3a8d42ce0/","schema_version":"1.0.0"},{"id":"RenderSceneKit","name":"RenderSceneKit [FREE]","tagline":"Quickly add pre-built studio scenes for render","version":"1.3.0","type":"add-on","archive_size":18677644,"archive_hash":"sha256:f6cef93aa29aea90f3691357b7a591e70b3259a844dd3a03b56fb4a14023c138","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9074f928-894f-44b4-837a-4cadecbc210f/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Danila Poljakov","tags":["render","scene","studio","toolkit","preview","libary","asset","lighting","presets","setup"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5238fe33-ff61-4add-bee5-27c885666c89/","schema_version":"1.0.0"},{"id":"scriptpilot","name":"ScriptPilot [FREE]","tagline":"A lightweight add-on to increase search and navigation functionality of the text editor with dynamic bookmarking of classes and functions and text searched persisting through blender save states.","version":"1.2.0","type":"add-on","archive_size":12017,"archive_hash":"sha256:417168679a551ce8c6ec5a74e6955efa953bef5bf80fe7a83157b03e303eb5d8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/28687bd4-d8c7-4af3-8e11-25596fc848c5/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"The Doctor By Design","tags":["scripts","text","coding","design","bpy"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d3738457-8a97-4ebf-9625-f8adc339781c/","schema_version":"1.0.0"},{"id":"set_to_wire","name":"Set to wire Boolean quick set [FREE]","tagline":"This addon simply sets the selected object to wireframe, addons a Boolean modifier to the active and sets the selected as the objects. In other words, it does all the work for you in 1-click :)\n\nCheck the quick video for details but it's easy to use.","version":"1.0.4","type":"add-on","archive_size":4277,"archive_hash":"sha256:56b28e5fb681ea4ab21f6539c6264e5eaa209a30df9ce3b1fb58a70ee2ffc748","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/79e38c3b-dfa7-4495-8681-201d95eda4e3/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["blender","boolean","easy","quick"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e0ea1433-d356-4f38-96c2-8f91209d71dc/","schema_version":"1.0.0"},{"id":"shapekeysbatchtransfer_addon","name":"Shape Keys Batch Transfer Addon [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"1.0.0","type":"add-on","archive_size":2776,"archive_hash":"sha256:c0ea8afa1d950bb6962e8d88754f1ba25aa5ee4aebb0e8013eb047b2fdd34f8a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a28ff77a-b3b8-4be5-ad54-4d64aec72874/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"cg.xenon Lauróva","tags":["shapekeys","transfer","blendshapes","morphtargets"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c047db7a-3b7c-4369-9b1e-99f616bb8830/","schema_version":"1.0.0"},{"id":"Shot_Handler_Lite","name":"Shot Handler Lite [FREE]","tagline":"Create Presets or different Shot Settings.\nSwitch Scene Cameras, Collection Groups, Render Settings and more with the press of a Button.","version":"3.0.2","type":"add-on","archive_size":49645,"archive_hash":"sha256:cd64d1e255d54f373ee9220c0a208ce299dc0169faa307af642de46cd402c51f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/eb1cbb06-ecac-4705-9c36-07eb98720885/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"dubCUT","tags":["shot","manager","camera","setting","render","filename","batch","collection","button","scene"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4986d4c3-65c1-433a-8359-2a7e83519a2f/","schema_version":"1.0.0"},{"id":"shot_manager","name":"Shot Manager 2 Lite [FREE]","tagline":"Render, layer and camera management","version":"2.0.8","type":"add-on","archive_size":541873,"archive_hash":"sha256:92e5bbb4136b64845a41ab08aa806cb233b3bfcb49e6d0912b5e2bf9bf892115","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/fc43d04e-1e87-4bb6-8f9f-d5c5923d688a/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Other Realms","tags":["shot","takes","macros","states","batch","render","burnin","burntin","stamp"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/30c9a568-79f8-4551-b71a-d4915ecccf52/","schema_version":"1.0.0"},{"id":"smart_apply_scale","name":"Smart Apply Scale: Rig & Animation Fixer [FREE]","tagline":"The Smart Apply Scale Addon that automatically fixes animations and F-Curves when applying scale to Armatures.","version":"1.5.1","type":"add-on","archive_size":8888,"archive_hash":"sha256:1e0fff2d3d9dc7c925e8c3ba25ff7cb9d22dabc1fddc26cc4bb976daf60979fb","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/82f9709f-25ab-4870-82fc-c77760495c0a/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Yakiv Sankov","tags":["gamedev","rigging","animation","addon","scale","unity","unreal","fix_animation","armature"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8d205ca1-cbf6-4a10-903f-0148e9d631a0/","schema_version":"1.0.0"},{"id":"subdivide_selected","name":"Subdivide Selected [FREE]","tagline":"This plugin applies subdivision to a selection with clean topology afterward and without separating polygons.\n\nUseful when you need to fix selected mesh areas affected by topology errors or low-poly problems","version":"1.2.3","type":"add-on","archive_size":2597,"archive_hash":"sha256:f964bb44f8f1dccfa4cb7c880b5fc3b742b749190e88ec0b39b57842c0097bf8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a371ba92-b0d4-426e-bcaf-4bb93df74414/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Łukasz Wilkoń","tags":["subdivide","weight","paint","vertex","mesh","edit","misc"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ed9859ac-9425-4619-a3ce-654c65ae7faa/","schema_version":"1.0.0"},{"id":"blenderdefender_spm","name":"Super Project Manager [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"1.3.1","type":"add-on","archive_size":64910,"archive_hash":"sha256:01d50d97d07f68a9e7e676754b5dbad1f1749af9c9248ee3e656d4671f552d8b","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5ca45a76-b0ba-4a42-ab5c-a6039131b80d/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Beedy","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d3edf068-7e94-4308-ba6a-df9184a20520/","schema_version":"1.0.0"},{"id":"survey_image_aligner","name":"Survey Image Aligner – Geodetic & Construction Workflow [FREE]","tagline":"Survey Image Aligner is a Blender add-on designed for precise alignment of survey and reference images in real-world coordinates.","version":"1.0.0","type":"add-on","archive_size":19532,"archive_hash":"sha256:1cfb365cb2667c8d5a600275a81ba033c21e426423885d228fd57aa85c525d3d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b1613ead-2102-4441-9b9e-25f2115961c3/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["3DView","UserInterface","Object","Survey","Image"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0d06c297-1456-4c32-8a3a-450951bf0907/","schema_version":"1.0.0"},{"id":"swap_render_orientation","name":"Swap Render Orientation [FREE]","tagline":"Swap Render Orientation lets you instantly switch between Landscape and Portrait mode with a single button click or F8 shortcut – saving time and keeping your work","version":"2.1.0","type":"add-on","archive_size":1891,"archive_hash":"sha256:e6bc031d13a16343fd7f0672f97edbb5567ef29600b457881be11c477cfa1c42","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/fa16455e-35c5-4f93-9478-72771e9e268c/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Nathan Jones","tags":["Render","Resolution","Orientation","Swap","Landscape","Portrait","Shortcut","Camera","Addon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a039fc1a-6af0-48f7-8165-ce6b5b2d7f6f/","schema_version":"1.0.0"},{"id":"tabs_interface","name":"Tabs interface [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"4.0.0","type":"add-on","archive_size":23870,"archive_hash":"sha256:0add617da4273ebfca87db38efff95df16f691c4cd9e2baa407cd41b10f0afbf","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/441ac3e4-075c-497a-83bd-7ba66bffeece/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"2.92.0","maintainer":"Vilém Duha","tags":["System"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d55d15f7-22f3-433f-9e6a-e7b3544256c0/","schema_version":"1.0.0"},{"id":"amazing_hypotrochoid","name":"The Amazing Hypotrochoid 1.0.9 [FREE]","tagline":"Generates intricate hypotrochoid curves with adjustable parameters and saves designs as editable meshes.","version":"1.0.9","type":"add-on","archive_size":28189,"archive_hash":"sha256:25a502b65b9332a0b53c601d66096dc8a1ceaf7af82ea7cf510d832b0b910c0e","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a6bee5b1-fc21-463a-b65d-78349d7185c4/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Jacques Durocher","tags":["spirograph","curves","hypotrochoid","math","equation","circle","swirl","abstract","art","random"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/95f41ca3-5d8a-40ef-9b7b-2c89978e42b2/","schema_version":"1.0.0"},{"id":"timeline_buttons","name":"Timeline Buttons [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"1.0.0","type":"add-on","archive_size":15158,"archive_hash":"sha256:3aac330381de15d2f69641f0f6c7f0dcaec42371e014ca70889cad899d27d815","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a70a4693-3fa2-4901-88cb-00a7c87e12ff/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"TinkerBoi","tags":["timeline","framerate","ui","dopesheet","graph","sequencer","animation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/efb9a92c-fe00-40dd-a3cd-70c4086143c0/","schema_version":"1.0.0"},{"id":"EMU3BM","name":"Toggle Emulate 3 Button Mouse [FREE]","tagline":"Adds a button with mouse icon next to topbar menus to toggle Emulate 3 Button Mouse.\nSolve the problem that there is no center mouse button when using the Graphics tablet.","version":"1.4.0","type":"add-on","archive_size":1343,"archive_hash":"sha256:e0eb54d5bc012e9d262c255df472ac0cdcf194a366f914d4c488525ed795c497","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2cb0b47c-afea-4165-97e4-92a1a91f2085/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Kin Chen","tags":["mouse","Graphicstablet","DRAWING","toggle","PEN"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/fa48f8c8-ccf7-4053-89d6-a4f065ca2709/","schema_version":"1.0.0"},{"id":"tryon_clothes_2","name":"Try On Clothes 2.0 [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"2.0.0","type":"add-on","archive_size":93895383,"archive_hash":"sha256:f0f5505c3252b090b9cb50cc04a9c0a20def4970b3441c21ad1983932f0e4c7f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/beb0b63c-6f62-4fdd-a56f-fe1164022d60/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Clothing","Tryon","Garment","Customization","Image","Model","Style","FashionTech","Virtual"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/fb812bd3-5913-4549-91fc-1ff8e5c486b7/","schema_version":"1.0.0"},{"id":"WeightPaintToolForBlender","name":"Weight Paint Tool for Blender [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"1.2.0","type":"add-on","archive_size":3855,"archive_hash":"sha256:ab7411de691858c94764273515a13f0a5768b78cca48a1c44554eee0d78380ed","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f24f5077-e24a-4e25-9e75-84a974d720f3/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Peter Harmatiy","tags":["Blender","Weights","Paint","Tool","3Ds","Max","skinning","animation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8ebcbb43-4807-42e2-9ae1-9bef04b58aea/","schema_version":"1.0.0"},{"id":"cobweb","name":"Cobweb [FULL]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.2.1","type":"add-on","archive_size":50711,"archive_hash":"sha256:0706d2533db72a8d7e824ede71d7bfe84e3fea73a6454b3c3672900d7a8b8b41","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/28c5d4df-a8b9-478f-94cc-a2bd4decf1ef/addon.zip","verification_status":"validated","can_download":"Rejected in this plan","is_private":false,"is_free":false,"is_for_sale":false,"base_price":null,"blender_version_min":"2.79.0","maintainer":"Vilém Duha","tags":["System"],"license":["royalty_free"],"website":"https://www.blenderkit.com/asset-gallery-detail/20d48d8d-39a5-4d1f-9fb0-994401b2a9c2/","schema_version":"1.0.0"},{"id":"final_topology","name":"Final Topology for Artists [FULL]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":627177,"archive_hash":"sha256:0a9d55a9a02cb026fa969eeaf7f7eb11258732eeb8322e09c136e28da0aa8a4f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/46d5cd8f-b93c-4786-8e4b-51b3b6ebb645/addon.zip","verification_status":"validated","can_download":"User is anonymous","is_private":false,"is_free":false,"is_for_sale":false,"base_price":null,"blender_version_min":"2.92.0","maintainer":"BlenderKit Community","tags":["System"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/388b195c-5a7d-4d9f-a632-0dac12c9198c/","schema_version":"1.0.0"},{"id":"people2d_v2","name":"2D People [Before: $11.99, Now: $10.19]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.4.0","type":"add-on","archive_size":241198,"archive_hash":"sha256:f554e001022758111cf0b8e1e2d2d885b8f244f47b0482f2d8a2b3de9b6fbedb","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/75097bcf-7ae7-4129-a977-36aa69180fce/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.19","blender_version_min":"4.2.0","maintainer":"Sérgio Merêces","tags":["2d","people","assets","elements","trees","architecture","archviz","real","placement","projects"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e0fc2f9a-fb4f-4980-afb5-32f07d5c0cb8/","schema_version":"1.0.0"},{"id":"object_3d_comparison_video_generator","name":"3D Data Comparison Addon [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":42045461,"archive_hash":"sha256:9b8c84af187c955f914a5b0b78e1e4284e0b59c0c1fe1a9c2ac28f18ee7d1e2d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5abad072-0cfa-43f4-9e8b-a57814831497/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"3D COMPARISON Musk","tags":["3d","data","comparison","visualization","addon","blender","3dbar","3d_data_comparison"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/6ae0f491-2109-4e05-b1d8-e075bc0ea07b/","schema_version":"1.0.0"},{"id":"procedural_pattern_generator","name":"3DQuads Texture Maps Generator [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":73577,"archive_hash":"sha256:b1aff6a799bce2cb9891d217dc2795c1b57830f81d430e40fd15fbd613798a92","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9be78010-98d0-4180-9fc7-1316a565e139/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"3dquads blender","tags":["Material","Texturing","Procedural"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ae4162bc-84bb-4e48-b2b9-4072a990f873/","schema_version":"1.0.0"},{"id":"abo_connect","name":"ABO Connect [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.1","type":"add-on","archive_size":41658,"archive_hash":"sha256:d1e2b4545aafd73466c8f3525f2f7baf2ac4fc418e20fb31c9eed4ead61cf0f1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9bd45216-230c-442c-a0c7-ba898c2258f9/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Andrew Luzhetskyi","tags":["library","furniture","ABO","assets","models","archviz","electronics","free","interior"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e0bc8018-886c-4c41-ae18-2097088e3b48/","schema_version":"1.0.0"},{"id":"advanced_modifier_tools","name":"Advanced Modifier Tools (AMT) [Before: $6.00, Now: $5.10]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":26641,"archive_hash":"sha256:390d9e74a4786fd18958d7bf5adb8f9eb9bbc60527a136e8b6f8da045d63e054","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6dfdafb8-34bf-4fd4-88cb-1b98e7b896dd/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.10","blender_version_min":"4.2.0","maintainer":"Soheil Mahmoudi","tags":["Modifier","ModifierTools","AdvancedModifierTools","BulkOperations","Bulk","Preset","Snapshot","SoloMode","Modifiers","Selection"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0fd579a3-d75a-4ca3-9e44-154f571858b8/","schema_version":"1.0.0"},{"id":"ai_geometry_node","name":"AI Nodes [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":12066,"archive_hash":"sha256:52f11f2ebfd2f323c7f6d0497bc4cf7f9e182c956a59bc06f8333316769f3b24","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c03e5769-59f1-4c19-a610-f2cfa150cc61/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Nicolai Prodromov","tags":["ai","llm","chatgpt","claude","gemini","artificial","intelligence","dynamice","text","procedural"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7de3fba7-ce57-4124-b1e1-d146e7855b0d/","schema_version":"1.0.0"},{"id":"ai_shortcuts","name":"AI Shortcuts: Add new buttons to blender [Before: $6.99, Now: $5.94]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.8.0","type":"add-on","archive_size":11078,"archive_hash":"sha256:99844c2df0e2bd04d5f1326e199a57507ad60affc64223a7b5809b33e0c23997","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2d892b56-86b1-45b9-b1f6-355b28a7993f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.94","blender_version_min":"4.2.0","maintainer":"Zahit Erdem Guzel","tags":["ai","gemini","addon","blender","shortcut"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4f4adf7a-d4c9-400d-85ee-53b73a3cc14f/","schema_version":"1.0.0"},{"id":"align_toolkit","name":"Align Toolkit [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.1","type":"add-on","archive_size":15041,"archive_hash":"sha256:024b25133b7ba4de512a7043fcd1fdf4e1dda61fb407db9118d477cb293743b4","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ae77c204-58c0-452a-a391-c8573c2b0bdc/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"carlosmu","tags":["alignment","ux","align","distribute","ui","toolkit","user","interface","experience"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/68a1366b-51bc-40b3-af32-9b38d3292e47/","schema_version":"1.0.0"},{"id":"alt_tab_colorful","name":"Alt Tab Colorful [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":20121,"archive_hash":"sha256:393d1f896b9aba97226956a59a1b15cc0d0ae501517ab8c54a46603f967b3eb9","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/96b0ebc8-38c7-4f1d-a3cd-34a2cfa4402b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","colors","colour","palette","generator","color"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/de7931c2-31d6-473f-982e-728a1a735269/","schema_version":"1.0.0"},{"id":"easy_fog","name":"Alt Tab Easy Fog 2 [Before: $40.00, Now: $34.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.5.0","type":"add-on","archive_size":64598868,"archive_hash":"sha256:2c2840bbfceada6d70b37dfac28bae7e3b347be5ad871d64332b24c91bb647a8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/7b56f9ad-1df7-4803-be2b-f74a32dd1690/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"34.00","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","addon","fog","volume","clouds","mist","explosion","godray","smoke"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5ba4cad8-7db8-4235-a5f7-bd264a60e489/","schema_version":"1.0.0"},{"id":"alt_tab_easy_hdri","name":"Alt Tab Easy Hdri [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":385592,"archive_hash":"sha256:b72f2d7159a888113322cda4646363adb8e52698b1af624e0e4c4fcdcf380133","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9f3c1e2a-bfbe-4286-84c4-ec44b98109e8/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","HDRI","World","Lighting","GroundProjection","HDRISphere","addon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/2347b643-69bd-4f8d-8008-ffba17e706e3/","schema_version":"1.0.0"},{"id":"alt_tab_lighting","name":"Alt Tab Lighting [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":11811259,"archive_hash":"sha256:a6da266309f0c9e57df4ac8c73c96a8cc539751b413283b5d8c53c42bc055236","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ede8deaa-d482-4eaf-88ed-59baf96d81c7/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","lighting","presets","cinematic","lights","light","addon","manager"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/fccb81d9-10b2-40ad-b46e-9d3a4b88f8ef/","schema_version":"1.0.0"},{"id":"alt_tab_pixel","name":"Alt Tab Pixel [Before: $8.00, Now: $6.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":187750,"archive_hash":"sha256:ab0672cd273718e0b180a0b62885c7700f3a9c87e012368f4aaa56135563802b","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e8e63c9f-bfb2-4b1f-ab48-6f215a471b00/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.80","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","pixel","pixelart","2d","shader","workflow"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/846e4c3e-6227-405d-8682-fbbf080d9dcb/","schema_version":"1.0.0"},{"id":"animates","name":"Animates Complete Animation Suite [Before: $65.00, Now: $55.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.4","type":"add-on","archive_size":174446,"archive_hash":"sha256:6ba53c2008f5ebbe9eb4cd5a58b37f2cf008729a95875a37dffc32628af00b6d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/67fafa3c-a1d2-4a62-882f-67051513e2ca/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"55.25","blender_version_min":"4.2.0","maintainer":"David Hallows","tags":["animation","character","keyframing","graph","editor","motion","workflow"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/fe9df247-5dd5-441d-91dc-aafdde63db3e/","schema_version":"1.0.0"},{"id":"animation_layers","name":"Animation Layers [Before: $28.00, Now: $23.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.1.9","type":"add-on","archive_size":74058,"archive_hash":"sha256:f2faf9b296ce2dce49cb7fb1cd3d27a607f4b5b83472133e640037ec4614b241","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d17b8866-ebf8-4bf3-a8d8-a7f5ba5159f4/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"23.80","blender_version_min":"4.2.0","maintainer":"Tal Hershkovich","tags":["Animation","layers","motion","capture","mocap","nla"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/797ac060-785e-49dc-a98f-d0ecf4abc555/","schema_version":"1.0.0"},{"id":"animtex","name":"AnimTex - Animate Texture Transitions [BETA] [Before: $19.00, Now: $16.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.8","type":"add-on","archive_size":1581140,"archive_hash":"sha256:880d8c49a4b1f7dcfec4993eeb2e07e027f302f5bf515e8393a6aad62c3dceb9","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b3201024-25d6-49d2-b71b-cd12e619e139/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.15","blender_version_min":"4.2.0","maintainer":"Doctor Legion","tags":["3DView","Material","Animation","Texture","Disolve","Disintegrate","Effect"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f1f0d459-3a41-45bb-a502-8eb0fc86fd85/","schema_version":"1.0.0"},{"id":"archiform","name":"ArchiForm [Before: $1.00, Now: $0.85]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":42977,"archive_hash":"sha256:85b7c71aea23717ad2cd040897a2cf31a74b22b23691d2b00bf1c9cf5bfd25f6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/7a0535ba-38c2-44b6-b3a0-390d56398a70/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.85","blender_version_min":"4.2.0","maintainer":"Abbos Mirzaev","tags":["RoofGenerator","WindowGenerator","parametricdesign","floorgenerator","FastModeling","ProceduralModeling","ArchViz","WallGenerator"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7ce6dc77-79fc-4a75-8f35-f241946e834c/","schema_version":"1.0.0"},{"id":"archviz_camera","name":"Archviz Camera [Before: $28.00, Now: $23.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":7573,"archive_hash":"sha256:4b1731b758ae452d3b7e94e18041181660942afd3c57ccf16e374a6d1231679a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/149ff6da-8fe3-49ca-9afb-8630afebe62c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"23.80","blender_version_min":"4.2.0","maintainer":"Daniel Farjoun","tags":["archviz","camera","tilt","correction","manager","render","shot","architecture","pro"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/fd4522ac-f70a-4d3a-9955-7c133b4572b3/","schema_version":"1.0.0"},{"id":"defoq_assetify","name":"Assetify | The Ultimate Bake & Export Tool [Before: $34.99, Now: $29.74]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.1.5","type":"add-on","archive_size":438131,"archive_hash":"sha256:bf0fcb963fe97edf240ab8f350102829bcaaca07880e30b4ebe5a08ec6ac3b12","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b4b54309-7911-4dd9-bc33-ec7b633000f3/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"29.74","blender_version_min":"4.2.0","maintainer":"Defoq Nino","tags":["bake","export","game","engine","materials","optimization","unity","ue5","textures","fbx"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/82a1fc6a-bb0a-4162-bf87-ce2d6f1d80bb/","schema_version":"1.0.0"},{"id":"auto_apply_scale","name":"Auto Apply Scale [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":3401,"archive_hash":"sha256:ee30a47355275e1eef8b09809bf0afd33c8e21a648101523992fd22e5cd77f73","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b4e63abb-980f-4bd2-9d5b-8d58e40ceb02/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","scale","autoapply","workflow","modeling","addon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e9e08a2f-273e-4dc1-833a-9bb00e7c0140/","schema_version":"1.0.0"},{"id":"auto_displacement_and_bump","name":"Automatically set material to \"Displacement and Bump\" [Before: $1.00, Now: $0.85]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.7.0","type":"add-on","archive_size":4305,"archive_hash":"sha256:5cfd1524435be43a647fa5867e72f99ebb7961675ad78b4c19365c44f4e4d591","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/af628f62-4440-4bad-ae9f-0faeac8bcd61/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.85","blender_version_min":"4.2.0","maintainer":"Alhakam Kain","tags":["Material","Displacement","Bump","Cycles","Auto","Workflow","Subdivide"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9ba32fb3-ac0b-4119-a0e0-ce2d83c04170/","schema_version":"1.0.0"},{"id":"automatic_fake_user","name":"Automatic Fake User [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":4268,"archive_hash":"sha256:938ba462e6a0bcef16a7150db22fd86bd823f80c73846ac946cf20e502165c10","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a6f43cc3-6202-4572-becf-eb6238949665/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"carlosmu","tags":["asset","data","ui","ux","datablock","autosave","fake","user","automatically"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/90f0e757-41db-4a42-8d9a-c4ddf93b81bd/","schema_version":"1.0.0"},{"id":"autoremesher","name":"Autoremesher NOW! | Automatic Remeshing [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":13575159,"archive_hash":"sha256:b7ddbce82ba2b35e7093123802b38643f15be4833eb367a1fc569944cfaefec8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/77576378-4a87-4829-ad24-a20a89033b10/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Giambattista Von Nettesheim","tags":["optimization","decimation","tool","topology","cleanup","quad","remesher","mesh","repair","remesh"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/86e86fab-5c54-4e8b-8ad9-4db6aa160784/","schema_version":"1.0.0"},{"id":"auto_save_file_checker","name":"Auto-Save File Checker - Browse all the Temp Files [Before: $2.00, Now: $1.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.0","type":"add-on","archive_size":11826,"archive_hash":"sha256:97bbf97c0794a1fe1a71563ccb04287667b32ca08dc579436757408fc6f04668","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/84632576-75d1-4ca3-9bcb-becbe3884a98/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["System","Development","autosave","blendchecker"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/18ba6214-e44c-4603-a654-19123100e06f/","schema_version":"1.0.0"},{"id":"auto_uv_unwrap_2","name":"Auto UV Unwrap & Pack 2.0: Seamless UV Mapping [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.1","type":"add-on","archive_size":8554,"archive_hash":"sha256:c89121acb51e27ad11924ce8b5a04a1fa4ab913f30d541df0cab354dd6075f25","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/54f6fb4a-aa34-4510-9e68-46b1d1954e6d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"Studio156","tags":["blender_addon_for_uv_mapping","tools","seamless_texturing","seamless_uv_unwrap","uv_mapping","uv_unwrap","uv_unwrapping","auto_uv_unwrapping","auto_uv_mapping"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/3915ee47-7c9f-4349-9981-cef51ba1c19c/","schema_version":"1.0.0"},{"id":"basic_wire_rig","name":"Basic Wire Rig [Before: $2.50, Now: $2.12]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":8971,"archive_hash":"sha256:a52e5ed61919cfceabcc799a50ddf9ef0bfd143ea8a891f08b1dec71820d0ee3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/efa10129-754e-4d6d-8ccb-e709a206fe14/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.12","blender_version_min":"4.2.0","maintainer":"Null Station","tags":["Animation","tools","cable","rig","wire","puppet","inverse","Kinematics","chain","ikrig"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5683ae75-d590-4756-8292-1ecbb4aa66cf/","schema_version":"1.0.0"},{"id":"batch_bg_cams","name":"Batch BG Cams [Before: $8.00, Now: $6.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.3.1","type":"add-on","archive_size":5729,"archive_hash":"sha256:5b9c970deea58baf77051ba10d84244744e4f1ad5c425560a9630664ce3a2e0c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/74b24024-c0c4-40b0-b200-400c078cde58/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.80","blender_version_min":"4.2.0","maintainer":"Hannes Werner","tags":["addon","camera","layout","background","import","timeline","productivity","automation","animation","video"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a30ce0f8-752f-4a55-b0e0-1cee72949d24/","schema_version":"1.0.0"},{"id":"batch_export_selected","name":"Batch Export Selected [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2703,"archive_hash":"sha256:6998f2db2bd89bf52d165e69566e97cbb1e21c2bd6ea48af63bf5978669b44b8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/dfc42df0-8211-43ec-ba42-4fb4a1eb7b89/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["export","selected","objects","bulk","multiple","format","addon","obj","fbx","stl"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/110a268e-9661-4a69-b1b0-0970e718bb99/","schema_version":"1.0.0"},{"id":"BatchGenie","name":"Batchgenie: Asset Assistant [Before: $19.00, Now: $16.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.1","type":"add-on","archive_size":14941835,"archive_hash":"sha256:6b510374f080da157ad4a432507f68ad9832f80c7870c47510b2cf98e484d322","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4c40dbb1-424c-4197-9e8f-fbc43deb89da/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.15","blender_version_min":"4.2.0","maintainer":"Roberd Palm","tags":["Asset","Library","Batch","Rendering","Import","export"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/32b07916-3a38-46d5-8e25-544926d8fd5d/","schema_version":"1.0.0"},{"id":"batch_rename_addon","name":"Batch Rename [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1745,"archive_hash":"sha256:1b4be6000c75875c5db989d606cf9dafc4ae84b29829b9ec656b041ab9bf365a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/7e974a06-e3ca-4107-ae67-23c57fa81231/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Batch","Rename","Prefix","Suffix","Organize","Interface","Efficiency","Naming","Scene","Automation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e0ce1d7c-858a-48a2-84e5-2765dc617bda/","schema_version":"1.0.0"},{"id":"batch_rename","name":"Batch Rename & Replace Pro Blender addon [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2746,"archive_hash":"sha256:87eff844dff87b5aece9b41f3c2fee5a1de0baa8837ce4a88b85560996cb328c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/639f709c-2c21-4022-b4a0-a71a6bbc8096/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Studio156","tags":["batch_rename","find_and_replace","object_naming","prefix","rename","scene_organization","suffix"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/2bb18442-9a82-4a5a-abdc-a09f90c400b7/","schema_version":"1.0.0"},{"id":"kamildobrek_batch_render_manager","name":"Batch Render Manager [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.5.0","type":"add-on","archive_size":58465,"archive_hash":"sha256:1869ac939e037aac1143217cfa2a8eea118f1d3b30c5d3df6e53b5efe45e2f98","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e1ed6b2c-c614-4e21-af32-ef412127d6d9/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"K","tags":["Material","Object","Render"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ff85ef84-9287-465c-a30f-4ed43fe442e1/","schema_version":"1.0.0"},{"id":"bb_toolkit_pro","name":"BB Toolkit Pro [Before: $8.99, Now: $7.64]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.8","type":"add-on","archive_size":56758,"archive_hash":"sha256:412b2098d35238a1766808a2d49895488e42f8bb98df0bde33cd1ba5fc5e6cb6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e1252aad-c6c5-42eb-a389-cbefdcb6aa8e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.64","blender_version_min":"4.2.0","maintainer":"Theo","tags":["threelights","overlays","productivity","modelling","tools","quickaccess","modifiers","fixscale","wireframe","facenormals"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f953d832-362d-4e0c-9caf-208f6e7936b0/","schema_version":"1.0.0"},{"id":"benchmark_fps_v1","name":"Benchmark FPS & Vram refresher helps reduce crashes [Before: $1.00, Now: $0.85]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.5","type":"add-on","archive_size":7924,"archive_hash":"sha256:b3f167cd024e33a75f6b014429097d8910ad54b87e7cabce765b203a676d8332","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e3f39d7e-5eff-4703-a412-1a4b76006714/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.85","blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["memory","fps","gpu","cpu","test","addon","2025","blender","vram","refresh"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/47c7ca2c-4a53-4a7f-a858-34c5fa29dbb8/","schema_version":"1.0.0"},{"id":"better_cutter","name":"Better Cutter V1.1 [Before: $19.00, Now: $16.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":32438,"archive_hash":"sha256:d8a1153ba01c79e55c1ba97c79a1982415e47e77d41c5742cca7e01636212f0f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cc4a77cd-92c1-4ae7-9da4-d04038e8e715/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.15","blender_version_min":"4.2.0","maintainer":"Bala Murugan","tags":["cutting","addon","better","cutter","hardsurface","modeling","blender","3dmodeling","boolean","looptools"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/85b19cc5-4a46-46f8-8f1e-e399a8458ac1/","schema_version":"1.0.0"},{"id":"bevel_joints_v7","name":"Bevel Joints - Join Meshes - Weld - Bevel V2 compatible - Set Mesh normal - Edge attributs [Before: $15.50, Now: $13.18]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"7.1.0","type":"add-on","archive_size":574169,"archive_hash":"sha256:6f8d9c1a6c8a2600d62e4232a1ee8449df78d0c55f3d3589056256fd4e1628d1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/67a61b5f-b465-43e2-a721-f9810b837cab/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"13.18","blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["bevel","join","mesh","blender","manifold","clean","2025"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8f021e02-4605-4a46-ad46-3aff2abadae8/","schema_version":"1.0.0"},{"id":"bildeform","name":"Bildeform | Bas Relief Maker From Your Images And 3D Models [Before: $25.00, Now: $21.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.5.0","type":"add-on","archive_size":3428836857,"archive_hash":"sha256:019c6f1817813596fbe99262a8a5226610432ce57b80b8d4ba924fef9fa76b02","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5bf2c82d-0b88-4f64-8237-bc7a99550bd6/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"21.25","blender_version_min":"4.2.0","maintainer":"Giambattista Von Nettesheim","tags":["basrelief","heightmap","zbrush","reliefmaker","depthmap","bildeform","displacement","3dprinting","CNC","maps"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4f0e25d1-7c9d-4a77-bf6d-60df3dc5b7a2/","schema_version":"1.0.0"},{"id":"blenderkit_translator","name":"BlenderKit Translate [Before: $6.90, Now: $5.86]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":2506,"archive_hash":"sha256:efb37d88992f8a1271da4c4e0012fd4992b4306dfc50382aeb5e6494a048ae11","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/da53acdc-2eaa-4b3b-ad15-dfe1acec4ba3/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.86","blender_version_min":"4.2.0","maintainer":"AHMED KETTUR","tags":["translation","search","assets","tools","language","utilities","workflow"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c58bdee2-6fae-4164-8dab-2786202b3e76/","schema_version":"1.0.0"},{"id":"blender_light_mixer","name":"Blender Light Mixer add-on [Before: $25.00, Now: $21.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":11478,"archive_hash":"sha256:ca92bbdafac363ea15437189b1555e4fc52d97f62ceb0a14a67876fdb1b1ef02","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3ba1716a-2ef7-43f6-9c80-fe65bd0987c6/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"21.25","blender_version_min":"4.2.0","maintainer":"Milad Kambari","tags":["Lighting","Render","Compositing","Cycles","Mixer","Addon","Realtime","Rendering","HDRI","Emission"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7b131c57-7e52-42f0-a1c0-9bcfcd38b182/","schema_version":"1.0.0"},{"id":"blender_luts","name":"Blender LUTs [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":5883785,"archive_hash":"sha256:117804828d165ade5fed594f79a3f4c17e292297a6beae975915d2f6b096b416","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3b02592a-8adf-4be4-9255-387cc5f59072/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["LUTs","Compositor","Renders","Color","Effects","Nodes","Filters","Cinema","Grading","processing"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/02dacd43-eafd-435f-badf-d01756834f35/","schema_version":"1.0.0"},{"id":"blender_sp_live_link","name":"BLENDER <-> Substance Painter Live Link [Before: $18.00, Now: $15.30]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.1.0","type":"add-on","archive_size":25427070,"archive_hash":"sha256:375ff3ee561d16e1ba47e809c660a75c6f0901796dd9de698c4addd2d782ba53","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c443b576-8673-4247-aaa3-0b96ce40ffaf/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"15.30","blender_version_min":"4.2.0","maintainer":"Milad Kambari","tags":["blender","addon","livelink","bridge","substance","substancepainter","blendertosubstancepainter"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8653c075-2f7a-418b-b228-c5cabbf5ba0e/","schema_version":"1.0.0"},{"id":"blender_to_godot","name":"Blender to Godot [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":428166,"archive_hash":"sha256:4cfb1f07378f913f444fd99705fb7055b5d0f97448441f0a593d4344ae39bfad","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3e254987-5ad0-4a44-ba15-97443977b439/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["object_export","collection_export","collision_export","component_export","animation_export","godot_exporter","gltf_exporter","godot_workflow","godot_pipeline"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0bc81975-693c-42e6-8465-ad0e2e37d9d7/","schema_version":"1.0.0"},{"id":"blender_to_unity","name":"Blender to Unity [Before: $30.00, Now: $25.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.6.3","type":"add-on","archive_size":441571,"archive_hash":"sha256:fce9fe4a678c1b63705f961c5b2670af2fecbf359f548d81783abae5dd310a3c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/8d1ff11d-8a75-4596-bab4-58c7f7b38990/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"25.50","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["blender_to_unity_export","fbx_exporter","batch_exporter","unity","unity_3d","lod_exporter","collider_exporter"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7c884710-57d8-438e-a89f-1c51bb88bb9c/","schema_version":"1.0.0"},{"id":"blender_to_unreal","name":"Blender to Unreal [Before: $30.00, Now: $25.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.5.6","type":"add-on","archive_size":437338,"archive_hash":"sha256:52aa2f32a8bab44b1c013c4d61afa821a318bc07d2739b02c7e0d6b7d0947b6c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6ea8ed9d-2948-41d8-88d0-d6f30a061604/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"25.50","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["blender_to_unreal_exporter","unreal","unreal_5","fbx_exporter","batch_exporter","collision_exporter","LOD_exporter","socket_exporter","animation_exporter"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7c047180-1c4f-4280-b4dd-56953673651a/","schema_version":"1.0.0"},{"id":"blenquick_autorigger_v2","name":"BlenQuick Auto-Rigger (BAR) [Before: $30.50, Now: $25.92]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.7.0","type":"add-on","archive_size":7256665,"archive_hash":"sha256:e1394f22335d226e26767aa62c1a3b60ab8611d714eaf7b72948c07f76dcb272","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e24fed34-cbd3-4ace-9249-9aa663f6c4d3/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"25.92","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["rig","rigging","autorig","autorigger","blenquick","advanced","detection","export","character","smart"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8844f27d-31e1-44a6-ab42-9518a22f0490/","schema_version":"1.0.0"},{"id":"booleanbite","name":"Booleanbite: 1-Click Procedural Edge Damage For Blender [Before: $3.00, Now: $2.55]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":8394,"archive_hash":"sha256:c7f3318eeea5cc01f51bd76af0afb1c74275f0b331cf261891cac5a9f042a536","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d0b2bbfa-bc8c-41b9-9ebd-4480955e13f1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.55","blender_version_min":"4.2.0","maintainer":"Shift4Cube","tags":["hard","surface","blender","addon","edge","wear","boolean","procedural","damage"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e7644b82-c95d-4c06-b3f3-fb7b804ea64f/","schema_version":"1.0.0"},{"id":"boon_shader_lite","name":"Boon shader lite [Before: $1.00, Now: $0.85]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.9","type":"add-on","archive_size":11944507,"archive_hash":"sha256:52b7f858bb8dbf122f7e8b04e5556cc199844b6ec5a1f1f20bbe0e378bf54c89","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cbdbb779-e0ca-4d62-8b31-85274f0c2077/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.85","blender_version_min":"4.2.0","maintainer":"Applebharath","tags":["Material","Render"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/3b9c924f-a11c-4d6f-af86-bafeb474d5ac/","schema_version":"1.0.0"},{"id":"bounding_box","name":"Bounding Box - Fixed, Dynamically, Shrinkwrapping - Easy to use [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":380172,"archive_hash":"sha256:8eb955f27e800b3fca95a09efccfc6cfde49bcfbdc7409479f7f76c99dce579d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/32700b65-aa85-49be-a0e8-282c87d30d58/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Dennis Hafemann","tags":["3DView","AddMesh","Object","bounding","box","surround","wrap","shrink","dimensions","resizing"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f5948370-e94d-4662-83e0-261f2c5dcb29/","schema_version":"1.0.0"},{"id":"bpm_marker_toolkit","name":"BPM Marker Toolkit [Before: $14.00, Now: $11.90]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":6263,"archive_hash":"sha256:442334badc75322a02f1b12e047930c9deff79bd99f1496517c9241597936cec","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/500fa12b-eb94-4e33-9dd9-73dbab309978/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"11.90","blender_version_min":"4.2.0","maintainer":"AL3K Insouratselou","tags":["Animation","Timeline","Markers","videoclips","music","sync","bpm","rythm","synchronization","timing"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/99529f45-bc25-4e04-8ff0-792af864a549/","schema_version":"1.0.0"},{"id":"breakdown_master","name":"Breakdown Master [Before: $10.96, Now: $9.32]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":318236,"archive_hash":"sha256:77d5adad2e2ab51fbc5b2cb83c695f8f09ee2074dea3da1b7801d951aef67b51","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4f4435fe-f3f9-4b5e-b8e3-80f898e0f551/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"9.32","blender_version_min":"4.2.0","maintainer":"Zahit Erdem Guzel","tags":["breakdown","animation","addon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a5602d43-74dd-4210-add4-c2699480f169/","schema_version":"1.0.0"},{"id":"breeze_sway","name":"Breeze Animaiton Tool [Before: $12.00, Now: $10.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":22657,"archive_hash":"sha256:a2030b664b8b229e59b89bd097644e7ae1dc70cbedd0c5af0670c528b9983cb8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a9f0915d-ea4f-44ee-8805-b9e908719323/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.20","blender_version_min":"4.2.0","maintainer":"Milad Kambari","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/dde3c942-917f-4d40-a8a4-535aecc2717a/","schema_version":"1.0.0"},{"id":"bsat_reference_plan","name":"BSAT - Reference plan scaling [Before: $3.00, Now: $2.55]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":339168,"archive_hash":"sha256:2c677a7a66aa6bec8aa6ebdbbc83b183a40a0c6cd6cfce83c2582cb0fc7632bd","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/45c91b7e-4536-48e1-8686-6823b91d7b73/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.55","blender_version_min":"4.2.0","maintainer":"Julien Winé","tags":["architecture","reference","plan","scale","distance"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e7a459b1-81e4-4869-b684-d23bbe22c20e/","schema_version":"1.0.0"},{"id":"bslicer","name":"B.slicer [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.5","type":"add-on","archive_size":31181,"archive_hash":"sha256:cd9e602df6126a629549eb596c837cba76ce00442ef008db6cb7b32501a774a7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c8dbfa24-0f99-4325-931f-b5d37d67650a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"belaid ziane","tags":["slice","slicing","export","svg","flatten","modeling","parametric"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/45e0a112-b302-4020-881b-3a91fc139236/","schema_version":"1.0.0"},{"id":"camera_autofocus","name":"Camera Autofocus [Before: $2.00, Now: $1.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.9.0-20251005","type":"add-on","archive_size":5307,"archive_hash":"sha256:56752e1d4365f09bf9ce871f8d1c41fc499b943f794913698b96878065f09989","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0bf968a5-802c-48af-8350-05afbcc19ff8/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","blender_version_min":"4.2.0","maintainer":"Vixymiles","tags":["camera","autofocus","dof","focus"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/2b81f79c-ab9d-4d7c-8181-cb4236963e5a/","schema_version":"1.0.0"},{"id":"camera_orbit_render","name":"Camera Orbit Render [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":10074,"archive_hash":"sha256:684a165b077372fe487504ac7314ff822817b24193fe0be962c8333bb4990682","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d7a8f513-be82-48b4-83f3-35c878b5d128/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Dennis Hafemann","tags":["3dview","camera","orbit","render","product","cursor","objects"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/69fdf172-290b-4b86-8b48-0c06bc312be9/","schema_version":"1.0.0"},{"id":"camera_preview","name":"Camera Preview [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.5.3","type":"add-on","archive_size":38959,"archive_hash":"sha256:aeb2eb83fe7690228387c899c8d25e8e3135e15fcaecb86bd8e2236bfc08d6bf","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c7ee8ddf-3aee-440d-9148-a7807360aa6e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["preview","camera","3dviewport","viewport_preview","camera_preview","viewport_overlay","camera_addon","camera_view"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c4e22853-8e2f-4895-a813-390c1289a4b0/","schema_version":"1.0.0"},{"id":"camera_render_settings","name":"Camera Render Settings - Settings per camera! [Before: $9.00, Now: $7.65]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":9056,"archive_hash":"sha256:eb1b21ea9778e55cd6e341aeb92473d301e3655bb2a0f10374d16f48dce6b771","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/15be96bb-fe63-4ef8-b6eb-108ee1a18bf1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.65","blender_version_min":"4.2.0","maintainer":"Zahit Erdem Guzel","tags":["camera","render","rendering","settings"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/81384cea-a973-4bcf-879c-4289acbecac7/","schema_version":"1.0.0"},{"id":"camera_switcher_pro","name":"Camera Switcher Pro [Before: $9.99, Now: $8.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":13521,"archive_hash":"sha256:5c1e20ea372426f7299a477dc73f08bd44e7d2504ddfc47ffea36ee8bacec14a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/144b63b2-da09-4dba-a23b-f44a3bcf5515/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.49","blender_version_min":"4.2.0","maintainer":"Doctor Legion","tags":["camera","animation","shaking","3danimation","viewport","addons","tools","3dcameratools","switchingcameras","cameras"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/035556c6-4189-45dc-9249-be5558d0c54e/","schema_version":"1.0.0"},{"id":"car_rigger_v1","name":"Car Rigger [Before: $17.50, Now: $14.88]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":1803528,"archive_hash":"sha256:abfddbd63f62fe1c73fe4e00335f1a67671fcd2cfacf4c8c17ef0e1679ede402","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/59d7b427-7b6a-47bb-8ad0-60d12b95c339/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"14.88","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["Rigging","Rig","Rigger","Car","Truck","Animation","4x4","Vehicle","Autorig"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ae20ae9a-4004-4920-8daf-c69ad0a1c0aa/","schema_version":"1.0.0"},{"id":"cgp_editor_switch","name":"CGP: Editor Switch [Before: $2.00, Now: $1.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.6.2","type":"add-on","archive_size":31881,"archive_hash":"sha256:be48e1779b44df451e744e99c2008526c7685124ef7617e4cc88bc82ffe50b88","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/23b6989d-84f3-4018-a0d7-2fe6e8fc9555/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","blender_version_min":"4.2.0","maintainer":"Chaitanya Garg","tags":["editors","nodes","compisitor","faster","workflow","animation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/266ba176-1a93-49b2-888b-2af27b8304f3/","schema_version":"1.0.0"},{"id":"cgp_super_z","name":"Cgp: Super Z [Before: $2.00, Now: $1.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.6.0","type":"add-on","archive_size":23262,"archive_hash":"sha256:eb2fd1e49c3ef09eb2ef931671ee5529b55510c9b1fea4d846fa7f41023f9dd7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/8a3b051c-c2a9-4301-97ca-77906d16b6f2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","blender_version_min":"4.2.0","maintainer":"Chaitanya Garg","tags":["shading","faster","worklow","viewport","super","z","materials","screen","overlays","wireframe"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/dc9d076e-b83a-4132-b48c-03a863c17e7a/","schema_version":"1.0.0"},{"id":"chain_generator","name":"Chain Generator [Before: $26.00, Now: $22.10]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":16909104,"archive_hash":"sha256:038d7bcb0ac96b490ab2f97d1a4d06be5e0d1e07903fc40bcd17fdc487ab5cc9","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1131e3b7-e751-41db-9727-a9286b9ce02d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"22.10","blender_version_min":"4.2.0","maintainer":"Liryc Creative Design Studio","tags":["fashion","metallic","accessory","art","chain","geometrynode","animation","modeling"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/323235cb-5286-42b0-85eb-d36eb388674a/","schema_version":"1.0.0"},{"id":"cid","name":"CID [Before: $8.50, Now: $7.22]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.0","type":"add-on","archive_size":22352,"archive_hash":"sha256:826b68d462541991755bf30491319ce46059185838f22098774171e897ccf25e","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ff94167b-9038-46d9-9015-033870cf6daa/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.22","blender_version_min":"4.2.0","maintainer":"Parametr Studio","tags":["color","id","element","channel","mask","pass","colour","postproduction","render"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/aeb02b02-f395-4310-a629-6a864b3c4a6c/","schema_version":"1.0.0"},{"id":"cinespline","name":"CineSpline – Cinematic Camera Rig for Blender [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.4.0","type":"add-on","archive_size":70651,"archive_hash":"sha256:a3760b42bc393b1bc519ccfa93dc4a8cca340b48ba8cfe552b4f5aa3585d0722","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9c9e5311-af14-4e01-90d2-8f8b3a31918c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Mazen Lawand","tags":["camera","cinematic","animation","storytelling","motion","timeline","morph"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/cc20ab37-417f-4a5a-ba54-0a74f46fdff8/","schema_version":"1.0.0"},{"id":"clean_addons","name":"Clean Addons [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"0.2.1","type":"add-on","archive_size":1501,"archive_hash":"sha256:4a9e91da91039e184f87e65411130cef1f621b9d40d7ca0d30114e0f98c2966a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a1b50628-4588-4cba-b82e-c1cee2dc90a4/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Addons","Interface","Management","Toggle","Panel","Preferences","Customize","Tools","Enable","Disable"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0462ad01-9d76-4cdf-80cd-d408df81b69d/","schema_version":"1.0.0"},{"id":"cleaner_ps","name":"Cleaner [Before: $9.00, Now: $7.65]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.5.0","type":"add-on","archive_size":2818,"archive_hash":"sha256:ccc8d13da56ecca03a61b904561135e6197ccb5da32292cb20dcf5cd126ef2f1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/81217f29-9bb3-4cf5-abb3-789cdc86990c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.65","blender_version_min":"4.2.0","maintainer":"Parametr Studio","tags":["cleaner","pure","purge","topology","modeling","optimize","scene","cleanup","materials"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/99558ea3-aa07-4857-b623-f636dfbc6179/","schema_version":"1.0.0"},{"id":"clippy","name":"Clippy [Before: $2.50, Now: $2.12]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":4360,"archive_hash":"sha256:983e222541b1c79a60e5d98c7d03667322ddbc60217caf299008f15d8829e8c8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/7ea35ee2-12d7-4e70-931c-b96d7bb2809c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.12","blender_version_min":"4.2.0","maintainer":"carlosmu","tags":["ux","ui","camera","presets","viewport","clipping","user","interface"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/14658df6-0976-4e12-8bef-5496b444c437/","schema_version":"1.0.0"},{"id":"clip_speed","name":"Clip Speed [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2346,"archive_hash":"sha256:4b0b1cc4ffc72ef8935b2158641226855e4bfb02f642cfe462350008fd5290ef","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/57c36e54-5ad0-4da7-8624-13ab4e53fd96/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Sequencer","Speed","Duration","Playback","Video","Editor","Time","Clip","Reverse","Effect"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/161371d5-eb46-4252-b994-b74517b6e336/","schema_version":"1.0.0"},{"id":"collection_colorizer","name":"Collection colorizer - auto-assigning viewport colors to meshes in specified collections [Before: $0.99, Now: $0.84]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.4.1","type":"add-on","archive_size":2128,"archive_hash":"sha256:d749ef1fba32ceb555db5b35e7b7089b64632e253e2f00e2792bc8d07f0b16f7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/78d30dc9-9667-4559-b7fa-d789c89c690b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.84","blender_version_min":"4.2.0","maintainer":"Mesk911","tags":["color","viewport","collection","display","object","solid","tool","search","visibility","optimise"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/aef8a90b-e532-4020-bda5-a0c62336b9f4/","schema_version":"1.0.0"},{"id":"colormatrixel","name":"Colormatixel - Advanced Material & Color Management Add-On For Blender [Before: $4.99, Now: $4.24]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":166059,"archive_hash":"sha256:eda137854baf27d4e75648abde8dfae400aa0d03d16aa07482d587e8284cde36","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/116a189a-7787-4727-9b06-72490bc551d3/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.24","blender_version_min":"4.2.0","maintainer":"Mohid Tahir","tags":["pixelart","color","gradient","randomization","colormatrixel","addon","blender","palette"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c31ef79f-2a05-41c6-9bad-963d95c51128/","schema_version":"1.0.0"},{"id":"Cool_Addons_Menu","name":"Cool Addons Menu [Before: $2.99, Now: $2.54]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":18495,"archive_hash":"sha256:7df4cf79cda76ee6dda75c26877773126c7ed510aec208b723de88500a6d2adc","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/39899790-5926-4c33-9f62-ff6ff1e741bb/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.54","blender_version_min":"4.2.0","maintainer":"Kito Studio","tags":["blender","menu","ui","addons"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d9969b05-b35a-4e28-be9d-461e99a6c260/","schema_version":"1.0.0"},{"id":"Cool_Magic_Shader","name":"Cool Magic Shader [Before: $3.99, Now: $3.39]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":8831991,"archive_hash":"sha256:4852ac6c2dcea0e7e287f79628438b59fdc87a7c16f696386aae6ee215588d1c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1c7f6c35-ee04-40c1-8189-afe629444eae/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.39","blender_version_min":"4.2.0","maintainer":"Kito Studio","tags":["blender","shader","toon","style","render"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/2ea6e2ac-96c8-4579-b998-7c833227dacd/","schema_version":"1.0.0"},{"id":"cracks_51","name":"\"Cracks\" Damage addon 💥Windows, Linux, Mac approved [Before: $15.50, Now: $13.18]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"5.0.7","type":"add-on","archive_size":6491812,"archive_hash":"sha256:1dca1b11b4450bcc4ba4300ffe9e49a68e9162f3728308aa3f9a72241ba3e6d7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/097e709e-a3c8-4588-b1df-880a19c619d9/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"13.18","blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["Damage","blender4","simulation","geometry","nodes","addon","2025","cracks","crack","modifier"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d303f488-d48d-407b-8615-ebf1a5e0883b/","schema_version":"1.0.0"},{"id":"credit_manager_pro","name":"Credit Manager Pro [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":11780,"archive_hash":"sha256:bd8c24779461eba6babb5089b8d754b79ef3a0cf2c04b5131c4c2ade5adbea9c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/622b813a-5ea9-402c-9fab-25eea64ed096/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Vavrinec Foltan","tags":["Interface","3DView","AssetManagement","credit","manager","license","production","workflow","attribution","pipeline"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/de99702b-347b-4ce9-bc88-4998e9d37916/","schema_version":"1.0.0"},{"id":"cursor_history","name":"Cursor History [Before: $4.00, Now: $3.40]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1880,"archive_hash":"sha256:be9e467bd7b3356bc1235fa8bd1ef798760c5a9d194c620f901ec316e9ead34e","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e17d7a63-a056-4445-8865-70d383d19285/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.40","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Cursor","Bookmark","Navigation","History","Undo","Location","Position","3DView","Tool","Scene"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ed7f83a4-147e-42f7-bc3c-8e6fd0721bc5/","schema_version":"1.0.0"},{"id":"custom_light","name":"Custom Lights V2 [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":948465,"archive_hash":"sha256:5b5d9faca31f17112f493bc2568178f1dec28eed1d3e2fbca6be4d640143f4f0","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d924eaab-9216-439c-8b08-50495bc756f2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Đức Mạnh Huỳnh","tags":["Lighting","product"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8ee2c9f9-4f18-49d7-b5d0-f7b70e8c4e22/","schema_version":"1.0.0"},{"id":"cut_and_wrap","name":"Cut & Wrap (One Click Image To Cutout And Shrinkwrap) [Before: $19.00, Now: $16.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":14282,"archive_hash":"sha256:66848a0091fb86b52516cb5c6ef7d8670998c5d2162957c806ff2c9ffdbd5209","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/27651c4b-223b-4ff1-b731-fd453565c458/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.15","blender_version_min":"4.2.0","maintainer":"Bala Murugan","tags":["blender","addon","image","cutout","imagetocutout","oneclickimagetocutout","cutandwrap","emission","alpha"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/3600d73e-4bb8-4742-888e-4cde99610da0/","schema_version":"1.0.0"},{"id":"daexport","name":"DaeXport | One-click DAE (Collada) export [Before: $10.99, Now: $9.34]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.2","type":"add-on","archive_size":30036,"archive_hash":"sha256:7046dddcfa457e38907929879ebbe20a93b295f56527cf4cc6b78dc4c944c966","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b4d75ca6-fb54-424f-9f79-10fdbd817ad8/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"9.34","blender_version_min":"4.2.0","maintainer":"Arun C","tags":["Baking","GameEngine"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e5652919-6e8c-4d24-aeb5-cf64403e2455/","schema_version":"1.0.0"},{"id":"damtools","name":"damTools [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.6.955","type":"add-on","archive_size":1246131,"archive_hash":"sha256:2da8052b74e032b9b06600a7c2af845c937dc9b9292ed2d2cf92818ca2b7362e","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1984951e-bb76-436b-be20-b610d9f27bf2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"SynrgStudio","tags":["hardsurface","tools","toolkit","suite","modeling"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/924db361-635f-4c0c-a9d9-78e907b0e56b/","schema_version":"1.0.0"},{"id":"decal_creator_pro","name":"Decal Creator Pro - One-Click Decals & Normal Stamps from Mesh [Before: $7.00, Now: $5.95]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":170084,"archive_hash":"sha256:400cfa84c860cbb746cac72d7693f651cc4c6a14d09032076b2ade2a7beb462c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6992b786-cd58-466b-83c5-56c58dfb8417/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.95","blender_version_min":"4.2.0","maintainer":"H3D","tags":["decal","export","meshtoimage","decalcreator","normalmap","oneclick"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e3dcfcad-3efa-468a-9f27-ddf695e12313/","schema_version":"1.0.0"},{"id":"dimensions_and_lines","name":"Dimensions and Lines [Before: $25.00, Now: $21.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":75526,"archive_hash":"sha256:b2d368e76a9a41d82b65766fcbc002042ff3383ad40d8e8619ae88bf20d64c30","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/8aa7084f-1f13-4a29-866c-c619e390eba2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"21.25","blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["dimensions","cad","dimension","lines","draw","drawing","technical","blueprint","paper","print"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a2846c5c-f395-4bfe-aaca-a53cc9ac6400/","schema_version":"1.0.0"},{"id":"dxf_import_export","name":"DXF Import Export [Before: $19.00, Now: $16.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":16203551,"archive_hash":"sha256:fd478752118247bca42a485638370ccb1e259bc7a3a0adb3950c43c7cfbe49cb","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/43bec026-0fa3-4bdf-9ced-1f47d0456330/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.15","blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["3DView","DXF","CAD","Survey","construction","drafting","geodetic","underlay","import","export"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/1a9d77d5-a9a5-4b03-970c-93897884b2bd/","schema_version":"1.0.0"},{"id":"dynamic_lighting_setup_pro","name":"Dynamic Light Setup Pro [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.1.0","type":"add-on","archive_size":12768,"archive_hash":"sha256:c0c6990da08608037f8305dccf3d37f9e1ff8f01c20aab699ba3907a171f59cc","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/fc172129-8e49-4e31-b7dc-e8b022cf3559/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"Anvil Interactive Solutions Anibe","tags":["lighting","3dlighting","lightingpreset","preset","render","renderpreset","dynamiclighting"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/79bb28ab-94b2-450c-88d6-3440587d4946/","schema_version":"1.0.0"},{"id":"esm_sim","name":"Earth-Sun-Moon Simulator [Before: $6.00, Now: $5.10]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"0.5.0","type":"add-on","archive_size":85033280,"archive_hash":"sha256:746bfb2f246dc4653d9dde3f2c0018ad4be215c9f91a2213965d42b8df9104b5","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4e6f48eb-e212-45b6-9703-15ccad8da52a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.10","blender_version_min":"4.2.0","maintainer":"Wolfram Kampffmeyer","tags":["Animation","3DView","education","Solareclipse","astronomy","stem","earthorbit","moonorbit","solarsystem","simulator"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a7ebdb0b-8828-41ee-9c4c-5dfb564fc14e/","schema_version":"1.0.0"},{"id":"easy_bake","name":"Easy Bake + Batch Baking [Before: $12.00, Now: $10.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.5.0","type":"add-on","archive_size":23263,"archive_hash":"sha256:6d80600a51aabfd83df414de15917846092dd8fc182ef727a35f702c167ec8ab","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/aa60f6fc-5d15-4a04-b86a-15f1736c250f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.20","blender_version_min":"4.2.0","maintainer":"Milad Kambari","tags":["Render","UV","Bake","Material","Blender3D","TextureBaking","EasyBake","GameDev","PBRWorkflow","3DArtist"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7c379e9e-95f2-4b1e-8eab-90739fd1e70e/","schema_version":"1.0.0"},{"id":"texture_pro_paint","name":"Easy Texture Paint - One-Click UV, Paint Modes & AO Shadows [Before: $14.00, Now: $11.90]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.6.5","type":"add-on","archive_size":4309,"archive_hash":"sha256:e95b13538c5906c23d4b616b6ca757cc7e29e14c6a57827fbc45406c7674d770","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/400c4632-1a26-414d-b4b6-2b78800f58c1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"11.90","blender_version_min":"4.2.0","maintainer":"Junaid Alam","tags":["Paint","Texture","Workflow"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/dc893ce9-b31f-4def-acee-641d73ae8579/","schema_version":"1.0.0"},{"id":"easy_transfer","name":"Easy Transfer [Before: $12.00, Now: $10.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2083,"archive_hash":"sha256:b0b2cc453e1195bb49f617e39b0d21193dc6c597cdcc367fc49424d4e09663a0","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/59cc0c05-510e-431e-9ef9-e637b4832030/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.20","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Transfer","Modifiers","Constraints","Materials","Animation","Mesh","Copy","Synchronize","Attributes","Context"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/3ff54d70-d514-4eea-8d58-062f5318d060/","schema_version":"1.0.0"},{"id":"EC_Light","name":"ECLight - The one click dual and triple lighting solution [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":13668,"archive_hash":"sha256:9f7ecbf98f690f5571627cb80f8794210b6606ed20686f821a21946cc9c25c6f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b8760f19-3e3d-41cb-9522-9a6e005997f2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Abishek Raja","tags":["light","easylighting","Cinematic","Neon","Cyberpunk"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c13e5d41-2380-42a2-806a-1b287dd221cc/","schema_version":"1.0.0"},{"id":"editor_swap","name":"Editor Swap [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.1","type":"add-on","archive_size":18012,"archive_hash":"sha256:7d3157c242859fc7aee71d91adfbf03207020ebf8be4c43f3a001425e088edc6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2ca8e842-6368-4c58-b49b-515ac48b7b22/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"carlosmu","tags":["interface","ui","ux","swap","editors","area","customization","user"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/cf07859b-366d-493c-9128-010b74fcf874/","schema_version":"1.0.0"},{"id":"enable_disable_in_render","name":"Enable / Disable in Render [Before: $8.00, Now: $6.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1464,"archive_hash":"sha256:791964a72a51067d429f9b17bb6287798ba5012e966f7ebb1234f14558fbfcee","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/bc076c54-a76c-41d4-99a1-fe5db4c998dc/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.80","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Collection","Render","Toggle","Objects","Visibility","Keyframe","Scene","Control","Animation","Efficiency"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a993b9b8-37ce-4b99-8371-83f0d161c969/","schema_version":"1.0.0"},{"id":"essentials_addon","name":"Essentials [Before: $12.00, Now: $10.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":42799,"archive_hash":"sha256:9d76e27ff1a5f5b160780a537af067d4661418258e7ef20065e141b259f552d0","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e60ed199-9239-4c4d-8924-b9aa96402314/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.20","blender_version_min":"4.2.0","maintainer":"Jackson Zheng","tags":["essentials","align_camera","auto_highlight","camera_essentials","surface_snap","camera_perspective_reset","drop_snap","gravity_snap","outliner_visibility_sync"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0f34a339-e478-4d6c-b328-9be1daa65f67/","schema_version":"1.0.0"},{"id":"export_each","name":"Export Each - Batch Export Collections / Object with One Click [Before: $3.00, Now: $2.55]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":11265,"archive_hash":"sha256:82912b0d8319c94518a1aaf0b33a779969fecb30bd6f808f379cf190ddb7b4bc","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b1ced0c6-8c51-43a6-886f-3bee2b603f0a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.55","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Pipeline","AssetManagement"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f2dc078b-d6ac-4cb3-a750-4d6c1a834ac9/","schema_version":"1.0.0"},{"id":"ez_studio_pro","name":"EZ Studio Pro [Before: $8.00, Now: $6.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":10860,"archive_hash":"sha256:ed68ce19f9006a39a588d0e35d12004517975916112867b14dde807bfa2b23cf","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/07d6152d-7298-4109-99bd-fc390bcc04da/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.80","blender_version_min":"4.2.0","maintainer":"Abijith S","tags":["Render","Lighting","Optimization","Productivity","studio","camera","blender"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/1c5d0887-7382-4dbd-9ba3-bee0cfd933e3/","schema_version":"1.0.0"},{"id":"eztexture_pro","name":"EZTexture Pro [Before: $3.00, Now: $2.55]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.0.0","type":"add-on","archive_size":3294637,"archive_hash":"sha256:345223ed17af25f05ad21e942476bfd3addb4c382eee83df3f242aa4b48a32b0","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cb57db07-5709-45b4-973b-f661a1f4f080/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.55","blender_version_min":"4.2.0","maintainer":"Abijith S","tags":["Texture","PBR","Material","autouv","shaders","udim","Node","Smart","UV"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/18b6c783-c973-4abc-90f2-5f380e6e86d8/","schema_version":"1.0.0"},{"id":"face_layers","name":"Face Layers v1.5 Add-on [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.5.0","type":"add-on","archive_size":45390,"archive_hash":"sha256:501b57c7dd8cd9549b3d93cce966fbc3effccec925b75e19168274c8bb0ef088","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/481d4b7e-3ffd-4157-a38d-1dc26763a075/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Split Studios","tags":["face","layers","facelayers","mesh","faces","addon","extension","selections","meshfaces","matetials"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8996ef60-23df-44c7-98f0-7161c54ba379/","schema_version":"1.0.0"},{"id":"falcon_cam","name":"Falconcam [Before: $8.98, Now: $7.63]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1022399,"archive_hash":"sha256:5d655a371dba853226c36680e7e9b15f917bb4c2f8e223138cf8c7502911dab1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/594352e2-91bc-4a7c-9e4e-2856ca0b7f37/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.63","blender_version_min":"4.2.0","maintainer":"Liryc Creative Design Studio","tags":["camera","cameraanimation","animation","auto_camera","movie","cameraaddon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/74f64128-e395-4c0a-ad4d-2cf86cdd0eee/","schema_version":"1.0.0"},{"id":"fast_screenshot","name":"Fast Screenshot [Before: $4.00, Now: $3.40]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.8.0","type":"add-on","archive_size":29599,"archive_hash":"sha256:53c1f5ca9ea2f7f7c17a8ab85d9710eef21ca451825f56e06f9055fbaa0b5047","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2c592450-778c-4c2d-b6e0-751782e55a0c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.40","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Fast","Screenshot","quicksc","fastscreenshot","quickcapture","viewportscreenshot"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c9bdda64-41ec-468b-91e2-9bf877284f54/","schema_version":"1.0.0"},{"id":"final_topology_pro","name":"Final Topology for CAD professionals [Before: $99.00, Now: $84.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":646630,"archive_hash":"sha256:e8383b08b908f263d0aae7acda685acf991ceeeb65d65682b9f9bae7147ddd3f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c244bea6-3f65-4951-832d-42a8fb5410a4/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"84.15","blender_version_min":"2.92.0","maintainer":"BlenderKit Community","tags":["System"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/69f95fba-5b1d-48c7-87ad-d8093b24436b/","schema_version":"1.0.0"},{"id":"alexdepario_find_objects","name":"Find Objects [Before: $4.00, Now: $3.40]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2888,"archive_hash":"sha256:2f2384e5a2f3c1f45829c43df6cff9b34d9867f0de677b5f9f1b972f03d62376","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6a896900-e55d-465e-b248-917ae241c673/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.40","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["find","search","object","management","interface","tools"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7cd259e6-5a4c-485d-8095-da2d56c56e79/","schema_version":"1.0.0"},{"id":"fixamo2","name":"FIXAMO 2 - Combine , Loop, Create [Before: $9.00, Now: $7.65]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":5033,"archive_hash":"sha256:1d3192b6ac527e5ee2a86dc7fd938e0e370b786cca2d492cce507a2a437ede5f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0bbe493a-8c37-435f-b14e-1cba86d86c54/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.65","blender_version_min":"4.2.0","maintainer":"Kohdy mcintyre","tags":["Animation","Addon","Bossposes","Tools","New","Mixamo"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0f4fd714-0c97-401f-bcea-bbb42ab9fbdd/","schema_version":"1.0.0"},{"id":"flat_pallete","name":"FlatPallette – Instantly Generate Color Textures for Lowpoly Models with Ease [Before: $4.99, Now: $4.24]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2994,"archive_hash":"sha256:f752b1c38cd58ffa9d90fcb6dd273fe8e42283cef1dd1d0a97ef27404ac95437","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4604c515-8495-4042-940d-d12737b4ad46/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.24","blender_version_min":"4.2.0","maintainer":"isac lima","tags":["lowpoly","flat","color","texture","generator","palette","uv","map","stylized","game"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4d46d04a-0269-4c0c-bb78-6b4abb84903e/","schema_version":"1.0.0"},{"id":"fog_planes","name":"Fog Planes Addon [Before: $35.00, Now: $29.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":198697240,"archive_hash":"sha256:8fa4132df3fd070aa5a3b58a8a0aebca811315a8f0da5a22ff106619780c79bb","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4a0b950e-d206-49f4-b27b-23557df0e3b5/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"29.75","blender_version_min":"4.2.0","maintainer":"Besa Art","tags":["fog","haze","environment","nature","atmosphere","mist","moody"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/2cd70353-b642-43fb-9d1e-0928ecc16a20/","schema_version":"1.0.0"},{"id":"hotkeyboard_azerty","name":"French Keyboard Shortcuts - HotkeyBoard AZERTY [Before: $9.00, Now: $7.65]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":44112,"archive_hash":"sha256:62071024eaa41b615793d482d62813f100c2a2a54271fac6db7891c0f06eca11","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5e2b46f7-a888-40ff-b09b-e93041de9bc0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.65","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Interface","UserInterface","Hotkeys","Keyboard","AZERTY","French"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/105400e9-bac4-46d4-8c08-616dbf54f334/","schema_version":"1.0.0"},{"id":"fz_material_kit","name":"F.Z. Material Kit – Ultimate Material Manager For Blender [Before: $4.99, Now: $4.24]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":13984,"archive_hash":"sha256:349367b0f408b5a467396b054a31e7ccdc6976edbe5d46d3a96d0d2d7b90a517","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e02c091a-cfbb-4237-a73c-59970d965458/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.24","blender_version_min":"4.2.0","maintainer":"F.Z Studio","tags":["Material","Management","Texture","Import","Viewport","Shading","PBR","Workflow","Shader","Tools"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8bb6fcca-2914-468e-9eb9-d7a2ed30628d/","schema_version":"1.0.0"},{"id":"garlandery","name":"Garlandery (Addon) v2.3 | Quick hanging garlands | Connect objects and vertices together [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.3.0","type":"add-on","archive_size":5658312,"archive_hash":"sha256:373a4e01e4a65587a73ad699e43663a1d6ee511947f364f3a4a5042d173f6d60","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4b7aa647-53be-46df-a59b-558d2cacb625/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Dennis Hafemann","tags":["addon","connect","vertices","hanging","garland","wrapping","fir","ivy","fairy","particles"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/acc1fd8e-e8a8-465e-864d-0c6a09c32077/","schema_version":"1.0.0"},{"id":"GLBOptimizer","name":"GLB Optmizer [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"0.0.5","type":"add-on","archive_size":192462,"archive_hash":"sha256:3d43e5fd646576f31643e616c0712c5d227d7ad38a3902df011f1c68fc104748","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cb11a1ea-65a9-4678-a7c2-79ca4f6c8e4e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"L DelMar","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a9c5e7a1-c70f-45a4-8183-d683aa5560e7/","schema_version":"1.0.0"},{"id":"glbxport","name":"glbXport | One-click GLB export [Before: $7.00, Now: $5.95]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.2","type":"add-on","archive_size":29212,"archive_hash":"sha256:1740ab04111b0aeb6289e20e8e2e1d2bc65605640aa6a5df2305e6f5f42f8818","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/eb42426d-21d2-4264-b6d8-e415e01d430a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.95","blender_version_min":"4.2.0","maintainer":"Arun C","tags":["Baking","GameEngine","AR","GLB","Export","Texture","WebAR"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4b653b4f-5424-4cb1-9ed5-0067daafe581/","schema_version":"1.0.0"},{"id":"Greaseliner","name":"Greaseliner [Before: $29.00, Now: $24.65]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":3377084,"archive_hash":"sha256:5f33f69cfe2fc7749e205abd4e84c7f46010d927f32c040763d566f6baa2bd94","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/919ec96c-8f8f-4ac7-8d8e-a7bd4c819c87/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"24.65","blender_version_min":"4.2.0","maintainer":"Kito Studio","tags":["blender","addon","outlines","greasepencil","stylized","toon","anime","blueprint"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/1cc36d5a-82e3-48d4-a195-abc5d9f9549c/","schema_version":"1.0.0"},{"id":"hedge_it","name":"Hedge It! [Before: $7.99, Now: $6.79]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":11478819,"archive_hash":"sha256:e0c9a2a1686e7af794326772826984fc49997f9118bef2ad29df7fd58e804004","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/054f346f-e681-41e9-b85f-890addaa26b0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.79","blender_version_min":"4.2.0","maintainer":"Blender Bits","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/1c3016b4-f975-48c2-b6b7-a28d3a5d20d2/","schema_version":"1.0.0"},{"id":"hidden_objects","name":"Hidden Object Manager [Before: $4.99, Now: $4.24]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.5","type":"add-on","archive_size":4247,"archive_hash":"sha256:13a22d85fcf61dee646bd011d7a99878667070cdb7b9e8137ad70eed2c9c3fa3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/bb0682cc-5b60-469d-af99-9f523ec7fa7b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.24","blender_version_min":"4.2.0","maintainer":"Doctor Legion","tags":["3DView","Hidden","Object","Viewport","Animation","Tools","Addons","2026","Cheap","Functional"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/633e1b7f-01a9-41ff-93f3-573ea6a82469/","schema_version":"1.0.0"},{"id":"hollow_object","name":"Hollow Object Creator – Blender Add-on for Easy Hollowing & Cutouts [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":3256,"archive_hash":"sha256:a5f443eae0fbcea81787b8237618c0a73b6e8678578c8a81ac4fc9d0b4b30e5c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ec6d3d81-7764-4fac-bf67-4f369f69caab/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Studio156","tags":["3d_modeling","3d_printing","boolean_operations","cutout","game_development","mesh_editing","procedural_modeling","quick_modeling","hollow_object","tools"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/1c3970c0-c0b0-41ca-9fb3-b27e2f3a3421/","schema_version":"1.0.0"},{"id":"hotkeyboard","name":"HotkeyBoard - All Blender Keyboard Shortcut Overlay [Before: $9.00, Now: $7.65]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":50182,"archive_hash":"sha256:a9b6ccf44294677f275adb4b504e9f562b1bf17eeb2fca48a799967ce6685ffe","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b30f43a6-2a9b-405c-b029-e6e46180005d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.65","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Interface","UserInterface","KeyboardShortcuts","Visualization","LearningTool","Education","Productivity","3DView"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7e838867-0ce1-4f38-9081-037c097fc723/","schema_version":"1.0.0"},{"id":"hud_and_ui_elements","name":"HUD & UI Elements [Before: $18.98, Now: $16.13]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.16.3","type":"add-on","archive_size":3051899,"archive_hash":"sha256:7d90d21dafc27b2f93dc2b410fdf684d3312fdc0f2c102679d35facc71b9cb78","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ef04cbc3-fcee-43ba-b0bf-26fa21f48343/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.13","blender_version_min":"4.2.0","maintainer":"N. Emmanuel","tags":["huduielements","hud","ui","fui","motion","design","Animation","Modeling","Mesh","AddMesh"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e01a622f-9495-4e9b-81f3-cba574349e1e/","schema_version":"1.0.0"},{"id":"ideagen","name":"Idea Gen [Before: $3.99, Now: $3.39]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.6.0","type":"add-on","archive_size":7498,"archive_hash":"sha256:195787a0aeb3237fa8ca14a73aded6c12d329b3f8c88318b7b2ba458209d8048","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/8fe664e7-6966-4eaa-a6ca-eecc375b4a44/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.39","blender_version_min":"4.2.0","maintainer":"Ace Of 3D","tags":["ideagen","idea","generation","creative","concept","art","random","ideas","concepts"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/6b03f814-3bb0-4442-80b2-f50e24e7e116/","schema_version":"1.0.0"},{"id":"imago_gif","name":"Imago Gif | Render And Import Gif Animations [Before: $8.00, Now: $6.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":78889498,"archive_hash":"sha256:bfdd9d71934e2fe77fe67245976ddf895aaee05f7618db9c0ef952486180cf48","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/53737df1-9a6c-4cc4-b628-4f06961ec2c3/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.80","blender_version_min":"4.2.0","maintainer":"Giambattista Von Nettesheim","tags":["gif","animation","blender","addon","rendering"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/655a3cfa-ee24-432a-a34a-d2c1859d19b0/","schema_version":"1.0.0"},{"id":"Inkto3D","name":"Inkto3D [Before: $4.99, Now: $4.24]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":45977,"archive_hash":"sha256:9fb32c34e0feacebccc2c15e41c5017f387a0cd0f80580a256c44c9d87c5e999","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/77d83ed2-9085-4e3d-b626-8b01717eaf36/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.24","blender_version_min":"4.2.0","maintainer":"F.Z Studio","tags":["image","trace","imagetrace","imagetomesh","mesh"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9ad75f77-de59-42f1-b371-f81a02e61fa7/","schema_version":"1.0.0"},{"id":"instantclean","name":"Instant Clean - The Ultimate Mesh Clean [Before: $9.99, Now: $8.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.2.3","type":"add-on","archive_size":125029,"archive_hash":"sha256:0ee941a43e27b95d0ae41d9f179c7b00bcf497c125392ef604e27bfd752c9d93","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ce53098e-071c-45de-849a-57938317534b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.49","blender_version_min":"4.2.0","maintainer":"Ruben Messerschmidt","tags":["mesh_clean","mesh","clean","print","manifold","cleanup"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/44c1aeac-bf6d-4c0a-a575-54b0466f25a2/","schema_version":"1.0.0"},{"id":"jigglegen","name":"JiggleGen [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.5","type":"add-on","archive_size":28952230,"archive_hash":"sha256:300b3ba9f8e40ef93c7e0a4b4d15e26589ba566eabfd2914ff8b2f183b84f7b5","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cbdf07dd-1b8f-4ee7-bf67-b01dc686d599/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"pathnode","tags":["simulation","cloth","cage","generator","animation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/57d51658-1be8-4e1e-8210-e0b75c2a7341/","schema_version":"1.0.0"},{"id":"keyframe_decimator","name":"Keyframe Decimator [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.0","type":"add-on","archive_size":16236,"archive_hash":"sha256:4ffbd48b6c3d12da59f8a329c2dd8c3e4d8fe8ce256ef08a30ab8b8dbb8ab345","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5a8c67cc-c352-42ab-ae00-21a3cf9b8d6b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"RUIDO VFX","tags":["Animation","Decimator","VFX","Keyframe","addon","optimize"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/06cd9d46-6fc4-4bce-8a9a-9755b71f96dc/","schema_version":"1.0.0"},{"id":"knife_circle","name":"Knife Circle [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":36340,"archive_hash":"sha256:57ae3b0b9dbee06ac3ecbbd630beb3065e95862f0f4d5966176aad01895d0f38","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/075476a8-e82e-4ff2-b459-3b1e772091cc/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["knife","knife_circle","knife_cut","knife_project","knife_tool","knife_polygon","knife_circular","knife_cut_through"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/71398fc7-49e8-4e42-b533-6c9941132c48/","schema_version":"1.0.0"},{"id":"landxml_import_export","name":"LandXML Import Export [Before: $16.00, Now: $13.60]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":21123,"archive_hash":"sha256:48bca9658d301236cfbed8fae6a1cdc6b41bd5816f5485a1e09c0a9dd2d54c0c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ccd2e759-2b8a-4508-ad38-de9694617deb/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"13.60","blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["Survey","CAD","coordinates","landxml","tin","breaklines","construction","geodesy","import","export"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/39505adc-0694-4efe-a77f-d982d53bfb5e/","schema_version":"1.0.0"},{"id":"letter_board_text_creator","name":"Letter board - Text creator [Before: $7.50, Now: $6.38]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":562941,"archive_hash":"sha256:8c12f39662866981da9dc9ec4b06b2e680ec069a62ba71f112d365a259838a59","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ea92700e-9cfb-4d6b-be72-e877ecab286e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.38","blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["Blender","text","letter","thumbnail","mesh","object","preset"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/22cc8f57-c605-4a4e-b537-6967e56d908f/","schema_version":"1.0.0"},{"id":"lightforge","name":"LightForge - Professional Studio Lighting System [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.4.22","type":"add-on","archive_size":22743109,"archive_hash":"sha256:f8aff9c92a1a5e06f06b57afd968f233c7302c95c6badf6df3ac581edb0c1faf","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/35e39639-e571-4466-9ae6-31e3d75519e1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"John Cheluva","tags":["Light","Lighting","Addon","Studio","Productvisualization","Reflector","Gobo","HDRI","Photography"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9ecb49b0-9be7-4b4c-8fd8-901bf7c8e655/","schema_version":"1.0.0"},{"id":"skava_lod_generator_pro","name":"LOD Generator Pro - Ultimate Edition [Before: $9.99, Now: $8.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.2.6","type":"add-on","archive_size":29745,"archive_hash":"sha256:6610b853ed8672ec051da8fa260e7e37a278bc735d0b71253353999ba0f3d15d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/29150841-e2a1-4e75-a75b-1e55e830da07/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.49","blender_version_min":"4.2.0","maintainer":"SKAVA Piatkov","tags":["automation","decimation","godot","lod","performance","unreal","unity"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d87d6532-edea-4ee0-a90a-37bf7390f8b1/","schema_version":"1.0.0"},{"id":"lottie_addon","name":"Lottie Animation Addon [Before: $30.00, Now: $25.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":68472,"archive_hash":"sha256:7a61a0f782303f92384b3076efa073b4f03e2464569b943afb70a4882a7f3c45","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f3a67bc6-2d77-4a59-97a1-8e17e0f413cd/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"25.50","blender_version_min":"4.2.0","maintainer":"Nicolai Prodromov","tags":["lottie","web","animation","json","webdesign"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5ef0c83b-ba4f-4ab2-8946-bb7a665a72b9/","schema_version":"1.0.0"},{"id":"magic_coordinate_extension","name":"Magic Coordinate Add-on: Dynamic Mapping For Blender [Before: $19.90, Now: $16.92]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.0","type":"add-on","archive_size":134264,"archive_hash":"sha256:5993304df2b155c02d92eced383dff07dd63bb70e98976f1cbffd5045b4faf8d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4a4e22c9-f361-410b-ada4-e446540e11cf/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.92","blender_version_min":"4.2.0","maintainer":"Cosmo Mídias","tags":["shader","geometry","nodes","addon","dynamic","mapping","coordinate","system"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/10dee0e3-fbd3-4041-abce-0db1a39ab84c/","schema_version":"1.0.0"},{"id":"mass_renamer_pro","name":"Mass Renamer Pro [Before: $6.00, Now: $5.10]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":7584,"archive_hash":"sha256:07fd66208c0c388f9923f42b5832915dae0591b2891eb914f4fb47e705ebd981","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/fe5d41d6-d858-4967-8ad2-c4f5cbad1516/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.10","blender_version_min":"4.2.0","maintainer":"Vaishakh Vinod","tags":["Object","Scene","Workflow","Pipeline","Animation","Rigging","rename"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/985de1bd-37f2-4e13-9fc2-d41c3521bd44/","schema_version":"1.0.0"},{"id":"matcaps_forever","name":"MATCAPS FOREVER [Before: $9.99, Now: $8.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":4801,"archive_hash":"sha256:ab2c85d1afff16262e29102956fa13f0e63e25c1500fa82428e665497896e2b7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d2ac0f17-417c-4259-8d3f-8d234f3af4b1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.49","blender_version_min":"4.2.0","maintainer":"Take Refuge TV","tags":["matcap","takerefuge3d","matcapsforever","matcapgenerator","material","sculpting","hardsurface"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5e190400-1471-4118-99ea-079be8ee661f/","schema_version":"1.0.0"},{"id":"materialpicker","name":"Material Picker - Select And Browse Materials [Before: $7.99, Now: $6.79]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.2","type":"add-on","archive_size":339989,"archive_hash":"sha256:ed9347567f8cf94a3ac11d725ba55f232bf95ee81d3c3024e69717b332073b75","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/48fd443d-0962-449f-af6e-92136980b911/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.79","blender_version_min":"4.2.0","maintainer":"Ruben Messerschmidt","tags":["material","select","picker","shader","browser","material_picker","material_select","material_browser"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4d77e53b-6311-4996-a7e3-b88eda756ccb/","schema_version":"1.0.0"},{"id":"material_swap","name":"Material Swap [Before: $3.00, Now: $2.55]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":3814,"archive_hash":"sha256:0ffd38163d6d70c4d9fbbc3d36e20198feb94c1f714472fc8f6854efdacfddb1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/521e106c-fcb1-4f8c-94ab-292cb63c1715/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.55","blender_version_min":"4.2.0","maintainer":"Jeslin Paul","tags":["material","addon","blender","render","replace","find","find_material","replace_material","default","cube"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/152cd534-c743-4ea4-b1e0-5c514c1d82ae/","schema_version":"1.0.0"},{"id":"material_tools","name":"Material Tools [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.3","type":"add-on","archive_size":11376,"archive_hash":"sha256:866db1a3dac81c24001d92f72e3b93ccc15b5046d884e9cf061ca159106ba813","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4b74121f-2fe0-4cc7-ad89-41a94ec6e04a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Mutanzom3D","tags":["material","materials","textures","texture","shader","model","object","uv","unwrap"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/18d3ae0c-f509-42a3-81e4-0c4ee5b68be7/","schema_version":"1.0.0"},{"id":"matrix_pro","name":"Matrix (PRO) - Design and Animations [Before: $22.00, Now: $18.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":926239,"archive_hash":"sha256:39113a92d620c5a9ad82b6cbb24fc5697dfba4c3ba27ec8c19c494e457533916","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/36a3c739-2262-4ce2-8114-809a71ebbe49/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"18.70","blender_version_min":"4.2.0","maintainer":"4DView","tags":["4DView","Blender","Addon","Design","Animations","Geometry","Nodes","Matrix","Transformation","Transformations"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/657d0c52-d787-42e5-9151-263dfddb2e0c/","schema_version":"1.0.0"},{"id":"matrix_ultimate","name":"Matrix (ULTIMATE) - Design and Animations [Before: $37.00, Now: $31.45]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2604916,"archive_hash":"sha256:f3b563325e1ac70edc9f632110771fddacc6aaf5b414e107359850a4bf0430a1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d10e480b-172c-4361-985f-378f2a38a762/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"31.45","blender_version_min":"4.2.0","maintainer":"4DView","tags":["4DView","Blender","Addon","Design","Animations","Geometry","Nodes","Matrix","Transformation","Transformations"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/81704036-143d-48a5-baca-bd4906793518/","schema_version":"1.0.0"},{"id":"meeting_room","name":"Meeting Room [Before: $12.00, Now: $10.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.3.7","type":"add-on","archive_size":227745137,"archive_hash":"sha256:af2f30607909bdebabb46371a0407b1dcccf5f73add016d87ccb9f1da9d59b32","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/fc1c89a7-94dd-4de9-bc74-2dfff72b3452/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.20","blender_version_min":"4.2.0","maintainer":"Adham Abou Assali","tags":["meeting","Room","offices","Office","TV","Interior","Chairs","HQ","Render","Design"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/36a66e0e-2bff-4464-b21e-2f47031f9371/","schema_version":"1.0.0"},{"id":"megascans_bridge","name":"Megascans Bridge v2 [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.4.0","type":"add-on","archive_size":217644,"archive_hash":"sha256:95e279244505ba2f335f42205dad6cd6770701f7b6c9619d9bc9d1a10d29bf7c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/78b13f8d-d0f4-45dc-832d-484647531d68/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["megascans","megascans_bridge","megascans_assets","megascans_plants","megascans_textures","megascans_materials"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0a231655-c32c-4025-a718-582af4e25c5a/","schema_version":"1.0.0"},{"id":"blenquick_mocap_lite","name":"Mocap Lite [Before: $10.50, Now: $8.92]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.2","type":"add-on","archive_size":286685938,"archive_hash":"sha256:9b135b4ba00df40e4f246c00a9e7e93a6f29310a855551e817c926757aae8f2e","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/58e33fc4-123a-4987-9ac7-a0c250f0b485/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.92","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["mocap","motioncapture","face","capture","motion","lite","basic","animation","3d"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/851c73c9-c226-4f1e-a4fd-d10eb0bdcae1/","schema_version":"1.0.0"},{"id":"blenquick_mocap_pro","name":"Mocap Pro [Before: $24.50, Now: $20.82]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.9","type":"add-on","archive_size":287493488,"archive_hash":"sha256:a74d3cd49462f5c66da75a6527b79c96d80d24d093c5734b3ac693d72911f2d9","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/99143d48-b834-48fe-9f69-7bc7f7f791c2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"20.82","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["advanced","mapping","mocap","retargeting","rig","live","face","capture","motion"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9835f003-6228-44f9-bc3e-6cf56faf6bd0/","schema_version":"1.0.0"},{"id":"modifiers_toolbox","name":"Modifiers Toolbox [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.2","type":"add-on","archive_size":16067,"archive_hash":"sha256:ccf1b84a9617e8d52b84659ff9c74f8499d636586f9cda4924ca421f0a3537ed","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/293ca6b0-3409-42eb-8605-80fb5d6e13d0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"carlosmu","tags":["toolbox","modifiers","favourites","user","ui","ux","quick"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/bb41223a-2351-4356-b130-02e453e506af/","schema_version":"1.0.0"},{"id":"modstack","name":"ModStack - Save & Reuse Modifier Presets In One Click [Before: $9.99, Now: $8.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":92368,"archive_hash":"sha256:4c10ee77ba44e0fb663fbf160c590eb9d930f10f50e02518781bddada90b3356","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/480f33f4-d8b5-4f6e-9875-0dd4ddb8de88/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.49","blender_version_min":"4.2.0","maintainer":"Ruben Messerschmidt","tags":["3DView","Modeling","Modifiers","Presets","Hardsurface","Nondestructive"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8f6686ab-238a-4a6e-8c33-1d0cf3ad96bf/","schema_version":"1.0.0"},{"id":"modular_suburban_house_creator","name":"Modular Suburban House Creator [Before: $9.99, Now: $8.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1100698310,"archive_hash":"sha256:1ee9250c031f1b4333afa6ad3882ccb08f352bb8bd61826fbed32093f76ebb12","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d32c24fc-51b3-4fc6-acd5-639d05a48ada/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.49","blender_version_min":"4.2.0","maintainer":"FANNΞC","tags":["modular","kitbash","suburban","architecture","interior","exterior","generator","game","modeling","efficient"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5faf55ff-acc1-484e-9a2e-943899b5b1f2/","schema_version":"1.0.0"},{"id":"morphplus","name":"Morph+ Professional Animation presets [Before: $22.00, Now: $18.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1617645,"archive_hash":"sha256:9e8f0487fb6d1df9beee2a0e987d36e5d264a55c776ff74897bf0e146a709097","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b3e1021f-5bde-4878-bac0-30f118227b7a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"18.70","blender_version_min":"4.2.0","maintainer":"A. Elbamby","tags":["morph","reveal","effects","presets","animation","geometrynodes","product","particles","motion","graphics"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/aad33ffc-2016-4aa1-b895-b1a9257130a0/","schema_version":"1.0.0"},{"id":"motionpro","name":"MotionPro [Before: $19.99, Now: $16.99]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.1.0","type":"add-on","archive_size":325988,"archive_hash":"sha256:1d85fca4bdcb5cf8b3f4198d5cecb0fe454a0c36b3b1c1613cb006d1892dbe21","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/829fd8b3-03c0-4469-9f66-20e3b2ed35ad/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.99","blender_version_min":"4.2.0","maintainer":"A. Elbamby","tags":["3darchitect","interior","exterior","animation","architecture","geometrynodes","motiongraphics","archviz","curves","lowpoly"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/72e4a44b-9cd4-4cec-b6f2-047b94c8d5b9/","schema_version":"1.0.0"},{"id":"MRAX","name":"MRAX – Real-Time Overlapping Vertices Fixer for Blender [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":3056,"archive_hash":"sha256:afa36cab047702f58a04708ae2529774106f2b0323de434aa126070b7e82af80","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/13a3df5b-f654-46fe-add9-0e133c54832f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"MR XD","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9fc4b6cc-3948-4e99-9efb-e789757eec5e/","schema_version":"1.0.0"},{"id":"multi_blend_file_merger","name":"Multi Blend File Merger - Merge Multiple blend Files in Seconds [Before: $2.99, Now: $2.54]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":20029,"archive_hash":"sha256:422408ca88216e626bcf0aa425de73ddcb0b34f5da08afc29464406724f20a1d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ec55cd5e-b682-4de6-9fcc-3059b161fb5f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.54","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Pipeline","Scene","importexport","murge","multi","blend"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/21b72c0a-b02d-4a8f-8aa9-3ada5908538f/","schema_version":"1.0.0"},{"id":"multixport_pro","name":"MultiXport Pro [Before: $14.99, Now: $12.74]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":30134,"archive_hash":"sha256:c9a47b80240933e964cb542724e119d7ba371083048bbacf74f72df8535e8571","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/33aad9fb-3784-4116-bded-111e3aab1514/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.74","blender_version_min":"4.2.0","maintainer":"IZ. MdVerz","tags":["Export","Batch","Workflow","Pipeline","FBX","glb","usdz","stl","settings","textures"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/566f5c6c-5985-4746-8f0d-f5fbf256011c/","schema_version":"1.0.0"},{"id":"mutamesh","name":"Mutamesh | 4 Remeshers In One | Instant Meshes, Quadwild, Cwf, Adaptropic [Before: $27.00, Now: $22.95]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":68973021,"archive_hash":"sha256:f369fa140b2ea84fd6b4c6a42ba099f044e7169c819f82fbd59327bf79274097","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/85e371f6-ebbc-424f-9c7b-d2926e50ca3a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"22.95","blender_version_min":"4.2.0","maintainer":"Giambattista Von Nettesheim","tags":["Mesh","Object","Modeling","Sculpt","import","export","remesh","retopology","remeshing","mesh"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d4ca1fc2-a0e8-4ccf-bc6e-076b26d09e7b/","schema_version":"1.0.0"},{"id":"ngone_pro","name":"N-Gone Pro [Before: $12.99, Now: $11.04]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.5.0","type":"add-on","archive_size":21732,"archive_hash":"sha256:7a52568df96c5ee3f424333dad15d6de143868fa544a5de3adf9d6848b09f54c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/435de251-fed3-4859-9da2-0faa4da162b0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"11.04","blender_version_min":"4.2.0","maintainer":"Take Refuge TV","tags":["ngon","optimize","texturing","cad","ngonepro","takerefuge3d","remesh","retopo"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/2511bcbd-0752-4bf2-99d1-01c258f0a4ae/","schema_version":"1.0.0"},{"id":"nodeflow_3_pro","name":"NodeFlow 3 Pro [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.2","type":"add-on","archive_size":64311,"archive_hash":"sha256:d13c9fcbb9e5ac7547c4eb6c1fda5922171daf6870898830adb2a6dad931b20b","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1154d0c0-ccbd-4cd0-8e11-bd1cfccf2e82/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"kanwei sun","tags":["Node","Tools","Workflow","Editor"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8804d2f3-775e-4d39-9f86-a38aa0f95062/","schema_version":"1.0.0"},{"id":"n_panel_navigator","name":"N-panel Navigator [Before: $8.00, Now: $6.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":27286,"archive_hash":"sha256:1800311d9beb2ad4993fa0be51f8216209b20e25c41251a3afe5b1ea8d545569","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ec7b8acc-3471-4df2-ab46-11b58e4be944/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.80","blender_version_min":"4.2.0","maintainer":"belaid ziane","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/72bab743-cb6a-4b75-9d9b-433088728648/","schema_version":"1.0.0"},{"id":"null_game_toolkit","name":"Null Game Toolkit [Before: $32.00, Now: $27.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":28327,"archive_hash":"sha256:519f5dc600ae12492c11bb1a4f8f6d6b90dea42d3d63ad8dfe552e3d4001c9de","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a30bd99b-bd6f-4741-b40f-da8c27dd1656/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"27.20","blender_version_min":"4.2.0","maintainer":"Null Station","tags":["LOD","COLLISION","GENERATOR","EMPTY","NULL","GameToolkit","Game","Assets","Unity","Unreal"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/96b340d7-9c98-4933-8f65-06a676918b1d/","schema_version":"1.0.0"},{"id":"nview","name":"nView [Before: $22.98, Now: $19.53]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.7.0","type":"add-on","archive_size":76727,"archive_hash":"sha256:969eb684b871e4c1af888f818373056c191d00c587370f65e57e57c2dc2c14a3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5deca250-9ea2-4c1c-a49d-1f285dd90f01/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"19.53","blender_version_min":"4.2.0","maintainer":"Spencer Magnusson","tags":["viewport","optimization","object","visibility","performance"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/84286079-1e61-4d2a-a2a1-346733a4df7c/","schema_version":"1.0.0"},{"id":"object_bender","name":"Object Bender [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":74608,"archive_hash":"sha256:154d6d78fe2620b60cc25ebe87054defc72f7eb76c3cad58d86cf4ae6dad2b16","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e109f34e-538e-41c2-928d-40235da450dd/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"belaid ziane","tags":["Bendshape","bender","bend","curve"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/99f1d28a-613d-407f-9078-5231ef79aca7/","schema_version":"1.0.0"},{"id":"object_disperse","name":"Object Disperser [Before: $2.00, Now: $1.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2739,"archive_hash":"sha256:d9b10d648c575ee0b17ee027f20296051e975e2f498673d6a8b16ca697e6de7c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9e53aaad-4490-4f1a-b2be-5b1c42cc3672/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Disperse","Objects","Animation","Instances","Randomize","Rotation","Scale","Effects","Simulation","Dispersion"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/6d31366b-b8a5-4f4e-adf9-667a368a5d26/","schema_version":"1.0.0"},{"id":"objxport","name":"ObjXport | One-Click OBJ Export [Before: $7.00, Now: $5.95]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":9257,"archive_hash":"sha256:932e313907fed8ebe4f7359a41f4e3e0f95745bbd86b1dc049e821cb4083c559","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5f3c0b17-9ba5-4254-96c2-e471011fafb3/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.95","blender_version_min":"4.2.0","maintainer":"Arun C","tags":["obj","export","bake"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/86d262dd-e721-4e42-a024-1e0850e0ddfd/","schema_version":"1.0.0"},{"id":"ocp_studio_v5","name":"OCP The One Click Proxy\" [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"5.0.0","type":"add-on","archive_size":46749971,"archive_hash":"sha256:44bbf8936bbcf524aeacdc5567cb68f6fb98b8e814d5e7d7859c48a470ead90a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ecc13bfc-1e7c-4f24-b97b-122018986710/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["blender","instance","proxy","proxies","speed","fast","prevent","crashes","optimize","viewport"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8aa9dbac-071f-4470-983a-1aee7e67da28/","schema_version":"1.0.0"},{"id":"ocr_image_extraction","name":"OCR Image extraction tool [Before: $3.99, Now: $3.39]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":11397,"archive_hash":"sha256:e6e72c938979613a4a794b2284a75bb0ef8f90f35d07e42c5c8593f9a94ca366","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/056e434b-6a8b-410b-a793-879bde57ddc6/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.39","blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["OCRImageextraction"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/fb621728-6650-4c85-a1a2-e99cbb9267f1/","schema_version":"1.0.0"},{"id":"o_explosion_pro","name":"O'Explosion [Before: $4.00, Now: $3.40]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.4.0","type":"add-on","archive_size":5231,"archive_hash":"sha256:4173b4cdf0ec617585b4f2ad40eac2917293298a27dc016a7c63ba9b6de82ca2","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5e6d29d3-fefd-46a9-9fd9-3db3cee60b55/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.40","blender_version_min":"4.2.0","maintainer":"Yaroslav Okhranchuk","tags":["Animation","Object"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/cbb8e5f5-8642-4e01-a78d-d128904679fd/","schema_version":"1.0.0"},{"id":"oneatlas","name":"OneAtlas | One-Click Texture Atlas Automation [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.2.3","type":"add-on","archive_size":20453,"archive_hash":"sha256:14197ff44de0374d1709be60d844a69cdcac1ef00679d4ae5a9c01f8fc8705d4","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6ca0805c-4a63-44fc-85db-dd7beb1e7d81/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Arun C","tags":["texture","atlas","packing","atlas","baking","pbr","baking","texture","playcanvas","export"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b1e8f5c6-2ca2-4473-88c7-477e06e24ca1/","schema_version":"1.0.0"},{"id":"one_click_age","name":"One Click Age - Instantly Age any Material with a Click [Before: $18.00, Now: $15.30]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.2","type":"add-on","archive_size":224274155,"archive_hash":"sha256:202feaec961debe8852a37397bd4f171cc93b9b7c811cead6e792b89f9a4c759","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/378eaa35-24db-49b7-8142-4e44fbd857d5/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"15.30","blender_version_min":"4.2.0","maintainer":"CG Galaxy","tags":["damage","dirt","dust","edgewear","fingerprints","generators","grunge","oneclickage","realism","surfaceimperfection"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0f5981bd-3ab2-4029-970f-11e75862f2d6/","schema_version":"1.0.0"},{"id":"oneclick_multicam_renderer","name":"OneClick Multi-Camera Render [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.2.0","type":"add-on","archive_size":17131,"archive_hash":"sha256:2522018ef3f2d98e91300c6793f57fb9fe8faea6034be2076bb364a621902c1d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d2ac3991-4417-45f9-9172-615d0568bb46/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Arun C","tags":["blender","camera","render","batch","render","multi","camera","product","render","automation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/31b436e2-7cca-442c-aeee-6f7004275252/","schema_version":"1.0.0"},{"id":"on_the_rocks","name":"On The Rocks (Addon) v1.7.0 | Formations, Bricks, Walls, Walkpaths, Damages, Landscapes, Crysrals, Creations [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.7.0","type":"add-on","archive_size":17635288,"archive_hash":"sha256:22bd48bd5b54bc8b9c1d5be2a97e840667d3ad7ddf724cf0e0ccabcc82000233","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ae2ee1ff-d9ee-47c5-bb92-dbb63e8218ad/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Dennis Hafemann","tags":["addon","rocks","bricks","walls","formation","damage","fracture","landscape","creation","walkpaths"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/68f5fbef-c50c-46c4-a1d2-9ab7d0a26eb1/","schema_version":"1.0.0"},{"id":"open_video_tracker","name":"Open Video Tracker [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"0.2.0","type":"add-on","archive_size":318904565,"archive_hash":"sha256:9207d2b84a10bc3bf33d477424b3d863ae8c4b63d1de89a2f64b8d0cc1fcaa6c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3bd7f89d-10c2-4cce-8a10-440d7fe76faa/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Haseeb Ahmed","tags":["2d","video","tracker","3d","tracking"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ce5306f7-c957-49cd-9e9e-5edcfc47f67d/","schema_version":"1.0.0"},{"id":"orbit360","name":"Orbit360 - One Click Turnaround Animation Export from Viewport [Before: $4.90, Now: $4.16]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.1","type":"add-on","archive_size":15593,"archive_hash":"sha256:281998905bd7fc71b8993a71fa64ffd28394f999a146d0f4f4c24db02e81b13a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/30124300-8ab9-429a-a894-1b532ebf0335/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.16","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Render","Animation","3DView"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d127bdac-1c13-402f-bc58-c955b150004a/","schema_version":"1.0.0"},{"id":"alt_tab_Organix","name":"OrganiX [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":510578,"archive_hash":"sha256:ff24edd79a427cca1f6439c4edbdc950e6acd25b7555d8acf254986fd70085e3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/505441c7-c011-4766-bdaf-ea4730a18d89/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","organix","shapes","modeling","organic","procedural"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b8fd2cd7-0ffb-4576-a64c-d5ba20c10231/","schema_version":"1.0.0"},{"id":"origin_tool","name":"Origin tool [Before: $1.00, Now: $0.85]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1963,"archive_hash":"sha256:ed7ae5e3669860275c5e8477a4e545f39efb15cbe49679994c199b86f8e4c4e6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3773c6ee-5e17-4070-9c0a-bd98af853589/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.85","blender_version_min":"4.2.0","maintainer":"Kornél Kuloványi","tags":["origin","center","bottom","simple","usefull","oneclick","click","asset"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/2e667794-921f-4d6d-82d7-9b2298b69fa4/","schema_version":"1.0.0"},{"id":"output_fix","name":"Output Fix [Before: $3.50, Now: $2.98]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":2056,"archive_hash":"sha256:412d83a0176f31a6d328ecab304d75d38c91eb6aacd163277301bbd0028b76d4","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3d22c368-ccc8-4609-8cc2-a0a23b03edd1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.98","blender_version_min":"4.2.0","maintainer":"AHMED KETTUR","tags":["render","output","folder","directory","automation","rendering","organization","settings","management","file"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/3f2afda8-dce0-4fa3-9aad-44cad17c2043/","schema_version":"1.0.0"},{"id":"tobip_particles_catalog","name":"Particles addon [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":47741747,"archive_hash":"sha256:502c9f726ea418185363df9c3d0947fff2639ca7331895cbbaec3de79cf2a91a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d9e837a8-a78d-433e-bcd6-aa0f8690787e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Suzanne studio","tags":["particles","birds","fish","fly","embers","particle","dust","simulation","butterfly","leaves"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/693ffd00-e10e-4f18-8419-ba55fe48ff07/","schema_version":"1.0.0"},{"id":"perforated_panel","name":"Perforated Panel [Before: $1.00, Now: $0.85]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.0","type":"add-on","archive_size":844690,"archive_hash":"sha256:5e86344238ef6499fc3e0fdc58d591c46f746eb477622e2a34ae46024edfe900","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/49901d46-9785-4550-a0b9-45c81c8b7e06/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.85","blender_version_min":"4.2.0","maintainer":"Abbos Mirzaev","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7b1c87c0-04c4-4272-977e-17ea92ee85b5/","schema_version":"1.0.0"},{"id":"physicsgen","name":"Physics Gen [Before: $4.99, Now: $4.24]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.5.0","type":"add-on","archive_size":4354,"archive_hash":"sha256:8f6a1c5c5c4eec0e0893e94ec9230e2dd78f87e3e2f985da3586c50cdf2aa0d5","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/42bd71ee-5073-4e8c-970f-659b5330a3d4/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.24","blender_version_min":"4.2.0","maintainer":"Ace Of 3D","tags":["easy","fluid","particle","quick","simulation","physics","smoke","generation","sims","animation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/dfe61d32-24aa-4b8d-8bbb-6863cfbe628a/","schema_version":"1.0.0"},{"id":"wk_tools","name":"PickUp Tools [Before: $16.00, Now: $13.60]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.7.0","type":"add-on","archive_size":149362,"archive_hash":"sha256:cfbd5b940ae8191ce873be6d2b813c3bf940521891e33ee82ed75665ffd2ba84","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/16c27c35-8e05-4652-89ee-bd3c7d68d45f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"13.60","blender_version_min":"4.2.0","maintainer":"Wolfram Kampffmeyer","tags":["Animation","Constraints","pickup","walkcycle","foot_sliding","keyframe_tools","pick_up","pin_tool","pickup_objects","stepped_interpolation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/833124e5-42e2-43eb-abcc-d0369083cc72/","schema_version":"1.0.0"},{"id":"pixelator_maker","name":"Pixelator Maker [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.0.0","type":"add-on","archive_size":21168,"archive_hash":"sha256:e140cc12a36bda67d704adb6f7ca250f111630313f356995127313910aa3b0f9","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/8447c058-23b1-4f40-aa04-9e772e8bfa6f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"RUIDO VFX","tags":["NPR","Pixel","Retro","Stylize","Texture","Game","Art","Shader","Node","Blender"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/12da713a-b0be-496b-a8e3-46477249e30e/","schema_version":"1.0.0"},{"id":"playblast","name":"Playblast [Before: $7.50, Now: $6.38]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.2","type":"add-on","archive_size":19161,"archive_hash":"sha256:dca5cd406ed0fd14ee53bd59a6a3cf48e863fe537a3e9f170dd8479d1065892d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3e86e753-19c1-4ab9-9ade-5748f61678ab/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.38","blender_version_min":"4.2.0","maintainer":"carlosmu","tags":["playblast","opengl","render","animation","viewport","user","ui","ux","eevee","maya"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/93ad9257-b229-445b-8277-c702bde1eab4/","schema_version":"1.0.0"},{"id":"POS_shelf_display_generator","name":"Point-Of-Sale POS Product Display Generator (brandPOS) [Before: $35.00, Now: $29.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.0.0","type":"add-on","archive_size":10667988,"archive_hash":"sha256:7b4aba700c52b3bdc15b5f152f8d1267e087295202f024a92bd6570d7336afb7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0efb25ac-de7f-48ca-afa2-5d958419a383/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"29.75","blender_version_min":"4.2.0","maintainer":"brandPOS","tags":["Object","cardboard","packaging","FSDU","display","generator","model"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f2880b5e-ba2f-4f2f-9556-16dd98491c38/","schema_version":"1.0.0"},{"id":"polymating","name":"Polymating [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.1","type":"add-on","archive_size":78737,"archive_hash":"sha256:a129c270d00436e1f8eb0e5f1ba2b6b3d9cb6e143047b9a9d02350d054a708de","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9550396c-6877-48e4-aff2-e427b08aa10d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Mozzarella ARC","tags":["modeling","retopology","topology","sculpt"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/3d3d0b48-a9e1-4081-bfdd-ebe34bcebe72/","schema_version":"1.0.0"},{"id":"Polyviews","name":"Polyviews [Before: $9.00, Now: $7.65]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.1.0","type":"add-on","archive_size":36022,"archive_hash":"sha256:2aac9cae99896126264c23d6025ede4cf88678d25fe2d91947935d7363a179c2","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f7e927ec-5cba-4f39-a855-13f53af93f44/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.65","blender_version_min":"4.2.0","maintainer":"polyspaace","tags":["render","manager","rendermanagement","views","cameras","scenes","scene"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/bb618f47-b9fb-45b8-809d-93569afc7422/","schema_version":"1.0.0"},{"id":"node_file_link","name":"Portable Node Extension [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":220543,"archive_hash":"sha256:9742a530dbfadf2f5d349c8a5b54b891878e955d8daa8fc2004c0221d7f65687","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/aedaca4c-09b3-466d-b9c0-193a81aa8378/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Nicolai Prodromov","tags":["procedural","nodegroups","geometrynodes","extension","community"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d7411d9f-d0ac-4601-bd6b-fb0578fae437/","schema_version":"1.0.0"},{"id":"portal_projection","name":"Portal Projection v1.3 (Addon) | Portals (With Ray Portal BSDF) made easy, for everyone [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.0","type":"add-on","archive_size":2386869,"archive_hash":"sha256:c3365d6bcdbdff2c522f3f1448fad875fb172e94bf461a33fe1334246ac874c0","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/246986dc-770f-425b-9097-ca82ab41b6dc/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Dennis Hafemann","tags":["portal","projection","addon","dimension","mirror","abstract","easy","camera","display","dynamic"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ff5032ec-3c1c-420f-8e11-6cf5fc355815/","schema_version":"1.0.0"},{"id":"pro_aligner","name":"Pro Aligner - Align Any Object With A Click [Before: $7.00, Now: $5.95]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.2","type":"add-on","archive_size":8027,"archive_hash":"sha256:900105e74ba1de500ce56b946e998c2b475b6a2a07345116996736720f1402cf","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/91677678-2957-43d5-a7fb-37bd1d317761/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.95","blender_version_min":"4.2.0","maintainer":"CG Galaxy","tags":["align","rotation","autoalign","proaligner","worldalign","objectalign"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ed839737-ce8c-412c-8753-80a2bc968b59/","schema_version":"1.0.0"},{"id":"Procedural_Sky_System","name":"Procedural Sky System [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"0.2.6","type":"add-on","archive_size":724389,"archive_hash":"sha256:78d907ff64c92dc9fe436fe10cdc90f2fa51f47f1145d4e700a8a10bbb3c37dc","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1a37b04f-dd34-48a1-8184-feceb205e718/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Other Realms","tags":["World","sky","HDRI","shader","cartoon","anime"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/44d6ef69-5132-4e57-bf6e-02e1b7d2075a/","schema_version":"1.0.0"},{"id":"procedural_terrain_generator","name":"Procedural Terrain 2.0 – Geometry Nodes Terrain Generator [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.3","type":"add-on","archive_size":39573,"archive_hash":"sha256:bc1060a598e1f490c0b5f06542dcecfd0afb6e414efdb56dd50d098be5367665","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b359e5f8-dda1-4fa5-a181-f813a3396090/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Studio156","tags":["procedural_terrain","procedural_generation","terrain_generator","landscape","texture_blending","terrain","terrain_mesh","realistic","geometry_nodes","LODs"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9ef8471a-d401-4404-98f9-093837891b43/","schema_version":"1.0.0"},{"id":"product_lighting_setup","name":"Product Autouploader [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":31931,"archive_hash":"sha256:1c78dd9539e0a76f95d94acf2e2c03b6b9f04d73e311c03ef1465e44a195774c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f212cd0a-9d7f-4617-b0a9-ee385e15a631/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"Nicolai Prodromov","tags":["automation","cgtrader","turbosquid","fab","ai","llm","lighting","render","camera","renderautomation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b8679695-2084-4bab-82d7-2a880628e8e6/","schema_version":"1.0.0"},{"id":"psd_layers","name":"PSD-LAYERS V1.6 Add-on [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.6.0","type":"add-on","archive_size":50355,"archive_hash":"sha256:c767d1916b98c2348e38ff329b065a32caae4525a278bcbd3cfdda3e50e7e27a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cf4fc88b-368b-475d-89a2-13706d76324f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Split Studios","tags":["psd_layers","hand","painting","textures","layers","handpainting","paintlayers","paint","texturing","freehand"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b1964db5-95ce-454a-ae93-74a3a17d37a2/","schema_version":"1.0.0"},{"id":"quadify_premium","name":"Quadify Premium [Before: $24.97, Now: $21.22]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.6.0","type":"add-on","archive_size":26623,"archive_hash":"sha256:cbae5724dbd151f7aead7e85d4837a07e8906fc432edcbbb63b8a7cf0a515409","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/02ac2aa9-dae2-4fe4-9fe0-72b540c12116/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"21.22","blender_version_min":"4.2.0","maintainer":"Anvil Interactive Solutions Anibe","tags":["mesh","mesh","optimization","clean","retopology","decimate","low","poly","count"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/6ba7ef6e-9617-4df8-873e-3dac35aadd63/","schema_version":"1.0.0"},{"id":"quadify_pro","name":"Quadify Pro — Studio & Automation Edition [Before: $80.00, Now: $68.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.3.1","type":"add-on","archive_size":28229,"archive_hash":"sha256:32b6547dcdb02a4fe476af0c56288e228e05a1e200b2ca71db15ec6d87cf2e8a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f56e9c8f-1656-4861-a057-7b518f7cf5b0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"68.00","blender_version_min":"4.2.0","maintainer":"Anvil Interactive Solutions Anibe","tags":["Modeling","Mesh","Retopology","UV","LOD","Export","Utilities","Workflow"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/489eaa7f-5ad4-402b-8a65-7404010df89b/","schema_version":"1.0.0"},{"id":"quick_align","name":"Quick Align [Before: $2.50, Now: $2.12]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":30856,"archive_hash":"sha256:cb1e0440c5f4407c455fbd2e5510a508c4982fe3123a9a489420ea00603b482a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5f1d7822-6cd7-4172-b003-f9bc4d6e207e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.12","blender_version_min":"4.2.0","maintainer":"Null Station","tags":["Object","Aligner","Evenly","Distribution","Illustrator","Adobe","tools"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/91bec957-fe14-459a-83cc-5ce477214631/","schema_version":"1.0.0"},{"id":"quick_baker","name":"Quick Baker [Before: $36.00, Now: $30.60]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.2.0","type":"add-on","archive_size":298517,"archive_hash":"sha256:2c8d57ee1a9cd6649bc0c47aa4e25268a79f59c6b1048f94dc9b5f46b78f277f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/98c622be-9269-4ef6-8f29-faae4fb86357/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"30.60","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["object_bake","high_to_low_poly_bake","auto_cage","auto_UDIM_bake","channel_packing","material_bake","node_bake","pbg_texture_bake","texture_baking"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/562b8533-d6d1-4a37-935c-844b59ccf5cf/","schema_version":"1.0.0"},{"id":"quick_color_mat","name":"Quick Color Mat [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2426,"archive_hash":"sha256:384d34cb9c86629eac51f09fa6a1af15ca086b9ffdf75ef2dd3ee88c91370f9a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a2fd6937-de3a-4f24-9ae0-7ce203659515/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"isac lima","tags":["Fast","Texturing","Texture","Material","Color","Picker","lowpoly"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b6528286-f9b0-4dbc-b032-5c479193a350/","schema_version":"1.0.0"},{"id":"quick_decal","name":"Quick Decal [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.7.1","type":"add-on","archive_size":268191,"archive_hash":"sha256:3ba5d820d9b24cda4c9dfcaaad7e949bb21bc3db49be474d22fa509970b328ac","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/8fa1d954-4aa8-423b-b24c-15002f36f247/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["image_decal","megascans_decal","pbr_decal","decal_layer","layer_wear","layer_maps","auto_snap","auto_parent","auto_resize","quixel_bridge"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/03085e38-2e9e-472c-b274-a6870a1dca07/","schema_version":"1.0.0"},{"id":"quick_export","name":"Quick Export Presets [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":3310,"archive_hash":"sha256:cf518a244930f26fa64b6d4dc4021709f5038921a7f1785c1c74059144263c40","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0c357c80-270f-4a10-98c9-cadeb4941c26/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Studio156","tags":["animation_tools","export","export_presets","game_development","quick_export","time_saving_tools","tool","tools"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e90aa9cb-2ee1-46d7-b142-fc123d3ccfab/","schema_version":"1.0.0"},{"id":"quick_highlight","name":"Quick.Highlight [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2168,"archive_hash":"sha256:04df4f1afbcdab212124e22da346cdb6311a67fee86ec844fb08bc81b5dd6b96","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a33ed777-f4b2-4860-8348-3cc3504d5419/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"George Art","tags":["outliner","addon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/88a04d54-5cd8-44a8-972d-bf71dd4b13a5/","schema_version":"1.0.0"},{"id":"quick_interface","name":"Quick Interface [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.0","type":"add-on","archive_size":25611,"archive_hash":"sha256:64a293894e7513a9274c0d4fe2c52a9f543167742a7e0af6542b1441b389261c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b74dc10c-839e-41cf-94f6-0906dc16c07f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["duplicate","split","switch","management","interface","swap","join"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e099f4ab-5188-4607-b9a5-6b12790694c1/","schema_version":"1.0.0"},{"id":"quick_lattice","name":"Quick Lattice [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"0.8.2","type":"add-on","archive_size":5964,"archive_hash":"sha256:f46aa86875dd6e14060aa47a207bc8fde1db70b3da9bd3d90ace0f81cb9b927d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cf79a7ff-8802-4c4e-bbca-a7c46730dc6b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"carlosmu","tags":["quick","lattice","tools","modeling","automatic","modifiers"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/aebbe9e7-732d-4a77-8bc9-855e0a90a396/","schema_version":"1.0.0"},{"id":"bake_material_pro","name":"QuickMat Bake Pro – Ultimate Texture Baking Tool [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":7935,"archive_hash":"sha256:097862a69b82cd13d0ac4a7ed8fc762a7bd26079ba4f68a31cb483ad8733fb0d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a363fa21-1c7e-496e-a584-bcb39090d351/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Studio156","tags":["texture","baking","materialtotexture","material","textures","texturecreator","shader","object"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/45478992-1264-487a-9aeb-23de7fb9d317/","schema_version":"1.0.0"},{"id":"quickmat_pbr","name":"QuickMat PBR – Auto PBR Texture Assigner for Blender [Before: $3.00, Now: $2.55]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":10495,"archive_hash":"sha256:47f2ba1015744e3cb035404188dfb389b28281743027534f6f9c8bf2eaf17616","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b6d254d3-6592-4281-bd4e-dee4bb79c70d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.55","blender_version_min":"4.2.0","maintainer":"Puneeth Saravanan","tags":["Material","substancepainter","adobe","autotexture","Texture","Import_Export"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/52d4ab0f-94b2-4f63-bfef-d86538bae8c2/","schema_version":"1.0.0"},{"id":"quick_measure","name":"Quick Measure v2 [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.5","type":"add-on","archive_size":149550,"archive_hash":"sha256:590b9b24988895ddac71cab3a1cba32bd448f26aad4ae404c7c6ce579ffabbc2","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b2369230-7802-4c18-9fa6-d8e0a325cd18/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["measuring","measures","measure","measurement","measurements","tape_measure","3d_view","measuring_tape"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7074a6d2-6181-4669-9d8b-e13561477abf/","schema_version":"1.0.0"},{"id":"Quick_Origin_tools_v1","name":"Quick origin tool [Before: $1.00, Now: $0.85]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2182,"archive_hash":"sha256:692d1665c5fee4220e79f228ee7c92357bfda113651282424ce6192314e8b5f7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5325a0fb-0f09-4227-9fbd-1658b825fd8d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.85","blender_version_min":"4.2.0","maintainer":"3DAssets Kit","tags":["tool","tools","batch","origin","quick","blender","addon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9d0d5f6a-ea24-4868-8b81-21662abd7d16/","schema_version":"1.0.0"},{"id":"alt_tab_quick_render_preview","name":"Quick Render Preview [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":5971,"archive_hash":"sha256:692f347bf98a84c06c57d3628c023733777b4d5f93dabb14032de8bc46756673","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f3ed45e0-8b26-4b8f-8411-78c66b433860/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","render","preview"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/45eac3d5-9a69-4ea1-8e53-08ba9656447b/","schema_version":"1.0.0"},{"id":"quick_replace","name":"Quick Replace [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.1","type":"add-on","archive_size":106813,"archive_hash":"sha256:55954eb891d859c257510bcd7462d843fb6ffc69b129a8344dfc75d94bffbd62","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4e8b1dca-6edd-4edd-8e79-6c8e1031cb6d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["Object","collection","replacer","placement","tool","variety","blockout","mesh","randomization","replace"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/6ab1d182-6625-4cb8-9b2c-ca4d2c07c111/","schema_version":"1.0.0"},{"id":"quick_theme","name":"Quick Theme [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.2","type":"add-on","archive_size":25703,"archive_hash":"sha256:b2fa794392702d933b726740de51337950654f54d63fc47633d25f257ccf8bc6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/21a9224f-1547-403c-bc20-fe2e09131dad/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["interface","theme","user_interface","custom_interface","quick_theme","blender_theme","theme_maker","3d_user_interface"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c785c99e-f1c2-4fbc-82b8-651761f6101a/","schema_version":"1.0.0"},{"id":"random_object_colorizer","name":"Random Object Colorizer [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":3343,"archive_hash":"sha256:154dfae4dd35cef3d4f2ee5757abd3ef8790e89f0ec4d61f2803c2c8c4b2f7d7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c6fdfec0-fe88-489b-a72a-fb767df8c919/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Studio156","tags":["3d_workflow","tools","materials","Modeling","object_colors","procedural_materials","random_colors","texturing"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/36355162-1705-4223-88ec-f17cb0aa38b2/","schema_version":"1.0.0"},{"id":"raycast_scanner","name":"Raycast Scanner [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":2140094,"archive_hash":"sha256:2b2e2822ab1911da95e7100a079c86a1a9364df9137425aca3523a8f02759db6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/20ccbb56-5810-44ee-aed2-17d56020ea29/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Dennis Hafemann","tags":["3DView","GeometryNodes","Material","Node","raycast","scan","mix","shader","effects","blur"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/61fabc4e-aa4f-463c-8bff-d771f0b85cb2/","schema_version":"1.0.0"},{"id":"ReadyScene_addon","name":"Ready Scene [Before: $2.00, Now: $1.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":4741,"archive_hash":"sha256:6c17f1d4f95da37b2375b5a26890db5cc21eb8cc4dbd620187aeccb89582a928","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f2eacecd-ef95-4fa2-b6ef-8d25415f29a9/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","blender_version_min":"4.2.0","maintainer":"Andriy Charodiy","tags":["parallax","scene","camera","layers"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0f55cc80-1fdd-4d66-9346-9614039486d6/","schema_version":"1.0.0"},{"id":"renametool","name":"Rename Tool [Before: $4.99, Now: $4.24]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":1859,"archive_hash":"sha256:31dcfacba225cd89975fd7f1c19fa3b94cc09f95ce6c07096f628c0676467c8e","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0b9160a3-114e-4c89-9b1d-34c3e2c20444/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.24","blender_version_min":"4.2.0","maintainer":"Peter Harmatiy","tags":["rename","RenameTool","Naming","batch","renaming","prefix","suffix","sequential","numbering"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/759e3e20-389c-4b76-886e-c0b5f777c831/","schema_version":"1.0.0"},{"id":"RENDERBACK_PT_Panel","name":"Render Back | command line rendering made easy [Before: $8.99, Now: $7.64]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.1.0","type":"add-on","archive_size":2469,"archive_hash":"sha256:7eb243aeb9da5906a755214d9e78162c5e867bbd91037dc768e250f5b40314ff","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a520f940-a211-43b4-886f-66606ecf8942/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.64","blender_version_min":"4.2.0","maintainer":"Elton Matiwane","tags":["command","line","rendering","fast","render"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b9d51d20-8ec3-4b14-8da3-0f7413830280/","schema_version":"1.0.0"},{"id":"RenderForgeAI","name":"RenderForgeAI [Before: $25.00, Now: $21.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1879679,"archive_hash":"sha256:0dc385a33ba081c8e7863db348534383ec5c26e0c10d20e728ca70e1466db6c5","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f79e35f5-30a0-4980-8104-67a149695ac4/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"21.25","blender_version_min":"4.2.0","maintainer":"Anvil Interactive Solutions Anibe","tags":["lighting","render","mesh","optimization","AI","denoising","volumetrics"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/244c9e2d-6185-4f62-9501-864aef9d908c/","schema_version":"1.0.0"},{"id":"render_negative_frames","name":"Render Negative Frames [Before: $7.00, Now: $5.95]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1879,"archive_hash":"sha256:2ba36c9790061f0bf0a448114c2cb1719f4a1cffebe061a383f8c4aa7de28039","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/da07005f-b641-4c1f-9587-91cdd6db7c03/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.95","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Rendering","Animation","Frames","Sequence","Negative","Timeline","Output","Preview","Batch","Export"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0eaa2786-bfb2-44d6-aa57-1b3ecdd79892/","schema_version":"1.0.0"},{"id":"Render_Presets","name":"Render Preset Manager [Before: $1.99, Now: $1.69]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2792,"archive_hash":"sha256:586e53a0c3d4c433d5d116672994d69a2a20413e310774af3043e382f0f083c1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/803e583e-48e7-4f43-a923-2b5be440a62f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.69","blender_version_min":"4.2.0","maintainer":"James Middleton","tags":["render","preset"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/03f8285a-7a6f-4f92-9eb0-fa65b40f663a/","schema_version":"1.0.0"},{"id":"alexdepario_render_selected_cameras","name":"Render Selected Cameras [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2760,"archive_hash":"sha256:88bf2295c1d2a4efbdec61981f5b46c9f3d84de1f2ae9aa5214c1aeba2eb8a20","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1428efd1-2258-4adb-9a60-898a271b5838/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Render","Cameras","Animation","Frames","Selected","Keyframes","Output","Addon","Operator","Rendering"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/20a24366-d063-4bae-86a6-64a4801f82b2/","schema_version":"1.0.0"},{"id":"render_toolbox","name":"Render Toolbox / add-on [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.0","type":"add-on","archive_size":51865,"archive_hash":"sha256:7acca1532f7eefc9deb6031439dc7302a55449f02caaab0c1c147ba88eb97bde","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/12596ee0-7bb0-43e0-8936-21c791620c89/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Split Studios","tags":["addon","render","lighting","camera","realistic","hdri","environment","extension","rendering","toolbox"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/01c747ba-fe17-40cc-9a06-ddb66fca62f4/","schema_version":"1.0.0"},{"id":"rendertools","name":"Render Tools [Before: $11.99, Now: $10.19]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.8.0","type":"add-on","archive_size":55255,"archive_hash":"sha256:740459440b6441a7130c3cabdfe29c1b7685b2b9973315e10954bc5815e73454","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/dcf06b24-482e-4e65-a191-d461b65f432b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.19","blender_version_min":"4.2.0","maintainer":"Sérgio Merêces","tags":["render","tools","layers","idtools","image","imagemask","object","objectmask","renderid","selection"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/193a112f-1f47-464f-9481-4eb07e57dfda/","schema_version":"1.0.0"},{"id":"resmax","name":"Resmax - Upscale AI [Before: $14.00, Now: $11.90]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":45049478,"archive_hash":"sha256:0922535ea56912848573cb1b8e9c867351cd9954c6e16a63935818422df6a582","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/15b915f0-42c3-42f8-874f-12e3fca9c4fe/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"11.90","blender_version_min":"4.2.0","maintainer":"PlayfulPixel","tags":["upscale","enhancement","imageenhancement","imagedetail","resolution","upscaling","superresolution","videoupgrade","renderboost","clarity"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b1db2ef8-01eb-4b74-91eb-f5b081e8762e/","schema_version":"1.0.0"},{"id":"retro_console_texture_converter","name":"Retro Console - Texture Converter [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":9399,"archive_hash":"sha256:1318864822da93978eb7171758723f405929829aec55d440b4fab81118e7b5fd","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/78f3c85b-c1cb-4a5c-b81d-cee1fdbe535d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"Prince Eagle","tags":["Retro","Console","Converter","Textures","Materials","Playstation","Shader"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f2a4899f-8937-42b9-86d4-b383275c19bc/","schema_version":"1.0.0"},{"id":"rigify_exporter","name":"Rigify Exporter [Before: $10.50, Now: $8.92]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.2","type":"add-on","archive_size":16044,"archive_hash":"sha256:95201c3b8e3ab682a4a0a9fa84d178e68a72015bb9661b3c53cfeba822cf31c7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a9df93c3-029c-4df1-a457-a9e93e2eac07/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.92","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["export","rigify","unreal","unity","godot","addon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ac766b5e-b730-4763-aba8-fe8f4bea7544/","schema_version":"1.0.0"},{"id":"rigify_retargeter","name":"Rigify Retargeter [Before: $10.50, Now: $8.92]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.4","type":"add-on","archive_size":35670,"archive_hash":"sha256:ba465227fe10b5731fbbd72b1a12ff7dd376147ba171e1e3fc59c7fa6d28b988","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4062d4f5-5005-4a0b-a5b8-600147ef7ace/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.92","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["retarget","retargeting","retargetting","bones","rigify","transfer","animation","rigging","rigger","rig"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/08108568-865c-4219-87e7-144df8ab7fa2/","schema_version":"1.0.0"},{"id":"roomgenerat","name":"Room Generator [Before: $30.00, Now: $25.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"0.1.5","type":"add-on","archive_size":13147073,"archive_hash":"sha256:408e1f53f825b1b51bc0382ee284088fa14c879e4b6dee8937fd1ee95dc9864d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/876190c8-55e4-4aa1-8a45-cb9e98a99fdd/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"25.50","blender_version_min":"4.2.0","maintainer":"Vixymiles","tags":["room","generator","interior","ceiling","wall","window","architecture"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/bf65ecc1-78e8-47f1-a396-ae75374e7c0d/","schema_version":"1.0.0"},{"id":"scale_print_camera","name":"Scale Print Camera – Pdf & Exact Scale [Before: $16.00, Now: $13.60]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":43786,"archive_hash":"sha256:b53a1ba15aaf4cf1c20493dd9e7b7e13f0250d8424c9aebf22d10ed3a7c5079a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9f78b53c-ae4a-4785-89a1-09cac3296ab5/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"13.60","blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["blueprint","camera","construction","dpi","orthographic","pdf","print","scale","paper","render"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/08f3b586-69b8-4fef-8b34-09426bb88b06/","schema_version":"1.0.0"},{"id":"scatter_forge","name":"Scatter Forge [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":1238739,"archive_hash":"sha256:fb6bed06c1de23c9d97d80672a4ecedf7744d6a7697ba851ed2967bee46d487f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/86ccd088-496e-4545-91c9-c3bda91d4162/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Spectre 3D","tags":["developement","lod","GameDev","Export","Procedural","Scatter"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/561addae-d8e9-497f-9c73-961d3d0ab281/","schema_version":"1.0.0"},{"id":"scenesweeper","name":"SceneSweeper - Clean-Up Commander [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":23168,"archive_hash":"sha256:869b3b93d15c2f7d138697210c3434c97e31849e776517c73185fd4f4eda5f80","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/00dea756-3878-4037-9217-dfc0032a74d9/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"PlayfulPixel","tags":["SceneManagement","Cleanup","Utilities","Workflow","DataBlocks","Optimization","Performance","Organization","Automation","Productivity"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f5484694-9251-4738-a018-90ae5083fdc7/","schema_version":"1.0.0"},{"id":"wk_schematic","name":"Schematic Editor - Visual Rigging Made Simple [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.6.0","type":"add-on","archive_size":521232,"archive_hash":"sha256:87a909f4c84bd36882d49892e8f0089593c875c709cab79383ee0416d76bd441","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/bbae16e8-181e-4085-a68a-dae314c11e6c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Wolfram Kampffmeyer","tags":["Schematic","Rigging","Hierarchy","Constraint","Editor","Visualization"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/92b4b030-65f1-48eb-84d9-4f3786c9ba9d/","schema_version":"1.0.0"},{"id":"SeasonSlider","name":"Season Slider [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":46257,"archive_hash":"sha256:562d8eaa29b82b144bba800ce5f367e204d11e7f4d96929940437db0fc33b0f3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/715e7d64-0f61-49a6-baad-20d5ab634e51/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Mutanzom3D","tags":["Season","Material","Node","forest","nature","trees","tree","seasons"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/40705d46-2d85-44fd-8d8b-1db3e6f7a1b0/","schema_version":"1.0.0"},{"id":"sectionbox","name":"Section Box - Cross Sections, Elevations, And Visualization [Before: $29.99, Now: $25.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.4.4","type":"add-on","archive_size":11622841,"archive_hash":"sha256:b8eddfe0914b5f30ff217551afcd296911b787991d02e90fe87898120a48e56a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b2137d5e-b914-4c5a-94f3-891ed96982e1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"25.49","blender_version_min":"4.2.0","maintainer":"Ruben Messerschmidt","tags":["section","box","cross_section","elevation","archviz","architecture","plan","drawing","floor_plan","cut"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/42a79447-b3f5-4683-a253-73d7360142a8/","schema_version":"1.0.0"},{"id":"selective_wireframe","name":"Selective Wireframe - Per-Object Wireframe Control for Blender [Before: $4.00, Now: $3.40]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":10492,"archive_hash":"sha256:d1a68e64f6698d3e1aff0c7f56381d0189a3f4ed0b128efc3f06bca6f535779b","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/7484f1ab-1e0a-4050-975e-f5b93c1e1d78/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.40","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Selective","Control","wirframe","everyobject"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5713302f-2e45-4815-b89d-f3d9dd9ceeb7/","schema_version":"1.0.0"},{"id":"Select_Objects_with_Same_Vertex_Count_extension","name":"Select Objects with Same Vertex Count [Before: $0.99, Now: $0.84]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.2","type":"add-on","archive_size":1445,"archive_hash":"sha256:f3e259eceeebeb7c6455e1e9bab7e6686a2c67517723d927a2895d999aba37b2","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2de46965-3ca1-4838-a586-cbef081e83b5/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.84","blender_version_min":"4.2.0","maintainer":"Mesk911","tags":["vertex","match","count","mesh","dupicate","select","tool","object","same","similar"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/61bfc41c-f84a-43e3-8c82-a94883475530/","schema_version":"1.0.0"},{"id":"set_origin_to_center_bottom","name":"Set Origin to Center Bottom [Before: $2.00, Now: $1.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":1838,"archive_hash":"sha256:81c9c1e0b887bc18f5e413ca02edfa649da3df61230e2ffca2f3f04a19c1072d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/938e3395-7979-475e-b3f9-7d080db2caf4/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","blender_version_min":"4.2.0","maintainer":"Mutanzom3D","tags":["origin","center","bottom","tool","qol","qualityoflife","object"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7381a6d4-7480-4a6c-8beb-10180bdb7169/","schema_version":"1.0.0"},{"id":"shakemaker","name":"ShakeMaker [Before: $5.49, Now: $4.67]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.5.0","type":"add-on","archive_size":14206,"archive_hash":"sha256:36e39fdd146abe3cf1d89d7ad4bbcc6cb3e70b140a09812592aaf647fa7c1ea6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5e557337-8452-4b1d-b932-c7a1a889f397/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.67","blender_version_min":"4.2.0","maintainer":"Ace Of 3D","tags":["shake","vibrate","waggle","wiggle","wobble","noise","animation","modifiers","camera","fcurve"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/aafd9aeb-eda8-4ee4-b7fd-28ae1edad90d/","schema_version":"1.0.0"},{"id":"shape_key_fixer","name":"Shape Key Fixer - Manage All Scene ShapeKeys with Groups & Batch Tools [Before: $8.00, Now: $6.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.5.1","type":"add-on","archive_size":18152,"archive_hash":"sha256:42cf19cca7b18383d173077cd7db74c46dabe6b71cab8fbebcd2fedbe110236a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0028e4ac-0b4d-4dc6-a2ff-062075fcf0c6/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.80","blender_version_min":"4.2.0","maintainer":"Junaid Alam","tags":["animation","blendshapes","rigging","productivity"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/1f14a313-1319-4921-8043-394825fcf083/","schema_version":"1.0.0"},{"id":"ShareTextures","name":"ShareTextures Asset Library [Before: $24.99, Now: $21.24]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":783093,"archive_hash":"sha256:65e40563f57e0fedf66457e7c8c74154c1b32a7cf16c1222436cc96342eccb3b","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/78eb7228-b341-48a2-a9d7-51616bf758b2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"21.24","blender_version_min":"4.2.0","maintainer":"Share Textures","tags":["Object","Material","Pipeline","UserInterface","asset","library"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/822222fd-6e10-4da6-960d-cb12d7ec3fbf/","schema_version":"1.0.0"},{"id":"jd_shot_handler","name":"Shot Handler [Before: $12.00, Now: $10.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.0.2","type":"add-on","archive_size":49735,"archive_hash":"sha256:f113416a330accfae028bb41d95cb7014d2f1967c4b80653dc98c870f29836d2","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/192ad77b-1fb6-4557-ab75-0ea250e15b85/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.20","blender_version_min":"4.2.0","maintainer":"dubCUT","tags":["shot","render","camera","scene","manager","collection","shader","overscan","set","setting"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/93e43d6b-8f20-478b-bb88-94c4ac387d4b/","schema_version":"1.0.0"},{"id":"shot_manager_pro","name":"Shot Manager 2.0 Pro [Before: $38.00, Now: $32.30]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.8","type":"add-on","archive_size":23074944,"archive_hash":"sha256:b080facde94917a3b2068cfd3e732276bf864d33e8d98f002c42063db877638d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d2837608-7be5-4489-9092-cc6e99579609/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"32.30","blender_version_min":"4.2.0","maintainer":"Other Realms","tags":["shot","takes","macros","states","batch","render","burnin","burntin","stamp"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/2ace843e-c14f-4eda-b697-fb7065f344d1/","schema_version":"1.0.0"},{"id":"simple_layouts","name":"Simple Layouts - Full Version [Before: $12.00, Now: $10.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"0.1.5","type":"add-on","archive_size":308012,"archive_hash":"sha256:c773d88ee7a6158743c98df12a7ab8c81f844b0efb9d3da28f0f8f5b57a75520","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d23f80fe-e4d5-473e-b702-a3ca1a3c9949/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.20","blender_version_min":"4.2.0","maintainer":"Other Realms","tags":["Layouts","states","Views"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ce426630-5dd8-408b-a2a5-8140b1c4676e/","schema_version":"1.0.0"},{"id":"simple_section_box","name":"Simple Section Box [Before: $2.00, Now: $1.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.0","type":"add-on","archive_size":2190,"archive_hash":"sha256:de5bcf5bf9a3cfd8b3773925b91061c63fa50a44cd032def5b7f44bf3e7c04b9","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d94ae717-877e-4477-9b5d-0f1d46cb2fc9/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","blender_version_min":"4.2.0","maintainer":"Braulio Pedraza López","tags":["archviz","photogrammetry","beginner"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/dcb1a05a-5fb3-41b6-87cb-d4a15320d160/","schema_version":"1.0.0"},{"id":"simplify_plus","name":"Simplify+ Add-On: Viewport Perfomance [Before: $23.99, Now: $20.39]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":136739,"archive_hash":"sha256:957887d9eef18a40d9d095f20c09aa90ccf0706556582b0f7dfe27eebdcd9bb6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e426bc0d-aba8-4a45-9455-3301de1f9864/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"20.39","blender_version_min":"4.2.0","maintainer":"Cosmo Mídias","tags":["addon","performance","productivity","animation","viewport","playback","speed","workflow"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/55548ced-165b-42b0-8cc2-1fa1a842fc7d/","schema_version":"1.0.0"},{"id":"wk_sliceform","name":"Sliceform PopUp Maker [Before: $27.00, Now: $22.95]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.5.0","type":"add-on","archive_size":967509,"archive_hash":"sha256:94ec87ede7ebadd708c879d1476a48b2e3d4589968ca74660477aa757348a49a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/38007a37-f2d7-4cb4-a9eb-c10b1a465b3c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"22.95","blender_version_min":"4.2.0","maintainer":"Wolfram Kampffmeyer","tags":["sliceform","3d_slice","cardboard","interlocking_objects","lasercut","maker_tools","papercraft","paper_designer","popup_card","svg_export"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ee2ffd44-5bed-40e0-be94-43b22b2e80e3/","schema_version":"1.0.0"},{"id":"smart_autosave_pro","name":"Smart AutoSave+ (Basic Tier) - NovaStrikes [Before: $7.99, Now: $6.79]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"7.0.3","type":"add-on","archive_size":7530,"archive_hash":"sha256:fbe220ec55dcf6147bd900c982c9c1c91fa53c725dd5e00af7c1997aac7fb987","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/db1b49a2-df3a-47ba-ab65-25cd7390ffd6/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.79","blender_version_min":"4.2.0","maintainer":"NovaStrikes","tags":["crash","autosave","scene","safety","backup","system"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c45fc3db-f2a8-4375-a767-48bffaf432d6/","schema_version":"1.0.0"},{"id":"smart_explode","name":"Smart Explode [Before: $45.00, Now: $38.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":16997,"archive_hash":"sha256:edd41a20f4dce1fa76ffb3a26e3bf5b7f2c29e371d93bfc95de374ac51334846","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a367bd41-63eb-4ae9-8ca3-bdac8bf22b91/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"38.25","blender_version_min":"4.2.0","maintainer":"Daniel Farjoun","tags":["Explode","Animation","Archviz","Product","Exploded_View","Procedural"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a152acb9-f8b5-41df-b32c-3b2d4790a934/","schema_version":"1.0.0"},{"id":"snappy_rigger","name":"Snappy [Before: $10.50, Now: $8.92]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.1","type":"add-on","archive_size":1611955,"archive_hash":"sha256:5cdfb0505d2ca3d36950ecbbc1cd96b596560b1b55a377e8f3ed890afd9d8a90","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1e185e45-f252-42fb-826f-a92758a279e0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.92","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["Rigging","autorigger","bones","detection","generator","snappy","blenquick","rig","autorig","rigger"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c9841f8d-5056-41a5-972d-6c6cea2fd4d4/","schema_version":"1.0.0"},{"id":"snb","name":"S N' B [Before: $15.50, Now: $13.18]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1805284,"archive_hash":"sha256:826022da741496e2bfb479210c70aea724940905a9e2cda70157fdaf18245282","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b6ccf2a5-e4bc-43c3-bd9f-ee16b1356dee/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"13.18","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["autorig","bind","detect","bones","generator","snappy","rig","rigging","blenquick","autorigger"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/69166c70-d867-42a9-8846-feb826e3f600/","schema_version":"1.0.0"},{"id":"solaris_creator","name":"SolarisCreator Pro 2.0 - One click cinematic lighting [Before: $69.00, Now: $58.65]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.1.0","type":"add-on","archive_size":119504,"archive_hash":"sha256:dd615b28346d058e294ca290702c65e5f40d2e296fd34259901fc0a0907da17b","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/89e09bd7-6e08-43e3-bd86-f19eae7d8e31/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"58.65","blender_version_min":"4.2.0","maintainer":"Digi Motion Studio by Viet Luan Tran","tags":["sun","lighting","daylight","night","sky","hdri","setup","settings","light","nightlight"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/78fdf920-b5dd-4e2d-ae89-d6c53ac7bc2f/","schema_version":"1.0.0"},{"id":"sort_objects","name":"Sort Objects [Before: $6.00, Now: $5.10]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2080,"archive_hash":"sha256:acf397a1ef0376442ae348b5eda74aec9f0787b232ac393b33f7b33b09fa8e15","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a3326e40-fbc9-49a2-8576-35963c0d3cd2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.10","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Sort","Objects","Interface","Collections","Organize","Faces","Materials","Meshes","Type"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/90804401-0756-4678-bbee-9482723b8db3/","schema_version":"1.0.0"},{"id":"space_generator_v1","name":"Space Generator [Before: $10.50, Now: $8.92]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.2.2","type":"add-on","archive_size":543142656,"archive_hash":"sha256:bf244277a9289813f557ae3153b0b92dec287f35885c4b56d5748e2ff94228c4","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4a90ff4c-f314-4305-8b50-bfde82d66719/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.92","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["Space","Universe","Planet","Moon","Sun","Star","Exoplanet","Asset","8k","4k"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8ec3496a-1c6d-4137-beed-afb1618aa0b6/","schema_version":"1.0.0"},{"id":"specific_frame_render_manager","name":"Specific Frame Render Manager [Before: $7.00, Now: $5.95]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.2.0","type":"add-on","archive_size":20677,"archive_hash":"sha256:cc7100833c9dac256ee3f9cbed2ae1c3337293d751b8093dac34dc124be08941","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/39497e95-b0f5-444b-8a69-96af1a461025/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.95","blender_version_min":"4.2.0","maintainer":"RUIDO VFX","tags":["Render","Camera","Output","VFX","Batch","Pipeline"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/eda01abf-f2e3-4f3c-b7e4-3441c6dd4e2c/","schema_version":"1.0.0"},{"id":"stairs_maker","name":"Stairs Maker [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.5.2","type":"add-on","archive_size":1954483,"archive_hash":"sha256:12ccbe83ae847b6db4b544475b1ecc8ca59e80a09d5a6bf95d622a2eb89dd0c8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2ed4b3c4-8150-4715-a93d-c8f8eced6e5e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Blender Bash","tags":["stairs","architecture","maker"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9489f9e0-91cc-414f-a7c0-b637a70a4eae/","schema_version":"1.0.0"},{"id":"starconnect_pro","name":"Star Connect - Smart Mesh Triangulation [Before: $19.99, Now: $16.99]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.4.0","type":"add-on","archive_size":128633,"archive_hash":"sha256:5cac8b7f6fd6438709d3d9ba30a7136f3d5d23ae172b1e38eb6ae0e8fb189ed8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4aa3f685-f52b-4f66-9762-771ec163c0a3/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.99","blender_version_min":"4.2.0","maintainer":"Ruben Messerschmidt","tags":["triangulation","mesh_triangulation","star_connect","hard_surface","mesh_clean"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4b59c688-c13b-4611-8e18-98ad327133c9/","schema_version":"1.0.0"},{"id":"surface_effects","name":"Surface Effects – Procedural Material Enhancer [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":23835,"archive_hash":"sha256:db1541adbb92cd4aa13b3bd73bb0c57bb7cde085c11536f63d0a887da810c828","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/290a8fcd-eec1-421c-9b4e-dc8a5f99e3ee/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Studio156","tags":["procedural","effects","rust","scratches","wetness","dust","edgewear","material","nodes","surfaceeffects"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d212f51d-4f0e-465e-9ac3-883925e83903/","schema_version":"1.0.0"},{"id":"SurfacePainter","name":"Surface Painter [Before: $9.00, Now: $7.65]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.0","type":"add-on","archive_size":36113940,"archive_hash":"sha256:26a3e456bf03fb45ab2912e4c3b659b38cf2b9a9c298f550a7d1f54c0b8a6735","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/63e9f89c-0d70-43bf-9b99-9e88f3a4864b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.65","blender_version_min":"4.2.0","maintainer":"polyspaace","tags":["materials","painting","surfaces","modelling","pbr"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f504ec5a-642c-4947-8cb3-b25523bf186e/","schema_version":"1.0.0"},{"id":"survey_points_annotator","name":"Survey Points Annotator – Geodetic & Construction Workflow [Before: $19.00, Now: $16.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":60460,"archive_hash":"sha256:2653c075f02776bdff274fad70e43d9885a8d40d3f0aa4021202a97809ce4599","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/fa217ed0-dcaa-4fe7-81df-79e16c617683/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.15","blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["3DView","UserInterface","Mesh","Object","Annotation","Survey"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/47132746-52bd-43fd-89a4-82a5432aa9a1/","schema_version":"1.0.0"},{"id":"survey_points_exporter","name":"Survey Points Exporter – Geodetic & Construction Workflow [Before: $19.00, Now: $16.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":39261,"archive_hash":"sha256:7296dc8dada42dda5ee981c8f96b7b6598c300c5d2ddfa0caff01dd91904e42a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a382e44d-af3f-4af1-99df-7334a13272f2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.15","blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["Export","Survey","Coordinates","CAD","GIS","engineering","construction","geodesy"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4a5b032a-90aa-4148-9e40-f7318a5eaf17/","schema_version":"1.0.0"},{"id":"survey_points_importer","name":"Survey Points Importer – Geodetic & Construction Workflow [Before: $19.00, Now: $16.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":48116,"archive_hash":"sha256:07dae0d5d8f657eb750fc5b2599c3398a22017f881d5331a27ba40033f4ebd30","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/18d5b865-6a8d-42eb-a74b-820c69792a9f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.15","blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["survey","CSV","CAD","points","geodesy","construction","engineering","BIM","coordinates","import"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/aa5ffc37-f082-4bf9-96f7-cf24ccf16575/","schema_version":"1.0.0"},{"id":"survey_terrain_tools","name":"Survey Terrain Tools – Geodetic & Construction Workflow [Before: $19.00, Now: $16.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":43979,"archive_hash":"sha256:ec0f9da235bf43c1719622cf91a37f5fb38e880201ae9f6c7dce6e54661f88a6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/317055ca-0c25-4d4e-ab6d-5a8d9c48b7df/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.15","blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["3DView","UserInterface","Mesh","Survey","Terrain","Measure","terrain","Slope","geodesy","survey"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/aeb85251-1fca-422a-ad99-acc4acc934a5/","schema_version":"1.0.0"},{"id":"svg_exporter","name":"SVG Exporter 1.1.0 [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":67446,"archive_hash":"sha256:5f1feb0d46de24a8816f6d6d0fe4baffba23e6b3855054571c9d918b209f1b46","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a85d69f2-e9f0-4525-8389-d629065c27c1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Nicolai Prodromov","tags":["svg","export","illustrator","vectors"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/3c751ebd-c083-408b-a82a-50ad796f78ec/","schema_version":"1.0.0"},{"id":"textopbr","name":"TEXtoPBR [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.5.0","type":"add-on","archive_size":15465,"archive_hash":"sha256:7dc82c0e29fc8a939fd4480d424cf0707df2bfe08d83578017dba0211e62aa50","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b351eeb4-d93a-4473-9c48-68c6e1828b07/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Split Studios","tags":["pbr","material","texture","textures","textopbr","addon","extension","shader","generate","displacement"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c9c54d68-ae48-4d39-bd29-5109652c19bf/","schema_version":"1.0.0"},{"id":"texture_resolution_manager","name":"Texture Resolution Manager [Before: $9.99, Now: $8.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":5016,"archive_hash":"sha256:2acab6532846076f2be8681a9fe3728a88e475e4d5e9129f1b2954374e524f8d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/64c383b8-7cc0-4841-90da-d96936742246/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.49","blender_version_min":"4.2.0","maintainer":"Doctor Legion","tags":["Material","textures","texture","resolution","manager","8k","2k","8kto2k","vram","crash"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/dbf87b90-4f14-4b5b-b1b6-94a42a56607d/","schema_version":"1.0.0"},{"id":"Texture_Setup","name":"Texture Setup [Before: $3.00, Now: $2.55]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":3275,"archive_hash":"sha256:cf87113efe4f2741f72324e75b0b7d22a511a9d838afe3272ee70026f9a20b0c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/304da0fb-42b6-4763-b035-e7a1f872631a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.55","blender_version_min":"4.2.0","maintainer":"ImNoah","tags":["texture","setup","pbr","material","easy","beginner"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/1bc8d1e5-30ec-4f13-970f-753bb85d3933/","schema_version":"1.0.0"},{"id":"Texture_Tools_Addon","name":"Texture_Tools_Addon [Before: $9.99, Now: $8.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":6640,"archive_hash":"sha256:da5b85b68abcc1a6a9d40235e689d142a16f871f50f6b9f948d6b121728514fc","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4f3c8941-ea6e-4a95-9247-e5bbea96fd88/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.49","blender_version_min":"4.2.0","maintainer":"Amal David","tags":["UV","UV_tools","texture","modelling","generic","symple","decal","trim"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/2b074e8a-844b-458a-a01b-84cada557d0f/","schema_version":"1.0.0"},{"id":"texture_upscaler","name":"Texture Upscaler - Offine Image Upscaler For Blender [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.0","type":"add-on","archive_size":200727626,"archive_hash":"sha256:6a71e383d902259c98be3deed66ebb7426c32aa2faf638295e6e4a0ab15078e5","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6964e35b-6cf3-484e-ab91-e8600f5b418f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Haseeb Ahmed","tags":["upscale","texture","PBR"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/999f5f40-469c-4d46-8647-42babafe320e/","schema_version":"1.0.0"},{"id":"Texturology","name":"Texturology™ | AI PBR Textures from a Single Image in Blender [Before: $19.50, Now: $16.58]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1459005875,"archive_hash":"sha256:466e058cf39b8566902b14f79011afc18d525d1a0a7e3b6448b65e287463f644","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/7c5ce419-191e-4784-aa05-9d2ecbb7aa07/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.58","blender_version_min":"4.2.0","maintainer":"Giambattista Von Nettesheim","tags":["addon","Substance","3D","AI","Upscaling","Inpainting","materials","PBR","texturing","imagetomaterial"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9d7fb688-d32f-4b21-acb7-a8726d96ddd9/","schema_version":"1.0.0"},{"id":"hstb_pro","name":"The Hard Surface toolbox v 2.0.7 i2M image to mesh system and importer [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.7","type":"add-on","archive_size":159086065,"archive_hash":"sha256:1965899e1578da49188a948210b5700cf32c08c2831608397ebaa2efeea62a68","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f4e2fa57-414d-421d-a2f0-ec909578a309/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["HardSurfacetools"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8c9ca364-7c7b-4a70-86b9-28e94fd80583/","schema_version":"1.0.0"},{"id":"Tiles_Importer","name":"Tile Importer [Before: $30.00, Now: $25.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":944337,"archive_hash":"sha256:e397582008ec0eee3d81c380277ea2b6d4dcf988db8b704c236b06c681110003","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/dca9bd98-0e9b-42a2-ac97-6ab9825627b2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"25.50","blender_version_min":"4.2.0","maintainer":"Haseeb Ahmed","tags":["map","blosm","google","3d","tiles"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b62311af-f1bc-43d8-845a-cdd313f32dbe/","schema_version":"1.0.0"},{"id":"time_click_tracker","name":"Time & Click Tracker - Break Time Reminder [Before: $1.00, Now: $0.85]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":27509,"archive_hash":"sha256:d3992f7f2086e8b98e0273945711ca1f4285c18f8afea9d3de2a439d3343dd11","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/18721170-d0fd-45f2-99ef-0d1a158fb5c0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.85","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["System","Productivity","Tracking","Analytics","Workflow"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7da69ca1-9644-4e75-b295-e58368813c60/","schema_version":"1.0.0"},{"id":"timelapse_studio","name":"Timelapse Studio V1.0 [Before: $3.00, Now: $2.55]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":257056,"archive_hash":"sha256:41fd3f67885ff8ba32652e9145ac1eec5c7c95cc791827a954e5e10a1cea4f55","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/37f01828-add1-4a34-971d-914731b8378f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.55","blender_version_min":"4.2.0","maintainer":"Rohit Punnen","tags":["timelapse","hyperlapse","screenshot","video","tutorial"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a3f446a9-e8bb-422e-bfc5-d424d1c421a4/","schema_version":"1.0.0"},{"id":"trimotion","name":"Trimotion-Animation Optimizer [Before: $32.00, Now: $27.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.4.0","type":"add-on","archive_size":55849,"archive_hash":"sha256:dad0d50ae418ffb09385ea1ae481d8bc5df9dcb71b92fb1f51c6921cfffd4eed","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f1077232-0301-4173-bd04-bc7a4eff4422/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"27.20","blender_version_min":"4.2.0","maintainer":"Null Station","tags":["animation","optimization","cleanup","mocap","simplifier","tools","rokoko","curve","motion","keyframe"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/07044b73-ff12-424f-b4ce-3240d1bae740/","schema_version":"1.0.0"},{"id":"trim_sheet_express","name":"Trimsheet Express [Before: $19.99, Now: $16.99]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.4","type":"add-on","archive_size":44729,"archive_hash":"sha256:7f03b201ca49a0146bbe4d2ef7a1eadf1acdecc0374e7a2502ea7d77ccf3d530","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/fa7c57f2-bbfd-48ba-9bab-1b3efed7ab91/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.99","blender_version_min":"4.2.0","maintainer":"Troublesome Eissa","tags":["trimsheet","texturepacking","baking","sheet","materials"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/24639bd7-bbf1-40cf-950c-2454ab9d1a7a/","schema_version":"1.0.0"},{"id":"ultimate_animation_suite","name":"Ultimate Animation Suite [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":26615,"archive_hash":"sha256:a0a86c9d504534758288888410cf529c8ce667664a2aed66a7f223cdc42b0bbe","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3c058999-83d8-4000-be61-85b8bf94a9f0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Anvil Interactive Solutions Anibe","tags":["animator","camera","3d","3danimation","camerapreset","animationtool"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/39ea8e25-2663-4105-a6a1-cdb8d127920a/","schema_version":"1.0.0"},{"id":"ultimate_camera_shake","name":"Ultimate Camera Shake Generator [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"5.5.0","type":"add-on","archive_size":18381,"archive_hash":"sha256:174b87c45d0d37958df4ca2a6d2f9edeb4217e132f6f44072e19ed2f877e0346","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/50ed10f9-3d98-4ebd-943d-d90340969fa5/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"RUIDO VFX","tags":["Animation","Camera","VFX","Shake","motion","cinematic","keyframe","tool","vibration","rotation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ec291b17-d50a-45c6-93bf-d0167068bf69/","schema_version":"1.0.0"},{"id":"ultimate_outline_generator","name":"Ultimate Outline Generator (Eevee & Cycles) [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.6.1","type":"add-on","archive_size":17488,"archive_hash":"sha256:93f174a95ce78dea36cbbb201b75d0e739a40721082ee5d53600f74fa37ce1e7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0165ea8d-1699-496e-a9bb-b48527de552d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"RUIDO VFX","tags":["Eevee","Stylized","NPR","Toon","Anime","Lineart","Solidify","Shader","CelShading","Comic"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e6b21427-bd81-4bfd-a646-aa3647c805f1/","schema_version":"1.0.0"},{"id":"ultimate_stopmotion","name":"Ultimate StopMotion Generator [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"14.2.0","type":"add-on","archive_size":23597363,"archive_hash":"sha256:43b06e603082bb54410d9ac2df98b2bf7e455250489cc1077e6322555893dae3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/bdecf7f1-8739-4429-93c9-167e8e46d5ee/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"RUIDO VFX","tags":["Animation","StopMotion","Keyframes","Timing","Stylized","Tools","frame","nose","jitter","claymation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7c989c2a-f7dc-42b0-a2ca-968912384ff8/","schema_version":"1.0.0"},{"id":"ultimate_toonshader","name":"Ultimate ToonShader Generator [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":18967,"archive_hash":"sha256:46cb4e81cadfeb449a090f56e07799ab99a17eed3a3906b2178c7934fe2f8f54","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/8efcf29c-80a1-4b25-95e9-c58c81aa23c6/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"RUIDO VFX","tags":["Render","Shading","Stylized","NPR","Materials","toon","shader","comic","anime","2d"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4573ad1e-77a2-4c52-9cc2-baa44f4a6dbb/","schema_version":"1.0.0"},{"id":"undo_history","name":"Undo History [Before: $4.00, Now: $3.40]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":1268,"archive_hash":"sha256:ec7b88c1fbdd7e24b8b34597ca78c8383c80035b65f47999ce849ab4633a76b3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/db09a89d-721d-4f74-83a8-6d0ba607ae25/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.40","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Undo","History","Interface","Navigation","Workflow","Redo","Panel","Tools","Actions","Shortcuts"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/110a0e8d-f1d8-4479-9c3b-9188da0f4fc2/","schema_version":"1.0.0"},{"id":"upscalar","name":"Upscalar | The Image AI Upscaling For Blender [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":679178887,"archive_hash":"sha256:4317b3a0a42e7699e5429e570d07193be262e09462c6822ad63222c11a984313","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f4c9026f-9bc3-4048-8e4c-f29ae7026bf5/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Giambattista Von Nettesheim","tags":["4k","enhancement","Super","Resolution","image","editor","upscale","lookdev","upscaling","compositing"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/237e6171-8869-4612-bd5e-a3ca427ef5a4/","schema_version":"1.0.0"},{"id":"uv_king","name":"UV King | Single-Click UV Unwrap & Pack for Blender [Before: $17.00, Now: $14.45]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.2.1","type":"add-on","archive_size":1531633,"archive_hash":"sha256:d21e31cbcaa2b3587163abe394472c4024d10a76b8fd618f7b40116a2a090f33","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f6e89e4f-2dd5-4394-9e2b-2149dc2e6e15/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"14.45","blender_version_min":"4.2.0","maintainer":"Arun C","tags":["UV","UVPACK","UVunwrap"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/6c03319b-087f-4446-a9bc-959f4e0eea65/","schema_version":"1.0.0"},{"id":"vfx_scene_builder","name":"VFX Scene Builder - After Effects to Blender [Before: $9.99, Now: $8.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":129261,"archive_hash":"sha256:6161d5fabb72404e17e05f1dfcb71922ef9062bd1f3134a7162090623a3f8241","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/acf85984-0f08-49ba-aaaf-849ee1553c1c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.49","blender_version_min":"4.2.0","maintainer":"Serhat Dönmez","tags":["VFX","Workflow","Camera","Track","CGI","after_effects","blender"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/17256fe9-432d-46eb-9245-892fad2faaf7/","schema_version":"1.0.0"},{"id":"viewport_object_finder","name":"Viewport Object Finder [Before: $2.00, Now: $1.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":12335,"archive_hash":"sha256:6fb559947a155ba05be51d97f7e57ff6831eb1b976903503e20833c869f23430","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/180c824a-a586-4d8b-b7db-d6e3e405bdce/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Object","Search","Finder","Outliner","3DView"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9a832280-ec35-49fa-bfcc-6b97932736d3/","schema_version":"1.0.0"},{"id":"viewlink","name":"ViewSync - Viewport Navigation Sync [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":9926,"archive_hash":"sha256:bc0931eacd7c2c282e27e3747fefa76f036ec804b7ce38029f136cb220139de1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a4424785-0359-414d-986e-0d6dea34f3eb/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"PlayfulPixel","tags":["blender","viewport","navigation","sync","multimonitor","modeling","animation","workflow","camera","presentation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/14ab582e-2794-4406-9427-af93348e7cf9/","schema_version":"1.0.0"},{"id":"vse_lottie_exporter","name":"VSE → Lottie Exporter JSON [Before: $19.99, Now: $16.99]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":478198,"archive_hash":"sha256:df934207034410d289ecaa5a0560701937fd4710c4136d657c6b0e2550b37eee","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/758a98ec-23fa-4a16-beef-8bf64f69a8b1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.99","blender_version_min":"4.2.0","maintainer":"Dynos Std","tags":["export","vse","motion","ui","json","lottie","animation","video"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/624848c3-08c0-438b-8177-a4bb8680e563/","schema_version":"1.0.0"},{"id":"wireframe_lens","name":"Wireframe Lens - Inspect topology without switching modes. [Before: $4.00, Now: $3.40]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.3.0","type":"add-on","archive_size":13384,"archive_hash":"sha256:99c4709ad0b3ecf7afc2e71bb25a1bf8d60dbafbf48fd72ce888f4c952c4c8c9","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0f494136-21a7-4c11-8e55-899ba79d01cd/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.40","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Mesh","3DView","Modeling","UserInterface"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0ee85911-a0cf-471e-8534-d556ef42ef7c/","schema_version":"1.0.0"},{"id":"wk_bookart","name":"wk BookArt Addon [Before: $12.00, Now: $10.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":3390083,"archive_hash":"sha256:26909033ff9a7c5efd84b48c67b7ab1cb0a9bcfb1019ae00ac1fc4d6e630367d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ae8b4251-2838-4638-afe2-6971afe9ffc2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.20","blender_version_min":"4.2.0","maintainer":"Wolfram Kampffmeyer","tags":["BookArt","BookFolding","Papercraft","Pattern","SVG","CSV","Manufacturing","Layout"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8f8c5952-b13f-4a54-8684-323b3a421da3/","schema_version":"1.0.0"},{"id":"wk_facerig","name":"wk_facerig – Fast, intuitive facial animation in Blender [Before: $13.00, Now: $11.05]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1144829,"archive_hash":"sha256:5954c8ee130e0ec355c161ff81250db8925ec8c75e451d42cf06f4ce4bbc69f0","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c4f7c302-88e4-476c-8281-375a613e32ad/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"11.05","blender_version_min":"4.2.0","maintainer":"Wolfram Kampffmeyer","tags":["Face_rigging","Rigging","Slidercontrol","intuitive","animation","blender","facerig","lipsync","automatic","animator"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/cd687c32-9fa6-427b-8142-49fdaad99279/","schema_version":"1.0.0"},{"id":"wk_powerpin","name":"wk_PowerPin [Before: $8.00, Now: $6.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":379088,"archive_hash":"sha256:99f355ca057c0b86adf8bce45f2bc9e6172ee2e3fa101144c59ddc1f25f0cda8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/68b03fea-83b1-4a18-b3f6-0a30271143f1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.80","blender_version_min":"4.2.0","maintainer":"Wolfram Kampffmeyer","tags":["Animation","Walkcycle","NLA","FootPinning","Baking","GraphEditor","Rigging"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/6a990ce8-1452-4050-ae7e-219aa109be34/","schema_version":"1.0.0"},{"id":"wk_workspacetools","name":"Workspace Tools Addon Presets [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.0","type":"add-on","archive_size":307370,"archive_hash":"sha256:69942a26f934364e86bcf70a0981259d4e7ea425e8e5c78e9220297c45075b71","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/dfcae439-c3e3-4ba2-9e79-c9bbc1c19008/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Wolfram Kampffmeyer","tags":["3d_workflow_optimization","addon_manager","addon_presets","blender_n_panel","blender_presets","custom_workspaces","freelance_tools","layout_presets","productivity_tools","workspace_manager"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8e23b6e9-abf3-4200-8b07-fc01d4ee8443/","schema_version":"1.0.0"},{"id":"xray_selection_pro","name":"X-Ray Selection Pro [Before: $7.99, Now: $6.79]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":5532,"archive_hash":"sha256:b82c8b8e7e2354ec9af6a4b91b9696f5270645869c88cfe2d26ab7705418458a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0f713e00-3e20-4b4b-95bd-d527e1810add/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.79","blender_version_min":"4.2.0","maintainer":"Doctor Legion","tags":["xray","textures","3dalpha","opacity","instantxray","visibiliy","addons","pro","3dviewport","scene"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7bf7d68b-bfd8-471a-bd97-e4a2d38d971d/","schema_version":"1.0.0"}],"version":"v1"} \ No newline at end of file +{"data":[{"id":"blenderkit","name":"BlenderKit [FREE]","tagline":"BlenderKit official add-on","version":"3.19.2-260411","type":"add-on","archive_size":38762275,"archive_hash":"sha256:59bee86ff17b66289bd640bed703eaed1817669c9f5de49f65ae6e3ad761ce3e","archive_url":"https://www.blenderkit.com/addon-download/blenderkit.zip","blender_version_min":"4.2.0","maintainer":"Petr Dlouhý","tags":["blenderkit"],"license":["gpl"],"website":"https://www.blenderkit.com/get-blenderkit/","schema_version":"1.0.0"},{"id":"threed_print_prep_wizard","name":"3D Print Prep Wizard [FREE]","tagline":"Auto-detect thin walls, non-watertight meshes, overhangs; offer fixes","version":"0.1.1","type":"add-on","archive_size":3221,"archive_hash":"sha256:290e3502ded6546478da53ca321a15e1594a2b2bcef260bc02bc9cfcbcd28c31","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/bd4dac1f-f36d-4316-8680-efe9f4bb23d1/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Soroush Amelzendedel","tags":["3DPrint","MeshRepair","Workflow","Utility","Addon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a85bc12b-33c3-46d0-a7b7-ed15cc5689c3/","schema_version":"1.0.0"},{"id":"ThreeMF_io","name":"3MF Import/Export with Material/Paint data [FREE]","tagline":"Import and export 3MF - Material and Paint supported, Orca/Bambu Prusa/Super slicers all supported, many features included. Full walkthrough/guide available.","version":"2.5.1","type":"add-on","archive_size":287217,"archive_hash":"sha256:c9185a00289d0486ebdda5e5f92caf3ce515c97ec93cbf3cd5c2ffea96aa5b20","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/faad01cd-2b5b-41f2-876e-7d8dc48a4f6b/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Clonephaze Smith","tags":["3mf","multicolor","3d","print","import","export"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9a5b095b-304a-461f-b3ec-6e4a8044f9c0/","schema_version":"1.0.0"},{"id":"ActionBlocks","name":"Action Blocks - Preview [FREE]","tagline":"Use nodes to quickly create animation variations, block outs, game cinematics, background assets, instructional videos and animatics using animation and mocap libraries such as Mixamo or your own Action assets.","version":"2.0.2","type":"add-on","archive_size":2854741,"archive_hash":"sha256:d925ad69670118b04c21d28ab90bc39e60c434b8b6ba403d59b863459b51c812","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/81dbf135-1be2-4ffe-a9c5-b039e4cf4103/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Other Realms","tags":["Animation","nodes","mocap"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0b612037-1902-43e0-9a4c-1189bf7315de/","schema_version":"1.0.0"},{"id":"addon_install_button","name":"Add-on Install button [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"1.0.1","type":"add-on","archive_size":1751,"archive_hash":"sha256:a048d9b9d6565cd2529473da667423ad920b7eed03114ce6ecdc801a6377e12b","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6c24661e-b400-4caa-8152-e69f7323bf86/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Grimmotron","tags":["UI","legacy","install","button"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/11a6fbc6-93ea-4e3a-a61f-d3b54878701a/","schema_version":"1.0.0"},{"id":"advanced_plot_equation","name":"Advanced Plot Equation [FREE]","tagline":"Plot explicit, parametric curves & surfaces in Blender","version":"1.3.0","type":"add-on","archive_size":951033,"archive_hash":"sha256:66e4575e3eb0739897f1ea0fda81ae9c9884fb525b355b651ff31adc5c1305a5","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9ccce277-2d26-445d-96b1-4c7b5d3c5ba9/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Soroush Amelzendedel","tags":["plotting","visualization"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f1f71ba8-847f-4dd4-a0b6-fc957ff608be/","schema_version":"1.0.0"},{"id":"ai_material_generator","name":"AI Material Generator [FREE]","tagline":"Generate seamless PBR materials from text prompts","version":"0.2.0","type":"add-on","archive_size":3855,"archive_hash":"sha256:87a4d1d421f9065336845998c3ac5f4967d4b521f2d0f3ac8b6f020747a5b1dc","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f63360ca-ffdf-4ad3-bbd3-1f769c0392eb/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Soroush Amelzendedel","tags":["Material","PBR","Textures","AI","StableDiffusion","HuggingFace"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5db37e26-e59f-4638-bf34-1993d171ac70/","schema_version":"1.0.0"},{"id":"render_estimator","name":"Animation Render Time Estimation [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"2.3.0","type":"add-on","archive_size":3561,"archive_hash":"sha256:f40d8268bc11f6b7b294dbd9c0f2e14322365857fc5aaa0be35e84fd82dcedea","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/395dad33-5261-443a-9d42-11dc2de83075/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"UnicornHunter MC","tags":["render","animation","time","progress"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/27990883-4149-4ae1-9a9e-a25ffdb50f16/","schema_version":"1.0.0"},{"id":"annotate_to_christmas_lights_gn","name":"Annotate to Christmas Lights (GN) [FREE]","tagline":"Convert Annotate strokes into non-destructive Christmas lights with Geometry Nodes: spacing, wire radius, palettes/random colors, align-to-curve & random roll, plus custom bulb assemblies (children supported).","version":"0.4.5","type":"add-on","archive_size":9390,"archive_hash":"sha256:d283cea78c26d58101e5ba437df4a2e0ac222065039dd4ff33a9f0edb03c7b16","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f9a3918a-02d1-426b-ba81-03df1a150136/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Soroush Amelzendedel","tags":["GeometryNodes","GreasePencil","Annotate","Lighting","Procedural"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b865fd92-7f89-4ca8-8e86-de85511de369/","schema_version":"1.0.0"},{"id":"SK0001","name":"Arrange objects evenly in a circle [FREE]","tagline":"The addon arranges all selected objects evenly in a circle. The radius and orientation of the circle (X, Y, Z axis) can be controlled.","version":"1.0.0","type":"add-on","archive_size":1497,"archive_hash":"sha256:89883f484061eeaa1d810a7675211f87a62807f7d59e7e6bc4f10ed949595421","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/8d448a51-4290-4168-9891-a20db1909950/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Steffen","tags":["circle","align","even","objects","round","circular","automation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5f94585d-ce76-49e1-b390-4fd6696c2d80/","schema_version":"1.0.0"},{"id":"aspect_ratio","name":"Aspect Ratio [FREE]","tagline":"A Blender addon for managing aspect ratios and camera settings with an intuitive interface and quick access pie menu.","version":"1.0.2","type":"add-on","archive_size":7039,"archive_hash":"sha256:d9323c5ba0a4a3d6443a0091369f3e77a541dcfe14910bf13c54b90c97c55e97","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/24a7395a-67d2-46aa-a21a-613f801a21f4/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Dimona Patrick","tags":["Render","render"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/13ae67a5-e751-4e40-99f0-b3e4631d9f97/","schema_version":"1.0.0"},{"id":"babylon_scene_preview","name":"Babylon Scene Preview Pro [FREE]","tagline":"All-in-one .glb exporter & live-preview with screenshot + grid toggle + Blender-style grid.","version":"0.2.3","type":"add-on","archive_size":3489,"archive_hash":"sha256:ee0eb525953c0cf7c259636f1b747bc94c5e5f324bd61a1b54fd3c68bfa608bd","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e827736b-8659-4afa-a9de-bf4974f06fb5/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Soroush Amelzendedel","tags":["glTF","Export","Live","Preview","Screenshot","Grid"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/1bfa2a9d-f914-4264-9629-ae083b18789d/","schema_version":"1.0.0"},{"id":"Bagapie","name":"BagaPie [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"10.4.7","type":"add-on","archive_size":10378340,"archive_hash":"sha256:c80359064314761b9fb4bc3198e36d80ac64d4634f2aa2e54210988836d6cad6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/8ee1a84e-fe6e-44a7-b710-be7c9355ed45/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Antoine Bagattini","tags":["scatter","ivy","architecture","addon","free","array","window","stairs","environment","scattering"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/fd109ea6-b261-4aaa-b572-c69ee296d86c/","schema_version":"1.0.0"},{"id":"basedplayblast","name":"BasedPlayblast [FREE]","tagline":"Easily create playblasts within Blender and Flamenco","version":"2.6.2","type":"add-on","archive_size":48968,"archive_hash":"sha256:c359a24fccb10b9d8df2941b0d75435eb0f7ac89db61836edb6d993b86354952","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d0f24e8e-5666-4821-81f7-b68d63379f03/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"RaincloudTheDragon","tags":["Animation","Render","Workflow","Video"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/967c5989-0d66-402a-a1ca-56be2299f718/","schema_version":"1.0.0"},{"id":"batch_render_manager","name":"batch_render_manager [FREE]","tagline":"A Blender addon for efficient batch rendering from multiple cameras with advanced project management features.","version":"1.0.0","type":"add-on","archive_size":14882,"archive_hash":"sha256:9be8f16641985d1efab5f68c4d5c3a1b36c5a0f7a373df1a2f5aa3f13e5a909b","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f1bb5147-c249-4eea-b7f5-98b2599cfa59/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Dimona Patrick","tags":["batch","management","rendering","render"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/476811fa-611c-4869-8653-14a830376e63/","schema_version":"1.0.0"},{"id":"BRVLayers","name":"Batch Render View Layers [FREE]","tagline":"Create multiple render jobs, each with its own specific View Layer, Camera, and Frame Range.","version":"1.2.3","type":"add-on","archive_size":4335,"archive_hash":"sha256:63187cc826a44655a1f20a4647aacf7c6967bf7007b91ceeb7291725dff35f17","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6090842f-0113-4d5d-a1c2-fab6f6a877ab/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Kin Chen","tags":["Batch","Render","ViewLayer","Queue"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/052f32bc-4fdb-412c-8eb9-cd158434f84e/","schema_version":"1.0.0"},{"id":"shader_switcher","name":"Blender Shader Switcher Addon [FREE]","tagline":"The Ultimate Shader & Color Switcher Node System\nMake your shader setups smarter, cleaner, and ultra-flexible — without node clutter.","version":"4.0.2","type":"add-on","archive_size":11114,"archive_hash":"sha256:03b4aed110d4613695a60fd94fd8f7a8d98c358dd5f2b2a813afc093ff642640","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cbff50ec-bbc5-40d4-99c3-633e110c502c/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Aimen Zaied","tags":["Node","ShaderEditor","Materials","Shading"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/3466f4d7-caf6-45a9-b9ac-b3bcaccc9920/","schema_version":"1.0.0"},{"id":"BLeQ_Extension_Pro","name":"BLeQ Extension Pro [FREE]","tagline":"The Extension offers a simple queue manager and will provide more free features in the future. Other than that it provides a bridge between the free standalone app BLeQ and Blender, so you can work on your project while rendering in the background.","version":"1.1.0","type":"add-on","archive_size":274896,"archive_hash":"sha256:531f8552ec19afeb5c55d7fecbeefa97fd456effe6310df0c696457969fab8d4","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/89454c41-a65c-4392-a341-d3c939a8c071/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Christian Makarski","tags":["Queue","Pipeline","Renderqueue","Sequence","Rendersequence","chain","Rendermanage"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d7529892-10a8-4f96-86de-933d584bb9f5/","schema_version":"1.0.0"},{"id":"fbx_vault","name":"Bulk FBX Importer [FREE]","tagline":"FBX Vault is a bulk FBX importer for Blender that lets you load multiple FBX files at once, saving time and streamlining your workflow.","version":"1.0.0","type":"add-on","archive_size":1858,"archive_hash":"sha256:3c9b99fda4e7b5345fbf151c0db1fc14bdb7bcce44f65753ba4c14bb8f4d0666","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/7723df72-9455-4901-b89e-4fdf1aae86c9/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Zuhaib Khoso","tags":["addon","tool","fbx","blender","import","management","bulk"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/87284cbd-2f95-44d8-9e38-c7ccaa07354c/","schema_version":"1.0.0"},{"id":"Cad_measure_extension","name":"Cad measuring tool [FREE]","tagline":"It's a geo nodes based tool that lets you make measurements and render them with ease","version":"2.0.0","type":"add-on","archive_size":251303,"archive_hash":"sha256:fdc1a528d7808c897d7cf3469b09921a5b29174cfa6293400f82a1cd0eb65efb","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4747fbe1-c279-4462-8854-2f6175d70c38/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Mr.Nobody covers.mp4","tags":["blender","measure","geonodes","geometry"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/87bc995f-2eff-4b3f-8561-fb73086b4c9a/","schema_version":"1.0.0"},{"id":"Cake_Particles","name":"Cake Particles [FREE]","tagline":"Allows you to bake the motion of particles into key-framed objects animations. (❁´◡`❁)","version":"4.3.0","type":"add-on","archive_size":6791,"archive_hash":"sha256:eab0f22f85eeb43acd57024e2f967002c09f335c83a8163bcc64ff0005fa7510","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/671368cd-1458-4197-81d1-9049ada81ac1/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Scary Plasmon","tags":["Animation","Objects","Simulation","Physics","Baking"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/82e87770-6569-4873-bef5-8621a1fecdc9/","schema_version":"1.0.0"},{"id":"SK0005","name":"Camera bookmark manager [FREE]","tagline":"Remember camera positions and orientation and conveniently assign them to another camera.","version":"1.0.0","type":"add-on","archive_size":1838,"archive_hash":"sha256:c066fafb8e07e092ad7f5f806f042f71662cc6183657be1ef1f2a0c861cc08f5","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6bcc1463-538f-46c1-8dff-a765955fa97b/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Steffen","tags":["camera","bookmark","manager","position","rotation","workflow","animation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/1a9af258-e75e-44c8-81e9-869249addb8d/","schema_version":"1.0.0"},{"id":"nfc_card_keychain_generator","name":"Card/Keychain w/ Custom Design and QR Generation and opt. NFC Cavity for 3D Printing [FREE]","tagline":"This add-on lets you design 3D-printable housings for NFC chips. You can add your own logos or icons (Wi-Fi symbol, social media logo, etc.), or use the built-in QR generator to put a backup code directly on the surface of the print.","version":"1.2.2","type":"add-on","archive_size":513576,"archive_hash":"sha256:61fc9b726002f7cd17ffb5b1e54bfa1827e8edf538881e72749f4faf931dc384","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/992bef23-da87-44ec-a710-bc61d13aa8b9/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Clonephaze Smith","tags":["nfc","qr","card","generator","keychain","custom"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/09bd7d56-efdb-4e25-b4d8-68c8ee65f422/","schema_version":"1.0.0"},{"id":"centerocd","name":"CenterOCD [FREE]","tagline":"CenterOCD is a simple Blender addon that aligns selected objects above the grid center based on their combined bounding box center while preserving their spacing, helping keep your scenes clean and perfectly organized.","version":"1.0.0","type":"add-on","archive_size":1490,"archive_hash":"sha256:607cf00fe41582b4eaeb640cb6ad8dc9944731be643022c810fbb2a799abef0b","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3753d182-5607-44fe-a376-6bdbf0bde2f5/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Mostafa Heikal","tags":["align","center","grid","haykol"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8a92d1eb-c1c8-4357-886d-5c765a1214d1/","schema_version":"1.0.0"},{"id":"cgaxis_blender_addon","name":"Cgaxis Add-On For Blender - Browse & Import Assets Directly In Blender [FREE]","tagline":"Browse 12,500+ Premium Assets directly in Blender and Get started for free - over 120 assets are available at no cost.","version":"1.0.0","type":"add-on","archive_size":135827,"archive_hash":"sha256:d2d49d2c9665add7c55181a343759dde9bfa5de723d4bb3075b93694822d46ac","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2c135e35-0484-4805-8562-7d9eb8705471/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"CGAxis","tags":["assets","pbr","material","3d","models","hdri","decals","browser","imperfections","plugin"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f8432983-2d65-4d16-a7ef-36ee5fcc7220/","schema_version":"1.0.0"},{"id":"img_alpha_to_bsdf","name":"Connect image alpha [FREE]","tagline":"Connecting image alpha to shader alpha","version":"1.0.6","type":"add-on","archive_size":2692,"archive_hash":"sha256:a0d765b49e728e95012895af1bb54d12c3b4ac68ab649115685c8b4d9eb65e02","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b4b1a347-b3e0-4ec8-96e8-7039f03d475a/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Snaky Boop face","tags":["automation","automate","node","material","image","alpha","QofL"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5d0c171c-9ff3-4834-b610-0b39d8fd0191/","schema_version":"1.0.0"},{"id":"Copy_transforms_extension","name":"Copy Transforms [FREE]","tagline":"The Copy Transforms add-on mimic the Autodesk Maya copy transform functions. The operations only work in Object Mode and can be done between objects, lights and cameras. Plug-in updated to version 2.0.","version":"2.0.0","type":"add-on","archive_size":1925,"archive_hash":"sha256:0b5ea205238edbd92d77f10ac909b9e66fda38c14bdc05a52e4253c10bece865","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ea9ad2d2-eb15-4da2-b5e5-531c34a7e8c4/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Luiz Lobato","tags":["Object","transforms","location","rotation","scale","copy","camera","lights"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e4d8305e-3eca-477f-8b08-afa17bf621ce/","schema_version":"1.0.0"},{"id":"CountDown3d","name":"Countdown 3d [FREE]","tagline":"Quickly add customizable 3D timers (countdown or count‑up) to your Blender viewport.","version":"1.5.0","type":"add-on","archive_size":4799,"archive_hash":"sha256:49bbf5981614ed4fef283a4501654b98312dc61ea0790cab12e856f66f875a84","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a8071da5-87fe-4105-9961-f926ec69b81b/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Fabio Malvaldi","tags":["3D","Countdown","Customizable","UI","Python","Script","Animation","TextObject","counter","Timer"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/cafb5d64-82e6-45d5-ae1f-2a6c504a3838/","schema_version":"1.0.0"},{"id":"Delete_Loose","name":"Delete Loose [FREE]","tagline":"with this handy addon, you eliminate smaller and loose parts of a mesh while keeping the largest parts intact. In object mode, go to Object ---> click delete loose. It operates on the selected layer and leaves the largest mesh by volume intact.","version":"1.2.3","type":"add-on","archive_size":2391,"archive_hash":"sha256:9fdf99f92ab399377ec92a0d3bf25bce5891384b9a0ed61ce8def18314b60f58","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d46ee8be-144e-4a60-be40-4b348539e4e0/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Łukasz Wilkoń","tags":["cleaning","cleanup","topology","fix","fixing"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a88d7b63-11e7-4415-b717-8944eef0bd63/","schema_version":"1.0.0"},{"id":"delete_static_animation_channels","name":"Delete Static Animation Channels [FREE]","tagline":"Automatically identify and remove redundant F-Curves with constant keyframe values to clean up and optimize your animation data on a click.","version":"1.0.0","type":"add-on","archive_size":2873,"archive_hash":"sha256:9d0cb8dbcfadb9e4e70c7ba952299be23f179d4d458951db659f0a5a551f7670","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0e649649-adc7-40c7-b56b-b0a0f22d94f6/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Vaishakh Vinod","tags":["Animation","graph","cleanup","fcurve","mocap","motioncapture"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f7a51ab2-f758-464f-817b-ad010cb643bd/","schema_version":"1.0.0"},{"id":"easy_batch_render","name":"Easy Batch Render [FREE]","tagline":"Easiest Blender Addon Available for Batch Render !!\nAutomatically render all Blender files from a folder with one click","version":"1.0.1","type":"add-on","archive_size":6875,"archive_hash":"sha256:15e7ff505530560cfdb9177046e0d8473413f8a80777e46f4ff50bcbc6ad0142","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a426042c-2fcd-4829-a53e-7527987b17fd/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Vaishakh Vinod","tags":["Render","Pipeline","Workflow","Batch","Automation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/03b93d66-510b-441b-a0d3-14b5935f5e32/","schema_version":"1.0.0"},{"id":"easy_measure_tool","name":"Easy Measure Tool [FREE]","tagline":"A lightweight add-on for quick measurements.","version":"1.6.1","type":"add-on","archive_size":7940,"archive_hash":"sha256:72f89b73b7a32a1e090d6575ef16bf9d178710bfd58cc6546a4826c26c0efd74","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6b1d5b27-3d8d-490c-9921-454120c844d0/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Jungle Ham","tags":["3DView","Object","Modeling"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7ac627dc-ca87-4a3b-92e7-b00a752a037e/","schema_version":"1.0.0"},{"id":"easy_scatter_tool","name":"Easy Scatter Tool [FREE]","tagline":"Easy Scatter Tool is a Blender add-on that scatters one object across the surface of another mesh.","version":"1.0.0","type":"add-on","archive_size":4790,"archive_hash":"sha256:2aad46cd10d876e3ab5d5f69a927c9b423a0f2d14eb47fbedbd6c380f65293cc","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a7cdf987-8b42-47e9-a066-3e407ebf0512/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Jungle Ham","tags":["Object","Modeling","Workflow"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f31d8f0b-ee2b-45ec-9f4b-4aae75a7160f/","schema_version":"1.0.0"},{"id":"facemesh_capture","name":"FaceMesh Capture (MediaPipe) [FREE]","tagline":"Create a textured FaceMesh from webcam or photo using MediaPipe, with live tracking and real-time updates for mesh creation. Perfect for facial recognition, animation, and 3D modeling.","version":"0.4.0","type":"add-on","archive_size":11286,"archive_hash":"sha256:8714eff32dcda7ff8fc554d0714ae815805c17f6def1b4e45027d6ff0e3a9dc8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/aa5efe63-320f-4551-af8c-e3bd2070cb2d/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Soroush Amelzendedel","tags":["Mesh","Animation","3DView","UV"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9b174a1c-d3c5-4979-b36a-cbfc40616f5e/","schema_version":"1.0.0"},{"id":"flicker_light_fixed","name":"Flickering Light Simulator [FREE]","tagline":"Customizable flickering light animation with multilingual support","version":"2.0.0","type":"add-on","archive_size":4059,"archive_hash":"sha256:77bbac7d17fd132350d9bf065ef2c2de2f4f575fec639d72149d7cb0d5ab77d3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2ad04975-a7e3-40f3-84a5-adfac5baf07c/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Fabio Malvaldi","tags":["Light","Flicker","Animation","Localization","UI"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7d69be65-9004-4469-bd9c-beb29e1ec99b/","schema_version":"1.0.0"},{"id":"FlowProManager","name":"Flow5 - The Ultimate Asset Tool [FREE]","tagline":"Flow5 is the amazing (and FREE!) workflow tool that helps you with building your scenes, creating asset libraries, manage your assets and even more! Already trusted by thousands of users\n\nLearn more at: https://polyspaace.com/addons/flow","version":"5.0.0","type":"add-on","archive_size":25883632,"archive_hash":"sha256:ee9f76ec9d62951f7b6be33eb4ee99f29167b11ad6b699b6f3eaaa0ae124cd81","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2891cad9-7a8d-405f-900b-880632488fdd/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"polyspaace","tags":["assets","flow","workflow","scatter","asset_browser","asset_library","polyspaace"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/542f1515-6422-4da3-bf4d-05803f890e1b/","schema_version":"1.0.0"},{"id":"graph_editor_timeline_controls","name":"Graph Editor Timeline Controls [FREE]","tagline":"Adds Timeline playback controls (Play, Reverse, Pause, Frame Start/End, Current Frame) directly into the Graph Editor header for faster animation workflow.","version":"1.0.0","type":"add-on","archive_size":2292946,"archive_hash":"sha256:b77a68f7e34b9c5f9c66fafef6825a0575fe8605c8da51a567dff3cd94fa358f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f2c93a71-097b-4054-8067-f2b58e3b2572/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"NOOB 3D","tags":["animation","graph","editor","timeline","playback","ui","workflow","keyframe","animation","userinterface"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/26a86759-a4b3-4545-ad67-106a89737f54/","schema_version":"1.0.0"},{"id":"item_transform","name":"item transform [FREE]","tagline":"A Blender addon that provides quick transform operations for selected objects with an intuitive interface and additional utility functions.","version":"1.0.2","type":"add-on","archive_size":6957,"archive_hash":"sha256:6a78724c1d6cb68d9a691c6f2e8403844860a064f9257d0b22eac7a124bc7ecf","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cccfe7d1-1df5-4927-87af-a10e00a1c34e/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Dimona Patrick","tags":["Modeling","Object"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b97c7a3c-93cb-4cea-8186-6e1cbcb47bd5/","schema_version":"1.0.0"},{"id":"joinforce_render","name":"JoinForce Animation Render [FREE]","tagline":"This add-on helps you use all your computers to render animation all together, like network rendering but limited to a local or shared folder (e.g., a NAS drive). Collaborate with others and speed up your production.\n\nPreparation → Render → Collect.","version":"1.3.1","type":"add-on","archive_size":6538,"archive_hash":"sha256:afe900cdb0a244c3f4aadab240cbfc5ce0942f68673803924e7ed72d4023d406","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/21a1e2f2-a21d-4ea2-87a6-01d906bc50a1/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Liam Xee","tags":["pipeline","Batch","rendering","animation","cloud","Production","Computing","Workstation","Team","Network"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/74798440-6854-4a90-9872-ec08da8d0ce3/","schema_version":"1.0.0"},{"id":"k_tools_render_preset_manager","name":"K-Tools Render Preset Manager [FREE]","tagline":"An easy and intuitive for saving, loading, and managing complete render setting profiles for Cycles, EEVEE, and Workbench. This tool is designed to streamline your workflow, allowing for quick, consistent, and reversible changes to your rende","version":"1.1.1","type":"add-on","archive_size":54772,"archive_hash":"sha256:2ef9d7ad94bce0ff2e811677230a5daa4f8fc607fa1123478d923f624fa933d0","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6f054995-d5d9-4718-90b7-5c191d22a671/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Robert Kezives","tags":["render","preset","cycles","addon","load","save"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8626f2ca-193c-4f15-8011-200c5d0a2e9b/","schema_version":"1.0.0"},{"id":"marker_highlight_pro","name":"Marker Highlight Pro [FREE]","tagline":"allows you to add highlight color to your marker text for easy navigation in the timeline.\n\nselect marker then press n to be able to set the color of the marker highlight","version":"1.0.0","type":"add-on","archive_size":2046,"archive_hash":"sha256:46ac6e96e5eb3cda09a1ad70342f492abcc28b276ceba020a2c891e50c016820","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1745b88d-d4cf-4386-b84d-747b41186e07/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"saman","tags":["marker","color","markercolor","colour","coloured","markermanager"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e5ceb861-fa61-4aec-8605-f585df3ebf48/","schema_version":"1.0.0"},{"id":"SK0002","name":"Material Organizer [FREE]","tagline":"Overview of all materials in the scene. Easy deletion of unused materials. The list can also be sorted by name, used or unused, procedural, and size. Finally, a tidy material library again - very helpful, especially in large and complex scenes.","version":"1.0.0","type":"add-on","archive_size":2026,"archive_hash":"sha256:07c076a2f8e842a5eb167a7e90f64a5805ccd2582d78625da664d833a61e1b82","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4e5281c0-822c-4625-a151-02acbe8fd7e5/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Steffen","tags":["Material","organizer","overview","delete","help","sort","list","shader"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/21a85005-f5d1-4f4b-9e9a-5087838d1a44/","schema_version":"1.0.0"},{"id":"ColorFromMaterial","name":"Material Viewport Color from Nodes [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"0.1.3","type":"add-on","archive_size":23002,"archive_hash":"sha256:bb0e68146c79fe2c4b5c1c6e91cb5945c9303dc3a4f9920d2e1ba60d5561a936","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/88edb35c-c79a-4263-9cc9-082f6282f1a6/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Spencer Magnusson","tags":["color","material","metallic","roughness","viewport","workbench"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/15250641-5030-4e65-8988-385adbee7a04/","schema_version":"1.0.0"},{"id":"math_3d_equations_pro","name":"Math 3D Equations Pro [FREE]","tagline":"Math 3D Equations Pro lets you turn math formulas into 3D geometry: plot functions, parametric curves/surfaces, implicit fields (with marching cubes), and strange attractors directly inside Blender.","version":"1.3.0","type":"add-on","archive_size":10274,"archive_hash":"sha256:1293382cde627aa9f16c8c25e9e2e2775ee8b1793ebf672f87ccbc60e5f672cf","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0bb57bc4-d52a-4d17-a038-3c6b44fca17f/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Soroush Amelzendedel","tags":["Mesh","Curves","Math","Procedural","Scientific","Visualization"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0b934918-ccac-45f9-9502-5190908b13c9/","schema_version":"1.0.0"},{"id":"maya_viewport_operation","name":"Maya Viewport Operations [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"1.0.0","type":"add-on","archive_size":18860,"archive_hash":"sha256:67f88925c3fee1af6c056e2b82ef80dc18167d8735381c3af54434a5dedc6c9d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c1148a64-7337-4872-86b7-57a990df5300/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"TinkerBoi","tags":["maya","smooth","preview"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/427e1d25-6b74-487b-bb39-856e70a74ea5/","schema_version":"1.0.0"},{"id":"maze_generator","name":"Maze Generator [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"1.11.0","type":"add-on","archive_size":6240,"archive_hash":"sha256:40c08393a2402f4a5f24c4b12f3baae24eba9b7d97b48a72283e7e94c3892669","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f1ed3d85-db05-4f7f-a0e8-f7d87cae2e39/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Giorgi Samukashvili","tags":["Procedural","Maze","Modeling","Geometry","Nodes","Curves","Addon","Blender","Game","Algorithm"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/88fb5e50-584d-4b24-ad32-5f2c24634963/","schema_version":"1.0.0"},{"id":"measure_and_scale","name":"Measure and Scale [FREE]","tagline":"Measure and Scale object uniformaly","version":"1.1.4","type":"add-on","archive_size":8680,"archive_hash":"sha256:355656e1c08f41bfb3eb4886ddd61af3476e0a8a0fa667dfe8635f207d5d8263","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/78183613-8e2a-4d4e-ad99-76c342df4080/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"belaid ziane","tags":["modeling","measurements","scale"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/82da7c42-ce33-4be3-82ea-a58b31880502/","schema_version":"1.0.0"},{"id":"MeLiDA","name":"MeLiDA - Measure LiDAR System [FREE]","tagline":"MeLiDA integrates LiDAR sensors with Blender to create professional surveys of buildings, structures, and their relics—built for architects, constructors, conservators of monuments, archaeologists and engineers.","version":"0.1.0-beta","type":"add-on","archive_size":107115,"archive_hash":"sha256:fc2a66562a83772e8752a1d4acad647634ef20c09e117578924b3adc62d249f5","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/44944eb3-0fb2-4ec9-9fea-88c9e6edc23b/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"MeLiDA","tags":["point_cloud","laser_scan","survey","building_surveys","LiDAR","scanning","measure_device","stl_14p","stl_19p","d500_lidar_kit"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/20da5129-5479-4f45-a450-ef70cfc0ee5e/","schema_version":"1.0.0"},{"id":"multi_object_export","name":"Multi Object Export [FREE]","tagline":"Export multiple selected objects individually in one click using Blender's native exporters.","version":"1.3.0","type":"add-on","archive_size":7107,"archive_hash":"sha256:54acc7d04a2938e3da46c303d15f131960209d60c4e91fb8792410ff4342c04f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/16a86afb-d33f-488c-a772-1308bf8241b6/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Fabio Malvaldi","tags":["Object","Workflow","Export","MultiExport"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/125220ca-109c-4105-9ac3-cac4fedc9985/","schema_version":"1.0.0"},{"id":"music_generator","name":"Music Generator [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"1.0.0","type":"add-on","archive_size":93889081,"archive_hash":"sha256:e91db7197c1eecad6e40aee9fcfff703406b6b0dd67a75466a9854bbd46d9ae1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/46174bc3-0515-46b9-b0cc-4aa0f24e6cd1/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Music","Audio","Generation","Sequencer","Sound","AI","MusicGen","Gradio","Synthesis","Creation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9076e710-cedc-4b37-92b2-16b38fa0997b/","schema_version":"1.0.0"},{"id":"node_color_tools","name":"Node Color Tools Pie [FREE]","tagline":"Elevate your workflow with the Pie Menus of Node Color Tools Pie, the add-on for managing node colors in Blender. Designed for clarity and speed, this tool allows you to color multiple nodes at once, making it easier to navigate complex node trees.","version":"1.0.3","type":"add-on","archive_size":4752,"archive_hash":"sha256:e59fd49dbc701c9f45705e7f28dcf4d5d93dc13bf8820a5c8bf813a50c33b1e7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/66128702-2ca7-413d-b245-accb9e1b447b/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Johannes Kollmer","tags":["Colors","UserInterface","UI","Organize","Pie","PieMenu","Menu","Nodes","Node"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/37d15d8e-ba8d-470d-8c06-f8d7c75424c9/","schema_version":"1.0.0"},{"id":"number_generator","name":"Number Generator [FREE]","tagline":"Create sequential numbers as text objects","version":"0.1.0","type":"add-on","archive_size":2339,"archive_hash":"sha256:dbf74bb429c01aaa0b0a77e6ca987c3e75093c20daa3bf71e94c40c06606625e","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b66a740b-80a7-4e7a-abe0-da229ded13b1/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Soroush Amelzendedel","tags":["Number","Generator","Text","Objects"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/fd9d56d5-2d05-4d8d-8b8e-87c759253481/","schema_version":"1.0.0"},{"id":"object_mode_hierarchy_select","name":"Object Mode v1.2 – Hierarchy Selection [FREE]","tagline":"Hold O + Click anywhere to instantly select the full object hierarchy (parent + all children) and transform everything at once without using the Outliner.","version":"1.2.0","type":"add-on","archive_size":2151,"archive_hash":"sha256:be32fd600bda98a29f0a7bd587e6540f59c663791bcad58312d46a708fe26514","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cc89f3e2-5e33-40fb-9fff-9563c7041e29/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Vincent Ilagan","tags":["object_mode","hierarchy","selection","workflow","tool","transform","animation","utility","blender","addon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/67ab12d4-3e48-4bce-affb-30a6b6095fb2/","schema_version":"1.0.0"},{"id":"pomodoro_timer","name":"Pomodoro Timer [FREE]","tagline":"Boost your productivity with this amazing N-Panel widget! If your computer cannot render faster, work smarter! This add-on integrates seamlessly into Blender, offering structured work sessions and breaks to keep you immersed in creative projects!","version":"1.0.0","type":"add-on","archive_size":5004,"archive_hash":"sha256:3ae73f0701bbae44934d253689dea84f7858f61f3a5e88c02966623c911cede3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6c8e140d-7f72-448a-b5eb-3aaf7fcedb99/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"DJ SOLANA","tags":["Pomodoro","Timer","Boost","Focus","Concentration","Productivity","Efficiency","Smart","Creative","Workflow"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e382a037-62c0-4266-a312-9c4fecf2e494/","schema_version":"1.0.0"},{"id":"procedural_scatter_brush","name":"Procedural Scatter Brush [FREE]","tagline":"Scatter objects on surfaces using brush strokes","version":"0.1.6","type":"add-on","archive_size":3522,"archive_hash":"sha256:14afe4d18a7065311a9bf825c16e8227af69e960371242b5e7e73d58999445f2","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/94e7c35b-9a6c-468a-a74f-358dbc770073/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Soroush Amelzendedel","tags":["ScatterBrush","Procedural","Geometry","Tool","Instancing"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/55e372d8-5d9d-4e43-aa7f-1bb8dbf70be5/","schema_version":"1.0.0"},{"id":"SK0003","name":"Project time tracker [FREE]","tagline":"Saves the time you spend working on different projects so you can always keep track of whether you are still within the agreed time frame.","version":"1.0.0","type":"add-on","archive_size":2587,"archive_hash":"sha256:bd88afe070d59e6df44c4d7e2f6a264508f31cb96d67edda45d5dc5adbd22dab","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/19070979-b821-42c8-9d22-92057c438066/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Steffen","tags":["time","tracker","project","budget","client","organize"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b062a8ff-c085-45ff-bd8b-1c260d6fe20d/","schema_version":"1.0.0"},{"id":"quad_bridge","name":"Quad Bridge [FREE]","tagline":"Quad edge flow without any hurdle,\nworks on every N-M cases where N and M are greater than 1 and N is not equal to M,","version":"1.1.0","type":"add-on","archive_size":5948,"archive_hash":"sha256:7cd0d15de0a31d89fa52284f109c191164e99f4ac31ef151f9b32f5d362413c9","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6ccd02f6-fd7a-40dc-8551-fde00f771788/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"abd3d","tags":["Mesh","Modeling","Bridge","quad","join","edgeloop","loops","retopology"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8da31723-08d8-48bc-803d-550657841ee8/","schema_version":"1.0.0"},{"id":"Quick_Asset_Saver","name":"Quick Asset Manager [FREE]","tagline":"Quickly Create, Edit, Organize, or Delete your local asset files.","version":"2.0.3","type":"add-on","archive_size":66307,"archive_hash":"sha256:34196edd29b75d18cca2c3cd001fa751781314ee608d025ef702669cee0b5973","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/50726fd4-575b-40af-a857-f09ab96d0e96/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Clonephaze Smith","tags":["UserInterface","System"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a8dd11c1-54ce-4497-9691-5d5846af5939/","schema_version":"1.0.0"},{"id":"quick_groups","name":"Quick Groups (Instances) [FREE]","tagline":"Group objects with Ctrl+G using instances","version":"1.0.3","type":"add-on","archive_size":6862,"archive_hash":"sha256:f9da4f1267c480b5fd252e2d61573e1ebbd3e4fafa723547b93f032d7292d01c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1a7bb8b0-cd62-4216-ad5d-33e1139fd10c/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"John Wick","tags":["Object","Modeling"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d275c96d-a459-4904-a843-58f21b2f9ab6/","schema_version":"1.0.0"},{"id":"bake_material_lite","name":"QuickMat Bake Lite - Material to Texture Converter [FREE]","tagline":"Bake procedural materials into image textures in one click. Simple, fast, and essential for exporting Blender materials.","version":"1.3.0","type":"add-on","archive_size":3248,"archive_hash":"sha256:9a6d7fcdf5ab075c3731d5253413f71fc7b5b92c4e8ccec5ebbb2d8100380720","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6ac3962a-6b6c-4cb4-b4ae-d2e0e1a4fe6a/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Studio156","tags":["bake","baking","texture","textures","export","material","procedural","render","uv","image"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/6541c818-0c1d-4d3d-bb66-668309193c5e/","schema_version":"1.0.0"},{"id":"quick_origin","name":"Quick Origin Power Suite: Ultimate Pivot & Alignment Tools [FREE]","tagline":"Stop tedious alignment! 1-Click Origin to Bottom, World Snap, Smart Bake, and Batch Copy for game dev and asset creation.","version":"1.0.0","type":"add-on","archive_size":3266,"archive_hash":"sha256:d1bbf787a368b4f2dd956c1cb14710bc9b3caa76fd1ca56b9a4fbdc56b4ea6c2","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/96371023-31d6-48cd-8214-343e0b980ae4/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"NovaStrikes","tags":["Object"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/30272b4a-f645-4447-9880-44b5f3934a65/","schema_version":"1.0.0"},{"id":"quickundo","name":"QuickUndo: Sidebar Undo/Redo for All Modes [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"1.0.0","type":"add-on","archive_size":2768,"archive_hash":"sha256:9895a4ce788ff7ef200361eb3f8a7cc24d58ff38928cbde3e2ca90d8e338858e","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2b634e76-a618-43d6-a37c-c743ed04e844/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Elodie Anglade","tags":["undo","ui","tablet","ux","ipad","sidecar"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/df248e69-51d6-4847-bd63-5718b152ff90/","schema_version":"1.0.0"},{"id":"random_design_for_abstract_art","name":"Random Design For Abstract Art 1.1.4 [FREE]","tagline":"Generate abstract art with randomized shapes, remixable layouts, and smart arrangements like wave or spiral. Enhance with creative effects like Biopunk, Ectoplasm, Alien, one-click transparency, and randomized vibrant color harmonies.","version":"1.1.4","type":"add-on","archive_size":182021,"archive_hash":"sha256:d62a0e5ac70943ea42fa5d54d7e047792b45b16cb0e602f8278369c3e1fb5500","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/712f172f-5cdd-43ca-bcec-32b0129bd801/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Jacques Durocher","tags":["geometry","nodes","random","primitives","organic","instances","design","abstract"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/287f4b56-b2ec-436e-8b6e-032e8cf8361f/","schema_version":"1.0.0"},{"id":"Randomize_Bones_Pose","name":"Randomize_Bones_Pose [FREE]","tagline":"Inject spontaneity into your character and particle animations by effortlessly randomizing the rotation, location, and scale of bones. With a single click, witness your characters take on dynamic, unexpected poses that breathe life into your projects","version":"2.0.0","type":"add-on","archive_size":16684,"archive_hash":"sha256:5b3b0b59abad0e887e6b5b9511ef3ef64830b75e0ddfabaabdbdf82283efabdb","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/799484e5-be09-4cfb-8d2c-71ca49ffe1ee/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"IZ. MdVerz","tags":["Animation","Rigging","random","bone","bones","armatuer","particle","dance","character","pose"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b5b1d26c-d9e0-4945-94e1-b0923ec3ce04/","schema_version":"1.0.0"},{"id":"rastercrafter","name":"Raster Crafter v1.3.3 [FREE]","tagline":"Transform images into art with adaptive resolution & displacement driven by fractal image detail, or alpha maps; waves flutter; gradual resolution, displacement & gap; echo morphing; Perlin & fBM noise; full light control; true kaleidoscope;","version":"1.3.3","type":"add-on","archive_size":161147,"archive_hash":"sha256:9efc25e28b0dd1199d59f501ad1625e046cbb5616c1634660e6166bf96076199","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/706dc323-491c-46da-bc43-4e8fb2f09500/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Jacques Durocher","tags":["image","rastering","abstract","art","mosaic","grunge","pixel","creative","displace","fractal"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a2d0027b-8cc7-450e-9e6e-18e4c8e7f734/","schema_version":"1.0.0"},{"id":"reflectiveaudiomachine","name":"Reflective Audio Machine v1.0 [FREE]","tagline":"Reflective Audio Machine - Turn Your Music Into 3D Visuals in Blender\n\nReflective Audio Machine transforms any wav file into dynamic 3D motion. Load your audio, adjust a few parameters, and watch your objects pulse, move, and animate in perfect sync.","version":"1.3.3","type":"add-on","archive_size":36299712,"archive_hash":"sha256:0d910390338685ee17978ab494316f8e00fa047c0d6c5564973fa51d4ebdf9fd","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b997882f-dae8-49b2-ba68-6203b225d5f9/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Jacques Durocher","tags":["audio","sound","music","wav","visualisation","reaction","react","animation","pulse","wave"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/11608830-074c-4fc8-94ba-4fbd90a87531/","schema_version":"1.0.0"},{"id":"render_commander","name":"Render Commander [FREE]","tagline":"Background render launcher for Cycles & EEVEE","version":"1.1.4","type":"add-on","archive_size":2242819,"archive_hash":"sha256:e2f5e18e076d6b78f38c8257b7a73af15ffbfda62abb7880de7e92ee512fed8a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b3d197eb-36ff-4b84-bcfe-035ee1ae4b2d/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Nadir Perazzo","tags":["rendering","commandline","cycles","eevee","parallel","background","render","multi_gpu","presets","notifications"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4a787fcb-d366-4df8-9e1c-b06cd88f2a19/","schema_version":"1.0.0"},{"id":"rendermanager","name":"Render Manager [FREE]","tagline":"Render Manager - A render queue management tool for Blender. Create multiple jobs with different frame ranges and save paths, run sequential renders, and continue working without interruption.","version":"1.7.0","type":"add-on","archive_size":4101,"archive_hash":"sha256:d657357fbdb72f75d28157d2d98cc0dd58e93e7e9966f1dba9121b8ca4da4530","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/41afa7ce-b9fd-4db3-aaa5-5dd200765adb/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Vixymiles","tags":["Render","Animation","Queue","Manager","Workflow","Productivity","Batch","Sequential"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e774a939-504a-42db-ab02-36e3a8d42ce0/","schema_version":"1.0.0"},{"id":"RenderSceneKit","name":"RenderSceneKit [FREE]","tagline":"Quickly add pre-built studio scenes for render","version":"1.3.0","type":"add-on","archive_size":18677644,"archive_hash":"sha256:f6cef93aa29aea90f3691357b7a591e70b3259a844dd3a03b56fb4a14023c138","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9074f928-894f-44b4-837a-4cadecbc210f/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Danila Poljakov","tags":["render","scene","studio","toolkit","preview","libary","asset","lighting","presets","setup"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5238fe33-ff61-4add-bee5-27c885666c89/","schema_version":"1.0.0"},{"id":"scriptpilot","name":"ScriptPilot [FREE]","tagline":"A lightweight add-on to increase search and navigation functionality of the text editor with dynamic bookmarking of classes and functions and text searched persisting through blender save states.","version":"1.2.0","type":"add-on","archive_size":12017,"archive_hash":"sha256:417168679a551ce8c6ec5a74e6955efa953bef5bf80fe7a83157b03e303eb5d8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/28687bd4-d8c7-4af3-8e11-25596fc848c5/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"The Doctor By Design","tags":["scripts","text","coding","design","bpy"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d3738457-8a97-4ebf-9625-f8adc339781c/","schema_version":"1.0.0"},{"id":"set_to_wire","name":"Set to wire Boolean quick set [FREE]","tagline":"This addon simply sets the selected object to wireframe, addons a Boolean modifier to the active and sets the selected as the objects. In other words, it does all the work for you in 1-click :)\n\nCheck the quick video for details but it's easy to use.","version":"1.0.4","type":"add-on","archive_size":4277,"archive_hash":"sha256:56b28e5fb681ea4ab21f6539c6264e5eaa209a30df9ce3b1fb58a70ee2ffc748","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/79e38c3b-dfa7-4495-8681-201d95eda4e3/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["blender","boolean","easy","quick"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e0ea1433-d356-4f38-96c2-8f91209d71dc/","schema_version":"1.0.0"},{"id":"shapekeysbatchtransfer_addon","name":"Shape Keys Batch Transfer Addon [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"1.0.0","type":"add-on","archive_size":2776,"archive_hash":"sha256:c0ea8afa1d950bb6962e8d88754f1ba25aa5ee4aebb0e8013eb047b2fdd34f8a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a28ff77a-b3b8-4be5-ad54-4d64aec72874/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"cg.xenon Lauróva","tags":["shapekeys","transfer","blendshapes","morphtargets"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c047db7a-3b7c-4369-9b1e-99f616bb8830/","schema_version":"1.0.0"},{"id":"Shot_Handler_Lite","name":"Shot Handler Lite [FREE]","tagline":"Create Presets or different Shot Settings.\nSwitch Scene Cameras, Collection Groups, Render Settings and more with the press of a Button.","version":"3.0.2","type":"add-on","archive_size":49645,"archive_hash":"sha256:cd64d1e255d54f373ee9220c0a208ce299dc0169faa307af642de46cd402c51f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/eb1cbb06-ecac-4705-9c36-07eb98720885/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"dubCUT","tags":["shot","manager","camera","setting","render","filename","batch","collection","button","scene"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4986d4c3-65c1-433a-8359-2a7e83519a2f/","schema_version":"1.0.0"},{"id":"shot_manager","name":"Shot Manager 2 Lite [FREE]","tagline":"Render, layer and camera management","version":"2.0.8","type":"add-on","archive_size":541873,"archive_hash":"sha256:92e5bbb4136b64845a41ab08aa806cb233b3bfcb49e6d0912b5e2bf9bf892115","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/fc43d04e-1e87-4bb6-8f9f-d5c5923d688a/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Other Realms","tags":["shot","takes","macros","states","batch","render","burnin","burntin","stamp"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/30c9a568-79f8-4551-b71a-d4915ecccf52/","schema_version":"1.0.0"},{"id":"smart_apply_scale","name":"Smart Apply Scale: Rig & Animation Fixer [FREE]","tagline":"The Smart Apply Scale Addon that automatically fixes animations and F-Curves when applying scale to Armatures.","version":"1.5.2","type":"add-on","archive_size":9789,"archive_hash":"sha256:b14dd6a447be19ff0ba1d471c9ba0bd74661286e09205188096b1fa06101435f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3ccaadcc-27d6-49b8-9cd6-21bc64d8e12f/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Yakiv Sankov","tags":["gamedev","rigging","animation","addon","scale","unity","unreal","fix_animation","armature"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8d205ca1-cbf6-4a10-903f-0148e9d631a0/","schema_version":"1.0.0"},{"id":"subdivide_selected","name":"Subdivide Selected [FREE]","tagline":"This plugin applies subdivision to a selection with clean topology afterward and without separating polygons.\n\nUseful when you need to fix selected mesh areas affected by topology errors or low-poly problems","version":"1.2.3","type":"add-on","archive_size":2597,"archive_hash":"sha256:f964bb44f8f1dccfa4cb7c880b5fc3b742b749190e88ec0b39b57842c0097bf8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a371ba92-b0d4-426e-bcaf-4bb93df74414/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Łukasz Wilkoń","tags":["subdivide","weight","paint","vertex","mesh","edit","misc"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ed9859ac-9425-4619-a3ce-654c65ae7faa/","schema_version":"1.0.0"},{"id":"blenderdefender_spm","name":"Super Project Manager [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"1.3.1","type":"add-on","archive_size":64910,"archive_hash":"sha256:01d50d97d07f68a9e7e676754b5dbad1f1749af9c9248ee3e656d4671f552d8b","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5ca45a76-b0ba-4a42-ab5c-a6039131b80d/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Beedy","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d3edf068-7e94-4308-ba6a-df9184a20520/","schema_version":"1.0.0"},{"id":"survey_image_aligner","name":"Survey Image Aligner – Geodetic & Construction Workflow [FREE]","tagline":"Survey Image Aligner is a Blender add-on designed for precise alignment of survey and reference images in real-world coordinates.","version":"1.0.0","type":"add-on","archive_size":19532,"archive_hash":"sha256:1cfb365cb2667c8d5a600275a81ba033c21e426423885d228fd57aa85c525d3d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b1613ead-2102-4441-9b9e-25f2115961c3/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["3DView","UserInterface","Object","Survey","Image"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0d06c297-1456-4c32-8a3a-450951bf0907/","schema_version":"1.0.0"},{"id":"swap_render_orientation","name":"Swap Render Orientation [FREE]","tagline":"Swap Render Orientation lets you instantly switch between Landscape and Portrait mode with a single button click or F8 shortcut – saving time and keeping your work","version":"2.1.0","type":"add-on","archive_size":1891,"archive_hash":"sha256:e6bc031d13a16343fd7f0672f97edbb5567ef29600b457881be11c477cfa1c42","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/fa16455e-35c5-4f93-9478-72771e9e268c/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Nathan Jones","tags":["Render","Resolution","Orientation","Swap","Landscape","Portrait","Shortcut","Camera","Addon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a039fc1a-6af0-48f7-8165-ce6b5b2d7f6f/","schema_version":"1.0.0"},{"id":"tabs_interface","name":"Tabs interface [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"4.0.0","type":"add-on","archive_size":23870,"archive_hash":"sha256:0add617da4273ebfca87db38efff95df16f691c4cd9e2baa407cd41b10f0afbf","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/441ac3e4-075c-497a-83bd-7ba66bffeece/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"2.92.0","maintainer":"Vilém Duha","tags":["System"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d55d15f7-22f3-433f-9e6a-e7b3544256c0/","schema_version":"1.0.0"},{"id":"amazing_hypotrochoid","name":"The Amazing Hypotrochoid 1.0.9 [FREE]","tagline":"Generates intricate hypotrochoid curves with adjustable parameters and saves designs as editable meshes.","version":"1.0.9","type":"add-on","archive_size":28189,"archive_hash":"sha256:25a502b65b9332a0b53c601d66096dc8a1ceaf7af82ea7cf510d832b0b910c0e","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a6bee5b1-fc21-463a-b65d-78349d7185c4/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Jacques Durocher","tags":["spirograph","curves","hypotrochoid","math","equation","circle","swirl","abstract","art","random"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/95f41ca3-5d8a-40ef-9b7b-2c89978e42b2/","schema_version":"1.0.0"},{"id":"timeline_buttons","name":"Timeline Buttons [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"1.0.0","type":"add-on","archive_size":15158,"archive_hash":"sha256:3aac330381de15d2f69641f0f6c7f0dcaec42371e014ca70889cad899d27d815","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a70a4693-3fa2-4901-88cb-00a7c87e12ff/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"TinkerBoi","tags":["timeline","framerate","ui","dopesheet","graph","sequencer","animation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/efb9a92c-fe00-40dd-a3cd-70c4086143c0/","schema_version":"1.0.0"},{"id":"tmeasure","name":"Tmeasure [FREE]","tagline":"Measure edge paths, not just distance. Calculates the total length of selected edges in Edit Mode, including curves. Perfect for seams, cables, trims, and precise modeling workflows. Stores the last 5 measurements for quick comparison.","version":"1.0.0","type":"add-on","archive_size":4055,"archive_hash":"sha256:57c3a596e0725d20b517b453fea34d106b92bf6a9f8fbec584b3cd38fdb861ad","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4e5b3471-9f12-4ee4-a491-926cc95f6dde/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Otonkart","tags":["Mesh","Modeling","3DView","measure","calculation","measurement","precision","tools","hardsurface","editmode"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/bcfa86cb-798b-4fdf-80bb-3024eb5cadb9/","schema_version":"1.0.0"},{"id":"EMU3BM","name":"Toggle Emulate 3 Button Mouse [FREE]","tagline":"Adds a button with mouse icon next to topbar menus to toggle Emulate 3 Button Mouse.\nSolve the problem that there is no center mouse button when using the Graphics tablet.","version":"1.4.0","type":"add-on","archive_size":1343,"archive_hash":"sha256:e0eb54d5bc012e9d262c255df472ac0cdcf194a366f914d4c488525ed795c497","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2cb0b47c-afea-4165-97e4-92a1a91f2085/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Kin Chen","tags":["mouse","Graphicstablet","DRAWING","toggle","PEN"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/fa48f8c8-ccf7-4053-89d6-a4f065ca2709/","schema_version":"1.0.0"},{"id":"tryon_clothes_2","name":"Try On Clothes 2.0 [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"2.0.0","type":"add-on","archive_size":93895383,"archive_hash":"sha256:f0f5505c3252b090b9cb50cc04a9c0a20def4970b3441c21ad1983932f0e4c7f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/beb0b63c-6f62-4fdd-a56f-fe1164022d60/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Clothing","Tryon","Garment","Customization","Image","Model","Style","FashionTech","Virtual"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/fb812bd3-5913-4549-91fc-1ff8e5c486b7/","schema_version":"1.0.0"},{"id":"WeightPaintToolForBlender","name":"Weight Paint Tool for Blender [FREE]","tagline":"NO DESCRIPTION PROVIDED","version":"1.2.0","type":"add-on","archive_size":3855,"archive_hash":"sha256:ab7411de691858c94764273515a13f0a5768b78cca48a1c44554eee0d78380ed","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f24f5077-e24a-4e25-9e75-84a974d720f3/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"4.2.0","maintainer":"Peter Harmatiy","tags":["Blender","Weights","Paint","Tool","3Ds","Max","skinning","animation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8ebcbb43-4807-42e2-9ae1-9bef04b58aea/","schema_version":"1.0.0"},{"id":"cobweb","name":"Cobweb [FULL]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.2.1","type":"add-on","archive_size":50711,"archive_hash":"sha256:0706d2533db72a8d7e824ede71d7bfe84e3fea73a6454b3c3672900d7a8b8b41","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/28c5d4df-a8b9-478f-94cc-a2bd4decf1ef/addon.zip","verification_status":"validated","can_download":"Rejected in this plan","is_private":false,"is_free":false,"is_for_sale":false,"base_price":null,"blender_version_min":"2.79.0","maintainer":"Vilém Duha","tags":["System"],"license":["royalty_free"],"website":"https://www.blenderkit.com/asset-gallery-detail/20d48d8d-39a5-4d1f-9fb0-994401b2a9c2/","schema_version":"1.0.0"},{"id":"final_topology","name":"Final Topology for Artists [FULL]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":627177,"archive_hash":"sha256:0a9d55a9a02cb026fa969eeaf7f7eb11258732eeb8322e09c136e28da0aa8a4f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/46d5cd8f-b93c-4786-8e4b-51b3b6ebb645/addon.zip","verification_status":"validated","can_download":"User is anonymous","is_private":false,"is_free":false,"is_for_sale":false,"base_price":null,"blender_version_min":"2.92.0","maintainer":"BlenderKit Community","tags":["System"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/388b195c-5a7d-4d9f-a632-0dac12c9198c/","schema_version":"1.0.0"},{"id":"people2d_v2","name":"2D People [Before: $11.99, Now: $10.19]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.4.0","type":"add-on","archive_size":241198,"archive_hash":"sha256:f554e001022758111cf0b8e1e2d2d885b8f244f47b0482f2d8a2b3de9b6fbedb","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/75097bcf-7ae7-4129-a977-36aa69180fce/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.19","blender_version_min":"4.2.0","maintainer":"Sérgio Merêces","tags":["2d","people","assets","elements","trees","architecture","archviz","real","placement","projects"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e0fc2f9a-fb4f-4980-afb5-32f07d5c0cb8/","schema_version":"1.0.0"},{"id":"object_3d_comparison_video_generator","name":"3D Data Comparison Addon [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":42045461,"archive_hash":"sha256:9b8c84af187c955f914a5b0b78e1e4284e0b59c0c1fe1a9c2ac28f18ee7d1e2d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5abad072-0cfa-43f4-9e8b-a57814831497/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"3D COMPARISON Musk","tags":["3d","data","comparison","visualization","addon","blender","3dbar","3d_data_comparison"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/6ae0f491-2109-4e05-b1d8-e075bc0ea07b/","schema_version":"1.0.0"},{"id":"procedural_pattern_generator","name":"3DQuads Texture Maps Generator [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":73577,"archive_hash":"sha256:b1aff6a799bce2cb9891d217dc2795c1b57830f81d430e40fd15fbd613798a92","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9be78010-98d0-4180-9fc7-1316a565e139/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"3dquads blender","tags":["Material","Texturing","Procedural"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ae4162bc-84bb-4e48-b2b9-4072a990f873/","schema_version":"1.0.0"},{"id":"abo_connect","name":"ABO Connect [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.1","type":"add-on","archive_size":41658,"archive_hash":"sha256:d1e2b4545aafd73466c8f3525f2f7baf2ac4fc418e20fb31c9eed4ead61cf0f1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9bd45216-230c-442c-a0c7-ba898c2258f9/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Andrew Luzhetskyi","tags":["library","furniture","ABO","assets","models","archviz","electronics","free","interior"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e0bc8018-886c-4c41-ae18-2097088e3b48/","schema_version":"1.0.0"},{"id":"advanced_modifier_tools","name":"Advanced Modifier Tools (AMT) [Before: $6.00, Now: $5.10]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":26641,"archive_hash":"sha256:390d9e74a4786fd18958d7bf5adb8f9eb9bbc60527a136e8b6f8da045d63e054","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6dfdafb8-34bf-4fd4-88cb-1b98e7b896dd/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.10","blender_version_min":"4.2.0","maintainer":"Soheil Mahmoudi","tags":["Modifier","ModifierTools","AdvancedModifierTools","BulkOperations","Bulk","Preset","Snapshot","SoloMode","Modifiers","Selection"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0fd579a3-d75a-4ca3-9e44-154f571858b8/","schema_version":"1.0.0"},{"id":"ai_geometry_node","name":"AI Nodes [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":12066,"archive_hash":"sha256:52f11f2ebfd2f323c7f6d0497bc4cf7f9e182c956a59bc06f8333316769f3b24","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c03e5769-59f1-4c19-a610-f2cfa150cc61/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Nicolai Prodromov","tags":["ai","llm","chatgpt","claude","gemini","artificial","intelligence","dynamice","text","procedural"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7de3fba7-ce57-4124-b1e1-d146e7855b0d/","schema_version":"1.0.0"},{"id":"ai_shortcuts","name":"AI Shortcuts: Add new buttons to blender [Before: $6.99, Now: $5.94]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.8.0","type":"add-on","archive_size":11078,"archive_hash":"sha256:99844c2df0e2bd04d5f1326e199a57507ad60affc64223a7b5809b33e0c23997","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2d892b56-86b1-45b9-b1f6-355b28a7993f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.94","blender_version_min":"4.2.0","maintainer":"Zahit Erdem Guzel","tags":["ai","gemini","addon","blender","shortcut"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4f4adf7a-d4c9-400d-85ee-53b73a3cc14f/","schema_version":"1.0.0"},{"id":"align_toolkit","name":"Align Toolkit [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.1","type":"add-on","archive_size":15041,"archive_hash":"sha256:024b25133b7ba4de512a7043fcd1fdf4e1dda61fb407db9118d477cb293743b4","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ae77c204-58c0-452a-a391-c8573c2b0bdc/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"carlosmu","tags":["alignment","ux","align","distribute","ui","toolkit","user","interface","experience"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/68a1366b-51bc-40b3-af32-9b38d3292e47/","schema_version":"1.0.0"},{"id":"alt_tab_colorful","name":"Alt Tab Colorful [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":20121,"archive_hash":"sha256:393d1f896b9aba97226956a59a1b15cc0d0ae501517ab8c54a46603f967b3eb9","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/96b0ebc8-38c7-4f1d-a3cd-34a2cfa4402b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","colors","colour","palette","generator","color"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/de7931c2-31d6-473f-982e-728a1a735269/","schema_version":"1.0.0"},{"id":"easy_fog","name":"Alt Tab Easy Fog 2 [Before: $40.00, Now: $34.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.5.0","type":"add-on","archive_size":64598868,"archive_hash":"sha256:2c2840bbfceada6d70b37dfac28bae7e3b347be5ad871d64332b24c91bb647a8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/7b56f9ad-1df7-4803-be2b-f74a32dd1690/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"34.00","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","addon","fog","volume","clouds","mist","explosion","godray","smoke"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5ba4cad8-7db8-4235-a5f7-bd264a60e489/","schema_version":"1.0.0"},{"id":"alt_tab_easy_hdri","name":"Alt Tab Easy Hdri [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":385592,"archive_hash":"sha256:b72f2d7159a888113322cda4646363adb8e52698b1af624e0e4c4fcdcf380133","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9f3c1e2a-bfbe-4286-84c4-ec44b98109e8/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","HDRI","World","Lighting","GroundProjection","HDRISphere","addon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/2347b643-69bd-4f8d-8008-ffba17e706e3/","schema_version":"1.0.0"},{"id":"alt_tab_lighting","name":"Alt Tab Lighting [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":11811259,"archive_hash":"sha256:a6da266309f0c9e57df4ac8c73c96a8cc539751b413283b5d8c53c42bc055236","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ede8deaa-d482-4eaf-88ed-59baf96d81c7/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","lighting","presets","cinematic","lights","light","addon","manager"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/fccb81d9-10b2-40ad-b46e-9d3a4b88f8ef/","schema_version":"1.0.0"},{"id":"alt_tab_pixel","name":"Alt Tab Pixel [Before: $8.00, Now: $6.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":187750,"archive_hash":"sha256:ab0672cd273718e0b180a0b62885c7700f3a9c87e012368f4aaa56135563802b","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e8e63c9f-bfb2-4b1f-ab48-6f215a471b00/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.80","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","pixel","pixelart","2d","shader","workflow"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/846e4c3e-6227-405d-8682-fbbf080d9dcb/","schema_version":"1.0.0"},{"id":"animates","name":"Animates Complete Animation Suite [Before: $65.00, Now: $55.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.4","type":"add-on","archive_size":174446,"archive_hash":"sha256:6ba53c2008f5ebbe9eb4cd5a58b37f2cf008729a95875a37dffc32628af00b6d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/67fafa3c-a1d2-4a62-882f-67051513e2ca/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"55.25","blender_version_min":"4.2.0","maintainer":"David Hallows","tags":["animation","character","keyframing","graph","editor","motion","workflow"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/fe9df247-5dd5-441d-91dc-aafdde63db3e/","schema_version":"1.0.0"},{"id":"animation_layers","name":"Animation Layers [Before: $28.00, Now: $23.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.1.9","type":"add-on","archive_size":74058,"archive_hash":"sha256:f2faf9b296ce2dce49cb7fb1cd3d27a607f4b5b83472133e640037ec4614b241","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d17b8866-ebf8-4bf3-a8d8-a7f5ba5159f4/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"23.80","blender_version_min":"4.2.0","maintainer":"Tal Hershkovich","tags":["Animation","layers","motion","capture","mocap","nla"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/797ac060-785e-49dc-a98f-d0ecf4abc555/","schema_version":"1.0.0"},{"id":"animtex","name":"AnimTex - Animate Texture Transitions [BETA] [Before: $19.00, Now: $16.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.8","type":"add-on","archive_size":1581140,"archive_hash":"sha256:880d8c49a4b1f7dcfec4993eeb2e07e027f302f5bf515e8393a6aad62c3dceb9","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b3201024-25d6-49d2-b71b-cd12e619e139/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.15","blender_version_min":"4.2.0","maintainer":"Doctor Legion","tags":["3DView","Material","Animation","Texture","Disolve","Disintegrate","Effect"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f1f0d459-3a41-45bb-a502-8eb0fc86fd85/","schema_version":"1.0.0"},{"id":"archiform","name":"ArchiForm [Before: $1.00, Now: $0.85]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":42977,"archive_hash":"sha256:85b7c71aea23717ad2cd040897a2cf31a74b22b23691d2b00bf1c9cf5bfd25f6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/7a0535ba-38c2-44b6-b3a0-390d56398a70/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.85","blender_version_min":"4.2.0","maintainer":"Abbos Mirzaev","tags":["RoofGenerator","WindowGenerator","parametricdesign","floorgenerator","FastModeling","ProceduralModeling","ArchViz","WallGenerator"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7ce6dc77-79fc-4a75-8f35-f241946e834c/","schema_version":"1.0.0"},{"id":"archviz_camera","name":"Archviz Camera [Before: $28.00, Now: $23.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":7573,"archive_hash":"sha256:4b1731b758ae452d3b7e94e18041181660942afd3c57ccf16e374a6d1231679a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/149ff6da-8fe3-49ca-9afb-8630afebe62c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"23.80","blender_version_min":"4.2.0","maintainer":"Daniel Farjoun","tags":["archviz","camera","tilt","correction","manager","render","shot","architecture","pro"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/fd4522ac-f70a-4d3a-9955-7c133b4572b3/","schema_version":"1.0.0"},{"id":"defoq_assetify","name":"Assetify | The Ultimate Bake & Export Tool [Before: $34.99, Now: $29.74]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.1.5","type":"add-on","archive_size":438131,"archive_hash":"sha256:bf0fcb963fe97edf240ab8f350102829bcaaca07880e30b4ebe5a08ec6ac3b12","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b4b54309-7911-4dd9-bc33-ec7b633000f3/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"29.74","blender_version_min":"4.2.0","maintainer":"Defoq Nino","tags":["bake","export","game","engine","materials","optimization","unity","ue5","textures","fbx"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/82a1fc6a-bb0a-4162-bf87-ce2d6f1d80bb/","schema_version":"1.0.0"},{"id":"auto_apply_scale","name":"Auto Apply Scale [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":3401,"archive_hash":"sha256:ee30a47355275e1eef8b09809bf0afd33c8e21a648101523992fd22e5cd77f73","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b4e63abb-980f-4bd2-9d5b-8d58e40ceb02/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","scale","autoapply","workflow","modeling","addon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e9e08a2f-273e-4dc1-833a-9bb00e7c0140/","schema_version":"1.0.0"},{"id":"auto_displacement_and_bump","name":"Automatically set material to \"Displacement and Bump\" [Before: $1.00, Now: $0.85]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.7.0","type":"add-on","archive_size":4305,"archive_hash":"sha256:5cfd1524435be43a647fa5867e72f99ebb7961675ad78b4c19365c44f4e4d591","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/af628f62-4440-4bad-ae9f-0faeac8bcd61/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.85","blender_version_min":"4.2.0","maintainer":"Alhakam Kain","tags":["Material","Displacement","Bump","Cycles","Auto","Workflow","Subdivide"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9ba32fb3-ac0b-4119-a0e0-ce2d83c04170/","schema_version":"1.0.0"},{"id":"automatic_fake_user","name":"Automatic Fake User [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":4268,"archive_hash":"sha256:938ba462e6a0bcef16a7150db22fd86bd823f80c73846ac946cf20e502165c10","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a6f43cc3-6202-4572-becf-eb6238949665/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"carlosmu","tags":["asset","data","ui","ux","datablock","autosave","fake","user","automatically"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/90f0e757-41db-4a42-8d9a-c4ddf93b81bd/","schema_version":"1.0.0"},{"id":"autoremesher","name":"Autoremesher NOW! | Automatic Remeshing [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":13575159,"archive_hash":"sha256:b7ddbce82ba2b35e7093123802b38643f15be4833eb367a1fc569944cfaefec8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/77576378-4a87-4829-ad24-a20a89033b10/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Giambattista Von Nettesheim","tags":["optimization","decimation","tool","topology","cleanup","quad","remesher","mesh","repair","remesh"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/86e86fab-5c54-4e8b-8ad9-4db6aa160784/","schema_version":"1.0.0"},{"id":"auto_save_file_checker","name":"Auto-Save File Checker - Browse all the Temp Files [Before: $2.00, Now: $1.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.0","type":"add-on","archive_size":11826,"archive_hash":"sha256:97bbf97c0794a1fe1a71563ccb04287667b32ca08dc579436757408fc6f04668","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/84632576-75d1-4ca3-9bcb-becbe3884a98/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["System","Development","autosave","blendchecker"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/18ba6214-e44c-4603-a654-19123100e06f/","schema_version":"1.0.0"},{"id":"auto_uv_unwrap_2","name":"Auto UV Unwrap & Pack 2.0: Seamless UV Mapping [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.1","type":"add-on","archive_size":8554,"archive_hash":"sha256:c89121acb51e27ad11924ce8b5a04a1fa4ab913f30d541df0cab354dd6075f25","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/54f6fb4a-aa34-4510-9e68-46b1d1954e6d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"Studio156","tags":["blender_addon_for_uv_mapping","tools","seamless_texturing","seamless_uv_unwrap","uv_mapping","uv_unwrap","uv_unwrapping","auto_uv_unwrapping","auto_uv_mapping"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/3915ee47-7c9f-4349-9981-cef51ba1c19c/","schema_version":"1.0.0"},{"id":"basic_wire_rig","name":"Basic Wire Rig [Before: $2.50, Now: $2.12]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":8971,"archive_hash":"sha256:a52e5ed61919cfceabcc799a50ddf9ef0bfd143ea8a891f08b1dec71820d0ee3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/efa10129-754e-4d6d-8ccb-e709a206fe14/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.12","blender_version_min":"4.2.0","maintainer":"Null Station","tags":["Animation","tools","cable","rig","wire","puppet","inverse","Kinematics","chain","ikrig"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5683ae75-d590-4756-8292-1ecbb4aa66cf/","schema_version":"1.0.0"},{"id":"batch_bg_cams","name":"Batch BG Cams [Before: $8.00, Now: $6.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.3.1","type":"add-on","archive_size":5729,"archive_hash":"sha256:5b9c970deea58baf77051ba10d84244744e4f1ad5c425560a9630664ce3a2e0c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/74b24024-c0c4-40b0-b200-400c078cde58/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.80","blender_version_min":"4.2.0","maintainer":"Hannes Werner","tags":["addon","camera","layout","background","import","timeline","productivity","automation","animation","video"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a30ce0f8-752f-4a55-b0e0-1cee72949d24/","schema_version":"1.0.0"},{"id":"batch_export_selected","name":"Batch Export Selected [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2703,"archive_hash":"sha256:6998f2db2bd89bf52d165e69566e97cbb1e21c2bd6ea48af63bf5978669b44b8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/dfc42df0-8211-43ec-ba42-4fb4a1eb7b89/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["export","selected","objects","bulk","multiple","format","addon","obj","fbx","stl"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/110a268e-9661-4a69-b1b0-0970e718bb99/","schema_version":"1.0.0"},{"id":"BatchGenie","name":"Batchgenie: Asset Assistant [Before: $19.00, Now: $16.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.1","type":"add-on","archive_size":14941835,"archive_hash":"sha256:6b510374f080da157ad4a432507f68ad9832f80c7870c47510b2cf98e484d322","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4c40dbb1-424c-4197-9e8f-fbc43deb89da/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.15","blender_version_min":"4.2.0","maintainer":"Roberd Palm","tags":["Asset","Library","Batch","Rendering","Import","export"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/32b07916-3a38-46d5-8e25-544926d8fd5d/","schema_version":"1.0.0"},{"id":"batch_rename_addon","name":"Batch Rename [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1745,"archive_hash":"sha256:1b4be6000c75875c5db989d606cf9dafc4ae84b29829b9ec656b041ab9bf365a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/7e974a06-e3ca-4107-ae67-23c57fa81231/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Batch","Rename","Prefix","Suffix","Organize","Interface","Efficiency","Naming","Scene","Automation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e0ce1d7c-858a-48a2-84e5-2765dc617bda/","schema_version":"1.0.0"},{"id":"batch_rename","name":"Batch Rename & Replace Pro Blender addon [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2746,"archive_hash":"sha256:87eff844dff87b5aece9b41f3c2fee5a1de0baa8837ce4a88b85560996cb328c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/639f709c-2c21-4022-b4a0-a71a6bbc8096/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Studio156","tags":["batch_rename","find_and_replace","object_naming","prefix","rename","scene_organization","suffix"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/2bb18442-9a82-4a5a-abdc-a09f90c400b7/","schema_version":"1.0.0"},{"id":"kamildobrek_batch_render_manager","name":"Batch Render Manager [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.5.0","type":"add-on","archive_size":58465,"archive_hash":"sha256:1869ac939e037aac1143217cfa2a8eea118f1d3b30c5d3df6e53b5efe45e2f98","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e1ed6b2c-c614-4e21-af32-ef412127d6d9/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"K","tags":["Material","Object","Render"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ff85ef84-9287-465c-a30f-4ed43fe442e1/","schema_version":"1.0.0"},{"id":"bb_toolkit_pro","name":"BB Toolkit Pro [Before: $8.99, Now: $7.64]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.8","type":"add-on","archive_size":56758,"archive_hash":"sha256:412b2098d35238a1766808a2d49895488e42f8bb98df0bde33cd1ba5fc5e6cb6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e1252aad-c6c5-42eb-a389-cbefdcb6aa8e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.64","blender_version_min":"4.2.0","maintainer":"Theo","tags":["threelights","overlays","productivity","modelling","tools","quickaccess","modifiers","fixscale","wireframe","facenormals"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f953d832-362d-4e0c-9caf-208f6e7936b0/","schema_version":"1.0.0"},{"id":"benchmark_fps_v1","name":"Benchmark FPS & Vram refresher helps reduce crashes [Before: $1.00, Now: $0.85]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.5","type":"add-on","archive_size":7924,"archive_hash":"sha256:b3f167cd024e33a75f6b014429097d8910ad54b87e7cabce765b203a676d8332","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e3f39d7e-5eff-4703-a412-1a4b76006714/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.85","blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["memory","fps","gpu","cpu","test","addon","2025","blender","vram","refresh"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/47c7ca2c-4a53-4a7f-a858-34c5fa29dbb8/","schema_version":"1.0.0"},{"id":"better_cutter","name":"Better Cutter V1.1 [Before: $19.00, Now: $16.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":32438,"archive_hash":"sha256:d8a1153ba01c79e55c1ba97c79a1982415e47e77d41c5742cca7e01636212f0f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cc4a77cd-92c1-4ae7-9da4-d04038e8e715/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.15","blender_version_min":"4.2.0","maintainer":"Bala Murugan","tags":["cutting","addon","better","cutter","hardsurface","modeling","blender","3dmodeling","boolean","looptools"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/85b19cc5-4a46-46f8-8f1e-e399a8458ac1/","schema_version":"1.0.0"},{"id":"bevel_joints_v7","name":"Bevel Joints - Join Meshes - Weld - Bevel V2 compatible - Set Mesh normal - Edge attributs [Before: $15.50, Now: $13.18]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"7.1.0","type":"add-on","archive_size":574169,"archive_hash":"sha256:6f8d9c1a6c8a2600d62e4232a1ee8449df78d0c55f3d3589056256fd4e1628d1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/67a61b5f-b465-43e2-a721-f9810b837cab/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"13.18","blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["bevel","join","mesh","blender","manifold","clean","2025"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8f021e02-4605-4a46-ad46-3aff2abadae8/","schema_version":"1.0.0"},{"id":"bildeform","name":"Bildeform | Bas Relief Maker From Your Images And 3D Models [Before: $25.00, Now: $21.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.5.0","type":"add-on","archive_size":3428836857,"archive_hash":"sha256:019c6f1817813596fbe99262a8a5226610432ce57b80b8d4ba924fef9fa76b02","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5bf2c82d-0b88-4f64-8237-bc7a99550bd6/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"21.25","blender_version_min":"4.2.0","maintainer":"Giambattista Von Nettesheim","tags":["basrelief","heightmap","zbrush","reliefmaker","depthmap","bildeform","displacement","3dprinting","CNC","maps"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4f0e25d1-7c9d-4a77-bf6d-60df3dc5b7a2/","schema_version":"1.0.0"},{"id":"blenderkit_translator","name":"BlenderKit Translate [Before: $6.90, Now: $5.86]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":2506,"archive_hash":"sha256:efb37d88992f8a1271da4c4e0012fd4992b4306dfc50382aeb5e6494a048ae11","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/da53acdc-2eaa-4b3b-ad15-dfe1acec4ba3/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.86","blender_version_min":"4.2.0","maintainer":"AHMED KETTUR","tags":["translation","search","assets","tools","language","utilities","workflow"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c58bdee2-6fae-4164-8dab-2786202b3e76/","schema_version":"1.0.0"},{"id":"blender_light_mixer","name":"Blender Light Mixer add-on [Before: $25.00, Now: $21.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":11478,"archive_hash":"sha256:ca92bbdafac363ea15437189b1555e4fc52d97f62ceb0a14a67876fdb1b1ef02","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3ba1716a-2ef7-43f6-9c80-fe65bd0987c6/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"21.25","blender_version_min":"4.2.0","maintainer":"Milad Kambari","tags":["Lighting","Render","Compositing","Cycles","Mixer","Addon","Realtime","Rendering","HDRI","Emission"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7b131c57-7e52-42f0-a1c0-9bcfcd38b182/","schema_version":"1.0.0"},{"id":"blender_luts","name":"Blender LUTs [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":5883785,"archive_hash":"sha256:117804828d165ade5fed594f79a3f4c17e292297a6beae975915d2f6b096b416","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3b02592a-8adf-4be4-9255-387cc5f59072/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["LUTs","Compositor","Renders","Color","Effects","Nodes","Filters","Cinema","Grading","processing"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/02dacd43-eafd-435f-badf-d01756834f35/","schema_version":"1.0.0"},{"id":"blender_sp_live_link","name":"BLENDER <-> Substance Painter Live Link [Before: $18.00, Now: $15.30]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.1.0","type":"add-on","archive_size":25427070,"archive_hash":"sha256:375ff3ee561d16e1ba47e809c660a75c6f0901796dd9de698c4addd2d782ba53","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c443b576-8673-4247-aaa3-0b96ce40ffaf/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"15.30","blender_version_min":"4.2.0","maintainer":"Milad Kambari","tags":["blender","addon","livelink","bridge","substance","substancepainter","blendertosubstancepainter"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8653c075-2f7a-418b-b228-c5cabbf5ba0e/","schema_version":"1.0.0"},{"id":"blender_to_godot","name":"Blender to Godot [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":428166,"archive_hash":"sha256:4cfb1f07378f913f444fd99705fb7055b5d0f97448441f0a593d4344ae39bfad","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3e254987-5ad0-4a44-ba15-97443977b439/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["object_export","collection_export","collision_export","component_export","animation_export","godot_exporter","gltf_exporter","godot_workflow","godot_pipeline"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0bc81975-693c-42e6-8465-ad0e2e37d9d7/","schema_version":"1.0.0"},{"id":"blender_to_unity","name":"Blender to Unity [Before: $30.00, Now: $25.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.6.3","type":"add-on","archive_size":441571,"archive_hash":"sha256:fce9fe4a678c1b63705f961c5b2670af2fecbf359f548d81783abae5dd310a3c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/8d1ff11d-8a75-4596-bab4-58c7f7b38990/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"25.50","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["blender_to_unity_export","fbx_exporter","batch_exporter","unity","unity_3d","lod_exporter","collider_exporter"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7c884710-57d8-438e-a89f-1c51bb88bb9c/","schema_version":"1.0.0"},{"id":"blender_to_unreal","name":"Blender to Unreal [Before: $30.00, Now: $25.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.5.6","type":"add-on","archive_size":437338,"archive_hash":"sha256:52aa2f32a8bab44b1c013c4d61afa821a318bc07d2739b02c7e0d6b7d0947b6c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6ea8ed9d-2948-41d8-88d0-d6f30a061604/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"25.50","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["blender_to_unreal_exporter","unreal","unreal_5","fbx_exporter","batch_exporter","collision_exporter","LOD_exporter","socket_exporter","animation_exporter"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7c047180-1c4f-4280-b4dd-56953673651a/","schema_version":"1.0.0"},{"id":"blenquick_autorigger_v2","name":"BlenQuick Auto-Rigger (BAR) [Before: $30.50, Now: $25.92]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.7.0","type":"add-on","archive_size":7256665,"archive_hash":"sha256:e1394f22335d226e26767aa62c1a3b60ab8611d714eaf7b72948c07f76dcb272","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e24fed34-cbd3-4ace-9249-9aa663f6c4d3/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"25.92","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["rig","rigging","autorig","autorigger","blenquick","advanced","detection","export","character","smart"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8844f27d-31e1-44a6-ab42-9518a22f0490/","schema_version":"1.0.0"},{"id":"booleanbite","name":"Booleanbite: 1-Click Procedural Edge Damage For Blender [Before: $3.00, Now: $2.55]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":8394,"archive_hash":"sha256:c7f3318eeea5cc01f51bd76af0afb1c74275f0b331cf261891cac5a9f042a536","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d0b2bbfa-bc8c-41b9-9ebd-4480955e13f1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.55","blender_version_min":"4.2.0","maintainer":"Shift4Cube","tags":["hard","surface","blender","addon","edge","wear","boolean","procedural","damage"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e7644b82-c95d-4c06-b3f3-fb7b804ea64f/","schema_version":"1.0.0"},{"id":"boon_shader_lite","name":"Boon shader lite [Before: $1.00, Now: $0.85]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.9","type":"add-on","archive_size":11944507,"archive_hash":"sha256:52b7f858bb8dbf122f7e8b04e5556cc199844b6ec5a1f1f20bbe0e378bf54c89","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cbdbb779-e0ca-4d62-8b31-85274f0c2077/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.85","blender_version_min":"4.2.0","maintainer":"Applebharath","tags":["Material","Render"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/3b9c924f-a11c-4d6f-af86-bafeb474d5ac/","schema_version":"1.0.0"},{"id":"bounding_box","name":"Bounding Box - Fixed, Dynamically, Shrinkwrapping - Easy to use [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":380172,"archive_hash":"sha256:8eb955f27e800b3fca95a09efccfc6cfde49bcfbdc7409479f7f76c99dce579d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/32700b65-aa85-49be-a0e8-282c87d30d58/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Dennis Hafemann","tags":["3DView","AddMesh","Object","bounding","box","surround","wrap","shrink","dimensions","resizing"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f5948370-e94d-4662-83e0-261f2c5dcb29/","schema_version":"1.0.0"},{"id":"bpm_marker_toolkit","name":"BPM Marker Toolkit [Before: $14.00, Now: $11.90]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":6263,"archive_hash":"sha256:442334badc75322a02f1b12e047930c9deff79bd99f1496517c9241597936cec","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/500fa12b-eb94-4e33-9dd9-73dbab309978/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"11.90","blender_version_min":"4.2.0","maintainer":"AL3K Insouratselou","tags":["Animation","Timeline","Markers","videoclips","music","sync","bpm","rythm","synchronization","timing"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/99529f45-bc25-4e04-8ff0-792af864a549/","schema_version":"1.0.0"},{"id":"breakdown_master","name":"Breakdown Master [Before: $10.96, Now: $9.32]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":318236,"archive_hash":"sha256:77d5adad2e2ab51fbc5b2cb83c695f8f09ee2074dea3da1b7801d951aef67b51","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4f4435fe-f3f9-4b5e-b8e3-80f898e0f551/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"9.32","blender_version_min":"4.2.0","maintainer":"Zahit Erdem Guzel","tags":["breakdown","animation","addon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a5602d43-74dd-4210-add4-c2699480f169/","schema_version":"1.0.0"},{"id":"breeze_sway","name":"Breeze Animaiton Tool [Before: $12.00, Now: $10.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":22657,"archive_hash":"sha256:a2030b664b8b229e59b89bd097644e7ae1dc70cbedd0c5af0670c528b9983cb8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a9f0915d-ea4f-44ee-8805-b9e908719323/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.20","blender_version_min":"4.2.0","maintainer":"Milad Kambari","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/dde3c942-917f-4d40-a8a4-535aecc2717a/","schema_version":"1.0.0"},{"id":"bsat_reference_plan","name":"BSAT - Reference plan scaling [Before: $3.00, Now: $2.55]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":339168,"archive_hash":"sha256:2c677a7a66aa6bec8aa6ebdbbc83b183a40a0c6cd6cfce83c2582cb0fc7632bd","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/45c91b7e-4536-48e1-8686-6823b91d7b73/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.55","blender_version_min":"4.2.0","maintainer":"Julien Winé","tags":["architecture","reference","plan","scale","distance"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e7a459b1-81e4-4869-b684-d23bbe22c20e/","schema_version":"1.0.0"},{"id":"bslicer","name":"B.slicer [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.5","type":"add-on","archive_size":31181,"archive_hash":"sha256:cd9e602df6126a629549eb596c837cba76ce00442ef008db6cb7b32501a774a7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c8dbfa24-0f99-4325-931f-b5d37d67650a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"belaid ziane","tags":["slice","slicing","export","svg","flatten","modeling","parametric"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/45e0a112-b302-4020-881b-3a91fc139236/","schema_version":"1.0.0"},{"id":"camera_autofocus","name":"Camera Autofocus [Before: $2.00, Now: $1.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.9.0-20251005","type":"add-on","archive_size":5307,"archive_hash":"sha256:56752e1d4365f09bf9ce871f8d1c41fc499b943f794913698b96878065f09989","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0bf968a5-802c-48af-8350-05afbcc19ff8/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","blender_version_min":"4.2.0","maintainer":"Vixymiles","tags":["camera","autofocus","dof","focus"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/2b81f79c-ab9d-4d7c-8181-cb4236963e5a/","schema_version":"1.0.0"},{"id":"camera_orbit_render","name":"Camera Orbit Render [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":10074,"archive_hash":"sha256:684a165b077372fe487504ac7314ff822817b24193fe0be962c8333bb4990682","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d7a8f513-be82-48b4-83f3-35c878b5d128/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Dennis Hafemann","tags":["3dview","camera","orbit","render","product","cursor","objects"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/69fdf172-290b-4b86-8b48-0c06bc312be9/","schema_version":"1.0.0"},{"id":"camera_preview","name":"Camera Preview [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.5.3","type":"add-on","archive_size":38959,"archive_hash":"sha256:aeb2eb83fe7690228387c899c8d25e8e3135e15fcaecb86bd8e2236bfc08d6bf","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c7ee8ddf-3aee-440d-9148-a7807360aa6e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["preview","camera","3dviewport","viewport_preview","camera_preview","viewport_overlay","camera_addon","camera_view"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c4e22853-8e2f-4895-a813-390c1289a4b0/","schema_version":"1.0.0"},{"id":"camera_render_settings","name":"Camera Render Settings - Settings per camera! [Before: $9.00, Now: $7.65]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":9056,"archive_hash":"sha256:eb1b21ea9778e55cd6e341aeb92473d301e3655bb2a0f10374d16f48dce6b771","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/15be96bb-fe63-4ef8-b6eb-108ee1a18bf1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.65","blender_version_min":"4.2.0","maintainer":"Zahit Erdem Guzel","tags":["camera","render","rendering","settings"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/81384cea-a973-4bcf-879c-4289acbecac7/","schema_version":"1.0.0"},{"id":"camera_switcher_pro","name":"Camera Switcher Pro [Before: $9.99, Now: $8.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":13521,"archive_hash":"sha256:5c1e20ea372426f7299a477dc73f08bd44e7d2504ddfc47ffea36ee8bacec14a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/144b63b2-da09-4dba-a23b-f44a3bcf5515/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.49","blender_version_min":"4.2.0","maintainer":"Doctor Legion","tags":["camera","animation","shaking","3danimation","viewport","addons","tools","3dcameratools","switchingcameras","cameras"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/035556c6-4189-45dc-9249-be5558d0c54e/","schema_version":"1.0.0"},{"id":"car_rigger_v1","name":"Car Rigger [Before: $17.50, Now: $14.88]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":1803528,"archive_hash":"sha256:abfddbd63f62fe1c73fe4e00335f1a67671fcd2cfacf4c8c17ef0e1679ede402","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/59d7b427-7b6a-47bb-8ad0-60d12b95c339/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"14.88","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["Rigging","Rig","Rigger","Car","Truck","Animation","4x4","Vehicle","Autorig"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ae20ae9a-4004-4920-8daf-c69ad0a1c0aa/","schema_version":"1.0.0"},{"id":"cgp_editor_switch","name":"CGP: Editor Switch [Before: $2.00, Now: $1.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.6.2","type":"add-on","archive_size":31881,"archive_hash":"sha256:be48e1779b44df451e744e99c2008526c7685124ef7617e4cc88bc82ffe50b88","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/23b6989d-84f3-4018-a0d7-2fe6e8fc9555/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","blender_version_min":"4.2.0","maintainer":"Chaitanya Garg","tags":["editors","nodes","compisitor","faster","workflow","animation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/266ba176-1a93-49b2-888b-2af27b8304f3/","schema_version":"1.0.0"},{"id":"cgp_super_z","name":"Cgp: Super Z [Before: $2.00, Now: $1.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.6.0","type":"add-on","archive_size":23262,"archive_hash":"sha256:eb2fd1e49c3ef09eb2ef931671ee5529b55510c9b1fea4d846fa7f41023f9dd7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/8a3b051c-c2a9-4301-97ca-77906d16b6f2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","blender_version_min":"4.2.0","maintainer":"Chaitanya Garg","tags":["shading","faster","worklow","viewport","super","z","materials","screen","overlays","wireframe"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/dc9d076e-b83a-4132-b48c-03a863c17e7a/","schema_version":"1.0.0"},{"id":"chain_generator","name":"Chain Generator [Before: $26.00, Now: $22.10]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":16909104,"archive_hash":"sha256:038d7bcb0ac96b490ab2f97d1a4d06be5e0d1e07903fc40bcd17fdc487ab5cc9","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1131e3b7-e751-41db-9727-a9286b9ce02d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"22.10","blender_version_min":"4.2.0","maintainer":"Liryc Creative Design Studio","tags":["fashion","metallic","accessory","art","chain","geometrynode","animation","modeling"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/323235cb-5286-42b0-85eb-d36eb388674a/","schema_version":"1.0.0"},{"id":"cid","name":"CID [Before: $8.50, Now: $7.22]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.0","type":"add-on","archive_size":22352,"archive_hash":"sha256:826b68d462541991755bf30491319ce46059185838f22098774171e897ccf25e","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ff94167b-9038-46d9-9015-033870cf6daa/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.22","blender_version_min":"4.2.0","maintainer":"Parametr Studio","tags":["color","id","element","channel","mask","pass","colour","postproduction","render"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/aeb02b02-f395-4310-a629-6a864b3c4a6c/","schema_version":"1.0.0"},{"id":"cinespline","name":"CineSpline – Cinematic Camera Rig for Blender [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.4.0","type":"add-on","archive_size":70651,"archive_hash":"sha256:a3760b42bc393b1bc519ccfa93dc4a8cca340b48ba8cfe552b4f5aa3585d0722","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9c9e5311-af14-4e01-90d2-8f8b3a31918c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Mazen Lawand","tags":["camera","cinematic","animation","storytelling","motion","timeline","morph"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/cc20ab37-417f-4a5a-ba54-0a74f46fdff8/","schema_version":"1.0.0"},{"id":"clean_addons","name":"Clean Addons [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"0.2.1","type":"add-on","archive_size":1501,"archive_hash":"sha256:4a9e91da91039e184f87e65411130cef1f621b9d40d7ca0d30114e0f98c2966a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a1b50628-4588-4cba-b82e-c1cee2dc90a4/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Addons","Interface","Management","Toggle","Panel","Preferences","Customize","Tools","Enable","Disable"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0462ad01-9d76-4cdf-80cd-d408df81b69d/","schema_version":"1.0.0"},{"id":"cleaner_ps","name":"Cleaner [Before: $9.00, Now: $7.65]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.5.0","type":"add-on","archive_size":2818,"archive_hash":"sha256:ccc8d13da56ecca03a61b904561135e6197ccb5da32292cb20dcf5cd126ef2f1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/81217f29-9bb3-4cf5-abb3-789cdc86990c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.65","blender_version_min":"4.2.0","maintainer":"Parametr Studio","tags":["cleaner","pure","purge","topology","modeling","optimize","scene","cleanup","materials"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/99558ea3-aa07-4857-b623-f636dfbc6179/","schema_version":"1.0.0"},{"id":"clippy","name":"Clippy [Before: $2.50, Now: $2.12]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":4360,"archive_hash":"sha256:983e222541b1c79a60e5d98c7d03667322ddbc60217caf299008f15d8829e8c8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/7ea35ee2-12d7-4e70-931c-b96d7bb2809c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.12","blender_version_min":"4.2.0","maintainer":"carlosmu","tags":["ux","ui","camera","presets","viewport","clipping","user","interface"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/14658df6-0976-4e12-8bef-5496b444c437/","schema_version":"1.0.0"},{"id":"clip_speed","name":"Clip Speed [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2346,"archive_hash":"sha256:4b0b1cc4ffc72ef8935b2158641226855e4bfb02f642cfe462350008fd5290ef","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/57c36e54-5ad0-4da7-8624-13ab4e53fd96/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Sequencer","Speed","Duration","Playback","Video","Editor","Time","Clip","Reverse","Effect"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/161371d5-eb46-4252-b994-b74517b6e336/","schema_version":"1.0.0"},{"id":"collection_colorizer","name":"Collection colorizer - auto-assigning viewport colors to meshes in specified collections [Before: $0.99, Now: $0.84]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.4.1","type":"add-on","archive_size":2128,"archive_hash":"sha256:d749ef1fba32ceb555db5b35e7b7089b64632e253e2f00e2792bc8d07f0b16f7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/78d30dc9-9667-4559-b7fa-d789c89c690b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.84","blender_version_min":"4.2.0","maintainer":"Mesk911","tags":["color","viewport","collection","display","object","solid","tool","search","visibility","optimise"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/aef8a90b-e532-4020-bda5-a0c62336b9f4/","schema_version":"1.0.0"},{"id":"colormatrixel","name":"Colormatixel - Advanced Material & Color Management Add-On For Blender [Before: $4.99, Now: $4.24]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":166059,"archive_hash":"sha256:eda137854baf27d4e75648abde8dfae400aa0d03d16aa07482d587e8284cde36","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/116a189a-7787-4727-9b06-72490bc551d3/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.24","blender_version_min":"4.2.0","maintainer":"Mohid Tahir","tags":["pixelart","color","gradient","randomization","colormatrixel","addon","blender","palette"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c31ef79f-2a05-41c6-9bad-963d95c51128/","schema_version":"1.0.0"},{"id":"Cool_Addons_Menu","name":"Cool Addons Menu [Before: $2.99, Now: $2.54]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":18495,"archive_hash":"sha256:7df4cf79cda76ee6dda75c26877773126c7ed510aec208b723de88500a6d2adc","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/39899790-5926-4c33-9f62-ff6ff1e741bb/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.54","blender_version_min":"4.2.0","maintainer":"Kito Studio","tags":["blender","menu","ui","addons"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d9969b05-b35a-4e28-be9d-461e99a6c260/","schema_version":"1.0.0"},{"id":"Cool_Magic_Shader","name":"Cool Magic Shader [Before: $3.99, Now: $3.39]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":8831991,"archive_hash":"sha256:4852ac6c2dcea0e7e287f79628438b59fdc87a7c16f696386aae6ee215588d1c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1c7f6c35-ee04-40c1-8189-afe629444eae/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.39","blender_version_min":"4.2.0","maintainer":"Kito Studio","tags":["blender","shader","toon","style","render"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/2ea6e2ac-96c8-4579-b998-7c833227dacd/","schema_version":"1.0.0"},{"id":"cracks_51","name":"\"Cracks\" Damage addon 💥Windows, Linux, Mac approved [Before: $15.50, Now: $13.18]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"5.0.7","type":"add-on","archive_size":6491812,"archive_hash":"sha256:1dca1b11b4450bcc4ba4300ffe9e49a68e9162f3728308aa3f9a72241ba3e6d7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/097e709e-a3c8-4588-b1df-880a19c619d9/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"13.18","blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["Damage","blender4","simulation","geometry","nodes","addon","2025","cracks","crack","modifier"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d303f488-d48d-407b-8615-ebf1a5e0883b/","schema_version":"1.0.0"},{"id":"credit_manager_pro","name":"Credit Manager Pro [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":11780,"archive_hash":"sha256:bd8c24779461eba6babb5089b8d754b79ef3a0cf2c04b5131c4c2ade5adbea9c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/622b813a-5ea9-402c-9fab-25eea64ed096/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Vavrinec Foltan","tags":["Interface","3DView","AssetManagement","credit","manager","license","production","workflow","attribution","pipeline"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/de99702b-347b-4ce9-bc88-4998e9d37916/","schema_version":"1.0.0"},{"id":"cursor_history","name":"Cursor History [Before: $4.00, Now: $3.40]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1880,"archive_hash":"sha256:be9e467bd7b3356bc1235fa8bd1ef798760c5a9d194c620f901ec316e9ead34e","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e17d7a63-a056-4445-8865-70d383d19285/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.40","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Cursor","Bookmark","Navigation","History","Undo","Location","Position","3DView","Tool","Scene"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ed7f83a4-147e-42f7-bc3c-8e6fd0721bc5/","schema_version":"1.0.0"},{"id":"custom_light","name":"Custom Lights V2 [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":948465,"archive_hash":"sha256:5b5d9faca31f17112f493bc2568178f1dec28eed1d3e2fbca6be4d640143f4f0","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d924eaab-9216-439c-8b08-50495bc756f2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Đức Mạnh Huỳnh","tags":["Lighting","product"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8ee2c9f9-4f18-49d7-b5d0-f7b70e8c4e22/","schema_version":"1.0.0"},{"id":"cut_and_wrap","name":"Cut & Wrap (One Click Image To Cutout And Shrinkwrap) [Before: $19.00, Now: $16.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":14282,"archive_hash":"sha256:66848a0091fb86b52516cb5c6ef7d8670998c5d2162957c806ff2c9ffdbd5209","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/27651c4b-223b-4ff1-b731-fd453565c458/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.15","blender_version_min":"4.2.0","maintainer":"Bala Murugan","tags":["blender","addon","image","cutout","imagetocutout","oneclickimagetocutout","cutandwrap","emission","alpha"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/3600d73e-4bb8-4742-888e-4cde99610da0/","schema_version":"1.0.0"},{"id":"daexport","name":"DaeXport | One-click DAE (Collada) export [Before: $10.99, Now: $9.34]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.2","type":"add-on","archive_size":30036,"archive_hash":"sha256:7046dddcfa457e38907929879ebbe20a93b295f56527cf4cc6b78dc4c944c966","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b4d75ca6-fb54-424f-9f79-10fdbd817ad8/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"9.34","blender_version_min":"4.2.0","maintainer":"Arun C","tags":["Baking","GameEngine"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e5652919-6e8c-4d24-aeb5-cf64403e2455/","schema_version":"1.0.0"},{"id":"damtools","name":"damTools [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.6.955","type":"add-on","archive_size":1246131,"archive_hash":"sha256:2da8052b74e032b9b06600a7c2af845c937dc9b9292ed2d2cf92818ca2b7362e","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1984951e-bb76-436b-be20-b610d9f27bf2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"SynrgStudio","tags":["hardsurface","tools","toolkit","suite","modeling"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/924db361-635f-4c0c-a9d9-78e907b0e56b/","schema_version":"1.0.0"},{"id":"decal_creator_pro","name":"Decal Creator Pro - One-Click Decals & Normal Stamps from Mesh [Before: $7.00, Now: $5.95]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":170084,"archive_hash":"sha256:400cfa84c860cbb746cac72d7693f651cc4c6a14d09032076b2ade2a7beb462c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6992b786-cd58-466b-83c5-56c58dfb8417/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.95","blender_version_min":"4.2.0","maintainer":"H3D","tags":["decal","export","meshtoimage","decalcreator","normalmap","oneclick"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e3dcfcad-3efa-468a-9f27-ddf695e12313/","schema_version":"1.0.0"},{"id":"dimensions_and_lines","name":"Dimensions and Lines [Before: $25.00, Now: $21.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.0","type":"add-on","archive_size":87498,"archive_hash":"sha256:5968c651cb56abf54afc8d73352591001bcdbcc4e57bef6e6375f56c77628ad7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f95eb437-643c-4180-8c36-705e5d8c8ffe/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"21.25","blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["dimensions","cad","dimension","lines","draw","drawing","technical","blueprint","paper","print"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a2846c5c-f395-4bfe-aaca-a53cc9ac6400/","schema_version":"1.0.0"},{"id":"dxf_import_export","name":"DXF Import Export [Before: $19.00, Now: $16.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":16203551,"archive_hash":"sha256:fd478752118247bca42a485638370ccb1e259bc7a3a0adb3950c43c7cfbe49cb","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/43bec026-0fa3-4bdf-9ced-1f47d0456330/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.15","blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["3DView","DXF","CAD","Survey","construction","drafting","geodetic","underlay","import","export"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/1a9d77d5-a9a5-4b03-970c-93897884b2bd/","schema_version":"1.0.0"},{"id":"dynamic_lighting_setup_pro","name":"Dynamic Light Setup Pro [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.1.0","type":"add-on","archive_size":12768,"archive_hash":"sha256:c0c6990da08608037f8305dccf3d37f9e1ff8f01c20aab699ba3907a171f59cc","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/fc172129-8e49-4e31-b7dc-e8b022cf3559/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"Anvil Interactive Solutions Anibe","tags":["lighting","3dlighting","lightingpreset","preset","render","renderpreset","dynamiclighting"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/79bb28ab-94b2-450c-88d6-3440587d4946/","schema_version":"1.0.0"},{"id":"esm_sim","name":"Earth-Sun-Moon Simulator [Before: $6.00, Now: $5.10]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"0.8.0","type":"add-on","archive_size":75988305,"archive_hash":"sha256:213ba1a25aeb6e3e4cd54127a73b6cac17ec6bcf64f717f20bb0d69ad993514c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/dce38c48-fc7d-4fa6-9be1-c3e40024b706/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.10","blender_version_min":"4.2.0","maintainer":"Wolfram Kampffmeyer","tags":["Animation","3DView","education","Solareclipse","astronomy","stem","earthorbit","moonorbit","solarsystem","simulator"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a7ebdb0b-8828-41ee-9c4c-5dfb564fc14e/","schema_version":"1.0.0"},{"id":"easy_bake","name":"Easy Bake + Batch Baking [Before: $12.00, Now: $10.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.5.0","type":"add-on","archive_size":23263,"archive_hash":"sha256:6d80600a51aabfd83df414de15917846092dd8fc182ef727a35f702c167ec8ab","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/aa60f6fc-5d15-4a04-b86a-15f1736c250f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.20","blender_version_min":"4.2.0","maintainer":"Milad Kambari","tags":["Render","UV","Bake","Material","Blender3D","TextureBaking","EasyBake","GameDev","PBRWorkflow","3DArtist"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7c379e9e-95f2-4b1e-8eab-90739fd1e70e/","schema_version":"1.0.0"},{"id":"texture_pro_paint","name":"Easy Texture Paint - One-Click UV, Paint Modes & AO Shadows [Before: $14.00, Now: $11.90]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.6.5","type":"add-on","archive_size":4309,"archive_hash":"sha256:e95b13538c5906c23d4b616b6ca757cc7e29e14c6a57827fbc45406c7674d770","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/400c4632-1a26-414d-b4b6-2b78800f58c1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"11.90","blender_version_min":"4.2.0","maintainer":"Junaid Alam","tags":["Paint","Texture","Workflow"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/dc893ce9-b31f-4def-acee-641d73ae8579/","schema_version":"1.0.0"},{"id":"easy_transfer","name":"Easy Transfer [Before: $12.00, Now: $10.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2083,"archive_hash":"sha256:b0b2cc453e1195bb49f617e39b0d21193dc6c597cdcc367fc49424d4e09663a0","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/59cc0c05-510e-431e-9ef9-e637b4832030/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.20","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Transfer","Modifiers","Constraints","Materials","Animation","Mesh","Copy","Synchronize","Attributes","Context"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/3ff54d70-d514-4eea-8d58-062f5318d060/","schema_version":"1.0.0"},{"id":"EC_Light","name":"ECLight - The one click dual and triple lighting solution [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":13668,"archive_hash":"sha256:9f7ecbf98f690f5571627cb80f8794210b6606ed20686f821a21946cc9c25c6f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b8760f19-3e3d-41cb-9522-9a6e005997f2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Abishek Raja","tags":["light","easylighting","Cinematic","Neon","Cyberpunk"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c13e5d41-2380-42a2-806a-1b287dd221cc/","schema_version":"1.0.0"},{"id":"editor_swap","name":"Editor Swap [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.1","type":"add-on","archive_size":18012,"archive_hash":"sha256:7d3157c242859fc7aee71d91adfbf03207020ebf8be4c43f3a001425e088edc6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2ca8e842-6368-4c58-b49b-515ac48b7b22/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"carlosmu","tags":["interface","ui","ux","swap","editors","area","customization","user"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/cf07859b-366d-493c-9128-010b74fcf874/","schema_version":"1.0.0"},{"id":"enable_disable_in_render","name":"Enable / Disable in Render [Before: $8.00, Now: $6.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1464,"archive_hash":"sha256:791964a72a51067d429f9b17bb6287798ba5012e966f7ebb1234f14558fbfcee","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/bc076c54-a76c-41d4-99a1-fe5db4c998dc/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.80","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Collection","Render","Toggle","Objects","Visibility","Keyframe","Scene","Control","Animation","Efficiency"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a993b9b8-37ce-4b99-8371-83f0d161c969/","schema_version":"1.0.0"},{"id":"essentials_addon","name":"Essentials [Before: $12.00, Now: $10.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":42799,"archive_hash":"sha256:9d76e27ff1a5f5b160780a537af067d4661418258e7ef20065e141b259f552d0","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e60ed199-9239-4c4d-8924-b9aa96402314/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.20","blender_version_min":"4.2.0","maintainer":"Jackson Zheng","tags":["essentials","align_camera","auto_highlight","camera_essentials","surface_snap","camera_perspective_reset","drop_snap","gravity_snap","outliner_visibility_sync"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0f34a339-e478-4d6c-b328-9be1daa65f67/","schema_version":"1.0.0"},{"id":"export_each","name":"Export Each - Batch Export Collections / Object with One Click [Before: $3.00, Now: $2.55]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":11265,"archive_hash":"sha256:82912b0d8319c94518a1aaf0b33a779969fecb30bd6f808f379cf190ddb7b4bc","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b1ced0c6-8c51-43a6-886f-3bee2b603f0a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.55","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Pipeline","AssetManagement"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f2dc078b-d6ac-4cb3-a750-4d6c1a834ac9/","schema_version":"1.0.0"},{"id":"ez_studio_pro","name":"EZ Studio Pro [Before: $8.00, Now: $6.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":10860,"archive_hash":"sha256:ed68ce19f9006a39a588d0e35d12004517975916112867b14dde807bfa2b23cf","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/07d6152d-7298-4109-99bd-fc390bcc04da/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.80","blender_version_min":"4.2.0","maintainer":"Abijith S","tags":["Render","Lighting","Optimization","Productivity","studio","camera","blender"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/1c5d0887-7382-4dbd-9ba3-bee0cfd933e3/","schema_version":"1.0.0"},{"id":"eztexture_pro","name":"EZTexture Pro [Before: $3.00, Now: $2.55]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.0.0","type":"add-on","archive_size":3294637,"archive_hash":"sha256:345223ed17af25f05ad21e942476bfd3addb4c382eee83df3f242aa4b48a32b0","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cb57db07-5709-45b4-973b-f661a1f4f080/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.55","blender_version_min":"4.2.0","maintainer":"Abijith S","tags":["Texture","PBR","Material","autouv","shaders","udim","Node","Smart","UV"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/18b6c783-c973-4abc-90f2-5f380e6e86d8/","schema_version":"1.0.0"},{"id":"face_layers","name":"Face Layers v1.5 Add-on [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.5.0","type":"add-on","archive_size":45390,"archive_hash":"sha256:501b57c7dd8cd9549b3d93cce966fbc3effccec925b75e19168274c8bb0ef088","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/481d4b7e-3ffd-4157-a38d-1dc26763a075/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Split Studios","tags":["face","layers","facelayers","mesh","faces","addon","extension","selections","meshfaces","matetials"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8996ef60-23df-44c7-98f0-7161c54ba379/","schema_version":"1.0.0"},{"id":"falcon_cam","name":"Falconcam [Before: $8.98, Now: $7.63]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1022399,"archive_hash":"sha256:5d655a371dba853226c36680e7e9b15f917bb4c2f8e223138cf8c7502911dab1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/594352e2-91bc-4a7c-9e4e-2856ca0b7f37/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.63","blender_version_min":"4.2.0","maintainer":"Liryc Creative Design Studio","tags":["camera","cameraanimation","animation","auto_camera","movie","cameraaddon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/74f64128-e395-4c0a-ad4d-2cf86cdd0eee/","schema_version":"1.0.0"},{"id":"fast_screenshot","name":"Fast Screenshot [Before: $4.00, Now: $3.40]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.8.0","type":"add-on","archive_size":29599,"archive_hash":"sha256:53c1f5ca9ea2f7f7c17a8ab85d9710eef21ca451825f56e06f9055fbaa0b5047","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2c592450-778c-4c2d-b6e0-751782e55a0c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.40","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Fast","Screenshot","quicksc","fastscreenshot","quickcapture","viewportscreenshot"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c9bdda64-41ec-468b-91e2-9bf877284f54/","schema_version":"1.0.0"},{"id":"final_topology_pro","name":"Final Topology for CAD professionals [Before: $99.00, Now: $84.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":646630,"archive_hash":"sha256:e8383b08b908f263d0aae7acda685acf991ceeeb65d65682b9f9bae7147ddd3f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c244bea6-3f65-4951-832d-42a8fb5410a4/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"84.15","blender_version_min":"2.92.0","maintainer":"BlenderKit Community","tags":["System"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/69f95fba-5b1d-48c7-87ad-d8093b24436b/","schema_version":"1.0.0"},{"id":"alexdepario_find_objects","name":"Find Objects [Before: $4.00, Now: $3.40]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2888,"archive_hash":"sha256:2f2384e5a2f3c1f45829c43df6cff9b34d9867f0de677b5f9f1b972f03d62376","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6a896900-e55d-465e-b248-917ae241c673/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.40","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["find","search","object","management","interface","tools"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7cd259e6-5a4c-485d-8095-da2d56c56e79/","schema_version":"1.0.0"},{"id":"fixamo2","name":"FIXAMO 2 - Combine , Loop, Create [Before: $9.00, Now: $7.65]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":5033,"archive_hash":"sha256:1d3192b6ac527e5ee2a86dc7fd938e0e370b786cca2d492cce507a2a437ede5f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0bbe493a-8c37-435f-b14e-1cba86d86c54/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.65","blender_version_min":"4.2.0","maintainer":"Kohdy mcintyre","tags":["Animation","Addon","Bossposes","Tools","New","Mixamo"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0f4fd714-0c97-401f-bcea-bbb42ab9fbdd/","schema_version":"1.0.0"},{"id":"flat_pallete","name":"FlatPallette – Instantly Generate Color Textures for Lowpoly Models with Ease [Before: $4.99, Now: $4.24]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2994,"archive_hash":"sha256:f752b1c38cd58ffa9d90fcb6dd273fe8e42283cef1dd1d0a97ef27404ac95437","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4604c515-8495-4042-940d-d12737b4ad46/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.24","blender_version_min":"4.2.0","maintainer":"isac lima","tags":["lowpoly","flat","color","texture","generator","palette","uv","map","stylized","game"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4d46d04a-0269-4c0c-bb78-6b4abb84903e/","schema_version":"1.0.0"},{"id":"fog_planes","name":"Fog Planes Addon [Before: $35.00, Now: $29.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":198697240,"archive_hash":"sha256:8fa4132df3fd070aa5a3b58a8a0aebca811315a8f0da5a22ff106619780c79bb","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4a0b950e-d206-49f4-b27b-23557df0e3b5/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"29.75","blender_version_min":"4.2.0","maintainer":"Besa Art","tags":["fog","haze","environment","nature","atmosphere","mist","moody"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/2cd70353-b642-43fb-9d1e-0928ecc16a20/","schema_version":"1.0.0"},{"id":"hotkeyboard_azerty","name":"French Keyboard Shortcuts - HotkeyBoard AZERTY [Before: $9.00, Now: $7.65]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":44112,"archive_hash":"sha256:62071024eaa41b615793d482d62813f100c2a2a54271fac6db7891c0f06eca11","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5e2b46f7-a888-40ff-b09b-e93041de9bc0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.65","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Interface","UserInterface","Hotkeys","Keyboard","AZERTY","French"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/105400e9-bac4-46d4-8c08-616dbf54f334/","schema_version":"1.0.0"},{"id":"fz_material_kit","name":"F.Z. Material Kit – Ultimate Material Manager For Blender [Before: $4.99, Now: $4.24]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":13984,"archive_hash":"sha256:349367b0f408b5a467396b054a31e7ccdc6976edbe5d46d3a96d0d2d7b90a517","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e02c091a-cfbb-4237-a73c-59970d965458/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.24","blender_version_min":"4.2.0","maintainer":"F.Z Studio","tags":["Material","Management","Texture","Import","Viewport","Shading","PBR","Workflow","Shader","Tools"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8bb6fcca-2914-468e-9eb9-d7a2ed30628d/","schema_version":"1.0.0"},{"id":"garlandery","name":"Garlandery (Addon) v2.3 | Quick hanging garlands | Connect objects and vertices together [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.3.0","type":"add-on","archive_size":5658312,"archive_hash":"sha256:373a4e01e4a65587a73ad699e43663a1d6ee511947f364f3a4a5042d173f6d60","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4b7aa647-53be-46df-a59b-558d2cacb625/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Dennis Hafemann","tags":["addon","connect","vertices","hanging","garland","wrapping","fir","ivy","fairy","particles"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/acc1fd8e-e8a8-465e-864d-0c6a09c32077/","schema_version":"1.0.0"},{"id":"GLBOptimizer","name":"GLB Optmizer [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"0.0.5","type":"add-on","archive_size":192462,"archive_hash":"sha256:3d43e5fd646576f31643e616c0712c5d227d7ad38a3902df011f1c68fc104748","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cb11a1ea-65a9-4678-a7c2-79ca4f6c8e4e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"L DelMar","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a9c5e7a1-c70f-45a4-8183-d683aa5560e7/","schema_version":"1.0.0"},{"id":"glbxport","name":"glbXport | One-click GLB export [Before: $7.00, Now: $5.95]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.2","type":"add-on","archive_size":29212,"archive_hash":"sha256:1740ab04111b0aeb6289e20e8e2e1d2bc65605640aa6a5df2305e6f5f42f8818","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/eb42426d-21d2-4264-b6d8-e415e01d430a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.95","blender_version_min":"4.2.0","maintainer":"Arun C","tags":["Baking","GameEngine","AR","GLB","Export","Texture","WebAR"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4b653b4f-5424-4cb1-9ed5-0067daafe581/","schema_version":"1.0.0"},{"id":"Greaseliner","name":"Greaseliner [Before: $29.00, Now: $24.65]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":3377084,"archive_hash":"sha256:5f33f69cfe2fc7749e205abd4e84c7f46010d927f32c040763d566f6baa2bd94","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/919ec96c-8f8f-4ac7-8d8e-a7bd4c819c87/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"24.65","blender_version_min":"4.2.0","maintainer":"Kito Studio","tags":["blender","addon","outlines","greasepencil","stylized","toon","anime","blueprint"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/1cc36d5a-82e3-48d4-a195-abc5d9f9549c/","schema_version":"1.0.0"},{"id":"hedge_it","name":"Hedge It! [Before: $7.99, Now: $6.79]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":11478819,"archive_hash":"sha256:e0c9a2a1686e7af794326772826984fc49997f9118bef2ad29df7fd58e804004","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/054f346f-e681-41e9-b85f-890addaa26b0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.79","blender_version_min":"4.2.0","maintainer":"Blender Bits","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/1c3016b4-f975-48c2-b6b7-a28d3a5d20d2/","schema_version":"1.0.0"},{"id":"hidden_objects","name":"Hidden Object Manager [Before: $4.99, Now: $4.24]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.5","type":"add-on","archive_size":4247,"archive_hash":"sha256:13a22d85fcf61dee646bd011d7a99878667070cdb7b9e8137ad70eed2c9c3fa3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/bb0682cc-5b60-469d-af99-9f523ec7fa7b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.24","blender_version_min":"4.2.0","maintainer":"Doctor Legion","tags":["3DView","Hidden","Object","Viewport","Animation","Tools","Addons","2026","Cheap","Functional"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/633e1b7f-01a9-41ff-93f3-573ea6a82469/","schema_version":"1.0.0"},{"id":"hollow_object","name":"Hollow Object Creator – Blender Add-on for Easy Hollowing & Cutouts [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":3256,"archive_hash":"sha256:a5f443eae0fbcea81787b8237618c0a73b6e8678578c8a81ac4fc9d0b4b30e5c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ec6d3d81-7764-4fac-bf67-4f369f69caab/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Studio156","tags":["3d_modeling","3d_printing","boolean_operations","cutout","game_development","mesh_editing","procedural_modeling","quick_modeling","hollow_object","tools"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/1c3970c0-c0b0-41ca-9fb3-b27e2f3a3421/","schema_version":"1.0.0"},{"id":"hotkeyboard","name":"HotkeyBoard - All Blender Keyboard Shortcut Overlay [Before: $9.00, Now: $7.65]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":50182,"archive_hash":"sha256:a9b6ccf44294677f275adb4b504e9f562b1bf17eeb2fca48a799967ce6685ffe","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b30f43a6-2a9b-405c-b029-e6e46180005d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.65","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Interface","UserInterface","KeyboardShortcuts","Visualization","LearningTool","Education","Productivity","3DView"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7e838867-0ce1-4f38-9081-037c097fc723/","schema_version":"1.0.0"},{"id":"hud_and_ui_elements","name":"HUD & UI Elements [Before: $18.98, Now: $16.13]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.16.3","type":"add-on","archive_size":3051899,"archive_hash":"sha256:7d90d21dafc27b2f93dc2b410fdf684d3312fdc0f2c102679d35facc71b9cb78","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ef04cbc3-fcee-43ba-b0bf-26fa21f48343/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.13","blender_version_min":"4.2.0","maintainer":"N. Emmanuel","tags":["huduielements","hud","ui","fui","motion","design","Animation","Modeling","Mesh","AddMesh"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e01a622f-9495-4e9b-81f3-cba574349e1e/","schema_version":"1.0.0"},{"id":"ideagen","name":"Idea Gen [Before: $3.99, Now: $3.39]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.6.0","type":"add-on","archive_size":7498,"archive_hash":"sha256:195787a0aeb3237fa8ca14a73aded6c12d329b3f8c88318b7b2ba458209d8048","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/8fe664e7-6966-4eaa-a6ca-eecc375b4a44/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.39","blender_version_min":"4.2.0","maintainer":"Ace Of 3D","tags":["ideagen","idea","generation","creative","concept","art","random","ideas","concepts"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/6b03f814-3bb0-4442-80b2-f50e24e7e116/","schema_version":"1.0.0"},{"id":"imago_gif","name":"Imago Gif | Render And Import Gif Animations [Before: $8.00, Now: $6.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":78889498,"archive_hash":"sha256:bfdd9d71934e2fe77fe67245976ddf895aaee05f7618db9c0ef952486180cf48","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/53737df1-9a6c-4cc4-b628-4f06961ec2c3/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.80","blender_version_min":"4.2.0","maintainer":"Giambattista Von Nettesheim","tags":["gif","animation","blender","addon","rendering"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/655a3cfa-ee24-432a-a34a-d2c1859d19b0/","schema_version":"1.0.0"},{"id":"Inkto3D","name":"Inkto3D [Before: $4.99, Now: $4.24]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":45977,"archive_hash":"sha256:9fb32c34e0feacebccc2c15e41c5017f387a0cd0f80580a256c44c9d87c5e999","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/77d83ed2-9085-4e3d-b626-8b01717eaf36/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.24","blender_version_min":"4.2.0","maintainer":"F.Z Studio","tags":["image","trace","imagetrace","imagetomesh","mesh"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9ad75f77-de59-42f1-b371-f81a02e61fa7/","schema_version":"1.0.0"},{"id":"instantclean","name":"Instant Clean - The Ultimate Mesh Clean [Before: $9.99, Now: $8.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.2.3","type":"add-on","archive_size":125029,"archive_hash":"sha256:0ee941a43e27b95d0ae41d9f179c7b00bcf497c125392ef604e27bfd752c9d93","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ce53098e-071c-45de-849a-57938317534b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.49","blender_version_min":"4.2.0","maintainer":"Ruben Messerschmidt","tags":["mesh_clean","mesh","clean","print","manifold","cleanup"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/44c1aeac-bf6d-4c0a-a575-54b0466f25a2/","schema_version":"1.0.0"},{"id":"jigglegen","name":"JiggleGen [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.5","type":"add-on","archive_size":28952230,"archive_hash":"sha256:300b3ba9f8e40ef93c7e0a4b4d15e26589ba566eabfd2914ff8b2f183b84f7b5","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cbdf07dd-1b8f-4ee7-bf67-b01dc686d599/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"pathnode","tags":["simulation","cloth","cage","generator","animation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/57d51658-1be8-4e1e-8210-e0b75c2a7341/","schema_version":"1.0.0"},{"id":"keyframe_decimator","name":"Keyframe Decimator [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.0","type":"add-on","archive_size":16236,"archive_hash":"sha256:4ffbd48b6c3d12da59f8a329c2dd8c3e4d8fe8ce256ef08a30ab8b8dbb8ab345","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5a8c67cc-c352-42ab-ae00-21a3cf9b8d6b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"RUIDO VFX","tags":["Animation","Decimator","VFX","Keyframe","addon","optimize"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/06cd9d46-6fc4-4bce-8a9a-9755b71f96dc/","schema_version":"1.0.0"},{"id":"knife_circle","name":"Knife Circle [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":36340,"archive_hash":"sha256:57ae3b0b9dbee06ac3ecbbd630beb3065e95862f0f4d5966176aad01895d0f38","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/075476a8-e82e-4ff2-b459-3b1e772091cc/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["knife","knife_circle","knife_cut","knife_project","knife_tool","knife_polygon","knife_circular","knife_cut_through"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/71398fc7-49e8-4e42-b533-6c9941132c48/","schema_version":"1.0.0"},{"id":"landxml_import_export","name":"LandXML Import Export [Before: $16.00, Now: $13.60]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.2","type":"add-on","archive_size":21438,"archive_hash":"sha256:e498afbddd68d78eb73b0b4cbf95ab07db05d99d15f3f78daa81600fabf144bd","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9b338025-8d27-447d-aa3b-25acc6673e25/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"13.60","blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["Survey","CAD","coordinates","landxml","tin","breaklines","construction","geodesy","import","export"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/39505adc-0694-4efe-a77f-d982d53bfb5e/","schema_version":"1.0.0"},{"id":"letter_board_text_creator","name":"Letter board - Text creator [Before: $7.50, Now: $6.38]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":562941,"archive_hash":"sha256:8c12f39662866981da9dc9ec4b06b2e680ec069a62ba71f112d365a259838a59","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ea92700e-9cfb-4d6b-be72-e877ecab286e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.38","blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["Blender","text","letter","thumbnail","mesh","object","preset"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/22cc8f57-c605-4a4e-b537-6967e56d908f/","schema_version":"1.0.0"},{"id":"lightforge","name":"LightForge - Professional Studio Lighting System [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.4.22","type":"add-on","archive_size":22743109,"archive_hash":"sha256:f8aff9c92a1a5e06f06b57afd968f233c7302c95c6badf6df3ac581edb0c1faf","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/35e39639-e571-4466-9ae6-31e3d75519e1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"John Cheluva","tags":["Light","Lighting","Addon","Studio","Productvisualization","Reflector","Gobo","HDRI","Photography"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9ecb49b0-9be7-4b4c-8fd8-901bf7c8e655/","schema_version":"1.0.0"},{"id":"skava_lod_generator_pro","name":"LOD Generator Pro - Ultimate Edition [Before: $9.99, Now: $8.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.2.6","type":"add-on","archive_size":29745,"archive_hash":"sha256:6610b853ed8672ec051da8fa260e7e37a278bc735d0b71253353999ba0f3d15d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/29150841-e2a1-4e75-a75b-1e55e830da07/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.49","blender_version_min":"4.2.0","maintainer":"SKAVA Piatkov","tags":["automation","decimation","godot","lod","performance","unreal","unity"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d87d6532-edea-4ee0-a90a-37bf7390f8b1/","schema_version":"1.0.0"},{"id":"lottie_addon","name":"Lottie Animation Addon [Before: $30.00, Now: $25.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":68472,"archive_hash":"sha256:7a61a0f782303f92384b3076efa073b4f03e2464569b943afb70a4882a7f3c45","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f3a67bc6-2d77-4a59-97a1-8e17e0f413cd/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"25.50","blender_version_min":"4.2.0","maintainer":"Nicolai Prodromov","tags":["lottie","web","animation","json","webdesign"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5ef0c83b-ba4f-4ab2-8946-bb7a665a72b9/","schema_version":"1.0.0"},{"id":"magic_coordinate_extension","name":"Magic Coordinate Add-on: Dynamic Mapping For Blender [Before: $19.90, Now: $16.92]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.0","type":"add-on","archive_size":134264,"archive_hash":"sha256:5993304df2b155c02d92eced383dff07dd63bb70e98976f1cbffd5045b4faf8d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4a4e22c9-f361-410b-ada4-e446540e11cf/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.92","blender_version_min":"4.2.0","maintainer":"Cosmo Mídias","tags":["shader","geometry","nodes","addon","dynamic","mapping","coordinate","system"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/10dee0e3-fbd3-4041-abce-0db1a39ab84c/","schema_version":"1.0.0"},{"id":"mass_renamer_pro","name":"Mass Renamer Pro [Before: $6.00, Now: $5.10]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":7584,"archive_hash":"sha256:07fd66208c0c388f9923f42b5832915dae0591b2891eb914f4fb47e705ebd981","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/fe5d41d6-d858-4967-8ad2-c4f5cbad1516/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.10","blender_version_min":"4.2.0","maintainer":"Vaishakh Vinod","tags":["Object","Scene","Workflow","Pipeline","Animation","Rigging","rename"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/985de1bd-37f2-4e13-9fc2-d41c3521bd44/","schema_version":"1.0.0"},{"id":"matcaps_forever","name":"MATCAPS FOREVER [Before: $9.99, Now: $8.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":4801,"archive_hash":"sha256:ab2c85d1afff16262e29102956fa13f0e63e25c1500fa82428e665497896e2b7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d2ac0f17-417c-4259-8d3f-8d234f3af4b1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.49","blender_version_min":"4.2.0","maintainer":"Take Refuge TV","tags":["matcap","takerefuge3d","matcapsforever","matcapgenerator","material","sculpting","hardsurface"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5e190400-1471-4118-99ea-079be8ee661f/","schema_version":"1.0.0"},{"id":"material_overrider_plus","name":"Material Overrider + [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":3357,"archive_hash":"sha256:e2d67029d11cce5015292769e3e51198c442b955e0d127c0c4d74714ea1e4f30","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6cac86f1-2bc6-4f5f-92d9-488dd33c7a17/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Brahim Houari","tags":["override","materialoverride","overrider"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/41e0e1c8-7940-4ebe-9ed5-67a9144c7365/","schema_version":"1.0.0"},{"id":"materialpicker","name":"Material Picker - Select And Browse Materials [Before: $7.99, Now: $6.79]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.2","type":"add-on","archive_size":339989,"archive_hash":"sha256:ed9347567f8cf94a3ac11d725ba55f232bf95ee81d3c3024e69717b332073b75","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/48fd443d-0962-449f-af6e-92136980b911/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.79","blender_version_min":"4.2.0","maintainer":"Ruben Messerschmidt","tags":["material","select","picker","shader","browser","material_picker","material_select","material_browser"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4d77e53b-6311-4996-a7e3-b88eda756ccb/","schema_version":"1.0.0"},{"id":"material_swap","name":"Material Swap [Before: $3.00, Now: $2.55]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":3814,"archive_hash":"sha256:0ffd38163d6d70c4d9fbbc3d36e20198feb94c1f714472fc8f6854efdacfddb1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/521e106c-fcb1-4f8c-94ab-292cb63c1715/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.55","blender_version_min":"4.2.0","maintainer":"Jeslin Paul","tags":["material","addon","blender","render","replace","find","find_material","replace_material","default","cube"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/152cd534-c743-4ea4-b1e0-5c514c1d82ae/","schema_version":"1.0.0"},{"id":"material_tools","name":"Material Tools [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.3","type":"add-on","archive_size":11376,"archive_hash":"sha256:866db1a3dac81c24001d92f72e3b93ccc15b5046d884e9cf061ca159106ba813","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4b74121f-2fe0-4cc7-ad89-41a94ec6e04a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Mutanzom3D","tags":["material","materials","textures","texture","shader","model","object","uv","unwrap"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/18d3ae0c-f509-42a3-81e4-0c4ee5b68be7/","schema_version":"1.0.0"},{"id":"matrix_pro","name":"Matrix (PRO) - Design and Animations [Before: $22.00, Now: $18.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":926239,"archive_hash":"sha256:39113a92d620c5a9ad82b6cbb24fc5697dfba4c3ba27ec8c19c494e457533916","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/36a3c739-2262-4ce2-8114-809a71ebbe49/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"18.70","blender_version_min":"4.2.0","maintainer":"4DView","tags":["4DView","Blender","Addon","Design","Animations","Geometry","Nodes","Matrix","Transformation","Transformations"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/657d0c52-d787-42e5-9151-263dfddb2e0c/","schema_version":"1.0.0"},{"id":"matrix_ultimate","name":"Matrix (ULTIMATE) - Design and Animations [Before: $37.00, Now: $31.45]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2604916,"archive_hash":"sha256:f3b563325e1ac70edc9f632110771fddacc6aaf5b414e107359850a4bf0430a1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d10e480b-172c-4361-985f-378f2a38a762/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"31.45","blender_version_min":"4.2.0","maintainer":"4DView","tags":["4DView","Blender","Addon","Design","Animations","Geometry","Nodes","Matrix","Transformation","Transformations"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/81704036-143d-48a5-baca-bd4906793518/","schema_version":"1.0.0"},{"id":"meeting_room","name":"Meeting Room [Before: $12.00, Now: $10.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.3.7","type":"add-on","archive_size":227745137,"archive_hash":"sha256:af2f30607909bdebabb46371a0407b1dcccf5f73add016d87ccb9f1da9d59b32","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/fc1c89a7-94dd-4de9-bc74-2dfff72b3452/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.20","blender_version_min":"4.2.0","maintainer":"Adham Abou Assali","tags":["meeting","Room","offices","Office","TV","Interior","Chairs","HQ","Render","Design"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/36a66e0e-2bff-4464-b21e-2f47031f9371/","schema_version":"1.0.0"},{"id":"megascans_bridge","name":"Megascans Bridge v2 [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.4.0","type":"add-on","archive_size":217644,"archive_hash":"sha256:95e279244505ba2f335f42205dad6cd6770701f7b6c9619d9bc9d1a10d29bf7c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/78b13f8d-d0f4-45dc-832d-484647531d68/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["megascans","megascans_bridge","megascans_assets","megascans_plants","megascans_textures","megascans_materials"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0a231655-c32c-4025-a718-582af4e25c5a/","schema_version":"1.0.0"},{"id":"blenquick_mocap_lite","name":"Mocap Lite [Before: $10.50, Now: $8.92]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.2","type":"add-on","archive_size":286685938,"archive_hash":"sha256:9b135b4ba00df40e4f246c00a9e7e93a6f29310a855551e817c926757aae8f2e","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/58e33fc4-123a-4987-9ac7-a0c250f0b485/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.92","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["mocap","motioncapture","face","capture","motion","lite","basic","animation","3d"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/851c73c9-c226-4f1e-a4fd-d10eb0bdcae1/","schema_version":"1.0.0"},{"id":"blenquick_mocap_pro","name":"Mocap Pro [Before: $24.50, Now: $20.82]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.9","type":"add-on","archive_size":287493488,"archive_hash":"sha256:a74d3cd49462f5c66da75a6527b79c96d80d24d093c5734b3ac693d72911f2d9","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/99143d48-b834-48fe-9f69-7bc7f7f791c2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"20.82","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["advanced","mapping","mocap","retargeting","rig","live","face","capture","motion"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9835f003-6228-44f9-bc3e-6cf56faf6bd0/","schema_version":"1.0.0"},{"id":"modifiers_toolbox","name":"Modifiers Toolbox [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.2","type":"add-on","archive_size":16067,"archive_hash":"sha256:ccf1b84a9617e8d52b84659ff9c74f8499d636586f9cda4924ca421f0a3537ed","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/293ca6b0-3409-42eb-8605-80fb5d6e13d0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"carlosmu","tags":["toolbox","modifiers","favourites","user","ui","ux","quick"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/bb41223a-2351-4356-b130-02e453e506af/","schema_version":"1.0.0"},{"id":"modstack","name":"ModStack - Save & Reuse Modifier Presets In One Click [Before: $9.99, Now: $8.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":92368,"archive_hash":"sha256:4c10ee77ba44e0fb663fbf160c590eb9d930f10f50e02518781bddada90b3356","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/480f33f4-d8b5-4f6e-9875-0dd4ddb8de88/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.49","blender_version_min":"4.2.0","maintainer":"Ruben Messerschmidt","tags":["3DView","Modeling","Modifiers","Presets","Hardsurface","Nondestructive"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8f6686ab-238a-4a6e-8c33-1d0cf3ad96bf/","schema_version":"1.0.0"},{"id":"modular_suburban_house_creator","name":"Modular Suburban House Creator [Before: $9.99, Now: $8.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1100698310,"archive_hash":"sha256:1ee9250c031f1b4333afa6ad3882ccb08f352bb8bd61826fbed32093f76ebb12","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d32c24fc-51b3-4fc6-acd5-639d05a48ada/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.49","blender_version_min":"4.2.0","maintainer":"FANNΞC","tags":["modular","kitbash","suburban","architecture","interior","exterior","generator","game","modeling","efficient"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5faf55ff-acc1-484e-9a2e-943899b5b1f2/","schema_version":"1.0.0"},{"id":"morphplus","name":"Morph+ Professional Animation presets [Before: $22.00, Now: $18.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1617645,"archive_hash":"sha256:9e8f0487fb6d1df9beee2a0e987d36e5d264a55c776ff74897bf0e146a709097","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b3e1021f-5bde-4878-bac0-30f118227b7a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"18.70","blender_version_min":"4.2.0","maintainer":"A. Elbamby","tags":["morph","reveal","effects","presets","animation","geometrynodes","product","particles","motion","graphics"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/aad33ffc-2016-4aa1-b895-b1a9257130a0/","schema_version":"1.0.0"},{"id":"motionpro","name":"MotionPro [Before: $19.99, Now: $16.99]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.1.0","type":"add-on","archive_size":325988,"archive_hash":"sha256:1d85fca4bdcb5cf8b3f4198d5cecb0fe454a0c36b3b1c1613cb006d1892dbe21","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/829fd8b3-03c0-4469-9f66-20e3b2ed35ad/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.99","blender_version_min":"4.2.0","maintainer":"A. Elbamby","tags":["3darchitect","interior","exterior","animation","architecture","geometrynodes","motiongraphics","archviz","curves","lowpoly"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/72e4a44b-9cd4-4cec-b6f2-047b94c8d5b9/","schema_version":"1.0.0"},{"id":"MRAX","name":"MRAX – Real-Time Overlapping Vertices Fixer for Blender [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":3056,"archive_hash":"sha256:afa36cab047702f58a04708ae2529774106f2b0323de434aa126070b7e82af80","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/13a3df5b-f654-46fe-add9-0e133c54832f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"MR XD","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9fc4b6cc-3948-4e99-9efb-e789757eec5e/","schema_version":"1.0.0"},{"id":"multi_blend_file_merger","name":"Multi Blend File Merger - Merge Multiple blend Files in Seconds [Before: $2.99, Now: $2.54]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":20029,"archive_hash":"sha256:422408ca88216e626bcf0aa425de73ddcb0b34f5da08afc29464406724f20a1d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ec55cd5e-b682-4de6-9fcc-3059b161fb5f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.54","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Pipeline","Scene","importexport","murge","multi","blend"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/21b72c0a-b02d-4a8f-8aa9-3ada5908538f/","schema_version":"1.0.0"},{"id":"multixport_pro","name":"MultiXport Pro [Before: $14.99, Now: $12.74]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":30134,"archive_hash":"sha256:c9a47b80240933e964cb542724e119d7ba371083048bbacf74f72df8535e8571","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/33aad9fb-3784-4116-bded-111e3aab1514/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.74","blender_version_min":"4.2.0","maintainer":"IZ. MdVerz","tags":["Export","Batch","Workflow","Pipeline","FBX","glb","usdz","stl","settings","textures"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/566f5c6c-5985-4746-8f0d-f5fbf256011c/","schema_version":"1.0.0"},{"id":"mutamesh","name":"Mutamesh | 4 Remeshers In One | Instant Meshes, Quadwild, Cwf, Adaptropic [Before: $27.00, Now: $22.95]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":68973021,"archive_hash":"sha256:f369fa140b2ea84fd6b4c6a42ba099f044e7169c819f82fbd59327bf79274097","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/85e371f6-ebbc-424f-9c7b-d2926e50ca3a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"22.95","blender_version_min":"4.2.0","maintainer":"Giambattista Von Nettesheim","tags":["Mesh","Object","Modeling","Sculpt","import","export","remesh","retopology","remeshing","mesh"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d4ca1fc2-a0e8-4ccf-bc6e-076b26d09e7b/","schema_version":"1.0.0"},{"id":"ngone_pro","name":"N-Gone Pro [Before: $12.99, Now: $11.04]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.5.0","type":"add-on","archive_size":21732,"archive_hash":"sha256:7a52568df96c5ee3f424333dad15d6de143868fa544a5de3adf9d6848b09f54c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/435de251-fed3-4859-9da2-0faa4da162b0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"11.04","blender_version_min":"4.2.0","maintainer":"Take Refuge TV","tags":["ngon","optimize","texturing","cad","ngonepro","takerefuge3d","remesh","retopo"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/2511bcbd-0752-4bf2-99d1-01c258f0a4ae/","schema_version":"1.0.0"},{"id":"nodeflow_3_pro","name":"NodeFlow 3 Pro [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.2","type":"add-on","archive_size":64311,"archive_hash":"sha256:d13c9fcbb9e5ac7547c4eb6c1fda5922171daf6870898830adb2a6dad931b20b","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1154d0c0-ccbd-4cd0-8e11-bd1cfccf2e82/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"kanwei sun","tags":["Node","Tools","Workflow","Editor"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8804d2f3-775e-4d39-9f86-a38aa0f95062/","schema_version":"1.0.0"},{"id":"n_panel_navigator","name":"N-panel Navigator [Before: $8.00, Now: $6.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":27286,"archive_hash":"sha256:1800311d9beb2ad4993fa0be51f8216209b20e25c41251a3afe5b1ea8d545569","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ec7b8acc-3471-4df2-ab46-11b58e4be944/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.80","blender_version_min":"4.2.0","maintainer":"belaid ziane","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/72bab743-cb6a-4b75-9d9b-433088728648/","schema_version":"1.0.0"},{"id":"null_game_toolkit","name":"Null Game Toolkit [Before: $32.00, Now: $27.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":28327,"archive_hash":"sha256:519f5dc600ae12492c11bb1a4f8f6d6b90dea42d3d63ad8dfe552e3d4001c9de","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a30bd99b-bd6f-4741-b40f-da8c27dd1656/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"27.20","blender_version_min":"4.2.0","maintainer":"Null Station","tags":["LOD","COLLISION","GENERATOR","EMPTY","NULL","GameToolkit","Game","Assets","Unity","Unreal"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/96b340d7-9c98-4933-8f65-06a676918b1d/","schema_version":"1.0.0"},{"id":"nview","name":"nView [Before: $22.98, Now: $19.53]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.7.0","type":"add-on","archive_size":76727,"archive_hash":"sha256:969eb684b871e4c1af888f818373056c191d00c587370f65e57e57c2dc2c14a3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5deca250-9ea2-4c1c-a49d-1f285dd90f01/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"19.53","blender_version_min":"4.2.0","maintainer":"Spencer Magnusson","tags":["viewport","optimization","object","visibility","performance"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/84286079-1e61-4d2a-a2a1-346733a4df7c/","schema_version":"1.0.0"},{"id":"object_bender","name":"Object Bender [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":74608,"archive_hash":"sha256:154d6d78fe2620b60cc25ebe87054defc72f7eb76c3cad58d86cf4ae6dad2b16","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e109f34e-538e-41c2-928d-40235da450dd/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"belaid ziane","tags":["Bendshape","bender","bend","curve"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/99f1d28a-613d-407f-9078-5231ef79aca7/","schema_version":"1.0.0"},{"id":"object_disperse","name":"Object Disperser [Before: $2.00, Now: $1.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2739,"archive_hash":"sha256:d9b10d648c575ee0b17ee027f20296051e975e2f498673d6a8b16ca697e6de7c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9e53aaad-4490-4f1a-b2be-5b1c42cc3672/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Disperse","Objects","Animation","Instances","Randomize","Rotation","Scale","Effects","Simulation","Dispersion"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/6d31366b-b8a5-4f4e-adf9-667a368a5d26/","schema_version":"1.0.0"},{"id":"objxport","name":"ObjXport | One-Click OBJ Export [Before: $7.00, Now: $5.95]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":9257,"archive_hash":"sha256:932e313907fed8ebe4f7359a41f4e3e0f95745bbd86b1dc049e821cb4083c559","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5f3c0b17-9ba5-4254-96c2-e471011fafb3/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.95","blender_version_min":"4.2.0","maintainer":"Arun C","tags":["obj","export","bake"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/86d262dd-e721-4e42-a024-1e0850e0ddfd/","schema_version":"1.0.0"},{"id":"ocp_studio_v5","name":"OCP The One Click Proxy\" [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"5.0.0","type":"add-on","archive_size":46749971,"archive_hash":"sha256:44bbf8936bbcf524aeacdc5567cb68f6fb98b8e814d5e7d7859c48a470ead90a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ecc13bfc-1e7c-4f24-b97b-122018986710/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["blender","instance","proxy","proxies","speed","fast","prevent","crashes","optimize","viewport"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8aa9dbac-071f-4470-983a-1aee7e67da28/","schema_version":"1.0.0"},{"id":"ocr_image_extraction","name":"OCR Image extraction tool [Before: $3.99, Now: $3.39]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":11397,"archive_hash":"sha256:e6e72c938979613a4a794b2284a75bb0ef8f90f35d07e42c5c8593f9a94ca366","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/056e434b-6a8b-410b-a793-879bde57ddc6/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.39","blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["OCRImageextraction"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/fb621728-6650-4c85-a1a2-e99cbb9267f1/","schema_version":"1.0.0"},{"id":"o_explosion_pro","name":"O'Explosion [Before: $4.00, Now: $3.40]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.4.0","type":"add-on","archive_size":5231,"archive_hash":"sha256:4173b4cdf0ec617585b4f2ad40eac2917293298a27dc016a7c63ba9b6de82ca2","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5e6d29d3-fefd-46a9-9fd9-3db3cee60b55/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.40","blender_version_min":"4.2.0","maintainer":"Yaroslav Okhranchuk","tags":["Animation","Object"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/cbb8e5f5-8642-4e01-a78d-d128904679fd/","schema_version":"1.0.0"},{"id":"oneatlas","name":"OneAtlas | One-Click Texture Atlas Automation [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.2.3","type":"add-on","archive_size":20453,"archive_hash":"sha256:14197ff44de0374d1709be60d844a69cdcac1ef00679d4ae5a9c01f8fc8705d4","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6ca0805c-4a63-44fc-85db-dd7beb1e7d81/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Arun C","tags":["texture","atlas","packing","atlas","baking","pbr","baking","texture","playcanvas","export"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b1e8f5c6-2ca2-4473-88c7-477e06e24ca1/","schema_version":"1.0.0"},{"id":"one_click_age","name":"One Click Age - Instantly Age any Material with a Click [Before: $18.00, Now: $15.30]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.2","type":"add-on","archive_size":224274155,"archive_hash":"sha256:202feaec961debe8852a37397bd4f171cc93b9b7c811cead6e792b89f9a4c759","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/378eaa35-24db-49b7-8142-4e44fbd857d5/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"15.30","blender_version_min":"4.2.0","maintainer":"CG Galaxy","tags":["damage","dirt","dust","edgewear","fingerprints","generators","grunge","oneclickage","realism","surfaceimperfection"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0f5981bd-3ab2-4029-970f-11e75862f2d6/","schema_version":"1.0.0"},{"id":"oneclick_multicam_renderer","name":"OneClick Multi-Camera Render [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.2.0","type":"add-on","archive_size":17131,"archive_hash":"sha256:2522018ef3f2d98e91300c6793f57fb9fe8faea6034be2076bb364a621902c1d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d2ac3991-4417-45f9-9172-615d0568bb46/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Arun C","tags":["blender","camera","render","batch","render","multi","camera","product","render","automation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/31b436e2-7cca-442c-aeee-6f7004275252/","schema_version":"1.0.0"},{"id":"on_the_rocks","name":"On The Rocks (Addon) v1.7.0 | Formations, Bricks, Walls, Walkpaths, Damages, Landscapes, Crysrals, Creations [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.7.0","type":"add-on","archive_size":17635288,"archive_hash":"sha256:22bd48bd5b54bc8b9c1d5be2a97e840667d3ad7ddf724cf0e0ccabcc82000233","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ae2ee1ff-d9ee-47c5-bb92-dbb63e8218ad/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Dennis Hafemann","tags":["addon","rocks","bricks","walls","formation","damage","fracture","landscape","creation","walkpaths"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/68f5fbef-c50c-46c4-a1d2-9ab7d0a26eb1/","schema_version":"1.0.0"},{"id":"open_video_tracker","name":"Open Video Tracker [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"0.2.0","type":"add-on","archive_size":318904565,"archive_hash":"sha256:9207d2b84a10bc3bf33d477424b3d863ae8c4b63d1de89a2f64b8d0cc1fcaa6c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3bd7f89d-10c2-4cce-8a10-440d7fe76faa/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Haseeb Ahmed","tags":["2d","video","tracker","3d","tracking"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ce5306f7-c957-49cd-9e9e-5edcfc47f67d/","schema_version":"1.0.0"},{"id":"orbit360","name":"Orbit360 - One Click Turnaround Animation Export from Viewport [Before: $4.90, Now: $4.16]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.1","type":"add-on","archive_size":15593,"archive_hash":"sha256:281998905bd7fc71b8993a71fa64ffd28394f999a146d0f4f4c24db02e81b13a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/30124300-8ab9-429a-a894-1b532ebf0335/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.16","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Render","Animation","3DView"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d127bdac-1c13-402f-bc58-c955b150004a/","schema_version":"1.0.0"},{"id":"alt_tab_Organix","name":"OrganiX [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":510578,"archive_hash":"sha256:ff24edd79a427cca1f6439c4edbdc950e6acd25b7555d8acf254986fd70085e3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/505441c7-c011-4766-bdaf-ea4730a18d89/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","organix","shapes","modeling","organic","procedural"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b8fd2cd7-0ffb-4576-a64c-d5ba20c10231/","schema_version":"1.0.0"},{"id":"origin_tool","name":"Origin tool [Before: $1.00, Now: $0.85]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1963,"archive_hash":"sha256:ed7ae5e3669860275c5e8477a4e545f39efb15cbe49679994c199b86f8e4c4e6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3773c6ee-5e17-4070-9c0a-bd98af853589/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.85","blender_version_min":"4.2.0","maintainer":"Kornél Kuloványi","tags":["origin","center","bottom","simple","usefull","oneclick","click","asset"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/2e667794-921f-4d6d-82d7-9b2298b69fa4/","schema_version":"1.0.0"},{"id":"output_fix","name":"Output Fix [Before: $3.50, Now: $2.98]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":2056,"archive_hash":"sha256:412d83a0176f31a6d328ecab304d75d38c91eb6aacd163277301bbd0028b76d4","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3d22c368-ccc8-4609-8cc2-a0a23b03edd1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.98","blender_version_min":"4.2.0","maintainer":"AHMED KETTUR","tags":["render","output","folder","directory","automation","rendering","organization","settings","management","file"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/3f2afda8-dce0-4fa3-9aad-44cad17c2043/","schema_version":"1.0.0"},{"id":"tobip_particles_catalog","name":"Particles addon [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":47741747,"archive_hash":"sha256:502c9f726ea418185363df9c3d0947fff2639ca7331895cbbaec3de79cf2a91a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d9e837a8-a78d-433e-bcd6-aa0f8690787e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Suzanne studio","tags":["particles","birds","fish","fly","embers","particle","dust","simulation","butterfly","leaves"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/693ffd00-e10e-4f18-8419-ba55fe48ff07/","schema_version":"1.0.0"},{"id":"perforated_panel","name":"Perforated Panel [Before: $1.00, Now: $0.85]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.0","type":"add-on","archive_size":844690,"archive_hash":"sha256:5e86344238ef6499fc3e0fdc58d591c46f746eb477622e2a34ae46024edfe900","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/49901d46-9785-4550-a0b9-45c81c8b7e06/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.85","blender_version_min":"4.2.0","maintainer":"Abbos Mirzaev","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7b1c87c0-04c4-4272-977e-17ea92ee85b5/","schema_version":"1.0.0"},{"id":"physicsgen","name":"Physics Gen [Before: $4.99, Now: $4.24]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.5.0","type":"add-on","archive_size":4354,"archive_hash":"sha256:8f6a1c5c5c4eec0e0893e94ec9230e2dd78f87e3e2f985da3586c50cdf2aa0d5","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/42bd71ee-5073-4e8c-970f-659b5330a3d4/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.24","blender_version_min":"4.2.0","maintainer":"Ace Of 3D","tags":["easy","fluid","particle","quick","simulation","physics","smoke","generation","sims","animation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/dfe61d32-24aa-4b8d-8bbb-6863cfbe628a/","schema_version":"1.0.0"},{"id":"wk_tools","name":"PickUp Tools [Before: $16.00, Now: $13.60]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.7.0","type":"add-on","archive_size":149362,"archive_hash":"sha256:cfbd5b940ae8191ce873be6d2b813c3bf940521891e33ee82ed75665ffd2ba84","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/16c27c35-8e05-4652-89ee-bd3c7d68d45f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"13.60","blender_version_min":"4.2.0","maintainer":"Wolfram Kampffmeyer","tags":["Animation","Constraints","pickup","walkcycle","foot_sliding","keyframe_tools","pick_up","pin_tool","pickup_objects","stepped_interpolation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/833124e5-42e2-43eb-abcc-d0369083cc72/","schema_version":"1.0.0"},{"id":"pixelator_maker","name":"Pixelator Maker [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.0.0","type":"add-on","archive_size":21168,"archive_hash":"sha256:e140cc12a36bda67d704adb6f7ca250f111630313f356995127313910aa3b0f9","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/8447c058-23b1-4f40-aa04-9e772e8bfa6f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"RUIDO VFX","tags":["NPR","Pixel","Retro","Stylize","Texture","Game","Art","Shader","Node","Blender"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/12da713a-b0be-496b-a8e3-46477249e30e/","schema_version":"1.0.0"},{"id":"playblast","name":"Playblast [Before: $7.50, Now: $6.38]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.2","type":"add-on","archive_size":19161,"archive_hash":"sha256:dca5cd406ed0fd14ee53bd59a6a3cf48e863fe537a3e9f170dd8479d1065892d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3e86e753-19c1-4ab9-9ade-5748f61678ab/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.38","blender_version_min":"4.2.0","maintainer":"carlosmu","tags":["playblast","opengl","render","animation","viewport","user","ui","ux","eevee","maya"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/93ad9257-b229-445b-8277-c702bde1eab4/","schema_version":"1.0.0"},{"id":"POS_shelf_display_generator","name":"Point-Of-Sale POS Product Display Generator (brandPOS) [Before: $35.00, Now: $29.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.0.0","type":"add-on","archive_size":10667988,"archive_hash":"sha256:7b4aba700c52b3bdc15b5f152f8d1267e087295202f024a92bd6570d7336afb7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0efb25ac-de7f-48ca-afa2-5d958419a383/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"29.75","blender_version_min":"4.2.0","maintainer":"brandPOS","tags":["Object","cardboard","packaging","FSDU","display","generator","model"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f2880b5e-ba2f-4f2f-9556-16dd98491c38/","schema_version":"1.0.0"},{"id":"polymating","name":"Polymating [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.1","type":"add-on","archive_size":78737,"archive_hash":"sha256:a129c270d00436e1f8eb0e5f1ba2b6b3d9cb6e143047b9a9d02350d054a708de","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9550396c-6877-48e4-aff2-e427b08aa10d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Mozzarella ARC","tags":["modeling","retopology","topology","sculpt"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/3d3d0b48-a9e1-4081-bfdd-ebe34bcebe72/","schema_version":"1.0.0"},{"id":"Polyviews","name":"Polyviews [Before: $9.00, Now: $7.65]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.1.0","type":"add-on","archive_size":36022,"archive_hash":"sha256:2aac9cae99896126264c23d6025ede4cf88678d25fe2d91947935d7363a179c2","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f7e927ec-5cba-4f39-a855-13f53af93f44/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.65","blender_version_min":"4.2.0","maintainer":"polyspaace","tags":["render","manager","rendermanagement","views","cameras","scenes","scene"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/bb618f47-b9fb-45b8-809d-93569afc7422/","schema_version":"1.0.0"},{"id":"node_file_link","name":"Portable Node Extension [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":220543,"archive_hash":"sha256:9742a530dbfadf2f5d349c8a5b54b891878e955d8daa8fc2004c0221d7f65687","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/aedaca4c-09b3-466d-b9c0-193a81aa8378/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Nicolai Prodromov","tags":["procedural","nodegroups","geometrynodes","extension","community"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d7411d9f-d0ac-4601-bd6b-fb0578fae437/","schema_version":"1.0.0"},{"id":"portal_projection","name":"Portal Projection v1.3 (Addon) | Portals (With Ray Portal BSDF) made easy, for everyone [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.0","type":"add-on","archive_size":2386869,"archive_hash":"sha256:c3365d6bcdbdff2c522f3f1448fad875fb172e94bf461a33fe1334246ac874c0","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/246986dc-770f-425b-9097-ca82ab41b6dc/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Dennis Hafemann","tags":["portal","projection","addon","dimension","mirror","abstract","easy","camera","display","dynamic"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ff5032ec-3c1c-420f-8e11-6cf5fc355815/","schema_version":"1.0.0"},{"id":"pro_aligner","name":"Pro Aligner - Align Any Object With A Click [Before: $7.00, Now: $5.95]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.2","type":"add-on","archive_size":8027,"archive_hash":"sha256:900105e74ba1de500ce56b946e998c2b475b6a2a07345116996736720f1402cf","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/91677678-2957-43d5-a7fb-37bd1d317761/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.95","blender_version_min":"4.2.0","maintainer":"CG Galaxy","tags":["align","rotation","autoalign","proaligner","worldalign","objectalign"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ed839737-ce8c-412c-8753-80a2bc968b59/","schema_version":"1.0.0"},{"id":"Procedural_Sky_System","name":"Procedural Sky System [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"0.2.6","type":"add-on","archive_size":724389,"archive_hash":"sha256:78d907ff64c92dc9fe436fe10cdc90f2fa51f47f1145d4e700a8a10bbb3c37dc","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1a37b04f-dd34-48a1-8184-feceb205e718/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Other Realms","tags":["World","sky","HDRI","shader","cartoon","anime"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/44d6ef69-5132-4e57-bf6e-02e1b7d2075a/","schema_version":"1.0.0"},{"id":"procedural_terrain_generator","name":"Procedural Terrain 2.0 – Geometry Nodes Terrain Generator [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.3","type":"add-on","archive_size":39573,"archive_hash":"sha256:bc1060a598e1f490c0b5f06542dcecfd0afb6e414efdb56dd50d098be5367665","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b359e5f8-dda1-4fa5-a181-f813a3396090/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Studio156","tags":["procedural_terrain","procedural_generation","terrain_generator","landscape","texture_blending","terrain","terrain_mesh","realistic","geometry_nodes","LODs"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9ef8471a-d401-4404-98f9-093837891b43/","schema_version":"1.0.0"},{"id":"product_lighting_setup","name":"Product Autouploader [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":31931,"archive_hash":"sha256:1c78dd9539e0a76f95d94acf2e2c03b6b9f04d73e311c03ef1465e44a195774c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f212cd0a-9d7f-4617-b0a9-ee385e15a631/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"Nicolai Prodromov","tags":["automation","cgtrader","turbosquid","fab","ai","llm","lighting","render","camera","renderautomation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b8679695-2084-4bab-82d7-2a880628e8e6/","schema_version":"1.0.0"},{"id":"psd_layers","name":"PSD-LAYERS V1.6 Add-on [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.6.0","type":"add-on","archive_size":50355,"archive_hash":"sha256:c767d1916b98c2348e38ff329b065a32caae4525a278bcbd3cfdda3e50e7e27a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cf4fc88b-368b-475d-89a2-13706d76324f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Split Studios","tags":["psd_layers","hand","painting","textures","layers","handpainting","paintlayers","paint","texturing","freehand"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b1964db5-95ce-454a-ae93-74a3a17d37a2/","schema_version":"1.0.0"},{"id":"quadify_premium","name":"Quadify Premium [Before: $24.97, Now: $21.22]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.6.0","type":"add-on","archive_size":26623,"archive_hash":"sha256:cbae5724dbd151f7aead7e85d4837a07e8906fc432edcbbb63b8a7cf0a515409","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/02ac2aa9-dae2-4fe4-9fe0-72b540c12116/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"21.22","blender_version_min":"4.2.0","maintainer":"Anvil Interactive Solutions Anibe","tags":["mesh","mesh","optimization","clean","retopology","decimate","low","poly","count"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/6ba7ef6e-9617-4df8-873e-3dac35aadd63/","schema_version":"1.0.0"},{"id":"quadify_pro","name":"Quadify Pro — Studio & Automation Edition [Before: $80.00, Now: $68.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.3.4","type":"add-on","archive_size":82832,"archive_hash":"sha256:73b148cf5c29fc62024b7bd4bba1dbaf99914395a8f0faf6efa0c0077caeb4e5","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/58dec338-ce14-42c9-932e-a97b0101360f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"68.00","blender_version_min":"4.2.0","maintainer":"Anvil Interactive Solutions Anibe","tags":["Modeling","Mesh","Retopology","UV","LOD","Export","Utilities","Workflow"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/489eaa7f-5ad4-402b-8a65-7404010df89b/","schema_version":"1.0.0"},{"id":"quick_align","name":"Quick Align [Before: $2.50, Now: $2.12]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.0","type":"add-on","archive_size":30856,"archive_hash":"sha256:cb1e0440c5f4407c455fbd2e5510a508c4982fe3123a9a489420ea00603b482a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5f1d7822-6cd7-4172-b003-f9bc4d6e207e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.12","blender_version_min":"4.2.0","maintainer":"Null Station","tags":["Object","Aligner","Evenly","Distribution","Illustrator","Adobe","tools"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/91bec957-fe14-459a-83cc-5ce477214631/","schema_version":"1.0.0"},{"id":"quick_baker","name":"Quick Baker [Before: $36.00, Now: $30.60]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.2.0","type":"add-on","archive_size":298517,"archive_hash":"sha256:2c8d57ee1a9cd6649bc0c47aa4e25268a79f59c6b1048f94dc9b5f46b78f277f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/98c622be-9269-4ef6-8f29-faae4fb86357/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"30.60","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["object_bake","high_to_low_poly_bake","auto_cage","auto_UDIM_bake","channel_packing","material_bake","node_bake","pbg_texture_bake","texture_baking"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/562b8533-d6d1-4a37-935c-844b59ccf5cf/","schema_version":"1.0.0"},{"id":"quick_color_mat","name":"Quick Color Mat [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2426,"archive_hash":"sha256:384d34cb9c86629eac51f09fa6a1af15ca086b9ffdf75ef2dd3ee88c91370f9a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a2fd6937-de3a-4f24-9ae0-7ce203659515/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"isac lima","tags":["Fast","Texturing","Texture","Material","Color","Picker","lowpoly"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b6528286-f9b0-4dbc-b032-5c479193a350/","schema_version":"1.0.0"},{"id":"quick_decal","name":"Quick Decal [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.7.1","type":"add-on","archive_size":268191,"archive_hash":"sha256:3ba5d820d9b24cda4c9dfcaaad7e949bb21bc3db49be474d22fa509970b328ac","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/8fa1d954-4aa8-423b-b24c-15002f36f247/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["image_decal","megascans_decal","pbr_decal","decal_layer","layer_wear","layer_maps","auto_snap","auto_parent","auto_resize","quixel_bridge"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/03085e38-2e9e-472c-b274-a6870a1dca07/","schema_version":"1.0.0"},{"id":"quick_export","name":"Quick Export Presets [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":3310,"archive_hash":"sha256:cf518a244930f26fa64b6d4dc4021709f5038921a7f1785c1c74059144263c40","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0c357c80-270f-4a10-98c9-cadeb4941c26/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Studio156","tags":["animation_tools","export","export_presets","game_development","quick_export","time_saving_tools","tool","tools"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e90aa9cb-2ee1-46d7-b142-fc123d3ccfab/","schema_version":"1.0.0"},{"id":"quick_highlight","name":"Quick.Highlight [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2168,"archive_hash":"sha256:04df4f1afbcdab212124e22da346cdb6311a67fee86ec844fb08bc81b5dd6b96","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a33ed777-f4b2-4860-8348-3cc3504d5419/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"George Art","tags":["outliner","addon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/88a04d54-5cd8-44a8-972d-bf71dd4b13a5/","schema_version":"1.0.0"},{"id":"quick_interface","name":"Quick Interface [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.0","type":"add-on","archive_size":25611,"archive_hash":"sha256:64a293894e7513a9274c0d4fe2c52a9f543167742a7e0af6542b1441b389261c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b74dc10c-839e-41cf-94f6-0906dc16c07f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["duplicate","split","switch","management","interface","swap","join"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e099f4ab-5188-4607-b9a5-6b12790694c1/","schema_version":"1.0.0"},{"id":"quick_lattice","name":"Quick Lattice [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"0.8.2","type":"add-on","archive_size":5964,"archive_hash":"sha256:f46aa86875dd6e14060aa47a207bc8fde1db70b3da9bd3d90ace0f81cb9b927d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cf79a7ff-8802-4c4e-bbca-a7c46730dc6b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"carlosmu","tags":["quick","lattice","tools","modeling","automatic","modifiers"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/aebbe9e7-732d-4a77-8bc9-855e0a90a396/","schema_version":"1.0.0"},{"id":"bake_material_pro","name":"QuickMat Bake Pro – Ultimate Texture Baking Tool [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.0","type":"add-on","archive_size":26990,"archive_hash":"sha256:2c1ef19d1c85ae52d0f10a595b30535c02e8196ceea2f85318c6ff37462aa4f6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ba1bb2eb-0a6d-4f56-addd-6b2e3036f5d9/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Studio156","tags":["texture","baking","materialtotexture","material","textures","texturecreator","shader","object"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/45478992-1264-487a-9aeb-23de7fb9d317/","schema_version":"1.0.0"},{"id":"quickmat_pbr","name":"QuickMat PBR – Auto PBR Texture Assigner for Blender [Before: $3.00, Now: $2.55]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":10495,"archive_hash":"sha256:47f2ba1015744e3cb035404188dfb389b28281743027534f6f9c8bf2eaf17616","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b6d254d3-6592-4281-bd4e-dee4bb79c70d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.55","blender_version_min":"4.2.0","maintainer":"Puneeth Saravanan","tags":["Material","substancepainter","adobe","autotexture","Texture","Import_Export"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/52d4ab0f-94b2-4f63-bfef-d86538bae8c2/","schema_version":"1.0.0"},{"id":"quick_measure","name":"Quick Measure v2 [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.5","type":"add-on","archive_size":149550,"archive_hash":"sha256:590b9b24988895ddac71cab3a1cba32bd448f26aad4ae404c7c6ce579ffabbc2","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b2369230-7802-4c18-9fa6-d8e0a325cd18/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["measuring","measures","measure","measurement","measurements","tape_measure","3d_view","measuring_tape"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7074a6d2-6181-4669-9d8b-e13561477abf/","schema_version":"1.0.0"},{"id":"Quick_Origin_tools_v1","name":"Quick origin tool [Before: $1.00, Now: $0.85]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2182,"archive_hash":"sha256:692d1665c5fee4220e79f228ee7c92357bfda113651282424ce6192314e8b5f7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5325a0fb-0f09-4227-9fbd-1658b825fd8d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.85","blender_version_min":"4.2.0","maintainer":"3DAssets Kit","tags":["tool","tools","batch","origin","quick","blender","addon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9d0d5f6a-ea24-4868-8b81-21662abd7d16/","schema_version":"1.0.0"},{"id":"alt_tab_quick_render_preview","name":"Quick Render Preview [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":5971,"archive_hash":"sha256:692f347bf98a84c06c57d3628c023733777b4d5f93dabb14032de8bc46756673","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f3ed45e0-8b26-4b8f-8411-78c66b433860/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","render","preview"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/45eac3d5-9a69-4ea1-8e53-08ba9656447b/","schema_version":"1.0.0"},{"id":"quick_replace","name":"Quick Replace [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.1","type":"add-on","archive_size":106813,"archive_hash":"sha256:55954eb891d859c257510bcd7462d843fb6ffc69b129a8344dfc75d94bffbd62","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4e8b1dca-6edd-4edd-8e79-6c8e1031cb6d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["Object","collection","replacer","placement","tool","variety","blockout","mesh","randomization","replace"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/6ab1d182-6625-4cb8-9b2c-ca4d2c07c111/","schema_version":"1.0.0"},{"id":"quick_theme","name":"Quick Theme [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.2","type":"add-on","archive_size":25703,"archive_hash":"sha256:b2fa794392702d933b726740de51337950654f54d63fc47633d25f257ccf8bc6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/21a9224f-1547-403c-bc20-fe2e09131dad/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["interface","theme","user_interface","custom_interface","quick_theme","blender_theme","theme_maker","3d_user_interface"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c785c99e-f1c2-4fbc-82b8-651761f6101a/","schema_version":"1.0.0"},{"id":"random_object_colorizer","name":"Random Object Colorizer [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":3343,"archive_hash":"sha256:154dfae4dd35cef3d4f2ee5757abd3ef8790e89f0ec4d61f2803c2c8c4b2f7d7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c6fdfec0-fe88-489b-a72a-fb767df8c919/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Studio156","tags":["3d_workflow","tools","materials","Modeling","object_colors","procedural_materials","random_colors","texturing"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/36355162-1705-4223-88ec-f17cb0aa38b2/","schema_version":"1.0.0"},{"id":"raycast_scanner","name":"Raycast Scanner [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":2140094,"archive_hash":"sha256:2b2e2822ab1911da95e7100a079c86a1a9364df9137425aca3523a8f02759db6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/20ccbb56-5810-44ee-aed2-17d56020ea29/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Dennis Hafemann","tags":["3DView","GeometryNodes","Material","Node","raycast","scan","mix","shader","effects","blur"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/61fabc4e-aa4f-463c-8bff-d771f0b85cb2/","schema_version":"1.0.0"},{"id":"ReadyScene_addon","name":"Ready Scene [Before: $2.00, Now: $1.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":4741,"archive_hash":"sha256:6c17f1d4f95da37b2375b5a26890db5cc21eb8cc4dbd620187aeccb89582a928","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f2eacecd-ef95-4fa2-b6ef-8d25415f29a9/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","blender_version_min":"4.2.0","maintainer":"Andriy Charodiy","tags":["parallax","scene","camera","layers"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0f55cc80-1fdd-4d66-9346-9614039486d6/","schema_version":"1.0.0"},{"id":"renametool","name":"Rename Tool [Before: $4.99, Now: $4.24]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":1859,"archive_hash":"sha256:31dcfacba225cd89975fd7f1c19fa3b94cc09f95ce6c07096f628c0676467c8e","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0b9160a3-114e-4c89-9b1d-34c3e2c20444/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.24","blender_version_min":"4.2.0","maintainer":"Peter Harmatiy","tags":["rename","RenameTool","Naming","batch","renaming","prefix","suffix","sequential","numbering"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/759e3e20-389c-4b76-886e-c0b5f777c831/","schema_version":"1.0.0"},{"id":"RENDERBACK_PT_Panel","name":"Render Back | command line rendering made easy [Before: $8.99, Now: $7.64]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.1.0","type":"add-on","archive_size":2469,"archive_hash":"sha256:7eb243aeb9da5906a755214d9e78162c5e867bbd91037dc768e250f5b40314ff","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a520f940-a211-43b4-886f-66606ecf8942/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.64","blender_version_min":"4.2.0","maintainer":"Elton Matiwane","tags":["command","line","rendering","fast","render"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b9d51d20-8ec3-4b14-8da3-0f7413830280/","schema_version":"1.0.0"},{"id":"RenderForgeAI","name":"RenderForgeAI [Before: $25.00, Now: $21.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1879679,"archive_hash":"sha256:0dc385a33ba081c8e7863db348534383ec5c26e0c10d20e728ca70e1466db6c5","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f79e35f5-30a0-4980-8104-67a149695ac4/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"21.25","blender_version_min":"4.2.0","maintainer":"Anvil Interactive Solutions Anibe","tags":["lighting","render","mesh","optimization","AI","denoising","volumetrics"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/244c9e2d-6185-4f62-9501-864aef9d908c/","schema_version":"1.0.0"},{"id":"render_negative_frames","name":"Render Negative Frames [Before: $7.00, Now: $5.95]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1879,"archive_hash":"sha256:2ba36c9790061f0bf0a448114c2cb1719f4a1cffebe061a383f8c4aa7de28039","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/da07005f-b641-4c1f-9587-91cdd6db7c03/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.95","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Rendering","Animation","Frames","Sequence","Negative","Timeline","Output","Preview","Batch","Export"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0eaa2786-bfb2-44d6-aa57-1b3ecdd79892/","schema_version":"1.0.0"},{"id":"Render_Presets","name":"Render Preset Manager [Before: $1.99, Now: $1.69]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2792,"archive_hash":"sha256:586e53a0c3d4c433d5d116672994d69a2a20413e310774af3043e382f0f083c1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/803e583e-48e7-4f43-a923-2b5be440a62f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.69","blender_version_min":"4.2.0","maintainer":"James Middleton","tags":["render","preset"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/03f8285a-7a6f-4f92-9eb0-fa65b40f663a/","schema_version":"1.0.0"},{"id":"alexdepario_render_selected_cameras","name":"Render Selected Cameras [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2760,"archive_hash":"sha256:88bf2295c1d2a4efbdec61981f5b46c9f3d84de1f2ae9aa5214c1aeba2eb8a20","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1428efd1-2258-4adb-9a60-898a271b5838/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Render","Cameras","Animation","Frames","Selected","Keyframes","Output","Addon","Operator","Rendering"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/20a24366-d063-4bae-86a6-64a4801f82b2/","schema_version":"1.0.0"},{"id":"render_toolbox","name":"Render Toolbox / add-on [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.0","type":"add-on","archive_size":51865,"archive_hash":"sha256:7acca1532f7eefc9deb6031439dc7302a55449f02caaab0c1c147ba88eb97bde","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/12596ee0-7bb0-43e0-8936-21c791620c89/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Split Studios","tags":["addon","render","lighting","camera","realistic","hdri","environment","extension","rendering","toolbox"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/01c747ba-fe17-40cc-9a06-ddb66fca62f4/","schema_version":"1.0.0"},{"id":"rendertools","name":"Render Tools [Before: $11.99, Now: $10.19]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.8.0","type":"add-on","archive_size":55255,"archive_hash":"sha256:740459440b6441a7130c3cabdfe29c1b7685b2b9973315e10954bc5815e73454","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/dcf06b24-482e-4e65-a191-d461b65f432b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.19","blender_version_min":"4.2.0","maintainer":"Sérgio Merêces","tags":["render","tools","layers","idtools","image","imagemask","object","objectmask","renderid","selection"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/193a112f-1f47-464f-9481-4eb07e57dfda/","schema_version":"1.0.0"},{"id":"resmax","name":"Resmax - Upscale AI [Before: $14.00, Now: $11.90]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":45049478,"archive_hash":"sha256:0922535ea56912848573cb1b8e9c867351cd9954c6e16a63935818422df6a582","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/15b915f0-42c3-42f8-874f-12e3fca9c4fe/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"11.90","blender_version_min":"4.2.0","maintainer":"PlayfulPixel","tags":["upscale","enhancement","imageenhancement","imagedetail","resolution","upscaling","superresolution","videoupgrade","renderboost","clarity"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b1db2ef8-01eb-4b74-91eb-f5b081e8762e/","schema_version":"1.0.0"},{"id":"retro_console_texture_converter","name":"Retro Console - Texture Converter [Before: $20.00, Now: $17.00]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":9399,"archive_hash":"sha256:1318864822da93978eb7171758723f405929829aec55d440b4fab81118e7b5fd","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/78f3c85b-c1cb-4a5c-b81d-cee1fdbe535d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.00","blender_version_min":"4.2.0","maintainer":"Prince Eagle","tags":["Retro","Console","Converter","Textures","Materials","Playstation","Shader"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f2a4899f-8937-42b9-86d4-b383275c19bc/","schema_version":"1.0.0"},{"id":"retro_game_generator","name":"Retro Game Generator [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":32929,"archive_hash":"sha256:330e68364f7398892036bd42414008db1d1a675d9e478930fa447eae445fdd0c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2a0827f7-3034-4e97-8462-526d7cc43a6b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"RUIDO VFX","tags":["Render","Compositing","Materials","VFX","Retro"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c4461f3c-28a5-46a6-a776-377693db678b/","schema_version":"1.0.0"},{"id":"rigify_exporter","name":"Rigify Exporter [Before: $10.50, Now: $8.92]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.2","type":"add-on","archive_size":16044,"archive_hash":"sha256:95201c3b8e3ab682a4a0a9fa84d178e68a72015bb9661b3c53cfeba822cf31c7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a9df93c3-029c-4df1-a457-a9e93e2eac07/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.92","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["export","rigify","unreal","unity","godot","addon"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ac766b5e-b730-4763-aba8-fe8f4bea7544/","schema_version":"1.0.0"},{"id":"rigify_retargeter","name":"Rigify Retargeter [Before: $10.50, Now: $8.92]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.4","type":"add-on","archive_size":35670,"archive_hash":"sha256:ba465227fe10b5731fbbd72b1a12ff7dd376147ba171e1e3fc59c7fa6d28b988","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4062d4f5-5005-4a0b-a5b8-600147ef7ace/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.92","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["retarget","retargeting","retargetting","bones","rigify","transfer","animation","rigging","rigger","rig"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/08108568-865c-4219-87e7-144df8ab7fa2/","schema_version":"1.0.0"},{"id":"roomgenerat","name":"Room Generator [Before: $30.00, Now: $25.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"0.1.5","type":"add-on","archive_size":13147073,"archive_hash":"sha256:408e1f53f825b1b51bc0382ee284088fa14c879e4b6dee8937fd1ee95dc9864d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/876190c8-55e4-4aa1-8a45-cb9e98a99fdd/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"25.50","blender_version_min":"4.2.0","maintainer":"Vixymiles","tags":["room","generator","interior","ceiling","wall","window","architecture"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/bf65ecc1-78e8-47f1-a396-ae75374e7c0d/","schema_version":"1.0.0"},{"id":"scale_print_camera","name":"Scale Print Camera – Pdf & Exact Scale [Before: $16.00, Now: $13.60]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":43786,"archive_hash":"sha256:b53a1ba15aaf4cf1c20493dd9e7b7e13f0250d8424c9aebf22d10ed3a7c5079a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9f78b53c-ae4a-4785-89a1-09cac3296ab5/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"13.60","blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["blueprint","camera","construction","dpi","orthographic","pdf","print","scale","paper","render"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/08f3b586-69b8-4fef-8b34-09426bb88b06/","schema_version":"1.0.0"},{"id":"scatter_forge","name":"Scatter Forge [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":1238739,"archive_hash":"sha256:fb6bed06c1de23c9d97d80672a4ecedf7744d6a7697ba851ed2967bee46d487f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/86ccd088-496e-4545-91c9-c3bda91d4162/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Spectre 3D","tags":["developement","lod","GameDev","Export","Procedural","Scatter"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/561addae-d8e9-497f-9c73-961d3d0ab281/","schema_version":"1.0.0"},{"id":"scenesweeper","name":"SceneSweeper - Clean-Up Commander [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":23168,"archive_hash":"sha256:869b3b93d15c2f7d138697210c3434c97e31849e776517c73185fd4f4eda5f80","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/00dea756-3878-4037-9217-dfc0032a74d9/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"PlayfulPixel","tags":["SceneManagement","Cleanup","Utilities","Workflow","DataBlocks","Optimization","Performance","Organization","Automation","Productivity"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f5484694-9251-4738-a018-90ae5083fdc7/","schema_version":"1.0.0"},{"id":"wk_schematic","name":"Schematic Editor - Visual Rigging Made Simple [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.6.0","type":"add-on","archive_size":521232,"archive_hash":"sha256:87a909f4c84bd36882d49892e8f0089593c875c709cab79383ee0416d76bd441","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/bbae16e8-181e-4085-a68a-dae314c11e6c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Wolfram Kampffmeyer","tags":["Schematic","Rigging","Hierarchy","Constraint","Editor","Visualization"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/92b4b030-65f1-48eb-84d9-4f3786c9ba9d/","schema_version":"1.0.0"},{"id":"SeasonSlider","name":"Season Slider [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":46257,"archive_hash":"sha256:562d8eaa29b82b144bba800ce5f367e204d11e7f4d96929940437db0fc33b0f3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/715e7d64-0f61-49a6-baad-20d5ab634e51/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Mutanzom3D","tags":["Season","Material","Node","forest","nature","trees","tree","seasons"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/40705d46-2d85-44fd-8d8b-1db3e6f7a1b0/","schema_version":"1.0.0"},{"id":"sectionbox","name":"Section Box - Cross Sections, Elevations, And Visualization [Before: $29.99, Now: $25.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.4.4","type":"add-on","archive_size":11622841,"archive_hash":"sha256:b8eddfe0914b5f30ff217551afcd296911b787991d02e90fe87898120a48e56a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b2137d5e-b914-4c5a-94f3-891ed96982e1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"25.49","blender_version_min":"4.2.0","maintainer":"Ruben Messerschmidt","tags":["section","box","cross_section","elevation","archviz","architecture","plan","drawing","floor_plan","cut"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/42a79447-b3f5-4683-a253-73d7360142a8/","schema_version":"1.0.0"},{"id":"selective_wireframe","name":"Selective Wireframe - Per-Object Wireframe Control for Blender [Before: $4.00, Now: $3.40]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":10492,"archive_hash":"sha256:d1a68e64f6698d3e1aff0c7f56381d0189a3f4ed0b128efc3f06bca6f535779b","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/7484f1ab-1e0a-4050-975e-f5b93c1e1d78/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.40","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Selective","Control","wirframe","everyobject"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/5713302f-2e45-4815-b89d-f3d9dd9ceeb7/","schema_version":"1.0.0"},{"id":"Select_Objects_with_Same_Vertex_Count_extension","name":"Select Objects with Same Vertex Count [Before: $0.99, Now: $0.84]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.2","type":"add-on","archive_size":1445,"archive_hash":"sha256:f3e259eceeebeb7c6455e1e9bab7e6686a2c67517723d927a2895d999aba37b2","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2de46965-3ca1-4838-a586-cbef081e83b5/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.84","blender_version_min":"4.2.0","maintainer":"Mesk911","tags":["vertex","match","count","mesh","dupicate","select","tool","object","same","similar"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/61bfc41c-f84a-43e3-8c82-a94883475530/","schema_version":"1.0.0"},{"id":"set_origin_to_center_bottom","name":"Set Origin to Center Bottom [Before: $2.00, Now: $1.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":1838,"archive_hash":"sha256:81c9c1e0b887bc18f5e413ca02edfa649da3df61230e2ffca2f3f04a19c1072d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/938e3395-7979-475e-b3f9-7d080db2caf4/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","blender_version_min":"4.2.0","maintainer":"Mutanzom3D","tags":["origin","center","bottom","tool","qol","qualityoflife","object"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7381a6d4-7480-4a6c-8beb-10180bdb7169/","schema_version":"1.0.0"},{"id":"shakemaker","name":"ShakeMaker [Before: $5.49, Now: $4.67]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.5.0","type":"add-on","archive_size":14206,"archive_hash":"sha256:36e39fdd146abe3cf1d89d7ad4bbcc6cb3e70b140a09812592aaf647fa7c1ea6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5e557337-8452-4b1d-b932-c7a1a889f397/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.67","blender_version_min":"4.2.0","maintainer":"Ace Of 3D","tags":["shake","vibrate","waggle","wiggle","wobble","noise","animation","modifiers","camera","fcurve"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/aafd9aeb-eda8-4ee4-b7fd-28ae1edad90d/","schema_version":"1.0.0"},{"id":"shape_key_fixer","name":"Shape Key Fixer - Manage All Scene ShapeKeys with Groups & Batch Tools [Before: $8.00, Now: $6.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.5.1","type":"add-on","archive_size":18152,"archive_hash":"sha256:42cf19cca7b18383d173077cd7db74c46dabe6b71cab8fbebcd2fedbe110236a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0028e4ac-0b4d-4dc6-a2ff-062075fcf0c6/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.80","blender_version_min":"4.2.0","maintainer":"Junaid Alam","tags":["animation","blendshapes","rigging","productivity"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/1f14a313-1319-4921-8043-394825fcf083/","schema_version":"1.0.0"},{"id":"ShareTextures","name":"ShareTextures Asset Library [Before: $24.99, Now: $21.24]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":783093,"archive_hash":"sha256:65e40563f57e0fedf66457e7c8c74154c1b32a7cf16c1222436cc96342eccb3b","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/78eb7228-b341-48a2-a9d7-51616bf758b2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"21.24","blender_version_min":"4.2.0","maintainer":"Share Textures","tags":["Object","Material","Pipeline","UserInterface","asset","library"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/822222fd-6e10-4da6-960d-cb12d7ec3fbf/","schema_version":"1.0.0"},{"id":"jd_shot_handler","name":"Shot Handler [Before: $12.00, Now: $10.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.0.2","type":"add-on","archive_size":49735,"archive_hash":"sha256:f113416a330accfae028bb41d95cb7014d2f1967c4b80653dc98c870f29836d2","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/192ad77b-1fb6-4557-ab75-0ea250e15b85/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.20","blender_version_min":"4.2.0","maintainer":"dubCUT","tags":["shot","render","camera","scene","manager","collection","shader","overscan","set","setting"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/93e43d6b-8f20-478b-bb88-94c4ac387d4b/","schema_version":"1.0.0"},{"id":"shot_manager_pro","name":"Shot Manager 2.0 Pro [Before: $38.00, Now: $32.30]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.8","type":"add-on","archive_size":23074944,"archive_hash":"sha256:b080facde94917a3b2068cfd3e732276bf864d33e8d98f002c42063db877638d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d2837608-7be5-4489-9092-cc6e99579609/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"32.30","blender_version_min":"4.2.0","maintainer":"Other Realms","tags":["shot","takes","macros","states","batch","render","burnin","burntin","stamp"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/2ace843e-c14f-4eda-b697-fb7065f344d1/","schema_version":"1.0.0"},{"id":"simple_layouts","name":"Simple Layouts - Full Version [Before: $12.00, Now: $10.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"0.1.5","type":"add-on","archive_size":308012,"archive_hash":"sha256:c773d88ee7a6158743c98df12a7ab8c81f844b0efb9d3da28f0f8f5b57a75520","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d23f80fe-e4d5-473e-b702-a3ca1a3c9949/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.20","blender_version_min":"4.2.0","maintainer":"Other Realms","tags":["Layouts","states","Views"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ce426630-5dd8-408b-a2a5-8140b1c4676e/","schema_version":"1.0.0"},{"id":"simple_section_box","name":"Simple Section Box [Before: $2.00, Now: $1.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.0","type":"add-on","archive_size":2190,"archive_hash":"sha256:de5bcf5bf9a3cfd8b3773925b91061c63fa50a44cd032def5b7f44bf3e7c04b9","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d94ae717-877e-4477-9b5d-0f1d46cb2fc9/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","blender_version_min":"4.2.0","maintainer":"Braulio Pedraza López","tags":["archviz","photogrammetry","beginner"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/dcb1a05a-5fb3-41b6-87cb-d4a15320d160/","schema_version":"1.0.0"},{"id":"simplify_plus","name":"Simplify+ Add-On: Viewport Perfomance [Before: $23.99, Now: $20.39]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":136739,"archive_hash":"sha256:957887d9eef18a40d9d095f20c09aa90ccf0706556582b0f7dfe27eebdcd9bb6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e426bc0d-aba8-4a45-9455-3301de1f9864/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"20.39","blender_version_min":"4.2.0","maintainer":"Cosmo Mídias","tags":["addon","performance","productivity","animation","viewport","playback","speed","workflow"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/55548ced-165b-42b0-8cc2-1fa1a842fc7d/","schema_version":"1.0.0"},{"id":"wk_sliceform","name":"Sliceform PopUp Maker [Before: $27.00, Now: $22.95]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.5.0","type":"add-on","archive_size":967509,"archive_hash":"sha256:94ec87ede7ebadd708c879d1476a48b2e3d4589968ca74660477aa757348a49a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/38007a37-f2d7-4cb4-a9eb-c10b1a465b3c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"22.95","blender_version_min":"4.2.0","maintainer":"Wolfram Kampffmeyer","tags":["sliceform","3d_slice","cardboard","interlocking_objects","lasercut","maker_tools","papercraft","paper_designer","popup_card","svg_export"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ee2ffd44-5bed-40e0-be94-43b22b2e80e3/","schema_version":"1.0.0"},{"id":"smart_autosave_pro","name":"Smart AutoSave+ (Basic Tier) - NovaStrikes [Before: $7.99, Now: $6.79]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"7.0.3","type":"add-on","archive_size":7530,"archive_hash":"sha256:fbe220ec55dcf6147bd900c982c9c1c91fa53c725dd5e00af7c1997aac7fb987","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/db1b49a2-df3a-47ba-ab65-25cd7390ffd6/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.79","blender_version_min":"4.2.0","maintainer":"NovaStrikes","tags":["crash","autosave","scene","safety","backup","system"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c45fc3db-f2a8-4375-a767-48bffaf432d6/","schema_version":"1.0.0"},{"id":"smart_explode","name":"Smart Explode [Before: $45.00, Now: $38.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":16997,"archive_hash":"sha256:edd41a20f4dce1fa76ffb3a26e3bf5b7f2c29e371d93bfc95de374ac51334846","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a367bd41-63eb-4ae9-8ca3-bdac8bf22b91/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"38.25","blender_version_min":"4.2.0","maintainer":"Daniel Farjoun","tags":["Explode","Animation","Archviz","Product","Exploded_View","Procedural"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a152acb9-f8b5-41df-b32c-3b2d4790a934/","schema_version":"1.0.0"},{"id":"snappy_rigger","name":"Snappy [Before: $10.50, Now: $8.92]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.1","type":"add-on","archive_size":1611955,"archive_hash":"sha256:5cdfb0505d2ca3d36950ecbbc1cd96b596560b1b55a377e8f3ed890afd9d8a90","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1e185e45-f252-42fb-826f-a92758a279e0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.92","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["Rigging","autorigger","bones","detection","generator","snappy","blenquick","rig","autorig","rigger"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c9841f8d-5056-41a5-972d-6c6cea2fd4d4/","schema_version":"1.0.0"},{"id":"snb","name":"S N' B [Before: $15.50, Now: $13.18]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1805284,"archive_hash":"sha256:826022da741496e2bfb479210c70aea724940905a9e2cda70157fdaf18245282","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b6ccf2a5-e4bc-43c3-bd9f-ee16b1356dee/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"13.18","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["autorig","bind","detect","bones","generator","snappy","rig","rigging","blenquick","autorigger"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/69166c70-d867-42a9-8846-feb826e3f600/","schema_version":"1.0.0"},{"id":"solaris_creator","name":"SolarisCreator Pro 2.0 - One click cinematic lighting [Before: $69.00, Now: $58.65]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.1.0","type":"add-on","archive_size":119504,"archive_hash":"sha256:dd615b28346d058e294ca290702c65e5f40d2e296fd34259901fc0a0907da17b","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/89e09bd7-6e08-43e3-bd86-f19eae7d8e31/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"58.65","blender_version_min":"4.2.0","maintainer":"Digi Motion Studio by Viet Luan Tran","tags":["sun","lighting","daylight","night","sky","hdri","setup","settings","light","nightlight"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/78fdf920-b5dd-4e2d-ae89-d6c53ac7bc2f/","schema_version":"1.0.0"},{"id":"sort_objects","name":"Sort Objects [Before: $6.00, Now: $5.10]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":2080,"archive_hash":"sha256:acf397a1ef0376442ae348b5eda74aec9f0787b232ac393b33f7b33b09fa8e15","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a3326e40-fbc9-49a2-8576-35963c0d3cd2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.10","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Sort","Objects","Interface","Collections","Organize","Faces","Materials","Meshes","Type"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/90804401-0756-4678-bbee-9482723b8db3/","schema_version":"1.0.0"},{"id":"space_generator_v1","name":"Space Generator [Before: $10.50, Now: $8.92]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.2.2","type":"add-on","archive_size":543142656,"archive_hash":"sha256:bf244277a9289813f557ae3153b0b92dec287f35885c4b56d5748e2ff94228c4","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4a90ff4c-f314-4305-8b50-bfde82d66719/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.92","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["Space","Universe","Planet","Moon","Sun","Star","Exoplanet","Asset","8k","4k"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8ec3496a-1c6d-4137-beed-afb1618aa0b6/","schema_version":"1.0.0"},{"id":"specific_frame_render_manager","name":"Specific Frame Render Manager [Before: $7.00, Now: $5.95]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.2.0","type":"add-on","archive_size":20677,"archive_hash":"sha256:cc7100833c9dac256ee3f9cbed2ae1c3337293d751b8093dac34dc124be08941","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/39497e95-b0f5-444b-8a69-96af1a461025/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.95","blender_version_min":"4.2.0","maintainer":"RUIDO VFX","tags":["Render","Camera","Output","VFX","Batch","Pipeline"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/eda01abf-f2e3-4f3c-b7e4-3441c6dd4e2c/","schema_version":"1.0.0"},{"id":"stairs_maker","name":"Stairs Maker [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"3.5.2","type":"add-on","archive_size":1954483,"archive_hash":"sha256:12ccbe83ae847b6db4b544475b1ecc8ca59e80a09d5a6bf95d622a2eb89dd0c8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2ed4b3c4-8150-4715-a93d-c8f8eced6e5e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Blender Bash","tags":["stairs","architecture","maker"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9489f9e0-91cc-414f-a7c0-b637a70a4eae/","schema_version":"1.0.0"},{"id":"starconnect_pro","name":"Star Connect - Smart Mesh Triangulation [Before: $19.99, Now: $16.99]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.4.0","type":"add-on","archive_size":128633,"archive_hash":"sha256:5cac8b7f6fd6438709d3d9ba30a7136f3d5d23ae172b1e38eb6ae0e8fb189ed8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4aa3f685-f52b-4f66-9762-771ec163c0a3/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.99","blender_version_min":"4.2.0","maintainer":"Ruben Messerschmidt","tags":["triangulation","mesh_triangulation","star_connect","hard_surface","mesh_clean"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4b59c688-c13b-4611-8e18-98ad327133c9/","schema_version":"1.0.0"},{"id":"surface_effects","name":"Surface Effects – Procedural Material Enhancer [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":23835,"archive_hash":"sha256:db1541adbb92cd4aa13b3bd73bb0c57bb7cde085c11536f63d0a887da810c828","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/290a8fcd-eec1-421c-9b4e-dc8a5f99e3ee/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Studio156","tags":["procedural","effects","rust","scratches","wetness","dust","edgewear","material","nodes","surfaceeffects"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/d212f51d-4f0e-465e-9ac3-883925e83903/","schema_version":"1.0.0"},{"id":"SurfacePainter","name":"Surface Painter [Before: $9.00, Now: $7.65]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.0","type":"add-on","archive_size":36113940,"archive_hash":"sha256:26a3e456bf03fb45ab2912e4c3b659b38cf2b9a9c298f550a7d1f54c0b8a6735","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/63e9f89c-0d70-43bf-9b99-9e88f3a4864b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.65","blender_version_min":"4.2.0","maintainer":"polyspaace","tags":["materials","painting","surfaces","modelling","pbr"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f504ec5a-642c-4947-8cb3-b25523bf186e/","schema_version":"1.0.0"},{"id":"survey_points_annotator","name":"Survey Points Annotator – Geodetic & Construction Workflow [Before: $19.00, Now: $16.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":60460,"archive_hash":"sha256:2653c075f02776bdff274fad70e43d9885a8d40d3f0aa4021202a97809ce4599","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/fa217ed0-dcaa-4fe7-81df-79e16c617683/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.15","blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["3DView","UserInterface","Mesh","Object","Annotation","Survey"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/47132746-52bd-43fd-89a4-82a5432aa9a1/","schema_version":"1.0.0"},{"id":"survey_points_exporter","name":"Survey Points Exporter – Geodetic & Construction Workflow [Before: $19.00, Now: $16.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":39261,"archive_hash":"sha256:7296dc8dada42dda5ee981c8f96b7b6598c300c5d2ddfa0caff01dd91904e42a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a382e44d-af3f-4af1-99df-7334a13272f2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.15","blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["Export","Survey","Coordinates","CAD","GIS","engineering","construction","geodesy"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4a5b032a-90aa-4148-9e40-f7318a5eaf17/","schema_version":"1.0.0"},{"id":"survey_points_importer","name":"Survey Points Importer – Geodetic & Construction Workflow [Before: $19.00, Now: $16.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":48116,"archive_hash":"sha256:07dae0d5d8f657eb750fc5b2599c3398a22017f881d5331a27ba40033f4ebd30","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/18d5b865-6a8d-42eb-a74b-820c69792a9f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.15","blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["survey","CSV","CAD","points","geodesy","construction","engineering","BIM","coordinates","import"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/aa5ffc37-f082-4bf9-96f7-cf24ccf16575/","schema_version":"1.0.0"},{"id":"survey_terrain_tools","name":"Survey Terrain Tools – Geodetic & Construction Workflow [Before: $19.00, Now: $16.15]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":43979,"archive_hash":"sha256:ec0f9da235bf43c1719622cf91a37f5fb38e880201ae9f6c7dce6e54661f88a6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/317055ca-0c25-4d4e-ab6d-5a8d9c48b7df/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.15","blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["3DView","UserInterface","Mesh","Survey","Terrain","Measure","terrain","Slope","geodesy","survey"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/aeb85251-1fca-422a-ad99-acc4acc934a5/","schema_version":"1.0.0"},{"id":"svg_exporter","name":"SVG Exporter 1.1.0 [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":67446,"archive_hash":"sha256:5f1feb0d46de24a8816f6d6d0fe4baffba23e6b3855054571c9d918b209f1b46","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a85d69f2-e9f0-4525-8389-d629065c27c1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Nicolai Prodromov","tags":["svg","export","illustrator","vectors"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/3c751ebd-c083-408b-a82a-50ad796f78ec/","schema_version":"1.0.0"},{"id":"textopbr","name":"TEXtoPBR [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.5.0","type":"add-on","archive_size":15465,"archive_hash":"sha256:7dc82c0e29fc8a939fd4480d424cf0707df2bfe08d83578017dba0211e62aa50","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b351eeb4-d93a-4473-9c48-68c6e1828b07/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Split Studios","tags":["pbr","material","texture","textures","textopbr","addon","extension","shader","generate","displacement"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/c9c54d68-ae48-4d39-bd29-5109652c19bf/","schema_version":"1.0.0"},{"id":"texture_resolution_manager","name":"Texture Resolution Manager [Before: $9.99, Now: $8.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":5016,"archive_hash":"sha256:2acab6532846076f2be8681a9fe3728a88e475e4d5e9129f1b2954374e524f8d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/64c383b8-7cc0-4841-90da-d96936742246/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.49","blender_version_min":"4.2.0","maintainer":"Doctor Legion","tags":["Material","textures","texture","resolution","manager","8k","2k","8kto2k","vram","crash"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/dbf87b90-4f14-4b5b-b1b6-94a42a56607d/","schema_version":"1.0.0"},{"id":"Texture_Setup","name":"Texture Setup [Before: $3.00, Now: $2.55]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":3275,"archive_hash":"sha256:cf87113efe4f2741f72324e75b0b7d22a511a9d838afe3272ee70026f9a20b0c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/304da0fb-42b6-4763-b035-e7a1f872631a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.55","blender_version_min":"4.2.0","maintainer":"ImNoah","tags":["texture","setup","pbr","material","easy","beginner"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/1bc8d1e5-30ec-4f13-970f-753bb85d3933/","schema_version":"1.0.0"},{"id":"Texture_Tools_Addon","name":"Texture_Tools_Addon [Before: $9.99, Now: $8.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":6640,"archive_hash":"sha256:da5b85b68abcc1a6a9d40235e689d142a16f871f50f6b9f948d6b121728514fc","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4f3c8941-ea6e-4a95-9247-e5bbea96fd88/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.49","blender_version_min":"4.2.0","maintainer":"Amal David","tags":["UV","UV_tools","texture","modelling","generic","symple","decal","trim"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/2b074e8a-844b-458a-a01b-84cada557d0f/","schema_version":"1.0.0"},{"id":"texture_upscaler","name":"Texture Upscaler - Offine Image Upscaler For Blender [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.3.0","type":"add-on","archive_size":200727626,"archive_hash":"sha256:6a71e383d902259c98be3deed66ebb7426c32aa2faf638295e6e4a0ab15078e5","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6964e35b-6cf3-484e-ab91-e8600f5b418f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Haseeb Ahmed","tags":["upscale","texture","PBR"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/999f5f40-469c-4d46-8647-42babafe320e/","schema_version":"1.0.0"},{"id":"Texturology","name":"Texturology™ | AI PBR Textures from a Single Image in Blender [Before: $19.50, Now: $16.58]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1459005875,"archive_hash":"sha256:466e058cf39b8566902b14f79011afc18d525d1a0a7e3b6448b65e287463f644","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/7c5ce419-191e-4784-aa05-9d2ecbb7aa07/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.58","blender_version_min":"4.2.0","maintainer":"Giambattista Von Nettesheim","tags":["addon","Substance","3D","AI","Upscaling","Inpainting","materials","PBR","texturing","imagetomaterial"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9d7fb688-d32f-4b21-acb7-a8726d96ddd9/","schema_version":"1.0.0"},{"id":"hstb_pro","name":"The Hard Surface toolbox v 2.0.7 i2M image to mesh system and importer [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.0.7","type":"add-on","archive_size":159086065,"archive_hash":"sha256:1965899e1578da49188a948210b5700cf32c08c2831608397ebaa2efeea62a68","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f4e2fa57-414d-421d-a2f0-ec909578a309/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["HardSurfacetools"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8c9ca364-7c7b-4a70-86b9-28e94fd80583/","schema_version":"1.0.0"},{"id":"Tiles_Importer","name":"Tile Importer [Before: $30.00, Now: $25.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":944337,"archive_hash":"sha256:e397582008ec0eee3d81c380277ea2b6d4dcf988db8b704c236b06c681110003","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/dca9bd98-0e9b-42a2-ac97-6ab9825627b2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"25.50","blender_version_min":"4.2.0","maintainer":"Haseeb Ahmed","tags":["map","blosm","google","3d","tiles"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/b62311af-f1bc-43d8-845a-cdd313f32dbe/","schema_version":"1.0.0"},{"id":"time_click_tracker","name":"Time & Click Tracker - Break Time Reminder [Before: $1.00, Now: $0.85]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":27509,"archive_hash":"sha256:d3992f7f2086e8b98e0273945711ca1f4285c18f8afea9d3de2a439d3343dd11","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/18721170-d0fd-45f2-99ef-0d1a158fb5c0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"0.85","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["System","Productivity","Tracking","Analytics","Workflow"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7da69ca1-9644-4e75-b295-e58368813c60/","schema_version":"1.0.0"},{"id":"timelapse_studio","name":"Timelapse Studio V1.0 [Before: $3.00, Now: $2.55]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":257056,"archive_hash":"sha256:41fd3f67885ff8ba32652e9145ac1eec5c7c95cc791827a954e5e10a1cea4f55","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/37f01828-add1-4a34-971d-914731b8378f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.55","blender_version_min":"4.2.0","maintainer":"Rohit Punnen","tags":["timelapse","hyperlapse","screenshot","video","tutorial"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/a3f446a9-e8bb-422e-bfc5-d424d1c421a4/","schema_version":"1.0.0"},{"id":"trimotion","name":"Trimotion-Animation Optimizer [Before: $32.00, Now: $27.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.4.0","type":"add-on","archive_size":55849,"archive_hash":"sha256:dad0d50ae418ffb09385ea1ae481d8bc5df9dcb71b92fb1f51c6921cfffd4eed","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f1077232-0301-4173-bd04-bc7a4eff4422/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"27.20","blender_version_min":"4.2.0","maintainer":"Null Station","tags":["animation","optimization","cleanup","mocap","simplifier","tools","rokoko","curve","motion","keyframe"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/07044b73-ff12-424f-b4ce-3240d1bae740/","schema_version":"1.0.0"},{"id":"trim_sheet_express","name":"Trimsheet Express [Before: $19.99, Now: $16.99]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.4","type":"add-on","archive_size":44729,"archive_hash":"sha256:7f03b201ca49a0146bbe4d2ef7a1eadf1acdecc0374e7a2502ea7d77ccf3d530","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/fa7c57f2-bbfd-48ba-9bab-1b3efed7ab91/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.99","blender_version_min":"4.2.0","maintainer":"Troublesome Eissa","tags":["trimsheet","texturepacking","baking","sheet","materials"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/24639bd7-bbf1-40cf-950c-2454ab9d1a7a/","schema_version":"1.0.0"},{"id":"ultimate_animation_suite","name":"Ultimate Animation Suite [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":26615,"archive_hash":"sha256:a0a86c9d504534758288888410cf529c8ce667664a2aed66a7f223cdc42b0bbe","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/3c058999-83d8-4000-be61-85b8bf94a9f0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Anvil Interactive Solutions Anibe","tags":["animator","camera","3d","3danimation","camerapreset","animationtool"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/39ea8e25-2663-4105-a6a1-cdb8d127920a/","schema_version":"1.0.0"},{"id":"ultimate_camera_shake","name":"Ultimate Camera Shake Generator [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"5.5.0","type":"add-on","archive_size":18381,"archive_hash":"sha256:174b87c45d0d37958df4ca2a6d2f9edeb4217e132f6f44072e19ed2f877e0346","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/50ed10f9-3d98-4ebd-943d-d90340969fa5/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"RUIDO VFX","tags":["Animation","Camera","VFX","Shake","motion","cinematic","keyframe","tool","vibration","rotation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/ec291b17-d50a-45c6-93bf-d0167068bf69/","schema_version":"1.0.0"},{"id":"ultimate_outline_generator","name":"Ultimate Outline Generator (Eevee & Cycles) [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.6.1","type":"add-on","archive_size":17488,"archive_hash":"sha256:93f174a95ce78dea36cbbb201b75d0e739a40721082ee5d53600f74fa37ce1e7","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0165ea8d-1699-496e-a9bb-b48527de552d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"RUIDO VFX","tags":["Eevee","Stylized","NPR","Toon","Anime","Lineart","Solidify","Shader","CelShading","Comic"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/e6b21427-bd81-4bfd-a646-aa3647c805f1/","schema_version":"1.0.0"},{"id":"ultimate_stopmotion","name":"Ultimate StopMotion Generator [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"14.2.0","type":"add-on","archive_size":23597363,"archive_hash":"sha256:43b06e603082bb54410d9ac2df98b2bf7e455250489cc1077e6322555893dae3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/bdecf7f1-8739-4429-93c9-167e8e46d5ee/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"RUIDO VFX","tags":["Animation","StopMotion","Keyframes","Timing","Stylized","Tools","frame","nose","jitter","claymation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7c989c2a-f7dc-42b0-a2ca-968912384ff8/","schema_version":"1.0.0"},{"id":"ultimate_toonshader","name":"Ultimate ToonShader Generator [Before: $10.00, Now: $8.50]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":18967,"archive_hash":"sha256:46cb4e81cadfeb449a090f56e07799ab99a17eed3a3906b2178c7934fe2f8f54","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/8efcf29c-80a1-4b25-95e9-c58c81aa23c6/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.50","blender_version_min":"4.2.0","maintainer":"RUIDO VFX","tags":["Render","Shading","Stylized","NPR","Materials","toon","shader","comic","anime","2d"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/4573ad1e-77a2-4c52-9cc2-baa44f4a6dbb/","schema_version":"1.0.0"},{"id":"undo_history","name":"Undo History [Before: $4.00, Now: $3.40]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.1.0","type":"add-on","archive_size":1268,"archive_hash":"sha256:ec7b88c1fbdd7e24b8b34597ca78c8383c80035b65f47999ce849ab4633a76b3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/db09a89d-721d-4f74-83a8-6d0ba607ae25/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.40","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["Undo","History","Interface","Navigation","Workflow","Redo","Panel","Tools","Actions","Shortcuts"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/110a0e8d-f1d8-4479-9c3b-9188da0f4fc2/","schema_version":"1.0.0"},{"id":"upscalar","name":"Upscalar | The Image AI Upscaling For Blender [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":679178887,"archive_hash":"sha256:4317b3a0a42e7699e5429e570d07193be262e09462c6822ad63222c11a984313","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f4c9026f-9bc3-4048-8e4c-f29ae7026bf5/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"Giambattista Von Nettesheim","tags":["4k","enhancement","Super","Resolution","image","editor","upscale","lookdev","upscaling","compositing"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/237e6171-8869-4612-bd5e-a3ca427ef5a4/","schema_version":"1.0.0"},{"id":"uv_king","name":"UV King | Single-Click UV Unwrap & Pack for Blender [Before: $17.00, Now: $14.45]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.2.1","type":"add-on","archive_size":1531633,"archive_hash":"sha256:d21e31cbcaa2b3587163abe394472c4024d10a76b8fd618f7b40116a2a090f33","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f6e89e4f-2dd5-4394-9e2b-2149dc2e6e15/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"14.45","blender_version_min":"4.2.0","maintainer":"Arun C","tags":["UV","UVPACK","UVunwrap"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/6c03319b-087f-4446-a9bc-959f4e0eea65/","schema_version":"1.0.0"},{"id":"vfx_scene_builder","name":"VFX Scene Builder - After Effects to Blender [Before: $9.99, Now: $8.49]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":129261,"archive_hash":"sha256:6161d5fabb72404e17e05f1dfcb71922ef9062bd1f3134a7162090623a3f8241","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/acf85984-0f08-49ba-aaaf-849ee1553c1c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.49","blender_version_min":"4.2.0","maintainer":"Serhat Dönmez","tags":["VFX","Workflow","Camera","Track","CGI","after_effects","blender"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/17256fe9-432d-46eb-9245-892fad2faaf7/","schema_version":"1.0.0"},{"id":"viewport_object_finder","name":"Viewport Object Finder [Before: $2.00, Now: $1.70]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":12335,"archive_hash":"sha256:6fb559947a155ba05be51d97f7e57ff6831eb1b976903503e20833c869f23430","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/180c824a-a586-4d8b-b7db-d6e3e405bdce/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Object","Search","Finder","Outliner","3DView"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9a832280-ec35-49fa-bfcc-6b97932736d3/","schema_version":"1.0.0"},{"id":"viewlink","name":"ViewSync - Viewport Navigation Sync [Before: $5.00, Now: $4.25]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":9926,"archive_hash":"sha256:bc0931eacd7c2c282e27e3747fefa76f036ec804b7ce38029f136cb220139de1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/a4424785-0359-414d-986e-0d6dea34f3eb/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.25","blender_version_min":"4.2.0","maintainer":"PlayfulPixel","tags":["blender","viewport","navigation","sync","multimonitor","modeling","animation","workflow","camera","presentation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/14ab582e-2794-4406-9427-af93348e7cf9/","schema_version":"1.0.0"},{"id":"VSEDAWFX","name":"VSE-DAW FX [Before: $14.99, Now: $12.74]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.9.1","type":"add-on","archive_size":436914,"archive_hash":"sha256:005c1409136056e61f71db135d177ceac26205be4d65bc6d538c1d2ebac1b780","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/afd34044-6bf0-4e94-b041-a32433783f05/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.74","blender_version_min":"4.2.0","maintainer":"Jacques Durocher","tags":["DAW","effects","audio","music","FFmpeg","compressor","mix","mastering","sound","reverb"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/dea4de69-4f56-4791-b8f7-a315f0d489c7/","schema_version":"1.0.0"},{"id":"vse_lottie_exporter","name":"VSE → Lottie Exporter JSON [Before: $19.99, Now: $16.99]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.1","type":"add-on","archive_size":478198,"archive_hash":"sha256:df934207034410d289ecaa5a0560701937fd4710c4136d657c6b0e2550b37eee","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/758a98ec-23fa-4a16-beef-8bf64f69a8b1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.99","blender_version_min":"4.2.0","maintainer":"Dynos Std","tags":["export","vse","motion","ui","json","lottie","animation","video"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/624848c3-08c0-438b-8177-a4bb8680e563/","schema_version":"1.0.0"},{"id":"wireframe_lens","name":"Wireframe Lens - Inspect topology without switching modes. [Before: $4.00, Now: $3.40]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"2.3.0","type":"add-on","archive_size":13384,"archive_hash":"sha256:99c4709ad0b3ecf7afc2e71bb25a1bf8d60dbafbf48fd72ce888f4c952c4c8c9","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0f494136-21a7-4c11-8e55-899ba79d01cd/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.40","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Mesh","3DView","Modeling","UserInterface"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/0ee85911-a0cf-471e-8534-d556ef42ef7c/","schema_version":"1.0.0"},{"id":"wk_bookart","name":"wk BookArt Addon [Before: $12.00, Now: $10.20]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":3390083,"archive_hash":"sha256:26909033ff9a7c5efd84b48c67b7ab1cb0a9bcfb1019ae00ac1fc4d6e630367d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ae8b4251-2838-4638-afe2-6971afe9ffc2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.20","blender_version_min":"4.2.0","maintainer":"Wolfram Kampffmeyer","tags":["BookArt","BookFolding","Papercraft","Pattern","SVG","CSV","Manufacturing","Layout"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8f8c5952-b13f-4a54-8684-323b3a421da3/","schema_version":"1.0.0"},{"id":"wk_facerig","name":"wk_facerig – Fast, intuitive facial animation in Blender [Before: $13.00, Now: $11.05]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":1144829,"archive_hash":"sha256:5954c8ee130e0ec355c161ff81250db8925ec8c75e451d42cf06f4ce4bbc69f0","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c4f7c302-88e4-476c-8281-375a613e32ad/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"11.05","blender_version_min":"4.2.0","maintainer":"Wolfram Kampffmeyer","tags":["Face_rigging","Rigging","Slidercontrol","intuitive","animation","blender","facerig","lipsync","automatic","animator"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/cd687c32-9fa6-427b-8142-49fdaad99279/","schema_version":"1.0.0"},{"id":"wk_powerpin","name":"wk_PowerPin [Before: $8.00, Now: $6.80]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":379088,"archive_hash":"sha256:99f355ca057c0b86adf8bce45f2bc9e6172ee2e3fa101144c59ddc1f25f0cda8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/68b03fea-83b1-4a18-b3f6-0a30271143f1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.80","blender_version_min":"4.2.0","maintainer":"Wolfram Kampffmeyer","tags":["Animation","Walkcycle","NLA","FootPinning","Baking","GraphEditor","Rigging"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/6a990ce8-1452-4050-ae7e-219aa109be34/","schema_version":"1.0.0"},{"id":"wk_workspacetools","name":"Workspace Tools Addon Presets [Before: $15.00, Now: $12.75]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.2.0","type":"add-on","archive_size":307370,"archive_hash":"sha256:69942a26f934364e86bcf70a0981259d4e7ea425e8e5c78e9220297c45075b71","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/dfcae439-c3e3-4ba2-9e79-c9bbc1c19008/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.75","blender_version_min":"4.2.0","maintainer":"Wolfram Kampffmeyer","tags":["3d_workflow_optimization","addon_manager","addon_presets","blender_n_panel","blender_presets","custom_workspaces","freelance_tools","layout_presets","productivity_tools","workspace_manager"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/8e23b6e9-abf3-4200-8b07-fc01d4ee8443/","schema_version":"1.0.0"},{"id":"xray_selection_pro","name":"X-Ray Selection Pro [Before: $7.99, Now: $6.79]","tagline":"This asset is available only for FULL plan users. Please upgrade your plan and fill in secret Access Token to download this asset.","version":"1.0.0","type":"add-on","archive_size":5532,"archive_hash":"sha256:b82c8b8e7e2354ec9af6a4b91b9696f5270645869c88cfe2d26ab7705418458a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0f713e00-3e20-4b4b-95bd-d527e1810add/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.79","blender_version_min":"4.2.0","maintainer":"Doctor Legion","tags":["xray","textures","3dalpha","opacity","instantxray","visibiliy","addons","pro","3dviewport","scene"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7bf7d68b-bfd8-471a-bd97-e4a2d38d971d/","schema_version":"1.0.0"}],"version":"v1"} \ No newline at end of file diff --git a/scripts/addons/Do not Extract the .zip _ Install entire .zip as an addon.txt b/scripts/addons/Do not Extract the .zip _ Install entire .zip as an addon.txt new file mode 100644 index 0000000..e69de29 diff --git a/scripts/addons/HoloMARI_MultiRender.py b/scripts/addons/HoloMARI_MultiRender.py new file mode 100644 index 0000000..32921a9 --- /dev/null +++ b/scripts/addons/HoloMARI_MultiRender.py @@ -0,0 +1,5674 @@ +bl_info = { + "name": "Multi-Headless Instance Renderer | HoloMARI Platform", + "author": "HP Park", + "version": (1, 6, 5), + "blender": (2, 93, 0), + "location": "Render Properties â–¸ Multi-Instance Frames", + "description": "Spawns one or more headless Blender workers per GPU to maximize available compute resources.", + "category": "Render", +} + +import bpy +import os +import sys +import re +import shutil +import tempfile +import time +import threading +import queue +import subprocess +import signal +import socket +import json +import random +import addon_utils +import string +import shlex +import hashlib +from pathlib import Path +from collections import Counter, deque + +ADDON_KEY = "multi_instance_render" +_KM_ITEMS = [] +_MANAGER = None + +IS_WIN = (os.name == "nt") +IS_MAC = (sys.platform == "darwin") + +VIDEO_FORMATS = {"FFMPEG", "AVI_JPEG", "AVI_RAW", "FRAME_SERVER"} + + + +# ----------------------- helpers ----------------------- + +def _log(msg): + print(f"[MGPU] {msg}") + +def _manager_has_active_workers(manager): + if not manager: + return False + try: + for w in getattr(manager, "workers", []): + try: + if w.running: + return True + except Exception: + continue + except Exception: + pass + return False + +def _cleanup_stale_manager(): + global _MANAGER + if _MANAGER and not _manager_has_active_workers(_MANAGER): + try: + _MANAGER.stop() + except Exception: + pass + _MANAGER = None + +def _cycles_prefs(): + try: + return bpy.context.preferences.addons["cycles"].preferences + except Exception: + return None + +def _current_compute_type(): + cp = _cycles_prefs() + if not cp: + return "CUDA" + return getattr(cp, "compute_device_type", "CUDA") or "CUDA" + +def _cycles_cpu_device_selected(): + cp = _cycles_prefs() + if not cp: + return False + try: + cp.refresh_devices() + except Exception: + pass + for d in getattr(cp, "devices", []): + try: + if str(getattr(d, "type", "") or "").upper() == "CPU" and bool(getattr(d, "use", False)): + return True + except Exception: + continue + return False + +def _fmt_bytes(n): + try: + for unit in ["B","KiB","MiB","GiB","TiB"]: + if n < 1024: return f"{n:.1f}{unit}" + n /= 1024.0 + except Exception: + pass + return "?" + +def _median(values): + vals = [] + for v in (values or []): + try: + fv = float(v) + if fv > 0: + vals.append(fv) + except Exception: + pass + if not vals: + return None + vals.sort() + n = len(vals) + m = n // 2 + if n % 2 == 1: + return vals[m] + return (vals[m - 1] + vals[m]) * 0.5 + +_RENDERTIME_GUARD_PROFILES = { + "OFF": { + "enabled": False, + "warmup_completed_jobs": 1, + "warmup_per_worker_jobs": 1, + "periodic_recycle_enabled": False, + "periodic_recycle_points": [], + }, + "CONSERVATIVE": { + "enabled": True, + "warmup_completed_jobs": 1, + "warmup_per_worker_jobs": 1, + "min_samples_soft": 6, + "soft_mult": 3.8, + "soft_min_s": 150.0, + "hard_mult": 7.0, + "hard_min_s": 420.0, + "progress_stall_s": 120.0, + "hedge_grace_s": 90.0, + "hedge_max_per_job": 1, + "restart_max_per_job": 1, + "worker_restart_cooldown_s": 300.0, + "worker_restart_budget": 1, + "worker_restart_window_frames": 20, + "global_restart_limit": 2, + "global_restart_window_s": 180.0, + "single_worker_min_stall_s": 240.0, + "min_baseline_s": 20.0, + "periodic_recycle_enabled": False, + "periodic_recycle_points": [0.25, 0.50, 0.75], + "periodic_recycle_min_completed_jobs": 32, + }, + "BALANCED": { + "enabled": True, + "warmup_completed_jobs": 1, + "warmup_per_worker_jobs": 1, + "min_samples_soft": 4, + "soft_mult": 3.0, + "soft_min_s": 90.0, + "hard_mult": 5.5, + "hard_min_s": 300.0, + "progress_stall_s": 90.0, + "hedge_grace_s": 60.0, + "hedge_max_per_job": 1, + "restart_max_per_job": 1, + "worker_restart_cooldown_s": 180.0, + "worker_restart_budget": 2, + "worker_restart_window_frames": 20, + "global_restart_limit": 3, + "global_restart_window_s": 150.0, + "single_worker_min_stall_s": 180.0, + "min_baseline_s": 20.0, + "periodic_recycle_enabled": False, + "periodic_recycle_points": [0.25, 0.50, 0.75], + "periodic_recycle_min_completed_jobs": 32, + }, + "AGGRESSIVE": { + "enabled": True, + "warmup_completed_jobs": 1, + "warmup_per_worker_jobs": 1, + "min_samples_soft": 2, + "soft_mult": 1.6, + "soft_min_s": 35.0, + "hard_mult": 2.1, + "hard_min_s": 95.0, + "progress_stall_s": 35.0, + "hedge_grace_s": 20.0, + "hedge_max_per_job": 1, + "restart_max_per_job": 1, + "worker_restart_cooldown_s": 90.0, + "worker_restart_budget": 3, + "worker_restart_window_frames": 20, + "global_restart_limit": 8, + "global_restart_window_s": 180.0, + "single_worker_min_stall_s": 100.0, + "min_baseline_s": 20.0, + "periodic_recycle_enabled": True, + "periodic_recycle_points": [0.25, 0.50, 0.75], + "periodic_recycle_min_completed_jobs": 32, + }, +} + +def _rendertime_guard_profile(tier: str): + key = str(tier or "AGGRESSIVE").upper() + base = _RENDERTIME_GUARD_PROFILES.get(key) or _RENDERTIME_GUARD_PROFILES["AGGRESSIVE"] + out = dict(base) + out["tier"] = key + return out + +def _classify_launch_exception(exc: Exception): + s = str(exc or "") + low = s.lower() + if ("1455" in low) or ("paging file" in low) or ("not enough memory" in low): + return "SYSTEM_RAM_OR_COMMIT_EXHAUSTED" + if ("access is denied" in low) or ("permission denied" in low): + return "ACCESS_DENIED" + if ("file not found" in low) or ("no such file" in low): + return "BINARY_OR_PATH_NOT_FOUND" + if ("is not recognized" in low): + return "BINARY_NOT_EXECUTABLE" + return "PROCESS_START_EXCEPTION" + +def _classify_runtime_exit_reason(last_line: str, returncode): + rc = "" if returncode is None else str(returncode) + ll = (last_line or "").lower() + if ("out of memory" in ll) or ("not enough memory" in ll): + return "EXIT_OUT_OF_MEMORY" + if ("cuda error out of memory" in ll) or ("optix error out of memory" in ll): + return "EXIT_GPU_VRAM_OOM" + if ("failed to create" in ll and "context" in ll): + return "EXIT_GPU_CONTEXT_INIT_FAILED" + if rc == "-1073741819": + return "EXIT_ACCESS_VIOLATION" + if rc == "-1073740791": + return "EXIT_STACK_BUFFER_OVERRUN" + return "EXIT_BEFORE_HANDSHAKE" + +def _mgpu_is_video(scene): + try: + img = scene.render.image_settings + fmt = str(getattr(img, "file_format", "") or "").upper() + media = str(getattr(img, "media_type", "") or "").upper() + return (fmt in VIDEO_FORMATS or media == "VIDEO") + except Exception: + return False + +def _mgpu_video_output_path(scene): + try: + return bpy.path.abspath(scene.render.filepath) + except Exception: + return "" + +def _mgpu_first_frame_path(scene): + try: + return bpy.path.abspath(scene.render.frame_path(frame=scene.frame_start)) + except Exception: + try: + return bpy.path.abspath(scene.render.filepath) + except Exception: + return "" + +def _mgpu_dir_has_entries(path): + try: + if not os.path.isdir(path): + return False + with os.scandir(path) as it: + for _entry in it: + return True + except Exception: + return False + return False + +def _mgpu_sequence_exists(first_frame_path): + try: + dir_path = os.path.dirname(first_frame_path) + if not os.path.isdir(dir_path): + return False + base = os.path.basename(first_frame_path) + m = re.search(r"(\\d+)(\\.[^.]+)?$", base) + if not m: + return False + prefix = base[:m.start(1)] + suffix = m.group(2) or "" + for name in os.listdir(dir_path): + if not name.startswith(prefix): + continue + if suffix and not name.endswith(suffix): + continue + return True + except Exception: + return False + return False + +def _mgpu_video_temp_dir_for(scene, use_target_dir=True): + out_path = _mgpu_video_output_path(scene) or "mgpu_video" + base = os.path.splitext(os.path.basename(out_path))[0] or "render" + safe = re.sub(r"[^A-Za-z0-9._-]+", "_", base) + h = hashlib.md5(out_path.encode("utf-8", "ignore")).hexdigest()[:8] + if use_target_dir: + out_dir = os.path.dirname(out_path) + if out_dir: + return os.path.join(out_dir, f"{safe}_TEMP") + return os.path.join(tempfile.gettempdir(), f"mgpu_frames_{safe}_{h}") + +def _mgpu_overwrite_warnings(scene, is_video, temp_dir=None): + warnings = [] + if is_video: + out_path = _mgpu_video_output_path(scene) + if out_path and os.path.exists(out_path): + warnings.append(f"Output file exists: {out_path}") + else: + first_frame = _mgpu_first_frame_path(scene) + if first_frame and os.path.exists(first_frame): + warnings.append(f"Output frame exists: {first_frame}") + if first_frame and _mgpu_sequence_exists(first_frame): + warnings.append(f"Existing frame files detected in: {os.path.dirname(first_frame)}") + if temp_dir and _mgpu_dir_has_entries(temp_dir): + warnings.append(f"Temp frame folder has files: {temp_dir}") + return warnings + +def _mgpu_has_mari_addon(): + mari_mod = None + try: + for mod in addon_utils.modules(): + if getattr(mod, "addon_prefix", None) == "mari": + mari_mod = mod + break + bi = getattr(mod, "bl_info", {}) or {} + if (bi.get("name") or "").strip().lower() == "mari advanced": + mari_mod = mod + break + except Exception: + pass + if not mari_mod: + return False + try: + name = getattr(mari_mod, "__name__", None) + if name: + _loaded, enabled = addon_utils.check(name) + return bool(enabled) + except Exception: + pass + return False + +def _mgpu_enabled_addons_snapshot(): + """Capture add-ons currently enabled in this Blender session.""" + records = [] + names = [] + try: + prefs_addons = getattr(bpy.context.preferences, "addons", None) + if prefs_addons is not None: + names.extend(list(prefs_addons.keys())) + except Exception: + pass + + try: + for meta in addon_utils.modules(): + mod_name = getattr(meta, "__name__", None) + if not mod_name: + continue + enabled = False + try: + state = addon_utils.check(mod_name) + if isinstance(state, tuple): + enabled = any(bool(v) for v in state) + else: + enabled = bool(state) + except Exception: + enabled = False + if enabled: + names.append(mod_name) + except Exception: + pass + + dedup = [] + seen = set() + for n in names: + if not n or n in seen: + continue + seen.add(n) + src = "" + is_pkg = False + try: + mod = sys.modules.get(n) + if mod is None: + for meta in addon_utils.modules(): + if getattr(meta, "__name__", None) == n: + mod = meta + break + src = str(getattr(mod, "__file__", "") or "") + if src: + src = os.path.abspath(src) + is_pkg = os.path.basename(src).lower() == "__init__.py" + except Exception: + src = "" + is_pkg = False + rec = {"module": n} + if src: + rec["file"] = src + rec["is_package"] = bool(is_pkg) + records.append(rec) + return records + +def _mgpu_enabled_addon_module_names(records): + names = [] + seen = set() + for entry in (records or []): + if isinstance(entry, str): + mod_name = str(entry or "") + elif isinstance(entry, dict): + mod_name = str(entry.get("module") or "") + else: + mod_name = "" + if not mod_name or mod_name in seen: + continue + seen.add(mod_name) + names.append(mod_name) + return names + +def _proc_rss_bytes(): + if IS_WIN: + try: + import ctypes, ctypes.wintypes as wt + class PROCESS_MEMORY_COUNTERS(ctypes.Structure): + _fields_ = [ + ("cb", wt.DWORD), ("PageFaultCount", wt.DWORD), + ("PeakWorkingSetSize", ctypes.c_size_t), ("WorkingSetSize", ctypes.c_size_t), + ("QuotaPeakPagedPoolUsage", ctypes.c_size_t), ("QuotaPagedPoolUsage", ctypes.c_size_t), + ("QuotaPeakNonPagedPoolUsage", ctypes.c_size_t), ("QuotaNonPagedPoolUsage", ctypes.c_size_t), + ("PagefileUsage", ctypes.c_size_t), ("PeakPagefileUsage", ctypes.c_size_t), + ] + GetProcessMemoryInfo = ctypes.windll.psapi.GetProcessMemoryInfo + GetCurrentProcess = ctypes.windll.kernel32.GetCurrentProcess + h = GetCurrentProcess() + counters = PROCESS_MEMORY_COUNTERS() + counters.cb = ctypes.sizeof(PROCESS_MEMORY_COUNTERS) + if GetProcessMemoryInfo(h, ctypes.byref(counters), counters.cb): + return int(counters.WorkingSetSize) + except Exception: + return None + else: + try: + import resource + r = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss + if IS_MAC: + return int(r) + return int(r * 1024) + except Exception: + return None + +def _sys_mem_available_bytes(): + if IS_WIN: + try: + import ctypes, ctypes.wintypes as wt + class MEMORYSTATUSEX(ctypes.Structure): + _fields_ = [ + ("dwLength", wt.DWORD), + ("dwMemoryLoad", wt.DWORD), + ("ullTotalPhys", ctypes.c_ulonglong), + ("ullAvailPhys", ctypes.c_ulonglong), + ("ullTotalPageFile", ctypes.c_ulonglong), + ("ullAvailPageFile", ctypes.c_ulonglong), + ("ullTotalVirtual", ctypes.c_ulonglong), + ("ullAvailVirtual", ctypes.c_ulonglong), + ("ullAvailExtendedVirtual", ctypes.c_ulonglong), + ] + stat = MEMORYSTATUSEX() + stat.dwLength = ctypes.sizeof(MEMORYSTATUSEX) + ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(stat)) + return int(stat.ullAvailPhys) + except Exception: + return None + try: + import psutil + return int(psutil.virtual_memory().available) + except Exception: + return None + +# ----------------------- GPU detection ----------------------- + +def _normalize_gpu_name(n: str) -> str: + n = (n or "") + n = re.sub(r"\s*\(Display.*?\)", "", n) + n = n.replace("NVIDIA", "").replace("GeForce", "").strip() + return re.sub(r"\s+", " ", n) + +def _normalize_pci_bus_id(raw: str) -> str: + s = (str(raw or "").strip().lower()) + if not s: + return "" + m = re.search(r"([0-9a-f]{4,8})?:?([0-9a-f]{1,2}):([0-9a-f]{1,2})(?:\.([0-7]))?", s) + if not m: + return "" + dom = (m.group(1) or "00000000") + if len(dom) == 4: + dom = "0000" + dom + elif len(dom) < 8: + dom = dom.rjust(8, "0") + bus = m.group(2).rjust(2, "0") + dev = m.group(3).rjust(2, "0") + fn = m.group(4) or "0" + return f"{dom}:{bus}:{dev}.{fn}" + +def _extract_pci_bus_id_from_dev(dev) -> str | None: + pat = re.compile(r"(?:^|[_\s:])([0-9A-Fa-f]{4,8}:[0-9A-Fa-f]{1,2}:[0-9A-Fa-f]{1,2}(?:\.[0-7])?)") + for field in (getattr(dev, "id", ""), getattr(dev, "name", "")): + m = pat.search(str(field) or "") + if m: + norm = _normalize_pci_bus_id(m.group(1)) + if norm: + return norm + return None + +def _win_query_nvidia_smi_detailed(): + if not IS_WIN: + return None + try: + out = subprocess.check_output( + ["nvidia-smi", "--query-gpu=index,uuid,pci.bus_id,name", "--format=csv,noheader"], + encoding="utf-8", errors="ignore" + ) + phys = [] + for line in out.strip().splitlines(): + parts = [p.strip() for p in line.split(",")] + if len(parts) >= 4: + idx = int(parts[0]) + uuid = parts[1] + bus = _normalize_pci_bus_id(parts[2]) or parts[2].lower() + name = ",".join(parts[3:]).strip() + phys.append({"index": idx, "uuid": uuid, "bus": bus, "name": name}) + return phys + except Exception: + return None + +def _dev_key(name: str, bus: str) -> tuple: + bus = _normalize_pci_bus_id(bus) + if bus: + return ("bus", bus) + return ("name", _normalize_gpu_name(name)) + +# LEGACY: broad scan (often contains 'ghost' GPU) +def _detect_gpu_devices_legacy(selected_only=False): + cp = _cycles_prefs() + if not cp: + return [] + backend = getattr(cp, "compute_device_type", None) + try: + cp.refresh_devices() + except Exception: + pass + + devs = [] + for d in getattr(cp, "devices", []): + if getattr(d, "type", "") != backend: + continue + sel = bool(getattr(d, "use", False)) + if selected_only and not sel: + continue + devs.append(d) + + if not devs: + return [] + + phys = _win_query_nvidia_smi_detailed() + out = [] + if phys: + bus_to_idx = {g["bus"]: g["index"] for g in phys} + used = set() + matched_dev_ids = set() + # Pass 1: bus + for d in devs: + bus = _extract_pci_bus_id_from_dev(d) + if bus and bus in bus_to_idx: + idx = bus_to_idx[bus]; used.add(idx) + out.append((idx, getattr(d,"name","?"), backend, bool(getattr(d,"use",False)), bus)) + matched_dev_ids.add(id(d)) + # Pass 2: name fallback + for d in devs: + if id(d) in matched_dev_ids: + continue + dn = _normalize_gpu_name(getattr(d,"name","")) + cand = None + for g in phys: + if g["index"] in used: continue + if _normalize_gpu_name(g["name"]) == dn: + cand = g; break + if cand: + out.append((cand["index"], getattr(d,"name","?"), backend, bool(getattr(d,"use",False)), cand["bus"])) + used.add(cand["index"]) + else: + out.append((999, getattr(d,"name","?"), backend, bool(getattr(d,"use",False)), _extract_pci_bus_id_from_dev(d) or "")) + out.sort(key=lambda t: (t[0]==999, t[0])) + return out + + return [(i, getattr(d,"name","?"), backend, bool(getattr(d,"use",False)), _extract_pci_bus_id_from_dev(d) or "") for i,d in enumerate(devs)] + +def _detect_gpu_devices_strict(selected_only=True): + cp = _cycles_prefs() + if not cp: + return [] + backend = getattr(cp, "compute_device_type", None) + try: + cp.refresh_devices() + except Exception: + pass + + devs = [] + for d in getattr(cp, "devices", []): + if getattr(d, "type", "") != backend: + continue + sel = bool(getattr(d, "use", False)) + if selected_only and not sel: + continue + devs.append(d) + + if not devs: + return [] + + phys = _win_query_nvidia_smi_detailed() + out = [] + if phys: + bus_to_idx = {g["bus"]: g["index"] for g in phys} + used = set() + for d in devs: + bus = _extract_pci_bus_id_from_dev(d) + if bus and bus in bus_to_idx: + idx = bus_to_idx[bus]; used.add(idx) + out.append((idx, getattr(d,"name","?"), backend, True, bus)) + else: + dn = _normalize_gpu_name(getattr(d,"name","")) + cand = None + for g in phys: + if g["index"] in used: continue + if _normalize_gpu_name(g["name"]) == dn: + cand = g; break + if cand: + used.add(cand["index"]) + out.append((cand["index"], getattr(d,"name","?"), backend, True, cand["bus"])) + else: + out.append((999, getattr(d,"name","?"), backend, True, _extract_pci_bus_id_from_dev(d) or "")) + out.sort(key=lambda t: (t[0]==999, t[0])) + return out + + return [(i, getattr(d,"name","?"), backend, True, _extract_pci_bus_id_from_dev(d) or "") for i,d in enumerate(devs)] + +def _multiset_subtract(primary_list, subtract_list): + sub_counts = Counter(_dev_key(name, bus) for (_i, name, _t, _sel, bus) in subtract_list) + result = [] + for tpl in primary_list: + (_i, name, _t, _sel, bus) = tpl + k = _dev_key(name, bus) + if sub_counts[k] > 0: + sub_counts[k] -= 1 + else: + result.append(tpl) + return result + +def _dedupe_selection_by_bus(rows): + rows = list(rows or []) + if not rows: + return rows + phys = _win_query_nvidia_smi_detailed() or [] + phys_name_by_bus = { + _normalize_pci_bus_id(g.get("bus")): _normalize_gpu_name(g.get("name")) + for g in phys + if _normalize_pci_bus_id(g.get("bus")) + } + out = [] + bus_pos = {} + for row in rows: + try: + idx, name, backend, selected, bus = row + except Exception: + out.append(row) + continue + nbus = _normalize_pci_bus_id(bus) + if not nbus: + out.append(row) + continue + phys_norm = phys_name_by_bus.get(nbus, "") + cur_norm = _normalize_gpu_name(name) + + def _score(_row, _norm): + try: + _idx, _name, _backend, _selected, _bus = _row + except Exception: + return -999 + s = 0 + if bool(_selected): + s += 2 + if _idx != 999: + s += 1 + if _norm and _normalize_gpu_name(_name) == _norm: + s += 4 + return s + + if nbus not in bus_pos: + bus_pos[nbus] = len(out) + out.append((idx, name, backend, selected, nbus)) + continue + + pos = bus_pos[nbus] + prev = out[pos] + if _score((idx, name, backend, selected, nbus), phys_norm) > _score(prev, phys_norm): + out[pos] = (idx, name, backend, selected, nbus) + return out + +def _detect_gpu_devices_final_from_lists(mode: str, legacy, strict): + legacy = list(legacy or []) + strict = list(strict or []) + if mode == "LEGACY_ONLY": + return _dedupe_selection_by_bus(legacy) + if mode == "STRICT_ONLY": + return _dedupe_selection_by_bus(strict) + if mode == "LEGACY_MINUS_STRICT": + return _dedupe_selection_by_bus(_multiset_subtract(legacy, strict)) + + final = _multiset_subtract(strict, legacy) + # Safety: never silently drop explicitly selected strict GPUs. + if strict and len(final) < len(strict): + return _dedupe_selection_by_bus(strict) + return _dedupe_selection_by_bus(final) + +def _detect_gpu_devices_final(mode: str = "STRICT_MINUS_LEGACY"): + """ + mode: + - 'STRICT_MINUS_LEGACY' -> strict(all) minus legacy(ghost) [default] + - 'LEGACY_MINUS_STRICT' -> legacy minus strict + - 'STRICT_ONLY' -> just strict + - 'LEGACY_ONLY' -> just legacy + """ + strict = _detect_gpu_devices_strict(selected_only=True) + legacy = _detect_gpu_devices_legacy(selected_only=False) + return _detect_gpu_devices_final_from_lists(mode, legacy, strict) + +def _cycles_device_snapshot(): + cp = _cycles_prefs() + if not cp: + return {"backend": None, "rows": []} + backend = getattr(cp, "compute_device_type", None) + try: + cp.refresh_devices() + except Exception: + pass + rows = [] + for d in getattr(cp, "devices", []): + rows.append({ + "name": getattr(d, "name", "?"), + "type": getattr(d, "type", "?"), + "use": bool(getattr(d, "use", False)), + "bus": _extract_pci_bus_id_from_dev(d) or "", + "id": str(getattr(d, "id", "") or ""), + }) + return {"backend": backend, "rows": rows} + +# -------- map selection to physical UUIDs -------- + +def _map_selection_to_uuids(sel_tuples): + phys = _win_query_nvidia_smi_detailed() + if not phys: + out = [] + for (idx, name, _t, _sel, bus) in sel_tuples: + out.append({ + "index": idx, "name": name, "cycles_name": name, + "bus": _normalize_pci_bus_id(bus) or bus or "", "uuid": None, + "phys_index": idx if idx != 999 else None + }) + return out + + bus_map = {g["bus"]: g for g in phys} + name_buckets = {} + for g in phys: + name_buckets.setdefault(_normalize_gpu_name(g["name"]), []).append(g) + + used_ids = set() + out = [] + + for (idx, name, _t, _sel, bus) in sel_tuples: + bus = _normalize_pci_bus_id(bus) or (bus or "") + g = None + if bus and bus in bus_map and bus_map[bus]["uuid"] not in used_ids: + g = bus_map[bus] + if (g is None) and (idx is not None) and isinstance(idx, int): + for cand in phys: + if cand["index"] == idx and cand["uuid"] not in used_ids: + g = cand; break + if g is None: + nb = name_buckets.get(_normalize_gpu_name(name), []) + for cand in nb: + if cand["uuid"] not in used_ids: + g = cand; break + + if g: + used_ids.add(g["uuid"]) + out.append({ + "index": g["index"], + # Prefer physical inventory naming from nvidia-smi. + "name": g.get("name") or name, + "cycles_name": name, + "bus": g["bus"], + "uuid": g["uuid"], + "phys_index": g["index"], + }) + else: + out.append({ + "index": idx, "name": name, "cycles_name": name, + "bus": bus or "", "uuid": None, "phys_index": None + }) + + return out + +def _filter_known_mapped_gpus(mapped): + """Hide unresolved mapped entries (phys_index=None => shown as '?').""" + keep = [] + dropped = [] + for m in list(mapped or []): + if m.get("phys_index") is None: + dropped.append(m) + else: + keep.append(m) + return keep, dropped + +BANNER_ASCII = r""" + + + + + + + + +▒▒▒▒▒▒▒▒▒▒▒ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ +▒▌▄ ███ ▄▐▒ ░█░█░███░█░░███░█████░███░███░█░ +▒▌█▌███▐█▐▒ ░█░█░█░█░█░░█░█░█░█░█░█░█░█░█░█░ +▒▌█▌███▐█▐▒ ░███░█░█░█░░█░█░█░█░█░███░██░░█░ +▒▌█▌███▐█▐▒ ░█░█░█░█░█░░█░█░█░█░█░█░█░█░█░█░ +▒▌█▌███▐█▐▒ ░█░█░███░██░███░█░█░█░█░█░█░█░█░ +▒▌▀ ███ ▀▐▒ ░▒░▒░▒▒▒░▒▒░▒▒▒░▒░▒░▒░▒░▒░▒░▒░▒░ +▒▒▒▒▒▒▒▒▒▒▒ BLENDER MULTI-INSTANCE RENDERER + +[[Provided By HoloMARI - Holographic Media Creators Platform]] + +Check our Holographic image rendering/sharing at: holomari.com + + +""" + +# Manager-side diagnostics console banner (line 3 labels this as manager console). +BANNER_MANAGER_ASCII = "\n\nRENDER MANAGER CONSOLE\n\n" + BANNER_ASCII.lstrip("\n") +_WORKER_BANNER_REPEAT_EVERY_LINES = 30 +_WORKER_BANNER_REPEAT_TEXT = BANNER_ASCII.lstrip("\n").rstrip("\n") + "\n" + +# ----------------------- child script ----------------------- + +_CHILD_SCRIPT_SRC = r""" +import bpy, sys, json, socket, os, re, time, traceback +try: + import addon_utils +except Exception: + addon_utils = None + +# Make all prints flush immediately so the parent can time frames +try: + sys.stdout.reconfigure(line_buffering=True, write_through=True) +except Exception: + pass + +HOST = "127.0.0.1" +args = sys.argv[sys.argv.index("--")+1:] if "--" in sys.argv else [] +def _argval(flag, default=None): + if flag in args: + i = args.index(flag) + return args[i+1] if i+1 < len(args) else default + return default + +PORT = int(_argval("--mgpu-port", "0")) +TOKEN = _argval("--mgpu-token", "") +TAG = _argval("--mgpu-tag", "worker") +DEVICE = _argval("--mgpu-device", None) +FALLBACK_DEVICE = _argval("--mgpu-fallback-device", "") +TARGET_GPU_BUS = _argval("--mgpu-gpu-bus", "") or "" +TARGET_GPU_NAME = _argval("--mgpu-gpu-name", "") or "" +THREADS = int(_argval("--mgpu-threads", "0") or "0") +USECPU = int(_argval("--mgpu-usecpu", "0") or "0") +DENOISE_GPU = int(_argval("--mgpu-denoise-gpu", "1") or "1") +PERSIST = int(_argval("--mgpu-persistent", "1") or "1") +MODE = _argval("--mgpu-mode", "FRAMES") +SRC_DIR = _argval("--src-dir", "") or "" +SEQ_DIR = _argval("--mgpu-seq-dir", "") or "" +SEQ_FMT = (_argval("--mgpu-seq-format", "PNG") or "PNG").upper() +SEQ_EXT = (_argval("--mgpu-seq-ext", ".png") or ".png").strip() or ".png" +if not SEQ_EXT.startswith("."): + SEQ_EXT = "." + SEQ_EXT +PRECHECKED_EXISTING = int(_argval("--mgpu-prechecked-existing", "0") or "0") +ADDONS_FILE = _argval("--mgpu-enabled-addons-file", "") or "" + + +MARI_PATH = _argval("--mari-path", "") + +def _normalize_gpu_name(n): + n = str(n or "") + n = n.replace("NVIDIA", "").replace("GeForce", "").strip() + n = re.sub(r"\s+", " ", n) + return n.lower() + +def _normalize_pci_bus_id(raw): + s = (str(raw or "").strip().lower()) + if not s: + return "" + m = re.search(r"([0-9a-f]{4,8})?:?([0-9a-f]{1,2}):([0-9a-f]{1,2})(?:\.([0-7]))?", s) + if not m: + return "" + dom = (m.group(1) or "00000000") + if len(dom) == 4: + dom = "0000" + dom + elif len(dom) < 8: + dom = dom.rjust(8, "0") + bus = m.group(2).rjust(2, "0") + dev = m.group(3).rjust(2, "0") + fn = m.group(4) or "0" + return f"{dom}:{bus}:{dev}.{fn}" + +def _extract_pci_bus_id_from_dev(dev): + pat = re.compile(r"([0-9A-Fa-f]{4,8}:[0-9A-Fa-f]{1,2}:[0-9A-Fa-f]{1,2}(?:\.[0-7])?)") + for field in (getattr(dev, "id", ""), getattr(dev, "name", "")): + m = pat.search(str(field) or "") + if m: + norm = _normalize_pci_bus_id(m.group(1)) + if norm: + return norm + return "" + +def _addon_record_fields(entry): + if isinstance(entry, str): + return entry, "", False + if isinstance(entry, dict): + return ( + str(entry.get("module") or ""), + str(entry.get("file") or ""), + bool(entry.get("is_package", False)), + ) + return "", "", False + +def _load_addon_from_source(mod_name, src_path, is_package=False): + try: + import importlib.util + if not mod_name or not src_path: + return False + src_path = os.path.abspath(src_path) + if os.path.isdir(src_path): + is_package = True + init_path = os.path.join(src_path, "__init__.py") + if not os.path.isfile(init_path): + return False + spec = importlib.util.spec_from_file_location( + mod_name, init_path, submodule_search_locations=[src_path] + ) + elif is_package or os.path.basename(src_path).lower() == "__init__.py": + pkg_dir = os.path.dirname(src_path) + spec = importlib.util.spec_from_file_location( + mod_name, src_path, submodule_search_locations=[pkg_dir] + ) + else: + spec = importlib.util.spec_from_file_location(mod_name, src_path) + if not spec or not spec.loader: + return False + mod = sys.modules.get(mod_name) + if mod is None: + mod = importlib.util.module_from_spec(spec) + sys.modules[mod_name] = mod + spec.loader.exec_module(mod) + if hasattr(mod, "register"): + try: + mod.register() + except Exception: + pass + return True + except Exception: + return False + +def _enable_parent_addons(): + activated = [] + if not ADDONS_FILE or not addon_utils: + return activated + try: + with open(ADDONS_FILE, "r", encoding="utf-8") as fp: + payload = json.load(fp) + mods = payload.get("addons", []) if isinstance(payload, dict) else payload + if not isinstance(mods, (list, tuple)): + mods = [] + req = len(mods) + ok = 0 + fail = 0 + loaded_from_source = 0 + already_enabled = 0 + for entry in mods: + mod_name, src_path, is_package = _addon_record_fields(entry) + if not mod_name: + continue + try: + st = addon_utils.check(mod_name) + if isinstance(st, tuple) and any(bool(v) for v in st): + ok += 1 + already_enabled += 1 + activated.append(mod_name) + continue + except Exception: + pass + try: + addon_utils.enable(mod_name, default_set=False, persistent=False) + ok += 1 + activated.append(mod_name) + except Exception: + if _load_addon_from_source(mod_name, src_path, is_package=is_package): + ok += 1 + loaded_from_source += 1 + activated.append(mod_name) + else: + fail += 1 + print(f"[MGPU-CHILD] Add-on sync: requested={req} enabled={ok} already_enabled={already_enabled} loaded_from_source={loaded_from_source} failed={fail}") + sys.stdout.flush() + except Exception as e: + print(f"[MGPU-CHILD] WARNING: addon sync failed: {e}") + sys.stdout.flush() + return activated + +_SYNCED_ADDON_MODULES = _enable_parent_addons() + +try: + ops = dir(bpy.ops.mari) + print("[MGPU-CHILD] bpy.ops.mari ->", ", ".join(ops)) +except Exception: + print("[MGPU-CHILD] bpy.ops.mari namespace missing") + +if MARI_PATH: + try: + if MARI_PATH not in sys.path: + sys.path.insert(0, MARI_PATH) + try: + import holo_mari_addon as _hma + except Exception: + import importlib.util + p = os.path.join(MARI_PATH, "__init__.py") + spec = importlib.util.spec_from_file_location("holo_mari_addon", p) + _hma = importlib.util.module_from_spec(spec) + sys.modules["holo_mari_addon"] = _hma + spec.loader.exec_module(_hma) + if hasattr(_hma, "register"): + _hma.register() + _SYNCED_ADDON_MODULES.append("holo_mari_addon") + print("[MGPU-CHILD] Loaded MARI addon from path:", MARI_PATH); sys.stdout.flush() + except Exception as e: + print("[MGPU-CHILD] ERROR loading MARI addon path:", e); sys.stdout.flush() + + + + +def _ensure_threads(): + try: + if THREADS and THREADS > 0: + try: + bpy.context.preferences.system.threads = THREADS + except Exception: + pass + except Exception: + pass + +_ensure_threads() + +def _scene_override_kwargs(scn): + kw = {} + if scn is None: + return kw + kw["scene"] = scn + try: + vls = getattr(scn, "view_layers", None) + if vls: + active_name = "" + try: + active_name = str(getattr(bpy.context.view_layer, "name", "") or "") + except Exception: + active_name = "" + if active_name and active_name in vls: + kw["view_layer"] = vls[active_name] + else: + kw["view_layer"] = vls[0] + except Exception: + pass + return kw + +def _run_with_scene_override(scn, fn): + kw = _scene_override_kwargs(scn) + if kw: + try: + ctx = bpy.context.temp_override(**kw) + except Exception: + ctx = None + if ctx is not None: + with ctx: + return fn() + win = getattr(bpy.context, "window", None) + prev_scene = None + try: + if win and scn is not None: + prev_scene = win.scene + win.scene = scn + except Exception: + prev_scene = None + try: + return fn() + finally: + try: + if win and prev_scene is not None: + win.scene = prev_scene + except Exception: + pass + +def _handler_matches_modules(handler, modules): + hmod = str(getattr(handler, "__module__", "") or "") + if not hmod: + return False + for mod_name in (modules or []): + mod_name = str(mod_name or "") + if mod_name and (hmod == mod_name or hmod.startswith(mod_name + ".")): + return True + return False + +def _replay_addon_load_post_handlers(modules): + mods = [str(m or "") for m in (modules or []) if str(m or "")] + if not mods: + return + try: + handlers = list(getattr(bpy.app.handlers, "load_post", []) or []) + except Exception: + handlers = [] + if not handlers: + return + + filepath = bpy.data.filepath or "" + called = 0 + failed = 0 + for handler in handlers: + if not callable(handler) or not _handler_matches_modules(handler, mods): + continue + try: + handler(filepath) + called += 1 + except TypeError: + try: + handler() + called += 1 + except Exception as e: + failed += 1 + print(f"[MGPU-CHILD] WARNING: load_post replay failed for {getattr(handler, '__name__', '')}: {e}") + sys.stdout.flush() + except Exception as e: + failed += 1 + print(f"[MGPU-CHILD] WARNING: load_post replay failed for {getattr(handler, '__name__', '')}: {e}") + sys.stdout.flush() + if called or failed: + print(f"[MGPU-CHILD] load_post replay: called={called} failed={failed} modules={len(mods)}") + sys.stdout.flush() + +def _replay_addon_scene_handlers(handler_name, scn, modules): + mods = [str(m or "") for m in (modules or []) if str(m or "")] + if not scn or not mods: + return + try: + handlers = list(getattr(bpy.app.handlers, handler_name, []) or []) + except Exception: + handlers = [] + for handler in handlers: + if not callable(handler) or not _handler_matches_modules(handler, mods): + continue + try: + _run_with_scene_override(scn, lambda _h=handler: _h(scn)) + except TypeError: + try: + _run_with_scene_override(scn, lambda _h=handler: _h()) + except Exception as e: + print(f"[MGPU-CHILD] WARNING: {handler_name} replay failed for {getattr(handler, '__name__', '')}: {e}") + sys.stdout.flush() + except Exception as e: + print(f"[MGPU-CHILD] WARNING: {handler_name} replay failed for {getattr(handler, '__name__', '')}: {e}") + sys.stdout.flush() + +def _force_scene_refresh(scn, frame=None): + if scn is None: + return + try: + target = int(scn.frame_current if frame is None else frame) + except Exception: + try: + target = int(scn.frame_current) + except Exception: + target = 0 + + try: + cur = int(scn.frame_current) + except Exception: + cur = target + + def _apply(): + try: + if cur == target: + alt = target - 1 + try: + start = int(getattr(scn, "frame_start", target)) + end = int(getattr(scn, "frame_end", target)) + if alt < start and (target + 1) <= end: + alt = target + 1 + if alt != target and start <= alt <= end: + try: + scn.frame_set(alt, subframe=0.0) + except TypeError: + scn.frame_set(alt) + except Exception: + pass + try: + scn.frame_set(target, subframe=0.0) + except TypeError: + scn.frame_set(target) + except Exception: + pass + + try: + bpy.context.view_layer.update() + except Exception: + pass + try: + deps = bpy.context.evaluated_depsgraph_get() + upd = getattr(deps, "update", None) + if callable(upd): + upd() + except Exception: + pass + try: + _replay_addon_scene_handlers("frame_change_post", scn, _SYNCED_ADDON_MODULES) + except Exception: + pass + + _run_with_scene_override(scn, _apply) + +_replay_addon_load_post_handlers(_SYNCED_ADDON_MODULES) + +try: + scn0 = bpy.context.scene + if scn0: + _force_scene_refresh(scn0, scn0.frame_current) +except Exception: + pass + +# Cycles device setup: +# - GPU workers must stay on GPU (no silent CPU fallback). +# - If OptiX cannot enable devices, try CUDA as a fallback backend. +def _configure_cycles_devices(): + try: + prefs = bpy.context.preferences.addons['cycles'].preferences + except Exception as e: + print(f"[MGPU-CHILD] WARNING: Cycles preferences unavailable: {e}") + sys.stdout.flush() + # For GPU workers, missing Cycles prefs must be treated as failure to + # prevent silent CPU rendering. + return bool(USECPU) + + scn = bpy.context.scene + if USECPU: + try: + scn.cycles.device = 'CPU' + except Exception: + pass + try: + prefs.refresh_devices() + except Exception: + pass + cpu_enabled = 0 + for d in getattr(prefs, "devices", []): + try: + dtype = str(getattr(d, "type", "") or "").upper() + if dtype == "CPU": + d.use = True + cpu_enabled += 1 + else: + d.use = False + except Exception: + pass + print(f"[MGPU-CHILD] Cycles device setup: mode=CPU cpu_enabled={cpu_enabled}") + sys.stdout.flush() + return (cpu_enabled > 0) + + # GPU worker path + try: + scn.cycles.device = 'GPU' + except Exception: + pass + + wanted = str(DEVICE or "").upper() + fallback = str(FALLBACK_DEVICE or "").upper() + target_bus = _normalize_pci_bus_id(TARGET_GPU_BUS) + target_name_norm = _normalize_gpu_name(TARGET_GPU_NAME) + attempts = [] + if wanted: + attempts.append(wanted) + if fallback and fallback not in attempts: + attempts.append(fallback) + if not attempts: + attempts = ["CUDA"] + + for backend in attempts: + try: + prefs.compute_device_type = backend + except Exception as e: + print(f"[MGPU-CHILD] Cycles backend set failed for {backend}: {e}") + sys.stdout.flush() + continue + try: + prefs.refresh_devices() + except Exception as e: + print(f"[MGPU-CHILD] Cycles refresh failed for {backend}: {e}") + sys.stdout.flush() + continue + + candidates = [] + for d in getattr(prefs, "devices", []): + try: + dtype = str(getattr(d, "type", "") or "").upper() + if dtype == "CPU": + d.use = False + continue + if dtype != backend: + d.use = False + continue + bus = _extract_pci_bus_id_from_dev(d) + name = str(getattr(d, "name", dtype)) + candidates.append((d, bus, name, dtype)) + except Exception: + pass + + selected = [] + # Primary selector: PCI bus id (stable and unique per physical GPU). + if target_bus: + for (d, bus, name, _dtype) in candidates: + use_this = bool(bus and bus == target_bus) + d.use = use_this + if use_this: + selected.append((bus, name)) + + # Secondary selector: normalized device name (only if bus match failed). + if (not selected) and target_name_norm: + picked = False + for (d, _bus, name, _dtype) in candidates: + use_this = (not picked) and (_normalize_gpu_name(name) == target_name_norm) + d.use = use_this + if use_this: + selected.append((_bus, name)) + picked = True + + # Last resort: if only one candidate exists for this backend, use it. + if (not selected) and len(candidates) == 1: + d, bus, name, _dtype = candidates[0] + d.use = True + selected.append((bus, name)) + print(f"[MGPU-CHILD] Cycles selector fallback: single-candidate backend={backend} bus={bus or '-'} name={name}") + sys.stdout.flush() + + # If no explicit selector was passed, keep previous behavior (all backend devices). + if (not target_bus) and (not target_name_norm): + selected = [] + for (d, bus, name, _dtype) in candidates: + d.use = True + selected.append((bus, name)) + + enabled = len(selected) + names = [n for (_b, n) in selected] + print( + f"[MGPU-CHILD] Cycles device setup: backend={backend} enabled_gpu={enabled} names={names} " + f"target_bus={target_bus or '-'} target_name={TARGET_GPU_NAME or '-'}" + ) + sys.stdout.flush() + if enabled > 0: + if wanted and backend != wanted: + print(f"[MGPU-CHILD] Cycles backend fallback: requested={wanted} active={backend}") + sys.stdout.flush() + return True + else: + cands = [f"{b or '-'}:{n}" for (_d, b, n, _t) in candidates] + print(f"[MGPU-CHILD] Cycles selector no-match for backend={backend}; candidates={cands}") + sys.stdout.flush() + + print(f"[MGPU-CHILD] ERROR: No GPU devices enabled for backends={attempts}; CPU fallback disabled for GPU worker.") + sys.stdout.flush() + return False + +_CYCLES_READY = _configure_cycles_devices() + +def _enforce_cycles_scene_device(scn): + try: + if not scn or scn.render.engine != "CYCLES": + return + scn.cycles.device = 'CPU' if USECPU else 'GPU' + except Exception: + pass + +try: + for _scn in list(getattr(bpy.data, "scenes", []) or []): + _enforce_cycles_scene_device(_scn) +except Exception: + pass + +def _cycles_runtime_report(): + rep = { + "scene_device": None, + "compute_device_type": None, + "cpu_enabled": None, + "gpu_enabled": 0, + "enabled": [], + } + try: + scn = bpy.context.scene + rep["scene_device"] = str(getattr(getattr(scn, "cycles", None), "device", "") or "").upper() + except Exception: + pass + try: + prefs = bpy.context.preferences.addons['cycles'].preferences + rep["compute_device_type"] = str(getattr(prefs, "compute_device_type", "") or "").upper() + try: + prefs.refresh_devices() + except Exception: + pass + cpu_enabled = False + gpu_enabled = 0 + enabled = [] + for d in getattr(prefs, "devices", []): + try: + use = bool(getattr(d, "use", False)) + dtype = str(getattr(d, "type", "") or "").upper() + name = str(getattr(d, "name", dtype)) + if not use: + continue + enabled.append(f"{dtype}:{name}") + if dtype == "CPU": + cpu_enabled = True + else: + gpu_enabled += 1 + except Exception: + pass + rep["cpu_enabled"] = cpu_enabled + rep["gpu_enabled"] = gpu_enabled + rep["enabled"] = enabled + except Exception as e: + rep["error"] = str(e) + return rep + +def _cycles_policy_ok(require_gpu): + rep = _cycles_runtime_report() + if require_gpu: + ok = ( + rep.get("scene_device") == "GPU" and + int(rep.get("gpu_enabled", 0) or 0) > 0 and + not bool(rep.get("cpu_enabled")) + ) + else: + ok = (rep.get("scene_device") == "CPU" and bool(rep.get("cpu_enabled"))) + return ok, rep + +def _ensure_cycles_policy(require_gpu, phase): + ok, rep = _cycles_policy_ok(require_gpu) + if ok: + return True, rep + try: + _configure_cycles_devices() + except Exception: + pass + try: + _enforce_cycles_scene_device(bpy.context.scene) + except Exception: + pass + ok2, rep2 = _cycles_policy_ok(require_gpu) + if ok2: + print(f"[MGPU-CHILD] Cycles policy recovered at {phase}: {rep2}") + sys.stdout.flush() + return True, rep2 + print(f"[MGPU-CHILD] GPU_POLICY_VIOLATION at {phase}: {rep2}") + sys.stdout.flush() + return False, rep2 + +def _set_enum_if_valid(owner, prop_name, value): + try: + prop = owner.bl_rna.properties.get(prop_name) + if not prop: + return False + items = [e.identifier for e in prop.enum_items] + if value in items: + setattr(owner, prop_name, value) + return True + except Exception: + pass + return False + +def _configure_cycles_denoiser(): + try: + scn = bpy.context.scene + except Exception: + return + if not scn or scn.render.engine != "CYCLES": + return + if not bool(DENOISE_GPU): + print("[MGPU-CHILD] Cycles denoise policy: disabled by add-on setting.") + sys.stdout.flush() + return + if bool(USECPU): + print("[MGPU-CHILD] Cycles denoise policy: CPU worker, leaving denoiser unchanged.") + sys.stdout.flush() + return + + changed = [] + try: + c = scn.cycles + except Exception: + c = None + if c is not None: + try: + if bool(getattr(c, "use_denoising", False)): + if _set_enum_if_valid(c, "denoiser", "OPTIX"): + changed.append("scene.cycles.denoiser=OPTIX") + except Exception: + pass + try: + if bool(getattr(c, "use_preview_denoising", False)): + if _set_enum_if_valid(c, "preview_denoiser", "OPTIX"): + changed.append("scene.cycles.preview_denoiser=OPTIX") + except Exception: + pass + + try: + for vl in list(getattr(scn, "view_layers", []) or []): + vc = getattr(vl, "cycles", None) + if not vc: + continue + if bool(getattr(vc, "use_denoising", False)): + if _set_enum_if_valid(vc, "denoiser", "OPTIX"): + changed.append(f"view_layer[{vl.name}].cycles.denoiser=OPTIX") + except Exception: + pass + + if changed: + print(f"[MGPU-CHILD] Cycles denoise policy: GPU denoiser configured ({'; '.join(changed)}).") + else: + print("[MGPU-CHILD] Cycles denoise policy: no active denoiser properties changed.") + sys.stdout.flush() + +try: + if bpy.context.scene and bpy.context.scene.render.engine == "CYCLES": + _configure_cycles_denoiser() + print(f"[MGPU-CHILD] Cycles runtime report(init): {_cycles_runtime_report()}"); sys.stdout.flush() +except Exception: + pass + +try: + bpy.context.scene.render.use_persistent_data = bool(PERSIST) +except Exception: + pass + +# If we are building a video in the parent, workers render a temp image sequence. +try: + if MODE == "FRAMES" and SEQ_DIR: + os.makedirs(SEQ_DIR, exist_ok=True) + scn = bpy.context.scene + try: + scn.render.image_settings.color_mode = "RGBA" + except Exception: + pass + try: + if hasattr(scn.render.image_settings, "media_type"): + scn.render.image_settings.media_type = "IMAGE" + except Exception: + pass + scn.render.filepath = os.path.join(SEQ_DIR, "frame_") + try: + scn.render.use_file_extension = True + except Exception: + pass +except Exception as e: + print(f"[MGPU-CHILD] WARNING: sequence bootstrap setup failed: {e}"); sys.stdout.flush() + +# --- Rebase MARI output folder to original .blend directory --- +try: + scn = bpy.context.scene + prop = getattr(scn, "mari_props", None) + if prop: + raw = getattr(prop, "render_settings_filepath", "") or "" + name = getattr(prop, "render_settings_name", "") or "" + rebased = raw + # If Blender-style relative path ("//..."), rebase against SRC_DIR + if raw.startswith("//") and SRC_DIR: + rebased = os.path.normpath(os.path.join(SRC_DIR, raw[2:])) + else: + # Resolve any other path using Blender's abspath (will be absolute already) + rebased = bpy.path.abspath(raw) + # Ensure a trailing separator + if not rebased.endswith(os.sep): + rebased += os.sep + # Persist back so ALL operators (including bpy.ops.mari.render_one) use the corrected absolute path + prop.render_settings_filepath = rebased + print(f"[MGPU-CHILD] Rebased MARI output dir to: {rebased} (name='{name}')"); sys.stdout.flush() +except Exception as e: + print("[MGPU-CHILD] WARNING: Could not rebase MARI output path:", e); sys.stdout.flush() + +def _mari_ext_from_settings(scn): + # Match MARI add-on's extension mapping so filenames match everywhere + ff = scn.render.image_settings.file_format.lower() + if ff == "ffmpeg": + # MARI uses ffmpeg.format to decide container (e.g. mkv) + fmt = scn.render.ffmpeg.format + return {"MPEG1":"mpeg1","MPEG2":"mpeg2","MPEG4":"mp4","AVI":"avi","QUICKTIME":"mov", + "DV":"dv","OGG":"ogg","MKV":"mkv","FLASH":"flv","WEBM":"webm"}.get(fmt, "mkv") + return { + "jpeg":"jpeg","jpeg_2000":"jpeg","iris":"rgb", + "targa":"tga","targa_raw":"tga","cineon":"cin", + "open_exr":"exr","open_exr_multilayer":"exr", + "tiff":"tif","avi_jpeg":"avi","avi_raw":"avi", + "png":"png","bmp":"bmp" + }.get(ff, ff) + +def _fix_mari_still_output_name(scn, H, V): + try: + prop = getattr(scn, "mari_props", None) + if not prop: + return + + base_dir = bpy.path.abspath(getattr(prop, "render_settings_filepath", "")) + name = (getattr(prop, "render_settings_name", "") or "").strip() + if not (base_dir and name): + return + if not base_dir.endswith(os.sep): + base_dir += os.sep + + root = os.path.join(base_dir, name) + if not os.path.isdir(root): + return + + ext = (_mari_ext_from_settings(scn) or "").lower().lstrip(".") + if not ext: + return + + stem = f"{name}_H{int(H)}_V{int(V)}" + final_path = os.path.join(root, f"{stem}.{ext}") + + candidates = [] + for fname in os.listdir(root): + full = os.path.join(root, fname) + if not os.path.isfile(full): + continue + fstem, fext = os.path.splitext(fname) + if fext.lower().lstrip(".") != ext: + continue + if not fstem.startswith(stem): + continue + suffix = fstem[len(stem):] + if suffix and len(suffix) >= 3 and suffix.isdigit(): + candidates.append(full) + + if os.path.isfile(final_path) and os.path.getsize(final_path) > 0: + for extra in candidates: + try: + os.remove(extra) + except Exception: + pass + return + + if not candidates: + return + + candidates.sort(key=lambda p: os.path.getmtime(p), reverse=True) + os.replace(candidates[0], final_path) + for extra in candidates[1:]: + try: + os.remove(extra) + except Exception: + pass + except Exception: + pass + +def _prime_mari_output_for_frame(scn, H, V, action): + prop = getattr(scn, "mari_props", None) + if not prop: + return + + base_dir = bpy.path.abspath(prop.render_settings_filepath) + if not base_dir.endswith(os.sep): + base_dir += os.sep + name = prop.render_settings_name + ext = _mari_ext_from_settings(scn) + + # Root "\\" + root = os.path.join(base_dir, name) + os.makedirs(root, exist_ok=True) + + # For image-sequence ANIM, make the per-camera folder and let Blender append frame numbers (NAME_0001, NAME_0002 ...) + if action == "ANIM" and scn.render.image_settings.file_format.lower() != "ffmpeg": + cam_dir = os.path.join(root, f"{name}_H{int(H)}_V{int(V)}") + os.makedirs(cam_dir, exist_ok=True) + scn.render.filepath = os.path.join(cam_dir, f"{name}_") + elif action == "STILL": + scn.render.filepath = os.path.join(root, f"{name}_H{int(H)}_V{int(V)}") + else: + # Video ANIM: point to final video base (per camera) + scn.render.filepath = os.path.join(root, f"{name}_H{int(H)}_V{int(V)}") + try: + scn.render.use_file_extension = True + except Exception: + pass + +def jsend(sock, obj): + sock.sendall((json.dumps(obj) + "\n").encode("utf-8", "ignore")) + +def jrecv(sock): + buf = b"" + while b"\n" not in buf: + chunk = sock.recv(4096) + if not chunk: + raise ConnectionError("server closed") + buf += chunk + line, rest = buf.split(b"\n", 1) + return json.loads(line.decode("utf-8", "ignore")) + +def _proj_bar(done, total, width=30): + try: + total = int(total) + done = max(0, int(done)) + if total <= 0: + return "[------------------------------]", 0.0 + ratio = min(1.0, done / float(total)) + filled = int(round(width * ratio)) + return "[" + ("#" * filled) + ("-" * (width - filled)) + "]", ratio * 100.0 + except Exception: + return "[------------------------------]", 0.0 + +def _proj_print(H, V, elapsed, glb): + # glb carries per-job globals from the parent; we extend it in step 4 + total = int(glb.get("proj_total") or 0) + done_before = int(glb.get("proj_done") or 0) + done_now = min(total, done_before + 1) if total > 0 else (done_before + 1) + bar, pct = _proj_bar(done_now, total) + try: + h = int(H) + except Exception: + h = H + try: + v = int(V) + except Exception: + v = V + print(f"[MGPU-PROJ] H{h}_V{v} | {float(elapsed):.2f}s | {bar} {pct:.1f}% ({done_now}/{total})") + sys.stdout.flush() + +def _safe_out_path(scn, n): + # Native Blender path for frame n + try: + p = scn.render.frame_path(frame=n) + return bpy.path.abspath(p) + except Exception: + base = bpy.path.abspath(scn.render.filepath) + if "#" in base: + hashes = len(re.search(r"(#+)", base).group(1)) + return re.sub(r"(#+)", str(n).zfill(hashes), base) + else: + root, ext = os.path.splitext(base) + if not ext: + ext = "." + (scn.render.file_extension or "png") + return f"{root}{str(n).zfill(4)}{ext}" + +def _scene_expected_image_size(scn): + try: + pct = float(getattr(scn.render, "resolution_percentage", 100) or 100.0) + w = int(round(float(scn.render.resolution_x) * pct / 100.0)) + h = int(round(float(scn.render.resolution_y) * pct / 100.0)) + if w > 0 and h > 0: + return (w, h) + except Exception: + pass + return None + +def _is_valid_render_output(path, expected_size=None): + try: + if os.path.getsize(path) <= 0: + return False + except Exception: + return False + + img = None + try: + img = bpy.data.images.load(path, check_existing=False) + size = getattr(img, "size", None) + if not (size and size[0] > 0 and size[1] > 0): + return False + if expected_size: + try: + exp_w = int(expected_size[0]); exp_h = int(expected_size[1]) + return int(size[0]) == exp_w and int(size[1]) == exp_h + except Exception: + return False + return True + except Exception: + return False + finally: + if img is not None: + try: + bpy.data.images.remove(img) + except Exception: + pass + +def _render_meta(rendered=False, skipped=False, elapsed=0.0): + try: + elapsed = float(elapsed or 0.0) + except Exception: + elapsed = 0.0 + return { + "rendered": bool(rendered), + "skipped": bool(skipped), + "elapsed": elapsed, + } + +_MARI_RENDER_ONE_STATUS_KEY = "_mari_render_one_status" + +def _mari_read_render_status(scn): + raw = "" + try: + raw = str(scn.get(_MARI_RENDER_ONE_STATUS_KEY, "") or "").upper() + except Exception: + raw = "" + return { + "status": raw, + "rendered": raw == "RENDERED", + "skipped": raw == "SKIPPED", + } + +_SEQ_DIRECT_SAVE = False +_SEQ_DIRECT_SAVE_LOGGED = False + +def _render_result_image(): + img = bpy.data.images.get("Render Result") + if img is not None: + return img + for candidate in bpy.data.images: + try: + if getattr(candidate, "type", "") == "RENDER_RESULT": + return candidate + except Exception: + continue + return None + +def _save_render_result_to_file(out_path, file_format="PNG"): + img = _render_result_image() + if img is None: + raise RuntimeError("Render Result image not found after frame render.") + prev_raw = getattr(img, "filepath_raw", "") + prev_fmt = getattr(img, "file_format", "PNG") + try: + os.makedirs(os.path.dirname(out_path), exist_ok=True) + except Exception: + pass + try: + img.filepath_raw = out_path + except Exception: + img.filepath = out_path + try: + img.file_format = str(file_format or "PNG").upper() + except Exception: + img.file_format = "PNG" + img.save() + try: + img.filepath_raw = prev_raw + except Exception: + pass + try: + img.file_format = prev_fmt + except Exception: + pass + +def _render_frame_via_sandbox(main_scene, out_path, frame): + global _SEQ_DIRECT_SAVE, _SEQ_DIRECT_SAVE_LOGGED + prev_fp = main_scene.render.filepath + prev_use_ext = getattr(main_scene.render, "use_file_extension", True) + img = main_scene.render.image_settings + prev_fmt = getattr(img, "file_format", "PNG") + prev_mode = getattr(img, "color_mode", "RGBA") + prev_depth = getattr(img, "color_depth", "8") + prev_comp = getattr(img, "compression", 15) + prev_media = getattr(img, "media_type", None) if hasattr(img, "media_type") else None + try: + # Render from the real scene so scene-bound add-ons keep their state. + _force_scene_refresh(main_scene, frame) + + use_direct_save = bool(_SEQ_DIRECT_SAVE) + if not use_direct_save: + try: + img.file_format = SEQ_FMT + img.color_mode = "RGBA" + img.color_depth = "16" + img.compression = 0 + try: + if hasattr(img, "media_type"): + img.media_type = "IMAGE" + except Exception: + pass + except Exception as fmt_err: + use_direct_save = True + _SEQ_DIRECT_SAVE = True + if not _SEQ_DIRECT_SAVE_LOGGED: + print( + f"[MGPU-CHILD] {TAG} WARN: temp frame format {SEQ_FMT} unavailable on scene render settings; " + f"using Render Result direct-save fallback ({fmt_err})" + ) + sys.stdout.flush() + _SEQ_DIRECT_SAVE_LOGGED = True + + main_scene.render.filepath = os.path.splitext(out_path)[0] + try: + main_scene.render.use_file_extension = True + except Exception: + pass + + if use_direct_save: + _run_with_scene_override( + main_scene, + lambda: bpy.ops.render.render(write_still=False, animation=False, use_viewport=False), + ) + _save_render_result_to_file(out_path, file_format=SEQ_FMT) + return {'FINISHED'} + + return _run_with_scene_override( + main_scene, + lambda: bpy.ops.render.render(write_still=True, animation=False, use_viewport=False), + ) + finally: + main_scene.render.filepath = prev_fp + try: + main_scene.render.use_file_extension = prev_use_ext + except Exception: + pass + try: + img.file_format = prev_fmt + except Exception: + pass + try: + img.color_mode = prev_mode + except Exception: + pass + try: + img.color_depth = prev_depth + except Exception: + pass + try: + img.compression = prev_comp + except Exception: + pass + try: + if hasattr(img, "media_type") and prev_media is not None: + img.media_type = prev_media + except Exception: + pass + +def render_frame(n): + scn = bpy.context.scene + expected_size = _scene_expected_image_size(scn) + if scn.render.engine == "CYCLES": + _enforce_cycles_scene_device(scn) + if not _CYCLES_READY: + return False, "Cycles device setup failed (no eligible GPU/CPU device configured for this worker).", _render_meta() + ok_policy, rep = _ensure_cycles_policy(require_gpu=(not bool(USECPU)), phase=f"pre-frame-{n}") + if not ok_policy: + return False, f"GPU_POLICY_VIOLATION pre-frame-{n}: {rep}", _render_meta() + _force_scene_refresh(scn, n) + + if SEQ_DIR: + out_path = os.path.join(SEQ_DIR, f"frame_{n:04d}{SEQ_EXT}") + if (not PRECHECKED_EXISTING) and (not getattr(scn.render, "use_overwrite", True)): + try: + if os.path.exists(out_path) and _is_valid_render_output(out_path, expected_size=expected_size): + start = time.time() + print(f"[MGPU-CHILD] {TAG} start frame {n} -> {out_path}"); sys.stdout.flush() + elapsed = time.time() - start + print(f"[MGPU-CHILD] {TAG} finished frame {n} ({elapsed:.2f}s) -> {out_path}"); sys.stdout.flush() + return True, "Skipped existing frame (overwrite disabled)", _render_meta(rendered=False, skipped=True, elapsed=elapsed) + except Exception: + pass + try: + os.makedirs(os.path.dirname(out_path), exist_ok=True) + except Exception: + pass + if getattr(scn.render, "use_placeholder", False): + try: + if not os.path.exists(out_path): + with open(out_path, "wb"): + pass + except Exception: + pass + try: + start = time.time() + print(f"[MGPU-CHILD] {TAG} start frame {n} -> {out_path}"); sys.stdout.flush() + _render_frame_via_sandbox(scn, out_path, n) + ok = os.path.exists(out_path) and os.path.getsize(out_path) > 0 + elapsed = time.time() - start + if ok and scn.render.engine == "CYCLES": + ok_policy, rep = _ensure_cycles_policy(require_gpu=(not bool(USECPU)), phase=f"post-frame-{n}") + if not ok_policy: + return False, f"GPU_POLICY_VIOLATION post-frame-{n}: {rep}", _render_meta(rendered=True, elapsed=elapsed) + if ok: + print(f"[MGPU-CHILD] {TAG} finished frame {n} ({elapsed:.2f}s) -> {out_path}"); sys.stdout.flush() + return True, "", _render_meta(rendered=True, elapsed=elapsed) + else: + print(f"[MGPU-CHILD] {TAG} MISSING frame {n} ({elapsed:.2f}s) -> {out_path}"); sys.stdout.flush() + return False, f"Rendered file missing or empty: {out_path}", _render_meta(elapsed=elapsed) + except Exception as e: + print(f"[MGPU-CHILD] {TAG} ERROR frame {n}: {e}"); sys.stdout.flush() + return False, str(e), _render_meta() + + prev_fp = scn.render.filepath + prev_use_ext = getattr(scn.render, "use_file_extension", True) + out_path = _safe_out_path(scn, n) + if (not PRECHECKED_EXISTING) and (not getattr(scn.render, "use_overwrite", True)): + try: + if os.path.exists(out_path) and _is_valid_render_output(out_path, expected_size=expected_size): + start = time.time() + print(f"[MGPU-CHILD] {TAG} start frame {n} -> {out_path}"); sys.stdout.flush() + elapsed = time.time() - start + print(f"[MGPU-CHILD] {TAG} finished frame {n} ({elapsed:.2f}s) -> {out_path}"); sys.stdout.flush() + return True, "Skipped existing frame (overwrite disabled)", _render_meta(rendered=False, skipped=True, elapsed=elapsed) + except Exception: + pass + try: + os.makedirs(os.path.dirname(out_path), exist_ok=True) + except Exception: + pass + if getattr(scn.render, "use_placeholder", False): + try: + if not os.path.exists(out_path): + with open(out_path, "wb"): + pass + except Exception: + pass + + try: + scn.render.filepath = out_path + try: + scn.render.use_file_extension = False # out_path already has extension + except Exception: + pass + + start = time.time() + print(f"[MGPU-CHILD] {TAG} start frame {n} -> {out_path}"); sys.stdout.flush() + _run_with_scene_override( + scn, + lambda: bpy.ops.render.render(animation=False, write_still=True, use_viewport=False), + ) + ok = os.path.exists(out_path) and os.path.getsize(out_path) > 0 + elapsed = time.time() - start + if ok and scn.render.engine == "CYCLES": + ok_policy, rep = _ensure_cycles_policy(require_gpu=(not bool(USECPU)), phase=f"post-frame-{n}") + if not ok_policy: + return False, f"GPU_POLICY_VIOLATION post-frame-{n}: {rep}", _render_meta(rendered=True, elapsed=elapsed) + if ok: + print(f"[MGPU-CHILD] {TAG} finished frame {n} ({elapsed:.2f}s) -> {out_path}"); sys.stdout.flush() + return True, "", _render_meta(rendered=True, elapsed=elapsed) + else: + print(f"[MGPU-CHILD] {TAG} MISSING frame {n} ({elapsed:.2f}s) -> {out_path}"); sys.stdout.flush() + return False, f"Rendered file missing or empty: {out_path}", _render_meta(elapsed=elapsed) + except Exception as e: + print(f"[MGPU-CHILD] {TAG} ERROR frame {n}: {e}"); sys.stdout.flush() + return False, str(e), _render_meta() + finally: + scn.render.filepath = prev_fp + try: + scn.render.use_file_extension = prev_use_ext + except Exception: + pass + +def _ensure_mari_enabled(): + # If we injected a path, we already imported & registered it + if MARI_PATH: + return True + try: + import addon_utils + for m in addon_utils.modules(): + bi = getattr(m, "bl_info", {}) or {} + nm = (bi.get("name") or "").lower() + if "mari" in nm: + addon_utils.enable(m.__name__, default_set=True, persistent=True) + return True + return False + except Exception: + return False + + +def _mari_prop_mode_id(value): + key = str(value or "").upper() + if key == "FRAME": + return "FRAME" + return "CRICLE" + + +def _apply_mari_scene_settings(scn, glb): + prop = getattr(scn, "mari_props", None) + settings = dict(glb.get("mari_settings") or {}) + + try: + if "render_resolution_x" in glb: + scn.render.resolution_x = int(glb.get("render_resolution_x")) + if "render_resolution_y" in glb: + scn.render.resolution_y = int(glb.get("render_resolution_y")) + if "render_resolution_percentage" in glb: + scn.render.resolution_percentage = int(glb.get("render_resolution_percentage")) + except Exception: + pass + + if not prop: + return + + vector_props = ("frame_ratio", "frame_dimensions", "frame_center", "frame_rotation") + for name in vector_props: + if name not in settings: + continue + value = settings.get(name) + try: + setattr(prop, name, tuple(value)) + continue + except Exception: + pass + try: + seq = tuple(value) + cur = getattr(prop, name) + for idx in range(min(len(cur), len(seq))): + cur[idx] = seq[idx] + except Exception: + pass + + scalar_props = ("render_settings_filepath", "render_settings_name", "render_settings_normalize") + for name in scalar_props: + if name not in settings: + continue + try: + setattr(prop, name, settings.get(name)) + except Exception: + pass + + +def _render_mari_job(job, glb): + ''' + job: {"cam_name": str, "H": int, "V": int, ["frame": int]} + glb: {"mode": "FRAME"/"CIRCLE", "action": "STILL"/"ANIM", "is_video": bool} + ''' + try: + if not _ensure_mari_enabled(): + return False, "MARI add-on not enabled in child", _render_meta() + + if not (hasattr(bpy.ops, "mari") and hasattr(bpy.ops.mari, "render_one")): + return False, "bpy.ops.mari.render_one unavailable", _render_meta() + + scn = bpy.context.scene + if scn.render.engine == "CYCLES": + _enforce_cycles_scene_device(scn) + if not _CYCLES_READY: + return False, "Cycles device setup failed (no eligible GPU/CPU device configured for this worker).", _render_meta() + ok_policy, rep = _ensure_cycles_policy(require_gpu=(not bool(USECPU)), phase=f"pre-mari-{job.get('cam_name','?')}") + if not ok_policy: + return False, f"GPU_POLICY_VIOLATION pre-mari: {rep}", _render_meta() + prop = getattr(scn, "mari_props", None) + try: + scn.render.use_overwrite = bool(glb.get("use_overwrite", scn.render.use_overwrite)) + if hasattr(scn.render, "use_placeholder"): + scn.render.use_placeholder = bool(glb.get("use_placeholder", scn.render.use_placeholder)) + except Exception: + pass + try: + _apply_mari_scene_settings(scn, glb) + except Exception: + pass + + cam_name = job.get("cam_name") + cam_obj = bpy.data.objects.get(cam_name) if cam_name else None + if cam_obj: + scn.camera = cam_obj + else: + return False, f"Camera '{cam_name}' not found", _render_meta() + try: + bpy.context.view_layer.update() + except Exception: + pass + + mode_target = _mari_prop_mode_id(glb.get("mode")) + if prop and _mari_prop_mode_id(getattr(prop, "frame", None)) != mode_target: + try: + prop.frame = mode_target + print(f"[MGPU-CHILD] Adjusted MARI mode to {prop.frame}") + except Exception: + pass + + try: + obj = bpy.context.object + if obj and obj.mode != 'OBJECT': + bpy.ops.object.mode_set(mode='OBJECT', toggle=False) + except Exception: + pass + + action = glb.get("action", "STILL") + try: + frame = int(job.get("frame", -1)) + except Exception: + frame = -1 + try: + _force_scene_refresh(scn, (frame if frame >= 0 else scn.frame_current)) + except Exception: + pass + + H = job.get("H") + V = job.get("V") + if prop: + # Ensure per-job paths exist and set filepaths to avoid any spillover across cameras. + _prime_mari_output_for_frame(scn, H, V, action) + try: + scn.render.use_file_extension = True + except Exception: + pass + tag = TAG + start_msg = f"[MGPU-CHILD] {tag} start MARI {action} H{H} V{V}" + if frame >= 0: + start_msg += f" f{frame}" + print(start_msg + f" -> {cam_name}") + st = time.time() + try: + scn[_MARI_RENDER_ONE_STATUS_KEY] = "" + except Exception: + pass + try: + res = _run_with_scene_override( + scn, + lambda: bpy.ops.mari.render_one(camera_name=cam_name, action=action, frame=frame), + ) + except Exception as call_err: + return False, str(call_err), _render_meta() + + ok = (res == {'FINISHED'}) + if ok and scn.render.engine == "CYCLES": + ok_policy, rep = _ensure_cycles_policy( + require_gpu=(not bool(USECPU)), + phase=f"post-mari-{cam_name}-f{frame}" + ) + if not ok_policy: + return False, f"GPU_POLICY_VIOLATION post-mari: {rep}", _render_meta(rendered=True, elapsed=(time.time() - st)) + if ok and action == "STILL": + _fix_mari_still_output_name(scn, H, V) + elapsed = time.time() - st + status = _mari_read_render_status(scn) + fin_msg = f"[MGPU-CHILD] {tag} finished MARI {action} H{H} V{V}" + if frame >= 0: + fin_msg += f" f{frame}" + if ok: + print(fin_msg + f" ({elapsed:.2f}s) -> {cam_name}") + else: + print(fin_msg.replace("finished", "MISSING") + f" ({elapsed:.2f}s) -> {cam_name}") + sys.stdout.flush() + _proj_print(H, V, elapsed, glb) + meta = _render_meta(rendered=status.get("rendered"), skipped=status.get("skipped"), elapsed=elapsed) + return ok, "" if ok else "mari.render_one returned CANCELLED", meta + except Exception as e: + traceback.print_exc() + return False, str(e), _render_meta() + + +# connect to parent scheduler +import socket +sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +_CONNECT_RETRIES = 40 +for attempt in range(_CONNECT_RETRIES): + try: + sock.connect((HOST, PORT)) + break + except Exception as e: + if attempt + 1 == _CONNECT_RETRIES: + raise + print(f"[MGPU-CHILD] {TAG} waiting for scheduler ({attempt+1}/{_CONNECT_RETRIES}): {e}") + time.sleep(0.25) +jsend(sock, {"hello": TAG, "token": TOKEN}) + +while True: + jsend(sock, {"get": True}) + msg = jrecv(sock) + if msg.get("exit"): + print(f"[MGPU-CHILD] {TAG} exit signal received"); sys.stdout.flush() + break + + if MODE == "MARI" and msg.get("mari_job"): + job = msg.get("mari_job") or {} + glb = msg.get("globals") or {} + ok, err, meta = _render_mari_job(job, glb) + if not ok: + print(f"[MGPU-CHILD] {TAG} ERROR MARI job {job.get('cam_name')} f{job.get('frame','-')}: {err}"); sys.stdout.flush() + jsend(sock, {"done": job.get("cam_name"), "ok": bool(ok), "job": job, "err": err, "meta": meta}) + continue + + + # default legacy: frames + if "frame" in msg: + n = int(msg["frame"]) + ok, err, meta = render_frame(n) + jsend(sock, {"done": n, "ok": bool(ok), "err": err, "meta": meta}) + continue + +try: + sock.close() +except Exception: + pass +""" + +def _write_child_script(dirpath): + path = os.path.join(dirpath, "mgpu_worker.py") + with open(path, "w", encoding="utf-8") as f: + f.write(_CHILD_SCRIPT_SRC) + return path + +def _mgpu_scene_expected_image_size(scene): + try: + pct = float(getattr(scene.render, "resolution_percentage", 100) or 100.0) + w = int(round(float(scene.render.resolution_x) * pct / 100.0)) + h = int(round(float(scene.render.resolution_y) * pct / 100.0)) + if w > 0 and h > 0: + return (w, h) + except Exception: + pass + return None + +def _mgpu_existing_file_nonempty(path): + try: + return os.path.isfile(path) and os.path.getsize(path) > 0 + except Exception: + return False + +def _mgpu_validate_existing_image(path, expected_size=None, cache=None): + if cache is not None and path in cache: + return bool(cache[path]) + + ok = False + img = None + try: + if os.path.getsize(path) <= 0: + ok = False + else: + img = bpy.data.images.load(path, check_existing=False) + size = getattr(img, "size", None) + ok = bool(size and size[0] > 0 and size[1] > 0) + if ok and expected_size: + try: + ok = (int(size[0]) == int(expected_size[0]) and int(size[1]) == int(expected_size[1])) + except Exception: + ok = False + except Exception: + ok = False + finally: + if img is not None: + try: + bpy.data.images.remove(img) + except Exception: + pass + if cache is not None: + cache[path] = bool(ok) + return bool(ok) + +def _mgpu_scan_dir_files(dir_path): + index = {} + try: + if not os.path.isdir(dir_path): + return index + with os.scandir(dir_path) as it: + for entry in it: + try: + if not entry.is_file(): + continue + except Exception: + continue + try: + size = int(entry.stat().st_size) + except Exception: + size = -1 + index[entry.name.lower()] = {"path": entry.path, "size": size} + except Exception: + return {} + return index + +def _mgpu_scene_frame_output_path(scene, frame): + try: + return bpy.path.abspath(scene.render.frame_path(frame=int(frame))) + except Exception: + try: + return bpy.path.abspath(scene.render.filepath) + except Exception: + return "" + +def _mgpu_video_seq_frame_path(seq_dir, frame, ext=".png"): + ext = str(ext or ".png").strip() or ".png" + if not ext.startswith("."): + ext = "." + ext + try: + frame_num = int(frame) + except Exception: + frame_num = frame + return os.path.join(seq_dir, f"frame_{frame_num:04d}{ext}") + +def _mgpu_mari_ext_from_scene(scene): + try: + ff = str(scene.render.image_settings.file_format or "").lower() + except Exception: + ff = "" + if ff == "ffmpeg": + try: + fmt = str(scene.render.ffmpeg.format or "") + except Exception: + fmt = "" + return { + "MPEG1": "mpeg1", + "MPEG2": "mpeg2", + "MPEG4": "mp4", + "AVI": "avi", + "QUICKTIME": "mov", + "DV": "dv", + "OGG": "ogg", + "MKV": "mkv", + "FLASH": "flv", + "WEBM": "webm", + }.get(fmt, "mkv") + return { + "jpeg": "jpeg", + "jpeg_2000": "jpeg", + "iris": "rgb", + "targa": "tga", + "targa_raw": "tga", + "cineon": "cin", + "open_exr": "exr", + "open_exr_multilayer": "exr", + "tiff": "tif", + "avi_jpeg": "avi", + "avi_raw": "avi", + "png": "png", + "bmp": "bmp", + }.get(ff, ff) + +def _mgpu_mari_output_root(scene): + try: + prop = getattr(scene, "mari_props", None) + if not prop: + return "", "" + base = bpy.path.abspath(getattr(prop, "render_settings_filepath", "")) + name = str(getattr(prop, "render_settings_name", "") or "").strip() + if not (base and name): + return "", "" + return os.path.join(base, name), name + except Exception: + return "", "" + +def _mgpu_format_hv_label(value): + try: + return str(int(value)) + except Exception: + return str(value) + +def _mgpu_get_vse_strip_collection(se): + if hasattr(se, "strips"): + return se.strips + if hasattr(se, "strips_all"): + return se.strips_all + if hasattr(se, "sequences"): + return se.sequences + if hasattr(se, "sequences_all"): + return se.sequences_all + return None + +def _mgpu_build_video_from_sequence(scene, seq_dir, frames, final_path): + if not frames: + raise RuntimeError("No frames provided to build video.") + + seq_dir = os.path.normpath(seq_dir) + frames = sorted(frames) + + first_name = frames[0] + first_path = os.path.join(seq_dir, first_name) + if not os.path.isfile(first_path): + raise RuntimeError(f"First frame not found: {first_path!r}") + + work_scene = scene + created_scene = False + try: + work_scene = scene.copy() + work_scene.name = "MGPU_TEMP_VSE" + created_scene = True + except Exception: + work_scene = scene + + old_se = work_scene.sequence_editor + old_frame_start = work_scene.frame_start + old_frame_end = work_scene.frame_end + old_filepath = work_scene.render.filepath + old_use_seq = work_scene.render.use_sequencer + old_use_cmp = work_scene.render.use_compositing + + se = old_se if old_se is not None else work_scene.sequence_editor_create() + strip_coll = _mgpu_get_vse_strip_collection(se) + if strip_coll is None: + raise RuntimeError("SequenceEditor has no strips/sequences collection.") + + try: + for s in list(strip_coll): + strip_coll.remove(s) + except Exception: + pass + + strip = None + frame_count = len(frames) + + try: + try: + strip = strip_coll.new_image( + name="MGPU_TEMP_SEQ", + filepath=first_path, + channel=1, + frame_start=old_frame_start, + ) + except TypeError: + strip = strip_coll.new_image("MGPU_TEMP_SEQ", first_path, 1, old_frame_start) + + directory = seq_dir + os.sep if not seq_dir.endswith(os.sep) else seq_dir + strip.directory = directory + if strip.elements: + strip.elements[0].filename = first_name + else: + strip.elements.append(first_name) + + for name in frames[1:]: + strip.elements.append(name) + + strip.frame_start = old_frame_start + strip.frame_final_duration = frame_count + + work_scene.frame_start = old_frame_start + work_scene.frame_end = old_frame_start + frame_count - 1 + work_scene.render.use_sequencer = True + work_scene.render.use_compositing = False + + work_scene.render.filepath = os.path.splitext(final_path)[0] + try: + with bpy.context.temp_override(scene=work_scene, view_layer=work_scene.view_layers[0]): + bpy.ops.render.render(animation=True) + except Exception: + win = bpy.context.window + prev_scene = win.scene if win else None + try: + if win: + win.scene = work_scene + bpy.ops.render.render(animation=True) + finally: + if win and prev_scene: + win.scene = prev_scene + finally: + try: + work_scene.render.filepath = old_filepath + work_scene.frame_start = old_frame_start + work_scene.frame_end = old_frame_end + work_scene.render.use_sequencer = old_use_seq + work_scene.render.use_compositing = old_use_cmp + except Exception: + pass + try: + if strip is not None and strip_coll is not None and hasattr(strip_coll, "remove"): + strip_coll.remove(strip) + except Exception: + pass + if created_scene: + try: + bpy.data.scenes.remove(work_scene) + except Exception: + pass + +# ----------------------- progress parsing (parent side) ----------------------- + +_SAMPLE_RE = re.compile(r"[Ss]amples?\s+(\d+)\s*/\s*(\d+)") +_TILE_RE = re.compile(r"[Tt]iles?\s+(\d+)\s*/\s*(\d+)") +_TILE2_RE = re.compile(r"[Tt]ile\s+(\d+)\s*/\s*(\d+)") +_CHILD_START_RE = re.compile(r"^\[MGPU-CHILD\]\s+(.+?)\s+start\s+frame\s+(\d+)\s+->\s+(.+)$") +_CHILD_FIN_RE = re.compile(r"^\[MGPU-CHILD\]\s+(.+?)\s+finished\s+frame\s+(\d+)\s+\(([\d.]+)s\)\s+->\s+(.+)$") +_CHILD_MISS_RE = re.compile(r"^\[MGPU-CHILD\]\s+(.+?)\s+MISSING\s+frame\s+(\d+)\s+\(([\d.]+)s\)\s+->\s+(.+)$") +_CHILD_MARI_START_RE = re.compile(r"^\[MGPU-CHILD\]\s+(.+?)\s+start\s+MARI\s+(\S+)\s+H(-?\d+)\s+V(-?\d+)(?:\s+f(-?\d+))?\s+->\s+(.+)$") +_CHILD_MARI_FIN_RE = re.compile(r"^\[MGPU-CHILD\]\s+(.+?)\s+finished\s+MARI\s+(\S+)\s+H(-?\d+)\s+V(-?\d+)(?:\s+f(-?\d+))?\s+\(([\d.]+)s\)\s+->\s+(.+)$") +_CHILD_MARI_MISS_RE = re.compile(r"^\[MGPU-CHILD\]\s+(.+?)\s+MISSING\s+MARI\s+(\S+)\s+H(-?\d+)\s+V(-?\d+)(?:\s+f(-?\d+))?\s+\(([\d.]+)s\)\s+->\s+(.+)$") + +def _parse_progress_fields(line: str): + s_cur = s_tot = t_cur = t_tot = None + m = _SAMPLE_RE.search(line) + if m: + try: + s_cur, s_tot = int(m.group(1)), int(m.group(2)) + except Exception: + pass + m2 = _TILE_RE.search(line) or _TILE2_RE.search(line) + if m2: + try: + t_cur, t_tot = int(m2.group(1)), int(m2.group(2)) + except Exception: + pass + return s_cur, s_tot, t_cur, t_tot + +def _progress_percent(s_cur, s_tot, t_cur, t_tot): + if s_cur is not None and s_tot and s_tot > 0: + return max(0.0, min(100.0, (s_cur / s_tot) * 100.0)) + if t_cur is not None and t_tot and t_tot > 0: + return max(0.0, min(100.0, (t_cur / t_tot) * 100.0)) + return None + +def _progress_bar(pct, width=20): + if pct is None: return "-" * width + filled = max(0, min(width, int(round((pct / 100.0) * width)))) + return "#" * filled + "-" * (width - filled) + +# ----------------------- Windows Job Object (kill children on Blender exit) ----------------------- + +_WS_JOB = None +def _win_job_init(): + if not IS_WIN: return None + try: + import ctypes + from ctypes import wintypes as wt + kernel32 = ctypes.windll.kernel32 + CreateJobObjectW = kernel32.CreateJobObjectW + SetInformationJobObject = kernel32.SetInformationJobObject + + class JOBOBJECT_BASIC_LIMIT_INFORMATION(ctypes.Structure): + _fields_ = [ + ("PerProcessUserTimeLimit", ctypes.c_longlong), + ("PerJobUserTimeLimit", ctypes.c_longlong), + ("LimitFlags", wt.DWORD), + ("MinimumWorkingSetSize", ctypes.c_size_t), + ("MaximumWorkingSetSize", ctypes.c_size_t), + ("ActiveProcessLimit", wt.DWORD), + ("Affinity", wt.LPVOID), + ("PriorityClass", wt.DWORD), + ("SchedulingClass", wt.DWORD), + ] + + class IO_COUNTERS(ctypes.Structure): + _fields_ = [ + ("ReadOperationCount", ctypes.c_ulonglong), + ("WriteOperationCount", ctypes.c_ulonglong), + ("OtherOperationCount", ctypes.c_ulonglong), + ("ReadTransferCount", ctypes.c_ulonglong), + ("WriteTransferCount", ctypes.c_ulonglong), + ("OtherTransferCount", ctypes.c_ulonglong), + ] + + class JOBOBJECT_EXTENDED_LIMIT_INFORMATION(ctypes.Structure): + _fields_ = [ + ("BasicLimitInformation", JOBOBJECT_BASIC_LIMIT_INFORMATION), + ("IoInfo", IO_COUNTERS), + ("ProcessMemoryLimit", ctypes.c_size_t), + ("JobMemoryLimit", ctypes.c_size_t), + ("PeakProcessMemoryUsed", ctypes.c_size_t), + ("PeakJobMemoryUsed", ctypes.c_size_t), + ] + + JOB_OBJECT_EXTENDED_LIMIT_INFORMATION = 9 + JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = 0x00002000 + + hJob = CreateJobObjectW(None, None) + if not hJob: + return None + + info = JOBOBJECT_EXTENDED_LIMIT_INFORMATION() + info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE + if not SetInformationJobObject(hJob, JOB_OBJECT_EXTENDED_LIMIT_INFORMATION, + ctypes.byref(info), ctypes.sizeof(info)): + return None + return hJob + except Exception: + return None + +def _win_job_assign(proc): + if not IS_WIN or not proc: return + global _WS_JOB + if _WS_JOB is None: + _WS_JOB = _win_job_init() + if _WS_JOB: + try: + import ctypes + AssignProcessToJobObject = ctypes.windll.kernel32.AssignProcessToJobObject + AssignProcessToJobObject(_WS_JOB, int(proc._handle)) + except Exception: + pass + +# ----------------------- manager / workers ----------------------- + +class Worker: + def __init__(self, tag_label, gpu_uuid, phys_index, instance_index, total_instances, is_cpu=False, gpu_bus="", gpu_name=""): + self.is_cpu = bool(is_cpu) + self.gpu_uuid = gpu_uuid # 'GPU-xxxx...' or None for CPU + self.phys_index = phys_index # physical index for display (int or None) + self.gpu_bus = str(gpu_bus or "") + self.gpu_name = str(gpu_name or "") + self.instance_index = instance_index + self.total_instances = total_instances + self.proc = None + self.stdout_thread = None + self.last_line = "" + self.log_path = None + self._log_fp = None + self.tag = f"{tag_label}-#{instance_index}" + safe = re.sub(r"[^A-Za-z0-9._-]+", "_", self.tag) + if not safe: + safe = f"worker_{instance_index}" + self._file_tag = safe + self._live_line_active = False + self._last_samples = (None, None) # remember for the final 100% line + self.local_frames = [] + + + # terminal tail process (PowerShell/xterm) + self.term_proc = None + + # progress throttling state + self._last_emit_time = 0.0 + self._last_pct = -1.0 + self._last_s_pair = (None, None) + self._last_t_pair = (None, None) + + # per-frame state (for richer messages) + self.cur_frame = None + self.cur_path = None + self.frame_start_time = 0.0 + + # launch diagnostics + self.launch_state = "PLANNED" + self.launch_reason = "planned" + self.launch_detail = "" + self.launch_attempted = False + self.launch_ok = False + self.launch_ts = 0.0 + self.launch_pid = None + self.hello_received = False + self.hello_ts = 0.0 + self.hello_timeout_reported = False + self.exit_before_hello_reported = False + self.guard_last_progress_ts = 0.0 + self.guard_last_progress_sig = None + self.guard_epoch = 0 + self.guard_restart_ts = deque(maxlen=16) + self.guard_restart_marks = [] + self.guard_restarts_total = 0 + self.cycles_backend_override = None + self.cycles_policy_failures = 0 + self.cycles_cpu_hint_ts = 0.0 + self.cycles_cpu_hint_line = "" + self._banner_lines_since_repeat = 0 + + @property + def running(self): + return (self.proc is not None) and (self.proc.poll() is None) + + def open_log(self, path): + dir_path = os.path.dirname(path) + os.makedirs(dir_path, exist_ok=True) + self.log_path = os.path.join(dir_path, f"{self._file_tag}.log") + # UTF-8 with BOM so PS5/PS7 detect UTF-8 and render block glyphs correctly + self._log_fp = open(self.log_path, "w", encoding="utf-8-sig", newline="") + + def alive(self) -> bool: + p = getattr(self, "proc", None) + try: + return (p is not None) and (p.poll() is None) + except Exception: + return False + + + def close_log(self): + try: + if self._log_fp: + self._log_fp.close() + except Exception: + pass + +class MultiGPUManager: + def __init__(self, scene, threads=0, instances_per_gpu=1, dispatch_mode="DYNAMIC", max_retries=2, + open_terms=True, ghost_mode="STRICT_MINUS_LEGACY", use_persistent_data=True, + job_mode="FRAMES", mari_jobs=None, mari_globals=None, render_guard_tier="AGGRESSIVE", + denoise_on_gpu=True): + self.scene = scene + self.device_mode = _current_compute_type() + self.fallback_device_mode = "CUDA" if str(self.device_mode or "").upper() == "OPTIX" else "" + self.cpu_selected = bool(_cycles_cpu_device_selected()) if scene.render.engine == "CYCLES" else False + self.threads = int(threads) + self.instances_per_gpu = max(1, int(instances_per_gpu)) + self.dispatch_mode = dispatch_mode + self.max_retries = max(0, int(max_retries)) + self.open_terms = bool(open_terms) + self.ghost_mode = ghost_mode + self.use_persistent_data = bool(use_persistent_data) + self.denoise_on_gpu = bool(denoise_on_gpu) + + self.job_mode = job_mode # "FRAMES" or "MARI" + self.mari_jobs = list(mari_jobs or []) + self.mari_globals = dict(mari_globals or {}) + self.render_guard_tier = str(render_guard_tier or "AGGRESSIVE").upper() + self.rt_guard_cfg = _rendertime_guard_profile(self.render_guard_tier) + self.rt_guard_enabled = bool(self.rt_guard_cfg.get("enabled", False)) + self.rt_guard_pause_until = 0.0 + self.rt_guard_job_state = {} + self.rt_guard_restart_ts = deque(maxlen=64) + self._worker_hist = {} + self._global_hist = deque(maxlen=80) + self._rt_guard_last_log = {} + self.rt_periodic_recycle_enabled = bool(self.rt_guard_cfg.get("periodic_recycle_enabled", False)) + raw_points = list(self.rt_guard_cfg.get("periodic_recycle_points", []) or []) + cleaned_points = [] + for p in raw_points: + try: + fp = float(p) + if 0.0 < fp < 1.0: + cleaned_points.append(fp) + except Exception: + pass + self.rt_periodic_recycle_points = sorted(set(cleaned_points)) + self.rt_periodic_recycle_seen = set() + self.rt_periodic_recycle_pending = {} + + self.video_mode = False + self.video_seq_dir = None + self.video_seq_format = "PNG" + self.video_seq_ext = ".png" + self.video_output_path = None + self._forced_temp_dir = None + self._preflight_existing_check_done = False + self._skip_video_encode = False + try: + if self.job_mode == "FRAMES": + img = scene.render.image_settings + fmt = str(getattr(img, "file_format", "") or "").upper() + media = str(getattr(img, "media_type", "") or "").upper() + if fmt in VIDEO_FORMATS or media == "VIDEO": + self.video_mode = True + self.video_output_path = bpy.path.abspath(scene.render.filepath) + except Exception: + pass + + if self.job_mode == "FRAMES": + fstart, fend, fstep = scene.frame_start, scene.frame_end, max(1, scene.frame_step) + self.frames = list(range(fstart, fend + 1, fstep)) + self.total_frames = len(self.frames) + self.pending = list(self.frames) + else: + # MARI jobs can be expanded later (per-frame for ANIM) before start() + self.frames = [] + self.total_frames = len(self.mari_jobs) + self.pending = list(self.mari_jobs) + + self.finished = [] + + self.retries = {} + self.finished_set = set() + self.inflight = {} + self.worker_stats = {} + self.total_render_time = 0.0 + self.total_render_count = 0 + self.rt_last_real_completion_ts = 0.0 + + self.temp_dir = None + self.temp_blend = None + self.logs_dir = None + self.cancelled = False + self._lock = threading.Lock() + self._server_sock = None + self._server_thread = None + self._clients = {} + self._token = ''.join(random.choice(string.ascii_letters+string.digits) for _ in range(24)) + self._child_script = None + self._hello_timeout_s = 20.0 + self._launch_events = [] + self._ram_cap_estimate = None + self._ram_cap_note = "" + self._enabled_addon_modules_csv = "" + self._diag_log_path = None + self._diag_log_fp = None + self._diag_term_proc = None + self._diag_term_opened = False + self._diag_buffer = [] + self._selection_warning = False + + self._legacy_detect = _detect_gpu_devices_legacy(False) + self._strict_detect = _detect_gpu_devices_strict(True) + + sel = _detect_gpu_devices_final_from_lists( + self.ghost_mode, self._legacy_detect, self._strict_detect + ) + mapped_all = _map_selection_to_uuids(sel) + mapped, dropped_unknown = _filter_known_mapped_gpus(mapped_all) + if dropped_unknown: + msg = ( + f"[MGPU-GPUSEL] INFO: Hidden {len(dropped_unknown)} unresolved GPU entry(s) " + f"(index='?'). They will not be launched." + ) + _log(msg) + self._diag_write(msg) + for d in dropped_unknown: + self._diag_write( + f"[MGPU-GPUSEL] dropped idx={d.get('index')} bus={d.get('bus') or '-'} " + f"uuid={d.get('uuid') or 'NONE'} name={d.get('name')}" + ) self.workers = [] + if mapped: + for m in mapped: + tag_label = f"GPU{m['phys_index'] if m['phys_index'] is not None else '??'}" + for i in range(1, self.instances_per_gpu + 1): + self.workers.append( + Worker( + tag_label, m["uuid"], m["phys_index"], i, self.instances_per_gpu, is_cpu=False, + gpu_bus=(m.get("bus") or ""), gpu_name=(m.get("name") or "") + ) + ) + + if self.scene.render.engine == "CYCLES": + if self.cpu_selected: + self.workers.append(Worker("CPU", None, None, 1, 1, is_cpu=True)) + _log("[MGPU-LAUNCH] Cycles CPU device is enabled; adding one dedicated CPU worker.") + elif not mapped: + _log("[MGPU-LAUNCH] No mapped GPU workers and Cycles CPU is disabled; CPU fallback is disabled.") + else: + if not mapped: + self.workers.append(Worker("EEVEE", None, 0, 1, 1, is_cpu=False)) + _log("No explicit GPU list for Eevee - running one worker.") + + if self.scene.render.engine == "CYCLES" and not self.workers: + raise RuntimeError( + "No Cycles workers planned. Enable at least one GPU device, or enable CPU in Cycles render devices." + ) + + if self.scene.render.engine == "CYCLES": + _log( + f"[MGPU-LAUNCH] Cycles device policy: requested_backend={self.device_mode} " + f"fallback_backend={self.fallback_device_mode or 'none'} " + f"cpu_selected={'YES' if self.cpu_selected else 'NO'}" + ) + + _log(f"[MGPU-LAUNCH] Worker plan: mapped_gpus={len(mapped)} instances_per_gpu={self.instances_per_gpu} planned_workers={len(self.workers)}") + for w in self.workers: + dev_txt = "CPU" if w.is_cpu else f"GPU idx={w.phys_index if w.phys_index is not None else '?'} uuid={(w.gpu_uuid or 'none')[:24]}" + self._record_launch_event(w, "PLANNED", "WORKER_PLANNED", dev_txt) + self._log_gpu_selection_breakdown(sel, mapped) + + self._rebuild_dispatch_queues() + + if self.rt_guard_enabled: + _log( + f"[MGPU-GUARD] Render-time guard active: tier={self.render_guard_tier} " + f"(soft={self.rt_guard_cfg.get('soft_mult')}x/{int(self.rt_guard_cfg.get('soft_min_s', 0))}s, " + f"hard={self.rt_guard_cfg.get('hard_mult')}x/{int(self.rt_guard_cfg.get('hard_min_s', 0))}s, " + f"warmup_worker={int(self.rt_guard_cfg.get('warmup_per_worker_jobs', 0) or 0)}, " + f"warmup_global={int(self.rt_guard_cfg.get('warmup_completed_jobs', 0) or 0)})" + ) + if self.rt_periodic_recycle_enabled and self.rt_periodic_recycle_points: + pts = ",".join(str(int(round(p * 100.0))) for p in self.rt_periodic_recycle_points) + _log(f"[MGPU-GUARD] Periodic VRAM hygiene restarts enabled at progress points: {pts}%") + else: + _log("[MGPU-GUARD] Render-time guard is OFF.") + + def prepare_blend_copy(self): + if self._forced_temp_dir: + self.temp_dir = self._forced_temp_dir + try: + if os.path.isdir(self.temp_dir) and self.scene.render.use_overwrite: + shutil.rmtree(self.temp_dir, ignore_errors=True) + except Exception: + pass + os.makedirs(self.temp_dir, exist_ok=True) + else: + self.temp_dir = tempfile.mkdtemp(prefix="mgpu_frames_") + self.logs_dir = os.path.join(self.temp_dir, "logs") + os.makedirs(self.logs_dir, exist_ok=True) + self._init_diag_log() + if self.video_mode: + self.video_seq_dir = os.path.join(self.temp_dir, "frames") + os.makedirs(self.video_seq_dir, exist_ok=True) + base = os.path.basename(bpy.data.filepath) or "untitled.blend" + temp_path = os.path.join(self.temp_dir, base) + bpy.ops.wm.save_as_mainfile(filepath=temp_path, copy=True) + self.temp_blend = temp_path + self.src_blend_dir = os.path.dirname(bpy.data.filepath) + self._child_script = _write_child_script(self.temp_dir) + self._enabled_addons_file = None + try: + enabled_addons = _mgpu_enabled_addons_snapshot() + addons_file = os.path.join(self.temp_dir, "enabled_addons.json") + with open(addons_file, "w", encoding="utf-8") as fp: + json.dump({"addons": enabled_addons}, fp) + self._enabled_addons_file = addons_file + self._enabled_addon_modules_csv = ",".join(_mgpu_enabled_addon_module_names(enabled_addons)) + _log(f"Captured {len(enabled_addons)} enabled add-ons for workers.") + except Exception as e: + _log(f"WARN: Failed to capture enabled add-ons: {e}") + _log(f"Prepared temp blend: {self.temp_blend}") + + # Bundle the MARI add-on so child workers load the same version + self._mari_dir = None + if self.job_mode == "MARI": + try: + import importlib, inspect + mari_mod = None + + # 1) Search installed add-ons; import each real module, then look for addon_prefix == "mari" + for meta in addon_utils.modules(): + name = getattr(meta, "__name__", None) + if not name: + continue + try: + mod = importlib.import_module(name) + except Exception: + continue + + # Primary signal: addon declares addon_prefix = "mari" + if getattr(mod, "addon_prefix", None) == "mari": + mari_mod = mod + break + + # Fallback heuristic: any registered classes with bl_idname starting with "mari." + try: + if any( + isinstance(obj, type) and getattr(obj, "bl_idname", "").startswith("mari.") + for obj in mod.__dict__.values() + ): + mari_mod = mod + break + except Exception: + pass + + if mari_mod: + src = os.path.dirname(mari_mod.__file__) + dst = os.path.join(self.temp_dir, "holo_mari_addon") + if os.path.isdir(src): + shutil.copytree(src, dst, ignore=shutil.ignore_patterns("__pycache__", "*.pyc")) + else: + os.makedirs(dst, exist_ok=True) + shutil.copy2(mari_mod.__file__, os.path.join(dst, "__init__.py")) + self._mari_dir = dst + _log(f"Copied MARI addon to: {self._mari_dir}") + else: + _log("WARN: Could not import/locate the MARI add-on; child will not have bpy.ops.mari.*") + + except Exception as e: + _log(f"WARN: Failed to copy MARI add-on: {e}") + + + def _start_server(self): + self._server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self._server_sock.bind(("127.0.0.1", 0)) + self._server_sock.listen(16) + self._server_sock.settimeout(1.0) + self._server_port = self._server_sock.getsockname()[1] + self._server_thread = threading.Thread(target=self._accept_loop, daemon=True) + self._server_thread.start() + _log(f"Scheduler server on port {self._server_port}") + + def _accept_loop(self): + while not self.cancelled: + try: + conn, _addr = self._server_sock.accept() + except socket.timeout: + continue + except Exception: + break + threading.Thread(target=self._client_loop, args=(conn,), daemon=True).start() + + def _client_loop(self, conn): + f = conn.makefile("rwb", buffering=0) + tag = None + def jrecv(): + line = f.readline() + if not line: + raise ConnectionError("client closed") + return json.loads(line.decode("utf-8", "ignore")) + def jsend(obj): + f.write((json.dumps(obj)+"\n").encode("utf-8", "ignore")); f.flush() + + try: + hello = jrecv() + tag = hello.get("hello"); token = hello.get("token") + if token != self._token or not tag: + try: jsend({"exit": True}) + except Exception: pass + f.close(); conn.close(); return + + with self._lock: + self._clients[tag] = (conn, f, jsend, jrecv) + self._mark_worker_connected(tag) + + while not self.cancelled: + msg = jrecv() + if msg.get("get"): + unit = None + send_exit = False + g = None + frame = None + with self._lock: + if self.job_mode == "MARI": + unit = self._next_mari_for_tag(tag) + else: + unit = self._next_frame_for_tag(tag) + if unit is None: + send_exit = True + else: + self._record_inflight(tag, unit) + if self.job_mode == "MARI": + g = dict(self.mari_globals) + g["proj_total"] = getattr(self, "total_frames", 0) + g["proj_done"] = len(self.finished_set) + else: + frame = int(unit) + if send_exit: + try: jsend({"exit": True}) + except Exception: pass + break + if self.job_mode == "MARI": + jsend({"mari_job": unit, "globals": g}) + else: + jsend({"frame": frame}) + continue + + if "done" in msg: + with self._lock: + self._handle_job_done(tag, msg) + continue + + except Exception as e: + _log(f"[client] connection end: {e}") + finally: + if tag: + try: + with self._lock: + cur = self._clients.get(tag) + if cur and cur[0] is conn: + self._clients.pop(tag, None) + except Exception: + pass + try: f.close() + except Exception: pass + try: conn.close() + except Exception: pass + + def _worker_by_tag(self, tag): + for w in self.workers: + if w.tag == tag: + return w + return None + + def _cycles_backend_for_worker(self, w: Worker): + if not w: + return str(self.device_mode or "CUDA").upper() + if w.is_cpu or self.scene.render.engine != "CYCLES": + return str(self.device_mode or "CUDA").upper() + override = str(getattr(w, "cycles_backend_override", "") or "").upper() + if override: + return override + return str(self.device_mode or "CUDA").upper() + + def _cycles_fallback_for_worker(self, w: Worker, primary_backend: str = ""): + if (not w) or w.is_cpu or self.scene.render.engine != "CYCLES": + return "" + primary = str(primary_backend or self._cycles_backend_for_worker(w) or "").upper() + if primary == "OPTIX": + return "CUDA" + return "" + + def _handle_cycles_gpu_policy_failure(self, w: Worker, err_text: str, inflight=None): + if (not w) or w.is_cpu or self.scene.render.engine != "CYCLES": + return False + txt = str(err_text or "") + txt_up = txt.upper() + trigger = ("GPU_POLICY_VIOLATION" in txt_up) or ("CYCLES DEVICE SETUP FAILED" in txt_up) + if not trigger: + return False + + w.cycles_policy_failures = int(getattr(w, "cycles_policy_failures", 0) or 0) + 1 + current_backend = self._cycles_backend_for_worker(w) + switched = False + if current_backend == "OPTIX": + w.cycles_backend_override = "CUDA" + switched = True + + reason = f"cycles-gpu-policy-failure#{w.cycles_policy_failures}" + if switched: + reason += f" backend={current_backend}->CUDA" + _log(f"[MGPU-LAUNCH] {w.tag}: GPU policy violation; switching backend {current_backend} -> CUDA and restarting worker.") + else: + reason += f" backend={self._cycles_backend_for_worker(w)}" + _log(f"[MGPU-LAUNCH] {w.tag}: GPU policy violation persisted on backend={self._cycles_backend_for_worker(w)}; restarting worker.") + + self._diag_write(f"[MGPU-LAUNCH] {w.tag}: err='{txt[:220]}'") + ok = self._restart_worker_same_gpu(w, reason, info=inflight) + if ok: + self._open_diag_terminal_if_needed() + else: + _log(f"[MGPU-LAUNCH] WARNING: restart failed after GPU policy violation for {w.tag}.") + return ok + + def _init_diag_log(self): + if not self.logs_dir: + return + try: + path = os.path.join(self.logs_dir, "_launch_diagnostics.log") + self._diag_log_path = path + self._diag_log_fp = open(path, "w", encoding="utf-8-sig", newline="") + self._diag_log_fp.write(BANNER_MANAGER_ASCII.rstrip("\n") + "\n") + self._diag_log_fp.write("[MGPU-LAUNCH] Diagnostics log initialized.\n") + for line in self._diag_buffer: + self._diag_log_fp.write((line or "").rstrip("\n") + "\n") + self._diag_buffer = [] + # Flush queued events captured before logs_dir existed + for evt in self._launch_events: + msg = f"[MGPU-LAUNCH] {evt.get('tag','?')} {evt.get('state','')}:{evt.get('reason','')}" + det = evt.get("detail") or "" + if det: + msg += f" | {det}" + self._diag_log_fp.write(msg + "\n") + self._diag_log_fp.flush() + except Exception: + self._diag_log_fp = None + + def _diag_write(self, text): + try: + line = (text or "").rstrip("\n") + if self._diag_log_fp: + self._diag_log_fp.write(line + "\n") + self._diag_log_fp.flush() + else: + self._diag_buffer.append(line) + if len(self._diag_buffer) > 300: + self._diag_buffer = self._diag_buffer[-300:] + except Exception: + pass + + def _spawn_tail_terminal(self, log_path: str, enable_vt=False): + if not log_path: + return None + if IS_WIN: + path_ps = str(log_path).replace("'", "''") + vt_block = "" + if enable_vt: + vt_block = ( + "$c='using System; using System.Runtime.InteropServices; " + "public static class VT{" + "[DllImport(\"kernel32.dll\")] public static extern System.IntPtr GetStdHandle(int n); " + "[DllImport(\"kernel32.dll\")] public static extern bool GetConsoleMode(System.IntPtr h, out int m); " + "[DllImport(\"kernel32.dll\")] public static extern bool SetConsoleMode(System.IntPtr h, int m);" + "}'; " + "Add-Type -TypeDefinition $c -ErrorAction SilentlyContinue; " + "$h=[VT]::GetStdHandle(-11); $m=0; [VT]::GetConsoleMode($h,[ref]$m)|Out-Null; " + "[VT]::SetConsoleMode($h, ($m -bor 4)) | Out-Null; " + ) + cmd = ( + "$ErrorActionPreference='SilentlyContinue'; " + + vt_block + + "try{[Console]::OutputEncoding=[Text.UTF8Encoding]::new($true)}catch{}; " + "chcp 65001 | Out-Null; " + "try{$raw=$Host.UI.RawUI; $raw.BackgroundColor='Black'; $raw.ForegroundColor='Red'; Clear-Host}catch{}; " + f"$p='{path_ps}'; Get-Content -LiteralPath $p -Wait" + ) + try: + proc = subprocess.Popen( + ["powershell", "-NoLogo", "-NoProfile", "-Command", cmd], + creationflags=subprocess.CREATE_NEW_CONSOLE + ) + _win_job_assign(proc) + return proc + except Exception: + return None + + if IS_MAC: + path_applescript = str(log_path).replace("\\", "\\\\").replace('"', '\\"') + cmd_prefix = "printf '\\\\033[0;31;40m'; clear; tail -f " + script = ( + 'tell application "Terminal"\n' + f' do script "{cmd_prefix}" & quoted form of POSIX path of "{path_applescript}"\n' + 'end tell' + ) + try: + return subprocess.Popen(["osascript", "-e", script]) + except Exception: + return None + + # Linux / BSD / other POSIX + quoted = shlex.quote(str(log_path)) + tail_cmd = f"printf '\\033[0;31;40m'; clear; tail -f {quoted}" + candidates = [] + if shutil.which("xterm"): + candidates.append(["xterm", "-hold", "-bg", "black", "-fg", "red", "-e", "sh", "-lc", tail_cmd]) + if shutil.which("x-terminal-emulator"): + candidates.append(["x-terminal-emulator", "-e", "sh", "-lc", tail_cmd]) + if shutil.which("gnome-terminal"): + candidates.append(["gnome-terminal", "--", "sh", "-lc", tail_cmd]) + if shutil.which("konsole"): + candidates.append(["konsole", "--hold", "-e", "sh", "-lc", tail_cmd]) + if shutil.which("xfce4-terminal"): + candidates.append(["xfce4-terminal", "--hold", "--command", f"sh -lc {shlex.quote(tail_cmd)}"]) + if shutil.which("mate-terminal"): + candidates.append(["mate-terminal", "--", "sh", "-lc", tail_cmd]) + if shutil.which("lxterminal"): + candidates.append(["lxterminal", "-e", f"sh -lc {shlex.quote(tail_cmd)}"]) + if shutil.which("kitty"): + candidates.append(["kitty", "sh", "-lc", tail_cmd]) + if shutil.which("alacritty"): + candidates.append(["alacritty", "-e", "sh", "-lc", tail_cmd]) + + for argv in candidates: + try: + return subprocess.Popen(argv) + except Exception: + continue + return None + + def _open_diag_terminal_if_needed(self): + if self._diag_term_opened: + return + if (not self.open_terms) or (not self._diag_log_path): + return + self._diag_term_opened = True + self._diag_term_proc = self._spawn_tail_terminal(self._diag_log_path, enable_vt=False) + if self._diag_term_proc is None: + self._diag_term_opened = False + + def _log_gpu_selection_breakdown(self, final_sel, mapped): + mode = self.ghost_mode + snap = _cycles_device_snapshot() + backend = snap.get("backend") + rows = list(snap.get("rows") or []) + if rows: + type_counts = Counter(str(r.get("type") or "?") for r in rows) + cnt_text = ", ".join(f"{k}:{type_counts[k]}" for k in sorted(type_counts.keys())) + sum_msg = f"[MGPU-GPUSEL] cycles backend={backend} rows={len(rows)} by_type=[{cnt_text}]" + _log(sum_msg) + self._diag_write(sum_msg) + for i, r in enumerate(rows): + self._diag_write( + f"[MGPU-GPUSEL] cycles[{i}] type={r.get('type')} use={r.get('use')} " + f"bus={r.get('bus') or '-'} id={r.get('id') or '-'} name={r.get('name')}" + ) + _log( + f"[MGPU-GPUSEL] mode={mode} legacy={len(self._legacy_detect)} strict={len(self._strict_detect)} " + f"final={len(final_sel)} mapped={len(mapped)}" + ) + for i, item in enumerate(final_sel): + idx, name, backend, selected, bus = item + msg = f"[MGPU-GPUSEL] final[{i}] idx={idx} sel={selected} backend={backend} bus={bus or '-'} name={name}" + _log(msg) + self._diag_write(msg) + for i, m in enumerate(mapped): + msg = ( + f"[MGPU-GPUSEL] mapped[{i}] phys_index={m.get('phys_index')} idx={m.get('index')} " + f"bus={m.get('bus') or '-'} uuid={(m.get('uuid') or 'NONE')} " + f"name={m.get('name') or '-'}" + f"{(' cycles_name=' + str(m.get('cycles_name'))) if m.get('cycles_name') else ''}" + ) + _log(msg) + self._diag_write(msg) + if len(final_sel) != len(mapped): + msg = f"[MGPU-GPUSEL] WARNING: final({len(final_sel)}) != mapped({len(mapped)})" + _log(msg) + self._diag_write(msg) + self._selection_warning = True + if len(final_sel) < len(self._strict_detect): + msg = ( + f"[MGPU-GPUSEL] WARNING: strict selected GPUs ({len(self._strict_detect)}) reduced to final ({len(final_sel)}) " + f"by ghost filter mode '{mode}'. STRICT safeguard should prevent launch drops." + ) + _log(msg) + self._diag_write(msg) + self._selection_warning = True + missing_uuid = sum(1 for m in mapped if not m.get("uuid")) + if missing_uuid > 0: + msg = f"[MGPU-GPUSEL] WARNING: {missing_uuid} mapped GPU(s) have no UUID match; launch pinning may be unreliable." + _log(msg) + self._diag_write(msg) + self._selection_warning = True + phys = _win_query_nvidia_smi_detailed() or [] + if phys: + mapped_phys = {m.get("phys_index") for m in mapped if m.get("phys_index") is not None} + backend_rows = [r for r in rows if str(r.get("type")) == str(backend)] + if backend and len(backend_rows) < len(phys): + msg = ( + f"[MGPU-GPUSEL] WARNING: Cycles backend '{backend}' exposes {len(backend_rows)} " + f"device row(s), but nvidia-smi sees {len(phys)} GPU(s)." + ) + _log(msg) + self._diag_write(msg) + self._selection_warning = True + if len(mapped_phys) < len(phys): + phys_idx = {g.get("index") for g in phys if g.get("index") is not None} + missing_idx = sorted([i for i in phys_idx if i not in mapped_phys]) + msg = ( + f"[MGPU-GPUSEL] WARNING: NVIDIA physical GPUs={len(phys)} but mapped GPUs={len(mapped_phys)}. " + f"A GPU may be filtered out by backend/type mismatch or unresolved bus-id mapping." + ) + _log(msg) + self._diag_write(msg) + if missing_idx: + miss_msg = f"[MGPU-GPUSEL] WARNING: unmapped NVIDIA index(es): {','.join(str(i) for i in missing_idx)}" + _log(miss_msg) + self._diag_write(miss_msg) + self._selection_warning = True + for g in phys: + msg = ( + f"[MGPU-GPUSEL] phys idx={g.get('index')} bus={g.get('bus')} " + f"uuid={g.get('uuid')} name={g.get('name')}" + ) + self._diag_write(msg) + + def _record_launch_event(self, w: Worker, state: str, reason: str, detail: str = ""): + w.launch_state = str(state or "") + w.launch_reason = str(reason or "") + w.launch_detail = str(detail or "") + evt = {"tag": w.tag, "state": w.launch_state, "reason": w.launch_reason, "detail": w.launch_detail, "t": time.time()} + self._launch_events.append(evt) + msg = f"[MGPU-LAUNCH] {w.tag} {w.launch_state}: {w.launch_reason}" + if w.launch_detail: + msg += f" | {w.launch_detail}" + _log(msg) + self._diag_write(msg) + try: + self._emit(w, msg + "\n") + except Exception: + pass + if w.launch_state in {"FAILED_TO_LAUNCH", "FAILED_RUNTIME", "STALLING"}: + self._open_diag_terminal_if_needed() + + def _update_ram_capacity_note(self): + rss = _proc_rss_bytes() + avail = _sys_mem_available_bytes() + if rss is None or avail is None: + return + per_child = max(int(rss * 0.8), 512 * 1024 * 1024) + if per_child <= 0: + return + cap = max(1, int(avail // per_child)) + self._ram_cap_estimate = cap + planned = len(self.workers) + if planned > cap: + self._ram_cap_note = ( + f"Planned workers={planned} exceeds rough RAM capacity={cap} " + f"(RSS={_fmt_bytes(rss)}, free={_fmt_bytes(avail)}, per-worker~{_fmt_bytes(per_child)})." + ) + _log(f"[MGPU-LAUNCH] WARN: {self._ram_cap_note}") + + def _mark_worker_connected(self, tag): + w = self._worker_by_tag(tag) + if not w: + return + if not w.hello_received: + w.hello_received = True + w.hello_ts = time.time() + self._record_launch_event(w, "CONNECTED", "WORKER_HELLO_OK", f"pid={w.launch_pid if w.launch_pid is not None else '?'}") + + def _check_launch_health(self): + now = time.time() + for w in self.workers: + if not w.launch_attempted: + continue + p = w.proc + if not p: + continue + try: + rc = p.poll() + except Exception: + rc = None + + if (rc is None) and (not w.hello_received) and w.launch_ts and (now - w.launch_ts > self._hello_timeout_s) and (not w.hello_timeout_reported): + w.hello_timeout_reported = True + self._record_launch_event(w, "STALLING", "NO_HANDSHAKE_TIMEOUT", f"waited>{int(self._hello_timeout_s)}s") + + if (rc is not None) and (not w.hello_received) and (not w.exit_before_hello_reported): + w.exit_before_hello_reported = True + reason = _classify_runtime_exit_reason(getattr(w, "last_line", ""), rc) + self._record_launch_event(w, "FAILED_RUNTIME", reason, f"returncode={rc} last='{(w.last_line or '').strip()[:180]}'") + + def _rebuild_dispatch_queues(self): + if self.dispatch_mode != "STRIDE": + for w in self.workers: + w.local_frames = [] + return + worker_count = max(1, len(self.workers)) + units = list(self.pending) + for idx, w in enumerate(self.workers): + w.local_frames = units[idx::worker_count] + + def _output_spec_for_unit(self, unit): + expected_size = _mgpu_scene_expected_image_size(self.scene) + + if self.job_mode == "MARI": + if not isinstance(unit, dict): + return None + root, name = _mgpu_mari_output_root(self.scene) + ext = (_mgpu_mari_ext_from_scene(self.scene) or "").lower().lstrip(".") + if not (root and name and ext): + return None + action = str(self.mari_globals.get("action", "STILL") or "STILL").upper() + is_video = bool(self.mari_globals.get("is_video", False)) + h_txt = _mgpu_format_hv_label(unit.get("H")) + v_txt = _mgpu_format_hv_label(unit.get("V")) + stem = f"{name}_H{h_txt}_V{v_txt}" + try: + frame = int(unit.get("frame", -1)) + except Exception: + frame = -1 + if action == "ANIM" and (not is_video) and frame >= 0: + return { + "path": os.path.join(root, stem, f"{name}_{frame:04d}.{ext}"), + "kind": "image", + "expected_size": expected_size, + } + if action == "ANIM" and is_video: + start_f = int(getattr(self.scene, "frame_start", 0)) + end_f = int(getattr(self.scene, "frame_end", 0)) + video_stem = f"{name}_{start_f:04d}-{end_f:04d}_H{h_txt}_V{v_txt}" + return { + "path": os.path.join(root, f"{video_stem}.{ext}"), + "kind": "video", + "expected_size": None, + } + return { + "path": os.path.join(root, f"{stem}.{ext}"), + "kind": "image", + "expected_size": expected_size, + } + + try: + frame = int(unit) + except Exception: + frame = unit + if self.video_mode and self.video_seq_dir: + return { + "path": _mgpu_video_seq_frame_path(self.video_seq_dir, frame, self.video_seq_ext), + "kind": "image", + "expected_size": expected_size, + } + return { + "path": _mgpu_scene_frame_output_path(self.scene, frame), + "kind": "image", + "expected_size": expected_size, + } + + def _preflight_existing_outputs(self): + self._preflight_existing_check_done = False + self._skip_video_encode = False + self._rebuild_dispatch_queues() + + if getattr(self.scene.render, "use_overwrite", True): + return + + pending_before = list(self.pending) + total_checked = len(pending_before) + if total_checked <= 0: + return + + if self.job_mode == "FRAMES" and self.video_mode and _mgpu_existing_file_nonempty(self.video_output_path): + reused = 0 + for unit in pending_before: + if self._mark_finished(self._job_key(unit, "FRAMES")): + reused += 1 + self.pending = [] + self._skip_video_encode = True + self._preflight_existing_check_done = True + self._rebuild_dispatch_queues() + msg = ( + f"[MGPU-PREFLIGHT] overwrite=OFF reused existing final video; " + f"checked={total_checked} reusable={reused} pending=0 final={self.video_output_path}" + ) + _log(msg) + self._diag_write(msg) + return + + dir_cache = {} + image_cache = {} + pending_after = [] + reused = 0 + missing = 0 + invalid = 0 + + for unit in pending_before: + spec = self._output_spec_for_unit(unit) + path = os.path.normpath(str((spec or {}).get("path", "") or "")) + if not path: + pending_after.append(unit) + missing += 1 + continue + dir_path = os.path.dirname(path) + base = os.path.basename(path).lower() + if dir_path not in dir_cache: + dir_cache[dir_path] = _mgpu_scan_dir_files(dir_path) + entry = dir_cache[dir_path].get(base) + if not entry: + pending_after.append(unit) + missing += 1 + continue + if int(entry.get("size", -1) or -1) <= 0: + pending_after.append(unit) + invalid += 1 + continue + + kind = str(spec.get("kind", "image") or "image").lower() + if kind == "image": + ok = _mgpu_validate_existing_image( + path, + expected_size=spec.get("expected_size"), + cache=image_cache, + ) + else: + ok = True + + if ok: + if self._mark_finished(self._job_key(unit)): + reused += 1 + else: + pending_after.append(unit) + invalid += 1 + + self.pending = pending_after + self._preflight_existing_check_done = True + if self.job_mode == "FRAMES" and self.video_mode and (not self.pending) and _mgpu_existing_file_nonempty(self.video_output_path): + self._skip_video_encode = True + self._rebuild_dispatch_queues() + + msg = ( + f"[MGPU-PREFLIGHT] overwrite=OFF checked={total_checked} reusable={reused} " + f"pending={len(self.pending)} missing={missing} invalid={invalid} dirs={len(dir_cache)}" + ) + _log(msg) + self._diag_write(msg) + if self.job_mode == "FRAMES" and self.video_mode and (not self.pending) and (not self._skip_video_encode): + enc_msg = ( + f"[MGPU-PREFLIGHT] All temp frames are already valid; final video will be encoded -> " + f"{self.video_output_path}" + ) + _log(enc_msg) + self._diag_write(enc_msg) + + def _next_frame_for_tag(self, tag): + if self.dispatch_mode == "STRIDE": + for w in self.workers: + if w.tag == tag and getattr(w, "local_frames", None) is not None: + while w.local_frames: + frame = w.local_frames.pop(0) + if self._job_key(frame, "FRAMES") in self.finished_set: + continue + return frame + return None + while self.pending: + frame = self.pending.pop(0) + if self._job_key(frame, "FRAMES") in self.finished_set: + continue + return frame + return None + + def _requeue_frame_for_tag(self, tag, frame, prefer_other=False): + if self.dispatch_mode == "STRIDE": + target = None + if prefer_other: + others = [w for w in self.workers if w.tag != tag] + if others: + target = min(others, key=lambda w: len(getattr(w, "local_frames", []) or [])) + if target is None: + for w in self.workers: + if w.tag == tag: + target = w + break + if target: + if getattr(target, "local_frames", None) is None: + target.local_frames = [] + target.local_frames.append(frame) + return + else: + self.pending.insert(0, frame) + + def _next_mari_for_tag(self, tag): + if self.dispatch_mode == "STRIDE": + for w in self.workers: + if w.tag == tag and getattr(w, "local_frames", None) is not None: + # For MARI stride we reuse local_frames to store jobs + while w.local_frames: + job = w.local_frames.pop(0) + if self._job_key(job, "MARI") in self.finished_set: + continue + return job + return None + while self.pending: + job = self.pending.pop(0) + if self._job_key(job, "MARI") in self.finished_set: + continue + return job + return None + + def _requeue_mari_for_tag(self, tag, job, prefer_other=False): + if self.dispatch_mode == "STRIDE": + target = None + if prefer_other: + others = [w for w in self.workers if w.tag != tag] + if others: + target = min(others, key=lambda w: len(getattr(w, "local_frames", []) or [])) + if target is None: + for w in self.workers: + if w.tag == tag: + target = w + break + if target: + if getattr(target, "local_frames", None) is None: + target.local_frames = [] + target.local_frames.append(job) + return + else: + self.pending.insert(0, job) + + def _job_key(self, job, mode=None): + mode = mode or self.job_mode + if mode == "MARI": + if isinstance(job, dict): + cam = job.get("cam_name") or job.get("camera") or job.get("name") or "?" + h = job.get("H") + v = job.get("V") + frame = job.get("frame", None) + try: + frame_val = int(frame) if frame is not None else -1 + except Exception: + frame_val = frame if frame is not None else -1 + return f"mari:{cam}:{h}:{v}:{frame_val}" + return f"mari:{job}" + try: + n = int(job) + except Exception: + n = job + return f"frame:{n}" + + def _job_label(self, job, mode=None): + mode = mode or self.job_mode + if mode == "MARI": + if isinstance(job, dict): + cam = job.get("cam_name") or "?" + frame = job.get("frame", None) + try: + frame_val = int(frame) if frame is not None else -1 + except Exception: + frame_val = frame if frame is not None else -1 + if frame_val is None or frame_val == -1: + return cam + return f"{cam} f{frame_val}" + return str(job) + return f"frame {job}" + + def _record_inflight(self, tag, job): + key = self._job_key(job) + now = time.time() + w = self._worker_by_tag(tag) + progress_ts = now + if w: + w.cycles_cpu_hint_ts = 0.0 + w.cycles_cpu_hint_line = "" + w.guard_last_progress_ts = now + w.guard_last_progress_sig = ("ASSIGN", str(key)) + self.inflight[tag] = { + "job": job, + "key": key, + "start": now, + "stolen": False, + "guard_hedged": False, + "guard_hedge_ts": 0.0, + "guard_last_progress_ts": progress_ts, + "guard_progress_seen": False, + "guard_epoch": int(getattr(w, "guard_epoch", 0) or 0), + } + return key + + def _mark_finished(self, job_key): + if job_key in self.finished_set: + return False + self.finished_set.add(job_key) + self.finished.append(job_key) + self.rt_guard_job_state.pop(job_key, None) + return True + + def _update_worker_avg(self, tag, elapsed): + try: + elapsed = float(elapsed) + except Exception: + return + if elapsed <= 0.0: + return + st = self.worker_stats.get(tag) + if not st: + st = {"count": 0, "avg": 0.0} + count = st["count"] + 1 + avg = (st["avg"] * st["count"] + elapsed) / count + st["count"] = count + st["avg"] = avg + self.worker_stats[tag] = st + self.total_render_time += elapsed + self.total_render_count += 1 + self.rt_last_real_completion_ts = time.time() + try: + self._worker_hist.setdefault(tag, deque(maxlen=12)).append(float(elapsed)) + self._global_hist.append(float(elapsed)) + except Exception: + pass + + def _reset_worker_timing_baseline(self, tag): + self.worker_stats.pop(tag, None) + try: + self._worker_hist[tag] = deque(maxlen=12) + except Exception: + self._worker_hist[tag] = deque(maxlen=12) + + def _avg_for_tag(self, tag): + st = self.worker_stats.get(tag) + if st and st.get("count", 0) > 0: + return st.get("avg", 0.0) + if self.total_render_count > 0: + return self.total_render_time / float(self.total_render_count) + return None + + def _rt_guard_log(self, key: str, msg: str, every_s: float = 20.0, force: bool = False): + now = time.time() + if not force: + last = self._rt_guard_last_log.get(key, 0.0) + if (now - last) < max(0.0, float(every_s)): + return + self._rt_guard_last_log[key] = now + _log(msg) + self._diag_write(msg) + + def _alive_worker_count(self): + n = 0 + for w in self.workers: + try: + if w.alive(): + n += 1 + except Exception: + continue + return n + + def _has_other_alive_worker(self, tag): + for w in self.workers: + if w.tag == tag: + continue + try: + if w.alive(): + return True + except Exception: + continue + return False + + def _rt_pending_count(self): + count = 0 + if self.dispatch_mode == "STRIDE": + for w in self.workers: + for unit in list(getattr(w, "local_frames", []) or []): + try: + if self._job_key(unit) in self.finished_set: + continue + except Exception: + pass + count += 1 + return count + for unit in list(self.pending): + try: + if self._job_key(unit) in self.finished_set: + continue + except Exception: + pass + count += 1 + return count + + def _rt_tail_straggler_ready(self, tag): + # Tail-straggler means this worker is the only remaining inflight job + # and there is no queued work left for anyone else. + if tag not in self.inflight: + return False + if len(self.inflight) != 1: + return False + if self._rt_pending_count() > 0: + return False + others = [w for w in self.workers if w.tag != tag] + if not others: + return False + for ow in others: + try: + st = self.worker_stats.get(ow.tag) or {} + if int(st.get("count", 0) or 0) > 0: + return True + except Exception: + pass + try: + if (ow.tag not in self.inflight) and ow.alive() and bool(getattr(ow, "hello_received", False)): + return True + except Exception: + pass + return False + + def _rt_warmup_state(self, tag): + need_global = int(self.rt_guard_cfg.get("warmup_completed_jobs", 0) or 0) + need_worker = int(self.rt_guard_cfg.get("warmup_per_worker_jobs", 0) or 0) + done_global = int(self.total_render_count or 0) + done_worker = int((self.worker_stats.get(tag) or {}).get("count", 0) or 0) + block_global = (need_global > 0 and done_global < need_global) + block_worker = (need_worker > 0 and done_worker < need_worker) + block = bool(block_global or block_worker) + return { + "block": block, + "done_global": done_global, + "done_worker": done_worker, + "need_global": need_global, + "need_worker": need_worker, + } + + def _rt_activate_periodic_recycle_stages(self): + if (not self.rt_guard_enabled) or (not self.rt_periodic_recycle_enabled): + return + if not self.rt_periodic_recycle_points: + return + total = int(getattr(self, "total_frames", 0) or 0) + if total <= 0: + return + rendered_done = int(self.total_render_count or 0) + min_done = int(self.rt_guard_cfg.get("periodic_recycle_min_completed_jobs", 0) or 0) + if rendered_done < max(0, min_done): + return + progress = float(rendered_done) / float(max(1, total)) + gpu_tags = [w.tag for w in self.workers if not getattr(w, "is_cpu", False)] + if not gpu_tags: + return + for p in self.rt_periodic_recycle_points: + mark = int(round(float(p) * 100.0)) + if mark in self.rt_periodic_recycle_seen: + continue + if progress < float(p): + continue + self.rt_periodic_recycle_seen.add(mark) + self.rt_periodic_recycle_pending[mark] = set(gpu_tags) + self._rt_guard_log( + f"rt-periodic-activate-{mark}", + f"[MGPU-GUARD] Activated VRAM hygiene recycle stage {mark}% " + f"(rendered={rendered_done}/{total}, completed={len(self.finished_set)}/{total}).", + force=True + ) + + def _rt_try_periodic_recycle_after_job(self, tag): + if (not self.rt_guard_enabled) or (not self.rt_periodic_recycle_enabled): + return + self._rt_activate_periodic_recycle_stages() + if not self.rt_periodic_recycle_pending: + return + try: + stages = sorted(self.rt_periodic_recycle_pending.keys()) + except Exception: + stages = list(self.rt_periodic_recycle_pending.keys()) + for stage in stages: + pending = self.rt_periodic_recycle_pending.get(stage) + if not pending: + self.rt_periodic_recycle_pending.pop(stage, None) + continue + if tag not in pending: + continue + w = self._worker_by_tag(tag) + if (not w) or w.is_cpu: + pending.discard(tag) + if not pending: + self.rt_periodic_recycle_pending.pop(stage, None) + continue + now = time.time() + can_restart, why = self._rt_can_restart_worker(w, now) + if not can_restart: + self._rt_guard_log( + f"rt-periodic-skip-{stage}-{tag}", + f"[MGPU-GUARD] {tag}: periodic VRAM recycle {stage}% delayed ({why}).", + every_s=20.0 + ) + return + reason = f"periodic-vram-hygiene-{stage}%" + ok = self._restart_worker_same_gpu(w, reason, info=None) + if ok: + pending.discard(tag) + self._rt_guard_log( + f"rt-periodic-restarted-{stage}-{tag}", + f"[MGPU-GUARD] {tag}: periodic VRAM hygiene restart at {stage}% complete.", + force=True + ) + self._open_diag_terminal_if_needed() + if not pending: + self.rt_periodic_recycle_pending.pop(stage, None) + self._rt_guard_log( + f"rt-periodic-stage-done-{stage}", + f"[MGPU-GUARD] Periodic VRAM hygiene stage {stage}% completed for all GPU workers.", + force=True + ) + else: + self._rt_guard_log( + f"rt-periodic-fail-{stage}-{tag}", + f"[MGPU-GUARD] {tag}: periodic VRAM hygiene restart at {stage}% failed.", + force=True + ) + self._open_diag_terminal_if_needed() + return + + def _rt_baseline_for(self, tag): + min_base = float(self.rt_guard_cfg.get("min_baseline_s", 20.0) or 20.0) + worker_med = _median(self._worker_hist.get(tag, [])) + global_med = _median(self._global_hist) + tag_avg = self._avg_for_tag(tag) + worker_count = int((self.worker_stats.get(tag) or {}).get("count", 0) or 0) + cands = [] + pref = (worker_med, tag_avg) if worker_count > 0 else () + fallback = (global_med,) if worker_count <= 0 else (global_med,) + for v in tuple(pref) + tuple(fallback): + try: + fv = float(v) + if fv > 0: + cands.append(fv) + except Exception: + pass + if not cands: + return min_base + return max(max(cands), min_base) + + def _rt_stall_restart_threshold(self, baseline, soft_th, progress_stall_s): + try: + baseline = float(baseline) + except Exception: + baseline = 0.0 + try: + soft_th = float(soft_th) + except Exception: + soft_th = 0.0 + try: + progress_stall_s = float(progress_stall_s) + except Exception: + progress_stall_s = 0.0 + return max(progress_stall_s * 2.0, min(soft_th if soft_th > 0.0 else progress_stall_s, baseline * 2.5 if baseline > 0.0 else progress_stall_s)) + + def _rt_clean_worker_restart_marks(self, w: Worker): + window_frames = int(self.rt_guard_cfg.get("worker_restart_window_frames", 20) or 20) + kept = [] + for marker in list(getattr(w, "guard_restart_marks", []) or []): + try: + if (int(self.total_render_count) - int(marker)) < window_frames: + kept.append(int(marker)) + except Exception: + pass + w.guard_restart_marks = kept + + def _rt_can_restart_worker(self, w: Worker, now: float): + if (not w) or (not w.alive()): + return (False, "worker-not-alive") + if now < float(getattr(self, "rt_guard_pause_until", 0.0) or 0.0): + return (False, "global-pause") + + global_window = float(self.rt_guard_cfg.get("global_restart_window_s", 150.0) or 150.0) + global_limit = int(self.rt_guard_cfg.get("global_restart_limit", 3) or 3) + while self.rt_guard_restart_ts and ((now - self.rt_guard_restart_ts[0]) > global_window): + self.rt_guard_restart_ts.popleft() + if global_limit > 0 and len(self.rt_guard_restart_ts) >= global_limit: + self.rt_guard_pause_until = now + global_window + self._rt_guard_log( + "rt-global-circuit", + f"[MGPU-GUARD] Global restart circuit open for {int(global_window)}s (limit={global_limit}).", + force=True + ) + self._open_diag_terminal_if_needed() + return (False, "global-circuit") + + cooldown = float(self.rt_guard_cfg.get("worker_restart_cooldown_s", 120.0) or 120.0) + if w.guard_restart_ts and ((now - w.guard_restart_ts[-1]) < cooldown): + return (False, "worker-cooldown") + + self._rt_clean_worker_restart_marks(w) + budget = int(self.rt_guard_cfg.get("worker_restart_budget", 2) or 2) + if budget > 0 and len(w.guard_restart_marks) >= budget: + return (False, "worker-budget") + + return (True, "ok") + + def _duplicate_job_for_hedge(self, tag, job): + if job is None: + return + if self.job_mode == "MARI": + self._requeue_mari_for_tag(tag, job, prefer_other=True) + else: + try: + frame = int(job) + except Exception: + frame = job + self._requeue_frame_for_tag(tag, frame, prefer_other=True) + + def _restart_worker_same_gpu(self, w: Worker, reason: str, info=None): + now = time.time() + if info is None: + info = self.inflight.get(w.tag) + self.inflight.pop(w.tag, None) + + if info: + key = info.get("key") + job = info.get("job") + if job is not None and (not key or key not in self.finished_set): + self._duplicate_job_for_hedge(w.tag, job) + self._rt_guard_log( + f"rt-requeue-{w.tag}", + f"[MGPU-GUARD] {w.tag}: requeued {self._job_label(job)} before restart.", + force=True + ) + + p = getattr(w, "proc", None) + if p and (p.poll() is None): + try: + if IS_WIN: + p.send_signal(signal.CTRL_BREAK_EVENT) + else: + p.terminate() + except Exception: + pass + deadline = time.time() + 2.5 + while (p.poll() is None) and (time.time() < deadline): + time.sleep(0.05) + if p.poll() is None: + try: + p.kill() + except Exception: + pass + + w.proc = None + w.stdout_thread = None + w.launch_ok = False + w.launch_pid = None + w.hello_received = False + w.hello_ts = 0.0 + w.hello_timeout_reported = False + w.exit_before_hello_reported = False + w.guard_epoch = int(getattr(w, "guard_epoch", 0) or 0) + 1 + w.guard_last_progress_ts = now + w.guard_last_progress_sig = ("RESTART", int(now)) + self._reset_worker_timing_baseline(w.tag) + self._record_launch_event(w, "RESTARTING", "RENDERTIME_GUARD", reason) + + ok = self._launch_worker_process(w) + if ok: + w.guard_restart_ts.append(now) + w.guard_restart_marks.append(int(self.total_render_count)) + w.guard_restarts_total += 1 + self.rt_guard_restart_ts.append(now) + return ok + + def _check_render_time_guard(self): + if not self.rt_guard_enabled: + return + cfg = self.rt_guard_cfg + now = time.time() + min_samples_soft = int(cfg.get("min_samples_soft", 3) or 3) + soft_mult = float(cfg.get("soft_mult", 2.5) or 2.5) + soft_min = float(cfg.get("soft_min_s", 60.0) or 60.0) + hard_mult = float(cfg.get("hard_mult", 4.5) or 4.5) + hard_min = float(cfg.get("hard_min_s", 180.0) or 180.0) + progress_stall_s = float(cfg.get("progress_stall_s", 60.0) or 60.0) + hedge_grace_s = float(cfg.get("hedge_grace_s", 45.0) or 45.0) + hedge_max_per_job = int(cfg.get("hedge_max_per_job", 1) or 1) + restart_max_per_job = int(cfg.get("restart_max_per_job", 1) or 1) + single_worker_min_stall = float(cfg.get("single_worker_min_stall_s", 180.0) or 180.0) + snapshots = {} + for tag, info in list(self.inflight.items()): + w = self._worker_by_tag(tag) + if (not w) or (not w.alive()): + continue + key = info.get("key") + if not key: + continue + start = float(info.get("start", now) or now) + elapsed = max(0.0, now - start) + baseline = self._rt_baseline_for(tag) + soft_th = max(soft_min, baseline * soft_mult) + hard_th = max(hard_min, baseline * hard_mult) + progress_ts = float(getattr(w, "guard_last_progress_ts", 0.0) or 0.0) + if progress_ts <= 0.0: + progress_ts = float(info.get("guard_last_progress_ts", start) or start) + progress_ts = max(progress_ts, start) + info["guard_last_progress_ts"] = progress_ts + no_progress_for = max(0.0, now - progress_ts) + stall_restart_s = self._rt_stall_restart_threshold(baseline, soft_th, progress_stall_s) + snapshots[tag] = { + "worker": w, + "key": key, + "start": start, + "elapsed": elapsed, + "baseline": baseline, + "soft_th": soft_th, + "hard_th": hard_th, + "progress_ts": progress_ts, + "no_progress_for": no_progress_for, + "stall_restart_s": stall_restart_s, + } + + global_wave_tags = set() + active_tags = [tag for tag, snap in snapshots.items() if snap["key"] not in self.finished_set] + if len(active_tags) > 1 and self.total_render_count >= max(1, min_samples_soft): + all_stalled = True + for tag in active_tags: + snap = snapshots[tag] + info = self.inflight.get(tag) or {} + if (not bool(info.get("guard_progress_seen"))) or snap["elapsed"] < snap["stall_restart_s"] or snap["no_progress_for"] < snap["stall_restart_s"]: + all_stalled = False + break + if all_stalled: + global_wave_tags = set(active_tags) + wave_gap = min(snapshots[tag]["no_progress_for"] for tag in active_tags) + self._rt_guard_log( + "rt-global-stall-wave", + f"[MGPU-GUARD] Global no-progress wave detected across {len(active_tags)} workers " + f"(stall={wave_gap:.1f}s).", + every_s=15.0 + ) + + for tag, info in list(self.inflight.items()): + snap = snapshots.get(tag) + if not snap: + continue + w = snap["worker"] + key = snap["key"] + job = info.get("job") + elapsed = snap["elapsed"] + baseline = snap["baseline"] + soft_th = snap["soft_th"] + hard_th = snap["hard_th"] + no_progress_for = snap["no_progress_for"] + stall_restart_s = snap["stall_restart_s"] + progress_seen = bool(info.get("guard_progress_seen")) + + state = self.rt_guard_job_state.setdefault(key, {"hedges": 0, "restarts": 0}) + warm = self._rt_warmup_state(tag) + if warm.get("block") and tag not in global_wave_tags: + tail_ready = self._rt_tail_straggler_ready(tag) + if not tail_ready: + needs = [] + if int(warm.get("need_worker", 0) or 0) > 0: + needs.append(f"worker={int(warm.get('done_worker', 0))}/{int(warm.get('need_worker', 0))}") + if int(warm.get("need_global", 0) or 0) > 0: + needs.append(f"global={int(warm.get('done_global', 0))}/{int(warm.get('need_global', 0))}") + detail = ", ".join(needs) if needs else "warmup" + self._rt_guard_log( + f"rt-warmup-skip-{tag}", + f"[MGPU-GUARD] {tag}: warmup skip for {self._job_label(job)} ({detail}).", + every_s=20.0 + ) + continue + self._rt_guard_log( + f"rt-warmup-tail-{tag}", + f"[MGPU-GUARD] {tag}: warmup override (tail-straggler) for {self._job_label(job)}.", + every_s=20.0 + ) + + restart_reason = None + if self.scene.render.engine == "CYCLES" and (not w.is_cpu): + hint_ts = float(getattr(w, "cycles_cpu_hint_ts", 0.0) or 0.0) + if hint_ts > 0.0 and hint_ts >= snap["start"]: + line_hint = str(getattr(w, "cycles_cpu_hint_line", "") or "").strip() + if self._cycles_backend_for_worker(w) == "OPTIX": + w.cycles_backend_override = "CUDA" + self._rt_guard_log( + f"rt-cpu-hint-switch-{tag}", + f"[MGPU-GUARD] {tag}: CPU hint detected; switching backend OPTIX -> CUDA.", + every_s=10.0 + ) + restart_reason = f"cpu-device-hint ({line_hint[:96]})" + + if (key not in self.finished_set) and (restart_reason is None): + can_hedge = ( + tag not in global_wave_tags and + progress_seen and + elapsed >= soft_th and + self.total_render_count >= min_samples_soft and + (not info.get("guard_hedged")) and + state.get("hedges", 0) < hedge_max_per_job and + self._has_other_alive_worker(tag) + ) + if can_hedge: + info["guard_hedged"] = True + info["guard_hedge_ts"] = now + state["hedges"] = int(state.get("hedges", 0)) + 1 + self._duplicate_job_for_hedge(tag, job) + self._rt_guard_log( + f"rt-hedge-{key}", + f"[MGPU-GUARD] {tag}: hedge duplicate for {self._job_label(job)} " + f"(elapsed={elapsed:.1f}s, baseline={baseline:.1f}s, soft={soft_th:.1f}s).", + force=True + ) + continue + + if (key in self.finished_set) and info.get("guard_hedged"): + hedge_for = max(0.0, now - float(info.get("guard_hedge_ts", now) or now)) + if hedge_for >= hedge_grace_s: + restart_reason = f"hedged-copy-finished-elsewhere ({hedge_for:.0f}s)" + + if restart_reason is None and info.get("guard_hedged"): + hedge_for = max(0.0, now - float(info.get("guard_hedge_ts", now) or now)) + if progress_seen and hedge_for >= hedge_grace_s and no_progress_for >= stall_restart_s: + restart_reason = f"post-hedge no-progress {no_progress_for:.0f}s" + + if restart_reason is None and tag in global_wave_tags: + restart_reason = f"global-no-progress-wave {no_progress_for:.0f}s" + + if restart_reason is None and elapsed >= hard_th: + if progress_seen and no_progress_for >= progress_stall_s: + restart_reason = f"no-progress {no_progress_for:.0f}s" + elif info.get("guard_hedged"): + hedge_for = max(0.0, now - float(info.get("guard_hedge_ts", now) or now)) + if hedge_for >= hedge_grace_s: + restart_reason = f"post-hedge slow ({hedge_for:.0f}s)" + elif elapsed >= (hard_th * 1.35): + restart_reason = "hard-timeout" + + if restart_reason is None: + continue + + if int(state.get("restarts", 0)) >= restart_max_per_job: + self._rt_guard_log( + f"rt-restart-cap-{key}", + f"[MGPU-GUARD] {tag}: restart cap reached for {self._job_label(job)}; continuing without restart.", + every_s=45.0 + ) + continue + + if self._alive_worker_count() <= 1 and no_progress_for < single_worker_min_stall: + self._rt_guard_log( + f"rt-single-skip-{tag}", + f"[MGPU-GUARD] {tag}: single-worker mode, delaying restart until stall>{int(single_worker_min_stall)}s.", + every_s=45.0 + ) + continue + + can_restart, why = self._rt_can_restart_worker(w, now) + if not can_restart: + self._rt_guard_log( + f"rt-restart-skip-{tag}-{why}", + f"[MGPU-GUARD] {tag}: restart skipped ({why}).", + every_s=30.0 + ) + continue + + state["restarts"] = int(state.get("restarts", 0)) + 1 + reason = ( + f"{restart_reason}; elapsed={elapsed:.1f}s baseline={baseline:.1f}s " + f"stall={stall_restart_s:.1f}s soft={soft_th:.1f}s hard={hard_th:.1f}s" + ) + ok = self._restart_worker_same_gpu(w, reason, info=info) + if ok: + self._rt_guard_log( + f"rt-restarted-{tag}", + f"[MGPU-GUARD] {tag}: restarted on same GPU ({reason}).", + force=True + ) + self._open_diag_terminal_if_needed() + else: + self._rt_guard_log( + f"rt-restart-fail-{tag}", + f"[MGPU-GUARD] {tag}: restart failed ({reason}).", + force=True + ) + self._open_diag_terminal_if_needed() + + def _handle_job_done(self, tag, msg): + ok = bool(msg.get("ok", False)) + meta = dict(msg.get("meta") or {}) + inflight = self.inflight.pop(tag, None) + job = inflight.get("job") if inflight else None + key = inflight.get("key") if inflight else None + if job is None: + job = msg.get("job") + if job is None: + job = msg.get("done") + if job is None: + _log(f"WARNING: Missing job payload from {tag}") + return + if key is None: + mode = "MARI" if isinstance(job, dict) else "FRAMES" + key = self._job_key(job, mode) + if not ok: + w = self._worker_by_tag(tag) + err_text = str(msg.get("err", "") or "") + if self._handle_cycles_gpu_policy_failure(w, err_text, inflight=inflight): + return + self._handle_retry(tag, job, key=key, reason="failed") + return + if key in self.finished_set: + self.rt_guard_job_state.pop(key, None) + return + w = self._worker_by_tag(tag) + if w: + try: + w.guard_last_progress_ts = time.time() + w.guard_last_progress_sig = ("SOCKET_DONE", str(key)) + except Exception: + pass + if self.scene.render.engine == "CYCLES" and w and (not w.is_cpu): + hint_ts = float(getattr(w, "cycles_cpu_hint_ts", 0.0) or 0.0) + start_ts = float((inflight or {}).get("start", 0.0) or 0.0) + if hint_ts > 0.0 and start_ts > 0.0 and hint_ts >= start_ts: + err_text = f"GPU_POLICY_VIOLATION cpu-hint: {getattr(w, 'cycles_cpu_hint_line', '')}" + if self._handle_cycles_gpu_policy_failure(w, err_text, inflight=inflight): + return + self._handle_retry(tag, job, key=key, reason="cpu-hint") + return + rendered = meta.get("rendered") + skipped = meta.get("skipped") + if rendered is None: + err_text = str(msg.get("err", "") or "") + if "skip existing" in err_text.lower(): + rendered = False + skipped = True + else: + rendered = ok + rendered = bool(rendered) + skipped = bool(skipped) + if rendered: + elapsed = 0.0 + try: + elapsed = float(meta.get("elapsed", 0.0) or 0.0) + except Exception: + elapsed = 0.0 + if elapsed <= 0.0 and inflight and inflight.get("start"): + elapsed = max(0.0, time.time() - inflight["start"]) + self._update_worker_avg(tag, elapsed) + elif skipped: + self._rt_guard_log( + f"rt-skip-{tag}-{key}", + f"[MGPU-GUARD] {tag}: reused existing output for {self._job_label(job)}; not counted in timing baseline.", + every_s=5.0 + ) + marked = self._mark_finished(key) + if marked and rendered: + self._rt_try_periodic_recycle_after_job(tag) + + def _handle_retry(self, tag, job, key=None, reason="failed", prefer_other=False): + if job is None: + return + if key is None: + mode = "MARI" if isinstance(job, dict) else "FRAMES" + key = self._job_key(job, mode) + if key in self.finished_set: + return + self.inflight.pop(tag, None) + tries = self.retries.get(key, 0) + 1 + self.retries[key] = tries + if tries > self.max_retries: + _log(f"Giving up on {self._job_label(job)} after {tries - 1} retries ({reason}).") + self._mark_finished(key) + return + _log(f"Retrying {self._job_label(job)} ({reason}) attempt {tries}/{self.max_retries}") + if self.job_mode == "MARI": + self._requeue_mari_for_tag(tag, job, prefer_other=prefer_other) + else: + try: + frame = int(job) + except Exception: + frame = job + self._requeue_frame_for_tag(tag, frame, prefer_other=prefer_other) + + def _check_inflight_timeouts(self): + if self.rt_guard_enabled: + return + if len(self.workers) < 2: + return + now = time.time() + for tag, info in list(self.inflight.items()): + if info.get("stolen"): + continue + start = info.get("start", 0) + if not start: + continue + avg = self._avg_for_tag(tag) + if avg is None or avg <= 0.0: + continue + elapsed = now - start + threshold = max(avg * 2.5, 30.0) + if elapsed >= threshold: + info["stolen"] = True + job = info.get("job") + _log(f"Slow job on {tag} ({elapsed:.1f}s > {threshold:.1f}s). Requeueing {self._job_label(job)}.") + self._handle_retry(tag, job, reason="slow", prefer_other=True) + + # ---------- terminal tail ---------- + + def _write_header(self, w: Worker): + try: + scene = self.scene + engine = scene.render.engine + backend = self.device_mode + if engine == "CYCLES" and not w.is_cpu: + backend = self._cycles_backend_for_worker(w) + dev = "CPU" if w.is_cpu else ( + f"GPU {w.phys_index if w.phys_index is not None else '?'} {(w.gpu_uuid or '')[:12]}" + f"{(' bus=' + w.gpu_bus) if w.gpu_bus else ''}" + ) + blend_name = os.path.basename(bpy.data.filepath or "untitled.blend") + fstart, fend, fstep = scene.frame_start, scene.frame_end, scene.frame_step + try: + out_dir = os.path.dirname(bpy.path.abspath(scene.render.frame_path(frame=fstart))) + except Exception: + out_dir = bpy.path.abspath(scene.render.filepath) + + header = ( + BANNER_ASCII + "\n" + f"[MGPU-INFO] Tag: {w.tag}\n" + f"[MGPU-INFO] Engine: {engine} | Backend: {backend} | Device: {dev} | Threads/child: {self.threads} | Guard: {self.render_guard_tier} | DenoiseGPU: {'ON' if self.denoise_on_gpu else 'OFF'}\n" + f"[MGPU-INFO] .blend: {blend_name} | Frames: {fstart}–{fend} step {fstep}\n" + f"[MGPU-INFO] Output dir: {out_dir}\n" + ) + w._banner_lines_since_repeat = 0 + self._emit(w, header, count_for_banner=False) + except Exception: + pass + + def _open_terminal_tail(self, w: Worker): + if not self.open_terms: + return + proc = self._spawn_tail_terminal(w.log_path, enable_vt=True) + if proc: + w.term_proc = proc + + + + def _launch_worker_process(self, w: Worker): + with open(w.log_path, "a", encoding="utf-8"): pass + w.launch_attempted = True + w.launch_ts = time.time() + w.guard_last_progress_ts = w.launch_ts + w.guard_last_progress_sig = ("LAUNCH", int(w.launch_ts)) + w.cycles_cpu_hint_ts = 0.0 + w.cycles_cpu_hint_line = "" + + blender_bin = bpy.app.binary_path + launch_backend = str(self.device_mode or "").upper() + launch_fallback = "" + if self.scene.render.engine == "CYCLES" and not w.is_cpu: + launch_backend = self._cycles_backend_for_worker(w) + launch_fallback = self._cycles_fallback_for_worker(w, launch_backend) + cmd = [ + blender_bin, "--enable-autoexec", + ] + if getattr(self, "_enabled_addon_modules_csv", ""): + cmd += ["--addons", self._enabled_addon_modules_csv] + cmd += [ + "-b", self.temp_blend, + "-P", self._child_script, + "--", + ] + if self.scene.render.engine == "CYCLES": + cli_dev = "CPU" if w.is_cpu else (launch_backend or self.device_mode or "CUDA") + cmd += ["--cycles-device", str(cli_dev).upper()] + cmd += [ + "--mgpu-port", str(self._server_port), + "--mgpu-token", self._token, + "--mgpu-tag", w.tag, + "--mgpu-device", launch_backend or self.device_mode, + "--mgpu-threads", str(self.threads), + "--mgpu-usecpu", "1" if w.is_cpu else "0", + "--mgpu-denoise-gpu", "1" if self.denoise_on_gpu else "0", + "--mgpu-persistent", "1" if self.use_persistent_data else "0", + "--mgpu-mode", self.job_mode, + ] + if (self.scene.render.engine == "CYCLES") and (not w.is_cpu): + if w.gpu_bus: + cmd += ["--mgpu-gpu-bus", w.gpu_bus] + if w.gpu_name: + cmd += ["--mgpu-gpu-name", w.gpu_name] + if (self.scene.render.engine == "CYCLES") and (not w.is_cpu) and launch_fallback: + cmd += ["--mgpu-fallback-device", launch_fallback] + if getattr(self, "src_blend_dir", None): + cmd += ["--src-dir", self.src_blend_dir] + if getattr(self, "_enabled_addons_file", None): + cmd += ["--mgpu-enabled-addons-file", self._enabled_addons_file] + if self.video_mode and self.job_mode == "FRAMES" and self.video_seq_dir: + cmd += [ + "--mgpu-seq-dir", self.video_seq_dir, + "--mgpu-seq-format", self.video_seq_format, + "--mgpu-seq-ext", self.video_seq_ext, + ] + if self._preflight_existing_check_done: + cmd += ["--mgpu-prechecked-existing", "1"] + # Pass MARI add-on path (so child imports & registers it) + if self.job_mode == "MARI" and getattr(self, "_mari_dir", None): + cmd += ["--mari-path", self._mari_dir] + + + + env = os.environ.copy() + # Bind EXACT GPU via UUID + if not w.is_cpu and w.gpu_uuid: + env["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" + env["CUDA_VISIBLE_DEVICES"] = w.gpu_uuid + else: + env.pop("CUDA_VISIBLE_DEVICES", None) + + creationflags = subprocess.CREATE_NEW_PROCESS_GROUP if IS_WIN else 0 + try: + proc = subprocess.Popen( + cmd, env=env, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + universal_newlines=True, bufsize=1, + creationflags=creationflags + ) + w.proc = proc + w.launch_ok = True + w.launch_pid = int(getattr(proc, "pid", -1)) + w.guard_last_progress_ts = time.time() + w.guard_last_progress_sig = ("PROCESS_STARTED", w.launch_pid) + _win_job_assign(proc) + w.stdout_thread = threading.Thread(target=self._pump_stdout, args=(w,), daemon=True) + w.stdout_thread.start() + self._record_launch_event( + w, "LAUNCHED", "PROCESS_STARTED", + f"pid={w.launch_pid} dev={'CPU' if w.is_cpu else (w.gpu_uuid or 'no-uuid')} " + f"{(' bus=' + w.gpu_bus) if ((not w.is_cpu) and w.gpu_bus) else ''} " + f"{(' cli_cycles_device=' + ('CPU' if w.is_cpu else (launch_backend or self.device_mode or 'CUDA'))) if (self.scene.render.engine == 'CYCLES') else ''} " + f"backend={(launch_backend or self.device_mode)}{(' fallback=' + launch_fallback) if ((not w.is_cpu) and launch_fallback) else ''} " + f"denoise_gpu={'ON' if self.denoise_on_gpu else 'OFF'}" + ) + return True + except Exception as e: + w.launch_ok = False + w.launch_pid = None + reason = _classify_launch_exception(e) + self._record_launch_event(w, "FAILED_TO_LAUNCH", reason, str(e)) + return False + + def _emit(self, w: Worker, text: str, count_for_banner: bool = True): + try: + if w._log_fp: + w._log_fp.write(text) + w._log_fp.flush() + w.last_line = text.rstrip() + except Exception: + return + + if not count_for_banner: + return + try: + step = int(_WORKER_BANNER_REPEAT_EVERY_LINES or 0) + if step <= 0: + return + added = int(str(text).count("\n")) + if added <= 0 and str(text): + added = 1 + w._banner_lines_since_repeat = int(getattr(w, "_banner_lines_since_repeat", 0) or 0) + max(0, added) + if w._banner_lines_since_repeat < step: + return + w._banner_lines_since_repeat = 0 + banner = "\n" + _WORKER_BANNER_REPEAT_TEXT + if w._log_fp: + w._log_fp.write(banner) + w._log_fp.flush() + w.last_line = banner.rstrip() + except Exception: + pass + + def _pump_stdout(self, w: Worker): + PERCENT_STEP = 5.0 # update when percentage jumps by ≥5 + TIME_STEP = 2.0 # every ≥2s + try: + for raw in w.proc.stdout: + line = raw.strip() + if not line: + continue + + if (self.scene.render.engine == "CYCLES") and (not w.is_cpu): + ll = line.lower() + cpu_hint = False + if ("'cpu_enabled': true" in ll) or ('"cpu_enabled": true' in ll): + cpu_hint = True + if ("'scene_device': 'cpu'" in ll) or ('"scene_device": "cpu"' in ll): + cpu_hint = True + if not cpu_hint and re.search(r"\b(using|use|rendering on|fallback(?:ing)? to)\s+cpu\b", ll): + cpu_hint = True + if ( + (not cpu_hint) and + re.search(r"\bdevice\b.{0,24}\bcpu\b", ll) and + ("scene_device" not in ll) and + ("cpu_enabled" not in ll) + ): + cpu_hint = True + if cpu_hint: + w.cycles_cpu_hint_ts = time.time() + w.cycles_cpu_hint_line = line[:220] + self._emit(w, f"[MGPU-GUARD] {w.tag} CPU device hint: {w.cycles_cpu_hint_line}\n") + + # Frame lifecycle from child markers + ms = _CHILD_START_RE.match(line) + if ms: + w.cur_frame = int(ms.group(2)) + w.cur_path = ms.group(3) + w.frame_start_time = time.time() + w.guard_last_progress_ts = time.time() + w.guard_last_progress_sig = ("START", w.cur_frame) + w._live_line_active = False + w._last_pct = -1.0 + w._last_emit_time = 0.0 + self._emit(w, f"[MGPU-DASH] frame {w.cur_frame} preparing -> {w.cur_path}\n") + continue + + msm = _CHILD_MARI_START_RE.match(line) + if msm: + action = str(msm.group(2) or "") + h = msm.group(3) + v = msm.group(4) + frame_txt = msm.group(5) + target = msm.group(6) + label = f"{action} H{h} V{v}" + (f" f{frame_txt}" if frame_txt is not None else "") + w.cur_frame = None + w.cur_path = target + w.frame_start_time = time.time() + w.guard_last_progress_ts = time.time() + w.guard_last_progress_sig = ("MARI_START", label) + w._live_line_active = False + w._last_pct = -1.0 + w._last_emit_time = 0.0 + self._emit(w, f"[MGPU-DASH] {label} preparing -> {target}\n") + continue + + mf = _CHILD_FIN_RE.match(line) + if mf: + frame = int(mf.group(2)) + elapsed = float(mf.group(3)) + w.guard_last_progress_ts = time.time() + w.guard_last_progress_sig = ("FIN", frame) + s_cur, s_tot = w._last_samples + bar = _progress_bar(100.0, 20) + samples_txt = f" samples {s_tot}/{s_tot}" if (s_tot is not None) else "" + prefix = "\x1b[1F\x1b[2K" if w._live_line_active else "" + final_line = f"{prefix}[MGPU-PROG] {w.tag} f{frame:>4} 100.0% [{bar}]{samples_txt} {elapsed:.1f}s\n" + self._emit(w, final_line) + # reset + w._live_line_active = False + w.cur_frame = None + w.cur_path = None + w.frame_start_time = 0.0 + continue + + mfm = _CHILD_MARI_FIN_RE.match(line) + if mfm: + action = str(mfm.group(2) or "") + h = mfm.group(3) + v = mfm.group(4) + frame_txt = mfm.group(5) + elapsed = float(mfm.group(6)) + target = mfm.group(7) + label = f"{action} H{h} V{v}" + (f" f{frame_txt}" if frame_txt is not None else "") + w.guard_last_progress_ts = time.time() + w.guard_last_progress_sig = ("MARI_FIN", label) + prefix = "\x1b[1F\x1b[2K" if w._live_line_active else "" + self._emit(w, f"{prefix}[MGPU-PROG] {w.tag} {label} 100.0% {elapsed:.1f}s -> {target}\n") + w._live_line_active = False + w.cur_frame = None + w.cur_path = None + w.frame_start_time = 0.0 + continue + + mm = _CHILD_MISS_RE.match(line) + if mm: + frame = int(mm.group(2)) + elapsed = float(mm.group(3)) + w.guard_last_progress_ts = time.time() + w.guard_last_progress_sig = ("MISS", frame) + prefix = "\x1b[1F\x1b[2K" if w._live_line_active else "" + self._emit(w, f"{prefix}[MGPU-FAIL] {w.tag} f{frame:>4} ({elapsed:.1f}s)\n") + w._live_line_active = False + w.cur_frame = None + w.cur_path = None + w.frame_start_time = 0.0 + continue + + mmm = _CHILD_MARI_MISS_RE.match(line) + if mmm: + action = str(mmm.group(2) or "") + h = mmm.group(3) + v = mmm.group(4) + frame_txt = mmm.group(5) + elapsed = float(mmm.group(6)) + target = mmm.group(7) + label = f"{action} H{h} V{v}" + (f" f{frame_txt}" if frame_txt is not None else "") + w.guard_last_progress_ts = time.time() + w.guard_last_progress_sig = ("MARI_MISS", label) + prefix = "\x1b[1F\x1b[2K" if w._live_line_active else "" + self._emit(w, f"{prefix}[MGPU-FAIL] {w.tag} {label} ({elapsed:.1f}s) -> {target}\n") + w._live_line_active = False + w.cur_frame = None + w.cur_path = None + w.frame_start_time = 0.0 + continue + + if line.startswith("[MGPU-CHILD]") or "ERROR" in line or "WARNING" in line or "Traceback" in line: + self._emit(w, line + "\n") + continue + if line.startswith("[MGPU-PROJ]"): + self._emit(w, line + "\n") + continue + + s_cur, s_tot, t_cur, t_tot = _parse_progress_fields(line) + pct = _progress_percent(s_cur, s_tot, t_cur, t_tot) + has_progress = any(v is not None for v in (s_cur, s_tot, t_cur, t_tot, pct)) + if has_progress: + try: + info = self.inflight.get(w.tag) + if info is not None: + info["guard_progress_seen"] = True + except Exception: + pass + now = time.time() + progress_sig = (s_cur, s_tot, t_cur, t_tot, (None if pct is None else int(pct))) + if progress_sig != w.guard_last_progress_sig: + w.guard_last_progress_sig = progress_sig + w.guard_last_progress_ts = now + + if s_cur is not None or s_tot is not None: + w._last_samples = (s_cur, s_tot) + + should_emit = False + if pct is not None: + if (pct - w._last_pct) >= PERCENT_STEP or (now - w._last_emit_time) >= TIME_STEP: + should_emit = True + + if should_emit and pct is not None: + bar = _progress_bar(pct, 20) + samples_txt = f" samples {s_cur}/{s_tot}" if (s_cur is not None and s_tot) else "" + elapsed = (now - w.frame_start_time) if w.frame_start_time else 0.0 + fr = f"f{w.cur_frame:>4}" if (w.cur_frame is not None) else "f --" + prefix = "\x1b[1F\x1b[2K" if w._live_line_active else "" + out = f"{prefix}[MGPU-PROG] {w.tag} {fr} {pct:5.1f}% [{bar}]{samples_txt} {elapsed:.1f}s\n" + self._emit(w, out) + w._live_line_active = True + w._last_pct = pct + w._last_emit_time = now + except Exception: + pass + + + def prepare_and_spawn(self): + self._update_ram_capacity_note() + if self._selection_warning: + self._open_diag_terminal_if_needed() + if not self.pending: + msg = "[MGPU-LAUNCH] No worker launch needed; all pending outputs were resolved during preflight." + _log(msg) + self._diag_write(msg) + return + launched = 0 + for w in self.workers: + try: + log_file = os.path.join(self.logs_dir, f"{w.tag}.log") + w.open_log(log_file) + self._write_header(w) + if self.open_terms: + self._open_terminal_tail(w) + ok = self._launch_worker_process(w) + if ok: + launched += 1 + except Exception as e: + self._record_launch_event(w, "FAILED_TO_LAUNCH", "PREPARE_OR_OPEN_LOG_FAILED", str(e)) + + failed = len(self.workers) - launched + _log(f"[MGPU-LAUNCH] Spawn summary: planned={len(self.workers)} launched={launched} failed_to_launch={failed}") + self._diag_write(f"[MGPU-LAUNCH] Spawn summary: planned={len(self.workers)} launched={launched} failed_to_launch={failed}") + if self._ram_cap_note: + _log(f"[MGPU-LAUNCH] Note: {self._ram_cap_note}") + self._diag_write(f"[MGPU-LAUNCH] Note: {self._ram_cap_note}") + self._open_diag_terminal_if_needed() + if failed > 0: + self._open_diag_terminal_if_needed() + if launched <= 0: + raise RuntimeError("No workers launched. Check [MGPU-LAUNCH] lines for reasons.") + + def _print_launch_status_summary(self, title="Status"): + _log(f"[MGPU-LAUNCH] {title} summary:") + self._diag_write(f"[MGPU-LAUNCH] {title} summary:") + for w in self.workers: + detail = f" | {w.launch_detail}" if w.launch_detail else "" + conn = " hello=yes" if w.hello_received else " hello=no" + pid = f" pid={w.launch_pid}" if w.launch_pid is not None else "" + line = f"[MGPU-LAUNCH] {w.tag}: {w.launch_state}/{w.launch_reason}{pid}{conn}{detail}" + _log(line) + self._diag_write(line) + + def finish(self): + self._print_launch_status_summary("Final") + self._kill_all() + for w in self.workers: + try: + if getattr(w, "term_proc", None) and (w.term_proc.poll() is None): + if IS_WIN: w.term_proc.send_signal(signal.CTRL_BREAK_EVENT) + else: w.term_proc.terminate() + except Exception: + pass + for w in self.workers: + w.close_log() + + # Build final video from temp frames (non-MARI mode only). + try: + if self.job_mode == "FRAMES" and self.video_mode and (not self._skip_video_encode): + self._encode_video_from_sequence() + elif self.job_mode == "FRAMES" and self.video_mode and self._skip_video_encode: + _log(f"[MGPU] Reused existing final video: {self.video_output_path}") + except Exception as _e: + print(f"[MGPU] Video encode failed: {_e}") + + # --- NEW: package MARI media if requested --- + try: + if self.job_mode == "MARI": + self._package_mari_zip() + except Exception as _e: + print(f"[MGPU] ZIP packaging skipped/failed: {_e}") + # ------------------------------------------- + + try: + if self.job_mode == "MARI": + self._cleanup_mari_temp_dirs() + except Exception as _e: + print(f"[MGPU] TEMP cleanup skipped/failed: {_e}") + + self._cleanup_temp() + + def _package_mari_zip(self): + """Create /.zip that contains the entire MARI output folder.""" + try: + prop = self.scene.mari_props + except Exception: + return + try: + save_zip = bool(getattr(prop, "mari_save_media", False)) + except Exception: + save_zip = False + if not save_zip: + return + + try: + base = bpy.path.abspath(getattr(prop, "render_settings_filepath", "")) + name = getattr(prop, "render_settings_name", "").strip() + src_dir = os.path.join(base, name) + + if not (name and os.path.isdir(src_dir)): + print(f"[MGPU] ZIP: source folder missing or invalid: {src_dir}") + return + + # Zip lives one level above the render folder, alongside it. + zip_path = os.path.join(base, f"{name}.zip") + + from zipfile import ZipFile, ZIP_DEFLATED + with ZipFile(zip_path, 'w', ZIP_DEFLATED) as zipf: + for root, dirs, files in os.walk(src_dir): + for file in files: + full = os.path.join(root, file) + # Avoid adding the zip file into itself if it already exists. + if os.path.normpath(full) == os.path.normpath(zip_path): + continue + arc = os.path.relpath(full, start=src_dir) + # keep folder name at the top level in the archive + zipf.write(full, arcname=os.path.join(name, arc)) + print(f"[MGPU] Wrote MARI media ZIP: {zip_path}") + except Exception as e: + print(f"[MGPU] ZIP packaging failed: {e}") + + def _collect_video_frames(self): + if not self.video_seq_dir: + return [] + try: + ext = (self.video_seq_ext or "").lower() + files = [f for f in os.listdir(self.video_seq_dir) if f.lower().endswith(ext)] + files.sort() + return files + except Exception: + return [] + + def _encode_video_from_sequence(self): + if not self.video_seq_dir or not self.video_output_path: + return + frames = self._collect_video_frames() + if not frames: + raise RuntimeError("No rendered frames found for video encode.") + expected = int(getattr(self, "total_frames", 0) or 0) + if expected and len(frames) < expected: + raise RuntimeError(f"Missing frames ({len(frames)}/{expected}) for video encode.") + _log(f"Encoding video from {len(frames)} frames -> {self.video_output_path}") + _mgpu_build_video_from_sequence(self.scene, self.video_seq_dir, frames, self.video_output_path) + + + def start(self): + if (self.scene.render.engine == 'CYCLES') and (not _cycles_prefs()): + raise RuntimeError("Cycles add-on is not enabled. Enable it in Preferences > Add-ons, or switch render engine to Eevee.") + if self.job_mode == "FRAMES": + if not self.frames: + raise RuntimeError("No frames to render (check frame start/end).") + else: + if not self.pending: + raise RuntimeError("No MARI camera jobs to render (job list empty).") + + self.prepare_blend_copy() + + + # If MARI ANIM, expand camera jobs into per-frame jobs unless we're rendering video containers. + # Explicit per-frame jobs supplied by MARI are preserved as-is so partial resumes can start immediately. + expand_frames = ( + self.job_mode == "MARI" and + self.mari_globals.get("action") == "ANIM" and + not self.mari_globals.get("is_video", False) + ) + if expand_frames: + fstart, fend, fstep = self.scene.frame_start, self.scene.frame_end, max(1, self.scene.frame_step) + expanded = [] + for j in self.mari_jobs: + try: + existing_frame = int(j.get("frame", -1)) + except Exception: + existing_frame = -1 + if existing_frame >= 0: + expanded.append(dict(j)) + continue + for f in range(fstart, fend + 1, fstep): + jj = dict(j) + jj["frame"] = int(f) + expanded.append(jj) + self.pending = expanded + self.total_frames = len(expanded) + + self._preflight_existing_outputs() + self._start_server() + self.prepare_and_spawn() + + def stop(self): + self._print_launch_status_summary("Stop") + self.cancelled = True + self._kill_all() + for w in self.workers: + try: + if getattr(w, "term_proc", None) and (w.term_proc.poll() is None): + if IS_WIN: w.term_proc.send_signal(signal.CTRL_BREAK_EVENT) + else: w.term_proc.terminate() + except Exception: + pass + for w in self.workers: + w.close_log() + self._cleanup_temp() + + def poll(self) -> bool: + with self._lock: + self._check_render_time_guard() + self._check_inflight_timeouts() + self._check_launch_health() + for w in self.workers: + if w.proc and (w.proc.poll() is not None): + try: + if w.stdout_thread: + w.stdout_thread.join(timeout=0.1) + except Exception: + pass + with self._lock: + info = self.inflight.get(w.tag) + if info: + self._handle_retry(w.tag, info.get("job"), key=info.get("key"), + reason="worker-exit", prefer_other=True) + return self._shutdown_if_done() + + def _shutdown_if_done(self) -> bool: + all_frames_done = len(self.finished_set) >= getattr(self, "total_frames", 0) + procs_alive = any(getattr(w, "alive", lambda: False)() if callable(getattr(w, "alive", None)) else w.alive + for w in self.workers) + if all_frames_done and not procs_alive: + self.finish() + return True + return False + + def _kill_all(self): + for w in self.workers: + if w.proc and (w.proc.poll() is None): + try: + if IS_WIN: w.proc.send_signal(signal.CTRL_BREAK_EVENT) + else: w.proc.terminate() + except Exception: + pass + for w in self.workers: + if w.term_proc and (w.term_proc.poll() is None): + try: + if IS_WIN: w.term_proc.send_signal(signal.CTRL_BREAK_EVENT) + else: w.term_proc.terminate() + except Exception: + pass + try: + if self._diag_term_proc and (self._diag_term_proc.poll() is None): + if IS_WIN: self._diag_term_proc.send_signal(signal.CTRL_BREAK_EVENT) + else: self._diag_term_proc.terminate() + except Exception: + pass + + def _cleanup_mari_temp_dirs(self): + try: + prop = self.scene.mari_props + except Exception: + return + try: + base = bpy.path.abspath(getattr(prop, "render_settings_filepath", "")) + name = getattr(prop, "render_settings_name", "").strip() + root = os.path.join(base, name) + if not (name and os.path.isdir(root)): + return + for entry in os.scandir(root): + if entry.is_dir() and entry.name.upper().endswith("_TEMP"): + shutil.rmtree(entry.path, ignore_errors=True) + except Exception: + pass + + def _cleanup_temp(self): + try: + if self._server_sock: self._server_sock.close() + except Exception: + pass + try: + if self._diag_log_fp: + self._diag_log_fp.close() + except Exception: + pass + try: + if self.temp_dir and os.path.isdir(self.temp_dir): + shutil.rmtree(self.temp_dir, ignore_errors=True) + except Exception: + pass + +def _shorten_path(p, maxlen=96): + try: + p = os.path.normpath(p) + except Exception: + p = str(p) + if len(p) <= maxlen: return p + keep = max(12, maxlen // 2 - 3) + return p[:keep] + "..." + p[-(maxlen - keep - 3):] + +# ----------------------- UI / operators ----------------------- + +class MGPU_RuntimePrefs(bpy.types.PropertyGroup): + threads_per_process: bpy.props.IntProperty( + name="Threads per Process", min=0, max=256, default=0, + description="CPU threads per child Blender (0 = Blender decides)" + ) + instances_per_gpu: bpy.props.IntProperty( + name="Instances per GPU", min=1, max=8, default=1, + description="Workers launched per physical GPU" + ) + dispatch_mode: bpy.props.EnumProperty( + name="Dispatch", + items=[("DYNAMIC","Dynamic Queue (recommended)",""), + ("STRIDE","Stride (round-robin)","")], + default="DYNAMIC" + ) + max_retries: bpy.props.IntProperty( + name="Max Retries per Frame", min=0, max=10, default=2 + ) + render_time_guard_tier: bpy.props.EnumProperty( + name="Render-Time Guard", + description="Adaptive slow-frame guard behavior: duplicate, then restart unhealthy worker on same GPU", + items=[ + ("AGGRESSIVE", "Aggressive (default)", "Fast intervention; highest chance to restart slow workers"), + ("BALANCED", "Balanced", "Moderate intervention and restart cadence"), + ("CONSERVATIVE", "Conservative", "Rare intervention; safer for naturally long frames"), + ("OFF", "Off", "Disable adaptive render-time guard"), + ], + default="AGGRESSIVE" + ) + open_terminals: bpy.props.BoolProperty( + name="Open terminal windows for logs", default=IS_WIN + ) + use_persistent_data: bpy.props.BoolProperty( + name="Use Persistent Data", default=True, + description="Keep render caches between frames in workers (uses more RAM)" + ) + denoise_on_gpu: bpy.props.BoolProperty( + name="Denoise on GPU", default=True, + description="When enabled, workers try to use Blender's GPU denoiser (OptiX) where applicable" + ) + use_target_dir_for_video_temp: bpy.props.BoolProperty( + name="Temp Frames In Target Dir", default=True, + description="Store video temp frames beside the final output file. Disable to use the system temp/AppData folder instead" + ) + ghost_filter_mode: bpy.props.EnumProperty( + name="Ghost filter mode", + description="How to build the GPU list (your system works best with STRICT − LEGACY).", + items=[ + ("STRICT_MINUS_LEGACY", "Strict − Legacy (default)", "Use strict(full) minus legacy(ghost)"), + ("LEGACY_MINUS_STRICT", "Legacy − Strict", "Use broad scan then subtract strict"), + ("STRICT_ONLY", "Strict only", "Use strict set only"), + ("LEGACY_ONLY", "Legacy only", "Use legacy set only"), + ], + default="STRICT_MINUS_LEGACY" + ) + +class MGPU_OT_render_frames(bpy.types.Operator): + bl_idname = "render.multi_gpu_frames" + bl_label = "Render (Multi-GPU Frames)" + bl_options = {'REGISTER', 'INTERNAL'} + + _timer = None + confirm_message: bpy.props.StringProperty(default="") + forced_temp_dir: bpy.props.StringProperty(default="") + + def _resolve_video_temp_dir(self, context): + prefs = getattr(context.window_manager, "mgpu_runtime_prefs", None) + use_target_dir = True + if prefs is not None: + use_target_dir = bool(getattr(prefs, "use_target_dir_for_video_temp", True)) + return _mgpu_video_temp_dir_for(context.scene, use_target_dir=use_target_dir) + + def draw(self, context): + layout = self.layout + lines = [l for l in (self.confirm_message or "").split("\n") if l.strip()] + if not lines: + layout.label(text="Overwrite existing output?") + return + for line in lines: + layout.label(text=line) + + def invoke(self, context, event=None): + is_video = _mgpu_is_video(context.scene) + temp_dir = self._resolve_video_temp_dir(context) if is_video else None + if is_video: + self.forced_temp_dir = temp_dir or "" + if context.scene.render.use_overwrite: + warnings = _mgpu_overwrite_warnings(context.scene, is_video, temp_dir=temp_dir) + if warnings: + self.confirm_message = "Overwrite existing output?\n" + "\n".join(warnings) + return context.window_manager.invoke_confirm(self, event) + return self.execute(context) + + def execute(self, context): + global _MANAGER + _cleanup_stale_manager() + if _MANAGER is not None: + self.report({'ERROR'}, "Multi-GPU job already running.") + return {'CANCELLED'} + + is_video = _mgpu_is_video(context.scene) + if is_video: + if not self.forced_temp_dir: + self.forced_temp_dir = self._resolve_video_temp_dir(context) or "" + self.report({'INFO'}, "Video output detected. Rendering to a temp image sequence, then encoding.") + + p = context.window_manager.mgpu_runtime_prefs + try: + mgr = MultiGPUManager( + context.scene, + threads=p.threads_per_process, + instances_per_gpu=p.instances_per_gpu, + dispatch_mode=p.dispatch_mode, + max_retries=p.max_retries, + open_terms=p.open_terminals, + ghost_mode=p.ghost_filter_mode, + use_persistent_data=p.use_persistent_data, + render_guard_tier=p.render_time_guard_tier, + denoise_on_gpu=p.denoise_on_gpu + ) + if is_video: + mgr.video_mode = True + mgr.video_output_path = bpy.path.abspath(context.scene.render.filepath) + if self.forced_temp_dir: + mgr._forced_temp_dir = self.forced_temp_dir + mgr.start() + except Exception as e: + self.report({'ERROR'}, str(e)); return {'CANCELLED'} + + _MANAGER = mgr + wm = context.window_manager + self._timer = wm.event_timer_add(0.25, window=context.window) + wm.modal_handler_add(self) + _log("Multi-GPU frames started.") + return {'RUNNING_MODAL'} + + def modal(self, context, event): + global _MANAGER + if _MANAGER is None: + return {'CANCELLED'} + + if event and event.type == 'ESC': + _MANAGER.stop(); _MANAGER = None + try: context.window_manager.event_timer_remove(self._timer) + except Exception: pass + self.report({'INFO'}, "Multi-GPU cancelled.") + return {'CANCELLED'} + + if event.type == 'TIMER': + try: + done = _MANAGER.poll() + if done: + try: + context.window_manager.event_timer_remove(self._timer) + except Exception: + pass + _MANAGER = None + try: + bpy.ops.wm.redraw_timer(type='DRAW_WIN_SWAP', iterations=1) + except Exception: + pass + self.report({'INFO'}, "Multi-GPU render finished.") + return {'FINISHED'} + except Exception as e: + _log(f"Manager error: {e}") + _MANAGER.stop(); _MANAGER = None + try: context.window_manager.event_timer_remove(self._timer) + except Exception: pass + self.report({'ERROR'}, str(e)) + return {'CANCELLED'} + return {'RUNNING_MODAL'} + +class MGPU_OT_render_mari(bpy.types.Operator): + bl_idname = "render.multi_gpu_mari" + bl_label = "Render (Multi-Instance MARI)" + bl_options = {'REGISTER', 'INTERNAL'} + + job_json: bpy.props.StringProperty(name="Jobs JSON") # {"jobs":[{"cam_name":..., "H":..,"V":..},...]} + mode: bpy.props.EnumProperty(items=[("FRAME","FRAME",""),("CIRCLE","CIRCLE","")], default="FRAME") + action: bpy.props.EnumProperty(items=[("STILL","STILL",""),("ANIM","ANIM","")], default="STILL") + + _timer = None + + def invoke(self, context, event=None): + global _MANAGER + _cleanup_stale_manager() + if _MANAGER is not None: + self.report({'ERROR'}, "Multi-Instance job already running.") + return {'CANCELLED'} + + try: + payload = json.loads(self.job_json or "{}") + jobs = payload.get("jobs") or [] + except Exception as e: + self.report({'ERROR'}, f"Bad job_json: {e}") + return {'CANCELLED'} + + if not jobs: + self.report({'ERROR'}, "No MARI jobs provided.") + return {'CANCELLED'} + + # Prepare globals sent to children + is_video = _mgpu_is_video(context.scene) + if self.action == "STILL" and is_video: + self.report({'ERROR'}, "Cannot render STILL directly to video. Switch to an image format or use ANIM.") + return {'CANCELLED'} + + mari_prop = getattr(context.scene, "mari_props", None) + mari_settings = {} + if mari_prop: + try: + mari_settings = { + "frame_ratio": [float(mari_prop.frame_ratio[0]), float(mari_prop.frame_ratio[1])], + "frame_dimensions": [float(mari_prop.frame_dimensions[0]), float(mari_prop.frame_dimensions[1])], + "frame_center": [float(mari_prop.frame_center[0]), float(mari_prop.frame_center[1]), float(mari_prop.frame_center[2])], + "frame_rotation": [float(mari_prop.frame_rotation[0]), float(mari_prop.frame_rotation[1]), float(mari_prop.frame_rotation[2])], + "render_settings_filepath": bpy.path.abspath(getattr(mari_prop, "render_settings_filepath", "")), + "render_settings_name": str(getattr(mari_prop, "render_settings_name", "") or ""), + "render_settings_normalize": bool(getattr(mari_prop, "render_settings_normalize", False)), + } + except Exception: + mari_settings = {} + + mari_globals = {"mode": "FRAME" if self.mode == "FRAME" else "CIRCLE", + "action": self.action, + "is_video": is_video, + "use_overwrite": bool(getattr(context.scene.render, "use_overwrite", True)), + "use_placeholder": bool(getattr(context.scene.render, "use_placeholder", False)), + "render_resolution_x": int(getattr(context.scene.render, "resolution_x", 0)), + "render_resolution_y": int(getattr(context.scene.render, "resolution_y", 0)), + "render_resolution_percentage": int(getattr(context.scene.render, "resolution_percentage", 100)), + "mari_settings": mari_settings} + + # Pre-export .mari3d and ensure the output folder is prepared exactly like MARI does + try: + export_type = "FRAME" if self.mode == "FRAME" else "CIRCLE" + # --- ensure the MARI output directory exists (mirrors MARI add-on) --- + try: + mari_prop = context.scene.mari_props + base = bpy.path.abspath(getattr(mari_prop, "render_settings_filepath", "")) + name = getattr(mari_prop, "render_settings_name", "").strip() + target_dir = os.path.join(base, name) + if context.scene.render.use_overwrite and os.path.isdir(target_dir): + shutil.rmtree(target_dir) + os.makedirs(target_dir, exist_ok=True) + print(f"[MGPU-PARENT] Ensured MARI output folder exists: {target_dir}") + except Exception as _e: + self.report({'ERROR'}, f"Could not prepare MARI folder: {target_dir} ({_e})") + return {'CANCELLED'} + # -------------------------------------------------------------------- + + bpy.ops.mari.export_mari(action="RENDER", type=export_type, format=self.action) + print(f"[MGPU-PARENT] Exported MARI .mari3d (type={export_type}, format={self.action})") + except Exception as e: + self.report({'ERROR'}, f"MARI export failed: {e}") + return {'CANCELLED'} + + + # Use same runtime prefs as frames operator + p = context.window_manager.mgpu_runtime_prefs + threads = p.threads_per_process + ipg = p.instances_per_gpu + dispatch = p.dispatch_mode + retries = p.max_retries + open_terms= p.open_terminals + + mgr = MultiGPUManager(context.scene, threads=threads, instances_per_gpu=ipg, + dispatch_mode=dispatch, max_retries=retries, open_terms=open_terms, + use_persistent_data=p.use_persistent_data, + job_mode="MARI", mari_jobs=jobs, mari_globals=mari_globals, + render_guard_tier=p.render_time_guard_tier, + denoise_on_gpu=p.denoise_on_gpu) + _MANAGER = mgr + mgr.start() # will prepare blend copy, write child script, start server + + # Replace worker command with MARI mode + for w in mgr.workers: + # re-launch with --mgpu-mode MARI + pass # handled in _launch_worker_process via self.job_mode + + # Install modal timer for UI progress like frames op + self._timer = context.window_manager.event_timer_add(0.3, window=context.window) + context.window_manager.modal_handler_add(self) + return {'RUNNING_MODAL'} + + def modal(self, context, event): + global _MANAGER + if event.type == 'ESC' and getattr(event, "value", 'PRESS') == 'PRESS': + _MANAGER.stop(); _MANAGER = None + try: + context.window_manager.event_timer_remove(self._timer) + except Exception: + pass + self.report({'INFO'}, "Cancelled.") + return {'CANCELLED'} + + if event.type == 'TIMER': + if _MANAGER and _MANAGER.poll(): + # finished + try: + context.window_manager.event_timer_remove(self._timer) + except Exception: + pass + _MANAGER = None + + # Export .mari3d to the same folder the single-instance flow would use + try: + bpy.ops.mari.export_mari('EXEC_DEFAULT') + self.report({'INFO'}, "Completed (exported .mari3d).") + except Exception as e: + self.report({'WARNING'}, f"Completed (but .mari3d export failed: {e})") + + return {'FINISHED'} + + return {'RUNNING_MODAL'} + + +class MGPU_OT_cancel(bpy.types.Operator): + bl_idname = "render.multi_gpu_frames_cancel" + bl_label = "Cancel Multi-GPU Frames" + bl_options = {'INTERNAL'} + + def execute(self, context): + global _MANAGER + if _MANAGER: + _MANAGER.stop(); _MANAGER = None + self.report({'INFO'}, "Multi-GPU job cancelled.") + return {'FINISHED'} + self.report({'INFO'}, "No Multi-GPU job running.") + return {'CANCELLED'} + +class MGPU_OT_open_logs(bpy.types.Operator): + bl_idname = "render.multi_gpu_frames_open_logs" + bl_label = "Open Logs Folder" + bl_options = {'INTERNAL'} + + def execute(self, context): + global _MANAGER + if not _MANAGER or not _MANAGER.logs_dir: + self.report({'ERROR'}, "No job/logs available.") + return {'CANCELLED'} + path = _MANAGER.logs_dir + if IS_WIN: + os.startfile(path) # noqa + elif IS_MAC: + subprocess.call(["open", path]) + else: + subprocess.call(["xdg-open", path]) + return {'FINISHED'} + +class MGPU_PT_panel(bpy.types.Panel): + bl_label = "Multi-Instance Render" + bl_space_type = 'PROPERTIES' + bl_region_type = 'WINDOW' + bl_context = "render" + + def draw(self, context): + layout = self.layout + p = context.window_manager.mgpu_runtime_prefs + + col = layout.column(align=True) + row = col.row(align=True) + row.scale_y = 1.4 + row.alert = True + row.operator("render.multi_gpu_frames", icon='RENDER_STILL', text="Render (Multi-GPU Frames)") + + box = layout.box() + box.label(text="Scheduler Settings") + row = box.row(align=True) + row.prop(p, "dispatch_mode") + row = box.row(align=True) + row.prop(p, "threads_per_process") + row.prop(p, "max_retries") + row = box.row(align=True) + row.prop(p, "render_time_guard_tier") + row = box.row(align=True) + row.prop(p, "instances_per_gpu") + row = box.row(align=True) + row.prop(p, "use_persistent_data") + row.prop(p, "open_terminals") + row = box.row(align=True) + row.prop(p, "denoise_on_gpu") + row = box.row(align=True) + row.prop(p, "use_target_dir_for_video_temp") + box.label(text="Launch diagnostics: check console/logs for [MGPU-LAUNCH] reason codes.") + if _mgpu_is_video(context.scene): + temp_dir = _mgpu_video_temp_dir_for( + context.scene, + use_target_dir=bool(getattr(p, "use_target_dir_for_video_temp", True)) + ) + box.label(text=f"Video temp folder: {_shorten_path(temp_dir)}") + + box2 = layout.box() + box2.label(text="GPU Detection") + row = box2.row(align=True) + row.alert = True + row.label(text="Please Find your Correct number/listing of GPUs") + row = box2.row(align=True) + row.prop(p, "ghost_filter_mode", expand=True) + + backend = _current_compute_type() + legacy = _detect_gpu_devices_legacy(False) + strict = _detect_gpu_devices_strict(True) + final = _detect_gpu_devices_final_from_lists(p.ghost_filter_mode, legacy, strict) + box2.label(text=f"Compute backend: {backend}") + box2.label(text="Note: GPU index order follows NVIDIA/nvidia-smi and may differ from Windows Task Manager numbering.") + final_note = "" + if (not final) and (bpy.context.scene.render.engine == "CYCLES"): + final_note = " (no mapped GPU; CPU worker only if Cycles CPU device is enabled)" + box2.label(text=f"Legacy:{len(legacy)} Strict:{len(strict)} Final:{len(final)}{final_note}") + if len(final) < len(strict): + box2.label(text="Note: Final < Strict; ghost filter may be excluding one or more GPUs.") + mapped_all = _map_selection_to_uuids(final) + mapped, dropped_unknown = _filter_known_mapped_gpus(mapped_all) + if dropped_unknown: + box2.label(text=f"Hidden unresolved GPU entries: {len(dropped_unknown)} (index '?').") + if len(mapped) < len(final): + box2.label(text="Note: Mapping lost devices; check [MGPU-GPUSEL] and [MGPU-LAUNCH] logs.") + phys = _win_query_nvidia_smi_detailed() or [] + if phys: + mapped_phys = {m.get("phys_index") for m in mapped if m.get("phys_index") is not None} + if len(mapped_phys) < len(phys): + phys_idx = {g.get("index") for g in phys if g.get("index") is not None} + missing_idx = sorted([i for i in phys_idx if i not in mapped_phys]) + box2.label(text=f"Warning: NVIDIA physical GPUs={len(phys)} but mapped={len(mapped_phys)}.") + if missing_idx: + box2.label(text=f"Unmapped NVIDIA index(es): {', '.join(str(i) for i in missing_idx)}") + box2.label(text="Missing GPUs can be backend/type filtered; check [MGPU-GPUSEL] logs.") + for m in mapped: + label = f" [GPU {m['phys_index'] if m['phys_index'] is not None else '?'}] {m.get('name') or '?'}" + c_nm = str(m.get("cycles_name") or "") + p_nm = str(m.get("name") or "") + if c_nm and _normalize_gpu_name(c_nm) != _normalize_gpu_name(p_nm): + label += f" (Cycles row: {c_nm})" + box2.label(text=label) + + est = layout.box() + rss = _proc_rss_bytes() + avail = _sys_mem_available_bytes() + n_workers = (len(mapped) if mapped else 1) * (p.instances_per_gpu if mapped else 1) + per_child = None if rss is None else max(int(rss * 0.8), 512 * 1024 * 1024) + total_need = None if (per_child is None) else per_child * n_workers + msg = f"Instances planned: {n_workers} | Blender RSS: {_fmt_bytes(rss) if rss else '?'}" + est.label(text=msg) + if total_need is not None and avail is not None: + risk = " (high risk of OOM)" if total_need > avail*0.8 else "" + est.label(text=f"Estimated RAM needed: {_fmt_bytes(total_need)} | Free: {_fmt_bytes(avail)}{risk}") + else: + est.label(text="RAM estimate not available on this platform (ok to ignore).") + + if not _mgpu_has_mari_addon(): + ad = layout.box() + ad.label(text="Render & Share Holographic 3D Images!!") + row = ad.row(align=True) + row.scale_y = 1.3 + row.alert = True + row.operator("wm.url_open", text="holomari.com", icon='URL').url = "https://holomari.com/info/index" + +# ----------------------- registration ----------------------- + +class MGPU_RuntimePrefsReg(bpy.types.AddonPreferences): + bl_idname = ADDON_KEY + def draw(self, context): + self.layout.label(text="Use the panel in Render Properties â–¸ Multi-GPU Frames.") + +def _add_keymap(): + """Bind our operator to Ctrl+F12 (animation), and remove any old F12 binding we created.""" + kc = bpy.context.window_manager.keyconfigs.addon + if not kc: + return + for km_name in ("Screen", "Window"): + km = kc.keymaps.get(km_name) + if not km: + continue + for kmi in list(km.keymap_items): + if kmi.idname == "render.multi_gpu_frames" and kmi.type == 'F12' and not kmi.ctrl: + try: + km.keymap_items.remove(kmi) + except Exception: + pass + + km = kc.keymaps.new(name="Screen", space_type="EMPTY", region_type='WINDOW') + kmi = km.keymap_items.new("render.multi_gpu_frames", 'F12', 'PRESS', ctrl=True) + _KM_ITEMS.append((km, kmi)) + + +def _remove_keymap(): + """Remove only the keymap items we added during this session.""" + for km, kmi in _KM_ITEMS: + try: + km.keymap_items.remove(kmi) + except Exception: + pass + _KM_ITEMS.clear() + + +def register(): + bpy.utils.register_class(MGPU_RuntimePrefs) + bpy.utils.register_class(MGPU_RuntimePrefsReg) + bpy.utils.register_class(MGPU_OT_render_frames) + bpy.utils.register_class(MGPU_OT_cancel) + bpy.utils.register_class(MGPU_OT_open_logs) + bpy.utils.register_class(MGPU_PT_panel) + bpy.utils.register_class(MGPU_OT_render_mari) + bpy.types.WindowManager.mgpu_runtime_prefs = bpy.props.PointerProperty(type=MGPU_RuntimePrefs) + _add_keymap() + +def unregister(): + _remove_keymap() + try: + del bpy.types.WindowManager.mgpu_runtime_prefs + except Exception: + pass + for cls in [ + MGPU_PT_panel, + MGPU_OT_open_logs, + MGPU_OT_cancel, + MGPU_OT_render_frames, + MGPU_OT_render_mari, # <-- add this + MGPU_RuntimePrefsReg, + MGPU_RuntimePrefs, + ]: + try: + bpy.utils.unregister_class(cls) + except Exception: + pass + diff --git a/scripts/addons/MARI_Advanced/Do not Extract the .zip _ Install entire .zip as an addon.txt b/scripts/addons/MARI_Advanced/Do not Extract the .zip _ Install entire .zip as an addon.txt new file mode 100644 index 0000000..e69de29 diff --git a/scripts/addons/MARI_Advanced/__init__.py b/scripts/addons/MARI_Advanced/__init__.py new file mode 100644 index 0000000..b20d159 --- /dev/null +++ b/scripts/addons/MARI_Advanced/__init__.py @@ -0,0 +1,6829 @@ +bl_info = { + "name": "MARI Advanced", + "author": "HP Park", + "version": (1, 0), + "blender": (3, 0), + "location": "View3D > SidePanel > MARI", + "description": "MARI Advanced", + "warning": "", + "doc_url": "https://holomari.com/info/pages/Blender", + "category": "Render", +} + +# Build marker to verify the active code at runtime (printed once). +MARI_BUILD_TAG = "sandbox-temp-render-v1" + + +import glob +import blf +import bpy +import os +import re +import sys +from mathutils import Vector, Euler, Matrix +from mathutils.bvhtree import BVHTree +from bpy.app.handlers import persistent +from bpy.props import * +from bpy.types import Operator, Menu, WindowManager, Panel, AddonPreferences, PropertyGroup +import bmesh +import math +from bpy_extras.object_utils import world_to_camera_view +from bpy_extras.io_utils import ImportHelper +import numpy as np +import json +import shutil +import uuid + +# Optional dependency: allow the addon to load without cv2 so Preferences stay available. +_MARI_HAS_CV2 = False +_MARI_CV2_IMPORT_ERROR = None +cv2 = None + +def _mari_cv2_deps_dir(): + try: + return os.path.join(os.path.dirname(os.path.abspath(__file__)), "_mari_pydeps") + except Exception: + return "" + +def _mari_cv2_candidate_paths(): + paths = [] + dep = _mari_cv2_deps_dir() + if dep: + paths.append(dep) + try: + import site + user_site = site.getusersitepackages() + if isinstance(user_site, (list, tuple)): + for p in user_site: + if p: + paths.append(p) + elif user_site: + paths.append(user_site) + except Exception: + pass + uniq = [] + seen = set() + for p in paths: + norm = os.path.normcase(os.path.normpath(str(p))) + if norm in seen: + continue + seen.add(norm) + uniq.append(str(p)) + return uniq + +def _mari_ensure_cv2_paths_on_syspath(): + try: + for p in _mari_cv2_candidate_paths(): + if p and p not in sys.path: + sys.path.insert(0, p) + except Exception: + pass + +def _mari_try_import_cv2(): + """Attempt to import cv2; return True if available.""" + global cv2, _MARI_HAS_CV2, _MARI_CV2_IMPORT_ERROR + _mari_ensure_cv2_paths_on_syspath() + try: + import cv2 as _cv2 + cv2 = _cv2 + _MARI_HAS_CV2 = True + _MARI_CV2_IMPORT_ERROR = None + return True + except Exception as exc: + cv2 = None + _MARI_HAS_CV2 = False + _MARI_CV2_IMPORT_ERROR = str(exc) + return False + +_mari_try_import_cv2() + +import subprocess +print(sys.version) + + +def _mari_cv2_admin_hint(): + base = "Installer uses addon-local/user-site paths first (admin is usually not required)." + if sys.platform.startswith("win"): + return base + " If blocked by system policy, reopen Blender as Administrator and retry." + if sys.platform == "darwin": + return base + " If blocked by system policy, rerun Blender with elevated privileges and retry." + return base + " If blocked by system policy, rerun Blender with elevated privileges and retry." + + +def _mari_cv2_install_instructions(): + return ( + "cv2 (opencv-python) is required for FRAME rendering. " + "Open Blender Preferences > Add-ons > MARI Advanced > Install/Repair cv2. " + + _mari_cv2_admin_hint() + ) + + +def _mari_require_cv2_for_frame(operator=None): + if not (_MARI_HAS_CV2 and cv2 is not None): + _mari_try_import_cv2() + if _MARI_HAS_CV2 and cv2 is not None: + return True + msg = _mari_cv2_install_instructions() + if operator is not None: + try: + operator.report({'ERROR'}, msg) + except Exception: + pass + print(f"[MARI] {msg}") + if _MARI_CV2_IMPORT_ERROR: + print(f"[MARI] cv2 import error: {_MARI_CV2_IMPORT_ERROR}") + return False + + + +addon_prefix = "mari" +_MARI_MODE_FRAME = "FRAME" +_MARI_MODE_CIRCLE = "CRICLE" # Enum identifier kept for backward compatibility. + +# --- HoloMARI Multi-Instance integration helpers --- +import addon_utils + +def _mari_find_multirender_module(): + """Return the module name for the Multi-Render add-on, or None if not present.""" + try: + for m in addon_utils.modules(): + bi = getattr(m, "bl_info", {}) or {} + nm = (bi.get("name") or "").lower() + if ( + "multi-headless instance renderer" in nm + or "multi-gpu frames" in nm + or "multi-render" in nm + or "multirender" in nm + ): + return m.__name__ + except Exception: + pass + return None + +def _mari_has_multi(): + mod = _mari_find_multirender_module() + if not mod: + return False + try: + enabled, _loaded = addon_utils.check(mod) + return bool(enabled) + except Exception: + return False + + +def _mari_normalize_mode_id(value, fallback=_MARI_MODE_CIRCLE): + key = str(value or "").upper() + if key == _MARI_MODE_FRAME: + return _MARI_MODE_FRAME + if key in {_MARI_MODE_CIRCLE, "CIRCLE"}: + return _MARI_MODE_CIRCLE + return fallback + + +def _mari_scene_mode_from_objects(scene, fallback=_MARI_MODE_CIRCLE): + if not scene: + return fallback + + has_frame = False + has_circle = False + frame_parented = 0 + circle_parented = 0 + + try: + has_frame = scene.objects.get("MARI_FrameCenter") is not None + except Exception: + has_frame = any(obj.name == "MARI_FrameCenter" for obj in scene.objects) + try: + has_circle = scene.objects.get("MARI_CircleCenter") is not None + except Exception: + has_circle = any(obj.name == "MARI_CircleCenter" for obj in scene.objects) + + try: + for obj in scene.objects: + if not obj.name.startswith("MARI_CAMERA"): + continue + parent_name = getattr(getattr(obj, "parent", None), "name", "") + if parent_name == "MARI_FrameCenter": + frame_parented += 1 + elif parent_name == "MARI_CircleCenter": + circle_parented += 1 + except Exception: + pass + + if has_frame and not has_circle: + return _MARI_MODE_FRAME + if has_circle and not has_frame: + return _MARI_MODE_CIRCLE + if has_frame and has_circle: + if circle_parented > frame_parented: + return _MARI_MODE_CIRCLE + return _MARI_MODE_FRAME + return fallback + + +def _mari_sync_mode_for_all_scenes(): + try: + scenes = list(getattr(bpy.data, "scenes", []) or []) + except Exception: + scenes = [] + for scene in scenes: + try: + mari_detect_mode_from_scene(scene) + except Exception: + pass + + +def _mari_mode_sync_timer(): + _mari_sync_mode_for_all_scenes() + return None + + +def _mari_schedule_mode_sync(delay=0.0): + try: + bpy.app.timers.unregister(_mari_mode_sync_timer) + except Exception: + pass + try: + bpy.app.timers.register(_mari_mode_sync_timer, first_interval=max(0.0, float(delay))) + except Exception: + pass + + +handle = None + + + +class mari: + generated = False + last_radius = 5 + cameras = [] + next_cam_index = 0 + did_focal = False + res_x = 0 + res_y = 0 + render_action = "STILL" + is_normalized = False + planes = [] + data = {} + area = None + context = None + og_type = None + c = 0 + cam_num = 0 + is_txt_on = 0 + ffmpeg_format = None + ffmpeg_codec = None + ffmpeg_color_mode = None + +try: + mari.cancel_all +except AttributeError: + mari.cancel_all = False +try: + mari._prev_render_display_holder +except AttributeError: + mari._prev_render_display_holder = (None, None, None) # (obj, attr_name, prev_value) + + +def _mari__get_display_target(): + """ + Detect which render-display setting exists and return (obj, attr_name, allowed_set). + + A) prefs.view.render_display_type -> {'NONE','SCREEN','AREA','WINDOW'} + - 'SCREEN' shows the Render View inside Blender's main window (no OS pop-up). + - 'AREA' also keeps it in-UI but depends on the active area. + + B) scene.render.display_mode -> {'IMAGE_EDITOR','SCREEN','WINDOW','KEEP_UI'} + - 'SCREEN' or 'IMAGE_EDITOR' are both in-UI (no OS pop-up). + """ + prefs_view = getattr(bpy.context.preferences, "view", None) + if prefs_view and hasattr(prefs_view, "render_display_type"): + allowed = {'NONE', 'SCREEN', 'AREA', 'WINDOW'} + return (prefs_view, "render_display_type", allowed) + + sr = getattr(bpy.context.scene, "render", None) + if sr and hasattr(sr, "display_mode"): + allowed = {'IMAGE_EDITOR', 'SCREEN', 'WINDOW', 'KEEP_UI'} + return (sr, "display_mode", allowed) + + return (None, None, set()) + + +def _mari_unlock_interface(): + """ + Ensure Blender is allowed to update the UI while rendering. + Some builds expose scene.render.use_lock_interface; some place it in preferences.system. + """ + try: + bpy.context.scene.render.use_lock_interface = False + except Exception: + pass + try: + # legacy / alternate location on some versions + bpy.context.preferences.system.use_lock_interface = False + except Exception: + pass + + +def _mari_set_render_display_for_preview(): + """ + Force renders to use the separate OS pop-up window (same as F12). + We save the user's old setting and restore it later. + """ + holder, attr, allowed = _mari__get_display_target() + if holder is None: + mari._prev_render_display_holder = (None, None, None) + return + + prev = getattr(holder, attr) + mari._prev_render_display_holder = (holder, attr, prev) + + # Prefer OS pop-up window + if 'WINDOW' in allowed: + setattr(holder, attr, 'WINDOW') + elif 'SCREEN' in allowed: + # Fallback (older builds). Still shows a separate render "Screen". + setattr(holder, attr, 'SCREEN') + + _mari_unlock_interface() + + + +def _mari_restore_render_display(): + """Restore the user's render display preference if changed.""" + holder, attr, prev = mari._prev_render_display_holder + if holder is not None and attr is not None: + try: + setattr(holder, attr, prev) + except Exception: + pass + mari._prev_render_display_holder = (None, None, None) + + +def _mari_activate_object(obj): + """Make 'obj' the active object even in background/headless sessions.""" + if obj is None: + return False + try: + view_layer = bpy.context.view_layer + except Exception: + return False + try: + for other in view_layer.objects: + other.select_set(False) + except Exception: + pass + try: + obj.select_set(True) + except Exception: + pass + try: + view_layer.objects.active = obj + return True + except Exception: + return False + + +def _mari_new_plane(name="MARI_TempFramePlane"): + """Create a simple plane mesh without relying on 3D View operators.""" + try: + mesh = bpy.data.meshes.new(name) + obj = bpy.data.objects.new(name, mesh) + verts = [(-0.5, -0.5, 0.0), (0.5, -0.5, 0.0), (0.5, 0.5, 0.0), (-0.5, 0.5, 0.0)] + mesh.from_pydata(verts, [], [(0, 1, 2, 3)]) + mesh.update(calc_edges=True) + collection = bpy.context.scene.collection + collection.objects.link(obj) + return obj + except Exception: + return None + + +def _mari_get_collection(scene, name): + if scene is None: + return None + coll = bpy.data.collections.get(name) + if coll is None: + coll = bpy.data.collections.new(name) + if coll.name not in [c.name for c in scene.collection.children]: + scene.collection.children.link(coll) + return coll + + +def _mari_link_object_to_collection(obj, coll): + if obj is None or coll is None: + return + if obj.name not in coll.objects: + coll.objects.link(obj) + for other in list(obj.users_collection): + if other != coll: + try: + other.objects.unlink(obj) + except Exception: + pass + + +def _mari_cleanup_temp_collection(scene): + coll = bpy.data.collections.get("MARI_Cameras_Temp") + if coll is None: + return + target = _mari_get_collection(scene, "MARI_Cameras") + for obj in list(coll.objects): + _mari_link_object_to_collection(obj, target) + try: + coll.objects.unlink(obj) + except Exception: + pass + for scn in bpy.data.scenes: + try: + if coll in scn.collection.children: + scn.collection.children.unlink(coll) + except Exception: + pass + for parent in bpy.data.collections: + try: + if coll in parent.children: + parent.children.unlink(coll) + except Exception: + pass + try: + bpy.data.collections.remove(coll) + except Exception: + pass + + +def _mari_purge_orphan_mari_camera_data(): + for cam_data in list(bpy.data.cameras): + try: + if cam_data.name.startswith("MARI_Camera") and cam_data.users == 0: + bpy.data.cameras.remove(cam_data) + except Exception: + pass + + +_MARI_VIDEO_FORMATS = {"FFMPEG", "AVI_JPEG", "AVI_RAW", "FRAME_SERVER"} +_MARI_IMAGE_EXTENSIONS = { + "jpeg": "jpeg", + "jpeg_2000": "jpeg", + "iris": "rgb", + "targa": "tga", + "targa_raw": "tga", + "cineon": "cin", + "open_exr": "exr", + "open_exr_multilayer": "exr", + "tiff": "tif", + "avi_jpeg": "avi", + "avi_raw": "avi", + "png": "png", + "bmp": "bmp", +} +_MARI_FFMPEG_EXTENSIONS = { + "MPEG1": "mpeg1", + "MPEG2": "mpeg2", + "MPEG4": "mp4", + "AVI": "avi", + "QUICKTIME": "mov", + "DV": "dv", + "OGG": "ogg", + "MKV": "mkv", + "FLASH": "flv", + "WEBM": "webm", +} + + +def _mari_ff_type_from_format(fmt: str) -> str: + fmt_upper = (fmt or "").upper() + return "ANIM" if fmt_upper in _MARI_VIDEO_FORMATS else "STILL" + + +def _mari_video_extension(scene=None) -> str: + scene = scene or bpy.context.scene + ffmpeg = getattr(scene.render, "ffmpeg", None) + fmt = getattr(ffmpeg, "format", "MKV") if ffmpeg else "MKV" + return _MARI_FFMPEG_EXTENSIONS.get(fmt, "mkv").lower() + + + + +def _mari_extension_from_format(fmt: str, scene=None) -> str: + fmt_lower = (fmt or "").lower() + if fmt_lower == "ffmpeg": + return _mari_video_extension(scene) + return _MARI_IMAGE_EXTENSIONS.get(fmt_lower, fmt_lower) + + +def _mari_current_extension(scene=None) -> str: + scene = scene or bpy.context.scene + fmt = getattr(scene.render.image_settings, "file_format", "PNG") + return _mari_extension_from_format(fmt, scene) + + +def _mari_current_ff_type(scene=None) -> str: + scene = scene or bpy.context.scene + fmt = getattr(scene.render.image_settings, "file_format", "PNG") + return _mari_ff_type_from_format(fmt) + + +# --- PERSPFLAG helpers: one per H#_V# (and H#_V#_TEMP) folder --- + +def _persp_flag_path(dirpath: str) -> str: + """ + Return the path to the PERSPFLAG marker for a given directory. + One PERSPFLAG.txt per H#_V# (and H#_V#_TEMP) folder. + """ + return os.path.join(dirpath, "PERSPFLAG.txt") + +def _ensure_persp_flag(dirpath: str) -> None: + """ + Create PERSPFLAG.txt in this directory if it does not exist. + Used when we BEGIN rendering frames that still need cv2 warp. + """ + try: + os.makedirs(dirpath, exist_ok=True) + flag_path = _persp_flag_path(dirpath) + if not os.path.exists(flag_path): + with open(flag_path, "w", encoding="utf-8") as f: + f.write("perspective warp pending\n") + except Exception as e: + print(f"[MARI] WARN: could not create PERSPFLAG in {dirpath}: {e}") + +def _clear_persp_flag(dirpath: str) -> None: + """ + Remove PERSPFLAG.txt for this directory once the cv2 warp has + successfully finished on all frames in that folder. + """ + try: + flag_path = _persp_flag_path(dirpath) + if os.path.exists(flag_path): + os.remove(flag_path) + except Exception as e: + print(f"[MARI] WARN: could not remove PERSPFLAG in {dirpath}: {e}") + + + + + +def _mari_write_media_zip(prop): + """Zip the current render directory when 'Save as MARI Media' is enabled.""" + try: + if not getattr(prop, "mari_save_media", False): + return + base = bpy.path.abspath(getattr(prop, "render_settings_filepath", "")) + name = getattr(prop, "render_settings_name", "").strip() + if not (base and name): + return + root_dir = os.path.join(base, name) + if not os.path.isdir(root_dir): + print(f"[MARI] WARN: cannot create media zip; missing folder {root_dir}") + return + # Zip lives one level above the render folder, alongside it. + zip_path = os.path.join(base, f"{name}.zip") + from zipfile import ZipFile, ZIP_DEFLATED + with ZipFile(zip_path, 'w', ZIP_DEFLATED) as zipf: + for root, dirs, files in os.walk(root_dir): + for file in files: + full = os.path.join(root, file) + # Avoid adding the zip into itself if it already exists. + if os.path.normpath(full) == os.path.normpath(zip_path): + continue + rel = os.path.relpath(full, start=root_dir) + # Keep the project folder at the archive root. + arcname = os.path.join(name, rel) + zipf.write(full, arcname=arcname) + print(f"[MARI] Wrote media zip: {zip_path}") + except Exception as e: + print(f"[MARI] WARN: failed to create media zip: {e}") + + + +def _mari_poly_area_2d(points): + """Helper to calc 2D area for normalization.""" + area = 0.0 + for i in range(len(points)): + j = (i + 1) % len(points) + area += points[i][0] * points[j][1] + area -= points[j][0] * points[i][1] + return abs(area) / 2.0 + +def _mari_order_quad(points): + """Legacy ordering: Swap indices 2 and 3.""" + pts = [list(p) for p in points] + if len(pts) >= 4: + pts = pts[:4] + pts[2], pts[3] = pts[3], pts[2] + return pts + + +def _mari_frame_local_corners(prop): + """Return deterministic FRAME corners in local space as [BL, BR, TL, TR].""" + half_w = float(prop.frame_dimensions[0]) * 0.5 + half_h = float(prop.frame_dimensions[1]) * 0.5 + return [ + Vector((-half_w, 0.0, -half_h)), + Vector((half_w, 0.0, -half_h)), + Vector((-half_w, 0.0, half_h)), + Vector((half_w, 0.0, half_h)), + ] + + +def _mari_frame_world_matrix(prop): + """Match the original built-in FRAME helper orientation exactly.""" + rx, ry, rz = prop.frame_rotation + return ( + Matrix.Translation(Vector(prop.frame_center)) + @ Euler((-rx, -ry, rz + math.pi)).to_matrix().to_4x4() + ) + + +def _mari_frame_display_normal(prop): + """ + Return the display-facing side of the FRAME plane in world space. + The historical MARI output convention matches the +Y side of the local frame plane. + """ + normal = _mari_frame_world_matrix(prop).to_3x3() @ Vector((0.0, 1.0, 0.0)) + if normal.length == 0.0: + return Vector((0.0, 1.0, 0.0)) + return normal.normalized() + + +def _mari_project_frame_local_point(scene, cam, prop, real_x, real_y, local_point): + """Project one local-space FRAME point into image-space pixel coordinates.""" + co_world = _mari_frame_world_matrix(prop) @ local_point + co_ndc = world_to_camera_view(scene, cam, co_world) + if not (0.0 < co_ndc.x < 1.0 and 0.0 < co_ndc.y < 1.0): + return None + return [real_x * co_ndc.x, real_y - (real_y * co_ndc.y)] + + +def _mari_frame_probe_local_points(prop): + """ + Probe points along the local horizontal and vertical axes. + These let us verify the actual homography orientation instead of trusting corner winding. + """ + half_w = float(prop.frame_dimensions[0]) * 0.5 + half_h = float(prop.frame_dimensions[1]) * 0.5 + px = max(half_w * 0.35, 1e-4) + pz = max(half_h * 0.35, 1e-4) + return { + "left": Vector((-px, 0.0, 0.0)), + "right": Vector((px, 0.0, 0.0)), + "bottom": Vector((0.0, 0.0, -pz)), + "top": Vector((0.0, 0.0, pz)), + } + + +def _mari_warp_destination_quad(real_x, real_y, flip_x=False, flip_y=False): + """Destination quad for [BL, BR, TL, TR] with optional axis flips baked in.""" + x_l = float(real_x) if flip_x else 0.0 + x_r = 0.0 if flip_x else float(real_x) + y_t = float(real_y) if flip_y else 0.0 + y_b = 0.0 if flip_y else float(real_y) + return np.array([ + [x_l, y_b], # BL + [x_r, y_b], # BR + [x_l, y_t], # TL + [x_r, y_t], # TR + ], dtype=np.float32) + + +def _mari_frame_expected_x_positive_to_right(cam, prop): + """ + Keep the output aligned to the same physical display side of the FRAME. + Viewing the opposite side reverses handedness, so only then does +X move right. + """ + try: + cam_vec = Vector(cam.matrix_world.translation) - Vector(prop.frame_center) + if cam_vec.length == 0.0: + return False + cam_vec.normalize() + return _mari_frame_display_normal(prop).dot(cam_vec) < 0.0 + except Exception: + return False + + +def _mari_frame_warp_flip_flags(scene, cam, prop, quad, real_x, real_y): + """ + Decide the final horizontal/vertical flips from projected frame-local probe points. + This makes the output orientation independent of camera pose and frame rotation. + """ + try: + src = np.array(quad, dtype=np.float32).reshape(4, 2) + base_dst = _mari_warp_destination_quad(real_x, real_y, flip_x=False, flip_y=False) + M = cv2.getPerspectiveTransform(src, base_dst) + + probes = _mari_frame_probe_local_points(prop) + projected = {} + for key, local_point in probes.items(): + img_pt = _mari_project_frame_local_point(scene, cam, prop, real_x, real_y, local_point) + if img_pt is None: + return False, False + arr = np.array([[img_pt]], dtype=np.float32) + projected[key] = cv2.perspectiveTransform(arr, M)[0][0] + + x_positive_to_right = float(projected["right"][0]) > float(projected["left"][0]) + z_positive_to_up = float(projected["top"][1]) < float(projected["bottom"][1]) + + desired_x_positive_to_right = _mari_frame_expected_x_positive_to_right(cam, prop) + desired_z_positive_to_up = True + + return ( + x_positive_to_right != desired_x_positive_to_right, + z_positive_to_up != desired_z_positive_to_up, + ) + except Exception: + return False, False + + +def _mari_project_frame_quad(scene, cam, prop, real_x, real_y): + """ + Project FRAME corners for one camera using deterministic local corner identities. + Output order is always [BL, BR, TL, TR] in image space. + """ + world_matrix = _mari_frame_world_matrix(prop) + quad = [] + for local_corner in _mari_frame_local_corners(prop): + co_world = world_matrix @ local_corner + co_ndc = world_to_camera_view(scene, cam, co_world) + if not (0.0 < co_ndc.x < 1.0 and 0.0 < co_ndc.y < 1.0): + return quad + quad.append([real_x * co_ndc.x, real_y - (real_y * co_ndc.y)]) + return quad + + +def _mari_quad_area_bl_br_tl_tr(points): + """Area helper for quads stored in [BL, BR, TL, TR] order.""" + if not points or len(points) < 4: + return 0.0 + cyc = [points[0], points[1], points[3], points[2]] + return _mari_poly_area_2d(cyc) + + +def _mari_quad_valid(points, min_area=1.0): + if not points or len(points) < 4: + return False + try: + pts = [[float(p[0]), float(p[1])] for p in points[:4]] + except Exception: + return False + uniq = {(round(x, 6), round(y, 6)) for x, y in pts} + if len(uniq) < 4: + return False + return _mari_poly_area_2d(pts) > float(min_area) + + +def _mari_frame_border_message(camera_name=None): + cam_txt = f" for camera {camera_name}" if camera_name else "" + return ( + f"The FRAME exceeds the camera borders{cam_txt}. Regenerate the FRAME. " + "Only use the add-on UI to change the Frame Translation/Rotation; " + "do not move or rotate the FRAME manually in the viewport." + ) + + +def _mari_stabilize_quad_bl_br_tl_tr(points): + """ + Normalize any 4-corner quad into [BL, BR, TL, TR] in image-space coordinates. + This guards against platform-dependent vertex/corner ordering differences. + """ + try: + import numpy as np + pts = np.array(points[:4], dtype=np.float32).reshape(4, 2) + s = pts.sum(axis=1) + d = (pts[:, 1] - pts[:, 0]) + tl = pts[int(np.argmin(s))] + br = pts[int(np.argmax(s))] + tr = pts[int(np.argmin(d))] + bl = pts[int(np.argmax(d))] + out = [[float(bl[0]), float(bl[1])], + [float(br[0]), float(br[1])], + [float(tl[0]), float(tl[1])], + [float(tr[0]), float(tr[1])]] + if not _mari_quad_valid(out): + return points + return out + except Exception: + return points + +def _mari_refresh_frame_quads(context, prop, real_x, real_y): + """ + Recompute cam["verts"] from deterministic FRAME local corners. + Stored order is always [BL, BR, TL, TR] at the frame-ratio resolution. + """ + scene = context.scene + try: + for cam in bpy.data.objects: + if not cam.name.startswith("MARI_CAMERA"): + continue + quad = _mari_project_frame_quad(scene, cam, prop, real_x, real_y) + cam["verts"] = quad + cam["area"] = _mari_quad_area_bl_br_tl_tr(quad) + except Exception as exc: + return False, f"Failed to project FRAME corners: {exc}" + + return True, "" + +def _mari_cam_quad(cam, scn, prop): + """ + Retrieve the stored FRAME quad and scale it to the active render resolution. + """ + verts = cam.get("verts") or [] + if len(verts) < 4: + return None + + real_x = int(prop.frame_ratio[0]) + real_y = int(prop.frame_ratio[1]) + + arr = [] + for i in range(4): + vx, vy = verts[i] + if getattr(prop, "render_settings_normalize", False): + sx = scn.render.resolution_x / float(real_x) + sy = scn.render.resolution_y / float(real_y) + arr.append([vx * sx, vy * sy]) + else: + pct = scn.render.resolution_percentage / 100.0 + arr.append([vx * pct, vy * pct]) + + return arr + + +def _mari_prepare_frame_quad(cam, scn, prop): + quad = _mari_cam_quad(cam, scn, prop) + if not quad or len(quad) < 4: + return None + return quad + +def _mari_warp_image(img, quad, real_x, real_y, flip=False, flip_y=False): + """ + Warp image using standard cv2. + flip: horizontal flip. + flip_y: vertical flip. + """ + import cv2 + import numpy as np + + if img is None: return img + + quad_np = np.array(quad, dtype=np.float32).reshape(-1, 2) + + dst = _mari_warp_destination_quad(real_x, real_y, flip_x=flip, flip_y=flip_y) + + try: + M = cv2.getPerspectiveTransform(quad_np, dst) + warped = cv2.warpPerspective(img, M, (int(real_x), int(real_y))) + return warped + except Exception: + return img + +def _mari_capture_render_settings(scene): + """Snapshot key render settings so we can safely restore them later.""" + rd = scene.render + return { + "filepath": rd.filepath, + "res_x": rd.resolution_x, + "res_y": rd.resolution_y, + "res_pct": rd.resolution_percentage, + } + + +def _mari_restore_render_settings(scene, state): + """Restore settings captured via _mari_capture_render_settings.""" + rd = scene.render + try: + rd.filepath = state.get("filepath", rd.filepath) + except Exception: + pass + try: + rd.resolution_x = state.get("res_x", rd.resolution_x) + rd.resolution_y = state.get("res_y", rd.resolution_y) + rd.resolution_percentage = state.get("res_pct", rd.resolution_percentage) + except Exception: + pass + + +def _mari_apply_frame_resolution(scene, prop): + """ + Align the scene resolution to the FRAME ratio exactly like the main + MARI pipeline: bake in the percentage and set percentage to 100. + Returns a snapshot suitable for _mari_restore_render_settings. + """ + state = _mari_capture_render_settings(scene) + try: + real_x = int(prop.frame_ratio[0]) + real_y = int(prop.frame_ratio[1]) + pct = scene.render.resolution_percentage + scene.render.resolution_x = int(real_x * pct / 100) + scene.render.resolution_y = int(real_y * pct / 100) + scene.render.resolution_percentage = 100 + except Exception: + pass + return state + +def _mari_output_path_set(prop): + try: + return bool((prop.render_settings_filepath or "").strip()) + except Exception: + return False + +def _mari_default_prop_value(prop_name, fallback): + try: + return MARI_Props.bl_rna.properties[prop_name].default + except Exception: + try: + return bpy.types.Scene.mari_props.bl_rna.properties[prop_name].default + except Exception: + return fallback + +def _mari_is_valid_render_output(path): + try: + size_bytes = os.path.getsize(path) + if size_bytes <= 0: + return False + except Exception: + return False + + ext = os.path.splitext(path)[1].lower().lstrip(".") + if ext in _MARI_IMAGE_EXTENSIONS.values(): + # Avoid noisy loader errors for tiny/placeholder files. + if size_bytes < 256: + return False + img = None + try: + img = bpy.data.images.load(path, check_existing=False) + size = getattr(img, "size", None) + return bool(size and size[0] > 0 and size[1] > 0) + except Exception: + return False + finally: + if img is not None: + try: + bpy.data.images.remove(img) + except Exception: + pass + return True + + +def _mari_image_matches_expected_size(path, expected_size): + expected = None + try: + if expected_size: + expected = (int(expected_size[0]), int(expected_size[1])) + except Exception: + expected = None + if not expected or expected[0] <= 0 or expected[1] <= 0: + return True + + img = None + try: + img = bpy.data.images.load(path, check_existing=False) + size = getattr(img, "size", None) + if not size: + return False + return int(size[0]) == expected[0] and int(size[1]) == expected[1] + except Exception: + return False + finally: + if img is not None: + try: + bpy.data.images.remove(img) + except Exception: + pass + +def _mari_scene_final_render_size(scene): + try: + pct = float(getattr(scene.render, "resolution_percentage", 100) or 100.0) + w = int(round(float(scene.render.resolution_x) * pct / 100.0)) + h = int(round(float(scene.render.resolution_y) * pct / 100.0)) + if w > 0 and h > 0: + return (w, h) + except Exception: + pass + return None + +def _mari_expected_image_output_size(scene, prop, mode): + mode_id = _mari_normalize_mode_id(mode) + if mode_id == _MARI_MODE_FRAME: + try: + return (int(prop.frame_ratio[0]), int(prop.frame_ratio[1])) + except Exception: + return None + return _mari_scene_final_render_size(scene) + +def _mari_expected_frame_numbers(scene): + try: + frame_start = int(getattr(scene, "frame_start", 1)) + frame_end = int(getattr(scene, "frame_end", frame_start)) + frame_step = max(1, int(getattr(scene, "frame_step", 1) or 1)) + except Exception: + return [] + if frame_end < frame_start: + return [] + return list(range(frame_start, frame_end + 1, frame_step)) + +def _mari_output_ext_variants(ext): + ext_clean = str(ext or "").lower().lstrip(".") + if not ext_clean: + return set() + if ext_clean in {"jpg", "jpeg"}: + return {"jpg", "jpeg"} + if ext_clean in {"tif", "tiff"}: + return {"tif", "tiff"} + return {ext_clean} + +def _mari_image_output_complete(path, expected_size=None): + try: + size_bytes = os.path.getsize(path) + if size_bytes < 256: + return False + except Exception: + return False + + expected = None + try: + if expected_size: + expected = (int(expected_size[0]), int(expected_size[1])) + except Exception: + expected = None + + img = None + try: + img = bpy.data.images.load(path, check_existing=False) + size = getattr(img, "size", None) + if not size: + return False + width = int(size[0]) + height = int(size[1]) + if width <= 0 or height <= 0: + return False + if expected and expected[0] > 0 and expected[1] > 0: + return width == expected[0] and height == expected[1] + return True + except Exception: + return False + finally: + if img is not None: + try: + bpy.data.images.remove(img) + except Exception: + pass + +def _mari_collect_scene_camera_jobs(scene): + try: + obj_iter = list(getattr(scene, "objects", []) or bpy.data.objects) + except Exception: + obj_iter = list(bpy.data.objects) + + ordered_keys = [] + best_by_key = {} + + def _name_score(name, h_val, v_val): + exact = f"MARI_CAMERA_H{h_val}_V{v_val}" + if name == exact: + return 0 + if name.startswith(exact) and "." not in name: + return 1 + if name.startswith("MARI_CAMERA"): + return 2 + return 3 + + for obj in obj_iter: + name = getattr(obj, "name", "") + if not name.startswith("MARI_CAMERA"): + continue + try: + h_val = int(obj.get("H")) + v_val = int(obj.get("V")) + except Exception: + continue + + key = (h_val, v_val) + rec = {"cam_name": name, "H": h_val, "V": v_val} + prev = best_by_key.get(key) + if prev is None: + ordered_keys.append(key) + best_by_key[key] = rec + continue + if _name_score(rec["cam_name"], h_val, v_val) < _name_score(prev["cam_name"], h_val, v_val): + best_by_key[key] = rec + + return [dict(best_by_key[key]) for key in ordered_keys] + +def _mari_collect_valid_sequence_frames(seq_dir, prefix, ext, expected_size=None, require_clean_warp=False): + valid_frames = set() + if not seq_dir or not os.path.isdir(seq_dir): + return valid_frames + if require_clean_warp and os.path.exists(_persp_flag_path(seq_dir)): + return valid_frames + + ext_variants = _mari_output_ext_variants(ext) + if not ext_variants: + return valid_frames + + try: + for entry in os.scandir(seq_dir): + if not entry.is_file(): + continue + stem, file_ext = os.path.splitext(entry.name) + if file_ext.lower().lstrip(".") not in ext_variants: + continue + if not stem.startswith(prefix): + continue + suffix = stem[len(prefix):] + if not suffix.isdigit(): + continue + if _mari_image_output_complete(entry.path, expected_size=expected_size): + valid_frames.add(int(suffix)) + except Exception: + return valid_frames + + return valid_frames + +def _mari_find_valid_still_output(root_dir, base_stem, ext, expected_size=None): + if not root_dir or not os.path.isdir(root_dir): + return "" + + ext_variants = _mari_output_ext_variants(ext) + if not ext_variants: + return "" + + try: + for entry in os.scandir(root_dir): + if not entry.is_file(): + continue + stem, file_ext = os.path.splitext(entry.name) + if file_ext.lower().lstrip(".") not in ext_variants: + continue + if stem == base_stem: + if _mari_image_output_complete(entry.path, expected_size=expected_size): + return entry.path + continue + if not stem.startswith(base_stem): + continue + suffix = stem[len(base_stem):] + if len(suffix) >= 3 and suffix.isdigit(): + if _mari_image_output_complete(entry.path, expected_size=expected_size): + return entry.path + except Exception: + return "" + + return "" + +def _mari_plan_multi_resume_jobs(scene, prop, mode, action): + mode_id = _mari_normalize_mode_id(mode) + action_id = str(action or "STILL").upper() + cameras = _mari_collect_scene_camera_jobs(scene) + total_cameras = len(cameras) + + summary = { + "jobs": [], + "cameras": cameras, + "total_cameras": total_cameras, + "complete_cameras": 0, + "pending_cameras": total_cameras, + "ready_frames": 0, + "pending_frames": 0, + "expected_frames": 0, + "root_dir": "", + "is_video_output": (_mari_current_ff_type(scene) == "ANIM"), + "action": action_id, + "mode": mode_id, + } + + if not cameras: + return summary + + base_dir = bpy.path.abspath(getattr(prop, "render_settings_filepath", "")) + name = str(getattr(prop, "render_settings_name", "") or "").strip() + summary["root_dir"] = os.path.join(base_dir, name) if (base_dir and name) else "" + + if getattr(scene.render, "use_overwrite", True): + summary["jobs"] = [dict(cam) for cam in cameras] + return summary + + expected_size = _mari_expected_image_output_size(scene, prop, mode_id) + + if action_id == "STILL": + ext = _mari_current_extension(scene) + jobs = [] + complete = 0 + for cam in cameras: + stem = f"{name}_H{cam['H']}_V{cam['V']}" + found = _mari_find_valid_still_output(summary["root_dir"], stem, ext, expected_size=expected_size) + if found: + complete += 1 + else: + jobs.append(dict(cam)) + summary["jobs"] = jobs + summary["complete_cameras"] = complete + summary["pending_cameras"] = len(jobs) + return summary + + if summary["is_video_output"]: + video_ext = _mari_video_extension(scene) + jobs = [] + complete = 0 + for cam in cameras: + final_path = os.path.join(summary["root_dir"], f"{name}_H{cam['H']}_V{cam['V']}.{video_ext}") + if _mari_is_valid_render_output(final_path): + complete += 1 + else: + jobs.append(dict(cam)) + summary["jobs"] = jobs + summary["complete_cameras"] = complete + summary["pending_cameras"] = len(jobs) + return summary + + frames = _mari_expected_frame_numbers(scene) + ext = _mari_current_extension(scene) + prefix = name + "_" + require_clean_warp = (mode_id == _MARI_MODE_FRAME) + jobs = [] + ready_frames = 0 + complete = 0 + pending_frames = 0 + + for cam in cameras: + seq_dir = os.path.join(summary["root_dir"], f"{name}_H{cam['H']}_V{cam['V']}") + valid_frames = _mari_collect_valid_sequence_frames( + seq_dir, + prefix, + ext, + expected_size=expected_size, + require_clean_warp=require_clean_warp, + ) + missing_frames = [frame for frame in frames if frame not in valid_frames] + ready_frames += len(valid_frames) + pending_frames += len(missing_frames) + if not missing_frames: + complete += 1 + continue + if not valid_frames: + jobs.append(dict(cam)) + continue + for frame in missing_frames: + job = dict(cam) + job["frame"] = int(frame) + jobs.append(job) + + summary["jobs"] = jobs + summary["complete_cameras"] = complete + summary["pending_cameras"] = total_cameras - complete + summary["ready_frames"] = ready_frames + summary["pending_frames"] = pending_frames + summary["expected_frames"] = len(frames) * total_cameras + return summary + + +_MARI_RENDER_ONE_STATUS_KEY = "_mari_render_one_status" + + +def _mari_set_render_one_status(scene, status): + try: + scene[_MARI_RENDER_ONE_STATUS_KEY] = str(status or "") + except Exception: + pass + + +def _mari_get_render_one_status(scene, default=""): + try: + return str(scene.get(_MARI_RENDER_ONE_STATUS_KEY, default) or default) + except Exception: + return str(default or "") + +def _mari_maybe_write_placeholder(scene, path): + try: + if getattr(scene.render, "use_placeholder", False) and not os.path.exists(path): + with open(path, "wb"): + pass + except Exception: + pass + +def _mari_seq_frame_path(seq_dir, prefix, frame, ext): + return os.path.join(seq_dir, f"{prefix}{frame:04d}.{ext}") + +def _mari_missing_sequence_frames(seq_dir, prefix, ext, frame_start, frame_end): + missing = [] + for frame in range(frame_start, frame_end + 1): + out_path = _mari_seq_frame_path(seq_dir, prefix, frame, ext) + if not _mari_is_valid_render_output(out_path): + missing.append(frame) + return missing + +def _mari_render_sequence_frames(scene, seq_dir, prefix, ext, frames): + orig_frame = scene.frame_current + orig_filepath = scene.render.filepath + orig_use_ext = getattr(scene.render, "use_file_extension", True) + orig_use_overwrite = getattr(scene.render, "use_overwrite", True) + try: + try: + scene.render.use_overwrite = True + except Exception: + pass + for frame in frames: + if getattr(mari, "cancel_all", False): + break + scene.frame_set(frame) + base_path = os.path.join(seq_dir, f"{prefix}{frame:04d}") + scene.render.filepath = base_path + try: + scene.render.use_file_extension = True + except Exception: + pass + _mari_maybe_write_placeholder(scene, base_path + "." + ext) + try: + bpy.ops.render.render('EXEC_DEFAULT', write_still=True, animation=False, use_viewport=False) + except TypeError: + bpy.ops.render.render('EXEC_DEFAULT', write_still=True, animation=False) + except Exception: + try: + _mari_render_to_render_result(scene, write_still=True) + except Exception: + _mari_invoke_render(write_still=True) + finally: + scene.render.filepath = orig_filepath + try: + scene.render.use_file_extension = orig_use_ext + except Exception: + pass + try: + scene.render.use_overwrite = orig_use_overwrite + except Exception: + pass + scene.frame_set(orig_frame) + +def _mari_apply_camera_visual_scale(scene): + try: + base_scale = _mari_calc_camera_display_size(scene) + except Exception: + base_scale = 1.0 + try: + default_display = bpy.types.Camera.bl_rna.properties["display_size"].default + except Exception: + default_display = 0.5 + + target = None + for obj in bpy.data.objects: + if not obj.name.startswith("MARI_CAMERA"): + continue + try: + obj.show_axis = False + except Exception: + pass + try: + obj.data.display_size = default_display + except Exception: + pass + try: + obj.scale = (base_scale, base_scale, base_scale) + except Exception: + pass + if obj.get("H") == 0 and obj.get("V") == 0: + target = obj + + if target is not None: + try: + target.scale = (base_scale * 1.5, base_scale * 1.5, base_scale * 1.5) + target.show_axis = True + except Exception: + pass + +def _mari_calc_camera_display_size(scene): + from mathutils import Vector + prop = scene.mari_props + try: + default_size = bpy.types.Camera.bl_rna.properties["display_size"].default + except Exception: + default_size = 0.5 + # This function returns a scale factor for camera object scale. + # Keep default at 0.7x Blender's nominal camera size. + default_scale = 0.7 + + mode = _mari_normalize_mode_id(getattr(prop, "frame", _MARI_MODE_CIRCLE)) + has_frame = bpy.data.objects.get("MARI_FrameCenter") is not None + has_circle = bpy.data.objects.get("MARI_CircleCenter") is not None + if has_circle and not has_frame: + mode = _MARI_MODE_CIRCLE + elif has_frame and not has_circle: + mode = _MARI_MODE_FRAME + if mode == _MARI_MODE_FRAME: + def_dist = float(_mari_default_prop_value("frame_uniform_radius", 5.0)) + center_obj = bpy.data.objects.get("MARI_FrameCenter") + center = center_obj.matrix_world.translation if center_obj else Vector(getattr(prop, "frame_center", (0.0, 0.0, 0.0))) + + # Prefer actual camera distances to center (most accurate for advanced & non-locked modes). + base_dist = 0.0 + count = 0 + try: + for obj in scene.objects: + if obj.name.startswith("MARI_CAMERA"): + try: + base_dist += (obj.matrix_world.translation - center).length + count += 1 + except Exception: + pass + except Exception: + count = 0 + if count > 0: + base_dist = base_dist / float(count) + + # Fallback if no cameras found yet. + if base_dist <= 0.0: + if getattr(prop, "frame_advanced_possition", False) or getattr(prop, "frame_radius_lock", False): + base_dist = float(getattr(prop, "frame_uniform_radius", 0.0) or 0.0) + else: + base_dist = float(getattr(mari, "last_radius", 0.0) or 0.0) + else: + # Circle mode: size should primarily follow Circle Radius. + def_circle = float(_mari_default_prop_value("circle_radius", 3.0)) + def_dist = def_circle * 3.0 + base_dist = float(getattr(prop, "circle_radius", 0.0) or 0.0) * 3.0 + # Minor influence from uniform radius when locked. + if getattr(prop, "frame_radius_lock", False): + try: + base_dist = (base_dist * 0.85) + (float(getattr(prop, "frame_uniform_radius", 0.0) or 0.0) * 0.15) + except Exception: + pass + if base_dist <= 0.0: + base_dist = float(getattr(mari, "last_radius", 0.0) or 0.0) + + if def_dist <= 0.0: + def_dist = base_dist if base_dist > 0.0 else 1.0 + ratio = base_dist / def_dist if def_dist else 1.0 + if ratio <= 0.0: + ratio = 1.0 + # Increase responsiveness: smaller radii shrink more, larger radii grow more. + if mode == _MARI_MODE_CIRCLE: + # Piecewise curve: stronger shrink for small radii, gentler growth for large radii. + ratio = ratio ** (1.27 if ratio < 1.0 else 0.854322775) + else: + ratio = ratio ** 1.35 + # Return scale factor; display_size is left at Blender default. + _ = default_size # keep local for clarity; not used for scale output + return default_scale * ratio + +def _mari_mark_render_active(scene): + mari._render_active = True + try: + mari._render_state = _mari_capture_render_settings(scene) + except Exception: + mari._render_state = None + +def _mari_clear_render_active(): + mari._render_active = False + mari._render_state = None + + + + + +def _mari_invoke_render(**kwargs): + """ + Use INVOKE_DEFAULT so Blender shows the Render window; + fall back to EXEC_DEFAULT if invoke is unavailable. + """ + try: + bpy.ops.render.render('INVOKE_DEFAULT', **kwargs) + return + except Exception: + bpy.ops.render.render('EXEC_DEFAULT', **kwargs) + + +def _mari_render_to_render_result(scene, write_still=False): + """ + Run a render with an explicit UI override so it behaves like pressing F12 + (Render Image), even when the current area/context is not a 3D View. + Leaves the output in the Render Result; does not depend on file_format. + """ + import bpy + + wm = bpy.context.window_manager + override = None + created_window = None + # Force render display to a window so Blender actually shows and executes the render. + prefs_view = getattr(bpy.context.preferences, "view", None) + prev_pref_display = getattr(prefs_view, "render_display_type", None) if prefs_view else None + prev_scene_display = getattr(scene.render, "display_mode", None) + try: + if prefs_view and hasattr(prefs_view, "render_display_type"): + prefs_view.render_display_type = 'WINDOW' + if hasattr(scene.render, "display_mode"): + scene.render.display_mode = 'WINDOW' + except Exception: + pass + + # Try to find a reasonable area to host the render operator. + for window in wm.windows: + screen = window.screen + for area in screen.areas: + if area.type in {'VIEW_3D', 'IMAGE_EDITOR', 'SEQUENCE_EDITOR', 'NODE_EDITOR', 'PROPERTIES'}: + for region in area.regions: + if region.type == 'WINDOW': + override = { + "window": window, + "screen": screen, + "area": area, + "region": region, + "scene": scene, + "blend_data": bpy.context.blend_data, + } + break + if override: + break + if override: + break + + def _run(op_ctx): + # Use EXEC_DEFAULT to block until the render finishes; INVOKE can return immediately. + return bpy.ops.render.render(op_ctx, 'EXEC_DEFAULT', write_still=write_still, animation=False, use_viewport=False) + + # First try existing override if found. + if override: + try: + return _run(override) + except Exception: + pass + + # If no suitable area found, create a temporary window to host the render (like a pop-up Render window). + try: + bpy.ops.wm.window_new() # creates a duplicate window + created_window = wm.windows[-1] + screen = created_window.screen + area = screen.areas[0] if screen.areas else None + if area: + area.ui_type = 'IMAGE_EDITOR' + override = { + "window": created_window, + "screen": screen, + "area": area, + "scene": scene, + } + return _run(override) + finally: + if created_window: + try: + bpy.ops.wm.window_close({"window": created_window}) + except Exception: + pass + # Restore display settings + try: + if prefs_view and prev_pref_display is not None: + prefs_view.render_display_type = prev_pref_display + except Exception: + pass + try: + if prev_scene_display is not None: + scene.render.display_mode = prev_scene_display + except Exception: + pass + + # Fallback to current context if everything else failed. + return _run({}) + + +def _mari_render_frame_via_sandbox(main_scene, filepath, frame): + """ + Render a single frame to 'filepath' using a temporary sandbox scene. + This bypasses the current file_format (FFMPEG) by forcing PNG in the sandbox + while leaving the user's original scene untouched. + """ + import bpy + + window = bpy.context.window + orig_window_scene = window.scene if window else None + + sandbox_name = f"MARI_Sandbox_{uuid.uuid4().hex[:8]}" + sandbox = bpy.data.scenes.new(sandbox_name) + + try: + # Link master collection if not already linked + if main_scene.collection.name not in [c.name for c in sandbox.collection.children]: + sandbox.collection.children.link(main_scene.collection) + + sandbox.world = main_scene.world + sandbox.camera = main_scene.camera + + # Copy render settings + sandbox.render.engine = main_scene.render.engine + sandbox.render.resolution_x = main_scene.render.resolution_x + sandbox.render.resolution_y = main_scene.render.resolution_y + sandbox.render.resolution_percentage = main_scene.render.resolution_percentage + sandbox.frame_set(frame) + + # Force PNG output + sandbox.render.image_settings.file_format = 'PNG' + sandbox.render.image_settings.color_mode = 'RGBA' + sandbox.render.image_settings.color_depth = '16' + sandbox.render.image_settings.compression = 0 + try: + sandbox.render.use_overwrite = True + except Exception: + pass + try: + sandbox.render.use_file_extension = True + except Exception: + pass + sandbox.render.filepath = filepath + + # Switch window to sandbox so Blender renders it + if window: + window.scene = sandbox + + bpy.ops.render.render('EXEC_DEFAULT', write_still=True, animation=False) + + finally: + # Restore window and remove sandbox + if window and orig_window_scene: + window.scene = orig_window_scene + bpy.data.scenes.remove(sandbox, do_unlink=True) + + +def _mari_apply_temp_still_format(scene): + """ + Switch the render output to a still-capable format for temp frames. + Returns the chosen format identifier, or None if no still format is available. + """ + # No-op: we render temp frames through a sandbox scene that forces PNG. + return "PNG" + + +def _mari_render_animation_to_temp_png(scene, temp_dir, prefix, frame_start=None, frame_end=None): + """ + Render the current scene's animation range as a PNG image sequence + into temp_dir by stepping frames manually. This avoids relying on + bpy.ops.render.render(animation=True), which is fragile in the video path. + """ + import os + import bpy + + os.makedirs(temp_dir, exist_ok=True) + + # Debug marker so users can confirm this codepath is active + try: + print(f"[MARI] Using sandbox temp renderer ({MARI_BUILD_TAG}) -> {temp_dir}") + except Exception: + pass + + if frame_start is None: + frame_start = scene.frame_start + if frame_end is None: + frame_end = scene.frame_end + + # Preserve current settings + orig_frame = scene.frame_current + orig_filepath = scene.render.filepath + orig_format = scene.render.image_settings.file_format + orig_color_mode = scene.render.image_settings.color_mode + orig_color_depth = scene.render.image_settings.color_depth + orig_compression = scene.render.image_settings.compression + + try: + _mari_unlock_interface() + + # One still render per frame (always use write_still; we override format visibly to PNG) + for frame in range(frame_start, frame_end + 1): + if getattr(mari, "cancel_all", False): + break + scene.frame_set(frame) + frame_path = os.path.join(temp_dir, f"{prefix}{frame:04d}") + frame_png = frame_path + ".png" + if not scene.render.use_overwrite: + if _mari_is_valid_render_output(frame_png): + continue + _mari_maybe_write_placeholder(scene, frame_png) + scene.render.filepath = frame_path + _mari_render_frame_via_sandbox(scene, frame_path, frame) + + finally: + # Restore original settings + scene.render.filepath = orig_filepath + scene.render.image_settings.file_format = orig_format + scene.render.image_settings.color_mode = orig_color_mode + scene.render.image_settings.color_depth = orig_color_depth + scene.render.image_settings.compression = orig_compression + scene.frame_set(orig_frame) + + +def _mari_fix_video_output_name(final_path): + try: + if not final_path: + return + final_path = os.path.normpath(final_path) + if os.path.isfile(final_path) and _mari_is_valid_render_output(final_path): + return + folder = os.path.dirname(final_path) + base = os.path.splitext(os.path.basename(final_path))[0] + ext = os.path.splitext(final_path)[1].lower() + if not os.path.isdir(folder): + return + candidates = [] + for fname in os.listdir(folder): + if not fname.lower().endswith(ext): + continue + stem = os.path.splitext(fname)[0] + if not stem.startswith(base): + continue + suffix = stem[len(base):] + if suffix and (len(suffix) < 3 or not suffix.isdigit()): + continue + candidates.append(fname) + if candidates: + candidates.sort(key=lambda n: os.path.getmtime(os.path.join(folder, n)), reverse=True) + for cand in candidates: + src = os.path.join(folder, cand) + if os.path.normcase(os.path.normpath(src)) == os.path.normcase(final_path): + continue + os.replace(src, final_path) + break + except Exception: + pass + + +def _mari_fix_still_output_name(final_path): + """ + Ensure still outputs keep the canonical camera-id name: + _H#_V#. + If Blender emits _H#_V#0001., rename it back. + """ + try: + if not final_path: + return + final_path = os.path.normpath(final_path) + folder = os.path.dirname(final_path) + if not os.path.isdir(folder): + return + + base = os.path.splitext(os.path.basename(final_path))[0] + ext = os.path.splitext(final_path)[1].lower() + + candidates = [] + for fname in os.listdir(folder): + full = os.path.join(folder, fname) + if not os.path.isfile(full): + continue + stem, fext = os.path.splitext(fname) + if fext.lower() != ext: + continue + if not stem.startswith(base): + continue + suffix = stem[len(base):] + if suffix and (len(suffix) >= 3 and suffix.isdigit()): + candidates.append(full) + + if os.path.isfile(final_path) and _mari_is_valid_render_output(final_path): + for extra in candidates: + try: + os.remove(extra) + except Exception: + pass + return + + if not candidates: + return + + candidates.sort(key=lambda p: os.path.getmtime(p), reverse=True) + os.replace(candidates[0], final_path) + for extra in candidates[1:]: + try: + os.remove(extra) + except Exception: + pass + except Exception: + pass + + +def _mari_cleanup_temp_dirs(root_dir): + try: + if not root_dir or not os.path.isdir(root_dir): + return + to_remove = [] + for entry in os.scandir(root_dir): + if entry.is_dir() and entry.name.upper().endswith("_TEMP"): + to_remove.append(entry.path) + for p in to_remove: + shutil.rmtree(p, ignore_errors=True) + except Exception: + pass + + +def _mari_build_video_from_temp(context, temp_dir, frames, final_path): + """ + Build a video file at ``final_path`` from a sequence of image frames + stored in ``temp_dir`` using the Video Sequence Editor. + + Assumes the scene's render settings (FFMPEG/codec/etc.) are already + configured by the user. This function only: + - Creates an IMAGE strip from the image sequence + - Sets frame range + - Renders the animation to the user's chosen video format + """ + import bpy + import os + + scene = context.scene + + # --- Basic validation ------------------------------------------------- + if not frames: + raise RuntimeError("No frames provided to build video.") + + # Normalize folder & sort frames to get a stable playback order + temp_dir = os.path.normpath(temp_dir) + frames = sorted(frames) + + # Build absolute path to the first frame and sanity check + first_name = frames[0] + first_path = os.path.join(temp_dir, first_name) + if not os.path.isfile(first_path): + raise RuntimeError(f"First frame not found: {first_path!r}") + + # --- Save render / VSE state so we can restore it later --------------- + old_se = scene.sequence_editor + old_frame_start = scene.frame_start + old_frame_end = scene.frame_end + old_filepath = scene.render.filepath + old_use_seq = scene.render.use_sequencer + old_use_cmp = scene.render.use_compositing + old_use_ext = getattr(scene.render, "use_file_extension", True) + + # Create or reuse a SequenceEditor + se = old_se if old_se is not None else scene.sequence_editor_create() + + # Blender 5.0+ uses 'strips'; pre-5.0 used 'sequences' + strip_coll = getattr(se, "strips", None) + if strip_coll is None: + strip_coll = getattr(se, "sequences", None) + if strip_coll is None: + strip_coll = getattr(se, "sequences_all", None) + if strip_coll is None: + raise RuntimeError( + "SequenceEditor has no 'strips' or 'sequences' collection; " + "cannot create VSE strip." + ) + + # Clear any existing strips in this editor (so we only render our seq) + try: + for s in list(strip_coll): + strip_coll.remove(s) + except Exception: + # Non-fatal; worst case some old strips remain + pass + + strip = None + frame_count = len(frames) + + try: + # --- Create the IMAGE strip via data API (no bpy.ops) ------------- + try: + # Preferred call signature (works in modern Blender, including 5.0) + strip = strip_coll.new_image( + name="MARI_TEMP_SEQ", + filepath=first_path, + channel=1, + frame_start=old_frame_start, + ) + except TypeError: + # Fallback for older versions that only accept positional args + strip = strip_coll.new_image("MARI_TEMP_SEQ", first_path, 1, old_frame_start) + + # --- Wire the strip to our folder and all frames ------------------- + # In the VSE, strip.directory is a folder path; elements[].filename + # are just basenames. + if not temp_dir.endswith(os.sep): + directory = temp_dir + os.sep + else: + directory = temp_dir + strip.directory = directory + + # Ensure first element uses our first frame name + if strip.elements: + strip.elements[0].filename = first_name + else: + strip.elements.append(first_name) + + # Append the rest of the frames as elements (preserve order) + for name in frames[1:]: + strip.elements.append(name) + + # Make sure the strip length matches the number of images + strip.frame_start = old_frame_start + strip.frame_final_duration = frame_count + + # --- Configure scene frame range & render settings ----------------- + scene.frame_start = old_frame_start + scene.frame_end = old_frame_start + frame_count - 1 + + # Use the sequencer output only (no compositor) + scene.render.use_sequencer = True + scene.render.use_compositing = False + + # Use the user's video format, but force the filepath + scene.render.filepath = os.path.splitext(final_path)[0] + try: + scene.render.use_file_extension = True + except Exception: + pass + + # --- Render to video ---------------------------------------------- + bpy.ops.render.render(animation=True) + + finally: + # --- Restore previous render / VSE state -------------------------- + scene.render.filepath = old_filepath + scene.frame_start = old_frame_start + scene.frame_end = old_frame_end + scene.render.use_sequencer = old_use_seq + scene.render.use_compositing = old_use_cmp + try: + scene.render.use_file_extension = old_use_ext + except Exception: + pass + + # Remove the temporary strip we created (if any) + try: + if strip is not None and strip_coll is not None and hasattr(strip_coll, "remove"): + strip_coll.remove(strip) + except Exception: + # Non-fatal; at worst your VSE keeps one stray strip + pass + + _mari_fix_video_output_name(final_path) + + + +def _mari_get_vse_strip_collection(se): + """ + Return the top-level strip collection for the SequenceEditor. + + - Blender 2.7–4.x: SequenceEditor.sequences / sequences_all + - Blender 5.x: SequenceEditor.strips / strips_all + + We try all known names so this stays as future-proof as possible. + """ + # Newer builds (5.x) – preferred + if hasattr(se, "strips"): + return se.strips + if hasattr(se, "strips_all"): + return se.strips_all + + # Older builds – fallback + if hasattr(se, "sequences"): + return se.sequences + if hasattr(se, "sequences_all"): + return se.sequences_all + + return None + + +def on_cancel(scene): + """ + Called when the user presses Esc. + Stops any queued renders and restores preview preference. + """ + print("[MARI] Render canceled by user (Esc). Halting pipeline.") + mari.cancel_all = True + + # Don't let any lingering completion handler queue more work + for _h in list(bpy.app.handlers.render_complete): + try: + bpy.app.handlers.render_complete.remove(_h) + except Exception: + pass + + # Also restore the user's render display preference + try: + _mari_restore_render_display() + except Exception: + pass + + + +def _mari_register_cancel_handler_once(): + # avoid duplicates across reloads + if on_cancel not in bpy.app.handlers.render_cancel: + bpy.app.handlers.render_cancel.append(on_cancel) + +_mari_register_cancel_handler_once() + + +def _mari_start_cancel_watcher(context): + try: + if getattr(mari, "_cancel_watch_active", False): + return + bpy.ops.mari.cancel_watcher('INVOKE_DEFAULT') + except Exception: + try: + bpy.ops.mari.cancel_watcher('EXEC_DEFAULT') + except Exception: + pass + + +class MARI_OT_CancelWatcher(Operator): + bl_idname = f"{addon_prefix}.cancel_watcher" + bl_label = "MARI Cancel Watcher" + bl_options = {'INTERNAL'} + + _timer = None + + def execute(self, context): + if getattr(mari, "_cancel_watch_active", False): + return {'CANCELLED'} + mari._cancel_watch_active = True + wm = context.window_manager + try: + self._timer = wm.event_timer_add(0.1, window=context.window) + except Exception: + self._timer = None + wm.modal_handler_add(self) + return {'RUNNING_MODAL'} + + def _finish(self, context): + try: + if self._timer: + context.window_manager.event_timer_remove(self._timer) + except Exception: + pass + mari._cancel_watch_active = False + + def modal(self, context, event): + if not getattr(mari, "_render_active", False) or getattr(mari, "cancel_all", False): + self._finish(context) + return {'FINISHED'} + if event.type == 'ESC': + mari.cancel_all = True + try: + bpy.ops.render.cancel() + except Exception: + pass + self._finish(context) + return {'FINISHED'} + return {'PASS_THROUGH'} + + +def FrameRatio(self, context, type): + ratio = (self.frame_ratio[0]/self.frame_ratio[1], self.frame_ratio[1]/self.frame_ratio[0]) + self.frame_ratio = (self.frame_ratio[0] * ratio[0], self.frame_ratio[1] * ratio[1]) + +''' +def register(): + bpy.utils.register_class(MARI_OP_Install) + + +def unregister(): + bpy.utils.unregister_class(MARI_OP_Install) +''' + + + +class MARI_CollisionPlaneItem(PropertyGroup): + name: StringProperty(name="Object Name") + + +class MARI_Props(PropertyGroup): + def updateHandaler(self, context): + from mathutils import Euler, Matrix, Vector + import math + + # 1) Move frame to new center if it exists + frame = bpy.data.objects.get("MARI_FrameCenter") + if not frame: + return + frame.location = self.frame_center + + # 2) Track previous applied UI rotation in global 'mari' stash + prev = getattr(mari, "_last_ui_rot", (0.0, 0.0, 0.0)) + cur = tuple(self.frame_rotation) + + # Build world-space target eulers (the frame uses -rx, -ry, rz+pi) + prev_R = Euler((-prev[0], -prev[1], prev[2] + math.pi)).to_matrix().to_4x4() + cur_R = Euler((-cur[0], -cur[1], cur[2] + math.pi)).to_matrix().to_4x4() + + # 3) Delta rotation about the frame center + T = Matrix.Translation(Vector(self.frame_center)) + Tinv= Matrix.Translation(Vector(self.frame_center) * -1.0) + R_delta = T @ (cur_R @ prev_R.inverted()) @ Tinv + + # Apply to frame + every MARI camera together + frame.matrix_world = R_delta @ frame.matrix_world + for obj in bpy.data.objects: + if obj.name.startswith("MARI_CAMERA"): + obj.matrix_world = R_delta @ obj.matrix_world + + # 4) Remember this rotation for the next update + mari._last_ui_rot = cur + + def updateSize(self, context): + if "MARI_FrameCenter" in bpy.data.objects: + bpy.ops.mari.make_frame() + + def updateRadius(self, context): + bpy.ops.object.select_all(action='DESELECT') + + bpy.context.scene.cursor.location = self.frame_center + bpy.context.scene.tool_settings.transform_pivot_point = 'CURSOR' + + for cam in bpy.data.objects: + if cam.name.startswith("MARI_CAMERA"): + cam.select_set(True) + + bpy.ops.transform.resize(value=(1/mari.last_radius, 1/mari.last_radius, 1/mari.last_radius), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=3.7975, use_proportional_connected=False, use_proportional_projected=False) + bpy.ops.transform.resize(value=(self.frame_uniform_radius, self.frame_uniform_radius, self.frame_uniform_radius), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=3.7975, use_proportional_connected=False, use_proportional_projected=False) + + bpy.context.scene.tool_settings.transform_pivot_point = 'INDIVIDUAL_ORIGINS' + bpy.ops.transform.resize(value=(mari.last_radius/self.frame_uniform_radius, mari.last_radius/self.frame_uniform_radius, mari.last_radius/self.frame_uniform_radius), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=3.7975, use_proportional_connected=False, use_proportional_projected=False) + + mari.last_radius = self.frame_uniform_radius + bpy.ops.view3d.snap_cursor_to_center() + + + def updateCameras(self, context): + for cam in bpy.data.cameras: + if cam.name.startswith("MARI_Camera"): + if not mari.did_focal: + cam.lens = self.camera_settings_lens + cam.dof.use_dof = self.camera_settings_dof_use + cam.dof.focus_object = self.camera_settings_dof_object + cam.dof.focus_distance = self.camera_settings_dof_distance + + cam.clip_start = self.camera_settings_clip_start + cam.clip_end = self.camera_settings_clip_end + + cam.dof.aperture_fstop = self.camera_settings_dof_fstop + cam.dof.aperture_blades = self.camera_settings_dof_blades + cam.dof.aperture_rotation = self.camera_settings_dof_rotation + cam.dof.aperture_ratio = self.camera_settings_dof_ratio + + def circleUpdate(self, context): + if "MARI_CircleCenter" in bpy.data.objects: + obj = bpy.data.objects["MARI_CircleCenter"] + obj.location = self.circle_location + obj.rotation_euler = Euler([-self.circle_rotation[0], -self.circle_rotation[1], self.circle_rotation[2] + math.pi]) + + def updateAdvancedFrameMode(self, context): + if not self.frame_advanced_possition: + self.mari_save_planes = False + + + auto_fov_margin: FloatProperty( + name="Auto FOV Margin", + description="Percent to widen beyond the tight fit to prevent edge clipping", + default=0.15, min=0.0, max=2.0, subtype='PERCENTAGE' + ) + + + + frame: EnumProperty(name="Type", default=_MARI_MODE_CIRCLE, items={("FRAME", "Frame", ""), + ("CRICLE", "Circle", ""),}) + frame_ratio: FloatVectorProperty(size=2, name="Aspect Ratio", precision=2, default = (1920, 1080)) + frame_dimensions: FloatVectorProperty(size=2, name="Dimension", precision=2, unit="LENGTH", default = (16, 9)) + frame_center: FloatVectorProperty(name="Center Location", default=(0, 0, 0), unit="LENGTH", update=updateHandaler) + frame_rotation: FloatVectorProperty(name="Center Rotation", default=(0, 0, 0), unit="ROTATION", update=updateHandaler) + + frame_density: FloatVectorProperty(name="Interval", size=2, unit="ROTATION", default=(0.08726646, 0.08726646), min=0, max=30, description="Horizontal/Vertical") + frame_camera_limit_lr: FloatVectorProperty(name="Left/Right", size=2, default=(1.57079633, 1.57079633), unit="ROTATION", min=-3.14159265, soft_max=1.55334303, max=3.14159265) + frame_camera_limit_ud: FloatVectorProperty(name="Up/Down", size=2, default=(1.57079633, 1.57079633), unit="ROTATION", min=-1.57079633, max=1.57079633) + + frame_radius_lock: BoolProperty(name="Lock", default=False) + frame_uniform_radius: FloatProperty(name="Uniform Radius", default=5, update=updateRadius, unit="LENGTH") + frame_use_dynamic_cam: BoolProperty(name="Dynamic Camera Array") + + + frame_advanced_possition: BoolProperty(name="Advanced", default=False, update=updateAdvancedFrameMode) + frame_advanced_offset: FloatProperty(name="Offset", default=0) + frame_advenced_leftover_angle: BoolProperty(name="Leftover Angles", default=True) + + + render_settings_show: BoolProperty(name="Render Settings", default=False) + render_settings_filepath: StringProperty(name="Output Folder", subtype="DIR_PATH") + render_settings_name: StringProperty(name="Name", default="MARI") + render_settings_normalize: BoolProperty(name="Normalize Resolution", description="It will upscale render resolution so the end image has constant quality. Takes more time") + render_settings_limit_res: IntVectorProperty(name="Max resolution", min=0, default=(1920*2, 1080*2), size=2) + render_settings_limit_res_factor: FloatProperty(name="Limit Factor", min=1, soft_max=10, default=2) + mari_use_blend_resolution: BoolProperty(name="Use Current File Output Resolution", default=False) + + + camera_settings_lens: FloatProperty(name="Focal Length", default=50, min=0.1, max=5000000, precision=3, step=10, update=updateCameras, unit="CAMERA") + camera_settings_dof_use: BoolProperty(name="Depth of Field", default=False, update=updateCameras) + camera_settings_dof_object: PointerProperty(type=bpy.types.Object, update=updateCameras) + camera_settings_dof_distance: FloatProperty(name="Distance", default=10, unit="LENGTH", min=0, update=updateCameras) + + camera_settings_clip_start: FloatProperty(name="Clip Start", default=0.1, min=0.001, max=1000.0, update=updateCameras) + camera_settings_clip_end: FloatProperty(name="Clip End", default=1000.0, min=1.0, max=1000000.0, update=updateCameras) + + camera_settings_dof_fstop: FloatProperty(name="F-Stop", default=2.8, min=0.1, update=updateCameras, precision=1) + camera_settings_dof_blades: IntProperty(name="Blades", default=0, min=0, update=updateCameras) + camera_settings_dof_rotation: FloatProperty(name="Rotation", default=0, update=updateCameras, unit="ROTATION") + camera_settings_dof_ratio: FloatProperty(name="Ratio", default=1, min=1, max=2, update=updateCameras, precision=3) + + + #mari_save_media: BoolProperty(name="Save as MARI Media", default=False) ##NOT .marijpeg + mari_save_media: BoolProperty(name="Save as MARI Media (.zip)", default=True) + mari_save_sequence: BoolProperty(name="Save as Image Sequence", default=True) + mari_save_planes: BoolProperty(name="Export Camera Collision Planes", default=False) + frame_collision_planes: CollectionProperty(type=MARI_CollisionPlaneItem) + + + + circle_location: FloatVectorProperty(name="Location", default=(0, 0, 0), unit="LENGTH", update=circleUpdate) + circle_rotation: FloatVectorProperty(name="Rotation", unit="ROTATION", default=(0, 0, 0), update=circleUpdate) + circle_radius: FloatProperty(name="Circle Radius", unit="LENGTH", default=3) + circle_interval: FloatVectorProperty(name="Interval", size=2, min=0.00174533, default=(0.08726646, 0.08726646), unit="ROTATION") + circle_max_angle_lr: FloatVectorProperty(name="Left/Right", size=2, min=-3.14159265, max=3.14159265, default=(3.14159265, 3.14159265), unit="ROTATION") + circle_max_angle_ud: FloatVectorProperty(name="Up/Down", size=2, min=-(3.14159265/2), max=3.14159265/2, default=(1.04719755, 1.04719755), unit="ROTATION") + + + + cam_num: IntProperty() + + + +class MARI_AP_Preferences(AddonPreferences): + bl_idname = __name__ + + def draw(self, context): + layout = self.layout + if _MARI_HAS_CV2 and cv2 is not None: + layout.label(text=f"cv2: installed (v{cv2.__version__})", icon='INFO') + else: + layout.label(text="cv2: missing (required for render)", icon='ERROR') + layout.label(text=_mari_cv2_admin_hint()) + if _MARI_CV2_IMPORT_ERROR: + layout.label(text=f"Import error: {_MARI_CV2_IMPORT_ERROR}") + layout.operator(MARI_OP_Install.bl_idname, text="Install/Repair cv2") + + +class MARI_OP_Install(Operator): + bl_idname = "mari_op.install_dependencies" + bl_label = "Install Dependencies (REQUIRED!!)" + + def execute(self, context): + import sys + import subprocess + import os + import importlib + hint = _mari_cv2_admin_hint() + python_exe = sys.executable + deps_dir = _mari_cv2_deps_dir() + + if deps_dir: + try: + os.makedirs(deps_dir, exist_ok=True) + except Exception as exc: + print(f"[MARI] WARN: could not create local deps folder {deps_dir}: {exc}") + + try: + subprocess.run( + [python_exe, "-m", "ensurepip", "--upgrade"], + check=False, + capture_output=True, + text=True, + ) + except Exception as exc: + print(f"[MARI] WARN: ensurepip bootstrap skipped: {exc}") + + try: + import pip + except Exception as exc: + self.report({'ERROR'}, f"pip is not available in Blender Python: {exc}. {hint}") + return {"CANCELLED"} + + try: + subprocess.run( + [ + python_exe, "-m", "pip", "install", + "--disable-pip-version-check", "--no-input", + "--upgrade", "pip", "setuptools", "wheel" + ], + check=False, + capture_output=True, + text=True, + ) + except Exception: + pass + + common = [ + python_exe, "-m", "pip", "install", + "--disable-pip-version-check", "--no-input", "--upgrade" + ] + + attempts = [] + if deps_dir: + attempts.append(("opencv-python (addon local)", common + ["--target", deps_dir, "opencv-python"])) + attempts.append(("opencv-python-headless (addon local)", common + ["--target", deps_dir, "opencv-python-headless"])) + attempts.append(("opencv-python (user site)", common + ["--user", "opencv-python"])) + attempts.append(("opencv-python-headless (user site)", common + ["--user", "opencv-python-headless"])) + attempts.append(("opencv-python (default env)", common + ["opencv-python"])) + attempts.append(("opencv-python-headless (default env)", common + ["opencv-python-headless"])) + + if not sys.platform.startswith("win"): + attempts.append(("opencv-python (user + break-system-packages)", common + ["--break-system-packages", "--user", "opencv-python"])) + attempts.append(("opencv-python-headless (user + break-system-packages)", common + ["--break-system-packages", "--user", "opencv-python-headless"])) + + errors = [] + + for label, cmd in attempts: + try: + print(f"[MARI] CV2 install attempt: {label}") + print(f"[MARI] CMD: {' '.join(cmd)}") + proc = subprocess.run(cmd, capture_output=True, text=True) + except Exception as exc: + errors.append(f"{label}: failed to launch pip ({exc})") + continue + + if proc.returncode != 0: + details = (proc.stderr or proc.stdout or "").strip() + if len(details) > 700: + details = details[-700:] + errors.append(f"{label}: pip exit {proc.returncode}: {details}") + continue + + _mari_ensure_cv2_paths_on_syspath() + importlib.invalidate_caches() + if _mari_try_import_cv2(): + self.report({'INFO'}, f"cv2 installed and accessible! Version: {cv2.__version__}") + return {"FINISHED"} + + imp = (_MARI_CV2_IMPORT_ERROR or "").strip() + if len(imp) > 400: + imp = imp[:400] + "..." + errors.append(f"{label}: install succeeded but import failed: {imp}") + + _mari_ensure_cv2_paths_on_syspath() + importlib.invalidate_caches() + if _mari_try_import_cv2(): + self.report({'INFO'}, f"cv2 installed and accessible! Version: {cv2.__version__}") + return {"FINISHED"} + + print("[MARI] CV2 installation attempts failed.") + for entry in errors: + print(f"[MARI] - {entry}") + + reason = errors[-1] if errors else (_MARI_CV2_IMPORT_ERROR or "Unknown install/import failure.") + if len(reason) > 260: + reason = reason[:260] + "..." + self.report({'ERROR'}, f"Failed to install/import cv2. {reason} {hint}") + return {"CANCELLED"} + + + +class MARI_OT_GenerateFrame(Operator): + """Generate the Frame""" + bl_label = "Generate Frame" + bl_idname = f"{addon_prefix}.make_frame" + + def _rotate_rig_about_center(self, center, target_euler): + """Rotate MARI_FrameCenter and all MARI_CAMERA* objects together about 'center' + so the frame ends up at Euler(-rx, -ry, rz + pi) in world space.""" + from mathutils import Matrix, Euler, Vector + + # Current frame orientation is assumed to be neutral: (0, 0, pi). + R_current = Euler((0.0, 0.0, math.pi)).to_matrix().to_4x4() + + rx, ry, rz = target_euler + R_target = Euler((-rx, -ry, rz + math.pi)).to_matrix().to_4x4() + + # Delta (world space), pivoting about 'center' + T = Matrix.Translation(Vector(center)) + Tinv = Matrix.Translation(Vector(center) * -1.0) + R_delta = T @ (R_target @ R_current.inverted()) @ Tinv + + # Rotate frame + every MARI camera (including dotted duplicates) + names = ["MARI_FrameCenter"] + [o.name for o in bpy.data.objects if o.name.startswith("MARI_CAMERA")] + for name in names: + obj = bpy.data.objects.get(name) + if not obj: + continue + obj.matrix_world = R_delta @ obj.matrix_world + + + + def AddFrame(self, do=False): + prop = bpy.context.scene.mari_props + bpy.ops.mesh.primitive_plane_add(enter_editmode=False, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1)) + obj = bpy.context.object + obj.dimensions = (prop.frame_dimensions[0] + 0.2, prop.frame_dimensions[1] + 0.2, 0) + bpy.ops.object.transform_apply(location=False, rotation=False, scale=True) + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.inset(thickness=0.1, depth=0) + bpy.ops.mesh.delete(type='FACE') + bpy.ops.mesh.select_all(action='SELECT') + bpy.ops.transform.rotate(value=1.5708, orient_axis='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(True, False, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False) + bpy.ops.object.mode_set(mode='OBJECT') + obj.name = "MARI_FrameCenter" + obj.hide_render = True + _mari_link_object_to_collection(obj, _mari_get_collection(bpy.context.scene, "MARI_Cameras")) + + return obj + + def AddCameras(self, frame, event, selected_objs): + """Fast camera lattice generator with preflight, skip-before-create, no constraints, + and optional BVH-accelerated projection for Advanced Position.""" + context = bpy.context + scene = context.scene + prop = scene.mari_props + _mari_cleanup_temp_collection(scene) + _mari_get_collection(scene, "MARI_Cameras") + + + # Degrees per step (ensure > 0 to avoid zero-step) + RAD2DEG = 57.29577951308232 + min_step = 1e-4 + step_h = max(min_step, abs(prop.frame_density[0] * RAD2DEG)) + step_v = max(min_step, abs(prop.frame_density[1] * RAD2DEG)) + + + # Signed limits (degrees). Positive left/up values stay on their side; + # negative values cross the zero line into the opposite side. + h_min_deg = -float(prop.frame_camera_limit_lr[0] * RAD2DEG) + h_max_deg = float(prop.frame_camera_limit_lr[1] * RAD2DEG) + v_min_deg = -float(prop.frame_camera_limit_ud[1] * RAD2DEG) + v_max_deg = float(prop.frame_camera_limit_ud[0] * RAD2DEG) + + def _signed_index_range(min_deg, max_deg, step_deg, max_abs_deg=90.0): + if step_deg <= 0.0: + return [] + lo = max(-max_abs_deg, min(float(min_deg), float(max_deg))) + hi = min(max_abs_deg, max(float(min_deg), float(max_deg))) + start_idx = int(math.ceil((lo - 1e-6) / step_deg)) + end_idx = int(math.floor((hi + 1e-6) / step_deg)) + if start_idx > end_idx: + return [] + return list(range(start_idx, end_idx + 1)) + + + # Preflight estimated count (conservative upper bound) + H_range = _signed_index_range(h_min_deg, h_max_deg, step_h) + V_range = _signed_index_range(v_min_deg, v_max_deg, step_v) + est = len(H_range) * len(V_range) + MAX_CAMS = 20000 + if est > MAX_CAMS: + self.report({'ERROR'}, f"Too many cameras requested (~{est}). Increase step size or tighten limits. (Max {MAX_CAMS})") + _mari_cleanup_temp_collection(scene) + return + + + # Set working radius + if prop.frame_radius_lock: + mari.last_radius = prop.frame_uniform_radius + elif prop.frame_advanced_possition: + mari.last_radius = 1 # will snap to geometry + # else: keep existing last_radius until end (where we may set uniform radius) + + # Prepare detached collection to avoid per-object UI/depsgraph churn + coll_name = "MARI_Cameras_Temp" + coll = bpy.data.collections.get(coll_name) + if coll is None: + coll = bpy.data.collections.new(coll_name) + # Link collection to scene only once at the end (if not already linked) + if coll.name not in [c.name for c in scene.collection.children]: + # don't link yet; link after populating to reduce redraws + pass + + + created = [] + cam_seq = 0 + + + frame_loc = frame.matrix_world.translation + + + use_dynamic = bool(prop.frame_use_dynamic_cam) + + + # Camera creation (data API only; no constraints) + for H in H_range: + for V in V_range: + # Compute angles from indices to exactly match original naming semantics + if not use_dynamic: + v_deg = 90 + H * step_h + h_deg = V * step_v + else: + v_deg = 90 + (-V) * step_h + h_deg = -H * step_v + + + # Skip any camera whose H/V index would land at or beyond 90°. + # This avoids side/perpendicular views even when floating steps round down. + side_tol = 1e-2 + if (abs(H) * step_h) >= (90.0 - side_tol): + continue + if (abs(V) * step_v) >= (90.0 - side_tol): + continue + + # Extra guard using computed spherical angles. + if abs(v_deg - 90.0) >= (90.0 - side_tol): + continue + if abs(h_deg) >= (90.0 - side_tol): + continue + + # Spherical placement + R = mari.last_radius + v_rad = math.radians(v_deg) + h_rad = math.radians(h_deg) + + + if not use_dynamic: + x = R * math.cos(v_rad) + y = R * math.cos(h_rad) * math.sin(v_rad) + z = R * math.sin(h_rad) * math.sin(v_rad) + else: + z = R * math.cos(v_rad) + y = R * math.cos(h_rad) * math.sin(v_rad) + x = R * math.sin(h_rad) * math.sin(v_rad) + + + cam_data_name = f"MARI_Camera_{cam_seq}" + cam_obj_name = f"MARI_CAMERA_H{H}_V{V}" + + + cam_data = bpy.data.cameras.get(cam_data_name) or bpy.data.cameras.new(cam_data_name) + cam_obj = bpy.data.objects.new(cam_obj_name, cam_data) + + + # Set location immediately; rotation will be set to look at frame + cam_obj.matrix_world.translation = (x, y, z) + # Custom indices for later logic + cam_obj["H"] = H + cam_obj["V"] = V + cam_obj["INTR"] = 0 + + + created.append(cam_obj) + cam_seq += 1 + + + # Batch link to collection and then to scene, then parent + rotate to face frame + # Link objs to temp collection + for obj in created: + if obj.name not in coll.objects: + coll.objects.link(obj) + + + # Link the temp collection to the scene (if not linked yet) + if coll.name not in [c.name for c in scene.collection.children]: + scene.collection.children.link(coll) + + + # Parent + orient + for j, obj in enumerate(created): + # Parent + obj.parent = frame + + + # Visual orientation: point -Z axis toward frame center + direction = (frame_loc - obj.matrix_world.translation).normalized() + quat = direction.to_track_quat('-Z', 'Y') + obj.matrix_world = Matrix.Translation(obj.matrix_world.translation) @ quat.to_matrix().to_4x4() + + + # Advanced snapping with BVH (optional) + if prop.frame_advanced_possition: + # Temporarily offset selected meshes + for plane in selected_objs: + plane.location.z += prop.frame_advanced_offset + + + for obj in created: + self.Intersect(context, event, obj, selected_objs) + + + # Restore offsets + for plane in selected_objs: + plane.location.z -= prop.frame_advanced_offset + + + # If not using advanced placement and radius isn't locked, set a default uniform radius + if not prop.frame_advanced_possition and not prop.frame_radius_lock: + prop.frame_uniform_radius = prop.frame_dimensions[0] + prop.frame_dimensions[1] + 1 + _mari_cleanup_temp_collection(scene) + + def _mark_center_camera(self): + _mari_apply_camera_visual_scale(bpy.context.scene) + + def _auto_fit_all_cameras(self, context, frame_obj): + """Fast & exact: replicate the original temp-plane geometry, + then binary-search cam.data.angle using Blender's own projection.""" + import math + from mathutils import Euler + + scene = context.scene + prop = scene.mari_props + + # --- Build the same FILLED inner rectangle the original used --- + bpy.ops.mesh.primitive_plane_add(enter_editmode=False, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1)) + frame_inside = bpy.context.object + frame_inside.dimensions = (prop.frame_dimensions[0], prop.frame_dimensions[1], 0.0) + frame_inside.location = prop.frame_center + bpy.ops.object.transform_apply(location=False, rotation=False, scale=True) + + # Rotate mesh +90° about X in EDIT mode (yes, EDIT – exactly like the original) + bpy.ops.object.mode_set(mode='EDIT') + bpy.context.scene.tool_settings.transform_pivot_point = 'MEDIAN_POINT' + bpy.ops.mesh.select_all(action='SELECT') + bpy.ops.transform.rotate(value=1.57079632679, orient_axis='X', orient_type='GLOBAL', + constraint_axis=(True, False, False)) + bpy.ops.object.mode_set(mode='OBJECT') + + # Then set object rotation to (-rx, -ry, rz + pi) – again, exactly like original + rx, ry, rz = prop.frame_rotation + frame_inside.rotation_euler = Euler((-rx, -ry, rz + math.pi)) + + # Cache world-space vertices once (no per-iteration bmesh/edit-mode churn) + corners_world = [frame_inside.matrix_world @ v.co for v in frame_inside.data.vertices] + + def inside_strict(cam_obj) -> bool: + uv = [world_to_camera_view(scene, cam_obj, p) for p in corners_world] + # strict 0..1 gate: even a hair outside fails + for u, v, _ in uv: + if (u < 0.0) or (u > 1.0) or (v < 0.0) or (v > 1.0): + return False + return True + + # binary search settings (angles in radians) + ANGLE_MIN = math.radians(0.05) # practical floor (very narrow) + ANGLE_MAX = math.radians(170.0) # very wide but below singularity + FINAL_PAD = 1.0 + (prop.auto_fov_margin / 100.0) # +0.15% wider than tight fit (prevents edge-kissing) + + for cam in (o for o in bpy.data.objects if o.name.startswith("MARI_CAMERA")): + cdata = cam.data + if getattr(cdata, "type", "PERSP") != 'PERSP': + continue # only meaningful for perspective cameras + + # Ensure there exists a fitting angle + cdata.angle = ANGLE_MAX + if not inside_strict(cam): + # Can't fully see the rectangle from this camera (highly unlikely given your rig) + continue + + # Establish invariant: lo = outside, hi = inside + lo = ANGLE_MIN + hi = ANGLE_MAX + + # If at floor the rect already fits (rare), force lo to be outside + cdata.angle = lo + if inside_strict(cam): + for _ in range(20): + new_lo = max(1e-6, 0.5 * lo) + cdata.angle = new_lo + if not inside_strict(cam): + lo = new_lo + break + lo = new_lo + + # Standard monotonic bisection to get **minimal** angle that still fits + for _ in range(24): # ~1e-5 rad precision + mid = 0.5 * (lo + hi) + cdata.angle = mid + if inside_strict(cam): + hi = mid # still fits → try narrower + else: + lo = mid # too narrow → widen + + # Set a hair wider than the tight bound so float/AA never clips a corner + cdata.angle = min(ANGLE_MAX, hi * FINAL_PAD) + + # cleanup helper geometry + bpy.data.objects.remove(frame_inside, do_unlink=True) + + mari.did_focal = True + + + + def Intersect(self, context, event, cam, objs): + """Snap camera to nearest intersection along its -Z axis using a cached BVH per mesh.""" + if not objs: + self.report({'INFO'}, "No Objects Selected. Nothing to Project on!") + return + + + # Build (or reuse) BVH cache + deps = context.evaluated_depsgraph_get() + cache = mari.data.get("_bvh_cache") + cache_key = (tuple(o.name for o in objs), id(deps)) + + + if mari.data.get("_bvh_cache_key") != cache_key or cache is None: + cache = [] + for obj in objs: + if obj.type != 'MESH': + continue + eval_obj = obj.evaluated_get(deps) + me = eval_obj.to_mesh(preserve_all_data_layers=False, depsgraph=deps) + try: + # Extract vertices and polygon data for BVHTree.FromPolygons + vertices = [v.co for v in me.vertices] + polygons = [p.vertices for p in me.polygons] + bvh = BVHTree.FromPolygons(vertices, polygons) + M = eval_obj.matrix_world.copy() + Minv = M.inverted() + cache.append((bvh, M, Minv)) + finally: + eval_obj.to_mesh_clear() + mari.data["_bvh_cache"] = cache + mari.data["_bvh_cache_key"] = cache_key + + + # Ray in world + origin = cam.matrix_world.translation + # Cameras face toward frame center (-Z), so cast ray in opposite direction (+Z) to hit objects beyond frame + ray_dir_world = cam.matrix_world.to_quaternion() @ Vector((0.0, 0.0, 1.0)) + + + hit_world = None + nearest_dist = float("inf") + + + for bvh, M, Minv in cache: + # Transform ray to local + o_local = Minv @ origin + d_local = (Minv.to_3x3() @ ray_dir_world).normalized() + res = bvh.ray_cast(o_local, d_local) + if res is None: + continue + loc_local, normal_local, face_index, dist = res + if loc_local is None: + continue + if dist < nearest_dist: + nearest_dist = dist + hit_world = M @ loc_local + + + if hit_world is None: + return + + + # If a dotted copy already exists, reuse it; else duplicate + siblings = [o for o in bpy.data.objects if o.name.startswith(cam.name + ".")] + if len(siblings) == 1: + old_cam = siblings[0] + # Move only if closer to frame center + if (old_cam.matrix_world.translation - context.scene.mari_props.frame_center).length > (hit_world - context.scene.mari_props.frame_center).length: + # Preserve rotation while updating position + old_cam.matrix_world = Matrix.Translation(hit_world) @ cam.matrix_world.to_quaternion().to_matrix().to_4x4() + old_cam["INTR"] = 1 + else: + new_cam = cam.copy() + if cam.data: + new_cam.data = cam.data.copy() + _mari_link_object_to_collection(new_cam, _mari_get_collection(context.scene, "MARI_Cameras")) + # Preserve rotation while setting new position + new_cam.matrix_world = Matrix.Translation(hit_world) @ cam.matrix_world.to_quaternion().to_matrix().to_4x4() + new_cam["INTR"] = 1 + + + + def modal(self, context, event): + prop = context.scene.mari_props + mari.generated = True + mari.did_focal = False + mari.cameras = [] + + for obj in bpy.data.objects: + if obj.name.startswith("MARI_"): + bpy.data.objects.remove(obj) + + + selected_objs = bpy.context.selected_objects + try: + prop.frame_collision_planes.clear() + except Exception: + pass + mari.planes = [] + + last_location = [] + last_rotation = [] + last_scale = [] + + + for slected_obj in selected_objs: + last_location.append(Vector([slected_obj.matrix_world.translation.x, slected_obj.matrix_world.translation.y, slected_obj.matrix_world.translation.z])) + last_rotation.append(Vector([slected_obj.matrix_world.to_euler().x, slected_obj.matrix_world.to_euler().y, slected_obj.matrix_world.to_euler().z])) + last_scale.append(Vector([slected_obj.scale.x, slected_obj.scale.y, slected_obj.scale.z])) + if prop.frame_advanced_possition: + mari.planes.append(slected_obj) + try: + item = prop.frame_collision_planes.add() + item.name = slected_obj.name + except Exception: + pass + + + frame = self.AddFrame() + + frame.location = prop.frame_center + frame.rotation_euler = Euler((0.0, 0.0, math.pi)) + + self.AddCameras(frame, event, selected_objs) + + def updateRadius(cams): + self = context.scene.mari_props + bpy.context.scene.cursor.location = self.frame_center + bpy.context.scene.tool_settings.transform_pivot_point = 'CURSOR' + + bpy.ops.transform.resize(value=(1/mari.last_radius, 1/mari.last_radius, 1/mari.last_radius), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=3.7975, use_proportional_connected=False, use_proportional_projected=False) + bpy.ops.transform.resize(value=(self.frame_uniform_radius, self.frame_uniform_radius, self.frame_uniform_radius), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=3.7975, use_proportional_connected=False, use_proportional_projected=False) + + bpy.context.scene.tool_settings.transform_pivot_point = 'INDIVIDUAL_ORIGINS' + bpy.ops.transform.resize(value=(mari.last_radius/self.frame_uniform_radius, mari.last_radius/self.frame_uniform_radius, mari.last_radius/self.frame_uniform_radius), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=3.7975, use_proportional_connected=False, use_proportional_projected=False) + + mari.last_radius = self.frame_uniform_radius + bpy.ops.view3d.snap_cursor_to_center() + + + if prop.frame_advanced_possition == True and prop.frame_advenced_leftover_angle == False: + for obj in bpy.data.objects: + if "." not in obj.name and obj.name.startswith("MARI_CAMERA"): + bpy.data.objects.remove(obj) + + elif prop.frame_advanced_possition == True and prop.frame_advenced_leftover_angle == True: + bpy.ops.object.select_all(action='DESELECT') + for obj in bpy.data.objects: + if "." not in obj.name and obj.name.startswith("MARI_CAMERA"): + x_cam = filter(lambda n: n.name.startswith(obj.name + "."), bpy.data.objects) + list_xcam = list(x_cam) + + if len(list_xcam) == 1: + bpy.data.objects.remove(obj) + + for obj in bpy.data.objects: + if "." not in obj.name and obj.name.startswith("MARI_CAMERA"): + obj.select_set(True) + updateRadius(obj) + + _mari_rename_cameras_by_indices(context.scene) + + prop.cam_num = 0 + mari.cam_num = 0 + for obj_cam in bpy.data.objects: + if obj_cam.name.startswith("MARI_CAMERA"): + prop.cam_num += 1 + mari.cameras.append(obj_cam) + + self._mark_center_camera() + + # Auto-fit FOVs for all MARI cameras (fast & exact, replaces the old button) + self._auto_fit_all_cameras(context, frame) + + + desired_rot = tuple(prop.frame_rotation) # (rx, ry, rz) in radians from the UI + self._rotate_rig_about_center(prop.frame_center, desired_rot) + + + + + frame.select_set(False) + # Note: Intersection objects are already restored in AddCameras (offset added then removed)`r`n # No additional restoration needed here`r`n + + return {'CANCELLED'} + + def invoke(self, context, event): + if context.space_data.type == 'VIEW_3D': + context.window_manager.modal_handler_add(self) + return {'RUNNING_MODAL'} + + + + +####### Render ######## + + +m = mari() +class MARI_OT_Frame_render(Operator): + """Render All Cameras""" + bl_label = "Render" + bl_idname = f"{addon_prefix}.frame_render" + + action: StringProperty(default="STILL") + def area(self, points): + sum = 0 + for i in range(len(points)): + + if i == len(points)-1: + sum += points[i][0] * points[0][1] - points[i][1] * points[0][0] + else: + sum += points[i][0] * points[i+1][1] - points[i][1] * points[i+1][0] + + return abs(sum/2) + + + + def execute(self, context): + try: + mari_detect_mode_from_scene(context.scene) + except Exception: + pass + mari.render_action = self.action + mari.area = None + + + prop = context.scene.mari_props + if not _mari_output_path_set(prop): + self.report({'ERROR'}, "Please set the Output Folder in MARI Render Settings before rendering.") + _mari_clear_render_active() + return {'CANCELLED'} + if getattr(prop, "frame", "") != "FRAME": + self.report({'ERROR'}, "Scene has a Frame; switch mode to FRAME in the panel before rendering.") + return {'CANCELLED'} + if not _mari_require_cv2_for_frame(self): + return {'CANCELLED'} + _mari_mark_render_active(context.scene) + _mari_start_cancel_watcher(context) + mari.cancel_all = False + _mari_set_render_display_for_preview() # ensures SCREEN/AREA/IMAGE_EDITOR and unlocks UI + # start with a clean queue each run + mari.render_queue = None + mari._manual_seq_render = False + mari._manual_video_render = False + mari._last_still_target = None + + + + mari.cancel_all = False + + # show renders inside the Blender UI (no pop-up OS window stealing focus) + _mari_set_render_display_for_preview() + + context.scene.render.resolution_x = int(prop.frame_ratio[0]) + context.scene.render.resolution_y = int(prop.frame_ratio[1]) + + f__ = context.scene.render.resolution_percentage + context.scene.render.resolution_x = int(context.scene.render.resolution_x * context.scene.render.resolution_percentage/100) + context.scene.render.resolution_y = int(context.scene.render.resolution_y * context.scene.render.resolution_percentage/100) + context.scene.render.resolution_percentage = 100 + + mari.res_x = int(prop.frame_ratio[0]) + mari.res_y = int(prop.frame_ratio[1]) + + real_x = int(prop.frame_ratio[0]) + real_y = int(prop.frame_ratio[1]) + + if prop.frame == "FRAME": + ok, err = _mari_refresh_frame_quads(context, prop, real_x, real_y) + if not ok: + self.report({'ERROR'}, err) + _mari_clear_render_active() + return {'CANCELLED'} + + prop.render_settings_limit_res = (int(real_x * prop.render_settings_limit_res_factor), int(real_y * prop.render_settings_limit_res_factor)) + prop.render_settings_filepath = bpy.path.abspath(prop.render_settings_filepath) + frames_total = context.scene.frame_end - context.scene.frame_start + 1 + fmt_type = _mari_ff_type_from_format(context.scene.render.image_settings.file_format) + is_video_mode = fmt_type == "ANIM" + mari.og_type = context.scene.render.image_settings.file_format + mari.ffmpeg_format = context.scene.render.ffmpeg.format + mari.ffmpeg_codec = context.scene.render.ffmpeg.codec + mari.ffmpeg_color_mode = context.scene.render.image_settings.color_mode + + def _cleanup_and_restore(): + """ + Restore formats and preview preference. Safe to call multiple times. + Returning None makes this usable from timers to stop further scheduling. + """ + try: + context.scene.render.image_settings.file_format = mari.og_type + context.scene.render.ffmpeg.format = mari.ffmpeg_format + context.scene.render.ffmpeg.codec = mari.ffmpeg_codec + context.scene.render.image_settings.color_mode = mari.ffmpeg_color_mode + except Exception: + pass + try: + _mari_restore_render_display() + except Exception: + pass + try: + mari.render_queue = None + except Exception: + pass + if not mari.cancel_all: + _mari_write_media_zip(prop) + # Restore the user's chosen format at the very end + try: + context.scene.render.image_settings.file_format = mari.og_type + except Exception: + pass + try: + out_root = os.path.join(bpy.path.abspath(prop.render_settings_filepath), prop.render_settings_name) + _mari_cleanup_temp_dirs(out_root) + except Exception: + pass + try: + _mari_clear_render_active() + except Exception: + pass + return None + + if self.action == "STILL" and is_video_mode: + self.report({'ERROR'}, "Cannot render STILL directly to video. Switch to an image format or use ANIM.") + _mari_clear_render_active() + return {'CANCELLED'} + + # All ANIM cases (image or video) continue through render_start/next_render (snapshot quad pipeline). + + + if mari.cameras == []: + for c in bpy.data.objects: + if c.name.startswith("MARI_CAMERA"): + mari.cameras.append(c) + + for cam in bpy.data.objects: + if cam.name.startswith("MARI_CAMERA"): + array = _mari_cam_quad(cam, context.scene, prop) + if not array or len(array) < 4: + self.report({'ERROR'}, _mari_frame_border_message(cam.name)) + _mari_clear_render_active() + return {"CANCELLED"} + cam["area"] = _mari_quad_area_bl_br_tl_tr(array) + + def get_ff(ff): + return _mari_extension_from_format(ff, context.scene) + + def ff_type(ff): + return _mari_ff_type_from_format(ff) + + + + + def get_rendered_type(folder): + """Return (extension_without_dot, type) for an existing render in `folder`. + + type is: + - "NA" for single files directly in `folder` (still image or video) + - "SEQ" for image sequences stored in subfolders + + If no valid rendered files exist yet, return (None, None). + + Marker/flag files like .txt or .mari3d are ignored on purpose so that + overwrite/resume logic does not treat them as an output format. + """ + valid_exts = set(_MARI_IMAGE_EXTENSIONS.values()) | set(_MARI_FFMPEG_EXTENSIONS.values()) + + # 1) Direct files in base folder (non-sequence outputs) + try: + entries = os.listdir(folder + "\\") + except FileNotFoundError: + return None, None + + for file in entries: + full = os.path.join(folder, file) + if not os.path.isfile(full): + continue + ext = os.path.splitext(file)[1].lower().lstrip(".") + # Ignore .mari3d, .txt, and anything not in our known image/video extensions + if not ext or ext in ("mari3d", "txt") or ext not in valid_exts: + continue + return ext, "NA" + + # 2) Subfolders treated as image sequences + for subname in entries: + sub = os.path.join(folder, subname) + if not os.path.isdir(sub): + continue + try: + for f in os.listdir(sub): + ext = os.path.splitext(f)[1].lower().lstrip(".") + if not ext or ext in ("mari3d", "txt") or ext not in valid_exts: + continue + return ext, "SEQ" + except FileNotFoundError: + continue + + # No previous renders found + return None, None + + + fmt_type_current = ff_type(context.scene.render.image_settings.file_format) + is_video_mode = fmt_type_current == "ANIM" + frames_total = context.scene.frame_end - context.scene.frame_start + 1 + + if self.action == "STILL" and is_video_mode: + self.report({'ERROR'}, "Video formats can only be rendered via Render MARI Animation.") + _mari_clear_render_active() + return {'CANCELLED'} + return None, None + + fmt_type_current = ff_type(context.scene.render.image_settings.file_format) + is_video_mode = fmt_type_current == "ANIM" + frames_total = context.scene.frame_end - context.scene.frame_start + 1 + + if self.action == "STILL" and is_video_mode: + self.report({'ERROR'}, "Video formats can only be rendered via Render MARI Animation.") + _mari_clear_render_active() + return {'CANCELLED'} + + import time + def _wait_for_image(path, timeout=3.0, tick=0.05): + last = -1 + t0 = time.time() + while time.time() - t0 < timeout: + if os.path.exists(path): + size = os.path.getsize(path) + if size > 0 and size == last: # size stable for one tick + img = cv2.imread(path, cv2.IMREAD_UNCHANGED) + if img is not None: + return img + last = size + time.sleep(tick) + return None + + def _count_frames(dirpath, exts): + if not os.path.isdir(dirpath): + return 0 + return len([f for f in os.listdir(dirpath) if f.lower().endswith(exts)]) + + def _frames_complete(dirpath, exts): + return _count_frames(dirpath, exts) >= frames_total + + + + + + + + mari.c = 0 + def next_render(*_args, **_kwargs): + if mari.cancel_all: + _cleanup_and_restore() + return None + + # Restore settings + try: + context.scene.render.image_settings.file_format = mari.og_type + context.scene.render.ffmpeg.format = mari.ffmpeg_format + context.scene.render.ffmpeg.codec = mari.ffmpeg_codec + context.scene.render.image_settings.color_mode = mari.ffmpeg_color_mode + except Exception: + pass + + queue = mari.render_queue if getattr(mari, "render_queue", None) else mari.cameras + if not queue or mari.next_cam_index >= len(queue): + _cleanup_and_restore() + return None + + cam = queue[mari.next_cam_index] + + base_dir = os.path.join(prop.render_settings_filepath, prop.render_settings_name) + cam_base = f"{prop.render_settings_name}_H{cam['H']}_V{cam['V']}" + video_ext = _mari_video_extension(context.scene) + + fmt_type_current = ff_type(mari.og_type) + is_video_mode_local = (fmt_type_current == "ANIM") + + real_x = int(prop.frame_ratio[0]) + real_y = int(prop.frame_ratio[1]) + + # --- RETRIEVE SNAPSHOT QUAD --- + # 1. Try to use the Snapshot (Video Mode) - Guaranteed correct scale + quad = getattr(mari, "active_video_quad", None) + flip_x = getattr(mari, "active_video_flip_x", False) + flip_y = getattr(mari, "active_video_flip_y", False) + + # 2. If not found (Still/Seq Mode), calculate fresh + if not quad: + _mari_apply_frame_resolution(context.scene, prop) + quad = _mari_cam_quad(cam, context.scene, prop) + if not quad: + print(f"[MARI] WARN: no quad data for {cam.name}, skipping warp.") + mari.next_cam_index += 1 + bpy.app.timers.register(render_start, first_interval=0.5) + return None + flip_x, flip_y = _mari_frame_warp_flip_flags(context.scene, cam, prop, quad, real_x, real_y) + + if mari.render_action == "STILL": + ext = get_ff(context.scene.render.image_settings.file_format.lower()) + filepath = os.path.join(base_dir, f"{cam_base}.{ext}") + _mari_fix_still_output_name(filepath) + + img = _wait_for_image(filepath) + if img is None: + _mari_fix_still_output_name(filepath) + img = _wait_for_image(filepath, timeout=1.0) + if img is None: + mari.next_cam_index += 1 + bpy.app.timers.register(render_start, first_interval=0.5) + return None + + out = _mari_warp_image(img, quad, real_x, real_y, flip=flip_x, flip_y=flip_y) + + save_ext = os.path.splitext(filepath)[1].lower() + save_args = [cv2.IMWRITE_JPEG_QUALITY, 100] if save_ext in {".jpg", ".jpeg"} else [] + if save_args: + cv2.imwrite(filepath, out, save_args) + else: + cv2.imwrite(filepath, out) + + mari.next_cam_index += 1 + bpy.app.timers.register(render_start, first_interval=0.5) + return None + + elif mari.render_action == "ANIM" and not is_video_mode_local: + dirpath = os.path.join(base_dir, cam_base) + if not os.path.isdir(dirpath): + mari.next_cam_index += 1 + bpy.app.timers.register(render_start, first_interval=0.5) + return None + + # Only warp if the PERSPFLAG exists (prevents double-warp on resume) + if not os.path.exists(_persp_flag_path(dirpath)): + mari.next_cam_index += 1 + bpy.app.timers.register(render_start, first_interval=0.5) + return None + + frames = sorted(f for f in os.listdir(dirpath) if f.lower().endswith((".png", ".jpg", ".jpeg"))) + + for fname in frames: + fpath = os.path.join(dirpath, fname) + img = _wait_for_image(fpath) + if img is None: continue + + out = _mari_warp_image(img, quad, real_x, real_y, flip=flip_x, flip_y=flip_y) + cv2.imwrite(fpath, out) + + _clear_persp_flag(dirpath) + mari.next_cam_index += 1 + bpy.app.timers.register(render_start, first_interval=0.5) + return None + + else: + # --- ANIMATION AS VIDEO (Warp Phase) --- + temp_dir = os.path.join(base_dir, cam_base + "_TEMP") + final_base = os.path.join(base_dir, cam_base) + final_path = final_base + "." + video_ext + + if not os.path.isdir(temp_dir): + mari.next_cam_index += 1 + bpy.app.timers.register(render_start, first_interval=0.5) + return None + + frames = sorted(f for f in os.listdir(temp_dir) if f.lower().endswith(".png")) + + # Warp using the Snapshot Quad only if PERSPFLAG exists + if os.path.exists(_persp_flag_path(temp_dir)): + for fname in frames: + fpath = os.path.join(temp_dir, fname) + img = _wait_for_image(fpath) + if img is None: + continue + out = _mari_warp_image(img, quad, real_x, real_y, flip=flip_x, flip_y=flip_y) + cv2.imwrite(fpath, out) + _clear_persp_flag(temp_dir) + + # Build Video + _mari_build_video_from_temp(context, temp_dir, frames, final_path) + + # Cleanup + shutil.rmtree(temp_dir, ignore_errors=True) + + mari.next_cam_index += 1 + bpy.app.timers.register(render_start, first_interval=0.5) + return None + def render_complete(scene): + if getattr(mari, "_manual_video_render", False) or getattr(mari, "_manual_seq_render", False): + return + # remove ourselves safely + try: + bpy.app.handlers.render_complete.remove(render_complete) + except Exception: + pass + + # if canceled, stop here and restore settings + if mari.cancel_all: + _cleanup_and_restore() + return + + # otherwise continue to warp/queue the next camera + bpy.app.timers.register(next_render, first_interval=0.15) + + # (Re)register the handler cleanly + for _h in list(bpy.app.handlers.render_complete): + if getattr(_h, "__name__", "") == "render_complete": + try: + bpy.app.handlers.render_complete.remove(_h) + except Exception: + pass + bpy.app.handlers.render_complete.append(render_complete) + + + + + + def render_start(*_args, **_kwargs): + queue = mari.render_queue if getattr(mari, "render_queue", None) else mari.cameras + if mari.cancel_all or mari.next_cam_index >= len(queue): + _cleanup_and_restore() + return None + + try: + cam = queue[mari.next_cam_index] + + # 1. Force 100% Resolution (CRITICAL for correct coordinates) + # We must do this BEFORE calculating the quad. + _mari_apply_frame_resolution(context.scene, prop) + + base_dir = os.path.join(prop.render_settings_filepath, prop.render_settings_name) + cam_base = f"{prop.render_settings_name}_H{cam['H']}_V{cam['V']}" + video_ext = _mari_video_extension(context.scene) + + # Determine Mode + fmt_type_current = ff_type(mari.og_type) + is_video_mode_local = (fmt_type_current == "ANIM") + + context.scene.camera = cam + + # --- SNAPSHOT THE QUAD (Fixes Bowtie) --- + # We calculate this NOW while resolution is definitely 100%. + # We store it in 'mari.active_video_quad' so next_render uses THIS exact data. + quad = _mari_cam_quad(cam, context.scene, prop) + if quad: + mari.active_video_quad = quad + mari.active_video_flip_x, mari.active_video_flip_y = _mari_frame_warp_flip_flags( + context.scene, cam, prop, quad, real_x, real_y + ) + else: + mari.active_video_quad = None + mari.active_video_flip_x = False + mari.active_video_flip_y = False + print(f"[MARI] WARN: no quad data for {cam.name}") + flip_x = getattr(mari, "active_video_flip_x", False) + flip_y = getattr(mari, "active_video_flip_y", False) + + # --- EXPORT MARI3D DATA (Restored) --- + if mari.render_action == "ANIM": + bpy.ops.mari.export_mari(action="RENDER", type="FRAME", format="ANIM") + else: + bpy.ops.mari.export_mari(action="RENDER", type="FRAME", format="STILL") + + if mari.render_action == "STILL": + ext = get_ff(context.scene.render.image_settings.file_format.lower()) + filepath = os.path.join(base_dir, f"{cam_base}.{ext}") + context.scene.render.filepath = filepath + + if os.path.isfile(filepath) and not context.scene.render.use_overwrite: + if _mari_is_valid_render_output(filepath): + print("[MARI] STILL: skipped existing", filepath) + mari.next_cam_index += 1 + bpy.app.timers.register(render_start, first_interval=0.5) + return + _mari_maybe_write_placeholder(context.scene, filepath) + + _mari_invoke_render(write_still=True) + + elif mari.render_action == "ANIM" and not is_video_mode_local: + seq_dir = os.path.join(base_dir, cam_base + "\\") + os.makedirs(seq_dir, exist_ok=True) + prefix = prop.render_settings_name + "_" + ext = get_ff(context.scene.render.image_settings.file_format.lower()) + + if not context.scene.render.use_overwrite: + missing = _mari_missing_sequence_frames(seq_dir, prefix, ext, context.scene.frame_start, context.scene.frame_end) + flag_exists = os.path.exists(_persp_flag_path(seq_dir)) + if not missing: + if flag_exists: + bpy.app.timers.register(next_render, first_interval=0.2) + return + mari.next_cam_index += 1 + bpy.app.timers.register(render_start, first_interval=0.5) + return + + if flag_exists: + _ensure_persp_flag(seq_dir) + mari._manual_seq_render = True + _mari_render_sequence_frames(context.scene, seq_dir, prefix, ext, missing) + mari._manual_seq_render = False + bpy.app.timers.register(next_render, first_interval=0.2) + return + + # Already-warped frames exist; only warp newly rendered frames. + mari._manual_seq_render = True + _mari_render_sequence_frames(context.scene, seq_dir, prefix, ext, missing) + mari._manual_seq_render = False + for frame in missing: + fpath = _mari_seq_frame_path(seq_dir, prefix, frame, ext) + img = _wait_for_image(fpath) + if img is None: + continue + out = _mari_warp_image(img, quad, real_x, real_y, flip=flip_x, flip_y=flip_y) + cv2.imwrite(fpath, out) + mari.next_cam_index += 1 + bpy.app.timers.register(render_start, first_interval=0.5) + return + + _ensure_persp_flag(seq_dir) + context.scene.render.filepath = seq_dir + prop.render_settings_name + "_" + _mari_invoke_render(animation=True) + + else: + # --- ANIMATION AS VIDEO (Render Phase) --- + # We simply render the Temp PNGs here using Blender's native loop. + # This prevents the UI hang. Warping happens in 'next_render'. + start_f = context.scene.frame_start + end_f = context.scene.frame_end + final_base = os.path.join(base_dir, cam_base) + final_path = final_base + "." + video_ext + temp_dir = os.path.join(base_dir, cam_base + "_TEMP") + + _mari_fix_video_output_name(final_path) + if os.path.isfile(final_path) and not context.scene.render.use_overwrite: + if _mari_is_valid_render_output(final_path): + print("[MARI] ANIM-VIDEO: final exists, skipping", final_path) + mari.next_cam_index += 1 + bpy.app.timers.register(render_start, first_interval=0.5) + return + _mari_maybe_write_placeholder(context.scene, final_path) + + if context.scene.render.use_overwrite and os.path.isdir(temp_dir): + shutil.rmtree(temp_dir, ignore_errors=True) + os.makedirs(temp_dir, exist_ok=True) + prefix = prop.render_settings_name + "_" + if not context.scene.render.use_overwrite: + missing = _mari_missing_sequence_frames(temp_dir, prefix, "png", start_f, end_f) + flag_exists = os.path.exists(_persp_flag_path(temp_dir)) + if not missing: + bpy.app.timers.register(next_render, first_interval=0.2) + return + if not flag_exists: + # Render only missing frames, warp them now, then build video. + mari._manual_video_render = True + _mari_render_animation_to_temp_png( + context.scene, + temp_dir, + prefix, + frame_start=start_f, + frame_end=end_f, + ) + mari._manual_video_render = False + for frame in missing: + fpath = os.path.join(temp_dir, f"{prefix}{frame:04d}.png") + img = _wait_for_image(fpath) + if img is None: + continue + out = _mari_warp_image(img, quad, real_x, real_y, flip=flip_x, flip_y=flip_y) + cv2.imwrite(fpath, out) + frames = sorted(f for f in os.listdir(temp_dir) if f.lower().endswith(".png")) + _mari_build_video_from_temp(context, temp_dir, frames, final_path) + shutil.rmtree(temp_dir, ignore_errors=True) + mari.next_cam_index += 1 + bpy.app.timers.register(render_start, first_interval=0.5) + return + + _ensure_persp_flag(temp_dir) + + # Render temp PNG sequence via sandboxed per-frame renders + mari._manual_video_render = True + _mari_render_animation_to_temp_png( + context.scene, + temp_dir, + prefix, + frame_start=start_f, + frame_end=end_f, + ) + mari._manual_video_render = False + bpy.app.timers.register(next_render, first_interval=0.2) + return + + except Exception as e: + print("[MARI] ERROR in render_start:", e) + _cleanup_and_restore() + return None + + # Register Handler + for _h in list(bpy.app.handlers.render_complete): + if getattr(_h, "__name__", "") == "render_complete": + try: bpy.app.handlers.render_complete.remove(_h) + except: pass + bpy.app.handlers.render_complete.append(render_complete) + + + + mari.next_cam_index = 0 + mari.is_normalized = prop.render_settings_normalize + mari.active_video_quad = None + mari.active_video_flip_x = False + mari.active_video_flip_y = False + + + if not _mari_output_path_set(prop): + self.report({'ERROR'}, "Please set the Output Folder in MARI Render Settings before rendering.") + _mari_clear_render_active() + return {'CANCELLED'} + # Normalise the base project directory once, but do NOT + # pre-create any per-camera H_V folders here. + base_dir = prop.render_settings_filepath + prop.render_settings_name + "\\" + + if context.scene.render.use_overwrite: + # Overwrite ON: wipe the whole project folder and recreate it. + if os.path.isdir(base_dir): + shutil.rmtree(base_dir) + os.makedirs(base_dir, exist_ok=True) + else: + # Overwrite OFF: ensure the project folder exists, but do not + # pre-create H_V folders and do not try to interpret existing + # files by extension. Resume/skip logic is handled later + # inside render_start(), per camera. + if not os.path.isdir(base_dir): + os.makedirs(base_dir, exist_ok=True) + + + + + + + + + + try: + mari.render_queue = None + if not context.scene.render.use_overwrite: + base_dir = bpy.path.abspath(prop.render_settings_filepath + prop.render_settings_name + "\\") + # Only accelerate when output is image-based (STILL frames) + if ff_type(context.scene.render.image_settings.file_format) == "STILL": + import re + ext = get_ff(context.scene.render.image_settings.file_format.lower()) + existing = set() + + if self.action == "STILL": + # Files: _H#_V#. in base_dir + pat = re.compile(rf"^{re.escape(prop.render_settings_name)}_H(-?\d+)_V(-?\d+)\.{ext}$", re.IGNORECASE) + if os.path.isdir(base_dir): + for fn in os.listdir(base_dir): + m = pat.match(fn) + if m: + full = os.path.join(base_dir, fn) + if _mari_is_valid_render_output(full): + existing.add((int(m.group(1)), int(m.group(2)))) + mari.render_queue = [cam for cam in mari.cameras if (cam.get('H'), cam.get('V')) not in existing] + + elif self.action == "ANIM": + # Image sequence subfolders: _H#_V#\ with frames inside + frames_needed = context.scene.frame_end - context.scene.frame_start + 1 + subpat = re.compile(rf"^{re.escape(prop.render_settings_name)}_H(-?\d+)_V(-?\d+)$", re.IGNORECASE) + if os.path.isdir(base_dir): + for entry in os.scandir(base_dir): + if entry.is_dir(): + m = subpat.match(entry.name) + if m: + hv = (int(m.group(1)), int(m.group(2))) + cnt = 0 + for subf in os.scandir(entry.path): + if subf.is_file() and subf.name.lower().endswith("." + ext): + if _mari_is_valid_render_output(subf.path): + cnt += 1 + if cnt >= frames_needed: + existing.add(hv) + mari.render_queue = [cam for cam in mari.cameras if (cam.get('H'), cam.get('V')) not in existing] + except Exception: + mari.render_queue = None + + bpy.ops.mari.export_mari(action="RENDER", type="FRAME", format=self.action) + + render_start(context.area) + + context.scene.render.resolution_percentage = f__ + print(context.scene.render.resolution_x / f__, context.scene.render.resolution_x, f__/100) + context.scene.render.resolution_x = int(context.scene.render.resolution_x / (f__/100)) + context.scene.render.resolution_y = int(context.scene.render.resolution_y / (f__/100)) + + return {'FINISHED'} + + def invoke(self, context, event): + import os + mari.og_type = context.scene.render.image_settings.file_format + mari.ffmpeg_format = context.scene.render.ffmpeg.format + mari.ffmpeg_codec = context.scene.render.ffmpeg.codec + mari.ffmpeg_color_mode = context.scene.render.image_settings.color_mode + + wm = context.window_manager + prop = context.scene.mari_props + + # Check overwrite folder state exactly as execute() uses it + base = bpy.path.abspath(prop.render_settings_filepath + prop.render_settings_name + "\\") + needs_confirm = False + if context.scene.render.use_overwrite and os.path.isdir(base): + try: + # Non-empty directory? + needs_confirm = any(os.scandir(base)) + except Exception: + needs_confirm = False + + if needs_confirm: + # flag only for draw() to show warning text + self._overwrite_warning = True + return wm.invoke_props_dialog(self, width=520) + + # Fall back to your existing prompts/confirm + if context.scene.mari_props.render_settings_normalize: + return wm.invoke_props_dialog(self) + if mari.did_focal == False: + return wm.invoke_props_dialog(self) + return wm.invoke_confirm(self, event) + + + + def draw(self, context): + layout = self.layout + prop = context.scene.mari_props + + # Only shows when invoke() set the flag + if getattr(self, "_overwrite_warning", False): + col = layout.column() + col.alert = True + col.label(text="Overwrite is ON and the output folder contains files.", icon='ERROR') + col.label(text="All contents in this folder will be deleted before rendering.") + col.separator() + col.label(text=f"Folder: {bpy.path.abspath(prop.render_settings_filepath)}{prop.render_settings_name}\\", icon='FILE_FOLDER') + layout.separator() + + if context.scene.mari_props.render_settings_normalize: + layout.label(text="Normalize is on; Rendering may take up more time and memory!") + if mari.did_focal == False: + layout.label(text="Did not run AutoFocalLength; Are all Focal Lengths Optimized? & Are you in the right rendering mode?)") + +############################## +##### CIRCLE ############## + + +class MARI_OT_GenerateCircle(Operator): + """Generate the Center Circle""" + bl_label = "Generate Center" + bl_idname = f"{addon_prefix}.make_circle" + + + def AddCircle(self): + prop = bpy.context.scene.mari_props + bpy.ops.mesh.primitive_circle_add(radius=prop.circle_radius, enter_editmode=False, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1)) + + obj = bpy.context.object + obj.name = "MARI_CircleCenter" + obj.hide_render = True + _mari_link_object_to_collection(obj, _mari_get_collection(bpy.context.scene, "MARI_Cameras")) + + return obj + + + + def AddCameras(self, frame): + context = bpy.context + prop = bpy.context.scene.mari_props + cam_coll = _mari_get_collection(context.scene, "MARI_Cameras") + RAD2DEG = 57.29577951308232 + eps = 1e-6 + i = prop.circle_interval + step_v = max(1e-4, abs(i[1] * RAD2DEG)) + step_h = max(1e-4, abs(i[0] * RAD2DEG)) + u = float(prop.circle_max_angle_ud[0] * RAD2DEG) + d = float(prop.circle_max_angle_ud[1] * RAD2DEG) + l = float(prop.circle_max_angle_lr[0] * RAD2DEG) + r = float(prop.circle_max_angle_lr[1] * RAD2DEG) + c = prop.frame_center + + mari.last_radius = prop.circle_radius * 3 + if prop.frame_radius_lock == True: + mari.last_radius = prop.frame_uniform_radius + + def CameraLocation(v, h, j, use_z = True, lr = True): + if use_z == True: + z = mari.last_radius * math.cos(math.radians(v)) + y = mari.last_radius * math.cos(math.radians(h)) * math.sin(math.radians(v)) + x = mari.last_radius * math.sin(math.radians(h)) * math.sin(math.radians(v)) + else: + x = mari.last_radius * math.cos(math.radians(v)) + y = mari.last_radius * math.sin(math.radians(v)) + + H_idx = int(round(-h / step_h)) + V_idx = int(round(-(v - 90.0) / step_v)) + cam_data = bpy.data.cameras.new(f"MARI_Camera_{j}") + if not mari.did_focal: + cam_data.lens = prop.camera_settings_lens + cam_data.dof.use_dof = prop.camera_settings_dof_use + cam_data.dof.focus_object = prop.camera_settings_dof_object + cam_data.dof.focus_distance = prop.camera_settings_dof_distance + cam_data.clip_start = prop.camera_settings_clip_start + cam_data.clip_end = prop.camera_settings_clip_end + cam_data.dof.aperture_fstop = prop.camera_settings_dof_fstop + cam_data.dof.aperture_blades = prop.camera_settings_dof_blades + cam_data.dof.aperture_rotation = prop.camera_settings_dof_rotation + cam_data.dof.aperture_ratio = prop.camera_settings_dof_ratio + obj = bpy.data.objects.new(f"MARI_CAMERA_H{H_idx}_V{V_idx}", cam_data) + obj["H"] = H_idx + obj["V"] = V_idx + _mari_link_object_to_collection(obj, cam_coll) + + obj["INTR"] = 0 + + obj.matrix_world.translation = (x, y, z if use_z == True else 0) + + obj.parent = frame + if j == 0: + obj.show_axis = True + + cam_damped_track=obj.constraints.new(type="TRACK_TO") + cam_damped_track.target=frame + cam_damped_track.track_axis="TRACK_NEGATIVE_Z" + cam_damped_track.up_axis="UP_Y" + cam_damped_track.use_target_z = True + + + + + def _signed_index_range(min_deg, max_deg, step_deg, max_abs_deg): + if step_deg <= 0.0: + return [] + lo = max(-max_abs_deg, min(float(min_deg), float(max_deg))) + hi = min(max_abs_deg, max(float(min_deg), float(max_deg))) + start_idx = int(math.ceil((lo - eps) / step_deg)) + end_idx = int(math.floor((hi + eps) / step_deg)) + if start_idx > end_idx: + return [] + return list(range(start_idx, end_idx + 1)) + + v_indices = _signed_index_range(-d, u, step_v, 90.0) + h_indices = _signed_index_range(-l, r, step_h, 180.0) + if h_indices and (h_indices[0] * step_h) <= (-180.0 + 1e-4) and (h_indices[-1] * step_h) >= (180.0 - 1e-4): + h_indices = h_indices[1:] + + j = 0 + + for V in v_indices: + v = 90.0 - (V * step_v) + for H in h_indices: + h = -H * step_h + CameraLocation(v, h, j) + j += 1 + + + pole_index = None + has_poles = False + if step_v > 0.0: + pole_index = int(round(90.0 / step_v)) + has_poles = abs(90.0 - (pole_index * step_v)) <= 1e-4 + + for obj in list(bpy.data.objects): #Change of top/bottom ends of Circle + if obj.name.startswith("MARI_CAMERA"): + if has_poles and obj.get("V") in (pole_index, -pole_index): + + bpy.context.view_layer.objects.active = obj + for constraint in obj.constraints: + obj.constraints.remove(constraint) + + h_value = int(obj.get("H", 0)) + + if obj.get("V", 0) > 0: # Top end + if h_value != 0: # H is not 0 + bpy.context.view_layer.objects.active = obj + obj.rotation_euler.x = 0 + obj.rotation_euler.y = 0 + obj.rotation_euler.z = math.radians(step_h * h_value + 180) + else: # H is 0 + bpy.context.view_layer.objects.active = obj + obj.rotation_euler.x = 0 + obj.rotation_euler.y = 0 + obj.rotation_euler.z = math.pi + else: # Bottom end + if h_value != 0: # H is not 0 + bpy.context.view_layer.objects.active = obj + obj.rotation_euler.x = 0 + obj.rotation_euler.y = math.pi + obj.rotation_euler.z = math.radians(step_h * h_value) + else: # H is 0 + bpy.context.view_layer.objects.active = obj + obj.rotation_euler.x = 0 + obj.rotation_euler.y = math.pi + obj.rotation_euler.z = 0 + + + ''' + if 90%step_v == 0: + if f"H0" not in obj.name: + bpy.data.objects.remove(obj) + print("UpDown") + elif "-" not in obj.name: + + bpy.context.view_layer.objects.active = obj + bpy.ops.constraint.apply(constraint="Track To", owner='OBJECT') + obj.rotation_euler.z = math.pi + + print("UpDown") + else: + + bpy.context.view_layer.objects.active = obj + bpy.ops.constraint.apply(constraint="Track To", owner='OBJECT') + obj.rotation_euler.z = math.pi + obj.rotation_euler.x = math.pi + obj.rotation_euler.y = 0 + + print("UpDown") + ''' + + if d < 0: + mark = abs(d) / step_v + elif u < 0: + mark = abs(u) / step_v + + try: + for ma in range(math.floor(mark)): + if f"V{ma}" in obj.name: + bpy.data.objects.remove(obj) + elif f"V{-ma}" in obj.name: + bpy.data.objects.remove(obj) + except: + pass + + + + + def execute(self, context): + + mari.cancel_all = False + _mari_set_render_display_for_preview() + _mari_cleanup_temp_collection(context.scene) + + prop = context.scene.mari_props + mari.did_focal = False + mari.generated = True + mari.cameras = [] + + for obj in list(bpy.data.objects): + if obj.name.startswith("MARI_"): + bpy.data.objects.remove(obj) + _mari_purge_orphan_mari_camera_data() + + def _cleanup_and_restore(): + # --- Restore user's render settings if we temporarily changed them --- + if hasattr(mari, "_restore_format"): + context.scene.render.image_settings.file_format = mari._restore_format + context.scene.render.ffmpeg.codec = mari._restore_codec + context.scene.render.ffmpeg.format = mari._restore_format_ffmpeg + del mari._restore_format + del mari._restore_codec + del mari._restore_format_ffmpeg + try: + context.scene.render.image_settings.file_format = mari.og_type + context.scene.render.ffmpeg.format = mari.ffmpeg_format + context.scene.render.ffmpeg.codec = mari.ffmpeg_codec + context.scene.render.image_settings.color_mode = mari.ffmpeg_color_mode + except Exception: + pass + try: + _mari_restore_render_display() + except Exception: + pass + if not mari.cancel_all: + _mari_write_media_zip(prop) + try: + _mari_clear_render_active() + except Exception: + pass + return None + + + + circle = self.AddCircle() + + circle.location = prop.circle_location + circle.rotation_euler = Euler([-prop.circle_rotation[0], -prop.circle_rotation[1], prop.circle_rotation[2] + math.pi]) + + self.AddCameras(circle) + try: + prop.updateCameras(context) + except Exception: + pass + + prop.frame_uniform_radius = mari.last_radius + + prop.cam_num = 0 + for obj_cam in bpy.data.objects: + if obj_cam.name.startswith("MARI_CAMERA"): + mari.cameras.append(obj_cam) + prop.cam_num += 1 + + try: + _mari_apply_camera_visual_scale(context.scene) + except Exception: + pass + return {'FINISHED'} + + + + + + + + + + + + + + +class MARI_OT_Circle_render(Operator): + bl_idname = f"{addon_prefix}.circle_render" + bl_label = "Render" + + action: StringProperty(default="STILL") + + def execute(self, context): + try: + mari_detect_mode_from_scene(context.scene) + except Exception: + pass + + prop = context.scene.mari_props + if not _mari_output_path_set(prop): + self.report({'ERROR'}, "Please set the Output Folder in MARI Render Settings before rendering.") + return {'CANCELLED'} + if getattr(prop, "frame", "") != "CRICLE": + self.report({'ERROR'}, "Scene has a Circle; switch mode to CIRCLE in the panel before rendering.") + return {'CANCELLED'} + _mari_mark_render_active(context.scene) + _mari_start_cancel_watcher(context) + + mari.render_action = self.action + mari.render_queue = None + mari.cancel_all = False + _mari_set_render_display_for_preview() + mari._manual_seq_render = False + mari._manual_video_render = False + mari._last_still_target = None + + prop = context.scene.mari_props + prop.render_settings_filepath = bpy.path.abspath(prop.render_settings_filepath) + frames_total = context.scene.frame_end - context.scene.frame_start + 1 + is_video_mode = _mari_ff_type_from_format(context.scene.render.image_settings.file_format) == "ANIM" + mari.og_type = context.scene.render.image_settings.file_format + mari.ffmpeg_format = context.scene.render.ffmpeg.format + mari.ffmpeg_codec = context.scene.render.ffmpeg.codec + mari.ffmpeg_color_mode = context.scene.render.image_settings.color_mode + + if self.action == "STILL" and is_video_mode: + self.report({'ERROR'}, "Cannot render STILL directly to video. Switch to an image format or use ANIM.") + try: + _mari_clear_render_active() + except Exception: + pass + return {'CANCELLED'} + + # CIRCLE mode keeps the user's scene resolution exactly as configured. + + def _cleanup_and_restore(): + try: + context.scene.render.image_settings.file_format = mari.og_type + context.scene.render.ffmpeg.format = mari.ffmpeg_format + context.scene.render.ffmpeg.codec = mari.ffmpeg_codec + context.scene.render.image_settings.color_mode = mari.ffmpeg_color_mode + except Exception: + pass + try: + mari.render_queue = None + except Exception: + pass + try: + _mari_restore_render_display() + except Exception: + pass + if not mari.cancel_all: + _mari_write_media_zip(prop) + try: + out_root = os.path.join(bpy.path.abspath(prop.render_settings_filepath), prop.render_settings_name) + _mari_cleanup_temp_dirs(out_root) + except Exception: + pass + try: + _mari_clear_render_active() + except Exception: + pass + return None + + if mari.cameras == []: + for c in bpy.data.objects: + if c.name.startswith("MARI_CAMERA"): + mari.cameras.append(c) + + def get_ff(ff): + return _mari_extension_from_format(ff, context.scene) + + def ff_type(ff): + return _mari_ff_type_from_format(ff) + + + + def get_rendered_type(folder): + for file in os.listdir(folder + "\\"): + if os.path.splitext(file)[1] != "" and not file.endswith(".mari3d"): + return os.path.splitext(file)[1].replace(".", ""), "NA" + elif os.path.splitext(file)[1] == "": + for file in os.listdir(folder + file + "\\"): + return os.path.splitext(file)[1].replace(".", ""), "SEQ" + + + + + def next_render(*_args, **_kwargs): + if mari.cancel_all: + _cleanup_and_restore() + return None + + if mari.render_action == "STILL": + _mari_fix_still_output_name(getattr(mari, "_last_still_target", None)) + mari._last_still_target = None + + mari.next_cam_index += 1 + bpy.app.timers.register(render_start, first_interval=0.5) + + + def render_complete(scene): + if getattr(mari, "_manual_seq_render", False): + return + try: + bpy.app.handlers.render_complete.remove(render_complete) + except Exception: + pass + if mari.cancel_all: + _cleanup_and_restore() + return + if mari.render_action == "ANIM" and is_video_mode: + _mari_fix_video_output_name(getattr(mari, "_last_video_target", None)) + mari._last_video_target = None + bpy.app.timers.register(next_render, first_interval=0.15) + + # (Re)register the handler cleanly + for _h in list(bpy.app.handlers.render_complete): + if getattr(_h, "__name__", "") == "render_complete": + try: + bpy.app.handlers.render_complete.remove(_h) + except Exception: + pass + bpy.app.handlers.render_complete.append(render_complete) + + + + + + def render_start(*_args, **_kwargs): + queue = mari.render_queue if getattr(mari, "render_queue", None) else mari.cameras + if mari.cancel_all or mari.next_cam_index >= len(queue): + _cleanup_and_restore() + return None + + try: + cam = queue[mari.next_cam_index] + + base_dir = os.path.join(prop.render_settings_filepath, prop.render_settings_name) + cam_base = f"{prop.render_settings_name}_H{cam['H']}_V{cam['V']}" + # Use the shared helper that already knows how to extract the video extension + # from the scene's FFMPEG settings. + video_ext = _mari_video_extension(context.scene) + + ftype = get_ff(context.scene.render.image_settings.file_format.lower()) + context.scene.camera = cam + + + if mari.render_action == "STILL": + filepath = os.path.join(base_dir, f"{cam_base}.{ftype}") + context.scene.render.filepath = filepath + mari._last_still_target = filepath + + if os.path.isfile(filepath) and not context.scene.render.use_overwrite: + if _mari_is_valid_render_output(filepath): + print(f"[MARI] CIRCLE STILL: skipped existing {filepath}") + mari.next_cam_index += 1 + bpy.app.timers.register(render_start, first_interval=0.5) + return + _mari_maybe_write_placeholder(context.scene, filepath) + + _mari_invoke_render(write_still=True) + + elif mari.render_action == "ANIM" and not is_video_mode: + seq_dir = os.path.join(base_dir, cam_base) + os.makedirs(seq_dir, exist_ok=True) + prefix = prop.render_settings_name + "_" + if not context.scene.render.use_overwrite: + missing = _mari_missing_sequence_frames(seq_dir, prefix, ftype, context.scene.frame_start, context.scene.frame_end) + if not missing: + print(f"[MARI] CIRCLE ANIM-SEQ: skipped (frames already present) {seq_dir}") + mari.next_cam_index += 1 + bpy.app.timers.register(render_start, first_interval=0.5) + return + + mari._manual_seq_render = True + _mari_render_sequence_frames(context.scene, seq_dir, prefix, ftype, missing) + mari._manual_seq_render = False + bpy.app.timers.register(next_render, first_interval=0.2) + return + + context.scene.render.filepath = os.path.join(seq_dir, prop.render_settings_name + "_") + _mari_invoke_render(animation=True) + + else: + start_f = context.scene.frame_start + end_f = context.scene.frame_end + final_base = os.path.join(base_dir, cam_base) + final_path = f"{final_base}.{video_ext}" + context.scene.render.filepath = final_base + + _mari_fix_video_output_name(final_path) + if os.path.isfile(final_path) and not context.scene.render.use_overwrite: + if _mari_is_valid_render_output(final_path): + print(f"[MARI] CIRCLE ANIM-VIDEO: skipped existing {final_path}") + mari.next_cam_index += 1 + bpy.app.timers.register(render_start, first_interval=0.5) + return + _mari_maybe_write_placeholder(context.scene, final_path) + mari._last_video_target = final_path + + _mari_invoke_render(animation=True) + + for _h in list(bpy.app.handlers.render_complete): + if getattr(_h, "__name__", "") == "render_complete": + try: + bpy.app.handlers.render_complete.remove(_h) + except Exception: + pass + bpy.app.handlers.render_complete.append(render_complete) + + except Exception as ex: + print(ex) + + if prop.mari_save_media: + from zipfile import ZipFile, ZIP_DEFLATED + + filepath = prop.render_settings_name + os.chdir(prop.render_settings_filepath + filepath + "\\") + _mari_write_media_zip(prop) + mari.next_cam_index = 0 + + if not _mari_output_path_set(prop): + self.report({'ERROR'}, "Please set the Output Folder in MARI Render Settings before rendering.") + return {'CANCELLED'} + # Normalise the base project directory once, but do NOT + # pre-create any per-camera H_V folders here. + base_dir = prop.render_settings_filepath + prop.render_settings_name + "\\" + + if context.scene.render.use_overwrite: + # Overwrite ON: wipe the whole project folder and recreate it. + if os.path.isdir(base_dir): + shutil.rmtree(base_dir) + os.makedirs(base_dir) + # Per-camera folders are created on-demand inside render_start() + # when that specific camera actually starts rendering. + else: + # Overwrite OFF: ensure the project folder exists, but do not + # pre-create H_V folders and do not try to interpret existing + # files by extension. Resume/skip logic is handled later + # inside render_start(), per camera. + if not os.path.isdir(base_dir): + os.makedirs(base_dir) + + + + try: + mari.render_queue = None + if not context.scene.render.use_overwrite: + base_dir = bpy.path.abspath(prop.render_settings_filepath + prop.render_settings_name + "\\") + if ff_type(context.scene.render.image_settings.file_format) == "STILL": + import re + ext = get_ff(context.scene.render.image_settings.file_format.lower()) + existing = set() + + if self.action == "STILL": + pat = re.compile(rf"^{re.escape(prop.render_settings_name)}_H(-?\d+)_V(-?\d+)\.{ext}$", re.IGNORECASE) + if os.path.isdir(base_dir): + for fn in os.listdir(base_dir): + m = pat.match(fn) + if m: + full = os.path.join(base_dir, fn) + if _mari_is_valid_render_output(full): + existing.add((int(m.group(1)), int(m.group(2)))) + mari.render_queue = [cam for cam in mari.cameras if (cam.get('H'), cam.get('V')) not in existing] + + elif self.action == "ANIM": + frames_needed = context.scene.frame_end - context.scene.frame_start + 1 + subpat = re.compile(rf"^{re.escape(prop.render_settings_name)}_H(-?\d+)_V(-?\d+)$", re.IGNORECASE) + if os.path.isdir(base_dir): + for entry in os.scandir(base_dir): + if entry.is_dir(): + m = subpat.match(entry.name) + if m: + hv = (int(m.group(1)), int(m.group(2))) + cnt = 0 + for subf in os.scandir(entry.path): + if subf.is_file() and subf.name.lower().endswith("." + ext): + if _mari_is_valid_render_output(subf.path): + cnt += 1 + if cnt >= frames_needed: + existing.add(hv) + mari.render_queue = [cam for cam in mari.cameras if (cam.get('H'), cam.get('V')) not in existing] + except Exception: + mari.render_queue = None + + + + bpy.ops.mari.export_mari(action="RENDER", type="CIRCLE", format=self.action) + render_start() + + return {'FINISHED'} + + def invoke(self, context, event): + import os + wm = context.window_manager + prop = context.scene.mari_props + + base = bpy.path.abspath(prop.render_settings_filepath + prop.render_settings_name + "\\") + needs_confirm = False + if context.scene.render.use_overwrite and os.path.isdir(base): + try: + needs_confirm = any(os.scandir(base)) + except Exception: + needs_confirm = False + + if needs_confirm: + self._overwrite_warning = True + return wm.invoke_props_dialog(self, width=520) + + return wm.invoke_confirm(self, event) + + def draw(self, context): + if getattr(self, "_overwrite_warning", False): + layout = self.layout + prop = context.scene.mari_props + col = layout.column() + col.alert = True + col.label(text="Overwrite is ON and the output folder contains files.", icon='ERROR') + col.label(text="All contents in this folder will be deleted before rendering.") + col.separator() + col.label(text=f"Folder: {bpy.path.abspath(prop.render_settings_filepath)}{prop.render_settings_name}\\", icon='FILE_FOLDER') + +class MARI_OT_RenderOne(bpy.types.Operator): + """Render exactly one MARI camera (and optionally one frame) with identical behavior to the main MARI pipeline.""" + bl_idname = f"{addon_prefix}.render_one" + bl_label = "Render One MARI Camera" + bl_options = {'INTERNAL'} + + camera_name: bpy.props.StringProperty(name="Camera Name") + action: bpy.props.EnumProperty(items=[("STILL","STILL",""),("ANIM","ANIM","")], default="STILL") + frame: bpy.props.IntProperty(name="Frame", default=-1) # -1 means "current" + + def execute(self, context): + import traceback + try: + return self._execute_impl(context) + except Exception as exc: + tb = traceback.format_exc() + print(f"[MARI] [RenderOne] FATAL error on camera {self.camera_name}: {exc}") + print(tb) + self.report({'ERROR'}, str(exc)) + return {'CANCELLED'} + + def _execute_impl(self, context): + import numpy as np, time, glob, re, bpy_extras + print(f"[MARI] [RenderOne] camera={self.camera_name} action={self.action} frame={self.frame}") + + scn = context.scene + _mari_set_render_one_status(scn, "CANCELLED") + + def _return_status(status, result): + _mari_set_render_one_status(scn, status) + return result + + prop = scn.mari_props + mode = _mari_normalize_mode_id(getattr(prop, "frame", _MARI_MODE_CIRCLE)) + if mode == "FRAME" and not _mari_require_cv2_for_frame(self): + return {'CANCELLED'} + + cam = bpy.data.objects.get(self.camera_name) + if not cam: + self.report({'ERROR'}, f"Camera not found: {self.camera_name}") + print(f"[MARI] [RenderOne] ERROR: camera not found: {self.camera_name}") + return {'CANCELLED'} + + # Ensure camera is active + scn.camera = cam + + # Keep original formats to restore on exit (matches your pipeline) + og_ff = scn.render.image_settings.file_format + og_fmt = scn.render.ffmpeg.format + og_codec = scn.render.ffmpeg.codec + og_col = scn.render.image_settings.color_mode + og_use_ext = getattr(scn.render, "use_file_extension", True) + render_state = _mari_capture_render_settings(scn) + is_video_output = (_mari_ff_type_from_format(og_ff) == "ANIM") + + # FRAME mode uses frame ratio. CIRCLE mode keeps current scene resolution. + if mode == "FRAME": + _mari_apply_frame_resolution(scn, prop) + + def _restore_formats(): + try: + scn.render.image_settings.file_format = og_ff + scn.render.ffmpeg.format = og_fmt + scn.render.ffmpeg.codec = og_codec + scn.render.image_settings.color_mode = og_col + scn.render.use_file_extension = og_use_ext + except Exception: + pass + try: + _mari_restore_render_settings(scn, render_state) + except Exception: + pass + + if self.action == "STILL" and is_video_output: + self.report({'ERROR'}, "Cannot render STILL directly to video. Switch to an image format or use ANIM.") + _restore_formats() + return {'CANCELLED'} + + # ---- file naming identical to your operator ---- + def _ff(ext): + return _mari_extension_from_format(ext, scn) + + H = int(cam.get("H", 0)); V = int(cam.get("V", 0)) + real_x = int(prop.frame_ratio[0]); real_y = int(prop.frame_ratio[1]) + expected_image_size = _mari_expected_image_output_size(scn, prop, mode) + + # Build base paths just like your Frame/Circle render ops + base_dir = bpy.path.abspath(prop.render_settings_filepath) + name = prop.render_settings_name + ext = _mari_extension_from_format(scn.render.image_settings.file_format, scn) + + root_dir = os.path.join(base_dir, name) + os.makedirs(root_dir, exist_ok=True) + still_path = os.path.join(root_dir, f"{name}_H{H}_V{V}.{ext}") + seq_dir = os.path.join(root_dir, f"{name}_H{H}_V{V}") + + frame_inside = None + + # Select Frame-vs-Circle behavior + if mode == "FRAME": + try: + real_x = int(prop.frame_ratio[0]) + real_y = int(prop.frame_ratio[1]) + + ok, err = _mari_refresh_frame_quads(context, prop, real_x, real_y) + if not ok: + self.report({'ERROR'}, err or _mari_frame_border_message(cam.name)) + return {'CANCELLED'} + + array = _mari_cam_quad(cam, scn, prop) + if not array or len(array) < 4: + msg = _mari_frame_border_message(cam.name) + self.report({'ERROR'}, msg) + print(f"[MARI] [RenderOne] ERROR: {msg}") + return {'CANCELLED'} + flip_x, flip_y = _mari_frame_warp_flip_flags(scn, cam, prop, array, real_x, real_y) + + + + # Render + if self.action == "ANIM" and is_video_output: + # Video output path mirrors the main pipeline: temp PNGs -> warp -> VSE build + os.makedirs(root_dir, exist_ok=True) + fstart, fend = scn.frame_start, scn.frame_end + cam_id = f"{name}_H{H}_V{V}" + temp_tag = f"{name}_{fstart:04d}-{fend:04d}_H{H}_V{V}" + video_ext = _mari_video_extension(scn) + temp_dir = os.path.join(root_dir, temp_tag + "_TEMP") + final_path = os.path.join(root_dir, cam_id + f".{video_ext}") + + _mari_fix_video_output_name(final_path) + if os.path.isfile(final_path) and not scn.render.use_overwrite: + if _mari_is_valid_render_output(final_path): + print(f"[MARI] [RenderOne] ANIM-VIDEO skip existing {final_path}") + return _return_status("SKIPPED", {'FINISHED'}) + _mari_maybe_write_placeholder(scn, final_path) + + if scn.render.use_overwrite and os.path.isdir(temp_dir): + shutil.rmtree(temp_dir, ignore_errors=True) + os.makedirs(temp_dir, exist_ok=True) + prefix = name + "_" + if not scn.render.use_overwrite: + missing = _mari_missing_sequence_frames(temp_dir, prefix, "png", fstart, fend) + if not missing: + frames = sorted(f for f in os.listdir(temp_dir) if f.lower().endswith(".png")) + if os.path.exists(_persp_flag_path(temp_dir)): + for fname in frames: + fpath = os.path.join(temp_dir, fname) + img = cv2.imread(fpath, cv2.IMREAD_UNCHANGED) + if img is None: + continue + try: + out = _mari_warp_image(img, array, real_x, real_y, flip=flip_x, flip_y=flip_y) + cv2.imwrite(fpath, out) + except Exception as e: + print(f"[MARI] [RenderOne] WARN: warp failed for {fpath}: {e}") + _clear_persp_flag(temp_dir) + _mari_build_video_from_temp(bpy.context, temp_dir, frames, final_path) + shutil.rmtree(temp_dir, ignore_errors=True) + print(f"[MARI] [RenderOne] FINISHED ANIM-VIDEO H{H} V{V} -> {final_path}") + return _return_status("SKIPPED", {'FINISHED'}) + + _ensure_persp_flag(temp_dir) + _mari_render_animation_to_temp_png(scn, temp_dir, prefix, frame_start=fstart, frame_end=fend) + + frames = sorted(f for f in os.listdir(temp_dir) if f.lower().endswith(".png")) + if not frames: + _clear_persp_flag(temp_dir) + shutil.rmtree(temp_dir, ignore_errors=True) + self.report({'ERROR'}, "No frames rendered for video build.") + return {'CANCELLED'} + for fname in frames: + fpath = os.path.join(temp_dir, fname) + img = cv2.imread(fpath, cv2.IMREAD_UNCHANGED) + if img is None: + continue + try: + out = _mari_warp_image(img, array, real_x, real_y, flip=flip_x, flip_y=flip_y) + cv2.imwrite(fpath, out) + except Exception as e: + print(f"[MARI] [RenderOne] WARN: warp failed for {fpath}: {e}") + + _clear_persp_flag(temp_dir) + _mari_build_video_from_temp(bpy.context, temp_dir, frames, final_path) + shutil.rmtree(temp_dir, ignore_errors=True) + print(f"[MARI] [RenderOne] FINISHED ANIM-VIDEO H{H} V{V} -> {final_path}") + + elif self.action == "STILL": + if not scn.render.use_overwrite and os.path.isfile(still_path): + if _mari_is_valid_render_output(still_path) and _mari_image_matches_expected_size(still_path, expected_image_size): + print(f"[MARI] [RenderOne] STILL skip existing {still_path}") + return _return_status("SKIPPED", {'FINISHED'}) + _mari_maybe_write_placeholder(scn, still_path) + scn.render.filepath = still_path + t0 = time.time() + print(f"[MARI] [RenderOne] START STILL H{H} V{V} -> {still_path}") + bpy.ops.render.render(animation=False, write_still=True, use_viewport=False) + _mari_fix_still_output_name(still_path) + + # Read back and warp/flip in-place + def _wait(path, timeout=3.0, tick=0.05): + last = -1; t = time.time() + while time.time() - t < timeout: + if os.path.exists(path): + s = os.path.getsize(path) + if s > 0 and s == last: + img = cv2.imread(path, cv2.IMREAD_UNCHANGED) + if img is not None: + return img + last = s + time.sleep(tick) + return None + + img = _wait(still_path) + if img is None: + _mari_fix_still_output_name(still_path) + img = _wait(still_path, timeout=1.0) + if img is None: + self.report({'ERROR'}, "Rendered image not found/ready for warp.") + print(f"[MARI] [RenderOne] ERROR: still not found for H{H} V{V}") + return {'CANCELLED'} + + try: + out = _mari_warp_image(img, array, real_x, real_y, flip=flip_x, flip_y=flip_y) + save_args = [cv2.IMWRITE_JPEG_QUALITY, 100] if ext in {"jpeg", "jpg"} else [] + if save_args: + cv2.imwrite(still_path, out, save_args) + else: + cv2.imwrite(still_path, out) + except Exception as e: + print(f"[MARI] [RenderOne] WARN: warp failed for {still_path}: {e}") + print(f"[MARI] [RenderOne] FINISHED STILL H{H} V{V} ({time.time()-t0:.2f}s)") + + else: # ANIM — render exactly one frame to the per-camera subfolder + if self.frame >= 0: + scn.frame_set(self.frame) + os.makedirs(seq_dir, exist_ok=True) + tmp_ff = og_ff + if _mari_ff_type_from_format(og_ff) == "ANIM": + tmp_ff = "PNG" + scn.render.image_settings.file_format = tmp_ff + + # Force a clean load from disk to avoid writing an old buffer + try: + bpy.ops.image.new(name="__mari_tmp_flush__", width=1, height=1) + except Exception: + pass + + frame_val = scn.frame_current + ext_for_seq = _mari_extension_from_format(tmp_ff, scn) + # Bake the frame number directly into the filepath; disable auto-extension to avoid double suffix. + scn.render.filepath = os.path.join(seq_dir, f"{name}_{frame_val:04d}.{ext_for_seq}") + try: + scn.render.use_file_extension = False + except Exception: + pass + t0 = time.time() + outp = scn.render.filepath + print(f"[MARI] [RenderOne] START ANIM H{H} V{V} f{scn.frame_current} -> {outp}") + if not scn.render.use_overwrite and os.path.isfile(outp): + if _mari_is_valid_render_output(outp) and _mari_image_matches_expected_size(outp, expected_image_size): + print(f"[MARI] [RenderOne] ANIM skip existing {outp}") + return _return_status("SKIPPED", {'FINISHED'}) + _mari_maybe_write_placeholder(scn, outp) + bpy.ops.render.render(animation=False, write_still=True, use_viewport=False) + if os.path.isfile(outp): + img = cv2.imread(outp, cv2.IMREAD_UNCHANGED) + if img is not None: + try: + out = _mari_warp_image(img, array, real_x, real_y, flip=flip_x, flip_y=flip_y) + cv2.imwrite(outp, out) + except Exception as e: + print(f"[MARI] [RenderOne] WARN: warp failed for {outp}: {e}") + print(f"[MARI] [RenderOne] FINISHED ANIM H{H} V{V} f{scn.frame_current} ({time.time()-t0:.2f}s)") + + return _return_status("RENDERED", {'FINISHED'}) + finally: + try: + if frame_inside: + bpy.data.objects.remove(frame_inside, do_unlink=True) + except Exception: + pass + + + # CIRCLE mode – no corner checks, no cv2 + if self.action == "ANIM" and is_video_output: + os.makedirs(root_dir, exist_ok=True) + fstart, fend = scn.frame_start, scn.frame_end + cam_id = f"{name}_H{H}_V{V}" + temp_tag = f"{name}_{fstart:04d}-{fend:04d}_H{H}_V{V}" + video_ext = _mari_video_extension(scn) + temp_dir = os.path.join(root_dir, temp_tag + "_TEMP") + final_path = os.path.join(root_dir, cam_id + f".{video_ext}") + + _mari_fix_video_output_name(final_path) + if os.path.isfile(final_path) and not scn.render.use_overwrite: + if _mari_is_valid_render_output(final_path): + print(f"[MARI] [RenderOne] ANIM-VIDEO (CIRCLE) skip existing {final_path}") + _restore_formats() + return _return_status("SKIPPED", {'FINISHED'}) + _mari_maybe_write_placeholder(scn, final_path) + + if scn.render.use_overwrite and os.path.isdir(temp_dir): + shutil.rmtree(temp_dir, ignore_errors=True) + os.makedirs(temp_dir, exist_ok=True) + prefix = name + "_" + + if not scn.render.use_overwrite: + missing = _mari_missing_sequence_frames(temp_dir, prefix, "png", fstart, fend) + if not missing: + frames = sorted(f for f in os.listdir(temp_dir) if f.lower().endswith(".png")) + if frames: + _mari_build_video_from_temp(bpy.context, temp_dir, frames, final_path) + shutil.rmtree(temp_dir, ignore_errors=True) + print(f"[MARI] [RenderOne] FINISHED ANIM-VIDEO (CIRCLE) -> {final_path}") + _restore_formats() + return _return_status("SKIPPED", {'FINISHED'}) + + _mari_render_animation_to_temp_png(scn, temp_dir, prefix, frame_start=fstart, frame_end=fend) + frames = sorted(f for f in os.listdir(temp_dir) if f.lower().endswith(".png")) + if not frames: + self.report({'ERROR'}, "No frames rendered for video build.") + _restore_formats() + return {'CANCELLED'} + _mari_build_video_from_temp(bpy.context, temp_dir, frames, final_path) + shutil.rmtree(temp_dir, ignore_errors=True) + print(f"[MARI] [RenderOne] FINISHED ANIM-VIDEO (CIRCLE) -> {final_path}") + _restore_formats() + return {'FINISHED'} + + if self.action == "STILL": + if not scn.render.use_overwrite and os.path.isfile(still_path): + if _mari_is_valid_render_output(still_path) and _mari_image_matches_expected_size(still_path, expected_image_size): + print(f"[MARI] [RenderOne] STILL (CIRCLE) skip existing {still_path}") + _restore_formats() + return _return_status("SKIPPED", {'FINISHED'}) + _mari_maybe_write_placeholder(scn, still_path) + scn.render.filepath = still_path + try: + scn.render.use_file_extension = True + except Exception: + pass + t0 = time.time() + print(f"[MARI] [RenderOne] START STILL (CIRCLE) H{H} V{V} -> {still_path}") + bpy.ops.render.render(animation=False, write_still=True, use_viewport=False) + _mari_fix_still_output_name(still_path) + print(f"[MARI] [RenderOne] FINISHED STILL (CIRCLE) H{H} V{V} ({time.time()-t0:.2f}s)") + else: + if self.frame >= 0: + scn.frame_set(self.frame) + os.makedirs(seq_dir, exist_ok=True) + tmp_ff = og_ff + if _mari_ff_type_from_format(og_ff) == "ANIM": + tmp_ff = "PNG" + scn.render.image_settings.file_format = tmp_ff + frame_val = scn.frame_current + ext_for_seq = _mari_extension_from_format(tmp_ff, scn) + # Bake frame number directly to avoid literal #### on workers + scn.render.filepath = os.path.join(seq_dir, f"{name}_{frame_val:04d}.{ext_for_seq}") + try: + scn.render.use_file_extension = False + except Exception: + pass + t0 = time.time() + outp = scn.render.filepath + print(f"[MARI] [RenderOne] START ANIM (CIRCLE) H{H} V{V} f{scn.frame_current} -> {outp}") + if not scn.render.use_overwrite and os.path.isfile(outp): + if _mari_is_valid_render_output(outp) and _mari_image_matches_expected_size(outp, expected_image_size): + print(f"[MARI] [RenderOne] ANIM (CIRCLE) skip existing {outp}") + _restore_formats() + return _return_status("SKIPPED", {'FINISHED'}) + _mari_maybe_write_placeholder(scn, outp) + bpy.ops.render.render(animation=False, write_still=True, use_viewport=False) + print(f"[MARI] [RenderOne] FINISHED ANIM (CIRCLE) H{H} V{V} f{scn.frame_current} ({time.time()-t0:.2f}s)") + _restore_formats() + return _return_status("RENDERED", {'FINISHED'}) + +class MARI_OT_Multi_render(bpy.types.Operator): + bl_idname = f"{addon_prefix}.multi_render" + bl_label = "Render MARI Image (MULTI)" + bl_options = {'REGISTER', 'INTERNAL'} + + action: bpy.props.EnumProperty(items=[("STILL","STILL",""),("ANIM","ANIM","")], default="STILL") + + # transient flags for invoke -> execute flow + _ask_type: str = "" + _wipe_target: str = "" + _missing_multi: bool = False + + def _target_dir(self, context): + prop = context.scene.mari_props + base = bpy.path.abspath(getattr(prop, "render_settings_filepath", "")) + name = getattr(prop, "render_settings_name", "").strip() + return os.path.join(base, name) + + def _dir_has_files(self, path): + try: + with os.scandir(path) as it: + for e in it: + return True + except Exception: + pass + return False + + def draw(self, context): + layout = self.layout + col = layout.column(align=True) + if self._ask_type == "OPEN_URL": + col.label(text="This operation requires the HoloMARI MULTIRENDER addon,", icon='INFO') + col.label(text="which can improve render times.") + col.separator() + col.operator("wm.url_open", text="Download Addon", icon='URL').url = "https://holomari.com/info/pages/MultiRender" + elif self._ask_type == "WIPE": + col.label(text="Overwrite is ON. This will DELETE all files in:", icon='ERROR') + col.label(text=self._wipe_target, icon='FILE_FOLDER') + + def invoke(self, context, event=None): + wm = context.window_manager + prop = context.scene.mari_props + + try: + mari_detect_mode_from_scene(context.scene) + except Exception: + pass + + if not _mari_output_path_set(prop): + self.report({'ERROR'}, "Please set the Output Folder in MARI Render Settings before rendering.") + return {'CANCELLED'} + # (3) MultiRender missing -> note + confirm to open URL + if not _mari_has_multi(): + self._missing_multi = True + self._ask_type = "OPEN_URL" + return wm.invoke_props_dialog(self, width=460) + + # Ensure directory exists (1) + tgt = self._target_dir(context) + try: + os.makedirs(tgt, exist_ok=True) + except Exception as e: + self.report({'ERROR'}, f"Failed to prepare folder: {tgt} ({e})") + return {'CANCELLED'} + + # (2/5) If overwrite is ON and directory already has files -> confirm wipe + if context.scene.render.use_overwrite and self._dir_has_files(tgt): + self._wipe_target = tgt + self._ask_type = "WIPE" + return wm.invoke_props_dialog(self, width=520) + + # No confirmations needed, just run + return self.execute(context) + + def execute(self, context): + import json + + prop = context.scene.mari_props + try: + mari_detect_mode_from_scene(context.scene) + except Exception: + pass + if not _mari_output_path_set(prop): + self.report({'ERROR'}, "Please set the Output Folder in MARI Render Settings before rendering.") + return {'CANCELLED'} + + # Handle "open URL" confirmation + if self._missing_multi and self._ask_type == "OPEN_URL": + return {'CANCELLED'} + + mode = "FRAME" if _mari_normalize_mode_id(getattr(prop, "frame", _MARI_MODE_CIRCLE)) == _MARI_MODE_FRAME else "CIRCLE" + if mode == "FRAME" and not _mari_require_cv2_for_frame(self): + return {'CANCELLED'} + + # (5) If user confirmed wipe, empty the target folder now + if self._ask_type == "WIPE" and self._wipe_target: + try: + # remove files & subfolders but keep the root folder + for entry in os.scandir(self._wipe_target): + p = os.path.join(self._wipe_target, entry.name) + if entry.is_file() or entry.is_symlink(): + try: os.remove(p) + except Exception: pass + else: + try: shutil.rmtree(p) + except Exception: pass + print(f"[MARI] Cleared folder: {self._wipe_target}") + except Exception as e: + self.report({'ERROR'}, f"Failed to clear folder: {e}") + return {'CANCELLED'} + + # Gather MARI cameras exactly like the main pipeline + cams = _mari_collect_scene_camera_jobs(context.scene) + if not cams: + self.report({'ERROR'}, "No MARI cameras found. Please generate cameras first.") + return {'CANCELLED'} + + if mode == "FRAME": + real_x = int(prop.frame_ratio[0]) + real_y = int(prop.frame_ratio[1]) + ok, err = _mari_refresh_frame_quads(context, prop, real_x, real_y) + if not ok: + self.report({'ERROR'}, err) + return {'CANCELLED'} + for cam_obj in bpy.data.objects: + if not cam_obj.name.startswith("MARI_CAMERA"): + continue + if len(cam_obj.get("verts") or []) < 4: + self.report({'ERROR'}, _mari_frame_border_message(cam_obj.name)) + return {'CANCELLED'} + + plan = _mari_plan_multi_resume_jobs(context.scene, prop, mode, self.action) + jobs = plan.get("jobs") or [] + if self.action == "ANIM" and not plan.get("is_video_output", False) and plan.get("expected_frames", 0) <= 0: + self.report({'ERROR'}, "No frames to render (check frame start/end).") + return {'CANCELLED'} + if not context.scene.render.use_overwrite: + if self.action == "ANIM" and not plan.get("is_video_output", False): + print( + "[MARI] Multi resume plan:" + f" cameras={plan.get('total_cameras', 0)}" + f" complete_cameras={plan.get('complete_cameras', 0)}" + f" ready_frames={plan.get('ready_frames', 0)}" + f" pending_frames={plan.get('pending_frames', 0)}" + f" root='{plan.get('root_dir', '')}'" + ) + else: + print( + "[MARI] Multi resume plan:" + f" cameras={plan.get('total_cameras', 0)}" + f" complete_cameras={plan.get('complete_cameras', 0)}" + f" pending_cameras={plan.get('pending_cameras', 0)}" + f" root='{plan.get('root_dir', '')}'" + ) + if not jobs: + if self.action == "ANIM" and not plan.get("is_video_output", False): + self.report({'INFO'}, "All requested MARI sequence frames already exist for the current scene cameras.") + else: + self.report({'INFO'}, "All requested MARI outputs already exist for the current scene cameras.") + return {'FINISHED'} + + job_json = json.dumps({"jobs": jobs}) + + print(f"[MARI] Launching Multi-Instance in MARI mode. jobs={len(jobs)} mode={mode} action={self.action}") + try: + return bpy.ops.render.multi_gpu_mari( + 'INVOKE_DEFAULT', + job_json=job_json, + mode=("CIRCLE" if mode != "FRAME" else "FRAME"), + action=self.action + ) + except Exception as e: + self.report({'ERROR'}, f"Failed to call multi_gpu_mari: {e}") + print(f"[MARI] ERROR invoking multi_gpu_mari: {e}") + return {'CANCELLED'} + + + +class MARI_OT_GenerateMedia(Operator, ImportHelper): + """Generate Media File from Directory Files""" + bl_idname = f"{addon_prefix}.generate_media" + #bl_label = "Construct MARI Media from folder" ##NOT .marijpeg + bl_label = "Construct MARI (.zip) from folder" + + filename_ext = "*.mari3d" + + filter_glob: StringProperty( + default="*.mari3d", + options={'HIDDEN'}, + maxlen=255, + ) + + def execute(self, context): + import json + import re + import bpy + + # Delay heavy work until after the file browser closes to avoid Blender crashes. + try: + if not hasattr(mari, "media_deferred"): + mari.media_deferred = False + except Exception: + pass + + def _has_file_browser(): + try: + ctx = bpy.context + if ctx.area and ctx.area.type == 'FILE_BROWSER': + return True + wm = ctx.window_manager + for window in wm.windows: + screen = window.screen + if not screen: + continue + for area in screen.areas: + if area.type == 'FILE_BROWSER': + return True + except Exception: + return True + return False + + if not getattr(mari, "media_deferred", False) and _has_file_browser(): + filepath = self.filepath + try: + self.report({'INFO'}, "Waiting for file browser to close before converting.") + except Exception: + pass + print(f"[MARI] GenerateMedia deferred until file browser closes: {filepath}") + + def _delayed(): + ctx = bpy.context + if _has_file_browser(): + return 0.2 + mari.media_deferred = True + try: + print(f"[MARI] GenerateMedia running deferred: {filepath}") + bpy.ops.mari.generate_media(filepath=filepath) + except Exception as exc: + print(f"[MARI] GenerateMedia deferred run failed: {exc}") + finally: + mari.media_deferred = False + return None + + bpy.app.timers.register(_delayed, first_interval=0.2) + return {"FINISHED"} + + scene = context.scene + prop = context.scene.mari_props + print(f"[MARI] GenerateMedia start: {self.filepath}") + try: + self._upscale_warning = False + except Exception: + pass + try: + with open(self.filepath, "r", encoding="utf-8") as f: + data = json.load(f) + except Exception as exc: + self.report({'ERROR'}, f"Failed to read .mari3d: {exc}") + return {"CANCELLED"} + + default_size = None + default_fps = None + try: + requires_frame = int(data.get("requiresframe", 0)) == 1 + if requires_frame: + rx = data.get("ratiox") + ry = data.get("ratioy") + if rx and ry: + default_size = (int(rx), int(ry)) + else: + framex = data.get("framex") + framey = data.get("framey") + if framex and framey: + default_size = (int(framex), int(framey)) + else: + framex = data.get("framex") + framey = data.get("framey") + if framex and framey: + default_size = (int(framex), int(framey)) + else: + rx = data.get("ratiox") + ry = data.get("ratioy") + if rx and ry: + default_size = (int(rx), int(ry)) + except Exception: + pass + try: + if data.get("framerate"): + default_fps = int(data.get("framerate")) + except Exception: + pass + + project_name = os.path.splitext(os.path.basename(self.filepath))[0] + src_root = os.path.dirname(self.filepath) + video_exts = set(_MARI_FFMPEG_EXTENSIONS.values()) + image_exts = set(_MARI_IMAGE_EXTENSIONS.values()) - video_exts + image_exts.add("jpg") + image_exts.add("tiff") + + def _scan_source(root): + has_seq = False + has_still = False + has_video = False + ext = None + for entry in os.scandir(root): + name = entry.name.lower() + if name.endswith(".mari3d") or name.endswith(".txt"): + continue + if entry.is_dir(): + for sub in os.scandir(entry.path): + if not sub.is_file(): + continue + s_ext = os.path.splitext(sub.name)[1].lower().lstrip(".") + if s_ext in image_exts: + has_seq = True + ext = s_ext + break + elif entry.is_file(): + s_ext = os.path.splitext(entry.name)[1].lower().lstrip(".") + if s_ext in video_exts: + has_video = True + ext = s_ext + elif s_ext in image_exts: + has_still = True + ext = s_ext + if has_seq: + return "SEQ", ext + if has_video: + return "VIDEO", ext + if has_still: + return "STILL", ext + return None, None + + src_kind, src_ext = _scan_source(src_root) + if not src_kind: + self.report({'ERROR'}, "No MARI media files found in the selected folder.") + return {"CANCELLED"} + + target_fmt = scene.render.image_settings.file_format + try: + if hasattr(scene.render.image_settings, "media_type") and scene.render.image_settings.media_type == "VIDEO": + if _mari_ff_type_from_format(target_fmt) != "ANIM": + target_fmt = "FFMPEG" + except Exception: + pass + target_is_video = _mari_ff_type_from_format(target_fmt) == "ANIM" + target_ext = _mari_extension_from_format(target_fmt, scene) + if target_is_video: + video_exts.add(target_ext) + else: + image_exts.add(target_ext) + + if target_is_video and src_kind == "STILL": + self.report({'ERROR'}, "Cannot convert a still-image MARI into a video MARI.") + return {"CANCELLED"} + + if target_is_video: + target_kind = "VIDEO" + else: + target_kind = "SEQ" if src_kind in {"SEQ", "VIDEO"} else "STILL" + + cam_keys = [] + for item in data.get("angledata", []): + try: + cam_keys.append(str(item[0])) + except Exception: + pass + cam_keys = sorted(set(cam_keys), key=len, reverse=True) + + def _match_key(name): + for key in cam_keys: + if f"_{key}" in name: + return key + return None + + def _frame_index(name): + m = re.search(r"(\d+)(?=\.[^.]+$)", name) + return int(m.group(1)) if m else None + + def _frame_prefix(name): + stem = os.path.splitext(name)[0] + m = re.search(r"(.*?)(\d+)$", stem) + if m: + return m.group(1) + return stem + "_" + + def _seq_files(folder_path, ext): + files = [] + for f in os.scandir(folder_path): + if not f.is_file(): + continue + if os.path.splitext(f.name)[1].lower().lstrip(".") == ext: + files.append(f.path) + files.sort(key=lambda p: _frame_index(os.path.basename(p)) or 0) + return files + + def _ext_matches(ext, target): + ext = (ext or "").lower().lstrip(".") + if target == "jpeg": + return ext in {"jpeg", "jpg"} + return ext == target + + def _find_output_file(folder, base_name, allowed_exts, allow_no_ext=False): + for f in os.scandir(folder): + if not f.is_file(): + continue + name, ext = os.path.splitext(f.name) + if name != base_name and not name.startswith(base_name): + continue + ext_clean = ext.lower().lstrip(".") + if not ext_clean and allow_no_ext: + return f.path + if ext_clean in allowed_exts: + return f.path + return None + + def _dir_has_ext(folder, allowed_exts, allow_no_ext=False): + for f in os.scandir(folder): + if not f.is_file(): + continue + ext_clean = os.path.splitext(f.name)[1].lower().lstrip(".") + if not ext_clean and allow_no_ext: + return True + if ext_clean in allowed_exts: + return True + return False + + def _list_media_files(folder, allowed_exts, allow_no_ext=False): + results = set() + for f in os.scandir(folder): + if not f.is_file(): + continue + ext_clean = os.path.splitext(f.name)[1].lower().lstrip(".") + if not ext_clean and allow_no_ext: + results.add(f.name) + elif ext_clean in allowed_exts: + results.add(f.name) + return results + + strip_prefix = f"MARI_CONVERT_{uuid.uuid4().hex[:8]}" + + def _capture_attr_dict(obj, attrs): + data = {} + for attr in attrs: + if hasattr(obj, attr): + try: + data[attr] = getattr(obj, attr) + except Exception: + pass + return data + + def _restore_attr_dict(obj, data): + for attr, value in data.items(): + if hasattr(obj, attr): + try: + setattr(obj, attr, value) + except Exception: + pass + + def _restore_image_settings(image_settings, state): + if not state: + return + if "media_type" in state and hasattr(image_settings, "media_type"): + try: + image_settings.media_type = state["media_type"] + except Exception: + pass + if "file_format" in state and hasattr(image_settings, "file_format"): + try: + image_settings.file_format = state["file_format"] + except Exception: + pass + for attr, value in state.items(): + if attr in {"media_type", "file_format"}: + continue + if hasattr(image_settings, attr): + try: + setattr(image_settings, attr, value) + except Exception: + pass + + image_attrs = ( + "media_type", + "file_format", + "color_mode", + "color_depth", + "compression", + "quality", + "exr_codec", + "tiff_codec", + "jpeg2k_codec", + "use_preview", + ) + ffmpeg_attrs = ( + "format", + "codec", + "use_autosplit", + "audio_codec", + "audio_channels", + "audio_mixrate", + "audio_bitrate", + "audio_volume", + "use_lossless_output", + "constant_rate_factor", + "ffmpeg_preset", + "gopsize", + "max_b_frames", + "use_max_b_frames", + "video_bitrate", + "minrate", + "maxrate", + "buffersize", + "muxrate", + "packetsize", + ) + + def _capture_render_state(scene_obj): + return { + "filepath": scene_obj.render.filepath, + "use_sequencer": scene_obj.render.use_sequencer, + "use_compositing": scene_obj.render.use_compositing, + "use_overwrite": scene_obj.render.use_overwrite, + "use_file_extension": scene_obj.render.use_file_extension, + "res_x": scene_obj.render.resolution_x, + "res_y": scene_obj.render.resolution_y, + "res_pct": scene_obj.render.resolution_percentage, + "fps": scene_obj.render.fps, + "fps_base": scene_obj.render.fps_base, + "frame_start": scene_obj.frame_start, + "frame_end": scene_obj.frame_end, + "frame_current": scene_obj.frame_current, + } + + def _restore_render_state(scene_obj, state): + try: + scene_obj.render.filepath = state.get("filepath", scene_obj.render.filepath) + except Exception: + pass + try: + scene_obj.render.use_sequencer = state.get("use_sequencer", scene_obj.render.use_sequencer) + except Exception: + pass + try: + scene_obj.render.use_compositing = state.get("use_compositing", scene_obj.render.use_compositing) + except Exception: + pass + try: + scene_obj.render.use_overwrite = state.get("use_overwrite", scene_obj.render.use_overwrite) + except Exception: + pass + try: + scene_obj.render.use_file_extension = state.get("use_file_extension", scene_obj.render.use_file_extension) + except Exception: + pass + try: + scene_obj.render.resolution_x = state.get("res_x", scene_obj.render.resolution_x) + scene_obj.render.resolution_y = state.get("res_y", scene_obj.render.resolution_y) + scene_obj.render.resolution_percentage = state.get("res_pct", scene_obj.render.resolution_percentage) + except Exception: + pass + try: + scene_obj.render.fps = state.get("fps", scene_obj.render.fps) + scene_obj.render.fps_base = state.get("fps_base", scene_obj.render.fps_base) + except Exception: + pass + try: + scene_obj.frame_start = state.get("frame_start", scene_obj.frame_start) + scene_obj.frame_end = state.get("frame_end", scene_obj.frame_end) + except Exception: + pass + try: + scene_obj.frame_set(state.get("frame_current", scene_obj.frame_current)) + except Exception: + pass + + def _set_file_format(scene_obj, fmt): + image_settings = scene_obj.render.image_settings + try: + if hasattr(image_settings, "media_type"): + desired_media = "VIDEO" if (_mari_ff_type_from_format(fmt) == "ANIM" or target_is_video) else "IMAGE" + if image_settings.media_type != desired_media: + image_settings.media_type = desired_media + except Exception: + pass + try: + enum_items = image_settings.bl_rna.properties["file_format"].enum_items + if fmt not in enum_items.keys(): + if (target_is_video or _mari_ff_type_from_format(fmt) == "ANIM") and "FFMPEG" in enum_items.keys(): + fmt = "FFMPEG" + else: + return False + except Exception: + pass + try: + image_settings.file_format = fmt + return True + except Exception: + return False + + def _valid_size(size): + if not size: + return None + try: + w = int(size[0]) + h = int(size[1]) + except Exception: + return None + if w < 8 or h < 8: + return None + return (w, h) + + def _set_resolution(scene_obj, size): + size = _valid_size(size) or _valid_size(default_size) + if not size: + size = _valid_size((scene_obj.render.resolution_x, scene_obj.render.resolution_y)) + if not size: + return + if target_is_video: + w, h = size + if w % 2: + w -= 1 + if h % 2: + h -= 1 + if w < 16 or h < 16: + fallback = _valid_size(default_size) + if fallback: + w, h = fallback + if w >= 2 and h >= 2: + size = (w, h) + try: + scene_obj.render.resolution_x = int(size[0]) + scene_obj.render.resolution_y = int(size[1]) + scene_obj.render.resolution_percentage = 100 + except Exception: + pass + + def _image_size(path): + img = None + try: + try: + img = bpy.data.images.load(path, check_existing=False) + except TypeError: + img = bpy.data.images.load(path) + if not img: + return None + return _valid_size((int(img.size[0]), int(img.size[1]))) + finally: + if img: + try: + bpy.data.images.remove(img, do_unlink=True) + except Exception: + pass + + def _video_size(path): + clip = None + try: + try: + clip = bpy.data.movieclips.load(path, check_existing=False) + except TypeError: + clip = bpy.data.movieclips.load(path) + if not clip: + return None + return _valid_size((int(clip.size[0]), int(clip.size[1]))) + finally: + if clip: + try: + bpy.data.movieclips.remove(clip, do_unlink=True) + except Exception: + pass + + def _release_media_cache(paths): + norm_paths = [] + for p in paths: + if not p: + continue + try: + norm_paths.append(os.path.normcase(os.path.abspath(p))) + except Exception: + pass + if not norm_paths: + return + + def _in_paths(filepath): + if not filepath: + return False + try: + abs_path = os.path.abspath(bpy.path.abspath(filepath)) + except Exception: + abs_path = os.path.abspath(filepath) + abs_path = os.path.normcase(abs_path) + return any(abs_path.startswith(root) for root in norm_paths) + + for img in list(bpy.data.images): + try: + if img.users == 0 and _in_paths(getattr(img, "filepath", "")): + bpy.data.images.remove(img, do_unlink=True) + except Exception: + pass + for clip in list(bpy.data.movieclips): + try: + if clip.users == 0 and _in_paths(getattr(clip, "filepath", "")): + bpy.data.movieclips.remove(clip, do_unlink=True) + except Exception: + pass + for snd in list(getattr(bpy.data, "sounds", [])): + try: + if snd.users == 0 and _in_paths(getattr(snd, "filepath", "")): + bpy.data.sounds.remove(snd, do_unlink=True) + except Exception: + pass + + use_blend_resolution = bool(getattr(prop, "mari_use_blend_resolution", False)) + + def _blend_target_size(): + if not use_blend_resolution: + return None + try: + pct = float(scene.render.resolution_percentage or 100.0) + w = int(round(scene.render.resolution_x * pct / 100.0)) + h = int(round(scene.render.resolution_y * pct / 100.0)) + return _valid_size((w, h)) + except Exception: + return None + + blend_size = _blend_target_size() + + def _target_size_from_source(src_size): + if use_blend_resolution and blend_size: + return blend_size + return src_size or default_size + + def _first_source_size(): + if src_kind == "SEQ": + for d in os.scandir(src_root): + if not d.is_dir(): + continue + files = _seq_files(d.path, src_ext) + if files: + return _image_size(files[0]) + elif src_kind == "STILL": + for f in os.scandir(src_root): + if f.is_file() and os.path.splitext(f.name)[1].lower().lstrip(".") == src_ext: + return _image_size(f.path) + elif src_kind == "VIDEO": + for f in os.scandir(src_root): + if f.is_file() and os.path.splitext(f.name)[1].lower().lstrip(".") in video_exts: + return _video_size(f.path) + return None + + source_size = _first_source_size() + resize_needed = False + if use_blend_resolution and blend_size and source_size: + resize_needed = (blend_size[0] != source_size[0]) or (blend_size[1] != source_size[1]) + if (blend_size[0] > source_size[0]) or (blend_size[1] > source_size[1]): + if not getattr(self, "_upscale_confirmed", False): + self._upscale_warning = True + self._upscale_source = source_size + self._upscale_target = blend_size + self._upscale_confirmed = True + self.report({'WARNING'}, "Target resolution is larger than source.") + try: + return context.window_manager.invoke_props_dialog(self, width=460) + except Exception: + self.report({'ERROR'}, "Upscale confirmation could not be shown.") + return {"CANCELLED"} + + needs_conversion = (src_kind != target_kind) or (src_ext != target_ext) or resize_needed + out_root = src_root + if needs_conversion: + out_root = src_root + f"_to_{target_ext}" + if os.path.isdir(out_root): + _release_media_cache([out_root]) + shutil.rmtree(out_root) + os.makedirs(out_root, exist_ok=True) + try: + shutil.copy2(self.filepath, os.path.join(out_root, os.path.basename(self.filepath))) + except Exception: + pass + + def _ensure_strip_collection(scene_obj): + se = scene_obj.sequence_editor + if se is None: + se = scene_obj.sequence_editor_create() + strip_coll = _mari_get_vse_strip_collection(se) + if strip_coll is None: + raise RuntimeError("SequenceEditor has no strips collection.") + return strip_coll + + def _clear_mari_strips(strip_coll): + try: + for s in list(strip_coll): + if s.name.startswith("MARI_CONVERT_") or s.name.startswith(strip_prefix): + strip_coll.remove(s) + except Exception: + pass + + def _build_image_strip(strip_coll, files, frame_start): + first_path = files[0] + try: + strip = strip_coll.new_image(name=f"{strip_prefix}_SEQ", filepath=first_path, channel=1, frame_start=frame_start) + except TypeError: + strip = strip_coll.new_image(f"{strip_prefix}_SEQ", first_path, 1, frame_start) + directory = os.path.dirname(first_path) + if not directory.endswith(os.sep): + directory += os.sep + strip.directory = directory + first_name = os.path.basename(first_path) + if strip.elements: + strip.elements[0].filename = first_name + else: + strip.elements.append(first_name) + for fpath in files[1:]: + strip.elements.append(os.path.basename(fpath)) + strip.frame_start = frame_start + try: + strip.frame_final_duration = len(files) + except Exception: + pass + return strip + + def _build_movie_strip(strip_coll, filepath, frame_start): + try: + strip = strip_coll.new_movie(name=f"{strip_prefix}_MOV", filepath=filepath, channel=1, frame_start=frame_start) + except TypeError: + strip = strip_coll.new_movie(f"{strip_prefix}_MOV", filepath, 1, frame_start) + strip.frame_start = frame_start + frame_count = getattr(strip, "frame_final_duration", 0) + if not frame_count: + try: + frame_count = int(strip.frame_final_end - strip.frame_final_start) + except Exception: + frame_count = 0 + return strip, frame_count + + def _apply_strip_fill(strip, src_size, dst_size): + if not strip or not src_size or not dst_size: + return + try: + sw, sh = float(src_size[0]), float(src_size[1]) + dw, dh = float(dst_size[0]), float(dst_size[1]) + except Exception: + return + if sw <= 0 or sh <= 0: + return + scale = max(dw / sw, dh / sh) + try: + strip.transform.scale_x = scale + strip.transform.scale_y = scale + strip.transform.offset_x = 0.0 + strip.transform.offset_y = 0.0 + except Exception: + try: + strip.transform.scale = scale + except Exception: + pass + + def _render_scene(scene_obj, animation=False, write_still=False): + try: + scene_obj.render.use_sequencer = True + scene_obj.render.use_compositing = False + except Exception: + pass + result = None + try: + override = {"scene": scene_obj} + if scene_obj.view_layers: + override["view_layer"] = scene_obj.view_layers[0] + with bpy.context.temp_override(**override): + try: + result = bpy.ops.render.render(animation=animation, write_still=write_still, use_viewport=False) + except TypeError: + result = bpy.ops.render.render(animation=animation, write_still=write_still) + except Exception: + result = None + if result is None: + try: + result = bpy.ops.render.render(animation=animation, write_still=write_still, use_viewport=False) + except TypeError: + result = bpy.ops.render.render(animation=animation, write_still=write_still) + if isinstance(result, set) and "FINISHED" in result: + return result + raise RuntimeError(f"Render failed: {result}") + + if needs_conversion: + sandbox = scene + render_state = _capture_render_state(sandbox) + image_state = _capture_attr_dict(sandbox.render.image_settings, image_attrs) + ffmpeg_state = _capture_attr_dict(sandbox.render.ffmpeg, ffmpeg_attrs) + strip_coll = None + try: + strip_coll = _ensure_strip_collection(sandbox) + sandbox.render.use_sequencer = True + sandbox.render.use_compositing = False + sandbox.render.use_overwrite = True + sandbox.render.use_file_extension = True + if default_fps: + try: + sandbox.render.fps = int(default_fps) + sandbox.render.fps_base = 1.0 + except Exception: + pass + if not _set_file_format(sandbox, target_fmt): + raise RuntimeError("Output format not supported in this Blender build.") + _restore_attr_dict(sandbox.render.ffmpeg, ffmpeg_state) + + if src_kind == "SEQ": + seq_dirs = [d for d in os.scandir(src_root) if d.is_dir()] + + if target_kind == "SEQ": + if src_ext != target_ext: + for d in seq_dirs: + files = _seq_files(d.path, src_ext) + if not files: + continue + dst_dir = os.path.join(out_root, d.name) + os.makedirs(dst_dir, exist_ok=True) + prefix = _frame_prefix(os.path.basename(files[0])) + frame_start = _frame_index(os.path.basename(files[0])) or 1 + src_size = _image_size(files[0]) or default_size + target_size = _target_size_from_source(src_size) + _set_resolution(sandbox, target_size) + dst_size = (sandbox.render.resolution_x, sandbox.render.resolution_y) + strip_coll = _ensure_strip_collection(sandbox) + _clear_mari_strips(strip_coll) + strip = _build_image_strip(strip_coll, files, frame_start) + if use_blend_resolution: + _apply_strip_fill(strip, src_size, dst_size) + sandbox.frame_start = frame_start + sandbox.frame_end = frame_start + len(files) - 1 + sandbox.render.filepath = os.path.join(dst_dir, prefix) + if not _set_file_format(sandbox, target_fmt): + raise RuntimeError("Output format not supported in this Blender build.") + _restore_attr_dict(sandbox.render.ffmpeg, ffmpeg_state) + _render_scene(sandbox, animation=True) + if not any( + f.is_file() and _ext_matches(os.path.splitext(f.name)[1], target_ext) + for f in os.scandir(dst_dir) + ): + raise RuntimeError(f"No output frames written for {d.name}.") + + elif target_kind == "VIDEO": + for d in seq_dirs: + files = _seq_files(d.path, src_ext) + if not files: + continue + start = _frame_index(os.path.basename(files[0])) or 1 + end = _frame_index(os.path.basename(files[-1])) or (start + len(files) - 1) + key = _match_key(d.name) + if key: + base_name = f"{project_name}_{start:04d}-{end:04d}_{key}" + else: + base_name = f"{d.name}_{start:04d}-{end:04d}" + out_path = os.path.join(out_root, f"{base_name}.{target_ext}") + src_size = _image_size(files[0]) or default_size + target_size = _target_size_from_source(src_size) + _set_resolution(sandbox, target_size) + dst_size = (sandbox.render.resolution_x, sandbox.render.resolution_y) + strip_coll = _ensure_strip_collection(sandbox) + _clear_mari_strips(strip_coll) + strip = _build_image_strip(strip_coll, files, start) + if use_blend_resolution: + _apply_strip_fill(strip, src_size, dst_size) + sandbox.frame_start = start + sandbox.frame_end = start + len(files) - 1 + sandbox.render.filepath = os.path.splitext(out_path)[0] + if not _set_file_format(sandbox, target_fmt): + raise RuntimeError("Output format not supported in this Blender build.") + _restore_attr_dict(sandbox.render.ffmpeg, ffmpeg_state) + before = _list_media_files(out_root, video_exts, allow_no_ext=True) + _render_scene(sandbox, animation=True) + after = _list_media_files(out_root, video_exts, allow_no_ext=True) + if not _find_output_file(out_root, base_name, video_exts, allow_no_ext=True) and not (after - before): + raise RuntimeError(f"No output video written for {base_name}.") + + elif src_kind == "STILL": + if target_kind == "STILL" and src_ext != target_ext: + for f in os.scandir(src_root): + if not f.is_file(): + continue + if os.path.splitext(f.name)[1].lower().lstrip(".") != src_ext: + continue + base = os.path.splitext(f.name)[0] + out_path = os.path.join(out_root, f"{base}.{target_ext}") + src_size = _image_size(f.path) or default_size + target_size = _target_size_from_source(src_size) + _set_resolution(sandbox, target_size) + dst_size = (sandbox.render.resolution_x, sandbox.render.resolution_y) + strip_coll = _ensure_strip_collection(sandbox) + _clear_mari_strips(strip_coll) + strip = _build_image_strip(strip_coll, [f.path], 1) + if use_blend_resolution: + _apply_strip_fill(strip, src_size, dst_size) + sandbox.frame_start = 1 + sandbox.frame_end = 1 + try: + sandbox.frame_set(1) + except Exception: + pass + sandbox.render.filepath = os.path.splitext(out_path)[0] + if not _set_file_format(sandbox, target_fmt): + raise RuntimeError("Output format not supported in this Blender build.") + _restore_attr_dict(sandbox.render.ffmpeg, ffmpeg_state) + before = _list_media_files(out_root, image_exts) + _render_scene(sandbox, animation=False, write_still=True) + after = _list_media_files(out_root, image_exts) + if not _find_output_file(out_root, base, image_exts) and not (after - before): + raise RuntimeError(f"No output image written for {base}.") + + elif src_kind == "VIDEO": + video_files = [f for f in os.scandir(src_root) if f.is_file() and os.path.splitext(f.name)[1].lower().lstrip(".") in video_exts] + + if target_kind == "SEQ": + for f in video_files: + key = _match_key(f.name) + if key: + folder_name = f"{project_name}_{key}" + else: + folder_name = os.path.splitext(f.name)[0] + dst_dir = os.path.join(out_root, folder_name) + os.makedirs(dst_dir, exist_ok=True) + src_size = _video_size(f.path) or default_size + target_size = _target_size_from_source(src_size) + _set_resolution(sandbox, target_size) + dst_size = (sandbox.render.resolution_x, sandbox.render.resolution_y) + strip_coll = _ensure_strip_collection(sandbox) + _clear_mari_strips(strip_coll) + _strip, frame_count = _build_movie_strip(strip_coll, f.path, 1) + if use_blend_resolution: + _apply_strip_fill(_strip, src_size, dst_size) + if not frame_count: + frame_count = 1 + sandbox.frame_start = 1 + sandbox.frame_end = 1 + frame_count - 1 + sandbox.render.filepath = os.path.join(dst_dir, f"{project_name}_") + if not _set_file_format(sandbox, target_fmt): + raise RuntimeError("Output format not supported in this Blender build.") + _restore_attr_dict(sandbox.render.ffmpeg, ffmpeg_state) + _render_scene(sandbox, animation=True) + if not any( + f2.is_file() and _ext_matches(os.path.splitext(f2.name)[1], target_ext) + for f2 in os.scandir(dst_dir) + ): + raise RuntimeError(f"No output frames written for {folder_name}.") + + elif target_kind == "VIDEO" and src_ext != target_ext: + for f in video_files: + base = os.path.splitext(f.name)[0] + out_path = os.path.join(out_root, f"{base}.{target_ext}") + src_size = _video_size(f.path) or default_size + target_size = _target_size_from_source(src_size) + _set_resolution(sandbox, target_size) + dst_size = (sandbox.render.resolution_x, sandbox.render.resolution_y) + strip_coll = _ensure_strip_collection(sandbox) + _clear_mari_strips(strip_coll) + _strip, frame_count = _build_movie_strip(strip_coll, f.path, 1) + if use_blend_resolution: + _apply_strip_fill(_strip, src_size, dst_size) + if not frame_count: + frame_count = 1 + sandbox.frame_start = 1 + sandbox.frame_end = 1 + frame_count - 1 + sandbox.render.filepath = os.path.splitext(out_path)[0] + if not _set_file_format(sandbox, target_fmt): + raise RuntimeError("Output format not supported in this Blender build.") + _restore_attr_dict(sandbox.render.ffmpeg, ffmpeg_state) + before = _list_media_files(out_root, video_exts, allow_no_ext=True) + _render_scene(sandbox, animation=True) + after = _list_media_files(out_root, video_exts, allow_no_ext=True) + if not _find_output_file(out_root, base, video_exts, allow_no_ext=True) and not (after - before): + raise RuntimeError(f"No output video written for {base}.") + except Exception as exc: + self.report({'ERROR'}, f"Failed to convert MARI media: {exc}") + return {"CANCELLED"} + finally: + try: + if strip_coll is not None: + _clear_mari_strips(strip_coll) + except Exception: + pass + _restore_image_settings(sandbox.render.image_settings, image_state) + _restore_attr_dict(sandbox.render.ffmpeg, ffmpeg_state) + _restore_render_state(sandbox, render_state) + _release_media_cache([src_root, out_root]) + + def _has_media(root): + for entry in os.scandir(root): + if entry.is_dir(): + for sub in os.scandir(entry.path): + ext = os.path.splitext(sub.name)[1].lower().lstrip(".") + if ext in image_exts: + return True + elif entry.is_file(): + ext = os.path.splitext(entry.name)[1].lower().lstrip(".") + if ext in image_exts or ext in video_exts: + return True + return False + + if not _has_media(out_root): + self.report({'ERROR'}, "No output media was generated.") + return {"CANCELLED"} + + zip_base = os.path.dirname(src_root) + zip_path = os.path.join(zip_base, f"{project_name}.zip") + + from zipfile import ZipFile, ZIP_DEFLATED + with ZipFile(zip_path, 'w', ZIP_DEFLATED) as zipf: + zip_abs = os.path.abspath(zip_path) + for root, _dirs, files in os.walk(out_root): + for file in files: + full = os.path.join(root, file) + if os.path.normcase(os.path.abspath(full)) == os.path.normcase(zip_abs): + continue + rel = os.path.relpath(full, start=out_root) + arcname = rel + zipf.write(full, arcname=arcname) + mari_name = f"{project_name}.mari3d" + mari_path = os.path.join(out_root, mari_name) + if not os.path.exists(mari_path): + src_mari = os.path.join(src_root, mari_name) + if os.path.exists(src_mari): + zipf.write(src_mari, arcname=mari_name) + + print(f"[MARI] Constructed MARI zip: {zip_path}") + self.report({'INFO'}, f"Constructed MARI zip: {zip_path}") + return {"FINISHED"} + + def draw(self, context): + layout = self.layout + if getattr(self, "_upscale_warning", False): + col = layout.column() + col.alert = True + col.label(text="Target resolution is larger than source.", icon='ERROR') + src = getattr(self, "_upscale_source", None) + tgt = getattr(self, "_upscale_target", None) + if src and tgt: + col.label(text=f"Source: {src[0]} x {src[1]} Target: {tgt[0]} x {tgt[1]}") + col.label(text="Press OK to proceed and upscale, or Cancel to stop.") + return + layout.template_image_settings(context.scene.render.image_settings, color_management=False) + + layout.use_property_split = True + layout.use_property_decorate = False + + if context.scene.render.image_settings.file_format == "FFMPEG": + layout.separator() + + rd = context.scene.render + ffmpeg = rd.ffmpeg + + layout.prop(rd.ffmpeg, "format") + layout.prop(ffmpeg, "use_autosplit") + + + layout.separator() + + ffmpeg = context.scene.render.ffmpeg + + needs_codec = ffmpeg.format in {'AVI', 'QUICKTIME', 'MKV', 'OGG', 'MPEG4', 'WEBM'} + if needs_codec: + layout.prop(ffmpeg, "codec") + + if needs_codec and ffmpeg.codec == 'NONE': + return + + if ffmpeg.codec == 'DNXHD': + layout.prop(ffmpeg, "use_lossless_output") + + # Output quality + use_crf = needs_codec and ffmpeg.codec in {'H264', 'MPEG4', 'WEBM'} + if use_crf: + layout.prop(ffmpeg, "constant_rate_factor") + + # Encoding speed + layout.prop(ffmpeg, "ffmpeg_preset") + # I-frames + layout.prop(ffmpeg, "gopsize") + # B-Frames + row = layout.row(align=True, heading="Max B-frames") + row.prop(ffmpeg, "use_max_b_frames", text="") + sub = row.row(align=True) + sub.active = ffmpeg.use_max_b_frames + sub.prop(ffmpeg, "max_b_frames", text="") + + if not use_crf or ffmpeg.constant_rate_factor == 'NONE': + col = layout.column() + + sub = col.column(align=True) + sub.prop(ffmpeg, "video_bitrate") + sub.prop(ffmpeg, "minrate", text="Minimum") + sub.prop(ffmpeg, "maxrate", text="Maximum") + + col.prop(ffmpeg, "buffersize", text="Buffer") + + col.separator() + + col.prop(ffmpeg, "muxrate", text="Mux Rate") + col.prop(ffmpeg, "packetsize", text="Mux Packet Size") + + layout.separator() + rd = context.scene.render + ffmpeg = rd.ffmpeg + + if ffmpeg.format != 'MP3': + layout.prop(ffmpeg, "audio_codec", text="Audio Codec") + + if ffmpeg.audio_codec != 'NONE': + layout.prop(ffmpeg, "audio_channels") + layout.prop(ffmpeg, "audio_mixrate", text="Sample Rate") + layout.prop(ffmpeg, "audio_bitrate") + layout.prop(ffmpeg, "audio_volume", slider=True) + + + +class MARI_OT_Export_MARI(Operator): + """Automaticly done when rendering""" + bl_idname = f"{addon_prefix}.export_mari" + bl_label = "Export Camera Setup / Settings as .mari3d" + + type: StringProperty(default="FRAME") + action: StringProperty(default="PRESS") + format: StringProperty(default="STILL") + + + def execute(self, context): + prop = context.scene.mari_props + try: + mari_detect_mode_from_scene(context.scene) + except Exception: + pass + has_cams = any(obj.name.startswith("MARI_CAMERA") for obj in bpy.data.objects) + if mari.generated == False and self.action != "RENDER": + if not has_cams: + self.report({'ERROR'}, "(Re)Generate Cameras Before Exporting/Rendering!") + return {"FINISHED"} + mari.generated = True + + if prop.frame == "FRAME": + self.type = "FRAME" + else: + self.type = "CIRCLE" + + prop.render_settings_filepath = bpy.path.abspath(prop.render_settings_filepath) + export_dir = prop.render_settings_filepath + if not export_dir: + self.report({'ERROR'}, "Output Folder of MARI media cannot be found. Please Render MARI media first!") + return {"CANCELLED"} + if self.action == "PRESS": + filepath = os.path.join(export_dir, prop.render_settings_name) + else: + filepath = os.path.join(export_dir, prop.render_settings_name, prop.render_settings_name) + + angledata = [] + for cam in bpy.data.objects: + if cam.name.startswith("MARI_CAMERA"): + angledata.append((f"H{cam['H']}_V{cam['V']}", round((cam.location[0]**2+cam.location[1]**2+cam.location[2]**2)**0.5,4), cam.data.lens, cam["INTR"])) + + if self.type == "FRAME": + if self.action == "PRESS": + export_planes = bool(prop.frame_advanced_possition and prop.mari_save_planes) + if export_planes: + plane_objs = [] + for item in prop.frame_collision_planes: + obj = bpy.data.objects.get(item.name) + if obj and obj.type == 'MESH': + plane_objs.append(obj) + if plane_objs: + prev_active = context.view_layer.objects.active + prev_selected = [o for o in bpy.data.objects if o.select_get()] + bpy.ops.object.select_all(action='DESELECT') + for obj in plane_objs: + obj.select_set(True) + context.view_layer.objects.active = plane_objs[0] + try: + bpy.ops.wm.obj_export(filepath=filepath + ".obj", check_existing=True, filter_blender=False, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, display_type='DEFAULT', sort_method='FILE_SORT_ALPHA', export_animation=False, start_frame=-2147483648, end_frame=2147483647, forward_axis='NEGATIVE_Z', up_axis='Y', scaling_factor=1, apply_modifiers=True, export_eval_mode='DAG_EVAL_VIEWPORT', export_selected_objects=True, export_uv=True, export_normals=True, export_colors=False, export_materials=True, path_mode='AUTO', export_triangulated_mesh=False, export_curves_as_nurbs=False, export_object_groups=False, export_material_groups=False, export_vertex_groups=False, export_smooth_groups=False, smooth_group_bitflags=False, filter_glob="*.obj;*.mtl") + except TypeError: + bpy.ops.wm.obj_export(filepath=filepath + ".obj", export_selected_objects=True, apply_modifiers=True, forward_axis='NEGATIVE_Z', up_axis='Y') + try: + if os.path.exists(filepath + ".mtl"): + os.remove(filepath + ".mtl") + except Exception: + pass + bpy.ops.object.select_all(action='DESELECT') + for obj in prev_selected: + obj.select_set(True) + context.view_layer.objects.active = prev_active + + mari_data = { + "requiresframe": 1, + "isflatscreen": 1, + "framex":prop.frame_dimensions[0], + "framey":prop.frame_dimensions[1], + "ratiox":prop.frame_ratio[0], + "ratioy":prop.frame_ratio[1], + "frameloc":[round(prop.frame_center[0],4),round(prop.frame_center[1],4),round(prop.frame_center[2],4)], + "framerot":[round(prop.frame_rotation[0]*57.2957795,4),round(prop.frame_rotation[1]*57.2957795,4),round((prop.frame_rotation[2])*57.2957795,4)], + "maxangleh":[round(prop.frame_camera_limit_lr[0]*57.2957795, 2), round(prop.frame_camera_limit_lr[1]*57.2957795, 2)], + "maxanglev":[round(prop.frame_camera_limit_ud[0]*57.2957795,2), round(prop.frame_camera_limit_ud[1]*57.2957795,2)], + "angleinterval":[round(prop.frame_density[0]*57.2957795, 2), round(prop.frame_density[1]*57.2957795, 2)], + "issimplesetting":1 if not prop.frame_advanced_possition else 0, + "usedynamiccam":1 if prop.frame_use_dynamic_cam else 0, + "uniformradius":round(prop.frame_uniform_radius,4), + "offset": prop.frame_advanced_offset, + "leftoverangles": 1 if prop.frame_advenced_leftover_angle else 0, + "centerviewangle":90, + "camcount":prop.cam_num, + "centerviewloc":[0, 0, 0], + "angledata":angledata, + "futureedits":1 if self.action == "PRESS" else 0, + "isvideo":1 if self.format == "ANIM" else 0, + "framerate":bpy.context.scene.render.fps if self.format == "ANIM" else 0, + "filetype":"blender_frame" + } + + else: + mari_data = { + "requiresframe": 0, + "isflatscreen": 1, + "framex":context.scene.render.resolution_x, + "framey":context.scene.render.resolution_y, + "ratiox":context.scene.render.resolution_x / math.gcd(context.scene.render.resolution_x, context.scene.render.resolution_y), + "ratioy":context.scene.render.resolution_y / math.gcd(context.scene.render.resolution_x, context.scene.render.resolution_y), + "frameloc":[round(prop.circle_location[0],4),round(prop.circle_location[1],4),round(prop.circle_location[2],4)], + "framerot":[round(prop.circle_rotation[0]*57.2957795,4),round(prop.circle_rotation[1]*57.2957795,4),round((prop.circle_rotation[2])*57.2957795,4)], + "maxangleh":[round(prop.circle_max_angle_lr[0]*57.2957795, 2), round(prop.circle_max_angle_lr[1]*57.2957795, 2)], + "maxanglev":[round(prop.circle_max_angle_ud[0]*57.2957795,2), round(prop.circle_max_angle_ud[1]*57.2957795,2)], + "angleinterval":[round(prop.circle_interval[0]*57.2957795, 2), round(prop.circle_interval[1]*57.2957795, 2)], + "issimplesetting":1, + "usedynamiccam":0, + "uniformradius":round(prop.frame_uniform_radius,4), + "offset": 0, + "leftoverangles": 0, + "centerviewangle":90, + "camcount":prop.cam_num, + "centerviewloc":[0, 0, 0], + "angledata":angledata, + "futureedits":1 if self.action == "PRESS" else 0, + "isvideo":1 if self.format == "ANIM" else 0, + "framerate":bpy.context.scene.render.fps if self.format == "ANIM" else 0, + "filetype":"blender_render" + } + + + try: + + f = open(os.path.join(filepath + ".mari3d"), "w") + f.write(json.dumps(mari_data,indent=4)) + f.close() + except Exception as ex: + self.report({'ERROR'}, "Output Folder of MARI media cannot be found. Please Render MARI media first!") + + self.action = "PRESS" + + + return {"FINISHED"} + + + +def _mari_angledata_map(data): + angledata = data.get("angledata", []) + out = {} + for entry in angledata: + if not entry or len(entry) < 3: + continue + key = str(entry[0]) + parts = key.split("_") + if len(parts) != 2 or not parts[0].startswith("H") or not parts[1].startswith("V"): + continue + try: + h_val = int(parts[0][1:]) + v_val = int(parts[1][1:]) + except Exception: + continue + try: + dist = float(entry[1]) + except Exception: + dist = None + try: + lens = float(entry[2]) + except Exception: + lens = None + intr = 0 + if len(entry) > 3: + try: + intr = int(entry[3]) + except Exception: + intr = 0 + prev = out.get((h_val, v_val)) + if prev is None or (intr and not prev.get("intr", 0)): + out[(h_val, v_val)] = {"dist": dist, "lens": lens, "intr": intr} + return out + + +def _mari_angledata_intr_pairs(data): + angledata = data.get("angledata", []) + pairs = set() + for entry in angledata: + if not entry or len(entry) < 3: + continue + key = str(entry[0]) + parts = key.split("_") + if len(parts) != 2 or not parts[0].startswith("H") or not parts[1].startswith("V"): + continue + try: + h_val = int(parts[0][1:]) + v_val = int(parts[1][1:]) + except Exception: + continue + intr = 0 + if len(entry) > 3: + try: + intr = int(entry[3]) + except Exception: + intr = 0 + if intr: + pairs.add((h_val, v_val)) + return pairs + + +def _mari_angledata_pairs(data): + angledata = data.get("angledata", []) + pairs = set() + for entry in angledata: + if not entry or len(entry) < 3: + continue + key = str(entry[0]) + parts = key.split("_") + if len(parts) != 2 or not parts[0].startswith("H") or not parts[1].startswith("V"): + continue + try: + h_val = int(parts[0][1:]) + v_val = int(parts[1][1:]) + except Exception: + continue + pairs.add((h_val, v_val)) + return pairs + + +def _mari_prune_cameras_for_angledata(scene, data): + if not scene: + return + if not data or not data.get("angledata"): + return + valid_pairs = _mari_angledata_pairs(data) + if not valid_pairs: + return + intr_pairs = _mari_angledata_intr_pairs(data) + cams_by_pair = {} + to_remove = [] + for cam in scene.objects: + if not cam.name.startswith("MARI_CAMERA"): + continue + try: + h_val = int(cam.get("H")) + v_val = int(cam.get("V")) + except Exception: + continue + if (h_val, v_val) not in valid_pairs: + to_remove.append(cam) + continue + bucket = cams_by_pair.get((h_val, v_val)) + if bucket is None: + bucket = {"base": [], "dotted": []} + cams_by_pair[(h_val, v_val)] = bucket + if "." in cam.name: + bucket["dotted"].append(cam) + else: + bucket["base"].append(cam) + + for key, bucket in cams_by_pair.items(): + base_list = sorted(bucket["base"], key=lambda o: o.name) + dotted_list = sorted(bucket["dotted"], key=lambda o: o.name) + + if len(base_list) > 1: + to_remove.extend(base_list[1:]) + base_list = base_list[:1] + if len(dotted_list) > 1: + to_remove.extend(dotted_list[1:]) + dotted_list = dotted_list[:1] + + if base_list and dotted_list: + if key in intr_pairs: + to_remove.extend(base_list) + else: + to_remove.extend(dotted_list) + + for cam in to_remove: + try: + bpy.data.objects.remove(cam, do_unlink=True) + except Exception: + pass + + _mari_rename_cameras_by_indices(scene) + + +def _mari_rename_cameras_by_indices(scene): + if not scene: + return + cams = [] + for cam in scene.objects: + if not cam.name.startswith("MARI_CAMERA"): + continue + try: + h_val = int(cam.get("H")) + v_val = int(cam.get("V")) + except Exception: + continue + cams.append((cam, h_val, v_val)) + + if not cams: + return + + # Two-pass rename to avoid Blender auto-suffixing + for idx, (cam, _h, _v) in enumerate(cams): + cam.name = f"MARI_CAMERA_TMP_{idx}" + + for cam, h_val, v_val in cams: + target = f"MARI_CAMERA_H{h_val}_V{v_val}" + if bpy.data.objects.get(target) in (None, cam): + cam.name = target + else: + # Fallback: keep a stable unique name without .001 + cam.name = f"{target}_INTR" + + +def _mari_apply_angledata(scene, data, mode): + records = _mari_angledata_map(data) + if not records: + return False + + center_obj = None + if mode == "FRAME": + center_obj = bpy.data.objects.get("MARI_FrameCenter") + else: + center_obj = bpy.data.objects.get("MARI_CircleCenter") + center_loc = center_obj.matrix_world.translation.copy() if center_obj else Vector((0.0, 0.0, 0.0)) + + for cam in scene.objects: + if not cam.name.startswith("MARI_CAMERA"): + continue + try: + h_val = int(cam.get("H")) + v_val = int(cam.get("V")) + except Exception: + continue + rec = records.get((h_val, v_val)) + if not rec: + continue + if rec.get("lens") is not None and cam.data: + try: + cam.data.lens = rec["lens"] + except Exception: + pass + try: + cam["INTR"] = int(rec.get("intr", 0)) + except Exception: + pass + + dist = rec.get("dist") + if dist is None or dist <= 0: + continue + loc_world = cam.matrix_world.translation.copy() + dir_vec = (loc_world - center_loc) + if dir_vec.length < 1e-6: + dir_vec = cam.location.copy() + if dir_vec.length < 1e-6: + dir_vec = Vector((0.0, 0.0, 1.0)) + dir_vec.normalize() + new_loc = center_loc + (dir_vec * dist) + if mode == "FRAME": + try: + direction = (center_loc - new_loc).normalized() + quat = direction.to_track_quat('-Z', 'Y') + cam.matrix_world = Matrix.Translation(new_loc) @ quat.to_matrix().to_4x4() + except Exception: + cam.matrix_world.translation = new_loc + else: + cam.matrix_world.translation = new_loc + + return True + + +class MARI_OT_Import_mari(Operator, ImportHelper): + """Select a .mari3d data file and import it""" + bl_idname = f"{addon_prefix}.import" + bl_label = "Import .mari3d Camera Settings" + + filename_ext = ".mari3d" + + filter_glob: StringProperty( + default="*.mari3d", + options={'HIDDEN'}, + maxlen=255, + ) + + + def execute(self, context): + prop = context.scene.mari_props + _mari_cleanup_temp_collection(context.scene) + + f = open(self.filepath) + data = json.load(f) + + print(data) + + is_frame = data.get("filetype") == "render_anamorphic" or int(data.get("requiresframe", 0)) == 1 + if is_frame: + prop.frame = "FRAME" + prop.frame_ratio[0] = data["ratiox"] + prop.frame_ratio[1] = data["ratioy"] + + prop.frame_dimensions[0] = data["framex"] + prop.frame_dimensions[1] = data["framey"] + + prop.frame_center = data["frameloc"] + prop.frame_rotation = [math.radians(data["framerot"][0]), math.radians(data["framerot"][1]), math.radians(data["framerot"][2])] + + prop.frame_camera_limit_lr = [math.radians(data["maxangleh"][0]), math.radians(data["maxangleh"][1])] + prop.frame_camera_limit_ud = [math.radians(data["maxanglev"][0]), math.radians(data["maxanglev"][1])] + + prop.frame_density = [math.radians(data["angleinterval"][0]), math.radians(data["angleinterval"][1])] + + prop.frame_advanced_possition = True if data["issimplesetting"] == 0 else False + prop.frame_advanced_offset = data["offset"] + prop.frame_advenced_leftover_angle = bool(int(data.get("leftoverangles", 1))) + + prop.frame_use_dynamic_cam = True if data["usedynamiccam"] == 1 else False + bpy.context.scene.render.fps = data["framerate"] + + # Import reconstruction should not depend on live collision objects. + import_adv = prop.frame_advanced_possition + import_leftover = prop.frame_advenced_leftover_angle + prop.frame_advanced_possition = False + + bpy.ops.mari.make_frame("INVOKE_DEFAULT") + + mari.data = data + + + + else: + prop.frame = "CRICLE" + + prop.circle_location = data["frameloc"] + prop.circle_rotation = [math.radians(data["framerot"][0]), math.radians(data["framerot"][1]), math.radians(data["framerot"][2])] + prop.circle_interval = [math.radians(data["angleinterval"][0]), math.radians(data["angleinterval"][1])] + prop.circle_max_angle_lr = [math.radians(data["maxangleh"][0]), math.radians(data["maxangleh"][1])] + prop.circle_max_angle_ud = [math.radians(data["maxanglev"][0]), math.radians(data["maxanglev"][1])] + bpy.context.scene.render.fps = data["framerate"] + + bpy.ops.mari.make_circle("INVOKE_DEFAULT") + + + + + prop.frame_uniform_radius = data["uniformradius"] + prop.frame_radius_lock = True + + mari.data = data + + attempts = {"count": 0} + + def _apply_when_ready(): + attempts["count"] += 1 + cams = [obj for obj in bpy.data.objects if obj.name.startswith("MARI_CAMERA")] + if not cams: + return 0.2 if attempts["count"] < 50 else None + expected = int(data.get("camcount") or 0) + if expected and len(cams) < expected and attempts["count"] < 50: + return 0.2 + mode = "FRAME" if is_frame else "CIRCLE" + if is_frame: + prop.frame_advanced_possition = import_adv + prop.frame_advenced_leftover_angle = import_leftover + _mari_prune_cameras_for_angledata(bpy.context.scene, data) + _mari_apply_angledata(bpy.context.scene, data, mode) + return None + + bpy.app.timers.register(_apply_when_ready, first_interval=0.2) + + try: + bpy.ops.wm.obj_import(filepath=str(self.filepath).replace("mari3d", "obj"), filter_blender=False, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, display_type='DEFAULT', sort_method='FILE_SORT_ALPHA', clamp_size=0, forward_axis='NEGATIVE_Z', up_axis='Y', import_vertex_groups=False, validate_meshes=False, filter_glob="*.obj;*.mtl") + except Exception: + pass + + + return {"FINISHED"} + + +class MARI_OT_Cam_set(Operator): + """Sets camera settings from imported file. (eg. focal length)""" + bl_idname = f"{addon_prefix}.update_cameras" + bl_label = "" + + def execute(self, context): + data = getattr(mari, "data", None) + if not data or "angledata" not in data: + self.report({'ERROR'}, "No imported MARI data found.") + return {"CANCELLED"} + mode = "FRAME" if data.get("filetype") == "render_anamorphic" or data.get("requiresframe") == 1 else "CIRCLE" + _mari_prune_cameras_for_angledata(context.scene, data) + _mari_apply_angledata(context.scene, data, mode) + return {"FINISHED"} + + + + +########################## +######## PANEL ########### + +class MARI_panel_settings: + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + bl_category = "MARI" + +class MARI_PT_Panel(MARI_panel_settings, Panel): + bl_label = "MARI Camera Generator" + bl_idname = f"{addon_prefix}.panel_main" + + def draw(self, context): + layout = self.layout + prop = context.scene.mari_props + + row = layout.row() + row.label(text="Upload MARI Media") + row = layout.row() + row.scale_y = 2.0 + row.alert = True + row.operator("wm.url_open", text="holomari.com", icon='URL').url = "https://holomari.com/dashboard" + row = layout.row() + row.operator("wm.url_open", text="MARI Image Viewer", icon='URL').url = "https://holomari.com/info/viewer/index" + + layout.separator() + # MARIJPEG ONLY NOTICE + notice = layout.column(align=True) + notice.alert = True + notice.label(text="Tip: As of now, the HoloMARI") + notice.label(text="website only supports images!") + + + box = layout.box() + row = box.row() + row.prop(prop, "frame", expand=True) + if prop.frame == "FRAME": + box.separator() + row = box.row() + row.scale_y = .2 + row.label(text="Ratio") + row = box.row() + row.prop(prop, "frame_ratio", text="") + row = box.row() + row.scale_y = .2 + row.label(text="Dimensions") + row = box.row() + row.prop(prop, "frame_dimensions", text="") + + box.prop(prop, "frame_center") + box.prop(prop, "frame_rotation") + + row = box.row() + row.prop(prop, "frame_density") + row = box.row() + row.prop(prop, "frame_camera_limit_lr") + row = box.row() + row.prop(prop, "frame_camera_limit_ud") + + row = box.row() + #row.prop(prop, "frame_use_dynamic_cam") + + row = box.row(align=True) + row.prop(prop, "frame_uniform_radius") + + row = row.column(align=True) + row.prop(prop, "frame_radius_lock", icon="UNLOCKED" if prop.frame_radius_lock == False else "LOCKED", text="") + + row = box.row() + row.label(text="Select Camera Collision Objects for Advanced Generation") + row = box.row() + row.prop(prop, "frame_advanced_possition", text="Use Advanced") + + adv_col = box.column() + adv_col.enabled = prop.frame_advanced_possition + adv_col.prop(prop, "frame_advenced_leftover_angle") + adv_col.prop(prop, "frame_advanced_offset", text="Offset") + + + + + + box.separator() + row = box.row() + row.scale_y = 1.5 + row.operator(MARI_OT_GenerateFrame.bl_idname) + + row = box.row() + + else: + box.separator() + box.prop(prop, "circle_radius") + box.prop(prop, "circle_location", text="Center Location") + box.prop(prop, "circle_rotation", text="Center Rotation") + row = box.row() + row.prop(prop, "circle_interval") + row = box.row() + row.prop(prop, "circle_max_angle_lr") + row = box.row() + row.prop(prop, "circle_max_angle_ud") + row = box.row(align=True) + row.prop(prop, "frame_uniform_radius") + row.prop(prop, "frame_radius_lock", icon="UNLOCKED" if prop.frame_radius_lock == False else "LOCKED", text="") + box.separator() + row = box.row() + row.scale_y = 1.5 + row.operator(MARI_OT_GenerateCircle.bl_idname) + + mari.cam_num = prop.cam_num + mari.is_txt_on = 1 + row.label(text=f"MARI Camera Count: {prop.cam_num}") + + + + + + + +class MARI_PT_CameraSettings(MARI_panel_settings, Panel): + bl_label = "Camera Settings" + bl_idname = f"{addon_prefix}.cam_settings" + + def draw(self, context): + layout = self.layout + prop = context.scene.mari_props + + row = layout.row() + row.prop(prop, "camera_settings_clip_start") + layout.separator() + + row = layout.row() + row.prop(prop, "camera_settings_clip_end") + layout.separator() + + row = layout.row() + row.active = not mari.did_focal + row.prop(prop, "camera_settings_lens") + layout.separator() + + self.layout.prop(prop, "camera_settings_dof_use", text="Depth of field") + + layout = self.layout + layout.use_property_split = True + + + + split = layout.split() + + col = split.column() + col.active = prop.camera_settings_dof_use + col.prop(prop, "camera_settings_dof_object", text="Focus Object") + + sub = col.row() + sub.active = prop.camera_settings_dof_object is None + sub.prop(prop, "camera_settings_dof_distance", text="Distance") + + + + +class MARI_PT_CAM_DOF_APERATURE(MARI_panel_settings, Panel): + bl_label = "Aperture" + bl_parent_id = f"{addon_prefix}.cam_settings" + bl_options = {"DEFAULT_CLOSED"} + + + def draw(self, context): + layout = self.layout + layout.use_property_split = True + prop = context.scene.mari_props + + layout.active = prop.camera_settings_dof_use + flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False) + + col = flow.column() + col.prop(prop, "camera_settings_dof_fstop") + col.prop(prop, "camera_settings_dof_blades") + col.prop(prop, "camera_settings_dof_rotation") + col.prop(prop, "camera_settings_dof_ratio") + +class MARI_PT_RenderSettings(MARI_panel_settings, Panel): + bl_label = "Render Settings" + bl_idname = f"{addon_prefix}.render_settings" + + def draw(self, context): + layout = self.layout + prop = context.scene.mari_props + + + + if prop.frame == "FRAME": + row = layout.row() + row.prop(prop, "render_settings_normalize", translate=False) + + if prop.render_settings_normalize: + layout.row().prop(prop, "render_settings_limit_res_factor") + + row = layout.row() + row.prop(prop, "render_settings_filepath", translate=False) + row = layout.row() + row.prop(prop, "render_settings_name", translate=False) + row = layout.row() + row.prop(prop, "mari_save_media") + plane_row = layout.row() + plane_row.enabled = (prop.frame == "FRAME" and prop.frame_advanced_possition) + plane_row.prop(prop, "mari_save_planes") + + + # MARIJPEG ONLY NOTICE + notice = layout.column(align=True) + notice.alert = True + notice.label(text="Tip: As of now, the HoloMARI") + notice.label(text="website only supports images!") + + + row = layout.row() + row.template_image_settings(context.scene.render.image_settings, color_management=False) + + if context.scene.render.image_settings.file_format == 'FFMPEG': + ffmpeg = context.scene.render.ffmpeg + box = layout.box() + box.label(text="Video Encoding", icon='SEQ_STRIP_META') + box.prop(ffmpeg, "format", text="Container") + box.prop(ffmpeg, "codec", text="Video Codec") + box.prop(ffmpeg, "constant_rate_factor", text="Rate Factor") + box.prop(ffmpeg, "video_bitrate") + box.prop(ffmpeg, "ffmpeg_preset", text="Encoding Speed") + box.prop(ffmpeg, "use_lossless_output") + + row = layout.row() + row.alignment='RIGHT' + row.prop(context.scene.render, "use_overwrite") + + cam_box = layout.box() + cam_box.label(text=".mari3d Camera Settings") + if prop.frame == "FRAME": + row = cam_box.row() + row.operator(MARI_OT_Export_MARI.bl_idname).type = "FRAME" + else: + row = cam_box.row() + row.operator(MARI_OT_Export_MARI.bl_idname).type = "CIRCLE" + + row = cam_box.row(align=True) + row.operator(MARI_OT_Import_mari.bl_idname) + row.operator(MARI_OT_Cam_set.bl_idname, icon="OUTLINER_OB_CAMERA") + + pkg_box = layout.box() + pkg_box.label(text="Package .zip from .mari3d") + pkg_box.label(text="& convert MARI File formats") + row = pkg_box.row() + row.operator(MARI_OT_GenerateMedia.bl_idname) + row = pkg_box.row() + row.prop(prop, "mari_use_blend_resolution") + + # MARIJPEG ONLY NOTICE + notice = layout.column(align=True) + notice.alert = True + notice.label(text="Tip: As of now, the HoloMARI") + notice.label(text="website only supports images!") + + row = layout.row() + row.scale_y = 1.5 + if prop.frame == "FRAME": + multi_box = layout.box() + multi_box.label(text="FASTER MULTI-RENDER") + multi_box.label(text="Requires Multirender Addon!") + multi_box.label(text="holomari.com/info/MultiRender") + multi_row = multi_box.row() + multi_row.alert = True + multi_row.operator(MARI_OT_Multi_render.bl_idname, text="Render MARI Image (MULTI)", icon='RENDER_STILL').action = "STILL" + multi_row = multi_box.row() + multi_row.alert = True + multi_row.operator(MARI_OT_Multi_render.bl_idname, text="Render MARI Animation (MULTI)", icon='RENDER_ANIMATION').action = "ANIM" + multi_row = multi_box.row() + multi_row.operator("render.multi_gpu_frames_cancel", text="Stop Multi-Instance", icon='CANCEL') + + built_box = layout.box() + built_box.label(text="BUILT-IN RENDER (slow)") + built_box.operator(MARI_OT_Frame_render.bl_idname, text="Render MARI Image", icon='RENDER_STILL').action = "STILL" + built_box.operator(MARI_OT_Frame_render.bl_idname, text="Render MARI Animation", icon='RENDER_ANIMATION').action = "ANIM" + + else: + multi_box = layout.box() + multi_box.label(text="FASTER MULTI-RENDER") + multi_box.label(text="Requires Multirender Addon!") + multi_row = multi_box.row() + multi_row.alert = True + multi_row.operator(MARI_OT_Multi_render.bl_idname, text="Render MARI Image (MULTI)", icon='RENDER_STILL').action = "STILL" + multi_row = multi_box.row() + multi_row.alert = True + multi_row.operator(MARI_OT_Multi_render.bl_idname, text="Render MARI Animation (MULTI)", icon='RENDER_ANIMATION').action = "ANIM" + multi_row = multi_box.row() + multi_row.operator("render.multi_gpu_frames_cancel", text="Stop Multi-Instance", icon='CANCEL') + + built_box = layout.box() + built_box.label(text="BUILT-IN RENDER (slow)") + built_box.operator(MARI_OT_Circle_render.bl_idname, text="Render MARI Image", icon='RENDER_STILL').action = "STILL" + built_box.operator(MARI_OT_Circle_render.bl_idname, text="Render MARI Animation", icon='RENDER_ANIMATION').action = "ANIM" + + layout.separator() + row = layout.row() + row.label(text="Upload MARI Media") + row = layout.row() + row.scale_y = 2.0 + row.alert = True + row.operator("wm.url_open", text="holomari.com", icon='URL').url = "https://holomari.com/dashboard" + row = layout.row() + row.operator("wm.url_open", text="MARI Image Viewer", icon='URL').url = "https://holomari.com/info/viewer/index" + + + + +def draw_text_callback(data): + if mari.is_txt_on == 1: + blf.position(0, 15, 30, 0) + blf.size(0, 20, 72) + blf.color(0, 1, 1, 1, 0.7) + blf.draw(0, f"MARI Camera Count: {mari.cam_num}") + +''' +handle = bpy.types.SpaceView3D.draw_handler_add( + draw_text_callback, (2,), + 'WINDOW', 'POST_PIXEL') +''' + +def on_cancel(scene): + """ + Called by Blender when the user cancels a render (Esc). + Flip our cancel flag and make sure no queued steps continue. + """ + if not getattr(mari, "_render_active", False): + return + + print("[MARI] Render canceled by user (Esc). Halting pipeline.") + mari.cancel_all = True + + # Be extra safe: don't let any lingering 'render_complete' handlers queue more work. + for _h in list(bpy.app.handlers.render_complete): + try: + bpy.app.handlers.render_complete.remove(_h) + except Exception: + pass + + # Restore user render settings captured at the start of a MARI render. + try: + if getattr(mari, "_render_state", None): + _mari_restore_render_settings(scene, mari._render_state) + except Exception: + pass + try: + _mari_clear_render_active() + except Exception: + pass + + # Also restore the user's render display preference + try: + _mari_restore_render_display() + except Exception: + pass + + + +def mari_detect_mode_from_scene(scene): + """Auto-select FRAME vs CIRCLE based on existing helper objects.""" + if not scene: + return _MARI_MODE_CIRCLE + + prop = getattr(scene, "mari_props", None) + has_cams = False + try: + has_cams = any(obj.name.startswith("MARI_CAMERA") for obj in scene.objects) + except Exception: + has_cams = False + + mode = _mari_scene_mode_from_objects(scene, fallback=_MARI_MODE_CIRCLE) + if prop is not None: + try: + if _mari_normalize_mode_id(getattr(prop, "frame", _MARI_MODE_CIRCLE)) != mode: + prop.frame = mode + except Exception: + pass + + mari.generated = bool(has_cams) + return mode + + +@persistent +def mari_on_load_post(*_args): + _mari_sync_mode_for_all_scenes() + _mari_schedule_mode_sync(0.05) + + +classes = [ + MARI_AP_Preferences, + MARI_CollisionPlaneItem, + MARI_Props, + + MARI_OP_Install, + MARI_OT_GenerateFrame, + MARI_OT_GenerateCircle, + MARI_OT_Frame_render, + MARI_OT_Circle_render, + MARI_OT_CancelWatcher, + MARI_OT_Export_MARI, + MARI_OT_GenerateMedia, + MARI_OT_Import_mari, + MARI_OT_Cam_set, + MARI_OT_RenderOne, + MARI_OT_Multi_render, + + + MARI_PT_Panel, + MARI_PT_CameraSettings, + MARI_PT_CAM_DOF_APERATURE, + MARI_PT_RenderSettings, + ] + +def register(): + from bpy.props import PointerProperty + global handle + + for cls in classes: + bpy.utils.register_class(cls) + + bpy.types.Scene.mari_props = PointerProperty(type=MARI_Props) + + if handle is None: + handle = bpy.types.SpaceView3D.draw_handler_add( + draw_text_callback, (2,), 'WINDOW', 'POST_PIXEL' + ) + + # add render_cancel once + for _h in list(bpy.app.handlers.render_cancel): + if getattr(_h, "__module__", "") == __name__ and getattr(_h, "__name__", "") == "on_cancel" and _h is not on_cancel: + try: + bpy.app.handlers.render_cancel.remove(_h) + except Exception: + pass + if on_cancel not in bpy.app.handlers.render_cancel: + bpy.app.handlers.render_cancel.append(on_cancel) + for _h in list(bpy.app.handlers.load_post): + if getattr(_h, "__module__", "") == __name__ and getattr(_h, "__name__", "") == "mari_on_load_post" and _h is not mari_on_load_post: + try: + bpy.app.handlers.load_post.remove(_h) + except Exception: + pass + if mari_on_load_post not in bpy.app.handlers.load_post: + bpy.app.handlers.load_post.append(mari_on_load_post) + # Keep UI mode aligned on startup and after new files finish loading. + try: + _mari_sync_mode_for_all_scenes() + _mari_schedule_mode_sync(0.0) + except Exception: + pass + + +def unregister(): + global handle + + # remove draw handler first + if handle is not None: + try: + bpy.types.SpaceView3D.draw_handler_remove(handle, 'WINDOW') + except Exception: + pass + handle = None + + # remove render_cancel if present + try: + bpy.app.handlers.render_cancel.remove(on_cancel) + except ValueError: + pass + try: + bpy.app.handlers.load_post.remove(mari_on_load_post) + except ValueError: + pass + try: + bpy.app.timers.unregister(_mari_mode_sync_timer) + except Exception: + pass + + try: + del bpy.types.Scene.mari_props + except AttributeError: + pass + + for cls in reversed(classes): + try: + bpy.utils.unregister_class(cls) + except Exception: + pass + + + +if __name__ == "__main__": + register() diff --git a/scripts/addons/cc_blender_tools-2_4_0/.gitignore b/scripts/addons/cc_blender_tools-2_4_0/.gitignore new file mode 100644 index 0000000..a872181 --- /dev/null +++ b/scripts/addons/cc_blender_tools-2_4_0/.gitignore @@ -0,0 +1,9 @@ +__pycache__ +cc3_blender_tools_updater +cc_blender_tools_updater +cc_tools_updater +cc3_tools_updater +*.blend1 +coordinate map.txt +notes.txt +todo.md diff --git a/scripts/addons/cc_blender_tools-2_4_0/cc_blender_tools-2_4_0_updater/cc_blender_tools-2_4_0_updater_status.json b/scripts/addons/cc_blender_tools-2_4_0/cc_blender_tools-2_4_0_updater/cc_blender_tools-2_4_0_updater_status.json index 2d74673..952445e 100644 --- a/scripts/addons/cc_blender_tools-2_4_0/cc_blender_tools-2_4_0_updater/cc_blender_tools-2_4_0_updater_status.json +++ b/scripts/addons/cc_blender_tools-2_4_0/cc_blender_tools-2_4_0_updater/cc_blender_tools-2_4_0_updater_status.json @@ -1,5 +1,5 @@ { - "last_check": "2026-03-09 09:51:26.406756", + "last_check": "", "backup_date": "", "update_ready": false, "ignore": false, diff --git a/scripts/addons/delete_withoutConfirm.py b/scripts/addons/delete_withoutConfirm.py deleted file mode 100644 index a7c071f..0000000 --- a/scripts/addons/delete_withoutConfirm.py +++ /dev/null @@ -1,53 +0,0 @@ -bl_info = { - "name": "d_delete_withoutConfirm", - "author": "Way2Close", - "version": (1, 0), - "blender": (2, 80, 0), - "description": "Deletes element from msm", - "category": "3D View"} - -import bpy - - -class Delete_withoutConfirm(bpy.types.Operator): - """Deletes element from msm""" - bl_idname = "edit.delete_without_confirm" - bl_label = "delete_withoutConfirm" - bl_options = {'REGISTER', 'UNDO'} - - def execute(self, context): - # delete_withoutConfirm - - # get msm - msm = bpy.context.tool_settings.mesh_select_mode - - # cancel if no active - if not bpy.context.active_object: - return {'FINISHED'} - - if bpy.context.active_object.mode == "EDIT": - - if msm[0]: - # delete verts - bpy.ops.mesh.delete(type = 'VERT') - - elif msm[1]: - # delete edges - bpy.ops.mesh.delete(type = 'EDGE') - - elif msm[2]: - # delete faces - bpy.ops.mesh.delete(type = 'FACE') - - return {'FINISHED'} - - -classes = ( - Delete_withoutConfirm, -) - -register, unregister = bpy.utils.register_classes_factory(classes) - - -if __name__ == "__main__": - register() diff --git a/scripts/addons/flamenco/operators.py b/scripts/addons/flamenco/operators.py index 4c4abd1..4f6c9db 100644 --- a/scripts/addons/flamenco/operators.py +++ b/scripts/addons/flamenco/operators.py @@ -363,246 +363,47 @@ class FLAMENCO_OT_submit_job(FlamencoOpMixin, bpy.types.Operator): return filepath - def _convert_relpaths_to_absolute(self, context: bpy.types.Context) -> None: - """Convert all relative paths in the blend file to absolute paths. - - This ensures that all libraries, images, and other assets are referenced - by absolute paths, allowing the blend file to be sent as-is without BAT. - """ - # Convert library paths to absolute - for library in bpy.data.libraries: - if library.filepath: - old_path = library.filepath - abs_path = bpy.path.abspath(library.filepath) - library.filepath = abs_path - self.log.debug("Converted library path: %s -> %s", old_path, abs_path) - - # Convert image paths to absolute - for image in bpy.data.images: - if image.filepath and not image.packed_file: - old_path = image.filepath - abs_path = bpy.path.abspath(image.filepath) - image.filepath = abs_path - self.log.debug("Converted image path: %s -> %s", old_path, abs_path) - - # Convert movie paths to absolute - for movie in bpy.data.movieclips: - if movie.filepath: - old_path = movie.filepath - abs_path = bpy.path.abspath(movie.filepath) - movie.filepath = abs_path - self.log.debug("Converted movie path: %s -> %s", old_path, abs_path) - - # Convert sound paths to absolute - for sound in bpy.data.sounds: - if sound.filepath: - old_path = sound.filepath - abs_path = bpy.path.abspath(sound.filepath) - sound.filepath = abs_path - self.log.debug("Converted sound path: %s -> %s", old_path, abs_path) - - # Convert font paths to absolute (skip VectorFont - its filepath is read-only) - for font in bpy.data.fonts: - if font.filepath: - try: - old_path = font.filepath - abs_path = bpy.path.abspath(font.filepath) - font.filepath = abs_path - self.log.debug("Converted font path: %s -> %s", old_path, abs_path) - except (TypeError, AttributeError): - self.log.debug("Skipping font %s (filepath is read-only)", font.name) - - # Convert volume paths to absolute - for volume in bpy.data.volumes: - if volume.filepath: - old_path = volume.filepath - abs_path = bpy.path.abspath(volume.filepath) - volume.filepath = abs_path - self.log.debug("Converted volume path: %s -> %s", old_path, abs_path) - def _submit_files(self, context: bpy.types.Context, blendfile: Path) -> bool: """Ensure that the files are somewhere in the shared storage. - Bypasses BAT entirely. Converts all relative paths to absolute and sends - the blend file as-is. - Returns True if a packing thread has been started, and False otherwise. """ + from .bat import interface as bat_interface + + if bat_interface.is_packing(): + self.report({"ERROR"}, "Another packing operation is running") + self._quit(context) + return False + manager = self._manager_info(context) if not manager: return False - # Convert all relative paths to absolute before saving - self.log.info("Converting all relative paths to absolute") - self._convert_relpaths_to_absolute(context) - - # Save the blend file with absolute paths - self.log.info("Saving blend file with absolute paths") - blendfile = self._save_blendfile(context) - blendfile = bpathlib.make_absolute(blendfile) - if manager.shared_storage.shaman_enabled: - # Upload blend file directly to Shaman without BAT - self.log.info("Uploading blend file directly to Shaman (bypassing BAT)") - self._upload_blendfile_to_shaman(context, blendfile) - # Job is submitted synchronously, cleanup and finish - self._quit(context) - return False # No thread running, handled synchronously + # self.blendfile_on_farm will be set when BAT created the checkout, + # see _on_bat_pack_msg() below. + self.blendfile_on_farm = None + self._bat_pack_shaman(context, blendfile) elif job_submission.is_file_inside_job_storage(context, blendfile): self.log.info( "File is already in job storage location, submitting it as-is" ) self._use_blendfile_directly(context, blendfile) - return False else: self.log.info( "File is not already in job storage location, copying it there" ) try: - self._copy_blendfile_to_storage(context, blendfile) + self.blendfile_on_farm = self._bat_pack_filesystem(context, blendfile) except FileNotFoundError: self._quit(context) return False - return False - def _upload_blendfile_to_shaman( - self, context: bpy.types.Context, blendfile: Path - ) -> None: - """Upload blend file directly to Shaman without BAT. - - Creates a Shaman checkout with just the blend file, maintaining its - relative path from the project root. - """ - from .bat import cache - from .manager.apis import ShamanApi - from .manager.models import ( - ShamanFileSpec, - ShamanCheckout, - ) - from .manager.exceptions import ApiException - from . import preferences - - api_client = self.get_api_client(context) - shaman_api = ShamanApi(api_client) - - # Get project root to calculate relative path - prefs = preferences.get(context) - project_path: Path = prefs.project_root() - project_path = bpathlib.make_absolute(Path(bpy.path.abspath(str(project_path)))) - - # Calculate relative path from project root - try: - blendfile_rel_path = blendfile.relative_to(project_path) - # Convert to POSIX path for Shaman - blendfile_path_in_checkout = PurePosixPath(blendfile_rel_path.as_posix()) - except ValueError: - # Blend file is not under project root, use just the filename - self.log.warning( - "Blend file %s is not under project root %s, using filename only", - blendfile, - project_path, - ) - blendfile_path_in_checkout = PurePosixPath(blendfile.name) - - # Compute checksum and file size - self.log.info("Computing checksum for %s", blendfile.name) - checksum = cache.compute_cached_checksum(blendfile) - filesize = blendfile.stat().st_size - - # Upload the blend file to Shaman - self.log.info("Uploading blend file to Shaman: %s", blendfile.name) - try: - with blendfile.open("rb") as file_reader: - shaman_api.shaman_file_store( - checksum=checksum, - filesize=filesize, - body=file_reader, - x_shaman_can_defer_upload=True, - x_shaman_original_filename=blendfile.name, - ) - except ApiException as ex: - if ex.status == 208: - # File already known to Shaman - self.log.info("Blend file already known to Shaman") - elif ex.status == 425: - # Defer upload - someone else is uploading - self.log.info("Blend file is being uploaded by another client, deferring") - # Retry after a short delay - import time - time.sleep(1) - with blendfile.open("rb") as file_reader: - shaman_api.shaman_file_store( - checksum=checksum, - filesize=filesize, - body=file_reader, - x_shaman_can_defer_upload=False, - x_shaman_original_filename=blendfile.name, - ) - else: - self.log.error("Error uploading to Shaman: %s", ex) - self.report({"ERROR"}, f"Error uploading to Shaman: {ex}") - return - - # Create checkout definition with just the blend file - checkout_path = self._shaman_checkout_path() - filespec = ShamanFileSpec( - sha=checksum, - size=filesize, - path=str(blendfile_path_in_checkout), # Relative path from project root - ) - - # Create the checkout - self.log.info("Creating Shaman checkout: %s", checkout_path) - self.log.info("Blend file path in checkout: %s", blendfile_path_in_checkout) - checkout = ShamanCheckout( - files=[filespec], - checkout_path=str(checkout_path), - ) - - try: - result = shaman_api.shaman_checkout(checkout) - self.actual_shaman_checkout_path = PurePosixPath(result.checkout_path) - # The checkout itself is created in a unique subdirectory. The job's - # blendfile must include that checkout path. - self.blendfile_on_farm = ( - PurePosixPath("{jobs}") - / self.actual_shaman_checkout_path - / blendfile_path_in_checkout - ) - self.log.info("Shaman checkout created: %s", self.actual_shaman_checkout_path) - self._submit_job(context) - except ApiException as ex: - self.log.error("Error creating Shaman checkout: %s", ex) - self.report({"ERROR"}, f"Error creating Shaman checkout: {ex}") - return + wm = context.window_manager + self.timer = wm.event_timer_add(self.TIMER_PERIOD, window=context.window) - def _copy_blendfile_to_storage( - self, context: bpy.types.Context, blendfile: Path - ) -> None: - """Copy blend file to job storage without BAT.""" - import shutil - - manager = self._manager_info(context) - if not manager: - raise FileNotFoundError("Manager info not known") - - unique_dir = "%s-%s" % ( - datetime.datetime.now().isoformat("-").replace(":", ""), - self.job_name, - ) - pack_target_dir = Path(manager.shared_storage.location) / unique_dir - pack_target_dir.mkdir(parents=True, exist_ok=True) - - pack_target_file = pack_target_dir / blendfile.name - self.log.info("Copying blend file to %s", pack_target_file) - - shutil.copy2(blendfile, pack_target_file) - - self.blendfile_on_farm = PurePosixPath(pack_target_file.as_posix()) - self.actual_shaman_checkout_path = None - - self._submit_job(context) + return True def _bat_pack_filesystem( self, context: bpy.types.Context, blendfile: Path @@ -641,7 +442,7 @@ class FLAMENCO_OT_submit_job(FlamencoOpMixin, bpy.types.Operator): project=project_path, target=str(pack_target_dir), exclusion_filter="", # TODO: get from GUI. - relative_only=True, # Only include files relative to project path. + relative_only=True, # TODO: get from GUI. ) return PurePosixPath(pack_target_file.as_posix()) @@ -680,7 +481,7 @@ class FLAMENCO_OT_submit_job(FlamencoOpMixin, bpy.types.Operator): project=project_path, target="/", # Target directory irrelevant for Shaman transfers. exclusion_filter="", # TODO: get from GUI. - relative_only=True, # Only include files relative to project path. + relative_only=True, # TODO: get from GUI. packer_class=bat_shaman.Packer, packer_kwargs=dict( api_client=self.get_api_client(context), diff --git a/scripts/addons/form_affinity_maya_config_pro/INSTALL.txt b/scripts/addons/form_affinity_maya_config_pro/INSTALL.txt new file mode 100644 index 0000000..4d26e4d --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/INSTALL.txt @@ -0,0 +1,25 @@ +Maya Config Pro — Install the release ZIP (Blender 4.2+) +======================================================== + +This package is a Blender *extension* (blender_manifest.toml). Do not unzip +into a scripts folder by hand unless you know the layout. + +Install +------- + +1. Blender: Edit → Preferences +2. Open "Get Extensions" (left sidebar) +3. Either: + - Top-right "..." menu → "Install from Disk" → choose this ZIP, or + - Drag and drop the ZIP file onto the Preferences window +4. In the extensions list, search: Maya Config Pro (id: form_affinity_maya_config_pro) +5. Enable the add-on with the checkbox + +If you do not see it, click "Refresh Local" in Get Extensions (or Add-ons), +or restart Blender after install. + +Note: In Blender 5.x, drag-and-drop or "Install from Disk" may extract the +package into scripts/addons. The add-on must define bl_info in __init__.py +for that path — otherwise Blender prints "Modules Installed ()" and the +entry does not show up. Enable it under Preferences → Add-ons (search: +"Maya Config Pro"). diff --git a/scripts/addons/form_affinity_maya_config_pro/README.md b/scripts/addons/form_affinity_maya_config_pro/README.md new file mode 100644 index 0000000..8a69e9f --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/README.md @@ -0,0 +1,388 @@ +# Maya Config Pro + +A Maya-like configuration, shortcuts, and UI elements for Blender. + +**Version:** 1.7.0 (Extension Port) +**Original Author:** Jesse Doyle | Form Affinity +**License:** GPL-3.0-or-later + +![Maya Config Pro Wallpaper](docs/images/MCP_Wallpaper.png) + +--- + +## Table of Contents + +- [Overview](#overview) +- [Features](#features) +- [Installation](#installation) + - [As Blender Extension (Recommended)](#as-blender-extension-recommended) + - [Legacy Mod Installation](#legacy-mod-installation) +- [Quick Start](#quick-start) +- [What's Included](#whats-included) +- [Version Compatibility](#version-compatibility) +- [Update History](#update-history) +- [FAQ](#faq) +- [Support & Contact](#support--contact) + +--- + +## Overview + +Maya Config Pro transforms Blender's interface and workflow to match Maya's familiar paradigm. It includes custom layouts, marking menus, side panels, shelves, hotkeys, and themes designed to make Blender feel like home for Maya users. + +> **Note:** This extension port maintains all original functionality while using the modern Blender Extension format. No file copying to Blender directories is required - everything applies at runtime. + +--- + +## Features + +### Interface Components + +| Feature | Description | Access | +|---------|-------------|--------| +| **ProAni 1.7 Panel** | Main configuration panel with theme switching, subdivision controls, gizmo settings | N-Panel > Maya Config | +| **Sidebar Shelf** | N-panel modeling toolkit with extrude, bevel, bridge, loop tools | N-Panel > Shelf | +| **Dynamic Shelf** | Top shelf with mode switching (Modeling, Edit Poly, Nurbs, Rendering, FX, Animation) | Properties Editor | +| **Animation Shelf** | Rigging and animation tools | Properties Editor | + +### Pie Menus (Marking Menus) + +| Menu | Hotkey | Description | +|------|--------|-------------| +| **Marking Menu** | Right-Click | Maya-style marking menu with create, mode switch, freeze transforms | +| **Quad Menu** | Spacebar | Orthographic views and camera controls | +| **Tab Switcher** | Alt + Right-Click | Workspace switching (Camera, UV, Sculpting, Animation, etc.) | +| **Animation Menu** | Shift + Right-Click (Animation mode) | Animation workflow menu | +| **Special Tools** | Edit Mode context | Edit mode vertex/edge/face tools | + +### Key Features + +- **Maya-Style Navigation:** Alt + LMB/MMB/RMB for tumble, track, dolly +- **Component Selection:** Q=box select, W=move, E=rotate, R=scale +- **Mesh Smooth Preview:** Quick subdivision surface preview with 1-3 iterations +- **Live Symmetry:** Mirror modeling with X/Z axis support +- **Camera Tools 2.0:** Lock camera to view with visual toggle feedback +- **Theme Switching:** Quick theme switching (Maya Blue, Maya Gradient, Modo, Blender Dark, etc.) +- **Object-to-Object Select:** Select objects while remaining in edit mode +- **Extrude Along Axis:** Ctrl + Double Click for fast axis extrusion + +--- + +## Installation + +### As Blender Extension (Recommended) + +This is the new modern way to install Maya Config Pro - no file copying required! + +#### Requirements +- Blender 4.2 LTS or newer + +#### Steps + +1. **Download the Extension** + - Download the MayaConfigPro ZIP file from Gumroad or your purchase location + +2. **Install in Blender** (Blender 4.2+; extension with `blender_manifest.toml`) + - Open Blender + - Go to **`Edit → Preferences → Get Extensions`** + - Use the **top-right `⋯` menu → `Install from Disk`**, *or* **drag the ZIP onto the Preferences window** + - Select the downloaded ZIP (do not extract it first) + - If the list does not update, click **Refresh Local** or restart Blender + +3. **Enable the Extension** + - In **Get Extensions**, search for **Maya Config Pro** (package id: `form_affinity_maya_config_pro`) + - Enable it with the checkbox (same entry may also appear under **Add-ons** after install) + - The ProAni 1.7 panel will appear in the 3D Viewport sidebar + + **If “Install from Disk” under Add-ons seems to do nothing:** use **Get Extensions** as above — that is the path Blender documents for local extension packages. See also `INSTALL.txt` in the release ZIP. + +4. **Configure Preferences** (optional) + - In the add-on preferences, you can enable auto-load for FA keymaps + - Or manually activate the keymap from the keymap preferences + +#### Verification + +After installation, verify these three things are working: + +1. The "ProAni 1.7" panel shows on the left side (N-Panel > Maya Config) +2. Right-click activates the marking menu in the 3D viewport +3. Spacebar activates the Quad View pie menu + +### Legacy Mod Installation + +For older Blender versions (pre-4.2) or if you prefer the original mod approach: + +#### Video Instructions +- **Blender 4.3+ Builds:** https://youtu.be/i7a8HjV9-kk +- **Blender 2.80+ Full Version:** https://youtu.be/eJGliDhBCq8 +- **Mac Catalina:** https://youtu.be/3rphJdNuwJA + +#### Manual Installation Steps + +1. **Locate Blender Directory** + - Windows: `C:\Program Files\Blender Foundation\Blender X.X\X.X\scripts\startup` + - Mac: `/Applications/Blender.app/Contents/Resources/X.X/scripts/startup` + +2. **Copy Scripts** + Copy these files to the `scripts/startup` folder: + - `delete_withoutConfirm.py` + - `fa_hotkeys.py` + - `fa_marking_menu.py` + - `fa_panel_pro.py` + - `fa_panel_sidebar.py` + - `fa_panel_panel.py` + - `fa_quadview.py` + - `fa_special_tools.py` + - `fa_tab_switcher.py` + - `msm_from_object.py` + +3. **Install Themes** + Copy theme files to `scripts/presets/interface_theme/`: + - `maya_blue_theme.xml` + - `maya_theme_gradient.xml` + - `modo_theme.xml` + - `blender_dark.xml` + - `white_bg_theme.xml` + - `sketchup.xml` + +4. **Copy Config** + Copy the `config` folder (containing `startup.blend` and `userpref.blend`) to the Blender version folder. + +5. **Run as Administrator** (Windows Full Version only) + - Right-click `blender.exe` and select "Run as Administrator" for first startup + +6. **Import Keymap** + - In Blender: `Edit > Preferences > Keymap` + - Import `fa_hotkeys.py` + +--- + +## Quick Start + +### Essential Hotkeys + +| Blender Default | Maya Config Pro | Action | +|-----------------|-------------------|--------| +| Left Click | Right Click | Select | +| Right Click | Right Click | Marking Menu (in viewport) | +| Spacebar | Spacebar | Quad Menu | +| T | T | Left Panel Toggle | +| N | N | Right Panel Toggle | +| Ctrl + Tab | Q | Box Select | +| G | W | Move/Translate | +| R | E | Rotate | +| S | R | Scale | +| Alt + Left | Alt + Left | Tumble/Orbit | +| Shift + Middle | Alt + Middle | Track/Pan | +| Ctrl + Middle | Alt + Right | Dolly/Zoom | +| / (numpad) | Alt + E | Isolate Selection | +| . (numpad) | F | Frame Selected | + +### Navigation + +- **Tumble/Orbit:** Alt + Left Mouse Button +- **Track/Pan:** Alt + Middle Mouse Button +- **Dolly/Zoom:** Alt + Right Mouse Button +- **Frame Selected:** F +- **Isolate Selection:** Alt + E + +### Modeling + +- **Box Select:** Q +- **Move:** W +- **Rotate:** E +- **Scale:** R +- **Multi Component:** Shift + Right Click (Marking Menu) +- **Vertex Mode:** Marking Menu > Vertex +- **Edge Mode:** Marking Menu > Edge +- **Face Mode:** Marking Menu > Face + +### Workflow Tips + +1. **Quick Theme Switching:** Use the color buttons in the ProAni panel or Alt + B to cycle themes +2. **Snap to Vertex:** Press V while in pivot adjust mode (D) +3. **Camera Lock:** Use CamTools 2.0 panel to visually toggle camera lock state +4. **Symmetry:** Select object, use X or Z buttons in Modeling Toolkit, then Apply + +--- + +## What's Included + +### Python Scripts +- 15+ operator and panel scripts providing Maya-like functionality +- Mesh select mode switching +- Delete without confirmation +- Object-to-object raycast selection +- Animation timeline tools + +### Themes +- Maya Blue Theme +- Maya Gradient Theme +- Modo Theme +- Blender Dark Theme +- White Background Theme +- Sketchup Theme + +### Keymaps +- Complete Maya-like keymap configuration (153KB of keymap data) +- Industry Compatible keymap option +- Standard Blender keymap option + +### Layouts +- HyperShade workspace +- Camera workspace +- UV Editing workspace +- Modeling workspace +- Animation workspace +- Rendering workspace + +--- + +## Version Compatibility + +| Blender Version | Support Level | Recommended Install | +|-----------------|---------------|---------------------| +| 4.2.x LTS | Full | Extension | +| 4.3.x | Full | Extension | +| 4.4.x | Full | Extension | +| 4.5.x LTS | Full | Extension | +| 5.0.x | Full | Extension | +| 3.0.x - 4.1.x | Legacy Only | Mod Installation | +| 2.83 - 2.93 | Legacy Only | Mod Installation | + +--- + +## Update History + +### Version 1.6 / Extension 1.7.0 +- **Extension Format:** Complete port to modern Blender Extension platform +- **Multi-Version Support:** Compatible with Blender 4.2, 4.5 LTS, and 5.0+ +- **No File Copying:** Everything applies at runtime, no installation directory modifications +- **Safe Registration:** Error handling for all version-specific API differences + +### Version 1.6 (Blender 4.3) +- Ctrl + G to group objects as collections +- Fixed Outliner delete with X/Delete key +- Added cage projection to Mesh Smooth Preview (2 iterations) +- Fixed UI loading via portable folder structure +- Fixed Blender/Industry Standard keymap buttons +- Fixed theme loading from portable folder +- Fixed Pivot Snap (D, D+V, D+G, D+C) + +### Version 2.1 +- Object-to-object select in Edit Mode (no need to exit Edit Mode) +- QuickFavorites moved to Shift + Q +- Alt + E now works in Pose Mode for Isolate Selection +- "Relax Pose to Breakdown" changed to Alt + Shift + E + +### Version 2.0 +- Fixed Nurb Sphere float/int error +- Fixed F2 and Ctrl + F2 for Rename/Batch Rename +- Added Active mesh area to Outliner +- Added Asset Browser integration +- Added Merge by Distance to Marking Menu +- CamTools adjustments + +### Version 1.9 +- New "Edit Poly" shelf with Delta Transfer, Join, Separate +- Quad Menu stays on Orthographic when switching views +- Blender 3.0 compatibility updates +- Alt MMB/RMB for UV editor Pan/Zoom +- Alt + F for Frame Selected (single region) +- Middle Mouse for Move + +### Version 1.8 +- Blender 2.93 compatibility +- Auto-switch to Orthographic from Quad View +- Shift select in Outliner + +### Version 1.7 +- Dynamic stretchy top shelf with dropdown +- Pro Panel widget default button and theme buttons +- CamTools 2.0 with visual toggle feedback +- New pivot features (V for vertex snap in pivot mode) +- Alt + LMB works in Greasepencil Draw mode +- Alt key can be held continuously + +### Version 1.6 +- CamTools 1.0 with Camera View Lock +- Extrude Along Axis (Ctrl + Double Click) +- Modeling Toolkit section in right shelf + +--- + +## FAQ + +### Installation Issues + +**Q: fa_hotkeys.py won't import through the keymap preferences** +**A:** Run Blender as Administrator (right-click blender.exe > Run as Administrator). This is only needed for the first startup on Windows Full Version. + +**Q: Addons won't install through Preferences - they don't show up** +**A:** For ZIP format addons, manual installation may be required. Quit Blender and unpack the addon to: +`C:\Program Files\Blender Foundation\Blender X.X\X.X\scripts\addons` + +### Feature Issues + +**Q: Alt+RMB zoom uses vertical drag (Blender) instead of horizontal (Maya)** +**A:** Activating the **FA Hotkeys** keymap from the Pro panel sets Blender’s zoom drag axis to **horizontal** (Maya-style); activating **Blender** or **Industry Compatible** sets it back to **vertical**. You can still change **Edit > Preferences > Navigation > Zoom > Zoom Axis** yourself if needed. + +**Q: Mesh Smooth Preview gives an error** +**A:** Make sure an object is selected first. + +**Q: Live Symmetry gives strange results** +**A:** Ensure your object faces the Y direction (towards default camera) and all transforms are at zero. + +**Q: Shortcut Equivalence isn't returning hotkey requests** +**A:** Enter shortcuts as single letters (e.g., `r`) or with one space (e.g., `ctrl r`). Don't use CAPS. + +### General Questions + +**Q: How do I access the Discord channel?** +**A:** Join via https://discord.gg/3XsJ8ak (Discord account with verified email required) + +**Q: How do I request a refund?** +**A:** Contact FormAffinity via the email below with your purchase email address. + +--- + +## Support & Contact + +### Community Support +- **Discord:** https://discord.gg/3XsJ8ak +- Post questions, comments, suggestions, bug reports, and recommendations + +### Direct Contact +- **Email:** contactformaffinity@gmail.com +- **Business Inquiries:** contactformaffinity@gmail.com +- **Product Refunds:** Include purchase email address in your request + +### Video Resources +- **Latest Install Video:** https://youtu.be/i7a8HjV9-kk +- **Blender 2.80+ Install:** https://youtu.be/eJGliDhBCq8 +- **Mac Catalina Install:** https://youtu.be/3rphJdNuwJA +- **Youtube Channel:** http://gumroad.com/formaffinity + +--- + +## Credits + +**Created by:** Jesse Doyle | Form Affinity +**Copyright:** 2024 Jesse Doyle + +**Special Thanks:** +- Sven for content support +- ReachMatthews, Nittorious, Way2Close, Natetronn for testing and coding help +- All users for their support and feedback! + +--- + +## License + +This project is licensed under GPL-3.0-or-later as a Blender Extension. + +Original Maya Config Pro is a commercial product by Form Affinity. This extension port maintains compatibility with the original while using the open-source Blender Extension format. + +--- + +*Thank you for using Form Affinity content!* diff --git a/scripts/addons/form_affinity_maya_config_pro/__init__.py b/scripts/addons/form_affinity_maya_config_pro/__init__.py new file mode 100644 index 0000000..3638776 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/__init__.py @@ -0,0 +1,179 @@ +""" +Maya Config Pro - Blender Extension +A Maya-like configuration, shortcuts, and UI elements for Blender. + +Version: 1.7.0 +Author: Form Affinity (Jesse Doyle) +""" + +# Required when Blender installs this folder under scripts/addons (Install from Disk / +# drag-drop). blender_manifest.toml alone is not enough for that legacy path to list/enable +# the add-on; without bl_info the UI shows "Modules Installed ()" and nothing usable registers. +bl_info = { + "name": "Maya Config Pro", + "author": "Form Affinity (Jesse Doyle)", + "version": (1, 7, 0), + "blender": (4, 2, 0), + "location": "View3D > Sidebar > Maya Config", + "description": "Maya-like configuration, shortcuts, UI panels, and keymap presets", + "warning": "", + "doc_url": "https://github.com/FormAffinity/MayaConfigPro", + "category": "3D View", +} + +import bpy +from .utils import compat + +# Must match this add-on's Python package name (e.g. bl_ext.vscode_development.MayaConfigPro), +# not only blender_manifest.toml id — otherwise AddonPreferences.draw never appears. +_ADDON_MODULE = __package__ or "form_affinity_maya_config_pro" + +# Import all submodules +from .panels import ( + panel_pro, + panel_sidebar, + panel_shelf, + panel_animation, +) + +from .ops import ( + marking_menu, + quadview, + tab_switcher, + animation_timeline, + animation_menu, + special_tools, + object_select, + mesh_select_mode, + delete_ops, +) + +from .keyconfigs import fa_hotkeys +from .utils import deploy as deploy_util +from .ops import deploy_ops + +# Addon preferences +class MCP_AddonPreferences(bpy.types.AddonPreferences): + """Maya Config Pro preferences""" + bl_idname = _ADDON_MODULE + + auto_load_keymap: bpy.props.BoolProperty( + name="Auto-load FA Keymap", + description="Automatically load the Maya-like keymap when Blender starts", + default=True + ) + + def draw(self, context): + layout = self.layout + layout.use_property_split = True + layout.use_property_decorate = False + + box = layout.box() + box.label(text="Deploy to user config", icon="EXPORT") + col = box.column(align=False) + + row = col.split(factor=0.55, align=True) + sub = row.row(align=True) + sub.operator( + deploy_ops.MCP_OT_DeployKeymapPresets.bl_idname, + text="Deploy keymap presets", + icon="IMPORT", + ) + sub = row.row(align=True) + if deploy_util.is_keyconfig_deployed(): + sub.label(text="Ready", icon="CHECKMARK") + else: + sub.label(text="Not deployed", icon="ERROR") + + row = col.split(factor=0.55, align=True) + sub = row.row(align=True) + sub.operator( + deploy_ops.MCP_OT_DeployStartupBlend.bl_idname, + text="Deploy startup.blend", + icon="FILE_BLEND", + ) + sub = row.row(align=True) + if deploy_util.is_startup_bundle_available(): + sub.label(text="Bundled file present", icon="INFO") + else: + sub.label(text="None bundled", icon="INFO") + + col.separator() + col.label( + text="Copies Blender's keymaps (and MCP fa_hotkeys) into your Scripts folder, " + "and optional startup.blend into your config. Needed for Pro panel keymap buttons.", + icon="INFO", + ) + + layout.separator() + layout.prop(self, "auto_load_keymap") + + +# List of all classes in this module +classes = ( + MCP_AddonPreferences, +) + +# List of all submodule register functions +submodules = [ + deploy_ops, + panel_pro, + panel_sidebar, + panel_shelf, + panel_animation, + marking_menu, + quadview, + tab_switcher, + animation_timeline, + animation_menu, + special_tools, + object_select, + mesh_select_mode, + delete_ops, + fa_hotkeys, +] + +def register(): + """Register all classes and submodules""" + # Register main classes + for cls in classes: + compat.safe_register_class(cls) + + # Register all submodules + for module in submodules: + try: + module.register() + except Exception as e: + print(f"Warning: Failed to register {module.__name__}: {e}") + + # Register keymaps if auto-load is enabled + prefs = bpy.context.preferences.addons.get(_ADDON_MODULE) + if prefs and prefs.preferences.auto_load_keymap: + try: + fa_hotkeys.register_keymaps() + except Exception as e: + print(f"Warning: Failed to register keymaps: {e}") + + +def unregister(): + """Unregister all classes and submodules""" + # Unregister keymaps first + try: + fa_hotkeys.unregister_keymaps() + except Exception as e: + print(f"Warning: Failed to unregister keymaps: {e}") + + # Unregister all submodules (in reverse order) + for module in reversed(submodules): + try: + module.unregister() + except Exception as e: + print(f"Warning: Failed to unregister {module.__name__}: {e}") + + # Unregister main classes + for cls in reversed(classes): + compat.safe_unregister_class(cls) + + +if __name__ == "__main__": + register() diff --git a/scripts/addons/form_affinity_maya_config_pro/blender_manifest.toml b/scripts/addons/form_affinity_maya_config_pro/blender_manifest.toml new file mode 100644 index 0000000..06c60e0 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/blender_manifest.toml @@ -0,0 +1,30 @@ +schema_version = "1.0.0" + +id = "form_affinity_maya_config_pro" +name = "Maya Config Pro" +tagline = "Maya-like configuration, shortcuts, and UI elements for Blender" +version = "1.7.0" +type = "add-on" + +maintainer = "Form Affinity" +license = ["GPL-3.0-or-later"] +blender_version_min = "4.2.0" + +website = "https://github.com/FormAffinity/MayaConfigPro" + +tags = ["3D View", "User Interface", "Animation", "Keymap", "Presets"] + +[permissions] +files = "Read and write configuration files for theme and keymap presets" + +[build] +paths_exclude_pattern = [ + "__pycache__/", + "*.pyc", + ".git/", + ".github/", + "docs/", + "tests/", + "*.blend1", + "*.blend2", +] diff --git a/scripts/addons/form_affinity_maya_config_pro/fa_hotkeys_text.txt b/scripts/addons/form_affinity_maya_config_pro/fa_hotkeys_text.txt new file mode 100644 index 0000000..4975e0c --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/fa_hotkeys_text.txt @@ -0,0 +1,53 @@ +MAYA CONFIG PRO V 1.9 - HOTKEY LIST +--------------------------- +NAVIGATION +--------------------------- +Q = Box Selection Tool +W = Move (translate) Tool +E = Rotation Tool +R = Scale Tool + +Alt LMB = Rotate View +Alt MMB = Pan View +Alt RMB = Zoom View + +--------------------------- +MENUS (pies, etc) +--------------------------- +RMB = Marking Menu +Space Bar = Quad Menu +Shift RMB = Special Tools Menu +Alt T = Workspace Tab Switcher Menu + +--------------------------- +ARMATURE/POSE MODE +--------------------------- +Ctrl E = Extrude + +--------------------------- +MESH SMOOTH PREVIEW +--------------------------- +1 = Off +2 = Subdivisions set to 2 +3 = Subdivisions set to 3 + +--------------------------- +MODELING +--------------------------- +Ctrl E = Extrude (Along Normals) +G = Create Edge/Face +Alt E = Isolate Select (Local View) +F = Frame Selected +Alt F = Frame Selected (Single Region instead of All Regions, use in Quadview) +Shift .(>) = Select More +Shift .(<) = Select Less + +Hold Down Ctrl while Double LMB Click = Extrude Along Axis Tool + +--------------------------- +ADDITIONAL +--------------------------- +Shift Ctrl RMB = Set 3D Cursor +Ctrl D = Show/Hide 3D Cursor +D = Show/Hide Origin +D then V = Snap Origin to Vertices \ No newline at end of file diff --git a/scripts/addons/form_affinity_maya_config_pro/keyconfigs/__init__.py b/scripts/addons/form_affinity_maya_config_pro/keyconfigs/__init__.py new file mode 100644 index 0000000..aff672c --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/keyconfigs/__init__.py @@ -0,0 +1,4 @@ +""" +Maya Config Pro - Keyconfigs Package +Keymap configuration for Maya-like hotkeys. +""" diff --git a/scripts/addons/form_affinity_maya_config_pro/keyconfigs/fa_hotkeys.py b/scripts/addons/form_affinity_maya_config_pro/keyconfigs/fa_hotkeys.py new file mode 100644 index 0000000..4a96854 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/keyconfigs/fa_hotkeys.py @@ -0,0 +1,108 @@ +""" +Maya Config Pro - Keymap Configuration +Maya-like keymap preset for Blender. + +This module loads and registers the FA Hotkeys keymap configuration. +""" + +import bpy +from ..utils import compat + +# Import the keyconfig data +from . import fa_hotkeys_data + +# Addon keymaps +addon_keymaps = [] + + +def register_keymaps(): + """Register FA Hotkeys as addon keymaps""" + wm = bpy.context.window_manager + kc = wm.keyconfigs.addon + + if not kc: + return + + # Try to load the keyconfig data + try: + # The keyconfig_data is defined in fa_hotkeys_data module + if hasattr(fa_hotkeys_data, 'keyconfig_data'): + for km_name, km_args, km_content in fa_hotkeys_data.keyconfig_data: + # Create or get keymap + km = kc.keymaps.new(name=km_name, **km_args) + + # Add keymap items + if "items" in km_content: + for item in km_content["items"]: + if len(item) >= 2: + idname = item[0] + keymap_item = item[1] + props = item[2] if len(item) > 2 else None + + # Create keymap item + kmi = km.keymap_items.new( + idname, + type=keymap_item.get("type", 'A'), + value=keymap_item.get("value", 'PRESS'), + any=keymap_item.get("any", False), + shift=keymap_item.get("shift", 0), + ctrl=keymap_item.get("ctrl", 0), + alt=keymap_item.get("alt", 0), + oskey=keymap_item.get("oskey", False), + key_modifier=keymap_item.get("key_modifier", 'NONE'), + repeat=keymap_item.get("repeat", False), + head=keymap_item.get("head", False) + ) + + # Set properties if provided + if props and "properties" in props: + for prop_name, prop_value in props["properties"]: + if hasattr(kmi.properties, prop_name): + setattr(kmi.properties, prop_name, prop_value) + + # Handle active state + if props and "active" in props: + kmi.active = props["active"] + + addon_keymaps.append((km, kmi)) + except Exception as e: + print(f"Maya Config Pro: Could not register keymaps: {e}") + + +def unregister_keymaps(): + """Unregister FA Hotkeys addon keymaps""" + wm = bpy.context.window_manager + kc = wm.keyconfigs.addon + + if not kc: + return + + # Remove all registered keymap items + for km, kmi in addon_keymaps: + try: + km.keymap_items.remove(kmi) + except Exception: + pass + + addon_keymaps.clear() + + +# Classes to register (none needed for keyconfig) +_classes = [] + + +def register(): + """Register keymap module""" + for cls in _classes: + compat.safe_register_class(cls) + + # Don't auto-register keymaps here - let preferences control this + # register_keymaps() + + +def unregister(): + """Unregister keymap module""" + unregister_keymaps() + + for cls in reversed(_classes): + compat.safe_unregister_class(cls) diff --git a/scripts/addons/form_affinity_maya_config_pro/keyconfigs/fa_hotkeys_data.py b/scripts/addons/form_affinity_maya_config_pro/keyconfigs/fa_hotkeys_data.py new file mode 100644 index 0000000..7789fe7 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/keyconfigs/fa_hotkeys_data.py @@ -0,0 +1,5509 @@ +keyconfig_version = (5, 0, 120) +keyconfig_data = \ +[("3D View", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": + [("view3d.cursor3d", {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None), + ("transform.translate", + {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG', "shift": True}, + {"properties": + [("cursor_transform", True), + ("release_confirm", True), + ], + "active":False, + }, + ), + ("view3d.localview", {"type": 'NUMPAD_SLASH', "value": 'PRESS', "repeat": True}, None), + ("view3d.localview", {"type": 'E', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("view3d.localview_remove_from", {"type": 'M', "value": 'PRESS', "repeat": True}, None), + ("view3d.move", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "alt": True}, None), + ("view3d.zoom", {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True}, None), + ("view3d.dolly", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None), + ("view3d.view_selected", + {"type": 'F', "value": 'PRESS', "repeat": True}, + {"properties": + [("use_all_regions", True), + ], + }, + ), + ("view3d.view_selected", + {"type": 'F', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("use_all_regions", False), + ], + }, + ), + ("view3d.smoothview", {"type": 'TIMER1', "value": 'ANY', "any": True}, None), + ("view3d.move", {"type": 'TRACKPADPAN', "value": 'ANY', "shift": True}, None), + ("view3d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None), + ("view3d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None), + ("view3d.zoom", + {"type": 'NUMPAD_PLUS', "value": 'PRESS', "repeat": True}, + {"properties": + [("delta", 1), + ], + }, + ), + ("view3d.zoom", + {"type": 'NUMPAD_MINUS', "value": 'PRESS', "repeat": True}, + {"properties": + [("delta", -1), + ], + }, + ), + ("view3d.zoom", + {"type": 'EQUAL', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("delta", 1), + ], + }, + ), + ("view3d.zoom", + {"type": 'MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("delta", -1), + ], + }, + ), + ("view3d.zoom", + {"type": 'WHEELINMOUSE', "value": 'PRESS'}, + {"properties": + [("delta", 1), + ], + }, + ), + ("view3d.zoom", + {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, + {"properties": + [("delta", -1), + ], + }, + ), + ("view3d.dolly", + {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("delta", 1), + ], + }, + ), + ("view3d.dolly", + {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("delta", -1), + ], + }, + ), + ("view3d.dolly", + {"type": 'EQUAL', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("delta", 1), + ], + }, + ), + ("view3d.dolly", + {"type": 'MINUS', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("delta", -1), + ], + }, + ), + ("view3d.view_center_camera", {"type": 'HOME', "value": 'PRESS', "repeat": True}, None), + ("view3d.view_center_lock", {"type": 'HOME', "value": 'PRESS', "repeat": True}, None), + ("view3d.view_all", + {"type": 'HOME', "value": 'PRESS', "repeat": True}, + {"properties": + [("center", False), + ], + }, + ), + ("view3d.view_all", + {"type": 'HOME', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("use_all_regions", True), + ("center", False), + ], + }, + ), + ("view3d.view_all", + {"type": 'C', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("center", True), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'ACCENT_GRAVE', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_view_pie'), + ], + }, + ), + ("view3d.navigate", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("view3d.view_camera", {"type": 'NUMPAD_0', "value": 'PRESS', "repeat": True}, None), + ("view3d.view_axis", + {"type": 'NUMPAD_1', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'FRONT'), + ], + }, + ), + ("view3d.view_orbit", + {"type": 'NUMPAD_2', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'ORBITDOWN'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_3', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'RIGHT'), + ], + }, + ), + ("view3d.view_orbit", + {"type": 'NUMPAD_4', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'ORBITLEFT'), + ], + }, + ), + ("view3d.view_persportho", {"type": 'NUMPAD_5', "value": 'PRESS', "repeat": True}, None), + ("view3d.view_orbit", + {"type": 'NUMPAD_6', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'ORBITRIGHT'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_7', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'TOP'), + ], + }, + ), + ("view3d.view_orbit", + {"type": 'NUMPAD_8', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'ORBITUP'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_1', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("type", 'BACK'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_3', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("type", 'LEFT'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_7', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("type", 'BOTTOM'), + ], + }, + ), + ("view3d.view_pan", + {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("type", 'PANDOWN'), + ], + }, + ), + ("view3d.view_pan", + {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("type", 'PANLEFT'), + ], + }, + ), + ("view3d.view_pan", + {"type": 'NUMPAD_6', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("type", 'PANRIGHT'), + ], + }, + ), + ("view3d.view_pan", + {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("type", 'PANUP'), + ], + }, + ), + ("view3d.view_roll", + {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("type", 'LEFT'), + ], + }, + ), + ("view3d.view_roll", + {"type": 'NUMPAD_6', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("type", 'RIGHT'), + ], + }, + ), + ("view3d.view_orbit", + {"type": 'NUMPAD_9', "value": 'PRESS', "repeat": True}, + {"properties": + [("angle", 3.1415927), + ("type", 'ORBITRIGHT'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_1', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("type", 'FRONT'), + ("align_active", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_3', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("type", 'RIGHT'), + ("align_active", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_7', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("type", 'TOP'), + ("align_active", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_1', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("type", 'BACK'), + ("align_active", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_3', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("type", 'LEFT'), + ("align_active", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_7', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("type", 'BOTTOM'), + ("align_active", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "alt": True, "direction": 'NORTH'}, + {"properties": + [("type", 'TOP'), + ("relative", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "alt": True, "direction": 'SOUTH'}, + {"properties": + [("type", 'BOTTOM'), + ("relative", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "alt": True, "direction": 'EAST'}, + {"properties": + [("type", 'RIGHT'), + ("relative", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "alt": True, "direction": 'WEST'}, + {"properties": + [("type", 'LEFT'), + ("relative", True), + ], + }, + ), + ("view3d.view_center_pick", {"type": 'MIDDLEMOUSE', "value": 'CLICK', "alt": True}, None), + ("view3d.ndof_orbit_zoom", {"type": 'NDOF_MOTION', "value": 'ANY'}, None), + ("view3d.ndof_orbit", {"type": 'NDOF_MOTION', "value": 'ANY', "ctrl": True}, None), + ("view3d.ndof_pan", {"type": 'NDOF_MOTION', "value": 'ANY', "shift": True}, None), + ("view3d.ndof_all", {"type": 'NDOF_MOTION', "value": 'ANY', "shift": True, "ctrl": True}, None), + ("view3d.view_roll", + {"type": 'NDOF_BUTTON_ROLL_CCW', "value": 'PRESS'}, + {"properties": + [("type", 'LEFT'), + ], + }, + ), + ("view3d.view_roll", + {"type": 'NDOF_BUTTON_ROLL_CCW', "value": 'PRESS'}, + {"properties": + [("type", 'RIGHT'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NDOF_BUTTON_FRONT', "value": 'PRESS'}, + {"properties": + [("type", 'FRONT'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NDOF_BUTTON_BACK', "value": 'PRESS'}, + {"properties": + [("type", 'BACK'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NDOF_BUTTON_LEFT', "value": 'PRESS'}, + {"properties": + [("type", 'LEFT'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NDOF_BUTTON_RIGHT', "value": 'PRESS'}, + {"properties": + [("type", 'RIGHT'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NDOF_BUTTON_TOP', "value": 'PRESS'}, + {"properties": + [("type", 'TOP'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NDOF_BUTTON_BOTTOM', "value": 'PRESS'}, + {"properties": + [("type", 'BOTTOM'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NDOF_BUTTON_FRONT', "value": 'PRESS', "shift": True}, + {"properties": + [("type", 'FRONT'), + ("align_active", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NDOF_BUTTON_RIGHT', "value": 'PRESS', "shift": True}, + {"properties": + [("type", 'RIGHT'), + ("align_active", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NDOF_BUTTON_TOP', "value": 'PRESS', "shift": True}, + {"properties": + [("type", 'TOP'), + ("align_active", True), + ], + }, + ), + ("view3d.select", + {"type": 'LEFTMOUSE', "value": 'CLICK'}, + {"properties": + [("deselect_all", True), + ], + }, + ), + ("view3d.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True}, + {"properties": + [("toggle", True), + ], + }, + ), + ("view3d.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, + {"properties": + [("center", True), + ("object", True), + ], + }, + ), + ("view3d.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "alt": True}, + {"properties": + [("enumerate", True), + ], + "active":False, + }, + ), + ("view3d.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True}, + {"properties": + [("extend", True), + ("toggle", True), + ("center", True), + ], + }, + ), + ("view3d.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True, "alt": True}, + {"properties": + [("center", True), + ("enumerate", True), + ], + }, + ), + ("view3d.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "alt": True}, + {"properties": + [("toggle", True), + ("enumerate", True), + ], + }, + ), + ("view3d.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True, "alt": True}, + {"properties": + [("toggle", True), + ("center", True), + ("enumerate", True), + ], + }, + ), + ("view3d.select_box", {"type": 'B', "value": 'PRESS', "repeat": True}, None), + ("view3d.select_lasso", + {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("view3d.select_lasso", + {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("view3d.select_circle", {"type": 'C', "value": 'PRESS', "repeat": True}, None), + ("view3d.zoom_border", {"type": 'B', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("view3d.render_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("view3d.clear_render_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, None), + ("view3d.camera_to_view", {"type": 'NUMPAD_0', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, None), + ("view3d.object_as_camera", {"type": 'NUMPAD_0', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("view3d.copybuffer", {"type": 'C', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("view3d.pastebuffer", {"type": 'V', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.call_menu_pie", + {"type": 'S', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_snap_pie'), + ], + }, + ), + ("transform.translate", + {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, + { "active":False, + }, + ), + ("transform.rotate", + {"type": 'R', "value": 'PRESS', "repeat": True}, + { "active":False, + }, + ), + ("transform.resize", + {"type": 'S', "value": 'PRESS', "repeat": True}, + { "active":False, + }, + ), + ("transform.bend", {"type": 'W', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("transform.tosphere", {"type": 'S', "value": 'PRESS', "shift": True, "alt": True, "repeat": True}, None), + ("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True, "repeat": True}, None), + ("transform.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.context_toggle", + {"type": 'TAB', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("data_path", 'tool_settings.use_snap'), + ], + }, + ), + ("wm.call_panel", + {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_PT_snapping'), + ("keep_open", False), + ], + }, + ), + ("object.transform_axis_target", {"type": 'T', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("transform.skin_resize", {"type": 'A', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.context_toggle", + {"type": 'ACCENT_GRAVE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("data_path", 'space_data.show_gizmo_tool'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'PERIOD', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_pivot_pie'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'COMMA', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_orientations_pie'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'ACCENT_GRAVE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("data_path", 'space_data.show_gizmo_tool'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'Z', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_shading_pie'), + ], + }, + ), + ("view3d.toggle_shading", + {"type": 'Z', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("type", 'WIREFRAME'), + ], + }, + ), + ("view3d.toggle_xray", {"type": 'Z', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("wm.context_toggle", + {"type": 'Z', "value": 'PRESS', "shift": True, "alt": True, "repeat": True}, + {"properties": + [("data_path", 'space_data.overlay.show_overlays'), + ], + }, + ), + ("wm.tool_set_by_name", + {"type": 'W', "value": 'PRESS', "repeat": True}, + { "active":False, + }, + ), + ("wm.call_menu_pie", + {"type": 'RIGHTMOUSE', "value": 'PRESS'}, + {"properties": + [("name", 'MCP_MT_MarkingMenu'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'SPACE', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'MCP_MT_QuadMenu'), + ], + }, + ), + ("view3d.rotate", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, None), + ("wm.call_menu_pie", + {"type": 'T', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("name", 'MCP_MT_TabSwitcher'), + ], + }, + ), + ("view3d.zoom", + {"type": 'WHEELINMOUSE', "value": 'PRESS', "alt": True}, + {"properties": + [("delta", 1), + ], + }, + ), + ("view3d.zoom", + {"type": 'WHEELOUTMOUSE', "value": 'PRESS', "alt": True}, + {"properties": + [("delta", -1), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'MCP_MT_AnimationMenu'), + ], + }, + ), + ("view3d.modal_operator_raycast", {"type": 'MIDDLEMOUSE', "value": 'RELEASE'}, None), + ("anim.keyframe_insert_by_name", + {"type": 'W', "value": 'PRESS', "shift": True}, + {"properties": + [("type", 'Location'), + ], + }, + ), + ("anim.keyframe_insert_by_name", + {"type": 'E', "value": 'PRESS', "shift": True}, + {"properties": + [("type", 'Rotation'), + ], + }, + ), + ("anim.keyframe_insert_by_name", + {"type": 'R', "value": 'PRESS', "shift": True}, + {"properties": + [("type", 'Scaling'), + ], + }, + ), + ], + }, + ), + ("3D View Tool: Edit Mesh, Knife", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": + [("mesh.knife_tool", + {"type": 'LEFTMOUSE', "value": 'PRESS'}, + {"properties": + [("use_occlude_geometry", True), + ("wait_for_input", True), + ], + }, + ), + ], + }, + ), + ("3D View Tool: Move", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": + [("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("ymax", 0), + ("wait_for_input", True), + ], + }, + ), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'XOR'), + ], + }, + ), + ], + }, + ), + ("3D View Tool: Rotate", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": + [("view3d.select_box", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'XOR'), + ], + }, + ), + ], + }, + ), + ("3D View Tool: Scale", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": + [("view3d.select_box", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'XOR'), + ], + }, + ), + ], + }, + ), + ("3D View Tool: Select Box", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": + [("view3d.select_box", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'XOR'), + ], + }, + ), + ], + }, + ), + ("Armature", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("armature.hide", + {"type": 'H', "value": 'PRESS', "repeat": True}, + {"properties": + [("unselected", False), + ], + }, + ), + ("armature.hide", + {"type": 'H', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("unselected", True), + ], + }, + ), + ("armature.reveal", {"type": 'H', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("armature.align", {"type": 'A', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, None), + ("armature.calculate_roll", {"type": 'N', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("armature.roll_clear", {"type": 'R', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("armature.switch_direction", {"type": 'F', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("armature.bone_primitive_add", {"type": 'A', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("armature.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("armature.parent_clear", {"type": 'P', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("armature.select_all", + {"type": 'A', "value": 'PRESS', "repeat": True}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("armature.select_all", + {"type": 'A', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("armature.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("armature.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("armature.select_mirror", + {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("extend", False), + ], + }, + ), + ("armature.select_hierarchy", + {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'PARENT'), + ("extend", False), + ], + }, + ), + ("armature.select_hierarchy", + {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'PARENT'), + ("extend", True), + ], + }, + ), + ("armature.select_hierarchy", + {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'CHILD'), + ("extend", False), + ], + }, + ), + ("armature.select_hierarchy", + {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'CHILD'), + ("extend", True), + ], + }, + ), + ("armature.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("armature.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("armature.select_similar", {"type": 'G', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("armature.select_linked", {"type": 'L', "value": 'PRESS', "repeat": True}, None), + ("armature.select_linked", {"type": 'L', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("armature.shortest_path_pick", {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("wm.call_menu", + {"type": 'X', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_armature_delete'), + ], + }, + ), + ("wm.call_menu", + {"type": 'DEL', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_armature_delete'), + ], + }, + ), + ("armature.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("armature.dissolve", {"type": 'X', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("armature.dissolve", {"type": 'DEL', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("armature.extrude_move", {"type": 'E', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("armature.extrude_forked", {"type": 'E', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("armature.click_extrude", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, None), + ("armature.fill", {"type": 'F', "value": 'PRESS', "repeat": True}, None), + ("armature.merge", {"type": 'M', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("armature.split", {"type": 'Y', "value": 'PRESS', "repeat": True}, None), + ("armature.separate", {"type": 'P', "value": 'PRESS', "repeat": True}, None), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_bone_options_toggle'), + ], + }, + ), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_bone_options_enable'), + ], + }, + ), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_bone_options_disable'), + ], + }, + ), + ("armature.layers_show_all", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("armature.armature_layers", {"type": 'M', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("armature.bone_layers", {"type": 'M', "value": 'PRESS', "repeat": True}, None), + ("transform.transform", + {"type": 'S', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, + {"properties": + [("mode", 'BONE_SIZE'), + ], + }, + ), + ("transform.transform", + {"type": 'S', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("mode", 'BONE_ENVELOPE'), + ], + }, + ), + ("transform.transform", + {"type": 'R', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("mode", 'BONE_ROLL'), + ], + }, + ), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_armature_context_menu'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'E', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.rotate'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.move'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'R', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.scale'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'Q', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.select_box'), + ], + }, + ), + ], + }, + ), + ("Curve", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("wm.call_menu", + {"type": 'A', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'TOPBAR_MT_edit_curve_add'), + ], + }, + ), + ("curve.handle_type_set", {"type": 'V', "value": 'PRESS', "repeat": True}, None), + ("curve.vertex_add", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, None), + ("curve.select_all", + {"type": 'A', "value": 'PRESS', "repeat": True}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("curve.select_all", + {"type": 'A', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("curve.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("curve.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("curve.select_row", {"type": 'R', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("curve.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("curve.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("curve.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("curve.select_similar", {"type": 'G', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("curve.select_linked_pick", + {"type": 'L', "value": 'PRESS', "repeat": True}, + {"properties": + [("deselect", False), + ], + }, + ), + ("curve.select_linked_pick", + {"type": 'L', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("deselect", True), + ], + }, + ), + ("curve.shortest_path_pick", {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("curve.separate", {"type": 'P', "value": 'PRESS', "repeat": True}, None), + ("curve.split", {"type": 'Y', "value": 'PRESS', "repeat": True}, None), + ("curve.extrude_move", {"type": 'E', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("curve.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("curve.make_segment", + {"type": 'F', "value": 'PRESS', "repeat": True}, + { "active":False, + }, + ), + ("curve.cyclic_toggle", {"type": 'C', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'X', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_curve_delete'), + ], + }, + ), + ("wm.call_menu", + {"type": 'DEL', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_curve_delete'), + ], + }, + ), + ("curve.dissolve_verts", {"type": 'X', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("curve.dissolve_verts", {"type": 'DEL', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("curve.tilt_clear", {"type": 'T', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("transform.tilt", {"type": 'T', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("transform.transform", + {"type": 'S', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("mode", 'CURVE_SHRINKFATTEN'), + ], + }, + ), + ("curve.reveal", {"type": 'H', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("curve.hide", + {"type": 'H', "value": 'PRESS', "repeat": True}, + {"properties": + [("unselected", False), + ], + }, + ), + ("curve.hide", + {"type": 'H', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("unselected", True), + ], + }, + ), + ("curve.normals_make_consistent", {"type": 'N', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("object.vertex_parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'H', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_hook'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'O', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_proportional_editing_falloff_pie'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'O', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'tool_settings.use_proportional_edit'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'O', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("data_path", 'tool_settings.use_proportional_connected'), + ], + }, + ), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_curve_context_menu'), + ], + }, + ), + ("wm.call_menu", + {"type": 'APP', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_curve_context_menu'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.move'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'Q', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.select_box'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'E', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.rotate'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'R', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.scale'), + ], + }, + ), + ], + }, + ), + ("Dopesheet", + {"space_type": 'DOPESHEET_EDITOR', "region_type": 'WINDOW'}, + {"items": + [("action.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS'}, + {"properties": + [("extend", False), + ("deselect_all", True), + ("column", False), + ("channel", False), + ], + }, + ), + ("action.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, + {"properties": + [("extend", False), + ("column", True), + ("channel", False), + ], + }, + ), + ("action.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": + [("extend", True), + ("column", False), + ("channel", False), + ], + }, + ), + ("action.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": + [("extend", True), + ("column", True), + ("channel", False), + ], + }, + ), + ("action.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True}, + {"properties": + [("extend", False), + ("column", False), + ("channel", True), + ], + }, + ), + ("action.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, + {"properties": + [("extend", True), + ("column", False), + ("channel", True), + ], + }, + ), + ("action.select_leftright", + {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, + {"properties": + [("mode", 'CHECK'), + ("extend", False), + ], + }, + ), + ("action.select_leftright", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'CHECK'), + ("extend", True), + ], + }, + ), + ("action.select_leftright", + {"type": 'LEFT_BRACKET', "value": 'PRESS'}, + {"properties": + [("mode", 'LEFT'), + ("extend", False), + ], + }, + ), + ("action.select_leftright", + {"type": 'RIGHT_BRACKET', "value": 'PRESS'}, + {"properties": + [("mode", 'RIGHT'), + ("extend", False), + ], + }, + ), + ("action.select_all", + {"type": 'A', "value": 'PRESS'}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("action.select_all", + {"type": 'A', "value": 'PRESS', "alt": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("action.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("action.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("action.select_box", + {"type": 'B', "value": 'PRESS'}, + {"properties": + [("axis_range", False), + ], + }, + ), + ("action.select_box", + {"type": 'B', "value": 'PRESS', "alt": True}, + {"properties": + [("axis_range", True), + ], + }, + ), + ("action.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("mode", 'SET'), + ("tweak", True), + ], + }, + ), + ("action.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, + {"properties": + [("mode", 'ADD'), + ("tweak", True), + ], + }, + ), + ("action.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("mode", 'SUB'), + ("tweak", True), + ], + }, + ), + ("action.select_lasso", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("action.select_lasso", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("action.select_circle", {"type": 'C', "value": 'PRESS'}, None), + ("action.select_column", + {"type": 'K', "value": 'PRESS'}, + {"properties": + [("mode", 'KEYS'), + ], + }, + ), + ("action.select_column", + {"type": 'K', "value": 'PRESS', "ctrl": True}, + {"properties": + [("mode", 'CFRA'), + ], + }, + ), + ("action.select_column", + {"type": 'K', "value": 'PRESS', "shift": True}, + {"properties": + [("mode", 'MARKERS_COLUMN'), + ], + }, + ), + ("action.select_column", + {"type": 'K', "value": 'PRESS', "alt": True}, + {"properties": + [("mode", 'MARKERS_BETWEEN'), + ], + }, + ), + ("action.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("action.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("action.select_linked", {"type": 'L', "value": 'PRESS'}, None), + ("action.frame_jump", {"type": 'G', "value": 'PRESS', "ctrl": True}, None), + ("wm.call_menu_pie", + {"type": 'S', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'DOPESHEET_MT_snap_pie'), + ], + }, + ), + ("action.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None), + ("action.handle_type", {"type": 'V', "value": 'PRESS'}, None), + ("action.interpolation_type", {"type": 'T', "value": 'PRESS'}, None), + ("action.extrapolation_type", {"type": 'E', "value": 'PRESS', "shift": True}, None), + ("action.easing_type", {"type": 'E', "value": 'PRESS', "ctrl": True}, None), + ("action.keyframe_type", {"type": 'R', "value": 'PRESS'}, None), + ("action.sample", {"type": 'O', "value": 'PRESS', "shift": True, "alt": True}, None), + ("wm.call_menu", + {"type": 'X', "value": 'PRESS'}, + {"properties": + [("name", 'DOPESHEET_MT_delete'), + ], + }, + ), + ("action.delete", + {"type": 'DEL', "value": 'PRESS'}, + {"properties": + [("confirm", False), + ], + }, + ), + ("action.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None), + ("action.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None), + ("action.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), + ("action.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), + ("action.paste", + {"type": 'V', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": + [("flipped", True), + ], + }, + ), + ("action.previewrange_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None), + ("action.view_all", {"type": 'HOME', "value": 'PRESS'}, None), + ("action.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None), + ("action.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None), + ("action.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None), + ("wm.call_menu_pie", + {"type": 'ACCENT_GRAVE', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'DOPESHEET_MT_view_pie'), + ], + }, + ), + ("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None), + ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None), + ("transform.transform", + {"type": 'G', "value": 'PRESS'}, + {"properties": + [("mode", 'TIME_TRANSLATE'), + ], + }, + ), + ("transform.transform", + {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("mode", 'TIME_TRANSLATE'), + ], + }, + ), + ("transform.transform", + {"type": 'E', "value": 'PRESS'}, + {"properties": + [("mode", 'TIME_EXTEND'), + ], + }, + ), + ("transform.transform", + {"type": 'S', "value": 'PRESS'}, + {"properties": + [("mode", 'TIME_SCALE'), + ], + }, + ), + ("transform.transform", + {"type": 'T', "value": 'PRESS', "shift": True}, + {"properties": + [("mode", 'TIME_SLIDE'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'O', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'VIEW3D_MT_proportional_editing_falloff_pie'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'O', "value": 'PRESS'}, + {"properties": + [("data_path", 'tool_settings.use_proportional_action'), + ], + }, + ), + ("marker.add", {"type": 'M', "value": 'PRESS'}, None), + ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None), + ("marker.camera_bind", {"type": 'B', "value": 'PRESS', "ctrl": True}, None), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS'}, + {"properties": + [("name", 'DOPESHEET_MT_context_menu'), + ], + }, + ), + ("wm.call_menu", + {"type": 'APP', "value": 'PRESS'}, + {"properties": + [("name", 'DOPESHEET_MT_context_menu'), + ], + }, + ), + ("anim.change_frame", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None), + ("action.duplicate_move", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None), + ("action.keymove", + {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, + { "active":False, + }, + ), + ], + }, + ), + ("Frames", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("screen.frame_offset", + {"type": 'LEFT_ARROW', "value": 'PRESS', "repeat": True}, + {"properties": + [("delta", -1), + ], + }, + ), + ("screen.frame_offset", + {"type": 'RIGHT_ARROW', "value": 'PRESS', "repeat": True}, + {"properties": + [("delta", 1), + ], + }, + ), + ("screen.frame_jump", + {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("end", True), + ], + }, + ), + ("screen.frame_jump", + {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("end", False), + ], + }, + ), + ("screen.keyframe_jump", + {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, + {"properties": + [("next", True), + ], + }, + ), + ("screen.keyframe_jump", + {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, + {"properties": + [("next", False), + ], + }, + ), + ("screen.keyframe_jump", + {"type": 'MEDIA_LAST', "value": 'PRESS', "repeat": True}, + {"properties": + [("next", True), + ], + }, + ), + ("screen.keyframe_jump", + {"type": 'MEDIA_FIRST', "value": 'PRESS', "repeat": True}, + {"properties": + [("next", False), + ], + }, + ), + ("screen.animation_play", {"type": 'V', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("screen.animation_play", + {"type": 'SPACE', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("reverse", True), + ], + }, + ), + ("screen.animation_cancel", {"type": 'ESC', "value": 'PRESS', "repeat": True}, None), + ("screen.animation_play", {"type": 'MEDIA_PLAY', "value": 'PRESS', "repeat": True}, None), + ("screen.animation_cancel", {"type": 'MEDIA_STOP', "value": 'PRESS', "repeat": True}, None), + ], + }, + ), + ("Graph Editor", + {"space_type": 'GRAPH_EDITOR', "region_type": 'WINDOW'}, + {"items": + [("wm.context_toggle", + {"type": 'H', "value": 'PRESS', "ctrl": True}, + {"properties": + [("data_path", 'space_data.show_handles'), + ], + }, + ), + ("graph.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS'}, + {"properties": + [("extend", False), + ("deselect_all", True), + ("column", False), + ("curves", False), + ], + }, + ), + ("graph.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, + {"properties": + [("extend", False), + ("column", True), + ("curves", False), + ], + }, + ), + ("graph.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": + [("extend", True), + ("column", False), + ("curves", False), + ], + }, + ), + ("graph.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": + [("extend", True), + ("column", True), + ("curves", False), + ], + }, + ), + ("graph.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True}, + {"properties": + [("extend", False), + ("column", False), + ("curves", True), + ], + }, + ), + ("graph.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, + {"properties": + [("extend", True), + ("column", False), + ("curves", True), + ], + }, + ), + ("graph.select_leftright", + {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, + {"properties": + [("mode", 'CHECK'), + ("extend", False), + ], + }, + ), + ("graph.select_leftright", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'CHECK'), + ("extend", True), + ], + }, + ), + ("graph.select_leftright", + {"type": 'LEFT_BRACKET', "value": 'PRESS'}, + {"properties": + [("mode", 'LEFT'), + ("extend", False), + ], + }, + ), + ("graph.select_leftright", + {"type": 'RIGHT_BRACKET', "value": 'PRESS'}, + {"properties": + [("mode", 'RIGHT'), + ("extend", False), + ], + }, + ), + ("graph.select_all", + {"type": 'A', "value": 'PRESS'}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("graph.select_all", + {"type": 'A', "value": 'PRESS', "alt": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("graph.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("graph.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("graph.select_box", {"type": 'B', "value": 'PRESS'}, None), + ("graph.select_box", + {"type": 'B', "value": 'PRESS', "alt": True}, + {"properties": + [("axis_range", True), + ], + }, + ), + ("graph.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("axis_range", False), + ("tweak", True), + ("mode", 'SET'), + ], + }, + ), + ("graph.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, + {"properties": + [("tweak", True), + ("mode", 'ADD'), + ], + }, + ), + ("graph.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("tweak", True), + ("mode", 'SUB'), + ], + }, + ), + ("graph.select_lasso", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("graph.select_lasso", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("graph.select_circle", {"type": 'C', "value": 'PRESS'}, None), + ("graph.select_column", + {"type": 'K', "value": 'PRESS'}, + {"properties": + [("mode", 'KEYS'), + ], + }, + ), + ("graph.select_column", + {"type": 'K', "value": 'PRESS', "ctrl": True}, + {"properties": + [("mode", 'CFRA'), + ], + }, + ), + ("graph.select_column", + {"type": 'K', "value": 'PRESS', "shift": True}, + {"properties": + [("mode", 'MARKERS_COLUMN'), + ], + }, + ), + ("graph.select_column", + {"type": 'K', "value": 'PRESS', "alt": True}, + {"properties": + [("mode", 'MARKERS_BETWEEN'), + ], + }, + ), + ("graph.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("graph.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("graph.select_linked", {"type": 'L', "value": 'PRESS'}, None), + ("graph.frame_jump", {"type": 'G', "value": 'PRESS', "ctrl": True}, None), + ("wm.call_menu_pie", + {"type": 'S', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'GRAPH_MT_snap_pie'), + ], + }, + ), + ("graph.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None), + ("graph.handle_type", {"type": 'V', "value": 'PRESS'}, None), + ("graph.interpolation_type", {"type": 'T', "value": 'PRESS'}, None), + ("graph.easing_type", {"type": 'E', "value": 'PRESS', "ctrl": True}, None), + ("graph.smooth", {"type": 'O', "value": 'PRESS', "alt": True}, None), + ("graph.sample", {"type": 'O', "value": 'PRESS', "shift": True, "alt": True}, None), + ("graph.bake", {"type": 'C', "value": 'PRESS', "alt": True}, None), + ("wm.call_menu", + {"type": 'X', "value": 'PRESS'}, + {"properties": + [("name", 'GRAPH_MT_delete'), + ], + }, + ), + ("graph.delete", + {"type": 'DEL', "value": 'PRESS'}, + {"properties": + [("confirm", False), + ], + }, + ), + ("graph.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None), + ("graph.keyframe_insert", {"type": 'I', "value": 'PRESS', "alt": True}, None), + ("graph.click_insert", + {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, + {"properties": + [("extend", False), + ], + }, + ), + ("graph.click_insert", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True}, + {"properties": + [("extend", True), + ], + }, + ), + ("graph.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), + ("graph.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), + ("graph.paste", + {"type": 'V', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": + [("flipped", True), + ], + }, + ), + ("graph.previewrange_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None), + ("graph.view_all", {"type": 'HOME', "value": 'PRESS'}, None), + ("graph.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None), + ("graph.view_selected", {"type": 'F', "value": 'PRESS'}, None), + ("graph.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None), + ("wm.call_menu_pie", + {"type": 'ACCENT_GRAVE', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'GRAPH_MT_view_pie'), + ], + }, + ), + ("graph.fmodifier_add", + {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": + [("only_active", False), + ], + }, + ), + ("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None), + ("transform.translate", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG'}, None), + ("transform.transform", + {"type": 'W', "value": 'PRESS'}, + {"properties": + [("mode", 'TIME_EXTEND'), + ], + }, + ), + ("graph.keyframe_insert", {"type": 'S', "value": 'PRESS'}, None), + ("wm.call_menu_pie", + {"type": 'O', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'VIEW3D_MT_proportional_editing_falloff_pie'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'O', "value": 'PRESS'}, + {"properties": + [("data_path", 'tool_settings.use_proportional_fcurve'), + ], + }, + ), + ("marker.add", {"type": 'M', "value": 'PRESS'}, None), + ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None), + ("wm.call_menu", + {"type": 'RIGHTMOUSE', "value": 'PRESS'}, + {"properties": + [("name", 'GRAPH_MT_context_menu'), + ], + }, + ), + ("wm.call_menu", + {"type": 'APP', "value": 'PRESS'}, + {"properties": + [("name", 'GRAPH_MT_context_menu'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'PERIOD', "value": 'PRESS'}, + {"properties": + [("name", 'GRAPH_MT_pivot_pie'), + ], + }, + ), + ("graph.cursor_set", {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("graph.keyframe_insert", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "alt": True}, None), + ("anim.keyframe_insert_by_name", + {"type": 'E', "value": 'PRESS', "shift": True}, + {"properties": + [("type", 'Rotation'), + ], + }, + ), + ("anim.keyframe_insert_by_name", + {"type": 'W', "value": 'PRESS', "shift": True}, + {"properties": + [("type", 'Location'), + ], + }, + ), + ("anim.keyframe_insert_by_name", + {"type": 'R', "value": 'PRESS', "shift": True}, + {"properties": + [("type", 'Scaling'), + ], + }, + ), + ("transform.rotate", {"type": 'E', "value": 'PRESS'}, None), + ], + }, + ), + ("Grease Pencil Stroke Paint (Draw brush)", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, None), + ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True}, None), + ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("gpencil.draw", {"type": 'O', "value": 'PRESS'}, None), + ("gpencil.draw", {"type": 'J', "value": 'PRESS'}, None), + ("gpencil.draw", {"type": 'J', "value": 'PRESS', "alt": True}, None), + ("gpencil.draw", {"type": 'J', "value": 'PRESS', "shift": True}, None), + ("gpencil.draw", {"type": 'K', "value": 'PRESS'}, None), + ("gpencil.draw", {"type": 'K', "value": 'PRESS', "alt": True}, None), + ("gpencil.draw", {"type": 'K', "value": 'PRESS', "shift": True}, None), + ("gpencil.draw", {"type": 'L', "value": 'PRESS'}, None), + ("gpencil.draw", {"type": 'L', "value": 'PRESS', "alt": True}, None), + ("gpencil.draw", {"type": 'L', "value": 'PRESS', "ctrl": True}, None), + ("gpencil.draw", {"type": 'V', "value": 'PRESS'}, None), + ("gpencil.draw", {"type": 'M', "value": 'PRESS'}, None), + ("gpencil.draw", {"type": 'C', "value": 'PRESS'}, None), + ("gpencil.draw", {"type": 'C', "value": 'PRESS', "alt": True}, None), + ("gpencil.draw", {"type": 'ERASER', "value": 'PRESS'}, None), + ("gpencil.select_box", {"type": 'B', "value": 'PRESS'}, None), + ("gpencil.select_lasso", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True, "alt": True}, None), + ], + }, + ), + ("Image", + {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'}, + {"items": + [("image.view_all", {"type": 'HOME', "value": 'PRESS'}, None), + ("image.view_all", + {"type": 'HOME', "value": 'PRESS', "shift": True}, + {"properties": + [("fit_view", True), + ], + }, + ), + ("image.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None), + ("image.view_cursor_center", {"type": 'C', "value": 'PRESS', "shift": True}, None), + ("image.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "alt": True}, None), + ("image.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None), + ("image.view_pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None), + ("image.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None), + ("image.view_ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None), + ("image.view_zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS'}, None), + ("image.view_zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None), + ("image.view_zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "repeat": True}, None), + ("image.view_zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "repeat": True}, None), + ("image.view_zoom", {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True}, None), + ("image.view_zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None), + ("image.view_zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None), + ("image.view_zoom_border", {"type": 'B', "value": 'PRESS', "shift": True}, None), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True}, + {"properties": + [("ratio", 8.0), + ], + }, + ), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True}, + {"properties": + [("ratio", 4.0), + ], + }, + ), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True}, + {"properties": + [("ratio", 2.0), + ], + }, + ), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_8', "value": 'PRESS', "shift": True}, + {"properties": + [("ratio", 8.0), + ], + }, + ), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True}, + {"properties": + [("ratio", 4.0), + ], + }, + ), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_2', "value": 'PRESS', "shift": True}, + {"properties": + [("ratio", 2.0), + ], + }, + ), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_1', "value": 'PRESS'}, + {"properties": + [("ratio", 1.0), + ], + }, + ), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_2', "value": 'PRESS'}, + {"properties": + [("ratio", 0.5), + ], + }, + ), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_4', "value": 'PRESS'}, + {"properties": + [("ratio", 0.25), + ], + }, + ), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_8', "value": 'PRESS'}, + {"properties": + [("ratio", 0.125), + ], + }, + ), + ("image.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("image.sample", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("image.curves_point_set", + {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("point", 'BLACK_POINT'), + ], + }, + ), + ("image.curves_point_set", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": + [("point", 'WHITE_POINT'), + ], + }, + ), + ("object.mode_set", + {"type": 'TAB', "value": 'PRESS'}, + {"properties": + [("mode", 'EDIT'), + ("toggle", True), + ], + }, + ), + ("wm.context_set_int", + {"type": 'ONE', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.image.render_slots.active_index'), + ("value", 0), + ], + }, + ), + ("wm.context_set_int", + {"type": 'TWO', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.image.render_slots.active_index'), + ("value", 1), + ], + }, + ), + ("wm.context_set_int", + {"type": 'THREE', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.image.render_slots.active_index'), + ("value", 2), + ], + }, + ), + ("wm.context_set_int", + {"type": 'FOUR', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.image.render_slots.active_index'), + ("value", 3), + ], + }, + ), + ("wm.context_set_int", + {"type": 'FIVE', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.image.render_slots.active_index'), + ("value", 4), + ], + }, + ), + ("wm.context_set_int", + {"type": 'SIX', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.image.render_slots.active_index'), + ("value", 5), + ], + }, + ), + ("wm.context_set_int", + {"type": 'SEVEN', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.image.render_slots.active_index'), + ("value", 6), + ], + }, + ), + ("wm.context_set_int", + {"type": 'EIGHT', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.image.render_slots.active_index'), + ("value", 7), + ], + }, + ), + ("wm.context_set_int", + {"type": 'NINE', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.image.render_slots.active_index'), + ("value", 8), + ], + }, + ), + ("image.render_border", {"type": 'B', "value": 'PRESS', "ctrl": True}, None), + ("image.clear_render_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True}, None), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS'}, + {"properties": + [("name", 'IMAGE_MT_mask_context_menu'), + ], + }, + ), + ("wm.call_menu", + {"type": 'APP', "value": 'PRESS'}, + {"properties": + [("name", 'IMAGE_MT_mask_context_menu'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'PERIOD', "value": 'PRESS'}, + {"properties": + [("name", 'IMAGE_MT_pivot_pie'), + ], + }, + ), + ("image.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None), + ], + }, + ), + ("Node Generic", + {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'}, + {"items": + [("wm.context_toggle", + {"type": 'T', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.show_region_toolbar'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'N', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.show_region_ui'), + ], + }, + ), + ], + }, + ), + ("Node Editor", + {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'}, + {"items": + [("node.select", + {"type": 'LEFTMOUSE', "value": 'CLICK'}, + {"properties": + [("select_passthrough", True), + ], + }, + ), + ("node.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, None), + ("node.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "alt": True}, None), + ("node.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True, "alt": True}, None), + ("node.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True}, + {"properties": + [("toggle", True), + ], + }, + ), + ("node.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True}, + {"properties": + [("toggle", True), + ], + }, + ), + ("node.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "alt": True}, + {"properties": + [("toggle", True), + ], + }, + ), + ("node.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True, "alt": True}, + {"properties": + [("toggle", True), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select_box'), + ("cycle", True), + ], + }, + ), + ("node.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("tweak", True), + ], + }, + ), + ("node.select_lasso", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True, "alt": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("node.select_lasso", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True, "alt": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("node.select_box", + {"type": 'B', "value": 'PRESS'}, + {"properties": + [("tweak", False), + ], + }, + ), + ("node.select_circle", {"type": 'C', "value": 'PRESS'}, None), + ("node.link", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("detach", False), + ], + }, + ), + ("node.link", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("detach", True), + ], + }, + ), + ("node.resize", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), + ("node.add_reroute", {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG', "shift": True}, None), + ("node.links_cut", {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, None), + ("node.links_mute", {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG', "ctrl": True, "alt": True}, None), + ("node.select_link_viewer", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None), + ("node.connect_to_output", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": + [("run_in_geometry_nodes", True), + ], + }, + ), + ("node.connect_to_output", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": + [("run_in_geometry_nodes", False), + ], + }, + ), + ("node.connect_to_output", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": + [("run_in_geometry_nodes", False), + ], + }, + ), + ("node.backimage_move", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "alt": True}, None), + ("node.backimage_zoom", + {"type": 'V', "value": 'PRESS', "repeat": True}, + {"properties": + [("factor", 0.8333333), + ], + }, + ), + ("node.backimage_zoom", + {"type": 'V', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("factor", 1.2), + ], + }, + ), + ("node.backimage_fit", {"type": 'HOME', "value": 'PRESS', "alt": True}, None), + ("node.backimage_sample", {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True}, None), + ("node.link_make", + {"type": 'J', "value": 'PRESS'}, + {"properties": + [("replace", False), + ], + }, + ), + ("node.link_make", + {"type": 'J', "value": 'PRESS', "shift": True}, + {"properties": + [("replace", True), + ], + }, + ), + ("node.join_nodes", {"type": 'J', "value": 'PRESS', "ctrl": True}, None), + ("wm.call_menu", + {"type": 'A', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'NODE_MT_add'), + ], + }, + ), + ("wm.call_menu", + {"type": 'S', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'NODE_MT_swap'), + ], + }, + ), + ("node.duplicate_move", + {"type": 'D', "value": 'PRESS', "shift": True}, + {"properties": + [("NODE_OT_translate_attach", + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + ), + ], + }, + ), + ("node.duplicate_move_linked", + {"type": 'D', "value": 'PRESS', "alt": True}, + {"properties": + [("NODE_OT_translate_attach", + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + ), + ], + }, + ), + ("node.duplicate_move_keep_inputs", + {"type": 'D', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": + [("NODE_OT_translate_attach", + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + ), + ], + }, + ), + ("node.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None), + ("node.detach", {"type": 'P', "value": 'PRESS', "alt": True}, None), + ("node.join_named", {"type": 'F', "value": 'PRESS'}, None), + ("node.hide_toggle", {"type": 'H', "value": 'PRESS'}, None), + ("node.mute_toggle", {"type": 'M', "value": 'PRESS'}, None), + ("node.preview_toggle", {"type": 'H', "value": 'PRESS', "shift": True}, None), + ("node.hide_socket_toggle", {"type": 'H', "value": 'PRESS', "ctrl": True}, None), + ("node.view_all", {"type": 'HOME', "value": 'PRESS'}, None), + ("node.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None), + ("node.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None), + ("wm.call_menu_pie", + {"type": 'ACCENT_GRAVE', "value": 'PRESS'}, + {"properties": + [("name", 'NODE_MT_view_pie'), + ], + }, + ), + ("node.delete", {"type": 'X', "value": 'PRESS'}, None), + ("node.delete", {"type": 'DEL', "value": 'PRESS'}, None), + ("node.delete_reconnect", {"type": 'X', "value": 'PRESS', "ctrl": True}, None), + ("node.delete_reconnect", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None), + ("node.select_all", + {"type": 'A', "value": 'PRESS'}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("node.select_all", + {"type": 'A', "value": 'PRESS', "alt": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("node.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("node.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("node.select_linked_to", {"type": 'L', "value": 'PRESS', "shift": True}, None), + ("node.select_linked_from", {"type": 'L', "value": 'PRESS'}, None), + ("node.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None), + ("node.select_grouped", + {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": + [("extend", True), + ], + }, + ), + ("node.select_same_type_step", + {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True}, + {"properties": + [("prev", False), + ], + }, + ), + ("node.select_same_type_step", + {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True}, + {"properties": + [("prev", True), + ], + }, + ), + ("node.find_node", {"type": 'F', "value": 'PRESS', "ctrl": True}, None), + ("node.group_make", {"type": 'G', "value": 'PRESS', "ctrl": True}, None), + ("node.group_ungroup", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None), + ("node.group_separate", {"type": 'P', "value": 'PRESS'}, None), + ("node.group_enter_exit", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None), + ("node.group_edit", + {"type": 'TAB', "value": 'PRESS'}, + {"properties": + [("exit", False), + ], + }, + ), + ("node.group_edit", + {"type": 'TAB', "value": 'PRESS', "ctrl": True}, + {"properties": + [("exit", True), + ], + }, + ), + ("node.read_viewlayers", {"type": 'R', "value": 'PRESS', "ctrl": True}, None), + ("node.render_changed", {"type": 'Z', "value": 'PRESS'}, None), + ("node.clipboard_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), + ("node.clipboard_paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), + ("node.translate_attach", + {"type": 'G', "value": 'PRESS'}, + {"properties": + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + }, + ), + ("node.translate_attach", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + }, + ), + ("transform.translate", + {"type": 'G', "value": 'PRESS'}, + {"properties": + [("view2d_edge_pan", True), + ], + }, + ), + ("transform.translate", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("view2d_edge_pan", True), + ("release_confirm", True), + ], + }, + ), + ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None), + ("transform.resize", {"type": 'S', "value": 'PRESS'}, None), + ("node.move_detach_links_release", + {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG', "alt": True}, + {"properties": + [("NODE_OT_translate_attach", + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + ), + ], + }, + ), + ("node.move_detach_links", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "alt": True}, + {"properties": + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + }, + ), + ("wm.context_toggle", + {"type": 'TAB', "value": 'PRESS', "shift": True}, + {"properties": + [("data_path", 'tool_settings.use_snap_node'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'Z', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": + [("data_path", 'space_data.overlay.show_overlays'), + ], + }, + ), + ("wm.call_menu", + {"type": 'RIGHTMOUSE', "value": 'PRESS'}, + {"properties": + [("name", 'NODE_MT_context_menu'), + ], + }, + ), + ("wm.call_menu", + {"type": 'APP', "value": 'PRESS'}, + {"properties": + [("name", 'NODE_MT_context_menu'), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'ONE', "value": 'PRESS'}, + {"properties": + [("viewer_index", 1), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'TWO', "value": 'PRESS'}, + {"properties": + [("viewer_index", 2), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'THREE', "value": 'PRESS'}, + {"properties": + [("viewer_index", 3), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'FOUR', "value": 'PRESS'}, + {"properties": + [("viewer_index", 4), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'FIVE', "value": 'PRESS'}, + {"properties": + [("viewer_index", 5), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'SIX', "value": 'PRESS'}, + {"properties": + [("viewer_index", 6), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'SEVEN', "value": 'PRESS'}, + {"properties": + [("viewer_index", 7), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'EIGHT', "value": 'PRESS'}, + {"properties": + [("viewer_index", 8), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'NINE', "value": 'PRESS'}, + {"properties": + [("viewer_index", 9), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'ONE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 1), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'TWO', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 2), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'THREE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 3), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'FOUR', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 4), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'FIVE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 5), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'SIX', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 6), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'SEVEN', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 7), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'EIGHT', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 8), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'NINE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 9), + ], + }, + ), + ], + }, + ), + + ("Knife Tool Modal Map", + {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True}, + {"items": + [("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True, "repeat": True}, None), + ("PANNING", {"type": 'LEFTMOUSE', "value": 'ANY', "alt": True}, None), + ("ADD_CUT_CLOSED", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "any": True}, None), + ("ADD_CUT", {"type": 'LEFTMOUSE', "value": 'ANY'}, None), + ("CANCEL", {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True, "oskey": True}, None), + ("CONFIRM", {"type": 'RET', "value": 'PRESS', "any": True, "repeat": True}, None), + ("CONFIRM", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "any": True, "repeat": True}, None), + ("CONFIRM", {"type": 'SPACE', "value": 'PRESS', "any": True, "repeat": True}, None), + ("NEW_CUT", {"type": 'E', "value": 'PRESS', "repeat": True}, None), + ("SNAP_MIDPOINTS_ON", {"type": 'LEFT_CTRL', "value": 'PRESS', "any": True, "repeat": True}, None), + ("SNAP_MIDPOINTS_OFF", {"type": 'LEFT_CTRL', "value": 'RELEASE', "any": True}, None), + ("SNAP_MIDPOINTS_ON", {"type": 'RIGHT_CTRL', "value": 'PRESS', "any": True, "repeat": True}, None), + ("SNAP_MIDPOINTS_OFF", {"type": 'RIGHT_CTRL', "value": 'RELEASE', "any": True}, None), + ("IGNORE_SNAP_ON", {"type": 'LEFT_SHIFT', "value": 'PRESS', "any": True, "repeat": True}, None), + ("IGNORE_SNAP_OFF", {"type": 'LEFTMOUSE', "value": 'ANY'}, None), + ("IGNORE_SNAP_ON", {"type": 'RIGHT_SHIFT', "value": 'PRESS', "any": True, "repeat": True}, None), + ("IGNORE_SNAP_OFF", {"type": 'RIGHT_SHIFT', "value": 'RELEASE', "any": True}, None), + ("ANGLE_SNAP_TOGGLE", {"type": 'C', "value": 'PRESS', "repeat": True}, None), + ("CUT_THROUGH_TOGGLE", {"type": 'Z', "value": 'PRESS', "repeat": True}, None), + ("PANNING", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "alt": True}, None), + ("PANNING", {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True}, None), + ], + }, + ), + ("Lattice", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("lattice.select_all", + {"type": 'A', "value": 'PRESS'}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("lattice.select_all", + {"type": 'A', "value": 'PRESS', "alt": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("lattice.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("lattice.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("lattice.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("lattice.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("object.vertex_parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None), + ("lattice.flip", {"type": 'F', "value": 'PRESS', "alt": True}, None), + ("wm.call_menu", + {"type": 'H', "value": 'PRESS', "ctrl": True}, + {"properties": + [("name", 'VIEW3D_MT_hook'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'O', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'VIEW3D_MT_proportional_editing_falloff_pie'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'O', "value": 'PRESS'}, + {"properties": + [("data_path", 'tool_settings.use_proportional_edit'), + ], + }, + ), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS'}, + {"properties": + [("name", 'VIEW3D_MT_edit_lattice_context_menu'), + ], + "active":False, + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.move'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'E', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.rotate'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'R', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.scale'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'Q', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.select_box'), + ], + }, + ), + ], + }, + ), + ("Mesh", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("mesh.loopcut_slide", + {"type": 'R', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("TRANSFORM_OT_edge_slide", + [("release_confirm", False), + ], + ), + ], + }, + ), + ("mesh.offset_edge_loops_slide", + {"type": 'R', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("TRANSFORM_OT_edge_slide", + [("release_confirm", False), + ], + ), + ], + }, + ), + ("mesh.inset", {"type": 'I', "value": 'PRESS', "repeat": True}, None), + ("mesh.bevel", {"type": 'B', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("mesh.bevel", {"type": 'B', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("object.toggle_subsurf1", {"type": 'ONE', "value": 'PRESS', "repeat": True}, None), + ("object.toggle_subsurf2", {"type": 'TWO', "value": 'PRESS', "repeat": True}, None), + ("object.toggle_subsurf3", {"type": 'THREE', "value": 'PRESS', "repeat": True}, None), + ("mesh.select_mode", + {"type": 'ONE', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("type", 'VERT'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'TWO', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("type", 'EDGE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'THREE', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("type", 'FACE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'ONE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("use_expand", True), + ("type", 'VERT'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'TWO', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("use_expand", True), + ("type", 'EDGE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'THREE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("use_expand", True), + ("type", 'FACE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'ONE', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("use_expand", True), + ("type", 'VERT'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'TWO', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("use_expand", True), + ("type", 'EDGE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'THREE', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("use_expand", True), + ("type", 'FACE'), + ], + }, + ), + ("mesh.loop_select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "alt": True}, + {"properties": + [("extend", False), + ("deselect", False), + ("toggle", False), + ], + "active":False, + }, + ), + ("mesh.loop_select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "alt": True}, + {"properties": + [("extend", False), + ("deselect", False), + ("toggle", True), + ], + }, + ), + ("mesh.edgering_select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True, "alt": True}, + {"properties": + [("extend", False), + ("deselect", False), + ("toggle", False), + ], + }, + ), + ("mesh.edgering_select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True, "alt": True}, + {"properties": + [("extend", False), + ("deselect", False), + ("toggle", True), + ], + }, + ), + ("mesh.shortest_path_pick", + {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, + {"properties": + [("use_fill", False), + ], + }, + ), + ("mesh.shortest_path_pick", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True}, + {"properties": + [("use_fill", True), + ], + }, + ), + ("mesh.select_all", + {"type": 'A', "value": 'PRESS', "repeat": True}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("mesh.select_all", + {"type": 'A', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("mesh.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("mesh.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("mesh.select_more", {"type": 'PERIOD', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("mesh.select_less", {"type": 'COMMA', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("mesh.select_next_item", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("mesh.select_prev_item", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("mesh.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("mesh.select_linked_pick", + {"type": 'L', "value": 'PRESS', "repeat": True}, + {"properties": + [("deselect", False), + ], + }, + ), + ("mesh.select_linked_pick", + {"type": 'L', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("deselect", True), + ], + }, + ), + ("mesh.select_mirror", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'G', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_mesh_select_similar'), + ], + }, + ), + ("mesh.hide", + {"type": 'H', "value": 'PRESS', "repeat": True}, + {"properties": + [("unselected", False), + ], + }, + ), + ("mesh.hide", + {"type": 'H', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("unselected", True), + ], + }, + ), + ("mesh.reveal", {"type": 'H', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("mesh.normals_make_consistent", + {"type": 'N', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("inside", False), + ], + }, + ), + ("mesh.normals_make_consistent", + {"type": 'N', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("inside", True), + ], + }, + ), + ("view3d.edit_mesh_extrude_move_normal", {"type": 'E', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'E', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_mesh_extrude'), + ], + "active":False, + }, + ), + ("transform.edge_crease", {"type": 'E', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("mesh.fill", {"type": 'F', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("mesh.quads_convert_to_tris", + {"type": 'T', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("quad_method", 'BEAUTY'), + ("ngon_method", 'BEAUTY'), + ], + }, + ), + ("mesh.quads_convert_to_tris", + {"type": 'T', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("quad_method", 'FIXED'), + ("ngon_method", 'CLIP'), + ], + }, + ), + ("mesh.tris_convert_to_quads", {"type": 'J', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("mesh.rip_move", + {"type": 'V', "value": 'PRESS', "repeat": True}, + {"properties": + [("MESH_OT_rip", + [("use_fill", False), + ], + ), + ], + }, + ), + ("mesh.rip_move", + {"type": 'V', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("MESH_OT_rip", + [("use_fill", True), + ], + ), + ], + }, + ), + ("mesh.rip_edge_move", {"type": 'D', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("mesh.merge", {"type": 'M', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("transform.shrink_fatten", {"type": 'S', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("mesh.edge_face_add", {"type": 'G', "value": 'PRESS', "repeat": True}, None), + ("mesh.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'A', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_mesh_add'), + ], + }, + ), + ("mesh.separate", {"type": 'P', "value": 'PRESS', "repeat": True}, None), + ("mesh.split", {"type": 'Y', "value": 'PRESS', "repeat": True}, None), + ("mesh.vert_connect_path", {"type": 'J', "value": 'PRESS', "repeat": True}, None), + ("mesh.point_normals", {"type": 'L', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("transform.vert_slide", {"type": 'V', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("mesh.dupli_extrude_cursor", + {"type": 'RIGHTMOUSE', "value": 'CLICK', "ctrl": True}, + {"properties": + [("rotate_source", True), + ], + }, + ), + ("mesh.dupli_extrude_cursor", + {"type": 'RIGHTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True}, + {"properties": + [("rotate_source", False), + ], + }, + ), + ("edit.delete_without_confirm", {"type": 'X', "value": 'PRESS', "repeat": True}, None), + ("mesh.dissolve_mode", {"type": 'X', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("mesh.dissolve_mode", {"type": 'DEL', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("mesh.knife_tool", + {"type": 'K', "value": 'PRESS', "repeat": True}, + {"properties": + [("use_occlude_geometry", True), + ("only_selected", False), + ], + }, + ), + ("object.vertex_parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_mesh_specials'), + ], + "active":False, + }, + ), + ("wm.call_menu", + {"type": 'F', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_mesh_faces'), + ], + }, + ), + ("wm.call_menu", + {"type": 'E', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_mesh_edges'), + ], + }, + ), + ("wm.call_menu", + {"type": 'V', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_mesh_vertices'), + ], + }, + ), + ("wm.call_menu", + {"type": 'H', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_hook'), + ], + }, + ), + ("wm.call_menu", + {"type": 'U', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_uv_map'), + ], + }, + ), + ("wm.call_menu", + {"type": 'G', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_vertex_group'), + ], + }, + ), + ("object.vertex_group_remove_from", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, None), + ("wm.call_menu_pie", + {"type": 'O', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_proportional_editing_falloff_pie'), + ], + }, + ), + ("wm.context_toggle_enum", + {"type": 'O', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'tool_settings.proportional_edit'), + ("value_1", 'DISABLED'), + ("value_2", 'ENABLED'), + ], + }, + ), + ("wm.context_toggle_enum", + {"type": 'O', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("data_path", 'tool_settings.proportional_edit'), + ("value_1", 'DISABLED'), + ("value_2", 'CONNECTED'), + ], + }, + ), + ("mesh.loop_select", + {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, + {"properties": + [("extend", False), + ("deselect", False), + ("toggle", False), + ], + }, + ), + ("mesh.loop_select", + {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "shift": True}, + {"properties": + [("extend", True), + ("deselect", False), + ("toggle", False), + ], + }, + ), + ("mesh.loop_select", + {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "alt": True}, + {"properties": + [("extend", False), + ("deselect", True), + ("toggle", False), + ], + }, + ), + ("wm.tool_set_by_name", {"type": 'Q', "value": 'PRESS', "repeat": True}, None), + ("wm.tool_set_by_id", + {"type": 'Q', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.select_box'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.move'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'E', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.rotate'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'R', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.scale'), + ], + }, + ), + ("wm.call_menu", + {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'SPECIAL_MT_Menu'), + ], + }, + ), + ("wm.call_menu", + {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_mesh_context_menu'), + ], + }, + ), + ("object.extrudeaxis", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "ctrl": True}, None), + ("object.swapmode", + {"type": 'MIDDLEMOUSE', "value": 'DOUBLE_CLICK'}, + { "active":False, + }, + ), + ("object.swapmode", + {"type": 'MIDDLEMOUSE', "value": 'DOUBLE_CLICK'}, + { "active":False, + }, + ), + ("object.swapmode", + {"type": 'MIDDLEMOUSE', "value": 'DOUBLE_CLICK'}, + { "active":False, + }, + ), + ("object.swapmode", + {"type": 'MIDDLEMOUSE', "value": 'DOUBLE_CLICK'}, + { "active":False, + }, + ), + ("object.swapmode", + {"type": 'MIDDLEMOUSE', "value": 'DOUBLE_CLICK'}, + { "active":False, + }, + ), + ("wm.call_menu", + {"type": 'DEL', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_mesh_delete'), + ], + }, + ), + ], + }, + ), + ("Object Mode", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("wm.call_menu_pie", + {"type": 'O', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_proportional_editing_falloff_pie'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'O', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'tool_settings.use_proportional_edit_objects'), + ], + }, + ), + ("object.select_all", + {"type": 'A', "value": 'PRESS', "repeat": True}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("object.select_all", + {"type": 'A', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("object.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("object.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("object.select_more", {"type": 'PERIOD', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("object.select_less", {"type": 'COMMA', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("object.select_linked", {"type": 'L', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("object.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("object.select_hierarchy", + {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'PARENT'), + ("extend", False), + ], + }, + ), + ("object.select_hierarchy", + {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'PARENT'), + ("extend", True), + ], + }, + ), + ("object.select_hierarchy", + {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'CHILD'), + ("extend", False), + ], + }, + ), + ("object.select_hierarchy", + {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'CHILD'), + ("extend", True), + ], + }, + ), + ("object.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("object.parent_clear", {"type": 'P', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("object.location_clear", + {"type": 'G', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("clear_delta", False), + ], + }, + ), + ("object.rotation_clear", + {"type": 'R', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("clear_delta", False), + ], + }, + ), + ("object.scale_clear", + {"type": 'S', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("clear_delta", False), + ], + }, + ), + ("object.delete", + {"type": 'X', "value": 'PRESS', "repeat": True}, + {"properties": + [("use_global", False), + ], + }, + ), + ("object.delete", + {"type": 'X', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("use_global", True), + ], + }, + ), + ("object.delete", + {"type": 'DEL', "value": 'PRESS', "repeat": True}, + {"properties": + [("use_global", False), + ("confirm", False), + ], + }, + ), + ("object.delete", + {"type": 'DEL', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("use_global", True), + ("confirm", False), + ], + }, + ), + ("wm.call_menu", + {"type": 'A', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_add'), + ], + }, + ), + ("wm.call_menu", + {"type": 'A', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_object_apply'), + ], + }, + ), + ("wm.call_menu", + {"type": 'L', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_make_links'), + ], + }, + ), + ("object.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("object.duplicate_move_linked", {"type": 'D', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("object.join", {"type": 'J', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("anim.keyframe_insert_menu", {"type": 'I', "value": 'PRESS', "repeat": True}, None), + ("anim.keyframe_delete_v3d", {"type": 'I', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("anim.keying_set_active_set", {"type": 'I', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True, "repeat": True}, None), + ("collection.create", + {"type": 'G', "value": 'PRESS', "ctrl": True, "repeat": True}, + { "active":False, + }, + ), + ("collection.objects_remove", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, None), + ("collection.objects_remove_all", {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True, "repeat": True}, None), + ("collection.objects_add_active", {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("collection.objects_remove_active", {"type": 'G', "value": 'PRESS', "shift": True, "alt": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_object_specials'), + ], + "active":False, + }, + ), + ("object.subdivision_set", + {"type": 'ZERO', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("level", 0), + ("relative", False), + ], + }, + ), + ("object.subdivision_set", + {"type": 'ONE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("level", 1), + ("relative", False), + ], + }, + ), + ("object.subdivision_set", + {"type": 'TWO', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("level", 2), + ("relative", False), + ], + }, + ), + ("object.subdivision_set", + {"type": 'THREE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("level", 3), + ("relative", False), + ], + }, + ), + ("object.subdivision_set", + {"type": 'FOUR', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("level", 4), + ("relative", False), + ], + }, + ), + ("object.subdivision_set", + {"type": 'FIVE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("level", 5), + ("relative", False), + ], + }, + ), + ("object.move_to_collection", {"type": 'M', "value": 'PRESS', "repeat": True}, None), + ("object.link_to_collection", {"type": 'M', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("object.hide_view_clear", + {"type": 'H', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("select", True), + ], + }, + ), + ("object.hide_view_set", + {"type": 'H', "value": 'PRESS', "repeat": True}, + {"properties": + [("unselected", False), + ], + }, + ), + ("object.hide_view_set", + {"type": 'H', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("unselected", True), + ], + }, + ), + ("object.hide_collection", {"type": 'H', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("object.hide_collection", + {"type": 'ONE', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 1), + ], + "active":False, + }, + ), + ("object.hide_collection", + {"type": 'TWO', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 2), + ], + "active":False, + }, + ), + ("object.hide_collection", + {"type": 'THREE', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 3), + ], + "active":False, + }, + ), + ("object.hide_collection", + {"type": 'FOUR', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 4), + ], + }, + ), + ("object.hide_collection", + {"type": 'FIVE', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 5), + ], + }, + ), + ("object.hide_collection", + {"type": 'SIX', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 6), + ], + }, + ), + ("object.hide_collection", + {"type": 'SEVEN', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 7), + ], + }, + ), + ("object.hide_collection", + {"type": 'EIGHT', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 8), + ], + }, + ), + ("object.hide_collection", + {"type": 'NINE', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 9), + ], + }, + ), + ("object.hide_collection", + {"type": 'ZERO', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 10), + ], + }, + ), + ("wm.tool_set_by_name", {"type": 'Q', "value": 'PRESS', "repeat": True}, None), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.move'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'E', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.rotate'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'R', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.scale'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'Q', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.select_box'), + ], + }, + ), + ("object.toggle_subsurf", {"type": 'THREE', "value": 'PRESS', "repeat": True}, None), + ("object.toggle_subsurf2", {"type": 'TWO', "value": 'PRESS', "repeat": True}, None), + ("object.toggle_subsurf1", {"type": 'ONE', "value": 'PRESS', "repeat": True}, None), + ("object.toggle_subsurf3", {"type": 'THREE', "value": 'PRESS', "repeat": True}, None), + ("wm.call_menu", + {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("name", 'VIEW3D_MT_object_context_menu'), + ], + }, + ), + ("object.pivotlock", {"type": 'V', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("mcp.toggle_affect_origins_scene", {"type": 'D', "value": 'PRESS', "repeat": True}, None), + ("theme.double", {"type": 'B', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("object.keygridsnap", {"type": 'G', "value": 'PRESS', "key_modifier": 'D', "repeat": True}, None), + ("object.keyvertexsnap", {"type": 'V', "value": 'PRESS', "key_modifier": 'D', "repeat": True}, None), + ("object.keycurvesnap", {"type": 'C', "value": 'PRESS', "key_modifier": 'D', "repeat": True}, None), + ("object.move_to_collection", {"type": 'G', "value": 'PRESS', "ctrl": True}, None), + ], + }, + ), + ("Object Non-modal", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("wm.call_menu_pie", + {"type": 'Q', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'pie.view_of'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("name", 'view3d.snap_of'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'Z', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'pie.shade_of'), + ], + "active":False, + }, + ), + ("wm.call_menu_pie", + {"type": 'PERIOD', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'view3d.pivot_of'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'TAB', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'pie.object_mode_of'), + ], + "active":False, + }, + ), + ("wm.call_menu_pie", + {"type": 'Q', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'pie.view_of'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("name", 'view3d.snap_of'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'PERIOD', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'view3d.pivot_of'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'SPACE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'view3d.manipulator_of'), + ], + "active":False, + }, + ), + ("object.mode_set", + {"type": 'TAB', "value": 'PRESS', "repeat": True}, + {"properties": + [("mode", 'EDIT'), + ("toggle", True), + ], + }, + ), + ("view3d.object_mode_pie_or_toggle", {"type": 'TAB', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("object.transfer_mode", {"type": 'Q', "value": 'PRESS', "alt": True}, None), + ], + }, + ), + ("Outliner", + {"space_type": 'OUTLINER', "region_type": 'WINDOW'}, + {"items": + [("outliner.highlight_update", {"type": 'MOUSEMOVE', "value": 'ANY', "any": True}, None), + ("outliner.item_activate", + {"type": 'LEFTMOUSE', "value": 'CLICK'}, + {"properties": + [("extend", False), + ], + }, + ), + ("outliner.item_activate", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True}, + {"properties": + [("extend", True), + ("extend_range", True), + ], + }, + ), + ("outliner.item_activate", + {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, + {"properties": + [("extend", True), + ("deselect_all", True), + ], + }, + ), + ("outliner.select_box", {"type": 'B', "value": 'PRESS', "repeat": True}, None), + ("outliner.item_openclose", + {"type": 'LEFTMOUSE', "value": 'PRESS'}, + {"properties": + [("all", False), + ], + }, + ), + ("outliner.item_openclose", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": + [("all", True), + ], + }, + ), + ("outliner.item_rename", {"type": 'F2', "value": 'PRESS', "repeat": True}, None), + ("outliner.operation", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None), + ("outliner.item_drag_drop", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), + ("outliner.item_drag_drop", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, None), + ("outliner.show_hierarchy", {"type": 'HOME', "value": 'PRESS', "repeat": True}, None), + ("outliner.show_active", {"type": 'PERIOD', "value": 'PRESS', "repeat": True}, None), + ("outliner.show_active", {"type": 'NUMPAD_PERIOD', "value": 'PRESS', "repeat": True}, None), + ("outliner.scroll_page", + {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True}, + {"properties": + [("up", False), + ], + }, + ), + ("outliner.scroll_page", + {"type": 'PAGE_UP', "value": 'PRESS', "repeat": True}, + {"properties": + [("up", True), + ], + }, + ), + ("outliner.show_one_level", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "repeat": True}, None), + ("outliner.show_one_level", + {"type": 'NUMPAD_MINUS', "value": 'PRESS', "repeat": True}, + {"properties": + [("open", False), + ], + }, + ), + ("outliner.select_all", + {"type": 'A', "value": 'PRESS', "repeat": True}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("outliner.select_all", + {"type": 'A', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("outliner.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("outliner.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("outliner.expanded_toggle", {"type": 'A', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("outliner.keyingset_add_selected", {"type": 'K', "value": 'PRESS', "repeat": True}, None), + ("outliner.keyingset_remove_selected", {"type": 'K', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("anim.keyframe_insert", {"type": 'I', "value": 'PRESS', "repeat": True}, None), + ("anim.keyframe_delete", {"type": 'I', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("outliner.drivers_add_selected", {"type": 'D', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("outliner.drivers_delete_selected", {"type": 'D', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, None), + ("outliner.collection_new", {"type": 'C', "value": 'PRESS', "repeat": True}, None), + ("outliner.delete", {"type": 'DEL', "value": 'PRESS', "repeat": True}, None), + ("object.move_to_collection", {"type": 'M', "value": 'PRESS', "repeat": True}, None), + ("object.link_to_collection", {"type": 'M', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("outliner.collection_exclude_set", {"type": 'E', "value": 'PRESS', "repeat": True}, None), + ("outliner.collection_exclude_clear", {"type": 'E', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("object.hide_view_clear", + {"type": 'H', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("select", True), + ], + }, + ), + ("object.hide_view_set", + {"type": 'H', "value": 'PRESS', "repeat": True}, + {"properties": + [("unselected", True), + ], + }, + ), + ("object.hide_view_set", + {"type": 'H', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("unselected", True), + ], + }, + ), + ("outliner.select_walk", + {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'UP'), + ], + }, + ), + ("outliner.select_walk", + {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'DOWN'), + ], + }, + ), + ("outliner.select_walk", + {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'UP'), + ("extend", True), + ], + }, + ), + ("outliner.select_walk", + {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'DOWN'), + ("extend", True), + ], + }, + ), + ("outliner.select_walk", + {"type": 'LEFT_ARROW', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'LEFT'), + ], + }, + ), + ("outliner.select_walk", + {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'LEFT'), + ("toggle_all", True), + ], + }, + ), + ("outliner.select_walk", + {"type": 'RIGHT_ARROW', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'RIGHT'), + ], + }, + ), + ("outliner.select_walk", + {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'RIGHT'), + ("toggle_all", True), + ], + }, + ), + ("outliner.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("tweak", True), + ("wait_for_input", True), + ], + }, + ), + ("outliner.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, + {"properties": + [("tweak", True), + ("wait_for_input", True), + ("mode", 'ADD'), + ], + }, + ), + ("outliner.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("tweak", True), + ("mode", 'SUB'), + ], + }, + ), + ("outliner.item_rename", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None), + ("object.move_to_collection", {"type": 'G', "value": 'PRESS', "ctrl": True}, None), + ("outliner.delete", {"type": 'X', "value": 'PRESS'}, None), + ], + }, + ), + ("Pose", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("object.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'A', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_add'), + ], + }, + ), + ("pose.hide", + {"type": 'H', "value": 'PRESS', "repeat": True}, + {"properties": + [("unselected", False), + ], + }, + ), + ("pose.hide", + {"type": 'H', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("unselected", True), + ], + }, + ), + ("pose.reveal", {"type": 'H', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'A', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_pose_apply'), + ], + }, + ), + ("pose.rot_clear", {"type": 'R', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("pose.loc_clear", {"type": 'G', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("pose.scale_clear", {"type": 'S', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("pose.quaternions_flip", {"type": 'F', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("pose.rotation_mode_set", {"type": 'R', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("pose.copy", {"type": 'C', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("pose.paste", + {"type": 'V', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("flipped", False), + ], + }, + ), + ("pose.paste", + {"type": 'V', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("flipped", True), + ], + }, + ), + ("pose.select_all", + {"type": 'A', "value": 'PRESS', "repeat": True}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("pose.select_all", + {"type": 'A', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("pose.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("pose.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("pose.select_parent", {"type": 'P', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("pose.select_hierarchy", + {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'PARENT'), + ("extend", False), + ], + }, + ), + ("pose.select_hierarchy", + {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'PARENT'), + ("extend", True), + ], + }, + ), + ("pose.select_hierarchy", + {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'CHILD'), + ("extend", False), + ], + }, + ), + ("pose.select_hierarchy", + {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'CHILD'), + ("extend", True), + ], + }, + ), + ("pose.select_linked", {"type": 'L', "value": 'PRESS', "repeat": True}, None), + ("pose.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("pose.select_mirror", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("pose.constraint_add_with_targets", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("pose.constraints_clear", {"type": 'C', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, None), + ("pose.ik_add", {"type": 'I', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("pose.ik_clear", {"type": 'I', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'G', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_pose_group'), + ], + }, + ), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_bone_options_toggle'), + ], + }, + ), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_bone_options_enable'), + ], + }, + ), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_bone_options_disable'), + ], + }, + ), + ("armature.layers_show_all", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("armature.armature_layers", {"type": 'M', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("pose.bone_layers", {"type": 'M', "value": 'PRESS', "repeat": True}, None), + ("transform.transform", + {"type": 'S', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, + {"properties": + [("mode", 'BONE_SIZE'), + ], + }, + ), + ("anim.keyframe_insert_menu", {"type": 'I', "value": 'PRESS', "repeat": True}, None), + ("anim.keyframe_delete_v3d", {"type": 'I', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("anim.keying_set_active_set", {"type": 'I', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True, "repeat": True}, None), + ("poselib.browse_interactive", {"type": 'L', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("poselib.pose_add", {"type": 'L', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("poselib.pose_remove", {"type": 'L', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("poselib.pose_rename", {"type": 'L', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("pose.push", {"type": 'E', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("pose.relax", {"type": 'E', "value": 'PRESS', "shift": True, "alt": True, "repeat": True}, None), + ("pose.breakdown", {"type": 'E', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'P', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_pose_propagate'), + ], + }, + ), + ("object.hide_collection", + {"type": 'ONE', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 1), + ], + }, + ), + ("object.hide_collection", + {"type": 'TWO', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 2), + ], + }, + ), + ("object.hide_collection", + {"type": 'THREE', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 3), + ], + }, + ), + ("object.hide_collection", + {"type": 'FOUR', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 4), + ], + }, + ), + ("object.hide_collection", + {"type": 'FIVE', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 5), + ], + }, + ), + ("object.hide_collection", + {"type": 'SIX', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 6), + ], + }, + ), + ("object.hide_collection", + {"type": 'SEVEN', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 7), + ], + }, + ), + ("object.hide_collection", + {"type": 'EIGHT', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 8), + ], + }, + ), + ("object.hide_collection", + {"type": 'NINE', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 9), + ], + }, + ), + ("object.hide_collection", + {"type": 'ZERO', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 10), + ], + }, + ), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_pose_context_menu'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.move'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'E', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.rotate'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'R', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.scale'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'Q', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.select_box'), + ], + }, + ), + ("view3d.localview", {"type": 'E', "value": 'PRESS', "alt": True}, None), + ], + }, + ), + ("Screen", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("screen.animation_step", {"type": 'TIMER0', "value": 'ANY', "any": True}, None), + ("screen.region_blend", {"type": 'TIMERREGION', "value": 'ANY', "any": True}, None), + ("screen.screen_full_area", {"type": 'UP_ARROW', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("screen.screen_full_area", + {"type": 'SPACE', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, + {"properties": + [("use_hide_panels", True), + ], + }, + ), + ("screen.space_context_cycle", + {"type": 'TAB', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("direction", 'NEXT'), + ], + }, + ), + ("screen.space_context_cycle", + {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("direction", 'PREV'), + ], + }, + ), + ("screen.workspace_cycle", + {"type": 'PAGE_DOWN', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("direction", 'NEXT'), + ], + }, + ), + ("screen.workspace_cycle", + {"type": 'PAGE_UP', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("direction", 'PREV'), + ], + }, + ), + ("screen.region_quadview", + {"type": 'SPACE', "value": 'PRESS', "repeat": True}, + { "active":False, + }, + ), + ("screen.repeat_last", {"type": 'R', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("file.execute", {"type": 'RET', "value": 'PRESS', "repeat": True}, None), + ("file.execute", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "repeat": True}, None), + ("file.cancel", {"type": 'ESC', "value": 'PRESS', "repeat": True}, None), + ("ed.undo", {"type": 'Z', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("ed.redo", {"type": 'Z', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("render.render", + {"type": 'F12', "value": 'PRESS', "repeat": True}, + {"properties": + [("use_viewport", True), + ], + }, + ), + ("render.render", + {"type": 'F12', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("animation", True), + ("use_viewport", True), + ], + }, + ), + ("render.view_cancel", {"type": 'ESC', "value": 'PRESS', "repeat": True}, None), + ("render.view_show", {"type": 'F11', "value": 'PRESS', "repeat": True}, None), + ("render.play_rendered_anim", {"type": 'F11', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ], + }, + ), + ("Toolbar Popup ", + {"space_type": 'EMPTY', "region_type": 'TEMPORARY'}, + {"items": + [("wm.tool_set_by_id", + {"type": 'SPACE', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.cursor'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'L', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select_lasso'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'T', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.transform'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'M', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.measure'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'Q', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select_box'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'C', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select_circle'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.move'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'E', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.rotate'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'R', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.scale'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'D', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.annotate'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'ONE', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_1', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'TWO', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select_lasso'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_2', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select_lasso'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'THREE', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.scale_cage'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_3', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.scale_cage'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'FOUR', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.transform'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_4', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.transform'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'FIVE', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.annotate_line'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_5', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.annotate_line'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'SIX', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.annotate_polygon'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_6', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.annotate_polygon'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'SEVEN', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.annotate_eraser'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_7', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.annotate_eraser'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'EIGHT', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.measure'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_8', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.measure'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NINE', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.primitive_cube_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_9', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.primitive_cube_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'ZERO', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.primitive_cone_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_0', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.primitive_cone_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'ONE', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'builtin.primitive_cylinder_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_1', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'builtin.primitive_cylinder_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'TWO', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'builtin.primitive_uv_sphere_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_2', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'builtin.primitive_uv_sphere_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'THREE', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'builtin.primitive_ico_sphere_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_3', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'builtin.primitive_ico_sphere_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'SPACE', "value": 'DOUBLE_CLICK'}, + {"properties": + [("name", 'builtin.cursor'), + ], + }, + ), + ("ui.button_execute", + {"type": 'SPACE', "value": 'RELEASE', "any": True}, + {"properties": + [("skip_depressed", True), + ], + }, + ), + ], + }, + ), + ("UV Editor", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("mesh.select_mode", + {"type": 'ONE', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'VERT'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'TWO', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'EDGE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'THREE', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'FACE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'ONE', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("type", 'VERT'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'TWO', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("type", 'EDGE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'THREE', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("type", 'FACE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'ONE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("use_expand", True), + ("type", 'VERT'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'TWO', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("use_expand", True), + ("type", 'EDGE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'THREE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("use_expand", True), + ("type", 'FACE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'ONE', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("use_expand", True), + ("type", 'VERT'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'TWO', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("use_expand", True), + ("type", 'EDGE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'THREE', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("use_expand", True), + ("type", 'FACE'), + ], + }, + ), + ("mesh.select_mode", {"type": 'FOUR', "value": 'PRESS', "repeat": True}, None), + ("wm.context_set_enum", + {"type": 'ONE', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'tool_settings.uv_select_mode'), + ("value", 'VERTEX'), + ], + }, + ), + ("wm.context_set_enum", + {"type": 'TWO', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'tool_settings.uv_select_mode'), + ("value", 'EDGE'), + ], + }, + ), + ("wm.context_set_enum", + {"type": 'THREE', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'tool_settings.uv_select_mode'), + ("value", 'FACE'), + ], + }, + ), + ("wm.context_set_enum", + {"type": 'FOUR', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'tool_settings.uv_select_mode'), + ("value", 'ISLAND'), + ], + }, + ), + ("uv.mark_seam", {"type": 'E', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("uv.select", + {"type": 'RIGHTMOUSE', "value": 'PRESS'}, + {"properties": + [("extend", False), + ], + "active":False, + }, + ), + ("uv.select", + {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": + [("extend", True), + ], + }, + ), + ("uv.select_loop", + {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True}, + {"properties": + [("extend", False), + ], + "active":False, + }, + ), + ("uv.select_loop", + {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": + [("extend", True), + ], + "active":False, + }, + ), + ("uv.select_split", {"type": 'Y', "value": 'PRESS', "repeat": True}, None), + ("uv.select_box", + {"type": 'B', "value": 'PRESS', "repeat": True}, + {"properties": + [("pinned", False), + ], + }, + ), + ("uv.select_box", + {"type": 'B', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("pinned", True), + ], + }, + ), + ("uv.select_circle", {"type": 'C', "value": 'PRESS', "repeat": True}, None), + ("uv.select_lasso", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("uv.select_lasso", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("uv.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("uv.select_linked_pick", + {"type": 'L', "value": 'PRESS', "repeat": True}, + {"properties": + [("extend", True), + ("deselect", False), + ], + }, + ), + ("uv.select_linked", {"type": 'L', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("uv.select_linked_pick", + {"type": 'L', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("extend", False), + ("deselect", True), + ], + }, + ), + ("uv.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("uv.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("uv.select_all", + {"type": 'A', "value": 'PRESS', "repeat": True}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("uv.select_all", + {"type": 'A', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("uv.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("uv.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("uv.select_pinned", {"type": 'P', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'IMAGE_MT_uvs_weldalign'), + ], + }, + ), + ("uv.stitch", {"type": 'V', "value": 'PRESS', "repeat": True}, None), + ("uv.pin", + {"type": 'P', "value": 'PRESS', "repeat": True}, + {"properties": + [("clear", False), + ], + }, + ), + ("uv.pin", + {"type": 'P', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("clear", True), + ], + }, + ), + ("uv.unwrap", {"type": 'U', "value": 'PRESS', "repeat": True}, None), + ("uv.hide", + {"type": 'H', "value": 'PRESS', "repeat": True}, + {"properties": + [("unselected", False), + ], + }, + ), + ("uv.hide", + {"type": 'H', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("unselected", True), + ], + }, + ), + ("uv.reveal", {"type": 'H', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("wm.call_menu_pie", + {"type": 'S', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'IMAGE_MT_uvs_snap_pie'), + ], + }, + ), + ("wm.call_menu", + {"type": 'TAB', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'IMAGE_MT_uvs_select_mode'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'O', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_proportional_editing_falloff_pie'), + ], + }, + ), + ("wm.context_toggle_enum", + {"type": 'O', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'tool_settings.proportional_edit'), + ("value_1", 'DISABLED'), + ("value_2", 'ENABLED'), + ], + }, + ), + ("transform.translate", {"type": 'G', "value": 'PRESS', "repeat": True}, None), + ("transform.translate", {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG'}, None), + ("transform.rotate", + {"type": 'R', "value": 'PRESS', "repeat": True}, + { "active":False, + }, + ), + ("transform.resize", {"type": 'S', "value": 'PRESS', "repeat": True}, None), + ("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True, "repeat": True}, None), + ("transform.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.context_toggle", + {"type": 'TAB', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("data_path", 'tool_settings.use_snap'), + ], + }, + ), + ("wm.context_menu_enum", + {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("data_path", 'tool_settings.snap_uv_element'), + ], + }, + ), + ("wm.call_menu", + {"type": 'RIGHTMOUSE', "value": 'PRESS'}, + {"properties": + [("name", 'IMAGE_MT_uvs_context_menu'), + ], + }, + ), + ("uv.cursor_set", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, None), + ("wm.tool_set_by_name", {"type": 'Q', "value": 'PRESS', "repeat": True}, None), + ("wm.tool_set_by_name", {"type": 'W', "value": 'PRESS', "repeat": True}, None), + ("wm.tool_set_by_id", + {"type": 'Q', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.select_box'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.move'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'R', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.scale'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'E', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.rotate'), + ], + }, + ), + ("uv.select", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ], + }, + ), + ("User Interface", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("ui.eyedropper_color", {"type": 'E', "value": 'PRESS'}, None), + ("ui.eyedropper_colorramp", {"type": 'E', "value": 'PRESS'}, None), + ("ui.eyedropper_colorramp_point", {"type": 'E', "value": 'PRESS', "alt": True}, None), + ("ui.eyedropper_id", {"type": 'E', "value": 'PRESS'}, None), + ("ui.eyedropper_depth", {"type": 'E', "value": 'PRESS'}, None), + ("ui.copy_data_path_button", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True}, None), + ("ui.copy_data_path_button", + {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, + {"properties": + [("full_path", True), + ], + }, + ), + ("anim.keyframe_insert_button", + {"type": 'I', "value": 'PRESS'}, + {"properties": + [("all", True), + ], + }, + ), + ("anim.keyframe_delete_button", + {"type": 'I', "value": 'PRESS', "alt": True}, + {"properties": + [("all", True), + ], + }, + ), + ("anim.keyframe_clear_button", + {"type": 'I', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": + [("all", True), + ], + }, + ), + ("anim.driver_button_add", {"type": 'D', "value": 'PRESS', "ctrl": True}, None), + ("anim.driver_button_remove", {"type": 'D', "value": 'PRESS', "ctrl": True, "alt": True}, None), + ("anim.keyingset_button_add", {"type": 'K', "value": 'PRESS'}, None), + ("anim.keyingset_button_remove", {"type": 'K', "value": 'PRESS', "alt": True}, None), + ("ui.reset_default_button", + {"type": 'BACK_SPACE', "value": 'PRESS'}, + {"properties": + [("all", True), + ], + }, + ), + ("ui.list_start_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None), + ("ui.view_start_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None), + ("anim.keyframe_insert_by_name", {"type": 'S', "value": 'PRESS'}, None), + ("ui.view_item_select", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("ui.view_item_select", + {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("extend", True), + ], + }, + ), + ("ui.view_item_select", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": + [("range_select", True), + ], + }, + ), + ("ui.view_scroll", {"type": 'WHEELUPMOUSE', "value": 'ANY'}, None), + ("ui.view_scroll", {"type": 'WHEELDOWNMOUSE', "value": 'ANY'}, None), + ("ui.view_scroll", {"type": 'TRACKPADPAN', "value": 'ANY'}, None), + ], + }, + ), + ("View2D", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("view2d.scroller_activate", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("view2d.scroller_activate", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None), + ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None), + ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None), + ("view2d.pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None), + ("view2d.scroll_right", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("view2d.scroll_right", {"type": 'WHEELRIGHTMOUSE', "value": 'PRESS'}, None), + ("view2d.scroll_left", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("view2d.scroll_left", {"type": 'WHEELLEFTMOUSE', "value": 'PRESS'}, None), + ("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True}, None), + ("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True}, None), + ("view2d.ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None), + ("view2d.zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None), + ("view2d.zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS'}, None), + ("view2d.zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "repeat": True}, None), + ("view2d.zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "repeat": True}, None), + ("view2d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None), + ("view2d.smoothview", {"type": 'TIMER1', "value": 'ANY', "any": True}, None), + ("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None), + ("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None), + ("view2d.scroll_right", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None), + ("view2d.scroll_left", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None), + ("view2d.zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("view2d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None), + ("view2d.zoom_border", {"type": 'B', "value": 'PRESS', "shift": True}, None), + ("anim.keyframe_insert_by_name", {"type": 'S', "value": 'PRESS'}, None), + ], + }, + ), + ("Weight Paint", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("paint.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("paint.weight_sample", {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("paint.weight_sample_group", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, None), + ("paint.weight_gradient", + {"type": 'LEFTMOUSE', "value": 'PRESS'}, + {"properties": + [("type", 'LINEAR'), + ], + }, + ), + ("paint.weight_gradient", + {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True}, + {"properties": + [("type", 'RADIAL'), + ], + }, + ), + ("paint.weight_set", {"type": 'K', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("brush.scale_size", + {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, + {"properties": + [("scalar", 0.9), + ], + }, + ), + ("brush.scale_size", + {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True}, + {"properties": + [("scalar", 1.1111112), + ], + }, + ), + ("wm.radial_control", + {"type": 'F', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path_primary", 'tool_settings.weight_paint.brush.size'), + ("data_path_secondary", 'tool_settings.weight_paint.unified_paint_settings.size'), + ("use_secondary", 'tool_settings.weight_paint.unified_paint_settings.use_unified_size'), + ("rotation_path", 'tool_settings.weight_paint.brush.texture_slot.angle'), + ("color_path", 'tool_settings.weight_paint.brush.cursor_color_add'), + ("fill_color_path", ''), + ("fill_color_override_path", ''), + ("fill_color_override_test_path", ''), + ("zoom_path", ''), + ("image_id", 'tool_settings.weight_paint.brush'), + ("secondary_tex", False), + ], + }, + ), + ("wm.radial_control", + {"type": 'F', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("data_path_primary", 'tool_settings.weight_paint.brush.strength'), + ("data_path_secondary", 'tool_settings.weight_paint.unified_paint_settings.strength'), + ("use_secondary", 'tool_settings.weight_paint.unified_paint_settings.use_unified_strength'), + ("rotation_path", 'tool_settings.weight_paint.brush.texture_slot.angle'), + ("color_path", 'tool_settings.weight_paint.brush.cursor_color_add'), + ("fill_color_path", ''), + ("fill_color_override_path", ''), + ("fill_color_override_test_path", ''), + ("zoom_path", ''), + ("image_id", 'tool_settings.weight_paint.brush'), + ("secondary_tex", False), + ], + }, + ), + ("wm.radial_control", + {"type": 'F', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("data_path_primary", 'tool_settings.weight_paint.brush.weight'), + ("data_path_secondary", 'tool_settings.weight_paint.unified_paint_settings.weight'), + ("use_secondary", 'tool_settings.weight_paint.unified_paint_settings.use_unified_weight'), + ("rotation_path", 'tool_settings.weight_paint.brush.texture_slot.angle'), + ("color_path", 'tool_settings.weight_paint.brush.cursor_color_add'), + ("fill_color_path", ''), + ("fill_color_override_path", ''), + ("fill_color_override_test_path", ''), + ("zoom_path", ''), + ("image_id", 'tool_settings.weight_paint.brush'), + ("secondary_tex", False), + ], + }, + ), + ("wm.context_menu_enum", + {"type": 'E', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'tool_settings.vertex_paint.brush.stroke_method'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'M', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'weight_paint_object.data.use_paint_mask'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'V', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'weight_paint_object.data.use_paint_mask_vertex'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'S', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("data_path", 'tool_settings.weight_paint.brush.use_smooth_stroke'), + ], + }, + ), + ("wm.call_panel", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_PT_paint_weight_context_menu'), + ], + }, + ), + ("view3d.select", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None), + ], + }, + ), + ("Window", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("wm.read_homefile", {"type": 'N', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'O', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("name", 'TOPBAR_MT_file_open_recent'), + ], + }, + ), + ("wm.open_mainfile", {"type": 'O', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.save_mainfile", + {"type": 'S', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("check_existing", False), + ], + }, + ), + ("wm.save_as_mainfile", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("wm.quit_blender", {"type": 'Q', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'Q', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'SCREEN_MT_user_menu'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F1', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'FILE_BROWSER'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F2', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'CLIP_EDITOR'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F3', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'NODE_EDITOR'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F4', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'CONSOLE'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F5', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'VIEW_3D'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F6', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'GRAPH_EDITOR'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F7', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'PROPERTIES'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F8', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'SEQUENCE_EDITOR'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F9', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'OUTLINER'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F10', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'IMAGE_EDITOR'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F11', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'TEXT_EDITOR'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F12', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'DOPESHEET_EDITOR'), + ], + }, + ), + ("wm.call_menu", + {"type": 'NDOF_BUTTON_MENU', "value": 'PRESS'}, + {"properties": + [("name", 'USERPREF_MT_ndof_settings'), + ], + }, + ), + ("wm.context_scale_float", + {"type": 'NDOF_BUTTON_PLUS', "value": 'PRESS'}, + {"properties": + [("data_path", 'preferences.inputs.ndof_sensitivity'), + ("value", 1.1), + ], + }, + ), + ("wm.context_scale_float", + {"type": 'NDOF_BUTTON_MINUS', "value": 'PRESS'}, + {"properties": + [("data_path", 'preferences.inputs.ndof_sensitivity'), + ("value", 0.90909094), + ], + }, + ), + ("wm.context_scale_float", + {"type": 'NDOF_BUTTON_PLUS', "value": 'PRESS', "shift": True}, + {"properties": + [("data_path", 'preferences.inputs.ndof_sensitivity'), + ("value", 1.5), + ], + }, + ), + ("wm.context_scale_float", + {"type": 'NDOF_BUTTON_MINUS', "value": 'PRESS', "shift": True}, + {"properties": + [("data_path", 'preferences.inputs.ndof_sensitivity'), + ("value", 0.6666667), + ], + }, + ), + ("info.reports_display_update", {"type": 'TIMER_REPORT', "value": 'ANY', "any": True}, None), + ("wm.doc_view_manual_ui_context", {"type": 'F1', "value": 'PRESS', "repeat": True}, None), + ("wm.call_panel", + {"type": 'F2', "value": 'PRESS'}, + {"properties": + [("name", 'TOPBAR_PT_name'), + ], + }, + ), + ("wm.search_menu", {"type": 'F3', "value": 'PRESS', "repeat": True}, None), + ("wm.call_menu", + {"type": 'F4', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'TOPBAR_MT_window_specials'), + ], + }, + ), + ("wm.toolbar", {"type": 'SPACE', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("wm.tool_set_by_name", {"type": 'E', "value": 'PRESS', "repeat": True}, None), + ("wm.tool_set_by_name", {"type": 'R', "value": 'PRESS', "repeat": True}, None), + ("wm.tool_set_by_name", {"type": 'W', "value": 'PRESS', "repeat": True}, None), + ("wm.tool_set_by_name", {"type": 'Q', "value": 'PRESS', "repeat": True}, None), + ("wm.keyconfig_activate", {"type": 'NONE', "value": 'PRESS', "repeat": True}, None), + ("wm.context_toggle", + {"type": 'D', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("data_path", 'space_data.overlay.show_cursor'), + ], + }, + ), + ("wm.context_menu_enum", + {"type": 'A', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'space_data.shading.type'), + ], + }, + ), + ("wm.keyconfig_activate", {"type": 'F7', "value": 'PRESS', "repeat": True}, None), + ("wm.keyconfig_activate", {"type": 'F7', "value": 'PRESS', "repeat": True}, None), + ("wm.batch_rename", {"type": 'F2', "value": 'PRESS', "ctrl": True}, None), + ], + }, + ), + ] + + +if __name__ == "__main__": + # Only add keywords that are supported. + from bpy.app import version as blender_version + keywords = {} + if blender_version >= (2, 92, 0): + keywords["keyconfig_version"] = keyconfig_version + import os + from bl_keymap_utils.io import keyconfig_import_from_data + keyconfig_import_from_data( + os.path.splitext(os.path.basename(__file__))[0], + keyconfig_data, + **keywords, + ) diff --git a/scripts/addons/form_affinity_maya_config_pro/ops/__init__.py b/scripts/addons/form_affinity_maya_config_pro/ops/__init__.py new file mode 100644 index 0000000..7ee989f --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/ops/__init__.py @@ -0,0 +1,4 @@ +""" +Maya Config Pro - Operators Package +Operators and menus for the extension. +""" diff --git a/scripts/addons/form_affinity_maya_config_pro/ops/animation_menu.py b/scripts/addons/form_affinity_maya_config_pro/ops/animation_menu.py new file mode 100644 index 0000000..21c4275 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/ops/animation_menu.py @@ -0,0 +1,261 @@ +""" +Maya Config Pro - Animation Menu +Animation pie menu for rigging and animation workflows. +""" + +import bpy +from ..utils import compat +from bpy.types import Menu + + +# ------------------------------------------------------------------------ +# Animation Submenus +# ------------------------------------------------------------------------ + +class MCP_MT_AniSubEmpty(Menu): + """Create Empty/Null Submenu""" + bl_label = 'MCP_MT_AniSubEmpty' + + def draw(self, context): + layout = self.layout + layout.label(text="Create Empty/Null:") + layout.separator() + layout.operator("object.empty_add", text="Plain Axis", icon="EMPTY_AXIS").type='PLAIN_AXES' + layout.operator("object.empty_add", text="Arrows", icon="EMPTY_ARROWS").type='ARROWS' + layout.operator("object.empty_add", text="Single Arrow", icon="EMPTY_SINGLE_ARROW").type='SINGLE_ARROW' + layout.operator("object.empty_add", text="Circle", icon="MESH_CIRCLE").type='CIRCLE' + layout.operator("object.empty_add", text="Cube", icon="CUBE").type='CUBE' + layout.operator("object.empty_add", text="Sphere", icon="SPHERE").type='SPHERE' + layout.operator("object.empty_add", text="Cone", icon="CONE").type='CONE' + layout.operator("object.empty_add", text="Image", icon="IMAGE_DATA").type='IMAGE' + + +class MCP_MT_AniSubEditor(Menu): + """Editor Submenu""" + bl_label = 'MCP_MT_AniSubEditor' + + def draw(self, context): + layout = self.layout + layout.label(text="Editor:") + layout.separator() + layout.operator("mcp.split_area_timeline_ani", text="Timeline", icon="TIME") + layout.operator("mcp.dope_sheet_ani_menu", text="Dope Sheet", icon="ACTION") + + +class MCP_MT_AniSubFreeze(Menu): + """Freeze Transforms Submenu""" + bl_label = 'MCP_MT_AniSubFreeze' + + def draw(self, context): + layout = self.layout + layout.label(text="Freeze Transforms", icon="FREEZE") + layout.separator() + layout.operator("object.transforms_to_deltas", text="Clear All").mode='ALL' + layout.operator("object.transforms_to_deltas", text="Location").mode="LOC" + layout.operator("object.transforms_to_deltas", text="Rotation").mode="ROT" + layout.operator("object.transforms_to_deltas", text="Scale").mode="SCALE" + layout.separator() + layout.label(text="Reset Transforms", icon="LOOP_BACK") + layout.separator() + layout.operator("object.location_clear", text="Location").clear_delta=False + layout.operator("object.rotation_clear", text="Rotation").clear_delta=False + layout.operator("object.scale_clear", text="Scale").clear_delta=False + layout.operator("object.origin_clear", text="Origin") + + +# ------------------------------------------------------------------------ +# Main Animation Menu +# ------------------------------------------------------------------------ + +class MCP_MT_AnimationMenu(Menu): + """FA Animation Menu""" + bl_label = "FA Animation Menu" + bl_idname = "MCP_MT_AnimationMenu" + + def draw(self, context): + layout = self.layout + pie = layout.menu_pie() + + pie.operator('wm.link', text="Link", icon="LINKED") + pie.operator("mcp.pose_mode_ani_menu", text="Pose Mode", icon="POSE_HLT") + pie.operator('armature.extrude_move', text="Extrude Bone", icon="AXIS_TOP") + pie.operator('mcp.split_area_timeline_ani', text="", icon="TIME") + pie.operator("view3d.localview", text="Isolate", icon="BORDERMOVE") + pie.operator("object.mode_set", text="Object", icon="OBJECT_DATA") + pie.operator('wm.append', text="Append", icon="APPEND_BLEND") + pie.operator('object.mode_set', text="Edit Mode", icon="EDITMODE_HLT").mode='EDIT' + pie.separator() + pie.separator() + + other = pie.column() + gap = other.column() + gap.separator() + gap.scale_y = 6 + other_menu = other.box().column().split() + + other_menu.scale_y = 1.1 + other_menu.operator('object.armature_add', text="+ Armature", icon="OUTLINER_OB_ARMATURE") + other_menu.operator('mcp.graph_editor_ani_menu', text="", icon="GRAPH") + other_menu.operator('mcp.dope_sheet_ani_menu', text="", icon="ACTION") + other_menu.operator('mcp.drivers_ani_menu', text="", icon="DRIVER") + split = layout.split() + col = split.column() + other_menu.menu('MCP_MT_AniSubEditor', icon='STATUSBAR', text='') + other_menu = other.box().column().split() + other_menu.operator('mcp.drop_to_floor_ani_menu', text="", icon='TRIA_DOWN') + other_menu.operator('anim.keyframe_insert_menu', text="", icon="DECORATE_ANIMATE") + other_menu.menu('MCP_MT_AniSubEmpty', icon='EMPTY_AXIS', text='') + other_menu = other.box().column().split() + other_menu.operator("screen.screen_full_area", text="Max Screen", icon="FULLSCREEN_ENTER") + other_menu.menu('MCP_MT_AniSubFreeze', icon='FREEZE', text='') + + +# ------------------------------------------------------------------------ +# Animation Operators +# ------------------------------------------------------------------------ + +class MCP_OT_DropToFloorAniMenu(bpy.types.Operator): + """Drop/Raise Object to Floor""" + bl_label = "Drop to Floor" + bl_idname = "mcp.drop_to_floor_ani_menu" + + def execute(self, context): + for obj in context.selected_objects: + mx = obj.matrix_world + minz = min((mx @ v.co).z for v in obj.data.vertices) + mx.translation.z -= minz + return {'FINISHED'} + + +class MCP_OT_SplitAreaTimelineAniMenu(bpy.types.Operator): + """Timeline""" + bl_label = "Split Area" + bl_idname = 'mcp.split_area_timeline_ani' + + def execute(self, context): + for area in bpy.context.screen.areas: + if area.type == 'VIEW_3D': + with bpy.context.temp_override(area=area): + bpy.ops.screen.area_split(direction='HORIZONTAL', factor=0.20) + bpy.context.screen.areas[-1].ui_type = 'DOPESHEET' + return {'FINISHED'} + + +class MCP_OT_DopeSheetAniMenu(bpy.types.Operator): + """Dope Sheet""" + bl_label = "Dope Sheet" + bl_idname = 'mcp.dope_sheet_ani_menu' + + def execute(self, context): + render = bpy.context.scene.render + render.resolution_x = 1000 + render.resolution_y = 600 + render.resolution_percentage = 100 + + bpy.ops.render.view_show("INVOKE_DEFAULT") + + area = bpy.context.window_manager.windows[-1].screen.areas[0] + area.type = "DOPESHEET_EDITOR" + + return {'FINISHED'} + + +class MCP_OT_PoseModeAniMenu(bpy.types.Operator): + """Pose Mode""" + bl_label = "Pose Mode" + bl_idname = 'mcp.pose_mode_ani_menu' + + @classmethod + def poll(cls, context): + active_object = context.active_object + return active_object is not None and active_object.type == 'ARMATURE' and (context.mode == 'EDIT_MESH' or active_object.select_get()) + + def execute(self, context): + bpy.ops.object.mode_set(mode='POSE') + return {'FINISHED'} + + +class MCP_OT_SplitAreaAniMenu(bpy.types.Operator): + """Timeline""" + bl_label = "Split Area" + bl_idname = 'mcp.split_area_ani_menu' + + def execute(self, context): + for area in bpy.context.screen.areas: + if area.type == 'VIEW_3D': + with bpy.context.temp_override(area=area): + bpy.ops.screen.area_split(direction='HORIZONTAL', factor=0.25) + bpy.context.screen.areas[-1].type = 'DOPESHEET_EDITOR' + return {'FINISHED'} + + +class MCP_OT_SplitArea2AniMenu(bpy.types.Operator): + """Dope Sheet""" + bl_label = "Split Area" + bl_idname = 'mcp.split_area2_ani_menu' + + def execute(self, context): + for area in bpy.context.screen.areas: + if area.type == 'VIEW_3D': + with bpy.context.temp_override(area=area): + bpy.ops.screen.area_split(direction='HORIZONTAL', factor=0.25) + bpy.context.screen.areas[-1].type = 'DOPESHEET_EDITOR' + return {'FINISHED'} + + +class MCP_OT_GraphEditorAniMenu(bpy.types.Operator): + """Graph Editor""" + bl_label = "Graph Editor" + bl_idname = 'mcp.graph_editor_ani_menu' + + def execute(self, context): + render = bpy.context.scene.render + render.resolution_x = 1000 + render.resolution_y = 600 + render.resolution_percentage = 100 + + bpy.ops.render.view_show("INVOKE_DEFAULT") + + area = bpy.context.window_manager.windows[-1].screen.areas[0] + area.type = "GRAPH_EDITOR" + + return {'FINISHED'} + + +class MCP_OT_DriversAniMenu(bpy.types.Operator): + """Drivers Editor""" + bl_label = "Drivers Editor" + bl_idname = 'mcp.drivers_ani_menu' + + def execute(self, context): + bpy.ops.screen.drivers_editor_show() + return {'FINISHED'} + + +# Class list to register +_classes = [ + # Menus + MCP_MT_AniSubEmpty, + MCP_MT_AniSubEditor, + MCP_MT_AniSubFreeze, + MCP_MT_AnimationMenu, + # Operators + MCP_OT_DropToFloorAniMenu, + MCP_OT_SplitAreaTimelineAniMenu, + MCP_OT_DopeSheetAniMenu, + MCP_OT_PoseModeAniMenu, + MCP_OT_SplitAreaAniMenu, + MCP_OT_SplitArea2AniMenu, + MCP_OT_GraphEditorAniMenu, + MCP_OT_DriversAniMenu, +] + + +def register(): + for cls in _classes: + compat.safe_register_class(cls) + + +def unregister(): + for cls in reversed(_classes): + compat.safe_unregister_class(cls) diff --git a/scripts/addons/form_affinity_maya_config_pro/ops/animation_timeline.py b/scripts/addons/form_affinity_maya_config_pro/ops/animation_timeline.py new file mode 100644 index 0000000..eb5297a --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/ops/animation_timeline.py @@ -0,0 +1,38 @@ +""" +Maya Config Pro - Animation Timeline +Timeline key manipulation operators. +""" + +import bpy +from ..utils import compat + + +# ------------------------------------------------------------------------ +# Key Move Operator +# ------------------------------------------------------------------------ + +class MCP_OT_KeyMove(bpy.types.Operator): + """Copy/Transform Keys in Timeline""" + bl_idname = "mcp.key_move" + bl_label = "FA Transform Keys" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.action.duplicate_move() + return {'FINISHED'} + + +# Class list to register +_classes = [ + MCP_OT_KeyMove, +] + + +def register(): + for cls in _classes: + compat.safe_register_class(cls) + + +def unregister(): + for cls in reversed(_classes): + compat.safe_unregister_class(cls) diff --git a/scripts/addons/form_affinity_maya_config_pro/ops/delete_ops.py b/scripts/addons/form_affinity_maya_config_pro/ops/delete_ops.py new file mode 100644 index 0000000..1014e85 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/ops/delete_ops.py @@ -0,0 +1,51 @@ +""" +Maya Config Pro - Delete Without Confirm +Deletes element based on mesh select mode without confirmation. +""" + +import bpy +from ..utils import compat + + +class MCP_OT_DeleteWithoutConfirm(bpy.types.Operator): + """Deletes element from msm without confirmation""" + bl_idname = "mcp.delete_without_confirm" + bl_label = "Delete Without Confirm" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + # get msm + msm = bpy.context.tool_settings.mesh_select_mode + + # cancel if no active + if not bpy.context.active_object: + return {'FINISHED'} + + if bpy.context.active_object.mode == "EDIT": + if msm[0]: + # delete verts + bpy.ops.mesh.delete(type='VERT') + elif msm[1]: + # delete edges + bpy.ops.mesh.delete(type='EDGE') + elif msm[2]: + # delete faces + bpy.ops.mesh.delete(type='FACE') + + return {'FINISHED'} + + +# Class list to register +_classes = [ + MCP_OT_DeleteWithoutConfirm, +] + + +def register(): + for cls in _classes: + compat.safe_register_class(cls) + + +def unregister(): + for cls in reversed(_classes): + compat.safe_unregister_class(cls) diff --git a/scripts/addons/form_affinity_maya_config_pro/ops/deploy_ops.py b/scripts/addons/form_affinity_maya_config_pro/ops/deploy_ops.py new file mode 100644 index 0000000..db78763 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/ops/deploy_ops.py @@ -0,0 +1,117 @@ +""" +Operators: deploy bundled assets and activate user keymap presets safely. +""" + +import os + +import bpy + +from ..utils import compat +from ..utils import deploy as deploy_util + + +class MCP_OT_DeployKeymapPresets(bpy.types.Operator): + bl_idname = "mcp.deploy_keymap_presets" + bl_label = "Deploy Keymap Presets" + bl_description = ( + "Copy Blender default keymaps (and MCP fa_hotkeys) into your user scripts folder " + "so keymap switching buttons work" + ) + bl_options = {"REGISTER", "INTERNAL"} + + def execute(self, context): + ok, msg = deploy_util.deploy_keymap_presets() + if ok: + self.report({"INFO"}, msg.replace("\n", " - ")) + else: + self.report({"ERROR"}, msg) + return {"FINISHED"} if ok else {"CANCELLED"} + + +class MCP_OT_DeployStartupBlend(bpy.types.Operator): + bl_idname = "mcp.deploy_startup_blend" + bl_label = "Deploy startup.blend" + bl_description = "Copy bundled startup.blend into your user config folder" + bl_options = {"REGISTER", "INTERNAL"} + + @classmethod + def poll(cls, context): + return deploy_util.is_startup_bundle_available() + + def execute(self, context): + ok, msg = deploy_util.deploy_startup_blend() + if ok: + self.report({"INFO"}, msg.replace("\n", " - ")) + else: + self.report({"ERROR"}, msg) + return {"FINISHED"} if ok else {"CANCELLED"} + + +class MCP_OT_ActivateKeymapPreset(bpy.types.Operator): + bl_idname = "mcp.activate_keymap_preset" + bl_label = "Activate Keymap" + bl_options = {"REGISTER"} + + preset: bpy.props.EnumProperty( + name="Preset", + items=( + ("BLENDER", "Blender", "Blender default keymap"), + ("FA_HOTKEYS", "FA Hotkeys", "Maya Config Pro FA hotkeys"), + ("INDUSTRY", "Industry Compatible", "Industry Compatible keymap"), + ), + ) + + def execute(self, context): + if not deploy_util.is_keyconfig_deployed(): + self.report( + {"ERROR"}, + "Keymap presets are not deployed. " + "Edit → Preferences → Add-ons → Maya Config Pro → Deploy keymap presets.", + ) + return {"CANCELLED"} + + names = { + "BLENDER": "Blender.py", + "FA_HOTKEYS": "fa_hotkeys.py", + "INDUSTRY": "Industry_Compatible.py", + } + filename = names[self.preset] + filepath = os.path.join(deploy_util.user_keyconfig_dir(), filename) + if not os.path.isfile(filepath): + self.report( + {"ERROR"}, + f"Missing {filename}. Open Preferences and run Deploy keymap presets again.", + ) + return {"CANCELLED"} + + try: + bpy.ops.preferences.keyconfig_activate(filepath=filepath) + except Exception as e: + self.report({"ERROR"}, f"Could not activate keymap: {e}") + return {"CANCELLED"} + + # Maya-style Alt+RMB zoom uses horizontal mouse drag; Blender default uses vertical. + inputs = context.preferences.inputs + if self.preset == "FA_HOTKEYS": + inputs.view_zoom_axis = "HORIZONTAL" + elif self.preset in {"BLENDER", "INDUSTRY"}: + inputs.view_zoom_axis = "VERTICAL" + + return {"FINISHED"} + + +_classes = ( + MCP_OT_DeployKeymapPresets, + MCP_OT_DeployStartupBlend, + MCP_OT_ActivateKeymapPreset, +) + + +def register(): + for cls in _classes: + compat.safe_register_class(cls) + + +def unregister(): + for cls in reversed(_classes): + compat.safe_unregister_class(cls) diff --git a/scripts/addons/form_affinity_maya_config_pro/ops/marking_menu.py b/scripts/addons/form_affinity_maya_config_pro/ops/marking_menu.py new file mode 100644 index 0000000..fa2eaab --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/ops/marking_menu.py @@ -0,0 +1,333 @@ +""" +Maya Config Pro - Marking Menu +Maya-style marking menu (pie menu) with create, mode switch, freeze transforms, and snap options. +""" + +import bpy +from ..utils import compat +from bpy.types import Menu + + +# ------------------------------------------------------------------------ +# Sub Menus +# ------------------------------------------------------------------------ + +class MCP_MT_SubCreate(Menu): + """Create Objects Submenu""" + bl_label = 'MCP_MT_SubCreate' + + def draw(self, context): + layout = self.layout + layout.label(text="Create:") + layout.separator() + layout.operator("mesh.primitive_plane_add", text="Plane", icon="MESH_PLANE") + layout.operator("mesh.primitive_cube_add", text="Cube", icon="MESH_CUBE") + layout.operator("mesh.primitive_circle_add", text="Circle", icon="MESH_CIRCLE") + layout.operator("mesh.primitive_uv_sphere_add", text="UV Sphere", icon="MESH_UVSPHERE") + layout.operator("mesh.primitive_ico_sphere_add", text="Ico Sphere", icon="MESH_ICOSPHERE") + layout.operator("mesh.primitive_cylinder_add", text="Cylinder", icon="MESH_CYLINDER") + layout.operator("mesh.primitive_cone_add", text="Cone", icon="MESH_CONE") + layout.operator("mesh.primitive_torus_add", text="Torus", icon="MESH_TORUS") + layout.operator("object.empty_add", text="Null", icon="EMPTY_AXIS").type='PLAIN_AXES' + layout.separator() + layout.operator("object.light_add", text="Point", icon="LIGHT_POINT").type="POINT" + layout.operator("object.light_add", text="Sun", icon="LIGHT_SUN").type="SUN" + layout.operator("object.light_add", text="Spot", icon="LIGHT_SPOT").type="SPOT" + layout.operator("object.light_add", text="Area", icon="LIGHT_AREA").type="AREA" + layout.separator() + layout.operator("object.camera_add", text="Camera", icon="OUTLINER_DATA_CAMERA") + + +class MCP_MT_SubMode(Menu): + """Mode Switch Submenu""" + bl_label = 'MCP_MT_SubMode' + + def draw(self, context): + layout = self.layout + layout.label(text="Mode:") + layout.separator() + layout.operator("object.mode_set", text="Sculpt", icon="SCULPTMODE_HLT").mode='SCULPT' + layout.operator("object.mode_set", text="Vertex Paint", icon="VPAINT_HLT").mode='VERTEX_PAINT' + layout.operator("object.mode_set", text="Weight Paint", icon="WPAINT_HLT").mode='WEIGHT_PAINT' + layout.operator("object.mode_set", text="Texture Paint", icon="TPAINT_HLT").mode='TEXTURE_PAINT' + + +class MCP_MT_SubFreeze(Menu): + """Freeze/Reset Transforms Submenu""" + bl_label = 'MCP_MT_SubFreeze' + + def draw(self, context): + layout = self.layout + layout.label(text="Freeze Transforms", icon="FREEZE") + layout.separator() + layout.operator("object.transforms_to_deltas", text="Clear All").mode='ALL' + layout.operator("object.transforms_to_deltas", text="Location").mode="LOC" + layout.operator("object.transforms_to_deltas", text="Rotation").mode="ROT" + layout.operator("object.transforms_to_deltas", text="Scale").mode="SCALE" + layout.separator() + layout.label(text="Reset Transforms", icon="LOOP_BACK") + layout.separator() + layout.operator("object.location_clear", text="Location").clear_delta=False + layout.operator("object.rotation_clear", text="Rotation").clear_delta=False + layout.operator("object.scale_clear", text="Scale").clear_delta=False + layout.operator("object.origin_clear", text="Origin") + + +class MCP_MT_SubSnap(Menu): + """Snap Options Submenu""" + bl_label = 'MCP_MT_SubSnap' + + def draw(self, context): + layout = self.layout + layout.label(icon="SNAP_ON") + layout.separator() + layout.operator("mcp.vertex_snap", text="Vertex", icon='SNAP_ON') + layout.operator("mcp.grid_snap", text="Grid", icon='SNAP_ON') + layout.operator("mcp.edge_snap", text="Curve", icon='SNAP_ON') + layout.operator("mcp.face_snap", text="Face", icon='SNAP_ON') + layout.operator("mcp.off_snap", text="SnapOff", icon='SNAP_OFF') + layout.operator("mcp.show_origin", text="Origin", icon='OBJECT_ORIGIN') + layout.operator("mcp.hide_origin", text="Origin Hide", icon='TRANSFORM_ORIGINS') + + +# ------------------------------------------------------------------------ +# Main Marking Menu +# ------------------------------------------------------------------------ + +class MCP_MT_MarkingMenu(Menu): + """FA Marking Menu""" + bl_label = "FA Marking Menu" + bl_idname = "MCP_MT_MarkingMenu" + + def draw(self, context): + layout = self.layout + pie = layout.menu_pie() + + pie.operator("mcp.msm_from_object", text="Vertex", icon='VERTEXSEL').mode = 'vert' + pie.operator("mcp.multi", text="Multi", icon='EDITMODE_HLT') + pie.operator("object.shade_smooth", text="Smooth", icon="MOD_SMOOTH") + pie.operator("mcp.msm_from_object", text="Edge", icon='EDGESEL').mode = 'edge' + pie.operator("view3d.localview", text="Isolate", icon="BORDERMOVE") + pie.operator("object.mode_set", text="Object", icon="OBJECT_DATA") + pie.operator("object.shade_flat", text="Shade Flat", icon="MOD_WIREFRAME") + pie.operator("mcp.msm_from_object", text="Face", icon='FACESEL').mode = 'face' + pie.separator() + pie.separator() + + other = pie.column() + gap = other.column() + gap.separator() + gap.scale_y = 6 + other_menu = other.box().column().split() + + other_menu.scale_y = 1.1 + op = other_menu.operator("mesh.select_all", text="", icon="UV_SYNC_SELECT") + if op: + op.action = "INVERT" + op = other_menu.operator("mesh.select_all", text="", icon="SELECT_EXTEND") + if op: + op.action = "SELECT" + op = other_menu.operator("mesh.select_all", text="", icon="SELECT_SUBTRACT") + if op: + op.action = "DESELECT" + op = other_menu.operator("mesh.loop_multi_select", text="", icon="ANCHOR_LEFT") + if op: + op.ring = False + op = other_menu.operator("mesh.loop_multi_select", text="", icon="ANCHOR_TOP") + if op: + op.ring = True + other_menu.operator("mesh.select_more", text="", icon="ADD") + other_menu.operator("mesh.select_less", text="", icon="REMOVE") + + split = layout.split() + col = split.column() + other_menu.menu('MCP_MT_SubCreate', icon='RIGHTARROW_THIN', text='Add') + other_menu = other.box().column().split() + other_menu.operator("screen.screen_full_area", text='', icon="FULLSCREEN_ENTER") + other_menu.operator("mcp.subdivide", text="", icon="MOD_MULTIRES") + other_menu.operator("mcp.unsubdivide", text="", icon="MESH_PLANE") + other_menu.operator("mesh.flip_normals", text="", icon="NORMALS_FACE") + other_menu.operator("mesh.merge", text="", icon="AUTOMERGE_ON") + other_menu.operator("mesh.remove_doubles", text="", icon="AUTOMERGE_OFF") + + other_menu.menu('MCP_MT_SubFreeze', icon='FREEZE', text='') + other_menu = other.box().column().split() + other_menu.prop(bpy.context.space_data.overlay, 'show_wireframes', text='', icon='MESH_UVSPHERE', toggle=True) + obj = context.object + if obj is not None: + other_menu.prop(obj, 'show_wire', text='', icon='SHADING_WIRE', toggle=True) + other_menu.menu('MCP_MT_SubMode', icon='SCULPTMODE_HLT', text='') + other_menu.menu('MCP_MT_SubSnap', text='', icon='SNAP_ON') + + +# ------------------------------------------------------------------------ +# Utility Operators for Marking Menu +# ------------------------------------------------------------------------ + +class MCP_OT_Multi(bpy.types.Operator): + """Multi Sub-Component Mode""" + bl_label = "Multi" + bl_idname = "mcp.multi" + + def execute(self, context): + bpy.ops.object.mode_set(mode='EDIT') + bpy.context.tool_settings.mesh_select_mode = (True, True, True) + return {'FINISHED'} + + +class MCP_OT_Subdivide(bpy.types.Operator): + """Subdivide Object""" + bl_label = "Subdivide" + bl_idname = "mcp.subdivide_mm" + + def execute(self, context): + bpy.ops.object.mode_set(mode='EDIT') + bpy.context.tool_settings.mesh_select_mode = (False, True, False) + bpy.ops.mesh.select_all(action='SELECT') + bpy.ops.mesh.subdivide() + return {'FINISHED'} + + +class MCP_OT_Unsubdivide(bpy.types.Operator): + """Un-Subdivide Object""" + bl_label = "Un-Subdivide" + bl_idname = "mcp.unsubdivide_mm" + + def execute(self, context): + bpy.ops.object.mode_set(mode='EDIT') + bpy.context.tool_settings.mesh_select_mode = (False, True, False) + bpy.ops.mesh.select_all(action='SELECT') + bpy.ops.mesh.unsubdivide() + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Origin Operators +# ------------------------------------------------------------------------ + +class MCP_OT_ShowOrigin(bpy.types.Operator): + """Show Origin""" + bl_idname = "mcp.show_origin" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.context.scene.tool_settings.use_transform_data_origin = True + return {'FINISHED'} + + +class MCP_OT_HideOrigin(bpy.types.Operator): + """Hide Origin""" + bl_idname = "mcp.hide_origin" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.context.scene.tool_settings.use_transform_data_origin = False + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Snap Operators +# ------------------------------------------------------------------------ + +class MCP_OT_VertexSnap(bpy.types.Operator): + """Vertex Snapping""" + bl_idname = "mcp.vertex_snap" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.mcp.show_origin() + bpy.ops.wm.tool_set_by_id(name="builtin.move") + bpy.context.scene.tool_settings.use_snap = True + bpy.context.scene.tool_settings.snap_elements_base = {'VERTEX'} + return {'FINISHED'} + + +class MCP_OT_GridSnap(bpy.types.Operator): + """Grid Snapping""" + bl_idname = "mcp.grid_snap" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.mcp.show_origin() + bpy.ops.wm.tool_set_by_id(name="builtin.move") + bpy.context.scene.tool_settings.use_snap = True + bpy.context.scene.tool_settings.snap_elements_base = {'INCREMENT'} + return {'FINISHED'} + + +class MCP_OT_EdgeSnap(bpy.types.Operator): + """Edge Snapping""" + bl_idname = "mcp.edge_snap" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.mcp.show_origin() + bpy.ops.wm.tool_set_by_id(name="builtin.move") + bpy.context.scene.tool_settings.use_snap = True + bpy.context.scene.tool_settings.snap_elements_base = {'EDGE'} + return {'FINISHED'} + + +class MCP_OT_FaceSnap(bpy.types.Operator): + """Face Snapping""" + bl_idname = "mcp.face_snap" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.mcp.show_origin() + bpy.ops.wm.tool_set_by_id(name="builtin.move") + bpy.context.scene.tool_settings.use_snap = True + bpy.context.scene.tool_settings.snap_elements_base = {'FACE'} + return {'FINISHED'} + + +class MCP_OT_OffSnap(bpy.types.Operator): + """Turn Off Snapping""" + bl_idname = "mcp.off_snap" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.mcp.show_origin() + bpy.ops.wm.tool_set_by_id(name="builtin.move") + bpy.context.scene.tool_settings.use_snap = False + bpy.context.scene.tool_settings.snap_elements_base = {'INCREMENT'} + return {'FINISHED'} + + +# Class list to register +_classes = [ + # Menus + MCP_MT_SubCreate, + MCP_MT_SubMode, + MCP_MT_SubFreeze, + MCP_MT_SubSnap, + MCP_MT_MarkingMenu, + # Operators + MCP_OT_Multi, + MCP_OT_Subdivide, + MCP_OT_Unsubdivide, + MCP_OT_ShowOrigin, + MCP_OT_HideOrigin, + MCP_OT_VertexSnap, + MCP_OT_GridSnap, + MCP_OT_EdgeSnap, + MCP_OT_FaceSnap, + MCP_OT_OffSnap, +] + + +def register(): + for cls in _classes: + compat.safe_register_class(cls) + + +def unregister(): + for cls in reversed(_classes): + compat.safe_unregister_class(cls) diff --git a/scripts/addons/form_affinity_maya_config_pro/ops/mesh_select_mode.py b/scripts/addons/form_affinity_maya_config_pro/ops/mesh_select_mode.py new file mode 100644 index 0000000..4604aca --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/ops/mesh_select_mode.py @@ -0,0 +1,52 @@ +""" +Maya Config Pro - Mesh Select Mode +Switches to object mode and changes mesh select mode. +""" + +import bpy +from ..utils import compat + + +class MCP_OT_MsmFromObject(bpy.types.Operator): + """Switches to object mode and changes mesh select mode""" + bl_idname = "mcp.msm_from_object" + bl_label = "Mesh Select Mode" + bl_options = {'REGISTER', 'UNDO'} + + mode: bpy.props.StringProperty( + name="mode", + default="vert" + ) + + def execute(self, context): + if len(bpy.context.selected_objects) < 1: + self.report({'WARNING'}, 'No object selected') + return {'FINISHED'} + + if bpy.context.object.mode == 'OBJECT': + bpy.ops.object.mode_set(mode='EDIT', toggle=False) + + if self.mode == 'vert': + bpy.context.tool_settings.mesh_select_mode = (True, False, False) + elif self.mode == 'edge': + bpy.context.tool_settings.mesh_select_mode = (False, True, False) + elif self.mode == 'face': + bpy.context.tool_settings.mesh_select_mode = (False, False, True) + + return {'FINISHED'} + + +# Class list to register +_classes = [ + MCP_OT_MsmFromObject, +] + + +def register(): + for cls in _classes: + compat.safe_register_class(cls) + + +def unregister(): + for cls in reversed(_classes): + compat.safe_unregister_class(cls) diff --git a/scripts/addons/form_affinity_maya_config_pro/ops/object_select.py b/scripts/addons/form_affinity_maya_config_pro/ops/object_select.py new file mode 100644 index 0000000..8bd3494 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/ops/object_select.py @@ -0,0 +1,124 @@ +""" +Maya Config Pro - Object to Object Select +Raycast object selection while in edit mode. +""" + +import bpy +from ..utils import compat +from bpy_extras import view3d_utils + + +def select_obj(context, event, deselect_first=True): + """Select object under cursor while in edit mode""" + if deselect_first: + obj = context.object + bpy.ops.object.mode_set(mode='OBJECT') + ray_cast(context, event) + if deselect_first: + obj.select_set(False) + bpy.ops.object.mode_set(mode='EDIT') + + +def ray_cast(context, event): + """Run this function on left mouse, execute the ray cast""" + # get the context arguments + scene = context.scene + region = context.region + rv3d = context.region_data + coord = event.mouse_region_x, event.mouse_region_y + + # get the ray from the viewport and mouse + view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord) + ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord) + ray_target = ray_origin + view_vector + + def visible_objects_and_duplis(): + """Loop over (object, matrix) pairs (mesh only)""" + depsgraph = context.evaluated_depsgraph_get() + for dup in depsgraph.object_instances: + if dup.is_instance: # Real dupli instance + obj = dup.instance_object + yield (obj, dup.matrix_world.copy()) + else: # Usual object + obj = dup.object + yield (obj, obj.matrix_world.copy()) + + def obj_ray_cast(obj, matrix): + """Wrapper for ray casting that moves the ray into object space""" + # get the ray relative to the object + matrix_inv = matrix.inverted() + ray_origin_obj = matrix_inv @ ray_origin + ray_target_obj = matrix_inv @ ray_target + ray_direction_obj = ray_target_obj - ray_origin_obj + + # cast the ray + success, location, normal, face_index = obj.ray_cast(ray_origin_obj, ray_direction_obj) + + if success: + return location, normal, face_index + else: + return None, None, None + + # cast rays and find the closest object + best_length_squared = -1.0 + best_obj = None + + for obj, matrix in visible_objects_and_duplis(): + if obj.type == 'MESH': + hit, normal, face_index = obj_ray_cast(obj, matrix) + if hit is not None: + hit_world = matrix @ hit + scene.cursor.location = hit_world + length_squared = (hit_world - ray_origin).length_squared + if best_obj is None or length_squared < best_length_squared: + best_length_squared = length_squared + best_obj = obj + bpy.ops.view3d.snap_cursor_to_center() + + # now we have the object under the mouse cursor, + # we could do lots of stuff but for the example just select. + if best_obj is not None: + # for selection etc. we need the original object, + # evaluated objects are not in viewlayer + best_original = best_obj.original + best_original.select_set(True) + context.view_layer.objects.active = best_original + else: + bpy.ops.object.mode_set(mode='OBJECT') + + +class MCP_OT_ViewOperatorRayCast(bpy.types.Operator): + """Modal object selection with a ray cast""" + bl_idname = "mcp.modal_operator_raycast" + bl_label = "FA Object 2 Object" + + def invoke(self, context, event): + print('invoke') + bpy.ops.view3d.select(extend=False, deselect=False, toggle=False, deselect_all=True, select_passthrough=False, center=False, enumerate=False, object=False, location=(0, 0)) + + if context.space_data.type == 'VIEW_3D': + if bpy.context.mode == 'EDIT_MESH': + select_obj(context, event) + return {'FINISHED'} + else: + self.report({'WARNING'}, "Edit Mode only") + return {'PASS_THROUGH'} + else: + self.report({'WARNING'}, "Active space must be a View3d") + return {'PASS_THROUGH'} + + +# Class list to register +_classes = [ + MCP_OT_ViewOperatorRayCast, +] + + +def register(): + for cls in _classes: + compat.safe_register_class(cls) + + +def unregister(): + for cls in reversed(_classes): + compat.safe_unregister_class(cls) diff --git a/scripts/addons/form_affinity_maya_config_pro/ops/quadview.py b/scripts/addons/form_affinity_maya_config_pro/ops/quadview.py new file mode 100644 index 0000000..08cdd91 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/ops/quadview.py @@ -0,0 +1,290 @@ +""" +Maya Config Pro - Quad View Menu +Quad view menu with orthographic views and camera controls. +""" + +import bpy +from ..utils import compat +from bpy.types import Menu + + +# ------------------------------------------------------------------------ +# Main Quad Menu +# ------------------------------------------------------------------------ + +class MCP_MT_QuadMenu(Menu): + """FA Quad Menu""" + bl_label = "FA Quad Menu" + bl_idname = "MCP_MT_QuadMenu" + + def draw(self, context): + layout = self.layout + pie = layout.menu_pie() + pie.operator("mcp.left_ortho", text="Left", icon='VIEW_ORTHO') + pie.operator("mcp.right_ortho", text="Right", icon='VIEW_ORTHO') + pie.operator("mcp.bottom_ortho", text="Bottom", icon='VIEW_ORTHO') + pie.operator("mcp.top_ortho", text="Top", icon='VIEW_ORTHO') + pie.operator("mcp.front_ortho", text="Front", icon='VIEW_ORTHO') + pie.operator("mcp.back_ortho", text="Back", icon='VIEW_ORTHO') + pie.operator("view3d.view_persportho", text="Persp/Ortho", icon="ARROW_LEFTRIGHT") + pie.operator("screen.region_quadview", text="QuadView", icon='VIEW_PERSPECTIVE') + pie.separator() + pie.separator() + + other = pie.column() + gap = other.column() + gap.separator() + gap.scale_y = 7 + other_menu = other.box().column() + other_menu.scale_y = 1.3 + other_menu.operator("mcp.split_view", text="Vertical Split", icon='SPREADSHEET') + other_menu.operator("mcp.split_view_h", text="Horizontal Split", icon='SPREADSHEET') + other_menu.operator("view3d.view_camera", text="Active Cam", icon='CAMERA_DATA') + other_menu.operator('mcp.cam_view_lock', text="View Lock", icon='CON_CAMERASOLVER') + other_menu.operator("view3d.camera_to_view", text="Cam To View", icon="RESTRICT_VIEW_ON") + other_menu.operator("screen.screen_full_area", text="Max Screen", icon="FULLSCREEN_ENTER") + + +# ------------------------------------------------------------------------ +# Orthographic View Operators +# ------------------------------------------------------------------------ + +class MCP_OT_LeftOrtho(bpy.types.Operator): + """Orthographic View Left""" + bl_idname = "mcp.left_ortho" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.view3d.view_axis(type='LEFT') + C = bpy.context + for i, a in enumerate(C.screen.areas): + if a.type == "VIEW_3D": + space = a.spaces.active + space.region_3d.view_perspective = 'ORTHO' + return {'FINISHED'} + + +class MCP_OT_RightOrtho(bpy.types.Operator): + """Orthographic View Right""" + bl_idname = "mcp.right_ortho" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.view3d.view_axis(type='RIGHT') + C = bpy.context + for i, a in enumerate(C.screen.areas): + if a.type == "VIEW_3D": + space = a.spaces.active + space.region_3d.view_perspective = 'ORTHO' + return {'FINISHED'} + + +class MCP_OT_BottomOrtho(bpy.types.Operator): + """Orthographic View Bottom""" + bl_idname = "mcp.bottom_ortho" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.view3d.view_axis(type='BOTTOM') + C = bpy.context + for i, a in enumerate(C.screen.areas): + if a.type == "VIEW_3D": + space = a.spaces.active + space.region_3d.view_perspective = 'ORTHO' + return {'FINISHED'} + + +class MCP_OT_TopOrtho(bpy.types.Operator): + """Orthographic View Top""" + bl_idname = "mcp.top_ortho" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.view3d.view_axis(type='TOP') + C = bpy.context + for i, a in enumerate(C.screen.areas): + if a.type == "VIEW_3D": + space = a.spaces.active + space.region_3d.view_perspective = 'ORTHO' + return {'FINISHED'} + + +class MCP_OT_FrontOrtho(bpy.types.Operator): + """Orthographic View Front""" + bl_idname = "mcp.front_ortho" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.view3d.view_axis(type='FRONT') + C = bpy.context + for i, a in enumerate(C.screen.areas): + if a.type == "VIEW_3D": + space = a.spaces.active + space.region_3d.view_perspective = 'ORTHO' + return {'FINISHED'} + + +class MCP_OT_BackOrtho(bpy.types.Operator): + """Orthographic View Back""" + bl_idname = "mcp.back_ortho" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.view3d.view_axis(type='BACK') + C = bpy.context + for i, a in enumerate(C.screen.areas): + if a.type == "VIEW_3D": + space = a.spaces.active + space.region_3d.view_perspective = 'ORTHO' + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# View Split Operators +# ------------------------------------------------------------------------ + +class MCP_OT_SplitView(bpy.types.Operator): + """Split View Vertically""" + bl_idname = "mcp.split_view" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.screen.area_split(direction='VERTICAL') + return {'FINISHED'} + + +class MCP_OT_SplitViewH(bpy.types.Operator): + """Split View Horizontally""" + bl_idname = "mcp.split_view_h" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.screen.area_split() + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Camera View Operators +# ------------------------------------------------------------------------ + +class MCP_OT_CamViewLock(bpy.types.Operator): + """Camera - View Lock""" + bl_idname = "mcp.cam_view_lock" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.context.space_data.lock_camera = not bpy.context.space_data.lock_camera + return {'FINISHED'} + + +class MCP_OT_CameraSafeArea(bpy.types.Operator): + """Camera - safe areas""" + bl_idname = "mcp.camera_safe_area" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.context.object.data.show_safe_areas = not bpy.context.object.data.show_safe_areas + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Key Grid Snap +# ------------------------------------------------------------------------ + +class MCP_OT_KeyGridSnap(bpy.types.Operator): + """Snap to Grid Hotkey""" + bl_idname = "mcp.key_grid_snap" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.wm.tool_set_by_id(name="builtin.move") + bpy.ops.mcp.show_origin() + bpy.context.scene.tool_settings.use_snap = True + bpy.context.scene.tool_settings.snap_elements_base = {'INCREMENT'} + return {'FINISHED'} + + +class MCP_OT_KeyVertexSnap(bpy.types.Operator): + """Snap to Vertex Hotkey""" + bl_idname = "mcp.key_vertex_snap" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.wm.tool_set_by_id(name="builtin.move") + bpy.ops.mcp.show_origin() + bpy.context.scene.tool_settings.use_snap = True + bpy.context.scene.tool_settings.snap_elements_base = {'VERTEX'} + return {'FINISHED'} + + +class MCP_OT_KeyCurveSnap(bpy.types.Operator): + """Snap to Curve Hotkey""" + bl_idname = "mcp.key_curve_snap" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.wm.tool_set_by_id(name="builtin.move") + bpy.ops.mcp.show_origin() + bpy.context.scene.tool_settings.use_snap = True + bpy.context.scene.tool_settings.snap_elements_base = {'EDGE'} + return {'FINISHED'} + + +class MCP_OT_OriginHide(bpy.types.Operator): + """Hide Origin""" + bl_idname = "mcp.origin_hide_qv" + bl_label = "FA Hide Origin" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.context.scene.tool_settings.use_snap = False + bpy.context.scene.tool_settings.use_transform_data_origin = False + return {'FINISHED'} + + +# Class list to register +_classes = [ + # Menu + MCP_MT_QuadMenu, + # Ortho Views + MCP_OT_LeftOrtho, + MCP_OT_RightOrtho, + MCP_OT_BottomOrtho, + MCP_OT_TopOrtho, + MCP_OT_FrontOrtho, + MCP_OT_BackOrtho, + # Split + MCP_OT_SplitView, + MCP_OT_SplitViewH, + # Camera + MCP_OT_CamViewLock, + MCP_OT_CameraSafeArea, + # Snap + MCP_OT_KeyGridSnap, + MCP_OT_KeyVertexSnap, + MCP_OT_KeyCurveSnap, + MCP_OT_OriginHide, +] + + +def register(): + for cls in _classes: + compat.safe_register_class(cls) + + +def unregister(): + for cls in reversed(_classes): + compat.safe_unregister_class(cls) diff --git a/scripts/addons/form_affinity_maya_config_pro/ops/special_tools.py b/scripts/addons/form_affinity_maya_config_pro/ops/special_tools.py new file mode 100644 index 0000000..7e80424 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/ops/special_tools.py @@ -0,0 +1,97 @@ +""" +Maya Config Pro - Special Tools Menu +Special tools menu for edit modes. +""" + +import bpy +from ..utils import compat +from bpy.types import Menu, Operator + + +# ------------------------------------------------------------------------ +# Object Mode: D key — toggle Affect Only Origins on scene "Scene" +# ------------------------------------------------------------------------ + + +class MCP_OT_ToggleAffectOriginsScene(Operator): + """Toggle Affect Only Origins on the data-block named Scene.""" + + bl_idname = "mcp.toggle_affect_origins_scene" + bl_label = "Toggle Affect Only Origins (Scene)" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + scene = bpy.data.scenes.get("Scene") + if scene is None: + self.report({"WARNING"}, 'No data block named "Scene"') + return {"CANCELLED"} + ts = scene.tool_settings + ts.use_transform_data_origin = not ts.use_transform_data_origin + return {"FINISHED"} + + +# ------------------------------------------------------------------------ +# Special Tools Menu +# ------------------------------------------------------------------------ + +class MCP_MT_SpecialTools(Menu): + """FA Special Tools""" + bl_label = "FA Special Tools" + bl_idname = "MCP_MT_SpecialTools" + + def draw(self, context): + layout = self.layout + if context.space_data.type == 'VIEW_3D': + if context.mode == 'EDIT_MESH': + layout.separator() + + # if vertex mode + if context.tool_settings.mesh_select_mode[:] == (True, False, False): + layout.menu("VIEW3D_MT_edit_mesh_vertices", text="Vertex Special", icon='VERTEXSEL') + layout.separator() + layout.label(text="Mode Switch", icon='DOWNARROW_HLT') + layout.operator("mcp.msm_from_object", text="Edges", icon='EDGESEL').mode = 'edge' + layout.operator("mcp.msm_from_object", text="Faces", icon='FACESEL').mode = 'face' + layout.operator("object.mode_set", text="Object Mode", icon="OBJECT_DATA") + + # if edge mode + if context.tool_settings.mesh_select_mode[:] == (False, True, False): + layout.menu("VIEW3D_MT_edit_mesh_edges", text="Edge Special", icon='EDGESEL') + layout.separator() + layout.label(text="Mode Switch", icon='DOWNARROW_HLT') + layout.operator("mcp.msm_from_object", text="Vertices", icon='VERTEXSEL').mode = 'vert' + layout.operator("mcp.msm_from_object", text="Faces", icon='FACESEL').mode = 'face' + layout.operator("object.mode_set", text="Object Mode", icon="OBJECT_DATA") + + # if face mode + if bpy.context.tool_settings.mesh_select_mode[:] == (False, False, True): + layout.menu("VIEW3D_MT_edit_mesh_faces", text="Face Special", icon='FACESEL') + layout.separator() + layout.label(text="Mode Switch", icon='DOWNARROW_HLT') + layout.operator("mcp.msm_from_object", text="Vertices", icon='VERTEXSEL').mode = 'vert' + layout.operator("mcp.msm_from_object", text="Edges", icon='EDGESEL').mode = 'edge' + layout.operator("object.mode_set", text="Object Mode", icon="OBJECT_DATA") + + elif context.mode == 'OBJECT': + layout.label(text="object mode") + elif context.space_data.type == 'IMAGE_EDITOR': + layout.label(text="No Context! image editor") + else: + layout.label(text="No Context!") + + +# Class list to register +_classes = [ + MCP_OT_ToggleAffectOriginsScene, + MCP_MT_SpecialTools, +] + + +def register(): + for cls in _classes: + compat.safe_register_class(cls) + + +def unregister(): + for cls in reversed(_classes): + compat.safe_unregister_class(cls) diff --git a/scripts/addons/form_affinity_maya_config_pro/ops/tab_switcher.py b/scripts/addons/form_affinity_maya_config_pro/ops/tab_switcher.py new file mode 100644 index 0000000..ed99a50 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/ops/tab_switcher.py @@ -0,0 +1,174 @@ +""" +Maya Config Pro - Tab Switcher +Workspace tab switcher pie menu. +""" + +import bpy +from ..utils import compat +from bpy.types import Menu + + +# ------------------------------------------------------------------------ +# Tab Switcher Menu +# ------------------------------------------------------------------------ + +class MCP_MT_TabSwitcher(Menu): + """FA Tab Switcher""" + bl_idname = "MCP_MT_TabSwitcher" + bl_label = "FA Tab Switcher" + + def draw(self, context): + layout = self.layout + pie = layout.menu_pie() + + pie.operator("mcp.workspace_camera", text="Camera", icon='CAMERA_DATA') + pie.operator("mcp.workspace_uvs", text="UV Editing", icon='UV_DATA') + pie.operator("mcp.workspace_sculpting", text="Sculpting", icon='SCULPTMODE_HLT') + pie.operator("mcp.workspace_animation", text="Animation", icon='RENDER_ANIMATION') + pie.operator("mcp.workspace_rendering", text="Rendering", icon='SHADING_RENDERED') + pie.operator("mcp.workspace_texturepaint", text="Texture Paint", icon='BRUSH_DATA') + pie.operator("mcp.workspace_modeling", text="Modeling", icon='EDITMODE_HLT') + pie.operator("mcp.workspace_hypershade", text="HyperShade", icon='MATERIAL_DATA') + pie.separator() + pie.separator() + + other = pie.column() + gap = other.column() + gap.separator() + gap.scale_y = 7 + other_menu = other.box().column() + other_menu.scale_y = 1.3 + other_menu.operator("mcp.workspace_compositing", text="Compositing", icon="NODE_COMPOSITING") + other_menu.operator("mcp.workspace_scripting", text="Scripting", icon="FILE_SCRIPT") + + +# ------------------------------------------------------------------------ +# Workspace Operators +# ------------------------------------------------------------------------ + +class MCP_OT_WorkspaceCamera(bpy.types.Operator): + """Switch to Camera workspace""" + bl_idname = "mcp.workspace_camera" + bl_label = "Camera" + + def execute(self, context): + bpy.data.window_managers['WinMan'].windows[0].workspace = bpy.data.workspaces['Camera'] + return {'FINISHED'} + + +class MCP_OT_WorkspaceModeling(bpy.types.Operator): + """Switch to Modeling workspace""" + bl_idname = "mcp.workspace_modeling" + bl_label = "Modeling" + + def execute(self, context): + bpy.data.window_managers['WinMan'].windows[0].workspace = bpy.data.workspaces['Modeling'] + return {'FINISHED'} + + +class MCP_OT_WorkspaceSculpting(bpy.types.Operator): + """Switch to Sculpting workspace""" + bl_idname = "mcp.workspace_sculpting" + bl_label = "Sculpting" + + def execute(self, context): + bpy.data.window_managers['WinMan'].windows[0].workspace = bpy.data.workspaces['Sculpting'] + return {'FINISHED'} + + +class MCP_OT_WorkspaceHypershade(bpy.types.Operator): + """Switch to HyperShade workspace""" + bl_idname = "mcp.workspace_hypershade" + bl_label = "HyperShade" + + def execute(self, context): + bpy.data.window_managers['WinMan'].windows[0].workspace = bpy.data.workspaces['HyperShade'] + return {'FINISHED'} + + +class MCP_OT_WorkspaceUVs(bpy.types.Operator): + """Switch to UV Editing workspace""" + bl_idname = "mcp.workspace_uvs" + bl_label = "UV Editing" + + def execute(self, context): + bpy.data.window_managers['WinMan'].windows[0].workspace = bpy.data.workspaces['UV Editing'] + return {'FINISHED'} + + +class MCP_OT_WorkspaceTexturePaint(bpy.types.Operator): + """Switch to Texture Paint workspace""" + bl_idname = "mcp.workspace_texturepaint" + bl_label = "Texture Paint" + + def execute(self, context): + bpy.data.window_managers['WinMan'].windows[0].workspace = bpy.data.workspaces['Texture Paint'] + return {'FINISHED'} + + +class MCP_OT_WorkspaceAnimation(bpy.types.Operator): + """Switch to Animation workspace""" + bl_idname = "mcp.workspace_animation" + bl_label = "Animation" + + def execute(self, context): + bpy.data.window_managers['WinMan'].windows[0].workspace = bpy.data.workspaces['Animation'] + return {'FINISHED'} + + +class MCP_OT_WorkspaceRendering(bpy.types.Operator): + """Switch to Rendering workspace""" + bl_idname = "mcp.workspace_rendering" + bl_label = "Rendering" + + def execute(self, context): + bpy.data.window_managers['WinMan'].windows[0].workspace = bpy.data.workspaces['Rendering'] + return {'FINISHED'} + + +class MCP_OT_WorkspaceCompositing(bpy.types.Operator): + """Switch to Compositing workspace""" + bl_idname = "mcp.workspace_compositing" + bl_label = "Compositing" + + def execute(self, context): + bpy.data.window_managers['WinMan'].windows[0].workspace = bpy.data.workspaces['Compositing'] + return {'FINISHED'} + + +class MCP_OT_WorkspaceScripting(bpy.types.Operator): + """Switch to Scripting workspace""" + bl_idname = "mcp.workspace_scripting" + bl_label = "Scripting" + + def execute(self, context): + bpy.data.window_managers['WinMan'].windows[0].workspace = bpy.data.workspaces['Scripting'] + return {'FINISHED'} + + +# Class list to register +_classes = [ + # Menu + MCP_MT_TabSwitcher, + # Workspace Operators + MCP_OT_WorkspaceCamera, + MCP_OT_WorkspaceModeling, + MCP_OT_WorkspaceSculpting, + MCP_OT_WorkspaceHypershade, + MCP_OT_WorkspaceUVs, + MCP_OT_WorkspaceTexturePaint, + MCP_OT_WorkspaceAnimation, + MCP_OT_WorkspaceRendering, + MCP_OT_WorkspaceCompositing, + MCP_OT_WorkspaceScripting, +] + + +def register(): + for cls in _classes: + compat.safe_register_class(cls) + + +def unregister(): + for cls in reversed(_classes): + compat.safe_unregister_class(cls) diff --git a/scripts/addons/form_affinity_maya_config_pro/panels/__init__.py b/scripts/addons/form_affinity_maya_config_pro/panels/__init__.py new file mode 100644 index 0000000..6e7e1d7 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/panels/__init__.py @@ -0,0 +1,90 @@ +""" +Maya Config Pro - Panels Package +UI panels for the extension. +""" + +import sys +import importlib.util +import os + +# Module cache +_module_cache = {} + + +def _load_module(name): + """Load a module by executing its file""" + if name in _module_cache: + return _module_cache[name] + + # Get the file path + current_dir = os.path.dirname(__file__) + file_path = os.path.join(current_dir, f"{name}.py") + + if not os.path.exists(file_path): + raise ImportError(f"Module file not found: {file_path}") + + # Load the module + spec = importlib.util.spec_from_file_location( + f"{__name__}.{name}", + file_path + ) + module = importlib.util.module_from_spec(spec) + + # Add to sys.modules temporarily + sys.modules[f"{__name__}.{name}"] = module + spec.loader.exec_module(module) + + _module_cache[name] = module + return module + + +def register(): + """Register all panels""" + # Register shelf header first (replaces PROPERTIES panels) + try: + shelf_header = _load_module("shelf_header") + shelf_header.register() + except Exception as e: + print(f"MCP: Failed to register shelf header: {e}") + + # Register other panels + try: + panel_pro = _load_module("panel_pro") + panel_pro.register() + except Exception as e: + print(f"MCP: Failed to register panel_pro: {e}") + + try: + panel_sidebar = _load_module("panel_sidebar") + panel_sidebar.register() + except Exception as e: + print(f"MCP: Failed to register panel_sidebar: {e}") + + try: + panel_shelf = _load_module("panel_shelf") + panel_shelf.register() + except Exception as e: + print(f"MCP: Failed to register panel_shelf (operators only): {e}") + + try: + panel_animation = _load_module("panel_animation") + panel_animation.register() + except Exception as e: + print(f"MCP: Failed to register panel_animation (operators only): {e}") + + try: + viewport_shelf = _load_module("viewport_shelf") + viewport_shelf.register() + except Exception as e: + print(f"MCP: Failed to register viewport_shelf: {e}") + + +def unregister(): + """Unregister all panels""" + # Unregister in reverse order + for name in ["viewport_shelf", "panel_animation", "panel_shelf", "panel_sidebar", "panel_pro", "shelf_header"]: + try: + if name in _module_cache: + _module_cache[name].unregister() + except Exception as e: + print(f"MCP: Failed to unregister {name}: {e}") diff --git a/scripts/addons/form_affinity_maya_config_pro/panels/panel_animation.py b/scripts/addons/form_affinity_maya_config_pro/panels/panel_animation.py new file mode 100644 index 0000000..052b8da --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/panels/panel_animation.py @@ -0,0 +1,201 @@ +""" +Maya Config Pro - Animation Panel +Animation shelf with rigging and animation tools. +""" + +import bpy +from ..utils import compat + + +# ------------------------------------------------------------------------ +# Animation Shelf Panel +# ------------------------------------------------------------------------ + +class MCP_PT_AnimationShelf(bpy.types.Panel): + """Maya Animation Shelf""" + bl_idname = "MCP_PT_AnimationShelf" + bl_label = "Animation Shelf" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "scene" + + draw_type = "animation" + + def draw(self, context): + layout = self.layout + obj = context.object + + row = layout.row() + row.scale_y = 1 + row.scale_x = 2 + + row.operator('wm.link', text="", icon="LINKED") + row.operator('wm.append', text="", icon="APPEND_BLEND") + row.operator('mcp.pose_mode_ani', text="", icon="POSE_HLT") + row.operator('object.armature_add', text="", icon="OUTLINER_OB_ARMATURE") + row.operator('mcp.drop_to_floor_ani', text="", icon='TRIA_DOWN') + + row.label(text="", icon='DOT') + row.operator('mcp.graph_editor_ani', text="", icon="GRAPH") + row.operator('mcp.dope_sheet_ani', text="", icon="ACTION") + row.operator('mcp.drivers_ani', text="", icon="DRIVER") + row.operator('anim.keyframe_insert_menu', text="", icon="DECORATE_ANIMATE") + + +# ------------------------------------------------------------------------ +# Properties Editor +# ------------------------------------------------------------------------ + +class MCP_OT_PropertiesEditorAni(bpy.types.Operator): + """Properties Editor""" + bl_label = "Properties Editor" + bl_idname = 'mcp.properties_editor_ani' + + def execute(self, context): + render = bpy.context.scene.render + render.resolution_x = 1000 + render.resolution_y = 600 + render.resolution_percentage = 100 + + bpy.ops.render.view_show("INVOKE_DEFAULT") + + area = bpy.context.window_manager.windows[-1].screen.areas[0] + area.type = "PROPERTIES" + + bpy.ops.pose.constraint_add(type='ACTION') + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Link Rig +# ------------------------------------------------------------------------ + +class MCP_OT_LinkRigAni(bpy.types.Operator): + """Link Rig""" + bl_label = "Import Rig as Linked" + bl_idname = 'mcp.link_rig_ani' + + def execute(self, context): + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Pose Mode +# ------------------------------------------------------------------------ + +class MCP_OT_PoseModeAni(bpy.types.Operator): + """Pose Mode""" + bl_label = "Pose Mode" + bl_idname = 'mcp.pose_mode_ani' + + @classmethod + def poll(cls, context): + active_object = context.active_object + return active_object is not None and active_object.type == 'ARMATURE' and (context.mode == 'EDIT_MESH' or active_object.select_get()) + + def execute(self, context): + bpy.ops.object.mode_set(mode='POSE') + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Graph Editor +# ------------------------------------------------------------------------ + +class MCP_OT_GraphEditorAni(bpy.types.Operator): + """Graph Editor""" + bl_label = "Graph Editor" + bl_idname = 'mcp.graph_editor_ani' + + def execute(self, context): + render = bpy.context.scene.render + render.resolution_x = 1000 + render.resolution_y = 600 + render.resolution_percentage = 100 + + bpy.ops.render.view_show("INVOKE_DEFAULT") + + area = bpy.context.window_manager.windows[-1].screen.areas[0] + area.type = "GRAPH_EDITOR" + + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Dope Sheet +# ------------------------------------------------------------------------ + +class MCP_OT_DopeSheetAni(bpy.types.Operator): + """Dope Sheet""" + bl_label = "Dope Sheet" + bl_idname = 'mcp.dope_sheet_ani' + + def execute(self, context): + render = bpy.context.scene.render + render.resolution_x = 1000 + render.resolution_y = 600 + render.resolution_percentage = 100 + + bpy.ops.render.view_show("INVOKE_DEFAULT") + + area = bpy.context.window_manager.windows[-1].screen.areas[0] + area.type = "DOPESHEET_EDITOR" + + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Drivers Editor +# ------------------------------------------------------------------------ + +class MCP_OT_DriversAni(bpy.types.Operator): + """Drivers Editor""" + bl_label = "Drivers Editor" + bl_idname = 'mcp.drivers_ani' + + def execute(self, context): + bpy.ops.screen.drivers_editor_show() + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Drop To Floor +# ------------------------------------------------------------------------ + +class MCP_OT_DropToFloorAni(bpy.types.Operator): + """Drop/Raise Object to Floor""" + bl_label = "Drop to Floor" + bl_idname = "mcp.drop_to_floor_ani" + + def execute(self, context): + context = bpy.context + for obj in context.selected_objects: + mx = obj.matrix_world + minz = min((mx @ v.co).z for v in obj.data.vertices) + mx.translation.z -= minz + return {'FINISHED'} + + +# Class list to register +_classes = [ + # Panel + MCP_PT_AnimationShelf, + # Animation Operators + MCP_OT_PropertiesEditorAni, + MCP_OT_LinkRigAni, + MCP_OT_PoseModeAni, + MCP_OT_GraphEditorAni, + MCP_OT_DopeSheetAni, + MCP_OT_DriversAni, + MCP_OT_DropToFloorAni, +] + + +def register(): + for cls in _classes: + compat.safe_register_class(cls) + + +def unregister(): + for cls in reversed(_classes): + compat.safe_unregister_class(cls) diff --git a/scripts/addons/form_affinity_maya_config_pro/panels/panel_pro.py b/scripts/addons/form_affinity_maya_config_pro/panels/panel_pro.py new file mode 100644 index 0000000..6f58587 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/panels/panel_pro.py @@ -0,0 +1,832 @@ +""" +Maya Config Pro - Main Panel (ProAni 1.7) +Left side panel with theme switching, subdivision controls, and gizmo settings. +""" + +import bpy +import os +from ..utils import compat + +# ------------------------------------------------------------------------ +# Main Panel +# ------------------------------------------------------------------------ + +class MCP_PT_ProPanel(bpy.types.Panel): + """Pro Ani 1.7 coincides with Blender 5.0. A Custom Panel in the Properties Toolbar""" + bl_label = "ProAni 1.7" + bl_idname = "MCP_PT_ProPanel" + bl_space_type = 'VIEW_3D' + bl_region_type = 'TOOLS' + + def draw(self, context): + layout = self.layout + obj = context.object + + row = layout.row() + row.scale_y = .75 + row.scale_x = 1 + row.operator("mcp.subsurf_remove", text="·") + row.operator("mcp.subsurf_2", text="··") + row.operator("mcp.subsurf_3", text="···") + + row = layout.row() + row.operator('mcp.gizmo_default', text='', icon='GIZMO') + row.prop(context.preferences.view, 'gizmo_size', slider=True) + + row = layout.row() + row.prop(bpy.context.space_data.overlay, 'show_stats', text='', icon='SORTSIZE', toggle=True) + row.prop(bpy.context.space_data.overlay, 'show_cursor', text='', icon='PIVOT_CURSOR', toggle=True) + row.operator('view3d.snap_cursor_to_center', text='', icon='ORIENTATION_CURSOR') + row = layout.row() + row.operator('mesh.select_mirror', text='Symmetry', icon='MOD_MIRROR') + + row = layout.row() + row.operator("render.render", text='', icon='RENDER_STILL') + row.operator("mcp.popup_hypershade", text='', icon='SHADING_TEXTURE') + row.operator("mcp.popup_grapheditor", text='', icon='GRAPH') + + row = layout.row() + row.operator("render.view_show", text='', icon='RENDER_RESULT') + row.operator("mcp.popup_assetbrowser", text='', icon='ASSET_MANAGER') + row.operator("mcp.asset_add", text='', icon='PLUS') + + row = layout.row() + row.operator("screen.userpref_show", text="", icon='PREFERENCES') + row.operator("mcp.popup_keymaptext", text="", icon='KEYINGSET') + row.operator("mcp.shortcut_eq", text="", icon='ARROW_LEFTRIGHT') + + row = layout.row() + op = row.operator("mcp.activate_keymap_preset", text="", icon="BLENDER") + op.preset = "BLENDER" + op = row.operator("mcp.activate_keymap_preset", text="", icon="EVENT_M") + op.preset = "FA_HOTKEYS" + op = row.operator("mcp.activate_keymap_preset", text="", icon="EVENT_I") + op.preset = "INDUSTRY" + + row = layout.row() + row.operator("wm.url_open", text="", icon="HEART").url = "http://gumroad.com/formaffinity" + row.operator("wm.url_open", text="", icon="URL").url = "https://www.youtube.com/channel/UCcCo0cPbrsWeoImgs6L7OOA" + row.operator("mcp.config_info", text="", icon="INFO") + + row = layout.row() + row.scale_y = .5 + row.scale_x = .6 + row.operator("mcp.theme_maya_gradient", text="", emboss=False, icon='CLIPUV_HLT') + row.operator("mcp.theme_maya_blue", text="", emboss=False, icon='CLIPUV_HLT') + row.operator("mcp.theme_modo", text="", emboss=False, icon='CLIPUV_HLT') + row.operator("mcp.theme_blender_dark", text="", emboss=False, icon='CLIPUV_HLT') + row.operator("mcp.theme_white_bg", text="", emboss=False, icon='CLIPUV_HLT') + row.operator("mcp.theme_sketchup", text="", emboss=False, icon='CLIPUV_HLT') + + +# ------------------------------------------------------------------------ +# Theme Operators +# ------------------------------------------------------------------------ + +class MCP_OT_ThemeMayaBlue(bpy.types.Operator): + """Maya Blue Theme""" + bl_idname = "mcp.theme_maya_blue" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + root_path = bpy.utils.resource_path('USER') + theme_filepath = os.path.join(root_path, 'scripts', 'presets', 'interface_theme', 'maya_blue_theme.xml') + bpy.ops.script.execute_preset(filepath=theme_filepath, menu_idname='USERPREF_MT_interface_theme_presets') + self.report({'INFO'}, "Maya Blue Theme") + return {'FINISHED'} + + +class MCP_OT_ThemeMayaGradient(bpy.types.Operator): + """Maya Gradient Theme""" + bl_idname = "mcp.theme_maya_gradient" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + root_path = bpy.utils.resource_path('USER') + theme_filepath = os.path.join(root_path, 'scripts', 'presets', 'interface_theme', 'maya_theme_gradient.xml') + bpy.ops.script.execute_preset(filepath=theme_filepath, menu_idname='USERPREF_MT_interface_theme_presets') + self.report({'INFO'}, "Maya Gradient Theme") + return {'FINISHED'} + + +class MCP_OT_ThemeModo(bpy.types.Operator): + """Modo Theme""" + bl_idname = "mcp.theme_modo" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + root_path = bpy.utils.resource_path('USER') + theme_filepath = os.path.join(root_path, 'scripts', 'presets', 'interface_theme', 'modo_theme.xml') + bpy.ops.script.execute_preset(filepath=theme_filepath, menu_idname='USERPREF_MT_interface_theme_presets') + self.report({'INFO'}, "Modo Theme") + return {'FINISHED'} + + +class MCP_OT_ThemeBlenderDark(bpy.types.Operator): + """Blender Dark Theme""" + bl_idname = "mcp.theme_blender_dark" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + root_path = bpy.utils.resource_path('USER') + theme_filepath = os.path.join(root_path, 'scripts', 'presets', 'interface_theme', 'blender_dark.xml') + bpy.ops.script.execute_preset(filepath=theme_filepath, menu_idname='USERPREF_MT_interface_theme_presets') + self.report({'INFO'}, "Blender Dark Theme") + return {'FINISHED'} + + +class MCP_OT_ThemeWhiteBG(bpy.types.Operator): + """White Background Theme""" + bl_idname = "mcp.theme_white_bg" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + root_path = bpy.utils.resource_path('USER') + theme_filepath = os.path.join(root_path, 'scripts', 'presets', 'interface_theme', 'white_bg_theme.xml') + bpy.ops.script.execute_preset(filepath=theme_filepath, menu_idname='USERPREF_MT_interface_theme_presets') + self.report({'INFO'}, "White BG Theme") + return {'FINISHED'} + + +class MCP_OT_ThemeSketchup(bpy.types.Operator): + """Sketchup Theme""" + bl_idname = "mcp.theme_sketchup" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + root_path = bpy.utils.resource_path('USER') + theme_filepath = os.path.join(root_path, 'scripts', 'presets', 'interface_theme', 'sketchup.xml') + bpy.ops.script.execute_preset(filepath=theme_filepath, menu_idname='USERPREF_MT_interface_theme_presets') + self.report({'INFO'}, "Sketchup Theme") + return {'FINISHED'} + + +class MCP_OT_ThemeDoubleHotkey(bpy.types.Operator): + """Allow alt b to be pressed multiple times to cycle through interface themes""" + bl_idname = "mcp.theme_double" + bl_label = "Double Hotkey" + bl_options = {'REGISTER', 'UNDO'} + + count = 0 + + def setTheme(self, interface_theme, theme_name): + root_path = bpy.utils.resource_path('USER') + theme_filepath = os.path.join(root_path, 'scripts', 'presets', 'interface_theme', interface_theme) + bpy.ops.script.execute_preset(filepath=theme_filepath, menu_idname='USERPREF_MT_interface_theme_presets') + self.report({'INFO'}, theme_name) + + def execute(self, context): + MCP_OT_ThemeDoubleHotkey.count += 1 + num_options = 6 + current_value = MCP_OT_ThemeDoubleHotkey.count % num_options + + if current_value == 0: + self.setTheme(interface_theme='maya_theme_gradient.xml', theme_name='Maya Gradient Theme') + elif current_value == 1: + self.setTheme(interface_theme='maya_blue_theme.xml', theme_name='Maya Blue Theme') + elif current_value == 2: + self.setTheme(interface_theme='modo_theme.xml', theme_name='Modo Theme') + elif current_value == 3: + self.setTheme(interface_theme='blender_dark.xml', theme_name='Blender Dark Theme') + elif current_value == 4: + self.setTheme(interface_theme='white_bg_theme.xml', theme_name='White Background Theme') + elif current_value == 5: + self.setTheme(interface_theme='sketchup.xml', theme_name='Sketchup Theme') + + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Gizmo Size Default 75 +# ------------------------------------------------------------------------ + +class MCP_OT_GizmoDefault(bpy.types.Operator): + """Reset Gizmo Size to Default""" + bl_idname = "mcp.gizmo_default" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.context.preferences.view.gizmo_size = 75 + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Pivot Lock +# ------------------------------------------------------------------------ + +class MCP_OT_PivotLock(bpy.types.Operator): + """Lock/Unlock Pivot""" + bl_idname = "mcp.pivot_lock" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.context.scene.tool_settings.use_snap = not bpy.context.scene.tool_settings.use_snap + bpy.context.scene.tool_settings.snap_elements = {'VERTEX'} + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Subdivision Operators +# ------------------------------------------------------------------------ + +class MCP_OT_SubsurfRemove(bpy.types.Operator): + """Turn off Subdivision Surface Preview""" + bl_idname = "mcp.subsurf_remove" + bl_label = "·" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + active_object = bpy.context.active_object + if not active_object: + return {'FINISHED'} + + active_name = active_object.name + active_mode = active_object.mode + active_type = active_object.type + + object_types = ['MESH', 'CURVE'] + mods = bpy.context.object.modifiers + mod_type = 'SUBSURF' + mod_name = None + + if active_type in object_types: + for mod in mods: + if mod.type == mod_type: + mod_name = mod.name + break + + if mod_name is not None: + bpy.ops.object.modifier_remove(modifier=mod_name) + self.report({'INFO'}, "Smooth Mesh Preview Removed!") + + if active_mode == 'EDIT': + bpy.ops.mesh.select_all(action='SELECT') + bpy.ops.mesh.faces_shade_flat() + bpy.ops.mesh.select_all(action='DESELECT') + elif active_mode == 'OBJECT': + bpy.data.objects[active_name].select_set(True) + bpy.ops.object.shade_flat() + + bpy.ops.object.mode_set(mode='OBJECT') + + return {'FINISHED'} + + +class MCP_OT_Subsurf2(bpy.types.Operator): + """Set Subdivision Surface Preview to 2 iterations""" + bl_idname = "mcp.subsurf_2" + bl_label = "··" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + active_object = bpy.context.active_object + if not active_object: + return {'FINISHED'} + + active_name = active_object.name + active_mode = active_object.mode + active_type = active_object.type + + object_types = ['MESH', 'CURVE'] + mods = bpy.context.object.modifiers + mod_type = 'SUBSURF' + mod_name = None + + if active_type in object_types: + for mod in mods: + if mod.type == mod_type: + mod_name = mod.name + break + + if mod_name is not None: + bpy.ops.object.modifier_remove(modifier=mod_name) + self.report({'INFO'}, "Smooth Mesh Preview Removed!") + bpy.ops.object.mode_set(mode='OBJECT') + bpy.data.objects[active_name].select_set(True) + bpy.ops.object.shade_flat() + else: + bpy.ops.object.modifier_add(type=mod_type) + self.report({'INFO'}, "Smooth Mesh Preview Applied!") + + if active_mode == 'EDIT': + bpy.ops.mesh.select_all(action='SELECT') + bpy.ops.mesh.faces_shade_smooth() + bpy.ops.mesh.select_all(action='DESELECT') + elif active_mode == 'OBJECT': + bpy.data.objects[active_name].select_set(True) + bpy.ops.object.shade_smooth() + + bpy.data.objects[active_name].modifiers["Subdivision"].levels = 2 + bpy.data.objects[active_name].modifiers["Subdivision"].render_levels = 2 + + if bpy.context.active_object: + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.select_all(action='DESELECT') + + return {'FINISHED'} + + +class MCP_OT_Subsurf3(bpy.types.Operator): + """Set Subdivision Surface Preview to 3 iterations""" + bl_idname = "mcp.subsurf_3" + bl_label = "···" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + active_object = bpy.context.active_object + if not active_object: + return {'FINISHED'} + + active_name = active_object.name + active_mode = active_object.mode + active_type = active_object.type + + object_types = ['MESH', 'CURVE'] + mods = bpy.context.object.modifiers + mod_type = 'SUBSURF' + mod_name = None + + if active_type in object_types: + for mod in mods: + if mod.type == mod_type: + mod_name = mod.name + break + + if mod_name is not None: + bpy.ops.object.modifier_remove(modifier=mod_name) + self.report({'INFO'}, "Smooth Mesh Preview Removed!") + + if active_mode == 'EDIT': + bpy.ops.mesh.select_all(action='SELECT') + bpy.ops.mesh.faces_shade_flat() + bpy.ops.mesh.select_all(action='DESELECT') + elif active_mode == 'OBJECT': + bpy.data.objects[active_name].select_set(True) + bpy.ops.object.shade_flat() + else: + bpy.ops.object.modifier_add(type=mod_type) + self.report({'INFO'}, "Smooth Mesh Preview Applied!") + + if active_mode == 'EDIT': + bpy.ops.mesh.select_all(action='SELECT') + bpy.ops.mesh.faces_shade_smooth() + bpy.ops.mesh.select_all(action='DESELECT') + elif active_mode == 'OBJECT': + bpy.data.objects[active_name].select_set(True) + bpy.ops.object.shade_smooth() + + bpy.data.objects[active_name].modifiers["Subdivision"].levels = 3 + bpy.data.objects[active_name].modifiers["Subdivision"].render_levels = 3 + + bpy.ops.object.mode_set(mode='OBJECT') + + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Graph Editor Pop Up +# ------------------------------------------------------------------------ + +my_timeline = None + +class MCP_OT_PopupGraphEditor(bpy.types.Operator): + """Graph Editor""" + bl_label = "Graph Editor" + bl_idname = 'mcp.popup_grapheditor' + + def execute(self, context): + bpy.ops.screen.userpref_show('INVOKE_DEFAULT') + + # Change area type + area = bpy.context.window_manager.windows[-1].screen.areas[0] + area.type = "VIEW_3D" + bpy.context.area.ui_type = 'FCURVES' + + global my_timeline + if my_timeline: + bpy.ops.screen.area_close({"area": my_timeline}) + my_timeline = None + else: + for area in bpy.context.screen.areas: + if area.type == 'FCURVES': + with bpy.context.temp_override(area=area): + bpy.ops.screen.area_split(direction='HORIZONTAL', factor=0.2) + bpy.context.screen.areas[-1].ui_type = 'DOPESHEET' + my_timeline = bpy.context.screen.areas[-1] + + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Hypershade +# ------------------------------------------------------------------------ + +my_timeline_hs = None + +class MCP_OT_PopupHypershade(bpy.types.Operator): + """Hypershade""" + bl_label = "Hypershade" + bl_idname = 'mcp.popup_hypershade' + + def execute(self, context): + bpy.ops.screen.userpref_show('INVOKE_DEFAULT') + + # Change area type + area = bpy.context.window_manager.windows[-1].screen.areas[0] + area.type = "VIEW_3D" + bpy.context.area.ui_type = 'ShaderNodeTree' + + global my_timeline_hs + if my_timeline_hs: + bpy.ops.screen.area_close({"area": my_timeline_hs}) + my_timeline_hs = None + else: + for area in bpy.context.screen.areas: + if area.type == 'ShaderNodeTree': + with bpy.context.temp_override(area=area): + bpy.ops.screen.area_split(direction='HORIZONTAL', factor=0.20) + bpy.context.screen.areas[-1].ui_type = 'DOPESHEET' + my_timeline_hs = bpy.context.screen.areas[-1] + + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Asset Browser and Asset Add +# ------------------------------------------------------------------------ + +class MCP_OT_PopupAssetBrowser(bpy.types.Operator): + """Display Asset Browser""" + bl_label = "Asset Browser" + bl_idname = 'mcp.popup_assetbrowser' + + def execute(self, context): + bpy.ops.screen.userpref_show('INVOKE_DEFAULT') + + # Change area type + area = bpy.context.window_manager.windows[-1].screen.areas[0] + area.type = "VIEW_3D" + bpy.context.area.ui_type = 'ASSETS' + + return {'FINISHED'} + + +class MCP_OT_AssetAdd(bpy.types.Operator): + """Add Asset""" + bl_idname = "mcp.asset_add" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + return context.object is not None + + def execute(self, context): + bpy.ops.asset.mark() + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Keymap Text +# ------------------------------------------------------------------------ + +class MCP_OT_PopupKeymapText(bpy.types.Operator): + """Display Maya Config Pro Hotkeys""" + bl_label = "Hotkey List" + bl_idname = 'mcp.popup_keymaptext' + + def execute(self, context): + bpy.ops.screen.userpref_show('INVOKE_DEFAULT') + + # Change area type + area = bpy.context.window_manager.windows[-1].screen.areas[0] + area.type = "TEXT_EDITOR" + + # Try to load the text file + try: + text = bpy.data.texts['fa_hotkeys_text.txt'] + for area in bpy.context.screen.areas: + if area.type == 'TEXT_EDITOR': + area.spaces[0].text = text + break + except KeyError: + self.report({'WARNING'}, "fa_hotkeys_text.txt not found") + + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Shortcut Equivalence Popup +# ------------------------------------------------------------------------ + +class MCP_OT_ShortcutEq(bpy.types.Operator): + """Shortcut Equivalence - Version 1.0""" + bl_label = "To check a Maya Equivalent (See Info Log)" + bl_idname = "mcp.shortcut_eq" + + text: bpy.props.StringProperty(name="Enter Blender Hotkey", default="") + + def execute(self, context): + text = self.text + + bpy.ops.object.empty_add(type='PLAIN_AXES') + obj = bpy.context.object + obj.name = text + + if text == 'w': + self.report({'INFO'}, "Maya Config = Q Hotkey! (Box Select)") + elif text == 'g': + self.report({'INFO'}, "Maya = W Hotkey! (Move)") + elif text == 'r': + self.report({'INFO'}, "Maya = E Hotkey! (Rotate)") + elif text == 's': + self.report({'INFO'}, "Maya = R Hotkey! (Scale)") + elif text == 'mmb': + self.report({'INFO'}, "Maya = Alt + LMB Hotkey/Mouse! (Rotate View)") + elif text == 'shift mmb': + self.report({'INFO'}, "Maya = Alt + MMB Hotkey/Mouse! (Pan View)") + elif text == 'ctrl mmb': + self.report({'INFO'}, "Maya = Alt + RMB Hotkey/Mouse! (Zoom View)") + elif text == 'rmb': + self.report({'INFO'}, "Maya = Marking Menu! (In place of Blenders Object Context Menu)") + elif text == 'space bar': + self.report({'INFO'}, "Maya = Quad Menu! (In Place of Blenders Play Animation)") + elif text == 'edit mode shift rmb': + self.report({'INFO'}, "Maya = Special Tools Menu! (In Place of Blenders Position 3D Cursor)") + elif text == 'e': + self.report({'INFO'}, "Maya = Ctrl E! (Extrude)") + elif text == 'f': + self.report({'INFO'}, "Maya = G! (Create Face)") + elif text == '/': + self.report({'INFO'}, "Maya = Alt E! (Isolate Select (Local View))") + elif text == 'numbad .': + self.report({'INFO'}, "Maya = F! (Frame Selected)") + elif text == 'ctrl numpad +': + self.report({'INFO'}, "Maya = Shift . (>)! (Select More)") + elif text == 'ctrl numpad -': + self.report({'INFO'}, "Maya = Shift , (<)! (Select Less)") + elif text == 'shift rmb': + self.report({'INFO'}, "Maya = Shift Ctrl RMB! (Set 3D Cursor)") + elif text == 'ctrl d': + self.report({'INFO'}, "Maya = Ctrl D! (Show/Hide 3D Cursor)") + elif text == 'ctrl .': + self.report({'INFO'}, "Maya = D! (Show/Hide Origin)") + + bpy.ops.object.delete(use_global=False) + return {'FINISHED'} + + def invoke(self, context, event): + return context.window_manager.invoke_props_dialog(self) + + +class MCP_OT_ConfigInfo(bpy.types.Operator): + """Thank you for using it!""" + bl_label = "Maya Config Pro - Version 1.7, by FormAffinity" + bl_idname = "mcp.config_info" + + text: bpy.props.StringProperty(name="Support: contactformaffinity@gmail.com", default="") + + def execute(self, context): + return {'FINISHED'} + + def invoke(self, context, event): + return context.window_manager.invoke_props_dialog(self) + + +# ------------------------------------------------------------------------ +# Cam Tools Panel +# ------------------------------------------------------------------------ + +class MCP_PT_CamTools(bpy.types.Panel): + """Camera Tools Panel""" + bl_label = "CTs 2.0" + bl_idname = "MCP_PT_CamTools" + bl_space_type = 'VIEW_3D' + bl_region_type = 'TOOLS' + + @classmethod + def poll(cls, context): + return True + + def draw(self, context): + layout = self.layout + obj = context.object + + row = layout.row() + row.operator('view3d.camera_to_view', text="", icon="RESTRICT_VIEW_ON") + row.operator("view3d.view_camera", text="", icon='CAMERA_DATA') + row.prop(bpy.context.space_data, 'lock_camera', text="", icon='CON_CAMERASOLVER', toggle=True) + + row = layout.row() + row.scale_y = 1 + row.scale_x = 2 + row.operator('mcp.cam_lock_all', text="CAM", emboss=True, icon="LOCKED") + + row = layout.row() + row.operator("screen.region_quadview", text="", icon='VIEW_PERSPECTIVE') + row.operator("view3d.view_persportho", text="", icon="VIEW_ORTHO") + row.operator("screen.screen_full_area", text="", icon="FULLSCREEN_ENTER") + + +# ------------------------------------------------------------------------ +# Cam Tools Operators +# ------------------------------------------------------------------------ + +class MCP_OT_CameraGuides(bpy.types.Operator): + """Show Safe Guides""" + bl_idname = "mcp.camera_guides" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + return context.object is not None + + def execute(self, context): + bpy.data.objects["Camera"].select_set(True) + bpy.context.view_layer.objects.active = bpy.data.objects['Camera'] + for obj in bpy.context.selected_objects: + bpy.context.object.data.show_safe_areas = not bpy.context.object.data.show_safe_areas + return {'FINISHED'} + + +class MCP_OT_CamLockLocation(bpy.types.Operator): + """Lock Camera Location""" + bl_idname = "mcp.cam_lock_location" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + return context.object is not None + + def execute(self, context): + object_types = ['CAMERA'] + active_object = bpy.context.active_object + active_type = active_object.type + if active_type == 'MESH': + self.report({'INFO'}, 'Select Camera First!') + bpy.context.view_layer.objects.active = bpy.data.objects['Camera'] + bpy.data.objects["Camera"].select_set(True) + bpy.context.window.scene.objects['Camera'] + for obj in bpy.context.selected_objects: + bpy.context.object.lock_location[0] = not bpy.context.object.lock_location[0] + bpy.context.object.lock_location[1] = not bpy.context.object.lock_location[1] + bpy.context.object.lock_location[2] = not bpy.context.object.lock_location[2] + return {'FINISHED'} + + +class MCP_OT_CamLockRotation(bpy.types.Operator): + """Lock Camera Rotation""" + bl_idname = "mcp.cam_lock_rotation" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + active_object = bpy.context.active_object + active_type = active_object.type + if active_type == 'MESH': + self.report({'INFO'}, 'Select Camera First!') + bpy.context.view_layer.objects.active = bpy.data.objects['Camera'] + bpy.data.objects["Camera"].select_set(True) + bpy.context.window.scene.objects['Camera'] + for obj in bpy.context.selected_objects: + bpy.context.object.lock_rotation[0] = not bpy.context.object.lock_rotation[0] + bpy.context.object.lock_rotation[1] = not bpy.context.object.lock_rotation[1] + bpy.context.object.lock_rotation[2] = not bpy.context.object.lock_rotation[2] + return {'FINISHED'} + + +class MCP_OT_CamLockScale(bpy.types.Operator): + """Lock Camera Scale""" + bl_idname = "mcp.cam_lock_scale" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + active_object = bpy.context.active_object + active_type = active_object.type + if active_type == 'MESH': + self.report({'INFO'}, 'Select Camera First!') + bpy.context.view_layer.objects.active = bpy.data.objects['Camera'] + bpy.data.objects["Camera"].select_set(True) + bpy.context.window.scene.objects['Camera'] + for obj in bpy.context.selected_objects: + bpy.context.object.lock_scale[0] = not bpy.context.object.lock_scale[0] + bpy.context.object.lock_scale[1] = not bpy.context.object.lock_scale[1] + bpy.context.object.lock_scale[2] = not bpy.context.object.lock_scale[2] + return {'FINISHED'} + + +class MCP_OT_CamLockAll(bpy.types.Operator): + """Lock Camera Transforms (LRS)""" + bl_idname = "mcp.cam_lock_all" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + active_object = bpy.context.active_object + active_type = active_object.type + if active_type == 'MESH': + self.report({'INFO'}, 'Select Camera First!') + bpy.context.view_layer.objects.active = bpy.data.objects['Camera'] + bpy.data.objects["Camera"].select_set(True) + bpy.context.window.scene.objects['Camera'] + for obj in bpy.context.selected_objects: + bpy.context.object.lock_location[0] = not bpy.context.object.lock_location[0] + bpy.context.object.lock_location[1] = not bpy.context.object.lock_location[1] + bpy.context.object.lock_location[2] = not bpy.context.object.lock_location[2] + bpy.context.object.lock_rotation[0] = not bpy.context.object.lock_rotation[0] + bpy.context.object.lock_rotation[1] = not bpy.context.object.lock_rotation[1] + bpy.context.object.lock_rotation[2] = not bpy.context.object.lock_rotation[2] + bpy.context.object.lock_scale[0] = not bpy.context.object.lock_scale[0] + bpy.context.object.lock_scale[1] = not bpy.context.object.lock_scale[1] + bpy.context.object.lock_scale[2] = not bpy.context.object.lock_scale[2] + return {'FINISHED'} + + +class MCP_OT_CameraPopup(bpy.types.Operator): + """Camera - Open Camera View""" + bl_idname = "mcp.camera_popup" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + # Modify scene settings + render = bpy.context.scene.render + render.resolution_x = 1500 + render.resolution_y = 800 + render.resolution_percentage = 100 + + # Call image editor window + bpy.ops.render.view_show("INVOKE_DEFAULT") + + # Change area type + area = bpy.context.window_manager.windows[-1].screen.areas[0] + area.type = "VIEW_3D" + + return {'FINISHED'} + + +# Class list to register +_classes = [ + # Panels + MCP_PT_ProPanel, + MCP_PT_CamTools, + # Theme Operators + MCP_OT_ThemeMayaBlue, + MCP_OT_ThemeMayaGradient, + MCP_OT_ThemeModo, + MCP_OT_ThemeBlenderDark, + MCP_OT_ThemeWhiteBG, + MCP_OT_ThemeSketchup, + MCP_OT_ThemeDoubleHotkey, + # Gizmo & Pivot + MCP_OT_GizmoDefault, + MCP_OT_PivotLock, + # Subdivision + MCP_OT_SubsurfRemove, + MCP_OT_Subsurf2, + MCP_OT_Subsurf3, + # Popups + MCP_OT_PopupGraphEditor, + MCP_OT_PopupHypershade, + MCP_OT_PopupAssetBrowser, + MCP_OT_AssetAdd, + MCP_OT_PopupKeymapText, + # Info + MCP_OT_ShortcutEq, + MCP_OT_ConfigInfo, + # Camera Tools + MCP_OT_CameraGuides, + MCP_OT_CamLockLocation, + MCP_OT_CamLockRotation, + MCP_OT_CamLockScale, + MCP_OT_CamLockAll, + MCP_OT_CameraPopup, +] + + +def register(): + print("MCP: Registering panel_pro module...") + for cls in _classes: + result = compat.safe_register_class(cls) + if result: + print(f"MCP: Registered {cls.__name__}") + else: + print(f"MCP: FAILED to register {cls.__name__}") + print("MCP: panel_pro registration complete") + + +def unregister(): + print("MCP: Unregistering panel_pro module...") + for cls in reversed(_classes): + compat.safe_unregister_class(cls) diff --git a/scripts/addons/form_affinity_maya_config_pro/panels/panel_shelf.py b/scripts/addons/form_affinity_maya_config_pro/panels/panel_shelf.py new file mode 100644 index 0000000..60f3dd5 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/panels/panel_shelf.py @@ -0,0 +1,879 @@ +""" +Maya Config Pro - Shelf Panel +Dynamic shelf with mode switching (Modeling, Edit Poly, Nurbs, Rendering, FX, Animation). +""" + +import bpy +import bmesh +from ..utils import compat +from bpy_extras.object_utils import AddObjectHelper, object_data_add +from bpy_extras.io_utils import ImportHelper +from bpy.props import IntProperty, FloatProperty, FloatVectorProperty, StringProperty + + +# ------------------------------------------------------------------------ +# Shelf Panel +# ------------------------------------------------------------------------ + +class MCP_PT_Shelf(bpy.types.Panel): + """Load Desired Shelf""" + bl_idname = "MCP_PT_Shelf" + bl_label = "Shelf" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "scene" + + draw_type = "modeling" + + def draw(self, context): + layout = self.layout + obj = context.object + + row = layout.row() + row.scale_y = 1 + row.scale_x = 2 + row.popover(panel="MCP_PT_ShelfDropdown", text="", icon="COLLAPSEMENU") + + # things we always have + row.operator('wm.open_mainfile', text="", icon="FILEBROWSER") + row.operator('wm.save_as_mainfile', text="", icon="FILE_TICK") + + # things for modeling + if MCP_PT_Shelf.draw_type == 'modeling': + row.label(text="", icon='DOT') + row.operator('mcp.split_area_asset', text="", icon="ASSET_MANAGER") + row.operator('mesh.primitive_cube_add', text="", icon="MESH_CUBE") + row.operator('mcp.cylinder_shelf', text="", icon="MESH_CYLINDER") + row.operator('mcp.cone_shelf', text="", icon="MESH_CONE") + row.operator('mcp.uvsphere_shelf', text="", icon="MESH_UVSPHERE") + row.operator('mesh.primitive_torus_add', text="", icon="MESH_TORUS") + row.operator('mesh.primitive_plane_add', text="", icon="MESH_PLANE") + row.operator('mcp.icosphere_shelf', text="", icon="MESH_ICOSPHERE") + row.operator('object.text_add', text="", icon="OUTLINER_OB_FONT") + row.operator('object.empty_add', text="", icon="EMPTY_AXIS") + row.label(text="", icon='DOT') + row.operator('object.origin_set', text='', icon='OBJECT_ORIGIN') + row.operator("object.transforms_to_deltas", text="", icon="FREEZE").mode="ALL" + row.operator('object.join', text="", icon="SELECT_EXTEND") + row.operator('mesh.separate', text="", icon="SELECT_SUBTRACT") + row.operator('mcp.add_background_image', text="", icon="IMAGE_BACKGROUND") + row.operator('mcp.add_reference_image', text="", icon="IMAGE_REFERENCE") + + # things for Edit Poly + elif MCP_PT_Shelf.draw_type == 'editpoly': + row.operator('object.origin_set', text='', icon='OBJECT_ORIGIN') + row.operator("object.transforms_to_deltas", text="", icon="FREEZE").mode="ALL" + row.operator("mcp.delta_transfer", text="", icon="MOD_DATA_TRANSFER") + row.operator("mesh.select_all", text="", icon="UV_SYNC_SELECT").action="INVERT" + row.operator("object.make_single_user", text="", icon="UNLINKED") + row.operator('object.join', text="", icon="SELECT_EXTEND") + row.operator('mesh.separate', text="", icon="SELECT_SUBTRACT") + row.operator("mesh.merge", text="", icon="AUTOMERGE_ON") + row.operator("mesh.bridge_edge_loops", text="", icon="UV_FACESEL") + row.operator("mesh.edge_face_add", text="", icon="NORMALS_VERTEX_FACE") + row.operator("mesh.flip_normals", text="", icon="NORMALS_FACE") + row.operator('mesh.select_mirror', text='', icon='MOD_MIRROR') + row.operator('mcp.mirror_x2', text="", icon="EVENT_X") + row.operator('mcp.mirror_z2', text="", icon="EVENT_Z") + row.operator('mcp.mirror_apply2', text="", icon="CHECKMARK") + row.operator('mcp.apply_transforms2', text="", icon="TRANSFORM_ORIGINS") + + # things for nurbs + elif MCP_PT_Shelf.draw_type == 'nurbs': + row.label(text="", icon='DOT') + row.operator('curve.primitive_bezier_curve_add', text="", icon="CURVE_BEZCURVE") + row.operator('curve.primitive_bezier_circle_add', text="", icon="CURVE_BEZCIRCLE") + row.operator('curve.primitive_nurbs_curve_add', text="", icon="CURVE_NCURVE") + row.operator('curve.primitive_nurbs_circle_add', text="", icon="CURVE_NCIRCLE") + row.operator('curve.primitive_nurbs_path_add', text="", icon="CURVE_PATH") + row.label(text="", icon='DOT') + row.operator('surface.primitive_nurbs_surface_curve_add', text="", icon="SURFACE_NCURVE") + row.operator('surface.primitive_nurbs_surface_circle_add', text="", icon="SURFACE_NCIRCLE") + row.operator('surface.primitive_nurbs_surface_surface_add', text="", icon="SURFACE_NSURFACE") + row.operator('surface.primitive_nurbs_surface_cylinder_add', text="", icon="SURFACE_NCYLINDER") + row.operator('surface.primitive_nurbs_surface_sphere_add', text="", icon="SURFACE_NSPHERE") + row.operator('surface.primitive_nurbs_surface_torus_add', text="", icon="SURFACE_NTORUS") + + # things for shading + elif MCP_PT_Shelf.draw_type == 'rendering': + row.label(text="", icon='DOT') + row.operator("mcp.hypershade_shelf", text="", icon='MATERIAL_DATA') + row.operator("mcp.rendering_shelf", text="", icon='SHADING_RENDERED') + row.label(text="", icon='DOT') + row.operator('object.light_add', text="", icon="LIGHT_POINT").type='POINT' + row.operator('object.light_add', text="", icon="LIGHT_SUN").type='SUN' + row.operator('object.light_add', text="", icon="LIGHT_SPOT").type='SPOT' + row.operator('object.light_add', text="", icon="LIGHT_AREA").type='AREA' + row.operator('object.lightprobe_add', text="", icon="OUTLINER_OB_LIGHTPROBE").type='CUBEMAP' + row.operator('object.lightprobe_add', text="", icon="LIGHTPROBE_PLANAR").type='PLANAR' + row.operator('object.lightprobe_add', text="", icon="LIGHTPROBE_GRID").type='GRID' + row.label(text="", icon='DOT') + row.operator('object.camera_add', text="", icon="VIEW_CAMERA") + row.operator("render.render", text='', icon='RENDER_STILL') + row.operator("render.view_show", text='', icon='RENDER_RESULT') + + # things for FX + elif MCP_PT_Shelf.draw_type == 'fx': + row.label(text="", icon='DOT') + row.operator('object.effector_add', text="", icon="FORCE_FORCE").type='FORCE' + row.operator('object.effector_add', text="", icon="FORCE_WIND").type='WIND' + row.operator('object.effector_add', text="", icon="FORCE_VORTEX").type='VORTEX' + row.operator('object.effector_add', text="", icon="FORCE_MAGNETIC").type='MAGNET' + row.operator('object.effector_add', text="", icon="FORCE_HARMONIC").type='HARMONIC' + row.operator('object.effector_add', text="", icon="FORCE_CHARGE").type='CHARGE' + row.operator('object.effector_add', text="", icon="FORCE_LENNARDJONES").type='LENNARDJ' + row.operator('object.effector_add', text="", icon="FORCE_TEXTURE").type='TEXTURE' + row.operator('object.effector_add', text="", icon="FORCE_CURVE").type='GUIDE' + row.operator('object.effector_add', text="", icon="FORCE_BOID").type='BOID' + row.operator('object.effector_add', text="", icon="FORCE_TURBULENCE").type='TURBULENCE' + row.operator('object.effector_add', text="", icon="FORCE_DRAG").type='DRAG' + row.operator('object.effector_add', text="", icon="FORCE_FLUIDFLOW").type='FLUID' + + # things for Animation + elif MCP_PT_Shelf.draw_type == 'animation': + row.label(text="", icon='DOT') + row.operator('wm.link', text="", icon="LINKED") + row.operator('wm.append', text="", icon="APPEND_BLEND") + row.operator('mcp.pose_mode_shelf', text="", icon="POSE_HLT") + row.operator('object.armature_add', text="", icon="OUTLINER_OB_ARMATURE") + row.operator('mcp.drop_to_floor', text="", icon='TRIA_DOWN') + row.label(text="", icon='DOT') + row.operator('mcp.popup_grapheditor_shelf', text="", icon="GRAPH") + row.operator('mcp.popup_dopesheet_shelf', text="", icon="ACTION") + row.operator('mcp.popup_drivers_shelf', text="", icon="DRIVER") + row.operator('mcp.split_area_timeline', text="", icon="TIME") + row.operator('anim.keyframe_insert_menu', text="", icon="DECORATE_ANIMATE") + + +# ------------------------------------------------------------------------ +# Image Loading Operators +# ------------------------------------------------------------------------ + +class MCP_OT_AddBackgroundImage(bpy.types.Operator, ImportHelper): + """Open a file browser and add a background image""" + bl_idname = "mcp.add_background_image" + bl_label = "Select Background Image" + + filepath: StringProperty( + name="File Path", + description="Path to the image file", + subtype='FILE_PATH' + ) + + filter_glob: StringProperty( + default="*.jpg;*.jpeg;*.png;*.tif;*.tiff;*.bmp", + options={'HIDDEN'} + ) + + def execute(self, context): + if not self.filepath: + return {'CANCELLED'} + + empty_obj = bpy.data.objects.new("Background_Image", None) + context.collection.objects.link(empty_obj) + empty_obj.empty_display_type = 'IMAGE' + empty_obj.empty_image_depth = 'BACK' + empty_obj.empty_display_size = 5.0 + + view3d = next((a for a in context.screen.areas if a.type == 'VIEW_3D'), None) + if view3d: + rv3d = view3d.spaces[0].region_3d + view_rot = rv3d.view_matrix.inverted().to_quaternion() + empty_obj.rotation_mode = 'QUATERNION' + empty_obj.rotation_quaternion = view_rot + empty_obj.location = (0.0, 0.0, 0.0) + + try: + img = bpy.data.images.load(self.filepath) + empty_obj.data = img + except Exception as e: + self.report({'ERROR'}, f"Could not load image: {e}") + return {'CANCELLED'} + + context.view_layer.objects.active = empty_obj + empty_obj.select_set(True) + return {'FINISHED'} + + +class MCP_OT_AddReferenceImage(bpy.types.Operator, ImportHelper): + """Open a file browser and add a reference image""" + bl_idname = "mcp.add_reference_image" + bl_label = "Select Reference Image" + + filepath: StringProperty( + name="File Path", + description="Path to the image file", + subtype='FILE_PATH' + ) + + filter_glob: StringProperty( + default="*.jpg;*.jpeg;*.png;*.tif;*.tiff;*.bmp", + options={'HIDDEN'} + ) + + def execute(self, context): + if not self.filepath: + return {'CANCELLED'} + + empty_obj = bpy.data.objects.new("Reference_Image", None) + context.collection.objects.link(empty_obj) + empty_obj.empty_display_type = 'IMAGE' + empty_obj.empty_image_depth = 'DEFAULT' + empty_obj.empty_display_size = 5.0 + + view3d = next((a for a in context.screen.areas if a.type == 'VIEW_3D'), None) + if view3d: + rv3d = view3d.spaces[0].region_3d + view_rot = rv3d.view_matrix.inverted().to_quaternion() + empty_obj.rotation_mode = 'QUATERNION' + empty_obj.rotation_quaternion = view_rot + empty_obj.location = (0.0, 0.0, 0.0) + + try: + img = bpy.data.images.load(self.filepath) + empty_obj.data = img + except Exception as e: + self.report({'ERROR'}, f"Could not load image: {e}") + return {'CANCELLED'} + + context.view_layer.objects.active = empty_obj + empty_obj.select_set(True) + return {'FINISHED'} + + +# Function by L and K +def update_bts(self, context): + MCP_PT_Shelf.draw_type = self.shelf_type + + +class MCP_PT_ShelfDropdown(bpy.types.Panel): + """Load Desired Shelf""" + bl_space_type = 'VIEW_3D' + bl_region_type = 'HEADER' + bl_label = "Load Desired Shelf" + bl_idname = "MCP_PT_ShelfDropdown" + bl_ui_units_x = 14 + + enum_shelf_names = [ + ('modeling', 'Polygons', 'Polygons Shelf'), + ('editpoly', 'Edit Poly', 'Edit Poly Shelf'), + ('nurbs', 'Nurbs', 'Nurbs Shelf'), + ('rendering', 'Rendering', 'Rendering Shelf'), + ('fx', 'FX', 'FX Shelf'), + ('animation', 'Animation', 'Animation Shelf') + ] + bpy.types.Scene.shelf_type = bpy.props.EnumProperty(items=enum_shelf_names, update=update_bts) + + def draw(self, context): + layout = self.layout + layout = self.layout.column_flow(columns=2) + + layout.label(text="Load Shelf:") + layout.use_property_split = False + layout.use_property_decorate = False + + box = layout.box() + box.scale_y = 2 + split = box.split(factor=0.2) + col = split.column(align=True) + + col.label(icon="RADIOBUT_OFF") + col.label(icon="RADIOBUT_OFF") + col.label(icon="RADIOBUT_OFF") + col.label(icon="RADIOBUT_OFF") + col.label(icon="RADIOBUT_OFF") + col.label(icon="RADIOBUT_OFF") + + col = split.column(align=True) + col.prop(context.scene, 'shelf_type', expand=True) + + +# ------------------------------------------------------------------------ +# Properties Editor +# ------------------------------------------------------------------------ + +class MCP_OT_PropertiesEditor(bpy.types.Operator): + """Properties Editor""" + bl_label = "Properties Editor" + bl_idname = 'mcp.properties_editor' + + def execute(self, context): + render = bpy.context.scene.render + render.resolution_x = 1000 + render.resolution_y = 600 + render.resolution_percentage = 100 + + bpy.ops.render.view_show("INVOKE_DEFAULT") + + area = bpy.context.window_manager.windows[-1].screen.areas[0] + area.type = "PROPERTIES" + + bpy.ops.pose.constraint_add(type='ACTION') + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Animation +# ------------------------------------------------------------------------ + +class MCP_OT_PoseModeShelf(bpy.types.Operator): + """Pose Mode""" + bl_label = "Pose Mode" + bl_idname = 'mcp.pose_mode_shelf' + + @classmethod + def poll(cls, context): + active_object = context.active_object + return active_object is not None and active_object.type == 'ARMATURE' and (context.mode == 'EDIT_MESH' or active_object.select_get()) + + def execute(self, context): + bpy.ops.object.mode_set(mode='POSE') + return {'FINISHED'} + + +class MCP_OT_GraphEditorShelf(bpy.types.Operator): + """Graph Editor""" + bl_label = "Graph Editor" + bl_idname = 'mcp.popup_grapheditor_shelf' + + def execute(self, context): + render = bpy.context.scene.render + render.resolution_x = 1000 + render.resolution_y = 600 + render.resolution_percentage = 100 + + bpy.ops.render.view_show("INVOKE_DEFAULT") + + area = bpy.context.window_manager.windows[-1].screen.areas[0] + area.type = "GRAPH_EDITOR" + return {'FINISHED'} + + +class MCP_OT_DopeSheetShelf(bpy.types.Operator): + """Dope Sheet""" + bl_label = "Dope Sheet" + bl_idname = 'mcp.popup_dopesheet_shelf' + + def execute(self, context): + render = bpy.context.scene.render + render.resolution_x = 1000 + render.resolution_y = 600 + render.resolution_percentage = 100 + + bpy.ops.render.view_show("INVOKE_DEFAULT") + + area = bpy.context.window_manager.windows[-1].screen.areas[0] + area.type = "DOPESHEET_EDITOR" + return {'FINISHED'} + + +class MCP_OT_DriversShelf(bpy.types.Operator): + """Drivers Editor""" + bl_label = "Drivers Editor" + bl_idname = 'mcp.popup_drivers_shelf' + + def execute(self, context): + bpy.ops.screen.drivers_editor_show() + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Split Area Operators +# ------------------------------------------------------------------------ + +my_outliner = None + +class MCP_OT_SplitAreaAsset(bpy.types.Operator): + """Asset Browser""" + bl_label = "Split Area" + bl_idname = 'mcp.split_area_asset' + + def execute(self, context): + bpy.ops.screen.userpref_show('INVOKE_DEFAULT') + + area = bpy.context.window_manager.windows[-1].screen.areas[0] + area.type = "VIEW_3D" + bpy.context.area.ui_type = 'ASSETS' + + return {'FINISHED'} + + +my_timelineshelf = None + +class MCP_OT_SplitAreaTimeline(bpy.types.Operator): + """Timeline Split""" + bl_label = "Split Area" + bl_idname = 'mcp.split_area_timeline' + + def execute(self, context): + global my_timelineshelf + + if my_timelineshelf: + with context.temp_override(area=my_timelineshelf): + bpy.ops.screen.area_close() + my_timelineshelf = None + else: + for area in bpy.context.screen.areas: + if area.type == 'VIEW_3D': + with bpy.context.temp_override(area=area): + bpy.ops.screen.area_split(direction='HORIZONTAL', factor=0.20) + bpy.context.screen.areas[-1].ui_type = 'TIMELINE' + my_timelineshelf = bpy.context.screen.areas[-1] + break + + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Drop To Floor +# ------------------------------------------------------------------------ + +class MCP_OT_DropToFloor(bpy.types.Operator): + """Drop/Raise Object to Floor""" + bl_label = "Drop to Floor" + bl_idname = "mcp.drop_to_floor" + + def execute(self, context): + context = bpy.context + for obj in context.selected_objects: + mx = obj.matrix_world + minz = min((mx @ v.co).z for v in obj.data.vertices) + mx.translation.z -= minz + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Camera Tools +# ------------------------------------------------------------------------ + +class MCP_OT_CameraTools(bpy.types.Operator): + """Camera - Tools""" + bl_idname = "mcp.camera_tools" + bl_label = "Camera Tools" + + def execute(self, context): + for area in bpy.context.screen.areas: + if area.type == 'VIEW_3D': + for space in area.spaces: + if space.type == 'VIEW_3D': + space.lock_camera = True + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Apply Transforms +# ------------------------------------------------------------------------ + +class MCP_OT_ApplyTransforms2(bpy.types.Operator): + """Apply Transforms""" + bl_idname = "mcp.apply_transforms2" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.object.transform_apply(location=True, rotation=True, scale=True, properties=True) + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Apply Delta +# ------------------------------------------------------------------------ + +class MCP_OT_DeltaTransfer(bpy.types.Operator, AddObjectHelper): + """Delta Transfer""" + bl_label = "Apply Delta Transfer" + bl_idname = "mcp.delta_transfer" + + def execute(self, context): + bpy.ops.object.modifier_add(type='DATA_TRANSFER') + bpy.context.space_data.context = 'SCENE' + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Symmetry - Mirror X +# ------------------------------------------------------------------------ + +class MCP_OT_MirrorX2(bpy.types.Operator): + """Symmetry - Mirror along X axis""" + bl_idname = "mcp.mirror_x2" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + for obj in bpy.context.selected_objects: + obj.name = "mirrorX" + + bpy.data.objects["mirrorX"].select_set(True) + + bpy.ops.mesh.primitive_plane_add(size=500.0, calc_uvs=True, align='WORLD', location=(0.0, 0.0, 0.0), rotation=(0.0, 1.5708, 0.0)) + for obj in bpy.context.selected_objects: + obj.name = "mirrorCut" + bpy.data.objects["mirrorCut"].select_set(False) + bpy.data.objects["mirrorX"].select_set(True) + bpy.context.view_layer.objects.active = bpy.data.objects['mirrorX'] + + context = bpy.context + scene = context.scene + mirrorX = scene.objects.get("mirrorX") + mirrorCut = scene.objects.get("mirrorCut") + if mirrorX and mirrorCut: + bool = mirrorX.modifiers.new(name='bool', type='BOOLEAN') + bool.object = mirrorCut + bool.operation = 'DIFFERENCE' + bpy.ops.object.modifier_apply(modifier=bool.name) + + bpy.data.objects["mirrorCut"].select_set(True) + bpy.data.objects["mirrorX"].select_set(False) + bpy.ops.object.delete(use_global=False) + + bpy.data.objects["mirrorX"].select_set(True) + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.select_all(action='DESELECT') + + ob = bpy.context.active_object + assert ob.type == "MESH" + mat = ob.matrix_world + me = ob.data + + if me.is_editmode: + bm = bmesh.from_edit_mesh(me) + else: + bm = bmesh.new() + bm.from_mesh(me) + + bmesh.ops.delete( + bm, + geom=[f for f in bm.faces if all(v.co.x < 1e-6 for v in f.verts)], + context='FACES' + ) + + if bm.is_wrapped: + bmesh.update_edit_mesh(me) + else: + bm.to_mesh(me) + me.update() + + bmesh.ops.delete( + bm, + geom=[f for f in bm.faces if f.normal.angle((-1, 0, 0)) < 1e-6], + context='FACES' + ) + + mirr = mirrorX.modifiers.new(name='mirrX', type='MIRROR') + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Symmetry - Mirror Z +# ------------------------------------------------------------------------ + +class MCP_OT_MirrorZ2(bpy.types.Operator): + """Symmetry - Mirror along Z axis""" + bl_idname = "mcp.mirror_z2" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + for obj in bpy.context.selected_objects: + obj.name = "mirrorZ" + + bpy.data.objects["mirrorZ"].select_set(True) + + bpy.ops.mesh.primitive_plane_add(size=500.0, calc_uvs=True, align='WORLD', location=(0.0, 0.0, 0.0), rotation=(0.0, 0.0, 1.5708)) + for obj in bpy.context.selected_objects: + obj.name = "mirrorCut" + bpy.data.objects["mirrorCut"].select_set(False) + bpy.data.objects["mirrorZ"].select_set(True) + bpy.context.view_layer.objects.active = bpy.data.objects['mirrorZ'] + + context = bpy.context + scene = context.scene + mirrorZ = scene.objects.get("mirrorZ") + mirrorCut = scene.objects.get("mirrorCut") + if mirrorZ and mirrorCut: + bool = mirrorZ.modifiers.new(name='bool', type='BOOLEAN') + bool.object = mirrorCut + bool.operation = 'DIFFERENCE' + bpy.ops.object.modifier_apply(modifier=bool.name) + + bpy.data.objects["mirrorCut"].select_set(True) + bpy.data.objects["mirrorZ"].select_set(False) + bpy.ops.object.delete(use_global=False) + + bpy.data.objects["mirrorZ"].select_set(True) + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.select_all(action='DESELECT') + + ob = bpy.context.active_object + assert ob.type == "MESH" + mat = ob.matrix_world + me = ob.data + + if me.is_editmode: + bm = bmesh.from_edit_mesh(me) + else: + bm = bmesh.new() + bm.from_mesh(me) + + bmesh.ops.delete( + bm, + geom=[f for f in bm.faces if all(v.co.z < 1e-6 for v in f.verts)], + context='FACES' + ) + + if bm.is_wrapped: + bmesh.update_edit_mesh(me) + else: + bm.to_mesh(me) + me.update() + + bmesh.ops.delete( + bm, + geom=[f for f in bm.faces if f.normal.angle((0, 0, -1)) < 1e-6], + context='FACES' + ) + + mirr = mirrorZ.modifiers.new(name='mirrZ', type='MIRROR') + mirr.use_axis[0] = False + mirr.use_axis[1] = False + mirr.use_axis[2] = True + + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Mirror Modifier Apply +# ------------------------------------------------------------------------ + +class MCP_OT_MirrorApply2(bpy.types.Operator): + """Symmetry - Apply""" + bl_idname = "mcp.mirror_apply2" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.context.active_object + bpy.ops.object.mode_set(mode='OBJECT') + bpy.ops.object.modifier_apply(modifier="mirrX") + bpy.ops.object.modifier_apply(modifier="mirrY") + bpy.ops.object.modifier_apply(modifier="mirrZ") + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Mesh Primitives +# ------------------------------------------------------------------------ + +class MCP_OT_UVSphere(bpy.types.Operator, AddObjectHelper): + """Add a UV Sphere""" + bl_label = "Add a UV Sphere" + bl_idname = "mcp.uvsphere_shelf" + + segments: IntProperty( + name="Segments:", + description="Number of Segments", + min=0, + default=32) + radius: IntProperty( + name="Radius:", + description="Radius", + min=0, + default=1) + ring_count: IntProperty( + name="Rings:", + description="Rings", + min=0, + default=16) + + def execute(self, context): + bpy.ops.mesh.primitive_uv_sphere_add( + segments=self.segments, radius=self.radius, + ring_count=self.ring_count, align=self.align, + location=self.location, + rotation=self.rotation) + return {'FINISHED'} + + def draw(self, context): + layout = self.layout + layout.prop(self, "segments") + layout.prop(self, "radius") + layout.prop(self, "ring_count") + layout.prop(self, "align") + layout.prop(self, "location") + layout.prop(self, "rotation") + + def invoke(self, context, event): + return context.window_manager.invoke_props_dialog(self) + + +class MCP_OT_CylinderShelf(bpy.types.Operator, AddObjectHelper): + """Add a Mesh Cylinder""" + bl_label = "Add a Mesh Cylinder" + bl_idname = "mcp.cylinder_shelf" + + vertices: IntProperty( + name="Vertices:", + description="Number of Vertices", + min=0, + default=32) + radius: IntProperty(default=1) + depth: FloatProperty(default=2) + + def execute(self, context): + bpy.ops.mesh.primitive_cylinder_add( + vertices=self.vertices, radius=self.radius, + depth=self.depth, align=self.align, end_fill_type='TRIFAN', + location=self.location, + rotation=self.rotation) + return {'FINISHED'} + + def draw(self, context): + layout = self.layout + layout.prop(self, "vertices") + layout.prop(self, "radius") + layout.prop(self, "depth") + layout.prop(self, "align") + layout.prop(self, "location") + layout.prop(self, "rotation") + + def invoke(self, context, event): + return context.window_manager.invoke_props_dialog(self) + + +class MCP_OT_Cone(bpy.types.Operator, AddObjectHelper): + """Add a Mesh Cone""" + bl_label = "Add a Mesh Cone" + bl_idname = "mcp.cone_shelf" + + vertices: IntProperty( + name="Vertices:", + description="Number of Vertices", + min=0, + default=32) + radius1: IntProperty(default=1) + radius2: IntProperty(default=0) + depth: FloatProperty(default=2) + + def execute(self, context): + bpy.ops.mesh.primitive_cone_add( + vertices=self.vertices, radius1=self.radius1, + radius2=self.radius2, + depth=self.depth, + align=self.align, + location=self.location, + rotation=self.rotation) + return {'FINISHED'} + + def draw(self, context): + layout = self.layout + layout.prop(self, "vertices") + layout.prop(self, "radius1") + layout.prop(self, "radius2") + layout.prop(self, "depth") + layout.prop(self, "align") + layout.prop(self, "location") + layout.prop(self, "rotation") + + def invoke(self, context, event): + return context.window_manager.invoke_props_dialog(self) + + +class MCP_OT_Icosphere(bpy.types.Operator, AddObjectHelper): + """Add an IcoSphere""" + bl_label = "Add a Mesh IcoSphere" + bl_idname = "mcp.icosphere_shelf" + + subdivisions: IntProperty(default=2) + radius: IntProperty(default=1) + + def execute(self, context): + bpy.ops.mesh.primitive_ico_sphere_add( + subdivisions=self.subdivisions, radius=self.radius, + align=self.align, + location=self.location, + rotation=self.rotation) + return {'FINISHED'} + + def draw(self, context): + layout = self.layout + layout.prop(self, "subdivisions") + layout.prop(self, "radius") + layout.prop(self, "align") + layout.prop(self, "location") + layout.prop(self, "rotation") + + def invoke(self, context, event): + return context.window_manager.invoke_props_dialog(self) + + +# ------------------------------------------------------------------------ +# Workspace Operators +# ------------------------------------------------------------------------ + +class MCP_OT_HypershadeShelf(bpy.types.Operator): + bl_idname = "mcp.hypershade_shelf" + bl_label = "layout" + + def execute(self, context): + layout = self.layout + bpy.data.window_managers['WinMan'].windows[0].workspace = bpy.data.workspaces['HyperShade'] + return {'FINISHED'} + + +class MCP_OT_RenderingShelf(bpy.types.Operator): + bl_idname = "mcp.rendering_shelf" + bl_label = "layout" + + def execute(self, context): + layout = self.layout + bpy.data.window_managers['WinMan'].windows[0].workspace = bpy.data.workspaces['Rendering'] + return {'FINISHED'} + + +# Class list to register +# Note: MCP_PT_Shelf panel removed - using shelf_header.py instead +_classes = [ + # Dropdown (kept for compatibility) + MCP_PT_ShelfDropdown, + # Images + MCP_OT_AddBackgroundImage, + MCP_OT_AddReferenceImage, + # Animation + MCP_OT_PropertiesEditor, + MCP_OT_PoseModeShelf, + MCP_OT_GraphEditorShelf, + MCP_OT_DopeSheetShelf, + MCP_OT_DriversShelf, + # Split Area + MCP_OT_SplitAreaAsset, + MCP_OT_SplitAreaTimeline, + # Utilities + MCP_OT_DropToFloor, + MCP_OT_CameraTools, + # Transforms + MCP_OT_ApplyTransforms2, + MCP_OT_DeltaTransfer, + # Mirror + MCP_OT_MirrorX2, + MCP_OT_MirrorZ2, + MCP_OT_MirrorApply2, + # Primitives + MCP_OT_UVSphere, + MCP_OT_CylinderShelf, + MCP_OT_Cone, + MCP_OT_Icosphere, + # Workspace + MCP_OT_HypershadeShelf, + MCP_OT_RenderingShelf, +] + + +def register(): + for cls in _classes: + compat.safe_register_class(cls) + + +def unregister(): + for cls in reversed(_classes): + compat.safe_unregister_class(cls) diff --git a/scripts/addons/form_affinity_maya_config_pro/panels/panel_sidebar.py b/scripts/addons/form_affinity_maya_config_pro/panels/panel_sidebar.py new file mode 100644 index 0000000..671387b --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/panels/panel_sidebar.py @@ -0,0 +1,735 @@ +""" +Maya Config Pro - Sidebar Panel +N-panel shelf with modeling toolkit. +""" + +import bpy +import bmesh +from ..utils import compat +from bpy_extras.object_utils import AddObjectHelper, object_data_add +from bpy.props import IntProperty, FloatProperty, FloatVectorProperty + + +class MCP_PT_Sidebar(bpy.types.Panel): + """Maya Shelf on the right side N panel""" + bl_idname = "MCP_PT_Sidebar" + bl_category = "Shelf" + bl_label = "Shelf" + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + + def draw(self, context): + layout = self.layout + obj = context.object + + row = layout.row() + row.operator('mesh.primitive_uv_sphere_add', text="", icon="MESH_UVSPHERE") + row.operator('mesh.primitive_cube_add', text="", icon="MESH_CUBE") + row.operator('mcp.cylinder_sidebar', text="", icon="MESH_CYLINDER") + row.operator('mesh.primitive_cone_add', text="", icon="MESH_CONE") + row.operator('mesh.primitive_torus_add', text="", icon="MESH_TORUS") + + row = layout.row() + row.operator('mesh.primitive_plane_add', text="", icon="MESH_PLANE") + row.operator('mesh.primitive_ico_sphere_add', text="", icon="MESH_ICOSPHERE") + row.operator('object.text_add', text="", icon="OUTLINER_OB_FONT") + row.operator('object.empty_add', text="", icon="EMPTY_AXIS") + + row = layout.row() + row.operator('curve.primitive_bezier_curve_add', text="", icon="CURVE_BEZCURVE") + row.operator('curve.primitive_bezier_circle_add', text="", icon="CURVE_BEZCIRCLE") + row.operator('curve.primitive_nurbs_curve_add', text="", icon="CURVE_NCURVE") + row.operator('curve.primitive_nurbs_circle_add', text="", icon="CURVE_NCIRCLE") + row.operator('curve.primitive_nurbs_path_add', text="", icon="CURVE_PATH") + + row = layout.row() + row.operator('surface.primitive_nurbs_surface_curve_add', text="", icon="SURFACE_NCURVE") + row.operator('surface.primitive_nurbs_surface_circle_add', text="", icon="SURFACE_NCIRCLE") + row.operator('surface.primitive_nurbs_surface_surface_add', text="", icon="SURFACE_NSURFACE") + + row = layout.row() + row.operator('object.origin_set', text='', icon='OBJECT_ORIGIN') + row.operator("object.transforms_to_deltas", text="", icon="FREEZE").mode="ALL" + row.operator('mcp.origin_show', text='', icon='OBJECT_ORIGIN') + + row = layout.row() + row.operator("mcp.hypershade_sidebar", text="", icon='MATERIAL_DATA') + row.operator("mcp.rendering_sidebar", text="", icon='SHADING_RENDERED') + row.operator('mcp.load_reference_image', text="", icon="IMAGE_REFERENCE") + row.operator('mcp.load_background_image', text="", icon="IMAGE_BACKGROUND") + row.operator('object.light_add', text="", icon="LIGHT") + row.operator('object.camera_add', text="", icon="VIEW_CAMERA") + + row = layout.row() + row.operator("object.mode_set", text="", icon="TOOL_SETTINGS") + row.label(text='Modeling Toolkit') + + row = layout.row() + row.operator("mcp.msm_from_object", text="Vertex", icon='VERTEXSEL').mode = 'vert' + row.operator("mcp.msm_from_object", text="Edge", icon='EDGESEL').mode = 'edge' + + row = layout.row() + row.operator("mcp.msm_from_object", text="Face", icon='FACESEL').mode = 'face' + row.operator("mcp.multi", text="Multi", icon='EDITMODE_HLT') + + row = layout.row() + row.label(text="", icon='MOD_MIRROR') + row.operator('mcp.mirror_x', text="", icon="EVENT_X") + row.operator('mcp.mirror_z', text="", icon="EVENT_Z") + row.operator('mcp.mirror_apply', text="", icon="CHECKMARK") + row.operator('mcp.apply_transforms', text="", icon="TRANSFORM_ORIGINS") + + row = layout.row() + row.scale_y = 2 + row.scale_x = 2 + row.operator('mcp.extrude_normal', text="", icon="SHAPEKEY_DATA") + row.operator('mcp.extrude_axis', text="", icon="AXIS_TOP") + row.operator('mcp.bevel', text="", icon="MOD_BEVEL") + + row = layout.row() + row.scale_y = 2 + row.scale_x = 2 + row.operator('mcp.bridge_loops', text="", icon="SNAP_PEEL_OBJECT") + row.operator('mcp.knife_tool', text="", icon="SCULPTMODE_HLT") + row.operator('mcp.inset_faces', text="", icon="FACE_MAPS") + + row = layout.row() + row.operator('mcp.subdivide', text="", icon="MOD_MULTIRES") + row.operator("mcp.unsubdivide", text="", icon="MESH_PLANE") + row.operator('mcp.loop_cut', text="", icon="MESH_GRID") + row.operator('object.join', text="", icon="SELECT_EXTEND") + row.operator('mesh.separate', text="", icon="SELECT_SUBTRACT") + + +# ------------------------------------------------------------------------ +# Mesh Cylinder Sidebar +# ------------------------------------------------------------------------ + +class MCP_OT_CylinderSidebar(bpy.types.Operator, AddObjectHelper): + """Add a Mesh Cylinder""" + bl_label = "Add a Mesh Cylinder" + bl_idname = "mcp.cylinder_sidebar" + + scale: FloatVectorProperty(name="Scale:", default=(1,1,1)) + vertices: IntProperty( + name="Vertices:", + description="Number of Vertices", + min=0, + default=32) + radius: IntProperty(default=1) + depth: FloatProperty(default=2) + + def execute(self, context): + s = self.scale + bpy.ops.mesh.primitive_cylinder_add( + vertices=self.vertices, radius=self.radius, + depth=self.depth, align=self.align, end_fill_type='TRIFAN', + location=self.location, + rotation=self.rotation) + obj = bpy.context.active_object + obj.scale[0] = s[0] + obj.scale[1] = s[1] + obj.scale[2] = s[2] + return {'FINISHED'} + + def draw(self, context): + layout = self.layout + layout.prop(self, "vertices") + layout.prop(self, "radius") + layout.prop(self, "depth") + layout.prop(self, "align") + layout.prop(self, "location") + layout.prop(self, "rotation") + + def invoke(self, context, event): + return context.window_manager.invoke_props_dialog(self) + + +# ------------------------------------------------------------------------ +# Pivots +# ------------------------------------------------------------------------ + +class MCP_OT_PivotLock(bpy.types.Operator): + """Lock/Unlock Pivot""" + bl_idname = "mcp.pivot_lock_sidebar" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.context.scene.tool_settings.use_snap = not bpy.context.scene.tool_settings.use_snap + bpy.context.scene.tool_settings.snap_elements = {'VERTEX'} + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Origin Show/Hide +# ------------------------------------------------------------------------ + +class MCP_OT_OriginShow(bpy.types.Operator): + """Show/Hide Origin""" + bl_idname = "mcp.origin_show" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.context.scene.tool_settings.use_transform_data_origin = not bpy.context.scene.tool_settings.use_transform_data_origin + bpy.ops.wm.tool_set_by_id(name="builtin.move") + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Extrude Along Axis +# ------------------------------------------------------------------------ + +class MCP_OT_ExtrudeAxis(bpy.types.Operator): + """FA Extrude Along Axis""" + bl_idname = "mcp.extrude_axis" + bl_label = "FA Extrude Along Axis" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + active_object = bpy.context.view_layer.objects.active + return active_object is not None and active_object.type == 'MESH' and (context.mode == 'EDIT_MESH' or active_object.select_get()) + + def execute(self, context): + for obj in bpy.context.selected_objects: + bpy.ops.object.mode_set(mode='EDIT') + + active_object = bpy.context.view_layer.objects.active + if active_object is not None: + self.report({'INFO'}, "Axis Extrude Tool") + else: + self.report({'INFO'}, "Please Select a Mesh!") + + bpy.ops.mesh.extrude_region_shrink_fatten( + MESH_OT_extrude_region={"use_normal_flip":False, "use_dissolve_ortho_edges":False, "mirror":False}, + TRANSFORM_OT_shrink_fatten={"value":0, + "use_even_offset":False, + "mirror":False, + "use_proportional_edit":False, + "proportional_edit_falloff":'SMOOTH', + "proportional_size":1, + "use_proportional_connected":False, + "snap":False, + "release_confirm":False, + "use_accurate":False}) + + bpy.ops.wm.tool_set_by_id(name="builtin.move") + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Bridge +# ------------------------------------------------------------------------ + +class MCP_OT_BridgeLoops(bpy.types.Operator): + """FA Bridge Edge Loops""" + bl_idname = "mcp.bridge_loops" + bl_label = "FA Bridge Edge Loops" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + active_object = bpy.context.view_layer.objects.active + return active_object is not None and active_object.type == 'MESH' and (context.mode == 'EDIT_MESH' or active_object.select_get()) + + def execute(self, context): + for obj in bpy.context.selected_objects: + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.bridge_edge_loops() + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Inset Faces +# ------------------------------------------------------------------------ + +class MCP_OT_InsetFaces(bpy.types.Operator): + """FA Inset Faces""" + bl_idname = "mcp.inset_faces" + bl_label = "FA Inset Faces" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + active_object = bpy.context.view_layer.objects.active + return active_object is not None and active_object.type == 'MESH' and (context.mode == 'EDIT_MESH' or active_object.select_get()) + + def execute(self, context): + bpy.ops.wm.tool_set_by_id(name="builtin.inset_faces") + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Loop Cut +# ------------------------------------------------------------------------ + +class MCP_OT_LoopCut(bpy.types.Operator): + """FA Loop Cut""" + bl_idname = "mcp.loop_cut" + bl_label = "FA Loop Cut" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + active_object = bpy.context.view_layer.objects.active + return active_object is not None and active_object.type == 'MESH' and (context.mode == 'EDIT_MESH' or active_object.select_get()) + + def execute(self, context): + bpy.ops.wm.tool_set_by_id(name="builtin.loop_cut") + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Knife +# ------------------------------------------------------------------------ + +class MCP_OT_KnifeTool(bpy.types.Operator): + """FA Knife Tool""" + bl_idname = "mcp.knife_tool" + bl_label = "FA Knife Tool" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + active_object = bpy.context.view_layer.objects.active + return active_object is not None and active_object.type == 'MESH' and (context.mode == 'EDIT_MESH' or active_object.select_get()) + + def execute(self, context): + bpy.ops.wm.tool_set_by_id(name="builtin.knife") + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Extrude Along Normal +# ------------------------------------------------------------------------ + +class MCP_OT_ExtrudeNormal(bpy.types.Operator): + """FA Extrude Along Normal""" + bl_idname = "mcp.extrude_normal" + bl_label = "FA Extrude Along Normal" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + active_object = bpy.context.view_layer.objects.active + return active_object is not None and active_object.type == 'MESH' and (context.mode == 'EDIT_MESH' or active_object.select_get()) + + def execute(self, context): + bpy.ops.wm.tool_set_by_id(name="builtin.extrude_along_normals") + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Subdivide +# ------------------------------------------------------------------------ + +class MCP_OT_Subdivide(bpy.types.Operator): + """Subdivide Object""" + bl_label = "Subdivide" + bl_idname = "mcp.subdivide" + + def execute(self, context): + bpy.ops.object.mode_set(mode='EDIT') + bpy.context.tool_settings.mesh_select_mode = (False, True, False) + bpy.ops.mesh.select_all(action='SELECT') + bpy.ops.mesh.subdivide() + return {'FINISHED'} + + +class MCP_OT_Unsubdivide(bpy.types.Operator): + """Un-Subdivide Object""" + bl_label = "Un-Subdivide" + bl_idname = "mcp.unsubdivide" + + def execute(self, context): + bpy.ops.object.mode_set(mode='EDIT') + bpy.context.tool_settings.mesh_select_mode = (False, True, False) + bpy.ops.mesh.select_all(action='SELECT') + bpy.ops.mesh.unsubdivide() + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Bevel +# ------------------------------------------------------------------------ + +class MCP_OT_Bevel(bpy.types.Operator): + """FA Extrude Along Normal""" + bl_idname = "mcp.bevel" + bl_label = "FA Standard Bevel" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + active_object = bpy.context.view_layer.objects.active + return active_object is not None and active_object.type == 'MESH' and (context.mode == 'EDIT_MESH' or active_object.select_get()) + + def execute(self, context): + bpy.ops.wm.tool_set_by_id(name="builtin.bevel") + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Apply Transforms +# ------------------------------------------------------------------------ + +class MCP_OT_ApplyTransforms(bpy.types.Operator): + """Apply Transforms""" + bl_idname = "mcp.apply_transforms" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.ops.object.transform_apply(location=True, rotation=True, scale=True) + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Symmetry - Mirror X +# ------------------------------------------------------------------------ + +class MCP_OT_MirrorX(bpy.types.Operator): + """Symmetry - Mirror along X axis""" + bl_idname = "mcp.mirror_x" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + for obj in bpy.context.selected_objects: + obj.name = "mirrorX" + + bpy.data.objects["mirrorX"].select_set(True) + + bpy.ops.mesh.primitive_plane_add(size=500.0, calc_uvs=True, align='WORLD', location=(0.0, 0.0, 0.0), rotation=(0.0, 1.5708, 0.0)) + for obj in bpy.context.selected_objects: + obj.name = "mirrorCut" + bpy.data.objects["mirrorCut"].select_set(False) + bpy.data.objects["mirrorX"].select_set(True) + bpy.context.view_layer.objects.active = bpy.data.objects['mirrorX'] + + context = bpy.context + scene = context.scene + mirrorX = scene.objects.get("mirrorX") + mirrorCut = scene.objects.get("mirrorCut") + if mirrorX and mirrorCut: + bool = mirrorX.modifiers.new(name='bool', type='BOOLEAN') + bool.object = mirrorCut + bool.operation = 'DIFFERENCE' + bpy.context.object.modifiers["bool"].solver = 'FAST' + bpy.ops.object.modifier_apply(modifier=bool.name) + + bpy.data.objects["mirrorCut"].select_set(True) + bpy.data.objects["mirrorX"].select_set(False) + bpy.ops.object.delete(use_global=False) + + bpy.data.objects["mirrorX"].select_set(True) + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.select_all(action='DESELECT') + + ob = bpy.context.active_object + assert ob.type == "MESH" + mat = ob.matrix_world + me = ob.data + + if me.is_editmode: + bm = bmesh.from_edit_mesh(me) + else: + bm = bmesh.new() + bm.from_mesh(me) + + bmesh.ops.delete( + bm, + geom=[f for f in bm.faces if all( + v.co.x < 1e-6 for v in f.verts) + ], + context='FACES' + ) + + if bm.is_wrapped: + bmesh.update_edit_mesh(me) + else: + bm.to_mesh(me) + me.update() + + bmesh.ops.delete( + bm, + geom=[f for f in bm.faces if f.normal.angle((-1, 0, 0)) < 1e-6], + context='FACES' + ) + + mirr = mirrorX.modifiers.new(name='mirrX', type='MIRROR') + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Symmetry - Mirror Z +# ------------------------------------------------------------------------ + +class MCP_OT_MirrorZ(bpy.types.Operator): + """Symmetry - Mirror along Z axis""" + bl_idname = "mcp.mirror_z" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + for obj in bpy.context.selected_objects: + obj.name = "mirrorZ" + + bpy.data.objects["mirrorZ"].select_set(True) + + bpy.ops.mesh.primitive_plane_add(size=500.0, calc_uvs=True, align='WORLD', location=(0.0, 0.0, 0.0), rotation=(0.0, 0.0, 1.5708)) + for obj in bpy.context.selected_objects: + obj.name = "mirrorCut" + bpy.data.objects["mirrorCut"].select_set(False) + bpy.data.objects["mirrorZ"].select_set(True) + bpy.context.view_layer.objects.active = bpy.data.objects['mirrorZ'] + + context = bpy.context + scene = context.scene + mirrorZ = scene.objects.get("mirrorZ") + mirrorCut = scene.objects.get("mirrorCut") + if mirrorZ and mirrorCut: + bool = mirrorZ.modifiers.new(name='bool', type='BOOLEAN') + bool.object = mirrorCut + bool.operation = 'DIFFERENCE' + bpy.ops.object.modifier_apply(modifier=bool.name) + + bpy.data.objects["mirrorCut"].select_set(True) + bpy.data.objects["mirrorZ"].select_set(False) + bpy.ops.object.delete(use_global=False) + + bpy.data.objects["mirrorZ"].select_set(True) + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.select_all(action='DESELECT') + + ob = bpy.context.active_object + assert ob.type == "MESH" + mat = ob.matrix_world + me = ob.data + + if me.is_editmode: + bm = bmesh.from_edit_mesh(me) + else: + bm = bmesh.new() + bm.from_mesh(me) + + bmesh.ops.delete( + bm, + geom=[f for f in bm.faces if all( + v.co.z < 1e-6 for v in f.verts) + ], + context='FACES' + ) + + if bm.is_wrapped: + bmesh.update_edit_mesh(me) + else: + bm.to_mesh(me) + me.update() + + bmesh.ops.delete( + bm, + geom=[f for f in bm.faces if f.normal.angle((0, 0, -1)) < 1e-6], + context='FACES' + ) + + mirr = mirrorZ.modifiers.new(name='mirrZ', type='MIRROR') + mirr.use_axis[0] = False + mirr.use_axis[1] = False + mirr.use_axis[2] = True + + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Mirror Modifier Apply +# ------------------------------------------------------------------------ + +class MCP_OT_MirrorApply(bpy.types.Operator): + """Symmetry - Apply""" + bl_idname = "mcp.mirror_apply" + bl_label = "" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + bpy.context.active_object + bpy.ops.object.mode_set(mode='OBJECT') + bpy.ops.object.modifier_apply(modifier="mirrX") + bpy.ops.object.modifier_apply(modifier="mirrY") + bpy.ops.object.modifier_apply(modifier="mirrZ") + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Workspace Operators +# ------------------------------------------------------------------------ + +class MCP_OT_HypershadeSidebar(bpy.types.Operator): + bl_idname = "mcp.hypershade_sidebar" + bl_label = "layout" + + def execute(self, context): + layout = self.layout + bpy.data.window_managers['WinMan'].windows[0].workspace = bpy.data.workspaces['HyperShade'] + return {'FINISHED'} + + +class MCP_OT_RenderingSidebar(bpy.types.Operator): + bl_idname = "mcp.rendering_sidebar" + bl_label = "layout" + + def execute(self, context): + layout = self.layout + bpy.data.window_managers['WinMan'].windows[0].workspace = bpy.data.workspaces['Rendering'] + return {'FINISHED'} + + +# ------------------------------------------------------------------------ +# Image Loading Operators +# ------------------------------------------------------------------------ + +from bpy_extras.io_utils import ImportHelper +from bpy.props import StringProperty + +class MCP_OT_LoadBackgroundImage(bpy.types.Operator, ImportHelper): + """Open a file browser and add a background image""" + bl_idname = "mcp.load_background_image" + bl_label = "Select Background Image" + + filepath: StringProperty( + name="File Path", + description="Path to the image file", + subtype='FILE_PATH' + ) + + filter_glob: StringProperty( + default="*.jpg;*.jpeg;*.png;*.tif;*.tiff;*.bmp", + options={'HIDDEN'} + ) + + def execute(self, context): + if not self.filepath: + return {'CANCELLED'} + + # Create the Object at world center (0,0,0) + empty_obj = bpy.data.objects.new("Background_Image", None) + context.collection.objects.link(empty_obj) + empty_obj.empty_display_type = 'IMAGE' + empty_obj.empty_image_depth = 'BACK' + empty_obj.empty_display_size = 5.0 + + # ALIGN ROTATION TO VIEW + view3d = next((a for a in context.screen.areas if a.type == 'VIEW_3D'), None) + if view3d: + rv3d = view3d.spaces[0].region_3d + view_rot = rv3d.view_matrix.inverted().to_quaternion() + empty_obj.rotation_mode = 'QUATERNION' + empty_obj.rotation_quaternion = view_rot + empty_obj.location = (0.0, 0.0, 0.0) + + # Load the Image + try: + img = bpy.data.images.load(self.filepath) + empty_obj.data = img + except Exception as e: + self.report({'ERROR'}, f"Could not load image: {e}") + return {'CANCELLED'} + + context.view_layer.objects.active = empty_obj + empty_obj.select_set(True) + return {'FINISHED'} + + +class MCP_OT_LoadReferenceImage(bpy.types.Operator, ImportHelper): + """Open a file browser and add a reference image""" + bl_idname = "mcp.load_reference_image" + bl_label = "Select Reference Image" + + filepath: StringProperty( + name="File Path", + description="Path to the image file", + subtype='FILE_PATH' + ) + + filter_glob: StringProperty( + default="*.jpg;*.jpeg;*.png;*.tif;*.tiff;*.bmp", + options={'HIDDEN'} + ) + + def execute(self, context): + if not self.filepath: + return {'CANCELLED'} + + # Create the Object at world center (0,0,0) + empty_obj = bpy.data.objects.new("Reference_Image", None) + context.collection.objects.link(empty_obj) + empty_obj.empty_display_type = 'IMAGE' + empty_obj.empty_image_depth = 'DEFAULT' + empty_obj.empty_display_size = 5.0 + + # ALIGN ROTATION TO VIEW + view3d = next((a for a in context.screen.areas if a.type == 'VIEW_3D'), None) + if view3d: + rv3d = view3d.spaces[0].region_3d + view_rot = rv3d.view_matrix.inverted().to_quaternion() + empty_obj.rotation_mode = 'QUATERNION' + empty_obj.rotation_quaternion = view_rot + empty_obj.location = (0.0, 0.0, 0.0) + + # Load the Image + try: + img = bpy.data.images.load(self.filepath) + empty_obj.data = img + except Exception as e: + self.report({'ERROR'}, f"Could not load image: {e}") + return {'CANCELLED'} + + context.view_layer.objects.active = empty_obj + empty_obj.select_set(True) + return {'FINISHED'} + + +# Class list to register +_classes = [ + # Panel + MCP_PT_Sidebar, + # Cylinder + MCP_OT_CylinderSidebar, + # Pivots + MCP_OT_PivotLock, + MCP_OT_OriginShow, + # Modeling + MCP_OT_ExtrudeAxis, + MCP_OT_ExtrudeNormal, + MCP_OT_Bevel, + MCP_OT_BridgeLoops, + MCP_OT_InsetFaces, + MCP_OT_LoopCut, + MCP_OT_KnifeTool, + MCP_OT_Subdivide, + MCP_OT_Unsubdivide, + # Transforms + MCP_OT_ApplyTransforms, + # Mirror + MCP_OT_MirrorX, + MCP_OT_MirrorZ, + MCP_OT_MirrorApply, + # Workspace + MCP_OT_HypershadeSidebar, + MCP_OT_RenderingSidebar, + # Images + MCP_OT_LoadBackgroundImage, + MCP_OT_LoadReferenceImage, +] + + +def register(): + for cls in _classes: + compat.safe_register_class(cls) + + +def unregister(): + for cls in reversed(_classes): + compat.safe_unregister_class(cls) diff --git a/scripts/addons/form_affinity_maya_config_pro/panels/shelf_header.py b/scripts/addons/form_affinity_maya_config_pro/panels/shelf_header.py new file mode 100644 index 0000000..7fa9bdf --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/panels/shelf_header.py @@ -0,0 +1,177 @@ +""" +Maya Config Pro - Shelf Header +Maya-like shelf in the VIEW3D header. +Always visible, context-independent. +""" + +import bpy + +# Current shelf mode +_shelf_mode = "modeling" # modeling, editpoly, nurbs, rendering, fx, animation + + +class MCP_OT_ShelfSetMode(bpy.types.Operator): + """Set the shelf mode""" + bl_idname = "mcp.shelf_set_mode_header" + bl_label = "Set Shelf Mode" + bl_options = {'REGISTER', 'UNDO'} + + mode: bpy.props.StringProperty(default="modeling") + + def execute(self, context): + global _shelf_mode + _shelf_mode = self.mode + return {'FINISHED'} + + +class MCP_MT_ShelfModeMenu(bpy.types.Menu): + """Shelf mode selection menu""" + bl_label = "Shelf Mode" + bl_idname = "MCP_MT_ShelfModeMenu" + + def draw(self, context): + layout = self.layout + + modes = [ + ('modeling', 'Polygons', 'EDITMODE_HLT'), + ('editpoly', 'Edit Poly', 'MODIFIER'), + ('nurbs', 'Nurbs', 'CURVE_BEZCURVE'), + ('rendering', 'Rendering', 'SHADING_RENDERED'), + ('fx', 'FX', 'FORCE_WIND'), + ('animation', 'Animation', 'POSE_HLT'), + ] + + for mode_id, label, icon in modes: + row = layout.row() + row.operator("mcp.shelf_set_mode_header", text=label, icon=icon).mode = mode_id + + +def draw_shelf_header(self, context): + """Draw the Maya-like shelf in the VIEW3D header""" + if context.area.type != 'VIEW_3D': + return + + layout = self.layout + row = layout.row(align=True) + + # Menu button for mode selection + row.menu("MCP_MT_ShelfModeMenu", text="", icon='COLLAPSEMENU') + + # File operations + row.operator('wm.open_mainfile', text="", icon="FILEBROWSER") + row.operator('wm.save_as_mainfile', text="", icon="FILE_TICK") + + # Mode-specific tools + global _shelf_mode + + if _shelf_mode == 'modeling': + row.separator() + row.operator('mcp.split_area_asset', text="", icon="ASSET_MANAGER") + row.operator('mesh.primitive_cube_add', text="", icon="MESH_CUBE") + row.operator('mcp.cylinder_shelf', text="", icon="MESH_CYLINDER") + row.operator('mcp.cone_shelf', text="", icon="MESH_CONE") + row.operator('mcp.uvsphere_shelf', text="", icon="MESH_UVSPHERE") + row.operator('mesh.primitive_torus_add', text="", icon="MESH_TORUS") + row.operator('mesh.primitive_plane_add', text="", icon="MESH_PLANE") + row.operator('mcp.icosphere_shelf', text="", icon="MESH_ICOSPHERE") + row.operator('object.text_add', text="", icon="OUTLINER_OB_FONT") + row.operator('object.empty_add', text="", icon="EMPTY_AXIS") + row.separator() + row.operator('object.origin_set', text="", icon='OBJECT_ORIGIN') + row.operator("object.transforms_to_deltas", text="", icon="FREEZE").mode="ALL" + row.operator('object.join', text="", icon="SELECT_EXTEND") + row.operator('mesh.separate', text="", icon="SELECT_SUBTRACT") + + elif _shelf_mode == 'editpoly': + row.separator() + row.operator('object.origin_set', text="", icon='OBJECT_ORIGIN') + row.operator("object.transforms_to_deltas", text="", icon="FREEZE").mode="ALL" + row.operator("mcp.delta_transfer", text="", icon="MOD_DATA_TRANSFER") + row.operator("mesh.select_all", text="", icon="UV_SYNC_SELECT").action="INVERT" + row.operator("object.make_single_user", text="", icon="UNLINKED") + row.operator('object.join', text="", icon="SELECT_EXTEND") + row.operator('mesh.separate', text="", icon="SELECT_SUBTRACT") + row.operator("mesh.merge", text="", icon="AUTOMERGE_ON") + row.operator("mesh.bridge_edge_loops", text="", icon="UV_FACESEL") + row.operator("mesh.edge_face_add", text="", icon="NORMALS_VERTEX_FACE") + row.operator("mesh.flip_normals", text="", icon="NORMALS_FACE") + row.operator('mesh.select_mirror', text="", icon='MOD_MIRROR') + row.operator('mcp.mirror_x2', text="", icon="EVENT_X") + row.operator('mcp.mirror_z2', text="", icon="EVENT_Z") + + elif _shelf_mode == 'nurbs': + row.separator() + row.operator('curve.primitive_bezier_curve_add', text="", icon="CURVE_BEZCURVE") + row.operator('curve.primitive_bezier_circle_add', text="", icon="CURVE_BEZCIRCLE") + row.operator('curve.primitive_nurbs_curve_add', text="", icon="CURVE_NCURVE") + row.operator('curve.primitive_nurbs_circle_add', text="", icon="CURVE_NCIRCLE") + row.operator('curve.primitive_nurbs_path_add', text="", icon="CURVE_PATH") + row.separator() + row.operator('surface.primitive_nurbs_surface_curve_add', text="", icon="SURFACE_NCURVE") + row.operator('surface.primitive_nurbs_surface_circle_add', text="", icon="SURFACE_NCIRCLE") + row.operator('surface.primitive_nurbs_surface_surface_add', text="", icon="SURFACE_NSURFACE") + + elif _shelf_mode == 'rendering': + row.separator() + row.operator("mcp.hypershade_shelf", text="", icon='MATERIAL_DATA') + row.operator("mcp.rendering_shelf", text="", icon='SHADING_RENDERED') + row.separator() + row.operator('object.light_add', text="", icon="LIGHT_POINT").type='POINT' + row.operator('object.light_add', text="", icon="LIGHT_SUN").type='SUN' + row.operator('object.light_add', text="", icon="LIGHT_SPOT").type='SPOT' + row.operator('object.light_add', text="", icon="LIGHT_AREA").type='AREA' + row.operator('object.lightprobe_add', text="", icon="OUTLINER_OB_LIGHTPROBE").type='CUBEMAP' + row.operator('object.camera_add', text="", icon="VIEW_CAMERA") + row.operator("render.render", text="", icon='RENDER_STILL') + + elif _shelf_mode == 'fx': + row.separator() + row.operator('object.effector_add', text="", icon="FORCE_FORCE").type='FORCE' + row.operator('object.effector_add', text="", icon="FORCE_WIND").type='WIND' + row.operator('object.effector_add', text="", icon="FORCE_VORTEX").type='VORTEX' + row.operator('object.effector_add', text="", icon="FORCE_MAGNETIC").type='MAGNET' + row.operator('object.effector_add', text="", icon="FORCE_HARMONIC").type='HARMONIC' + row.operator('object.effector_add', text="", icon="FORCE_CHARGE").type='CHARGE' + row.operator('object.effector_add', text="", icon="FORCE_LENNARDJONES").type='LENNARDJ' + row.operator('object.effector_add', text="", icon="FORCE_TEXTURE").type='TEXTURE' + row.operator('object.effector_add', text="", icon="FORCE_CURVE").type='GUIDE' + row.operator('object.effector_add', text="", icon="FORCE_BOID").type='BOID' + + elif _shelf_mode == 'animation': + row.separator() + row.operator('wm.link', text="", icon="LINKED") + row.operator('wm.append', text="", icon="APPEND_BLEND") + row.operator('mcp.pose_mode_ani', text="", icon="POSE_HLT") + row.operator('object.armature_add', text="", icon="OUTLINER_OB_ARMATURE") + row.operator('mcp.drop_to_floor_ani', text="", icon='TRIA_DOWN') + row.separator() + row.operator('mcp.graph_editor_ani', text="", icon="GRAPH") + row.operator('mcp.dope_sheet_ani', text="", icon="ACTION") + row.operator('mcp.drivers_ani', text="", icon="DRIVER") + row.operator('anim.keyframe_insert_menu', text="", icon="DECORATE_ANIMATE") + + +_classes = [ + MCP_OT_ShelfSetMode, + MCP_MT_ShelfModeMenu, +] + + +def register(): + """Register shelf header""" + for cls in _classes: + bpy.utils.register_class(cls) + + # Append to VIEW3D header + bpy.types.VIEW3D_HT_header.append(draw_shelf_header) + print("MCP: Shelf header registered") + + +def unregister(): + """Unregister shelf header""" + # Remove from VIEW3D header + bpy.types.VIEW3D_HT_header.remove(draw_shelf_header) + + for cls in reversed(_classes): + bpy.utils.unregister_class(cls) + print("MCP: Shelf header unregistered") diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/config/.gitkeep b/scripts/addons/form_affinity_maya_config_pro/portable/config/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/config/.gitkeep @@ -0,0 +1 @@ + diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/config/startup.blend b/scripts/addons/form_affinity_maya_config_pro/portable/config/startup.blend new file mode 100644 index 0000000..f04c27a --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/config/startup.blend @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:315283fd5e30dab29722fdbce34bcdba22270bd4997887bff04166b4ad07caa4 +size 1901096 diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/config/userpref.blend b/scripts/addons/form_affinity_maya_config_pro/portable/config/userpref.blend new file mode 100644 index 0000000..ad5a07a --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/config/userpref.blend @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9dac975ed06c28d7dc4c89f1dba3d847fc5e0f5f573692d1967ea53cb0c479bd +size 230150 diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/extensions/.cache/compat.dat b/scripts/addons/form_affinity_maya_config_pro/portable/extensions/.cache/compat.dat new file mode 100644 index 0000000..2e164e8 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/extensions/.cache/compat.dat @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc14731b402d890922ecb80fb6b8e78a59a1008a226b6aeb97ad08075111e428 +size 163 diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/extensions/user_default/icon_viewer/__init__.py b/scripts/addons/form_affinity_maya_config_pro/portable/extensions/user_default/icon_viewer/__init__.py new file mode 100644 index 0000000..b946d79 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/extensions/user_default/icon_viewer/__init__.py @@ -0,0 +1,484 @@ +# SPDX-FileCopyrightText: 2010-2022 Blender Foundation +# +# SPDX-License-Identifier: GPL-2.0-or-later + +import bpy +import math +from bpy.props import ( + BoolProperty, + StringProperty, +) + +DPI = 72 +POPUP_PADDING = 10 +PANEL_PADDING = 44 +WIN_PADDING = 32 +ICON_SIZE = 20 +HISTORY_SIZE = 100 +HISTORY = [] + + +def ui_scale(): + prefs = bpy.context.preferences.system + return prefs.dpi / DPI + + +def prefs(): + return bpy.context.preferences.addons[__package__].preferences + + +class Icons: + def __init__(self, is_popup=False): + self._filtered_icons = None + self._filter = "" + self.filter = "" + self.selected_icon = "" + self.is_popup = is_popup + + @property + def filter(self): + return self._filter + + @filter.setter + def filter(self, value): + if self._filter == value: + return + + self._filter = value + self.update() + + @property + def filtered_icons(self): + if self._filtered_icons is None: + self._filtered_icons = [] + icon_filter = self._filter.upper() + self.filtered_icons.clear() + pr = prefs() + + icons = bpy.types.UILayout.bl_rna.functions[ + "prop"].parameters["icon"].enum_items.keys() + for icon in icons: + if icon == 'NONE' or \ + icon_filter and icon_filter not in icon or \ + not pr.show_brush_icons and "BRUSH_" in icon and \ + icon != 'BRUSH_DATA' or \ + not pr.show_matcap_icons and "MATCAP_" in icon or \ + not pr.show_event_icons and ( + "EVENT_" in icon or "MOUSE_" in icon + ) or \ + not pr.show_colorset_icons and "COLORSET_" in icon: + continue + self._filtered_icons.append(icon) + + return self._filtered_icons + + @property + def num_icons(self): + return len(self.filtered_icons) + + def update(self): + if self._filtered_icons is not None: + self._filtered_icons.clear() + self._filtered_icons = None + + def draw(self, layout, num_cols=0, icons=None): + if icons: + filtered_icons = reversed(icons) + else: + filtered_icons = self.filtered_icons + + column = layout.column(align=True) + row = column.row(align=True) + row.alignment = 'CENTER' + + selected_icon = self.selected_icon if self.is_popup else \ + bpy.context.window_manager.clipboard + col_idx = 0 + for i, icon in enumerate(filtered_icons): + p = row.operator( + IV_OT_icon_select.bl_idname, text="", + icon=icon, emboss=icon == selected_icon) + p.icon = icon + p.force_copy_on_select = not self.is_popup + + col_idx += 1 + if col_idx > num_cols - 1: + if icons: + break + col_idx = 0 + if i < len(filtered_icons) - 1: + row = column.row(align=True) + row.alignment = 'CENTER' + + if col_idx != 0 and not icons and i >= num_cols: + for _ in range(num_cols - col_idx): + row.label(text="", icon='BLANK1') + + if not filtered_icons: + row.label(text="No icons were found") + + +class IV_Preferences(bpy.types.AddonPreferences): + bl_idname = __package__ + + panel_icons = Icons() + popup_icons = Icons(is_popup=True) + + def update_icons(self, context): + self.panel_icons.update() + self.popup_icons.update() + + def set_panel_filter(self, value): + self.panel_icons.filter = value + + panel_filter: StringProperty( + description="Filter", + default="", + get=lambda s: s.panel_icons.filter, + set=set_panel_filter, + options={'TEXTEDIT_UPDATE'}) + show_panel_icons: BoolProperty( + name="Show Icons", + description="Show icons", default=True) + show_history: BoolProperty( + name="Show History", + description="Show history", default=True) + show_brush_icons: BoolProperty( + name="Show Brush Icons", + description="Show brush icons", default=True, + update=update_icons) + show_matcap_icons: BoolProperty( + name="Show Matcap Icons", + description="Show matcap icons", default=True, + update=update_icons) + show_event_icons: BoolProperty( + name="Show Event Icons", + description="Show event icons", default=True, + update=update_icons) + show_colorset_icons: BoolProperty( + name="Show Colorset Icons", + description="Show colorset icons", default=True, + update=update_icons) + copy_on_select: BoolProperty( + name="Copy Icon On Click", + description="Copy icon on click", default=True) + close_on_select: BoolProperty( + name="Close Popup On Click", + description=( + "Close the popup on click.\n" + "Not supported by some windows (User Preferences, Render)" + ), + default=False) + auto_focus_filter: BoolProperty( + name="Auto Focus Input Field", + description="Auto focus input field", default=True) + show_panel: BoolProperty( + name="Show Panel", + description="Show the panel in the Text Editor", default=True) + show_header: BoolProperty( + name="Show Header", + description="Show the header in the Python Console", + default=True) + + def draw(self, context): + layout = self.layout + row = layout.row() + row.scale_y = 1.5 + row.operator(IV_OT_icons_show.bl_idname) + + row = layout.row() + + col = row.column(align=True) + col.label(text="Icons:") + col.prop(self, "show_matcap_icons") + col.prop(self, "show_brush_icons") + col.prop(self, "show_colorset_icons") + col.prop(self, "show_event_icons") + col.separator() + col.prop(self, "show_history") + + col = row.column(align=True) + col.label(text="Popup:") + col.prop(self, "auto_focus_filter") + col.prop(self, "copy_on_select") + if self.copy_on_select: + col.prop(self, "close_on_select") + + col = row.column(align=True) + col.label(text="Panel:") + col.prop(self, "show_panel") + if self.show_panel: + col.prop(self, "show_panel_icons") + + col.separator() + col.label(text="Header:") + col.prop(self, "show_header") + + +class IV_PT_icons(bpy.types.Panel): + bl_space_type = "TEXT_EDITOR" + bl_region_type = "UI" + bl_label = "Icon Viewer" + bl_category = "Dev" + bl_options = {'DEFAULT_CLOSED'} + + @staticmethod + def tag_redraw(): + wm = bpy.context.window_manager + if not wm: + return + + for w in wm.windows: + for a in w.screen.areas: + if a.type == 'TEXT_EDITOR': + for r in a.regions: + if r.type == 'UI': + r.tag_redraw() + + def draw(self, context): + pr = prefs() + row = self.layout.row(align=True) + if pr.show_panel_icons: + row.prop(pr, "panel_filter", text="", icon='VIEWZOOM') + else: + row.operator(IV_OT_icons_show.bl_idname) + row.operator( + IV_OT_panel_menu_call.bl_idname, text="", icon='COLLAPSEMENU') + + _, y0 = context.region.view2d.region_to_view(0, 0) + _, y1 = context.region.view2d.region_to_view(0, 10) + region_scale = 10 / abs(y0 - y1) + + num_cols = max( + 1, + (context.region.width - PANEL_PADDING) // + math.ceil(ui_scale() * region_scale * ICON_SIZE)) + + col = None + if HISTORY and pr.show_history: + col = self.layout.column(align=True) + pr.panel_icons.draw(col.box(), num_cols, HISTORY) + + if pr.show_panel_icons: + col = col or self.layout.column(align=True) + pr.panel_icons.draw(col.box(), num_cols) + + @classmethod + def poll(cls, context): + return prefs().show_panel + + +class IV_OT_panel_menu_call(bpy.types.Operator): + bl_idname = "iv.panel_menu_call" + bl_label = "" + bl_description = "Menu" + bl_options = {'INTERNAL'} + + def menu(self, menu, context): + pr = prefs() + layout = menu.layout + layout.prop(pr, "show_panel_icons") + layout.prop(pr, "show_history") + + if not pr.show_panel_icons: + return + + layout.separator() + layout.prop(pr, "show_matcap_icons") + layout.prop(pr, "show_brush_icons") + layout.prop(pr, "show_colorset_icons") + layout.prop(pr, "show_event_icons") + + def execute(self, context): + context.window_manager.popup_menu(self.menu, title="Icon Viewer") + return {'FINISHED'} + + +class IV_OT_icon_select(bpy.types.Operator): + bl_idname = "iv.icon_select" + bl_label = "" + bl_description = "Select the icon" + bl_options = {'INTERNAL'} + + icon: StringProperty() + force_copy_on_select: BoolProperty() + + def execute(self, context): + pr = prefs() + pr.popup_icons.selected_icon = self.icon + if pr.copy_on_select or self.force_copy_on_select: + context.window_manager.clipboard = self.icon + self.report({'INFO'}, self.icon) + + if pr.close_on_select and IV_OT_icons_show.instance: + IV_OT_icons_show.instance.close() + + if pr.show_history: + if self.icon in HISTORY: + HISTORY.remove(self.icon) + if len(HISTORY) >= HISTORY_SIZE: + HISTORY.pop(0) + HISTORY.append(self.icon) + return {'FINISHED'} + + +class IV_OT_icons_show(bpy.types.Operator): + bl_idname = "iv.icons_show" + bl_label = "Icon Viewer" + bl_description = "Icon viewer" + bl_property = "filter_auto_focus" + + instance = None + + def set_filter(self, value): + prefs().popup_icons.filter = value + + def set_selected_icon(self, value): + if IV_OT_icons_show.instance: + IV_OT_icons_show.instance.auto_focusable = False + + filter_auto_focus: StringProperty( + description="Filter", + get=lambda s: prefs().popup_icons.filter, + set=set_filter, + options={'TEXTEDIT_UPDATE', 'SKIP_SAVE'}) + filter: StringProperty( + description="Filter", + get=lambda s: prefs().popup_icons.filter, + set=set_filter, + options={'TEXTEDIT_UPDATE'}) + selected_icon: StringProperty( + description="Selected Icon", + get=lambda s: prefs().popup_icons.selected_icon, + set=set_selected_icon) + + def get_num_cols(self, num_icons): + return round(1.3 * math.sqrt(num_icons)) + + def draw_header(self, layout): + pr = prefs() + header = layout.box() + header = header.split(factor=0.75) if self.selected_icon else \ + header.row() + row = header.row(align=True) + row.prop(pr, "show_matcap_icons", text="", icon='SHADING_RENDERED') + row.prop(pr, "show_brush_icons", text="", icon='BRUSH_DATA') + row.prop(pr, "show_colorset_icons", text="", icon='COLOR') + row.prop(pr, "show_event_icons", text="", icon='HAND') + row.separator() + + row.prop( + pr, "copy_on_select", text="", + icon='COPYDOWN', toggle=True) + if pr.copy_on_select: + sub = row.row(align=True) + if bpy.context.window.screen.name == "temp": + sub.alert = True + sub.prop( + pr, "close_on_select", text="", + icon='RESTRICT_SELECT_OFF', toggle=True) + row.prop( + pr, "auto_focus_filter", text="", + icon='OUTLINER_DATA_FONT', toggle=True) + row.separator() + + if self.auto_focusable and pr.auto_focus_filter: + row.prop(self, "filter_auto_focus", text="", icon='VIEWZOOM') + else: + row.prop(self, "filter", text="", icon='VIEWZOOM') + + if self.selected_icon: + row = header.row() + row.prop(self, "selected_icon", text="", icon=self.selected_icon) + + def draw(self, context): + pr = prefs() + col = self.layout + self.draw_header(col) + + history_num_cols = int( + (self.width - POPUP_PADDING) / (ui_scale() * ICON_SIZE)) + num_cols = min( + self.get_num_cols(len(pr.popup_icons.filtered_icons)), + history_num_cols) + + subcol = col.column(align=True) + + if HISTORY and pr.show_history: + pr.popup_icons.draw(subcol.box(), history_num_cols, HISTORY) + + pr.popup_icons.draw(subcol.box(), num_cols) + + def close(self): + bpy.context.window.screen = bpy.context.window.screen + + def check(self, context): + return True + + def cancel(self, context): + IV_OT_icons_show.instance = None + IV_PT_icons.tag_redraw() + + def execute(self, context): + if not IV_OT_icons_show.instance: + return {'CANCELLED'} + IV_OT_icons_show.instance = None + + pr = prefs() + if self.selected_icon and not pr.copy_on_select: + context.window_manager.clipboard = self.selected_icon + self.report({'INFO'}, self.selected_icon) + pr.popup_icons.selected_icon = "" + + IV_PT_icons.tag_redraw() + return {'FINISHED'} + + def invoke(self, context, event): + pr = prefs() + pr.popup_icons.selected_icon = "" + pr.popup_icons.filter = "" + IV_OT_icons_show.instance = self + self.auto_focusable = True + + num_cols = self.get_num_cols(len(pr.popup_icons.filtered_icons)) + self.width = int(min( + ui_scale() * (num_cols * ICON_SIZE + POPUP_PADDING), + context.window.width - WIN_PADDING)) + + return context.window_manager.invoke_props_dialog( + self, width=self.width) + + +def draw_console_header(self, context): + if not prefs().show_header: + return + self.layout.operator(IV_OT_icons_show.bl_idname) + + +classes = ( + IV_PT_icons, + IV_OT_panel_menu_call, + IV_OT_icon_select, + IV_OT_icons_show, + IV_Preferences, +) + + +def register(): + if bpy.app.background: + return + + for cls in classes: + bpy.utils.register_class(cls) + + bpy.types.CONSOLE_HT_header.append(draw_console_header) + + +def unregister(): + if bpy.app.background: + return + + bpy.types.CONSOLE_HT_header.remove(draw_console_header) + + for cls in classes: + bpy.utils.unregister_class(cls) diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/extensions/user_default/icon_viewer/blender_manifest.toml b/scripts/addons/form_affinity_maya_config_pro/portable/extensions/user_default/icon_viewer/blender_manifest.toml new file mode 100644 index 0000000..4ff6bd0 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/extensions/user_default/icon_viewer/blender_manifest.toml @@ -0,0 +1,12 @@ +schema_version = "1.0.0" +id = "icon_viewer" +name = "Icon Viewer" +version = "1.4.2" +tagline = "Click an icon to copy its name to the clipboard" +maintainer = "Community" +type = "add-on" +tags = ["Development"] +blender_version_min = "4.2.0" +license = ["SPDX:GPL-2.0-or-later"] +website = "https://projects.blender.org/extensions/development_icon_get" +copyright = ["2024 roaoao"] diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/scripts/addons/IconOperator/.gitignore b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/addons/IconOperator/.gitignore new file mode 100644 index 0000000..7e99e36 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/addons/IconOperator/.gitignore @@ -0,0 +1 @@ +*.pyc \ No newline at end of file diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/scripts/addons/IconOperator/__init__.py b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/addons/IconOperator/__init__.py new file mode 100644 index 0000000..8cd9fe1 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/addons/IconOperator/__init__.py @@ -0,0 +1,96 @@ +bl_info = { + "name": "Side Shelf", + "author": "Jesse Doyle", + "blender": (3, 2, 0), + "description": "E Shelf on the right side N panel", + "category": "Side Tabs" +} + +import os +import bpy +import bpy.utils.previews +from os import listdir +from os.path import isfile, join + + +class NPanel(bpy.types.Panel): + """Creates a Panel in the 3D view Tools panel""" + bl_idname = "TEST_PT_Panel" + bl_label = "Test" + bl_category = "Shelf" + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + bl_context = "objectmode" + + def draw(self, context): + + layout = self.layout + pcoll = preview_collections["main"] + + row = layout.row() + triangle_icon = pcoll["triangle"] + square_icon = pcoll["square"] + row.scale_x = 10.0 + row.scale_y = 8.0 + + row.operator("mesh.primitive_cube_add", text="", icon_value=triangle_icon.icon_id) + row.operator("mesh.primitive_uv_sphere_add", text="", icon_value=square_icon.icon_id,scale=10) + + +# global variable to store icons in +# custom_icons = None + +# def register(): +# global custom_icons +# custom_icons = bpy.utils.previews.new() + +# for z in list_raw: +# custom_icons.load(z[:-4], os.path.join(directory, z), 'IMAGE') + +# bpy.utils.register_class(Panel) + +# def unregister(): +# global custom_icons +# bpy.utils.previews.remove(custom_icons) + +preview_collections = {} + + +def register(): + + # Note that preview collections returned by bpy.utils.previews + # are regular py objects - you can use them to store custom data. + pcoll = bpy.utils.previews.new() + + # path to the folder where the icon is + # the path is calculated relative to this py file inside the addon folder + + directory = os.path.join(os.path.dirname(__file__), "Data", "icons") + list_raw = [] + onlyfiles = [f for f in listdir(directory) if isfile(join(directory, f))] + + for f in onlyfiles: + if f[-4:] == ".png": + list_raw.append(f) + + for z in list_raw: + + # load a preview thumbnail of a file and store in the previews collection + pcoll.load(z[:-4], os.path.join(directory, z), 'IMAGE') + + preview_collections["main"] = pcoll + + bpy.utils.register_class(NPanel) + + +def unregister(): + + for pcoll in preview_collections.values(): + bpy.utils.previews.remove(pcoll) + preview_collections.clear() + + bpy.utils.unregister_class(NPanel) + + +if __name__ == "__main__": + register() diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/Blender_Dark.xml b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/Blender_Dark.xml new file mode 100644 index 0000000..8bbb747 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/Blender_Dark.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/Blender_Light.xml b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/Blender_Light.xml new file mode 100644 index 0000000..7bc7d1e --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/Blender_Light.xml @@ -0,0 +1,1643 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/maya_blue_theme.xml b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/maya_blue_theme.xml new file mode 100644 index 0000000..3a04e37 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/maya_blue_theme.xml @@ -0,0 +1,1534 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/maya_theme.xml b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/maya_theme.xml new file mode 100644 index 0000000..2909f11 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/maya_theme.xml @@ -0,0 +1,1453 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/maya_theme_gradient.xml b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/maya_theme_gradient.xml new file mode 100644 index 0000000..9312ba9 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/maya_theme_gradient.xml @@ -0,0 +1,1534 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/modo_theme.xml b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/modo_theme.xml new file mode 100644 index 0000000..de997d8 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/modo_theme.xml @@ -0,0 +1,1534 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/sketchup.xml b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/sketchup.xml new file mode 100644 index 0000000..d4f8346 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/sketchup.xml @@ -0,0 +1,1534 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/white_bg_theme.xml b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/white_bg_theme.xml new file mode 100644 index 0000000..761a8e0 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/interface_theme/white_bg_theme.xml @@ -0,0 +1,1534 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/keyconfig/Blender.py b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/keyconfig/Blender.py new file mode 100644 index 0000000..dd733ad --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/keyconfig/Blender.py @@ -0,0 +1,384 @@ +# SPDX-FileCopyrightText: 2018-2023 Blender Authors +# +# SPDX-License-Identifier: GPL-2.0-or-later + +import os +import bpy +from bpy.props import ( + BoolProperty, + EnumProperty, +) + +DIRNAME, FILENAME = os.path.split(__file__) +IDNAME = os.path.splitext(FILENAME)[0] + + +def update_fn(_self, _context): + load() + + +class Prefs(bpy.types.KeyConfigPreferences): + bl_idname = IDNAME + + select_mouse: EnumProperty( + name="Select Mouse", + items=( + ('LEFT', "Left", + "Use left mouse button for selection. " + "The standard behavior that works well for mouse, trackpad and tablet devices"), + ('RIGHT', "Right", + "Use right mouse button for selection, and left mouse button for actions. " + "This works well primarily for keyboard and mouse devices"), + ), + description=( + "Mouse button used for selection" + ), + update=update_fn, + ) + spacebar_action: EnumProperty( + name="Spacebar Action", + items=( + ('PLAY', "Play", + "Toggle animation playback " + "('Shift-Space' for Tools)", + 1), + ('TOOL', "Tools", + "Open the popup tool-bar\n" + "When 'Space' is held and used as a modifier:\n" + "\u2022 Pressing the tools binding key switches to it immediately.\n" + "\u2022 Dragging the cursor over a tool and releasing activates it (like a pie menu).\n" + "For Play use 'Shift-Space'", + 0), + ('SEARCH', "Search", + "Open the operator search popup", + 2), + ), + description=( + "Action when 'Space' is pressed" + ), + default='PLAY', + update=update_fn, + ) + tool_key_mode: EnumProperty( + name="Tool Keys", + description=( + "The method of keys to activate tools such as move, rotate & scale (G, R, S)" + ), + items=( + ('IMMEDIATE', "Immediate", + "Activate actions immediately"), + ('TOOL', "Active Tool", + "Activate the tool for editors that support tools"), + ), + default='IMMEDIATE', + update=update_fn, + ) + + rmb_action: EnumProperty( + name="Right Mouse Select Action", + items=( + ('TWEAK', "Select & Tweak", + "Right mouse always tweaks"), + ('FALLBACK_TOOL', "Selection Tool", + "Right mouse uses the selection tool"), + ), + description=( + "Default action for the right mouse button" + ), + update=update_fn, + ) + + # Experimental: only show with developer extras, see: #107785. + use_region_toggle_pie: BoolProperty( + name="Region Toggle Pie", + description=( + "N-key opens a pie menu to toggle regions" + ), + default=False, + update=update_fn, + ) + + use_alt_click_leader: BoolProperty( + name="Alt Click Tool Prompt", + description=( + "Tapping Alt (without pressing any other keys) shows a prompt in the status-bar, " + "prompting a second keystroke to activate the tool" + ), + default=False, + update=update_fn, + ) + # NOTE: expose `use_alt_tool` and `use_alt_cursor` as two options in the UI + # as the tool-tips and titles are different enough depending on RMB/LMB select. + use_alt_tool: BoolProperty( + name="Alt Tool Access", + description=( + "Hold Alt to use the active tool when the gizmo would normally be required\n" + "Incompatible with the input preference \"Emulate 3 Button Mouse\" when the \"Alt\" key is used" + ), + default=False, + update=update_fn, + ) + use_alt_cursor: BoolProperty( + name="Alt Cursor Access", + description=( + "Hold Alt-LMB to place the Cursor (instead of LMB), allows tools to activate on press instead of drag.\n" + "Incompatible with the input preference \"Emulate 3 Button Mouse\" when the \"Alt\" key is used" + ), + default=False, + update=update_fn, + ) + # end note. + + use_select_all_toggle: BoolProperty( + name="Select All Toggles", + description=( + "Causes select-all ('A' key) to de-select in the case a selection exists" + ), + default=False, + update=update_fn, + ) + + gizmo_action: EnumProperty( + name="Activate Gizmo", + items=( + ('PRESS', "Press", "Press causes immediate activation, preventing click being passed to the tool"), + ('DRAG', "Drag", "Drag allows click events to pass through to the tool, adding a small delay"), + ), + description="Activation event for gizmos that support drag motion", + default='DRAG', + update=update_fn, + ) + + # 3D View + use_v3d_tab_menu: BoolProperty( + name="Tab for Pie Menu", + description=( + "Causes tab to open pie menu (swaps 'Tab' / 'Ctrl-Tab')" + ), + default=False, + update=update_fn, + ) + use_v3d_shade_ex_pie: BoolProperty( + name="Extra Shading Pie Menu Items", + description=( + "Show additional options in the shading menu ('Z')" + ), + default=False, + update=update_fn, + ) + v3d_tilde_action: EnumProperty( + name="Tilde Action", + items=( + ('VIEW', "Navigate", + "View operations (useful for keyboards without a numpad)", + 0), + ('GIZMO', "Gizmos", + "Control transform gizmos", + 1), + ), + description=( + "Action when 'Tilde' is pressed" + ), + default='VIEW', + update=update_fn, + ) + + v3d_mmb_action: EnumProperty( + name="MMB Action", + items=( + ('ORBIT', "Orbit", + "", + 0), + ('PAN', "Pan", + "", + 1), + ), + description=( + "The action when Middle-Mouse dragging in the viewport. " + "Shift-Middle-Mouse is used for the other action. " + "This applies to trackpad as well" + ), + update=update_fn, + ) + + v3d_alt_mmb_drag_action: EnumProperty( + name="Alt-MMB Drag Action", + items=( + ('RELATIVE', "Relative", + "Set the view axis where each mouse direction maps to an axis relative to the current orientation", + 0), + ('ABSOLUTE', "Absolute", + "Set the view axis where each mouse direction always maps to the same axis", + 1), + ), + description=( + "Action when Alt-MMB dragging in the 3D viewport" + ), + update=update_fn, + ) + + # Developer note, this is an experimental option. + use_pie_click_drag: BoolProperty( + name="Pie Menu on Drag", + description=( + "Activate some pie menus on drag,\n" + "allowing the tapping the same key to have a secondary action.\n" + "\n" + "\u2022 Tapping Tab in the 3D view toggles edit-mode, drag for mode menu.\n" + "\u2022 Tapping Z in the 3D view toggles wireframe, drag for draw modes.\n" + "\u2022 Tapping Tilde in the 3D view for first person navigation, drag for view axes" + ), + default=False, + update=update_fn, + ) + + use_file_single_click: BoolProperty( + name="Open Folders on Single Click", + description=( + "Navigate into folders by clicking on them once instead of twice" + ), + default=False, + update=update_fn, + ) + + use_alt_navigation: BoolProperty( + name="Transform Navigation with Alt", + description=( + "During transformations, use Alt to navigate in the 3D View. " + "Note that if disabled, hotkeys for Proportional Editing, " + "Automatic Constraints, and Auto IK Chain Length will require holding Alt" + ), + default=True, + update=update_fn, + ) + + def draw(self, layout): + from bpy import context + + layout.use_property_split = True + layout.use_property_decorate = False + + prefs = context.preferences + + show_developer_ui = prefs.view.show_developer_ui + is_select_left = (self.select_mouse == 'LEFT') + use_mouse_emulate_3_button = ( + prefs.inputs.use_mouse_emulate_3_button and + prefs.inputs.mouse_emulate_3_button_modifier == 'ALT' + ) + + # General settings. + col = layout.column() + col.row().prop(self, "select_mouse", text="Select with Mouse Button", expand=True) + col.row().prop(self, "spacebar_action", text="Spacebar Action", expand=True) + + if is_select_left: + col.row().prop(self, "gizmo_action", text="Activate Gizmo Event", expand=True) + else: + col.row().prop(self, "rmb_action", text="Right Mouse Select Action", expand=True) + + col.row().prop(self, "tool_key_mode", expand=True) + + # Check-box sub-layout. + col = layout.column() + sub = col.column(align=True) + row = sub.row() + row.prop(self, "use_alt_click_leader") + + rowsub = row.row() + if is_select_left: + rowsub.prop(self, "use_alt_tool") + else: + rowsub.prop(self, "use_alt_cursor") + rowsub.active = not use_mouse_emulate_3_button + + row = sub.row() + row.prop(self, "use_select_all_toggle") + + if show_developer_ui: + row = sub.row() + row.prop(self, "use_region_toggle_pie") + + # 3DView settings. + col = layout.column() + col.label(text="3D View") + col.row().prop(self, "v3d_tilde_action", text="Grave Accent / Tilde Action", expand=True) + col.row().prop(self, "v3d_mmb_action", text="Middle Mouse Action", expand=True) + col.row().prop(self, "v3d_alt_mmb_drag_action", text="Alt Middle Mouse Drag Action", expand=True) + + # Check-boxes sub-layout. + col = layout.column() + sub = col.column(align=True) + sub.prop(self, "use_v3d_tab_menu") + sub.prop(self, "use_pie_click_drag") + sub.prop(self, "use_v3d_shade_ex_pie") + sub.prop(self, "use_alt_navigation") + + # File Browser settings. + col = layout.column() + col.label(text="File Browser") + col.row().prop(self, "use_file_single_click") + + +blender_default = bpy.utils.execfile(os.path.join(DIRNAME, "keymap_data", "blender_default.py")) + + +def load(): + from sys import platform + from bpy import context + from bl_keymap_utils.io import keyconfig_init_from_data + + prefs = context.preferences + kc = context.window_manager.keyconfigs.new(IDNAME) + kc_prefs = kc.preferences + + show_developer_ui = prefs.view.show_developer_ui + is_select_left = (kc_prefs.select_mouse == 'LEFT') + use_mouse_emulate_3_button = ( + prefs.inputs.use_mouse_emulate_3_button and + prefs.inputs.mouse_emulate_3_button_modifier == 'ALT' + ) + + keyconfig_data = blender_default.generate_keymaps( + blender_default.Params( + select_mouse=kc_prefs.select_mouse, + use_mouse_emulate_3_button=use_mouse_emulate_3_button, + spacebar_action=kc_prefs.spacebar_action, + use_key_activate_tools=(kc_prefs.tool_key_mode == 'TOOL'), + use_region_toggle_pie=(show_developer_ui and kc_prefs.use_region_toggle_pie), + v3d_tilde_action=kc_prefs.v3d_tilde_action, + use_v3d_mmb_pan=(kc_prefs.v3d_mmb_action == 'PAN'), + v3d_alt_mmb_drag_action=kc_prefs.v3d_alt_mmb_drag_action, + use_select_all_toggle=kc_prefs.use_select_all_toggle, + use_v3d_tab_menu=kc_prefs.use_v3d_tab_menu, + use_v3d_shade_ex_pie=kc_prefs.use_v3d_shade_ex_pie, + use_gizmo_drag=(is_select_left and kc_prefs.gizmo_action == 'DRAG'), + use_fallback_tool=True, + use_fallback_tool_select_handled=( + # LMB doesn't need additional selection fallback key-map items. + False if is_select_left else + # RMB is select and RMB must trigger the fallback tool. + # Otherwise LMB activates the fallback tool and RMB always tweak-selects. + (kc_prefs.rmb_action != 'FALLBACK_TOOL') + ), + use_alt_tool_or_cursor=( + (not use_mouse_emulate_3_button) and + (kc_prefs.use_alt_tool if is_select_left else kc_prefs.use_alt_cursor) + ), + use_alt_click_leader=kc_prefs.use_alt_click_leader, + use_pie_click_drag=kc_prefs.use_pie_click_drag, + use_file_single_click=kc_prefs.use_file_single_click, + use_alt_navigation=kc_prefs.use_alt_navigation, + ), + ) + + if platform == "darwin": + from bl_keymap_utils.platform_helpers import keyconfig_data_oskey_from_ctrl_for_macos + keyconfig_data = keyconfig_data_oskey_from_ctrl_for_macos(keyconfig_data) + + keyconfig_init_from_data(kc, keyconfig_data) + + +if __name__ == "__main__": + bpy.utils.register_class(Prefs) + load() diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/keyconfig/Blender_27x.py b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/keyconfig/Blender_27x.py new file mode 100644 index 0000000..2d3a5d9 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/keyconfig/Blender_27x.py @@ -0,0 +1,106 @@ +# SPDX-FileCopyrightText: 2018-2023 Blender Authors +# +# SPDX-License-Identifier: GPL-2.0-or-later + +# Notes on this key-map: +# +# This uses Blender's key-map, running with `legacy=True`. +# +# The intention of this key-map is to match Blender 2.7x which had many more key-map items available. +# +# There are some differences with the original Blender 2.7x key-map. +# There is no intention to change these are they are not considered significant +# enough to make a 1:1 match with the previous Blender version. +# +# These include: +# +# 3D View +# ======= +# +# - Border Render (`Shift-B` -> `Ctrl-B`) +# Both `Shift-B` and `Ctrl-B` were used. +# +# Time Line/Animation Views +# ========================= +# +# - Start Frame/End Frame (`S/E` -> `Ctrl-Home/Ctrl-End`) +# + +import os +import bpy +from bpy.props import ( + EnumProperty, +) + +DIRNAME, FILENAME = os.path.split(__file__) +IDNAME = os.path.splitext(FILENAME)[0] + + +def update_fn(_self, _context): + load() + + +class Prefs(bpy.types.KeyConfigPreferences): + bl_idname = IDNAME + + select_mouse: EnumProperty( + name="Select Mouse", + items=( + ('LEFT', "Left", + "Use left mouse button for selection. " + "The standard behavior that works well for mouse, trackpad and tablet devices"), + ('RIGHT', "Right", + "Use right mouse button for selection, and left mouse button for actions. " + "This works well primarily for keyboard and mouse devices"), + ), + description=( + "Mouse button used for selection" + ), + default='RIGHT', + update=update_fn, + ) + + def draw(self, layout): + layout.use_property_split = True + layout.use_property_decorate = False + + col = layout.column() + col.row().prop(self, "select_mouse", text="Select with Mouse Button", expand=True) + + +blender_default = bpy.utils.execfile(os.path.join(DIRNAME, "keymap_data", "blender_default.py")) + + +def load(): + from sys import platform + from bpy import context + from bl_keymap_utils.io import keyconfig_init_from_data + + prefs = context.preferences + kc = context.window_manager.keyconfigs.new(IDNAME) + kc_prefs = kc.preferences + + keyconfig_data = blender_default.generate_keymaps( + blender_default.Params( + select_mouse=kc_prefs.select_mouse, + use_mouse_emulate_3_button=( + prefs.inputs.use_mouse_emulate_3_button and + prefs.inputs.mouse_emulate_3_button_modifier == 'ALT' + ), + spacebar_action='SEARCH', + use_select_all_toggle=True, + use_gizmo_drag=False, + legacy=True, + ), + ) + + if platform == "darwin": + from bl_keymap_utils.platform_helpers import keyconfig_data_oskey_from_ctrl_for_macos + keyconfig_data = keyconfig_data_oskey_from_ctrl_for_macos(keyconfig_data) + + keyconfig_init_from_data(kc, keyconfig_data) + + +if __name__ == "__main__": + bpy.utils.register_class(Prefs) + load() diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/keyconfig/Industry_Compatible.py b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/keyconfig/Industry_Compatible.py new file mode 100644 index 0000000..336754b --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/keyconfig/Industry_Compatible.py @@ -0,0 +1,41 @@ +# SPDX-FileCopyrightText: 2019-2023 Blender Authors +# +# SPDX-License-Identifier: GPL-2.0-or-later + +import os +import bpy + + +# ------------------------------------------------------------------------------ +# Keymap + +DIRNAME, FILENAME = os.path.split(__file__) +IDNAME = os.path.splitext(FILENAME)[0] + + +def update_fn(_self, _context): + load() + + +industry_compatible = bpy.utils.execfile(os.path.join(DIRNAME, "keymap_data", "industry_compatible_data.py")) + + +def load(): + from sys import platform + from bl_keymap_utils.io import keyconfig_init_from_data + + prefs = bpy.context.preferences + + kc = bpy.context.window_manager.keyconfigs.new(IDNAME) + params = industry_compatible.Params(use_mouse_emulate_3_button=prefs.inputs.use_mouse_emulate_3_button) + keyconfig_data = industry_compatible.generate_keymaps(params) + + if platform == "darwin": + from bl_keymap_utils.platform_helpers import keyconfig_data_oskey_from_ctrl_for_macos + keyconfig_data = keyconfig_data_oskey_from_ctrl_for_macos(keyconfig_data) + + keyconfig_init_from_data(kc, keyconfig_data) + + +if __name__ == "__main__": + load() diff --git a/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/keyconfig/fa_hotkeys.py b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/keyconfig/fa_hotkeys.py new file mode 100644 index 0000000..7789fe7 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/portable/scripts/presets/keyconfig/fa_hotkeys.py @@ -0,0 +1,5509 @@ +keyconfig_version = (5, 0, 120) +keyconfig_data = \ +[("3D View", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": + [("view3d.cursor3d", {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None), + ("transform.translate", + {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG', "shift": True}, + {"properties": + [("cursor_transform", True), + ("release_confirm", True), + ], + "active":False, + }, + ), + ("view3d.localview", {"type": 'NUMPAD_SLASH', "value": 'PRESS', "repeat": True}, None), + ("view3d.localview", {"type": 'E', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("view3d.localview_remove_from", {"type": 'M', "value": 'PRESS', "repeat": True}, None), + ("view3d.move", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "alt": True}, None), + ("view3d.zoom", {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True}, None), + ("view3d.dolly", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None), + ("view3d.view_selected", + {"type": 'F', "value": 'PRESS', "repeat": True}, + {"properties": + [("use_all_regions", True), + ], + }, + ), + ("view3d.view_selected", + {"type": 'F', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("use_all_regions", False), + ], + }, + ), + ("view3d.smoothview", {"type": 'TIMER1', "value": 'ANY', "any": True}, None), + ("view3d.move", {"type": 'TRACKPADPAN', "value": 'ANY', "shift": True}, None), + ("view3d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None), + ("view3d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None), + ("view3d.zoom", + {"type": 'NUMPAD_PLUS', "value": 'PRESS', "repeat": True}, + {"properties": + [("delta", 1), + ], + }, + ), + ("view3d.zoom", + {"type": 'NUMPAD_MINUS', "value": 'PRESS', "repeat": True}, + {"properties": + [("delta", -1), + ], + }, + ), + ("view3d.zoom", + {"type": 'EQUAL', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("delta", 1), + ], + }, + ), + ("view3d.zoom", + {"type": 'MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("delta", -1), + ], + }, + ), + ("view3d.zoom", + {"type": 'WHEELINMOUSE', "value": 'PRESS'}, + {"properties": + [("delta", 1), + ], + }, + ), + ("view3d.zoom", + {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, + {"properties": + [("delta", -1), + ], + }, + ), + ("view3d.dolly", + {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("delta", 1), + ], + }, + ), + ("view3d.dolly", + {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("delta", -1), + ], + }, + ), + ("view3d.dolly", + {"type": 'EQUAL', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("delta", 1), + ], + }, + ), + ("view3d.dolly", + {"type": 'MINUS', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("delta", -1), + ], + }, + ), + ("view3d.view_center_camera", {"type": 'HOME', "value": 'PRESS', "repeat": True}, None), + ("view3d.view_center_lock", {"type": 'HOME', "value": 'PRESS', "repeat": True}, None), + ("view3d.view_all", + {"type": 'HOME', "value": 'PRESS', "repeat": True}, + {"properties": + [("center", False), + ], + }, + ), + ("view3d.view_all", + {"type": 'HOME', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("use_all_regions", True), + ("center", False), + ], + }, + ), + ("view3d.view_all", + {"type": 'C', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("center", True), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'ACCENT_GRAVE', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_view_pie'), + ], + }, + ), + ("view3d.navigate", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("view3d.view_camera", {"type": 'NUMPAD_0', "value": 'PRESS', "repeat": True}, None), + ("view3d.view_axis", + {"type": 'NUMPAD_1', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'FRONT'), + ], + }, + ), + ("view3d.view_orbit", + {"type": 'NUMPAD_2', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'ORBITDOWN'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_3', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'RIGHT'), + ], + }, + ), + ("view3d.view_orbit", + {"type": 'NUMPAD_4', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'ORBITLEFT'), + ], + }, + ), + ("view3d.view_persportho", {"type": 'NUMPAD_5', "value": 'PRESS', "repeat": True}, None), + ("view3d.view_orbit", + {"type": 'NUMPAD_6', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'ORBITRIGHT'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_7', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'TOP'), + ], + }, + ), + ("view3d.view_orbit", + {"type": 'NUMPAD_8', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'ORBITUP'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_1', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("type", 'BACK'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_3', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("type", 'LEFT'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_7', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("type", 'BOTTOM'), + ], + }, + ), + ("view3d.view_pan", + {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("type", 'PANDOWN'), + ], + }, + ), + ("view3d.view_pan", + {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("type", 'PANLEFT'), + ], + }, + ), + ("view3d.view_pan", + {"type": 'NUMPAD_6', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("type", 'PANRIGHT'), + ], + }, + ), + ("view3d.view_pan", + {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("type", 'PANUP'), + ], + }, + ), + ("view3d.view_roll", + {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("type", 'LEFT'), + ], + }, + ), + ("view3d.view_roll", + {"type": 'NUMPAD_6', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("type", 'RIGHT'), + ], + }, + ), + ("view3d.view_orbit", + {"type": 'NUMPAD_9', "value": 'PRESS', "repeat": True}, + {"properties": + [("angle", 3.1415927), + ("type", 'ORBITRIGHT'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_1', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("type", 'FRONT'), + ("align_active", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_3', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("type", 'RIGHT'), + ("align_active", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_7', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("type", 'TOP'), + ("align_active", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_1', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("type", 'BACK'), + ("align_active", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_3', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("type", 'LEFT'), + ("align_active", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NUMPAD_7', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("type", 'BOTTOM'), + ("align_active", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "alt": True, "direction": 'NORTH'}, + {"properties": + [("type", 'TOP'), + ("relative", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "alt": True, "direction": 'SOUTH'}, + {"properties": + [("type", 'BOTTOM'), + ("relative", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "alt": True, "direction": 'EAST'}, + {"properties": + [("type", 'RIGHT'), + ("relative", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "alt": True, "direction": 'WEST'}, + {"properties": + [("type", 'LEFT'), + ("relative", True), + ], + }, + ), + ("view3d.view_center_pick", {"type": 'MIDDLEMOUSE', "value": 'CLICK', "alt": True}, None), + ("view3d.ndof_orbit_zoom", {"type": 'NDOF_MOTION', "value": 'ANY'}, None), + ("view3d.ndof_orbit", {"type": 'NDOF_MOTION', "value": 'ANY', "ctrl": True}, None), + ("view3d.ndof_pan", {"type": 'NDOF_MOTION', "value": 'ANY', "shift": True}, None), + ("view3d.ndof_all", {"type": 'NDOF_MOTION', "value": 'ANY', "shift": True, "ctrl": True}, None), + ("view3d.view_roll", + {"type": 'NDOF_BUTTON_ROLL_CCW', "value": 'PRESS'}, + {"properties": + [("type", 'LEFT'), + ], + }, + ), + ("view3d.view_roll", + {"type": 'NDOF_BUTTON_ROLL_CCW', "value": 'PRESS'}, + {"properties": + [("type", 'RIGHT'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NDOF_BUTTON_FRONT', "value": 'PRESS'}, + {"properties": + [("type", 'FRONT'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NDOF_BUTTON_BACK', "value": 'PRESS'}, + {"properties": + [("type", 'BACK'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NDOF_BUTTON_LEFT', "value": 'PRESS'}, + {"properties": + [("type", 'LEFT'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NDOF_BUTTON_RIGHT', "value": 'PRESS'}, + {"properties": + [("type", 'RIGHT'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NDOF_BUTTON_TOP', "value": 'PRESS'}, + {"properties": + [("type", 'TOP'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NDOF_BUTTON_BOTTOM', "value": 'PRESS'}, + {"properties": + [("type", 'BOTTOM'), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NDOF_BUTTON_FRONT', "value": 'PRESS', "shift": True}, + {"properties": + [("type", 'FRONT'), + ("align_active", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NDOF_BUTTON_RIGHT', "value": 'PRESS', "shift": True}, + {"properties": + [("type", 'RIGHT'), + ("align_active", True), + ], + }, + ), + ("view3d.view_axis", + {"type": 'NDOF_BUTTON_TOP', "value": 'PRESS', "shift": True}, + {"properties": + [("type", 'TOP'), + ("align_active", True), + ], + }, + ), + ("view3d.select", + {"type": 'LEFTMOUSE', "value": 'CLICK'}, + {"properties": + [("deselect_all", True), + ], + }, + ), + ("view3d.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True}, + {"properties": + [("toggle", True), + ], + }, + ), + ("view3d.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, + {"properties": + [("center", True), + ("object", True), + ], + }, + ), + ("view3d.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "alt": True}, + {"properties": + [("enumerate", True), + ], + "active":False, + }, + ), + ("view3d.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True}, + {"properties": + [("extend", True), + ("toggle", True), + ("center", True), + ], + }, + ), + ("view3d.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True, "alt": True}, + {"properties": + [("center", True), + ("enumerate", True), + ], + }, + ), + ("view3d.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "alt": True}, + {"properties": + [("toggle", True), + ("enumerate", True), + ], + }, + ), + ("view3d.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True, "alt": True}, + {"properties": + [("toggle", True), + ("center", True), + ("enumerate", True), + ], + }, + ), + ("view3d.select_box", {"type": 'B', "value": 'PRESS', "repeat": True}, None), + ("view3d.select_lasso", + {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("view3d.select_lasso", + {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("view3d.select_circle", {"type": 'C', "value": 'PRESS', "repeat": True}, None), + ("view3d.zoom_border", {"type": 'B', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("view3d.render_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("view3d.clear_render_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, None), + ("view3d.camera_to_view", {"type": 'NUMPAD_0', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, None), + ("view3d.object_as_camera", {"type": 'NUMPAD_0', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("view3d.copybuffer", {"type": 'C', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("view3d.pastebuffer", {"type": 'V', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.call_menu_pie", + {"type": 'S', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_snap_pie'), + ], + }, + ), + ("transform.translate", + {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, + { "active":False, + }, + ), + ("transform.rotate", + {"type": 'R', "value": 'PRESS', "repeat": True}, + { "active":False, + }, + ), + ("transform.resize", + {"type": 'S', "value": 'PRESS', "repeat": True}, + { "active":False, + }, + ), + ("transform.bend", {"type": 'W', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("transform.tosphere", {"type": 'S', "value": 'PRESS', "shift": True, "alt": True, "repeat": True}, None), + ("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True, "repeat": True}, None), + ("transform.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.context_toggle", + {"type": 'TAB', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("data_path", 'tool_settings.use_snap'), + ], + }, + ), + ("wm.call_panel", + {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_PT_snapping'), + ("keep_open", False), + ], + }, + ), + ("object.transform_axis_target", {"type": 'T', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("transform.skin_resize", {"type": 'A', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.context_toggle", + {"type": 'ACCENT_GRAVE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("data_path", 'space_data.show_gizmo_tool'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'PERIOD', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_pivot_pie'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'COMMA', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_orientations_pie'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'ACCENT_GRAVE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("data_path", 'space_data.show_gizmo_tool'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'Z', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_shading_pie'), + ], + }, + ), + ("view3d.toggle_shading", + {"type": 'Z', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("type", 'WIREFRAME'), + ], + }, + ), + ("view3d.toggle_xray", {"type": 'Z', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("wm.context_toggle", + {"type": 'Z', "value": 'PRESS', "shift": True, "alt": True, "repeat": True}, + {"properties": + [("data_path", 'space_data.overlay.show_overlays'), + ], + }, + ), + ("wm.tool_set_by_name", + {"type": 'W', "value": 'PRESS', "repeat": True}, + { "active":False, + }, + ), + ("wm.call_menu_pie", + {"type": 'RIGHTMOUSE', "value": 'PRESS'}, + {"properties": + [("name", 'MCP_MT_MarkingMenu'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'SPACE', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'MCP_MT_QuadMenu'), + ], + }, + ), + ("view3d.rotate", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, None), + ("wm.call_menu_pie", + {"type": 'T', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("name", 'MCP_MT_TabSwitcher'), + ], + }, + ), + ("view3d.zoom", + {"type": 'WHEELINMOUSE', "value": 'PRESS', "alt": True}, + {"properties": + [("delta", 1), + ], + }, + ), + ("view3d.zoom", + {"type": 'WHEELOUTMOUSE', "value": 'PRESS', "alt": True}, + {"properties": + [("delta", -1), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'MCP_MT_AnimationMenu'), + ], + }, + ), + ("view3d.modal_operator_raycast", {"type": 'MIDDLEMOUSE', "value": 'RELEASE'}, None), + ("anim.keyframe_insert_by_name", + {"type": 'W', "value": 'PRESS', "shift": True}, + {"properties": + [("type", 'Location'), + ], + }, + ), + ("anim.keyframe_insert_by_name", + {"type": 'E', "value": 'PRESS', "shift": True}, + {"properties": + [("type", 'Rotation'), + ], + }, + ), + ("anim.keyframe_insert_by_name", + {"type": 'R', "value": 'PRESS', "shift": True}, + {"properties": + [("type", 'Scaling'), + ], + }, + ), + ], + }, + ), + ("3D View Tool: Edit Mesh, Knife", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": + [("mesh.knife_tool", + {"type": 'LEFTMOUSE', "value": 'PRESS'}, + {"properties": + [("use_occlude_geometry", True), + ("wait_for_input", True), + ], + }, + ), + ], + }, + ), + ("3D View Tool: Move", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": + [("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("ymax", 0), + ("wait_for_input", True), + ], + }, + ), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'XOR'), + ], + }, + ), + ], + }, + ), + ("3D View Tool: Rotate", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": + [("view3d.select_box", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'XOR'), + ], + }, + ), + ], + }, + ), + ("3D View Tool: Scale", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": + [("view3d.select_box", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'XOR'), + ], + }, + ), + ], + }, + ), + ("3D View Tool: Select Box", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": + [("view3d.select_box", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("view3d.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'XOR'), + ], + }, + ), + ], + }, + ), + ("Armature", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("armature.hide", + {"type": 'H', "value": 'PRESS', "repeat": True}, + {"properties": + [("unselected", False), + ], + }, + ), + ("armature.hide", + {"type": 'H', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("unselected", True), + ], + }, + ), + ("armature.reveal", {"type": 'H', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("armature.align", {"type": 'A', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, None), + ("armature.calculate_roll", {"type": 'N', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("armature.roll_clear", {"type": 'R', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("armature.switch_direction", {"type": 'F', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("armature.bone_primitive_add", {"type": 'A', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("armature.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("armature.parent_clear", {"type": 'P', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("armature.select_all", + {"type": 'A', "value": 'PRESS', "repeat": True}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("armature.select_all", + {"type": 'A', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("armature.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("armature.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("armature.select_mirror", + {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("extend", False), + ], + }, + ), + ("armature.select_hierarchy", + {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'PARENT'), + ("extend", False), + ], + }, + ), + ("armature.select_hierarchy", + {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'PARENT'), + ("extend", True), + ], + }, + ), + ("armature.select_hierarchy", + {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'CHILD'), + ("extend", False), + ], + }, + ), + ("armature.select_hierarchy", + {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'CHILD'), + ("extend", True), + ], + }, + ), + ("armature.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("armature.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("armature.select_similar", {"type": 'G', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("armature.select_linked", {"type": 'L', "value": 'PRESS', "repeat": True}, None), + ("armature.select_linked", {"type": 'L', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("armature.shortest_path_pick", {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("wm.call_menu", + {"type": 'X', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_armature_delete'), + ], + }, + ), + ("wm.call_menu", + {"type": 'DEL', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_armature_delete'), + ], + }, + ), + ("armature.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("armature.dissolve", {"type": 'X', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("armature.dissolve", {"type": 'DEL', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("armature.extrude_move", {"type": 'E', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("armature.extrude_forked", {"type": 'E', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("armature.click_extrude", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, None), + ("armature.fill", {"type": 'F', "value": 'PRESS', "repeat": True}, None), + ("armature.merge", {"type": 'M', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("armature.split", {"type": 'Y', "value": 'PRESS', "repeat": True}, None), + ("armature.separate", {"type": 'P', "value": 'PRESS', "repeat": True}, None), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_bone_options_toggle'), + ], + }, + ), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_bone_options_enable'), + ], + }, + ), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_bone_options_disable'), + ], + }, + ), + ("armature.layers_show_all", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("armature.armature_layers", {"type": 'M', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("armature.bone_layers", {"type": 'M', "value": 'PRESS', "repeat": True}, None), + ("transform.transform", + {"type": 'S', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, + {"properties": + [("mode", 'BONE_SIZE'), + ], + }, + ), + ("transform.transform", + {"type": 'S', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("mode", 'BONE_ENVELOPE'), + ], + }, + ), + ("transform.transform", + {"type": 'R', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("mode", 'BONE_ROLL'), + ], + }, + ), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_armature_context_menu'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'E', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.rotate'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.move'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'R', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.scale'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'Q', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.select_box'), + ], + }, + ), + ], + }, + ), + ("Curve", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("wm.call_menu", + {"type": 'A', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'TOPBAR_MT_edit_curve_add'), + ], + }, + ), + ("curve.handle_type_set", {"type": 'V', "value": 'PRESS', "repeat": True}, None), + ("curve.vertex_add", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, None), + ("curve.select_all", + {"type": 'A', "value": 'PRESS', "repeat": True}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("curve.select_all", + {"type": 'A', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("curve.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("curve.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("curve.select_row", {"type": 'R', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("curve.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("curve.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("curve.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("curve.select_similar", {"type": 'G', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("curve.select_linked_pick", + {"type": 'L', "value": 'PRESS', "repeat": True}, + {"properties": + [("deselect", False), + ], + }, + ), + ("curve.select_linked_pick", + {"type": 'L', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("deselect", True), + ], + }, + ), + ("curve.shortest_path_pick", {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("curve.separate", {"type": 'P', "value": 'PRESS', "repeat": True}, None), + ("curve.split", {"type": 'Y', "value": 'PRESS', "repeat": True}, None), + ("curve.extrude_move", {"type": 'E', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("curve.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("curve.make_segment", + {"type": 'F', "value": 'PRESS', "repeat": True}, + { "active":False, + }, + ), + ("curve.cyclic_toggle", {"type": 'C', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'X', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_curve_delete'), + ], + }, + ), + ("wm.call_menu", + {"type": 'DEL', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_curve_delete'), + ], + }, + ), + ("curve.dissolve_verts", {"type": 'X', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("curve.dissolve_verts", {"type": 'DEL', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("curve.tilt_clear", {"type": 'T', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("transform.tilt", {"type": 'T', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("transform.transform", + {"type": 'S', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("mode", 'CURVE_SHRINKFATTEN'), + ], + }, + ), + ("curve.reveal", {"type": 'H', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("curve.hide", + {"type": 'H', "value": 'PRESS', "repeat": True}, + {"properties": + [("unselected", False), + ], + }, + ), + ("curve.hide", + {"type": 'H', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("unselected", True), + ], + }, + ), + ("curve.normals_make_consistent", {"type": 'N', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("object.vertex_parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'H', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_hook'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'O', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_proportional_editing_falloff_pie'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'O', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'tool_settings.use_proportional_edit'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'O', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("data_path", 'tool_settings.use_proportional_connected'), + ], + }, + ), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_curve_context_menu'), + ], + }, + ), + ("wm.call_menu", + {"type": 'APP', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_curve_context_menu'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.move'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'Q', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.select_box'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'E', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.rotate'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'R', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.scale'), + ], + }, + ), + ], + }, + ), + ("Dopesheet", + {"space_type": 'DOPESHEET_EDITOR', "region_type": 'WINDOW'}, + {"items": + [("action.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS'}, + {"properties": + [("extend", False), + ("deselect_all", True), + ("column", False), + ("channel", False), + ], + }, + ), + ("action.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, + {"properties": + [("extend", False), + ("column", True), + ("channel", False), + ], + }, + ), + ("action.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": + [("extend", True), + ("column", False), + ("channel", False), + ], + }, + ), + ("action.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": + [("extend", True), + ("column", True), + ("channel", False), + ], + }, + ), + ("action.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True}, + {"properties": + [("extend", False), + ("column", False), + ("channel", True), + ], + }, + ), + ("action.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, + {"properties": + [("extend", True), + ("column", False), + ("channel", True), + ], + }, + ), + ("action.select_leftright", + {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, + {"properties": + [("mode", 'CHECK'), + ("extend", False), + ], + }, + ), + ("action.select_leftright", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'CHECK'), + ("extend", True), + ], + }, + ), + ("action.select_leftright", + {"type": 'LEFT_BRACKET', "value": 'PRESS'}, + {"properties": + [("mode", 'LEFT'), + ("extend", False), + ], + }, + ), + ("action.select_leftright", + {"type": 'RIGHT_BRACKET', "value": 'PRESS'}, + {"properties": + [("mode", 'RIGHT'), + ("extend", False), + ], + }, + ), + ("action.select_all", + {"type": 'A', "value": 'PRESS'}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("action.select_all", + {"type": 'A', "value": 'PRESS', "alt": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("action.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("action.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("action.select_box", + {"type": 'B', "value": 'PRESS'}, + {"properties": + [("axis_range", False), + ], + }, + ), + ("action.select_box", + {"type": 'B', "value": 'PRESS', "alt": True}, + {"properties": + [("axis_range", True), + ], + }, + ), + ("action.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("mode", 'SET'), + ("tweak", True), + ], + }, + ), + ("action.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, + {"properties": + [("mode", 'ADD'), + ("tweak", True), + ], + }, + ), + ("action.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("mode", 'SUB'), + ("tweak", True), + ], + }, + ), + ("action.select_lasso", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("action.select_lasso", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("action.select_circle", {"type": 'C', "value": 'PRESS'}, None), + ("action.select_column", + {"type": 'K', "value": 'PRESS'}, + {"properties": + [("mode", 'KEYS'), + ], + }, + ), + ("action.select_column", + {"type": 'K', "value": 'PRESS', "ctrl": True}, + {"properties": + [("mode", 'CFRA'), + ], + }, + ), + ("action.select_column", + {"type": 'K', "value": 'PRESS', "shift": True}, + {"properties": + [("mode", 'MARKERS_COLUMN'), + ], + }, + ), + ("action.select_column", + {"type": 'K', "value": 'PRESS', "alt": True}, + {"properties": + [("mode", 'MARKERS_BETWEEN'), + ], + }, + ), + ("action.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("action.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("action.select_linked", {"type": 'L', "value": 'PRESS'}, None), + ("action.frame_jump", {"type": 'G', "value": 'PRESS', "ctrl": True}, None), + ("wm.call_menu_pie", + {"type": 'S', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'DOPESHEET_MT_snap_pie'), + ], + }, + ), + ("action.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None), + ("action.handle_type", {"type": 'V', "value": 'PRESS'}, None), + ("action.interpolation_type", {"type": 'T', "value": 'PRESS'}, None), + ("action.extrapolation_type", {"type": 'E', "value": 'PRESS', "shift": True}, None), + ("action.easing_type", {"type": 'E', "value": 'PRESS', "ctrl": True}, None), + ("action.keyframe_type", {"type": 'R', "value": 'PRESS'}, None), + ("action.sample", {"type": 'O', "value": 'PRESS', "shift": True, "alt": True}, None), + ("wm.call_menu", + {"type": 'X', "value": 'PRESS'}, + {"properties": + [("name", 'DOPESHEET_MT_delete'), + ], + }, + ), + ("action.delete", + {"type": 'DEL', "value": 'PRESS'}, + {"properties": + [("confirm", False), + ], + }, + ), + ("action.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None), + ("action.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None), + ("action.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), + ("action.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), + ("action.paste", + {"type": 'V', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": + [("flipped", True), + ], + }, + ), + ("action.previewrange_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None), + ("action.view_all", {"type": 'HOME', "value": 'PRESS'}, None), + ("action.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None), + ("action.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None), + ("action.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None), + ("wm.call_menu_pie", + {"type": 'ACCENT_GRAVE', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'DOPESHEET_MT_view_pie'), + ], + }, + ), + ("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None), + ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None), + ("transform.transform", + {"type": 'G', "value": 'PRESS'}, + {"properties": + [("mode", 'TIME_TRANSLATE'), + ], + }, + ), + ("transform.transform", + {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("mode", 'TIME_TRANSLATE'), + ], + }, + ), + ("transform.transform", + {"type": 'E', "value": 'PRESS'}, + {"properties": + [("mode", 'TIME_EXTEND'), + ], + }, + ), + ("transform.transform", + {"type": 'S', "value": 'PRESS'}, + {"properties": + [("mode", 'TIME_SCALE'), + ], + }, + ), + ("transform.transform", + {"type": 'T', "value": 'PRESS', "shift": True}, + {"properties": + [("mode", 'TIME_SLIDE'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'O', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'VIEW3D_MT_proportional_editing_falloff_pie'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'O', "value": 'PRESS'}, + {"properties": + [("data_path", 'tool_settings.use_proportional_action'), + ], + }, + ), + ("marker.add", {"type": 'M', "value": 'PRESS'}, None), + ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None), + ("marker.camera_bind", {"type": 'B', "value": 'PRESS', "ctrl": True}, None), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS'}, + {"properties": + [("name", 'DOPESHEET_MT_context_menu'), + ], + }, + ), + ("wm.call_menu", + {"type": 'APP', "value": 'PRESS'}, + {"properties": + [("name", 'DOPESHEET_MT_context_menu'), + ], + }, + ), + ("anim.change_frame", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None), + ("action.duplicate_move", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None), + ("action.keymove", + {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, + { "active":False, + }, + ), + ], + }, + ), + ("Frames", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("screen.frame_offset", + {"type": 'LEFT_ARROW', "value": 'PRESS', "repeat": True}, + {"properties": + [("delta", -1), + ], + }, + ), + ("screen.frame_offset", + {"type": 'RIGHT_ARROW', "value": 'PRESS', "repeat": True}, + {"properties": + [("delta", 1), + ], + }, + ), + ("screen.frame_jump", + {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("end", True), + ], + }, + ), + ("screen.frame_jump", + {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("end", False), + ], + }, + ), + ("screen.keyframe_jump", + {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, + {"properties": + [("next", True), + ], + }, + ), + ("screen.keyframe_jump", + {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, + {"properties": + [("next", False), + ], + }, + ), + ("screen.keyframe_jump", + {"type": 'MEDIA_LAST', "value": 'PRESS', "repeat": True}, + {"properties": + [("next", True), + ], + }, + ), + ("screen.keyframe_jump", + {"type": 'MEDIA_FIRST', "value": 'PRESS', "repeat": True}, + {"properties": + [("next", False), + ], + }, + ), + ("screen.animation_play", {"type": 'V', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("screen.animation_play", + {"type": 'SPACE', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("reverse", True), + ], + }, + ), + ("screen.animation_cancel", {"type": 'ESC', "value": 'PRESS', "repeat": True}, None), + ("screen.animation_play", {"type": 'MEDIA_PLAY', "value": 'PRESS', "repeat": True}, None), + ("screen.animation_cancel", {"type": 'MEDIA_STOP', "value": 'PRESS', "repeat": True}, None), + ], + }, + ), + ("Graph Editor", + {"space_type": 'GRAPH_EDITOR', "region_type": 'WINDOW'}, + {"items": + [("wm.context_toggle", + {"type": 'H', "value": 'PRESS', "ctrl": True}, + {"properties": + [("data_path", 'space_data.show_handles'), + ], + }, + ), + ("graph.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS'}, + {"properties": + [("extend", False), + ("deselect_all", True), + ("column", False), + ("curves", False), + ], + }, + ), + ("graph.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, + {"properties": + [("extend", False), + ("column", True), + ("curves", False), + ], + }, + ), + ("graph.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": + [("extend", True), + ("column", False), + ("curves", False), + ], + }, + ), + ("graph.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": + [("extend", True), + ("column", True), + ("curves", False), + ], + }, + ), + ("graph.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True}, + {"properties": + [("extend", False), + ("column", False), + ("curves", True), + ], + }, + ), + ("graph.clickselect", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, + {"properties": + [("extend", True), + ("column", False), + ("curves", True), + ], + }, + ), + ("graph.select_leftright", + {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, + {"properties": + [("mode", 'CHECK'), + ("extend", False), + ], + }, + ), + ("graph.select_leftright", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'CHECK'), + ("extend", True), + ], + }, + ), + ("graph.select_leftright", + {"type": 'LEFT_BRACKET', "value": 'PRESS'}, + {"properties": + [("mode", 'LEFT'), + ("extend", False), + ], + }, + ), + ("graph.select_leftright", + {"type": 'RIGHT_BRACKET', "value": 'PRESS'}, + {"properties": + [("mode", 'RIGHT'), + ("extend", False), + ], + }, + ), + ("graph.select_all", + {"type": 'A', "value": 'PRESS'}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("graph.select_all", + {"type": 'A', "value": 'PRESS', "alt": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("graph.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("graph.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("graph.select_box", {"type": 'B', "value": 'PRESS'}, None), + ("graph.select_box", + {"type": 'B', "value": 'PRESS', "alt": True}, + {"properties": + [("axis_range", True), + ], + }, + ), + ("graph.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("axis_range", False), + ("tweak", True), + ("mode", 'SET'), + ], + }, + ), + ("graph.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, + {"properties": + [("tweak", True), + ("mode", 'ADD'), + ], + }, + ), + ("graph.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("tweak", True), + ("mode", 'SUB'), + ], + }, + ), + ("graph.select_lasso", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("graph.select_lasso", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("graph.select_circle", {"type": 'C', "value": 'PRESS'}, None), + ("graph.select_column", + {"type": 'K', "value": 'PRESS'}, + {"properties": + [("mode", 'KEYS'), + ], + }, + ), + ("graph.select_column", + {"type": 'K', "value": 'PRESS', "ctrl": True}, + {"properties": + [("mode", 'CFRA'), + ], + }, + ), + ("graph.select_column", + {"type": 'K', "value": 'PRESS', "shift": True}, + {"properties": + [("mode", 'MARKERS_COLUMN'), + ], + }, + ), + ("graph.select_column", + {"type": 'K', "value": 'PRESS', "alt": True}, + {"properties": + [("mode", 'MARKERS_BETWEEN'), + ], + }, + ), + ("graph.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("graph.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("graph.select_linked", {"type": 'L', "value": 'PRESS'}, None), + ("graph.frame_jump", {"type": 'G', "value": 'PRESS', "ctrl": True}, None), + ("wm.call_menu_pie", + {"type": 'S', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'GRAPH_MT_snap_pie'), + ], + }, + ), + ("graph.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None), + ("graph.handle_type", {"type": 'V', "value": 'PRESS'}, None), + ("graph.interpolation_type", {"type": 'T', "value": 'PRESS'}, None), + ("graph.easing_type", {"type": 'E', "value": 'PRESS', "ctrl": True}, None), + ("graph.smooth", {"type": 'O', "value": 'PRESS', "alt": True}, None), + ("graph.sample", {"type": 'O', "value": 'PRESS', "shift": True, "alt": True}, None), + ("graph.bake", {"type": 'C', "value": 'PRESS', "alt": True}, None), + ("wm.call_menu", + {"type": 'X', "value": 'PRESS'}, + {"properties": + [("name", 'GRAPH_MT_delete'), + ], + }, + ), + ("graph.delete", + {"type": 'DEL', "value": 'PRESS'}, + {"properties": + [("confirm", False), + ], + }, + ), + ("graph.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None), + ("graph.keyframe_insert", {"type": 'I', "value": 'PRESS', "alt": True}, None), + ("graph.click_insert", + {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, + {"properties": + [("extend", False), + ], + }, + ), + ("graph.click_insert", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True}, + {"properties": + [("extend", True), + ], + }, + ), + ("graph.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), + ("graph.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), + ("graph.paste", + {"type": 'V', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": + [("flipped", True), + ], + }, + ), + ("graph.previewrange_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None), + ("graph.view_all", {"type": 'HOME', "value": 'PRESS'}, None), + ("graph.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None), + ("graph.view_selected", {"type": 'F', "value": 'PRESS'}, None), + ("graph.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None), + ("wm.call_menu_pie", + {"type": 'ACCENT_GRAVE', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'GRAPH_MT_view_pie'), + ], + }, + ), + ("graph.fmodifier_add", + {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": + [("only_active", False), + ], + }, + ), + ("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None), + ("transform.translate", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG'}, None), + ("transform.transform", + {"type": 'W', "value": 'PRESS'}, + {"properties": + [("mode", 'TIME_EXTEND'), + ], + }, + ), + ("graph.keyframe_insert", {"type": 'S', "value": 'PRESS'}, None), + ("wm.call_menu_pie", + {"type": 'O', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'VIEW3D_MT_proportional_editing_falloff_pie'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'O', "value": 'PRESS'}, + {"properties": + [("data_path", 'tool_settings.use_proportional_fcurve'), + ], + }, + ), + ("marker.add", {"type": 'M', "value": 'PRESS'}, None), + ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None), + ("wm.call_menu", + {"type": 'RIGHTMOUSE', "value": 'PRESS'}, + {"properties": + [("name", 'GRAPH_MT_context_menu'), + ], + }, + ), + ("wm.call_menu", + {"type": 'APP', "value": 'PRESS'}, + {"properties": + [("name", 'GRAPH_MT_context_menu'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'PERIOD', "value": 'PRESS'}, + {"properties": + [("name", 'GRAPH_MT_pivot_pie'), + ], + }, + ), + ("graph.cursor_set", {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("graph.keyframe_insert", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "alt": True}, None), + ("anim.keyframe_insert_by_name", + {"type": 'E', "value": 'PRESS', "shift": True}, + {"properties": + [("type", 'Rotation'), + ], + }, + ), + ("anim.keyframe_insert_by_name", + {"type": 'W', "value": 'PRESS', "shift": True}, + {"properties": + [("type", 'Location'), + ], + }, + ), + ("anim.keyframe_insert_by_name", + {"type": 'R', "value": 'PRESS', "shift": True}, + {"properties": + [("type", 'Scaling'), + ], + }, + ), + ("transform.rotate", {"type": 'E', "value": 'PRESS'}, None), + ], + }, + ), + ("Grease Pencil Stroke Paint (Draw brush)", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, None), + ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True}, None), + ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("gpencil.draw", {"type": 'O', "value": 'PRESS'}, None), + ("gpencil.draw", {"type": 'J', "value": 'PRESS'}, None), + ("gpencil.draw", {"type": 'J', "value": 'PRESS', "alt": True}, None), + ("gpencil.draw", {"type": 'J', "value": 'PRESS', "shift": True}, None), + ("gpencil.draw", {"type": 'K', "value": 'PRESS'}, None), + ("gpencil.draw", {"type": 'K', "value": 'PRESS', "alt": True}, None), + ("gpencil.draw", {"type": 'K', "value": 'PRESS', "shift": True}, None), + ("gpencil.draw", {"type": 'L', "value": 'PRESS'}, None), + ("gpencil.draw", {"type": 'L', "value": 'PRESS', "alt": True}, None), + ("gpencil.draw", {"type": 'L', "value": 'PRESS', "ctrl": True}, None), + ("gpencil.draw", {"type": 'V', "value": 'PRESS'}, None), + ("gpencil.draw", {"type": 'M', "value": 'PRESS'}, None), + ("gpencil.draw", {"type": 'C', "value": 'PRESS'}, None), + ("gpencil.draw", {"type": 'C', "value": 'PRESS', "alt": True}, None), + ("gpencil.draw", {"type": 'ERASER', "value": 'PRESS'}, None), + ("gpencil.select_box", {"type": 'B', "value": 'PRESS'}, None), + ("gpencil.select_lasso", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True, "alt": True}, None), + ], + }, + ), + ("Image", + {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'}, + {"items": + [("image.view_all", {"type": 'HOME', "value": 'PRESS'}, None), + ("image.view_all", + {"type": 'HOME', "value": 'PRESS', "shift": True}, + {"properties": + [("fit_view", True), + ], + }, + ), + ("image.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None), + ("image.view_cursor_center", {"type": 'C', "value": 'PRESS', "shift": True}, None), + ("image.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "alt": True}, None), + ("image.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None), + ("image.view_pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None), + ("image.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None), + ("image.view_ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None), + ("image.view_zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS'}, None), + ("image.view_zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None), + ("image.view_zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "repeat": True}, None), + ("image.view_zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "repeat": True}, None), + ("image.view_zoom", {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True}, None), + ("image.view_zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None), + ("image.view_zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None), + ("image.view_zoom_border", {"type": 'B', "value": 'PRESS', "shift": True}, None), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True}, + {"properties": + [("ratio", 8.0), + ], + }, + ), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True}, + {"properties": + [("ratio", 4.0), + ], + }, + ), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True}, + {"properties": + [("ratio", 2.0), + ], + }, + ), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_8', "value": 'PRESS', "shift": True}, + {"properties": + [("ratio", 8.0), + ], + }, + ), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True}, + {"properties": + [("ratio", 4.0), + ], + }, + ), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_2', "value": 'PRESS', "shift": True}, + {"properties": + [("ratio", 2.0), + ], + }, + ), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_1', "value": 'PRESS'}, + {"properties": + [("ratio", 1.0), + ], + }, + ), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_2', "value": 'PRESS'}, + {"properties": + [("ratio", 0.5), + ], + }, + ), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_4', "value": 'PRESS'}, + {"properties": + [("ratio", 0.25), + ], + }, + ), + ("image.view_zoom_ratio", + {"type": 'NUMPAD_8', "value": 'PRESS'}, + {"properties": + [("ratio", 0.125), + ], + }, + ), + ("image.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("image.sample", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("image.curves_point_set", + {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("point", 'BLACK_POINT'), + ], + }, + ), + ("image.curves_point_set", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": + [("point", 'WHITE_POINT'), + ], + }, + ), + ("object.mode_set", + {"type": 'TAB', "value": 'PRESS'}, + {"properties": + [("mode", 'EDIT'), + ("toggle", True), + ], + }, + ), + ("wm.context_set_int", + {"type": 'ONE', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.image.render_slots.active_index'), + ("value", 0), + ], + }, + ), + ("wm.context_set_int", + {"type": 'TWO', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.image.render_slots.active_index'), + ("value", 1), + ], + }, + ), + ("wm.context_set_int", + {"type": 'THREE', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.image.render_slots.active_index'), + ("value", 2), + ], + }, + ), + ("wm.context_set_int", + {"type": 'FOUR', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.image.render_slots.active_index'), + ("value", 3), + ], + }, + ), + ("wm.context_set_int", + {"type": 'FIVE', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.image.render_slots.active_index'), + ("value", 4), + ], + }, + ), + ("wm.context_set_int", + {"type": 'SIX', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.image.render_slots.active_index'), + ("value", 5), + ], + }, + ), + ("wm.context_set_int", + {"type": 'SEVEN', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.image.render_slots.active_index'), + ("value", 6), + ], + }, + ), + ("wm.context_set_int", + {"type": 'EIGHT', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.image.render_slots.active_index'), + ("value", 7), + ], + }, + ), + ("wm.context_set_int", + {"type": 'NINE', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.image.render_slots.active_index'), + ("value", 8), + ], + }, + ), + ("image.render_border", {"type": 'B', "value": 'PRESS', "ctrl": True}, None), + ("image.clear_render_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True}, None), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS'}, + {"properties": + [("name", 'IMAGE_MT_mask_context_menu'), + ], + }, + ), + ("wm.call_menu", + {"type": 'APP', "value": 'PRESS'}, + {"properties": + [("name", 'IMAGE_MT_mask_context_menu'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'PERIOD', "value": 'PRESS'}, + {"properties": + [("name", 'IMAGE_MT_pivot_pie'), + ], + }, + ), + ("image.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None), + ], + }, + ), + ("Node Generic", + {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'}, + {"items": + [("wm.context_toggle", + {"type": 'T', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.show_region_toolbar'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'N', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.show_region_ui'), + ], + }, + ), + ], + }, + ), + ("Node Editor", + {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'}, + {"items": + [("node.select", + {"type": 'LEFTMOUSE', "value": 'CLICK'}, + {"properties": + [("select_passthrough", True), + ], + }, + ), + ("node.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, None), + ("node.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "alt": True}, None), + ("node.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True, "alt": True}, None), + ("node.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True}, + {"properties": + [("toggle", True), + ], + }, + ), + ("node.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True}, + {"properties": + [("toggle", True), + ], + }, + ), + ("node.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "alt": True}, + {"properties": + [("toggle", True), + ], + }, + ), + ("node.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True, "alt": True}, + {"properties": + [("toggle", True), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select_box'), + ("cycle", True), + ], + }, + ), + ("node.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("tweak", True), + ], + }, + ), + ("node.select_lasso", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True, "alt": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("node.select_lasso", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True, "alt": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("node.select_box", + {"type": 'B', "value": 'PRESS'}, + {"properties": + [("tweak", False), + ], + }, + ), + ("node.select_circle", {"type": 'C', "value": 'PRESS'}, None), + ("node.link", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("detach", False), + ], + }, + ), + ("node.link", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("detach", True), + ], + }, + ), + ("node.resize", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), + ("node.add_reroute", {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG', "shift": True}, None), + ("node.links_cut", {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, None), + ("node.links_mute", {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG', "ctrl": True, "alt": True}, None), + ("node.select_link_viewer", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None), + ("node.connect_to_output", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": + [("run_in_geometry_nodes", True), + ], + }, + ), + ("node.connect_to_output", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": + [("run_in_geometry_nodes", False), + ], + }, + ), + ("node.connect_to_output", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": + [("run_in_geometry_nodes", False), + ], + }, + ), + ("node.backimage_move", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "alt": True}, None), + ("node.backimage_zoom", + {"type": 'V', "value": 'PRESS', "repeat": True}, + {"properties": + [("factor", 0.8333333), + ], + }, + ), + ("node.backimage_zoom", + {"type": 'V', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("factor", 1.2), + ], + }, + ), + ("node.backimage_fit", {"type": 'HOME', "value": 'PRESS', "alt": True}, None), + ("node.backimage_sample", {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True}, None), + ("node.link_make", + {"type": 'J', "value": 'PRESS'}, + {"properties": + [("replace", False), + ], + }, + ), + ("node.link_make", + {"type": 'J', "value": 'PRESS', "shift": True}, + {"properties": + [("replace", True), + ], + }, + ), + ("node.join_nodes", {"type": 'J', "value": 'PRESS', "ctrl": True}, None), + ("wm.call_menu", + {"type": 'A', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'NODE_MT_add'), + ], + }, + ), + ("wm.call_menu", + {"type": 'S', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'NODE_MT_swap'), + ], + }, + ), + ("node.duplicate_move", + {"type": 'D', "value": 'PRESS', "shift": True}, + {"properties": + [("NODE_OT_translate_attach", + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + ), + ], + }, + ), + ("node.duplicate_move_linked", + {"type": 'D', "value": 'PRESS', "alt": True}, + {"properties": + [("NODE_OT_translate_attach", + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + ), + ], + }, + ), + ("node.duplicate_move_keep_inputs", + {"type": 'D', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": + [("NODE_OT_translate_attach", + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + ), + ], + }, + ), + ("node.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None), + ("node.detach", {"type": 'P', "value": 'PRESS', "alt": True}, None), + ("node.join_named", {"type": 'F', "value": 'PRESS'}, None), + ("node.hide_toggle", {"type": 'H', "value": 'PRESS'}, None), + ("node.mute_toggle", {"type": 'M', "value": 'PRESS'}, None), + ("node.preview_toggle", {"type": 'H', "value": 'PRESS', "shift": True}, None), + ("node.hide_socket_toggle", {"type": 'H', "value": 'PRESS', "ctrl": True}, None), + ("node.view_all", {"type": 'HOME', "value": 'PRESS'}, None), + ("node.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None), + ("node.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None), + ("wm.call_menu_pie", + {"type": 'ACCENT_GRAVE', "value": 'PRESS'}, + {"properties": + [("name", 'NODE_MT_view_pie'), + ], + }, + ), + ("node.delete", {"type": 'X', "value": 'PRESS'}, None), + ("node.delete", {"type": 'DEL', "value": 'PRESS'}, None), + ("node.delete_reconnect", {"type": 'X', "value": 'PRESS', "ctrl": True}, None), + ("node.delete_reconnect", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None), + ("node.select_all", + {"type": 'A', "value": 'PRESS'}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("node.select_all", + {"type": 'A', "value": 'PRESS', "alt": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("node.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("node.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("node.select_linked_to", {"type": 'L', "value": 'PRESS', "shift": True}, None), + ("node.select_linked_from", {"type": 'L', "value": 'PRESS'}, None), + ("node.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None), + ("node.select_grouped", + {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": + [("extend", True), + ], + }, + ), + ("node.select_same_type_step", + {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True}, + {"properties": + [("prev", False), + ], + }, + ), + ("node.select_same_type_step", + {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True}, + {"properties": + [("prev", True), + ], + }, + ), + ("node.find_node", {"type": 'F', "value": 'PRESS', "ctrl": True}, None), + ("node.group_make", {"type": 'G', "value": 'PRESS', "ctrl": True}, None), + ("node.group_ungroup", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None), + ("node.group_separate", {"type": 'P', "value": 'PRESS'}, None), + ("node.group_enter_exit", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None), + ("node.group_edit", + {"type": 'TAB', "value": 'PRESS'}, + {"properties": + [("exit", False), + ], + }, + ), + ("node.group_edit", + {"type": 'TAB', "value": 'PRESS', "ctrl": True}, + {"properties": + [("exit", True), + ], + }, + ), + ("node.read_viewlayers", {"type": 'R', "value": 'PRESS', "ctrl": True}, None), + ("node.render_changed", {"type": 'Z', "value": 'PRESS'}, None), + ("node.clipboard_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), + ("node.clipboard_paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), + ("node.translate_attach", + {"type": 'G', "value": 'PRESS'}, + {"properties": + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + }, + ), + ("node.translate_attach", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + }, + ), + ("transform.translate", + {"type": 'G', "value": 'PRESS'}, + {"properties": + [("view2d_edge_pan", True), + ], + }, + ), + ("transform.translate", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("view2d_edge_pan", True), + ("release_confirm", True), + ], + }, + ), + ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None), + ("transform.resize", {"type": 'S', "value": 'PRESS'}, None), + ("node.move_detach_links_release", + {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG', "alt": True}, + {"properties": + [("NODE_OT_translate_attach", + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + ), + ], + }, + ), + ("node.move_detach_links", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "alt": True}, + {"properties": + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + }, + ), + ("wm.context_toggle", + {"type": 'TAB', "value": 'PRESS', "shift": True}, + {"properties": + [("data_path", 'tool_settings.use_snap_node'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'Z', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": + [("data_path", 'space_data.overlay.show_overlays'), + ], + }, + ), + ("wm.call_menu", + {"type": 'RIGHTMOUSE', "value": 'PRESS'}, + {"properties": + [("name", 'NODE_MT_context_menu'), + ], + }, + ), + ("wm.call_menu", + {"type": 'APP', "value": 'PRESS'}, + {"properties": + [("name", 'NODE_MT_context_menu'), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'ONE', "value": 'PRESS'}, + {"properties": + [("viewer_index", 1), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'TWO', "value": 'PRESS'}, + {"properties": + [("viewer_index", 2), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'THREE', "value": 'PRESS'}, + {"properties": + [("viewer_index", 3), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'FOUR', "value": 'PRESS'}, + {"properties": + [("viewer_index", 4), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'FIVE', "value": 'PRESS'}, + {"properties": + [("viewer_index", 5), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'SIX', "value": 'PRESS'}, + {"properties": + [("viewer_index", 6), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'SEVEN', "value": 'PRESS'}, + {"properties": + [("viewer_index", 7), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'EIGHT', "value": 'PRESS'}, + {"properties": + [("viewer_index", 8), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'NINE', "value": 'PRESS'}, + {"properties": + [("viewer_index", 9), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'ONE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 1), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'TWO', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 2), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'THREE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 3), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'FOUR', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 4), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'FIVE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 5), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'SIX', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 6), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'SEVEN', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 7), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'EIGHT', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 8), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'NINE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 9), + ], + }, + ), + ], + }, + ), + + ("Knife Tool Modal Map", + {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True}, + {"items": + [("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True, "repeat": True}, None), + ("PANNING", {"type": 'LEFTMOUSE', "value": 'ANY', "alt": True}, None), + ("ADD_CUT_CLOSED", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "any": True}, None), + ("ADD_CUT", {"type": 'LEFTMOUSE', "value": 'ANY'}, None), + ("CANCEL", {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True, "oskey": True}, None), + ("CONFIRM", {"type": 'RET', "value": 'PRESS', "any": True, "repeat": True}, None), + ("CONFIRM", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "any": True, "repeat": True}, None), + ("CONFIRM", {"type": 'SPACE', "value": 'PRESS', "any": True, "repeat": True}, None), + ("NEW_CUT", {"type": 'E', "value": 'PRESS', "repeat": True}, None), + ("SNAP_MIDPOINTS_ON", {"type": 'LEFT_CTRL', "value": 'PRESS', "any": True, "repeat": True}, None), + ("SNAP_MIDPOINTS_OFF", {"type": 'LEFT_CTRL', "value": 'RELEASE', "any": True}, None), + ("SNAP_MIDPOINTS_ON", {"type": 'RIGHT_CTRL', "value": 'PRESS', "any": True, "repeat": True}, None), + ("SNAP_MIDPOINTS_OFF", {"type": 'RIGHT_CTRL', "value": 'RELEASE', "any": True}, None), + ("IGNORE_SNAP_ON", {"type": 'LEFT_SHIFT', "value": 'PRESS', "any": True, "repeat": True}, None), + ("IGNORE_SNAP_OFF", {"type": 'LEFTMOUSE', "value": 'ANY'}, None), + ("IGNORE_SNAP_ON", {"type": 'RIGHT_SHIFT', "value": 'PRESS', "any": True, "repeat": True}, None), + ("IGNORE_SNAP_OFF", {"type": 'RIGHT_SHIFT', "value": 'RELEASE', "any": True}, None), + ("ANGLE_SNAP_TOGGLE", {"type": 'C', "value": 'PRESS', "repeat": True}, None), + ("CUT_THROUGH_TOGGLE", {"type": 'Z', "value": 'PRESS', "repeat": True}, None), + ("PANNING", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "alt": True}, None), + ("PANNING", {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True}, None), + ], + }, + ), + ("Lattice", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("lattice.select_all", + {"type": 'A', "value": 'PRESS'}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("lattice.select_all", + {"type": 'A', "value": 'PRESS', "alt": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("lattice.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("lattice.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("lattice.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("lattice.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("object.vertex_parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None), + ("lattice.flip", {"type": 'F', "value": 'PRESS', "alt": True}, None), + ("wm.call_menu", + {"type": 'H', "value": 'PRESS', "ctrl": True}, + {"properties": + [("name", 'VIEW3D_MT_hook'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'O', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'VIEW3D_MT_proportional_editing_falloff_pie'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'O', "value": 'PRESS'}, + {"properties": + [("data_path", 'tool_settings.use_proportional_edit'), + ], + }, + ), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS'}, + {"properties": + [("name", 'VIEW3D_MT_edit_lattice_context_menu'), + ], + "active":False, + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.move'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'E', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.rotate'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'R', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.scale'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'Q', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.select_box'), + ], + }, + ), + ], + }, + ), + ("Mesh", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("mesh.loopcut_slide", + {"type": 'R', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("TRANSFORM_OT_edge_slide", + [("release_confirm", False), + ], + ), + ], + }, + ), + ("mesh.offset_edge_loops_slide", + {"type": 'R', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("TRANSFORM_OT_edge_slide", + [("release_confirm", False), + ], + ), + ], + }, + ), + ("mesh.inset", {"type": 'I', "value": 'PRESS', "repeat": True}, None), + ("mesh.bevel", {"type": 'B', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("mesh.bevel", {"type": 'B', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("object.toggle_subsurf1", {"type": 'ONE', "value": 'PRESS', "repeat": True}, None), + ("object.toggle_subsurf2", {"type": 'TWO', "value": 'PRESS', "repeat": True}, None), + ("object.toggle_subsurf3", {"type": 'THREE', "value": 'PRESS', "repeat": True}, None), + ("mesh.select_mode", + {"type": 'ONE', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("type", 'VERT'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'TWO', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("type", 'EDGE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'THREE', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("type", 'FACE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'ONE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("use_expand", True), + ("type", 'VERT'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'TWO', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("use_expand", True), + ("type", 'EDGE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'THREE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("use_expand", True), + ("type", 'FACE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'ONE', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("use_expand", True), + ("type", 'VERT'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'TWO', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("use_expand", True), + ("type", 'EDGE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'THREE', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("use_expand", True), + ("type", 'FACE'), + ], + }, + ), + ("mesh.loop_select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "alt": True}, + {"properties": + [("extend", False), + ("deselect", False), + ("toggle", False), + ], + "active":False, + }, + ), + ("mesh.loop_select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "alt": True}, + {"properties": + [("extend", False), + ("deselect", False), + ("toggle", True), + ], + }, + ), + ("mesh.edgering_select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True, "alt": True}, + {"properties": + [("extend", False), + ("deselect", False), + ("toggle", False), + ], + }, + ), + ("mesh.edgering_select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True, "alt": True}, + {"properties": + [("extend", False), + ("deselect", False), + ("toggle", True), + ], + }, + ), + ("mesh.shortest_path_pick", + {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, + {"properties": + [("use_fill", False), + ], + }, + ), + ("mesh.shortest_path_pick", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True}, + {"properties": + [("use_fill", True), + ], + }, + ), + ("mesh.select_all", + {"type": 'A', "value": 'PRESS', "repeat": True}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("mesh.select_all", + {"type": 'A', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("mesh.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("mesh.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("mesh.select_more", {"type": 'PERIOD', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("mesh.select_less", {"type": 'COMMA', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("mesh.select_next_item", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("mesh.select_prev_item", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("mesh.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("mesh.select_linked_pick", + {"type": 'L', "value": 'PRESS', "repeat": True}, + {"properties": + [("deselect", False), + ], + }, + ), + ("mesh.select_linked_pick", + {"type": 'L', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("deselect", True), + ], + }, + ), + ("mesh.select_mirror", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'G', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_mesh_select_similar'), + ], + }, + ), + ("mesh.hide", + {"type": 'H', "value": 'PRESS', "repeat": True}, + {"properties": + [("unselected", False), + ], + }, + ), + ("mesh.hide", + {"type": 'H', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("unselected", True), + ], + }, + ), + ("mesh.reveal", {"type": 'H', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("mesh.normals_make_consistent", + {"type": 'N', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("inside", False), + ], + }, + ), + ("mesh.normals_make_consistent", + {"type": 'N', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("inside", True), + ], + }, + ), + ("view3d.edit_mesh_extrude_move_normal", {"type": 'E', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'E', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_mesh_extrude'), + ], + "active":False, + }, + ), + ("transform.edge_crease", {"type": 'E', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("mesh.fill", {"type": 'F', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("mesh.quads_convert_to_tris", + {"type": 'T', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("quad_method", 'BEAUTY'), + ("ngon_method", 'BEAUTY'), + ], + }, + ), + ("mesh.quads_convert_to_tris", + {"type": 'T', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("quad_method", 'FIXED'), + ("ngon_method", 'CLIP'), + ], + }, + ), + ("mesh.tris_convert_to_quads", {"type": 'J', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("mesh.rip_move", + {"type": 'V', "value": 'PRESS', "repeat": True}, + {"properties": + [("MESH_OT_rip", + [("use_fill", False), + ], + ), + ], + }, + ), + ("mesh.rip_move", + {"type": 'V', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("MESH_OT_rip", + [("use_fill", True), + ], + ), + ], + }, + ), + ("mesh.rip_edge_move", {"type": 'D', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("mesh.merge", {"type": 'M', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("transform.shrink_fatten", {"type": 'S', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("mesh.edge_face_add", {"type": 'G', "value": 'PRESS', "repeat": True}, None), + ("mesh.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'A', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_mesh_add'), + ], + }, + ), + ("mesh.separate", {"type": 'P', "value": 'PRESS', "repeat": True}, None), + ("mesh.split", {"type": 'Y', "value": 'PRESS', "repeat": True}, None), + ("mesh.vert_connect_path", {"type": 'J', "value": 'PRESS', "repeat": True}, None), + ("mesh.point_normals", {"type": 'L', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("transform.vert_slide", {"type": 'V', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("mesh.dupli_extrude_cursor", + {"type": 'RIGHTMOUSE', "value": 'CLICK', "ctrl": True}, + {"properties": + [("rotate_source", True), + ], + }, + ), + ("mesh.dupli_extrude_cursor", + {"type": 'RIGHTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True}, + {"properties": + [("rotate_source", False), + ], + }, + ), + ("edit.delete_without_confirm", {"type": 'X', "value": 'PRESS', "repeat": True}, None), + ("mesh.dissolve_mode", {"type": 'X', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("mesh.dissolve_mode", {"type": 'DEL', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("mesh.knife_tool", + {"type": 'K', "value": 'PRESS', "repeat": True}, + {"properties": + [("use_occlude_geometry", True), + ("only_selected", False), + ], + }, + ), + ("object.vertex_parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_mesh_specials'), + ], + "active":False, + }, + ), + ("wm.call_menu", + {"type": 'F', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_mesh_faces'), + ], + }, + ), + ("wm.call_menu", + {"type": 'E', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_mesh_edges'), + ], + }, + ), + ("wm.call_menu", + {"type": 'V', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_mesh_vertices'), + ], + }, + ), + ("wm.call_menu", + {"type": 'H', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_hook'), + ], + }, + ), + ("wm.call_menu", + {"type": 'U', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_uv_map'), + ], + }, + ), + ("wm.call_menu", + {"type": 'G', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_vertex_group'), + ], + }, + ), + ("object.vertex_group_remove_from", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, None), + ("wm.call_menu_pie", + {"type": 'O', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_proportional_editing_falloff_pie'), + ], + }, + ), + ("wm.context_toggle_enum", + {"type": 'O', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'tool_settings.proportional_edit'), + ("value_1", 'DISABLED'), + ("value_2", 'ENABLED'), + ], + }, + ), + ("wm.context_toggle_enum", + {"type": 'O', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("data_path", 'tool_settings.proportional_edit'), + ("value_1", 'DISABLED'), + ("value_2", 'CONNECTED'), + ], + }, + ), + ("mesh.loop_select", + {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, + {"properties": + [("extend", False), + ("deselect", False), + ("toggle", False), + ], + }, + ), + ("mesh.loop_select", + {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "shift": True}, + {"properties": + [("extend", True), + ("deselect", False), + ("toggle", False), + ], + }, + ), + ("mesh.loop_select", + {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "alt": True}, + {"properties": + [("extend", False), + ("deselect", True), + ("toggle", False), + ], + }, + ), + ("wm.tool_set_by_name", {"type": 'Q', "value": 'PRESS', "repeat": True}, None), + ("wm.tool_set_by_id", + {"type": 'Q', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.select_box'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.move'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'E', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.rotate'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'R', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.scale'), + ], + }, + ), + ("wm.call_menu", + {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'SPECIAL_MT_Menu'), + ], + }, + ), + ("wm.call_menu", + {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_mesh_context_menu'), + ], + }, + ), + ("object.extrudeaxis", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "ctrl": True}, None), + ("object.swapmode", + {"type": 'MIDDLEMOUSE', "value": 'DOUBLE_CLICK'}, + { "active":False, + }, + ), + ("object.swapmode", + {"type": 'MIDDLEMOUSE', "value": 'DOUBLE_CLICK'}, + { "active":False, + }, + ), + ("object.swapmode", + {"type": 'MIDDLEMOUSE', "value": 'DOUBLE_CLICK'}, + { "active":False, + }, + ), + ("object.swapmode", + {"type": 'MIDDLEMOUSE', "value": 'DOUBLE_CLICK'}, + { "active":False, + }, + ), + ("object.swapmode", + {"type": 'MIDDLEMOUSE', "value": 'DOUBLE_CLICK'}, + { "active":False, + }, + ), + ("wm.call_menu", + {"type": 'DEL', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_edit_mesh_delete'), + ], + }, + ), + ], + }, + ), + ("Object Mode", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("wm.call_menu_pie", + {"type": 'O', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_proportional_editing_falloff_pie'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'O', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'tool_settings.use_proportional_edit_objects'), + ], + }, + ), + ("object.select_all", + {"type": 'A', "value": 'PRESS', "repeat": True}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("object.select_all", + {"type": 'A', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("object.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("object.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("object.select_more", {"type": 'PERIOD', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("object.select_less", {"type": 'COMMA', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("object.select_linked", {"type": 'L', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("object.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("object.select_hierarchy", + {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'PARENT'), + ("extend", False), + ], + }, + ), + ("object.select_hierarchy", + {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'PARENT'), + ("extend", True), + ], + }, + ), + ("object.select_hierarchy", + {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'CHILD'), + ("extend", False), + ], + }, + ), + ("object.select_hierarchy", + {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'CHILD'), + ("extend", True), + ], + }, + ), + ("object.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("object.parent_clear", {"type": 'P', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("object.location_clear", + {"type": 'G', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("clear_delta", False), + ], + }, + ), + ("object.rotation_clear", + {"type": 'R', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("clear_delta", False), + ], + }, + ), + ("object.scale_clear", + {"type": 'S', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("clear_delta", False), + ], + }, + ), + ("object.delete", + {"type": 'X', "value": 'PRESS', "repeat": True}, + {"properties": + [("use_global", False), + ], + }, + ), + ("object.delete", + {"type": 'X', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("use_global", True), + ], + }, + ), + ("object.delete", + {"type": 'DEL', "value": 'PRESS', "repeat": True}, + {"properties": + [("use_global", False), + ("confirm", False), + ], + }, + ), + ("object.delete", + {"type": 'DEL', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("use_global", True), + ("confirm", False), + ], + }, + ), + ("wm.call_menu", + {"type": 'A', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_add'), + ], + }, + ), + ("wm.call_menu", + {"type": 'A', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_object_apply'), + ], + }, + ), + ("wm.call_menu", + {"type": 'L', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_make_links'), + ], + }, + ), + ("object.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("object.duplicate_move_linked", {"type": 'D', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("object.join", {"type": 'J', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("anim.keyframe_insert_menu", {"type": 'I', "value": 'PRESS', "repeat": True}, None), + ("anim.keyframe_delete_v3d", {"type": 'I', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("anim.keying_set_active_set", {"type": 'I', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True, "repeat": True}, None), + ("collection.create", + {"type": 'G', "value": 'PRESS', "ctrl": True, "repeat": True}, + { "active":False, + }, + ), + ("collection.objects_remove", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, None), + ("collection.objects_remove_all", {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True, "repeat": True}, None), + ("collection.objects_add_active", {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("collection.objects_remove_active", {"type": 'G', "value": 'PRESS', "shift": True, "alt": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_object_specials'), + ], + "active":False, + }, + ), + ("object.subdivision_set", + {"type": 'ZERO', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("level", 0), + ("relative", False), + ], + }, + ), + ("object.subdivision_set", + {"type": 'ONE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("level", 1), + ("relative", False), + ], + }, + ), + ("object.subdivision_set", + {"type": 'TWO', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("level", 2), + ("relative", False), + ], + }, + ), + ("object.subdivision_set", + {"type": 'THREE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("level", 3), + ("relative", False), + ], + }, + ), + ("object.subdivision_set", + {"type": 'FOUR', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("level", 4), + ("relative", False), + ], + }, + ), + ("object.subdivision_set", + {"type": 'FIVE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("level", 5), + ("relative", False), + ], + }, + ), + ("object.move_to_collection", {"type": 'M', "value": 'PRESS', "repeat": True}, None), + ("object.link_to_collection", {"type": 'M', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("object.hide_view_clear", + {"type": 'H', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("select", True), + ], + }, + ), + ("object.hide_view_set", + {"type": 'H', "value": 'PRESS', "repeat": True}, + {"properties": + [("unselected", False), + ], + }, + ), + ("object.hide_view_set", + {"type": 'H', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("unselected", True), + ], + }, + ), + ("object.hide_collection", {"type": 'H', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("object.hide_collection", + {"type": 'ONE', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 1), + ], + "active":False, + }, + ), + ("object.hide_collection", + {"type": 'TWO', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 2), + ], + "active":False, + }, + ), + ("object.hide_collection", + {"type": 'THREE', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 3), + ], + "active":False, + }, + ), + ("object.hide_collection", + {"type": 'FOUR', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 4), + ], + }, + ), + ("object.hide_collection", + {"type": 'FIVE', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 5), + ], + }, + ), + ("object.hide_collection", + {"type": 'SIX', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 6), + ], + }, + ), + ("object.hide_collection", + {"type": 'SEVEN', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 7), + ], + }, + ), + ("object.hide_collection", + {"type": 'EIGHT', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 8), + ], + }, + ), + ("object.hide_collection", + {"type": 'NINE', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 9), + ], + }, + ), + ("object.hide_collection", + {"type": 'ZERO', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 10), + ], + }, + ), + ("wm.tool_set_by_name", {"type": 'Q', "value": 'PRESS', "repeat": True}, None), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.move'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'E', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.rotate'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'R', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.scale'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'Q', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.select_box'), + ], + }, + ), + ("object.toggle_subsurf", {"type": 'THREE', "value": 'PRESS', "repeat": True}, None), + ("object.toggle_subsurf2", {"type": 'TWO', "value": 'PRESS', "repeat": True}, None), + ("object.toggle_subsurf1", {"type": 'ONE', "value": 'PRESS', "repeat": True}, None), + ("object.toggle_subsurf3", {"type": 'THREE', "value": 'PRESS', "repeat": True}, None), + ("wm.call_menu", + {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("name", 'VIEW3D_MT_object_context_menu'), + ], + }, + ), + ("object.pivotlock", {"type": 'V', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("mcp.toggle_affect_origins_scene", {"type": 'D', "value": 'PRESS', "repeat": True}, None), + ("theme.double", {"type": 'B', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("object.keygridsnap", {"type": 'G', "value": 'PRESS', "key_modifier": 'D', "repeat": True}, None), + ("object.keyvertexsnap", {"type": 'V', "value": 'PRESS', "key_modifier": 'D', "repeat": True}, None), + ("object.keycurvesnap", {"type": 'C', "value": 'PRESS', "key_modifier": 'D', "repeat": True}, None), + ("object.move_to_collection", {"type": 'G', "value": 'PRESS', "ctrl": True}, None), + ], + }, + ), + ("Object Non-modal", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("wm.call_menu_pie", + {"type": 'Q', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'pie.view_of'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("name", 'view3d.snap_of'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'Z', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'pie.shade_of'), + ], + "active":False, + }, + ), + ("wm.call_menu_pie", + {"type": 'PERIOD', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'view3d.pivot_of'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'TAB', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'pie.object_mode_of'), + ], + "active":False, + }, + ), + ("wm.call_menu_pie", + {"type": 'Q', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'pie.view_of'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("name", 'view3d.snap_of'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'PERIOD', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'view3d.pivot_of'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'SPACE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'view3d.manipulator_of'), + ], + "active":False, + }, + ), + ("object.mode_set", + {"type": 'TAB', "value": 'PRESS', "repeat": True}, + {"properties": + [("mode", 'EDIT'), + ("toggle", True), + ], + }, + ), + ("view3d.object_mode_pie_or_toggle", {"type": 'TAB', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("object.transfer_mode", {"type": 'Q', "value": 'PRESS', "alt": True}, None), + ], + }, + ), + ("Outliner", + {"space_type": 'OUTLINER', "region_type": 'WINDOW'}, + {"items": + [("outliner.highlight_update", {"type": 'MOUSEMOVE', "value": 'ANY', "any": True}, None), + ("outliner.item_activate", + {"type": 'LEFTMOUSE', "value": 'CLICK'}, + {"properties": + [("extend", False), + ], + }, + ), + ("outliner.item_activate", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True}, + {"properties": + [("extend", True), + ("extend_range", True), + ], + }, + ), + ("outliner.item_activate", + {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, + {"properties": + [("extend", True), + ("deselect_all", True), + ], + }, + ), + ("outliner.select_box", {"type": 'B', "value": 'PRESS', "repeat": True}, None), + ("outliner.item_openclose", + {"type": 'LEFTMOUSE', "value": 'PRESS'}, + {"properties": + [("all", False), + ], + }, + ), + ("outliner.item_openclose", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": + [("all", True), + ], + }, + ), + ("outliner.item_rename", {"type": 'F2', "value": 'PRESS', "repeat": True}, None), + ("outliner.operation", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None), + ("outliner.item_drag_drop", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), + ("outliner.item_drag_drop", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, None), + ("outliner.show_hierarchy", {"type": 'HOME', "value": 'PRESS', "repeat": True}, None), + ("outliner.show_active", {"type": 'PERIOD', "value": 'PRESS', "repeat": True}, None), + ("outliner.show_active", {"type": 'NUMPAD_PERIOD', "value": 'PRESS', "repeat": True}, None), + ("outliner.scroll_page", + {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True}, + {"properties": + [("up", False), + ], + }, + ), + ("outliner.scroll_page", + {"type": 'PAGE_UP', "value": 'PRESS', "repeat": True}, + {"properties": + [("up", True), + ], + }, + ), + ("outliner.show_one_level", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "repeat": True}, None), + ("outliner.show_one_level", + {"type": 'NUMPAD_MINUS', "value": 'PRESS', "repeat": True}, + {"properties": + [("open", False), + ], + }, + ), + ("outliner.select_all", + {"type": 'A', "value": 'PRESS', "repeat": True}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("outliner.select_all", + {"type": 'A', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("outliner.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("outliner.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("outliner.expanded_toggle", {"type": 'A', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("outliner.keyingset_add_selected", {"type": 'K', "value": 'PRESS', "repeat": True}, None), + ("outliner.keyingset_remove_selected", {"type": 'K', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("anim.keyframe_insert", {"type": 'I', "value": 'PRESS', "repeat": True}, None), + ("anim.keyframe_delete", {"type": 'I', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("outliner.drivers_add_selected", {"type": 'D', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("outliner.drivers_delete_selected", {"type": 'D', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, None), + ("outliner.collection_new", {"type": 'C', "value": 'PRESS', "repeat": True}, None), + ("outliner.delete", {"type": 'DEL', "value": 'PRESS', "repeat": True}, None), + ("object.move_to_collection", {"type": 'M', "value": 'PRESS', "repeat": True}, None), + ("object.link_to_collection", {"type": 'M', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("outliner.collection_exclude_set", {"type": 'E', "value": 'PRESS', "repeat": True}, None), + ("outliner.collection_exclude_clear", {"type": 'E', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("object.hide_view_clear", + {"type": 'H', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("select", True), + ], + }, + ), + ("object.hide_view_set", + {"type": 'H', "value": 'PRESS', "repeat": True}, + {"properties": + [("unselected", True), + ], + }, + ), + ("object.hide_view_set", + {"type": 'H', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("unselected", True), + ], + }, + ), + ("outliner.select_walk", + {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'UP'), + ], + }, + ), + ("outliner.select_walk", + {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'DOWN'), + ], + }, + ), + ("outliner.select_walk", + {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'UP'), + ("extend", True), + ], + }, + ), + ("outliner.select_walk", + {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'DOWN'), + ("extend", True), + ], + }, + ), + ("outliner.select_walk", + {"type": 'LEFT_ARROW', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'LEFT'), + ], + }, + ), + ("outliner.select_walk", + {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'LEFT'), + ("toggle_all", True), + ], + }, + ), + ("outliner.select_walk", + {"type": 'RIGHT_ARROW', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'RIGHT'), + ], + }, + ), + ("outliner.select_walk", + {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'RIGHT'), + ("toggle_all", True), + ], + }, + ), + ("outliner.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("tweak", True), + ("wait_for_input", True), + ], + }, + ), + ("outliner.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, + {"properties": + [("tweak", True), + ("wait_for_input", True), + ("mode", 'ADD'), + ], + }, + ), + ("outliner.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("tweak", True), + ("mode", 'SUB'), + ], + }, + ), + ("outliner.item_rename", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None), + ("object.move_to_collection", {"type": 'G', "value": 'PRESS', "ctrl": True}, None), + ("outliner.delete", {"type": 'X', "value": 'PRESS'}, None), + ], + }, + ), + ("Pose", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("object.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'A', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_add'), + ], + }, + ), + ("pose.hide", + {"type": 'H', "value": 'PRESS', "repeat": True}, + {"properties": + [("unselected", False), + ], + }, + ), + ("pose.hide", + {"type": 'H', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("unselected", True), + ], + }, + ), + ("pose.reveal", {"type": 'H', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'A', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_pose_apply'), + ], + }, + ), + ("pose.rot_clear", {"type": 'R', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("pose.loc_clear", {"type": 'G', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("pose.scale_clear", {"type": 'S', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("pose.quaternions_flip", {"type": 'F', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("pose.rotation_mode_set", {"type": 'R', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("pose.copy", {"type": 'C', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("pose.paste", + {"type": 'V', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("flipped", False), + ], + }, + ), + ("pose.paste", + {"type": 'V', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("flipped", True), + ], + }, + ), + ("pose.select_all", + {"type": 'A', "value": 'PRESS', "repeat": True}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("pose.select_all", + {"type": 'A', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("pose.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("pose.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("pose.select_parent", {"type": 'P', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("pose.select_hierarchy", + {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'PARENT'), + ("extend", False), + ], + }, + ), + ("pose.select_hierarchy", + {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'PARENT'), + ("extend", True), + ], + }, + ), + ("pose.select_hierarchy", + {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True}, + {"properties": + [("direction", 'CHILD'), + ("extend", False), + ], + }, + ), + ("pose.select_hierarchy", + {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("direction", 'CHILD'), + ("extend", True), + ], + }, + ), + ("pose.select_linked", {"type": 'L', "value": 'PRESS', "repeat": True}, None), + ("pose.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("pose.select_mirror", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("pose.constraint_add_with_targets", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("pose.constraints_clear", {"type": 'C', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, None), + ("pose.ik_add", {"type": 'I', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("pose.ik_clear", {"type": 'I', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'G', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_pose_group'), + ], + }, + ), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_bone_options_toggle'), + ], + }, + ), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_bone_options_enable'), + ], + }, + ), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_bone_options_disable'), + ], + }, + ), + ("armature.layers_show_all", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("armature.armature_layers", {"type": 'M', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("pose.bone_layers", {"type": 'M', "value": 'PRESS', "repeat": True}, None), + ("transform.transform", + {"type": 'S', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, + {"properties": + [("mode", 'BONE_SIZE'), + ], + }, + ), + ("anim.keyframe_insert_menu", {"type": 'I', "value": 'PRESS', "repeat": True}, None), + ("anim.keyframe_delete_v3d", {"type": 'I', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("anim.keying_set_active_set", {"type": 'I', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True, "repeat": True}, None), + ("poselib.browse_interactive", {"type": 'L', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("poselib.pose_add", {"type": 'L', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("poselib.pose_remove", {"type": 'L', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("poselib.pose_rename", {"type": 'L', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("pose.push", {"type": 'E', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("pose.relax", {"type": 'E', "value": 'PRESS', "shift": True, "alt": True, "repeat": True}, None), + ("pose.breakdown", {"type": 'E', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'P', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_pose_propagate'), + ], + }, + ), + ("object.hide_collection", + {"type": 'ONE', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 1), + ], + }, + ), + ("object.hide_collection", + {"type": 'TWO', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 2), + ], + }, + ), + ("object.hide_collection", + {"type": 'THREE', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 3), + ], + }, + ), + ("object.hide_collection", + {"type": 'FOUR', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 4), + ], + }, + ), + ("object.hide_collection", + {"type": 'FIVE', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 5), + ], + }, + ), + ("object.hide_collection", + {"type": 'SIX', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 6), + ], + }, + ), + ("object.hide_collection", + {"type": 'SEVEN', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 7), + ], + }, + ), + ("object.hide_collection", + {"type": 'EIGHT', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 8), + ], + }, + ), + ("object.hide_collection", + {"type": 'NINE', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 9), + ], + }, + ), + ("object.hide_collection", + {"type": 'ZERO', "value": 'PRESS', "any": True, "repeat": True}, + {"properties": + [("collection_index", 10), + ], + }, + ), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_pose_context_menu'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.move'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'E', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.rotate'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'R', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.scale'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'Q', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.select_box'), + ], + }, + ), + ("view3d.localview", {"type": 'E', "value": 'PRESS', "alt": True}, None), + ], + }, + ), + ("Screen", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("screen.animation_step", {"type": 'TIMER0', "value": 'ANY', "any": True}, None), + ("screen.region_blend", {"type": 'TIMERREGION', "value": 'ANY', "any": True}, None), + ("screen.screen_full_area", {"type": 'UP_ARROW', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("screen.screen_full_area", + {"type": 'SPACE', "value": 'PRESS', "ctrl": True, "alt": True, "repeat": True}, + {"properties": + [("use_hide_panels", True), + ], + }, + ), + ("screen.space_context_cycle", + {"type": 'TAB', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("direction", 'NEXT'), + ], + }, + ), + ("screen.space_context_cycle", + {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("direction", 'PREV'), + ], + }, + ), + ("screen.workspace_cycle", + {"type": 'PAGE_DOWN', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("direction", 'NEXT'), + ], + }, + ), + ("screen.workspace_cycle", + {"type": 'PAGE_UP', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("direction", 'PREV'), + ], + }, + ), + ("screen.region_quadview", + {"type": 'SPACE', "value": 'PRESS', "repeat": True}, + { "active":False, + }, + ), + ("screen.repeat_last", {"type": 'R', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("file.execute", {"type": 'RET', "value": 'PRESS', "repeat": True}, None), + ("file.execute", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "repeat": True}, None), + ("file.cancel", {"type": 'ESC', "value": 'PRESS', "repeat": True}, None), + ("ed.undo", {"type": 'Z', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("ed.redo", {"type": 'Z', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("render.render", + {"type": 'F12', "value": 'PRESS', "repeat": True}, + {"properties": + [("use_viewport", True), + ], + }, + ), + ("render.render", + {"type": 'F12', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("animation", True), + ("use_viewport", True), + ], + }, + ), + ("render.view_cancel", {"type": 'ESC', "value": 'PRESS', "repeat": True}, None), + ("render.view_show", {"type": 'F11', "value": 'PRESS', "repeat": True}, None), + ("render.play_rendered_anim", {"type": 'F11', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ], + }, + ), + ("Toolbar Popup ", + {"space_type": 'EMPTY', "region_type": 'TEMPORARY'}, + {"items": + [("wm.tool_set_by_id", + {"type": 'SPACE', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.cursor'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'L', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select_lasso'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'T', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.transform'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'M', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.measure'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'Q', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select_box'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'C', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select_circle'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.move'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'E', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.rotate'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'R', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.scale'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'D', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.annotate'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'ONE', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_1', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'TWO', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select_lasso'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_2', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select_lasso'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'THREE', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.scale_cage'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_3', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.scale_cage'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'FOUR', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.transform'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_4', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.transform'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'FIVE', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.annotate_line'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_5', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.annotate_line'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'SIX', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.annotate_polygon'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_6', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.annotate_polygon'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'SEVEN', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.annotate_eraser'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_7', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.annotate_eraser'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'EIGHT', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.measure'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_8', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.measure'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NINE', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.primitive_cube_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_9', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.primitive_cube_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'ZERO', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.primitive_cone_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_0', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.primitive_cone_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'ONE', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'builtin.primitive_cylinder_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_1', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'builtin.primitive_cylinder_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'TWO', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'builtin.primitive_uv_sphere_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_2', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'builtin.primitive_uv_sphere_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'THREE', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'builtin.primitive_ico_sphere_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'NUMPAD_3', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'builtin.primitive_ico_sphere_add'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'SPACE', "value": 'DOUBLE_CLICK'}, + {"properties": + [("name", 'builtin.cursor'), + ], + }, + ), + ("ui.button_execute", + {"type": 'SPACE', "value": 'RELEASE', "any": True}, + {"properties": + [("skip_depressed", True), + ], + }, + ), + ], + }, + ), + ("UV Editor", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("mesh.select_mode", + {"type": 'ONE', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'VERT'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'TWO', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'EDGE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'THREE', "value": 'PRESS', "repeat": True}, + {"properties": + [("type", 'FACE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'ONE', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("type", 'VERT'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'TWO', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("type", 'EDGE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'THREE', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("type", 'FACE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'ONE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("use_expand", True), + ("type", 'VERT'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'TWO', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("use_expand", True), + ("type", 'EDGE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'THREE', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("use_expand", True), + ("type", 'FACE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'ONE', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("use_expand", True), + ("type", 'VERT'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'TWO', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("use_expand", True), + ("type", 'EDGE'), + ], + }, + ), + ("mesh.select_mode", + {"type": 'THREE', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("use_extend", True), + ("use_expand", True), + ("type", 'FACE'), + ], + }, + ), + ("mesh.select_mode", {"type": 'FOUR', "value": 'PRESS', "repeat": True}, None), + ("wm.context_set_enum", + {"type": 'ONE', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'tool_settings.uv_select_mode'), + ("value", 'VERTEX'), + ], + }, + ), + ("wm.context_set_enum", + {"type": 'TWO', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'tool_settings.uv_select_mode'), + ("value", 'EDGE'), + ], + }, + ), + ("wm.context_set_enum", + {"type": 'THREE', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'tool_settings.uv_select_mode'), + ("value", 'FACE'), + ], + }, + ), + ("wm.context_set_enum", + {"type": 'FOUR', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'tool_settings.uv_select_mode'), + ("value", 'ISLAND'), + ], + }, + ), + ("uv.mark_seam", {"type": 'E', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("uv.select", + {"type": 'RIGHTMOUSE', "value": 'PRESS'}, + {"properties": + [("extend", False), + ], + "active":False, + }, + ), + ("uv.select", + {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": + [("extend", True), + ], + }, + ), + ("uv.select_loop", + {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True}, + {"properties": + [("extend", False), + ], + "active":False, + }, + ), + ("uv.select_loop", + {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": + [("extend", True), + ], + "active":False, + }, + ), + ("uv.select_split", {"type": 'Y', "value": 'PRESS', "repeat": True}, None), + ("uv.select_box", + {"type": 'B', "value": 'PRESS', "repeat": True}, + {"properties": + [("pinned", False), + ], + }, + ), + ("uv.select_box", + {"type": 'B', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("pinned", True), + ], + }, + ), + ("uv.select_circle", {"type": 'C', "value": 'PRESS', "repeat": True}, None), + ("uv.select_lasso", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("uv.select_lasso", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("uv.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("uv.select_linked_pick", + {"type": 'L', "value": 'PRESS', "repeat": True}, + {"properties": + [("extend", True), + ("deselect", False), + ], + }, + ), + ("uv.select_linked", {"type": 'L', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("uv.select_linked_pick", + {"type": 'L', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("extend", False), + ("deselect", True), + ], + }, + ), + ("uv.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("uv.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("uv.select_all", + {"type": 'A', "value": 'PRESS', "repeat": True}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("uv.select_all", + {"type": 'A', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("uv.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("uv.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("uv.select_pinned", {"type": 'P', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'W', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'IMAGE_MT_uvs_weldalign'), + ], + }, + ), + ("uv.stitch", {"type": 'V', "value": 'PRESS', "repeat": True}, None), + ("uv.pin", + {"type": 'P', "value": 'PRESS', "repeat": True}, + {"properties": + [("clear", False), + ], + }, + ), + ("uv.pin", + {"type": 'P', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("clear", True), + ], + }, + ), + ("uv.unwrap", {"type": 'U', "value": 'PRESS', "repeat": True}, None), + ("uv.hide", + {"type": 'H', "value": 'PRESS', "repeat": True}, + {"properties": + [("unselected", False), + ], + }, + ), + ("uv.hide", + {"type": 'H', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("unselected", True), + ], + }, + ), + ("uv.reveal", {"type": 'H', "value": 'PRESS', "alt": True, "repeat": True}, None), + ("wm.call_menu_pie", + {"type": 'S', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'IMAGE_MT_uvs_snap_pie'), + ], + }, + ), + ("wm.call_menu", + {"type": 'TAB', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("name", 'IMAGE_MT_uvs_select_mode'), + ], + }, + ), + ("wm.call_menu_pie", + {"type": 'O', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'VIEW3D_MT_proportional_editing_falloff_pie'), + ], + }, + ), + ("wm.context_toggle_enum", + {"type": 'O', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'tool_settings.proportional_edit'), + ("value_1", 'DISABLED'), + ("value_2", 'ENABLED'), + ], + }, + ), + ("transform.translate", {"type": 'G', "value": 'PRESS', "repeat": True}, None), + ("transform.translate", {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG'}, None), + ("transform.rotate", + {"type": 'R', "value": 'PRESS', "repeat": True}, + { "active":False, + }, + ), + ("transform.resize", {"type": 'S', "value": 'PRESS', "repeat": True}, None), + ("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True, "repeat": True}, None), + ("transform.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.context_toggle", + {"type": 'TAB', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("data_path", 'tool_settings.use_snap'), + ], + }, + ), + ("wm.context_menu_enum", + {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("data_path", 'tool_settings.snap_uv_element'), + ], + }, + ), + ("wm.call_menu", + {"type": 'RIGHTMOUSE', "value": 'PRESS'}, + {"properties": + [("name", 'IMAGE_MT_uvs_context_menu'), + ], + }, + ), + ("uv.cursor_set", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, None), + ("wm.tool_set_by_name", {"type": 'Q', "value": 'PRESS', "repeat": True}, None), + ("wm.tool_set_by_name", {"type": 'W', "value": 'PRESS', "repeat": True}, None), + ("wm.tool_set_by_id", + {"type": 'Q', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.select_box'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.move'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'R', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.scale'), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'E', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'builtin.rotate'), + ], + }, + ), + ("uv.select", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ], + }, + ), + ("User Interface", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("ui.eyedropper_color", {"type": 'E', "value": 'PRESS'}, None), + ("ui.eyedropper_colorramp", {"type": 'E', "value": 'PRESS'}, None), + ("ui.eyedropper_colorramp_point", {"type": 'E', "value": 'PRESS', "alt": True}, None), + ("ui.eyedropper_id", {"type": 'E', "value": 'PRESS'}, None), + ("ui.eyedropper_depth", {"type": 'E', "value": 'PRESS'}, None), + ("ui.copy_data_path_button", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True}, None), + ("ui.copy_data_path_button", + {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, + {"properties": + [("full_path", True), + ], + }, + ), + ("anim.keyframe_insert_button", + {"type": 'I', "value": 'PRESS'}, + {"properties": + [("all", True), + ], + }, + ), + ("anim.keyframe_delete_button", + {"type": 'I', "value": 'PRESS', "alt": True}, + {"properties": + [("all", True), + ], + }, + ), + ("anim.keyframe_clear_button", + {"type": 'I', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": + [("all", True), + ], + }, + ), + ("anim.driver_button_add", {"type": 'D', "value": 'PRESS', "ctrl": True}, None), + ("anim.driver_button_remove", {"type": 'D', "value": 'PRESS', "ctrl": True, "alt": True}, None), + ("anim.keyingset_button_add", {"type": 'K', "value": 'PRESS'}, None), + ("anim.keyingset_button_remove", {"type": 'K', "value": 'PRESS', "alt": True}, None), + ("ui.reset_default_button", + {"type": 'BACK_SPACE', "value": 'PRESS'}, + {"properties": + [("all", True), + ], + }, + ), + ("ui.list_start_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None), + ("ui.view_start_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None), + ("anim.keyframe_insert_by_name", {"type": 'S', "value": 'PRESS'}, None), + ("ui.view_item_select", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("ui.view_item_select", + {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("extend", True), + ], + }, + ), + ("ui.view_item_select", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": + [("range_select", True), + ], + }, + ), + ("ui.view_scroll", {"type": 'WHEELUPMOUSE', "value": 'ANY'}, None), + ("ui.view_scroll", {"type": 'WHEELDOWNMOUSE', "value": 'ANY'}, None), + ("ui.view_scroll", {"type": 'TRACKPADPAN', "value": 'ANY'}, None), + ], + }, + ), + ("View2D", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("view2d.scroller_activate", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("view2d.scroller_activate", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None), + ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None), + ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None), + ("view2d.pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None), + ("view2d.scroll_right", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("view2d.scroll_right", {"type": 'WHEELRIGHTMOUSE', "value": 'PRESS'}, None), + ("view2d.scroll_left", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("view2d.scroll_left", {"type": 'WHEELLEFTMOUSE', "value": 'PRESS'}, None), + ("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True}, None), + ("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True}, None), + ("view2d.ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None), + ("view2d.zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None), + ("view2d.zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS'}, None), + ("view2d.zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "repeat": True}, None), + ("view2d.zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "repeat": True}, None), + ("view2d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None), + ("view2d.smoothview", {"type": 'TIMER1', "value": 'ANY', "any": True}, None), + ("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None), + ("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None), + ("view2d.scroll_right", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None), + ("view2d.scroll_left", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None), + ("view2d.zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("view2d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None), + ("view2d.zoom_border", {"type": 'B', "value": 'PRESS', "shift": True}, None), + ("anim.keyframe_insert_by_name", {"type": 'S', "value": 'PRESS'}, None), + ], + }, + ), + ("Weight Paint", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("paint.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("paint.weight_sample", {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("paint.weight_sample_group", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, None), + ("paint.weight_gradient", + {"type": 'LEFTMOUSE', "value": 'PRESS'}, + {"properties": + [("type", 'LINEAR'), + ], + }, + ), + ("paint.weight_gradient", + {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True}, + {"properties": + [("type", 'RADIAL'), + ], + }, + ), + ("paint.weight_set", {"type": 'K', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("brush.scale_size", + {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, + {"properties": + [("scalar", 0.9), + ], + }, + ), + ("brush.scale_size", + {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True}, + {"properties": + [("scalar", 1.1111112), + ], + }, + ), + ("wm.radial_control", + {"type": 'F', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path_primary", 'tool_settings.weight_paint.brush.size'), + ("data_path_secondary", 'tool_settings.weight_paint.unified_paint_settings.size'), + ("use_secondary", 'tool_settings.weight_paint.unified_paint_settings.use_unified_size'), + ("rotation_path", 'tool_settings.weight_paint.brush.texture_slot.angle'), + ("color_path", 'tool_settings.weight_paint.brush.cursor_color_add'), + ("fill_color_path", ''), + ("fill_color_override_path", ''), + ("fill_color_override_test_path", ''), + ("zoom_path", ''), + ("image_id", 'tool_settings.weight_paint.brush'), + ("secondary_tex", False), + ], + }, + ), + ("wm.radial_control", + {"type": 'F', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("data_path_primary", 'tool_settings.weight_paint.brush.strength'), + ("data_path_secondary", 'tool_settings.weight_paint.unified_paint_settings.strength'), + ("use_secondary", 'tool_settings.weight_paint.unified_paint_settings.use_unified_strength'), + ("rotation_path", 'tool_settings.weight_paint.brush.texture_slot.angle'), + ("color_path", 'tool_settings.weight_paint.brush.cursor_color_add'), + ("fill_color_path", ''), + ("fill_color_override_path", ''), + ("fill_color_override_test_path", ''), + ("zoom_path", ''), + ("image_id", 'tool_settings.weight_paint.brush'), + ("secondary_tex", False), + ], + }, + ), + ("wm.radial_control", + {"type": 'F', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("data_path_primary", 'tool_settings.weight_paint.brush.weight'), + ("data_path_secondary", 'tool_settings.weight_paint.unified_paint_settings.weight'), + ("use_secondary", 'tool_settings.weight_paint.unified_paint_settings.use_unified_weight'), + ("rotation_path", 'tool_settings.weight_paint.brush.texture_slot.angle'), + ("color_path", 'tool_settings.weight_paint.brush.cursor_color_add'), + ("fill_color_path", ''), + ("fill_color_override_path", ''), + ("fill_color_override_test_path", ''), + ("zoom_path", ''), + ("image_id", 'tool_settings.weight_paint.brush'), + ("secondary_tex", False), + ], + }, + ), + ("wm.context_menu_enum", + {"type": 'E', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'tool_settings.vertex_paint.brush.stroke_method'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'M', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'weight_paint_object.data.use_paint_mask'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'V', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'weight_paint_object.data.use_paint_mask_vertex'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'S', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("data_path", 'tool_settings.weight_paint.brush.use_smooth_stroke'), + ], + }, + ), + ("wm.call_panel", + {"type": 'W', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'VIEW3D_PT_paint_weight_context_menu'), + ], + }, + ), + ("view3d.select", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None), + ], + }, + ), + ("Window", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": + [("wm.read_homefile", {"type": 'N', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'O', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, + {"properties": + [("name", 'TOPBAR_MT_file_open_recent'), + ], + }, + ), + ("wm.open_mainfile", {"type": 'O', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.save_mainfile", + {"type": 'S', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("check_existing", False), + ], + }, + ), + ("wm.save_as_mainfile", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None), + ("wm.quit_blender", {"type": 'Q', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("wm.call_menu", + {"type": 'Q', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("name", 'SCREEN_MT_user_menu'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F1', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'FILE_BROWSER'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F2', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'CLIP_EDITOR'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F3', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'NODE_EDITOR'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F4', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'CONSOLE'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F5', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'VIEW_3D'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F6', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'GRAPH_EDITOR'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F7', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'PROPERTIES'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F8', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'SEQUENCE_EDITOR'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F9', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'OUTLINER'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F10', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'IMAGE_EDITOR'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F11', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'TEXT_EDITOR'), + ], + }, + ), + ("screen.space_type_set_or_cycle", + {"type": 'F12', "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": + [("space_type", 'DOPESHEET_EDITOR'), + ], + }, + ), + ("wm.call_menu", + {"type": 'NDOF_BUTTON_MENU', "value": 'PRESS'}, + {"properties": + [("name", 'USERPREF_MT_ndof_settings'), + ], + }, + ), + ("wm.context_scale_float", + {"type": 'NDOF_BUTTON_PLUS', "value": 'PRESS'}, + {"properties": + [("data_path", 'preferences.inputs.ndof_sensitivity'), + ("value", 1.1), + ], + }, + ), + ("wm.context_scale_float", + {"type": 'NDOF_BUTTON_MINUS', "value": 'PRESS'}, + {"properties": + [("data_path", 'preferences.inputs.ndof_sensitivity'), + ("value", 0.90909094), + ], + }, + ), + ("wm.context_scale_float", + {"type": 'NDOF_BUTTON_PLUS', "value": 'PRESS', "shift": True}, + {"properties": + [("data_path", 'preferences.inputs.ndof_sensitivity'), + ("value", 1.5), + ], + }, + ), + ("wm.context_scale_float", + {"type": 'NDOF_BUTTON_MINUS', "value": 'PRESS', "shift": True}, + {"properties": + [("data_path", 'preferences.inputs.ndof_sensitivity'), + ("value", 0.6666667), + ], + }, + ), + ("info.reports_display_update", {"type": 'TIMER_REPORT', "value": 'ANY', "any": True}, None), + ("wm.doc_view_manual_ui_context", {"type": 'F1', "value": 'PRESS', "repeat": True}, None), + ("wm.call_panel", + {"type": 'F2', "value": 'PRESS'}, + {"properties": + [("name", 'TOPBAR_PT_name'), + ], + }, + ), + ("wm.search_menu", {"type": 'F3', "value": 'PRESS', "repeat": True}, None), + ("wm.call_menu", + {"type": 'F4', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'TOPBAR_MT_window_specials'), + ], + }, + ), + ("wm.toolbar", {"type": 'SPACE', "value": 'PRESS', "shift": True, "repeat": True}, None), + ("wm.tool_set_by_name", {"type": 'E', "value": 'PRESS', "repeat": True}, None), + ("wm.tool_set_by_name", {"type": 'R', "value": 'PRESS', "repeat": True}, None), + ("wm.tool_set_by_name", {"type": 'W', "value": 'PRESS', "repeat": True}, None), + ("wm.tool_set_by_name", {"type": 'Q', "value": 'PRESS', "repeat": True}, None), + ("wm.keyconfig_activate", {"type": 'NONE', "value": 'PRESS', "repeat": True}, None), + ("wm.context_toggle", + {"type": 'D', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": + [("data_path", 'space_data.overlay.show_cursor'), + ], + }, + ), + ("wm.context_menu_enum", + {"type": 'A', "value": 'PRESS', "repeat": True}, + {"properties": + [("data_path", 'space_data.shading.type'), + ], + }, + ), + ("wm.keyconfig_activate", {"type": 'F7', "value": 'PRESS', "repeat": True}, None), + ("wm.keyconfig_activate", {"type": 'F7', "value": 'PRESS', "repeat": True}, None), + ("wm.batch_rename", {"type": 'F2', "value": 'PRESS', "ctrl": True}, None), + ], + }, + ), + ] + + +if __name__ == "__main__": + # Only add keywords that are supported. + from bpy.app import version as blender_version + keywords = {} + if blender_version >= (2, 92, 0): + keywords["keyconfig_version"] = keyconfig_version + import os + from bl_keymap_utils.io import keyconfig_import_from_data + keyconfig_import_from_data( + os.path.splitext(os.path.basename(__file__))[0], + keyconfig_data, + **keywords, + ) diff --git a/scripts/addons/form_affinity_maya_config_pro/utils/__init__.py b/scripts/addons/form_affinity_maya_config_pro/utils/__init__.py new file mode 100644 index 0000000..ab9082a --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/utils/__init__.py @@ -0,0 +1,9 @@ +""" +Maya Config Pro - Utilities Package +Provides version detection and compatibility utilities for multi-version Blender support. +""" + +from . import version +from . import compat + +__all__ = ['version', 'compat'] diff --git a/scripts/addons/form_affinity_maya_config_pro/utils/compat.py b/scripts/addons/form_affinity_maya_config_pro/utils/compat.py new file mode 100644 index 0000000..e5b3290 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/utils/compat.py @@ -0,0 +1,79 @@ +""" +This module provides API compatibility functions for handling differences +between Blender 4.2, 4.4, 4.5, and 5.0. +""" + +import bpy +from bpy.utils import register_class, unregister_class +from . import version + + +def safe_register_class(cls): + """ + Safely register a class, handling any version-specific registration issues. + + Args: + cls: The class to register + + Returns: + bool: True if registration succeeded, False otherwise + """ + try: + register_class(cls) + return True + except Exception as e: + print(f"Warning: Failed to register {cls.__name__}: {e}") + return False + + +def safe_unregister_class(cls): + """ + Safely unregister a class, handling any version-specific unregistration issues. + + Args: + cls: The class to unregister + + Returns: + bool: True if unregistration succeeded, False otherwise + """ + try: + unregister_class(cls) + return True + except Exception as e: + print(f"Warning: Failed to unregister {cls.__name__}: {e}") + return False + + +def get_tools_region_type(): + """ + Returns the correct region type for tools panels. + In Blender 2.8+, 'TOOLS' was replaced by 'UI'. + + Returns: + str: 'UI' (for all supported versions 4.2+) + """ + # For Blender 4.2 and later, always use 'UI' + return 'UI' + + +def temp_override(context, **kwargs): + """ + Provides a context manager for temporary context overrides. + Handles the API change from context.copy() to context.temp_override(). + + Args: + context: The current Blender context + **kwargs: Keyword arguments for override values + + Returns: + context manager for temporary override + """ + if version.is_version_at_least(3, 2, 0): + # Blender 3.2+ uses temp_override + return context.temp_override(**kwargs) + else: + # Older versions - this shouldn't happen for 4.2+ minimum + # but keeping for safety + override = context.copy() + override.update(kwargs) + return override diff --git a/scripts/addons/form_affinity_maya_config_pro/utils/deploy.py b/scripts/addons/form_affinity_maya_config_pro/utils/deploy.py new file mode 100644 index 0000000..ea52d45 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/utils/deploy.py @@ -0,0 +1,105 @@ +""" +Deploy Maya Config Pro bundled assets into the user's Blender config/scripts folders. +""" + +from __future__ import annotations + +import os +import shutil + +import bpy + + +def addon_root() -> str: + return os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +def user_keyconfig_dir() -> str: + return bpy.utils.user_resource( + "SCRIPTS", + path=os.path.join("presets", "keyconfig"), + create=True, + ) + + +def bundled_keyconfig_dir() -> str: + return os.path.join( + addon_root(), "portable", "scripts", "presets", "keyconfig" + ) + + +def bundled_startup_blend() -> str: + return os.path.join(addon_root(), "portable", "config", "startup.blend") + + +def user_startup_blend() -> str: + return os.path.join(bpy.utils.user_resource("CONFIG"), "startup.blend") + + +def blender_bundled_keyconfig_dir() -> str | None: + """Directory shipped with the running Blender install (contains keymap_data).""" + try: + local = bpy.utils.resource_path("LOCAL") + except Exception: + return None + if not local: + return None + path = os.path.join(local, "scripts", "presets", "keyconfig") + return path if os.path.isdir(path) else None + + +def is_keyconfig_deployed() -> bool: + kc = user_keyconfig_dir() + if not os.path.isdir(os.path.join(kc, "keymap_data")): + return False + for name in ("Blender.py", "Industry_Compatible.py", "fa_hotkeys.py"): + if not os.path.isfile(os.path.join(kc, name)): + return False + return True + + +def is_startup_bundle_available() -> bool: + return os.path.isfile(bundled_startup_blend()) + + +def deploy_keymap_presets() -> tuple[bool, str]: + """ + Copy Blender's default keyconfig tree from LOCAL, then overlay FA hotkeys from this add-on. + """ + src_install = blender_bundled_keyconfig_dir() + if not src_install: + return False, "Could not find Blender's bundled keyconfig folder (full installation required)." + + dst = user_keyconfig_dir() + os.makedirs(dst, exist_ok=True) + + try: + shutil.copytree(src_install, dst, dirs_exist_ok=True) + except OSError as e: + return False, f"Could not copy keyconfig presets: {e}" + + portable_fa = os.path.join(bundled_keyconfig_dir(), "fa_hotkeys.py") + if os.path.isfile(portable_fa): + try: + shutil.copy2(portable_fa, os.path.join(dst, "fa_hotkeys.py")) + except OSError as e: + return False, f"Could not install fa_hotkeys.py: {e}" + else: + return False, "Add-on is missing portable/scripts/presets/keyconfig/fa_hotkeys.py." + + return True, f"Keymap presets deployed to:\n{dst}" + + +def deploy_startup_blend() -> tuple[bool, str]: + src = bundled_startup_blend() + if not os.path.isfile(src): + return False, "No startup.blend is bundled with this add-on (see portable/config/)." + + dst = user_startup_blend() + try: + os.makedirs(os.path.dirname(dst), exist_ok=True) + shutil.copy2(src, dst) + except OSError as e: + return False, f"Could not copy startup.blend: {e}" + + return True, f"startup.blend installed to:\n{dst}\nReload startup file or restart Blender to apply." diff --git a/scripts/addons/form_affinity_maya_config_pro/utils/version.py b/scripts/addons/form_affinity_maya_config_pro/utils/version.py new file mode 100644 index 0000000..3d303b4 --- /dev/null +++ b/scripts/addons/form_affinity_maya_config_pro/utils/version.py @@ -0,0 +1,116 @@ +""" +This module provides version detection and comparison utilities for +multi-version Blender support (4.2, 4.4, 4.5, and 5.0). +""" + +import bpy + +# Version constants +VERSION_4_2 = (4, 2, 0) +VERSION_4_4 = (4, 4, 0) +VERSION_4_5 = (4, 5, 0) +VERSION_5_0 = (5, 0, 0) + + +def get_blender_version(): + """ + Returns the current Blender version as a tuple (major, minor, patch). + + Returns: + tuple: (major, minor, patch) version numbers + """ + return bpy.app.version + + +def get_version_string(): + """ + Returns the current Blender version as a string (e.g., "4.2.0"). + + Returns: + str: Version string in format "major.minor.patch" + """ + version = get_blender_version() + return f"{version[0]}.{version[1]}.{version[2]}" + + +def is_version_at_least(major, minor=0, patch=0): + """ + Check if the current Blender version is at least the specified version. + + Args: + major (int): Major version number + minor (int): Minor version number (default: 0) + patch (int): Patch version number (default: 0) + + Returns: + bool: True if current version >= specified version + """ + current = get_blender_version() + target = (major, minor, patch) + + if current[0] != target[0]: + return current[0] > target[0] + if current[1] != target[1]: + return current[1] > target[1] + return current[2] >= target[2] + + +def is_version_less_than(major, minor=0, patch=0): + """ + Check if the current Blender version is less than the specified version. + + Args: + major (int): Major version number + minor (int): Minor version number (default: 0) + patch (int): Patch version number (default: 0) + + Returns: + bool: True if current version < specified version + """ + return not is_version_at_least(major, minor, patch) + + +def get_version_category(): + """ + Returns the version category string for the current Blender version. + + Returns: + str: '4.2', '4.4', '4.5', or '5.0' based on the current version + """ + version = get_blender_version() + major, minor = version[0], version[1] + + if major == 4: + if minor < 4: + return '4.2' + elif minor < 5: + return '4.4' + else: + return '4.5' + elif major >= 5: + return '5.0' + else: + # Fallback for older versions + return f"{major}.{minor}" + + +def is_version_4_2(): + """Check if running Blender 4.2 (4.2.x only, not 4.3 or 4.4).""" + version = get_blender_version() + return version[0] == 4 and version[1] == 2 + + +def is_version_4_4(): + """Check if running Blender 4.4 (4.4.x only, not 4.5).""" + version = get_blender_version() + return version[0] == 4 and version[1] == 4 + + +def is_version_4_5(): + """Check if running Blender 4.5 LTS.""" + return is_version_at_least(4, 5, 0) and is_version_less_than(5, 0, 0) + + +def is_version_5_0(): + """Check if running Blender 5.0 or later.""" + return is_version_at_least(5, 0, 0) diff --git a/scripts/presets/keyconfig/Blender.py b/scripts/presets/keyconfig/Blender.py index dd733ad..8b5fd89 100644 --- a/scripts/presets/keyconfig/Blender.py +++ b/scripts/presets/keyconfig/Blender.py @@ -8,6 +8,7 @@ from bpy.props import ( BoolProperty, EnumProperty, ) +from bpy.app.translations import contexts as i18n_contexts DIRNAME, FILENAME = os.path.split(__file__) IDNAME = os.path.splitext(FILENAME)[0] @@ -40,12 +41,12 @@ class Prefs(bpy.types.KeyConfigPreferences): items=( ('PLAY', "Play", "Toggle animation playback " - "('Shift-Space' for Tools)", + "('Shift-Space' for Tools or brush asset popup)", 1), ('TOOL', "Tools", - "Open the popup tool-bar\n" - "When 'Space' is held and used as a modifier:\n" - "\u2022 Pressing the tools binding key switches to it immediately.\n" + "Open the popup tool-bar or brush asset popup\n" + "When holding 'Space' for the tool-bar popup:\n" + "\u2022 Pressing the a tool shortcut switches to it immediately.\n" "\u2022 Dragging the cursor over a tool and releasing activates it (like a pie menu).\n" "For Play use 'Shift-Space'", 0), @@ -88,7 +89,6 @@ class Prefs(bpy.types.KeyConfigPreferences): update=update_fn, ) - # Experimental: only show with developer extras, see: #107785. use_region_toggle_pie: BoolProperty( name="Region Toggle Pie", description=( @@ -140,6 +140,7 @@ class Prefs(bpy.types.KeyConfigPreferences): gizmo_action: EnumProperty( name="Activate Gizmo", + translation_context=i18n_contexts.editor_view3d, items=( ('PRESS', "Press", "Press causes immediate activation, preventing click being passed to the tool"), ('DRAG', "Drag", "Drag allows click events to pass through to the tool, adding a small delay"), @@ -295,9 +296,8 @@ class Prefs(bpy.types.KeyConfigPreferences): row = sub.row() row.prop(self, "use_select_all_toggle") - if show_developer_ui: - row = sub.row() - row.prop(self, "use_region_toggle_pie") + row = sub.row() + row.prop(self, "use_region_toggle_pie") # 3DView settings. col = layout.column() @@ -345,7 +345,7 @@ def load(): use_mouse_emulate_3_button=use_mouse_emulate_3_button, spacebar_action=kc_prefs.spacebar_action, use_key_activate_tools=(kc_prefs.tool_key_mode == 'TOOL'), - use_region_toggle_pie=(show_developer_ui and kc_prefs.use_region_toggle_pie), + use_region_toggle_pie=kc_prefs.use_region_toggle_pie, v3d_tilde_action=kc_prefs.v3d_tilde_action, use_v3d_mmb_pan=(kc_prefs.v3d_mmb_action == 'PAN'), v3d_alt_mmb_drag_action=kc_prefs.v3d_alt_mmb_drag_action, diff --git a/scripts/presets/keyconfig/fa_hotkeys.py b/scripts/presets/keyconfig/fa_hotkeys.py index 6860ec1..7789fe7 100644 --- a/scripts/presets/keyconfig/fa_hotkeys.py +++ b/scripts/presets/keyconfig/fa_hotkeys.py @@ -1,4 +1,4 @@ -keyconfig_version = (5, 0, 118) +keyconfig_version = (5, 0, 120) keyconfig_data = \ [("3D View", {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, @@ -614,14 +614,14 @@ keyconfig_data = \ ("wm.call_menu_pie", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, {"properties": - [("name", 'VIEW3D_MT_Pie_menu'), + [("name", 'MCP_MT_MarkingMenu'), ], }, ), ("wm.call_menu_pie", {"type": 'SPACE', "value": 'PRESS', "repeat": True}, {"properties": - [("name", 'PIE_MT_menu'), + [("name", 'MCP_MT_QuadMenu'), ], }, ), @@ -629,7 +629,7 @@ keyconfig_data = \ ("wm.call_menu_pie", {"type": 'T', "value": 'PRESS', "alt": True, "repeat": True}, {"properties": - [("name", 'VIEW3D_MT_tabs'), + [("name", 'MCP_MT_TabSwitcher'), ], }, ), @@ -650,7 +650,7 @@ keyconfig_data = \ ("wm.call_menu_pie", {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True}, {"properties": - [("name", 'VIEW3D_MT_AniPie_menu'), + [("name", 'MCP_MT_AnimationMenu'), ], }, ), @@ -1449,6 +1449,13 @@ keyconfig_data = \ ("action.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None), ("action.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None), ("action.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None), + ("wm.call_menu_pie", + {"type": 'ACCENT_GRAVE', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'DOPESHEET_MT_view_pie'), + ], + }, + ), ("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None), ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None), ("transform.transform", @@ -1863,6 +1870,13 @@ keyconfig_data = \ ("graph.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None), ("graph.view_selected", {"type": 'F', "value": 'PRESS'}, None), ("graph.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None), + ("wm.call_menu_pie", + {"type": 'ACCENT_GRAVE', "value": 'PRESS', "repeat": True}, + {"properties": + [("name", 'GRAPH_MT_view_pie'), + ], + }, + ), ("graph.fmodifier_add", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}, {"properties": @@ -2190,6 +2204,543 @@ keyconfig_data = \ ], }, ), + ("Node Generic", + {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'}, + {"items": + [("wm.context_toggle", + {"type": 'T', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.show_region_toolbar'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'N', "value": 'PRESS'}, + {"properties": + [("data_path", 'space_data.show_region_ui'), + ], + }, + ), + ], + }, + ), + ("Node Editor", + {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'}, + {"items": + [("node.select", + {"type": 'LEFTMOUSE', "value": 'CLICK'}, + {"properties": + [("select_passthrough", True), + ], + }, + ), + ("node.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, None), + ("node.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "alt": True}, None), + ("node.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True, "alt": True}, None), + ("node.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True}, + {"properties": + [("toggle", True), + ], + }, + ), + ("node.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True}, + {"properties": + [("toggle", True), + ], + }, + ), + ("node.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "alt": True}, + {"properties": + [("toggle", True), + ], + }, + ), + ("node.select", + {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True, "alt": True}, + {"properties": + [("toggle", True), + ], + }, + ), + ("wm.tool_set_by_id", + {"type": 'W', "value": 'PRESS'}, + {"properties": + [("name", 'builtin.select_box'), + ("cycle", True), + ], + }, + ), + ("node.select_box", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("tweak", True), + ], + }, + ), + ("node.select_lasso", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True, "alt": True}, + {"properties": + [("mode", 'ADD'), + ], + }, + ), + ("node.select_lasso", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True, "ctrl": True, "alt": True}, + {"properties": + [("mode", 'SUB'), + ], + }, + ), + ("node.select_box", + {"type": 'B', "value": 'PRESS'}, + {"properties": + [("tweak", False), + ], + }, + ), + ("node.select_circle", {"type": 'C', "value": 'PRESS'}, None), + ("node.link", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("detach", False), + ], + }, + ), + ("node.link", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": + [("detach", True), + ], + }, + ), + ("node.resize", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), + ("node.add_reroute", {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG', "shift": True}, None), + ("node.links_cut", {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, None), + ("node.links_mute", {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG', "ctrl": True, "alt": True}, None), + ("node.select_link_viewer", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None), + ("node.connect_to_output", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": + [("run_in_geometry_nodes", True), + ], + }, + ), + ("node.connect_to_output", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": + [("run_in_geometry_nodes", False), + ], + }, + ), + ("node.connect_to_output", + {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": + [("run_in_geometry_nodes", False), + ], + }, + ), + ("node.backimage_move", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "alt": True}, None), + ("node.backimage_zoom", + {"type": 'V', "value": 'PRESS', "repeat": True}, + {"properties": + [("factor", 0.8333333), + ], + }, + ), + ("node.backimage_zoom", + {"type": 'V', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": + [("factor", 1.2), + ], + }, + ), + ("node.backimage_fit", {"type": 'HOME', "value": 'PRESS', "alt": True}, None), + ("node.backimage_sample", {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True}, None), + ("node.link_make", + {"type": 'J', "value": 'PRESS'}, + {"properties": + [("replace", False), + ], + }, + ), + ("node.link_make", + {"type": 'J', "value": 'PRESS', "shift": True}, + {"properties": + [("replace", True), + ], + }, + ), + ("node.join_nodes", {"type": 'J', "value": 'PRESS', "ctrl": True}, None), + ("wm.call_menu", + {"type": 'A', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'NODE_MT_add'), + ], + }, + ), + ("wm.call_menu", + {"type": 'S', "value": 'PRESS', "shift": True}, + {"properties": + [("name", 'NODE_MT_swap'), + ], + }, + ), + ("node.duplicate_move", + {"type": 'D', "value": 'PRESS', "shift": True}, + {"properties": + [("NODE_OT_translate_attach", + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + ), + ], + }, + ), + ("node.duplicate_move_linked", + {"type": 'D', "value": 'PRESS', "alt": True}, + {"properties": + [("NODE_OT_translate_attach", + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + ), + ], + }, + ), + ("node.duplicate_move_keep_inputs", + {"type": 'D', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": + [("NODE_OT_translate_attach", + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + ), + ], + }, + ), + ("node.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None), + ("node.detach", {"type": 'P', "value": 'PRESS', "alt": True}, None), + ("node.join_named", {"type": 'F', "value": 'PRESS'}, None), + ("node.hide_toggle", {"type": 'H', "value": 'PRESS'}, None), + ("node.mute_toggle", {"type": 'M', "value": 'PRESS'}, None), + ("node.preview_toggle", {"type": 'H', "value": 'PRESS', "shift": True}, None), + ("node.hide_socket_toggle", {"type": 'H', "value": 'PRESS', "ctrl": True}, None), + ("node.view_all", {"type": 'HOME', "value": 'PRESS'}, None), + ("node.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None), + ("node.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None), + ("wm.call_menu_pie", + {"type": 'ACCENT_GRAVE', "value": 'PRESS'}, + {"properties": + [("name", 'NODE_MT_view_pie'), + ], + }, + ), + ("node.delete", {"type": 'X', "value": 'PRESS'}, None), + ("node.delete", {"type": 'DEL', "value": 'PRESS'}, None), + ("node.delete_reconnect", {"type": 'X', "value": 'PRESS', "ctrl": True}, None), + ("node.delete_reconnect", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None), + ("node.select_all", + {"type": 'A', "value": 'PRESS'}, + {"properties": + [("action", 'SELECT'), + ], + }, + ), + ("node.select_all", + {"type": 'A', "value": 'PRESS', "alt": True}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("node.select_all", + {"type": 'I', "value": 'PRESS', "ctrl": True}, + {"properties": + [("action", 'INVERT'), + ], + }, + ), + ("node.select_all", + {"type": 'A', "value": 'DOUBLE_CLICK'}, + {"properties": + [("action", 'DESELECT'), + ], + }, + ), + ("node.select_linked_to", {"type": 'L', "value": 'PRESS', "shift": True}, None), + ("node.select_linked_from", {"type": 'L', "value": 'PRESS'}, None), + ("node.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None), + ("node.select_grouped", + {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": + [("extend", True), + ], + }, + ), + ("node.select_same_type_step", + {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True}, + {"properties": + [("prev", False), + ], + }, + ), + ("node.select_same_type_step", + {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True}, + {"properties": + [("prev", True), + ], + }, + ), + ("node.find_node", {"type": 'F', "value": 'PRESS', "ctrl": True}, None), + ("node.group_make", {"type": 'G', "value": 'PRESS', "ctrl": True}, None), + ("node.group_ungroup", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None), + ("node.group_separate", {"type": 'P', "value": 'PRESS'}, None), + ("node.group_enter_exit", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None), + ("node.group_edit", + {"type": 'TAB', "value": 'PRESS'}, + {"properties": + [("exit", False), + ], + }, + ), + ("node.group_edit", + {"type": 'TAB', "value": 'PRESS', "ctrl": True}, + {"properties": + [("exit", True), + ], + }, + ), + ("node.read_viewlayers", {"type": 'R', "value": 'PRESS', "ctrl": True}, None), + ("node.render_changed", {"type": 'Z', "value": 'PRESS'}, None), + ("node.clipboard_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), + ("node.clipboard_paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), + ("node.translate_attach", + {"type": 'G', "value": 'PRESS'}, + {"properties": + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + }, + ), + ("node.translate_attach", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + }, + ), + ("transform.translate", + {"type": 'G', "value": 'PRESS'}, + {"properties": + [("view2d_edge_pan", True), + ], + }, + ), + ("transform.translate", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": + [("view2d_edge_pan", True), + ("release_confirm", True), + ], + }, + ), + ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None), + ("transform.resize", {"type": 'S', "value": 'PRESS'}, None), + ("node.move_detach_links_release", + {"type": 'RIGHTMOUSE', "value": 'CLICK_DRAG', "alt": True}, + {"properties": + [("NODE_OT_translate_attach", + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + ), + ], + }, + ), + ("node.move_detach_links", + {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "alt": True}, + {"properties": + [("TRANSFORM_OT_translate", + [("view2d_edge_pan", True), + ], + ), + ], + }, + ), + ("wm.context_toggle", + {"type": 'TAB', "value": 'PRESS', "shift": True}, + {"properties": + [("data_path", 'tool_settings.use_snap_node'), + ], + }, + ), + ("wm.context_toggle", + {"type": 'Z', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": + [("data_path", 'space_data.overlay.show_overlays'), + ], + }, + ), + ("wm.call_menu", + {"type": 'RIGHTMOUSE', "value": 'PRESS'}, + {"properties": + [("name", 'NODE_MT_context_menu'), + ], + }, + ), + ("wm.call_menu", + {"type": 'APP', "value": 'PRESS'}, + {"properties": + [("name", 'NODE_MT_context_menu'), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'ONE', "value": 'PRESS'}, + {"properties": + [("viewer_index", 1), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'TWO', "value": 'PRESS'}, + {"properties": + [("viewer_index", 2), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'THREE', "value": 'PRESS'}, + {"properties": + [("viewer_index", 3), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'FOUR', "value": 'PRESS'}, + {"properties": + [("viewer_index", 4), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'FIVE', "value": 'PRESS'}, + {"properties": + [("viewer_index", 5), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'SIX', "value": 'PRESS'}, + {"properties": + [("viewer_index", 6), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'SEVEN', "value": 'PRESS'}, + {"properties": + [("viewer_index", 7), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'EIGHT', "value": 'PRESS'}, + {"properties": + [("viewer_index", 8), + ], + }, + ), + ("node.viewer_shortcut_get", + {"type": 'NINE', "value": 'PRESS'}, + {"properties": + [("viewer_index", 9), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'ONE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 1), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'TWO', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 2), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'THREE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 3), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'FOUR', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 4), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'FIVE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 5), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'SIX', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 6), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'SEVEN', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 7), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'EIGHT', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 8), + ], + }, + ), + ("node.viewer_shortcut_set", + {"type": 'NINE', "value": 'PRESS', "ctrl": True}, + {"properties": + [("viewer_index", 9), + ], + }, + ), + ], + }, + ), + ("Knife Tool Modal Map", {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True}, {"items": @@ -3188,7 +3739,7 @@ keyconfig_data = \ }, ), ("object.pivotlock", {"type": 'V', "value": 'PRESS', "ctrl": True, "repeat": True}, None), - ("object.hideorigin", {"type": 'D', "value": 'PRESS', "repeat": True}, None), + ("mcp.toggle_affect_origins_scene", {"type": 'D', "value": 'PRESS', "repeat": True}, None), ("theme.double", {"type": 'B', "value": 'PRESS', "alt": True, "repeat": True}, None), ("object.keygridsnap", {"type": 'G', "value": 'PRESS', "key_modifier": 'D', "repeat": True}, None), ("object.keyvertexsnap", {"type": 'V', "value": 'PRESS', "key_modifier": 'D', "repeat": True}, None), @@ -3326,11 +3877,8 @@ keyconfig_data = \ ("outliner.item_drag_drop", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), ("outliner.item_drag_drop", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, None), ("outliner.show_hierarchy", {"type": 'HOME', "value": 'PRESS', "repeat": True}, None), - ("outliner.show_active", - {"type": 'NUMPAD_PERIOD', "value": 'PRESS', "repeat": True}, - { "active":False, - }, - ), + ("outliner.show_active", {"type": 'PERIOD', "value": 'PRESS', "repeat": True}, None), + ("outliner.show_active", {"type": 'NUMPAD_PERIOD', "value": 'PRESS', "repeat": True}, None), ("outliner.scroll_page", {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True}, {"properties": @@ -3500,7 +4048,6 @@ keyconfig_data = \ ], }, ), - ("outliner.show_active", {"type": 'F', "value": 'PRESS', "repeat": True}, None), ("outliner.item_rename", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None), ("object.move_to_collection", {"type": 'G', "value": 'PRESS', "ctrl": True}, None), ("outliner.delete", {"type": 'X', "value": 'PRESS'}, None), @@ -4599,8 +5146,12 @@ keyconfig_data = \ [("view2d.scroller_activate", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), ("view2d.scroller_activate", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None), ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None), + ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None), + ("view2d.pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None), ("view2d.scroll_right", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("view2d.scroll_right", {"type": 'WHEELRIGHTMOUSE', "value": 'PRESS'}, None), ("view2d.scroll_left", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("view2d.scroll_left", {"type": 'WHEELLEFTMOUSE', "value": 'PRESS'}, None), ("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True}, None), ("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True}, None), ("view2d.ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None), diff --git a/scripts/presets/keyconfig/keymap_data/blender_default.py b/scripts/presets/keyconfig/keymap_data/blender_default.py index a876021..79f5b37 100644 --- a/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -96,7 +96,7 @@ class Params: # # NOTE: This is typically used for active tool key-map items however it should never # be used for selection tools (the default box-select tool for example). - # Since this means with RMB select enabled in edit-mode for e.g. + # Since this means with RMB select enabled in edit-mode for example # `Ctrl-LMB` would be caught by box-select instead of add/extrude. "tool_maybe_tweak_event", ) @@ -235,6 +235,27 @@ NUMBERS_1 = ('ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NI # Numeric order. NUMBERS_0 = ('ZERO', 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE') +NUMPAD_1 = ( + 'NUMPAD_1', + 'NUMPAD_2', + 'NUMPAD_3', + 'NUMPAD_4', + 'NUMPAD_5', + 'NUMPAD_6', + 'NUMPAD_7', + 'NUMPAD_8', + 'NUMPAD_9', + 'NUMPAD_0', +) + +# Keys used for view zoom ratio operators. +NUMPAD_ZOOM = ( + 'NUMPAD_1', + 'NUMPAD_2', + 'NUMPAD_4', + 'NUMPAD_8', +) + # ------------------------------------------------------------------------------ # Generic Utilities @@ -246,7 +267,7 @@ def _fallback_id(text, fallback): def any_except(*args): - mod = {"ctrl": -1, "alt": -1, "shift": -1, "oskey": -1} + mod = {"ctrl": -1, "alt": -1, "shift": -1, "oskey": -1, "hyper": -1} for arg in args: del mod[arg] return mod @@ -267,8 +288,18 @@ def op_panel(menu, kmi_args, kmi_data=()): return ("wm.call_panel", kmi_args, {"properties": [("name", menu), *kmi_data]}) -def op_asset_shelf_popup(asset_shelf, kmi_args): - return ("wm.call_asset_shelf_popover", kmi_args, {"properties": [("name", asset_shelf)]}) +def _template_asset_shelf_popup(asset_shelf, spacebar_action): + if spacebar_action == 'SEARCH': + return [] + + if spacebar_action == 'PLAY': + kmi_args = {"type": 'SPACE', "value": 'PRESS', "shift": True} + elif spacebar_action == 'TOOL': + kmi_args = {"type": 'SPACE', "value": 'PRESS'} + else: + assert False, "unreachable" + + return [("wm.call_asset_shelf_popover", kmi_args, {"properties": [("name", asset_shelf)]})] def op_tool(tool, kmi_args): @@ -316,7 +347,7 @@ def _template_space_region_type_toggle( items = [] if params.use_region_toggle_pie: - pie_key = sidebar_key or sidebar_key or channels_key + pie_key = sidebar_key or toolbar_key or channels_key if pie_key is not None: items.append(op_menu_pie("WM_MT_region_toggle_pie", pie_key)) return items @@ -455,7 +486,7 @@ def _template_items_object_subdivision_set(): return [ ("object.subdivision_set", {"type": NUMBERS_0[i], "value": 'PRESS', "ctrl": True}, - {"properties": [("level", i), ("relative", False)]}) + {"properties": [("level", i), ("relative", False), ("ensure_modifier", True)]}) for i in range(6) ] @@ -513,11 +544,14 @@ def _template_items_uv_select_mode(params): op_menu("IMAGE_MT_uvs_select_mode", {"type": 'TAB', "value": 'PRESS', "ctrl": True}), *_template_items_editmode_mesh_select_mode(params), - # Hack to prevent fall-through, when sync select isn't enabled (and the island button isn't visible). - ("mesh.select_mode", {"type": 'FOUR', "value": 'PRESS'}, None), *(("uv.select_mode", {"type": NUMBERS_1[i], "value": 'PRESS'}, {"properties": [("type", e)]}) - for i, e in enumerate(('VERTEX', 'EDGE', 'FACE', 'ISLAND'))) + for i, e in enumerate(('VERTEX', 'EDGE', 'FACE'))), + # Prior to v5.0 UV island was exposed as a selection mode. + # Even though it's not longer a distinct mode, keep the shortcut + # as it's handy and visually the 4th item in the UI. + ("wm.context_toggle", {"type": 'FOUR', "value": 'PRESS'}, + {"properties": [("data_path", "tool_settings.use_uv_select_island")]}), ] @@ -582,7 +616,7 @@ def _template_items_tool_select( if params.select_mouse == 'LEFTMOUSE': # Use 'PRESS' for immediate select without delay. # Tools that allow dragging anywhere should _NOT_ enable the fallback tool - # unless it is expected that the tool should operate on the selection (click-drag to rip for e.g.). + # unless it is expected that the tool should operate on the selection (click-drag to rip for example). return [ (operator, {"type": 'LEFTMOUSE', "value": 'PRESS'}, {"properties": [ @@ -718,13 +752,13 @@ def km_window(params): # NDOF settings op_panel("USERPREF_PT_ndof_settings", {"type": 'NDOF_BUTTON_MENU', "value": 'PRESS'}), ("wm.context_scale_float", {"type": 'NDOF_BUTTON_PLUS', "value": 'PRESS'}, - {"properties": [("data_path", "preferences.inputs.ndof_sensitivity"), ("value", 1.1)]}), + {"properties": [("data_path", "preferences.inputs.ndof_translation_sensitivity"), ("value", 1.1)]}), ("wm.context_scale_float", {"type": 'NDOF_BUTTON_MINUS', "value": 'PRESS'}, - {"properties": [("data_path", "preferences.inputs.ndof_sensitivity"), ("value", 1.0 / 1.1)]}), + {"properties": [("data_path", "preferences.inputs.ndof_translation_sensitivity"), ("value", 1.0 / 1.1)]}), ("wm.context_scale_float", {"type": 'NDOF_BUTTON_PLUS', "value": 'PRESS', "shift": True}, - {"properties": [("data_path", "preferences.inputs.ndof_sensitivity"), ("value", 1.5)]}), + {"properties": [("data_path", "preferences.inputs.ndof_translation_sensitivity"), ("value", 1.5)]}), ("wm.context_scale_float", {"type": 'NDOF_BUTTON_MINUS', "value": 'PRESS', "shift": True}, - {"properties": [("data_path", "preferences.inputs.ndof_sensitivity"), ("value", 2.0 / 3.0)]}), + {"properties": [("data_path", "preferences.inputs.ndof_translation_sensitivity"), ("value", 2.0 / 3.0)]}), ("info.reports_display_update", {"type": 'TIMER_REPORT', "value": 'ANY', "any": True}, None), ]) @@ -805,6 +839,10 @@ def km_screen(params): {"properties": [("use_viewport", True)]}), ("render.render", {"type": 'F12', "value": 'PRESS', "ctrl": True}, {"properties": [("animation", True), ("use_viewport", True)]}), + ("render.render", {"type": 'F12', "value": 'PRESS', "alt": True}, + {"properties": [("use_sequencer_scene", True), ("use_viewport", True)]}), + ("render.render", {"type": 'F12', "value": 'PRESS', "ctrl": True, "alt": True}, + {"properties": [("animation", True), ("use_sequencer_scene", True), ("use_viewport", True)]}), ("render.view_cancel", {"type": 'ESC', "value": 'PRESS'}, None), ("render.view_show", {"type": 'F11', "value": 'PRESS'}, None), ("render.play_rendered_anim", {"type": 'F11', "value": 'PRESS', "ctrl": True}, None), @@ -852,9 +890,11 @@ def km_screen(params): def km_screen_editing(params): items = [] - keymap = ("Screen Editing", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}) + keymap = ( + "Screen Editing", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": items}, + ) items.extend([ # Action zones @@ -870,10 +910,13 @@ def km_screen_editing(params): ("screen.area_dupli", {"type": 'ACTIONZONE_AREA', "value": 'ANY', "shift": True}, None), ("screen.area_swap", {"type": 'ACTIONZONE_AREA', "value": 'ANY', "ctrl": True}, None), ("screen.region_scale", {"type": 'ACTIONZONE_REGION', "value": 'ANY'}, None), + ("screen.quadview_size", {"type": 'ACTIONZONE_REGION_QUAD', "value": 'ANY'}, None), ("screen.screen_full_area", {"type": 'ACTIONZONE_FULLSCREEN', "value": 'ANY'}, {"properties": [("use_hide_panels", True)]}), # Area move after action zones ("screen.area_move", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("screen.area_move", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, + {"properties": [("snap", True)]}), ("screen.area_options", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None), ]) @@ -918,7 +961,9 @@ def km_view2d(_params): ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None), ("view2d.pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None), ("view2d.scroll_right", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("view2d.scroll_right", {"type": 'WHEELRIGHTMOUSE', "value": 'PRESS'}, None), ("view2d.scroll_left", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True}, None), + ("view2d.scroll_left", {"type": 'WHEELLEFTMOUSE', "value": 'PRESS'}, None), ("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True}, None), ("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True}, None), ("view2d.ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None), @@ -992,6 +1037,7 @@ def km_user_interface(_params): ("ui.eyedropper_colorramp_point", {"type": 'E', "value": 'PRESS', "alt": True}, None), ("ui.eyedropper_id", {"type": 'E', "value": 'PRESS'}, None), ("ui.eyedropper_depth", {"type": 'E', "value": 'PRESS'}, None), + ("ui.eyedropper_bone", {"type": 'E', "value": 'PRESS'}, None), # Copy data path ("ui.copy_data_path_button", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True}, None), ("ui.copy_data_path_button", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, @@ -1014,6 +1060,15 @@ def km_user_interface(_params): ("ui.view_start_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None), ("ui.view_scroll", {"type": 'WHEELUPMOUSE', "value": 'ANY'}, None), ("ui.view_scroll", {"type": 'WHEELDOWNMOUSE', "value": 'ANY'}, None), + ("ui.view_scroll", {"type": 'TRACKPADPAN', "value": 'ANY'}, None), + ("ui.view_item_select", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("ui.view_item_select", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, + {"properties": [("extend", True)]}), + ("ui.view_item_select", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": [("range_select", True)]}), + ("ui.view_item_rename", {"type": 'F2', "value": 'PRESS'}, None), + ("ui.view_item_delete", {"type": 'X', "value": 'PRESS'}, None), + ("ui.view_item_delete", {"type": 'DEL', "value": 'PRESS'}, None), ]) return keymap @@ -1126,6 +1181,10 @@ def km_markers(params): {"properties": [("extend", True), ("camera", True)]}), ("marker.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG'}, {"properties": [("tweak", True)]}), + ("marker.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG', "shift": True}, + {"properties": [("tweak", True), ("mode", 'ADD')]}), + ("marker.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": [("tweak", True), ("mode", 'SUB')]}), ("marker.select_box", {"type": 'B', "value": 'PRESS'}, None), *_template_items_select_actions(params, "marker.select_all"), ("marker.delete", {"type": 'X', "value": 'PRESS'}, None), @@ -1209,6 +1268,41 @@ def km_property_editor(_params): return keymap +# ------------------------------------------------------------------------------ +# Editor (Preferences) + +def km_preferences(_params): + items = [] + keymap = ( + "Preferences", + {"space_type": 'PREFERENCES', "region_type": 'WINDOW'}, + {"items": items}, + ) + + items.extend([ + ("preferences.start_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None), + ("preferences.clear_filter", {"type": 'F', "value": 'PRESS', "alt": True}, None), + ]) + + return keymap + + +def km_preferences_nav(_params): + items = [] + keymap = ( + "Preferences_nav", + {"space_type": 'PREFERENCES', "region_type": 'UI'}, + {"items": items}, + ) + + items.extend([ + ("preferences.start_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None), + ("preferences.clear_filter", {"type": 'F', "value": 'PRESS', "alt": True}, None), + ]) + + return keymap + + # ------------------------------------------------------------------------------ # Editor (Outliner) @@ -1247,22 +1341,20 @@ def km_outliner(params): {"properties": [("tweak", True), ("mode", 'ADD')]}), ("outliner.select_box", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, {"properties": [("tweak", True), ("mode", 'SUB')]}), - ("outliner.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, - {"properties": [("direction", 'UP')]}), - ("outliner.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, - {"properties": [("direction", 'UP'), ("extend", True)]}), - ("outliner.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, - {"properties": [("direction", 'DOWN')]}), - ("outliner.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, - {"properties": [("direction", 'DOWN'), ("extend", True)]}), - ("outliner.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS', "repeat": True}, - {"properties": [("direction", 'LEFT')]}), - ("outliner.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, - {"properties": [("direction", 'LEFT'), ("toggle_all", True)]}), - ("outliner.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS', "repeat": True}, - {"properties": [("direction", 'RIGHT')]}), - ("outliner.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, - {"properties": [("direction", 'RIGHT'), ("toggle_all", True)]}), + *[ + ( + "outliner.select_walk", + {"type": d + '_ARROW', "value": 'PRESS', **key_shift, "repeat": True}, + {"properties": [("direction", d), *prop_shift]}, + ) + for d, shift_prop in ( + ('UP', (("extend", True),)), + ('DOWN', (("extend", True),)), + ('LEFT', (("toggle_all", True),)), + ('RIGHT', (("toggle_all", True),)), + ) + for key_shift, prop_shift in (({}, ()), ({"shift": True}, shift_prop)) + ], ("outliner.item_openclose", {"type": 'LEFTMOUSE', "value": 'CLICK'}, {"properties": [("all", False)]}), ("outliner.item_openclose", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True}, @@ -1296,8 +1388,8 @@ def km_outliner(params): ("outliner.collection_new", {"type": 'C', "value": 'PRESS'}, None), ("outliner.delete", {"type": 'X', "value": 'PRESS'}, None), ("outliner.delete", {"type": 'DEL', "value": 'PRESS'}, None), - ("object.move_to_collection", {"type": 'M', "value": 'PRESS'}, None), - ("object.link_to_collection", {"type": 'M', "value": 'PRESS', "shift": True}, None), + op_menu("OBJECT_MT_move_to_collection", {"type": 'M', "value": 'PRESS'}), + op_menu("OBJECT_MT_link_to_collection", {"type": 'M', "value": 'PRESS', "shift": True}), ("outliner.collection_exclude_set", {"type": 'E', "value": 'PRESS'}, None), ("outliner.collection_exclude_clear", {"type": 'E', "value": 'PRESS', "alt": True}, None), ("outliner.hide", {"type": 'H', "value": 'PRESS'}, None), @@ -1307,6 +1399,7 @@ def km_outliner(params): # Copy/paste. ("outliner.id_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), ("outliner.id_paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), + *_template_object_hide_collection_from_number_keys(), ]) return keymap @@ -1354,7 +1447,7 @@ def km_uv_editor(params): ("uv.select_box", {"type": 'B', "value": 'PRESS'}, {"properties": [("pinned", False)]}), (op_tool, "builtin.select_box"), params), - ("uv.select_box", {"type": 'B', "value": 'PRESS', "ctrl": True}, + ("uv.select_box", {"type": 'B', "value": 'PRESS', "alt": True}, {"properties": [("pinned", True)]}), op_tool_optional( ("uv.select_circle", {"type": 'C', "value": 'PRESS'}, None), @@ -1377,12 +1470,36 @@ def km_uv_editor(params): op_menu("IMAGE_MT_uvs_merge", {"type": 'M', "value": 'PRESS'}), op_menu("IMAGE_MT_uvs_split", {"type": 'M', "value": 'PRESS', "alt": True}), op_menu("IMAGE_MT_uvs_align", {"type": 'W', "value": 'PRESS', "shift": True}), + *[ + ( + "uv.move_on_axis", + {"type": key, "value": 'PRESS', **mod_dict}, + {"properties": [("axis", axis), ("type", move_type), ("distance", distance)]}, + ) + for mod_dict, move_type in ( + ({"ctrl": True}, 'DYNAMIC'), + ({"shift": True}, 'PIXEL'), + ({}, 'UDIM'), + ) + for key, axis, distance in ( + ('NUMPAD_8', 'Y', 1), + ('NUMPAD_2', 'Y', -1), + ('NUMPAD_6', 'X', 1), + ('NUMPAD_4', 'X', -1), + ) + ], ("uv.stitch", {"type": 'V', "value": 'PRESS', "alt": True}, None), ("uv.rip_move", {"type": 'V', "value": 'PRESS'}, None), ("uv.pin", {"type": 'P', "value": 'PRESS'}, {"properties": [("clear", False)]}), ("uv.pin", {"type": 'P', "value": 'PRESS', "alt": True}, {"properties": [("clear", True)]}), + ("uv.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), + ("uv.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), + ("uv.custom_region_set", {"type": 'B', "value": 'PRESS', "ctrl": True}, None), + ("wm.context_toggle", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True}, + {"properties": [("data_path", "tool_settings.use_uv_custom_region")]}), + op_menu("IMAGE_MT_uvs_unwrap", {"type": 'U', "value": 'PRESS'}), ( op_menu_pie("IMAGE_MT_uvs_snap_pie", {"type": 'S', "value": 'PRESS', "shift": True}) @@ -1507,6 +1624,10 @@ def km_view3d(params): ("view3d.rotate", {"type": 'TRACKPADPAN', "value": 'ANY'}, None), ("view3d.move", {"type": 'TRACKPADPAN', "value": 'ANY', "shift": True}, None), )), + ("view3d.view_pan", {"type": 'WHEELLEFTMOUSE', "value": 'PRESS'}, + {"properties": [("type", 'PANLEFT')]}), + ("view3d.view_pan", {"type": 'WHEELRIGHTMOUSE', "value": 'PRESS'}, + {"properties": [("type", 'PANRIGHT')]}), ("view3d.zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None), ("view3d.dolly", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None), ("view3d.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS', "ctrl": True}, @@ -1515,26 +1636,28 @@ def km_view3d(params): ("view3d.smoothview", {"type": 'TIMER1', "value": 'ANY', "any": True}, None), ("view3d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None), ("view3d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None), - ("view3d.zoom", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "repeat": True}, - {"properties": [("delta", 1)]}), - ("view3d.zoom", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "repeat": True}, - {"properties": [("delta", -1)]}), - ("view3d.zoom", {"type": 'EQUAL', "value": 'PRESS', "ctrl": True, "repeat": True}, - {"properties": [("delta", 1)]}), - ("view3d.zoom", {"type": 'MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, - {"properties": [("delta", -1)]}), - ("view3d.zoom", {"type": 'WHEELINMOUSE', "value": 'PRESS'}, - {"properties": [("delta", 1)]}), - ("view3d.zoom", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, - {"properties": [("delta", -1)]}), - ("view3d.dolly", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True, "repeat": True}, - {"properties": [("delta", 1)]}), - ("view3d.dolly", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True, "repeat": True}, - {"properties": [("delta", -1)]}), - ("view3d.dolly", {"type": 'EQUAL', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, - {"properties": [("delta", 1)]}), - ("view3d.dolly", {"type": 'MINUS', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, - {"properties": [("delta", -1)]}), + *(( + "view3d.zoom", + {"type": key, "value": 'PRESS', **mods}, + {"properties": [("delta", delta)]}, + ) for key, delta, mods in ( + ('NUMPAD_PLUS', 1, {"repeat": True}), + ('NUMPAD_MINUS', -1, {"repeat": True}), + ('EQUAL', 1, {"ctrl": True, "repeat": True}), + ('MINUS', -1, {"ctrl": True, "repeat": True}), + ('WHEELINMOUSE', 1, {}), + ('WHEELOUTMOUSE', -1, {}), + )), + *(( + "view3d.dolly", + {"type": key, "value": 'PRESS', "shift": True, "repeat": True, **mods}, + {"properties": [("delta", delta)]}, + ) for key, delta, mods in ( + ('NUMPAD_PLUS', 1, {}), + ('NUMPAD_MINUS', -1, {}), + ('EQUAL', 1, {"ctrl": True}), + ('MINUS', -1, {"ctrl": True}), + )), ("view3d.view_center_camera", {"type": 'HOME', "value": 'PRESS'}, None), ("view3d.view_center_lock", {"type": 'HOME', "value": 'PRESS'}, None), ("view3d.view_all", {"type": 'HOME', "value": 'PRESS'}, @@ -1552,77 +1675,85 @@ def km_view3d(params): ("view3d.navigate", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "shift": True}, None), # Numpad views. ("view3d.view_camera", {"type": 'NUMPAD_0', "value": 'PRESS'}, None), - ("view3d.view_axis", {"type": 'NUMPAD_1', "value": 'PRESS'}, - {"properties": [("type", 'FRONT')]}), + *(( + "view3d.view_axis", + {"type": numpad_key, "value": 'PRESS', **default_mod, **opposite_mod}, + {"properties": [("type", axis_type)]}, + ) + for default_mod, opposite_mod, axis_pairs in ( + ({}, {}, ( + ('NUMPAD_1', 'FRONT'), + ('NUMPAD_3', 'RIGHT'), + ('NUMPAD_7', 'TOP'), + )), + ({}, {"ctrl": True}, ( + ('NUMPAD_1', 'BACK'), + ('NUMPAD_3', 'LEFT'), + ('NUMPAD_7', 'BOTTOM'), + )), + ) + for numpad_key, axis_type in axis_pairs + ), ("view3d.view_orbit", {"type": 'NUMPAD_2', "value": 'PRESS', "repeat": True}, {"properties": [("type", 'ORBITDOWN')]}), - ("view3d.view_axis", {"type": 'NUMPAD_3', "value": 'PRESS'}, - {"properties": [("type", 'RIGHT')]}), ("view3d.view_orbit", {"type": 'NUMPAD_4', "value": 'PRESS', "repeat": True}, {"properties": [("type", 'ORBITLEFT')]}), ("view3d.view_persportho", {"type": 'NUMPAD_5', "value": 'PRESS'}, None), ("view3d.view_orbit", {"type": 'NUMPAD_6', "value": 'PRESS', "repeat": True}, {"properties": [("type", 'ORBITRIGHT')]}), - ("view3d.view_axis", {"type": 'NUMPAD_7', "value": 'PRESS'}, - {"properties": [("type", 'TOP')]}), ("view3d.view_orbit", {"type": 'NUMPAD_8', "value": 'PRESS', "repeat": True}, {"properties": [("type", 'ORBITUP')]}), - ("view3d.view_axis", {"type": 'NUMPAD_1', "value": 'PRESS', "ctrl": True}, - {"properties": [("type", 'BACK')]}), - ("view3d.view_axis", {"type": 'NUMPAD_3', "value": 'PRESS', "ctrl": True}, - {"properties": [("type", 'LEFT')]}), - ("view3d.view_axis", {"type": 'NUMPAD_7', "value": 'PRESS', "ctrl": True}, - {"properties": [("type", 'BOTTOM')]}), - ("view3d.view_pan", {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True, "repeat": True}, - {"properties": [("type", 'PANDOWN')]}), - ("view3d.view_pan", {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True, "repeat": True}, - {"properties": [("type", 'PANLEFT')]}), - ("view3d.view_pan", {"type": 'NUMPAD_6', "value": 'PRESS', "ctrl": True, "repeat": True}, - {"properties": [("type", 'PANRIGHT')]}), - ("view3d.view_pan", {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True, "repeat": True}, - {"properties": [("type", 'PANUP')]}), + *(( + "view3d.view_pan", + {"type": numpad_key, "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": [("type", pan_type)]}, + ) for numpad_key, pan_type in ( + ('NUMPAD_2', 'PANDOWN'), + ('NUMPAD_4', 'PANLEFT'), + ('NUMPAD_6', 'PANRIGHT'), + ('NUMPAD_8', 'PANUP'), + )), ("view3d.view_roll", {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True, "repeat": True}, {"properties": [("type", 'LEFT')]}), ("view3d.view_roll", {"type": 'NUMPAD_6', "value": 'PRESS', "shift": True, "repeat": True}, {"properties": [("type", 'RIGHT')]}), ("view3d.view_orbit", {"type": 'NUMPAD_9', "value": 'PRESS'}, {"properties": [("angle", pi), ("type", 'ORBITRIGHT')]}), - ("view3d.view_axis", {"type": 'NUMPAD_1', "value": 'PRESS', "shift": True}, - {"properties": [("type", 'FRONT'), ("align_active", True)]}), - ("view3d.view_axis", {"type": 'NUMPAD_3', "value": 'PRESS', "shift": True}, - {"properties": [("type", 'RIGHT'), ("align_active", True)]}), - ("view3d.view_axis", {"type": 'NUMPAD_7', "value": 'PRESS', "shift": True}, - {"properties": [("type", 'TOP'), ("align_active", True)]}), - ("view3d.view_axis", {"type": 'NUMPAD_1', "value": 'PRESS', "shift": True, "ctrl": True}, - {"properties": [("type", 'BACK'), ("align_active", True)]}), - ("view3d.view_axis", {"type": 'NUMPAD_3', "value": 'PRESS', "shift": True, "ctrl": True}, - {"properties": [("type", 'LEFT'), ("align_active", True)]}), - ("view3d.view_axis", {"type": 'NUMPAD_7', "value": 'PRESS', "shift": True, "ctrl": True}, - {"properties": [("type", 'BOTTOM'), ("align_active", True)]}), *(( - ("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'NORTH', "alt": True}, - {"properties": [("type", 'TOP'), ("relative", True)]}), - ("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'SOUTH', "alt": True}, - {"properties": [("type", 'BOTTOM'), ("relative", True)]}), - ("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'EAST', "alt": True}, - {"properties": [("type", 'RIGHT'), ("relative", True)]}), - ("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'WEST', "alt": True}, - {"properties": [("type", 'LEFT'), ("relative", True)]}), - ) if params.v3d_alt_mmb_drag_action == 'RELATIVE' else ( - ("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'NORTH', "alt": True}, - {"properties": [("type", 'TOP')]}), - ("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'SOUTH', "alt": True}, - {"properties": [("type", 'BOTTOM')]}), - ("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'EAST', "alt": True}, - {"properties": [("type", 'RIGHT')]}), - ("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'WEST', "alt": True}, - {"properties": [("type", 'LEFT')]}), - ("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'NORTH_WEST', "alt": True}, - {"properties": [("type", 'FRONT')]}), - ("view3d.view_axis", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": 'NORTH_EAST', "alt": True}, - {"properties": [("type", 'BACK')]}), + "view3d.view_axis", + {"type": numpad_key, "value": 'PRESS', "shift": True, **opposite_mod}, + {"properties": [("type", axis_type), ("align_active", True)]}, + ) + for opposite_mod, axis_pairs in ( + ({}, ( + ('NUMPAD_1', 'FRONT'), + ('NUMPAD_3', 'RIGHT'), + ('NUMPAD_7', 'TOP'), + )), + ({"ctrl": True}, ( + ('NUMPAD_1', 'BACK'), + ('NUMPAD_3', 'LEFT'), + ('NUMPAD_7', 'BOTTOM'), + )), + ) + for numpad_key, axis_type in axis_pairs + ), + *([( + "view3d.view_axis", + {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": direction, "alt": True}, + {"properties": [("type", axis_type), * + ([("relative", True)] if params.v3d_alt_mmb_drag_action == 'RELATIVE' else [])]}, + ) + for direction, axis_type in ( + ('NORTH', 'TOP'), ('SOUTH', 'BOTTOM'), ('EAST', 'RIGHT'), ('WEST', 'LEFT'), + ) + ] + ([] if params.v3d_alt_mmb_drag_action == 'RELATIVE' else [ # Match the pie menu. - )), + ("view3d.view_axis", + {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG', "direction": direction, "alt": True}, + {"properties": [("type", axis_type)]}) + for direction, axis_type in (('NORTH_WEST', 'FRONT'), ('NORTH_EAST', 'BACK')) + ])), ("view3d.view_center_pick", {"type": 'MIDDLEMOUSE', "value": 'CLICK', "alt": True}, None), ("view3d.ndof_orbit_zoom", {"type": 'NDOF_MOTION', "value": 'ANY'}, None), ("view3d.ndof_orbit", {"type": 'NDOF_MOTION', "value": 'ANY', "ctrl": True}, None), @@ -1633,24 +1764,16 @@ def km_view3d(params): {"properties": [("angle", PI_2)]}), ("view3d.view_roll", {"type": 'NDOF_BUTTON_ROLL_CCW', "value": 'PRESS'}, {"properties": [("angle", -PI_2)]}), - ("view3d.view_axis", {"type": 'NDOF_BUTTON_FRONT', "value": 'PRESS'}, - {"properties": [("type", 'FRONT')]}), - ("view3d.view_axis", {"type": 'NDOF_BUTTON_BACK', "value": 'PRESS'}, - {"properties": [("type", 'BACK')]}), - ("view3d.view_axis", {"type": 'NDOF_BUTTON_LEFT', "value": 'PRESS'}, - {"properties": [("type", 'LEFT')]}), - ("view3d.view_axis", {"type": 'NDOF_BUTTON_RIGHT', "value": 'PRESS'}, - {"properties": [("type", 'RIGHT')]}), - ("view3d.view_axis", {"type": 'NDOF_BUTTON_TOP', "value": 'PRESS'}, - {"properties": [("type", 'TOP')]}), - ("view3d.view_axis", {"type": 'NDOF_BUTTON_BOTTOM', "value": 'PRESS'}, - {"properties": [("type", 'BOTTOM')]}), - ("view3d.view_axis", {"type": 'NDOF_BUTTON_FRONT', "value": 'PRESS', "shift": True}, - {"properties": [("type", 'FRONT'), ("align_active", True)]}), - ("view3d.view_axis", {"type": 'NDOF_BUTTON_RIGHT', "value": 'PRESS', "shift": True}, - {"properties": [("type", 'RIGHT'), ("align_active", True)]}), - ("view3d.view_axis", {"type": 'NDOF_BUTTON_TOP', "value": 'PRESS', "shift": True}, - {"properties": [("type", 'TOP'), ("align_active", True)]}), + *(( + "view3d.view_axis", + {"type": 'NDOF_BUTTON_' + axis_type, "value": 'PRESS'}, + {"properties": [("type", axis_type)]}, + ) for axis_type in ('FRONT', 'BACK', 'LEFT', 'RIGHT', 'TOP', 'BOTTOM')), + *(( + "view3d.view_axis", + {"type": 'NDOF_BUTTON_' + axis_type, "value": 'PRESS', "shift": True}, + {"properties": [("type", axis_type), ("align_active", True)]}, + ) for axis_type in ('FRONT', 'RIGHT', 'TOP')), # Selection. *_template_view3d_select( type=params.select_mouse, @@ -1724,26 +1847,39 @@ def km_view3d(params): ("view3d.zoom_camera_1_to_1", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "shift": True}, None), ("view3d.view_center_cursor", {"type": 'HOME', "value": 'PRESS', "alt": True}, None), ("view3d.view_center_pick", {"type": 'F', "value": 'PRESS', "alt": True}, None), - ("view3d.view_pan", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("type", 'PANRIGHT')]}), - ("view3d.view_pan", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("type", 'PANLEFT')]}), - ("view3d.view_pan", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("type", 'PANUP')]}), - ("view3d.view_pan", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("type", 'PANDOWN')]}), - ("view3d.view_orbit", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True, "alt": True}, - {"properties": [("type", 'ORBITLEFT')]}), - ("view3d.view_orbit", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True, "alt": True}, - {"properties": [("type", 'ORBITRIGHT')]}), - ("view3d.view_orbit", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True, "alt": True}, - {"properties": [("type", 'ORBITUP')]}), - ("view3d.view_orbit", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True, "alt": True}, - {"properties": [("type", 'ORBITDOWN')]}), - ("view3d.view_roll", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, - {"properties": [("type", 'LEFT')]}), - ("view3d.view_roll", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, - {"properties": [("type", 'RIGHT')]}), + *(( + "view3d.view_pan", + {"type": wheel_key, "value": 'PRESS', **mod}, + {"properties": [("type", pan_type)]}, + ) for mod, wheel_pairs in ( + ({"ctrl": True}, ( + ('WHEELUPMOUSE', 'PANRIGHT'), + ('WHEELDOWNMOUSE', 'PANLEFT'), + )), + ({"shift": True}, ( + ('WHEELUPMOUSE', 'PANUP'), + ('WHEELDOWNMOUSE', 'PANDOWN'), + )), + ) for wheel_key, pan_type in wheel_pairs), + *(( + "view3d.view_orbit", + {"type": wheel_key, "value": 'PRESS', "alt": True, **mod}, + {"properties": [("type", orbit_type)]}, + ) for mod, wheel_pairs in ( + ({"ctrl": True}, ( + ('WHEELUPMOUSE', 'ORBITLEFT'), + ('WHEELDOWNMOUSE', 'ORBITRIGHT'), + )), + ({"shift": True}, ( + ('WHEELUPMOUSE', 'ORBITUP'), + ('WHEELDOWNMOUSE', 'ORBITDOWN'), + )), + ) for wheel_key, orbit_type in wheel_pairs), + *(( + "view3d.view_roll", + {"type": wheel_key, "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": [("type", roll_type)]}, + ) for wheel_key, roll_type in (('WHEELUPMOUSE', 'LEFT'), ('WHEELDOWNMOUSE', 'RIGHT'))), ("transform.create_orientation", {"type": 'SPACE', "value": 'PRESS', "ctrl": True, "alt": True}, {"properties": [("use", True)]}), ("transform.translate", {"type": 'T', "value": 'PRESS', "shift": True}, @@ -1811,8 +1947,8 @@ def km_graph_editor_generic(params): {"properties": [("only_active", False)]}), ("anim.channels_select_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None), *_template_items_hide_reveal_actions("graph.hide", "graph.reveal"), - ("wm.context_set_enum", {"type": 'TAB', "value": 'PRESS', "ctrl": True}, - {"properties": [("data_path", "area.type"), ("value", 'DOPESHEET_EDITOR')]}), + ("screen.space_type_set_or_cycle", {"type": 'TAB', "value": 'PRESS', "ctrl": True}, + {"properties": [("space_type", 'DOPESHEET_EDITOR')]}), ]) return keymap @@ -1829,6 +1965,8 @@ def km_graph_editor(params): items.extend([ ("wm.context_toggle", {"type": 'H', "value": 'PRESS', "ctrl": True}, {"properties": [("data_path", "space_data.show_handles")]}), + ("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True}, + {"properties": [("data_path", "tool_settings.use_snap_anim")]}), ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS'}, {"properties": [("deselect_all", not params.legacy)]}), ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "alt": True}, @@ -1894,10 +2032,6 @@ def km_graph_editor(params): ("graph.delete", {"type": 'DEL', "value": 'PRESS'}, {"properties": [("confirm", False)]}), ("graph.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None), ("graph.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None), - ("graph.keyframe_jump", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, - {"properties": [("next", True)]}), - ("graph.keyframe_jump", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, - {"properties": [("next", False)]}), ("graph.click_insert", {"type": params.action_mouse, "value": 'CLICK', "ctrl": True}, None), ("graph.click_insert", {"type": params.action_mouse, "value": 'CLICK', "shift": True, "ctrl": True}, {"properties": [("extend", True)]}), @@ -2020,26 +2154,15 @@ def km_image(params): ("image.view_zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None), ("image.view_zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None), ("image.view_zoom_border", {"type": 'B', "value": 'PRESS', "shift": True}, None), - ("image.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True}, - {"properties": [("ratio", 8.0)]}), - ("image.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True}, - {"properties": [("ratio", 4.0)]}), - ("image.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True}, - {"properties": [("ratio", 2.0)]}), - ("image.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "shift": True}, - {"properties": [("ratio", 8.0)]}), - ("image.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True}, - {"properties": [("ratio", 4.0)]}), - ("image.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "shift": True}, - {"properties": [("ratio", 2.0)]}), - ("image.view_zoom_ratio", {"type": 'NUMPAD_1', "value": 'PRESS'}, - {"properties": [("ratio", 1.0)]}), - ("image.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS'}, - {"properties": [("ratio", 0.5)]}), - ("image.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS'}, - {"properties": [("ratio", 0.25)]}), - ("image.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS'}, - {"properties": [("ratio", 0.125)]}), + *(( + "image.view_zoom_ratio", + {"type": key, "value": 'PRESS', **mod}, + {"properties": [("ratio", ratio)]}, + ) for mod, keys, ratios in ( + ({}, NUMPAD_ZOOM, (1.0, 0.5, 0.25, 0.125)), + ({"ctrl": True}, NUMPAD_ZOOM, (1.0, 2.0, 4.0, 8.0)), + ({"shift": True}, NUMPAD_ZOOM, (1.0, 2.0, 4.0, 8.0)), + ) for key, ratio in zip(keys, ratios, strict=True)), ("image.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), ("image.sample", {"type": params.action_mouse, "value": 'PRESS'}, None), ("image.curves_point_set", {"type": params.action_mouse, "value": 'PRESS', "ctrl": True}, @@ -2072,9 +2195,9 @@ def km_image(params): items.extend([ # Old pivot. ("wm.context_set_enum", {"type": 'COMMA', "value": 'PRESS'}, - {"properties": [("data_path", "space_data.pivot_point"), ("value", 'CENTER')]}), + {"properties": [("data_path", "space_data.pivot_point"), ("value", 'BOUNDING_BOX_CENTER')]}), ("wm.context_set_enum", {"type": 'COMMA', "value": 'PRESS', "ctrl": True}, - {"properties": [("data_path", "space_data.pivot_point"), ("value", 'MEDIAN')]}), + {"properties": [("data_path", "space_data.pivot_point"), ("value", 'MEDIAN_POINT')]}), ("wm.context_set_enum", {"type": 'PERIOD', "value": 'PRESS'}, {"properties": [("data_path", "space_data.pivot_point"), ("value", 'CURSOR')]}), @@ -2179,11 +2302,13 @@ def km_node_editor(params): {"properties": [("factor", 1.2)]}), ("node.backimage_fit", {"type": 'HOME', "value": 'PRESS', "alt": True}, None), ("node.backimage_sample", {"type": params.action_mouse, "value": 'PRESS', "alt": True}, None), - ("node.link_make", {"type": 'F', "value": 'PRESS'}, + ("node.link_make", {"type": 'J', "value": 'PRESS'}, {"properties": [("replace", False)]}), - ("node.link_make", {"type": 'F', "value": 'PRESS', "shift": True}, + ("node.link_make", {"type": 'J', "value": 'PRESS', "shift": True}, {"properties": [("replace", True)]}), + ("node.join_nodes", {"type": 'J', "value": 'PRESS', "ctrl": True}, None), op_menu("NODE_MT_add", {"type": 'A', "value": 'PRESS', "shift": True}), + op_menu("NODE_MT_swap", {"type": 'S', "value": 'PRESS', "shift": True}), ("node.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, {"properties": [("NODE_OT_translate_attach", [("TRANSFORM_OT_translate", [("view2d_edge_pan", True)])])]}), ("node.duplicate_move_linked", {"type": 'D', "value": 'PRESS', "alt": True}, @@ -2192,7 +2317,7 @@ def km_node_editor(params): {"properties": [("NODE_OT_translate_attach", [("TRANSFORM_OT_translate", [("view2d_edge_pan", True)])])]}), ("node.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None), ("node.detach", {"type": 'P', "value": 'PRESS', "alt": True}, None), - ("node.join", {"type": 'J', "value": 'PRESS', "ctrl": True}, None), + ("node.join_named", {"type": 'F', "value": 'PRESS'}, None), ("node.hide_toggle", {"type": 'H', "value": 'PRESS'}, None), ("node.mute_toggle", {"type": 'M', "value": 'PRESS'}, None), ("node.preview_toggle", {"type": 'H', "value": 'PRESS', "shift": True}, None), @@ -2219,6 +2344,7 @@ def km_node_editor(params): ("node.group_make", {"type": 'G', "value": 'PRESS', "ctrl": True}, None), ("node.group_ungroup", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None), ("node.group_separate", {"type": 'P', "value": 'PRESS'}, None), + ("node.group_enter_exit", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None), ("node.group_edit", {"type": 'TAB', "value": 'PRESS'}, {"properties": [("exit", False)]}), ("node.group_edit", {"type": 'TAB', "value": 'PRESS', "ctrl": True}, @@ -2227,8 +2353,6 @@ def km_node_editor(params): ("node.render_changed", {"type": 'Z', "value": 'PRESS'}, None), ("node.clipboard_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), ("node.clipboard_paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), - ("node.viewer_border", {"type": 'B', "value": 'PRESS', "ctrl": True}, None), - ("node.clear_viewer_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True}, None), ("node.translate_attach", {"type": 'G', "value": 'PRESS'}, {"properties": [("TRANSFORM_OT_translate", [("view2d_edge_pan", True)])]}), @@ -2257,12 +2381,21 @@ def km_node_editor(params): {"type": params.select_mouse, "value": 'CLICK_DRAG', "alt": True}, {"properties": [("TRANSFORM_OT_translate", [("view2d_edge_pan", True)])]}), ("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True}, - {"properties": [("data_path", "tool_settings.use_snap_node")]}), - ("wm.context_menu_enum", {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True}, - {"properties": [("data_path", "tool_settings.snap_node_element")]}), + {"properties": [("data_path", 'tool_settings.use_snap_node')]}), ("wm.context_toggle", {"type": 'Z', "value": 'PRESS', "alt": True, "shift": True}, {"properties": [("data_path", "space_data.overlay.show_overlays")]}), *_template_items_context_menu("NODE_MT_context_menu", params.context_menu_event), + # Viewer shortcuts. + *( + ("node.viewer_shortcut_get", {"type": NUMBERS_0[i], "value": 'PRESS'}, + {"properties": [("viewer_index", i)]}) + for i in range(1, 10) + ), + *( + ("node.viewer_shortcut_set", {"type": NUMBERS_0[i], "value": 'PRESS', "ctrl": True}, + {"properties": [("viewer_index", i)]}) + for i in range(1, 10) + ), ]) return keymap @@ -2328,7 +2461,8 @@ def km_file_browser(params): ("file.next", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, None), ("wm.context_toggle", {"type": 'H', "value": 'PRESS'}, {"properties": [("data_path", "space_data.params.show_hidden")]}), - ("file.directory_new", {"type": 'I', "value": 'PRESS'}, None), + ("file.directory_new", {"type": 'I', "value": 'PRESS'}, + {"properties": [("confirm", False)]}), ("file.rename", {"type": 'F2', "value": 'PRESS'}, None), ("file.delete", {"type": 'X', "value": 'PRESS'}, None), ("file.delete", {"type": 'DEL', "value": 'PRESS'}, None), @@ -2388,30 +2522,19 @@ def km_file_browser_main(params): {"properties": [("extend", True), ("open", False)]}), ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True}, {"properties": [("extend", True), ("fill", True), ("open", False)]}), - ("file.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, - {"properties": [("direction", 'UP')]}), - ("file.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True}, - {"properties": [("direction", 'UP'), ("extend", True)]}), - ("file.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, - {"properties": [("direction", 'UP'), ("extend", True), ("fill", True)]}), - ("file.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, - {"properties": [("direction", 'DOWN')]}), - ("file.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, - {"properties": [("direction", 'DOWN'), ("extend", True)]}), - ("file.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, - {"properties": [("direction", 'DOWN'), ("extend", True), ("fill", True)]}), - ("file.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS', "repeat": True}, - {"properties": [("direction", 'LEFT')]}), - ("file.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, - {"properties": [("direction", 'LEFT'), ("extend", True)]}), - ("file.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, - {"properties": [("direction", 'LEFT'), ("extend", True), ("fill", True)]}), - ("file.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS', "repeat": True}, - {"properties": [("direction", 'RIGHT')]}), - ("file.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, - {"properties": [("direction", 'RIGHT'), ("extend", True)]}), - ("file.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, - {"properties": [("direction", 'RIGHT'), ("extend", True), ("fill", True)]}), + *[ + ( + "file.select_walk", + {"type": d + '_ARROW', "value": 'PRESS', **key_mod, "repeat": True}, + {"properties": [("direction", d), *prop_mod]}, + ) + for d in ('UP', 'DOWN', 'LEFT', 'RIGHT') + for key_mod, prop_mod in ( + ({}, ()), + ({"shift": True}, (("extend", True),)), + ({"shift": True, "ctrl": True}, (("extend", True), ("fill", True))), + ) + ], ("file.previous", {"type": 'BUTTON4MOUSE', "value": 'CLICK'}, None), ("file.next", {"type": 'BUTTON5MOUSE', "value": 'CLICK'}, None), *_template_items_select_actions(params, "file.select_all"), @@ -2557,6 +2680,7 @@ def km_dopesheet(params): ("action.easing_type", {"type": 'E', "value": 'PRESS', "ctrl": True}, None), ("action.keyframe_type", {"type": 'R', "value": 'PRESS'}, None), ("action.bake_keys", {"type": 'O', "value": 'PRESS', "shift": True, "alt": True}, None), + ("grease_pencil.layer_isolate", {"type": 'NUMPAD_ASTERIX', "value": 'PRESS'}, None), op_menu("DOPESHEET_MT_delete", {"type": 'X', "value": 'PRESS'}), ("action.delete", {"type": 'DEL', "value": 'PRESS'}, {"properties": [("confirm", False)]}), ("action.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None), @@ -2583,6 +2707,8 @@ def km_dopesheet(params): {"properties": [("mode", 'TIME_SCALE')]}), ("transform.transform", {"type": 'T', "value": 'PRESS', "shift": True}, {"properties": [("mode", 'TIME_SLIDE')]}), + ("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True}, + {"properties": [("data_path", "tool_settings.use_snap_anim")]}), *_template_items_proportional_editing( params, connected=False, toggle_data_path="tool_settings.use_proportional_action"), ("marker.add", {"type": 'M', "value": 'PRESS'}, None), @@ -2720,9 +2846,19 @@ def km_nla_editor(params): {"properties": [("mode", 'TIME_SCALE')]}), ("marker.add", {"type": 'M', "value": 'PRESS'}, None), *_template_items_context_menu("NLA_MT_context_menu", params.context_menu_event), - *_template_items_change_frame(params), ]) + if params.select_mouse == 'LEFTMOUSE' and not params.legacy: + items.extend([ + ("anim.change_frame", {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": [("seq_solo_preview", True)]}), + ]) + else: + items.extend([ + ("anim.change_frame", {"type": params.action_mouse, "value": 'PRESS'}, + {"properties": [("seq_solo_preview", True)]}), + ]) + return keymap @@ -2894,10 +3030,11 @@ def km_text(params): # ------------------------------------------------------------------------------ # Editor (Sequencer) -def km_sequencercommon(params): + +def km_sequencer_generic(params): items = [] keymap = ( - "SequencerCommon", + "Video Sequence Editor", {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, {"items": items}, ) @@ -2912,6 +3049,8 @@ def km_sequencercommon(params): {"properties": [("data_path", "scene.sequence_editor.show_overlay_frame")]}), ("wm.context_toggle_enum", {"type": 'TAB', "value": 'PRESS', "ctrl": True}, {"properties": [("data_path", "space_data.view_type"), ("value_1", 'SEQUENCER'), ("value_2", 'PREVIEW')]}), + ("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True}, + {"properties": [("data_path", "tool_settings.use_snap_sequencer")]}), ("sequencer.refresh_all", {"type": 'E', "value": 'PRESS', "ctrl": True}, None), ]) @@ -2934,7 +3073,43 @@ def km_sequencer(params): ) items.extend([ + *_template_sequencer_generic_select( + type=params.select_mouse, value=params.select_mouse_value_fallback, legacy=params.legacy, + ), + ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True}, + {"properties": [("linked_time", True)]}), + ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True, "shift": True}, + {"properties": [("linked_time", True), ("extend", True)]}), + ("sequencer.select", {"type": params.select_mouse, "value": 'CLICK', "ctrl": True}, + {"properties": [("side_of_frame", True)]}), + ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "alt": True}, + {"properties": [("deselect_all", True), ("ignore_connections", True)]}), + ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "alt": True, "shift": True}, + {"properties": [("toggle", True), ("ignore_connections", True)]}), + ("sequencer.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("sequencer.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("sequencer.select_linked_pick", {"type": 'L', "value": 'PRESS'}, None), + ("sequencer.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True}, + {"properties": [("extend", True)]}), + ("sequencer.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None), + ("sequencer.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG'}, + {"properties": [("tweak", True), ("mode", 'SET')]}), + ("sequencer.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG', "shift": True}, + {"properties": [("tweak", True), ("mode", 'ADD')]}), + ("sequencer.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": [("tweak", True), ("mode", 'SUB')]}), + ("sequencer.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG', "alt": True}, + {"properties": [("tweak", True), ("ignore_connections", True), ("mode", 'SET')]}), + ("sequencer.select_box", {"type": 'B', "value": 'PRESS'}, None), + ("sequencer.select_box", {"type": 'B', "value": 'PRESS', "ctrl": True}, + {"properties": [("include_handles", True)]}), + ("sequencer.select_circle", {"type": 'C', "value": 'PRESS'}, None), + ("sequencer.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None), *_template_items_select_actions(params, "sequencer.select_all"), + ("sequencer.select_side_of_frame", {"type": 'LEFT_BRACKET', "value": 'PRESS'}, + {"properties": [("side", 'LEFT')]}), + ("sequencer.select_side_of_frame", {"type": 'RIGHT_BRACKET', "value": 'PRESS'}, + {"properties": [("side", 'RIGHT')]}), ("sequencer.split", {"type": 'K', "value": 'PRESS'}, {"properties": [("type", 'SOFT')]}), ("sequencer.split", {"type": 'K', "value": 'PRESS', "shift": True}, @@ -2957,6 +3132,7 @@ def km_sequencer(params): {"properties": [("adjust_length", True)]}), ("sequencer.offset_clear", {"type": 'O', "value": 'PRESS', "alt": True}, None), ("sequencer.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None), + ("sequencer.duplicate_move_linked", {"type": 'D', "value": 'PRESS', "alt": True}, None), ("sequencer.retiming_key_delete", {"type": 'X', "value": 'PRESS'}, None), ("sequencer.retiming_key_delete", {"type": 'DEL', "value": 'PRESS'}, None), ("sequencer.delete", {"type": 'X', "value": 'PRESS'}, None), @@ -2974,13 +3150,13 @@ def km_sequencer(params): ("sequencer.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None), ("sequencer.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None), ("sequencer.strip_jump", {"type": 'PAGE_UP', "value": 'PRESS', "repeat": True}, - {"properties": [("next", True), ("center", False)]}), - ("sequencer.strip_jump", {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True}, {"properties": [("next", False), ("center", False)]}), + ("sequencer.strip_jump", {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True}, + {"properties": [("next", True), ("center", False)]}), ("sequencer.strip_jump", {"type": 'PAGE_UP', "value": 'PRESS', "alt": True, "repeat": True}, - {"properties": [("next", True), ("center", True)]}), - ("sequencer.strip_jump", {"type": 'PAGE_DOWN', "value": 'PRESS', "alt": True, "repeat": True}, {"properties": [("next", False), ("center", True)]}), + ("sequencer.strip_jump", {"type": 'PAGE_DOWN', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": [("next", True), ("center", True)]}), ("sequencer.swap", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True, "repeat": True}, {"properties": [("side", 'LEFT')]}), ("sequencer.swap", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True, "repeat": True}, @@ -2990,7 +3166,7 @@ def km_sequencer(params): ("sequencer.gap_remove", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, {"properties": [("all", True)]}), ("sequencer.gap_insert", {"type": 'EQUAL', "value": 'PRESS', "shift": True}, None), - ("sequencer.snap", {"type": 'S', "value": 'PRESS', "shift": True}, None), + ("sequencer.snap", {"type": 'S', "value": 'PRESS', "shift": True}, {"properties": [("keep_offset", True)]}), ("sequencer.swap_inputs", {"type": 'S', "value": 'PRESS', "alt": True}, None), *( (("sequencer.split_multicam", @@ -2999,37 +3175,10 @@ def km_sequencer(params): for i in range(10) ) ), - *_template_sequencer_timeline_select( - type=params.select_mouse, - value=params.select_mouse_value_fallback, - legacy=params.legacy, - ), - ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "alt": True}, - {"properties": [("deselect_all", True), ("ignore_connections", True)]}), - ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "alt": True, "shift": True}, - {"properties": [("toggle", True), ("ignore_connections", True)]}), - ("sequencer.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), - ("sequencer.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), - ("sequencer.select_linked_pick", {"type": 'L', "value": 'PRESS'}, None), - ("sequencer.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True}, - {"properties": [("extend", True)]}), - ("sequencer.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None), - ("sequencer.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG'}, - {"properties": [("tweak", True), ("mode", 'SET')]}), - ("sequencer.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG', "shift": True}, - {"properties": [("tweak", True), ("mode", 'ADD')]}), - ("sequencer.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG', "ctrl": True}, - {"properties": [("tweak", True), ("mode", 'SUB')]}), - ("sequencer.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG', "alt": True}, - {"properties": [("tweak", True), ("ignore_connections", True), ("mode", 'SET')]}), - ("sequencer.select_box", {"type": 'B', "value": 'PRESS'}, None), - ("sequencer.select_box", {"type": 'B', "value": 'PRESS', "ctrl": True}, - {"properties": [("include_handles", True)]}), - ("sequencer.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None), op_menu("SEQUENCER_MT_add", {"type": 'A', "value": 'PRESS', "shift": True}), - op_menu("SEQUENCER_MT_change", {"type": 'C', "value": 'PRESS'}), + op_menu("SEQUENCER_MT_change", {"type": 'C', "value": 'PRESS', "shift": True}), op_menu_pie("SEQUENCER_MT_view_pie", {"type": 'ACCENT_GRAVE', "value": 'PRESS'}), - ("sequencer.slip", {"type": 'S', "value": 'PRESS'}, None), + ("sequencer.slip", {"type": 'S', "value": 'PRESS'}, {"properties": [("use_cursor_position", False)]}), ("wm.context_set_int", {"type": 'O', "value": 'PRESS'}, {"properties": [("data_path", "scene.sequence_editor.overlay_frame"), ("value", 0)]}), ("transform.seq_slide", {"type": 'G', "value": 'PRESS'}, @@ -3038,15 +3187,11 @@ def km_sequencer(params): {"properties": [("view2d_edge_pan", True), ("use_restore_handle_selection", True)]}), ("transform.seq_slide", {"type": params.select_mouse, "value": 'CLICK_DRAG', "alt": True}, {"properties": [("view2d_edge_pan", True), ("use_restore_handle_selection", True)]}), + ("transform.seq_slide", {"type": params.select_mouse, "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": [("view2d_edge_pan", True), ("use_restore_handle_selection", True)]}), ("transform.transform", {"type": 'E', "value": 'PRESS'}, {"properties": [("mode", 'TIME_EXTEND')]}), ("marker.add", {"type": 'M', "value": 'PRESS'}, None), - ("sequencer.select_side_of_frame", {"type": 'LEFT_BRACKET', "value": 'PRESS'}, - {"properties": [("side", 'LEFT')]}), - ("sequencer.select_side_of_frame", {"type": 'RIGHT_BRACKET', "value": 'PRESS'}, - {"properties": [("side", 'RIGHT')]}), - ("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True}, - {"properties": [("data_path", "tool_settings.use_snap_sequencer")]}), ("wm.context_toggle", {"type": 'Z', "value": 'PRESS', "alt": True, "shift": True}, {"properties": [("data_path", "space_data.show_overlays")]}), *_template_items_context_menu("SEQUENCER_MT_context_menu", params.context_menu_event), @@ -3058,15 +3203,67 @@ def km_sequencer(params): return keymap -def km_sequencerpreview(params): +def _seq_preview_text_edit_cursor_move(): + items = [] + + for ty, mod, prop in ( + ('LEFT_ARROW', None, ("type", 'PREVIOUS_CHARACTER')), + ('RIGHT_ARROW', None, ("type", 'NEXT_CHARACTER')), + ('UP_ARROW', None, ("type", 'PREVIOUS_LINE')), + ('DOWN_ARROW', None, ("type", 'NEXT_LINE')), + ('HOME', None, ("type", 'LINE_BEGIN')), + ('END', None, ("type", 'LINE_END')), + ('LEFT_ARROW', 'ctrl', ("type", 'PREVIOUS_WORD')), + ('RIGHT_ARROW', 'ctrl', ("type", 'NEXT_WORD')), + ('PAGE_UP', None, ("type", 'TEXT_BEGIN')), + ('PAGE_DOWN', None, ("type", 'TEXT_END')), + ): + if mod is not None: + items.append( + ("sequencer.text_cursor_move", + {"type": ty, "value": 'PRESS', mod: True, "repeat": True}, + {"properties": [prop]})) + items.append( + ("sequencer.text_cursor_move", + {"type": ty, "value": 'PRESS', mod: True, "shift": True, "repeat": True}, + {"properties": [prop, ('select_text', True)]})) + else: + items.append( + ("sequencer.text_cursor_move", + {"type": ty, "value": 'PRESS', "repeat": True}, + {"properties": [prop]})) + items.append( + ("sequencer.text_cursor_move", + {"type": ty, "value": 'PRESS', "shift": True, "repeat": True}, + {"properties": [prop, ('select_text', True)]})) + return items + + +def km_sequencer_preview(params): items = [] keymap = ( - "SequencerPreview", + "Preview", {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, {"items": items}, ) items.extend([ + # Text editing. + *_seq_preview_text_edit_cursor_move(), + ("sequencer.text_delete", {"type": 'DEL', "value": 'PRESS', "repeat": True}, + {"properties": [("type", 'NEXT_OR_SELECTION')]}), + ("sequencer.text_delete", {"type": 'BACK_SPACE', "value": 'PRESS', "repeat": True}, + {"properties": [("type", 'PREVIOUS_OR_SELECTION')]}), + ("sequencer.text_line_break", {"type": 'RET', "value": 'PRESS', "repeat": True}, None), + ("sequencer.text_line_break", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "repeat": True}, None), + ("sequencer.text_select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, None), + ("sequencer.text_deselect_all", {"type": 'ESC', "value": 'PRESS'}, None), + ("sequencer.text_edit_mode_toggle", {"type": 'TAB', "value": 'PRESS'}, None), + ("sequencer.text_edit_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), + ("sequencer.text_edit_paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), + ("sequencer.text_edit_cut", {"type": 'X', "value": 'PRESS', "ctrl": True}, None), + ("sequencer.text_insert", {"type": 'TEXTINPUT', "value": 'ANY', "any": True, "repeat": True}, None), + # Selection. *_template_sequencer_preview_select( type=params.select_mouse, @@ -3075,30 +3272,27 @@ def km_sequencerpreview(params): ), *_template_items_select_actions(params, "sequencer.select_all"), ("sequencer.select_box", {"type": 'B', "value": 'PRESS'}, None), + ("sequencer.select_circle", {"type": 'C', "value": 'PRESS'}, None), # View. ("sequencer.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None), ("sequencer.view_all_preview", {"type": 'HOME', "value": 'PRESS'}, None), ("sequencer.view_all_preview", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None), ("sequencer.view_ghost_border", {"type": 'O', "value": 'PRESS'}, None), - ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True}, - {"properties": [("ratio", 8.0)]}), - ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True}, - {"properties": [("ratio", 4.0)]}), - ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True}, - {"properties": [("ratio", 2.0)]}), - ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_1', "value": 'PRESS'}, - {"properties": [("ratio", 1.0)]}), - ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS'}, - {"properties": [("ratio", 0.5)]}), - ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS'}, - {"properties": [("ratio", 0.25)]}), - ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS'}, - {"properties": [("ratio", 0.125)]}), + *(( + "sequencer.view_zoom_ratio", + {"type": key, "value": 'PRESS', **mod}, + {"properties": [("ratio", ratio)]}, + ) for mod, keys, ratios in ( + ({}, NUMPAD_ZOOM, (1.0, 0.5, 0.25, 0.125)), + ({"ctrl": True}, NUMPAD_ZOOM[1:], (2.0, 4.0, 8.0)), + ) for key, ratio in zip(keys, ratios, strict=True)), op_menu_pie("SEQUENCER_MT_preview_view_pie", {"type": 'ACCENT_GRAVE', "value": 'PRESS'}), # Transform Actions. *_template_items_transform_actions(params, use_mirror=True), + ("transform.translate", {"type": 'PERIOD', "ctrl": True, "value": 'PRESS'}, + {"properties": [("translate_origin", True)]}), # Edit. ("sequencer.strip_transform_clear", {"type": 'G', "alt": True, "value": 'PRESS'}, @@ -3108,12 +3302,43 @@ def km_sequencerpreview(params): ("sequencer.strip_transform_clear", {"type": 'R', "alt": True, "value": 'PRESS'}, {"properties": [("property", 'ROTATION')]}), + ("sequencer.preview_duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None), + ("sequencer.preview_duplicate_move_linked", {"type": 'D', "value": 'PRESS', "alt": True}, None), + ("sequencer.mute", {"type": 'H', "value": 'PRESS'}, + {"properties": [("unselected", False)]}), + ("sequencer.mute", {"type": 'H', "value": 'PRESS', "shift": True}, + {"properties": [("unselected", True)]}), + ("sequencer.unmute", {"type": 'H', "value": 'PRESS', "alt": True}, + {"properties": [("unselected", False)]}), ("sequencer.delete", {"type": 'X', "value": 'PRESS'}, None), ("sequencer.delete", {"type": 'DEL', "value": 'PRESS'}, None), + ("sequencer.select_lasso", {"type": params.action_mouse, "value": 'CLICK_DRAG', "ctrl": True}, + {"properties": [("mode", 'ADD')]}), + ("sequencer.select_lasso", {"type": params.action_mouse, "value": 'CLICK_DRAG', "shift": True, "ctrl": True}, + {"properties": [("mode", 'SUB')]}), + ("sequencer.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), + ("sequencer.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), + ("sequencer.paste", {"type": 'V', "value": 'PRESS', "ctrl": True, "shift": True}, + {"properties": [("keep_offset", True)]}), + + # Animation + ("anim.keying_set_active_set", {"type": 'K', "value": 'PRESS', "shift": True}, None), + ("anim.keyframe_insert_menu", {"type": 'K', "value": 'PRESS'}, {"properties": [("always_prompt", True)]}), + ("anim.keyframe_delete_vse", {"type": 'I', "value": 'PRESS', "alt": True}, None), *_template_items_context_menu("SEQUENCER_MT_preview_context_menu", params.context_menu_event), ]) + if params.use_pie_click_drag: + items.extend([ + ("anim.keyframe_insert", {"type": 'I', "value": 'CLICK'}, None), + op_menu_pie("ANIM_MT_keyframe_insert_pie", {"type": 'I', "value": 'CLICK_DRAG'}), + ]) + else: + items.extend([ + ("anim.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None), + ]) + if not params.legacy: # New pie menus. items.extend([ @@ -3295,26 +3520,15 @@ def km_clip_editor(params): ("clip.view_zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None), ("clip.view_zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "repeat": True}, None), ("clip.view_zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "repeat": True}, None), - ("clip.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True}, - {"properties": [("ratio", 8.0)]}), - ("clip.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True}, - {"properties": [("ratio", 4.0)]}), - ("clip.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True}, - {"properties": [("ratio", 2.0)]}), - ("clip.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "shift": True}, - {"properties": [("ratio", 8.0)]}), - ("clip.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True}, - {"properties": [("ratio", 4.0)]}), - ("clip.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "shift": True}, - {"properties": [("ratio", 2.0)]}), - ("clip.view_zoom_ratio", {"type": 'NUMPAD_1', "value": 'PRESS'}, - {"properties": [("ratio", 1.0)]}), - ("clip.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS'}, - {"properties": [("ratio", 0.5)]}), - ("clip.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS'}, - {"properties": [("ratio", 0.25)]}), - ("clip.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS'}, - {"properties": [("ratio", 0.125)]}), + *(( + "clip.view_zoom_ratio", + {"type": key, "value": 'PRESS', **mod}, + {"properties": [("ratio", ratio)]}, + ) for mod, keys, ratios in ( + ({}, NUMPAD_ZOOM, (1.0, 0.5, 0.25, 0.125)), + ({"ctrl": True}, NUMPAD_ZOOM[1:], (2.0, 4.0, 8.0)), + ({"shift": True}, NUMPAD_ZOOM[1:], (2.0, 4.0, 8.0)), + ) for key, ratio in zip(keys, ratios, strict=True)), ("clip.view_all", {"type": 'HOME', "value": 'PRESS'}, None), ("clip.view_all", {"type": 'F', "value": 'PRESS'}, {"properties": [("fit_view", True)]}), @@ -3380,6 +3594,8 @@ def km_clip_editor(params): ("clip.cursor_set", params.cursor_set_event, None), ("clip.copy_tracks", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), ("clip.paste_tracks", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), + ("wm.context_toggle", {"type": 'Z', "value": 'PRESS', "alt": True, "shift": True}, + {"properties": [("data_path", "space_data.overlay.show_overlays")]}), *_template_items_context_menu("CLIP_MT_tracking_context_menu", params.context_menu_event), ]) @@ -3490,6 +3706,9 @@ def km_spreadsheet_generic(params): sidebar_key={"type": 'N', "value": 'PRESS'}, channels_key={"type": 'T', "value": 'PRESS'}, ), + ("spreadsheet.resize_column", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("spreadsheet.fit_column", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None), + ("spreadsheet.reorder_columns", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), ]) return keymap @@ -3516,10 +3735,14 @@ def km_frames(params): {"properties": [("end", True)]}), ("screen.frame_jump", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "repeat": True}, {"properties": [("end", False)]}), + ("screen.time_jump", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": [("backward", False)]}), + ("screen.time_jump", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True, "repeat": True}, + {"properties": [("backward", True)]}), ("screen.keyframe_jump", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, - {"properties": [("next", True)]}), - ("screen.keyframe_jump", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, {"properties": [("next", False)]}), + ("screen.keyframe_jump", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, + {"properties": [("next", True)]}), ("screen.keyframe_jump", {"type": 'MEDIA_LAST', "value": 'PRESS'}, {"properties": [("next", True)]}), ("screen.keyframe_jump", {"type": 'MEDIA_FIRST', "value": 'PRESS'}, @@ -3668,7 +3891,7 @@ def km_animation_channels(params): # ------------------------------------------------------------------------------ # Object Grease Pencil Modes -def km_gpencil_legacy(params): +def km_annotate(params): items = [] keymap = ( "Grease Pencil", @@ -3706,890 +3929,36 @@ def km_gpencil_legacy(params): return keymap -def _gpencil_legacy_selection(params, *, alt_select=False): - return [ - # Select all - *_template_items_select_actions(params, "gpencil.select_all"), - # Circle select - op_tool_optional( - ("gpencil.select_circle", {"type": 'C', "value": 'PRESS'}, None), - (op_tool, "builtin.select_circle"), params), - # Box select - op_tool_optional( - ("gpencil.select_box", {"type": 'B', "value": 'PRESS'}, None), - (op_tool, "builtin.select_box"), params), - *_template_view3d_gpencil_select( - type=params.select_mouse, - value=params.select_mouse_value_fallback, - legacy=params.legacy, - alt_select=alt_select - ), +# Grease Pencil +def km_grease_pencil_selection(params): + items = [] + keymap = ( + "Grease Pencil Selection", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": items}, + ) + + items.extend([ + # Select All + *_template_items_select_actions(params, "grease_pencil.select_all"), + # Select fill + ("grease_pencil.select_fill", {"type": 'L', "value": 'PRESS', "ctrl": True}, None), # Select linked - ("gpencil.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None), - # Whole stroke select: Same behavior and use case as select linked pick. - ("gpencil.select", {"type": 'L', "value": 'PRESS'}, - {"properties": [("extend", True), ("entire_strokes", True)]}), - ("gpencil.select", {"type": 'L', "value": 'PRESS', "shift": True}, - {"properties": [("deselect", True), ("extend", True), ("entire_strokes", True)]}), - # Select grouped - ("gpencil.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None), + ("grease_pencil.select_linked", {"type": 'L', "value": 'PRESS'}, None), # Select more/less - ("gpencil.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), - ("gpencil.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), - ] - - -def _gpencil_legacy_display(): - return [ - ("wm.context_toggle", {"type": 'Q', "value": 'PRESS', "shift": True}, - {"properties": [("data_path", "space_data.overlay.use_gpencil_edit_lines")]}), - ("wm.context_toggle", {"type": 'Q', "value": 'PRESS', "shift": True, "alt": True}, - {"properties": [("data_path", "space_data.overlay.use_gpencil_multiedit_line_only")]}), - ] - - -def km_gpencil_legacy_stroke_edit_mode(params): - items = [] - keymap = ( - "Grease Pencil Stroke Edit Mode", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Interpolation - op_tool_optional( - ("gpencil.interpolate", {"type": 'E', "value": 'PRESS', "ctrl": True}, None), - (op_tool_cycle, "builtin.interpolate"), params), - ("gpencil.interpolate_sequence", {"type": 'E', "value": 'PRESS', "shift": True, "ctrl": True}, None), - # Selection - *_gpencil_legacy_selection(params), - ("gpencil.select_lasso", {"type": params.action_mouse, "value": 'CLICK_DRAG', "ctrl": True}, - {"properties": [("mode", 'ADD')]}), - ("gpencil.select_lasso", {"type": params.action_mouse, "value": 'CLICK_DRAG', "shift": True, "ctrl": True}, - {"properties": [("mode", 'SUB')]}), - # Duplicate and move selected points - ("gpencil.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None), - # Extrude and move selected points - op_tool_optional( - ("gpencil.extrude_move", {"type": 'E', "value": 'PRESS'}, None), - (op_tool_cycle, "builtin.extrude"), params), - # Delete - op_menu("VIEW3D_MT_edit_gpencil_delete", {"type": 'X', "value": 'PRESS'}), - op_menu("VIEW3D_MT_edit_gpencil_delete", {"type": 'DEL', "value": 'PRESS'}), - ("gpencil.dissolve", {"type": 'X', "value": 'PRESS', "ctrl": True}, None), - ("gpencil.dissolve", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None), - # Animation menu - ("gpencil.blank_frame_add", {"type": 'I', "value": 'PRESS', "shift": True}, None), - # Delete Animation menu - op_menu("GPENCIL_MT_gpencil_draw_delete", {"type": 'I', "value": 'PRESS', "alt": True}), - ("gpencil.active_frames_delete_all", {"type": 'DEL', "value": 'PRESS', "shift": True}, None), - # Separate - ("gpencil.stroke_separate", {"type": 'P', "value": 'PRESS'}, None), - # Split and joint strokes - ("gpencil.stroke_split", {"type": 'V', "value": 'PRESS'}, None), - ("gpencil.stroke_join", {"type": 'J', "value": 'PRESS', "ctrl": True}, None), - ("gpencil.stroke_join", {"type": 'J', "value": 'PRESS', "shift": True, "ctrl": True}, - {"properties": [("type", 'JOINCOPY')]}), - # Close strokes - ("gpencil.stroke_cyclical_set", {"type": 'F', "value": 'PRESS'}, - {"properties": [("type", 'CLOSE'), ("geometry", True)]}), - # Copy + paste. - ("gpencil.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), - ("gpencil.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), - # Snap - ( - op_menu_pie("GPENCIL_MT_snap_pie", {"type": 'S', "value": 'PRESS', "shift": True}) - if not params.legacy else - op_menu("GPENCIL_MT_snap", {"type": 'S', "value": 'PRESS', "shift": True}) - ), - # Show/hide - *_template_items_hide_reveal_actions("gpencil.hide", "gpencil.reveal"), - ("gpencil.selection_opacity_toggle", {"type": 'H', "value": 'PRESS', "ctrl": True}, None), - # Display - *_gpencil_legacy_display(), - # Isolate layer - ("gpencil.layer_isolate", {"type": 'NUMPAD_ASTERIX', "value": 'PRESS'}, None), - # Move to layer - op_menu("GPENCIL_MT_move_to_layer", {"type": 'M', "value": 'PRESS'}), - # Merge Layer - ("gpencil.layer_merge", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}, None), - - # Transform Actions. - *_template_items_transform_actions(params, use_bend=True, use_mirror=True, use_tosphere=True, use_shear=True), - op_tool_optional( - ("transform.transform", {"type": 'S', "value": 'PRESS', "alt": True}, - {"properties": [("mode", 'GPENCIL_SHRINKFATTEN')]}), - (op_tool_cycle, "builtin.radius"), params), - ("transform.transform", {"type": 'F', "value": 'PRESS', "shift": True}, - {"properties": [("mode", 'GPENCIL_OPACITY')]}), - - # Proportional editing. - *_template_items_proportional_editing( - params, connected=True, toggle_data_path="tool_settings.use_proportional_edit"), - # Curve edit mode toggle. - ("wm.context_toggle", {"type": 'U', "value": 'PRESS'}, - {"properties": [("data_path", "gpencil_data.use_curve_edit")]}), - # Add menu - ("object.gpencil_add", {"type": 'A', "value": 'PRESS', "shift": True}, None), - # Vertex group menu - op_menu("GPENCIL_MT_gpencil_vertex_group", {"type": 'G', "value": 'PRESS', "ctrl": True}), - # Select mode - *(("gpencil.selectmode_toggle", {"type": NUMBERS_1[i], "value": 'PRESS'}, - {"properties": [("mode", i)]}) - for i in range(3)), - # Active layer - op_menu("GPENCIL_MT_layer_active", {"type": 'Y', "value": 'PRESS'}), - # Keyframe menu - op_menu("VIEW3D_MT_gpencil_animation", {"type": 'I', "value": 'PRESS'}), - # Context menu - *_template_items_context_menu("VIEW3D_MT_gpencil_edit_context_menu", params.context_menu_event), - ]) - - if params.legacy: - items.extend([ - # Convert to geometry - ("gpencil.convert", {"type": 'C', "value": 'PRESS', "alt": True}, None), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_curve_edit_mode(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Curve Edit Mode", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Set handle type - ("gpencil.stroke_editcurve_set_handle_type", {"type": 'V', "value": 'PRESS'}, None), + ("grease_pencil.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("grease_pencil.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + # Select Similar + ("grease_pencil.select_similar", {"type": 'G', "value": 'PRESS', "shift": True}, None), ]) return keymap -def km_gpencil_legacy_stroke_paint_mode(params): - items = [] - keymap = ( - "Grease Pencil Stroke Paint Mode", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Brush strength - ("wm.radial_control", {"type": 'F', "value": 'PRESS', "shift": True}, - {"properties": [("data_path_primary", "tool_settings.gpencil_paint.brush.gpencil_settings.pen_strength")]}), - # Brush size - ("wm.radial_control", {"type": 'F', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_paint.brush.size")]}), - # Increase/Decrease brush size - ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, - {"properties": [("scalar", 0.9)]}), - ("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True}, - {"properties": [("scalar", 1.0 / 0.9)]}), - # Animation menu - ("gpencil.blank_frame_add", {"type": 'I', "value": 'PRESS', "shift": True}, None), - # Delete Animation menu - op_menu("GPENCIL_MT_gpencil_draw_delete", {"type": 'I', "value": 'PRESS', "alt": True}), - ("gpencil.active_frames_delete_all", {"type": 'DEL', "value": 'PRESS', "shift": True}, None), - # Interpolation - op_tool_optional( - ("gpencil.interpolate", {"type": 'E', "value": 'PRESS', "ctrl": True}, None), - (op_tool_cycle, "builtin.interpolate"), params), - ("gpencil.interpolate_sequence", {"type": 'E', "value": 'PRESS', "shift": True, "ctrl": True}, None), - # Show/hide - *_template_items_hide_reveal_actions("gpencil.hide", "gpencil.reveal"), - # Active layer - op_menu("GPENCIL_MT_layer_active", {"type": 'Y', "value": 'PRESS'}), - # Merge Layer - ("gpencil.layer_merge", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}, None), - # Active material - op_menu("GPENCIL_MT_material_active", {"type": 'U', "value": 'PRESS'}), - # Keyframe menu - op_menu("VIEW3D_MT_gpencil_animation", {"type": 'I', "value": 'PRESS'}), - # Draw context menu - *_template_items_context_panel("VIEW3D_PT_gpencil_draw_context_menu", params.context_menu_event), - # Erase Gestures - # Box erase - ("gpencil.select_box", {"type": 'B', "value": 'PRESS'}, None), - # Lasso erase - ("gpencil.select_lasso", {"type": params.action_mouse, "value": 'CLICK_DRAG', "ctrl": True, "alt": True}, None), - op_asset_shelf_popup( - "VIEW3D_AST_brush_gpencil_paint", - {"type": 'SPACE', "value": 'PRESS', "shift": True} - ), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_paint_draw_brush(params): - items = [] - keymap = ( - "Grease Pencil Stroke Paint (Draw brush)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - # Draw - items.extend([ - ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("mode", 'DRAW'), ("wait_for_input", False)]}), - ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("mode", 'DRAW'), ("wait_for_input", False)]}), - # Draw - straight lines - ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, - {"properties": [("mode", 'DRAW_STRAIGHT'), ("wait_for_input", False)]}), - # Erase - ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("mode", 'ERASER'), ("wait_for_input", False)]}), - ]) - - items.extend([ - # Tablet Mappings for Drawing ------------------ */ - # For now, only support direct drawing using the eraser, as most users using a tablet - # may still want to use that as their primary pointing device! - ("gpencil.draw", {"type": 'ERASER', "value": 'PRESS'}, - {"properties": [("mode", 'ERASER'), ("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_paint_erase(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Paint (Erase)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Erase - ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("mode", 'ERASER'), ("wait_for_input", False)]}), - ("gpencil.draw", {"type": 'ERASER', "value": 'PRESS'}, - {"properties": [("mode", 'ERASER'), ("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_paint_fill(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Paint (Fill)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Fill - ("gpencil.fill", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("on_back", False)]}), - ("gpencil.fill", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("on_back", False)]}), - # If press alternate key, the brush now it's for drawing areas - ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [ - ("mode", 'DRAW'), - ("wait_for_input", False), - ("disable_straight", True), - ("disable_stabilizer", True), - ]}), - # If press alternative key, the brush now it's for drawing lines - ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, - {"properties": [ - ("mode", 'DRAW'), - ("wait_for_input", False), - ("disable_straight", True), - ("disable_stabilizer", True), - ("disable_fill", True), - ]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_paint_tint(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Paint (Tint)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Tint - ("gpencil.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_mode(params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt Mode", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items} - ) - - items.extend([ - # Selection - *_gpencil_legacy_selection(params, alt_select=True), - *_template_items_select_lasso(params, "gpencil.select_lasso"), - # Selection mode - ("wm.context_toggle", {"type": 'ONE', "value": 'PRESS'}, - {"properties": [("data_path", "scene.tool_settings.use_gpencil_select_mask_point")]}), - ("wm.context_toggle", {"type": 'TWO', "value": 'PRESS'}, - {"properties": [("data_path", "scene.tool_settings.use_gpencil_select_mask_stroke")]}), - ("wm.context_toggle", {"type": 'THREE', "value": 'PRESS'}, - {"properties": [("data_path", "scene.tool_settings.use_gpencil_select_mask_segment")]}), - # Brush strength - ("wm.radial_control", {"type": 'F', "value": 'PRESS', "shift": True}, - {"properties": [("data_path_primary", "tool_settings.gpencil_sculpt_paint.brush.strength")]}), - # Brush size - ("wm.radial_control", {"type": 'F', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_sculpt_paint.brush.size")]}), - # Increase/Decrease brush size - ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, - {"properties": [("scalar", 0.9)]}), - ("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True}, - {"properties": [("scalar", 1.0 / 0.9)]}), - # Copy - ("gpencil.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), - # Display - *_gpencil_legacy_display(), - # Active layer - op_menu("GPENCIL_MT_layer_active", {"type": 'Y', "value": 'PRESS'}), - # Active material - op_menu("GPENCIL_MT_material_active", {"type": 'U', "value": 'PRESS'}), - # Merge Layer - ("gpencil.layer_merge", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}, None), - # Animation menu - op_menu("VIEW3D_MT_gpencil_animation", {"type": 'I', "value": 'PRESS'}), - # Insert blank keyframe - ("gpencil.blank_frame_add", {"type": 'I', "value": 'PRESS', "shift": True}, None), - # Delete Animation menu - op_menu("GPENCIL_MT_gpencil_draw_delete", {"type": 'I', "value": 'PRESS', "alt": True}), - ("gpencil.active_frames_delete_all", {"type": 'DEL', "value": 'PRESS', "shift": True}, None), - # Context menu - *_template_items_context_panel("VIEW3D_PT_gpencil_sculpt_context_menu", params.context_menu_event), - # Auto-masking Pie menu. - op_menu_pie( - "VIEW3D_MT_sculpt_gpencil_automasking_pie", - {"type": 'A', "shift": True, "alt": True, "value": 'PRESS'}, - ), - op_asset_shelf_popup( - "VIEW3D_AST_brush_gpencil_sculpt", - {"type": 'SPACE', "value": 'PRESS', "shift": True} - ), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_smooth(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt (Smooth)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_thickness(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt (Thickness)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_strength(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt (Strength)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_grab(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt (Grab)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_push(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt (Push)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_twist(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt (Twist)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_pinch(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt (Pinch)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_randomize(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt (Randomize)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_clone(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt (Clone)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_weight_mode(params): - items = [] - keymap = ( - "Grease Pencil Stroke Weight Mode", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Brush strength - ("wm.radial_control", {"type": 'F', "value": 'PRESS', "shift": True}, - {"properties": [("data_path_primary", "tool_settings.gpencil_weight_paint.brush.strength")]}), - # Brush size - ("wm.radial_control", {"type": 'F', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_weight_paint.brush.size")]}), - # Brush weight - ("wm.radial_control", {"type": 'F', "value": 'PRESS', "ctrl": True}, - {"properties": [("data_path_primary", "tool_settings.gpencil_weight_paint.brush.weight")]}), - # Increase/Decrease brush size - ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, - {"properties": [("scalar", 0.9)]}), - ("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True}, - {"properties": [("scalar", 1.0 / 0.9)]}), - # Display - *_gpencil_legacy_display(), - # Active layer - op_menu("GPENCIL_MT_layer_active", {"type": 'Y', "value": 'PRESS'}), - # Merge Layer - ("gpencil.layer_merge", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}, None), - # Keyframe menu - op_menu("VIEW3D_MT_gpencil_animation", {"type": 'I', "value": 'PRESS'}), - # Insert blank keyframe - ("gpencil.blank_frame_add", {"type": 'I', "value": 'PRESS', "shift": True}, None), - # Delete Animation menu - op_menu("GPENCIL_MT_gpencil_draw_delete", {"type": 'I', "value": 'PRESS', "alt": True}), - ("gpencil.active_frames_delete_all", {"type": 'DEL', "value": 'PRESS', "shift": True}, None), - # Context menu - *_template_items_context_panel("VIEW3D_PT_gpencil_weight_context_menu", params.context_menu_event), - # Toggle Add/Subtract for weight draw tool - ("gpencil.weight_toggle_direction", {"type": 'D', "value": 'PRESS'}, None), - # Weight sample - ("gpencil.weight_sample", {"type": 'X', "value": 'PRESS', "shift": True}, None), - op_asset_shelf_popup( - "VIEW3D_AST_brush_gpencil_weight", - {"type": 'SPACE', "value": 'PRESS', "shift": True} - ), - ]) - - if params.select_mouse == 'LEFTMOUSE': - # Bone selection for combined weight paint + pose mode. - items.extend([ - ("view3d.select", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_weight_draw(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Weight (Draw)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Draw - ("gpencil.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_weight_blur(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Weight (Blur)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Blur - ("gpencil.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_weight_average(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Weight (Average)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Average - ("gpencil.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_weight_smear(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Weight (Smear)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Smear - ("gpencil.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_vertex_mode(params): - items = [] - keymap = ( - "Grease Pencil Stroke Vertex Mode", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Selection - *_gpencil_legacy_selection(params, alt_select=True), - *_template_items_select_lasso(params, "gpencil.select_lasso"), - # Selection mode - ("wm.context_toggle", {"type": 'ONE', "value": 'PRESS'}, - {"properties": [("data_path", "scene.tool_settings.use_gpencil_vertex_select_mask_point")]}), - ("wm.context_toggle", {"type": 'TWO', "value": 'PRESS'}, - {"properties": [("data_path", "scene.tool_settings.use_gpencil_vertex_select_mask_stroke")]}), - ("wm.context_toggle", {"type": 'THREE', "value": 'PRESS'}, - {"properties": [("data_path", "scene.tool_settings.use_gpencil_vertex_select_mask_segment")]}), - # Brush strength - ("wm.radial_control", {"type": 'F', "value": 'PRESS', "shift": True}, - {"properties": [ - ("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.gpencil_settings.pen_strength"), - ]}), - # Brush size - ("wm.radial_control", {"type": 'F', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.size")]}), - # Increase/Decrease brush size - ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, - {"properties": [("scalar", 0.9)]}), - ("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True}, - {"properties": [("scalar", 1.0 / 0.9)]}), - # Color Flip - ("gpencil.tint_flip", {"type": 'X', "value": 'PRESS'}, None), - # Display - *_gpencil_legacy_display(), - # Active layer - op_menu("GPENCIL_MT_layer_active", {"type": 'Y', "value": 'PRESS'}), - # Merge Layer - ("gpencil.layer_merge", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}, None), - # Animation menu - op_menu("VIEW3D_MT_gpencil_animation", {"type": 'I', "value": 'PRESS'}), - # Insert blank keyframe - ("gpencil.blank_frame_add", {"type": 'I', "value": 'PRESS', "shift": True}, None), - # Delete Animation menu - op_menu("GPENCIL_MT_gpencil_draw_delete", {"type": 'I', "value": 'PRESS', "alt": True}), - ("gpencil.active_frames_delete_all", {"type": 'DEL', "value": 'PRESS', "shift": True}, None), - - # Vertex Paint context menu - op_panel("VIEW3D_PT_gpencil_vertex_context_menu", params.context_menu_event), - op_asset_shelf_popup( - "VIEW3D_AST_brush_gpencil_vertex", - {"type": 'SPACE', "value": 'PRESS', "shift": True} - ), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_vertex_draw(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Vertex (Draw)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Tint - ("gpencil.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - # Brush strength - ("wm.radial_control", {"type": 'F', "value": 'PRESS', "shift": True}, - {"properties": [ - ("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.gpencil_settings.pen_strength"), - ]}), - # Brush size - ("wm.radial_control", {"type": 'F', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.size")]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_vertex_blur(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Vertex (Blur)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Tint - ("gpencil.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - # Brush strength - ("wm.radial_control", {"type": 'F', "value": 'PRESS', "shift": True}, - {"properties": [ - ("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.gpencil_settings.pen_strength"), - ]}), - # Brush size - ("wm.radial_control", {"type": 'F', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.size")]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_vertex_average(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Vertex (Average)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Tint - ("gpencil.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - # Brush strength - ("wm.radial_control", {"type": 'F', "value": 'PRESS', "shift": True}, - {"properties": [ - ("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.gpencil_settings.pen_strength")], - }), - # Brush size - ("wm.radial_control", {"type": 'F', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.size")]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_vertex_smear(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Vertex (Smear)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Tint - ("gpencil.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - # Brush strength - ("wm.radial_control", {"type": 'F', "value": 'PRESS', "shift": True}, - {"properties": [ - ("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.gpencil_settings.pen_strength"), - ]}), - # Brush size - ("wm.radial_control", {"type": 'F', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.size")]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_vertex_replace(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Vertex (Replace)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Tint - ("gpencil.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - # Brush size - ("wm.radial_control", {"type": 'F', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.size")]}), - ]) - - return keymap - - -# Grease Pencil v3 def km_grease_pencil_paint_mode(params): items = [] keymap = ( - "Grease Pencil Paint Mode", + "Grease Pencil Draw Mode", {"space_type": 'EMPTY', "region_type": 'WINDOW'}, {"items": items}, ) @@ -4602,8 +3971,10 @@ def km_grease_pencil_paint_mode(params): # Show/hide *_template_items_hide_reveal_actions("grease_pencil.layer_hide", "grease_pencil.layer_reveal"), + # Flip primary and secondary color + ("paint.brush_colors_flip", {"type": 'X', "value": 'PRESS'}, None), + ("paint.sample_color", {"type": 'X', "value": 'PRESS', "shift": True}, {"properties": [("merged", False)]}), - ("paint.sample_color", {"type": 'X', "value": 'PRESS', "shift": True}, None), # Isolate Layer ("grease_pencil.layer_isolate", {"type": 'NUMPAD_ASTERIX', "value": 'PRESS'}, None), @@ -4611,15 +3982,40 @@ def km_grease_pencil_paint_mode(params): # Keyframe Menu op_menu("VIEW3D_MT_edit_greasepencil_animation", {"type": 'I', "value": 'PRESS'}), - op_tool_optional( - ("grease_pencil.interpolate", {"type": 'E', "value": 'PRESS', "ctrl": True}, None), - (op_tool_cycle, "builtin.interpolate"), params), - ("grease_pencil.interpolate_sequence", {"type": 'E', "value": 'PRESS', "shift": True, "ctrl": True}, None), + # Insert Blank Keyframe + ("grease_pencil.insert_blank_frame", {"type": 'I', "value": 'PRESS', "shift": True}, None), - op_asset_shelf_popup( - "VIEW3D_AST_brush_gpencil_paint", - {"type": 'SPACE', "value": 'PRESS', "shift": True} - ), + # Delete all active frames + ("grease_pencil.delete_frame", {"type": 'DEL', "value": 'PRESS', "shift": True}, + {"properties": [("type", "ALL_FRAMES")]}), + + # Delete Animation menu + op_menu("GREASE_PENCIL_MT_draw_delete", {"type": 'I', "value": 'PRESS', "alt": True}), + + # Merge Down + ("grease_pencil.layer_merge", {"type": 'M', "value": 'PRESS', + "ctrl": True, "shift": True}, {"properties": [("mode", 'ACTIVE')]}), + + op_tool_optional( + ("grease_pencil.interpolate", {"type": 'E', "value": 'PRESS', + "ctrl": True}, {"properties": [("use_selection", False)]}), + (op_tool_cycle, "builtin.interpolate"), params), + ("grease_pencil.interpolate_sequence", {"type": 'E', "value": 'PRESS', + "shift": True, "ctrl": True}, {"properties": [("use_selection", False)]}), + + # Lasso/Box erase + ("grease_pencil.erase_lasso", {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True}, None), + ("grease_pencil.erase_box", {"type": "B", "value": 'PRESS'}, {"properties": [("wait_for_input", True)]}), + # Brush size + ("wm.radial_control", {"type": 'F', "value": 'PRESS'}, + {"properties": [("data_path_primary", "tool_settings.gpencil_paint.brush.size")]}), + # Brush strength + ("wm.radial_control", {"type": 'F', "value": 'PRESS', "shift": True}, + {"properties": [("data_path_primary", "tool_settings.gpencil_paint.brush.strength")]}), + + *_template_asset_shelf_popup("VIEW3D_AST_brush_gpencil_paint", params.spacebar_action), + + *_template_items_context_panel("VIEW3D_PT_greasepencil_draw_context_menu", params.context_menu_event), ]) return keymap @@ -4636,23 +4032,16 @@ def km_grease_pencil_brush_stroke(_params): items.extend([ ("grease_pencil.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), ("grease_pencil.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("mode", 'ERASE')]}), + {"properties": [("brush_toggle", 'ERASE')]}), ("grease_pencil.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("mode", 'SMOOTH')]}), + {"properties": [("brush_toggle", 'SMOOTH')]}), ("grease_pencil.brush_stroke", {"type": 'ERASER', "value": 'PRESS'}, - {"properties": [("mode", 'ERASE')]}), - # Brush size - ("wm.radial_control", {"type": 'F', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_paint.brush.size")]}), - # Brush strength - ("wm.radial_control", {"type": 'F', "value": 'PRESS', "shift": True}, - {"properties": [("data_path_primary", "tool_settings.gpencil_paint.brush.strength")]}), + {"properties": [("brush_toggle", 'ERASE')]}), # Increase/Decrease brush size ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, {"properties": [("scalar", 0.9)]}), ("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True}, {"properties": [("scalar", 1.0 / 0.9)]}), - *_template_items_context_panel("VIEW3D_PT_greasepencil_draw_context_menu", _params.context_menu_event), ]) return keymap @@ -4667,12 +4056,6 @@ def km_grease_pencil_edit_mode(params): ) items.extend([ - *_template_items_select_actions(params, "grease_pencil.select_all"), - # Select linked - ("grease_pencil.select_linked", {"type": 'L', "value": 'PRESS'}, None), - ("grease_pencil.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None), - ("grease_pencil.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), - ("grease_pencil.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), # Delete menu op_menu("VIEW3D_MT_edit_greasepencil_delete", {"type": 'X', "value": 'PRESS'}), op_menu("VIEW3D_MT_edit_greasepencil_delete", {"type": 'DEL', "value": 'PRESS'}), @@ -4694,6 +4077,12 @@ def km_grease_pencil_edit_mode(params): # Keyframe Menu op_menu("VIEW3D_MT_edit_greasepencil_animation", {"type": 'I', "value": 'PRESS'}), + # Insert Blank Keyframe + ("grease_pencil.insert_blank_frame", {"type": 'I', "value": 'PRESS', "shift": True}, None), + + # Delete Animation menu + op_menu("GREASE_PENCIL_MT_draw_delete", {"type": 'I', "value": 'PRESS', "alt": True}), + # Show/hide *_template_items_hide_reveal_actions("grease_pencil.layer_hide", "grease_pencil.layer_reveal"), @@ -4709,17 +4098,22 @@ def km_grease_pencil_edit_mode(params): params, connected=True, toggle_data_path="tool_settings.use_proportional_edit"), # Cyclical set - ("grease_pencil.cyclical_set", {"type": 'F', "value": 'PRESS'}, {"properties": [("type", "CLOSE")]}), + ("grease_pencil.cyclical_set", {"type": 'F', "value": 'PRESS'}, + {"properties": [("type", "CLOSE"), ("subdivide_cyclic_segment", True)]}), ("grease_pencil.cyclical_set", {"type": 'C', "value": 'PRESS', - "alt": True}, {"properties": [("type", "TOGGLE")]}), + "alt": True}, {"properties": [("type", "TOGGLE"), ("subdivide_cyclic_segment", False)]}), # Join selection - ("grease_pencil.join_selection", {"type": 'J', "value": 'PRESS', "ctrl": True}, None), + ("grease_pencil.join_selection", {"type": 'J', "value": 'PRESS', "ctrl": True}, + {"properties": [("type", 'JOINSTROKES')]}), ("grease_pencil.join_selection", {"type": 'J', "value": 'PRESS', "shift": True, "ctrl": True}, - {"properties": [("type", 'JOINCOPY')]}), + {"properties": [("type", 'SPLITCOPY')]}), ("grease_pencil.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None), + # Split Stroke + ("grease_pencil.stroke_split", {"type": 'V', "value": 'PRESS', "shift": True}, None), + # Extrude and move selected points op_tool_optional( ("grease_pencil.extrude_move", {"type": 'E', "value": 'PRESS'}, None), @@ -4731,9 +4125,22 @@ def km_grease_pencil_edit_mode(params): # Move to layer op_menu("GREASE_PENCIL_MT_move_to_layer", {"type": 'M', "value": 'PRESS'}), + # Merge Down + ("grease_pencil.layer_merge", {"type": 'M', "value": 'PRESS', + "ctrl": True, "shift": True}, {"properties": [("mode", 'ACTIVE')]}), + + # Edit Lines overlay + ("wm.context_toggle", {"type": 'Q', "value": 'PRESS', "shift": True}, + {"properties": [("data_path", 'space_data.overlay.use_gpencil_edit_lines')]}), + ("wm.context_toggle", {"type": 'Q', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": [("data_path", 'space_data.overlay.use_gpencil_multiedit_line_only')]}), + # Context menu *_template_items_context_menu("VIEW3D_MT_greasepencil_edit_context_menu", params.context_menu_event), + # Vertex Groups + op_menu("VIEW3D_MT_greasepencil_vertex_group", {"type": 'G', "value": 'PRESS', "ctrl": True}), + # Reorder ("grease_pencil.reorder", {"type": 'UP_ARROW', "value": 'PRESS', "ctrl": True, "shift": True}, {"properties": [("direction", "TOP")]}), @@ -4756,10 +4163,17 @@ def km_grease_pencil_edit_mode(params): # Set Handle Type ("grease_pencil.set_handle_type", {"type": 'V', "value": 'PRESS'}, None), + # Join Fills + ("grease_pencil.join_fills", {"type": 'J', "value": 'PRESS', "shift": True}, None), + # Separate Fills + ("grease_pencil.separate_fills", {"type": 'P', "value": 'PRESS', "alt": True}, None), + op_tool_optional( - ("grease_pencil.interpolate", {"type": 'E', "value": 'PRESS', "ctrl": True}, None), + ("grease_pencil.interpolate", {"type": 'E', "value": 'PRESS', + "ctrl": True}, {"properties": [("use_selection", True)]}), (op_tool_cycle, "builtin.interpolate"), params), - ("grease_pencil.interpolate_sequence", {"type": 'E', "value": 'PRESS', "shift": True, "ctrl": True}, None), + ("grease_pencil.interpolate_sequence", {"type": 'E', "value": 'PRESS', + "shift": True, "ctrl": True}, {"properties": [("use_selection", True)]}), ]) return keymap @@ -4783,7 +4197,7 @@ def km_grease_pencil_sculpt_mode(params): ("grease_pencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, {"properties": [("mode", 'INVERT')]}), ("grease_pencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', - "shift": True}, {"properties": [("mode", 'SMOOTH')]}), + "shift": True}, {"properties": [("brush_toggle", 'SMOOTH')]}), # Selection mode ("wm.context_toggle", {"type": 'ONE', "value": 'PRESS'}, {"properties": [("data_path", "scene.tool_settings.use_gpencil_select_mask_point")]}), @@ -4791,11 +4205,52 @@ def km_grease_pencil_sculpt_mode(params): {"properties": [("data_path", "scene.tool_settings.use_gpencil_select_mask_stroke")]}), ("wm.context_toggle", {"type": 'THREE', "value": 'PRESS'}, {"properties": [("data_path", "scene.tool_settings.use_gpencil_select_mask_segment")]}), - *_template_paint_radial_control("gpencil_sculpt_paint"), - op_asset_shelf_popup( - "VIEW3D_AST_brush_gpencil_sculpt", - {"type": 'SPACE', "value": 'PRESS', "shift": True} + + # Edit Lines overlay + ("wm.context_toggle", {"type": 'Q', "value": 'PRESS', "shift": True}, + {"properties": [("data_path", 'space_data.overlay.use_gpencil_edit_lines')]}), + ("wm.context_toggle", {"type": 'Q', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": [("data_path", 'space_data.overlay.use_gpencil_multiedit_line_only')]}), + + # Keyframe Menu + op_menu("VIEW3D_MT_edit_greasepencil_animation", {"type": 'I', "value": 'PRESS'}), + + # Insert Blank Keyframe + ("grease_pencil.insert_blank_frame", {"type": 'I', "value": 'PRESS', "shift": True}, None), + + # Delete Animation menu + op_menu("GREASE_PENCIL_MT_draw_delete", {"type": 'I', "value": 'PRESS', "alt": True}), + + # Delete all active frames + ("grease_pencil.delete_frame", {"type": 'DEL', "value": 'PRESS', "shift": True}, + {"properties": [("type", "ALL_FRAMES")]}), + + # Merge Down + ("grease_pencil.layer_merge", {"type": 'M', "value": 'PRESS', + "ctrl": True, "shift": True}, {"properties": [("mode", 'ACTIVE')]}), + + # Copy/paste + ("grease_pencil.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), + ("grease_pencil.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), + ("grease_pencil.paste", {"type": 'V', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": [("paste_back", True)]}), + + # Active material + op_menu("VIEW3D_MT_greasepencil_material_active", {"type": 'U', "value": 'PRESS'}), + + # Active layer + op_menu("GREASE_PENCIL_MT_layer_active", {"type": 'Y', "value": 'PRESS'}), + + # Auto-masking menu. + op_menu_pie( + "VIEW3D_MT_grease_pencil_sculpt_automasking_pie", + {"type": 'A', "value": 'PRESS', "shift": True, "alt": True}, ), + ("wm.context_menu_enum", {"type": 'E', "value": 'PRESS', "alt": True}, + {"properties": [("data_path", "tool_settings.gpencil_sculpt_paint.brush.stroke_method")]}), + + *_template_paint_radial_control("gpencil_sculpt_paint"), + *_template_asset_shelf_popup("VIEW3D_AST_brush_gpencil_sculpt", params.spacebar_action), *_template_items_context_panel("VIEW3D_PT_greasepencil_sculpt_context_menu", params.context_menu_event), ]) @@ -4826,21 +4281,48 @@ def km_grease_pencil_weight_paint(params): # Radial controls *_template_paint_radial_control("gpencil_weight_paint"), ("wm.radial_control", {"type": 'F', "value": 'PRESS', "ctrl": True}, - radial_control_properties("gpencil_weight_paint", "weight", "use_unified_weight")), + radial_control_properties( + "gpencil_weight_paint", "weight", + secondary_prop="use_unified_weight", + )), # Toggle Add/Subtract for weight draw tool ("grease_pencil.weight_toggle_direction", {"type": 'D', "value": 'PRESS'}, None), + + # Edit Lines overlay + ("wm.context_toggle", {"type": 'Q', "value": 'PRESS', "shift": True}, + {"properties": [("data_path", 'space_data.overlay.use_gpencil_edit_lines')]}), + ("wm.context_toggle", {"type": 'Q', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": [("data_path", 'space_data.overlay.use_gpencil_multiedit_line_only')]}), + + # Active layer + op_menu("GREASE_PENCIL_MT_layer_active", {"type": 'Y', "value": 'PRESS'}), + + # Merge Down + ("grease_pencil.layer_merge", {"type": 'M', "value": 'PRESS', + "ctrl": True, "shift": True}, {"properties": [("mode", 'ACTIVE')]}), + + # Keyframe Menu + op_menu("VIEW3D_MT_edit_greasepencil_animation", {"type": 'I', "value": 'PRESS'}), + + # Insert Blank Keyframe + ("grease_pencil.insert_blank_frame", {"type": 'I', "value": 'PRESS', "shift": True}, None), + + # Delete Animation menu + op_menu("GREASE_PENCIL_MT_draw_delete", {"type": 'I', "value": 'PRESS', "alt": True}), + + # Delete all active frames + ("grease_pencil.delete_frame", {"type": 'DEL', "value": 'PRESS', "shift": True}, + {"properties": [("type", "ALL_FRAMES")]}), + # Sample weight ("grease_pencil.weight_sample", {"type": 'X', "value": 'PRESS', "shift": True}, None), # Context menu - *_template_items_context_panel("VIEW3D_PT_gpencil_weight_context_menu", params.context_menu_event), + *_template_items_context_panel("VIEW3D_PT_greasepencil_weight_context_menu", params.context_menu_event), # Show/hide layer *_template_items_hide_reveal_actions("grease_pencil.layer_hide", "grease_pencil.layer_reveal"), - op_asset_shelf_popup( - "VIEW3D_AST_brush_gpencil_weight", - {"type": 'SPACE', "value": 'PRESS', "shift": True} - ), + *_template_asset_shelf_popup("VIEW3D_AST_brush_gpencil_weight", params.spacebar_action), ]) if params.select_mouse == 'LEFTMOUSE': @@ -4884,15 +4366,47 @@ def km_grease_pencil_vertex_paint(params): {"properties": [("data_path", "scene.tool_settings.use_gpencil_vertex_select_mask_stroke")]}), ("wm.context_toggle", {"type": 'THREE', "value": 'PRESS'}, {"properties": [("data_path", "scene.tool_settings.use_gpencil_vertex_select_mask_segment")]}), + # Flip primary and secondary color + ("paint.brush_colors_flip", {"type": 'X', "value": 'PRESS'}, None), + ("paint.sample_color", {"type": 'X', "value": 'PRESS', "shift": True}, {"properties": [("merged", False)]}), + + # Edit Lines overlay + ("wm.context_toggle", {"type": 'Q', "value": 'PRESS', "shift": True}, + {"properties": [("data_path", 'space_data.overlay.use_gpencil_edit_lines')]}), + ("wm.context_toggle", {"type": 'Q', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": [("data_path", 'space_data.overlay.use_gpencil_multiedit_line_only')]}), + + # Active layer + op_menu("GREASE_PENCIL_MT_layer_active", {"type": 'Y', "value": 'PRESS'}), + + # Merge Down + ("grease_pencil.layer_merge", {"type": 'M', "value": 'PRESS', + "ctrl": True, "shift": True}, {"properties": [("mode", 'ACTIVE')]}), + + # Keyframe Menu + op_menu("VIEW3D_MT_edit_greasepencil_animation", {"type": 'I', "value": 'PRESS'}), + + # Insert Blank Keyframe + ("grease_pencil.insert_blank_frame", {"type": 'I', "value": 'PRESS', "shift": True}, None), + + # Delete Animation menu + op_menu("GREASE_PENCIL_MT_draw_delete", {"type": 'I', "value": 'PRESS', "alt": True}), + + # Delete all active frames + ("grease_pencil.delete_frame", {"type": 'DEL', "value": 'PRESS', "shift": True}, + {"properties": [("type", "ALL_FRAMES")]}), + # Radial controls *_template_paint_radial_control("gpencil_vertex_paint"), # Context menu *_template_items_context_panel("VIEW3D_PT_greasepencil_vertex_paint_context_menu", params.context_menu_event), + + *_template_asset_shelf_popup("VIEW3D_AST_brush_gpencil_vertex", params.spacebar_action), ]) return keymap -# Grease Pencil v3 Fill Tool. +# Grease Pencil Fill Tool. def km_grease_pencil_fill_tool(_params): @@ -4909,15 +4423,15 @@ def km_grease_pencil_fill_tool(_params): None), ("grease_pencil.fill", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, {"properties": [("invert", True)]}), - # Use regular stroke operator when holding shift to draw lines. - ("grease_pencil.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, + # Use regular stroke operator when holding alt to draw fill guides. + ("grease_pencil.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, None), ]) return keymap -def km_grease_pencil_fill_tool_modal_map(params): +def km_grease_pencil_fill_tool_modal_map(_params): items = [] keymap = ( "Fill Tool Modal Map", @@ -4931,9 +4445,9 @@ def km_grease_pencil_fill_tool_modal_map(params): ("CONFIRM", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None), ("EXTENSION_MODE_TOGGLE", {"type": 'S', "value": 'PRESS'}, None), ("EXTENSION_LENGTHEN", {"type": 'PAGE_UP', "value": 'PRESS', "repeat": True}, None), - ("EXTENSION_LENGTHEN", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None), + ("EXTENSION_LENGTHEN", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None), ("EXTENSION_SHORTEN", {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True}, None), - ("EXTENSION_SHORTEN", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None), + ("EXTENSION_SHORTEN", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None), ("EXTENSION_DRAG", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None), ("EXTENSION_COLLIDE", {"type": 'D', "value": 'PRESS'}, None), ("INVERT", {"type": 'LEFT_CTRL', "value": 'ANY', "any": True}, None), @@ -5010,11 +4524,10 @@ def km_object_mode(params): {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True}, None), ("collection.objects_remove_active", {"type": 'G', "value": 'PRESS', "shift": True, "alt": True}, None), *_template_items_object_subdivision_set(), - ("object.move_to_collection", {"type": 'M', "value": 'PRESS'}, None), - ("object.link_to_collection", {"type": 'M', "value": 'PRESS', "shift": True}, None), + op_menu("OBJECT_MT_move_to_collection", {"type": 'M', "value": 'PRESS'}), + op_menu("OBJECT_MT_link_to_collection", {"type": 'M', "value": 'PRESS', "shift": True}), *_template_items_hide_reveal_actions("object.hide_view_set", "object.hide_view_clear"), ("object.hide_collection", {"type": 'H', "value": 'PRESS', "ctrl": True}, None), - *_template_object_hide_collection_from_number_keys(), *_template_items_context_menu("VIEW3D_MT_object_context_menu", params.context_menu_event), ]) @@ -5144,7 +4657,6 @@ def km_pose(params): op_menu("VIEW3D_MT_bone_options_toggle", {"type": 'W', "value": 'PRESS', "shift": True}), op_menu("VIEW3D_MT_bone_options_enable", {"type": 'W', "value": 'PRESS', "shift": True, "ctrl": True}), op_menu("VIEW3D_MT_bone_options_disable", {"type": 'W', "value": 'PRESS', "alt": True}), - ("armature.collection_show_all", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "ctrl": True}, None), ("armature.assign_to_collection", {"type": 'M', "value": 'PRESS', "shift": True}, None), ("armature.move_to_collection", {"type": 'M', "value": 'PRESS'}, None), ("transform.bbone_resize", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None), @@ -5204,10 +4716,6 @@ def km_paint_curve(params): ("transform.translate", {"type": params.select_mouse, "value": 'CLICK_DRAG'}, None), ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None), ("transform.resize", {"type": 'S', "value": 'PRESS'}, None), - op_asset_shelf_popup( - "VIEW3D_AST_brush_sculpt_curves", - {"type": 'SPACE', "value": 'PRESS', "shift": True} - ), ]) return keymap @@ -5216,22 +4724,30 @@ def km_paint_curve(params): # Radial control setup helpers, this operator has a lot of properties. -def radial_control_properties(paint, prop, secondary_prop, secondary_rotation=False, color=False, zoom=False): - brush_path = "tool_settings." + paint + ".brush" - unified_path = "tool_settings.unified_paint_settings" +def radial_control_properties( + paint, + prop, + *, + secondary_prop, + secondary_rotation=False, + color=False, + zoom=False, +): + brush_path = "tool_settings.{:s}.brush".format(paint) + unified_path = "tool_settings.{:s}.unified_paint_settings".format(paint) rotation = "mask_texture_slot.angle" if secondary_rotation else "texture_slot.angle" return { "properties": [ - ("data_path_primary", brush_path + '.' + prop), - ("data_path_secondary", unified_path + '.' + prop if secondary_prop else ''), - ("use_secondary", unified_path + '.' + secondary_prop if secondary_prop else ''), - ("rotation_path", brush_path + '.' + rotation), - ("color_path", brush_path + '.cursor_color_add'), - ("fill_color_path", brush_path + '.color' if color else ''), - ("fill_color_override_path", unified_path + '.color' if color else ''), - ("fill_color_override_test_path", unified_path + '.use_unified_color' if color else ''), - ("zoom_path", "space_data.zoom" if zoom else ''), - ("image_id", brush_path + ''), + ("data_path_primary", "{:s}.{:s}".format(brush_path, prop)), + ("data_path_secondary", "{:s}.{:s}".format(unified_path, prop) if secondary_prop else ""), + ("use_secondary", "{:s}.{:s}".format(unified_path, secondary_prop) if secondary_prop else ""), + ("rotation_path", "{:s}.{:s}".format(brush_path, rotation)), + ("color_path", "{:s}.cursor_color_add".format(brush_path)), + ("fill_color_path", "{:s}.color".format(brush_path) if color else ""), + ("fill_color_override_path", "{:s}.color".format(unified_path) if color else ""), + ("fill_color_override_test_path", "{:s}.use_unified_color".format(unified_path) if color else ""), + ("zoom_path", "space_data.zoom" if zoom else ""), + ("image_id", brush_path), ("secondary_tex", secondary_rotation), ], } @@ -5245,23 +4761,40 @@ def _template_paint_radial_control(paint, rotation=False, secondary_rotation=Fal items.extend([ ("wm.radial_control", {"type": 'F', "value": 'PRESS'}, radial_control_properties( - paint, "size", "use_unified_size", secondary_rotation=secondary_rotation, color=color, zoom=zoom)), + paint, "size", + secondary_prop="use_unified_size", + secondary_rotation=secondary_rotation, + color=color, + zoom=zoom, + )), ("wm.radial_control", {"type": 'F', "value": 'PRESS', "shift": True}, radial_control_properties( - paint, "strength", "use_unified_strength", secondary_rotation=secondary_rotation, color=color)), + paint, "strength", + secondary_prop="use_unified_strength", + secondary_rotation=secondary_rotation, + color=color, + )), ]) if rotation: items.extend([ ("wm.radial_control", {"type": 'F', "value": 'PRESS', "ctrl": True}, - radial_control_properties(paint, "texture_slot.angle", None, color=color)), + radial_control_properties( + paint, "texture_slot.angle", + secondary_prop=None, + color=color, + )), ]) if secondary_rotation: items.extend([ ("wm.radial_control", {"type": 'F', "value": 'PRESS', "ctrl": True, "alt": True}, radial_control_properties( - paint, "mask_texture_slot.angle", None, secondary_rotation=secondary_rotation, color=color)), + paint, "mask_texture_slot.angle", + secondary_prop=None, + secondary_rotation=secondary_rotation, + color=color, + )), ]) return items @@ -5320,32 +4853,22 @@ def _template_view3d_paint_mask_select_loop(params): ("paint.face_select_loop", {"type": params.select_mouse, "value": 'PRESS', "alt": True, "shift": True, "ctrl": True}, {"properties": [("extend", True), ("select", False)]}), + ("paint.vert_select_loop", + {"type": params.select_mouse, "value": 'PRESS', "alt": True}, + {"properties": [("extend", False), ("select", True)]}), + ("paint.vert_select_loop", + {"type": params.select_mouse, "value": 'PRESS', "alt": True, "shift": True}, + {"properties": [("extend", True), ("select", True)]}), + ("paint.vert_select_loop", + {"type": params.select_mouse, "value": 'PRESS', "alt": True, "shift": True, "ctrl": True}, + {"properties": [("extend", True), ("select", False)]}), ] -def _template_view3d_gpencil_select(*, type, value, legacy, alt_select=False): - items = [ - ("gpencil.select", {"type": type, "value": value}, - {"properties": [("deselect_all", not legacy)]}), - ("gpencil.select", {"type": type, "value": value, "shift": True}, - {"properties": [("extend", True), ("toggle", True)]}), - ] - if type == 'LEFTMOUSE' and alt_select: - items.extend([ - # Selection shortcuts for when brushes are active on LMB-select. - ("gpencil.select", {"type": type, "value": value, "alt": True}, - {"properties": [("deselect_all", True)]}), - ("gpencil.select", {"type": type, "value": value, "alt": True, "shift": True}, - {"properties": [("extend", True), ("toggle", True)]}), - ]) - - return items - - def _template_node_select(*, type, value, select_passthrough): items = [ ("node.select", {"type": type, "value": value}, - {"properties": [("deselect_all", True), ("select_passthrough", select_passthrough)]}), + {"properties": [("select_passthrough", select_passthrough)]}), ("node.select", {"type": type, "value": value, "ctrl": True}, None), ("node.select", {"type": type, "value": value, "alt": True}, None), ("node.select", {"type": type, "value": value, "ctrl": True, "alt": True}, None), @@ -5399,6 +4922,34 @@ def _template_uv_select(*, type, value, select_passthrough, legacy): return items +def _template_mask_select(*, type, value, select_passthrough, legacy): + + # See: `use_tweak_select_passthrough` doc-string. + if select_passthrough and (value in {'CLICK', 'RELEASE'}): + select_passthrough = False + + items = [ + ("mask.select", {"type": type, "value": value}, + {"properties": [ + *((("deselect_all", True),) if not legacy else ()), + *((("select_passthrough", True),) if select_passthrough else ()), + ]}), + ("mask.select", {"type": type, "value": value, "shift": True}, + {"properties": [("toggle", True)]}), + ] + + if select_passthrough: + # Add an additional click item to de-select all other items, + # needed so pass-through is able to de-select other items. + items.append(( + "mask.select", + {"type": type, "value": 'CLICK'}, + {"properties": [("deselect_all", True)]}, + )) + + return items + + def _template_sequencer_generic_select(*, type, value, legacy): return [( "sequencer.select", @@ -5430,19 +4981,6 @@ def _template_sequencer_preview_select(*, type, value, legacy): )] -def _template_sequencer_timeline_select(*, type, value, legacy): - return _template_sequencer_generic_select( - type=type, value=value, legacy=legacy, - ) + [( - "sequencer.select", - {"type": type, "value": value, **{m: True for m in mods}}, - {"properties": [(c, True) for c in props]}, - ) for props, mods in ( - (("side_of_frame", "linked_time"), ("ctrl",)), - (("side_of_frame", "linked_time", "extend"), ("ctrl", "shift")), - )] - - def km_image_paint(params): items = [] keymap = ( @@ -5456,10 +4994,15 @@ def km_image_paint(params): ("paint.image_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, {"properties": [("mode", 'INVERT')]}), ("paint.image_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("mode", 'SMOOTH')]}), + {"properties": [("brush_toggle", 'SMOOTH')]}), ("paint.brush_colors_flip", {"type": 'X', "value": 'PRESS'}, None), ("paint.grab_clone", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None), - ("paint.sample_color", {"type": 'X', "value": 'PRESS', "shift": True}, None), + ("paint.sample_color", + {"type": 'X', "value": 'PRESS', "shift": True}, + {"properties": [("merged", False)]}), + ("paint.sample_color", + {"type": 'X', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": [("merged", True)]}), ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, {"properties": [("scalar", 0.9)]}), ("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True}, @@ -5484,14 +5027,8 @@ def km_image_paint(params): ("wm.context_menu_enum", {"type": 'E', "value": 'PRESS', "alt": True}, {"properties": [("data_path", "tool_settings.image_paint.brush.stroke_method")]}), *_template_items_context_panel("VIEW3D_PT_paint_texture_context_menu", params.context_menu_event), - op_asset_shelf_popup( - "VIEW3D_AST_brush_texture_paint", - {"type": 'SPACE', "value": 'PRESS', "shift": True} - ), - op_asset_shelf_popup( - "IMAGE_AST_brush_paint", - {"type": 'SPACE', "value": 'PRESS', "shift": True} - ), + *_template_asset_shelf_popup("VIEW3D_AST_brush_texture_paint", params.spacebar_action), + *_template_asset_shelf_popup("IMAGE_AST_brush_paint", params.spacebar_action), ]) if params.legacy: @@ -5513,9 +5050,12 @@ def km_vertex_paint(params): ("paint.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, {"properties": [("mode", 'INVERT')]}), ("paint.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("mode", 'SMOOTH')]}), + {"properties": [("brush_toggle", 'SMOOTH')]}), ("paint.brush_colors_flip", {"type": 'X', "value": 'PRESS'}, None), - ("paint.sample_color", {"type": 'X', "value": 'PRESS', "shift": True}, None), + ("paint.sample_color", {"type": 'X', "value": 'PRESS', "shift": True}, {"properties": [("merged", False)]}), + ("paint.sample_color", + {"type": 'X', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": [("merged", True)]}), ("paint.vertex_color_set", {"type": 'X', "value": 'PRESS', "ctrl": True}, None), ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, {"properties": [("scalar", 0.9)]}), @@ -5542,10 +5082,7 @@ def km_vertex_paint(params): {"properties": [("data_path", "tool_settings.vertex_paint.brush.stroke_method")]}), ("paint.face_vert_reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None), *_template_items_context_panel("VIEW3D_PT_paint_vertex_context_menu", params.context_menu_event), - op_asset_shelf_popup( - "VIEW3D_AST_brush_vertex_paint", - {"type": 'SPACE', "value": 'PRESS', "shift": True} - ), + *_template_asset_shelf_popup("VIEW3D_AST_brush_vertex_paint", params.spacebar_action), ]) if params.legacy: @@ -5575,7 +5112,7 @@ def km_weight_paint(params): ("paint.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, {"properties": [("mode", 'INVERT')]}), ("paint.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("mode", 'SMOOTH')]}), + {"properties": [("brush_toggle", 'SMOOTH')]}), ("paint.weight_sample", {"type": 'X', "value": 'PRESS', "shift": True}, None), ("paint.weight_sample_group", {"type": 'X', "value": 'PRESS', "ctrl": True, "shift": True}, None), ("paint.weight_gradient", {"type": 'A', "value": 'PRESS', "shift": True, "alt": True}, @@ -5589,7 +5126,10 @@ def km_weight_paint(params): {"properties": [("scalar", 1.0 / 0.9)]}), *_template_paint_radial_control("weight_paint"), ("wm.radial_control", {"type": 'F', "value": 'PRESS', "ctrl": True}, - radial_control_properties("weight_paint", "weight", "use_unified_weight")), + radial_control_properties( + "weight_paint", "weight", + secondary_prop="use_unified_weight", + )), ("wm.context_menu_enum", {"type": 'E', "value": 'PRESS', "alt": True}, {"properties": [("data_path", "tool_settings.vertex_paint.brush.stroke_method")]}), ("wm.context_toggle", {"type": 'ONE', "value": 'PRESS'}, @@ -5601,12 +5141,8 @@ def km_weight_paint(params): ("wm.context_toggle", {"type": 'S', "value": 'PRESS', "shift": True}, {"properties": [("data_path", "tool_settings.weight_paint.brush.use_smooth_stroke")]}), op_menu_pie("VIEW3D_MT_wpaint_vgroup_lock_pie", {"type": 'K', "value": 'PRESS'}), - ("paint.face_vert_reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None), *_template_items_context_panel("VIEW3D_PT_paint_weight_context_menu", params.context_menu_event), - op_asset_shelf_popup( - "VIEW3D_AST_brush_weight_paint", - {"type": 'SPACE', "value": 'PRESS', "shift": True} - ), + *_template_asset_shelf_popup("VIEW3D_AST_brush_weight_paint", params.spacebar_action), ]) if params.select_mouse == 'LEFTMOUSE': @@ -5681,8 +5217,9 @@ def km_paint_vertex_mask(params): ("paint.vert_select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None), ]) - # TODO: use `_template_view3d_paint_mask_select_loop` if loop-select is supported. - # See: `km_paint_face_mask`. + # For left mouse the tool key-maps are used because this interferes with Alt-LMB for regular selection. + if params.select_mouse == 'RIGHTMOUSE': + items.extend(_template_view3d_paint_mask_select_loop(params)) return keymap @@ -5704,7 +5241,11 @@ def km_sculpt(params): ("sculpt.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, {"properties": [("mode", 'INVERT')]}), ("sculpt.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("mode", 'SMOOTH')]}), + {"properties": [("brush_toggle", 'SMOOTH')]}), + ("sculpt.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, + {"properties": [("brush_toggle", 'MASK')]}), + ("sculpt.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True}, + {"properties": [("mode", 'INVERT'), ("brush_toggle", 'MASK')]}), # Expand ("sculpt.expand", {"type": 'A', "value": 'PRESS', "shift": True}, {"properties": [ @@ -5756,9 +5297,9 @@ def km_sculpt(params): # Subdivision levels *_template_items_object_subdivision_set(), ("object.subdivision_set", {"type": 'ONE', "value": 'PRESS', "alt": True, "repeat": True}, - {"properties": [("level", -1), ("relative", True)]}), + {"properties": [("level", -1), ("relative", True), ("ensure_modifier", False)]}), ("object.subdivision_set", {"type": 'TWO', "value": 'PRESS', "alt": True, "repeat": True}, - {"properties": [("level", 1), ("relative", True)]}), + {"properties": [("level", 1), ("relative", True), ("ensure_modifier", False)]}), # Mask ("paint.mask_flood_fill", {"type": 'M', "value": 'PRESS', "alt": True}, {"properties": [("mode", 'VALUE'), ("value", 0.0)]}), @@ -5773,7 +5314,12 @@ def km_sculpt(params): ("object.voxel_remesh", {"type": 'R', "value": 'PRESS', "ctrl": True}, None), ("object.voxel_size_edit", {"type": 'R', "value": 'PRESS'}, None), # Color - ("sculpt.sample_color", {"type": 'X', "value": 'PRESS', "shift": True}, None), + ("paint.sample_color", + {"type": 'X', "value": 'PRESS', "shift": True}, + {"properties": [("merged", False)]}), + ("paint.sample_color", + {"type": 'X', "value": 'PRESS', "shift": True, "ctrl": True}, + {"properties": [("merged", True)]}), ("paint.brush_colors_flip", {"type": 'X', "value": 'PRESS', }, None), # Brush properties ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, @@ -5808,39 +5354,57 @@ def km_sculpt(params): *_template_items_context_panel("VIEW3D_PT_sculpt_context_menu", params.context_menu_event), # Brushes ("brush.asset_activate", {"type": 'V', "value": 'PRESS'}, - {"properties": [("asset_library_type", 'ESSENTIALS'), - ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Draw")]}), + {"properties": [ + ("asset_library_type", 'ESSENTIALS'), + ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Draw"), + ]}), ("brush.asset_activate", {"type": 'S', "value": 'PRESS'}, - {"properties": [("asset_library_type", 'ESSENTIALS'), - ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Smooth")]}), + {"properties": [ + ("asset_library_type", 'ESSENTIALS'), + ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Smooth"), + ]}), ("brush.asset_activate", {"type": 'P', "value": 'PRESS'}, - {"properties": [("asset_library_type", 'ESSENTIALS'), - ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Pinch/Magnify")]}), + {"properties": [ + ("asset_library_type", 'ESSENTIALS'), + ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Pinch/Magnify"), + ]}), ("brush.asset_activate", {"type": 'I', "value": 'PRESS'}, - {"properties": [("asset_library_type", 'ESSENTIALS'), - ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Inflate/Deflate")]}), + {"properties": [ + ("asset_library_type", 'ESSENTIALS'), + ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Inflate/Deflate"), + ]}), ("brush.asset_activate", {"type": 'G', "value": 'PRESS'}, - {"properties": [("asset_library_type", 'ESSENTIALS'), - ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Grab")]}), + {"properties": [ + ("asset_library_type", 'ESSENTIALS'), + ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Grab"), + ]}), ("brush.asset_activate", {"type": 'T', "value": 'PRESS', "shift": True}, - {"properties": [("asset_library_type", 'ESSENTIALS'), - ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Scrape/Fill")]}), + {"properties": [ + ("asset_library_type", 'ESSENTIALS'), + ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Scrape/Fill"), + ]}), ("brush.asset_activate", {"type": 'C', "value": 'PRESS'}, - {"properties": [("asset_library_type", 'ESSENTIALS'), - ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Clay Strips")]}), + {"properties": [ + ("asset_library_type", 'ESSENTIALS'), + ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Clay Strips"), + ]}), ("brush.asset_activate", {"type": 'C', "value": 'PRESS', "shift": True}, - {"properties": [("asset_library_type", 'ESSENTIALS'), - ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Crease")]}), + {"properties": [ + ("asset_library_type", 'ESSENTIALS'), + ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Crease Polish"), + ]}), ("brush.asset_activate", {"type": 'K', "value": 'PRESS'}, - {"properties": [("asset_library_type", 'ESSENTIALS'), - ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Snake Hook")]}), + {"properties": [ + ("asset_library_type", 'ESSENTIALS'), + ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Snake Hook"), + ]}), ("brush.asset_activate", {"type": 'M', "value": 'PRESS'}, - {"properties": [("asset_library_type", 'ESSENTIALS'), - ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Mask")]}), - op_asset_shelf_popup( - "VIEW3D_AST_brush_sculpt", - {"type": 'SPACE', "value": 'PRESS', "shift": True} - ), + {"properties": [ + ("asset_library_type", 'ESSENTIALS'), + ("relative_asset_identifier", "brushes/essentials_brushes-mesh_sculpt.blend/Brush/Mask"), + ("use_toggle", True) + ]}), + *_template_asset_shelf_popup("VIEW3D_AST_brush_sculpt", params.spacebar_action), ]) # Lasso Masking. @@ -5882,7 +5446,7 @@ def km_sculpt_curves(params): ("sculpt_curves.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, {"properties": [("mode", 'INVERT')]}), ("sculpt_curves.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("mode", 'SMOOTH')]}), + {"properties": [("brush_toggle", 'SMOOTH')]}), ("curves.set_selection_domain", {"type": 'ONE', "value": 'PRESS'}, {"properties": [("domain", 'POINT')]}), ("curves.set_selection_domain", {"type": 'TWO', "value": 'PRESS'}, {"properties": [("domain", 'CURVE')]}), *_template_paint_radial_control("curves_sculpt"), @@ -5893,6 +5457,7 @@ def km_sculpt_curves(params): *_template_items_select_actions(params, "curves.select_all"), ("sculpt_curves.min_distance_edit", {"type": 'R', "value": 'PRESS'}, {}), ("sculpt_curves.select_grow", {"type": 'A', "value": 'PRESS', "shift": True}, {}), + *_template_asset_shelf_popup("VIEW3D_AST_brush_sculpt_curves", params.spacebar_action), ]) return keymap @@ -6132,7 +5697,6 @@ def km_edit_armature(params): op_menu("VIEW3D_MT_bone_options_enable", {"type": 'W', "value": 'PRESS', "shift": True, "ctrl": True}), op_menu("VIEW3D_MT_bone_options_disable", {"type": 'W', "value": 'PRESS', "alt": True}), # Armature/bone layers. - ("armature.collection_show_all", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "ctrl": True}, None), ("armature.assign_to_collection", {"type": 'M', "value": 'PRESS', "shift": True}, None), ("armature.move_to_collection", {"type": 'M', "value": 'PRESS'}, None), # Special transforms. @@ -6372,7 +5936,7 @@ def km_edit_curve_legacy(params): ("curve.handle_type_set", {"type": 'V', "value": 'PRESS'}, None), ("curve.vertex_add", {"type": params.action_mouse, "value": 'CLICK', "ctrl": True}, None), *_template_items_select_actions(params, "curve.select_all"), - ("curve.select_row", {"type": 'R', "value": 'PRESS', "shift": True}, None), + ("curve.select_row", {"type": 'R', "value": 'PRESS', "shift": True, "ctrl": True}, None), ("curve.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), ("curve.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), ("curve.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None), @@ -6433,10 +5997,15 @@ def km_edit_curves(params): *_template_items_select_actions(params, "curves.select_all"), ("curves.extrude_move", {"type": 'E', "value": 'PRESS'}, None), ("curves.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None), + ("curves.select_linked_pick", {"type": 'L', "value": 'PRESS'}, {"properties": [("deselect", False)]}), + ("curves.select_linked_pick", {"type": 'L', "value": 'PRESS', + "shift": True}, {"properties": [("deselect", True)]}), ("curves.delete", {"type": 'X', "value": 'PRESS'}, None), ("curves.delete", {"type": 'DEL', "value": 'PRESS'}, None), + ("curves.separate", {"type": 'P', "value": 'PRESS'}, None), ("curves.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), ("curves.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None), + ("curves.split", {"type": 'Y', "value": 'PRESS'}, None), *_template_items_proportional_editing( params, connected=True, toggle_data_path="tool_settings.use_proportional_edit"), ("curves.tilt_clear", {"type": 'T', "value": 'PRESS', "alt": True}, None), @@ -6454,6 +6023,33 @@ def km_edit_curves(params): return keymap +# Point cloud edit mode. +def km_edit_pointcloud(params): + items = [] + keymap = ( + "Point Cloud", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": items}, + ) + + items.extend([ + # Transform Actions. + *_template_items_transform_actions(params, use_bend=True, use_mirror=True), + + ("pointcloud.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None), + *_template_items_select_actions(params, "pointcloud.select_all"), + ("pointcloud.delete", {"type": 'X', "value": 'PRESS'}, None), + ("pointcloud.delete", {"type": 'DEL', "value": 'PRESS'}, None), + ("pointcloud.separate", {"type": 'P', "value": 'PRESS'}, None), + ("transform.transform", {"type": 'S', "value": 'PRESS', "alt": True}, + {"properties": [("mode", 'CURVE_SHRINKFATTEN')]}), + *_template_items_proportional_editing( + params, connected=True, toggle_data_path="tool_settings.use_proportional_edit"), + ]) + + return keymap + + # ------------------------------------------------------------------------------ # Modal Maps and Gizmos @@ -6507,7 +6103,7 @@ def km_transform_modal_map(params): {"items": items}, ) - alt_without_navigaton = {} if params.use_alt_navigation else {"alt": True} + alt_without_navigation = {} if params.use_alt_navigation else {"alt": True} items.extend([ ("CONFIRM", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None), @@ -6543,26 +6139,28 @@ def km_transform_modal_map(params): ("PROPORTIONAL_SIZE_DOWN", {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True}, None), ("PROPORTIONAL_SIZE_UP", {"type": 'PAGE_UP', "value": 'PRESS', "shift": True, "repeat": True}, None), ("PROPORTIONAL_SIZE_DOWN", {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True, "repeat": True}, None), - ("PROPORTIONAL_SIZE_UP", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', **alt_without_navigaton}, None), - ("PROPORTIONAL_SIZE_DOWN", {"type": 'WHEELUPMOUSE', "value": 'PRESS', **alt_without_navigaton}, None), + ("PROPORTIONAL_SIZE_UP", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', **alt_without_navigation}, None), + ("PROPORTIONAL_SIZE_DOWN", {"type": 'WHEELUPMOUSE', "value": 'PRESS', **alt_without_navigation}, None), ("PROPORTIONAL_SIZE_UP", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True}, None), ("PROPORTIONAL_SIZE_DOWN", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True}, None), - ("PROPORTIONAL_SIZE", {"type": 'TRACKPADPAN', "value": 'ANY', **alt_without_navigaton}, None), + ("PROPORTIONAL_SIZE", {"type": 'TRACKPADPAN', "value": 'ANY', **alt_without_navigation}, None), ("AUTOIK_CHAIN_LEN_UP", {"type": 'PAGE_UP', "value": 'PRESS', "repeat": True}, None), ("AUTOIK_CHAIN_LEN_DOWN", {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True}, None), ("AUTOIK_CHAIN_LEN_UP", {"type": 'PAGE_UP', "value": 'PRESS', "shift": True, "repeat": True}, None), ("AUTOIK_CHAIN_LEN_DOWN", {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True, "repeat": True}, None), - ("AUTOIK_CHAIN_LEN_UP", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', **alt_without_navigaton}, None), - ("AUTOIK_CHAIN_LEN_DOWN", {"type": 'WHEELUPMOUSE', "value": 'PRESS', **alt_without_navigaton}, None), + ("AUTOIK_CHAIN_LEN_UP", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', **alt_without_navigation}, None), + ("AUTOIK_CHAIN_LEN_DOWN", {"type": 'WHEELUPMOUSE', "value": 'PRESS', **alt_without_navigation}, None), ("AUTOIK_CHAIN_LEN_UP", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True}, None), ("AUTOIK_CHAIN_LEN_DOWN", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True}, None), ("INSERTOFS_TOGGLE_DIR", {"type": 'T', "value": 'PRESS'}, None), ("NODE_ATTACH_ON", {"type": 'LEFT_ALT', "value": 'RELEASE', "any": True}, None), ("NODE_ATTACH_OFF", {"type": 'LEFT_ALT', "value": 'PRESS', "any": True}, None), - ("AUTOCONSTRAIN", {"type": 'MIDDLEMOUSE', "value": 'ANY', **alt_without_navigaton}, None), - ("AUTOCONSTRAINPLANE", {"type": 'MIDDLEMOUSE', "value": 'ANY', "shift": True, **alt_without_navigaton}, None), + ("NODE_FRAME", {"type": 'F', "value": 'PRESS'}, None), + ("AUTOCONSTRAIN", {"type": 'MIDDLEMOUSE', "value": 'ANY', **alt_without_navigation}, None), + ("AUTOCONSTRAINPLANE", {"type": 'MIDDLEMOUSE', "value": 'ANY', "shift": True, **alt_without_navigation}, None), ("PRECISION", {"type": 'LEFT_SHIFT', "value": 'ANY', "any": True}, None), ("PRECISION", {"type": 'RIGHT_SHIFT', "value": 'ANY', "any": True}, None), + ("STRIP_CLAMP_TOGGLE", {"type": 'C', "value": 'PRESS', "any": True}, None), ]) if params.use_alt_navigation: @@ -6847,6 +6445,14 @@ def km_bevel_modal_map(_params): ("INNER_MITER_CHANGE", {"type": 'I', "value": 'PRESS', "any": True}, None), ("PROFILE_TYPE_CHANGE", {"type": 'Z', "value": 'PRESS', "any": True}, None), ("VERTEX_MESH_CHANGE", {"type": 'N', "value": 'PRESS', "any": True}, None), + ("SNAP_ON", {"type": 'LEFT_CTRL', "value": 'PRESS', "any": True}, None), + ("SNAP_ON", {"type": 'RIGHT_CTRL', "value": 'PRESS', "any": True}, None), + ("SNAP_OFF", {"type": 'LEFT_CTRL', "value": 'RELEASE', "any": True}, None), + ("SNAP_OFF", {"type": 'RIGHT_CTRL', "value": 'RELEASE', "any": True}, None), + ("PRECISION_ON", {"type": 'LEFT_SHIFT', "value": 'PRESS', "any": True}, None), + ("PRECISION_OFF", {"type": 'LEFT_SHIFT', "value": 'RELEASE', "any": True}, None), + ("PRECISION_ON", {"type": 'RIGHT_SHIFT', "value": 'PRESS', "any": True}, None), + ("PRECISION_OFF", {"type": 'RIGHT_SHIFT', "value": 'RELEASE', "any": True}, None), ]) return keymap @@ -6867,25 +6473,25 @@ def km_view3d_fly_modal(_params): ("CONFIRM", {"type": 'RET', "value": 'PRESS', "any": True}, None), ("CONFIRM", {"type": 'SPACE', "value": 'PRESS', "any": True}, None), ("CONFIRM", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "any": True}, None), + ("CONFIRM", {"type": 'TRACKPADPAN', "value": 'ANY'}, None), + ("FORWARD", {"type": 'W', "value": 'PRESS', "repeat": True}, None), + ("FORWARD", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, None), + ("BACKWARD", {"type": 'S', "value": 'PRESS', "repeat": True}, None), + ("BACKWARD", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, None), + ("LEFT", {"type": 'A', "value": 'PRESS', "repeat": True}, None), + ("LEFT", {"type": 'LEFT_ARROW', "value": 'PRESS', "repeat": True}, None), + ("RIGHT", {"type": 'D', "value": 'PRESS', "repeat": True}, None), + ("RIGHT", {"type": 'RIGHT_ARROW', "value": 'PRESS', "repeat": True}, None), + ("UP", {"type": 'E', "value": 'PRESS', "repeat": True}, None), + ("UP", {"type": 'R', "value": 'PRESS', "repeat": True}, None), + ("DOWN", {"type": 'Q', "value": 'PRESS', "repeat": True}, None), + ("DOWN", {"type": 'F', "value": 'PRESS', "repeat": True}, None), ("ACCELERATE", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "any": True, "repeat": True}, None), ("DECELERATE", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "any": True, "repeat": True}, None), ("ACCELERATE", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "any": True}, None), ("DECELERATE", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "any": True}, None), - ("CONFIRM", {"type": 'TRACKPADPAN', "value": 'ANY'}, None), ("PAN_ENABLE", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "any": True}, None), ("PAN_DISABLE", {"type": 'MIDDLEMOUSE', "value": 'RELEASE', "any": True}, None), - ("FORWARD", {"type": 'W', "value": 'PRESS', "repeat": True}, None), - ("BACKWARD", {"type": 'S', "value": 'PRESS', "repeat": True}, None), - ("LEFT", {"type": 'A', "value": 'PRESS', "repeat": True}, None), - ("RIGHT", {"type": 'D', "value": 'PRESS', "repeat": True}, None), - ("UP", {"type": 'E', "value": 'PRESS', "repeat": True}, None), - ("DOWN", {"type": 'Q', "value": 'PRESS', "repeat": True}, None), - ("UP", {"type": 'R', "value": 'PRESS', "repeat": True}, None), - ("DOWN", {"type": 'F', "value": 'PRESS', "repeat": True}, None), - ("FORWARD", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, None), - ("BACKWARD", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, None), - ("LEFT", {"type": 'LEFT_ARROW', "value": 'PRESS', "repeat": True}, None), - ("RIGHT", {"type": 'RIGHT_ARROW', "value": 'PRESS', "repeat": True}, None), ("AXIS_LOCK_X", {"type": 'X', "value": 'PRESS'}, None), ("AXIS_LOCK_Z", {"type": 'Z', "value": 'PRESS'}, None), ("PRECISION_ENABLE", {"type": 'LEFT_ALT', "value": 'PRESS', "any": True}, None), @@ -6919,6 +6525,36 @@ def km_view3d_walk_modal(_params): ("CONFIRM", {"type": 'LEFTMOUSE', "value": 'ANY', "any": True}, None), ("CONFIRM", {"type": 'RET', "value": 'PRESS', "any": True}, None), ("CONFIRM", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "any": True}, None), + ("FORWARD", {"type": 'W', "value": 'PRESS', "any": True}, None), + ("FORWARD_STOP", {"type": 'W', "value": 'RELEASE', "any": True}, None), + ("FORWARD", {"type": 'UP_ARROW', "value": 'PRESS'}, None), + ("FORWARD_STOP", {"type": 'UP_ARROW', "value": 'RELEASE', "any": True}, None), + ("BACKWARD", {"type": 'S', "value": 'PRESS', "any": True}, None), + ("BACKWARD_STOP", {"type": 'S', "value": 'RELEASE', "any": True}, None), + ("BACKWARD", {"type": 'DOWN_ARROW', "value": 'PRESS'}, None), + ("BACKWARD_STOP", {"type": 'DOWN_ARROW', "value": 'RELEASE', "any": True}, None), + ("LEFT", {"type": 'A', "value": 'PRESS', "any": True}, None), + ("LEFT_STOP", {"type": 'A', "value": 'RELEASE', "any": True}, None), + ("LEFT", {"type": 'LEFT_ARROW', "value": 'PRESS'}, None), + ("LEFT_STOP", {"type": 'LEFT_ARROW', "value": 'RELEASE', "any": True}, None), + ("RIGHT", {"type": 'D', "value": 'PRESS', "any": True}, None), + ("RIGHT_STOP", {"type": 'D', "value": 'RELEASE', "any": True}, None), + ("RIGHT", {"type": 'RIGHT_ARROW', "value": 'PRESS'}, None), + ("RIGHT_STOP", {"type": 'RIGHT_ARROW', "value": 'RELEASE', "any": True}, None), + ("UP", {"type": 'E', "value": 'PRESS', "any": True}, None), + ("UP_STOP", {"type": 'E', "value": 'RELEASE', "any": True}, None), + ("DOWN", {"type": 'Q', "value": 'PRESS', "any": True}, None), + ("DOWN_STOP", {"type": 'Q', "value": 'RELEASE', "any": True}, None), + ("LOCAL_UP", {"type": 'R', "value": 'PRESS', "any": True}, None), + ("LOCAL_UP_STOP", {"type": 'R', "value": 'RELEASE', "any": True}, None), + ("LOCAL_DOWN", {"type": 'F', "value": 'PRESS', "any": True}, None), + ("LOCAL_DOWN_STOP", {"type": 'F', "value": 'RELEASE', "any": True}, None), + ("JUMP", {"type": 'V', "value": 'PRESS', "any": True}, None), + ("JUMP_STOP", {"type": 'V', "value": 'RELEASE', "any": True}, None), + ("INCREASE_JUMP", {"type": 'PERIOD', "value": 'PRESS', "any": True}, None), + ("DECREASE_JUMP", {"type": 'COMMA', "value": 'PRESS', "any": True}, None), + ("TELEPORT", {"type": 'SPACE', "value": 'PRESS', "any": True}, None), + ("TELEPORT", {"type": 'MIDDLEMOUSE', "value": 'ANY', "any": True}, None), ("FAST_ENABLE", {"type": 'LEFT_SHIFT', "value": 'PRESS', "any": True}, None), ("FAST_DISABLE", {"type": 'LEFT_SHIFT', "value": 'RELEASE', "any": True}, None), ("FAST_ENABLE", {"type": 'RIGHT_SHIFT', "value": 'PRESS', "any": True}, None), @@ -6927,43 +6563,13 @@ def km_view3d_walk_modal(_params): ("SLOW_DISABLE", {"type": 'LEFT_ALT', "value": 'RELEASE', "any": True}, None), ("SLOW_ENABLE", {"type": 'RIGHT_ALT', "value": 'PRESS', "any": True}, None), ("SLOW_DISABLE", {"type": 'RIGHT_ALT', "value": 'RELEASE', "any": True}, None), - ("FORWARD", {"type": 'W', "value": 'PRESS', "any": True}, None), - ("BACKWARD", {"type": 'S', "value": 'PRESS', "any": True}, None), - ("LEFT", {"type": 'A', "value": 'PRESS', "any": True}, None), - ("RIGHT", {"type": 'D', "value": 'PRESS', "any": True}, None), - ("UP", {"type": 'E', "value": 'PRESS', "any": True}, None), - ("DOWN", {"type": 'Q', "value": 'PRESS', "any": True}, None), - ("LOCAL_UP", {"type": 'R', "value": 'PRESS', "any": True}, None), - ("LOCAL_DOWN", {"type": 'F', "value": 'PRESS', "any": True}, None), - ("FORWARD_STOP", {"type": 'W', "value": 'RELEASE', "any": True}, None), - ("BACKWARD_STOP", {"type": 'S', "value": 'RELEASE', "any": True}, None), - ("LEFT_STOP", {"type": 'A', "value": 'RELEASE', "any": True}, None), - ("RIGHT_STOP", {"type": 'D', "value": 'RELEASE', "any": True}, None), - ("UP_STOP", {"type": 'E', "value": 'RELEASE', "any": True}, None), - ("DOWN_STOP", {"type": 'Q', "value": 'RELEASE', "any": True}, None), - ("LOCAL_UP_STOP", {"type": 'R', "value": 'RELEASE', "any": True}, None), - ("LOCAL_DOWN_STOP", {"type": 'F', "value": 'RELEASE', "any": True}, None), - ("FORWARD", {"type": 'UP_ARROW', "value": 'PRESS'}, None), - ("BACKWARD", {"type": 'DOWN_ARROW', "value": 'PRESS'}, None), - ("LEFT", {"type": 'LEFT_ARROW', "value": 'PRESS'}, None), - ("RIGHT", {"type": 'RIGHT_ARROW', "value": 'PRESS'}, None), - ("FORWARD_STOP", {"type": 'UP_ARROW', "value": 'RELEASE', "any": True}, None), - ("BACKWARD_STOP", {"type": 'DOWN_ARROW', "value": 'RELEASE', "any": True}, None), - ("LEFT_STOP", {"type": 'LEFT_ARROW', "value": 'RELEASE', "any": True}, None), - ("RIGHT_STOP", {"type": 'RIGHT_ARROW', "value": 'RELEASE', "any": True}, None), ("GRAVITY_TOGGLE", {"type": 'TAB', "value": 'PRESS'}, None), ("GRAVITY_TOGGLE", {"type": 'G', "value": 'PRESS'}, None), - ("JUMP", {"type": 'V', "value": 'PRESS', "any": True}, None), - ("JUMP_STOP", {"type": 'V', "value": 'RELEASE', "any": True}, None), - ("TELEPORT", {"type": 'SPACE', "value": 'PRESS', "any": True}, None), - ("TELEPORT", {"type": 'MIDDLEMOUSE', "value": 'ANY', "any": True}, None), ("ACCELERATE", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "any": True, "repeat": True}, None), ("DECELERATE", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "any": True, "repeat": True}, None), ("ACCELERATE", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "any": True}, None), ("DECELERATE", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "any": True}, None), ("AXIS_LOCK_Z", {"type": 'Z', "value": 'PRESS'}, None), - ("INCREASE_JUMP", {"type": 'PERIOD', "value": 'PRESS', "any": True}, None), - ("DECREASE_JUMP", {"type": 'COMMA', "value": 'PRESS', "any": True}, None), ]) return keymap @@ -7067,10 +6673,11 @@ def km_sculpt_expand_modal(_params): ("RECURSION_STEP_GEODESIC", {"type": 'R', "value": 'PRESS'}, None), ("RECURSION_STEP_TOPOLOGY", {"type": 'R', "value": 'PRESS', "alt": True}, None), ("MOVE_TOGGLE", {"type": 'SPACE', "value": 'ANY', "any": True}, None), - *((e, {"type": NUMBERS_1[i], "value": 'PRESS', "any": True}, None) for i, e in enumerate( - ("FALLOFF_GEODESICS", "FALLOFF_TOPOLOGY", "FALLOFF_TOPOLOGY_DIAGONALS", "FALLOFF_SPHERICAL"))), - *((e, {"type": "NUMPAD_%i" % (i + 1), "value": 'PRESS', "any": True}, None) for i, e in enumerate( - ("FALLOFF_GEODESICS", "FALLOFF_TOPOLOGY", "FALLOFF_TOPOLOGY_DIAGONALS", "FALLOFF_SPHERICAL"))), + *((e, {"type": numseq_1[i], "value": 'PRESS', "any": True}, None) + for numseq_1 in (NUMBERS_1, NUMPAD_1) + for i, e in enumerate( + ('FALLOFF_GEODESICS', 'FALLOFF_TOPOLOGY', 'FALLOFF_TOPOLOGY_DIAGONALS', 'FALLOFF_SPHERICAL'), + )), ("SNAP_TOGGLE", {"type": 'LEFT_CTRL', "value": 'ANY'}, None), ("SNAP_TOGGLE", {"type": 'RIGHT_CTRL', "value": 'ANY'}, None), ("LOOP_COUNT_INCREASE", {"type": 'W', "value": 'PRESS', "any": True, "repeat": True}, None), @@ -7141,7 +6748,55 @@ def km_node_link_modal_map(_params): return keymap +def km_node_resize_modal_map(_params): + items = [] + keymap = ( + "Node Resize Modal Map", + {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True}, + {"items": items}, + ) + + items.extend([ + ("BEGIN", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None), + ("CANCEL", {"type": 'RIGHTMOUSE', "value": 'PRESS', "any": True}, None), + ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None), + ("SNAP_INVERT_ON", {"type": 'RIGHT_CTRL', "value": 'PRESS', "any": True}, None), + ("SNAP_INVERT_OFF", {"type": 'RIGHT_CTRL', "value": 'RELEASE', "any": True}, None), + ("SNAP_INVERT_ON", {"type": 'LEFT_CTRL', "value": 'PRESS', "any": True}, None), + ("SNAP_INVERT_OFF", {"type": 'LEFT_CTRL', "value": 'RELEASE', "any": True}, None), + ]) + + return keymap + + +def km_sequencer_slip_modal_map(_params): + items = [] + keymap = ( + "Slip Modal", + {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True}, + {"items": items}, + ) + + items.extend([ + ("CONFIRM", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None), + ("CONFIRM", {"type": 'LEFTMOUSE', "value": 'RELEASE', "any": True}, None), + ("CONFIRM", {"type": 'RET', "value": 'RELEASE', "any": True}, None), + ("CONFIRM", {"type": 'NUMPAD_ENTER', "value": 'RELEASE', "any": True}, None), + ("CONFIRM", {"type": 'SPACE', "value": 'RELEASE', "any": True}, None), + ("CANCEL", {"type": 'RIGHTMOUSE', "value": 'ANY', "any": True}, None), + ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None), + ("PRECISION_ENABLE", {"type": 'LEFT_SHIFT', "value": 'PRESS', "any": True}, None), + ("PRECISION_DISABLE", {"type": 'LEFT_SHIFT', "value": 'RELEASE', "any": True}, None), + ("PRECISION_ENABLE", {"type": 'RIGHT_SHIFT', "value": 'PRESS', "any": True}, None), + ("PRECISION_DISABLE", {"type": 'RIGHT_SHIFT', "value": 'RELEASE', "any": True}, None), + ("CLAMP_TOGGLE", {"type": 'C', "value": 'PRESS', "any": True}, None), + ]) + + return keymap + # Fallback for gizmos that don't have custom a custom key-map. + + def km_generic_gizmo(_params): keymap = ( "Generic Gizmo", @@ -7475,6 +7130,148 @@ def km_image_editor_tool_uv_scale(params): ) +# ------------------------------------------------------------------------------ +# Tool System (Mask Editor) + +def km_image_editor_tool_mask_cursor(params): + return ( + "Image Editor Tool: Mask, Cursor", + {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'}, + {"items": [ + ("uv.cursor_set", {"type": params.tool_mouse, "value": 'PRESS'}, None), + # Don't use `tool_maybe_tweak_event` since it conflicts with `PRESS` that places the cursor. + ("transform.translate", params.tool_tweak_event, + {"properties": [("release_confirm", True), ("cursor_transform", True)]}), + ]}, + ) + + +def km_image_editor_tool_mask_select(params, *, fallback): + return ( + _fallback_id("Image Editor Tool: Mask, Tweak", fallback), + {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'}, + {"items": [ + *([] if (fallback and (params.select_mouse == 'RIGHTMOUSE')) else _template_items_tool_select( + params, "mask.select", "uv.cursor_set", fallback=fallback)), + *([] if params.use_fallback_tool_select_handled else + _template_mask_select( + type=params.select_mouse, + value=params.select_mouse_value, + select_passthrough=params.use_tweak_select_passthrough, + legacy=params.legacy, + )), + ]}, + ) + + +def km_image_editor_tool_mask_select_box(params, *, fallback): + return ( + _fallback_id("Image Editor Tool: Mask, Select Box", fallback), + {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'}, + {"items": [ + *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple( + "mask.select_box", + # Don't use `tool_maybe_tweak_event`, see comment for this slot. + **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else + params.tool_tweak_event))), + ]}, + ) + + +def km_image_editor_tool_mask_select_circle(params, *, fallback): + return ( + _fallback_id("Image Editor Tool: Mask, Select Circle", fallback), + {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'}, + {"items": [ + *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple( + "mask.select_circle", + **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else + {"type": params.tool_mouse, "value": 'PRESS'}), + properties=[("wait_for_input", False)])), + ]}, + ) + + +def km_image_editor_tool_mask_select_lasso(params, *, fallback): + return ( + _fallback_id("Image Editor Tool: Mask, Select Lasso", fallback), + {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'}, + + {"items": [ + *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple( + "mask.select_lasso", + **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else + params.tool_tweak_event))), + ]}, + ) + + +def km_image_editor_tool_mask_move(params): + return ( + "Image Editor Tool: Mask, Move", + {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'}, + {"items": [ + ("transform.translate", {**params.tool_maybe_tweak_event, **params.tool_modifier}, + {"properties": [("release_confirm", True)]}), + ]}, + ) + + +def km_image_editor_tool_mask_rotate(params): + return ( + "Image Editor Tool: Mask, Rotate", + {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'}, + {"items": [ + ("transform.rotate", {**params.tool_maybe_tweak_event, **params.tool_modifier}, + {"properties": [("release_confirm", True)]}), + ]}, + ) + + +def km_image_editor_tool_mask_scale(params): + return ( + "Image Editor Tool: Mask, Scale", + {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'}, + {"items": [ + ("transform.resize", {**params.tool_maybe_tweak_event, **params.tool_modifier}, + {"properties": [("release_confirm", True)]}), + ]}, + ) + + +def km_image_editor_tool_mask_transform(params): + return ( + "Image Editor Tool: Mask, Transform", + {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'}, + {"items": [ + ("transform.resize", {**params.tool_maybe_tweak_event, **params.tool_modifier}, + {"properties": [("release_confirm", True)]}), + ]}, + ) + + +def km_image_editor_tool_mask_primitive_square(params): + return ( + "Image Editor Tool: Mask, Box", + {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'}, + {"items": [ + ("mask.primitive_square_add", {"type": params.tool_mouse, "value": 'PRESS'}, + {"properties": []}), + ]}, + ) + + +def km_image_editor_tool_mask_primitive_circle(params): + return ( + "Image Editor Tool: Mask, Circle", + {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'}, + {"items": [ + ("mask.primitive_circle_add", {"type": params.tool_mouse, "value": 'PRESS'}, + {"properties": []}), + ]}, + ) + + # ------------------------------------------------------------------------------ # Tool System (Node Editor) @@ -7550,6 +7347,26 @@ def km_node_editor_tool_links_cut(params): ) +def km_node_editor_tool_links_mute(params): + return ( + "Node Tool: Mute Links", + {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'}, + {"items": [ + ("node.links_mute", {"type": params.tool_mouse, "value": 'PRESS'}, None), + ]}, + ) + + +def km_node_editor_tool_add_reroute(params): + return ( + "Node Tool: Add Reroute", + {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'}, + {"items": [ + ("node.add_reroute", {"type": params.tool_mouse, "value": 'PRESS'}, None), + ]}, + ) + + # ------------------------------------------------------------------------------ # Tool System (3D View, Generic) @@ -8172,6 +7989,35 @@ def km_3d_view_tool_edit_curve_pen(params): ) +def km_3d_view_tool_edit_curves_pen(params): + return ( + "3D View Tool: Edit Curves, Pen", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": [ + ("curves.pen", {"type": params.tool_mouse, "value": 'PRESS'}, + {"properties": [ + ("extrude_point", True), + ("move_segment", True), + ("select_point", True), + ("move_point", True), + ("extrude_handle", "VECTOR"), + ]}), + ("curves.pen", {"type": params.tool_mouse, "value": 'PRESS', "shift": True}, + {"properties": [ + ("extrude_point", True), + ("move_segment", True), + ("select_point", True), + ("move_point", True), + ("extrude_handle", "AUTO"), + ]}), + ("curves.pen", {"type": params.tool_mouse, "value": 'PRESS', "ctrl": True}, + {"properties": [("insert_point", True), ("delete_point", True)]}), + ("curves.pen", {"type": params.tool_mouse, "value": 'DOUBLE_CLICK'}, + {"properties": [("cycle_handle_type", True)]}), + ]}, + ) + + def km_3d_view_tool_edit_curve_tilt(params): return ( "3D View Tool: Edit Curve, Tilt", @@ -8279,9 +8125,9 @@ def km_3d_view_tool_sculpt_polyline_mask(params): "3D View Tool: Sculpt, Polyline Mask", {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, {"items": [ - ("paint.mask_polyline_gesture", {"type": params.tool_mouse, "value": "PRESS"}, + ("paint.mask_polyline_gesture", {"type": params.tool_mouse, "value": 'PRESS'}, {"properties": [("value", 1.0)]}), - ("paint.mask_polyline_gesture", {"type": params.tool_mouse, "value": "PRESS", "ctrl": True}, + ("paint.mask_polyline_gesture", {"type": params.tool_mouse, "value": 'PRESS', "ctrl": True}, {"properties": [("value", 0.0)]}), ]}, ) @@ -8337,9 +8183,9 @@ def km_3d_view_tool_sculpt_polyline_hide(params): "3D View Tool: Sculpt, Polyline Hide", {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, {"items": [ - ("paint.hide_show_polyline_gesture", {"type": params.tool_mouse, "value": "PRESS"}, + ("paint.hide_show_polyline_gesture", {"type": params.tool_mouse, "value": 'PRESS'}, {"properties": [("action", 'HIDE')]}), - ("paint.hide_show_polyline_gesture", {"type": params.tool_mouse, "value": "PRESS", "ctrl": True}, + ("paint.hide_show_polyline_gesture", {"type": params.tool_mouse, "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'SHOW')]}), ]}, ) @@ -8380,7 +8226,7 @@ def km_3d_view_tool_sculpt_polyline_face_set(params): "3D View Tool: Sculpt, Polyline Face Set", {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, {"items": [ - ("sculpt.face_set_polyline_gesture", {"type": params.tool_mouse, "value": "PRESS"}, None) + ("sculpt.face_set_polyline_gesture", {"type": params.tool_mouse, "value": 'PRESS'}, None) ]}, ) @@ -8420,7 +8266,7 @@ def km_3d_view_tool_sculpt_polyline_trim(params): "3D View Tool: Sculpt, Polyline Trim", {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, {"items": [ - ("sculpt.trim_polyline_gesture", {"type": params.tool_mouse, "value": "PRESS"}, None) + ("sculpt.trim_polyline_gesture", {"type": params.tool_mouse, "value": 'PRESS'}, None) ]} ) @@ -8519,150 +8365,6 @@ def km_3d_view_tool_paint_weight_gradient(params): ) -# ------------------------------------------------------------------------------ -# Tool System (3D View, Grease Pencil, Paint) - - -def km_grease_pencil_primitive_tool_modal_map(params): - items = [] - keymap = ( - "Primitive Tool Modal Map", - {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True}, - {"items": items}, - ) - - items.extend([ - ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None), - ("CANCEL", {"type": 'Q', "value": 'PRESS', "any": True}, None), - ("PANNING", {"type": 'MIDDLEMOUSE', "value": 'ANY', "any": True}, None), - ("CONFIRM", {"type": 'RET', "value": 'PRESS', "any": True}, None), - ("CONFIRM", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "any": True}, None), - ("EXTRUDE", {"type": 'E', "value": 'PRESS'}, None), - ("GRAB", {"type": 'G', "value": 'PRESS'}, None), - ("ROTATE", {"type": 'R', "value": 'PRESS'}, None), - ("SCALE", {"type": 'S', "value": 'PRESS'}, None), - ("INCREASE_SUBDIVISION", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, None), - ("DECREASE_SUBDIVISION", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, None), - ]) - - return keymap - - -def km_3d_view_tool_paint_gpencil_line(params): - return ( - "3D View Tool: Paint Grease Pencil, Line", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - ("grease_pencil.primitive_line", params.tool_maybe_tweak_event, - {"properties": []}), - ("grease_pencil.primitive_line", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": []}), - ("grease_pencil.primitive_line", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, - {"properties": []}), - # Lasso select - ("grease_pencil.select_lasso", - {"type": params.action_mouse, "value": 'CLICK_DRAG', "ctrl": True, "alt": True}, None), - ]}, - ) - - -def km_3d_view_tool_paint_gpencil_polyline(params): - return ( - "3D View Tool: Paint Grease Pencil, Polyline", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - ("grease_pencil.primitive_polyline", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": []}), - ("grease_pencil.primitive_polyline", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": []}), - # Lasso select - ("grease_pencil.select_lasso", - {"type": params.action_mouse, "value": 'CLICK_DRAG', "ctrl": True, "alt": True}, None), - ]}, - ) - - -def km_3d_view_tool_paint_gpencil_box(params): - return ( - "3D View Tool: Paint Grease Pencil, Box", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - ("grease_pencil.primitive_box", params.tool_maybe_tweak_event, - {"properties": []}), - ("grease_pencil.primitive_box", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": []}), - ("grease_pencil.primitive_box", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, - {"properties": []}), - # Lasso select - ("grease_pencil.select_lasso", - {"type": params.action_mouse, "value": 'CLICK_DRAG', "ctrl": True, "alt": True}, None), - ]}, - ) - - -def km_3d_view_tool_paint_gpencil_circle(params): - return ( - "3D View Tool: Paint Grease Pencil, Circle", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - ("grease_pencil.primitive_circle", params.tool_maybe_tweak_event, - {"properties": []}), - ("grease_pencil.primitive_circle", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": []}), - ("grease_pencil.primitive_circle", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, - {"properties": []}), - # Lasso select - ("grease_pencil.select_lasso", - {"type": params.action_mouse, "value": 'CLICK_DRAG', "ctrl": True, "alt": True}, None), - ]}, - ) - - -def km_3d_view_tool_paint_gpencil_arc(params): - return ( - "3D View Tool: Paint Grease Pencil, Arc", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - ("grease_pencil.primitive_arc", params.tool_maybe_tweak_event, - {"properties": []}), - ("grease_pencil.primitive_arc", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": []}), - ("grease_pencil.primitive_arc", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, - {"properties": []}), - # Lasso select - ("grease_pencil.select_lasso", - {"type": params.action_mouse, "value": 'CLICK_DRAG', "ctrl": True, "alt": True}, None), - ]}, - ) - - -def km_3d_view_tool_paint_gpencil_curve(params): - return ( - "3D View Tool: Paint Grease Pencil, Curve", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - ("grease_pencil.primitive_curve", params.tool_maybe_tweak_event, - {"properties": []}), - # Lasso select - ("grease_pencil.select_lasso", - {"type": params.action_mouse, "value": 'CLICK_DRAG', "ctrl": True, "alt": True}, None), - ]}, - ) - - -def km_3d_view_tool_paint_gpencil_cutter(params): - return ( - "3D View Tool: Paint Gpencil, Cutter", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - ("gpencil.stroke_cutter", {"type": params.tool_mouse, "value": 'PRESS'}, None), - # Lasso select - ("gpencil.select_lasso", - {"type": params.action_mouse, "value": 'CLICK_DRAG', "ctrl": True, "alt": True}, None), - ]}, - ) - - def km_3d_view_tool_paint_grease_pencil_trim(params): return ( "3D View Tool: Paint Grease Pencil, Trim", @@ -8673,17 +8375,117 @@ def km_3d_view_tool_paint_grease_pencil_trim(params): ) -def km_3d_view_tool_paint_gpencil_eyedropper(params): +# ------------------------------------------------------------------------------ +# Tool System (3D View, Grease Pencil, Paint) + +def km_grease_pencil_primitive_tool_modal_map(_params): + items = [] + keymap = ( + "Primitive Tool Modal Map", + {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True}, + {"items": items}, + ) + + items.extend([ + ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None), + ("CANCEL", {"type": 'Q', "value": 'PRESS', "any": True}, None), + ("PANNING", {"type": 'MIDDLEMOUSE', "value": 'ANY', "shift": True}, None), + ("CONFIRM", {"type": 'RET', "value": 'PRESS', "any": True}, None), + ("CONFIRM", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "any": True}, None), + ("CONFIRM", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None), + ("EXTRUDE", {"type": 'E', "value": 'PRESS'}, None), + ("GRAB", {"type": 'G', "value": 'PRESS'}, None), + ("ROTATE", {"type": 'R', "value": 'PRESS'}, None), + ("SCALE", {"type": 'S', "value": 'PRESS'}, None), + ("INCREASE_SUBDIVISION", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, None), + ("DECREASE_SUBDIVISION", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, None), + ("CHANGE_RADIUS", {"type": 'F', "value": 'PRESS'}, None), + ("CHANGE_OPACITY", {"type": 'F', "value": 'PRESS', "shift": True}, None), + ]) + + return keymap + + +def km_3d_view_tool_paint_grease_pencil_primitive_line(_params): return ( - "3D View Tool: Paint Gpencil, Eyedropper", + "3D View Tool: Paint Grease Pencil, Line", {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, {"items": [ - ("ui.eyedropper_gpencil_color", - {"type": params.tool_mouse, "value": 'PRESS'}, None), - ("ui.eyedropper_gpencil_color", - {"type": params.tool_mouse, "value": 'PRESS', "shift": True}, None), - ("ui.eyedropper_gpencil_color", - {"type": params.tool_mouse, "value": 'PRESS', "shift": True, "ctrl": True}, None), + ("grease_pencil.primitive_line", {"type": 'LEFTMOUSE', "value": 'PRESS'}, + {"properties": []}), + ("grease_pencil.primitive_line", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": []}), + ("grease_pencil.primitive_line", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, + {"properties": []}), + ]}, + ) + + +def km_3d_view_tool_paint_grease_pencil_primitive_polyline(_params): + return ( + "3D View Tool: Paint Grease Pencil, Polyline", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": [ + ("grease_pencil.primitive_polyline", {"type": 'LEFTMOUSE', "value": 'PRESS'}, + {"properties": []}), + ("grease_pencil.primitive_polyline", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": []}), + ]}, + ) + + +def km_3d_view_tool_paint_grease_pencil_primitive_box(_params): + return ( + "3D View Tool: Paint Grease Pencil, Box", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": [ + ("grease_pencil.primitive_box", {"type": 'LEFTMOUSE', "value": 'PRESS'}, + {"properties": []}), + ("grease_pencil.primitive_box", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": []}), + ("grease_pencil.primitive_box", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, + {"properties": []}), + ]}, + ) + + +def km_3d_view_tool_paint_grease_pencil_primitive_circle(_params): + return ( + "3D View Tool: Paint Grease Pencil, Circle", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": [ + ("grease_pencil.primitive_circle", {"type": 'LEFTMOUSE', "value": 'PRESS'}, + {"properties": []}), + ("grease_pencil.primitive_circle", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": []}), + ("grease_pencil.primitive_circle", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, + {"properties": []}), + ]}, + ) + + +def km_3d_view_tool_paint_grease_pencil_primitive_arc(_params): + return ( + "3D View Tool: Paint Grease Pencil, Arc", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": [ + ("grease_pencil.primitive_arc", {"type": 'LEFTMOUSE', "value": 'PRESS'}, + {"properties": []}), + ("grease_pencil.primitive_arc", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": []}), + ("grease_pencil.primitive_arc", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, + {"properties": []}), + ]}, + ) + + +def km_3d_view_tool_paint_grease_pencil_primitive_curve(_params): + return ( + "3D View Tool: Paint Grease Pencil, Curve", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": [ + ("grease_pencil.primitive_curve", {"type": 'LEFTMOUSE', "value": 'PRESS'}, + {"properties": []}), ]}, ) @@ -8705,18 +8507,7 @@ def km_3d_view_tool_paint_grease_pencil_eyedropper(params): ) -def km_3d_view_tool_paint_gpencil_interpolate(params): - return ( - "3D View Tool: Paint Gpencil, Interpolate", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - ("gpencil.interpolate", params.tool_maybe_tweak_event, - {"properties": [("release_confirm", True)]}), - ]}, - ) - - -def km_grease_pencil_interpolate_tool_modal_map(params): +def km_grease_pencil_interpolate_tool_modal_map(_params): items = [] keymap = ( "Interpolate Tool Modal Map", @@ -8737,187 +8528,52 @@ def km_grease_pencil_interpolate_tool_modal_map(params): return keymap -# ------------------------------------------------------------------------------ -# Tool System (3D View, Grease Pencil, Edit) +def km_pen_tool_modal_map(_params): + items = [] + keymap = ( + "Pen Tool Modal Map", + {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True}, + {"items": items}, + ) -def km_3d_view_tool_edit_gpencil_select(params, *, fallback): + items.extend([ + ("MOVE_HANDLE", {"type": 'LEFT_CTRL', "value": 'ANY', "any": True}, None), + ("MOVE_ENTIRE", {"type": 'LEFT_ALT', "value": 'ANY', "any": True}, None), + ("SNAP_ANGLE", {"type": 'LEFT_SHIFT', "value": 'ANY', "any": True}, None), + ]) + + return keymap + + +def km_3d_view_tool_edit_grease_pencil_pen(params): return ( - _fallback_id("3D View Tool: Edit Gpencil, Tweak", fallback), + "3D View Tool: Edit Grease Pencil, Pen", {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, {"items": [ - *([] if (fallback and (params.select_mouse == 'RIGHTMOUSE')) else _template_items_tool_select( - params, "gpencil.select", "view3d.cursor3d", fallback=fallback)), - *([] if params.use_fallback_tool_select_handled else - _template_view3d_gpencil_select( - type=params.select_mouse, - value=params.select_mouse_value, - legacy=params.legacy, - )), + ("grease_pencil.pen", {"type": params.tool_mouse, "value": 'PRESS'}, + {"properties": [ + ("extrude_point", True), + ("move_segment", True), + ("select_point", True), + ("move_point", True), + ("extrude_handle", "VECTOR"), + ]}), + ("grease_pencil.pen", {"type": params.tool_mouse, "value": 'PRESS', "shift": True}, + {"properties": [ + ("extrude_point", True), + ("move_segment", True), + ("select_point", True), + ("move_point", True), + ("extrude_handle", "AUTO"), + ]}), + ("grease_pencil.pen", {"type": params.tool_mouse, "value": 'PRESS', "ctrl": True}, + {"properties": [("insert_point", True), ("delete_point", True)]}), + ("grease_pencil.pen", {"type": params.tool_mouse, "value": 'DOUBLE_CLICK'}, + {"properties": [("cycle_handle_type", True)]}), ]}, ) -def km_3d_view_tool_edit_gpencil_select_box(params, *, fallback): - return ( - _fallback_id("3D View Tool: Edit Gpencil, Select Box", fallback), - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions( - "gpencil.select_box", - # Don't use `tool_maybe_tweak_event`, see comment for this slot. - **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else - params.tool_tweak_event))), - ]}, - ) - - -def km_3d_view_tool_edit_gpencil_select_circle(params, *, fallback): - return ( - _fallback_id("3D View Tool: Edit Gpencil, Select Circle", fallback), - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple( - "gpencil.select_circle", - # Why circle select should be used on tweak? - # So that RMB or Shift-RMB is still able to set an element as active. - type=params.select_mouse if (fallback and params.use_fallback_tool_select_mouse) else params.tool_mouse, - value='CLICK_DRAG' if (fallback and params.use_fallback_tool_select_mouse) else 'PRESS', - properties=[("wait_for_input", False)])), - ]}, - ) - - -def km_3d_view_tool_edit_gpencil_select_lasso(params, *, fallback): - return ( - _fallback_id("3D View Tool: Edit Gpencil, Select Lasso", fallback), - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions( - "gpencil.select_lasso", - **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else - params.tool_tweak_event))), - ]} - ) - - -def km_3d_view_tool_edit_gpencil_extrude(params): - return ( - "3D View Tool: Edit Gpencil, Extrude", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - ("gpencil.extrude_move", {**params.tool_maybe_tweak_event, **params.tool_modifier}, None), - ]}, - ) - - -def km_3d_view_tool_edit_gpencil_radius(params): - return ( - "3D View Tool: Edit Gpencil, Radius", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - # No need for `tool_modifier` since this takes all input. - ("transform.transform", params.tool_maybe_tweak_event, - {"properties": [("mode", 'GPENCIL_SHRINKFATTEN'), ("release_confirm", True)]}), - ]}, - ) - - -def km_3d_view_tool_edit_gpencil_bend(params): - return ( - "3D View Tool: Edit Gpencil, Bend", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - # No need for `tool_modifier` since this takes all input. - ("transform.bend", params.tool_maybe_tweak_event, - {"properties": [("release_confirm", True)]}), - ]}, - ) - - -def km_3d_view_tool_edit_gpencil_shear(params): - return ( - "3D View Tool: Edit Gpencil, Shear", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - # No need for `tool_modifier` since this takes all input. - ("transform.shear", params.tool_maybe_tweak_event, - {"properties": [("release_confirm", True)]}), - ]}, - ) - - -def km_3d_view_tool_edit_gpencil_to_sphere(params): - return ( - "3D View Tool: Edit Gpencil, To Sphere", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - # No need for `tool_modifier` since this takes all input. - ("transform.tosphere", params.tool_maybe_tweak_event, - {"properties": [("release_confirm", True)]}), - ]}, - ) - - -def km_3d_view_tool_edit_gpencil_transform_fill(params): - return ( - "3D View Tool: Edit Gpencil, Transform Fill", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - # No need for `tool_modifier` since this takes all input. - ("gpencil.transform_fill", params.tool_maybe_tweak_event, - {"properties": [("release_confirm", True)]}), - ]}, - ) - - -def km_3d_view_tool_edit_gpencil_interpolate(params): - return ( - "3D View Tool: Edit Gpencil, Interpolate", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - ("gpencil.interpolate", params.tool_maybe_tweak_event, - {"properties": [("release_confirm", True)]}), - ]}, - ) - - -# ------------------------------------------------------------------------------ -# Tool System (3D View, Grease Pencil, Sculpt) - -def km_3d_view_tool_sculpt_gpencil_select(params): - return ( - "3D View Tool: Sculpt Gpencil, Tweak", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": _template_items_tool_select(params, "gpencil.select", "view3d.cursor3d")}, - ) - - -def km_3d_view_tool_sculpt_gpencil_select_box(params): - return ( - "3D View Tool: Sculpt Gpencil, Select Box", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": _template_items_tool_select_actions("gpencil.select_box", **params.tool_tweak_event)}, - ) - - -def km_3d_view_tool_sculpt_gpencil_select_circle(params): - return ( - "3D View Tool: Sculpt Gpencil, Select Circle", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": _template_items_tool_select_actions_simple( - "gpencil.select_circle", type=params.tool_mouse, value='PRESS', - properties=[("wait_for_input", False)], - )}, - ) - - -def km_3d_view_tool_sculpt_gpencil_select_lasso(params): - return ( - "3D View Tool: Sculpt Gpencil, Select Lasso", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": _template_items_tool_select_actions("gpencil.select_lasso", **params.tool_tweak_event)}, - ) - # ------------------------------------------------------------------------------ # Grease Pencil: Texture Gradient Tool @@ -8935,64 +8591,91 @@ def km_3d_view_tool_edit_grease_pencil_texture_gradient(params): # ------------------------------------------------------------------------------ # Tool System (Sequencer, Generic) -def km_sequencer_editor_tool_generic_select_timeline_rcs(params, fallback): +def km_sequencer_tool_generic_select_rcs(params): return [ ("sequencer.select_handle", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), ("sequencer.select_handle", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, {"properties": [("ignore_connections", True)]}), - *_template_items_change_frame(params), + ("anim.change_frame", {"type": params.action_mouse, "value": 'PRESS'}, + {"properties": [("pass_through_on_strip_handles", True)]}), + ("anim.change_frame", {"type": params.action_mouse, "value": 'PRESS', "shift": True}, + {"properties": [("seq_solo_preview", True)]}), # Change frame takes precedence over the sequence slide operator. If a # mouse press happens on a strip handle, it is canceled, and the sequence # slide below activates instead. - ("transform.seq_slide", {"type": 'LEFTMOUSE', "value": 'PRESS'}, + ("transform.seq_slide", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, {"properties": [("view2d_edge_pan", True), ("use_restore_handle_selection", True)]}), ] -def km_sequencer_editor_tool_generic_select_timeline_lcs(params, fallback): +def km_sequencer_tool_generic_select_lcs(_params): return [ - *_template_items_tool_select( - params, "sequencer.select", None, cursor_prioritize=True, fallback=fallback), - *_template_items_change_frame(params), + ("sequencer.select", {"type": 'LEFTMOUSE', "value": 'PRESS'}, + {"properties": [("deselect_all", True)]}), + ("sequencer.select", {"type": 'LEFTMOUSE', "value": 'PRESS', + "shift": True}, {"properties": [("toggle", True)]}), + ("anim.change_frame", {"type": 'RIGHTMOUSE', "value": 'PRESS', + "shift": True}, {"properties": [("seq_solo_preview", True), ("pass_through_on_strip_handles", False)]}), ] -def km_sequencer_editor_tool_generic_select_timeline(params, *, fallback): +def km_sequencer_tool_generic_select_box(params, *, fallback): return ( - _fallback_id("Sequencer Timeline Tool: Tweak", fallback), + _fallback_id("Sequencer Tool: Select Box", fallback), {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, {"items": [ - *(km_sequencer_editor_tool_generic_select_timeline_rcs(params, fallback) + # Add tweak functionality to the select box tool. + # This gives one standard tool for all selection and transform behavior. + *(km_sequencer_tool_generic_select_rcs(params) if (params.select_mouse == 'RIGHTMOUSE') else - km_sequencer_editor_tool_generic_select_timeline_lcs(params, fallback)), - ]}, - ) - - -def km_sequencer_editor_tool_generic_select_box_timeline(params, *, fallback): - return ( - _fallback_id("Sequencer Timeline Tool: Select Box", fallback), - {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, - {"items": [ + km_sequencer_tool_generic_select_lcs(params)), # Don't use `tool_maybe_tweak_event`, see comment for this slot. - *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple( + # We do not add box select with left-click keymap items for RCS since click-drag already scrubs. + # These items should be re-added to this tool if/once we create a separate scrub tool. + *([] if (params.select_mouse == 'RIGHTMOUSE' or (fallback and not params.use_fallback_tool)) + else _template_items_tool_select_actions_simple( "sequencer.select_box", **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else - params.tool_tweak_event), + params.tool_tweak_event), properties=[("tweak", params.select_mouse == 'LEFTMOUSE')])), - # RMB select can already set the frame, match the tweak tool. - # Ignored for preview. - *(_template_items_change_frame(params) - if params.select_mouse == 'LEFTMOUSE' else []), ]}, ) -def km_sequencer_editor_tool_generic_select_preview(params, *, fallback): +def km_sequencer_tool_generic_select_lasso(params, *, fallback): return ( - _fallback_id("Sequencer Preview Tool: Tweak", fallback), + _fallback_id("Sequencer Tool: Select Lasso", fallback), {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, {"items": [ + *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple( + "sequencer.select_lasso", + **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else + params.tool_tweak_event))), + ]}, + ) + + +def km_sequencer_tool_generic_select_circle(params, *, fallback): + return ( + _fallback_id("Sequencer Tool: Select Circle", fallback), + {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, + {"items": [ + *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple( + "sequencer.select_circle", + **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else + {"type": params.tool_mouse, "value": 'PRESS'}), + properties=[("wait_for_input", False)])), + ]}, + ) + + +def km_sequencer_preview_tool_generic_select(params, *, fallback): + return ( + _fallback_id("Preview Tool: Tweak", fallback), + {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, + {"items": [ + ("sequencer.text_cursor_set", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("sequencer.text_cursor_set", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), *([] if (fallback and (params.select_mouse == 'RIGHTMOUSE')) else _template_items_tool_select( params, "sequencer.select", "sequencer.cursor_set", cursor_prioritize=True, fallback=fallback)), @@ -9003,24 +8686,52 @@ def km_sequencer_editor_tool_generic_select_preview(params, *, fallback): ) -def km_sequencer_editor_tool_generic_select_box_preview(params, *, fallback): +def km_sequencer_preview_tool_generic_select_box(params, *, fallback): return ( - _fallback_id("Sequencer Preview Tool: Select Box", fallback), + _fallback_id("Preview Tool: Select Box", fallback), {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, {"items": [ + ("sequencer.text_cursor_set", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("sequencer.text_cursor_set", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), # Don't use `tool_maybe_tweak_event`, see comment for this slot. *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple( "sequencer.select_box", **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else - params.tool_tweak_event), - properties=[("tweak", params.select_mouse == 'LEFTMOUSE')])), + params.tool_tweak_event))), ]}, ) -def km_sequencer_editor_tool_generic_cursor(params): +def km_sequencer_preview_tool_generic_select_lasso(params, *, fallback): return ( - "Sequencer Tool: Cursor", + _fallback_id("Preview Tool: Select Lasso", fallback), + {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, + {"items": [ + *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple( + "sequencer.select_lasso", + **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else + params.tool_tweak_event))), + ]}, + ) + + +def km_sequencer_preview_tool_generic_select_circle(params, *, fallback): + return ( + _fallback_id("Preview Tool: Select Circle", fallback), + {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, + {"items": [ + *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple( + "sequencer.select_circle", + **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else + {"type": params.tool_mouse, "value": 'PRESS'}), + properties=[("wait_for_input", False)])), + ]}, + ) + + +def km_sequencer_preview_tool_generic_cursor(params): + return ( + "Preview Tool: Cursor", {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, {"items": [ ("sequencer.cursor_set", {"type": params.tool_mouse, "value": 'PRESS'}, None), @@ -9034,18 +8745,60 @@ def km_sequencer_editor_tool_generic_cursor(params): # ------------------------------------------------------------------------------ # Tool System (Sequencer, Timeline) -def km_sequencer_editor_tool_blade(_params): +def km_sequencer_tool_blade(_params): return ( "Sequencer Tool: Blade", {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, {"items": [ - ("sequencer.split", {"type": 'LEFTMOUSE', "value": 'PRESS'}, + ("sequencer.split", {"type": 'LEFTMOUSE', "value": 'CLICK'}, {"properties": [ ("type", 'SOFT'), ("side", 'NO_CHANGE'), ("use_cursor_position", True), ("ignore_selection", True), ]}), + ("sequencer.split", {"type": 'LEFTMOUSE', "value": 'CLICK', "alt": True}, + {"properties": [ + ("type", 'SOFT'), + ("side", 'NO_CHANGE'), + ("use_cursor_position", True), + ("ignore_selection", True), + ("ignore_connections", True), + ]}), + ("sequencer.box_blade", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, {"properties": []}), + ("sequencer.box_blade", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, + {"properties": [ + ("remove_gaps", False), + ]}), + ("sequencer.box_blade", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "alt": True}, + {"properties": [ + ("ignore_connections", True), + ]}), + ("sequencer.box_blade", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True, "alt": True}, + {"properties": [ + ("remove_gaps", False), + ("ignore_connections", True), + ]}), + ]}, + ) + + +def km_sequencer_tool_slip(_params): + return ( + "Sequencer Tool: Slip", + {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, + {"items": [ + ("sequencer.slip", {"type": 'LEFTMOUSE', "value": 'PRESS'}, + {"properties": [ + ("slip_keyframes", True), + ("use_cursor_position", True), + ]}), + ("sequencer.slip", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, + {"properties": [ + ("slip_keyframes", True), + ("use_cursor_position", True), + ("ignore_connections", True), + ]}), ]}, ) @@ -9053,9 +8806,9 @@ def km_sequencer_editor_tool_blade(_params): # ------------------------------------------------------------------------------ # Tool System (Sequencer, Preview) -def km_sequencer_editor_tool_sample(params): +def km_sequencer_preview_tool_sample(params): return ( - "Sequencer Tool: Sample", + "Preview Tool: Sample", {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, {"items": [ ("sequencer.sample", {"type": params.tool_mouse, "value": 'PRESS'}, None), @@ -9063,9 +8816,9 @@ def km_sequencer_editor_tool_sample(params): ) -def km_sequencer_editor_tool_move(params): +def km_sequencer_preview_tool_move(params): return ( - "Sequencer Tool: Move", + "Preview Tool: Move", {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, {"items": [ ("transform.translate", {**params.tool_maybe_tweak_event, **params.tool_modifier}, @@ -9074,9 +8827,9 @@ def km_sequencer_editor_tool_move(params): ) -def km_sequencer_editor_tool_rotate(params): +def km_sequencer_preview_tool_rotate(params): return ( - "Sequencer Tool: Rotate", + "Preview Tool: Rotate", {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, {"items": [ ("transform.rotate", {**params.tool_maybe_tweak_event, **params.tool_modifier}, @@ -9085,9 +8838,9 @@ def km_sequencer_editor_tool_rotate(params): ) -def km_sequencer_editor_tool_scale(params): +def km_sequencer_preview_tool_scale(params): return ( - "Sequencer Tool: Scale", + "Preview Tool: Scale", {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, {"items": [ ("transform.resize", {**params.tool_maybe_tweak_event, **params.tool_modifier}, @@ -9102,7 +8855,7 @@ def km_3d_view_tool_edit_grease_pencil_interpolate(params): {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, {"items": [ ("grease_pencil.interpolate", params.tool_maybe_tweak_event, - None), + {"properties": [("use_selection", True)]}), ]}, ) @@ -9113,7 +8866,7 @@ def km_3d_view_tool_paint_grease_pencil_interpolate(params): {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, {"items": [ ("grease_pencil.interpolate", params.tool_maybe_tweak_event, - None), + {"properties": [("use_selection", False)]}), ]}, ) @@ -9137,6 +8890,8 @@ def generate_keymaps(params=None): # Editors. km_outliner(params), + km_preferences(params), + km_preferences_nav(params), km_uv_editor(params), km_view3d_generic(params), km_view3d(params), @@ -9162,9 +8917,9 @@ def generate_keymaps(params=None): km_nla_editor(params), km_text_generic(params), km_text(params), - km_sequencercommon(params), + km_sequencer_generic(params), km_sequencer(params), - km_sequencerpreview(params), + km_sequencer_preview(params), km_sequencer_channels(params), km_console(params), km_clip(params), @@ -9178,37 +8933,10 @@ def generate_keymaps(params=None): km_animation_channels(params), # Modes. - # Grease Pencil v2 - km_gpencil_legacy(params), # TODO: Rename to km_annotate - km_gpencil_legacy_stroke_curve_edit_mode(params), - km_gpencil_legacy_stroke_edit_mode(params), - km_gpencil_legacy_stroke_paint_mode(params), - km_gpencil_legacy_stroke_paint_draw_brush(params), - km_gpencil_legacy_stroke_paint_erase(params), - km_gpencil_legacy_stroke_paint_fill(params), - km_gpencil_legacy_stroke_paint_tint(params), - km_gpencil_legacy_stroke_sculpt_mode(params), - km_gpencil_legacy_stroke_sculpt_smooth(params), - km_gpencil_legacy_stroke_sculpt_thickness(params), - km_gpencil_legacy_stroke_sculpt_strength(params), - km_gpencil_legacy_stroke_sculpt_grab(params), - km_gpencil_legacy_stroke_sculpt_push(params), - km_gpencil_legacy_stroke_sculpt_twist(params), - km_gpencil_legacy_stroke_sculpt_pinch(params), - km_gpencil_legacy_stroke_sculpt_randomize(params), - km_gpencil_legacy_stroke_sculpt_clone(params), - km_gpencil_legacy_stroke_weight_mode(params), - km_gpencil_legacy_stroke_weight_draw(params), - km_gpencil_legacy_stroke_weight_blur(params), - km_gpencil_legacy_stroke_weight_average(params), - km_gpencil_legacy_stroke_weight_smear(params), - km_gpencil_legacy_stroke_vertex_mode(params), - km_gpencil_legacy_stroke_vertex_draw(params), - km_gpencil_legacy_stroke_vertex_blur(params), - km_gpencil_legacy_stroke_vertex_average(params), - km_gpencil_legacy_stroke_vertex_smear(params), - km_gpencil_legacy_stroke_vertex_replace(params), - # Grease Pencil v3 + # Annotations + km_annotate(params), + # Grease Pencil + km_grease_pencil_selection(params), km_grease_pencil_paint_mode(params), km_grease_pencil_edit_mode(params), km_grease_pencil_sculpt_mode(params), @@ -9239,6 +8967,7 @@ def generate_keymaps(params=None): km_edit_font(params), km_edit_curve_legacy(params), km_edit_curves(params), + km_edit_pointcloud(params), # Modal maps. km_eyedropper_modal_map(params), @@ -9265,10 +8994,13 @@ def generate_keymaps(params=None): km_sculpt_expand_modal(params), km_sculpt_mesh_filter_modal_map(params), km_curve_pen_modal_map(params), + km_pen_tool_modal_map(params), km_node_link_modal_map(params), + km_node_resize_modal_map(params), km_grease_pencil_primitive_tool_modal_map(params), km_grease_pencil_fill_tool_modal_map(params), km_grease_pencil_interpolate_tool_modal_map(params), + km_sequencer_slip_modal_map(params), # Gizmos. km_generic_gizmo(params), @@ -9300,11 +9032,24 @@ def generate_keymaps(params=None): km_image_editor_tool_uv_move(params), km_image_editor_tool_uv_rotate(params), km_image_editor_tool_uv_scale(params), + km_image_editor_tool_mask_cursor(params), + *(km_image_editor_tool_mask_select(params, fallback=fallback) for fallback in (False, True)), + *(km_image_editor_tool_mask_select_box(params, fallback=fallback) for fallback in (False, True)), + *(km_image_editor_tool_mask_select_circle(params, fallback=fallback) for fallback in (False, True)), + *(km_image_editor_tool_mask_select_lasso(params, fallback=fallback) for fallback in (False, True)), + km_image_editor_tool_mask_move(params), + km_image_editor_tool_mask_rotate(params), + km_image_editor_tool_mask_scale(params), + km_image_editor_tool_mask_transform(params), + km_image_editor_tool_mask_primitive_circle(params), + km_image_editor_tool_mask_primitive_square(params), *(km_node_editor_tool_select(params, fallback=fallback) for fallback in (False, True)), *(km_node_editor_tool_select_box(params, fallback=fallback) for fallback in (False, True)), *(km_node_editor_tool_select_lasso(params, fallback=fallback) for fallback in (False, True)), *(km_node_editor_tool_select_circle(params, fallback=fallback) for fallback in (False, True)), km_node_editor_tool_links_cut(params), + km_node_editor_tool_links_mute(params), + km_node_editor_tool_add_reroute(params), km_3d_view_tool_cursor(params), km_3d_view_tool_text_select(params), *(km_3d_view_tool_select(params, fallback=fallback) for fallback in (False, True)), @@ -9358,6 +9103,7 @@ def generate_keymaps(params=None): km_3d_view_tool_edit_curve_extrude(params), km_3d_view_tool_edit_curve_extrude_to_cursor(params), km_3d_view_tool_edit_curves_draw(params), + km_3d_view_tool_edit_curves_pen(params), km_3d_view_tool_sculpt_box_mask(params), km_3d_view_tool_sculpt_lasso_mask(params), km_3d_view_tool_sculpt_line_mask(params), @@ -9383,49 +9129,39 @@ def generate_keymaps(params=None): km_3d_view_tool_paint_weight_sample_weight(params), km_3d_view_tool_paint_weight_sample_vertex_group(params), km_3d_view_tool_paint_weight_gradient(params), - km_3d_view_tool_paint_gpencil_line(params), - km_3d_view_tool_paint_gpencil_polyline(params), - km_3d_view_tool_paint_gpencil_box(params), - km_3d_view_tool_paint_gpencil_circle(params), - km_3d_view_tool_paint_gpencil_arc(params), - km_3d_view_tool_paint_gpencil_curve(params), - km_3d_view_tool_paint_gpencil_cutter(params), - km_3d_view_tool_paint_gpencil_eyedropper(params), - km_3d_view_tool_paint_gpencil_interpolate(params), - *(km_3d_view_tool_edit_gpencil_select(params, fallback=fallback) for fallback in (False, True)), - *(km_3d_view_tool_edit_gpencil_select_box(params, fallback=fallback) for fallback in (False, True)), - *(km_3d_view_tool_edit_gpencil_select_circle(params, fallback=fallback) for fallback in (False, True)), - *(km_3d_view_tool_edit_gpencil_select_lasso(params, fallback=fallback) for fallback in (False, True)), - km_3d_view_tool_edit_gpencil_extrude(params), - km_3d_view_tool_edit_gpencil_radius(params), - km_3d_view_tool_edit_gpencil_bend(params), - km_3d_view_tool_edit_gpencil_shear(params), - km_3d_view_tool_edit_gpencil_to_sphere(params), - km_3d_view_tool_edit_gpencil_transform_fill(params), - km_3d_view_tool_edit_gpencil_interpolate(params), - km_3d_view_tool_sculpt_gpencil_select(params), - km_3d_view_tool_sculpt_gpencil_select_box(params), - km_3d_view_tool_sculpt_gpencil_select_circle(params), - km_3d_view_tool_sculpt_gpencil_select_lasso(params), - *(km_sequencer_editor_tool_generic_select_timeline(params, fallback=fallback) - for fallback in (False, True)), - *(km_sequencer_editor_tool_generic_select_box_timeline(params, fallback=fallback) - for fallback in (False, True)), - *(km_sequencer_editor_tool_generic_select_preview(params, fallback=fallback) - for fallback in (False, True)), - *(km_sequencer_editor_tool_generic_select_box_preview(params, fallback=fallback) - for fallback in (False, True)), + km_3d_view_tool_paint_grease_pencil_primitive_line(params), + km_3d_view_tool_paint_grease_pencil_primitive_polyline(params), + km_3d_view_tool_paint_grease_pencil_primitive_box(params), + km_3d_view_tool_paint_grease_pencil_primitive_circle(params), + km_3d_view_tool_paint_grease_pencil_primitive_arc(params), + km_3d_view_tool_paint_grease_pencil_primitive_curve(params), km_3d_view_tool_paint_grease_pencil_trim(params), - km_3d_view_tool_edit_grease_pencil_texture_gradient(params), - km_sequencer_editor_tool_generic_cursor(params), - km_sequencer_editor_tool_blade(params), - km_sequencer_editor_tool_sample(params), - km_sequencer_editor_tool_move(params), - km_sequencer_editor_tool_rotate(params), - km_sequencer_editor_tool_scale(params), - km_3d_view_tool_edit_grease_pencil_interpolate(params), km_3d_view_tool_paint_grease_pencil_interpolate(params), km_3d_view_tool_paint_grease_pencil_eyedropper(params), + km_3d_view_tool_edit_grease_pencil_texture_gradient(params), + km_3d_view_tool_edit_grease_pencil_pen(params), + km_3d_view_tool_edit_grease_pencil_interpolate(params), + *(km_sequencer_tool_generic_select_box(params, fallback=fallback) + for fallback in (False, True)), + *(km_sequencer_preview_tool_generic_select(params, fallback=fallback) + for fallback in (False, True)), + *(km_sequencer_preview_tool_generic_select_box(params, fallback=fallback) + for fallback in (False, True)), + *(km_sequencer_tool_generic_select_lasso(params, fallback=fallback) + for fallback in (False, True)), + *(km_sequencer_preview_tool_generic_select_lasso(params, fallback=fallback) + for fallback in (False, True)), + *(km_sequencer_preview_tool_generic_select_circle(params, fallback=fallback) + for fallback in (False, True)), + *(km_sequencer_tool_generic_select_circle(params, fallback=fallback) + for fallback in (False, True)), + km_sequencer_tool_blade(params), + km_sequencer_tool_slip(params), + km_sequencer_preview_tool_generic_cursor(params), + km_sequencer_preview_tool_sample(params), + km_sequencer_preview_tool_move(params), + km_sequencer_preview_tool_rotate(params), + km_sequencer_preview_tool_scale(params), ] diff --git a/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py b/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py index e4ee13d..ee6c793 100644 --- a/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py +++ b/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py @@ -85,7 +85,7 @@ def _template_items_object_subdivision_set(): return [ ("object.subdivision_set", {"type": NUMBERS_0[i], "value": 'PRESS', "ctrl": True}, - {"properties": [("level", i), ("relative", False)]}) + {"properties": [("level", i), ("relative", False), ("ensure_modifier", True)]}) for i in range(6) ] @@ -205,13 +205,13 @@ def km_window(params): # NDOF settings op_panel("USERPREF_PT_ndof_settings", {"type": 'NDOF_BUTTON_MENU', "value": 'PRESS'}), ("wm.context_scale_float", {"type": 'NDOF_BUTTON_PLUS', "value": 'PRESS'}, - {"properties": [("data_path", "preferences.inputs.ndof_sensitivity"), ("value", 1.1)]}), + {"properties": [("data_path", "preferences.inputs.ndof_translation_sensitivity"), ("value", 1.1)]}), ("wm.context_scale_float", {"type": 'NDOF_BUTTON_MINUS', "value": 'PRESS'}, - {"properties": [("data_path", "preferences.inputs.ndof_sensitivity"), ("value", 1.0 / 1.1)]}), + {"properties": [("data_path", "preferences.inputs.ndof_translation_sensitivity"), ("value", 1.0 / 1.1)]}), ("wm.context_scale_float", {"type": 'NDOF_BUTTON_PLUS', "value": 'PRESS', "shift": True}, - {"properties": [("data_path", "preferences.inputs.ndof_sensitivity"), ("value", 1.5)]}), + {"properties": [("data_path", "preferences.inputs.ndof_translation_sensitivity"), ("value", 1.5)]}), ("wm.context_scale_float", {"type": 'NDOF_BUTTON_MINUS', "value": 'PRESS', "shift": True}, - {"properties": [("data_path", "preferences.inputs.ndof_sensitivity"), ("value", 2.0 / 3.0)]}), + {"properties": [("data_path", "preferences.inputs.ndof_translation_sensitivity"), ("value", 2.0 / 3.0)]}), ("info.reports_display_update", {"type": 'TIMER_REPORT', "value": 'ANY', "any": True}, None), ]) @@ -261,9 +261,11 @@ def km_screen(params): def km_screen_editing(params): items = [] - keymap = ("Screen Editing", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}) + keymap = ( + "Screen Editing", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": items}, + ) items.extend([ # Action zones @@ -279,16 +281,23 @@ def km_screen_editing(params): ("screen.area_dupli", {"type": 'ACTIONZONE_AREA', "value": 'ANY', "shift": True}, None), ("screen.area_swap", {"type": 'ACTIONZONE_AREA', "value": 'ANY', "ctrl": True}, None), ("screen.region_scale", {"type": 'ACTIONZONE_REGION', "value": 'ANY'}, None), + ("screen.quadview_size", {"type": 'ACTIONZONE_REGION_QUAD', "value": 'ANY'}, None), ("screen.screen_full_area", {"type": 'ACTIONZONE_FULLSCREEN', "value": 'ANY'}, {"properties": [("use_hide_panels", True)]}), # Area move after action zones ("screen.area_move", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("screen.area_move", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, + {"properties": [("snap", True)]}), ("screen.area_options", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None), # Render ("render.render", {"type": 'RET', "value": 'PRESS', "ctrl": True}, {"properties": [("use_viewport", True)]}), ("render.render", {"type": 'RET', "value": 'PRESS', "ctrl": True, "alt": True}, {"properties": [("animation", True), ("use_viewport", True)]}), + ("render.render", {"type": 'F12', "value": 'PRESS', "alt": True}, + {"properties": [("use_sequencer_scene", True), ("use_viewport", True)]}), + ("render.render", {"type": 'F12', "value": 'PRESS', "ctrl": True, "alt": True}, + {"properties": [("animation", True), ("use_sequencer_scene", True), ("use_viewport", True)]}), ("render.view_cancel", {"type": 'ESC', "value": 'PRESS'}, None), ]) @@ -407,6 +416,7 @@ def km_user_interface(params): ("ui.eyedropper_colorramp_point", {"type": 'I', "value": 'PRESS', "alt": True}, None), ("ui.eyedropper_id", {"type": 'I', "value": 'PRESS'}, None), ("ui.eyedropper_depth", {"type": 'I', "value": 'PRESS'}, None), + ("ui.eyedropper_bone", {"type": 'I', "value": 'PRESS'}, None), # Copy data path ("ui.copy_data_path_button", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), ("ui.copy_data_path_button", {"type": 'C', "value": 'PRESS', "ctrl": True, "alt": True}, @@ -419,6 +429,7 @@ def km_user_interface(params): ("anim.driver_button_remove", {"type": 'D', "value": 'PRESS', "alt": True}, None), ("anim.keyingset_button_add", {"type": 'K', "value": 'PRESS'}, None), ("anim.keyingset_button_remove", {"type": 'K', "value": 'PRESS', "alt": True}, None), + ("ui.view_item_select", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), ]) return keymap @@ -547,8 +558,8 @@ def km_outliner(params): ("outliner.drivers_delete_selected", {"type": 'D', "value": 'PRESS', "ctrl": True, "alt": True}, None), ("outliner.delete", {"type": 'BACK_SPACE', "value": 'PRESS'}, None), ("outliner.delete", {"type": 'DEL', "value": 'PRESS'}, None), - ("object.move_to_collection", {"type": 'G', "value": 'PRESS', "ctrl": True}, None), - ("object.link_to_collection", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}, None), + op_menu("OBJECT_MT_move_to_collection", {"type": 'G', "value": 'PRESS', "ctrl": True}), + op_menu("OBJECT_MT_link_to_collection", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}), ("outliner.collection_exclude_set", {"type": 'E', "value": 'PRESS'}, None), ("outliner.collection_exclude_clear", {"type": 'E', "value": 'PRESS', "alt": True}, None), ("outliner.hide", {"type": 'H', "value": 'PRESS', "ctrl": True}, None), @@ -582,8 +593,8 @@ def km_uv_editor(params): {"properties": [("type", 'EDGE')]}), ("uv.select_mode", {"type": 'THREE', "value": 'PRESS'}, {"properties": [("type", 'FACE')]}), - ("uv.select_mode", {"type": 'FOUR', "value": 'PRESS'}, - {"properties": [("type", 'ISLAND')]}), + ("wm.context_toggle", {"type": 'FOUR', "value": 'PRESS'}, + {"properties": [("data_path", "tool_settings.use_uv_select_island")]}), ("uv.select", {"type": 'LEFTMOUSE', "value": 'CLICK'}, {"properties": [("deselect_all", True)]}), @@ -607,6 +618,8 @@ def km_uv_editor(params): ("uv.hide", {"type": 'H', "value": 'PRESS', "shift": True}, {"properties": [("unselected", True)]}), ("uv.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None), + ("uv.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), + ("uv.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), op_menu_pie("IMAGE_MT_uvs_snap_pie", {"type": 'X', "value": 'PRESS', "shift": True}), *_template_items_context_menu("IMAGE_MT_uvs_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}), ("wm.context_toggle", {"type": 'B', "value": 'PRESS'}, @@ -669,6 +682,10 @@ def km_view3d(params): op_menu_pie("VIEW3D_MT_view_pie", {"type": 'V', "value": 'PRESS'}), # Navigation. ("view3d.rotate", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, None), + ("view3d.view_pan", {"type": 'WHEELLEFTMOUSE', "value": 'PRESS'}, + {"properties": [("type", 'PANLEFT')]}), + ("view3d.view_pan", {"type": 'WHEELRIGHTMOUSE', "value": 'PRESS'}, + {"properties": [("type", 'PANRIGHT')]}), ("view3d.move", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "alt": True}, None), ("view3d.zoom", {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True}, None), ("view3d.view_selected", {"type": 'F', "value": 'PRESS'}, @@ -1033,18 +1050,6 @@ def km_image(params): ("image.view_zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None), ("image.view_zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None), ("image.view_zoom_border", {"type": 'Z', "value": 'PRESS'}, None), - ("image.view_zoom_ratio", {"type": 'F4', "value": 'PRESS', "ctrl": True}, - {"properties": [("ratio", 8.0)]}), - ("image.view_zoom_ratio", {"type": 'F3', "value": 'PRESS', "ctrl": True}, - {"properties": [("ratio", 4.0)]}), - ("image.view_zoom_ratio", {"type": 'F2', "value": 'PRESS', "ctrl": True}, - {"properties": [("ratio", 2.0)]}), - ("image.view_zoom_ratio", {"type": 'F4', "value": 'PRESS', "shift": True}, - {"properties": [("ratio", 8.0)]}), - ("image.view_zoom_ratio", {"type": 'F3', "value": 'PRESS', "shift": True}, - {"properties": [("ratio", 4.0)]}), - ("image.view_zoom_ratio", {"type": 'F2', "value": 'PRESS', "shift": True}, - {"properties": [("ratio", 2.0)]}), ("image.view_zoom_ratio", {"type": 'F1', "value": 'PRESS'}, {"properties": [("ratio", 1.0)]}), ("image.view_zoom_ratio", {"type": 'F2', "value": 'PRESS'}, @@ -1053,6 +1058,22 @@ def km_image(params): {"properties": [("ratio", 0.25)]}), ("image.view_zoom_ratio", {"type": 'F4', "value": 'PRESS'}, {"properties": [("ratio", 0.125)]}), + ("image.view_zoom_ratio", {"type": 'F4', "value": 'PRESS', "ctrl": True}, + {"properties": [("ratio", 8.0)]}), + ("image.view_zoom_ratio", {"type": 'F3', "value": 'PRESS', "ctrl": True}, + {"properties": [("ratio", 4.0)]}), + ("image.view_zoom_ratio", {"type": 'F2', "value": 'PRESS', "ctrl": True}, + {"properties": [("ratio", 2.0)]}), + ("image.view_zoom_ratio", {"type": 'F1', "value": 'PRESS', "ctrl": True}, + {"properties": [("ratio", 1.0)]}), + ("image.view_zoom_ratio", {"type": 'F4', "value": 'PRESS', "shift": True}, + {"properties": [("ratio", 8.0)]}), + ("image.view_zoom_ratio", {"type": 'F3', "value": 'PRESS', "shift": True}, + {"properties": [("ratio", 4.0)]}), + ("image.view_zoom_ratio", {"type": 'F2', "value": 'PRESS', "shift": True}, + {"properties": [("ratio", 2.0)]}), + ("image.view_zoom_ratio", {"type": 'F1', "value": 'PRESS', "shift": True}, + {"properties": [("ratio", 1.0)]}), ("image.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), ("image.sample", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), ("image.curves_point_set", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, @@ -1166,8 +1187,7 @@ def km_node_editor(params): {"properties": [("exit", True)]}), ("node.clipboard_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), ("node.clipboard_paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), - ("node.viewer_border", {"type": 'Z', "value": 'PRESS'}, None), - ("node.clear_viewer_border", {"type": 'Z', "value": 'PRESS', "alt": True}, None), + ("node.delete_copy_reconnect", {"type": 'X', "value": 'PRESS', "ctrl": True}, None), ("node.translate_attach", {"type": 'W', "value": 'PRESS'}, None), ("node.translate_attach", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), ("node.translate_attach", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG'}, None), @@ -1244,7 +1264,8 @@ def km_file_browser(params): ("file.next", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, None), ("wm.context_toggle", {"type": 'H', "value": 'PRESS'}, {"properties": [("data_path", "space_data.params.show_hidden")]}), - ("file.directory_new", {"type": 'I', "value": 'PRESS'}, None), + ("file.directory_new", {"type": 'I', "value": 'PRESS'}, + {"properties": [("confirm", False)]}), ("file.rename", {"type": 'F2', "value": 'PRESS'}, None), ("file.delete", {"type": 'DEL', "value": 'PRESS'}, None), ("file.smoothscroll", {"type": 'TIMER1', "value": 'ANY', "any": True}, None), @@ -1748,10 +1769,10 @@ def km_text(params): return keymap -def km_sequencercommon(_params): +def km_sequencer_generic(_params): items = [] keymap = ( - "SequencerCommon", + "Video Sequence Editor", {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, {"items": items}, ) @@ -1778,69 +1799,7 @@ def km_sequencer(params): items.extend([ ("wm.search_menu", {"type": 'TAB', "value": 'PRESS'}, None), *_template_items_animation(), - ("sequencer.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'SELECT')]}), - ("sequencer.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True, - "shift": True}, {"properties": [("action", 'DESELECT')]}), - ("sequencer.select_all", {"type": 'I', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'INVERT')]}), - ("sequencer.split", {"type": 'B', "value": 'PRESS', "ctrl": True}, - {"properties": [("type", 'SOFT')]}), - ("sequencer.mute", {"type": 'M', "value": 'PRESS'}, - {"properties": [("unselected", False)]}), - ("sequencer.mute", {"type": 'M', "value": 'PRESS', "shift": True}, - {"properties": [("unselected", True)]}), - ("sequencer.unmute", {"type": 'M', "value": 'PRESS', "alt": True}, - {"properties": [("unselected", False)]}), - ("sequencer.unmute", {"type": 'M', "value": 'PRESS', "shift": True, "alt": True}, - {"properties": [("unselected", True)]}), - ("sequencer.lock", {"type": 'L', "value": 'PRESS', "shift": True}, None), - ("sequencer.unlock", {"type": 'L', "value": 'PRESS', "shift": True, "alt": True}, None), - ("sequencer.reassign_inputs", {"type": 'R', "value": 'PRESS'}, None), - ("sequencer.reload", {"type": 'R', "value": 'PRESS', "ctrl": True}, None), - ("sequencer.reload", {"type": 'R', "value": 'PRESS', "shift": True, "alt": True}, - {"properties": [("adjust_length", True)]}), - ("sequencer.offset_clear", {"type": 'O', "value": 'PRESS', "alt": True}, None), - ("sequencer.duplicate_move", {"type": 'D', "value": 'PRESS', "ctrl": True}, None), - ("sequencer.retiming_key_delete", {"type": 'BACK_SPACE', "value": 'PRESS'}, None), - ("sequencer.retiming_key_delete", {"type": 'DEL', "value": 'PRESS'}, None), - ("sequencer.delete", {"type": 'BACK_SPACE', "value": 'PRESS'}, None), - ("sequencer.delete", {"type": 'DEL', "value": 'PRESS'}, None), - ("sequencer.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), - ("sequencer.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), - ("sequencer.images_separate", {"type": 'Y', "value": 'PRESS'}, None), - ("sequencer.meta_toggle", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None), - ("sequencer.meta_make", {"type": 'G', "value": 'PRESS', "ctrl": True}, None), - ("sequencer.meta_separate", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None), - ("sequencer.view_all", {"type": 'A', "value": 'PRESS'}, None), - ("sequencer.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None), - ("sequencer.view_selected", {"type": 'F', "value": 'PRESS'}, None), - ("sequencer.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None), - ("sequencer.strip_jump", {"type": 'PAGE_UP', "value": 'PRESS', "repeat": True}, - {"properties": [("next", True), ("center", False)]}), - ("sequencer.strip_jump", {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True}, - {"properties": [("next", False), ("center", False)]}), - ("sequencer.strip_jump", {"type": 'PAGE_UP', "value": 'PRESS', "alt": True, "repeat": True}, - {"properties": [("next", True), ("center", True)]}), - ("sequencer.strip_jump", {"type": 'PAGE_DOWN', "value": 'PRESS', "alt": True, "repeat": True}, - {"properties": [("next", False), ("center", True)]}), - ("sequencer.swap", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True, "repeat": True}, - {"properties": [("side", 'LEFT')]}), - ("sequencer.swap", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True, "repeat": True}, - {"properties": [("side", 'RIGHT')]}), - ("sequencer.gap_remove", {"type": 'BACK_SPACE', "value": 'PRESS'}, - {"properties": [("all", False)]}), - ("sequencer.gap_remove", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, - {"properties": [("all", True)]}), - ("sequencer.gap_insert", {"type": 'EQUAL', "value": 'PRESS', "shift": True}, None), - ("sequencer.snap", {"type": 'X', "value": 'PRESS'}, None), - ("sequencer.swap_inputs", {"type": 'S', "value": 'PRESS', "alt": True}, None), - *( - (("sequencer.split_multicam", - {"type": NUMBERS_1[i], "value": 'PRESS'}, - {"properties": [("camera", i + 1)]}) - for i in range(10) - ) - ), - ("sequencer.select", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), + ("sequencer.select", {"type": 'LEFTMOUSE', "value": 'CLICK'}, None), ("sequencer.select", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, {"properties": [("extend", True)]}), ("sequencer.select", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, @@ -1865,28 +1824,100 @@ def km_sequencer(params): ("sequencer.select_box", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "ctrl": True}, {"properties": [("tweak", True), ("mode", 'SUB')]}), ("sequencer.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None), + ("sequencer.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'SELECT')]}), + ("sequencer.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True, + "shift": True}, {"properties": [("action", 'DESELECT')]}), + ("sequencer.select_all", {"type": 'I', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'INVERT')]}), + ("sequencer.split", {"type": 'B', "value": 'PRESS', "ctrl": True}, + {"properties": [("type", 'SOFT')]}), + ("sequencer.mute", {"type": 'M', "value": 'PRESS'}, + {"properties": [("unselected", False)]}), + ("sequencer.mute", {"type": 'M', "value": 'PRESS', "shift": True}, + {"properties": [("unselected", True)]}), + ("sequencer.unmute", {"type": 'M', "value": 'PRESS', "alt": True}, + {"properties": [("unselected", False)]}), + ("sequencer.unmute", {"type": 'M', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": [("unselected", True)]}), + ("sequencer.lock", {"type": 'L', "value": 'PRESS', "shift": True}, None), + ("sequencer.unlock", {"type": 'L', "value": 'PRESS', "shift": True, "alt": True}, None), + ("sequencer.connect", {"type": 'L', "value": 'PRESS', "ctrl": True, "alt": True}, + {"properties": [("toggle", True)]}), + ("sequencer.reassign_inputs", {"type": 'R', "value": 'PRESS'}, None), + ("sequencer.reload", {"type": 'R', "value": 'PRESS', "ctrl": True}, None), + ("sequencer.reload", {"type": 'R', "value": 'PRESS', "shift": True, "alt": True}, + {"properties": [("adjust_length", True)]}), + ("sequencer.offset_clear", {"type": 'O', "value": 'PRESS', "alt": True}, None), + ("sequencer.duplicate_move", {"type": 'D', "value": 'PRESS', "ctrl": True}, None), + ("sequencer.duplicate_move_linked", {"type": 'D', "value": 'PRESS', "ctrl": True, "alt": True}, None), + ("sequencer.retiming_key_delete", {"type": 'BACK_SPACE', "value": 'PRESS'}, None), + ("sequencer.retiming_key_delete", {"type": 'DEL', "value": 'PRESS'}, None), + ("sequencer.delete", {"type": 'BACK_SPACE', "value": 'PRESS'}, None), + ("sequencer.delete", {"type": 'DEL', "value": 'PRESS'}, None), + ("sequencer.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), + ("sequencer.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), + ("sequencer.images_separate", {"type": 'Y', "value": 'PRESS'}, None), + ("sequencer.meta_toggle", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None), + ("sequencer.meta_make", {"type": 'G', "value": 'PRESS', "ctrl": True}, None), + ("sequencer.meta_separate", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None), + ("sequencer.view_all", {"type": 'A', "value": 'PRESS'}, None), + ("sequencer.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None), + ("sequencer.view_selected", {"type": 'F', "value": 'PRESS'}, None), + ("sequencer.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None), + ("sequencer.strip_jump", {"type": 'PAGE_UP', "value": 'PRESS', "repeat": True}, + {"properties": [("next", False), ("center", False)]}), + ("sequencer.strip_jump", {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True}, + {"properties": [("next", True), ("center", False)]}), + ("sequencer.strip_jump", {"type": 'PAGE_UP', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": [("next", False), ("center", True)]}), + ("sequencer.strip_jump", {"type": 'PAGE_DOWN', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": [("next", True), ("center", True)]}), + ("sequencer.swap", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": [("side", 'LEFT')]}), + ("sequencer.swap", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True, "repeat": True}, + {"properties": [("side", 'RIGHT')]}), + ("sequencer.gap_remove", {"type": 'BACK_SPACE', "value": 'PRESS'}, + {"properties": [("all", False)]}), + ("sequencer.gap_remove", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, + {"properties": [("all", True)]}), + ("sequencer.gap_insert", {"type": 'EQUAL', "value": 'PRESS', "shift": True}, None), + ("sequencer.snap", {"type": 'X', "value": 'PRESS'}, {"properties": [("keep_offset", True)]}), + ("sequencer.swap_inputs", {"type": 'S', "value": 'PRESS', "alt": True}, None), + *( + (("sequencer.split_multicam", + {"type": NUMBERS_1[i], "value": 'PRESS'}, + {"properties": [("camera", i + 1)]}) + for i in range(10) + ) + ), ("sequencer.slip", {"type": 'R', "value": 'PRESS'}, None), ("wm.context_set_int", {"type": 'O', "value": 'PRESS'}, {"properties": [("data_path", "scene.sequence_editor.overlay_frame"), ("value", 0)]}), - ("transform.seq_slide", {"type": 'W', "value": 'PRESS'}, None), - ("transform.seq_slide", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), - ("transform.seq_slide", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG'}, None), + ("transform.seq_slide", {"type": 'W', "value": 'PRESS'}, + {"properties": [("view2d_edge_pan", True)]}), + ("transform.seq_slide", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, + {"properties": [("view2d_edge_pan", True), ("use_restore_handle_selection", True)]}), + ("transform.seq_slide", {"type": 'MIDDLEMOUSE', "value": 'CLICK_DRAG'}, + {"properties": [("view2d_edge_pan", True), ("use_restore_handle_selection", True)]}), ("transform.transform", {"type": 'E', "value": 'PRESS'}, {"properties": [("mode", 'TIME_EXTEND')]}), - *_template_items_context_menu("SEQUENCER_MT_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}), ("marker.add", {"type": 'M', "value": 'PRESS'}, None), + *_template_items_context_menu("SEQUENCER_MT_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}), + op_menu("SEQUENCER_MT_retiming", {"type": 'I', "value": 'PRESS'}), + ("sequencer.retiming_segment_speed_set", {"type": 'R', "value": 'PRESS', "shift": True}, None), + ("sequencer.retiming_show", {"type": 'R', "value": 'PRESS', "ctrl": True, "shift": True}, None), # Tools op_tool_cycle("builtin.select_box", {"type": 'Q', "value": 'PRESS'}), op_tool_cycle("builtin.blade", {"type": 'B', "value": 'PRESS'}), + op_tool_cycle("builtin.slip", {"type": 'S', "value": 'PRESS'}), ]) return keymap -def km_sequencerpreview(params): +def km_sequencer_preview(params): items = [] keymap = ( - "SequencerPreview", + "Preview", {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, {"items": items}, ) @@ -2221,9 +2252,8 @@ def km_spreadsheet_generic(_params): ) items.extend([ - *_template_space_region_type_toggle( - channels_key={"type": 'T', "value": 'PRESS'}, - ), + ("wm.context_toggle", {"type": 'LEFT_BRACKET', "value": 'PRESS', "ctrl": True}, + {"properties": [("data_path", "space_data.show_region_toolbar")]}), ("wm.context_toggle", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "ctrl": True}, {"properties": [("data_path", "space_data.show_region_ui")]}), ]) @@ -2349,817 +2379,6 @@ def km_animation_channels(params): # Modes -def km_gpencil_legacy(_params): - items = [] - keymap = ( - "Grease Pencil", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - return keymap - - -def _gpencil_legacy_selection(params): - return [ - # Select all - ("gpencil.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'SELECT')]}), - ("gpencil.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True, - "shift": True}, {"properties": [("action", 'DESELECT')]}), - ("gpencil.select_all", {"type": 'I', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'INVERT')]}), - # Select linked - ("gpencil.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None), - # Select grouped - ("gpencil.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None), - # Select more/less - ("gpencil.select_more", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, None), - ("gpencil.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, None), - ] - - -def _gpencil_legacy_display(): - return [ - ("wm.context_toggle", {"type": 'Q', "value": 'PRESS', "shift": True}, - {"properties": [("data_path", "space_data.overlay.use_gpencil_edit_lines")]}), - ("wm.context_toggle", {"type": 'Q', "value": 'PRESS', "shift": True, "alt": True}, - {"properties": [("data_path", "space_data.overlay.use_gpencil_multiedit_line_only")]}), - ] - - -def km_gpencil_legacy_stroke_edit_mode(params): - items = [] - keymap = ( - "Grease Pencil Stroke Edit Mode", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Normal select - ("gpencil.select", {"type": 'LEFTMOUSE', "value": 'CLICK'}, - {"properties": [("deselect_all", True)]}), - ("gpencil.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True}, - {"properties": [("extend", True), ("toggle", True)]}), - # Selection - *_gpencil_legacy_selection(params), - ("gpencil.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'SELECT')]}), - # Duplicate and move selected points - ("gpencil.duplicate_move", {"type": 'D', "value": 'PRESS', "ctrl": True}, None), - # Delete - op_menu("VIEW3D_MT_edit_gpencil_delete", {"type": 'BACK_SPACE', "value": 'PRESS'}), - op_menu("VIEW3D_MT_edit_gpencil_delete", {"type": 'DEL', "value": 'PRESS'}), - ("gpencil.dissolve", {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True}, None), - ("gpencil.dissolve", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None), - ("gpencil.active_frames_delete_all", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, None), - ("gpencil.active_frames_delete_all", {"type": 'DEL', "value": 'PRESS', "shift": True}, None), - # Context menu - *_template_items_context_menu("VIEW3D_MT_gpencil_edit_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}), - # Separate - op_menu("GPENCIL_MT_separate", {"type": 'P', "value": 'PRESS'}), - # Split and joint strokes - ("gpencil.stroke_join", {"type": 'J', "value": 'PRESS', "ctrl": True}, None), - ("gpencil.stroke_join", {"type": 'J', "value": 'PRESS', "shift": True, "ctrl": True}, - {"properties": [("type", 'JOINCOPY')]}), - # Copy + paste. - ("gpencil.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), - ("gpencil.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), - # Snap - op_menu_pie("GPENCIL_MT_snap_pie", {"type": 'X', "value": 'PRESS', "shift": True}), - # Show/hide - ("gpencil.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None), - ("gpencil.hide", {"type": 'H', "value": 'PRESS', "ctrl": True}, - {"properties": [("unselected", False)]}), - # Isolate layer - ("gpencil.layer_isolate", {"type": 'NUMPAD_ASTERIX', "value": 'PRESS'}, None), - # Transform tools - ("transform.translate", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), - ("wm.context_toggle", {"type": 'B', "value": 'PRESS'}, - {"properties": [("data_path", "tool_settings.use_proportional_edit")]}), - # Vertex group menu - op_menu("GPENCIL_MT_gpencil_vertex_group", {"type": 'G', "value": 'PRESS', "ctrl": True}), - # Select mode - ("gpencil.selectmode_toggle", {"type": 'ONE', "value": 'PRESS', "ctrl": True}, - {"properties": [("mode", 0)]}), - ("gpencil.selectmode_toggle", {"type": 'TWO', "value": 'PRESS', "ctrl": True}, - {"properties": [("mode", 1)]}), - ("gpencil.selectmode_toggle", {"type": 'THREE', "value": 'PRESS', "ctrl": True}, - {"properties": [("mode", 2)]}), - # Active layer - op_menu("GPENCIL_MT_layer_active", {"type": 'Y', "value": 'PRESS'}), - # Merge Layer - ("gpencil.layer_merge", {"type": 'Y', "value": 'PRESS', "shift": True}, None), - # Keyframes - op_menu("VIEW3D_MT_gpencil_animation", {"type": 'S', "value": 'PRESS', "shift": True}), - ("gpencil.blank_frame_add", {"type": 'S', "value": 'PRESS', "shift": True, "alt": True}, None), - # Tools - *_template_items_basic_tools(), - op_tool_cycle("builtin.extrude", {"type": 'E', "value": 'PRESS', "ctrl": True}), - op_tool_cycle("builtin.radius", {"type": 'R', "value": 'PRESS', "ctrl": True}), - op_tool_cycle("builtin.bend", {"type": 'B', "value": 'PRESS', "ctrl": True}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_paint_mode(params): - items = [] - keymap = ( - "Grease Pencil Stroke Paint Mode", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Brush strength - ("wm.radial_control", {"type": 'U', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_paint.brush.gpencil_settings.pen_strength")]}), - # Brush properties - ("wm.radial_control", {"type": 'S', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_paint.brush.size")]}), - ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, - {"properties": [("scalar", 0.9)]}), - ("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True}, - {"properties": [("scalar", 1.0 / 0.9)]}), - # Color operators - ("gpencil.tint_flip", {"type": 'X', "value": 'PRESS'}, None), - # Draw context menu - *_template_items_context_panel("VIEW3D_PT_gpencil_draw_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}), - # Show/hide - ("gpencil.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None), - ("gpencil.hide", {"type": 'H', "value": 'PRESS', "ctrl": True}, {"properties": [("unselected", False)]}), - ("gpencil.hide", {"type": 'H', "value": 'PRESS', "shift": True}, {"properties": [("unselected", True)]}), - # Delete - op_menu("VIEW3D_MT_edit_gpencil_delete", {"type": 'BACK_SPACE', "value": 'PRESS'}), - op_menu("VIEW3D_MT_edit_gpencil_delete", {"type": 'DEL', "value": 'PRESS'}), - ("gpencil.dissolve", {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True}, None), - ("gpencil.dissolve", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None), - ("gpencil.active_frames_delete_all", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, None), - ("gpencil.active_frames_delete_all", {"type": 'DEL', "value": 'PRESS', "shift": True}, None), - # Box delete - ("gpencil.select_box", {"type": 'B', "value": 'PRESS'}, None), - # Lasso delete - ("gpencil.select_lasso", {"type": params.action_mouse, "value": 'CLICK_DRAG', "ctrl": True, "alt": True}, None), - # Tools - op_tool_cycle("builtin.cutter", {"type": 'K', "value": 'PRESS'}), - op_tool_cycle("builtin.cursor", {"type": 'C', "value": 'PRESS'}), - op_tool_cycle("builtin.annotate", {"type": 'D', "value": 'PRESS'}), - # Active layer - op_menu("GPENCIL_MT_layer_active", {"type": 'Y', "value": 'PRESS'}), - # Merge Layer - ("gpencil.layer_merge", {"type": 'Y', "value": 'PRESS', "shift": True}, None), - # Material menu - op_menu("GPENCIL_MT_material_active", {"type": 'Y', "value": 'PRESS', "alt": True}), - # Keyframes - op_menu("VIEW3D_MT_gpencil_animation", {"type": 'S', "value": 'PRESS', "shift": True}), - ("gpencil.blank_frame_add", {"type": 'S', "value": 'PRESS', "shift": True, "alt": True}, None), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_paint_draw_brush(params): - items = [] - keymap = ( - "Grease Pencil Stroke Paint (Draw brush)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Draw - ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("mode", 'DRAW'), ("wait_for_input", False)]}), - ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("mode", 'DRAW'), ("wait_for_input", False)]}), - # Draw - straight lines - ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "alt": True}, - {"properties": [("mode", 'DRAW_STRAIGHT'), ("wait_for_input", False)]}), - # Erase - ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("mode", 'ERASER'), ("wait_for_input", False)]}), - # Tablet Mappings for Drawing ------------------ */ - # For now, only support direct drawing using the eraser, as most users using a tablet - # may still want to use that as their primary pointing device! - ("gpencil.draw", {"type": 'ERASER', "value": 'PRESS'}, - {"properties": [("mode", 'ERASER'), ("wait_for_input", False)]}), - - ]) - - return keymap - - -def km_gpencil_legacy_stroke_paint_erase(params): - items = [] - keymap = ( - "Grease Pencil Stroke Paint (Erase)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Erase - ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("mode", 'ERASER'), ("wait_for_input", False)]}), - ("gpencil.draw", {"type": 'ERASER', "value": 'PRESS'}, - {"properties": [("mode", 'ERASER'), ("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_paint_fill(params): - items = [] - keymap = ( - "Grease Pencil Stroke Paint (Fill)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Fill - ("gpencil.fill", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("on_back", False)]}), - ("gpencil.fill", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("on_back", False)]}), - # If press alternate key, the brush now it's for drawing areas - ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [ - ("mode", 'DRAW'), - ("wait_for_input", False), - ("disable_straight", True), - ("disable_stabilizer", True), - ]}), - # If press alternative key, the brush now it's for drawing lines - ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, - {"properties": [ - ("mode", 'DRAW'), - ("wait_for_input", False), - ("disable_straight", True), - ("disable_stabilizer", True), - ("disable_fill", True), - ]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_paint_tint(params): - items = [] - keymap = ( - "Grease Pencil Stroke Paint (Tint)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Tint - ("gpencil.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_mode(params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt Mode", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items} - ) - - items.extend([ - # Selection Modes - ("wm.context_toggle", {"type": 'ONE', "value": 'PRESS'}, - {"properties": [("data_path", "tool_settings.use_gpencil_select_mask_point")]}), - ("wm.context_toggle", {"type": 'TWO', "value": 'PRESS'}, - {"properties": [("data_path", "tool_settings.use_gpencil_select_mask_stroke")]}), - ("wm.context_toggle", {"type": 'THREE', "value": 'PRESS'}, - {"properties": [("data_path", "tool_settings.use_gpencil_select_mask_segment")]}), - # Normal Selection - ("gpencil.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "alt": True}, - {"properties": [("deselect_all", True), ("toggle", True), ("use_shift_extend", False)]}), - ("gpencil.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "alt": True, "ctrl": True}, - {"properties": [("use_shift_extend", True), ("toggle", True)]}), - # Selection - *_gpencil_legacy_selection(params), - # Brush properties - ("wm.radial_control", {"type": 'U', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_sculpt_paint.brush.strength")]}), - ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, - {"properties": [("scalar", 0.9)]}), - ("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True}, - {"properties": [("scalar", 1.0 / 0.9)]}), - ("wm.radial_control", {"type": 'S', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_sculpt_paint.brush.size")]}), - # Copy - ("gpencil.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), - # Display - *_gpencil_legacy_display(), - # Delete - op_menu("VIEW3D_MT_edit_gpencil_delete", {"type": 'BACK_SPACE', "value": 'PRESS'}), - op_menu("VIEW3D_MT_edit_gpencil_delete", {"type": 'DEL', "value": 'PRESS'}), - ("gpencil.active_frames_delete_all", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, None), - ("gpencil.active_frames_delete_all", {"type": 'DEL', "value": 'PRESS', "shift": True}, None), - # Keyframes - op_menu("VIEW3D_MT_gpencil_animation", {"type": 'S', "value": 'PRESS', "shift": True}), - ("gpencil.blank_frame_add", {"type": 'S', "value": 'PRESS', "shift": True, "alt": True}, None), - # Active layer - op_menu("GPENCIL_MT_layer_active", {"type": 'Y', "value": 'PRESS'}), - # Merge Layer - ("gpencil.layer_merge", {"type": 'Y', "value": 'PRESS', "shift": True}, None), - # Material menu - op_menu("GPENCIL_MT_material_active", {"type": 'Y', "value": 'PRESS', "alt": True}), - # Context menu - op_panel("VIEW3D_PT_gpencil_sculpt_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}), - op_menu_pie( - "VIEW3D_MT_sculpt_gpencil_automasking_pie", - {"type": 'A', "alt": True, "value": 'PRESS'}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_smooth(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt (Smooth)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_thickness(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt (Thickness)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_strength(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt (Strength)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_grab(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt (Grab)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_push(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt (Push)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_twist(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt (Twist)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_pinch(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt (Pinch)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_randomize(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt (Randomize)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_sculpt_clone(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Sculpt (Clone)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.sculpt_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_weight_mode(params): - items = [] - keymap = ( - "Grease Pencil Stroke Weight Mode", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Brush strength - ("wm.radial_control", {"type": 'U', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_weight_paint.brush.strength")]}), - # Brush size - ("wm.radial_control", {"type": 'S', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_weight_paint.brush.size")]}), - ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, - {"properties": [("scalar", 0.9)]}), - ("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True}, - {"properties": [("scalar", 1.0 / 0.9)]}), - ("wm.radial_control", {"type": 'F', "value": 'PRESS', "ctrl": True}, - {"properties": [("data_path_primary", "tool_settings.gpencil_weight_paint.brush.weight")]}), - # Weight sample - ("gpencil.weight_sample", {"type": 'I', "value": 'PRESS'}, None), - # Tools - op_tool_cycle("builtin.annotate", {"type": 'D', "value": 'PRESS'}), - # Delete - op_menu("VIEW3D_MT_edit_gpencil_delete", {"type": 'BACK_SPACE', "value": 'PRESS'}), - op_menu("VIEW3D_MT_edit_gpencil_delete", {"type": 'DEL', "value": 'PRESS'}), - ("gpencil.active_frames_delete_all", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, None), - ("gpencil.active_frames_delete_all", {"type": 'DEL', "value": 'PRESS', "shift": True}, None), - # Keyframes - op_menu("VIEW3D_MT_gpencil_animation", {"type": 'S', "value": 'PRESS', "shift": True}), - ("gpencil.blank_frame_add", {"type": 'S', "value": 'PRESS', "shift": True, "alt": True}, None), - # Active layer - op_menu("GPENCIL_MT_layer_active", {"type": 'Y', "value": 'PRESS'}), - # Merge Layer - ("gpencil.layer_merge", {"type": 'Y', "value": 'PRESS', "shift": True}, None), - # Context menu - *_template_items_context_panel("VIEW3D_PT_gpencil_weight_context_menu", - {"type": 'RIGHTMOUSE', "value": 'PRESS'}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_weight_draw(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Weight (Draw)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_weight_blur(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Weight (Blur)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_weight_average(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Weight (Average)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_weight_smear(_params): - items = [] - keymap = ( - "Grease Pencil Stroke Weight (Smear)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - ("gpencil.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_vertex_mode(params): - items = [] - keymap = ( - "Grease Pencil Stroke Vertex Mode", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Selection Modes - ("wm.context_toggle", {"type": 'ONE', "value": 'PRESS'}, - {"properties": [("data_path", "tool_settings.use_gpencil_vertex_select_mask_point")]}), - ("wm.context_toggle", {"type": 'TWO', "value": 'PRESS'}, - {"properties": [("data_path", "tool_settings.use_gpencil_vertex_select_mask_stroke")]}), - ("wm.context_toggle", {"type": 'THREE', "value": 'PRESS'}, - {"properties": [("data_path", "tool_settings.use_gpencil_vertex_select_mask_segment")]}), - # Normal Selection - ("gpencil.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "alt": True}, - {"properties": [("deselect_all", True), ("toggle", True), ("use_shift_extend", False)]}), - ("gpencil.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "alt": True, "ctrl": True}, - {"properties": [("use_shift_extend", True), ("toggle", True)]}), - # Selection - *_gpencil_legacy_selection(params), - # Brush strength - ("wm.radial_control", {"type": 'U', "value": 'PRESS'}, - {"properties": [ - ("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.gpencil_settings.pen_strength"), - ]}), - # Brush size - ("wm.radial_control", {"type": 'S', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.size")]}), - ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, - {"properties": [("scalar", 0.9)]}), - ("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True}, - {"properties": [("scalar", 1.0 / 0.9)]}), - # Color operators - ("gpencil.tint_flip", {"type": 'X', "value": 'PRESS'}, None), - # Display - *_gpencil_legacy_display(), - # Delete - op_menu("VIEW3D_MT_edit_gpencil_delete", {"type": 'BACK_SPACE', "value": 'PRESS'}), - op_menu("VIEW3D_MT_edit_gpencil_delete", {"type": 'DEL', "value": 'PRESS'}), - ("gpencil.active_frames_delete_all", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, None), - ("gpencil.active_frames_delete_all", {"type": 'DEL', "value": 'PRESS', "shift": True}, None), - # Keyframes - op_menu("VIEW3D_MT_gpencil_animation", {"type": 'S', "value": 'PRESS', "shift": True}), - ("gpencil.blank_frame_add", {"type": 'S', "value": 'PRESS', "shift": True, "alt": True}, None), - # Active layer - op_menu("GPENCIL_MT_layer_active", {"type": 'Y', "value": 'PRESS'}), - # Merge Layer - ("gpencil.layer_merge", {"type": 'Y', "value": 'PRESS', "shift": True}, None), - # Tools - op_tool_cycle("builtin.select_box", {"type": 'Q', "value": 'PRESS'}), - op_tool_cycle("builtin.annotate", {"type": 'D', "value": 'PRESS'}), - # Vertex Paint context menu - op_panel("VIEW3D_PT_gpencil_vertex_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_vertex_draw(params): - items = [] - keymap = ( - "Grease Pencil Stroke Vertex (Draw)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Tint - ("gpencil.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - # Brush strength - ("wm.radial_control", {"type": 'U', "value": 'PRESS'}, - {"properties": [ - ("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.gpencil_settings.pen_strength"), - ]}), - # Brush size - ("wm.radial_control", {"type": 'S', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.size")]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_vertex_blur(params): - items = [] - keymap = ( - "Grease Pencil Stroke Vertex (Blur)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Tint - ("gpencil.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - # Brush strength - ("wm.radial_control", {"type": 'U', "value": 'PRESS'}, - {"properties": [ - ("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.gpencil_settings.pen_strength"), - ]}), - # Brush size - ("wm.radial_control", {"type": 'S', "value": 'PRESS'}, - {"properties": [ - ("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.size"), - ]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_vertex_average(params): - items = [] - keymap = ( - "Grease Pencil Stroke Vertex (Average)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Tint - ("gpencil.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - ("gpencil.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, - {"properties": [("wait_for_input", False)]}), - # Brush strength - ("wm.radial_control", {"type": 'U', "value": 'PRESS'}, - {"properties": [ - ("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.gpencil_settings.pen_strength"), - ]}), - # Brush size - ("wm.radial_control", {"type": 'S', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.size")]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_vertex_smear(params): - items = [] - keymap = ( - "Grease Pencil Stroke Vertex (Smear)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Tint - ("gpencil.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - # Brush strength - ("wm.radial_control", {"type": 'U', "value": 'PRESS', "shift": True}, - {"properties": [ - ("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.gpencil_settings.pen_strength"), - ]}), - # Brush size - ("wm.radial_control", {"type": 'S', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.size")]}), - ]) - - return keymap - - -def km_gpencil_legacy_stroke_vertex_replace(params): - items = [] - keymap = ( - "Grease Pencil Stroke Vertex (Replace)", - {"space_type": 'EMPTY', "region_type": 'WINDOW'}, - {"items": items}, - ) - - items.extend([ - # Tint - ("gpencil.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, - {"properties": [("wait_for_input", False)]}), - # Brush size - ("wm.radial_control", {"type": 'S', "value": 'PRESS'}, - {"properties": [("data_path_primary", "tool_settings.gpencil_vertex_paint.brush.size")]}), - ]) - - return keymap - - def km_face_mask(params): items = [] keymap = ( @@ -3348,8 +2567,8 @@ def km_object_mode(params): ("anim.keyframe_delete_v3d", {"type": 'S', "value": 'PRESS', "alt": True}, None), ("anim.keying_set_active_set", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None), *_template_items_context_menu("VIEW3D_MT_object_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}), - ("object.move_to_collection", {"type": 'G', "value": 'PRESS', "ctrl": True}, None), - ("object.link_to_collection", {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True}, None), + op_menu("OBJECT_MT_move_to_collection", {"type": 'G', "value": 'PRESS', "ctrl": True}), + op_menu("OBJECT_MT_link_to_collection", {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True}), ("object.hide_view_clear", {"type": 'H', "value": 'PRESS', "alt": True}, None), ("object.hide_view_set", {"type": 'H', "value": 'PRESS', "ctrl": True}, {"properties": [("unselected", False)]}), @@ -3399,7 +2618,6 @@ def km_paint_curve(params): ("transform.translate", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None), ("transform.rotate", {"type": 'E', "value": 'PRESS'}, None), ("transform.resize", {"type": 'R', "value": 'PRESS'}, None), - op_asset_shelf_popup("VIEW3D_AST_brush_sculpt_curves", {"type": 'B', "value": 'PRESS'}), ]) return keymap @@ -3452,7 +2670,7 @@ def km_curve(params): def radial_control_properties(paint, prop, secondary_prop, secondary_rotation=False, color=False, zoom=False): brush_path = "tool_settings." + paint + ".brush" - unified_path = "tool_settings.unified_paint_settings" + unified_path = "tool_settings." + paint + ".unified_paint_settings" rotation = "mask_texture_slot.angle" if secondary_rotation else "texture_slot.angle" return { "properties": [ @@ -3502,15 +2720,16 @@ def _template_paint_radial_control( items.extend([ ("wm.radial_control", {"type": 'F', "value": 'PRESS', "ctrl": True, "alt": True}, radial_control_properties( - paint, "mask_texture_slot.angle", None, secondary_rotation=secondary_rotation, color=color)), + paint, "mask_texture_slot.angle", None, secondary_rotation=secondary_rotation, color=color, + )), ]) if weight: items.extend([ ("wm.radial_control", {"type": 'F', "value": 'PRESS', "ctrl": True, "alt": True}, radial_control_properties( - paint, "mask_texture_slot.angle", None, secondary_rotation=secondary_rotation, color=color)), - + paint, "mask_texture_slot.angle", None, secondary_rotation=secondary_rotation, color=color, + )), ("wm.radial_control", {"type": 'F', "value": 'PRESS', "ctrl": True}, radial_control_properties( paint, "weight", "use_unified_weight")) @@ -3534,7 +2753,8 @@ def km_image_paint(params): ("paint.image_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, {"properties": [("mode", 'INVERT')]}), # Colors - ("paint.sample_color", {"type": 'I', "value": 'PRESS'}, None), + ("paint.sample_color", {"type": 'I', "value": 'PRESS'}, {"properties": [("merged", False)]}), + ("paint.sample_color", {"type": 'I', "value": 'PRESS', "shift": True}, {"properties": [("merged", True)]}), ("paint.brush_colors_flip", {"type": 'X', "value": 'PRESS'}, None), # Clone ("paint.grab_clone", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None), @@ -3564,8 +2784,10 @@ def km_image_paint(params): ("wm.context_toggle", {"type": 'L', "value": 'PRESS'}, {"properties": [("data_path", "tool_settings.image_paint.brush.use_smooth_stroke")]}), # Context menu. - *_template_items_context_panel("VIEW3D_PT_paint_texture_context_menu", - {"type": 'RIGHTMOUSE', "value": 'PRESS'}), + *_template_items_context_panel( + "VIEW3D_PT_paint_texture_context_menu", + {"type": 'RIGHTMOUSE', "value": 'PRESS'}, + ), # Tools op_tool_cycle("builtin.select_box", {"type": 'Q', "value": 'PRESS'}), op_tool_cycle("builtin.annotate", {"type": 'D', "value": 'PRESS'}), @@ -3591,9 +2813,10 @@ def km_vertex_paint(params): ("paint.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, {"properties": [("mode", 'INVERT')]}), ("paint.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("mode", 'SMOOTH')]}), + {"properties": [("brush_toggle", 'SMOOTH')]}), # Colors - ("paint.sample_color", {"type": 'I', "value": 'PRESS'}, None), + ("paint.sample_color", {"type": 'I', "value": 'PRESS'}, {"properties": [("merged", False)]}), + ("paint.sample_color", {"type": 'I', "value": 'PRESS', "shift": True}, {"properties": [("merged", True)]}), ("paint.brush_colors_flip", {"type": 'X', "value": 'PRESS'}, None), ("paint.vertex_color_set", {"type": 'BACK_SPACE', "value": 'PRESS'}, None), # Brush properties @@ -3649,7 +2872,7 @@ def km_weight_paint(params): ("paint.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, {"properties": [("mode", 'INVERT')]}), ("paint.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("mode", 'SMOOTH')]}), + {"properties": [("brush_toggle", 'SMOOTH')]}), # Weight ("paint.weight_sample", {"type": 'I', "value": 'PRESS'}, None), ("paint.weight_sample_group", {"type": 'I', "value": 'PRESS', "alt": True}, None), @@ -3706,7 +2929,11 @@ def km_sculpt(params): ("sculpt.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, {"properties": [("mode", 'INVERT')]}), ("sculpt.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("mode", 'SMOOTH')]}), + {"properties": [("brush_toggle", 'SMOOTH')]}), + ("sculpt.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, + {"properties": [("brush_toggle", 'MASK')]}), + ("sculpt.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True}, + {"properties": [("mode", 'INVERT'), ("brush_toggle", 'MASK')]}), # Expand ("sculpt.expand", {"type": 'A', "value": 'PRESS', "shift": True}, {"properties": [ @@ -3751,9 +2978,9 @@ def km_sculpt(params): # Subdivision levels *_template_items_object_subdivision_set(), ("object.subdivision_set", {"type": 'D', "value": 'PRESS', "repeat": True}, - {"properties": [("level", 1), ("relative", True)]}), + {"properties": [("level", 1), ("relative", True), ("ensure_modifier", False)]}), ("object.subdivision_set", {"type": 'D', "value": 'PRESS', "shift": True, "repeat": True}, - {"properties": [("level", -1), ("relative", True)]}), + {"properties": [("level", -1), ("relative", True), ("ensure_modifier", False)]}), # Mask ("paint.mask_flood_fill", {"type": 'A', "value": 'PRESS', "ctrl": True, "shift": True}, {"properties": [("mode", 'VALUE'), ("value", 1.0)]}), @@ -3771,7 +2998,8 @@ def km_sculpt(params): ("object.voxel_remesh", {"type": 'D', "value": 'PRESS', "ctrl": True}, None), ("object.voxel_size_edit", {"type": 'D', "value": 'PRESS', "shift": True, "ctrl": True}, None), # Color - ("sculpt.sample_color", {"type": 'I', "value": 'PRESS'}, None), + ("paint.sample_color", {"type": 'I', "value": 'PRESS'}, {"properties": [("merged", False)]}), + ("paint.sample_color", {"type": 'I', "value": 'PRESS', "shift": True}, {"properties": [("merged", True)]}), ("paint.brush_colors_flip", {"type": 'X', "value": 'PRESS'}, None), # Brush properties ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True}, @@ -3826,18 +3054,18 @@ def km_mesh(params): items.extend([ # Selection ("mesh.loop_select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, - {"properties": [("extend", False), ("deselect", False), ("toggle", False), ("ring", False)]}), + {"properties": [("extend", False), ("deselect", False), ("toggle", False)]}), ("mesh.loop_select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "shift": True}, - {"properties": [("extend", True), ("deselect", False), ("toggle", False), ("ring", False)]}), + {"properties": [("extend", True), ("deselect", False), ("toggle", False)]}), ("mesh.loop_select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "ctrl": True}, - {"properties": [("extend", False), ("deselect", True), ("toggle", False), ("ring", False)]}), + {"properties": [("extend", False), ("deselect", True), ("toggle", False)]}), - ("mesh.loop_select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "alt": True}, - {"properties": [("extend", False), ("deselect", False), ("toggle", False), ("ring", True)]}), - ("mesh.loop_select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "alt": True, "shift": True}, - {"properties": [("extend", True), ("deselect", False), ("toggle", False), ("ring", True)]}), - ("mesh.loop_select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "alt": True, "ctrl": True}, - {"properties": [("extend", False), ("deselect", True), ("toggle", False), ("ring", True)]}), + ("mesh.edgering_select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "alt": True}, + {"properties": [("extend", False), ("deselect", False), ("toggle", False)]}), + ("mesh.edgering_select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "alt": True, "shift": True}, + {"properties": [("extend", True), ("deselect", False), ("toggle", False)]}), + ("mesh.edgering_select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "alt": True, "ctrl": True}, + {"properties": [("extend", False), ("deselect", True), ("toggle", False)]}), ("mesh.shortest_path_pick", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, {"properties": [("use_fill", False)]}), @@ -4199,7 +3427,7 @@ def km_sculpt_curves(params): ("sculpt_curves.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, {"properties": [("mode", 'INVERT')]}), ("sculpt_curves.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, - {"properties": [("mode", 'SMOOTH')]}), + {"properties": [("brush_toggle", 'SMOOTH')]}), # Selection modes ("curves.set_selection_domain", {"type": 'ONE', "value": 'PRESS'}, {"properties": [("domain", 'POINT')]}), ("curves.set_selection_domain", {"type": 'TWO', "value": 'PRESS'}, {"properties": [("domain", 'CURVE')]}), @@ -4219,6 +3447,31 @@ def km_sculpt_curves(params): ("sculpt_curves.min_distance_edit", {"type": 'D', "value": 'PRESS', "ctrl": True}, {}), # Tools op_tool_cycle("builtin.annotate", {"type": 'D', "value": 'PRESS'}), + op_asset_shelf_popup("VIEW3D_AST_brush_sculpt_curves", {"type": 'B', "value": 'PRESS'}), + ]) + + return keymap + + +# Point cloud edit mode. +def km_pointcloud(params): + items = [] + keymap = ( + "Point Cloud", + {"space_type": 'EMPTY', "region_type": 'WINDOW'}, + {"items": items}, + ) + + items.extend([ + # Selection Operators + ("pointcloud.select_all", {"type": 'A', "value": 'PRESS', + "ctrl": True}, {"properties": [("action", 'SELECT')]}), + ("pointcloud.select_all", {"type": 'A', "value": 'PRESS', "shift": True, + "ctrl": True}, {"properties": [("action", 'DESELECT')]}), + ("pointcloud.select_all", {"type": 'I', "value": 'PRESS', + "ctrl": True}, {"properties": [("action", 'INVERT')]}), + # Delete + ("pointcloud.delete", {"type": 'DEL', "value": 'PRESS'}, None), ]) return keymap @@ -4389,6 +3642,7 @@ def km_transform_modal_map(_params): ("AUTOCONSTRAINPLANE", {"type": 'MIDDLEMOUSE', "value": 'ANY', "shift": True}, None), ("PRECISION", {"type": 'LEFT_SHIFT', "value": 'ANY', "any": True}, None), ("PRECISION", {"type": 'RIGHT_SHIFT', "value": 'ANY', "any": True}, None), + ("STRIP_CLAMP_TOGGLE", {"type": 'C', "value": 'PRESS', "any": True}, None), ]) return keymap @@ -4416,17 +3670,9 @@ def km_image_editor_tool_uv_select(params): ) -def km_3d_view_tool_edit_gpencil_select(params): - return ( - "3D View Tool: Edit Gpencil, Tweak", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": _template_items_tool_select(params, "gpencil.select", extend="toggle")}, - ) - - def km_sequencer_editor_tool_select_preview(params): return ( - "Sequencer Preview Tool: Tweak", + "Preview Tool: Select Box", {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, {"items": _template_items_tool_select(params, "sequencer.select", extend="toggle")} ) @@ -4434,7 +3680,7 @@ def km_sequencer_editor_tool_select_preview(params): def km_sequencer_editor_tool_select_timeline(params): return ( - "Sequencer Timeline Tool: Tweak", + "Sequencer Tool: Select Box", {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, {"items": _template_items_tool_select(params, "sequencer.select", extend="toggle")} ) @@ -4550,15 +3796,16 @@ def generate_keymaps_impl(params=None): km_nla_editor(params), km_text_generic(params), km_text(params), - km_sequencercommon(params), + km_sequencer_generic(params), km_sequencer(params), - km_sequencerpreview(params), + km_sequencer_preview(params), km_sequencer_channels(params), km_console(params), km_clip(params), km_clip_editor(params), km_clip_graph_editor(params), km_clip_dopesheet_editor(params), + km_spreadsheet_generic(params), # Animation. km_frames(params), @@ -4566,34 +3813,6 @@ def generate_keymaps_impl(params=None): km_animation_channels(params), # Modes. - # km_gpencil_legacy(params), # Empty. - km_gpencil_legacy_stroke_edit_mode(params), - km_gpencil_legacy_stroke_paint_mode(params), - km_gpencil_legacy_stroke_paint_draw_brush(params), - km_gpencil_legacy_stroke_paint_erase(params), - km_gpencil_legacy_stroke_paint_fill(params), - km_gpencil_legacy_stroke_paint_tint(params), - km_gpencil_legacy_stroke_sculpt_mode(params), - km_gpencil_legacy_stroke_sculpt_smooth(params), - km_gpencil_legacy_stroke_sculpt_thickness(params), - km_gpencil_legacy_stroke_sculpt_strength(params), - km_gpencil_legacy_stroke_sculpt_grab(params), - km_gpencil_legacy_stroke_sculpt_push(params), - km_gpencil_legacy_stroke_sculpt_twist(params), - km_gpencil_legacy_stroke_sculpt_pinch(params), - km_gpencil_legacy_stroke_sculpt_randomize(params), - km_gpencil_legacy_stroke_sculpt_clone(params), - km_gpencil_legacy_stroke_weight_mode(params), - km_gpencil_legacy_stroke_weight_draw(params), - km_gpencil_legacy_stroke_weight_blur(params), - km_gpencil_legacy_stroke_weight_average(params), - km_gpencil_legacy_stroke_weight_smear(params), - km_gpencil_legacy_stroke_vertex_mode(params), - km_gpencil_legacy_stroke_vertex_draw(params), - km_gpencil_legacy_stroke_vertex_blur(params), - km_gpencil_legacy_stroke_vertex_average(params), - km_gpencil_legacy_stroke_vertex_smear(params), - km_gpencil_legacy_stroke_vertex_replace(params), km_face_mask(params), km_weight_paint_vertex_selection(params), km_pose(params), @@ -4612,6 +3831,7 @@ def generate_keymaps_impl(params=None): km_font(params), km_curves(params), km_sculpt_curves(params), + km_pointcloud(params), km_object_non_modal(params), # Modal maps. @@ -4626,11 +3846,10 @@ def generate_keymaps_impl(params=None): # Tool System. km_3d_view_tool_select(params), + km_3d_view_tool_interactive_add(params), km_image_editor_tool_uv_select(params), - km_3d_view_tool_edit_gpencil_select(params), km_sequencer_editor_tool_select_preview(params), km_sequencer_editor_tool_select_timeline(params), - km_3d_view_tool_interactive_add(params), ]