diff --git a/config/bookmarks.txt b/config/bookmarks.txt index 9f3fc7d..e7d841c 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] -A:\1 Amazon_Active_Projects\1 BlenderAssets\ -A:\1 Amazon_Active_Projects\260127_Pick-and-Stage_2026_edits\Blends\stills\2026_new\ -A:\1 Amazon_Active_Projects\260706_Leader_Turbotote\Blends\stills\ -A:\1 Amazon_Active_Projects\260512_Agile_Gemba\Blends\animations\ -A:\1 Amazon_Active_Projects\260622_Stow_and_Go\Blends\animations\ -N:\1. CHARACTERS\remapping\ -A:\1 Amazon_Active_Projects\260622_Stow_and_Go\Assets\Blends\ F:\renders\ -A:\1 Amazon_Active_Projects\260512_Agile_Gemba\Deliverable\Stills\ -A:\1 Amazon_Active_Projects\260512_Agile_Gemba\Blends\stills\ +C:\Users\Nathan\Downloads\ +A:\1 Amazon_Active_Projects\260706_Leader_Turbotote\Deliverable\Stills\ +A:\1 Amazon_Active_Projects\260706_Leader_Turbotote\Blends\stills\ +A:\1 Amazon_Active_Projects\260127_Pick-and-Stage_2026_edits\Deliverable\Scan Aware\ +A:\1 Amazon_Active_Projects\260127_Pick-and-Stage_2026_edits\Blends\stills\Scan Aware\ +A:\1 Amazon_Active_Projects\1 BlenderAssets\ +A:\1 Amazon_Active_Projects\260127_Pick-and-Stage_2026_edits\Blends\stills\BD2\ +A:\1 Amazon_Active_Projects\260127_Pick-and-Stage_2026_edits\Blends\stills\2026_new\ +A:\1 Amazon_Active_Projects\260512_Agile_Gemba\Blends\animations\ diff --git a/config/flamenco-manager-info.json b/config/flamenco-manager-info.json index d607f1c..121b3a3 100644 --- a/config/flamenco-manager-info.json +++ b/config/flamenco-manager-info.json @@ -1,9 +1,9 @@ { "flamenco_version": { - "version": "3.10-alpha0 (b5e531ae)", + "version": "3.10-alpha0 (340bb57b)", "shortversion": "3.10-alpha0", "name": "Flamenco", - "git": "b5e531ae" + "git": "340bb57b" }, "shared_storage": { "location": "F:\\jobs", diff --git a/config/platform_support.txt b/config/platform_support.txt index 6aaea12..932190a 100644 --- a/config/platform_support.txt +++ b/config/platform_support.txt @@ -19,3 +19,4 @@ {Intel/Intel(R) HD Graphics 630/4.6.0 - Build 27.20.100.9664}=SUPPORTED {NVIDIA Corporation/NVIDIA GeForce RTX 4080 SUPER/NVIDIA 596.36}=SUPPORTED {NVIDIA Corporation/NVIDIA GeForce RTX 4080 SUPER/NVIDIA 610.47}=SUPPORTED +{NVIDIA Corporation/NVIDIA GeForce RTX 4080 SUPER/NVIDIA 610.62}=SUPPORTED diff --git a/config/recent-files.txt b/config/recent-files.txt index 63a82eb..af329b3 100644 --- a/config/recent-files.txt +++ b/config/recent-files.txt @@ -1,6 +1,18 @@ +C:\Users\Nathan\Downloads\test.blend +A:\1 Amazon_Active_Projects\260709_Optimal_ADTA_stow\Blends\animations\OptimalStow_animation 2.blend +F:\jobs\OptimalStow_animation 2-1bxe\_outside_project\A\1 Amazon_Active_Projects\1 BlenderAssets\Amazon\Char\Cartoon1\Hailey_v4.4.blend +A:\1 Amazon_Active_Projects\260706_Leader_Turbotote\Blends\stills\iTurboTote_Leader_13b.blend +A:\1 Amazon_Active_Projects\260706_Leader_Turbotote\Blends\stills\iTurboTote_Leader_13a.blend +A:\1 Amazon_Active_Projects\260706_Leader_Turbotote\Blends\stills\iTurboTote_Leader_12b.blend +A:\1 Amazon_Active_Projects\260706_Leader_Turbotote\Blends\stills\iTurboTote_Leader_12a.blend +A:\1 Amazon_Active_Projects\260706_Leader_Turbotote\Blends\stills\iTurboTote_Leader_7.blend +A:\1 Amazon_Active_Projects\260706_Leader_Turbotote\Blends\stills\iTurboTote_Reuse_8_v2.blend +A:\1 Amazon_Active_Projects\260127_Pick-and-Stage_2026_edits\Blends\stills\Scan Aware\iP&S_scan aware_6.blend +A:\1 Amazon_Active_Projects\260127_Pick-and-Stage_2026_edits\Blends\stills\Scan Aware\iP&S_scan aware_5.blend +A:\1 Amazon_Active_Projects\260127_Pick-and-Stage_2026_edits\Blends\stills\BD2\iP&S_BD2_24.blend +A:\1 Amazon_Active_Projects\260127_Pick-and-Stage_2026_edits\Blends\stills\2026_new\iP&S_2026_4n.blend A:\1 Amazon_Active_Projects\260127_Pick-and-Stage_2026_edits\Blends\stills\2026_new\iP&S_2026_4p.blend A:\1 Amazon_Active_Projects\260127_Pick-and-Stage_2026_edits\Blends\stills\2026_new\iP&S_2026_4a-b.blend -A:\1 Amazon_Active_Projects\260706_Leader_Turbotote\Blends\stills\iTurboTote_Reuse_8_v2.blend A:\1 Amazon_Active_Projects\260512_Agile_Gemba\Blends\animations\gembawalk_horizontal_animation_2A_ins3.blend A:\1 Amazon_Active_Projects\260512_Agile_Gemba\Blends\animations\gembawalk_horizontal_animation_2A_ins0.blend A:\1 Amazon_Active_Projects\260512_Agile_Gemba\Blends\animations\gembawalk_horizontal_animation_2A.blend @@ -186,15 +198,3 @@ A:\1 Amazon_Active_Projects\260422_Upstream_edits_2026\Blends\stills\iUP_M5_6.bl A:\1 Amazon_Active_Projects\260422_Upstream_edits_2026\Blends\stills\iUP_M2_5.blend A:\1 Amazon_Active_Projects\260422_Upstream_edits_2026\Blends\stills\iUP_M5_13.blend P:\250827_FestivalTurf\Blends\animations\06 Infill And Powerbrooming\comp_RR\Visual 2B_SPA_comp_RR.blend -P:\250827_FestivalTurf\Blends\animations\06 Infill And Powerbrooming\Visual 2B_SPA.blend -C:\Users\Nathan\Downloads\Visual 2B_SPA\Visual 2B_SPA.blend -F:\jobs\Visual 2B_SPA-393g\Visual 2B_SPA.blend -F:\jobs\Visual_5_SPA-ii75\Visual_5_SPA.blend -P:\250827_FestivalTurf\Blends\animations\07 Final Touches And Maintenance\Visual_5_SPA.blend -F:\jobs\Visual_5_SPA-ki6s\Visual_5_SPA.blend -C:\Users\Nathan\Downloads\Visual_5_SPA.blend -C:\Users\Nathan\Downloads\Visual_5_SPA_106-109.blend -P:\250827_FestivalTurf\Blends\animations\07 Final Touches And Maintenance\Visual_2_broom_SPA.blend -C:\Users\Nathan\Downloads\Visual_new_final_SPA\Visual_new_final_SPA.blend -P:\250827_FestivalTurf\Blends\animations\07 Final Touches And Maintenance\Visual_new_final_SPA.blend -C:\Users\Nathan\Downloads\Visual_new_final\Visual_new_final.blend diff --git a/config/recent-searches.txt b/config/recent-searches.txt index f3940d2..a978e82 100644 Binary files a/config/recent-searches.txt and b/config/recent-searches.txt differ diff --git a/config/userpref.blend b/config/userpref.blend index 2f95107..a272992 100644 --- a/config/userpref.blend +++ b/config/userpref.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f40810d37da2d186dd090534f2fa4e4e41e86ccc1b7ea39eab0fe3ab51aa5e48 -size 286635 +oid sha256:8bfd52b3ce7c61528840229918e8bf3cea73593efc56848bcac6c6a6d213bc5a +size 289063 diff --git a/extensions/blender_org/.blender_ext/index.json b/extensions/blender_org/.blender_ext/index.json index a4fa556..d799bee 100644 --- a/extensions/blender_org/.blender_ext/index.json +++ b/extensions/blender_org/.blender_ext/index.json @@ -1 +1 @@ -{"blocklist":[],"data":[{"id":"yl_vertexcolforge","schema_version":"1.0.0","name":"YL VertexColForge","version":"1.1.0","tagline":"Vertex Color editing, previewing, and packing tools","archive_hash":"sha256:b849108f9b59adf409cd442fe9106d0ce954eb42baa3736c579e84ee674e0c77","archive_size":279759,"archive_url":"https://extensions.blender.org/download/sha256:b849108f9b59adf409cd442fe9106d0ce954eb42baa3736c579e84ee674e0c77/add-on-yl-vertexcolforge-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/yl-vertexcolforge/","maintainer":"YLIANG","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Paint"]},{"id":"clothdrop_reborn","schema_version":"1.0.0","name":"ClothDrop Reborn","version":"2.0.2","tagline":"Single-click cloth simulation tool","archive_hash":"sha256:7afef92f52f918d5491daff3d2dbd1cde009cd3e05402b01ab912c9b33fc9526","archive_size":8784,"archive_url":"https://extensions.blender.org/download/sha256:7afef92f52f918d5491daff3d2dbd1cde009cd3e05402b01ab912c9b33fc9526/add-on-clothdrop-reborn-v2.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/clothdrop-reborn/","maintainer":"Hartface","license":["SPDX:GPL-3.0-or-later"],"tags":["Physics"]},{"id":"nodemap","schema_version":"1.0.0","name":"Nodemap","version":"1.1.1","tagline":"Minimap overlay for the Node Editor","archive_hash":"sha256:2266502c18adaa204f8c57c255485d25b1cbe2693f5e70ce6d2a1ef5909a613f","archive_size":28894,"archive_url":"https://extensions.blender.org/download/sha256:2266502c18adaa204f8c57c255485d25b1cbe2693f5e70ce6d2a1ef5909a613f/add-on-nodemap-v1.1.1.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/nodemap/","maintainer":"n4dirp","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","User Interface"]},{"id":"rolllux","schema_version":"1.0.0","name":"RollLux","version":"5.5.5","tagline":"Perceptive Full-Auto Metering Lighting","archive_hash":"sha256:e191e2481666f740ce99354b3753e350a7e823f301db3416c5b9ba359ea8fb5d","archive_size":1503359,"archive_url":"https://extensions.blender.org/download/sha256:e191e2481666f740ce99354b3753e350a7e823f301db3416c5b9ba359ea8fb5d/add-on-rolllux-v5.5.5.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/rolllux/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later","SPDX:CC0-1.0"],"permissions":{"files":"Load reference lighting images from disk via the file picker"},"tags":["Lighting","Render"]},{"id":"stepper_reborn","schema_version":"1.0.0","name":"STEPper Reborn","version":"2.1.0","tagline":"CAD importer","archive_hash":"sha256:e7cf749736ebb3d2f047654bbfa8dd0a3e0aff148df4f6aa7c426d312255d59d","archive_size":46350154,"archive_url":"https://extensions.blender.org/download/sha256:e7cf749736ebb3d2f047654bbfa8dd0a3e0aff148df4f6aa7c426d312255d59d/add-on-stepper-reborn-v2.1.0-windows-x64.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/stepper-reborn/","maintainer":"RomainGuimbal","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import STEP files"},"platforms":["windows-x64"],"tags":["Import-Export"]},{"id":"br3f","schema_version":"1.0.0","name":"R3F JSX/TSX Exporter","version":"0.1.1","tagline":"Export GLB + React Three Fiber JSX/TSX component in one click","archive_hash":"sha256:48480e1bb3c2417f53092e391ede6bb0d208a51b09f4993996826042eeaf8e19","archive_size":19149,"archive_url":"https://extensions.blender.org/download/sha256:48480e1bb3c2417f53092e391ede6bb0d208a51b09f4993996826042eeaf8e19/add-on-br3f-v0.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/br3f/","maintainer":"Tom-Heeley","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Write the .glb and generated component to your project folders"},"tags":["Import-Export","Pipeline"]},{"id":"bas_relief","schema_version":"1.0.0","name":"Bas Relief","version":"1.1.0","tagline":"Create Bas Relief from images in Blender","archive_hash":"sha256:014fbc08414647cda8c79861d14a09a84359bee1f66e66c1e2121dfdc96698ee","archive_size":535796,"archive_url":"https://extensions.blender.org/download/sha256:014fbc08414647cda8c79861d14a09a84359bee1f66e66c1e2121dfdc96698ee/add-on-bas-relief-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bas-relief/","maintainer":"guillaume_bissieres","license":["SPDX:GPL-3.0-or-later"],"tags":["Compositing","Material"]},{"id":"step_importer","schema_version":"1.0.0","name":"STEP Importer","version":"1.1.0","tagline":"Import STEP files directly into Blender, no 3rd party needed","archive_hash":"sha256:2ef66db84806053bfae615cf71c163227cfd94e2e77532a36de44be48deb2b9e","archive_size":16226019,"archive_url":"https://extensions.blender.org/download/sha256:2ef66db84806053bfae615cf71c163227cfd94e2e77532a36de44be48deb2b9e/add-on-step-importer-v1.1.0-windows-x64.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/step-importer/","maintainer":"Clonephaze","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Import-Export"]},{"id":"Coffee_Theme","schema_version":"1.0.0","name":"Coffee_Theme","version":"1.0.0","tagline":"No fish inside I swear","archive_hash":"sha256:51bd918707723228bae23922611137998221f76e5467b85d7f0b091f5be7a0de","archive_size":6515,"archive_url":"https://extensions.blender.org/download/sha256:51bd918707723228bae23922611137998221f76e5467b85d7f0b091f5be7a0de/theme-coffee-theme-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/coffee-theme/","maintainer":"Leo-Mb","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"sculpt_stroke_replay","schema_version":"1.0.0","name":"Sculpt Stroke Replay","version":"0.1.6","tagline":"Replay the last sculpt stroke with adjustable strength","archive_hash":"sha256:1957be55fa391269b98bc583a6271e4f17fbc1836f484b50e62fea2319b90b0b","archive_size":3308,"archive_url":"https://extensions.blender.org/download/sha256:1957be55fa391269b98bc583a6271e4f17fbc1836f484b50e62fea2319b90b0b/add-on-sculpt-stroke-replay-v0.1.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sculpt-stroke-replay/","maintainer":"a.a.andrusenko","license":["SPDX:GPL-3.0-or-later"]},{"id":"easy_arrangement","schema_version":"1.0.0","name":"Easy Arrangement","version":"0.2.2","tagline":"Arrange objects linearly, stair-like or in circular patterns","archive_hash":"sha256:e576a758a39b09dbc2e613d2494dd58058b0325b20f5e3cbf76e21772cdc80b8","archive_size":8687,"archive_url":"https://extensions.blender.org/download/sha256:e576a758a39b09dbc2e613d2494dd58058b0325b20f5e3cbf76e21772cdc80b8/add-on-easy-arrangement-v0.2.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/easy-arrangement/","maintainer":"mlico","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"image_editor_tools","schema_version":"1.0.0","name":"Image Editor Master [图像超级工具]","version":"0.3.8","tagline":"Super Image Toolbox (color, filters, texture optimization)","archive_hash":"sha256:8bd34ced888ecad71e1f764b3cdc491fed085bcadec8fb8d1a1887ee302d5de6","archive_size":167013,"archive_url":"https://extensions.blender.org/download/sha256:8bd34ced888ecad71e1f764b3cdc491fed085bcadec8fb8d1a1887ee302d5de6/add-on-image-editor-tools-v0.3.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/image-editor-tools/","maintainer":"RARA","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read image from disk","clipboard":"Copy image from clipboard"},"tags":["Paint","Compositing"]},{"id":"BAM_Decalit","schema_version":"1.0.0","name":"[BAM] Decalit","version":"1.1.0","tagline":"Fast mesh decal placement with normal snapping and Custom UI/UX","archive_hash":"sha256:1d31f99fa67bdc56dc778fed8feecffd0a906c980bb699055048e11a7fdb440f","archive_size":2949493,"archive_url":"https://extensions.blender.org/download/sha256:1d31f99fa67bdc56dc778fed8feecffd0a906c980bb699055048e11a7fdb440f/add-on-bam-decalit-v1.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/bam-decalit/","maintainer":"AlexeyHRDesign","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save and load decal presets and generated preview images"},"tags":["Material"]},{"id":"fill_mesh","schema_version":"1.0.0","name":"Fill Mesh","version":"1.0.8","tagline":"An add-on to fix and fill holes on your meshes","archive_hash":"sha256:c5c630878528a38f6870459e7cb9b630105e14636e4137bed328d53ca16f729c","archive_size":7544,"archive_url":"https://extensions.blender.org/download/sha256:c5c630878528a38f6870459e7cb9b630105e14636e4137bed328d53ca16f729c/add-on-fill-mesh-v1.0.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/fill-mesh/","maintainer":"guillaume_bissieres","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"editmode_dimensions","schema_version":"1.0.0","name":"Dimensions in Edit Mode","version":"1.0.1","tagline":"Live display and editing of selected geometry' dimensions","archive_hash":"sha256:acac5c3fbca92c18a8718a499f881814b3d13b73c0d815e63196b8d21f7265dd","archive_size":1776,"archive_url":"https://extensions.blender.org/download/sha256:acac5c3fbca92c18a8718a499f881814b3d13b73c0d815e63196b8d21f7265dd/add-on-editmode-dimensions-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/editmode-dimensions/","maintainer":"Matikos","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh"]},{"id":"camera_grid","schema_version":"1.0.0","name":"Camera Grid","version":"1.2.0","tagline":"Viewport camera grid overlay for quick camera switching","archive_hash":"sha256:f401ec200d3619d82c0445d00ded2da17c5cf0ee24404002605d89dadc0d865b","archive_size":23571,"archive_url":"https://extensions.blender.org/download/sha256:f401ec200d3619d82c0445d00ded2da17c5cf0ee24404002605d89dadc0d865b/add-on-camera-grid-v1.2.0.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/camera-grid/","maintainer":"n4dirp","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","User Interface"]},{"id":"object_lay_flat","schema_version":"1.0.0","name":"Lay Flat","version":"1.0.0","tagline":"Lays an object flat on the XY plane based on the selected face","archive_hash":"sha256:21c85c39e657827bcaf64637e8637cbd541ee8fabf27e8a85f6f2a29a014b43e","archive_size":3106,"archive_url":"https://extensions.blender.org/download/sha256:21c85c39e657827bcaf64637e8637cbd541ee8fabf27e8a85f6f2a29a014b43e/add-on-object-lay-flat-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/object-lay-flat/","maintainer":"Pavel-Karoukin","license":["SPDX:GPL-3.0-or-later"]},{"id":"yl_meshcheckhud","schema_version":"1.0.0","name":"YL MeshCheckHUD","version":"1.1.0","tagline":"Mesh check, heatmap, and live HUD tools for Blender","archive_hash":"sha256:c83ea1cd532a11e12590ae02318a827352e2d55757ae394c16875a2a3fddcbdc","archive_size":137730,"archive_url":"https://extensions.blender.org/download/sha256:c83ea1cd532a11e12590ae02318a827352e2d55757ae394c16875a2a3fddcbdc/add-on-yl-meshcheckhud-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.3.0","website":"https://extensions.blender.org/add-ons/yl-meshcheckhud/","maintainer":"YLIANG","license":["SPDX:GPL-3.0-or-later"]},{"id":"cream_soda","schema_version":"1.0.0","name":"Cream Soda","version":"1.0.0","tagline":"A cream soda from Lawson","archive_hash":"sha256:989edfb1c8f02e525cdf673e8a3707e5ad9d65a86e9d879e11dca32b56bfea5c","archive_size":5011,"archive_url":"https://extensions.blender.org/download/sha256:989edfb1c8f02e525cdf673e8a3707e5ad9d65a86e9d879e11dca32b56bfea5c/theme-cream-soda-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/cream-soda/","maintainer":"spoiledmilk","license":["SPDX:GPL-2.0-or-later"],"tags":["Light","Inspired By"]},{"id":"wiggle_bones","schema_version":"1.0.0","name":"Wiggle Bones","version":"1.0.2","tagline":"Refactor of Wiggle 2, fully fixed for Blender 5.0","archive_hash":"sha256:6c5083b4a5dc69d365f35930f836a80ff8d02dcdfd90ae6fb653b837766fa920","archive_size":26857,"archive_url":"https://extensions.blender.org/download/sha256:6c5083b4a5dc69d365f35930f836a80ff8d02dcdfd90ae6fb653b837766fa920/add-on-wiggle-bones-v1.0.2.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/wiggle-bones/","maintainer":"Hans_Xwh","license":["SPDX:GPL-3.0-or-later"],"tags":["Physics"]},{"id":"import_psd_as_mesh_planes","schema_version":"1.0.0","name":"Import .PSD as Mesh Planes","version":"1.0.2","tagline":"Allows importing of .PSD files into mesh planes","archive_hash":"sha256:29ba9265eb0eb0957ab868f6766a857559a2cbc298361f3d80b21f3130ab8e68","archive_size":4914,"archive_url":"https://extensions.blender.org/download/sha256:29ba9265eb0eb0957ab868f6766a857559a2cbc298361f3d80b21f3130ab8e68/add-on-import-psd-as-mesh-planes-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/import-psd-as-mesh-planes/","maintainer":"byebyeLAN","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Mesh"]},{"id":"AdvancedAlignView","schema_version":"1.0.0","name":"Advanced Align View","version":"0.1.3","tagline":"Align 3D View to selected geometries for precise modeling","archive_hash":"sha256:cf28e02b52faace5d50f5303440c2671d4659f62fba33c1fa7d6feb729c9643d","archive_size":37803,"archive_url":"https://extensions.blender.org/download/sha256:cf28e02b52faace5d50f5303440c2671d4659f62fba33c1fa7d6feb729c9643d/add-on-advancedalignview-v0.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/advancedalignview/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","3D View"]},{"id":"Flash_Light","schema_version":"1.0.0","name":"Flash Light","version":"1.0.1","tagline":"Light theme inspired by Macromedia Flash 8","archive_hash":"sha256:ead726b325361b49c1a379986f251cc8ee68ecd740f8eca65fcca4ef201af3b2","archive_size":5683,"archive_url":"https://extensions.blender.org/download/sha256:ead726b325361b49c1a379986f251cc8ee68ecd740f8eca65fcca4ef201af3b2/theme-flash-light-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/flash-light/","maintainer":"Spikysaurus","license":["SPDX:GPL-2.0-or-later"],"tags":["Light"]},{"id":"Retro3DSMAX","schema_version":"1.0.0","name":"3DSMAX 1996","version":"1.0.0","tagline":"Classic theme inspired by 3D Studio Max 2.5","archive_hash":"sha256:cba1539ab749888c06a6dd7bef361958cdce7ed9e6486b6e3d217ca276bb5247","archive_size":4832,"archive_url":"https://extensions.blender.org/download/sha256:cba1539ab749888c06a6dd7bef361958cdce7ed9e6486b6e3d217ca276bb5247/theme-retro3dsmax-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/retro3dsmax/","maintainer":"Philautia","license":["SPDX:GPL-3.0-or-later"],"tags":["Inspired By","Light"]},{"id":"struct_topo_opt","schema_version":"1.0.0","name":"Structural Topology Optimization","version":"0.4.3","tagline":"SIMP+OC structural topology optimization in the viewport","archive_hash":"sha256:0258ae4ac60e1a851ad1ec5339ae3b2e4a194ce76da6b8b696b02bd2ba7ef33b","archive_size":80648578,"archive_url":"https://extensions.blender.org/download/sha256:0258ae4ac60e1a851ad1ec5339ae3b2e4a194ce76da6b8b696b02bd2ba7ef33b/add-on-struct-topo-opt-v0.4.3-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/struct-topo-opt/","maintainer":"Emrgn.arch","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Mesh","Physics"]},{"id":"quick_sidebar_switcher","schema_version":"1.0.0","name":"Quick Sidebar Switcher","version":"1.4.0","tagline":"Quickly switch between Side Panel tabs with a popup menu","archive_hash":"sha256:570682c3063e0bdaa71c08d59d0560f7d2dcd9131d7122cf07eada14d0e0ec2b","archive_size":9941,"archive_url":"https://extensions.blender.org/download/sha256:570682c3063e0bdaa71c08d59d0560f7d2dcd9131d7122cf07eada14d0e0ec2b/add-on-quick-sidebar-switcher-v1.4.0.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/quick-sidebar-switcher/","maintainer":"hyeffect55","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"timeline_audio_visualizer","schema_version":"1.0.0","name":"Timeline Audio Visualizer","version":"0.2.5","tagline":"Visualize audio waveforms inside Blender animation timelines","archive_hash":"sha256:758269dcc0bdd2fb0ada3ffbb32cfda7603e8592c77269a83aaab1c1998c4380","archive_size":22383,"archive_url":"https://extensions.blender.org/download/sha256:758269dcc0bdd2fb0ada3ffbb32cfda7603e8592c77269a83aaab1c1998c4380/add-on-timeline-audio-visualizer-v0.2.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/timeline-audio-visualizer/","maintainer":"qsOwOsp","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read audio files for waveform generation"},"tags":["Animation","Sequencer"]},{"id":"mmgpy","schema_version":"1.0.0","name":"MMGpy - Mesh Remeshing","version":"0.16.2","tagline":"Adaptive surface remeshing via the MMG library","archive_hash":"sha256:da18b422985da4ddc2086ec9bd695d8ad8150edf5222f3c9bbae3a11a79cda66","archive_size":9515641,"archive_url":"https://extensions.blender.org/download/sha256:da18b422985da4ddc2086ec9bd695d8ad8150edf5222f3c9bbae3a11a79cda66/add-on-mmgpy-v0.16.2-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mmgpy/","maintainer":"kmarchais","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Mesh","Modeling"]},{"id":"Multi_Files_Bookmark","schema_version":"1.0.0","name":"Multi Files Bookmark","version":"0.7.1","tagline":"Manage your projects as bookmarks in one Blender window","archive_hash":"sha256:1b9ef9c49159de40e897bd0907d8dfd95d09f1ad422dc926611e02ad37d86deb","archive_size":49098,"archive_url":"https://extensions.blender.org/download/sha256:1b9ef9c49159de40e897bd0907d8dfd95d09f1ad422dc926611e02ad37d86deb/add-on-multi-files-bookmark-v0.7.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/multi-files-bookmark/","maintainer":"61+","license":["SPDX:GPL-3.0-or-later"],"tags":["Pipeline"]},{"id":"Star_Citizen","schema_version":"1.0.0","name":"STAR CITIZEN","version":"1.0.0","tagline":"A Star Citizen theme for Blender","archive_hash":"sha256:730b5dff1e0da25b0442e8eca33e50bdeb610e673c9fc66047312b1e67de3773","archive_size":5820,"archive_url":"https://extensions.blender.org/download/sha256:730b5dff1e0da25b0442e8eca33e50bdeb610e673c9fc66047312b1e67de3773/theme-star-citizen-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/star-citizen/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"dynamic_parent","schema_version":"1.0.0","name":"Dynamic Parent","version":"2.1.0","tagline":"Allows to create and disable an animated ChildOf constraint","archive_hash":"sha256:20d9580c52af76bb5449eb01c6a6f91bd6a406a34c2c7a54c9b967267aaa1d9a","archive_size":5922,"archive_url":"https://extensions.blender.org/download/sha256:20d9580c52af76bb5449eb01c6a6f91bd6a406a34c2c7a54c9b967267aaa1d9a/add-on-dynamic-parent-v2.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/dynamic-parent/","maintainer":"RomanVolodin","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Rigging"]},{"id":"plague_inc_theme","schema_version":"1.0.0","name":"Plague Inc. Theme","version":"1.0.0","tagline":"Very red theme","archive_hash":"sha256:0772cf9646fb30d361e26a907a5321ab0d672b7944ce1f44a033d4b6ef43af35","archive_size":5933,"archive_url":"https://extensions.blender.org/download/sha256:0772cf9646fb30d361e26a907a5321ab0d672b7944ce1f44a033d4b6ef43af35/theme-plague-inc-theme-v1.0.0.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/plague-inc-theme/","maintainer":"Bebo","license":["SPDX:GPL-3.0-or-later"]},{"id":"quickpath_rknz","schema_version":"1.0.0","name":"QuickPath RKNZ","version":"2.2.0","tagline":"Quick motion path visualization for bones and objects","archive_hash":"sha256:abc7264e245313dbea1ecb6164d9bdf359c88bce798df5bc875dc92176fdf421","archive_size":44466,"archive_url":"https://extensions.blender.org/download/sha256:abc7264e245313dbea1ecb6164d9bdf359c88bce798df5bc875dc92176fdf421/add-on-quickpath-rknz-v2.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quickpath-rknz/","maintainer":"Rikokenz","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"photo360_lab","schema_version":"1.0.0","name":"360 PhotoLab","version":"0.37.0","tagline":"Reframe equirectangular 360 photos with RET CIL and CLV previews","archive_hash":"sha256:eafa1747533049218ccbb291caed3ba4df5d39c8dcbccc039cee104647d65952","archive_size":19055,"archive_url":"https://extensions.blender.org/download/sha256:eafa1747533049218ccbb291caed3ba4df5d39c8dcbccc039cee104647d65952/add-on-photo360-lab-v0.37.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/photo360-lab/","maintainer":"Mattia-Fiorini","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load local 360 images and LUT files and export images"},"tags":["Camera","Import-Export"]},{"id":"snapline","schema_version":"1.0.0","name":"Snapline","version":"2.0.0","tagline":"Snap and align your object faster than before","archive_hash":"sha256:2ffa56a35d0015ce5e78e4bc999740748095e9900fa10a48cb91d67248c03f1e","archive_size":16569,"archive_url":"https://extensions.blender.org/download/sha256:2ffa56a35d0015ce5e78e4bc999740748095e9900fa10a48cb91d67248c03f1e/add-on-snapline-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/snapline/","maintainer":"Berun","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Object"]},{"id":"color_helper","schema_version":"1.0.0","name":"Color Helper","version":"0.8.0","tagline":"Palette and color workflow tools","archive_hash":"sha256:f1cae8296649f897b99a1dd916f045b71cd182988d1ae24f0836d38724268eb2","archive_size":64595,"archive_url":"https://extensions.blender.org/download/sha256:f1cae8296649f897b99a1dd916f045b71cd182988d1ae24f0836d38724268eb2/add-on-color-helper-v0.8.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/color-helper/","maintainer":"atticuslv","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import and export palette images and assets","clipboard":"Read image and color values from the clipboard"},"tags":["Material","Node","Paint"]},{"id":"wiggle_2","schema_version":"1.0.0","name":"Wiggle 2: RTX Edition","version":"2.2.5","tagline":" Instant Procedural Bone Physics for Any Rig","archive_hash":"sha256:ed9fcc0bea3d9ef692409c785862c4256992f6ed2a771afbaeae8a55eb807d00","archive_size":45584,"archive_url":"https://extensions.blender.org/download/sha256:ed9fcc0bea3d9ef692409c785862c4256992f6ed2a771afbaeae8a55eb807d00/add-on-wiggle-2-v2.2.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/wiggle-2/","maintainer":"Chamiseul","license":["SPDX:GPL-3.0-or-later"]},{"id":"loopkut","schema_version":"1.0.0","name":"Loopkut","version":"1.3.3","tagline":"Preview inserted loop cuts at mouse position","archive_hash":"sha256:c2f64f526a9785ace0e9a565dae156f01b78e3c1d89241b36b6da0c361eb0606","archive_size":104576,"archive_url":"https://extensions.blender.org/download/sha256:c2f64f526a9785ace0e9a565dae156f01b78e3c1d89241b36b6da0c361eb0606/add-on-loopkut-v1.3.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/loopkut/","maintainer":"KewlSheet","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"symtrz","schema_version":"1.0.0","name":"SymTrz","version":"2.2.4","tagline":"Mirror And Symmetrize tools for 3D View","archive_hash":"sha256:565cac6a2300773bf7221881c913ea85e0fe3a8f3bc8483d34d75bb08f81074e","archive_size":14031,"archive_url":"https://extensions.blender.org/download/sha256:565cac6a2300773bf7221881c913ea85e0fe3a8f3bc8483d34d75bb08f81074e/add-on-symtrz-v2.2.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/symtrz/","maintainer":"Berun","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Object"]},{"id":"batch_import_images_to_brushes","schema_version":"1.0.0","name":"Batch Import Images to Brushes","version":"1.0.1","tagline":"Import images as texture paint and sculpt brushes","archive_hash":"sha256:4be87504869ed8883f990ee8d2f58e31c99440ecfb293bb6df5b32d6799d2ec5","archive_size":4117,"archive_url":"https://extensions.blender.org/download/sha256:4be87504869ed8883f990ee8d2f58e31c99440ecfb293bb6df5b32d6799d2ec5/add-on-batch-import-images-to-brushes-v1.0.1.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/batch-import-images-to-brushes/","maintainer":"Raja-Muda","license":["SPDX:GPL-3.0-or-later"]},{"id":"fst_forgepolish","schema_version":"1.0.0","name":"FST ForgePolish","version":"1.1.0","tagline":"Hard surface polishing with optional volume preservation","archive_hash":"sha256:dedd1098e9cc624cc0ac4ca72f91ae8a8e0798436d2784604d4194de668678cc","archive_size":57291,"archive_url":"https://extensions.blender.org/download/sha256:dedd1098e9cc624cc0ac4ca72f91ae8a8e0798436d2784604d4194de668678cc/add-on-fst-forgepolish-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/fst-forgepolish/","maintainer":"YLIANG","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"io_directx_x","schema_version":"1.0.0","name":"DirectX X Format (.x)","version":"1.3.1","tagline":"Import/Export DirectX .x","archive_hash":"sha256:e8e2d450c9c807c6ee104c5442ae0ef50bb88a8ee23f05acca4acd095a93c256","archive_size":116022,"archive_url":"https://extensions.blender.org/download/sha256:e8e2d450c9c807c6ee104c5442ae0ef50bb88a8ee23f05acca4acd095a93c256/add-on-io-directx-x-v1.3.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-directx-x/","maintainer":"SaintBaron","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"omni_outset","schema_version":"1.0.0","name":"OmniOutset","version":"1.1.1","tagline":"Smart Face and Equidistant Edge Extrude","archive_hash":"sha256:1fde945aa66c913d9be4fecc614fb702e5c6856b4a87e629ca1d3a0f35d152e3","archive_size":9761,"archive_url":"https://extensions.blender.org/download/sha256:1fde945aa66c913d9be4fecc614fb702e5c6856b4a87e629ca1d3a0f35d152e3/add-on-omni-outset-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/omni-outset/","maintainer":"Alx_11","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling"]},{"id":"damped_track_chain","schema_version":"1.0.0","name":"Damped Track Chain","version":"1.0.2","tagline":"为骨骼链一键生成阻尼追踪约束/One-click bone chain constraints","archive_hash":"sha256:70af09ebe58cca42406322bec092d5f9dfa857436b0518ad5e071a43a7155aa0","archive_size":6101,"archive_url":"https://extensions.blender.org/download/sha256:70af09ebe58cca42406322bec092d5f9dfa857436b0518ad5e071a43a7155aa0/add-on-damped-track-chain-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/damped-track-chain/","maintainer":"shengmingu","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"blender_speed_curve","schema_version":"1.0.0","name":"Motion Style","version":"1.0.2","tagline":"AE-style easing sliders and F-Curve speed visualization","archive_hash":"sha256:4ae9d54a4e0f98159c979fba471646406574baa2b0809eef4db3e45d799d8d61","archive_size":6406,"archive_url":"https://extensions.blender.org/download/sha256:4ae9d54a4e0f98159c979fba471646406574baa2b0809eef4db3e45d799d8d61/add-on-blender-speed-curve-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blender-speed-curve/","maintainer":"Willy_Work","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"keymap_visualizer","schema_version":"1.0.0","name":"Keymap Visualizer","version":"1.0.1","tagline":"Visual keyboard-based keymap editor","archive_hash":"sha256:9276b55426937631b387d7bd2851d38eca184bbe68cdefb97ca08ccb4779c047","archive_size":202498,"archive_url":"https://extensions.blender.org/download/sha256:9276b55426937631b387d7bd2851d38eca184bbe68cdefb97ca08ccb4779c047/add-on-keymap-visualizer-v1.0.1.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/keymap-visualizer/","maintainer":"devanshutak25","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export keymap configurations and save/load presets to disk","clipboard":"Copy and paste keymap presets as JSON via the system clipboard"},"tags":["User Interface","System"]},{"id":"Evergreen_Theme","schema_version":"1.0.0","name":"Evergreen_Theme","version":"1.0.4","tagline":"Nature Verdure","archive_hash":"sha256:fae42614d487ff135222a3e937ca8f288a12bbfb0b1ef73eb884ee777245a51f","archive_size":5920,"archive_url":"https://extensions.blender.org/download/sha256:fae42614d487ff135222a3e937ca8f288a12bbfb0b1ef73eb884ee777245a51f/theme-evergreen-theme-v1.0.4.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/evergreen-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"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":"pataz_auto_hide_overlays","schema_version":"1.0.0","name":"Pataz Auto Hide Overlays","version":"5.2.4","tagline":"Hides overlays during transform or playback","archive_hash":"sha256:08259ebf900d77725d07cadffa57f0191fca637043e2196ac57d97292c7e1032","archive_size":5410,"archive_url":"https://extensions.blender.org/download/sha256:08259ebf900d77725d07cadffa57f0191fca637043e2196ac57d97292c7e1032/add-on-pataz-auto-hide-overlays-v5.2.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pataz-auto-hide-overlays/","maintainer":"zanqdo","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"chunk_render","schema_version":"1.0.0","name":"Chunk Render","version":"1.1.6","tagline":"Tile-based rendering for render regions","archive_hash":"sha256:4f26cec46d8ac35687cee4d53a47db19a627d0134a962b2a20a879d32168d7c8","archive_size":40484,"archive_url":"https://extensions.blender.org/download/sha256:4f26cec46d8ac35687cee4d53a47db19a627d0134a962b2a20a879d32168d7c8/add-on-chunk-render-v1.1.6.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/chunk-render/","maintainer":"Shuimeng","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write tile images and temp files for tile merging"},"tags":["Render"]},{"id":"maze_generator_pro","schema_version":"1.0.0","name":"Maze Generator Pro","version":"1.0.9","tagline":"3D maze generator with presets, themes and physics","archive_hash":"sha256:5c793ce964b312ccbeb3f87f8adba62c31367b95756240b47ee95ddf848a020c","archive_size":34426,"archive_url":"https://extensions.blender.org/download/sha256:5c793ce964b312ccbeb3f87f8adba62c31367b95756240b47ee95ddf848a020c/add-on-maze-generator-pro-v1.0.9.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":"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":"bezier_curve_editor","schema_version":"1.0.0","name":"Bezier Curve Editor","version":"1.0.8","tagline":"An editor for editing and applying easing curves","archive_hash":"sha256:ced957a2094fe056ff7e9aaec1b11699176521c9c9ec7c1ef4275160ef3a0028","archive_size":37639,"archive_url":"https://extensions.blender.org/download/sha256:ced957a2094fe056ff7e9aaec1b11699176521c9c9ec7c1ef4275160ef3a0028/add-on-bezier-curve-editor-v1.0.8.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.1.2","tagline":"Simple Camera Match - Blender插件","archive_hash":"sha256:21f39981ac34e28c3bcb7e878658255172e9c3abead818f86d022398708507ec","archive_size":38860,"archive_url":"https://extensions.blender.org/download/sha256:21f39981ac34e28c3bcb7e878658255172e9c3abead818f86d022398708507ec/add-on-simple-camera-match-v1.1.2-windows-arm64-windows-x64-macos-arm64-macos-x64-linux-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","linux-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.4.0","tagline":"Motion editing and curve manipulation","archive_hash":"sha256:4abfd5552386521577d9ee8905c57fc8ad427621c9853119b06c639032e636a8","archive_size":134027,"archive_url":"https://extensions.blender.org/download/sha256:4abfd5552386521577d9ee8905c57fc8ad427621c9853119b06c639032e636a8/add-on-org-eridanus-emotion-v0.4.0.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"],"permissions":{"files":"Read and write bezier presets, cache and trajectory data on disk"},"tags":["Animation","Rigging"]},{"id":"pin_solver","schema_version":"1.0.0","name":"PinSolver","version":"1.1.3","tagline":"Interactive camera alignment","archive_hash":"sha256:60c1c30085bad1dd877ab0fc96b2a5245b680782b8b6cb867952402c8f8c2160","archive_size":40111495,"archive_url":"https://extensions.blender.org/download/sha256:60c1c30085bad1dd877ab0fc96b2a5245b680782b8b6cb867952402c8f8c2160/add-on-pin-solver-v1.1.3-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":"2.1.0","tagline":"Theme inspired by Max","archive_hash":"sha256:8622e798a6f585258773580b255ef10e325da07c341460f55ebafe90aab5e15b","archive_size":5373,"archive_url":"https://extensions.blender.org/download/sha256:8622e798a6f585258773580b255ef10e325da07c341460f55ebafe90aab5e15b/theme-max-v2.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/max/","maintainer":"Dabidzhi","license":["SPDX:GPL-3.0-or-later"],"tags":["Inspired By","Dark"]},{"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":"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":"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":"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":"texture_manager","schema_version":"1.0.0","name":"Texture File Path Editor","version":"2.1.0","tagline":"Manage, relink, gather and inspect all texture paths","archive_hash":"sha256:6ebbfb82a808e721775ad42f9fb79005988083a0e9ed32b89c170c1a61abf567","archive_size":14000,"archive_url":"https://extensions.blender.org/download/sha256:6ebbfb82a808e721775ad42f9fb79005988083a0e9ed32b89c170c1a61abf567/add-on-texture-manager-v2.1.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":"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.1.0","tagline":"Generate customizable 3D text from LaTeX notation","archive_hash":"sha256:29b57fc18ffb92c2761f2cd697edbd20c2ac1fac2db0d2ac8fa20c5c9f6ff651","archive_size":862848,"archive_url":"https://extensions.blender.org/download/sha256:29b57fc18ffb92c2761f2cd697edbd20c2ac1fac2db0d2ac8fa20c5c9f6ff651/add-on-latex-text-generator-v1.1.0.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":"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":"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":"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":"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":"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":"batch_texture_converter","schema_version":"1.0.0","name":"Batch Texture Converter","version":"1.1.1","tagline":"Bulk texture conversion with color space and alpha splitting","archive_hash":"sha256:20fc830262828a9fa0fc5225a0bc6b254153b1cd5ec2cd40137a20952d1d9917","archive_size":4410,"archive_url":"https://extensions.blender.org/download/sha256:20fc830262828a9fa0fc5225a0bc6b254153b1cd5ec2cd40137a20952d1d9917/add-on-batch-texture-converter-v1.1.1.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":"pseudo_rendering_farm","schema_version":"1.0.0","name":"Pseudo Rendering Farm","version":"1.1.1","tagline":"Spawns multiple background processes to render the current file","archive_hash":"sha256:27d5a2528514192c942d9f12f00ee9421df5d33f9ba4c17f4ad9287bbf8ab23f","archive_size":5695,"archive_url":"https://extensions.blender.org/download/sha256:27d5a2528514192c942d9f12f00ee9421df5d33f9ba4c17f4ad9287bbf8ab23f/add-on-pseudo-rendering-farm-v1.1.1.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":"script_launcher","schema_version":"1.0.0","name":"Script Launcher","version":"1.2.2","tagline":"Manage and run Python scripts from multiple root folders","archive_hash":"sha256:581f512031bd2eced56563ecaaee2216ff54f9a37eb06552cb99086ec02191a2","archive_size":20482,"archive_url":"https://extensions.blender.org/download/sha256:581f512031bd2eced56563ecaaee2216ff54f9a37eb06552cb99086ec02191a2/add-on-script-launcher-v1.2.2.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":"gp_select","schema_version":"1.0.0","name":"Gp Select","version":"1.8.0","tagline":"Grease Pencil,Cutout,Weight,rig,lattice,and Automation toolkit","archive_hash":"sha256:80756bd8e85836cab24a854e788d307cd0f14e2780cfe030567e5824bf80f158","archive_size":70610,"archive_url":"https://extensions.blender.org/download/sha256:80756bd8e85836cab24a854e788d307cd0f14e2780cfe030567e5824bf80f158/add-on-gp-select-v1.8.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":"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.44","tagline":"Control shape keys using a 2D Axis HUD Joystick","archive_hash":"sha256:f5fe28bb6402aa003e2fd238520d80d0ea850c34bb657b3761ef11e019838f3d","archive_size":27009,"archive_url":"https://extensions.blender.org/download/sha256:f5fe28bb6402aa003e2fd238520d80d0ea850c34bb657b3761ef11e019838f3d/add-on-shapekey-axis-control-v4.0.44.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.7","tagline":"Easy toolbox for creating meshes from Grease Pencil","archive_hash":"sha256:f3de72880766b5aaaa3c09c70670dd28b31bf320df57c1d6ded01059ae168e3d","archive_size":50399,"archive_url":"https://extensions.blender.org/download/sha256:f3de72880766b5aaaa3c09c70670dd28b31bf320df57c1d6ded01059ae168e3d/add-on-grease-mesh-v1.0.7.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":"EyeZen","schema_version":"1.0.0","name":"Eye Zen","version":"1.0.4","tagline":"A Relaxing Theme","archive_hash":"sha256:a72e10c9cab184cf57a156396e629aae3c033d9afdf9663ab78505a303a1289f","archive_size":5919,"archive_url":"https://extensions.blender.org/download/sha256:a72e10c9cab184cf57a156396e629aae3c033d9afdf9663ab78505a303a1289f/theme-eyezen-v1.0.4.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/eyezen/","maintainer":"Sekuora","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":"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":"poly_copy_paste","schema_version":"1.0.0","name":"Poly Copy Paste","version":"1.1.1","tagline":"Copy / Cut / Paste polygons with Ctrl+C / Ctrl+X / Ctrl+V","archive_hash":"sha256:e6fd3da37dc17ea459a533dc81685044544a2d9dff27f32a8ce8b2aea64d3ad4","archive_size":3499,"archive_url":"https://extensions.blender.org/download/sha256:e6fd3da37dc17ea459a533dc81685044544a2d9dff27f32a8ce8b2aea64d3ad4/add-on-poly-copy-paste-v1.1.1.zip","type":"add-on","blender_version_min":"4.5.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":"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":"delete_empty_nla_tracks","schema_version":"1.0.0","name":"NLA Empty Track Cleanup RKNZ","version":"1.2.1","tagline":"Quickly remove all empty NLA tracks","archive_hash":"sha256:7c6a978f237665af5d5e4e102cc2127b6fbfbe5caba16ba7f49f5623e29fd2cd","archive_size":14568,"archive_url":"https://extensions.blender.org/download/sha256:7c6a978f237665af5d5e4e102cc2127b6fbfbe5caba16ba7f49f5623e29fd2cd/add-on-delete-empty-nla-tracks-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","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":"3.0.3","tagline":"Dark Crimson Futuristic Dystopian","archive_hash":"sha256:2d53e0a86a83cc55cbf19110d48c61cb6f89160c9c6616207d79c37da5060b75","archive_size":5653,"archive_url":"https://extensions.blender.org/download/sha256:2d53e0a86a83cc55cbf19110d48c61cb6f89160c9c6616207d79c37da5060b75/theme-cyberpunk-2077-ui-v3.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":"ThreeMF_io","schema_version":"1.0.0","name":"3MF Import/Export","version":"2.7.4","tagline":"Import and export 3D Manufacturing Format (3MF) files","archive_hash":"sha256:c7ae28365c5080ffc3969b6fe09ab5e91404a334d0a69e097f5aae446326c499","archive_size":348357,"archive_url":"https://extensions.blender.org/download/sha256:c7ae28365c5080ffc3969b6fe09ab5e91404a334d0a69e097f5aae446326c499/add-on-threemf-io-v2.7.4.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":"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":"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.2","tagline":"Procedural node based 3D tree generation","archive_hash":"sha256:3d7f199ef0d6ecb45286ebd89d2f606e64aa22a7f7c66c6fb051ad14fc41cf01","archive_size":3635450,"archive_url":"https://extensions.blender.org/download/sha256:3d7f199ef0d6ecb45286ebd89d2f606e64aa22a7f7c66c6fb051ad14fc41cf01/add-on-modular-tree-v5.5.2-windows-x64.zip","type":"add-on","blender_version_min":"4.3.1","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.9","tagline":"Airy Guardian Spirit","archive_hash":"sha256:628fde7327e653c5d2333dab85257bf92ed033aa29f714ade5d0c61b225f7089","archive_size":5759,"archive_url":"https://extensions.blender.org/download/sha256:628fde7327e653c5d2333dab85257bf92ed033aa29f714ade5d0c61b225f7089/theme-expecto-patronum-theme-v1.0.9.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.2.0","tagline":"Automatic 3D Tracking and Solving","archive_hash":"sha256:ef38ea45cd918ef704a8f0358c2013a13cc625eaa27e7f0b33d4382e531d1dfb","archive_size":70799,"archive_url":"https://extensions.blender.org/download/sha256:ef38ea45cd918ef704a8f0358c2013a13cc625eaa27e7f0b33d4382e531d1dfb/add-on-siemen-lens-blender-autotrack-v4.2.0.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.2","tagline":"Quickly isolate into local view the objects of a collection","archive_hash":"sha256:6f3a2f1d0357b8a236ce46b7adc4e4676655eb65ce451b6bdbc5b2d0d2984de8","archive_size":6670,"archive_url":"https://extensions.blender.org/download/sha256:6f3a2f1d0357b8a236ce46b7adc4e4676655eb65ce451b6bdbc5b2d0d2984de8/add-on-local-view-collection-v1.0.2.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.14","tagline":"Control object parameters through MIDI Input","archive_hash":"sha256:fb008d8f8788230800b85335d34f2c4e9d1ca4a6e1259b409bd54814690ee688","archive_size":537846,"archive_url":"https://extensions.blender.org/download/sha256:fb008d8f8788230800b85335d34f2c4e9d1ca4a6e1259b409bd54814690ee688/add-on-simplemidi-v0.1.14-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.3","tagline":"Vim-like key implementation for Blender","archive_hash":"sha256:910a7f1b8e040677339fa819303465c64045d4529896cc61aa4a0598ce2e539e","archive_size":194852,"archive_url":"https://extensions.blender.org/download/sha256:910a7f1b8e040677339fa819303465c64045d4529896cc61aa4a0598ce2e539e/add-on-chordsong-v1.2.3.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":"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":"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.4.3","tagline":"Visual Designer to build and export URDF/XACRO robot models","archive_hash":"sha256:ae9deb5b51adc355fc7dc25df1b893cfb9060cdf1043f302980925e982f6cdce","archive_size":600374,"archive_url":"https://extensions.blender.org/download/sha256:ae9deb5b51adc355fc7dc25df1b893cfb9060cdf1043f302980925e982f6cdce/add-on-linkforge-v1.4.3-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":"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":"retarget","schema_version":"1.0.0","name":"Retarget","version":"5.0.6","tagline":"Retargeting, convert to Rigify, Action Manager, Animation tools","archive_hash":"sha256:7f7b358e551536f73e5769a73be8900ebadbad7f2cc838f4c58fb731b3eacda0","archive_size":227906,"archive_url":"https://extensions.blender.org/download/sha256:7f7b358e551536f73e5769a73be8900ebadbad7f2cc838f4c58fb731b3eacda0/add-on-retarget-v5.0.6.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":"Import 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":"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":"outliner_preview","schema_version":"1.0.0","name":"Outliner Model Preview","version":"1.1.6","tagline":"Preview selected model in the Outliner","archive_hash":"sha256:1350d1a72a0a5875ef939ca565c2aa758b1018dbb564714f452cefb0a04a6640","archive_size":40638,"archive_url":"https://extensions.blender.org/download/sha256:1350d1a72a0a5875ef939ca565c2aa758b1018dbb564714f452cefb0a04a6640/add-on-outliner-preview-v1.1.6.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":"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":"sprite_sheet_maker","schema_version":"1.0.0","name":"Sprite Sheet Maker","version":"5.2.3","tagline":"3D to 2D sprite sheet converter with optional pixelation","archive_hash":"sha256:0e4681811e2b54bc9e74cf1d559c75a577e399047432bf09f61c94966aa3e99b","archive_size":7200095,"archive_url":"https://extensions.blender.org/download/sha256:0e4681811e2b54bc9e74cf1d559c75a577e399047432bf09f61c94966aa3e99b/add-on-sprite-sheet-maker-v5.2.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":"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":"kanagawa","schema_version":"1.0.0","name":"Kanagawa","version":"1.0.2","tagline":"kanagawa.nvim for Blender","archive_hash":"sha256:a8812fbee1f25670d4d3dc9e272e197c99ce40597974cfdb0629ebf4de643004","archive_size":6255,"archive_url":"https://extensions.blender.org/download/sha256:a8812fbee1f25670d4d3dc9e272e197c99ce40597974cfdb0629ebf4de643004/theme-kanagawa-v1.0.2.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":"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":"io_scene_owm","schema_version":"1.0.0","name":"OWM Import","version":"3.3.1","tagline":"Import files from the Overwatch extraction tools (DataTool)","archive_hash":"sha256:9b6e6a11ce333504f4a09cbb599e940216133f7007cdbd274f2decfe071d9445","archive_size":279836,"archive_url":"https://extensions.blender.org/download/sha256:9b6e6a11ce333504f4a09cbb599e940216133f7007cdbd274f2decfe071d9445/add-on-io-scene-owm-v3.3.1.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.3","tagline":"A light theme directly inspired by Windows XP","archive_hash":"sha256:ca44d2ed04de48c14d142eb0104d9abc6591d41447559085622fca424530333e","archive_size":6738,"archive_url":"https://extensions.blender.org/download/sha256:ca44d2ed04de48c14d142eb0104d9abc6591d41447559085622fca424530333e/theme-windows-xp-theme-v1.0.3.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.2","tagline":"High-contrast dark theme with Zenless Zone Zero's signature","archive_hash":"sha256:070fce74a8da3a56906da1289cc73afdfe42ab5409b9fbb0418e828653747d86","archive_size":5517,"archive_url":"https://extensions.blender.org/download/sha256:070fce74a8da3a56906da1289cc73afdfe42ab5409b9fbb0418e828653747d86/theme-zzz-v1.0.2.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.4","tagline":"A Mint lavender theme for Blender with Lo-fi aesthetics","archive_hash":"sha256:f0f94cbdc8c430272abb6b7d0b94b94df7f70421eeeace7314e9c90d598053c5","archive_size":5405,"archive_url":"https://extensions.blender.org/download/sha256:f0f94cbdc8c430272abb6b7d0b94b94df7f70421eeeace7314e9c90d598053c5/theme-mintlavender-v1.0.4.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.1.0","tagline":"A clean dark-blue Blender theme","archive_hash":"sha256:4db02ebc9e554c4d07fd7d31c7661062ed8920d7e8dcc471d241af1ece347cf9","archive_size":5549,"archive_url":"https://extensions.blender.org/download/sha256:4db02ebc9e554c4d07fd7d31c7661062ed8920d7e8dcc471d241af1ece347cf9/theme-sleek-navy-v1.1.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.4","tagline":"Consistent UI, sharp colors, comfortable contrast, 3 birght lvls","archive_hash":"sha256:cd5ee37d78a748d3256948fbd86b4d37f1cc708de863319dc5d64cd68bdb4b55","archive_size":5467,"archive_url":"https://extensions.blender.org/download/sha256:cd5ee37d78a748d3256948fbd86b4d37f1cc708de863319dc5d64cd68bdb4b55/theme-studio-dark-v2.3.4.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.2","tagline":"Generate a control rig from Mixamo Fbx skeleton","archive_hash":"sha256:5c59e419355b0b4b5014b7bbcbee4d9a4c38476b8225526e3c904a81b056a191","archive_size":179337,"archive_url":"https://extensions.blender.org/download/sha256:5c59e419355b0b4b5014b7bbcbee4d9a4c38476b8225526e3c904a81b056a191/add-on-mixamo-rig-v1.2.2.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":"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":"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":"cad_helper","schema_version":"1.0.0","name":"CAD-Helper","version":"0.7.0","tagline":"Blender Extension to manage imported CAD assemblies","archive_hash":"sha256:f3b569a0cd29d9d96745422d302b1fb94d78c8415e0dffdc73315376f3849fc2","archive_size":44789,"archive_url":"https://extensions.blender.org/download/sha256:f3b569a0cd29d9d96745422d302b1fb94d78c8415e0dffdc73315376f3849fc2/add-on-cad-helper-v0.7.0-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":"anim_reviewer","schema_version":"1.0.0","name":"Anim Reviewer","version":"1.1.0","tagline":"Enhance blender playblast capabilities for animation review","archive_hash":"sha256:c0a0fa57ace3f7b947b66c30eb0de9fc2d7ebd36c1915ff5ad96dfea46b7da12","archive_size":1336967,"archive_url":"https://extensions.blender.org/download/sha256:c0a0fa57ace3f7b947b66c30eb0de9fc2d7ebd36c1915ff5ad96dfea46b7da12/add-on-anim-reviewer-v1.1.0.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.3","tagline":"Export renders and images as Bayer-style DNG files","archive_hash":"sha256:a02d2f10564dbcfa599731d957db4daf8573ceac47ba417a7900c0739792ce1a","archive_size":25964,"archive_url":"https://extensions.blender.org/download/sha256:a02d2f10564dbcfa599731d957db4daf8573ceac47ba417a7900c0739792ce1a/add-on-export-render-as-dng-v1.0.3.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":"1.0.0","tagline":"Interactive 3D arrows for quick face symmetrize","archive_hash":"sha256:5d58ce93e492222135451137d86094c3988432200bd4a32a4df3a500e20777dd","archive_size":5637,"archive_url":"https://extensions.blender.org/download/sha256:5d58ce93e492222135451137d86094c3988432200bd4a32a4df3a500e20777dd/add-on-bh-smart-sym-v1.0.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.1.1","tagline":"Quickly Create, Edit, Organize, or Delete your local asset files","archive_hash":"sha256:7cbe5007e7416b8c82a88ac167ad0193b86d75d291649538f838df240bb7f441","archive_size":80302,"archive_url":"https://extensions.blender.org/download/sha256:7cbe5007e7416b8c82a88ac167ad0193b86d75d291649538f838df240bb7f441/add-on-quick-asset-saver-v2.1.1.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.5","tagline":"This is a variant of Whispering Ripples","archive_hash":"sha256:1348acaf02e162299334e97c05d89a3ed1bfccd5f4263db5ec6d26f9affd55ee","archive_size":5857,"archive_url":"https://extensions.blender.org/download/sha256:1348acaf02e162299334e97c05d89a3ed1bfccd5f4263db5ec6d26f9affd55ee/theme-beautiful-dream-v1.0.5.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.3.0","tagline":"Animate quickly by drawing trajectory line","archive_hash":"sha256:2cea314d9a7d46e9da8d24d51c7c1f55326c42ef46917a3beecc66ed97bfae83","archive_size":45832,"archive_url":"https://extensions.blender.org/download/sha256:2cea314d9a7d46e9da8d24d51c7c1f55326c42ef46917a3beecc66ed97bfae83/add-on-trajectory-anim-v1.3.0.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.2","tagline":"OLED theme for Blender","archive_hash":"sha256:b339a87acdc222758ce501b57fe534e06154e3791aeba471c86b742138cf6cca","archive_size":5884,"archive_url":"https://extensions.blender.org/download/sha256:b339a87acdc222758ce501b57fe534e06154e3791aeba471c86b742138cf6cca/theme-oled-v1.0.2.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.8","tagline":"Turn Outliner & Properties editors into a toggleable sidebar","archive_hash":"sha256:3cce7a702ba5d31f7f77f2d9bd64d335a1e134e53d2b29206b13476164edaa51","archive_size":25117,"archive_url":"https://extensions.blender.org/download/sha256:3cce7a702ba5d31f7f77f2d9bd64d335a1e134e53d2b29206b13476164edaa51/add-on-editorbar-v0.4.8.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":"k_tools_render_preset_manager","schema_version":"1.0.0","name":"K-Tools: Render Preset Manager","version":"1.3.1","tagline":"Save and Load Blender's Settings","archive_hash":"sha256:c2e2224553c604028b4715cb84bdc726b5a60cd1bf375757c4a9ff51bbf459f0","archive_size":92218,"archive_url":"https://extensions.blender.org/download/sha256:c2e2224553c604028b4715cb84bdc726b5a60cd1bf375757c4a9ff51bbf459f0/add-on-k-tools-render-preset-manager-v1.3.1.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":"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":"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":"2.2.0","tagline":"rotor","archive_hash":"sha256:14c0f05a311c5e60513de355274e7aada4e449b1831e530de0e82e1d9572bc62","archive_size":71356,"archive_url":"https://extensions.blender.org/download/sha256:14c0f05a311c5e60513de355274e7aada4e449b1831e530de0e82e1d9572bc62/add-on-rotor-v2.2.0.zip","type":"add-on","blender_version_min":"5.0.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.5.1","tagline":"Blockout","archive_hash":"sha256:7de7d28e969c5fce5feb9589185f8c8f042cc09e1d41e23f640b936e6dc76ed6","archive_size":179732,"archive_url":"https://extensions.blender.org/download/sha256:7de7d28e969c5fce5feb9589185f8c8f042cc09e1d41e23f640b936e6dc76ed6/add-on-blockout-v1.5.1.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.3","tagline":"Adds parallax node for shader nodes","archive_hash":"sha256:6f196f5aeb175b28c1d5cd0b4b674c8b2c2ae394bef5dfe6f87bf6687ca4e821","archive_size":12716,"archive_url":"https://extensions.blender.org/download/sha256:6f196f5aeb175b28c1d5cd0b4b674c8b2c2ae394bef5dfe6f87bf6687ca4e821/add-on-parallax-node-v1.1.3.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.2","tagline":"Technical rigging made easier","archive_hash":"sha256:85709b0be7bef891c778484d8182caf4869b32767cf28ab95275d17a219a0d55","archive_size":40933,"archive_url":"https://extensions.blender.org/download/sha256:85709b0be7bef891c778484d8182caf4869b32767cf28ab95275d17a219a0d55/add-on-easy-driver-v1.5.2.zip","type":"add-on","blender_version_min":"4.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.6","tagline":"Format Rename","archive_hash":"sha256:389000c6503f93d27a2506860690573d1155ada0571d834420da1b1bd11ba5ee","archive_size":19668,"archive_url":"https://extensions.blender.org/download/sha256:389000c6503f93d27a2506860690573d1155ada0571d834420da1b1bd11ba5ee/add-on-format-rename-v0.0.6.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":["System"]},{"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.8","tagline":"Layer-based compositing tool, similar to After Effects","archive_hash":"sha256:9ba3fa15eced6859a09b52444be5af2e73458c4730ed7d28ff9d3bb60ae7196a","archive_size":536379,"archive_url":"https://extensions.blender.org/download/sha256:9ba3fa15eced6859a09b52444be5af2e73458c4730ed7d28ff9d3bb60ae7196a/add-on-layer-comp-v1.1.8.zip","type":"add-on","blender_version_min":"5.0.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":"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":"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":"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.2","tagline":"A neutral grey theme with colorful accents","archive_hash":"sha256:d58ec79f4882ab7cd7c1ee527c0df326b1866fd1e6ee9bbe3a424765ce2c48d8","archive_size":5846,"archive_url":"https://extensions.blender.org/download/sha256:d58ec79f4882ab7cd7c1ee527c0df326b1866fd1e6ee9bbe3a424765ce2c48d8/theme-candymouse-v1.1.2.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.3","tagline":"The Mandelbrot set using only Integer Math and Bit Math Nodes","archive_hash":"sha256:db3afe337e319b0a42ca1d4731c281924be16a7f583eb4f9f9ea27d9e9f81947","archive_size":46805,"archive_url":"https://extensions.blender.org/download/sha256:db3afe337e319b0a42ca1d4731c281924be16a7f583eb4f9f9ea27d9e9f81947/add-on-i32-the-mandelbrot-set-v1.0.3.zip","type":"add-on","blender_version_min":"5.2.0","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.14","tagline":"Mesh Based Motion Tracking in Blender","archive_hash":"sha256:e687a1b30e20971951176d5ad136acd6f945904f9e0d1054043f506e3c1bc9d0","archive_size":6053241,"archive_url":"https://extensions.blender.org/download/sha256:e687a1b30e20971951176d5ad136acd6f945904f9e0d1054043f506e3c1bc9d0/add-on-polychase-v0.0.14-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.8","tagline":"Dark Monochrome","archive_hash":"sha256:f22a266e186c15de8b759b904df0bbf069874490500a682fa1367d106f693f48","archive_size":5666,"archive_url":"https://extensions.blender.org/download/sha256:f22a266e186c15de8b759b904df0bbf069874490500a682fa1367d106f693f48/theme-blackboard-theme-v2.2.8.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.7","tagline":"Precision Surface Design","archive_hash":"sha256:9451d01e5b72005bdd492d45572d01bdfc496f0e64bdd63a84c49603986bcde1","archive_size":51716083,"archive_url":"https://extensions.blender.org/download/sha256:9451d01e5b72005bdd492d45572d01bdfc496f0e64bdd63a84c49603986bcde1/add-on-surfacepsycho-v0.9.7-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":"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.3","tagline":"Update all keyframes relatively on transform changes","archive_hash":"sha256:ecc8d313128cc14480d90c40ab5558eab2fded25757f242ddddc4d5a14cd64e1","archive_size":15402,"archive_url":"https://extensions.blender.org/download/sha256:ecc8d313128cc14480d90c40ab5558eab2fded25757f242ddddc4d5a14cd64e1/add-on-anim-auto-offset-v1.3.3.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.9","tagline":"Technical Drawing","archive_hash":"sha256:78e6e323324711568f4ccb615d8e034d9c4dfb8a5ca55d5507aa73ea5a377d6f","archive_size":5770,"archive_url":"https://extensions.blender.org/download/sha256:78e6e323324711568f4ccb615d8e034d9c4dfb8a5ca55d5507aa73ea5a377d6f/theme-blueprint-paper-theme-v2.2.9.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":"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":"BL_FastStart","schema_version":"1.0.0","name":"BL Fast Start (MP4/MOV)","version":"1.9.4","tagline":"A checkbox to add a 'Fast Start' copy of MP4/MOV renders","archive_hash":"sha256:6816f8d0815101c8ffdc93530e012e6e770dfc8ffc9b5ac441ae57eb74407694","archive_size":22865,"archive_url":"https://extensions.blender.org/download/sha256:6816f8d0815101c8ffdc93530e012e6e770dfc8ffc9b5ac441ae57eb74407694/add-on-bl-faststart-v1.9.4.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":"jiggle_physics","schema_version":"1.0.0","name":"Jiggle Physics","version":"4.5.2","tagline":"Add stretchy jiggle physics to your Blender rigs","archive_hash":"sha256:26daa9b47b41a1f18aa38c4103f7127c906698ad56e4f9f090e6092f83212239","archive_size":32913,"archive_url":"https://extensions.blender.org/download/sha256:26daa9b47b41a1f18aa38c4103f7127c906698ad56e4f9f090e6092f83212239/add-on-jiggle-physics-v4.5.2.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.1.0","tagline":"Powerful Make Planar Faces Operator","archive_hash":"sha256:de63571b8ee2edafff87ba9bc95a71495cdc15f61c8b8b16d9d5ee01fac65fe4","archive_size":258249,"archive_url":"https://extensions.blender.org/download/sha256:de63571b8ee2edafff87ba9bc95a71495cdc15f61c8b8b16d9d5ee01fac65fe4/add-on-makeplanarfacesplus-v1.1.0-windows-x64.zip","type":"add-on","blender_version_min":"5.1.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.3.0","tagline":"Generate iso-surface meshes using the Marching Cubes algorithm","archive_hash":"sha256:4a372e364622fa0539b87f9522bbd60c58e6e06e3e2dc32d725c10707343db18","archive_size":41468991,"archive_url":"https://extensions.blender.org/download/sha256:4a372e364622fa0539b87f9522bbd60c58e6e06e3e2dc32d725c10707343db18/add-on-marchingcube-v0.3.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.3","tagline":"Easy to use shader-based terrain generator for Cycles","archive_hash":"sha256:802d22cc5d7dbce0221d3399bc23b8f96799ba5c66421d7261016bd64d5800ac","archive_size":66614047,"archive_url":"https://extensions.blender.org/download/sha256:802d22cc5d7dbce0221d3399bc23b8f96799ba5c66421d7261016bd64d5800ac/add-on-terrainmixer-v3.1.3.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":"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":"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":"2.0.0","tagline":"Set vertex distance single vertex or connected component","archive_hash":"sha256:b7ef6995d2f2953d1b6af31b947e4f47d1194f1cf775bb6c8c23a1343b1dbed7","archive_size":3128,"archive_url":"https://extensions.blender.org/download/sha256:b7ef6995d2f2953d1b6af31b947e4f47d1194f1cf775bb6c8c23a1343b1dbed7/add-on-set-vertex-distance-v2.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.4.0","tagline":"A UI List implementation for Blender's modifier stack","archive_hash":"sha256:9da5047863bb70c7c86ea0ea77976c1562fef3c98dbc672e8ea81ab05fb85138","archive_size":6635,"archive_url":"https://extensions.blender.org/download/sha256:9da5047863bb70c7c86ea0ea77976c1562fef3c98dbc672e8ea81ab05fb85138/add-on-modifer-stack-manager-v1.4.0.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.5.1","tagline":"Sculpting using only a pen and keyboard","archive_hash":"sha256:2501fc16046f53c0d5eadb046baaa1fc5203c30650b8bf642139d12bec040f55","archive_size":544191,"archive_url":"https://extensions.blender.org/download/sha256:2501fc16046f53c0d5eadb046baaa1fc5203c30650b8bf642139d12bec040f55/add-on-bbrush-v1.5.1.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":"View navigation texture load"},"tags":["Sculpt"]},{"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":"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":"3.0.2","tagline":"Inspired by the old Steam UI. ","archive_hash":"sha256:8afd1d108e4c8f75d747728f1f23fb9d114ca74822448019613b4fb184ee0738","archive_size":5495,"archive_url":"https://extensions.blender.org/download/sha256:8afd1d108e4c8f75d747728f1f23fb9d114ca74822448019613b4fb184ee0738/theme-steam-v3.0.2.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.6.2","tagline":"Streamlined mesh export for game development workflows","archive_hash":"sha256:874bb4a47f6664fd1a77a3ea9fc887d3907d7a662cc85342a299e0fbad4cf9b2","archive_size":80528,"archive_url":"https://extensions.blender.org/download/sha256:874bb4a47f6664fd1a77a3ea9fc887d3907d7a662cc85342a299e0fbad4cf9b2/add-on-easymesh-batch-exporter-v1.6.2.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.8.2","tagline":"One click export to multiple files","archive_hash":"sha256:78bf2172083f1cd455aee1d709c0d5a33170dbc5734c5959ca6cd5059bbc8a51","archive_size":30522,"archive_url":"https://extensions.blender.org/download/sha256:78bf2172083f1cd455aee1d709c0d5a33170dbc5734c5959ca6cd5059bbc8a51/add-on-superduperbatchexporter-v2.8.2.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.2","tagline":"Make Asset Catalogs from selected Collections","archive_hash":"sha256:417f58839a3f7e90e31733319d75e4317e9415926fd379e605bc54bb61b5a540","archive_size":2677,"archive_url":"https://extensions.blender.org/download/sha256:417f58839a3f7e90e31733319d75e4317e9415926fd379e605bc54bb61b5a540/add-on-quickcatalogs-v1.0.2.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":"2.0.0","tagline":"A futuristic neon theme for Blender","archive_hash":"sha256:ec0e4a9ff5bfe79411d7dd3ece3e9cb3efad2c28e612c8135733e072b0ae9849","archive_size":6238,"archive_url":"https://extensions.blender.org/download/sha256:ec0e4a9ff5bfe79411d7dd3ece3e9cb3efad2c28e612c8135733e072b0ae9849/theme-neon-nexus-v2.0.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":"3.0.0","tagline":"This is another extension","archive_hash":"sha256:84b584efded84667d8dfb689775d9b528f41658c6a6d68e2b8f6af342e32bc00","archive_size":7421,"archive_url":"https://extensions.blender.org/download/sha256:84b584efded84667d8dfb689775d9b528f41658c6a6d68e2b8f6af342e32bc00/theme-neutro-laranja-v3.0.0.zip","type":"theme","blender_version_min":"5.1.0","website":"https://extensions.blender.org/themes/neutro-laranja/","maintainer":"Push","license":["SPDX:GPL-3.0-or-later"],"tags":["Accessibility","Light"]},{"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":"theme_2000","schema_version":"1.0.0","name":"Theme 2000","version":"1.1.2","tagline":"Inspired by Windows XP, MS office 2007, Sims","archive_hash":"sha256:bf408b6600cddfacf2a9ecfb3b14352153cee68629e1a0ae6e581451f696169a","archive_size":5758,"archive_url":"https://extensions.blender.org/download/sha256:bf408b6600cddfacf2a9ecfb3b14352153cee68629e1a0ae6e581451f696169a/theme-theme-2000-v1.1.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-2000/","maintainer":"danil_orlow","license":["SPDX:GPL-2.0-or-later"],"tags":["Light","Inspired By"]},{"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.3.2","tagline":"PureRef for Blender. You can add references in the 3D Viewport","archive_hash":"sha256:b849d80c20d6b50dcc5a4228f1aedc1bbc38edf2b18f78422f803c18bc2860a3","archive_size":14178245,"archive_url":"https://extensions.blender.org/download/sha256:b849d80c20d6b50dcc5a4228f1aedc1bbc38edf2b18f78422f803c18bc2860a3/add-on-references-overlays-v2.3.2-windows-x64.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"},"platforms":["windows-x64"],"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":"PlaceHelper","schema_version":"1.0.0","name":"Place Helper","version":"2.0.0","tagline":"Place, align and scatter objects with ease","archive_hash":"sha256:b716a8028e846db794aff472e96b475f2593082b898355a46502d3cc03013544","archive_size":99170,"archive_url":"https://extensions.blender.org/download/sha256:b716a8028e846db794aff472e96b475f2593082b898355a46502d3cc03013544/add-on-placehelper-v2.0.0.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","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":"1.0.0","tagline":"90s, xp, old","archive_hash":"sha256:fe107f25135c986dc75a83ac02114a31ef88628683ac3b58dc2a12341621aa7e","archive_size":5999,"archive_url":"https://extensions.blender.org/download/sha256:fe107f25135c986dc75a83ac02114a31ef88628683ac3b58dc2a12341621aa7e/theme-blend95-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"10.0.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.8","tagline":"Simple and fast lighting with improved selection","archive_hash":"sha256:a362dec5c224c27418383bcb533c69b9fbb024b0ac6db6a2e744933b31e19ffe","archive_size":91181,"archive_url":"https://extensions.blender.org/download/sha256:a362dec5c224c27418383bcb533c69b9fbb024b0ac6db6a2e744933b31e19ffe/add-on-quick-studio-light-v1.1.8.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":"typst_importer","schema_version":"1.0.0","name":"Typst Importer","version":"0.3.4","tagline":"Render mathematical equations and code blocks","archive_hash":"sha256:5b9250d8e2bc36fea306cfb2d306fdb086113a6ff45ae84c53def753278cef2e","archive_size":33456703,"archive_url":"https://extensions.blender.org/download/sha256:5b9250d8e2bc36fea306cfb2d306fdb086113a6ff45ae84c53def753278cef2e/add-on-typst-importer-v0.3.4-windows-x64.zip","type":"add-on","blender_version_min":"5.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.6","tagline":"Shift+Q|Ctrl+Q Pie menu-Align Nodes in Multiple Ways(多种方式对齐节点)","archive_hash":"sha256:eab7487c2e0925279ef8184ac6e611bf88c4a9f964a5fc72f6f5b9bf7c959403","archive_size":23687,"archive_url":"https://extensions.blender.org/download/sha256:eab7487c2e0925279ef8184ac6e611bf88c4a9f964a5fc72f6f5b9bf7c959403/add-on-node-align-v3.2.6.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":"2026.2.0","tagline":"Tool to simplify scenes for improved viewport performance","archive_hash":"sha256:52e7ba18e9956e98f977cdaef9e2f5838ef9a0d63f0a1b2dddb2a43c3db06ace","archive_size":56521,"archive_url":"https://extensions.blender.org/download/sha256:52e7ba18e9956e98f977cdaef9e2f5838ef9a0d63f0a1b2dddb2a43c3db06ace/add-on-mustardsimplify-v2026.2.0.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.7","tagline":"Grease Pencil Toobar in N sidebar with auto mode switch","archive_hash":"sha256:80a8be8f55be5ecf1491c0f255a905d09ac187e7d25070c4b10ee5459fc4cae9","archive_size":53548,"archive_url":"https://extensions.blender.org/download/sha256:80a8be8f55be5ecf1491c0f255a905d09ac187e7d25070c4b10ee5459fc4cae9/add-on-quicktools-v3-v1.1.7.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":"Node Attribute List(节点属性列表)","version":"2.9.0","tagline":"Quickly Add Attribute Node in GN and Shader(几何节点和材质里快速添加属性节点)","archive_hash":"sha256:72af93e73ad32cd70546790d09155a757f822ae1abe256952b3d6115ad467a01","archive_size":97876,"archive_url":"https://extensions.blender.org/download/sha256:72af93e73ad32cd70546790d09155a757f822ae1abe256952b3d6115ad467a01/add-on-named-attribute-list-v2.9.0.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":"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.8","tagline":"Qucik add/split/merge Group Input node/socket(快速添加拆分合并移动组输入节点接口)","archive_hash":"sha256:0e0563d36700e10a98c0c124d20d6866186625a0d351a21096caf45a318b0007","archive_size":76056,"archive_url":"https://extensions.blender.org/download/sha256:0e0563d36700e10a98c0c124d20d6866186625a0d351a21096caf45a318b0007/add-on-group-input-helper-v2.9.8.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":"botanesque","schema_version":"1.0.0","name":"Botanesque","version":"1.1.0","tagline":"Cozy brown blender theme","archive_hash":"sha256:fe991ce8b287c8aaea5f3c4cf503be2afd1fb96daa9ee0eb0a954b9cdc70a200","archive_size":5736,"archive_url":"https://extensions.blender.org/download/sha256:fe991ce8b287c8aaea5f3c4cf503be2afd1fb96daa9ee0eb0a954b9cdc70a200/theme-botanesque-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/botanesque/","maintainer":"polygoniq","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"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.36.8","tagline":"Import-Export Pod tracks, ghosts, images, and cars","archive_hash":"sha256:a419a08af2dba5dbf487fbe33e98ad3738594e8549718332f4d719aac8c6b57b","archive_size":7257423,"archive_url":"https://extensions.blender.org/download/sha256:a419a08af2dba5dbf487fbe33e98ad3738594e8549718332f4d719aac8c6b57b/add-on-io-scene-pod-v0.36.8-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":"RetroGrey","schema_version":"1.0.0","name":"RetroGrey","version":"1.3.4","tagline":"Theme inspired by the grey color of 90s computer devices","archive_hash":"sha256:efae32bcfb363f12d5be7c11b3dc9398fa938f0113f3524e96f37e84582ff758","archive_size":6837,"archive_url":"https://extensions.blender.org/download/sha256:efae32bcfb363f12d5be7c11b3dc9398fa938f0113f3524e96f37e84582ff758/theme-retrogrey-v1.3.4.zip","type":"theme","blender_version_min":"5.0.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.1","tagline":"Show users, merge duplicates, find similar, and more","archive_hash":"sha256:db2e356254375e433b30101c2db61e80f37efb4af8395805b439f583fa0abebc","archive_size":1740290,"archive_url":"https://extensions.blender.org/download/sha256:db2e356254375e433b30101c2db61e80f37efb4af8395805b439f583fa0abebc/add-on-datablock-utils-v1.3.1.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.16","tagline":"Human character generator and editor","archive_hash":"sha256:b5cdc8b08147e0c6463e4faa01147491b13a0b062f73415363f029debd11c934","archive_size":44978070,"archive_url":"https://extensions.blender.org/download/sha256:b5cdc8b08147e0c6463e4faa01147491b13a0b062f73415363f029debd11c934/add-on-mpfb-v2.0.16.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.55","tagline":"Modern Primitive for Non-Destructive Modeling","archive_hash":"sha256:73cbd13d9a7f39c60fc49a48752ebcfcd078f215db9304a26cf4e22a398a0bf8","archive_size":3407351,"archive_url":"https://extensions.blender.org/download/sha256:73cbd13d9a7f39c60fc49a48752ebcfcd078f215db9304a26cf4e22a398a0bf8/add-on-modern-primitive-v0.0.55.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":"orange_dark_vignette","schema_version":"1.0.0","name":"Orange Dark + Vignette","version":"1.1.0","tagline":"Transparent orange UI and vignette, Blender colors","archive_hash":"sha256:4713520790d11b9b883ee47b9f9fb751615cb5c1d02ad3c4aa455d40ca08832d","archive_size":5835,"archive_url":"https://extensions.blender.org/download/sha256:4713520790d11b9b883ee47b9f9fb751615cb5c1d02ad3c4aa455d40ca08832d/theme-orange-dark-vignette-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/orange-dark-vignette/","maintainer":"danil_orlow","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"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":"1.3.0","tagline":"tools for game assets, fixed Unreal FBX exports","archive_hash":"sha256:14f7544d04722472d4b24bbdb04550aea16c39c6e5e8a49dfe46220dbe274802","archive_size":28673,"archive_url":"https://extensions.blender.org/download/sha256:14f7544d04722472d4b24bbdb04550aea16c39c6e5e8a49dfe46220dbe274802/add-on-proto-game-asset-tools-v1.3.0.zip","type":"add-on","blender_version_min":"4.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.1.1","tagline":"Access Unicode characters","archive_hash":"sha256:8f2e8f263321c2d29cd54ddbb3bb25d04965f5f58921b5749702e475774cd83c","archive_size":40909,"archive_url":"https://extensions.blender.org/download/sha256:8f2e8f263321c2d29cd54ddbb3bb25d04965f5f58921b5749702e475774cd83c/add-on-b-unicode-v1.1.1.zip","type":"add-on","blender_version_min":"5.1.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.6","tagline":"Measure distances, edge lengths, and angles in Edit Mode","archive_hash":"sha256:c541631ac21cda9bf95205851e0910404ba01b115bc524a26f2b60b9f9cd4dae","archive_size":137848,"archive_url":"https://extensions.blender.org/download/sha256:c541631ac21cda9bf95205851e0910404ba01b115bc524a26f2b60b9f9cd4dae/add-on-sco-edgewise-v2.0.6.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.1.5","tagline":"Automatically change the header color based on the current mode","archive_hash":"sha256:eae884fe1f34f0453d23b0b254ab85a2cd3e85b7b95dbf867a65fd7370c804c4","archive_size":13305,"archive_url":"https://extensions.blender.org/download/sha256:eae884fe1f34f0453d23b0b254ab85a2cd3e85b7b95dbf867a65fd7370c804c4/add-on-k-tools-mode-highlight-v1.1.5.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.10.2","tagline":"Box, lasso and circle selection tools with x-ray","archive_hash":"sha256:5abcac3932b30d66b8d693aaf6cf54811b9944a6fb7226f0819fe29e3157134e","archive_size":88167,"archive_url":"https://extensions.blender.org/download/sha256:5abcac3932b30d66b8d693aaf6cf54811b9944a6fb7226f0819fe29e3157134e/add-on-xray-selection-tools-v4.10.2.zip","type":"add-on","blender_version_min":"5.1.1","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":"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":"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":"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":"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.4","tagline":"Shading pie for designers and artists","archive_hash":"sha256:af133ec48e4121248200435f78a3f9d7601ad80b6b47fe68d6fa906870117b67","archive_size":50470985,"archive_url":"https://extensions.blender.org/download/sha256:af133ec48e4121248200435f78a3f9d7601ad80b6b47fe68d6fa906870117b67/add-on-shadingplus-v1.1.4.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":"brushstroke_tools","schema_version":"1.0.0","name":"Brushstroke Tools","version":"1.2.3","tagline":"Brushstroke painting tools by the Blender Studio","archive_hash":"sha256:b66728b70b2d6af5ad942b5aa27fcc540db0972c22169480aa552d1e22061fe4","archive_size":29638062,"archive_url":"https://extensions.blender.org/download/sha256:b66728b70b2d6af5ad942b5aa27fcc540db0972c22169480aa552d1e22061fe4/add-on-brushstroke-tools-v1.2.3.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.10","tagline":"Easier game asset creation","archive_hash":"sha256:725dbcc49ccbbaac34d6733f44dcae055ce4ed2c304822df7c5a91417e2e0283","archive_size":162741,"archive_url":"https://extensions.blender.org/download/sha256:725dbcc49ccbbaac34d6733f44dcae055ce4ed2c304822df7c5a91417e2e0283/add-on-gamiflow-v1.9.10.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":"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.4","tagline":"Move and rotate HDRIs, Shadows and Lights from the viewport","archive_hash":"sha256:69e4cb8239059d348bce877309c59df997c37162b7b3d04f2aebd74edb0b5b53","archive_size":20170,"archive_url":"https://extensions.blender.org/download/sha256:69e4cb8239059d348bce877309c59df997c37162b7b3d04f2aebd74edb0b5b53/add-on-hdrirotator-v1.1.4.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.2.0","tagline":"Cloudy Grey","archive_hash":"sha256:61885bfc16acfd98b8bd30108daa927007823ad14665dcc762974c73003eb166","archive_size":5645,"archive_url":"https://extensions.blender.org/download/sha256:61885bfc16acfd98b8bd30108daa927007823ad14665dcc762974c73003eb166/theme-light-rain-theme-v2.2.0.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.8","tagline":"Store and manage multiple 3D Cursors","archive_hash":"sha256:41c7aa4374a6bb8a05e2e2f024d8e0d8c503c9c14c52bd48785e9c0b4ce9da38","archive_size":6803,"archive_url":"https://extensions.blender.org/download/sha256:41c7aa4374a6bb8a05e2e2f024d8e0d8c503c9c14c52bd48785e9c0b4ce9da38/add-on-c3db-v0.1.8.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.1.0","tagline":"Camera specific Resolution, Frame Range, Output Path & Format","archive_hash":"sha256:564539c2e6e457a83e4879fee123e966fda3da429b072255e38e01757f322e89","archive_size":68544,"archive_url":"https://extensions.blender.org/download/sha256:564539c2e6e457a83e4879fee123e966fda3da429b072255e38e01757f322e89/add-on-cameraide-settings-v1.1.0.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.1","tagline":"merge selected bones into the active bone","archive_hash":"sha256:ce830a02f48ccc0ed33ec043729df2cb83acb0ba0b91eb3f5f914e5339add61a","archive_size":17934,"archive_url":"https://extensions.blender.org/download/sha256:ce830a02f48ccc0ed33ec043729df2cb83acb0ba0b91eb3f5f914e5339add61a/add-on-org-tayou-bone-vertex-group-merge-v1.4.1.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.2","tagline":"A set of tools to make vertex painting easier","archive_hash":"sha256:1fbaa310bd64dfa268b1ed52895f894e2d9d4c7eca7de88034a3eae5d1dd93d3","archive_size":57737,"archive_url":"https://extensions.blender.org/download/sha256:1fbaa310bd64dfa268b1ed52895f894e2d9d4c7eca7de88034a3eae5d1dd93d3/add-on-more-colors-v1.2.2.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":"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":"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":"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":"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":"Neo_Grey_Theme","schema_version":"1.0.0","name":"Neo_Grey_Theme","version":"2.4.9","tagline":"Dust Cloud","archive_hash":"sha256:82425ff2b82262785574d0dfdc27fed8406fc12e6127c3a30f9afea4694efd5e","archive_size":5677,"archive_url":"https://extensions.blender.org/download/sha256:82425ff2b82262785574d0dfdc27fed8406fc12e6127c3a30f9afea4694efd5e/theme-neo-grey-theme-v2.4.9.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":"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":"dark_17","schema_version":"1.0.0","name":"17 Dark","version":"1.0.2","tagline":"Makes Blender darker","archive_hash":"sha256:c1527478cbb92a6f87eadb887b6971534c97e2222d580578c77118a140ba3ddb","archive_size":5616,"archive_url":"https://extensions.blender.org/download/sha256:c1527478cbb92a6f87eadb887b6971534c97e2222d580578c77118a140ba3ddb/theme-dark-17-v1.0.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/dark-17/","maintainer":"S41L0R","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"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.1","tagline":"Turn node groups into Python code","archive_hash":"sha256:cca0220e2cdafd59148dc2d1edfa1e98f2acded6bda5c0effc90a8c6028b5081","archive_size":81093,"archive_url":"https://extensions.blender.org/download/sha256:cca0220e2cdafd59148dc2d1edfa1e98f2acded6bda5c0effc90a8c6028b5081/add-on-node-to-python-v4.1.1.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.7.0","tagline":"Use your own .blend files as template options for new projects","archive_hash":"sha256:b28b219df1598bd2359a9dfa5c5fd99e714c97792ad5947adc64634018b9cff8","archive_size":18893,"archive_url":"https://extensions.blender.org/download/sha256:b28b219df1598bd2359a9dfa5c5fd99e714c97792ad5947adc64634018b9cff8/add-on-custom-templates-v1.7.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.9","tagline":"Soft Light","archive_hash":"sha256:8afb8b4a4b86c92faddde9f21daec3fb839b2c70455f02b1fba5de2a8e3d3fde","archive_size":5673,"archive_url":"https://extensions.blender.org/download/sha256:8afb8b4a4b86c92faddde9f21daec3fb839b2c70455f02b1fba5de2a8e3d3fde/theme-elegant-light-theme-v2.2.9.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.4","tagline":"My Virtual Rig and General Device Type Format","archive_hash":"sha256:fd319cfc1eb8b9af4e36e6505a92084e4653154515060745e43b28ca60453a52","archive_size":317611,"archive_url":"https://extensions.blender.org/download/sha256:fd319cfc1eb8b9af4e36e6505a92084e4653154515060745e43b28ca60453a52/add-on-io-scene-mvr-v1.5.4.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":"2026.1.1","tagline":"Toolset for working with Texel Density","archive_hash":"sha256:ca5554ec5c08a830c344ddc08a4c4f8f2e619178ac05ef582ea0293ab540308d","archive_size":26191,"archive_url":"https://extensions.blender.org/download/sha256:ca5554ec5c08a830c344ddc08a4c4f8f2e619178ac05ef582ea0293ab540308d/add-on-texel-density-checker-v2026.1.1.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.8","tagline":"Effortlessly rename multiple objects with this simple addon","archive_hash":"sha256:32fc435f6daf82feaa711e1b23c960575fbefce3ae99504ca12bcd4f0eb120b1","archive_size":53269,"archive_url":"https://extensions.blender.org/download/sha256:32fc435f6daf82feaa711e1b23c960575fbefce3ae99504ca12bcd4f0eb120b1/add-on-simple-renaming-panel-v2.1.8.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":"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.6","tagline":"Tools for baking material sequences and generating sprite sheets","archive_hash":"sha256:a1235d8ac5b3ae98668e53cf5759dd1ad88e21cc5baf9c7d8d41b9e9d0555a7a","archive_size":44148,"archive_url":"https://extensions.blender.org/download/sha256:a1235d8ac5b3ae98668e53cf5759dd1ad88e21cc5baf9c7d8d41b9e9d0555a7a/add-on-sequenced-bake-v1.1.6.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":"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.8","tagline":"Customize file output paths with placeholders","archive_hash":"sha256:5b4b0bb7278624c271076cf910845d2318911da34e55d680749d7f9a219fea8b","archive_size":22437,"archive_url":"https://extensions.blender.org/download/sha256:5b4b0bb7278624c271076cf910845d2318911da34e55d680749d7f9a219fea8b/add-on-custom-output-path-v1.1.8.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.56","tagline":"Add nodes faster with a pie menu","archive_hash":"sha256:83d6a7229c6b20e63ca22ed99596bda5de6b816c9859969391b2738ebad75d0c","archive_size":478543,"archive_url":"https://extensions.blender.org/download/sha256:83d6a7229c6b20e63ca22ed99596bda5de6b816c9859969391b2738ebad75d0c/add-on-nodepie-v1.2.56.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.3","tagline":"Quick batch automation of common material tasks","archive_hash":"sha256:0ce7e8589619d60da2d376ca67c651aa53ce2b1e441a3cefcb0a05eac8fabe25","archive_size":35713,"archive_url":"https://extensions.blender.org/download/sha256:0ce7e8589619d60da2d376ca67c651aa53ce2b1e441a3cefcb0a05eac8fabe25/add-on-matbatchtools-v2.3.3.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":"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":"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":"2.0.0","tagline":"Professional theme with more vivid colors","archive_hash":"sha256:17b2b8b1c25538d6d70ec064278629430a29bb8ac9d1ba6b9e8d2f70d5fd2fa5","archive_size":5719,"archive_url":"https://extensions.blender.org/download/sha256:17b2b8b1c25538d6d70ec064278629430a29bb8ac9d1ba6b9e8d2f70d5fd2fa5/theme-professional-plus-v2.0.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.2","tagline":"Improvements to Blender's Autosave","archive_hash":"sha256:294d6c544419e840d8927f6b88095b409afb2841753d2d9e8447bf8b4d724d4f","archive_size":75152,"archive_url":"https://extensions.blender.org/download/sha256:294d6c544419e840d8927f6b88095b409afb2841753d2d9e8447bf8b4d724d4f/add-on-incremental-auto-save-v1.1.2.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":"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.6.1","tagline":"Easy-to-use UI for human characters","archive_hash":"sha256:5eeaa91b524931988b3637048c30770d5b917c3fa310d9ad69f714c257a1594e","archive_size":544397,"archive_url":"https://extensions.blender.org/download/sha256:5eeaa91b524931988b3637048c30770d5b917c3fa310d9ad69f714c257a1594e/add-on-mustardui-v2026.6.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":"K-Tools: Sync | Lock Viewport","version":"2.8.1","tagline":"Sync or Lock multiple viewports at once in real-time","archive_hash":"sha256:160d9135c53d5d5150671ec07ae181eea86b38bec05246b88fce791e08322956","archive_size":64885,"archive_url":"https://extensions.blender.org/download/sha256:160d9135c53d5d5150671ec07ae181eea86b38bec05246b88fce791e08322956/add-on-k-tools-view-sync-v2.8.1.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":"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.13","tagline":"Utility tools for MMD model editing","archive_hash":"sha256:261cec171596c79fd204f39cc1227ffada3ced73626f27b5f915fd9dda619a69","archive_size":802456,"archive_url":"https://extensions.blender.org/download/sha256:261cec171596c79fd204f39cc1227ffada3ced73626f27b5f915fd9dda619a69/add-on-mmd-tools-v4.5.13.zip","type":"add-on","blender_version_min":"4.2.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":["Camera","Import-Export","Material","Mesh","Object","Physics"]},{"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":"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":"open_stage_blender_dmx","schema_version":"1.0.0","name":"DMX","version":"2.2.4","tagline":"Visualization & programming with GDTF&MVR","archive_hash":"sha256:96cd0cc92a446b37317170bbddd25bd6ec916c154ab3d3c9e14103fff8c79ce8","archive_size":2064675,"archive_url":"https://extensions.blender.org/download/sha256:96cd0cc92a446b37317170bbddd25bd6ec916c154ab3d3c9e14103fff8c79ce8/add-on-open-stage-blender-dmx-v2.2.4.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"}},{"id":"maze_generator","schema_version":"1.0.0","name":"Maze Generator","version":"0.3.1","tagline":"A Maze generator extension for Blender","archive_hash":"sha256:dd7cc3f38fb80df5ffafb6e3e70221469051bfcded84c78a784c320c0e3d15d1","archive_size":28418,"archive_url":"https://extensions.blender.org/download/sha256:dd7cc3f38fb80df5ffafb6e3e70221469051bfcded84c78a784c320c0e3d15d1/add-on-maze-generator-v0.3.1.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.3","tagline":"Super add-on for superfast booleans","archive_hash":"sha256:740c5b4965541f1e391be9d84a73aed98c28ae2e0b6a7db3a7f00f12c942661f","archive_size":48949,"archive_url":"https://extensions.blender.org/download/sha256:740c5b4965541f1e391be9d84a73aed98c28ae2e0b6a7db3a7f00f12c942661f/add-on-booltron-v3.3.3.zip","type":"add-on","blender_version_min":"4.5.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.3","tagline":"Just a little darker","archive_hash":"sha256:b5b0c094bcc136c5be57cf7cd413757cdc0e5673f865ab23574069dad94a5203","archive_size":5421,"archive_url":"https://extensions.blender.org/download/sha256:b5b0c094bcc136c5be57cf7cd413757cdc0e5673f865ab23574069dad94a5203/theme-dark-pro-v2.0.3.zip","type":"theme","blender_version_min":"5.0.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.23","tagline":"Rig Generation & Rigging Workflow Tools","archive_hash":"sha256:b735695f1df371f057b232d6304e73e774ebff4b36f6dfaa5d768e8e0159310b","archive_size":3464635,"archive_url":"https://extensions.blender.org/download/sha256:b735695f1df371f057b232d6304e73e774ebff4b36f6dfaa5d768e8e0159310b/add-on-cloudrig-v2.2.23.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.5","tagline":"Utilities for 3D printing","archive_hash":"sha256:0cb51b20599c3f69a2168e753b0e69c8577289ab198ae7c1498559f0e8d545c2","archive_size":148598,"archive_url":"https://extensions.blender.org/download/sha256:0cb51b20599c3f69a2168e753b0e69c8577289ab198ae7c1498559f0e8d545c2/add-on-print3d-toolbox-v1.3.5.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.5","tagline":"A comfortable medium dark theme for Blender","archive_hash":"sha256:a2c52a73fab56be425cd592f735d2909382ec53948b5da8b54f09e491870e7e6","archive_size":5595,"archive_url":"https://extensions.blender.org/download/sha256:a2c52a73fab56be425cd592f735d2909382ec53948b5da8b54f09e491870e7e6/theme-theme-deep-grey-v2.0.5.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.12.1","tagline":"Arrange node trees with one click","archive_hash":"sha256:ccce3db24525e89ab7c019a550bba1adbbe6bb5ccfc78a1957c484b8bd8d6c06","archive_size":1756301,"archive_url":"https://extensions.blender.org/download/sha256:ccce3db24525e89ab7c019a550bba1adbbe6bb5ccfc78a1957c484b8bd8d6c06/add-on-node-arrange-v1.12.1.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":"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":"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":"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":"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.5","tagline":"Extra tools for Grease Pencil","archive_hash":"sha256:31c799c76ca6fe883b56042b27b670ccaceab03294cd3f2d73292449ea95f287","archive_size":51990,"archive_url":"https://extensions.blender.org/download/sha256:31c799c76ca6fe883b56042b27b670ccaceab03294cd3f2d73292449ea95f287/add-on-grease-pencil-tools-v2.2.5.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":"AnimAll","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.4","tagline":"Various pie menus to speed up your workflow","archive_hash":"sha256:2120e0002b06ee0aac364cb4e300a852ac8b2dadcaa0657eccd82915e8d98d55","archive_size":128248,"archive_url":"https://extensions.blender.org/download/sha256:2120e0002b06ee0aac364cb4e300a852ac8b2dadcaa0657eccd82915e8d98d55/add-on-viewport-pie-menus-v1.7.4.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":"io_scene_max","schema_version":"1.0.0","name":"Import Autodesk MAX (.max)","version":"1.9.2","tagline":"Import 3DSMAX meshes & materials","archive_hash":"sha256:ae11b8903ca7fcab78cd1163305b80a268335894139f251a502da0476ef77b43","archive_size":92503,"archive_url":"https://extensions.blender.org/download/sha256:ae11b8903ca7fcab78cd1163305b80a268335894139f251a502da0476ef77b43/add-on-io-scene-max-v1.9.2.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.2.0","tagline":"Non-Destructive Modeling Toolkit","archive_hash":"sha256:71bc660afb8fb690e27389b7b729af6a5c1060833a8264f5c8cf52c034c7b411","archive_size":1137919,"archive_url":"https://extensions.blender.org/download/sha256:71bc660afb8fb690e27389b7b729af6a5c1060833a8264f5c8cf52c034c7b411/add-on-nd-v2.2.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":"Bagapie","schema_version":"1.0.0","name":"Bagapie","version":"11.0.10","tagline":"50+ tools : Scattering, Ivy Gen, Random Array, Architecture","archive_hash":"sha256:2e55574dcb37ca4a86e1942317906f769e269d382d6a82d0b1330cfb94707c9c","archive_size":10833751,"archive_url":"https://extensions.blender.org/download/sha256:2e55574dcb37ca4a86e1942317906f769e269d382d6a82d0b1330cfb94707c9c/add-on-bagapie-v11.0.10.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.8","tagline":"Layer based painting for Eevee and Cycles","archive_hash":"sha256:c81b5b3c80884e2ab402783d9f3432735d436e7eff9d189a8b9f14ac39169ccf","archive_size":2024427,"archive_url":"https://extensions.blender.org/download/sha256:c81b5b3c80884e2ab402783d9f3432735d436e7eff9d189a8b9f14ac39169ccf/add-on-ucupaint-v2.4.8.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"},"tags":["Node","Material","Paint","Bake"]},{"id":"Industrial_AOV_Connector","schema_version":"1.0.0","name":"Industrial AOV Connector","version":"5.2.0","tagline":"Auto generate outputs for advanced compositing","archive_hash":"sha256:dcb04683854b49d2eb1a7ba27fcd2210b9bea7c3e371acb807b6e4657b5ee719","archive_size":219657,"archive_url":"https://extensions.blender.org/download/sha256:dcb04683854b49d2eb1a7ba27fcd2210b9bea7c3e371acb807b6e4657b5ee719/add-on-industrial-aov-connector-v5.2.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.6","tagline":"Resize File Size Thumbnail on Browsers with Mouse Wheel","archive_hash":"sha256:d50bb8de1b5ef1b7a7b7f6567c2f15aec77c05d6fac04b443e5a2ff0107fbd94","archive_size":16676,"archive_url":"https://extensions.blender.org/download/sha256:d50bb8de1b5ef1b7a7b7f6567c2f15aec77c05d6fac04b443e5a2ff0107fbd94/add-on-browser-scroll-resize-v1.0.6.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.3.1","website":"https://extensions.blender.org/add-ons/browser-scroll-resize/","maintainer":"Barrunterio","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"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.8.0","tagline":"Manage your asset libraries with ease","archive_hash":"sha256:fa483ef8a9e8dbd128af4397851224104c67104b87d087f569cbbadf83c3a278","archive_size":11314,"archive_url":"https://extensions.blender.org/download/sha256:fa483ef8a9e8dbd128af4397851224104c67104b87d087f569cbbadf83c3a278/add-on-bulk-asset-tools-v1.8.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/bulk-asset-tools/","maintainer":"guitargeek","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Make changes to asset files"},"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.7","tagline":"Do not place your lights, paint them","archive_hash":"sha256:3f62befef3bfcd7e3be20e5a944020691058a53e56f478ad368c1e621ba6148a","archive_size":109546,"archive_url":"https://extensions.blender.org/download/sha256:3f62befef3bfcd7e3be20e5a944020691058a53e56f478ad368c1e621ba6148a/add-on-lightpainter-v1.5.7.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.51","tagline":"Context sensitive pie menu for a simple, fast workflow","archive_hash":"sha256:709e419e41eae0db0d6109ade42fe2220a9cbdefd5d7eed3462869fa76afc24e","archive_size":171087,"archive_url":"https://extensions.blender.org/download/sha256:709e419e41eae0db0d6109ade42fe2220a9cbdefd5d7eed3462869fa76afc24e/add-on-contextpie-v0.9.51.zip","type":"add-on","blender_version_min":"5.1.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":"stack_node","schema_version":"1.0.0","name":"Stack","version":"1.0.4","tagline":"Layer blending node with blend modes, opacity, and masking","archive_hash":"sha256:bbaf8b4918680251d8f2966addaea0ec8d46e0fa0a4b92dd44d79bc93f7d831f","archive_size":23737,"archive_url":"https://extensions.blender.org/download/sha256:bbaf8b4918680251d8f2966addaea0ec8d46e0fa0a4b92dd44d79bc93f7d831f/add-on-stack-node-v1.0.4.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/stack-node/","maintainer":"NXSTYNATE","license":["SPDX:GPL-3.0-or-later"],"tags":["Node"]},{"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":"NieR_Automata_UI","schema_version":"1.0.0","name":"NieR_Automata_UI","version":"1.2.8","tagline":"Glory to Mankind","archive_hash":"sha256:fc85867ec5ef396870f7598ad26fba7bd84150a36dea2c3e82d7da325844d3a2","archive_size":5835,"archive_url":"https://extensions.blender.org/download/sha256:fc85867ec5ef396870f7598ad26fba7bd84150a36dea2c3e82d7da325844d3a2/theme-nier-automata-ui-v1.2.8.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":"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":"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":"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":"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":"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":"polyzamboni","schema_version":"1.0.0","name":"PolyZamboni","version":"1.3.0","tagline":"Papercraft in Blender","archive_hash":"sha256:f4d212c2e647a4cd383cba3282181839d119998410a7fad205f853f6b95bffea","archive_size":20562069,"archive_url":"https://extensions.blender.org/download/sha256:f4d212c2e647a4cd383cba3282181839d119998410a7fad205f853f6b95bffea/add-on-polyzamboni-v1.3.0-windows-x64.zip","type":"add-on","blender_version_min":"5.1.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":"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.3","tagline":"import csv data to meshes in Blender","archive_hash":"sha256:f3f6b15df15381d0f7ba6a47f161b8552f6c850d5beda4e3471c5ae07a38812b","archive_size":53601988,"archive_url":"https://extensions.blender.org/download/sha256:f3f6b15df15381d0f7ba6a47f161b8552f6c850d5beda4e3471c5ae07a38812b/add-on-csv-importer-v0.2.3-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":"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":"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":"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":"flexytrack","schema_version":"1.0.0","name":"FlexyTrack","version":"1.0.1","tagline":"Physics-free Damped Track rigging for bone chains","archive_hash":"sha256:59e2ae09758d87f47e9cbb3287de30a0ddca3bde0566ba8db5820c6fd0e5bd8f","archive_size":4695,"archive_url":"https://extensions.blender.org/download/sha256:59e2ae09758d87f47e9cbb3287de30a0ddca3bde0566ba8db5820c6fd0e5bd8f/add-on-flexytrack-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/flexytrack/","maintainer":"MignotGeorges","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Rigging"]},{"id":"stop_motion_obj2","schema_version":"1.0.0","name":"OBJSequence","version":"1.0.5","tagline":"Import OBJ sequences as stop motion animation with caching","archive_hash":"sha256:37ca7d94886742f430f5ef0843d4138616544a2d3d4efe431040e2ff28a5de02","archive_size":10861,"archive_url":"https://extensions.blender.org/download/sha256:37ca7d94886742f430f5ef0843d4138616544a2d3d4efe431040e2ff28a5de02/add-on-stop-motion-obj2-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/stop-motion-obj2/","maintainer":"Liam-Courtney","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read OBJ files from folders chosen by the user"}},{"id":"nodesync","schema_version":"1.0.0","name":"NodeSync","version":"1.3.1","tagline":"Git version control for your Geometry and Shader node trees","archive_hash":"sha256:717968e8be00804c33eee501889793f44a8fe6d23f82407675705fae7b78bae0","archive_size":55449,"archive_url":"https://extensions.blender.org/download/sha256:717968e8be00804c33eee501889793f44a8fe6d23f82407675705fae7b78bae0/add-on-nodesync-v1.3.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nodesync/","maintainer":"Matias-1","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Write node trees to disk and manage a local Git repo","network":"Push and pull node trees to/from a user-supplied Git remote"},"tags":["Node"]},{"id":"target_weld","schema_version":"1.0.0","name":"Target Weld","version":"1.1.9","tagline":"Merge vertices and edges","archive_hash":"sha256:db11de4d3d5df2d93c1f3c57aad0ac60a5c07a013bc192d8dd1783ceeb066ca1","archive_size":38324,"archive_url":"https://extensions.blender.org/download/sha256:db11de4d3d5df2d93c1f3c57aad0ac60a5c07a013bc192d8dd1783ceeb066ca1/add-on-target-weld-v1.1.9.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/target-weld/","maintainer":"KewlSheet","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"vmc_link","schema_version":"1.0.0","name":"VMC Link","version":"0.3.1","tagline":"VMC receiver for armature and shape keys","archive_hash":"sha256:faa31295a7a0fd825b1203675f90fe10daeb4101ef0941708dfe07ed94bdb2bf","archive_size":55528,"archive_url":"https://extensions.blender.org/download/sha256:faa31295a7a0fd825b1203675f90fe10daeb4101ef0941708dfe07ed94bdb2bf/add-on-vmc-link-v0.3.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/vmc-link/","maintainer":"Internet-Addict","license":["SPDX:GPL-3.0-or-later"],"permissions":{"network":"Receive OSC / VMC motion data over UDP"},"tags":["System"]},{"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":"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":"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":"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_xnalara","schema_version":"1.0.0","name":"XPS Import/Export","version":"2.3.0","tagline":"Import-Export for XNALara/XPS files","archive_hash":"sha256:0e0197fcccb6a889f53fe48e7734cce58992766d5dded3c219495da76615702c","archive_size":173848,"archive_url":"https://extensions.blender.org/download/sha256:0e0197fcccb6a889f53fe48e7734cce58992766d5dded3c219495da76615702c/add-on-io-xnalara-v2.3.0.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":"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.1.0","tagline":"Import-export 3D models for the GZM game","archive_hash":"sha256:b37590a0769e21e94c2f461faa83e2e54cbe22de6d0a1d45e64f97cd3270b6e9","archive_size":26696,"archive_url":"https://extensions.blender.org/download/sha256:b37590a0769e21e94c2f461faa83e2e54cbe22de6d0a1d45e64f97cd3270b6e9/add-on-gzm-mod-v1.1.0.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":"2.2.1","tagline":"Render animations from multiple selected cameras","archive_hash":"sha256:13cf0fa7db66a4f29c64227622b6211f5d3816008b7aabf71b75e50893985832","archive_size":5224,"archive_url":"https://extensions.blender.org/download/sha256:13cf0fa7db66a4f29c64227622b6211f5d3816008b7aabf71b75e50893985832/add-on-batch-camera-render-v2.2.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.10","tagline":"Blur HDRI Images by creating a new node with a Gaussian Blur","archive_hash":"sha256:8b4ac375baefb660a055d517b0554bc94c6338cb02beeaf13e0993a12ccdc2da","archive_size":7813271,"archive_url":"https://extensions.blender.org/download/sha256:8b4ac375baefb660a055d517b0554bc94c6338cb02beeaf13e0993a12ccdc2da/add-on-blur-hdri-v0.0.10-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":"render_notifications_extension","schema_version":"1.0.0","name":"Render Notifications","version":"1.3.0","tagline":"Notifies you via Discord, desktop, or webhook on render events","archive_hash":"sha256:d434cf139c1797966ab6b7cd54181f46ab0b323f4f27995f2155260511985649","archive_size":5698228,"archive_url":"https://extensions.blender.org/download/sha256:d434cf139c1797966ab6b7cd54181f46ab0b323f4f27995f2155260511985649/add-on-render-notifications-extension-v1.3.0-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":"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":"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":"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.1","tagline":"Fit primitive shapes to verticies","archive_hash":"sha256:b435b06bca5fb8895246639d92d03f3f62adb71b4cb656b3a1e85a08b241be58","archive_size":10853,"archive_url":"https://extensions.blender.org/download/sha256:b435b06bca5fb8895246639d92d03f3f62adb71b4cb656b3a1e85a08b241be58/add-on-shapefitter-v1.3.1.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":"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":"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_Sort_Collections","schema_version":"1.0.0","name":"Auto Sort Collections","version":"1.0.3","tagline":"Automatic organisation of collections","archive_hash":"sha256:6bf044c291ef9e6c9c7fd0fe6eb56c93e9f6925b81adab32f96bbbfd999739fb","archive_size":10344,"archive_url":"https://extensions.blender.org/download/sha256:6bf044c291ef9e6c9c7fd0fe6eb56c93e9f6925b81adab32f96bbbfd999739fb/add-on-auto-sort-collections-v1.0.3.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":"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":"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":"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":"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":"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":"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":"frutigeraero_orange","schema_version":"1.0.0","name":"Frutiger Aero Orange","version":"1.1.0","tagline":"The future we we're promised","archive_hash":"sha256:d4b57d63ab707be3edadbaa4f1c459a811dfea9012846f2bcc53b4692f8aaa61","archive_size":6374,"archive_url":"https://extensions.blender.org/download/sha256:d4b57d63ab707be3edadbaa4f1c459a811dfea9012846f2bcc53b4692f8aaa61/theme-frutigeraero-orange-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/frutigeraero-orange/","maintainer":"Lightmare2000","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"blend_project_packer","schema_version":"1.0.0","name":"Blend Project Packer","version":"1.0.1","tagline":"Preflight and pack portable Blender projects","archive_hash":"sha256:31688f9ba88be0f22ac1828e148d889b1ed405078cea9345f8345db44c47394d","archive_size":152065,"archive_url":"https://extensions.blender.org/download/sha256:31688f9ba88be0f22ac1828e148d889b1ed405078cea9345f8345db44c47394d/add-on-blend-project-packer-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blend-project-packer/","maintainer":"JohnnyCake","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read scene assets and write portable folders or zip archives"},"tags":["Pipeline"]},{"id":"sculpting_planar_clo","schema_version":"1.0.0","name":"Planar Sculpting","version":"1.2.1","tagline":"Restores Classic Planar: Original Normal & Plane behavior","archive_hash":"sha256:6a056275993640de5422d8322304546ef23d8116d5c057e7a21ef9950f1d8578","archive_size":24699,"archive_url":"https://extensions.blender.org/download/sha256:6a056275993640de5422d8322304546ef23d8116d5c057e7a21ef9950f1d8578/add-on-sculpting-planar-clo-v1.2.1.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":"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":"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":"wfc_3d_generator","schema_version":"1.0.0","name":"WFC 3D Generator","version":"1.3.15","tagline":"Simple WFC 3D generator for procedural creation of objects","archive_hash":"sha256:f85fb64dee3a760872a6ef578fa5e7c2d31e27a68897ac6b8ff3418ec802c9b4","archive_size":71927,"archive_url":"https://extensions.blender.org/download/sha256:f85fb64dee3a760872a6ef578fa5e7c2d31e27a68897ac6b8ff3418ec802c9b4/add-on-wfc-3d-generator-v1.3.15.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":"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":"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":"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":"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":"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","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":"frutigeraero_green","schema_version":"1.0.0","name":"Frutiger Aero Green","version":"1.0.0","tagline":"The future we we're promised","archive_hash":"sha256:bd727fff80e17d0cb2b5bb7601db635ae9366f9455d1e337f3696708e7e7921c","archive_size":6419,"archive_url":"https://extensions.blender.org/download/sha256:bd727fff80e17d0cb2b5bb7601db635ae9366f9455d1e337f3696708e7e7921c/theme-frutigeraero-green-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/frutigeraero-green/","maintainer":"Lightmare2000","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"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":"hair_net","schema_version":"1.0.0","name":"Hair Net","version":"1.0.0","tagline":"Converts mesh and curves into particle hair","archive_hash":"sha256:69a746f4c1d8766103b21af13679b3ee843dcf1e0aa396223d40071701327f16","archive_size":67446,"archive_url":"https://extensions.blender.org/download/sha256:69a746f4c1d8766103b21af13679b3ee843dcf1e0aa396223d40071701327f16/add-on-hair-net-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/hair-net/","maintainer":"Holo_X","license":["SPDX:GPL-3.0-or-later"],"tags":["Physics","Pipeline"]},{"id":"image_remap","schema_version":"1.0.0","name":"Image Remap Canvas","version":"0.2.0","tagline":"Extract perspective regions into a GPU canvas","archive_hash":"sha256:dbeb268e2ff39e8324f3ba8c22d14261cae0210b74a7b29990f5b7ce221aa42d","archive_size":34853,"archive_url":"https://extensions.blender.org/download/sha256:dbeb268e2ff39e8324f3ba8c22d14261cae0210b74a7b29990f5b7ce221aa42d/add-on-image-remap-v0.2.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/image-remap/","maintainer":"atticuslv","license":["SPDX:GPL-3.0-or-later"]},{"id":"hardflow","schema_version":"1.0.0","name":"Hardflow","version":"1.21.0","tagline":"Open source hard surface boolean modeling toolkit","archive_hash":"sha256:7840aadec9d0e02b31f6143712b63d784f59ad121f8cd1581ebfecbbb8d2297f","archive_size":256552,"archive_url":"https://extensions.blender.org/download/sha256:7840aadec9d0e02b31f6143712b63d784f59ad121f8cd1581ebfecbbb8d2297f/add-on-hardflow-v1.21.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/hardflow/","maintainer":"ugulay","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh","Object"]},{"id":"img2cube","schema_version":"1.0.0","name":"img2cube","version":"1.0.6","tagline":"Camera-match a photo from drawn lines, then drop 3D snap points","archive_hash":"sha256:442a8134679e1dd8443f052503872df57ea0b07aefd5dbb24ae1be3756803ab6","archive_size":28044,"archive_url":"https://extensions.blender.org/download/sha256:442a8134679e1dd8443f052503872df57ea0b07aefd5dbb24ae1be3756803ab6/add-on-img2cube-v1.0.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/img2cube/","maintainer":"LongLiveTheCube","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Camera","Modeling"]},{"id":"keyboardandmousetracker","schema_version":"1.0.0","name":"Keyboard and mouse tracker","version":"1.0.2","tagline":"Keyboard & mouse tracker","archive_hash":"sha256:9d6ada5db978016212c57fd7e1d34b364353cc2e545dc11abce12f16d1f624ef","archive_size":3761,"archive_url":"https://extensions.blender.org/download/sha256:9d6ada5db978016212c57fd7e1d34b364353cc2e545dc11abce12f16d1f624ef/add-on-keyboardandmousetracker-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/keyboardandmousetracker/","maintainer":"Stefan2814","license":["SPDX:GPL-3.0-or-later"],"tags":["Geometry Nodes"]},{"id":"texture_pipeline_studio","schema_version":"1.0.0","name":"Texture Pipeline Studio","version":"8.10.1","tagline":"Assign PBR textures from resolution folders and swap LODs","archive_hash":"sha256:c7abbaca62008937992ff078943973450173e9137651a5662933d68a1f6c4471","archive_size":9087,"archive_url":"https://extensions.blender.org/download/sha256:c7abbaca62008937992ff078943973450173e9137651a5662933d68a1f6c4471/add-on-texture-pipeline-studio-v8.10.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/texture-pipeline-studio/","maintainer":"Gihan-Maddumage","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read PBR texture images from user-selected folders on disk"},"tags":["Material","Pipeline","Node"]},{"id":"cad2cube","schema_version":"1.0.0","name":"CAD2Cube — DXF Importer","version":"1.5.0","tagline":"Free DXF importer with layers, units and block instances","archive_hash":"sha256:60c32d9bfcc46fcaf9b415a82a793d8c1f4ac8fa3c98e380a74b9c18c3df6cb5","archive_size":2583424,"archive_url":"https://extensions.blender.org/download/sha256:60c32d9bfcc46fcaf9b415a82a793d8c1f4ac8fa3c98e380a74b9c18c3df6cb5/add-on-cad2cube-v1.5.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cad2cube/","maintainer":"LongLiveTheCube","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import DXF files from disk"},"tags":["Import-Export"]},{"id":"basic_cad_red","schema_version":"1.0.0","name":"Basic CAD - Red","version":"1.0.1","tagline":"A theme inspired by CAD programs","archive_hash":"sha256:87c05ed777a6c1fda4a4a1a7389b6d910c5339d934be62db38e1dfcf9deaa77b","archive_size":5926,"archive_url":"https://extensions.blender.org/download/sha256:87c05ed777a6c1fda4a4a1a7389b6d910c5339d934be62db38e1dfcf9deaa77b/theme-basic-cad-red-v1.0.1.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/basic-cad-red/","maintainer":"Bebo","license":["SPDX:GPL-3.0-or-later"]},{"id":"pcam_solver","schema_version":"1.0.0","name":"PCamSolver","version":"1.0.1","tagline":"Pseudo 3D camera and object solving from 2D movie clip tracks","archive_hash":"sha256:15d3e72d682dfa85ced946db6f356666aa7a3a06e0aa0742672975a1dc40b8f5","archive_size":45599,"archive_url":"https://extensions.blender.org/download/sha256:15d3e72d682dfa85ced946db6f356666aa7a3a06e0aa0742672975a1dc40b8f5/add-on-pcam-solver-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pcam-solver/","maintainer":"K_Naoki","license":["SPDX:GPL-3.0-or-later"],"tags":["Tracking","Camera"]},{"id":"arc_interface","schema_version":"1.0.0","name":"ARC Interface","version":"1.0.0","tagline":"Engineering inspired holographic interface","archive_hash":"sha256:6168eee8618fb27fa5f45354b6969da98124c9767010da25acb5dea929f48672","archive_size":6111,"archive_url":"https://extensions.blender.org/download/sha256:6168eee8618fb27fa5f45354b6969da98124c9767010da25acb5dea929f48672/theme-arc-interface-v1.0.0.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/arc-interface/","maintainer":"The_Iron_Maker","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Inspired By","Colorful"]},{"id":"plague_inc_cure_theme","schema_version":"1.0.0","name":"Plague Inc. - Cure Theme","version":"1.0.0","tagline":"Very blue theme","archive_hash":"sha256:6794e252932390d33e0f22bd7b4a31ac20e1f5971ee4fb8be375c6d4fb596bec","archive_size":6078,"archive_url":"https://extensions.blender.org/download/sha256:6794e252932390d33e0f22bd7b4a31ac20e1f5971ee4fb8be375c6d4fb596bec/theme-plague-inc-cure-theme-v1.0.0.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/plague-inc-cure-theme/","maintainer":"Bebo","license":["SPDX:GPL-3.0-or-later"]},{"id":"yaha","schema_version":"1.0.0","name":"Y.A.H.A","version":"1.0.1","tagline":"Yet Another HDRI Addon","archive_hash":"sha256:5ead7ec1c36e1e9e2dff9a49c69a5faa79a0aebef8df00d61fe8dddf0dcde027","archive_size":41767,"archive_url":"https://extensions.blender.org/download/sha256:5ead7ec1c36e1e9e2dff9a49c69a5faa79a0aebef8df00d61fe8dddf0dcde027/add-on-yaha-v1.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/yaha/","maintainer":"ArtinŌr","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Scan local folders to generate thumbnails and map environments"},"tags":["Lighting","Scene"]},{"id":"omi_physics_body_gltf_extension","schema_version":"1.0.0","name":"OMI Physics Body glTF Extension","version":"1.6.5","tagline":"Export primitive collision shapes from Blender to Godot via glTF","archive_hash":"sha256:6e343473b15e4b9d32f53cad59ffa42ca2347a8dfdc457da2cd94112acf1527b","archive_size":16883,"archive_url":"https://extensions.blender.org/download/sha256:6e343473b15e4b9d32f53cad59ffa42ca2347a8dfdc457da2cd94112acf1527b/add-on-omi-physics-body-gltf-extension-v1.6.5.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/omi-physics-body-gltf-extension/","maintainer":"ZycaR","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export glTF, GLB and Blender files from/to disk"},"tags":["Import-Export"]},{"id":"arch_generator","schema_version":"1.0.0","name":"Arch Generator","version":"1.0.1","tagline":"Generate procedural architectural arches, pillars and structures","archive_hash":"sha256:b0a902ee3c0ff7b5360c3056bc9a084ba8e9d9f94882f68151abffb8df5abb4c","archive_size":15104,"archive_url":"https://extensions.blender.org/download/sha256:b0a902ee3c0ff7b5360c3056bc9a084ba8e9d9f94882f68151abffb8df5abb4c/add-on-arch-generator-v1.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/arch-generator/","maintainer":"Aniruddhya-goswami","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Add Mesh"]},{"id":"exact_radius","schema_version":"1.0.0","name":"Exact Radius","version":"1.9.4","tagline":"Make selected vertex rings exact-radius circles, many at once","archive_hash":"sha256:f2c9ad957a7a3d408503649b9e559d0977dcc09ec2ef3f09dfc0cac2ef2dcd74","archive_size":25280,"archive_url":"https://extensions.blender.org/download/sha256:f2c9ad957a7a3d408503649b9e559d0977dcc09ec2ef3f09dfc0cac2ef2dcd74/add-on-exact-radius-v1.9.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/exact-radius/","maintainer":"Patrick-Tiefenbacher","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"helio","schema_version":"1.0.0","name":"Helio","version":"1.1.1","tagline":"Automatic lighting of the scene based on GPS, date and time","archive_hash":"sha256:a190743fc32fd7d3a1c4937b29405cf92fe717d2a3af8caa9b8928b1bc80f789","archive_size":431226,"archive_url":"https://extensions.blender.org/download/sha256:a190743fc32fd7d3a1c4937b29405cf92fe717d2a3af8caa9b8928b1bc80f789/add-on-helio-v1.1.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/helio/","maintainer":"Mikydosh","license":["SPDX:GPL-3.0-or-later"],"tags":["Lighting"]},{"id":"bay_area","schema_version":"1.0.0","name":"Bay Area","version":"1.0.0","tagline":"Red and gold theme for Blender 5","archive_hash":"sha256:64c54a905ead56013de315c78a5d0aff102aeeeffa0a846a8f293eb05c5285eb","archive_size":6539,"archive_url":"https://extensions.blender.org/download/sha256:64c54a905ead56013de315c78a5d0aff102aeeeffa0a846a8f293eb05c5285eb/theme-bay-area-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/bay-area/","maintainer":"WGX3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"sculpt_pose_sync","schema_version":"1.0.0","name":"Sculpt Pose Sync","version":"34.0.0","tagline":"Dual-window workflow for symmetrical posed model sculpting","archive_hash":"sha256:1189b58caee8a175176fb2d64ea034c77043c3d669de8d6748bd067268d2bd73","archive_size":9052,"archive_url":"https://extensions.blender.org/download/sha256:1189b58caee8a175176fb2d64ea034c77043c3d669de8d6748bd067268d2bd73/add-on-sculpt-pose-sync-v34.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sculpt-pose-sync/","maintainer":"mamenr","license":["SPDX:GPL-3.0-or-later"],"tags":["Sculpt"]},{"id":"refboard","schema_version":"1.0.0","name":"RefBoard","version":"1.5.2","tagline":"Arrange image references inside a dedicated node editor","archive_hash":"sha256:63e5ea6e313c58c5df1c575760256350310e93bcfe7a2b4d85744570026c1037","archive_size":3822996,"archive_url":"https://extensions.blender.org/download/sha256:63e5ea6e313c58c5df1c575760256350310e93bcfe7a2b4d85744570026c1037/add-on-refboard-v1.5.2-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/refboard/","maintainer":"MoseenkowAndrew","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load selected, dropped, or pasted images"},"platforms":["windows-x64"],"tags":["Node","User Interface"]},{"id":"node_exporter","schema_version":"1.0.0","name":"NodeExporter","version":"1.0.2","tagline":"Export node trees to a highly interactive HTML viewer","archive_hash":"sha256:406fd2baafbdb243d85ae258443657860e8c74fd60d0a218a0c16b865296b840","archive_size":20422,"archive_url":"https://extensions.blender.org/download/sha256:406fd2baafbdb243d85ae258443657860e8c74fd60d0a218a0c16b865296b840/add-on-node-exporter-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-exporter/","maintainer":"KrazyGFX","license":["SPDX:GPL-3.0-or-later"],"tags":["Node"]},{"id":"moldforge","schema_version":"1.0.0","name":"MoldForge","version":"0.25.6","tagline":"Generate printable silicone mold systems from a mesh","archive_hash":"sha256:2603c33c3672854823bfb3cf86b9253c1a344c1e5255828b3255eb011a82b172","archive_size":84081,"archive_url":"https://extensions.blender.org/download/sha256:2603c33c3672854823bfb3cf86b9253c1a344c1e5255828b3255eb011a82b172/add-on-moldforge-v0.25.6.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/moldforge/","maintainer":"Lyubomir-Todorov","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export the generated mold parts as STL files"},"tags":["Mesh","Modeling","Object"]},{"id":"black_acid","schema_version":"1.0.0","name":"Black Acid","version":"1.0.0","tagline":"Black and Neon Lime theme for Blender 5","archive_hash":"sha256:8d033728c864fff8f279bca2e415aedb37e65d1c39ed88a8033fbee23d2b7d3b","archive_size":6507,"archive_url":"https://extensions.blender.org/download/sha256:8d033728c864fff8f279bca2e415aedb37e65d1c39ed88a8033fbee23d2b7d3b/theme-black-acid-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/black-acid/","maintainer":"WGX3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"mjolnir","schema_version":"1.0.0","name":"Mjolnir","version":"1.0.0","tagline":"Military green and yellow theme for Blender 5","archive_hash":"sha256:5f93901db3a668b013365b29a35d1e5c87b991a15f8d58be62250ee63f9ed9cb","archive_size":6566,"archive_url":"https://extensions.blender.org/download/sha256:5f93901db3a668b013365b29a35d1e5c87b991a15f8d58be62250ee63f9ed9cb/theme-mjolnir-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/mjolnir/","maintainer":"WGX3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"unreal_viewport_navigation","schema_version":"1.0.0","name":"Unreal Viewport Navigation - WASD","version":"1.1.1","tagline":"Unreal-style RMB navigation with selectable movement keys","archive_hash":"sha256:877ce34f2da4a528ed1381459f4a72135ebb9807feb04d52f2266f1285e81aa9","archive_size":30777,"archive_url":"https://extensions.blender.org/download/sha256:877ce34f2da4a528ed1381459f4a72135ebb9807feb04d52f2266f1285e81aa9/add-on-unreal-viewport-navigation-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/unreal-viewport-navigation/","maintainer":"Matsm-Studio","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"blendguard","schema_version":"1.0.0","name":"BlendGuard","version":"0.5.1","tagline":"See what a .blend will auto-run before you trust it","archive_hash":"sha256:20afde00350dd33eef7dce1624ec064427666e697865b33a826987811f364601","archive_size":30741,"archive_url":"https://extensions.blender.org/download/sha256:20afde00350dd33eef7dce1624ec064427666e697865b33a826987811f364601/add-on-blendguard-v0.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blendguard/","maintainer":"Arthur-Dutra","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read user-selected .blend files to inspect for scripts"},"tags":["Pipeline","System"]},{"id":"frutigeraero_blue","schema_version":"1.0.0","name":"Frutiger Aero Blue","version":"1.1.0","tagline":"The future we we're promised","archive_hash":"sha256:835904ec8da7c340003c65e2551266868439819628d76afb20888a9be27f6657","archive_size":6357,"archive_url":"https://extensions.blender.org/download/sha256:835904ec8da7c340003c65e2551266868439819628d76afb20888a9be27f6657/theme-frutigeraero-blue-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/frutigeraero-blue/","maintainer":"Lightmare2000","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"novaskin_export","schema_version":"1.0.0","name":"NovaSkin Export","version":"1.3.0","tagline":"Export per-part UV/mask/illum/shadow for Minecraft skins","archive_hash":"sha256:5ef5eb9782a6dd6ff874fdade1eb216c5c3c23280efebf47248c725b1f68ecc6","archive_size":84349,"archive_url":"https://extensions.blender.org/download/sha256:5ef5eb9782a6dd6ff874fdade1eb216c5c3c23280efebf47248c725b1f68ecc6/add-on-novaskin-export-v1.3.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/novaskin-export/","maintainer":"Saviski","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Write the exported UV/mask/light files next to the .blend"},"tags":["Render","Pipeline"]},{"id":"prosit","schema_version":"1.0.0","name":"Prosit","version":"1.0.0","tagline":"Dark maroon and burnt orange theme for Blender 5","archive_hash":"sha256:fc1407e91787c03e8c2b6fea59d6302490a3c40b43e785c3574d7beb874e4c65","archive_size":6681,"archive_url":"https://extensions.blender.org/download/sha256:fc1407e91787c03e8c2b6fea59d6302490a3c40b43e785c3574d7beb874e4c65/theme-prosit-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/prosit/","maintainer":"WGX3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"scientia","schema_version":"1.0.0","name":"Scientia","version":"1.0.0","tagline":"Dark red theme for Blender 5","archive_hash":"sha256:f185e1642d7a13f8ba860cb0986c4f0f4088e54c01aa8b0dce9a8eb4468f8372","archive_size":6717,"archive_url":"https://extensions.blender.org/download/sha256:f185e1642d7a13f8ba860cb0986c4f0f4088e54c01aa8b0dce9a8eb4468f8372/theme-scientia-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/scientia/","maintainer":"WGX3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"camera_shift_sync","schema_version":"1.0.0","name":"Camera Shift Sync","version":"0.2.2","tagline":"Compose-preserving camera moves around a world-fixed target","archive_hash":"sha256:8b75bb5497577a1d0c7ac80c02841c726b14d684cab0058e216ededf9eed2fb6","archive_size":38104,"archive_url":"https://extensions.blender.org/download/sha256:8b75bb5497577a1d0c7ac80c02841c726b14d684cab0058e216ededf9eed2fb6/add-on-camera-shift-sync-v0.2.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/camera-shift-sync/","maintainer":"a2d4f3s1","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"green_viz","schema_version":"1.0.0","name":"Green Viz","version":"1.0.4","tagline":"Dark green theme for Blender 5","archive_hash":"sha256:264334a9bb72b7b0e7b4e309624981067ad303b9c5ffeb75fb3e681d7bad92cf","archive_size":6858,"archive_url":"https://extensions.blender.org/download/sha256:264334a9bb72b7b0e7b4e309624981067ad303b9c5ffeb75fb3e681d7bad92cf/theme-green-viz-v1.0.4.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/green-viz/","maintainer":"WGX3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"IMEBridge","schema_version":"1.0.0","name":"IMEBridge","version":"0.3.0","tagline":"Bridge native IME input into Blender text editing","archive_hash":"sha256:1459f18def25b75fb51718a98505a17f81e67aa36ed731ad0d07ed1a3e84e59c","archive_size":80971,"archive_url":"https://extensions.blender.org/download/sha256:1459f18def25b75fb51718a98505a17f81e67aa36ed731ad0d07ed1a3e84e59c/add-on-imebridge-v0.3.0-windows-x64-macos-arm64.zip","type":"add-on","blender_version_min":"5.0.0","blender_version_max":"5.3.0","website":"https://extensions.blender.org/add-ons/imebridge/","maintainer":"Suenkanwei","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64","macos-arm64"],"tags":["System","Text Editor","User Interface"]},{"id":"float_curve_css","schema_version":"1.0.0","name":"Float Curve CSS","version":"1.0.4","tagline":"Float Curve editing tools and Curve Profile to Float Curve","archive_hash":"sha256:24786037a42e779c64c6ad4abeb6c040abac518037fbe6fb4fb9b007ca60abc2","archive_size":11584,"archive_url":"https://extensions.blender.org/download/sha256:24786037a42e779c64c6ad4abeb6c040abac518037fbe6fb4fb9b007ca60abc2/add-on-float-curve-css-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/float-curve-css/","maintainer":"guillaume_bissieres","license":["SPDX:GPL-3.0-or-later"],"tags":["Node"]},{"id":"copy_pivot_from_active","schema_version":"1.0.0","name":"Copy Pivot From Active","version":"1.0.1","tagline":"Copy pivot offset from active mesh to other selected meshes","archive_hash":"sha256:ebce90935ee999756561ecca4290c45752d0910c789bf3a7ca5de47a9684a78e","archive_size":2334,"archive_url":"https://extensions.blender.org/download/sha256:ebce90935ee999756561ecca4290c45752d0910c789bf3a7ca5de47a9684a78e/add-on-copy-pivot-from-active-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/copy-pivot-from-active/","maintainer":"6cto","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"flat_uv_mapper","schema_version":"1.0.0","name":"Flat UV Mapper","version":"1.1.0","tagline":"CSG-style planar face UV mapping with tile, offset and rotation","archive_hash":"sha256:4b502bfe25ae0417e2f9e7af697d2f7a83cd9194963679eb32c64b3c62be6b84","archive_size":64686,"archive_url":"https://extensions.blender.org/download/sha256:4b502bfe25ae0417e2f9e7af697d2f7a83cd9194963679eb32c64b3c62be6b84/add-on-flat-uv-mapper-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/flat-uv-mapper/","maintainer":"schemann","license":["SPDX:GPL-3.0-or-later"],"tags":["UV"]},{"id":"aiming_helper","schema_version":"1.0.0","name":"Aiming Helper","version":"1.0.1","tagline":"A visual helper for aligning sights","archive_hash":"sha256:9f79716709ca52fbaa55d25b4f006986c9277f8e934f1a8cba938124ec01a967","archive_size":5173,"archive_url":"https://extensions.blender.org/download/sha256:9f79716709ca52fbaa55d25b4f006986c9277f8e934f1a8cba938124ec01a967/add-on-aiming-helper-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/aiming-helper/","maintainer":"Hartface","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"render_pipeline_async","schema_version":"1.0.0","name":"End-to-End Render Pipeline","version":"1.0.0","tagline":"Event-driven automated 3D rendering and VSE video compilation","archive_hash":"sha256:7b8ac050603eac01cea8e1257bb33bfec88488c454750679d1cf03777c57740f","archive_size":18297,"archive_url":"https://extensions.blender.org/download/sha256:7b8ac050603eac01cea8e1257bb33bfec88488c454750679d1cf03777c57740f/add-on-render-pipeline-async-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/render-pipeline-async/","maintainer":"impatient0","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Reads rendered frames and writes compiled video files"},"tags":["Sequencer","Animation","Render"]},{"id":"EyeZenNight","schema_version":"1.0.0","name":"Eye Zen Night","version":"1.0.1","tagline":"A relaxing theme for night work","archive_hash":"sha256:39f3c851847e6a9e0bb62410b12056e070bf69ab41e17b74ad095f0c1bddd3b2","archive_size":5977,"archive_url":"https://extensions.blender.org/download/sha256:39f3c851847e6a9e0bb62410b12056e070bf69ab41e17b74ad095f0c1bddd3b2/theme-eyezennight-v1.0.1.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/eyezennight/","maintainer":"Sekuora","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Print"]},{"id":"VDB_Theme","schema_version":"1.0.0","name":"VDB Theme","version":"1.0.3","tagline":"Dark yellow accent theme","archive_hash":"sha256:be09bb9b911cf8cb6702dd99118f6bf0b255b2f3919fa9ca39c41eed4f8887f1","archive_size":5383,"archive_url":"https://extensions.blender.org/download/sha256:be09bb9b911cf8cb6702dd99118f6bf0b255b2f3919fa9ca39c41eed4f8887f1/theme-vdb-theme-v1.0.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/vdb-theme/","maintainer":"Tibe-Van-den-Brande","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"marker_shortcuts","schema_version":"1.0.0","name":"Marker Shortcuts","version":"0.1.1","tagline":"Assign keyboard shortcuts to timeline markers","archive_hash":"sha256:3a0c19925ddb5cce77e3560617f5a3936a04f3c8c89e9dc5e839c71e3061e1c5","archive_size":8666,"archive_url":"https://extensions.blender.org/download/sha256:3a0c19925ddb5cce77e3560617f5a3936a04f3c8c89e9dc5e839c71e3061e1c5/add-on-marker-shortcuts-v0.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/marker-shortcuts/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Sequencer"]},{"id":"mandelbulb","schema_version":"1.0.0","name":"Mandelbulb Generator","version":"1.0.2","tagline":"Mandelbulb and Julia Fractal Generator","archive_hash":"sha256:c739e911c0a2362c3bde1ceeef932cbb19f6c024f6f8209fd172b04fd96a2d92","archive_size":8913,"archive_url":"https://extensions.blender.org/download/sha256:c739e911c0a2362c3bde1ceeef932cbb19f6c024f6f8209fd172b04fd96a2d92/add-on-mandelbulb-v1.0.2.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/mandelbulb/","maintainer":"Suussonic","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh","Modeling"]},{"id":"viewport_scalebar","schema_version":"1.0.0","name":"Viewport Scale Bar","version":"1.2.1","tagline":"Cartographic scale bar overlay for the 3D Viewport","archive_hash":"sha256:719ba03403b9eb44145459d39426ad8df1def7749053ea0cb441adefeee78d65","archive_size":9798,"archive_url":"https://extensions.blender.org/download/sha256:719ba03403b9eb44145459d39426ad8df1def7749053ea0cb441adefeee78d65/add-on-viewport-scalebar-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/viewport-scalebar/","maintainer":"Renee-13","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","User Interface"]},{"id":"io_bugsnax","schema_version":"1.0.0","name":"Bugsnax Cache Importer/Exporter","version":"1.0.1","tagline":"Import/Export Bugsnax .xcache, .objcache, .daecache","archive_hash":"sha256:9231de5a4a99a5a4bf955e494ecad4946b91be50ee3237e6b793bfb2a8c5670d","archive_size":93176,"archive_url":"https://extensions.blender.org/download/sha256:9231de5a4a99a5a4bf955e494ecad4946b91be50ee3237e6b793bfb2a8c5670d/add-on-io-bugsnax-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-bugsnax/","maintainer":"SaintBaron","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"backup_modifiers","schema_version":"1.0.0","name":"Backup Modifiers","version":"1.0.4","tagline":"Apply modifiers with a backup. Easily switch to backup object","archive_hash":"sha256:6671ec4cf396c6a47967d0fa9d14936c1a47fd8f92c978add3abd5b4df1c3709","archive_size":3118,"archive_url":"https://extensions.blender.org/download/sha256:6671ec4cf396c6a47967d0fa9d14936c1a47fd8f92c978add3abd5b4df1c3709/add-on-backup-modifiers-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/backup-modifiers/","maintainer":"R4V3N","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"dark_highlights","schema_version":"1.0.0","name":"CGDive Dark with Area Highlights","version":"1.0.0","tagline":"A standard Dark Theme with area highlights and better panel","archive_hash":"sha256:3d29709eff4497fa06d8679ca14cbb42a972c85cd8355618e7d58463f4bb16b2","archive_size":5611,"archive_url":"https://extensions.blender.org/download/sha256:3d29709eff4497fa06d8679ca14cbb42a972c85cd8355618e7d58463f4bb16b2/theme-dark-highlights-v1.0.0.zip","type":"theme","blender_version_min":"4.4.0","website":"https://extensions.blender.org/themes/dark-highlights/","maintainer":"Todor-CGDive","license":["SPDX:GPL-2.0-or-later"]},{"id":"nukxon_vr_exporter","schema_version":"1.0.0","name":"Nukxon VR Exporter","version":"1.2.1","tagline":"Render VR cubemap tours and export .nukxon packages","archive_hash":"sha256:9d1b0d0e0048d71aaa02377a8097d5172189cf4deb82cab209d73217de613509","archive_size":27069,"archive_url":"https://extensions.blender.org/download/sha256:9d1b0d0e0048d71aaa02377a8097d5172189cf4deb82cab209d73217de613509/add-on-nukxon-vr-exporter-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nukxon-vr-exporter/","maintainer":"Nukxon","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Write .nukxon export bundle to user-chosen output folder"},"tags":["Render","Import-Export"]},{"id":"io_lottie_export","schema_version":"1.0.0","name":"Lottie Export","version":"0.1.3","tagline":"Export Grease Pencil animation to Lottie JSON / dotLottie / TGS","archive_hash":"sha256:79a424817d6e190bf720c7d76b472d863943689a18899bcaf3b68a0da12c3cd2","archive_size":31309,"archive_url":"https://extensions.blender.org/download/sha256:79a424817d6e190bf720c7d76b472d863943689a18899bcaf3b68a0da12c3cd2/add-on-io-lottie-export-v0.1.3.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/io-lottie-export/","maintainer":"MultLabs","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"magic_wand","schema_version":"1.0.0","name":"Magic Wand","version":"0.0.4","tagline":"Topology-aware mesh selection","archive_hash":"sha256:e1888f95536d3e242e1f449a5fe6c7023df06469c8e27ebab353e8d3af71db8d","archive_size":15676,"archive_url":"https://extensions.blender.org/download/sha256:e1888f95536d3e242e1f449a5fe6c7023df06469c8e27ebab353e8d3af71db8d/add-on-magic-wand-v0.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/magic-wand/","maintainer":"Wiffzackius","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"dark_purple","schema_version":"1.0.0","name":"Dark Purple","version":"1.0.0","tagline":"Dark Purple gray style","archive_hash":"sha256:90289ec78324072453380e3446997ee1a8c3636d830a0bb4995532a883345796","archive_size":5323,"archive_url":"https://extensions.blender.org/download/sha256:90289ec78324072453380e3446997ee1a8c3636d830a0bb4995532a883345796/theme-dark-purple-v1.0.0.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/dark-purple/","maintainer":"wans7.gumroad.com","license":["SPDX:GPL-3.0-or-later"]},{"id":"local_view_manager","schema_version":"1.0.0","name":"Local View Manager","version":"2.1.0","tagline":"Remove, add and recover to Local View from Outliner and Viewport","archive_hash":"sha256:0a3c4804ad861ca989400ba0b45ab06e2ab512a2f5c3101dddbbd3652d7d1266","archive_size":7078,"archive_url":"https://extensions.blender.org/download/sha256:0a3c4804ad861ca989400ba0b45ab06e2ab512a2f5c3101dddbbd3652d7d1266/add-on-local-view-manager-v2.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/local-view-manager/","maintainer":"3DDinosaur","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"view_selected","schema_version":"1.0.0","name":"View Selected","version":"1.0.0","tagline":"Smart Selection View","archive_hash":"sha256:b6f6fa52bfb361fda7096424fabf5a58816dda0228fc0ffec6f3d54c2e4132ca","archive_size":4107,"archive_url":"https://extensions.blender.org/download/sha256:b6f6fa52bfb361fda7096424fabf5a58816dda0228fc0ffec6f3d54c2e4132ca/add-on-view-selected-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/view-selected/","maintainer":"wans7.gumroad.com","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"point_cloud_io","schema_version":"1.0.0","name":"Point Cloud I/O","version":"0.5.1","tagline":"Import and export E57, PLY, LAS, LAZ, PCD, XYZ, PTS files","archive_hash":"sha256:cdd313ea71b0c82ad66e06dcf659984cbad9567cbbad5fee78e948971cd61bc0","archive_size":22372470,"archive_url":"https://extensions.blender.org/download/sha256:cdd313ea71b0c82ad66e06dcf659984cbad9567cbbad5fee78e948971cd61bc0/add-on-point-cloud-io-v0.5.1.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/point-cloud-io/","maintainer":"StudioMedio","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and write point cloud files on disk"},"tags":["Import-Export"]},{"id":"frame_by_plane","schema_version":"1.0.0","name":"Frame By Plane","version":"6.1.1","tagline":"A better Image as Planes workflow for animation","archive_hash":"sha256:a399877c73d90c3af6ac74bbb28041160c17d495c45210ec1674111c836997cf","archive_size":8705695,"archive_url":"https://extensions.blender.org/download/sha256:a399877c73d90c3af6ac74bbb28041160c17d495c45210ec1674111c836997cf/add-on-frame-by-plane-v6.1.1-windows-x64.zip","type":"add-on","blender_version_min":"5.1.2","website":"https://extensions.blender.org/add-ons/frame-by-plane/","maintainer":"Alessandro-Pannoli","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read media and write layered/render cache files","clipboard":"Import media paths and copy diagnostic reports to the clipboard"},"platforms":["windows-x64"],"tags":["3D View","Animation"]},{"id":"slides_pro","schema_version":"1.0.0","name":"Slides","version":"1.6.2","tagline":"Create and play slide-based presentations in the 3D View","archive_hash":"sha256:7ac2d0fdf3e8c2c5b3f96df9aa0d9c5f24cc5ec965d060f756a52b7a339ebbf9","archive_size":10301,"archive_url":"https://extensions.blender.org/download/sha256:7ac2d0fdf3e8c2c5b3f96df9aa0d9c5f24cc5ec965d060f756a52b7a339ebbf9/add-on-slides-pro-v1.6.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/slides-pro/","maintainer":"Alessandro-Pannoli","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"quicksnap","schema_version":"1.0.0","name":"QuickSnap","version":"1.5.1","tagline":"Quickly snap objects/vertices/curve points","archive_hash":"sha256:8fe5d7c52ccc682be2b67cd44caf38a655fa2d98edee341ae415a37083b22f25","archive_size":80845,"archive_url":"https://extensions.blender.org/download/sha256:8fe5d7c52ccc682be2b67cd44caf38a655fa2d98edee341ae415a37083b22f25/add-on-quicksnap-v1.5.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/quicksnap/","maintainer":"julienh","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Object"]},{"id":"Classic_But_Modern","schema_version":"1.0.0","name":"ClassicButModern","version":"1.0.0","tagline":"A Blender theme inspired by 2.8x releases of Blender","archive_hash":"sha256:85d552cb420bbee1c93c74cff3db87746783785d2d59d1ff9b9a06c622a54907","archive_size":5393,"archive_url":"https://extensions.blender.org/download/sha256:85d552cb420bbee1c93c74cff3db87746783785d2d59d1ff9b9a06c622a54907/theme-classic-but-modern-v1.0.0.zip","type":"theme","blender_version_min":"5.1.0","website":"https://extensions.blender.org/themes/classic-but-modern/","maintainer":"Neon-Hat","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"dji_proxy_switcher","schema_version":"1.0.0","name":"DJI Proxy Switcher","version":"2.1.1","tagline":"Replace LRF proxies with full-res MP4s instantly","archive_hash":"sha256:428feec54a98293aadfe5345a8d2a8905502f922d9696a268ab4900492916301","archive_size":2987,"archive_url":"https://extensions.blender.org/download/sha256:428feec54a98293aadfe5345a8d2a8905502f922d9696a268ab4900492916301/add-on-dji-proxy-switcher-v2.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dji-proxy-switcher/","maintainer":"aflynneastwood","license":["SPDX:GPL-3.0-or-later"],"tags":["Sequencer"]},{"id":"siemen_lens_blender_autoaov","schema_version":"1.0.0","name":"AutoAOV","version":"2.1.3","tagline":"Automatically create an AOV structure for exporting","archive_hash":"sha256:13a022df1d9d398622ca5b592b8519de515481c863e7f47f8dbba9f19b70bd45","archive_size":14256,"archive_url":"https://extensions.blender.org/download/sha256:13a022df1d9d398622ca5b592b8519de515481c863e7f47f8dbba9f19b70bd45/add-on-siemen-lens-blender-autoaov-v2.1.3.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/siemen-lens-blender-autoaov/","maintainer":"Siemen-Lens","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Uses Files permission to create folders and export camera"},"tags":["Render","Compositing","Node","Pipeline","Lighting"]},{"id":"Lightsaber_VFX","schema_version":"1.0.0","name":"Lightsaber VFX","version":"1.0.2","tagline":"Super simple lightsaber VFX setup for Blender","archive_hash":"sha256:c36b38b4f94b420f67e2ab73c7807babf3529fac3e4cf90abc1ee480faf12267","archive_size":52312,"archive_url":"https://extensions.blender.org/download/sha256:c36b38b4f94b420f67e2ab73c7807babf3529fac3e4cf90abc1ee480faf12267/add-on-lightsaber-vfx-v1.0.2.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/lightsaber-vfx/","maintainer":"Will-Hadfield-1","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write lightsaber preset files in user data folder"},"tags":["Compositing"]},{"id":"wittyming_color_palette","schema_version":"1.0.0","name":"Color Palette","version":"1.2.3","tagline":"Record and drag material node colors in the Shader Editor","archive_hash":"sha256:075775b465c832602804c7d3826a01b36d1207718105173260f73e6488f86454","archive_size":371079,"archive_url":"https://extensions.blender.org/download/sha256:075775b465c832602804c7d3826a01b36d1207718105173260f73e6488f86454/add-on-wittyming-color-palette-v1.2.3.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/wittyming-color-palette/","maintainer":"MingWitty","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","User Interface"]},{"id":"h4rb_scene_director","schema_version":"1.0.0","name":"Scene Director","version":"0.9.5","tagline":"Lighting, world, compositor layers and render planning","archive_hash":"sha256:9160866914a383bbe638718218394c88a76b12826cefcbc4db10ef279b8c3a70","archive_size":79029,"archive_url":"https://extensions.blender.org/download/sha256:9160866914a383bbe638718218394c88a76b12826cefcbc4db10ef279b8c3a70/add-on-h4rb-scene-director-v0.9.5.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/h4rb-scene-director/","maintainer":"Melih-Kayaci","license":["SPDX:GPL-3.0-or-later"],"tags":["Scene","Lighting","Compositing","Render"]},{"id":"theme_dictionary","schema_version":"1.0.0","name":"theme dictionary","version":"0.6.4","tagline":"theme recolor plugin that retrieves relevant options","archive_hash":"sha256:a6a4de727343fac8370d117afc7326501019f19ef7058e10c7971ce9e4d9271e","archive_size":43319,"archive_url":"https://extensions.blender.org/download/sha256:a6a4de727343fac8370d117afc7326501019f19ef7058e10c7971ce9e4d9271e/add-on-theme-dictionary-v0.6.4.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/theme-dictionary/","maintainer":"61+","license":["SPDX:GPL-3.0-or-later"],"tags":["System"]},{"id":"vodi_white","schema_version":"1.0.0","name":"vodi white","version":"0.6.3","tagline":"Ice-feeling elegant white theme, simple and clean","archive_hash":"sha256:4d8cf55af97525b5fcbc10f2afe16f7bebfd6c740c1397b80d68d59f21beb9e2","archive_size":5256,"archive_url":"https://extensions.blender.org/download/sha256:4d8cf55af97525b5fcbc10f2afe16f7bebfd6c740c1397b80d68d59f21beb9e2/theme-vodi-white-v0.6.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/vodi-white/","maintainer":"61+","license":["SPDX:GPL-2.0-or-later"],"tags":["Light","Inspired By"]},{"id":"EVA_Unit_01","schema_version":"1.0.0","name":"EVA UNIT 01","version":"1.0.0","tagline":"Color theme inspired by Evangelion Unit-01 purple/green palette","archive_hash":"sha256:65ba4e362eae0a511cae31d10f0b2b587075a9f9d3b8f56005d399f885b7cd5a","archive_size":5944,"archive_url":"https://extensions.blender.org/download/sha256:65ba4e362eae0a511cae31d10f0b2b587075a9f9d3b8f56005d399f885b7cd5a/theme-eva-unit-01-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/eva-unit-01/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"boardtyper_3d","schema_version":"1.0.0","name":"Boardtyper 3D","version":"1.0.1","tagline":"Export Blender models to Tabletop Simulator JSON","archive_hash":"sha256:c11cbe753a7adb9a9274419e1eec0422492b24a1425d279b664a537a4fea7c04","archive_size":7316,"archive_url":"https://extensions.blender.org/download/sha256:c11cbe753a7adb9a9274419e1eec0422492b24a1425d279b664a537a4fea7c04/add-on-boardtyper-3d-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/boardtyper-3d/","maintainer":"Skarmuse","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export OBJ and JSON files to the local drive"},"tags":["Import-Export","Game Engine"]},{"id":"CryptoMatte_ID_Color","schema_version":"1.0.0","name":"CryptoMatte ID Color","version":"1.0.4","tagline":"Generate real time ID color compositor nodes using Cryptomatte","archive_hash":"sha256:10db2d4d2bfd31347770ccf8cb1a87e7dc7354cde610931f2e9a93a9c7618d26","archive_size":7710,"archive_url":"https://extensions.blender.org/download/sha256:10db2d4d2bfd31347770ccf8cb1a87e7dc7354cde610931f2e9a93a9c7618d26/add-on-cryptomatte-id-color-v1.0.4.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/cryptomatte-id-color/","maintainer":"61+","license":["SPDX:GPL-3.0-or-later"],"tags":["Compositing"]},{"id":"looking_glass_display_simulator","schema_version":"1.0.0","name":"Looking Glass Display Simulator","version":"1.0.0","tagline":"Simulate Looking Glass displays, create compatible quilts","archive_hash":"sha256:5df5a7704708f42ac229774678869b6c5876166e3f23357c3f1852fb26e0e2b2","archive_size":39179,"archive_url":"https://extensions.blender.org/download/sha256:5df5a7704708f42ac229774678869b6c5876166e3f23357c3f1852fb26e0e2b2/add-on-looking-glass-display-simulator-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/looking-glass-display-simulator/","maintainer":"Lukas-Vincenc","license":["SPDX:GPL-3.0-or-later"]},{"id":"copy_relative_transform","schema_version":"1.0.0","name":"Copy Relative Transform","version":"0.1.0","tagline":"Copy & paste transforms relative to the view or an object","archive_hash":"sha256:974552489bff1d37969269302e28019e18e930f703e902cc785552ea6b292e54","archive_size":3565,"archive_url":"https://extensions.blender.org/download/sha256:974552489bff1d37969269302e28019e18e930f703e902cc785552ea6b292e54/add-on-copy-relative-transform-v0.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/copy-relative-transform/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"jk3da_theme","schema_version":"1.0.0","name":"JK3DA Theme","version":"1.2.0","tagline":"Dark warm Blender theme with orange accent","archive_hash":"sha256:a4a6fd78e17a7f94988eeddf77b4eb134b9f9cfa091f1feb1798a3ee545ef4c9","archive_size":5512,"archive_url":"https://extensions.blender.org/download/sha256:a4a6fd78e17a7f94988eeddf77b4eb134b9f9cfa091f1feb1798a3ee545ef4c9/theme-jk3da-theme-v1.2.0.zip","type":"theme","blender_version_min":"5.1.0","website":"https://extensions.blender.org/themes/jk3da-theme/","maintainer":"Jonas-Kircher","license":["SPDX:GPL-3.0-or-later"]},{"id":"festivity_flow","schema_version":"1.0.0","name":"Flow","version":"1.3.2","tagline":"One-click procedural wavy bone chain animation","archive_hash":"sha256:393cf29b50cbfa7dfcce828789054525e010b1e86b81c19519205a5f53a032bb","archive_size":30629,"archive_url":"https://extensions.blender.org/download/sha256:393cf29b50cbfa7dfcce828789054525e010b1e86b81c19519205a5f53a032bb/add-on-festivity-flow-v1.3.2.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/festivity-flow/","maintainer":"festivity","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and write preset files in the user scripts directory"},"tags":["Animation"]},{"id":"Dark_Comic_Theme","schema_version":"1.0.0","name":"Dark_Comic_Theme","version":"1.0.8","tagline":"Propaganda Poster","archive_hash":"sha256:85441c4767141198a6f32b3bcd389f489ec0d58a2d6e41fc1501f0f730a95fc0","archive_size":5788,"archive_url":"https://extensions.blender.org/download/sha256:85441c4767141198a6f32b3bcd389f489ec0d58a2d6e41fc1501f0f730a95fc0/theme-dark-comic-theme-v1.0.8.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/dark-comic-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"speedzone","schema_version":"1.0.0","name":"SPEEDZONE","version":"1.2.0","tagline":"Create or Rescale Paths for Realistic Car Speeds","archive_hash":"sha256:4bb9950452578c1e7e33f7bb77bd534fd2f0c9fdabba7e0459429abd2ff471e0","archive_size":4092,"archive_url":"https://extensions.blender.org/download/sha256:4bb9950452578c1e7e33f7bb77bd534fd2f0c9fdabba7e0459429abd2ff471e0/add-on-speedzone-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/speedzone/","maintainer":"KGD","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save and load path data"},"tags":["Animation"]},{"id":"K3D_UV_Islands_Keeper","schema_version":"1.0.0","name":"K3D UV Islands Keeper","version":"1.1.2","tagline":"Multi-slot memory for UV island selections and transformations","archive_hash":"sha256:ff57d0839efc1c77fc4f2a7645ec37ffdcfb3a44ad0a2806200058506b8b421a","archive_size":3922,"archive_url":"https://extensions.blender.org/download/sha256:ff57d0839efc1c77fc4f2a7645ec37ffdcfb3a44ad0a2806200058506b8b421a/add-on-k3d-uv-islands-keeper-v1.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/k3d-uv-islands-keeper/","maintainer":"Manuel-SEILHES","license":["SPDX:GPL-3.0-or-later"]},{"id":"batchforge_batch_export","schema_version":"1.0.0","name":"BatchForge: Batch Export Tool","version":"2.8.0","tagline":"Batch export with origin control & multi-format support","archive_hash":"sha256:aeb59665434ea614b906fd2a2d950a8f6b0c5e42e99ca373c00aba01d1eedff8","archive_size":9967,"archive_url":"https://extensions.blender.org/download/sha256:aeb59665434ea614b906fd2a2d950a8f6b0c5e42e99ca373c00aba01d1eedff8/add-on-batchforge-batch-export-v2.8.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/batchforge-batch-export/","maintainer":"mabaci","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Addon saves and loads files from disk"},"tags":["Import-Export"]},{"id":"deus_ex_md","schema_version":"1.0.0","name":"Deus Ex MD Theme","version":"1.0.0","tagline":"Inspired by Deus Ex HR/MD","archive_hash":"sha256:91d3fc0d5cd78cf2c3830e89789ce9b3d5a4793e1bbbca18e463b0f4635dfee5","archive_size":6032,"archive_url":"https://extensions.blender.org/download/sha256:91d3fc0d5cd78cf2c3830e89789ce9b3d5a4793e1bbbca18e463b0f4635dfee5/theme-deus-ex-md-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/deus-ex-md/","maintainer":"Andrei-Khrutskii","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"a3da_parser","schema_version":"1.0.0","name":"A3DA Parser","version":"1.0.21","tagline":"Import & export Project Diva A3DA animation files","archive_hash":"sha256:12b64807b1b2e96cc43d163e85f564d5cb20e811dc6ef72be6816b52f069de5c","archive_size":167740,"archive_url":"https://extensions.blender.org/download/sha256:12b64807b1b2e96cc43d163e85f564d5cb20e811dc6ef72be6816b52f069de5c/add-on-a3da-parser-v1.0.21.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/a3da-parser/","maintainer":"Hans_Xwh","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import and export Project Diva A3DA animation files"},"tags":["Import-Export"]},{"id":"sprite_sheet_generator","schema_version":"1.0.0","name":"Sprite Sheet Generator","version":"2.2.3","tagline":"Generate sprite sheets from animations with armature rotation","archive_hash":"sha256:21398e86234dc9672dca0d00881bd9d57a1a0f17d7d8444159e764d653c87474","archive_size":10668,"archive_url":"https://extensions.blender.org/download/sha256:21398e86234dc9672dca0d00881bd9d57a1a0f17d7d8444159e764d653c87474/add-on-sprite-sheet-generator-v2.2.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sprite-sheet-generator/","maintainer":"mabaci","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Addon saves and loads files from disk"},"tags":["Render","Pipeline","Game Engine"]},{"id":"attribute_baker","schema_version":"1.0.0","name":"Attribute Baker","version":"1.0.2","tagline":"Bake Geometry Nodes attributes to image textures via UV map","archive_hash":"sha256:6fa6d62b875b0270543d73992759dece3db2f156bc7b44b6ba4494154e71068d","archive_size":6945,"archive_url":"https://extensions.blender.org/download/sha256:6fa6d62b875b0270543d73992759dece3db2f156bc7b44b6ba4494154e71068d/add-on-attribute-baker-v1.0.2.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/attribute-baker/","maintainer":"ibotpl","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Saves baked images to the chosen output folder on disk"},"tags":["Render","UV","Geometry Nodes"]},{"id":"keychain_builder","schema_version":"1.0.0","name":"Keychain Builder","version":"1.1.3","tagline":"Generate 3D-printable keychains from text in one click","archive_hash":"sha256:52b1b204d589eef3de37b3cac7cfe1ace0c695d490cc14a37bf484b8f0041e38","archive_size":8317,"archive_url":"https://extensions.blender.org/download/sha256:52b1b204d589eef3de37b3cac7cfe1ace0c695d490cc14a37bf484b8f0041e38/add-on-keychain-builder-v1.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/keychain-builder/","maintainer":"Sergey-Kabanov","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh"]},{"id":"batch_asset_placer","schema_version":"1.0.0","name":"Batch Asset Placer","version":"1.0.1","tagline":"Adds selected assets from Asset Browser to 3D cursor","archive_hash":"sha256:9954ef60d304dd0d8f2a66ac1bf4ddb1a3ab56b7fe68b5c86c969df9cbba2126","archive_size":5307,"archive_url":"https://extensions.blender.org/download/sha256:9954ef60d304dd0d8f2a66ac1bf4ddb1a3ab56b7fe68b5c86c969df9cbba2126/add-on-batch-asset-placer-v1.0.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/batch-asset-placer/","maintainer":"Andrey-Pestryakov","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"SimplyLoopy","schema_version":"1.0.0","name":"Simply Loopy","version":"1.2.0-G","tagline":"Simplify a mesh through edge loop collapse","archive_hash":"sha256:1f1e2ebf0343483d112f67612e98e69203ed23aaba1fe2a94ab81ef6b629180d","archive_size":16610,"archive_url":"https://extensions.blender.org/download/sha256:1f1e2ebf0343483d112f67612e98e69203ed23aaba1fe2a94ab81ef6b629180d/add-on-simplyloopy-v1.2.0-G.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/simplyloopy/","maintainer":"Memm","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"import_e57","schema_version":"1.0.0","name":"E57 Point Cloud Importer","version":"1.0.1","tagline":"Import E57 point clouds natively","archive_hash":"sha256:dc45109fde3911c1331aabd40a6a62e5e05bf323ac6c223e1c741afa707d9bb5","archive_size":1147241,"archive_url":"https://extensions.blender.org/download/sha256:dc45109fde3911c1331aabd40a6a62e5e05bf323ac6c223e1c741afa707d9bb5/add-on-import-e57-v1.0.1-windows-x64.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/import-e57/","maintainer":"Quentin-Misslin","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"]},{"id":"Theme_Tamer","schema_version":"1.0.0","name":"Theme Tamer","version":"3.3.3","tagline":"Search, auto-group and batch-edit theme properties","archive_hash":"sha256:5d78c1b729767f6ab47f57afb2bd6a2ba4a086d1303fe15270a3071515c3d4b5","archive_size":24177,"archive_url":"https://extensions.blender.org/download/sha256:5d78c1b729767f6ab47f57afb2bd6a2ba4a086d1303fe15270a3071515c3d4b5/add-on-theme-tamer-v3.3.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/theme-tamer/","maintainer":"3DDinosaur","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"copy_to_autograph","schema_version":"1.0.0","name":"Copy to Autograph","version":"0.1.0","tagline":"Copy selected objects to clipboard in Autograph format (JSON)","archive_hash":"sha256:f897b6193f5cce483f7a68dee13c1e8beaf7b33dd895f5fe5215df6228c2d05e","archive_size":5444,"archive_url":"https://extensions.blender.org/download/sha256:f897b6193f5cce483f7a68dee13c1e8beaf7b33dd895f5fe5215df6228c2d05e/add-on-copy-to-autograph-v0.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/copy-to-autograph/","maintainer":"SergeyMetelskiy","license":["SPDX:GPL-3.0-or-later"],"permissions":{"clipboard":"Copying JSON formated data to clipboard"},"tags":["Import-Export"]},{"id":"Vikings_Midnight_Round_Theme","schema_version":"1.0.0","name":"Viking's Midnight Round","version":"1.1.0","tagline":"Original theme by Liam , ported by me","archive_hash":"sha256:49e1cb379125e47de200a96475f72734de11ba6bd034d3b4732a546b0349b38b","archive_size":5586,"archive_url":"https://extensions.blender.org/download/sha256:49e1cb379125e47de200a96475f72734de11ba6bd034d3b4732a546b0349b38b/theme-vikings-midnight-round-theme-v1.1.0.zip","type":"theme","blender_version_min":"5.1.1","website":"https://extensions.blender.org/themes/vikings-midnight-round-theme/","maintainer":"IyeViking","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"themeable_local_view","schema_version":"1.0.0","name":"Themeable Modes and Views","version":"0.2.0","tagline":"Themeable visual clues for modes, Local View and more","archive_hash":"sha256:dbdf37ca8cc3d3c4623fa2ee0d42b6fa566fb436895a8fcdb3f9dd6de6fc49c6","archive_size":6894,"archive_url":"https://extensions.blender.org/download/sha256:dbdf37ca8cc3d3c4623fa2ee0d42b6fa566fb436895a8fcdb3f9dd6de6fc49c6/add-on-themeable-local-view-v0.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/themeable-local-view/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"y2k_futurism_theme","schema_version":"1.0.0","name":"Y2K Futurism Theme","version":"1.0.0","tagline":"A futuristic early-2000s inspired Blender UI theme","archive_hash":"sha256:99ab2d20ee9a5dc52bb6e80c9546b03f9fb3bc9cb286e6e51f04bd8da21fb6cb","archive_size":6450,"archive_url":"https://extensions.blender.org/download/sha256:99ab2d20ee9a5dc52bb6e80c9546b03f9fb3bc9cb286e6e51f04bd8da21fb6cb/theme-y2k-futurism-theme-v1.0.0.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/y2k-futurism-theme/","maintainer":"Igor-S-G-Barros","license":["SPDX:GPL-3.0-or-later"],"tags":["Colorful","Inspired By"]},{"id":"pixelsync_porter","schema_version":"1.0.0","name":"PixelSync Porter","version":"2.4.0","tagline":"Professional synchronization bridge for Blender settings","archive_hash":"sha256:0f54de5bfc110d08ca65297909936029ff09419d6f4eee5467803136a24193b9","archive_size":18724,"archive_url":"https://extensions.blender.org/download/sha256:0f54de5bfc110d08ca65297909936029ff09419d6f4eee5467803136a24193b9/add-on-pixelsync-porter-v2.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pixelsync-porter/","maintainer":"CYBER-KING","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write config files for exporting and importing settings"}},{"id":"unity_rig","schema_version":"1.0.0","name":"Unity Rig","version":"1.0.2","tagline":"Create Unity Humanoid-compatible rigs and convert Rigify rigs","archive_hash":"sha256:2c590237c1a824d5f8dafacf294fbb3bff8bea19ed2af3f32c39aee3233ea64f","archive_size":28072,"archive_url":"https://extensions.blender.org/download/sha256:2c590237c1a824d5f8dafacf294fbb3bff8bea19ed2af3f32c39aee3233ea64f/add-on-unity-rig-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/unity-rig/","maintainer":"nixkuroi","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Import-Export"]},{"id":"Mocha_Latte_Theme","schema_version":"1.0.0","name":"Mocha_Latte_Theme","version":"1.0.2","tagline":"Leafy Creamy","archive_hash":"sha256:77112a9b7350a1700b11f45c3c21c44bd3a86f8e97095760fe037ccedb1f5de3","archive_size":5835,"archive_url":"https://extensions.blender.org/download/sha256:77112a9b7350a1700b11f45c3c21c44bd3a86f8e97095760fe037ccedb1f5de3/theme-mocha-latte-theme-v1.0.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/mocha-latte-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Light","Colorful"]},{"id":"import_gdsii","schema_version":"1.0.0","name":"GDSII Importer","version":"1.0.3","tagline":"GDSII importer with PDK layer stack support","archive_hash":"sha256:c9252550b3ba7b0b8b3098d58976942ff01e354371d047f9cfc2d10e35edafc1","archive_size":28877884,"archive_url":"https://extensions.blender.org/download/sha256:c9252550b3ba7b0b8b3098d58976942ff01e354371d047f9cfc2d10e35edafc1/add-on-import-gdsii-v1.0.3-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/import-gdsii/","maintainer":"dnltz","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Import-Export"]},{"id":"unit_to_pixel_converter","schema_version":"1.0.0","name":"Unit to pixel converter","version":"1.3.2","tagline":"Calculates render resolution from different measurement units","archive_hash":"sha256:6a7b6766d96781a1f04cef893f363b3123ced4da2c76a929280720ecb499b77b","archive_size":16645,"archive_url":"https://extensions.blender.org/download/sha256:6a7b6766d96781a1f04cef893f363b3123ced4da2c76a929280720ecb499b77b/add-on-unit-to-pixel-converter-v1.3.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/unit-to-pixel-converter/","maintainer":"Viktor-Kamp","license":["SPDX:GPL-3.0-or-later"],"tags":["Render"]},{"id":"backdrop","schema_version":"1.0.0","name":"Backdrop","version":"3.5.0","tagline":"One click cyclorama","archive_hash":"sha256:593ae94195410a7345274ed42ab3216fcfb81983eea2fe96b24fd24c1db78595","archive_size":2739,"archive_url":"https://extensions.blender.org/download/sha256:593ae94195410a7345274ed42ab3216fcfb81983eea2fe96b24fd24c1db78595/add-on-backdrop-v3.5.0.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/backdrop/","maintainer":"Muzammil-Halimov","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh"]},{"id":"edgeflowdraw_extension","schema_version":"1.0.0","name":"EdgeFlowDraw","version":"2.1.2","tagline":"Draw path of quads; begin with edgeflow instead of block/point","archive_hash":"sha256:f0fda6af2998220922c02d6258c1c3ae4d792910ecd204c937cdc58925fd2223","archive_size":23442,"archive_url":"https://extensions.blender.org/download/sha256:f0fda6af2998220922c02d6258c1c3ae4d792910ecd204c937cdc58925fd2223/add-on-edgeflowdraw-extension-v2.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/edgeflowdraw-extension/","maintainer":"David-Boudreau","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh"]},{"id":"render_commander","schema_version":"1.0.0","name":"Render Commander","version":"1.2.5","tagline":"Configure and export parallel render jobs and standalone scripts","archive_hash":"sha256:70ab38c8e95fe96933ade9f5f35d48ea45f3ad429e5100622af1a760f87aba72","archive_size":92160,"archive_url":"https://extensions.blender.org/download/sha256:70ab38c8e95fe96933ade9f5f35d48ea45f3ad429e5100622af1a760f87aba72/add-on-render-commander-v1.2.5.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/render-commander/","maintainer":"n4dirp","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export script files and temp data","clipboard":"Add data paths from the clipboard"},"tags":["Render","Import-Export"]},{"id":"blink_bg","schema_version":"1.0.0","name":"Blink BG","version":"1.0.2","tagline":"Control camera BG image alpha/depth","archive_hash":"sha256:38fa18cb0ce4d891f3d270ed85e2c5fd029509d490102ddd05d0b1e7f689d2c3","archive_size":4327,"archive_url":"https://extensions.blender.org/download/sha256:38fa18cb0ce4d891f3d270ed85e2c5fd029509d490102ddd05d0b1e7f689d2c3/add-on-blink-bg-v1.0.2.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":"Dark_Chocolate_Theme","schema_version":"1.0.0","name":"Dark_Chocolate_Theme","version":"1.0.5","tagline":"Mellow Sombre","archive_hash":"sha256:e65df8eb2e7ccf37a8053165a37a5fdcc1dbf2e18f897392518e876fc79f0a3f","archive_size":5687,"archive_url":"https://extensions.blender.org/download/sha256:e65df8eb2e7ccf37a8053165a37a5fdcc1dbf2e18f897392518e876fc79f0a3f/theme-dark-chocolate-theme-v1.0.5.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":"model_decompressor","schema_version":"1.0.0","name":"Compressed GLB Importer","version":"0.0.5","tagline":"Import Meshopt and quantized GLB models with standalone Python","archive_hash":"sha256:63497f21250f22fc7068f9787699551daa9683ded267b0e687be423e4c198cac","archive_size":41838,"archive_url":"https://extensions.blender.org/download/sha256:63497f21250f22fc7068f9787699551daa9683ded267b0e687be423e4c198cac/add-on-model-decompressor-v0.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/model-decompressor/","maintainer":"Wiffzackius","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"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.4","tagline":"Export rig to UE5","archive_hash":"sha256:8f9e355559d0ea035e097de7a34d12f416cd953a6063cc03ba8b855722a3c3e1","archive_size":17915,"archive_url":"https://extensions.blender.org/download/sha256:8f9e355559d0ea035e097de7a34d12f416cd953a6063cc03ba8b855722a3c3e1/add-on-blender2ue-rig-exporter-v0.0.4.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":"uv_layers_tools_ult","schema_version":"1.0.0","name":"UV Layers Tools (ULT)","version":"1.2.0","tagline":"Batch UV layer management for Blender","archive_hash":"sha256:b906d776f4305664fa7a6a9a6dd3d19e20e392ee015a0c464fc6465edc67b2e0","archive_size":9977,"archive_url":"https://extensions.blender.org/download/sha256:b906d776f4305664fa7a6a9a6dd3d19e20e392ee015a0c464fc6465edc67b2e0/add-on-uv-layers-tools-ult-v1.2.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/uv-layers-tools-ult/","maintainer":"AbstracteurDeQuinteEssence","license":["SPDX:GPL-3.0-or-later"],"tags":["UV","Mesh"]},{"id":"blendixserial","schema_version":"1.0.0","name":"blendixserial","version":"2.2.1","tagline":"Connect Blender to External Devices via Simple UART","archive_hash":"sha256:2fc077994af32dc2283b36b31d5b68aa022a27e92fabc013d414bfc4c06f5efc","archive_size":132688,"archive_url":"https://extensions.blender.org/download/sha256:2fc077994af32dc2283b36b31d5b68aa022a27e92fabc013d414bfc4c06f5efc/add-on-blendixserial-v2.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blendixserial/","maintainer":"Rurouni-Usman","license":["SPDX:GPL-3.0-or-later"],"tags":["System"]},{"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":"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":"dynamic_rig_render_controls","schema_version":"1.0.0","name":"Dynamic List Manager","version":"1.2.0","tagline":"manages the visibility of mesh objects into Groups","archive_hash":"sha256:338f2d5cc283f940ed5feee9ba342aa0266a20c26a4640c43da239bf1f5fb1cc","archive_size":11081,"archive_url":"https://extensions.blender.org/download/sha256:338f2d5cc283f940ed5feee9ba342aa0266a20c26a4640c43da239bf1f5fb1cc/add-on-dynamic-rig-render-controls-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dynamic-rig-render-controls/","maintainer":"Eduardito_3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Animation"]},{"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":"depotkit","schema_version":"1.0.0","name":"DepotKit","version":"2.0.1","tagline":"Collect & organise all external assets in your .blend file","archive_hash":"sha256:0b7866ffd5f179a2d5f224093dec8580e54b8063e034240f7d0052aee130b199","archive_size":8376,"archive_url":"https://extensions.blender.org/download/sha256:0b7866ffd5f179a2d5f224093dec8580e54b8063e034240f7d0052aee130b199/add-on-depotkit-v2.0.1.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.4","tagline":"Consistent UI, sharp colors, comfortable contrast, 3 birght lvls","archive_hash":"sha256:2dfa7dac2c3037aa9fb85b2c2fcd408b3d77fa1d73eb11dd674f2b5b8c109600","archive_size":5472,"archive_url":"https://extensions.blender.org/download/sha256:2dfa7dac2c3037aa9fb85b2c2fcd408b3d77fa1d73eb11dd674f2b5b8c109600/theme-studio-mid-v2.3.4.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.5","tagline":"Consistent UI, sharp colors, comfortable contrast, 3 birght lvls","archive_hash":"sha256:b2a453bad3b893a23dd0d0af6a24da3122e11ed0a455c583e88a26681794fb21","archive_size":5469,"archive_url":"https://extensions.blender.org/download/sha256:b2a453bad3b893a23dd0d0af6a24da3122e11ed0a455c583e88a26681794fb21/theme-studio-light-v2.3.5.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":"pbr_lookdev","schema_version":"1.0.0","name":"PBR Lookdev","version":"4.2.1","tagline":"Layered PBR materials with masks, overlays and UDIM","archive_hash":"sha256:5d99211dcf113121d59c72ace5b8202c449c48ec45c8789e5e29db75e4685d09","archive_size":37047,"archive_url":"https://extensions.blender.org/download/sha256:5d99211dcf113121d59c72ace5b8202c449c48ec45c8789e5e29db75e4685d09/add-on-pbr-lookdev-v4.2.1.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.2.4","tagline":"Dynamic overlays for the UV Editor","archive_hash":"sha256:cc61784494cc166bd3a3783da290d0428ee61ccaa878ddd8d1ec64d1209e1e0f","archive_size":63718,"archive_url":"https://extensions.blender.org/download/sha256:cc61784494cc166bd3a3783da290d0428ee61ccaa878ddd8d1ec64d1209e1e0f/add-on-uvo-overlays-v1.2.4.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":"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.1.0","tagline":"Highly customizable export of complex scenes to Godot","archive_hash":"sha256:0c0fffa33418f83bf5db8955da88c6a0b593c248056df1b74e2f81545b791d2a","archive_size":102398,"archive_url":"https://extensions.blender.org/download/sha256:0c0fffa33418f83bf5db8955da88c6a0b593c248056df1b74e2f81545b791d2a/add-on-goblend-v2.1.0.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":"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":"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":"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":"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":"Dark_Pro_Max_Theme","schema_version":"1.0.0","name":"Dark_Pro_Max_Theme","version":"1.2.4","tagline":"Dark Default Alternative","archive_hash":"sha256:b90d9cb0a24eabc66691512ef4e01999487626ea806841928c702a234cb9c9e3","archive_size":5784,"archive_url":"https://extensions.blender.org/download/sha256:b90d9cb0a24eabc66691512ef4e01999487626ea806841928c702a234cb9c9e3/theme-dark-pro-max-theme-v1.2.4.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":"Blueprint_Theme","schema_version":"1.0.0","name":"Blueprint_Theme","version":"1.0.8","tagline":"True Blueprint Colour","archive_hash":"sha256:750f7fd86c0631f1b767c822b8d3f79e0425c6c91d06fdc6db50403aa4329bab","archive_size":5729,"archive_url":"https://extensions.blender.org/download/sha256:750f7fd86c0631f1b767c822b8d3f79e0425c6c91d06fdc6db50403aa4329bab/theme-blueprint-theme-v1.0.8.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.3.3","tagline":"Light Default Alternative","archive_hash":"sha256:3fe1a8132e312ab37700006bc9702a269282c17319fcf73a1fe3cbcf69e63ea0","archive_size":5679,"archive_url":"https://extensions.blender.org/download/sha256:3fe1a8132e312ab37700006bc9702a269282c17319fcf73a1fe3cbcf69e63ea0/theme-nostalgia-2bit-ui-v1.3.3.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":"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.7","tagline":"Export and import Blender node trees as JSON","archive_hash":"sha256:8823fccc495530e1739705e86eff7f6015aa00d8fd36df7d044233dc897ca641","archive_size":54864,"archive_url":"https://extensions.blender.org/download/sha256:8823fccc495530e1739705e86eff7f6015aa00d8fd36df7d044233dc897ca641/add-on-tree-clipper-v0.1.7.zip","type":"add-on","blender_version_min":"5.0.0","blender_version_max":"5.3.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.2.2","tagline":"Anotate your blend files","archive_hash":"sha256:31cdd963b15c269ff819321251870c4ea106ee40a6ae5a681e5db3867ddb5ba9","archive_size":4889,"archive_url":"https://extensions.blender.org/download/sha256:31cdd963b15c269ff819321251870c4ea106ee40a6ae5a681e5db3867ddb5ba9/add-on-pataz-notes-v5.2.2.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":"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":"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.4","tagline":"Emulate QWERTY keyboard shortcuts on non-QWERTY keyboard layouts","archive_hash":"sha256:6a476fcb992f89ceb556fbade7f4b1a8d6a7ed3b1f2556f0452613a66a8a556c","archive_size":32244,"archive_url":"https://extensions.blender.org/download/sha256:6a476fcb992f89ceb556fbade7f4b1a8d6a7ed3b1f2556f0452613a66a8a556c/add-on-keyboard-layout-emulation-v1.0.4.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":"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":"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":"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":"quill","schema_version":"1.0.0","name":"Quill Import/Export","version":"1.5.1","tagline":"Import and export Quill VR illustrations and animations","archive_hash":"sha256:fa18547edb72148f1a1d3c83c13c1947ccde0e13ab485d6517676a025237ffd0","archive_size":54373,"archive_url":"https://extensions.blender.org/download/sha256:fa18547edb72148f1a1d3c83c13c1947ccde0e13ab485d6517676a025237ffd0/add-on-quill-v1.5.1.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.11","tagline":"Define gameplay in Blender and play in Godot with a few clicks","archive_hash":"sha256:5ca30c78f45277f45ed8a808e9b191f515c2207e79e0c4f3acac2de3cb96155a","archive_size":14004,"archive_url":"https://extensions.blender.org/download/sha256:5ca30c78f45277f45ed8a808e9b191f515c2207e79e0c4f3acac2de3cb96155a/add-on-folded-paper-engine-v1.0.11.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":"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":"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.3.0","tagline":"Clean up MetaHuman meshes and match them to UE5 Manny","archive_hash":"sha256:effdd535e6a830738e2a757ca2c250239c81f52f72b4711a2458e205d04b13b4","archive_size":21612,"archive_url":"https://extensions.blender.org/download/sha256:effdd535e6a830738e2a757ca2c250239c81f52f72b4711a2458e205d04b13b4/add-on-metahumantomanny-v1.3.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":"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.3","tagline":"Generate customizable 3D-printable cards, tags, and keychains","archive_hash":"sha256:c2acb335a0bf0db5fe5ec7064021d8a2131c9bd409dabce8bf823a6c44529f7b","archive_size":513559,"archive_url":"https://extensions.blender.org/download/sha256:c2acb335a0bf0db5fe5ec7064021d8a2131c9bd409dabce8bf823a6c44529f7b/add-on-nfc-card-keychain-generator-v1.2.3.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.2","tagline":"Green accent theme","archive_hash":"sha256:b8a2a09aee65bdb1920d3f893f4f9b09b5373a79429fb65652f2c6a4a6eef94a","archive_size":18635,"archive_url":"https://extensions.blender.org/download/sha256:b8a2a09aee65bdb1920d3f893f4f9b09b5373a79429fb65652f2c6a4a6eef94a/theme-pjavel-theme-v1.2.2.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":"2.0.1","tagline":"Navigation Puck like in Sketchbook Pro","archive_hash":"sha256:d98ab22845578d43de090fbf37e306244853a5d0fd6baef835a7ed1c0c066b13","archive_size":145831,"archive_url":"https://extensions.blender.org/download/sha256:d98ab22845578d43de090fbf37e306244853a5d0fd6baef835a7ed1c0c066b13/add-on-navigation-puck-addon-v2.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":"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.9","tagline":"Translucent Y2K Aqua Aero","archive_hash":"sha256:9abe3f0f64e1a39483eb960689a18a8ed4d770099608e4c62295635f807e038c","archive_size":5729,"archive_url":"https://extensions.blender.org/download/sha256:9abe3f0f64e1a39483eb960689a18a8ed4d770099608e4c62295635f807e038c/theme-blueprint-film-theme-v2.2.9.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.2","tagline":"Control viewport and camera focal length with your mouse","archive_hash":"sha256:c6faa64e00e65b00eb736dd21fb52544e3fafe175b77a3bdae4f83753f9c8faa","archive_size":10089,"archive_url":"https://extensions.blender.org/download/sha256:c6faa64e00e65b00eb736dd21fb52544e3fafe175b77a3bdae4f83753f9c8faa/add-on-focallengthtweaker-v1.0.2.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.2.1","tagline":"Invisible Shadow Warrior","archive_hash":"sha256:439b7a183c85ad2682ba7a74f28151707cc760b340984f2e13e4bb7443b56e81","archive_size":5670,"archive_url":"https://extensions.blender.org/download/sha256:439b7a183c85ad2682ba7a74f28151707cc760b340984f2e13e4bb7443b56e81/theme-zeratul-theme-v3.2.1.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":"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":"Clip_Tools","schema_version":"1.0.0","name":"Clip Tools","version":"1.2.0","tagline":"Add a simple tool to the Movie Clip Editor","archive_hash":"sha256:593b3aed6333855d96a51a2372ccf82c8cd134531d72a0f7d6d95fcefa78a17a","archive_size":20301,"archive_url":"https://extensions.blender.org/download/sha256:593b3aed6333855d96a51a2372ccf82c8cd134531d72a0f7d6d95fcefa78a17a/add-on-clip-tools-v1.2.0.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":"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.8","tagline":"Remake of Blender3.3 light theme","archive_hash":"sha256:194eb5ea31c0aa3ea3f7da9085a33b09bf07ccae2ece90385bda3f773d052249","archive_size":6143,"archive_url":"https://extensions.blender.org/download/sha256:194eb5ea31c0aa3ea3f7da9085a33b09bf07ccae2ece90385bda3f773d052249/theme-gray50-v1.0.8.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":"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":"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":"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.2","tagline":"Square the selection","archive_hash":"sha256:fe3f6130509d805540a80f0bab03e5bae0396de1f3bee2c08d3b84359b5baf43","archive_size":44067,"archive_url":"https://extensions.blender.org/download/sha256:fe3f6130509d805540a80f0bab03e5bae0396de1f3bee2c08d3b84359b5baf43/add-on-to-square-v2.2.2.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":"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.3","tagline":"Import SVG with accurate colors and path processing","archive_hash":"sha256:e92974858c5d3103469fb8c36add268d37f42965f4afbdeb96e21f458903930b","archive_size":4024805,"archive_url":"https://extensions.blender.org/download/sha256:e92974858c5d3103469fb8c36add268d37f42965f4afbdeb96e21f458903930b/add-on-enhanced-svg-v0.2.3-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.12","tagline":"Easily manage projects with multiple separate animations","archive_hash":"sha256:7bede09c490699c677996c84970e628839ca645be4127c90ebe9a849f31da92d","archive_size":62573,"archive_url":"https://extensions.blender.org/download/sha256:7bede09c490699c677996c84970e628839ca645be4127c90ebe9a849f31da92d/add-on-slot-link-v0.0.12.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.2","tagline":"Auto create better light aovs (diffuse_env, specular_env...)","archive_hash":"sha256:3ce1511db842081ca639c1f1bceea848ace8b389759e073611e6c2cc83f22b40","archive_size":9104,"archive_url":"https://extensions.blender.org/download/sha256:3ce1511db842081ca639c1f1bceea848ace8b389759e073611e6c2cc83f22b40/add-on-industrial-light-aov-splitter-v1.0.2.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.6","tagline":"AC Tools for track modding","archive_hash":"sha256:6bd5108411d366836d9a49d4305bebdd0ea682ed4f15aac24303de5a67f5519a","archive_size":30826,"archive_url":"https://extensions.blender.org/download/sha256:6bd5108411d366836d9a49d4305bebdd0ea682ed4f15aac24303de5a67f5519a/add-on-ac-tools-v0.1.6.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":["Object"]},{"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.10","tagline":"Easily align Objects in your scene by Active Object or 3D Cursor","archive_hash":"sha256:b2f693945760fe9aff223e41471064fce657661381c94ed6e7e1f43c3bc3e542","archive_size":138062,"archive_url":"https://extensions.blender.org/download/sha256:b2f693945760fe9aff223e41471064fce657661381c94ed6e7e1f43c3bc3e542/add-on-sco-buttobjects-v2.0.10.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.8","tagline":"Tools to help layout your UV layout","archive_hash":"sha256:48d1b77f5dccd0f5c05ab05ac9455da0eab6f4b0c1a6cab089ad50f7f3686524","archive_size":30681,"archive_url":"https://extensions.blender.org/download/sha256:48d1b77f5dccd0f5c05ab05ac9455da0eab6f4b0c1a6cab089ad50f7f3686524/add-on-grid-layout-v1.5.8.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":"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":"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":"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.3.0","tagline":"Faster .fbx Exporter for Static Objects With Modifiers","archive_hash":"sha256:7f37c3dff44762c23cc42046599b19ff1154e708723c5850875d421eeca4ab1a","archive_size":139398,"archive_url":"https://extensions.blender.org/download/sha256:7f37c3dff44762c23cc42046599b19ff1154e708723c5850875d421eeca4ab1a/add-on-faster-fbx-exporter-v0.3.0.zip","type":"add-on","blender_version_min":"5.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.9","tagline":"Dark Grey","archive_hash":"sha256:8f5aaf9666cf026362d799e9b76221e56decb806e4d5c14ea160102a6910c9f4","archive_size":5671,"archive_url":"https://extensions.blender.org/download/sha256:8f5aaf9666cf026362d799e9b76221e56decb806e4d5c14ea160102a6910c9f4/theme-night-rain-theme-v2.1.9.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":"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.3.9","tagline":"Bluish Undertone Metallic Gray","archive_hash":"sha256:ee6c0d72651d0214e3e5d16a679a8eea686f12ca496637e8c474a8a80aa927eb","archive_size":5882,"archive_url":"https://extensions.blender.org/download/sha256:ee6c0d72651d0214e3e5d16a679a8eea686f12ca496637e8c474a8a80aa927eb/theme-graphite-mono-theme-v3.3.9.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":"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":"microscopynodes","schema_version":"1.0.0","name":"Microscopy Nodes","version":"3.0.1","tagline":"Handling microscopy data in Blender, up to 5D volumes","archive_hash":"sha256:4c071429b7ed13f9331963e3239ed36fde67a9cd9bd393e0bd90be8dcf00469e","archive_size":52752110,"archive_url":"https://extensions.blender.org/download/sha256:4c071429b7ed13f9331963e3239ed36fde67a9cd9bd393e0bd90be8dcf00469e/add-on-microscopynodes-v3.0.1-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.8","tagline":"XROMM toolkit for Blender","archive_hash":"sha256:ea1375fc8caf9b991ea4e11992c0baeb999a97a2f73e3d691a5ed3bd3fcbde95","archive_size":35566,"archive_url":"https://extensions.blender.org/download/sha256:ea1375fc8caf9b991ea4e11992c0baeb999a97a2f73e3d691a5ed3bd3fcbde95/add-on-xromm-tools-v0.9.8.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.3.1","tagline":"Export .ase files used in Unreal Engine 1 & 2","archive_hash":"sha256:6706417e622364381e25d7277bdb66e981ddcddfe6b685464a7d3530a057d427","archive_size":16322,"archive_url":"https://extensions.blender.org/download/sha256:6706417e622364381e25d7277bdb66e981ddcddfe6b685464a7d3530a057d427/add-on-io-scene-ase-v2.3.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.6.0","tagline":"Importer addon for MagicaVoxel vox files","archive_hash":"sha256:12f75a437ac820604692717cc9325eb0c201f05af6b0b15031856f2d817dc8ef","archive_size":27187,"archive_url":"https://extensions.blender.org/download/sha256:12f75a437ac820604692717cc9325eb0c201f05af6b0b15031856f2d817dc8ef/add-on-blender-magicavoxel-v1.6.0.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":"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":"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.8.1","tagline":"Tools for importing DEMoCap motion captures into Blender","archive_hash":"sha256:c007ea7eb409a3831edc0f4d62611c6e32c7a1320c0cfc2cafa4b9ac5b84025c","archive_size":116066,"archive_url":"https://extensions.blender.org/download/sha256:c007ea7eb409a3831edc0f4d62611c6e32c7a1320c0cfc2cafa4b9ac5b84025c/add-on-democap-tools-v1.8.1.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","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":"yl_vertexcolforge","schema_version":"1.0.0","name":"YL VertexColForge","version":"1.2.0","tagline":"Vertex Color editing, previewing, and packing tools","archive_hash":"sha256:81ef94b163341e328a5a066656a3ae9affd9a0234da0b06dd88d99e77dd2187b","archive_size":309660,"archive_url":"https://extensions.blender.org/download/sha256:81ef94b163341e328a5a066656a3ae9affd9a0234da0b06dd88d99e77dd2187b/add-on-yl-vertexcolforge-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/yl-vertexcolforge/","maintainer":"YLIANG","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Paint"]},{"id":"texture_pipeline_studio","schema_version":"1.0.0","name":"Texture Pipeline Studio","version":"8.10.1","tagline":"Assign PBR textures from resolution folders and swap LODs","archive_hash":"sha256:c7abbaca62008937992ff078943973450173e9137651a5662933d68a1f6c4471","archive_size":9087,"archive_url":"https://extensions.blender.org/download/sha256:c7abbaca62008937992ff078943973450173e9137651a5662933d68a1f6c4471/add-on-texture-pipeline-studio-v8.10.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/texture-pipeline-studio/","maintainer":"Gihan-Maddumage","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read PBR texture images from user-selected folders on disk"},"tags":["Material","Pipeline","Node"]},{"id":"clothdrop_reborn","schema_version":"1.0.0","name":"ClothDrop Reborn","version":"2.0.3","tagline":"Single-click cloth simulation tool","archive_hash":"sha256:d14ee9a0178b6f644d1d3a4fc205e9502979f32707c8e656cf41d3b629c793ee","archive_size":9034,"archive_url":"https://extensions.blender.org/download/sha256:d14ee9a0178b6f644d1d3a4fc205e9502979f32707c8e656cf41d3b629c793ee/add-on-clothdrop-reborn-v2.0.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/clothdrop-reborn/","maintainer":"Hartface","license":["SPDX:GPL-3.0-or-later"],"tags":["Physics"]},{"id":"nodemap","schema_version":"1.0.0","name":"Nodemap","version":"1.3.2","tagline":"Minimap overlay for the Node Editor","archive_hash":"sha256:bc6a53c36023401166b067ae988cf122aeb53705475f0427023288be76aab741","archive_size":38052,"archive_url":"https://extensions.blender.org/download/sha256:bc6a53c36023401166b067ae988cf122aeb53705475f0427023288be76aab741/add-on-nodemap-v1.3.2.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/nodemap/","maintainer":"n4dirp","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","User Interface"]},{"id":"rolllux","schema_version":"1.0.0","name":"RollLux","version":"5.5.5","tagline":"Perceptive Full-Auto Metering Lighting","archive_hash":"sha256:e191e2481666f740ce99354b3753e350a7e823f301db3416c5b9ba359ea8fb5d","archive_size":1503359,"archive_url":"https://extensions.blender.org/download/sha256:e191e2481666f740ce99354b3753e350a7e823f301db3416c5b9ba359ea8fb5d/add-on-rolllux-v5.5.5.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/rolllux/","maintainer":"ACGGIT_LJ","license":["SPDX:GPL-3.0-or-later","SPDX:CC0-1.0"],"permissions":{"files":"Load reference lighting images from disk via the file picker"},"tags":["Lighting","Render"]},{"id":"stepper_reborn","schema_version":"1.0.0","name":"STEPper Reborn","version":"2.3.0","tagline":"CAD importer","archive_hash":"sha256:0cb79faecb04d45fdd06df6ac4b68695f84d8e917f188914d9c70670290bb1cc","archive_size":46347755,"archive_url":"https://extensions.blender.org/download/sha256:0cb79faecb04d45fdd06df6ac4b68695f84d8e917f188914d9c70670290bb1cc/add-on-stepper-reborn-v2.3.0-windows-x64.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/stepper-reborn/","maintainer":"RomainGuimbal","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import STEP files"},"platforms":["windows-x64"],"tags":["Import-Export"]},{"id":"br3f","schema_version":"1.0.0","name":"R3F JSX/TSX Exporter","version":"0.1.1","tagline":"Export GLB + React Three Fiber JSX/TSX component in one click","archive_hash":"sha256:48480e1bb3c2417f53092e391ede6bb0d208a51b09f4993996826042eeaf8e19","archive_size":19149,"archive_url":"https://extensions.blender.org/download/sha256:48480e1bb3c2417f53092e391ede6bb0d208a51b09f4993996826042eeaf8e19/add-on-br3f-v0.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/br3f/","maintainer":"Tom-Heeley","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Write the .glb and generated component to your project folders"},"tags":["Import-Export","Pipeline"]},{"id":"bas_relief","schema_version":"1.0.0","name":"Bas Relief","version":"1.1.0","tagline":"Create Bas Relief from images in Blender","archive_hash":"sha256:014fbc08414647cda8c79861d14a09a84359bee1f66e66c1e2121dfdc96698ee","archive_size":535796,"archive_url":"https://extensions.blender.org/download/sha256:014fbc08414647cda8c79861d14a09a84359bee1f66e66c1e2121dfdc96698ee/add-on-bas-relief-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/bas-relief/","maintainer":"guillaume_bissieres","license":["SPDX:GPL-3.0-or-later"],"tags":["Compositing","Material"]},{"id":"step_importer","schema_version":"1.0.0","name":"STEP Importer","version":"1.1.0","tagline":"Import STEP files directly into Blender, no 3rd party needed","archive_hash":"sha256:2ef66db84806053bfae615cf71c163227cfd94e2e77532a36de44be48deb2b9e","archive_size":16226019,"archive_url":"https://extensions.blender.org/download/sha256:2ef66db84806053bfae615cf71c163227cfd94e2e77532a36de44be48deb2b9e/add-on-step-importer-v1.1.0-windows-x64.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/step-importer/","maintainer":"Clonephaze","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Import-Export"]},{"id":"Coffee_Theme","schema_version":"1.0.0","name":"Coffee_Theme","version":"1.0.0","tagline":"No fish inside I swear","archive_hash":"sha256:51bd918707723228bae23922611137998221f76e5467b85d7f0b091f5be7a0de","archive_size":6515,"archive_url":"https://extensions.blender.org/download/sha256:51bd918707723228bae23922611137998221f76e5467b85d7f0b091f5be7a0de/theme-coffee-theme-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/coffee-theme/","maintainer":"Leo-Mb","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"sculpt_stroke_replay","schema_version":"1.0.0","name":"Sculpt Stroke Replay","version":"0.1.6","tagline":"Replay the last sculpt stroke with adjustable strength","archive_hash":"sha256:1957be55fa391269b98bc583a6271e4f17fbc1836f484b50e62fea2319b90b0b","archive_size":3308,"archive_url":"https://extensions.blender.org/download/sha256:1957be55fa391269b98bc583a6271e4f17fbc1836f484b50e62fea2319b90b0b/add-on-sculpt-stroke-replay-v0.1.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sculpt-stroke-replay/","maintainer":"a.a.andrusenko","license":["SPDX:GPL-3.0-or-later"]},{"id":"easy_arrangement","schema_version":"1.0.0","name":"Easy Arrangement","version":"0.2.2","tagline":"Arrange objects linearly, stair-like or in circular patterns","archive_hash":"sha256:e576a758a39b09dbc2e613d2494dd58058b0325b20f5e3cbf76e21772cdc80b8","archive_size":8687,"archive_url":"https://extensions.blender.org/download/sha256:e576a758a39b09dbc2e613d2494dd58058b0325b20f5e3cbf76e21772cdc80b8/add-on-easy-arrangement-v0.2.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/easy-arrangement/","maintainer":"mlico","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"image_editor_tools","schema_version":"1.0.0","name":"Image Editor Master [图像超级工具]","version":"0.3.8","tagline":"Super Image Toolbox (color, filters, texture optimization)","archive_hash":"sha256:8bd34ced888ecad71e1f764b3cdc491fed085bcadec8fb8d1a1887ee302d5de6","archive_size":167013,"archive_url":"https://extensions.blender.org/download/sha256:8bd34ced888ecad71e1f764b3cdc491fed085bcadec8fb8d1a1887ee302d5de6/add-on-image-editor-tools-v0.3.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/image-editor-tools/","maintainer":"RARA","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read image from disk","clipboard":"Copy image from clipboard"},"tags":["Paint","Compositing"]},{"id":"BAM_Decalit","schema_version":"1.0.0","name":"[BAM] Decalit","version":"1.1.1","tagline":"Fast mesh decal placement with normal snapping and Custom UI/UX","archive_hash":"sha256:6ac0c559ec251b4d859ff1769251732314b28479e1c0a16671c821a603b8bda1","archive_size":2952171,"archive_url":"https://extensions.blender.org/download/sha256:6ac0c559ec251b4d859ff1769251732314b28479e1c0a16671c821a603b8bda1/add-on-bam-decalit-v1.1.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/bam-decalit/","maintainer":"AlexeyHRDesign","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save and load decal presets and generated preview images"},"tags":["Material"]},{"id":"fill_mesh","schema_version":"1.0.0","name":"Fill Mesh","version":"1.0.8","tagline":"An add-on to fix and fill holes on your meshes","archive_hash":"sha256:c5c630878528a38f6870459e7cb9b630105e14636e4137bed328d53ca16f729c","archive_size":7544,"archive_url":"https://extensions.blender.org/download/sha256:c5c630878528a38f6870459e7cb9b630105e14636e4137bed328d53ca16f729c/add-on-fill-mesh-v1.0.8.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/fill-mesh/","maintainer":"guillaume_bissieres","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"editmode_dimensions","schema_version":"1.0.0","name":"Dimensions in Edit Mode","version":"1.0.1","tagline":"Live display and editing of selected geometry' dimensions","archive_hash":"sha256:acac5c3fbca92c18a8718a499f881814b3d13b73c0d815e63196b8d21f7265dd","archive_size":1776,"archive_url":"https://extensions.blender.org/download/sha256:acac5c3fbca92c18a8718a499f881814b3d13b73c0d815e63196b8d21f7265dd/add-on-editmode-dimensions-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/editmode-dimensions/","maintainer":"Matikos","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh"]},{"id":"camera_grid","schema_version":"1.0.0","name":"Camera Grid","version":"1.2.0","tagline":"Viewport camera grid overlay for quick camera switching","archive_hash":"sha256:f401ec200d3619d82c0445d00ded2da17c5cf0ee24404002605d89dadc0d865b","archive_size":23571,"archive_url":"https://extensions.blender.org/download/sha256:f401ec200d3619d82c0445d00ded2da17c5cf0ee24404002605d89dadc0d865b/add-on-camera-grid-v1.2.0.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/camera-grid/","maintainer":"n4dirp","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera","User Interface"]},{"id":"object_lay_flat","schema_version":"1.0.0","name":"Lay Flat","version":"1.0.0","tagline":"Lays an object flat on the XY plane based on the selected face","archive_hash":"sha256:21c85c39e657827bcaf64637e8637cbd541ee8fabf27e8a85f6f2a29a014b43e","archive_size":3106,"archive_url":"https://extensions.blender.org/download/sha256:21c85c39e657827bcaf64637e8637cbd541ee8fabf27e8a85f6f2a29a014b43e/add-on-object-lay-flat-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/object-lay-flat/","maintainer":"Pavel-Karoukin","license":["SPDX:GPL-3.0-or-later"]},{"id":"yl_meshcheckhud","schema_version":"1.0.0","name":"YL MeshCheckHUD","version":"1.2.0","tagline":"Mesh check, heatmap, and live HUD tools for Blender","archive_hash":"sha256:b88f4a9621e1537f5fefa97835121405fdb4df8040a35c2bf752486d4ee63342","archive_size":139058,"archive_url":"https://extensions.blender.org/download/sha256:b88f4a9621e1537f5fefa97835121405fdb4df8040a35c2bf752486d4ee63342/add-on-yl-meshcheckhud-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.3.0","website":"https://extensions.blender.org/add-ons/yl-meshcheckhud/","maintainer":"YLIANG","license":["SPDX:GPL-3.0-or-later"]},{"id":"cream_soda","schema_version":"1.0.0","name":"Cream Soda","version":"1.0.0","tagline":"A cream soda from Lawson","archive_hash":"sha256:989edfb1c8f02e525cdf673e8a3707e5ad9d65a86e9d879e11dca32b56bfea5c","archive_size":5011,"archive_url":"https://extensions.blender.org/download/sha256:989edfb1c8f02e525cdf673e8a3707e5ad9d65a86e9d879e11dca32b56bfea5c/theme-cream-soda-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/cream-soda/","maintainer":"spoiledmilk","license":["SPDX:GPL-2.0-or-later"],"tags":["Light","Inspired By"]},{"id":"wiggle_bones","schema_version":"1.0.0","name":"Wiggle Bones","version":"1.1.1","tagline":"Refactor of Wiggle 2, fully fixed for Blender 5.0","archive_hash":"sha256:4e2393b90e12aa8e4690a3de92a705ccbec6ec8cee543da00d3c880bc54f7e3a","archive_size":27611,"archive_url":"https://extensions.blender.org/download/sha256:4e2393b90e12aa8e4690a3de92a705ccbec6ec8cee543da00d3c880bc54f7e3a/add-on-wiggle-bones-v1.1.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/wiggle-bones/","maintainer":"Hans_Xwh","license":["SPDX:GPL-3.0-or-later"],"tags":["Physics"]},{"id":"import_psd_as_mesh_planes","schema_version":"1.0.0","name":"Import .PSD as Mesh Planes","version":"1.1.0","tagline":"Allows importing of .PSD files into mesh planes","archive_hash":"sha256:9b4c903e03a2e7064d1dbc78fed25c05dc0ef713e1e1ccb1c6acdbad1706bee0","archive_size":5255,"archive_url":"https://extensions.blender.org/download/sha256:9b4c903e03a2e7064d1dbc78fed25c05dc0ef713e1e1ccb1c6acdbad1706bee0/add-on-import-psd-as-mesh-planes-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/import-psd-as-mesh-planes/","maintainer":"byebyeLAN","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export","Mesh"]},{"id":"AdvancedAlignView","schema_version":"1.0.0","name":"Advanced Align View","version":"0.1.3","tagline":"Align 3D View to selected geometries for precise modeling","archive_hash":"sha256:cf28e02b52faace5d50f5303440c2671d4659f62fba33c1fa7d6feb729c9643d","archive_size":37803,"archive_url":"https://extensions.blender.org/download/sha256:cf28e02b52faace5d50f5303440c2671d4659f62fba33c1fa7d6feb729c9643d/add-on-advancedalignview-v0.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/advancedalignview/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","3D View"]},{"id":"Flash_Light","schema_version":"1.0.0","name":"Flash Light","version":"1.0.1","tagline":"Light theme inspired by Macromedia Flash 8","archive_hash":"sha256:ead726b325361b49c1a379986f251cc8ee68ecd740f8eca65fcca4ef201af3b2","archive_size":5683,"archive_url":"https://extensions.blender.org/download/sha256:ead726b325361b49c1a379986f251cc8ee68ecd740f8eca65fcca4ef201af3b2/theme-flash-light-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/flash-light/","maintainer":"Spikysaurus","license":["SPDX:GPL-2.0-or-later"],"tags":["Light"]},{"id":"Retro3DSMAX","schema_version":"1.0.0","name":"3DSMAX 1996","version":"1.0.0","tagline":"Classic theme inspired by 3D Studio Max 2.5","archive_hash":"sha256:cba1539ab749888c06a6dd7bef361958cdce7ed9e6486b6e3d217ca276bb5247","archive_size":4832,"archive_url":"https://extensions.blender.org/download/sha256:cba1539ab749888c06a6dd7bef361958cdce7ed9e6486b6e3d217ca276bb5247/theme-retro3dsmax-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/retro3dsmax/","maintainer":"Philautia","license":["SPDX:GPL-3.0-or-later"],"tags":["Inspired By","Light"]},{"id":"quicksnap","schema_version":"1.0.0","name":"QuickSnap","version":"1.5.1","tagline":"Quickly snap objects/vertices/curve points","archive_hash":"sha256:8fe5d7c52ccc682be2b67cd44caf38a655fa2d98edee341ae415a37083b22f25","archive_size":80845,"archive_url":"https://extensions.blender.org/download/sha256:8fe5d7c52ccc682be2b67cd44caf38a655fa2d98edee341ae415a37083b22f25/add-on-quicksnap-v1.5.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/quicksnap/","maintainer":"julienh","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Object"]},{"id":"struct_topo_opt","schema_version":"1.0.0","name":"Structural Topology Optimization","version":"0.4.3","tagline":"SIMP+OC structural topology optimization in the viewport","archive_hash":"sha256:0258ae4ac60e1a851ad1ec5339ae3b2e4a194ce76da6b8b696b02bd2ba7ef33b","archive_size":80648578,"archive_url":"https://extensions.blender.org/download/sha256:0258ae4ac60e1a851ad1ec5339ae3b2e4a194ce76da6b8b696b02bd2ba7ef33b/add-on-struct-topo-opt-v0.4.3-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/struct-topo-opt/","maintainer":"Emrgn.arch","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Mesh","Physics"]},{"id":"quick_sidebar_switcher","schema_version":"1.0.0","name":"Quick Sidebar Switcher","version":"1.4.0","tagline":"Quickly switch between Side Panel tabs with a popup menu","archive_hash":"sha256:570682c3063e0bdaa71c08d59d0560f7d2dcd9131d7122cf07eada14d0e0ec2b","archive_size":9941,"archive_url":"https://extensions.blender.org/download/sha256:570682c3063e0bdaa71c08d59d0560f7d2dcd9131d7122cf07eada14d0e0ec2b/add-on-quick-sidebar-switcher-v1.4.0.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/quick-sidebar-switcher/","maintainer":"hyeffect55","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"timeline_audio_visualizer","schema_version":"1.0.0","name":"Timeline Audio Visualizer","version":"0.2.5","tagline":"Visualize audio waveforms inside Blender animation timelines","archive_hash":"sha256:758269dcc0bdd2fb0ada3ffbb32cfda7603e8592c77269a83aaab1c1998c4380","archive_size":22383,"archive_url":"https://extensions.blender.org/download/sha256:758269dcc0bdd2fb0ada3ffbb32cfda7603e8592c77269a83aaab1c1998c4380/add-on-timeline-audio-visualizer-v0.2.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/timeline-audio-visualizer/","maintainer":"qsOwOsp","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read audio files for waveform generation"},"tags":["Animation","Sequencer"]},{"id":"mmgpy","schema_version":"1.0.0","name":"MMGpy - Mesh Remeshing","version":"0.16.2","tagline":"Adaptive surface remeshing via the MMG library","archive_hash":"sha256:da18b422985da4ddc2086ec9bd695d8ad8150edf5222f3c9bbae3a11a79cda66","archive_size":9515641,"archive_url":"https://extensions.blender.org/download/sha256:da18b422985da4ddc2086ec9bd695d8ad8150edf5222f3c9bbae3a11a79cda66/add-on-mmgpy-v0.16.2-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mmgpy/","maintainer":"kmarchais","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Mesh","Modeling"]},{"id":"Multi_Files_Bookmark","schema_version":"1.0.0","name":"Multi Files Bookmark","version":"0.7.1","tagline":"Manage your projects as bookmarks in one Blender window","archive_hash":"sha256:1b9ef9c49159de40e897bd0907d8dfd95d09f1ad422dc926611e02ad37d86deb","archive_size":49098,"archive_url":"https://extensions.blender.org/download/sha256:1b9ef9c49159de40e897bd0907d8dfd95d09f1ad422dc926611e02ad37d86deb/add-on-multi-files-bookmark-v0.7.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/multi-files-bookmark/","maintainer":"61+","license":["SPDX:GPL-3.0-or-later"],"tags":["Pipeline"]},{"id":"Star_Citizen","schema_version":"1.0.0","name":"STAR CITIZEN","version":"1.0.0","tagline":"A Star Citizen theme for Blender","archive_hash":"sha256:730b5dff1e0da25b0442e8eca33e50bdeb610e673c9fc66047312b1e67de3773","archive_size":5820,"archive_url":"https://extensions.blender.org/download/sha256:730b5dff1e0da25b0442e8eca33e50bdeb610e673c9fc66047312b1e67de3773/theme-star-citizen-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/star-citizen/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"dynamic_parent","schema_version":"1.0.0","name":"Dynamic Parent","version":"2.1.0","tagline":"Allows to create and disable an animated ChildOf constraint","archive_hash":"sha256:20d9580c52af76bb5449eb01c6a6f91bd6a406a34c2c7a54c9b967267aaa1d9a","archive_size":5922,"archive_url":"https://extensions.blender.org/download/sha256:20d9580c52af76bb5449eb01c6a6f91bd6a406a34c2c7a54c9b967267aaa1d9a/add-on-dynamic-parent-v2.1.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/dynamic-parent/","maintainer":"RomanVolodin","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Rigging"]},{"id":"plague_inc_theme","schema_version":"1.0.0","name":"Plague Inc. Theme","version":"1.0.0","tagline":"Very red theme","archive_hash":"sha256:0772cf9646fb30d361e26a907a5321ab0d672b7944ce1f44a033d4b6ef43af35","archive_size":5933,"archive_url":"https://extensions.blender.org/download/sha256:0772cf9646fb30d361e26a907a5321ab0d672b7944ce1f44a033d4b6ef43af35/theme-plague-inc-theme-v1.0.0.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/plague-inc-theme/","maintainer":"Bebo","license":["SPDX:GPL-3.0-or-later"]},{"id":"quickpath_rknz","schema_version":"1.0.0","name":"QuickPath RKNZ","version":"2.2.0","tagline":"Quick motion path visualization for bones and objects","archive_hash":"sha256:abc7264e245313dbea1ecb6164d9bdf359c88bce798df5bc875dc92176fdf421","archive_size":44466,"archive_url":"https://extensions.blender.org/download/sha256:abc7264e245313dbea1ecb6164d9bdf359c88bce798df5bc875dc92176fdf421/add-on-quickpath-rknz-v2.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/quickpath-rknz/","maintainer":"Rikokenz","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"photo360_lab","schema_version":"1.0.0","name":"360 PhotoLab","version":"0.37.0","tagline":"Reframe equirectangular 360 photos with RET CIL and CLV previews","archive_hash":"sha256:eafa1747533049218ccbb291caed3ba4df5d39c8dcbccc039cee104647d65952","archive_size":19055,"archive_url":"https://extensions.blender.org/download/sha256:eafa1747533049218ccbb291caed3ba4df5d39c8dcbccc039cee104647d65952/add-on-photo360-lab-v0.37.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/photo360-lab/","maintainer":"Mattia-Fiorini","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load local 360 images and LUT files and export images"},"tags":["Camera","Import-Export"]},{"id":"snapline","schema_version":"1.0.0","name":"Snapline","version":"2.0.0","tagline":"Snap and align your object faster than before","archive_hash":"sha256:2ffa56a35d0015ce5e78e4bc999740748095e9900fa10a48cb91d67248c03f1e","archive_size":16569,"archive_url":"https://extensions.blender.org/download/sha256:2ffa56a35d0015ce5e78e4bc999740748095e9900fa10a48cb91d67248c03f1e/add-on-snapline-v2.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/snapline/","maintainer":"Berun","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Object"]},{"id":"color_helper","schema_version":"1.0.0","name":"Color Helper","version":"0.8.0","tagline":"Palette and color workflow tools","archive_hash":"sha256:f1cae8296649f897b99a1dd916f045b71cd182988d1ae24f0836d38724268eb2","archive_size":64595,"archive_url":"https://extensions.blender.org/download/sha256:f1cae8296649f897b99a1dd916f045b71cd182988d1ae24f0836d38724268eb2/add-on-color-helper-v0.8.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/color-helper/","maintainer":"atticuslv","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import and export palette images and assets","clipboard":"Read image and color values from the clipboard"},"tags":["Material","Node","Paint"]},{"id":"wiggle_2","schema_version":"1.0.0","name":"Wiggle 2: RTX Edition","version":"2.2.7","tagline":" Instant Procedural Bone Physics for Any Rig","archive_hash":"sha256:e7d9cfb5b616da92c940f287829855ecfac590e30dd87ef0db240a24a8aa3a3c","archive_size":73896,"archive_url":"https://extensions.blender.org/download/sha256:e7d9cfb5b616da92c940f287829855ecfac590e30dd87ef0db240a24a8aa3a3c/add-on-wiggle-2-v2.2.7.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/wiggle-2/","maintainer":"Chamiseul","license":["SPDX:GPL-3.0-or-later"]},{"id":"loopkut","schema_version":"1.0.0","name":"Loopkut","version":"1.3.3","tagline":"Preview inserted loop cuts at mouse position","archive_hash":"sha256:c2f64f526a9785ace0e9a565dae156f01b78e3c1d89241b36b6da0c361eb0606","archive_size":104576,"archive_url":"https://extensions.blender.org/download/sha256:c2f64f526a9785ace0e9a565dae156f01b78e3c1d89241b36b6da0c361eb0606/add-on-loopkut-v1.3.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/loopkut/","maintainer":"KewlSheet","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"symtrz","schema_version":"1.0.0","name":"SymTrz","version":"2.2.4","tagline":"Mirror And Symmetrize tools for 3D View","archive_hash":"sha256:565cac6a2300773bf7221881c913ea85e0fe3a8f3bc8483d34d75bb08f81074e","archive_size":14031,"archive_url":"https://extensions.blender.org/download/sha256:565cac6a2300773bf7221881c913ea85e0fe3a8f3bc8483d34d75bb08f81074e/add-on-symtrz-v2.2.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/symtrz/","maintainer":"Berun","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Object"]},{"id":"batch_import_images_to_brushes","schema_version":"1.0.0","name":"Batch Import Images to Brushes","version":"1.0.1","tagline":"Import images as texture paint and sculpt brushes","archive_hash":"sha256:4be87504869ed8883f990ee8d2f58e31c99440ecfb293bb6df5b32d6799d2ec5","archive_size":4117,"archive_url":"https://extensions.blender.org/download/sha256:4be87504869ed8883f990ee8d2f58e31c99440ecfb293bb6df5b32d6799d2ec5/add-on-batch-import-images-to-brushes-v1.0.1.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/batch-import-images-to-brushes/","maintainer":"Raja-Muda","license":["SPDX:GPL-3.0-or-later"]},{"id":"fst_forgepolish","schema_version":"1.0.0","name":"FST ForgePolish","version":"1.2.0","tagline":"Hard surface polishing with optional volume preservation","archive_hash":"sha256:6df63aee40c379f3cb77f4590e2bbb37a378e8d41ea62db45d8457e8e67ed18b","archive_size":68597,"archive_url":"https://extensions.blender.org/download/sha256:6df63aee40c379f3cb77f4590e2bbb37a378e8d41ea62db45d8457e8e67ed18b/add-on-fst-forgepolish-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/fst-forgepolish/","maintainer":"YLIANG","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"io_directx_x","schema_version":"1.0.0","name":"DirectX X Format (.x)","version":"1.3.1","tagline":"Import/Export DirectX .x","archive_hash":"sha256:e8e2d450c9c807c6ee104c5442ae0ef50bb88a8ee23f05acca4acd095a93c256","archive_size":116022,"archive_url":"https://extensions.blender.org/download/sha256:e8e2d450c9c807c6ee104c5442ae0ef50bb88a8ee23f05acca4acd095a93c256/add-on-io-directx-x-v1.3.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-directx-x/","maintainer":"SaintBaron","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"omni_outset","schema_version":"1.0.0","name":"OmniOutset","version":"1.1.1","tagline":"Smart Face and Equidistant Edge Extrude","archive_hash":"sha256:1fde945aa66c913d9be4fecc614fb702e5c6856b4a87e629ca1d3a0f35d152e3","archive_size":9761,"archive_url":"https://extensions.blender.org/download/sha256:1fde945aa66c913d9be4fecc614fb702e5c6856b4a87e629ca1d3a0f35d152e3/add-on-omni-outset-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/omni-outset/","maintainer":"Alx_11","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling"]},{"id":"damped_track_chain","schema_version":"1.0.0","name":"Damped Track Chain","version":"1.0.2","tagline":"为骨骼链一键生成阻尼追踪约束/One-click bone chain constraints","archive_hash":"sha256:70af09ebe58cca42406322bec092d5f9dfa857436b0518ad5e071a43a7155aa0","archive_size":6101,"archive_url":"https://extensions.blender.org/download/sha256:70af09ebe58cca42406322bec092d5f9dfa857436b0518ad5e071a43a7155aa0/add-on-damped-track-chain-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/damped-track-chain/","maintainer":"shengmingu","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging"]},{"id":"blender_speed_curve","schema_version":"1.0.0","name":"Motion Style","version":"1.0.2","tagline":"AE-style easing sliders and F-Curve speed visualization","archive_hash":"sha256:4ae9d54a4e0f98159c979fba471646406574baa2b0809eef4db3e45d799d8d61","archive_size":6406,"archive_url":"https://extensions.blender.org/download/sha256:4ae9d54a4e0f98159c979fba471646406574baa2b0809eef4db3e45d799d8d61/add-on-blender-speed-curve-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blender-speed-curve/","maintainer":"Willy_Work","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"keymap_visualizer","schema_version":"1.0.0","name":"Keymap Visualizer","version":"1.0.1","tagline":"Visual keyboard-based keymap editor","archive_hash":"sha256:9276b55426937631b387d7bd2851d38eca184bbe68cdefb97ca08ccb4779c047","archive_size":202498,"archive_url":"https://extensions.blender.org/download/sha256:9276b55426937631b387d7bd2851d38eca184bbe68cdefb97ca08ccb4779c047/add-on-keymap-visualizer-v1.0.1.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/keymap-visualizer/","maintainer":"devanshutak25","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export keymap configurations and save/load presets to disk","clipboard":"Copy and paste keymap presets as JSON via the system clipboard"},"tags":["User Interface","System"]},{"id":"Evergreen_Theme","schema_version":"1.0.0","name":"Evergreen_Theme","version":"1.0.6","tagline":"Nature Verdure","archive_hash":"sha256:983a011e057339f40c8236faa5b0fa86d5b350c23921bc7fc7ee75da1a4725ba","archive_size":5918,"archive_url":"https://extensions.blender.org/download/sha256:983a011e057339f40c8236faa5b0fa86d5b350c23921bc7fc7ee75da1a4725ba/theme-evergreen-theme-v1.0.6.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/evergreen-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Colorful"]},{"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":"pataz_auto_hide_overlays","schema_version":"1.0.0","name":"Pataz Auto Hide Overlays","version":"5.2.4","tagline":"Hides overlays during transform or playback","archive_hash":"sha256:08259ebf900d77725d07cadffa57f0191fca637043e2196ac57d97292c7e1032","archive_size":5410,"archive_url":"https://extensions.blender.org/download/sha256:08259ebf900d77725d07cadffa57f0191fca637043e2196ac57d97292c7e1032/add-on-pataz-auto-hide-overlays-v5.2.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pataz-auto-hide-overlays/","maintainer":"zanqdo","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation"]},{"id":"chunk_render","schema_version":"1.0.0","name":"Chunk Render","version":"1.1.6","tagline":"Tile-based rendering for render regions","archive_hash":"sha256:4f26cec46d8ac35687cee4d53a47db19a627d0134a962b2a20a879d32168d7c8","archive_size":40484,"archive_url":"https://extensions.blender.org/download/sha256:4f26cec46d8ac35687cee4d53a47db19a627d0134a962b2a20a879d32168d7c8/add-on-chunk-render-v1.1.6.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/chunk-render/","maintainer":"Shuimeng","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write tile images and temp files for tile merging"},"tags":["Render"]},{"id":"maze_generator_pro","schema_version":"1.0.0","name":"Maze Generator Pro","version":"1.0.9","tagline":"3D maze generator with presets, themes and physics","archive_hash":"sha256:5c793ce964b312ccbeb3f87f8adba62c31367b95756240b47ee95ddf848a020c","archive_size":34426,"archive_url":"https://extensions.blender.org/download/sha256:5c793ce964b312ccbeb3f87f8adba62c31367b95756240b47ee95ddf848a020c/add-on-maze-generator-pro-v1.0.9.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":"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":"bezier_curve_editor","schema_version":"1.0.0","name":"Bezier Curve Editor","version":"1.0.9","tagline":"An editor for editing and applying easing curves","archive_hash":"sha256:ab137f8214bff91a68c9f81521bf7ac231803a3c1278591ccdccc23aee6583fb","archive_size":37823,"archive_url":"https://extensions.blender.org/download/sha256:ab137f8214bff91a68c9f81521bf7ac231803a3c1278591ccdccc23aee6583fb/add-on-bezier-curve-editor-v1.0.9.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.1.2","tagline":"Simple Camera Match - Blender插件","archive_hash":"sha256:21f39981ac34e28c3bcb7e878658255172e9c3abead818f86d022398708507ec","archive_size":38860,"archive_url":"https://extensions.blender.org/download/sha256:21f39981ac34e28c3bcb7e878658255172e9c3abead818f86d022398708507ec/add-on-simple-camera-match-v1.1.2-windows-arm64-windows-x64-macos-arm64-macos-x64-linux-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","linux-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.4.0","tagline":"Motion editing and curve manipulation","archive_hash":"sha256:4abfd5552386521577d9ee8905c57fc8ad427621c9853119b06c639032e636a8","archive_size":134027,"archive_url":"https://extensions.blender.org/download/sha256:4abfd5552386521577d9ee8905c57fc8ad427621c9853119b06c639032e636a8/add-on-org-eridanus-emotion-v0.4.0.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"],"permissions":{"files":"Read and write bezier presets, cache and trajectory data on disk"},"tags":["Animation","Rigging"]},{"id":"pin_solver","schema_version":"1.0.0","name":"PinSolver","version":"1.1.3","tagline":"Interactive camera alignment","archive_hash":"sha256:60c1c30085bad1dd877ab0fc96b2a5245b680782b8b6cb867952402c8f8c2160","archive_size":40111495,"archive_url":"https://extensions.blender.org/download/sha256:60c1c30085bad1dd877ab0fc96b2a5245b680782b8b6cb867952402c8f8c2160/add-on-pin-solver-v1.1.3-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":"2.1.0","tagline":"Theme inspired by Max","archive_hash":"sha256:8622e798a6f585258773580b255ef10e325da07c341460f55ebafe90aab5e15b","archive_size":5373,"archive_url":"https://extensions.blender.org/download/sha256:8622e798a6f585258773580b255ef10e325da07c341460f55ebafe90aab5e15b/theme-max-v2.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/max/","maintainer":"Dabidzhi","license":["SPDX:GPL-3.0-or-later"],"tags":["Inspired By","Dark"]},{"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":"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":"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":"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":"texture_manager","schema_version":"1.0.0","name":"Texture File Path Editor","version":"2.1.0","tagline":"Manage, relink, gather and inspect all texture paths","archive_hash":"sha256:6ebbfb82a808e721775ad42f9fb79005988083a0e9ed32b89c170c1a61abf567","archive_size":14000,"archive_url":"https://extensions.blender.org/download/sha256:6ebbfb82a808e721775ad42f9fb79005988083a0e9ed32b89c170c1a61abf567/add-on-texture-manager-v2.1.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":"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.1.0","tagline":"Generate customizable 3D text from LaTeX notation","archive_hash":"sha256:29b57fc18ffb92c2761f2cd697edbd20c2ac1fac2db0d2ac8fa20c5c9f6ff651","archive_size":862848,"archive_url":"https://extensions.blender.org/download/sha256:29b57fc18ffb92c2761f2cd697edbd20c2ac1fac2db0d2ac8fa20c5c9f6ff651/add-on-latex-text-generator-v1.1.0.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":"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":"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":"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":"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":"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":"batch_texture_converter","schema_version":"1.0.0","name":"Batch Texture Converter","version":"1.1.1","tagline":"Bulk texture conversion with color space and alpha splitting","archive_hash":"sha256:20fc830262828a9fa0fc5225a0bc6b254153b1cd5ec2cd40137a20952d1d9917","archive_size":4410,"archive_url":"https://extensions.blender.org/download/sha256:20fc830262828a9fa0fc5225a0bc6b254153b1cd5ec2cd40137a20952d1d9917/add-on-batch-texture-converter-v1.1.1.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":"pseudo_rendering_farm","schema_version":"1.0.0","name":"Pseudo Rendering Farm","version":"1.1.1","tagline":"Spawns multiple background processes to render the current file","archive_hash":"sha256:27d5a2528514192c942d9f12f00ee9421df5d33f9ba4c17f4ad9287bbf8ab23f","archive_size":5695,"archive_url":"https://extensions.blender.org/download/sha256:27d5a2528514192c942d9f12f00ee9421df5d33f9ba4c17f4ad9287bbf8ab23f/add-on-pseudo-rendering-farm-v1.1.1.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":"script_launcher","schema_version":"1.0.0","name":"Script Launcher","version":"1.2.2","tagline":"Manage and run Python scripts from multiple root folders","archive_hash":"sha256:581f512031bd2eced56563ecaaee2216ff54f9a37eb06552cb99086ec02191a2","archive_size":20482,"archive_url":"https://extensions.blender.org/download/sha256:581f512031bd2eced56563ecaaee2216ff54f9a37eb06552cb99086ec02191a2/add-on-script-launcher-v1.2.2.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":"gp_select","schema_version":"1.0.0","name":"Gp Select","version":"1.8.0","tagline":"Grease Pencil,Cutout,Weight,rig,lattice,and Automation toolkit","archive_hash":"sha256:80756bd8e85836cab24a854e788d307cd0f14e2780cfe030567e5824bf80f158","archive_size":70610,"archive_url":"https://extensions.blender.org/download/sha256:80756bd8e85836cab24a854e788d307cd0f14e2780cfe030567e5824bf80f158/add-on-gp-select-v1.8.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":"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.44","tagline":"Control shape keys using a 2D Axis HUD Joystick","archive_hash":"sha256:f5fe28bb6402aa003e2fd238520d80d0ea850c34bb657b3761ef11e019838f3d","archive_size":27009,"archive_url":"https://extensions.blender.org/download/sha256:f5fe28bb6402aa003e2fd238520d80d0ea850c34bb657b3761ef11e019838f3d/add-on-shapekey-axis-control-v4.0.44.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.8","tagline":"Easy toolbox for creating meshes from Grease Pencil","archive_hash":"sha256:3ef23bcfcd2cf46f1c9857c95875d6b2630668d694cc5910e4dea2aeacd1e2fd","archive_size":44826,"archive_url":"https://extensions.blender.org/download/sha256:3ef23bcfcd2cf46f1c9857c95875d6b2630668d694cc5910e4dea2aeacd1e2fd/add-on-grease-mesh-v1.0.8.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":"EyeZen","schema_version":"1.0.0","name":"Eye Zen","version":"1.0.5","tagline":"A Relaxing Theme","archive_hash":"sha256:3bf968a9f69ab54ab2e98366b8a5aa2e5e597730125885001422eb8a6718f888","archive_size":5732,"archive_url":"https://extensions.blender.org/download/sha256:3bf968a9f69ab54ab2e98366b8a5aa2e5e597730125885001422eb8a6718f888/theme-eyezen-v1.0.5.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/eyezen/","maintainer":"Sekuora","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":"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":"poly_copy_paste","schema_version":"1.0.0","name":"Poly Copy Paste","version":"1.1.1","tagline":"Copy / Cut / Paste polygons with Ctrl+C / Ctrl+X / Ctrl+V","archive_hash":"sha256:e6fd3da37dc17ea459a533dc81685044544a2d9dff27f32a8ce8b2aea64d3ad4","archive_size":3499,"archive_url":"https://extensions.blender.org/download/sha256:e6fd3da37dc17ea459a533dc81685044544a2d9dff27f32a8ce8b2aea64d3ad4/add-on-poly-copy-paste-v1.1.1.zip","type":"add-on","blender_version_min":"4.5.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":"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":"delete_empty_nla_tracks","schema_version":"1.0.0","name":"NLA Empty Track Cleanup RKNZ","version":"1.2.1","tagline":"Quickly remove all empty NLA tracks","archive_hash":"sha256:7c6a978f237665af5d5e4e102cc2127b6fbfbe5caba16ba7f49f5623e29fd2cd","archive_size":14568,"archive_url":"https://extensions.blender.org/download/sha256:7c6a978f237665af5d5e4e102cc2127b6fbfbe5caba16ba7f49f5623e29fd2cd/add-on-delete-empty-nla-tracks-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","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":"3.0.5","tagline":"Dark Crimson Futuristic Dystopian","archive_hash":"sha256:7fb2834a45fc41fd9f7f220be8be913e7af8cd4b0a9e71afdf1d5a31ea0fc851","archive_size":5652,"archive_url":"https://extensions.blender.org/download/sha256:7fb2834a45fc41fd9f7f220be8be913e7af8cd4b0a9e71afdf1d5a31ea0fc851/theme-cyberpunk-2077-ui-v3.0.5.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":"ThreeMF_io","schema_version":"1.0.0","name":"3MF Import/Export","version":"2.7.4","tagline":"Import and export 3D Manufacturing Format (3MF) files","archive_hash":"sha256:c7ae28365c5080ffc3969b6fe09ab5e91404a334d0a69e097f5aae446326c499","archive_size":348357,"archive_url":"https://extensions.blender.org/download/sha256:c7ae28365c5080ffc3969b6fe09ab5e91404a334d0a69e097f5aae446326c499/add-on-threemf-io-v2.7.4.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":"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":"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.2","tagline":"Procedural node based 3D tree generation","archive_hash":"sha256:3d7f199ef0d6ecb45286ebd89d2f606e64aa22a7f7c66c6fb051ad14fc41cf01","archive_size":3635450,"archive_url":"https://extensions.blender.org/download/sha256:3d7f199ef0d6ecb45286ebd89d2f606e64aa22a7f7c66c6fb051ad14fc41cf01/add-on-modular-tree-v5.5.2-windows-x64.zip","type":"add-on","blender_version_min":"4.3.1","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.1.1","tagline":"Airy Guardian Spirit","archive_hash":"sha256:a9d20299f83a859cdb6c883f31d49b085808f8e24e11e675a7c47260243a7896","archive_size":5763,"archive_url":"https://extensions.blender.org/download/sha256:a9d20299f83a859cdb6c883f31d49b085808f8e24e11e675a7c47260243a7896/theme-expecto-patronum-theme-v1.1.1.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.2.0","tagline":"Automatic 3D Tracking and Solving","archive_hash":"sha256:ef38ea45cd918ef704a8f0358c2013a13cc625eaa27e7f0b33d4382e531d1dfb","archive_size":70799,"archive_url":"https://extensions.blender.org/download/sha256:ef38ea45cd918ef704a8f0358c2013a13cc625eaa27e7f0b33d4382e531d1dfb/add-on-siemen-lens-blender-autotrack-v4.2.0.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.2","tagline":"Quickly isolate into local view the objects of a collection","archive_hash":"sha256:6f3a2f1d0357b8a236ce46b7adc4e4676655eb65ce451b6bdbc5b2d0d2984de8","archive_size":6670,"archive_url":"https://extensions.blender.org/download/sha256:6f3a2f1d0357b8a236ce46b7adc4e4676655eb65ce451b6bdbc5b2d0d2984de8/add-on-local-view-collection-v1.0.2.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.14","tagline":"Control object parameters through MIDI Input","archive_hash":"sha256:fb008d8f8788230800b85335d34f2c4e9d1ca4a6e1259b409bd54814690ee688","archive_size":537846,"archive_url":"https://extensions.blender.org/download/sha256:fb008d8f8788230800b85335d34f2c4e9d1ca4a6e1259b409bd54814690ee688/add-on-simplemidi-v0.1.14-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.3","tagline":"Vim-like key implementation for Blender","archive_hash":"sha256:910a7f1b8e040677339fa819303465c64045d4529896cc61aa4a0598ce2e539e","archive_size":194852,"archive_url":"https://extensions.blender.org/download/sha256:910a7f1b8e040677339fa819303465c64045d4529896cc61aa4a0598ce2e539e/add-on-chordsong-v1.2.3.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":"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":"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.4.4","tagline":"Visual Designer to build and export URDF/XACRO robot models","archive_hash":"sha256:61312b73ce4cabd84e59244a404eaa838ea0818f00c4c94e7ec03d2dc93974c9","archive_size":600768,"archive_url":"https://extensions.blender.org/download/sha256:61312b73ce4cabd84e59244a404eaa838ea0818f00c4c94e7ec03d2dc93974c9/add-on-linkforge-v1.4.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":"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":"retarget","schema_version":"1.0.0","name":"Retarget","version":"5.1.1","tagline":"Retargeting, convert to Rigify, Action Manager, Animation tools","archive_hash":"sha256:1a4e6f379e6a9631b3c34a17d02cf9da9f2cd4b505067460932443a6aa950ed5","archive_size":228598,"archive_url":"https://extensions.blender.org/download/sha256:1a4e6f379e6a9631b3c34a17d02cf9da9f2cd4b505067460932443a6aa950ed5/add-on-retarget-v5.1.1.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":"Import 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":"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":"outliner_preview","schema_version":"1.0.0","name":"Outliner Model Preview","version":"1.1.7","tagline":"Preview selected model in the Outliner","archive_hash":"sha256:e1b1bff9fb17cd7823635cfa10829adf2debd1d1e8c23d900bcf94092bc9d43f","archive_size":40651,"archive_url":"https://extensions.blender.org/download/sha256:e1b1bff9fb17cd7823635cfa10829adf2debd1d1e8c23d900bcf94092bc9d43f/add-on-outliner-preview-v1.1.7.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":"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.3","tagline":"Essential UV contrast. Absolute clarity for professional focus","archive_hash":"sha256:94647bd18186a01fafa4fe7b7dbb1d530dbb6687929ee72a85f0b7d944652050","archive_size":6344,"archive_url":"https://extensions.blender.org/download/sha256:94647bd18186a01fafa4fe7b7dbb1d530dbb6687929ee72a85f0b7d944652050/theme-colornova-v1.0.3.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":"sprite_sheet_maker","schema_version":"1.0.0","name":"Sprite Sheet Maker","version":"5.2.3","tagline":"3D to 2D sprite sheet converter with optional pixelation","archive_hash":"sha256:0e4681811e2b54bc9e74cf1d559c75a577e399047432bf09f61c94966aa3e99b","archive_size":7200095,"archive_url":"https://extensions.blender.org/download/sha256:0e4681811e2b54bc9e74cf1d559c75a577e399047432bf09f61c94966aa3e99b/add-on-sprite-sheet-maker-v5.2.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":"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":"kanagawa","schema_version":"1.0.0","name":"Kanagawa","version":"1.0.2","tagline":"kanagawa.nvim for Blender","archive_hash":"sha256:a8812fbee1f25670d4d3dc9e272e197c99ce40597974cfdb0629ebf4de643004","archive_size":6255,"archive_url":"https://extensions.blender.org/download/sha256:a8812fbee1f25670d4d3dc9e272e197c99ce40597974cfdb0629ebf4de643004/theme-kanagawa-v1.0.2.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":"cam_tools","schema_version":"1.0.0","name":"Cam Tools","version":"1.2.0","tagline":"Streamlined camera workflow toolkit","archive_hash":"sha256:2523840757e3aef22f5680cace31401194841bddf828b50f4ecdadb810e26a4e","archive_size":17639,"archive_url":"https://extensions.blender.org/download/sha256:2523840757e3aef22f5680cace31401194841bddf828b50f4ecdadb810e26a4e/add-on-cam-tools-v1.2.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":"io_scene_owm","schema_version":"1.0.0","name":"OWM Import","version":"3.3.1","tagline":"Import files from the Overwatch extraction tools (DataTool)","archive_hash":"sha256:9b6e6a11ce333504f4a09cbb599e940216133f7007cdbd274f2decfe071d9445","archive_size":279836,"archive_url":"https://extensions.blender.org/download/sha256:9b6e6a11ce333504f4a09cbb599e940216133f7007cdbd274f2decfe071d9445/add-on-io-scene-owm-v3.3.1.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.3","tagline":"A light theme directly inspired by Windows XP","archive_hash":"sha256:ca44d2ed04de48c14d142eb0104d9abc6591d41447559085622fca424530333e","archive_size":6738,"archive_url":"https://extensions.blender.org/download/sha256:ca44d2ed04de48c14d142eb0104d9abc6591d41447559085622fca424530333e/theme-windows-xp-theme-v1.0.3.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.2","tagline":"High-contrast dark theme with Zenless Zone Zero's signature","archive_hash":"sha256:070fce74a8da3a56906da1289cc73afdfe42ab5409b9fbb0418e828653747d86","archive_size":5517,"archive_url":"https://extensions.blender.org/download/sha256:070fce74a8da3a56906da1289cc73afdfe42ab5409b9fbb0418e828653747d86/theme-zzz-v1.0.2.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.4","tagline":"A Mint lavender theme for Blender with Lo-fi aesthetics","archive_hash":"sha256:f0f94cbdc8c430272abb6b7d0b94b94df7f70421eeeace7314e9c90d598053c5","archive_size":5405,"archive_url":"https://extensions.blender.org/download/sha256:f0f94cbdc8c430272abb6b7d0b94b94df7f70421eeeace7314e9c90d598053c5/theme-mintlavender-v1.0.4.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.1.0","tagline":"A clean dark-blue Blender theme","archive_hash":"sha256:4db02ebc9e554c4d07fd7d31c7661062ed8920d7e8dcc471d241af1ece347cf9","archive_size":5549,"archive_url":"https://extensions.blender.org/download/sha256:4db02ebc9e554c4d07fd7d31c7661062ed8920d7e8dcc471d241af1ece347cf9/theme-sleek-navy-v1.1.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.5","tagline":"Consistent UI, sharp colors, comfortable contrast, 3 birght lvls","archive_hash":"sha256:1cca72f14819c6b69e2f4c555680bde59a316390be13f5ce0fddd198c3b43d3a","archive_size":5471,"archive_url":"https://extensions.blender.org/download/sha256:1cca72f14819c6b69e2f4c555680bde59a316390be13f5ce0fddd198c3b43d3a/theme-studio-dark-v2.3.5.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.2","tagline":"Generate a control rig from Mixamo Fbx skeleton","archive_hash":"sha256:5c59e419355b0b4b5014b7bbcbee4d9a4c38476b8225526e3c904a81b056a191","archive_size":179337,"archive_url":"https://extensions.blender.org/download/sha256:5c59e419355b0b4b5014b7bbcbee4d9a4c38476b8225526e3c904a81b056a191/add-on-mixamo-rig-v1.2.2.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":"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":"img2mat_pro","schema_version":"1.0.0","name":"img2mat_pro","version":"2.0.0","tagline":"Image palettes, PMS matches, and material callouts","archive_hash":"sha256:b365c18e8c132ed1c31643ec6b1c29ccb5b6b3fd62ff911709fd73b5ac8740fe","archive_size":24619,"archive_url":"https://extensions.blender.org/download/sha256:b365c18e8c132ed1c31643ec6b1c29ccb5b6b3fd62ff911709fd73b5ac8740fe/add-on-img2mat-pro-v2.0.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":"cad_helper","schema_version":"1.0.0","name":"CAD-Helper","version":"0.7.0","tagline":"Blender Extension to manage imported CAD assemblies","archive_hash":"sha256:f3b569a0cd29d9d96745422d302b1fb94d78c8415e0dffdc73315376f3849fc2","archive_size":44789,"archive_url":"https://extensions.blender.org/download/sha256:f3b569a0cd29d9d96745422d302b1fb94d78c8415e0dffdc73315376f3849fc2/add-on-cad-helper-v0.7.0-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":"anim_reviewer","schema_version":"1.0.0","name":"Anim Reviewer","version":"1.1.0","tagline":"Enhance blender playblast capabilities for animation review","archive_hash":"sha256:c0a0fa57ace3f7b947b66c30eb0de9fc2d7ebd36c1915ff5ad96dfea46b7da12","archive_size":1336967,"archive_url":"https://extensions.blender.org/download/sha256:c0a0fa57ace3f7b947b66c30eb0de9fc2d7ebd36c1915ff5ad96dfea46b7da12/add-on-anim-reviewer-v1.1.0.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.3","tagline":"Export renders and images as Bayer-style DNG files","archive_hash":"sha256:a02d2f10564dbcfa599731d957db4daf8573ceac47ba417a7900c0739792ce1a","archive_size":25964,"archive_url":"https://extensions.blender.org/download/sha256:a02d2f10564dbcfa599731d957db4daf8573ceac47ba417a7900c0739792ce1a/add-on-export-render-as-dng-v1.0.3.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":"1.1.2","tagline":"Interactive 3D arrows for quick face symmetrize","archive_hash":"sha256:3c7a058812319863f5137904f2403264b1bba372f5300c04f82ea5fa4dcdc636","archive_size":8737,"archive_url":"https://extensions.blender.org/download/sha256:3c7a058812319863f5137904f2403264b1bba372f5300c04f82ea5fa4dcdc636/add-on-bh-smart-sym-v1.1.2.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.1.1","tagline":"Quickly Create, Edit, Organize, or Delete your local asset files","archive_hash":"sha256:7cbe5007e7416b8c82a88ac167ad0193b86d75d291649538f838df240bb7f441","archive_size":80302,"archive_url":"https://extensions.blender.org/download/sha256:7cbe5007e7416b8c82a88ac167ad0193b86d75d291649538f838df240bb7f441/add-on-quick-asset-saver-v2.1.1.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.5","tagline":"This is a variant of Whispering Ripples","archive_hash":"sha256:1348acaf02e162299334e97c05d89a3ed1bfccd5f4263db5ec6d26f9affd55ee","archive_size":5857,"archive_url":"https://extensions.blender.org/download/sha256:1348acaf02e162299334e97c05d89a3ed1bfccd5f4263db5ec6d26f9affd55ee/theme-beautiful-dream-v1.0.5.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.3.0","tagline":"Animate quickly by drawing trajectory line","archive_hash":"sha256:2cea314d9a7d46e9da8d24d51c7c1f55326c42ef46917a3beecc66ed97bfae83","archive_size":45832,"archive_url":"https://extensions.blender.org/download/sha256:2cea314d9a7d46e9da8d24d51c7c1f55326c42ef46917a3beecc66ed97bfae83/add-on-trajectory-anim-v1.3.0.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.2","tagline":"OLED theme for Blender","archive_hash":"sha256:b339a87acdc222758ce501b57fe534e06154e3791aeba471c86b742138cf6cca","archive_size":5884,"archive_url":"https://extensions.blender.org/download/sha256:b339a87acdc222758ce501b57fe534e06154e3791aeba471c86b742138cf6cca/theme-oled-v1.0.2.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.8","tagline":"Turn Outliner & Properties editors into a toggleable sidebar","archive_hash":"sha256:3cce7a702ba5d31f7f77f2d9bd64d335a1e134e53d2b29206b13476164edaa51","archive_size":25117,"archive_url":"https://extensions.blender.org/download/sha256:3cce7a702ba5d31f7f77f2d9bd64d335a1e134e53d2b29206b13476164edaa51/add-on-editorbar-v0.4.8.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":"k_tools_render_preset_manager","schema_version":"1.0.0","name":"K-Tools: Render Preset Manager","version":"1.3.1","tagline":"Save and Load Blender's Settings","archive_hash":"sha256:c2e2224553c604028b4715cb84bdc726b5a60cd1bf375757c4a9ff51bbf459f0","archive_size":92218,"archive_url":"https://extensions.blender.org/download/sha256:c2e2224553c604028b4715cb84bdc726b5a60cd1bf375757c4a9ff51bbf459f0/add-on-k-tools-render-preset-manager-v1.3.1.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":"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":"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":"2.2.0","tagline":"rotor","archive_hash":"sha256:14c0f05a311c5e60513de355274e7aada4e449b1831e530de0e82e1d9572bc62","archive_size":71356,"archive_url":"https://extensions.blender.org/download/sha256:14c0f05a311c5e60513de355274e7aada4e449b1831e530de0e82e1d9572bc62/add-on-rotor-v2.2.0.zip","type":"add-on","blender_version_min":"5.0.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.5.1","tagline":"Blockout","archive_hash":"sha256:7de7d28e969c5fce5feb9589185f8c8f042cc09e1d41e23f640b936e6dc76ed6","archive_size":179732,"archive_url":"https://extensions.blender.org/download/sha256:7de7d28e969c5fce5feb9589185f8c8f042cc09e1d41e23f640b936e6dc76ed6/add-on-blockout-v1.5.1.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.3","tagline":"Adds parallax node for shader nodes","archive_hash":"sha256:6f196f5aeb175b28c1d5cd0b4b674c8b2c2ae394bef5dfe6f87bf6687ca4e821","archive_size":12716,"archive_url":"https://extensions.blender.org/download/sha256:6f196f5aeb175b28c1d5cd0b4b674c8b2c2ae394bef5dfe6f87bf6687ca4e821/add-on-parallax-node-v1.1.3.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.2","tagline":"Technical rigging made easier","archive_hash":"sha256:85709b0be7bef891c778484d8182caf4869b32767cf28ab95275d17a219a0d55","archive_size":40933,"archive_url":"https://extensions.blender.org/download/sha256:85709b0be7bef891c778484d8182caf4869b32767cf28ab95275d17a219a0d55/add-on-easy-driver-v1.5.2.zip","type":"add-on","blender_version_min":"4.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.6","tagline":"Format Rename","archive_hash":"sha256:389000c6503f93d27a2506860690573d1155ada0571d834420da1b1bd11ba5ee","archive_size":19668,"archive_url":"https://extensions.blender.org/download/sha256:389000c6503f93d27a2506860690573d1155ada0571d834420da1b1bd11ba5ee/add-on-format-rename-v0.0.6.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":["System"]},{"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.9","tagline":"Layer-based compositing tool, similar to After Effects","archive_hash":"sha256:08a66a76ed4d82825968d5b8c7a5276ca37e51929d801ad666ea78f9d9a0c0f1","archive_size":554503,"archive_url":"https://extensions.blender.org/download/sha256:08a66a76ed4d82825968d5b8c7a5276ca37e51929d801ad666ea78f9d9a0c0f1/add-on-layer-comp-v1.1.9.zip","type":"add-on","blender_version_min":"5.0.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":"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":"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":"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.2","tagline":"A neutral grey theme with colorful accents","archive_hash":"sha256:d58ec79f4882ab7cd7c1ee527c0df326b1866fd1e6ee9bbe3a424765ce2c48d8","archive_size":5846,"archive_url":"https://extensions.blender.org/download/sha256:d58ec79f4882ab7cd7c1ee527c0df326b1866fd1e6ee9bbe3a424765ce2c48d8/theme-candymouse-v1.1.2.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.3","tagline":"The Mandelbrot set using only Integer Math and Bit Math Nodes","archive_hash":"sha256:db3afe337e319b0a42ca1d4731c281924be16a7f583eb4f9f9ea27d9e9f81947","archive_size":46805,"archive_url":"https://extensions.blender.org/download/sha256:db3afe337e319b0a42ca1d4731c281924be16a7f583eb4f9f9ea27d9e9f81947/add-on-i32-the-mandelbrot-set-v1.0.3.zip","type":"add-on","blender_version_min":"5.2.0","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.14","tagline":"Mesh Based Motion Tracking in Blender","archive_hash":"sha256:e687a1b30e20971951176d5ad136acd6f945904f9e0d1054043f506e3c1bc9d0","archive_size":6053241,"archive_url":"https://extensions.blender.org/download/sha256:e687a1b30e20971951176d5ad136acd6f945904f9e0d1054043f506e3c1bc9d0/add-on-polychase-v0.0.14-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.3.1","tagline":"Chalk on Dark","archive_hash":"sha256:6f8e586e447e1846cd5cf6bc11b2b209d6513279844149581a1fd5c835d36aee","archive_size":5716,"archive_url":"https://extensions.blender.org/download/sha256:6f8e586e447e1846cd5cf6bc11b2b209d6513279844149581a1fd5c835d36aee/theme-blackboard-theme-v2.3.1.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.7","tagline":"Precision Surface Design","archive_hash":"sha256:9451d01e5b72005bdd492d45572d01bdfc496f0e64bdd63a84c49603986bcde1","archive_size":51716083,"archive_url":"https://extensions.blender.org/download/sha256:9451d01e5b72005bdd492d45572d01bdfc496f0e64bdd63a84c49603986bcde1/add-on-surfacepsycho-v0.9.7-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":"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.3","tagline":"Update all keyframes relatively on transform changes","archive_hash":"sha256:ecc8d313128cc14480d90c40ab5558eab2fded25757f242ddddc4d5a14cd64e1","archive_size":15402,"archive_url":"https://extensions.blender.org/download/sha256:ecc8d313128cc14480d90c40ab5558eab2fded25757f242ddddc4d5a14cd64e1/add-on-anim-auto-offset-v1.3.3.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.3.1","tagline":"Technical Drawing","archive_hash":"sha256:26176f60d47e6e14d43ae0404d10ba688ee8336478d6b44402855ca2de760d5e","archive_size":5758,"archive_url":"https://extensions.blender.org/download/sha256:26176f60d47e6e14d43ae0404d10ba688ee8336478d6b44402855ca2de760d5e/theme-blueprint-paper-theme-v2.3.1.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":"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":"BL_FastStart","schema_version":"1.0.0","name":"BL Fast Start (MP4/MOV)","version":"1.9.4","tagline":"A checkbox to add a 'Fast Start' copy of MP4/MOV renders","archive_hash":"sha256:6816f8d0815101c8ffdc93530e012e6e770dfc8ffc9b5ac441ae57eb74407694","archive_size":22865,"archive_url":"https://extensions.blender.org/download/sha256:6816f8d0815101c8ffdc93530e012e6e770dfc8ffc9b5ac441ae57eb74407694/add-on-bl-faststart-v1.9.4.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":"jiggle_physics","schema_version":"1.0.0","name":"Jiggle Physics","version":"4.5.2","tagline":"Add stretchy jiggle physics to your Blender rigs","archive_hash":"sha256:26daa9b47b41a1f18aa38c4103f7127c906698ad56e4f9f090e6092f83212239","archive_size":32913,"archive_url":"https://extensions.blender.org/download/sha256:26daa9b47b41a1f18aa38c4103f7127c906698ad56e4f9f090e6092f83212239/add-on-jiggle-physics-v4.5.2.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.1.0","tagline":"Powerful Make Planar Faces Operator","archive_hash":"sha256:de63571b8ee2edafff87ba9bc95a71495cdc15f61c8b8b16d9d5ee01fac65fe4","archive_size":258249,"archive_url":"https://extensions.blender.org/download/sha256:de63571b8ee2edafff87ba9bc95a71495cdc15f61c8b8b16d9d5ee01fac65fe4/add-on-makeplanarfacesplus-v1.1.0-windows-x64.zip","type":"add-on","blender_version_min":"5.1.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.3.0","tagline":"Generate iso-surface meshes using the Marching Cubes algorithm","archive_hash":"sha256:4a372e364622fa0539b87f9522bbd60c58e6e06e3e2dc32d725c10707343db18","archive_size":41468991,"archive_url":"https://extensions.blender.org/download/sha256:4a372e364622fa0539b87f9522bbd60c58e6e06e3e2dc32d725c10707343db18/add-on-marchingcube-v0.3.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.3","tagline":"Easy to use shader-based terrain generator for Cycles","archive_hash":"sha256:802d22cc5d7dbce0221d3399bc23b8f96799ba5c66421d7261016bd64d5800ac","archive_size":66614047,"archive_url":"https://extensions.blender.org/download/sha256:802d22cc5d7dbce0221d3399bc23b8f96799ba5c66421d7261016bd64d5800ac/add-on-terrainmixer-v3.1.3.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":"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":"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":"2.0.0","tagline":"Set vertex distance single vertex or connected component","archive_hash":"sha256:b7ef6995d2f2953d1b6af31b947e4f47d1194f1cf775bb6c8c23a1343b1dbed7","archive_size":3128,"archive_url":"https://extensions.blender.org/download/sha256:b7ef6995d2f2953d1b6af31b947e4f47d1194f1cf775bb6c8c23a1343b1dbed7/add-on-set-vertex-distance-v2.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.4.0","tagline":"A UI List implementation for Blender's modifier stack","archive_hash":"sha256:9da5047863bb70c7c86ea0ea77976c1562fef3c98dbc672e8ea81ab05fb85138","archive_size":6635,"archive_url":"https://extensions.blender.org/download/sha256:9da5047863bb70c7c86ea0ea77976c1562fef3c98dbc672e8ea81ab05fb85138/add-on-modifer-stack-manager-v1.4.0.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.5.1","tagline":"Sculpting using only a pen and keyboard","archive_hash":"sha256:2501fc16046f53c0d5eadb046baaa1fc5203c30650b8bf642139d12bec040f55","archive_size":544191,"archive_url":"https://extensions.blender.org/download/sha256:2501fc16046f53c0d5eadb046baaa1fc5203c30650b8bf642139d12bec040f55/add-on-bbrush-v1.5.1.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":"View navigation texture load"},"tags":["Sculpt"]},{"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":"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":"3.0.3","tagline":"Inspired by the old Steam UI. ","archive_hash":"sha256:9982ed52c45db941e0203689374d2942ed6207dc11f65fe12a8062123dcadf7f","archive_size":5495,"archive_url":"https://extensions.blender.org/download/sha256:9982ed52c45db941e0203689374d2942ed6207dc11f65fe12a8062123dcadf7f/theme-steam-v3.0.3.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.6.2","tagline":"Streamlined mesh export for game development workflows","archive_hash":"sha256:874bb4a47f6664fd1a77a3ea9fc887d3907d7a662cc85342a299e0fbad4cf9b2","archive_size":80528,"archive_url":"https://extensions.blender.org/download/sha256:874bb4a47f6664fd1a77a3ea9fc887d3907d7a662cc85342a299e0fbad4cf9b2/add-on-easymesh-batch-exporter-v1.6.2.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.8.2","tagline":"One click export to multiple files","archive_hash":"sha256:78bf2172083f1cd455aee1d709c0d5a33170dbc5734c5959ca6cd5059bbc8a51","archive_size":30522,"archive_url":"https://extensions.blender.org/download/sha256:78bf2172083f1cd455aee1d709c0d5a33170dbc5734c5959ca6cd5059bbc8a51/add-on-superduperbatchexporter-v2.8.2.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":"3DemFX","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":"1.0.1","tagline":"Resolution, Scene and Render properties for each camera instance","archive_hash":"sha256:c035744e1b619829607ce767b7f7e3dc97985bb412de7216793f34a3109e8b0d","archive_size":78843,"archive_url":"https://extensions.blender.org/download/sha256:c035744e1b619829607ce767b7f7e3dc97985bb412de7216793f34a3109e8b0d/add-on-individual-camera-properties-v1.0.1.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"],"permissions":{"files":"To save and write presets files to disk"},"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.2","tagline":"Make Asset Catalogs from selected Collections","archive_hash":"sha256:417f58839a3f7e90e31733319d75e4317e9415926fd379e605bc54bb61b5a540","archive_size":2677,"archive_url":"https://extensions.blender.org/download/sha256:417f58839a3f7e90e31733319d75e4317e9415926fd379e605bc54bb61b5a540/add-on-quickcatalogs-v1.0.2.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":"2.0.0","tagline":"A futuristic neon theme for Blender","archive_hash":"sha256:ec0e4a9ff5bfe79411d7dd3ece3e9cb3efad2c28e612c8135733e072b0ae9849","archive_size":6238,"archive_url":"https://extensions.blender.org/download/sha256:ec0e4a9ff5bfe79411d7dd3ece3e9cb3efad2c28e612c8135733e072b0ae9849/theme-neon-nexus-v2.0.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":"3.0.0","tagline":"This is another extension","archive_hash":"sha256:84b584efded84667d8dfb689775d9b528f41658c6a6d68e2b8f6af342e32bc00","archive_size":7421,"archive_url":"https://extensions.blender.org/download/sha256:84b584efded84667d8dfb689775d9b528f41658c6a6d68e2b8f6af342e32bc00/theme-neutro-laranja-v3.0.0.zip","type":"theme","blender_version_min":"5.1.0","website":"https://extensions.blender.org/themes/neutro-laranja/","maintainer":"Push","license":["SPDX:GPL-3.0-or-later"],"tags":["Accessibility","Light"]},{"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":"theme_2000","schema_version":"1.0.0","name":"Theme 2000","version":"1.1.2","tagline":"Inspired by Windows XP, MS office 2007, Sims","archive_hash":"sha256:bf408b6600cddfacf2a9ecfb3b14352153cee68629e1a0ae6e581451f696169a","archive_size":5758,"archive_url":"https://extensions.blender.org/download/sha256:bf408b6600cddfacf2a9ecfb3b14352153cee68629e1a0ae6e581451f696169a/theme-theme-2000-v1.1.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/theme-2000/","maintainer":"danil_orlow","license":["SPDX:GPL-2.0-or-later"],"tags":["Light","Inspired By"]},{"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.3.2","tagline":"PureRef for Blender. You can add references in the 3D Viewport","archive_hash":"sha256:b849d80c20d6b50dcc5a4228f1aedc1bbc38edf2b18f78422f803c18bc2860a3","archive_size":14178245,"archive_url":"https://extensions.blender.org/download/sha256:b849d80c20d6b50dcc5a4228f1aedc1bbc38edf2b18f78422f803c18bc2860a3/add-on-references-overlays-v2.3.2-windows-x64.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"},"platforms":["windows-x64"],"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":"PlaceHelper","schema_version":"1.0.0","name":"Place Helper","version":"2.0.0","tagline":"Place, align and scatter objects with ease","archive_hash":"sha256:b716a8028e846db794aff472e96b475f2593082b898355a46502d3cc03013544","archive_size":99170,"archive_url":"https://extensions.blender.org/download/sha256:b716a8028e846db794aff472e96b475f2593082b898355a46502d3cc03013544/add-on-placehelper-v2.0.0.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","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":"1.0.0","tagline":"90s, xp, old","archive_hash":"sha256:fe107f25135c986dc75a83ac02114a31ef88628683ac3b58dc2a12341621aa7e","archive_size":5999,"archive_url":"https://extensions.blender.org/download/sha256:fe107f25135c986dc75a83ac02114a31ef88628683ac3b58dc2a12341621aa7e/theme-blend95-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","blender_version_max":"10.0.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.9","tagline":"Simple and fast lighting with improved selection","archive_hash":"sha256:878f79ee310be191098c731ee907a9eb8bf2086800af7f659543e7501a0cc7af","archive_size":90483,"archive_url":"https://extensions.blender.org/download/sha256:878f79ee310be191098c731ee907a9eb8bf2086800af7f659543e7501a0cc7af/add-on-quick-studio-light-v1.1.9.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":"typst_importer","schema_version":"1.0.0","name":"Typst Importer","version":"0.3.7","tagline":"Render mathematical equations and code blocks","archive_hash":"sha256:3fd01a8fa572bcceb910bfe3eb931058220822da8bcb721c5bc8ba4c4260cff7","archive_size":35882774,"archive_url":"https://extensions.blender.org/download/sha256:3fd01a8fa572bcceb910bfe3eb931058220822da8bcb721c5bc8ba4c4260cff7/add-on-typst-importer-v0.3.7-windows-x64.zip","type":"add-on","blender_version_min":"5.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.6","tagline":"Shift+Q|Ctrl+Q Pie menu-Align Nodes in Multiple Ways(多种方式对齐节点)","archive_hash":"sha256:eab7487c2e0925279ef8184ac6e611bf88c4a9f964a5fc72f6f5b9bf7c959403","archive_size":23687,"archive_url":"https://extensions.blender.org/download/sha256:eab7487c2e0925279ef8184ac6e611bf88c4a9f964a5fc72f6f5b9bf7c959403/add-on-node-align-v3.2.6.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":"2026.2.0","tagline":"Tool to simplify scenes for improved viewport performance","archive_hash":"sha256:52e7ba18e9956e98f977cdaef9e2f5838ef9a0d63f0a1b2dddb2a43c3db06ace","archive_size":56521,"archive_url":"https://extensions.blender.org/download/sha256:52e7ba18e9956e98f977cdaef9e2f5838ef9a0d63f0a1b2dddb2a43c3db06ace/add-on-mustardsimplify-v2026.2.0.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.7","tagline":"Grease Pencil Toobar in N sidebar with auto mode switch","archive_hash":"sha256:80a8be8f55be5ecf1491c0f255a905d09ac187e7d25070c4b10ee5459fc4cae9","archive_size":53548,"archive_url":"https://extensions.blender.org/download/sha256:80a8be8f55be5ecf1491c0f255a905d09ac187e7d25070c4b10ee5459fc4cae9/add-on-quicktools-v3-v1.1.7.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":"Node Attribute List(节点属性列表)","version":"2.11.0","tagline":"Quickly Add Attribute Node in GN and Shader(几何节点和材质里快速添加属性节点)","archive_hash":"sha256:2403d64ec154913f5a72543e78ccdd6280df9f6010e9e2fe08d9cdc6e8f78658","archive_size":100935,"archive_url":"https://extensions.blender.org/download/sha256:2403d64ec154913f5a72543e78ccdd6280df9f6010e9e2fe08d9cdc6e8f78658/add-on-named-attribute-list-v2.11.0.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":"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.8","tagline":"Qucik add/split/merge Group Input node/socket(快速添加拆分合并移动组输入节点接口)","archive_hash":"sha256:0e0563d36700e10a98c0c124d20d6866186625a0d351a21096caf45a318b0007","archive_size":76056,"archive_url":"https://extensions.blender.org/download/sha256:0e0563d36700e10a98c0c124d20d6866186625a0d351a21096caf45a318b0007/add-on-group-input-helper-v2.9.8.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":"botanesque","schema_version":"1.0.0","name":"Botanesque","version":"1.1.0","tagline":"Cozy brown blender theme","archive_hash":"sha256:fe991ce8b287c8aaea5f3c4cf503be2afd1fb96daa9ee0eb0a954b9cdc70a200","archive_size":5736,"archive_url":"https://extensions.blender.org/download/sha256:fe991ce8b287c8aaea5f3c4cf503be2afd1fb96daa9ee0eb0a954b9cdc70a200/theme-botanesque-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/botanesque/","maintainer":"polygoniq","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"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.36.8","tagline":"Import-Export Pod tracks, ghosts, images, and cars","archive_hash":"sha256:a419a08af2dba5dbf487fbe33e98ad3738594e8549718332f4d719aac8c6b57b","archive_size":7257423,"archive_url":"https://extensions.blender.org/download/sha256:a419a08af2dba5dbf487fbe33e98ad3738594e8549718332f4d719aac8c6b57b/add-on-io-scene-pod-v0.36.8-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":"RetroGrey","schema_version":"1.0.0","name":"RetroGrey","version":"1.3.4","tagline":"Theme inspired by the grey color of 90s computer devices","archive_hash":"sha256:efae32bcfb363f12d5be7c11b3dc9398fa938f0113f3524e96f37e84582ff758","archive_size":6837,"archive_url":"https://extensions.blender.org/download/sha256:efae32bcfb363f12d5be7c11b3dc9398fa938f0113f3524e96f37e84582ff758/theme-retrogrey-v1.3.4.zip","type":"theme","blender_version_min":"5.0.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.2","tagline":"Show users, merge duplicates, find similar, and more","archive_hash":"sha256:db3574b4ae63feb175a5027b3d393fb586ba2d1cdf605618ca69f8c3b6592e07","archive_size":1740530,"archive_url":"https://extensions.blender.org/download/sha256:db3574b4ae63feb175a5027b3d393fb586ba2d1cdf605618ca69f8c3b6592e07/add-on-datablock-utils-v1.3.2.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.16","tagline":"Human character generator and editor","archive_hash":"sha256:b5cdc8b08147e0c6463e4faa01147491b13a0b062f73415363f029debd11c934","archive_size":44978070,"archive_url":"https://extensions.blender.org/download/sha256:b5cdc8b08147e0c6463e4faa01147491b13a0b062f73415363f029debd11c934/add-on-mpfb-v2.0.16.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.55","tagline":"Modern Primitive for Non-Destructive Modeling","archive_hash":"sha256:73cbd13d9a7f39c60fc49a48752ebcfcd078f215db9304a26cf4e22a398a0bf8","archive_size":3407351,"archive_url":"https://extensions.blender.org/download/sha256:73cbd13d9a7f39c60fc49a48752ebcfcd078f215db9304a26cf4e22a398a0bf8/add-on-modern-primitive-v0.0.55.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":"orange_dark_vignette","schema_version":"1.0.0","name":"Orange Dark + Vignette","version":"1.1.0","tagline":"Transparent orange UI and vignette, Blender colors","archive_hash":"sha256:4713520790d11b9b883ee47b9f9fb751615cb5c1d02ad3c4aa455d40ca08832d","archive_size":5835,"archive_url":"https://extensions.blender.org/download/sha256:4713520790d11b9b883ee47b9f9fb751615cb5c1d02ad3c4aa455d40ca08832d/theme-orange-dark-vignette-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/orange-dark-vignette/","maintainer":"danil_orlow","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"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":"1.3.0","tagline":"tools for game assets, fixed Unreal FBX exports","archive_hash":"sha256:14f7544d04722472d4b24bbdb04550aea16c39c6e5e8a49dfe46220dbe274802","archive_size":28673,"archive_url":"https://extensions.blender.org/download/sha256:14f7544d04722472d4b24bbdb04550aea16c39c6e5e8a49dfe46220dbe274802/add-on-proto-game-asset-tools-v1.3.0.zip","type":"add-on","blender_version_min":"4.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.1.1","tagline":"Access Unicode characters","archive_hash":"sha256:8f2e8f263321c2d29cd54ddbb3bb25d04965f5f58921b5749702e475774cd83c","archive_size":40909,"archive_url":"https://extensions.blender.org/download/sha256:8f2e8f263321c2d29cd54ddbb3bb25d04965f5f58921b5749702e475774cd83c/add-on-b-unicode-v1.1.1.zip","type":"add-on","blender_version_min":"5.1.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.6","tagline":"Measure distances, edge lengths, and angles in Edit Mode","archive_hash":"sha256:c541631ac21cda9bf95205851e0910404ba01b115bc524a26f2b60b9f9cd4dae","archive_size":137848,"archive_url":"https://extensions.blender.org/download/sha256:c541631ac21cda9bf95205851e0910404ba01b115bc524a26f2b60b9f9cd4dae/add-on-sco-edgewise-v2.0.6.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.1.5","tagline":"Automatically change the header color based on the current mode","archive_hash":"sha256:eae884fe1f34f0453d23b0b254ab85a2cd3e85b7b95dbf867a65fd7370c804c4","archive_size":13305,"archive_url":"https://extensions.blender.org/download/sha256:eae884fe1f34f0453d23b0b254ab85a2cd3e85b7b95dbf867a65fd7370c804c4/add-on-k-tools-mode-highlight-v1.1.5.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.10.2","tagline":"Box, lasso and circle selection tools with x-ray","archive_hash":"sha256:5abcac3932b30d66b8d693aaf6cf54811b9944a6fb7226f0819fe29e3157134e","archive_size":88167,"archive_url":"https://extensions.blender.org/download/sha256:5abcac3932b30d66b8d693aaf6cf54811b9944a6fb7226f0819fe29e3157134e/add-on-xray-selection-tools-v4.10.2.zip","type":"add-on","blender_version_min":"5.1.1","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":"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":"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":"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":"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.4","tagline":"Shading pie for designers and artists","archive_hash":"sha256:af133ec48e4121248200435f78a3f9d7601ad80b6b47fe68d6fa906870117b67","archive_size":50470985,"archive_url":"https://extensions.blender.org/download/sha256:af133ec48e4121248200435f78a3f9d7601ad80b6b47fe68d6fa906870117b67/add-on-shadingplus-v1.1.4.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":"brushstroke_tools","schema_version":"1.0.0","name":"Brushstroke Tools","version":"1.2.3","tagline":"Brushstroke painting tools by the Blender Studio","archive_hash":"sha256:b66728b70b2d6af5ad942b5aa27fcc540db0972c22169480aa552d1e22061fe4","archive_size":29638062,"archive_url":"https://extensions.blender.org/download/sha256:b66728b70b2d6af5ad942b5aa27fcc540db0972c22169480aa552d1e22061fe4/add-on-brushstroke-tools-v1.2.3.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.10","tagline":"Easier game asset creation","archive_hash":"sha256:725dbcc49ccbbaac34d6733f44dcae055ce4ed2c304822df7c5a91417e2e0283","archive_size":162741,"archive_url":"https://extensions.blender.org/download/sha256:725dbcc49ccbbaac34d6733f44dcae055ce4ed2c304822df7c5a91417e2e0283/add-on-gamiflow-v1.9.10.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.2.0","tagline":"UV Edit Assistant Tools","archive_hash":"sha256:597e349839c347c7894381b4fcbcea7777ec034f604ad753bcb1038323478219","archive_size":5203225,"archive_url":"https://extensions.blender.org/download/sha256:597e349839c347c7894381b4fcbcea7777ec034f604ad753bcb1038323478219/add-on-mio3-uv-v2.2.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.4","tagline":"Move and rotate HDRIs, Shadows and Lights from the viewport","archive_hash":"sha256:69e4cb8239059d348bce877309c59df997c37162b7b3d04f2aebd74edb0b5b53","archive_size":20170,"archive_url":"https://extensions.blender.org/download/sha256:69e4cb8239059d348bce877309c59df997c37162b7b3d04f2aebd74edb0b5b53/add-on-hdrirotator-v1.1.4.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":"C3DB","schema_version":"1.0.0","name":"3D Cursors Briefcase","version":"0.1.8","tagline":"Store and manage multiple 3D Cursors","archive_hash":"sha256:41c7aa4374a6bb8a05e2e2f024d8e0d8c503c9c14c52bd48785e9c0b4ce9da38","archive_size":6803,"archive_url":"https://extensions.blender.org/download/sha256:41c7aa4374a6bb8a05e2e2f024d8e0d8c503c9c14c52bd48785e9c0b4ce9da38/add-on-c3db-v0.1.8.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.1.0","tagline":"Camera specific Resolution, Frame Range, Output Path & Format","archive_hash":"sha256:564539c2e6e457a83e4879fee123e966fda3da429b072255e38e01757f322e89","archive_size":68544,"archive_url":"https://extensions.blender.org/download/sha256:564539c2e6e457a83e4879fee123e966fda3da429b072255e38e01757f322e89/add-on-cameraide-settings-v1.1.0.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.1","tagline":"merge selected bones into the active bone","archive_hash":"sha256:ce830a02f48ccc0ed33ec043729df2cb83acb0ba0b91eb3f5f914e5339add61a","archive_size":17934,"archive_url":"https://extensions.blender.org/download/sha256:ce830a02f48ccc0ed33ec043729df2cb83acb0ba0b91eb3f5f914e5339add61a/add-on-org-tayou-bone-vertex-group-merge-v1.4.1.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.2","tagline":"A set of tools to make vertex painting easier","archive_hash":"sha256:1fbaa310bd64dfa268b1ed52895f894e2d9d4c7eca7de88034a3eae5d1dd93d3","archive_size":57737,"archive_url":"https://extensions.blender.org/download/sha256:1fbaa310bd64dfa268b1ed52895f894e2d9d4c7eca7de88034a3eae5d1dd93d3/add-on-more-colors-v1.2.2.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.8","tagline":"Addon for this rig","archive_hash":"sha256:9a3e7a31cb7fedeb7ed71bc6295e682dcc0c129f1b65c7de04c0dd34295469fe","archive_size":10605168,"archive_url":"https://extensions.blender.org/download/sha256:9a3e7a31cb7fedeb7ed71bc6295e682dcc0c129f1b65c7de04c0dd34295469fe/add-on-thomas-rig-legacy-v1.2.8.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"},"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":"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":"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":"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":"Neo_Grey_Theme","schema_version":"1.0.0","name":"Neo_Grey_Theme","version":"2.5.2","tagline":"Dust Cloud","archive_hash":"sha256:82dc471246367596754ec134acefa92d725b071ee066a650063231a81fb401d5","archive_size":5688,"archive_url":"https://extensions.blender.org/download/sha256:82dc471246367596754ec134acefa92d725b071ee066a650063231a81fb401d5/theme-neo-grey-theme-v2.5.2.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":"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":"4.0.0","tagline":"Smart UV Tools","archive_hash":"sha256:734a70137ab6824c9b4294a8aef2cd76e23c667795ebf7f360668ebe45968963","archive_size":471709,"archive_url":"https://extensions.blender.org/download/sha256:734a70137ab6824c9b4294a8aef2cd76e23c667795ebf7f360668ebe45968963/add-on-univ-v4.0.0.zip","type":"add-on","blender_version_min":"4.2.0","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":"dark_17","schema_version":"1.0.0","name":"17 Dark","version":"1.0.2","tagline":"Makes Blender darker","archive_hash":"sha256:c1527478cbb92a6f87eadb887b6971534c97e2222d580578c77118a140ba3ddb","archive_size":5616,"archive_url":"https://extensions.blender.org/download/sha256:c1527478cbb92a6f87eadb887b6971534c97e2222d580578c77118a140ba3ddb/theme-dark-17-v1.0.2.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/dark-17/","maintainer":"S41L0R","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"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.2.0","tagline":"Turn node groups into Python code","archive_hash":"sha256:a23d847def65873bf284ab0c80108bd45db61104f7a45fe44f7ec38d849f75e4","archive_size":82229,"archive_url":"https://extensions.blender.org/download/sha256:a23d847def65873bf284ab0c80108bd45db61104f7a45fe44f7ec38d849f75e4/add-on-node-to-python-v4.2.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.7.0","tagline":"Use your own .blend files as template options for new projects","archive_hash":"sha256:b28b219df1598bd2359a9dfa5c5fd99e714c97792ad5947adc64634018b9cff8","archive_size":18893,"archive_url":"https://extensions.blender.org/download/sha256:b28b219df1598bd2359a9dfa5c5fd99e714c97792ad5947adc64634018b9cff8/add-on-custom-templates-v1.7.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.3.2","tagline":"Soft Light","archive_hash":"sha256:03ba0f0c9e8e8a7b33af2d83c4c94697d1d0df40f44c49ce839592247633f064","archive_size":5668,"archive_url":"https://extensions.blender.org/download/sha256:03ba0f0c9e8e8a7b33af2d83c4c94697d1d0df40f44c49ce839592247633f064/theme-elegant-light-theme-v2.3.2.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.4","tagline":"My Virtual Rig and General Device Type Format","archive_hash":"sha256:fd319cfc1eb8b9af4e36e6505a92084e4653154515060745e43b28ca60453a52","archive_size":317611,"archive_url":"https://extensions.blender.org/download/sha256:fd319cfc1eb8b9af4e36e6505a92084e4653154515060745e43b28ca60453a52/add-on-io-scene-mvr-v1.5.4.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":"2026.1.1","tagline":"Toolset for working with Texel Density","archive_hash":"sha256:ca5554ec5c08a830c344ddc08a4c4f8f2e619178ac05ef582ea0293ab540308d","archive_size":26191,"archive_url":"https://extensions.blender.org/download/sha256:ca5554ec5c08a830c344ddc08a4c4f8f2e619178ac05ef582ea0293ab540308d/add-on-texel-density-checker-v2026.1.1.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.8","tagline":"Effortlessly rename multiple objects with this simple addon","archive_hash":"sha256:32fc435f6daf82feaa711e1b23c960575fbefce3ae99504ca12bcd4f0eb120b1","archive_size":53269,"archive_url":"https://extensions.blender.org/download/sha256:32fc435f6daf82feaa711e1b23c960575fbefce3ae99504ca12bcd4f0eb120b1/add-on-simple-renaming-panel-v2.1.8.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":"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.6","tagline":"Tools for baking material sequences and generating sprite sheets","archive_hash":"sha256:a1235d8ac5b3ae98668e53cf5759dd1ad88e21cc5baf9c7d8d41b9e9d0555a7a","archive_size":44148,"archive_url":"https://extensions.blender.org/download/sha256:a1235d8ac5b3ae98668e53cf5759dd1ad88e21cc5baf9c7d8d41b9e9d0555a7a/add-on-sequenced-bake-v1.1.6.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":"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.8","tagline":"Customize file output paths with placeholders","archive_hash":"sha256:5b4b0bb7278624c271076cf910845d2318911da34e55d680749d7f9a219fea8b","archive_size":22437,"archive_url":"https://extensions.blender.org/download/sha256:5b4b0bb7278624c271076cf910845d2318911da34e55d680749d7f9a219fea8b/add-on-custom-output-path-v1.1.8.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.56","tagline":"Add nodes faster with a pie menu","archive_hash":"sha256:83d6a7229c6b20e63ca22ed99596bda5de6b816c9859969391b2738ebad75d0c","archive_size":478543,"archive_url":"https://extensions.blender.org/download/sha256:83d6a7229c6b20e63ca22ed99596bda5de6b816c9859969391b2738ebad75d0c/add-on-nodepie-v1.2.56.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.5.0","tagline":"Quick batch automation of common material tasks","archive_hash":"sha256:9a26ca20d1d0a13eb7dae7032c328343a18f6abeb4c0e7768dfdbefffbe0017c","archive_size":37453,"archive_url":"https://extensions.blender.org/download/sha256:9a26ca20d1d0a13eb7dae7032c328343a18f6abeb4c0e7768dfdbefffbe0017c/add-on-matbatchtools-v2.5.0.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.2.0","tagline":"Generate & optimize collision models for use in Source Engine","archive_hash":"sha256:494b10804c4457eb370357bd3aebd67f953bc65ad6ec47d86b16b9acd081c577","archive_size":68437,"archive_url":"https://extensions.blender.org/download/sha256:494b10804c4457eb370357bd3aebd67f953bc65ad6ec47d86b16b9acd081c577/add-on-sourceenginecollisiontools-v3.2.0.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":"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":"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.2.0","tagline":"A minimalistic dark theme","archive_hash":"sha256:6a5bfa1177c7708a10645d113ea632168fc1447c9c74d36a79cda3c55661c755","archive_size":5222,"archive_url":"https://extensions.blender.org/download/sha256:6a5bfa1177c7708a10645d113ea632168fc1447c9c74d36a79cda3c55661c755/theme-onyx-v1.2.0.zip","type":"theme","blender_version_min":"5.1.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":"2.0.0","tagline":"Professional theme with more vivid colors","archive_hash":"sha256:17b2b8b1c25538d6d70ec064278629430a29bb8ac9d1ba6b9e8d2f70d5fd2fa5","archive_size":5719,"archive_url":"https://extensions.blender.org/download/sha256:17b2b8b1c25538d6d70ec064278629430a29bb8ac9d1ba6b9e8d2f70d5fd2fa5/theme-professional-plus-v2.0.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.2","tagline":"Improvements to Blender's Autosave","archive_hash":"sha256:294d6c544419e840d8927f6b88095b409afb2841753d2d9e8447bf8b4d724d4f","archive_size":75152,"archive_url":"https://extensions.blender.org/download/sha256:294d6c544419e840d8927f6b88095b409afb2841753d2d9e8447bf8b4d724d4f/add-on-incremental-auto-save-v1.1.2.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":"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.6.2","tagline":"Easy-to-use UI for human characters","archive_hash":"sha256:b7e3d4c5c5374021267567d3541e69e21fdd9293233a44f494e2d80f18107cc3","archive_size":544375,"archive_url":"https://extensions.blender.org/download/sha256:b7e3d4c5c5374021267567d3541e69e21fdd9293233a44f494e2d80f18107cc3/add-on-mustardui-v2026.6.2.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":"K-Tools: Sync | Lock Viewport","version":"2.8.1","tagline":"Sync or Lock multiple viewports at once in real-time","archive_hash":"sha256:160d9135c53d5d5150671ec07ae181eea86b38bec05246b88fce791e08322956","archive_size":64885,"archive_url":"https://extensions.blender.org/download/sha256:160d9135c53d5d5150671ec07ae181eea86b38bec05246b88fce791e08322956/add-on-k-tools-view-sync-v2.8.1.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.2","tagline":"Batch Import many file formats at once, Batch process them","archive_hash":"sha256:a145cff633db3ece89da10b954898d397c44e9e61c74c392ccea1e801c23d234","archive_size":86464,"archive_url":"https://extensions.blender.org/download/sha256:a145cff633db3ece89da10b954898d397c44e9e61c74c392ccea1e801c23d234/add-on-universal-multi-importer-v2.4.2.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.13","tagline":"Utility tools for MMD model editing","archive_hash":"sha256:261cec171596c79fd204f39cc1227ffada3ced73626f27b5f915fd9dda619a69","archive_size":802456,"archive_url":"https://extensions.blender.org/download/sha256:261cec171596c79fd204f39cc1227ffada3ced73626f27b5f915fd9dda619a69/add-on-mmd-tools-v4.5.13.zip","type":"add-on","blender_version_min":"4.2.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":["Camera","Import-Export","Material","Mesh","Object","Physics"]},{"id":"bioxelnodes","schema_version":"1.0.0","name":"Bioxel Nodes","version":"2.0.4","tagline":"For scientific volumetric data visualization in Blender","archive_hash":"sha256:79a309c013dea28a7f8e54b9a1772073d19bf57f85b4dce124776543fb6e8e77","archive_size":138587632,"archive_url":"https://extensions.blender.org/download/sha256:79a309c013dea28a7f8e54b9a1772073d19bf57f85b4dce124776543fb6e8e77/add-on-bioxelnodes-v2.0.4-windows-x64.zip","type":"add-on","blender_version_min":"5.0.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":"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":"open_stage_blender_dmx","schema_version":"1.0.0","name":"DMX","version":"2.2.4","tagline":"Visualization & programming with GDTF&MVR","archive_hash":"sha256:96cd0cc92a446b37317170bbddd25bd6ec916c154ab3d3c9e14103fff8c79ce8","archive_size":2064675,"archive_url":"https://extensions.blender.org/download/sha256:96cd0cc92a446b37317170bbddd25bd6ec916c154ab3d3c9e14103fff8c79ce8/add-on-open-stage-blender-dmx-v2.2.4.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"}},{"id":"maze_generator","schema_version":"1.0.0","name":"Maze Generator","version":"0.3.1","tagline":"A Maze generator extension for Blender","archive_hash":"sha256:dd7cc3f38fb80df5ffafb6e3e70221469051bfcded84c78a784c320c0e3d15d1","archive_size":28418,"archive_url":"https://extensions.blender.org/download/sha256:dd7cc3f38fb80df5ffafb6e3e70221469051bfcded84c78a784c320c0e3d15d1/add-on-maze-generator-v0.3.1.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.3","tagline":"Super add-on for superfast booleans","archive_hash":"sha256:740c5b4965541f1e391be9d84a73aed98c28ae2e0b6a7db3a7f00f12c942661f","archive_size":48949,"archive_url":"https://extensions.blender.org/download/sha256:740c5b4965541f1e391be9d84a73aed98c28ae2e0b6a7db3a7f00f12c942661f/add-on-booltron-v3.3.3.zip","type":"add-on","blender_version_min":"4.5.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.3","tagline":"Just a little darker","archive_hash":"sha256:b5b0c094bcc136c5be57cf7cd413757cdc0e5673f865ab23574069dad94a5203","archive_size":5421,"archive_url":"https://extensions.blender.org/download/sha256:b5b0c094bcc136c5be57cf7cd413757cdc0e5673f865ab23574069dad94a5203/theme-dark-pro-v2.0.3.zip","type":"theme","blender_version_min":"5.0.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.24","tagline":"Rig Generation & Rigging Workflow Tools","archive_hash":"sha256:73b0aae42d594b88520d49a54532aa8ad6ac0296cc1eb178f76ad0f08dbbf97e","archive_size":3402855,"archive_url":"https://extensions.blender.org/download/sha256:73b0aae42d594b88520d49a54532aa8ad6ac0296cc1eb178f76ad0f08dbbf97e/add-on-cloudrig-v2.2.24.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.5","tagline":"Utilities for 3D printing","archive_hash":"sha256:0cb51b20599c3f69a2168e753b0e69c8577289ab198ae7c1498559f0e8d545c2","archive_size":148598,"archive_url":"https://extensions.blender.org/download/sha256:0cb51b20599c3f69a2168e753b0e69c8577289ab198ae7c1498559f0e8d545c2/add-on-print3d-toolbox-v1.3.5.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.5","tagline":"A comfortable medium dark theme for Blender","archive_hash":"sha256:a2c52a73fab56be425cd592f735d2909382ec53948b5da8b54f09e491870e7e6","archive_size":5595,"archive_url":"https://extensions.blender.org/download/sha256:a2c52a73fab56be425cd592f735d2909382ec53948b5da8b54f09e491870e7e6/theme-theme-deep-grey-v2.0.5.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.12.1","tagline":"Arrange node trees with one click","archive_hash":"sha256:ccce3db24525e89ab7c019a550bba1adbbe6bb5ccfc78a1957c484b8bd8d6c06","archive_size":1756301,"archive_url":"https://extensions.blender.org/download/sha256:ccce3db24525e89ab7c019a550bba1adbbe6bb5ccfc78a1957c484b8bd8d6c06/add-on-node-arrange-v1.12.1.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":"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":"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":"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":"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.12","tagline":"Manage collections and their objects","archive_hash":"sha256:623eca06047acc9a548bb1a58b3eed2ab4357524826bfa2da8a95ace2c4f569a","archive_size":42507,"archive_url":"https://extensions.blender.org/download/sha256:623eca06047acc9a548bb1a58b3eed2ab4357524826bfa2da8a95ace2c4f569a/add-on-collection-manager-v2.24.12.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.1.0","tagline":"Quick Boolean operators and tools for hard surface modeling","archive_hash":"sha256:d3a282db25925d115dd1a7638aa28116f2f9198423b0afb6179e8127d59c06e1","archive_size":173035,"archive_url":"https://extensions.blender.org/download/sha256:d3a282db25925d115dd1a7638aa28116f2f9198423b0afb6179e8127d59c06e1/add-on-bool-tool-v2.1.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.5","tagline":"Extra tools for Grease Pencil","archive_hash":"sha256:31c799c76ca6fe883b56042b27b670ccaceab03294cd3f2d73292449ea95f287","archive_size":51990,"archive_url":"https://extensions.blender.org/download/sha256:31c799c76ca6fe883b56042b27b670ccaceab03294cd3f2d73292449ea95f287/add-on-grease-pencil-tools-v2.2.5.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":"AnimAll","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.4","tagline":"Various pie menus to speed up your workflow","archive_hash":"sha256:2120e0002b06ee0aac364cb4e300a852ac8b2dadcaa0657eccd82915e8d98d55","archive_size":128248,"archive_url":"https://extensions.blender.org/download/sha256:2120e0002b06ee0aac364cb4e300a852ac8b2dadcaa0657eccd82915e8d98d55/add-on-viewport-pie-menus-v1.7.4.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":"4.4.0","tagline":"VRM import, export and editing capabilities","archive_hash":"sha256:83facc17c8ed2b3e450fef15bd11110946bd610c6ff7a01330b025a71de6788d","archive_size":1603506,"archive_url":"https://extensions.blender.org/download/sha256:83facc17c8ed2b3e450fef15bd11110946bd610c6ff7a01330b025a71de6788d/add-on-vrm-v4.4.0.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.3.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.9.2","tagline":"Import 3DSMAX meshes & materials","archive_hash":"sha256:ae11b8903ca7fcab78cd1163305b80a268335894139f251a502da0476ef77b43","archive_size":92503,"archive_url":"https://extensions.blender.org/download/sha256:ae11b8903ca7fcab78cd1163305b80a268335894139f251a502da0476ef77b43/add-on-io-scene-max-v1.9.2.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.2.0","tagline":"Non-Destructive Modeling Toolkit","archive_hash":"sha256:71bc660afb8fb690e27389b7b729af6a5c1060833a8264f5c8cf52c034c7b411","archive_size":1137919,"archive_url":"https://extensions.blender.org/download/sha256:71bc660afb8fb690e27389b7b729af6a5c1060833a8264f5c8cf52c034c7b411/add-on-nd-v2.2.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":"Bagapie","schema_version":"1.0.0","name":"Bagapie","version":"11.0.10","tagline":"50+ tools : Scattering, Ivy Gen, Random Array, Architecture","archive_hash":"sha256:2e55574dcb37ca4a86e1942317906f769e269d382d6a82d0b1330cfb94707c9c","archive_size":10833751,"archive_url":"https://extensions.blender.org/download/sha256:2e55574dcb37ca4a86e1942317906f769e269d382d6a82d0b1330cfb94707c9c/add-on-bagapie-v11.0.10.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.8","tagline":"Layer based painting for Eevee and Cycles","archive_hash":"sha256:c81b5b3c80884e2ab402783d9f3432735d436e7eff9d189a8b9f14ac39169ccf","archive_size":2024427,"archive_url":"https://extensions.blender.org/download/sha256:c81b5b3c80884e2ab402783d9f3432735d436e7eff9d189a8b9f14ac39169ccf/add-on-ucupaint-v2.4.8.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"},"tags":["Node","Material","Paint","Bake"]},{"id":"Industrial_AOV_Connector","schema_version":"1.0.0","name":"Industrial AOV Connector","version":"5.2.0","tagline":"Auto generate outputs for advanced compositing","archive_hash":"sha256:dcb04683854b49d2eb1a7ba27fcd2210b9bea7c3e371acb807b6e4657b5ee719","archive_size":219657,"archive_url":"https://extensions.blender.org/download/sha256:dcb04683854b49d2eb1a7ba27fcd2210b9bea7c3e371acb807b6e4657b5ee719/add-on-industrial-aov-connector-v5.2.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.6","tagline":"Resize File Size Thumbnail on Browsers with Mouse Wheel","archive_hash":"sha256:d50bb8de1b5ef1b7a7b7f6567c2f15aec77c05d6fac04b443e5a2ff0107fbd94","archive_size":16676,"archive_url":"https://extensions.blender.org/download/sha256:d50bb8de1b5ef1b7a7b7f6567c2f15aec77c05d6fac04b443e5a2ff0107fbd94/add-on-browser-scroll-resize-v1.0.6.zip","type":"add-on","blender_version_min":"4.2.0","blender_version_max":"5.3.1","website":"https://extensions.blender.org/add-ons/browser-scroll-resize/","maintainer":"Barrunterio","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"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.8.0","tagline":"Manage your asset libraries with ease","archive_hash":"sha256:fa483ef8a9e8dbd128af4397851224104c67104b87d087f569cbbadf83c3a278","archive_size":11314,"archive_url":"https://extensions.blender.org/download/sha256:fa483ef8a9e8dbd128af4397851224104c67104b87d087f569cbbadf83c3a278/add-on-bulk-asset-tools-v1.8.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/bulk-asset-tools/","maintainer":"guitargeek","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Make changes to asset files"},"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.10","tagline":"Do not place your lights, paint them","archive_hash":"sha256:01f5dfb34f1b19692b25b77b439b61432cbdd28cdd166dd1c83f308dd9086045","archive_size":109568,"archive_url":"https://extensions.blender.org/download/sha256:01f5dfb34f1b19692b25b77b439b61432cbdd28cdd166dd1c83f308dd9086045/add-on-lightpainter-v1.5.10.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.51","tagline":"Context sensitive pie menu for a simple, fast workflow","archive_hash":"sha256:709e419e41eae0db0d6109ade42fe2220a9cbdefd5d7eed3462869fa76afc24e","archive_size":171087,"archive_url":"https://extensions.blender.org/download/sha256:709e419e41eae0db0d6109ade42fe2220a9cbdefd5d7eed3462869fa76afc24e/add-on-contextpie-v0.9.51.zip","type":"add-on","blender_version_min":"5.1.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":"stack_node","schema_version":"1.0.0","name":"Stack","version":"1.0.4","tagline":"Layer blending node with blend modes, opacity, and masking","archive_hash":"sha256:bbaf8b4918680251d8f2966addaea0ec8d46e0fa0a4b92dd44d79bc93f7d831f","archive_size":23737,"archive_url":"https://extensions.blender.org/download/sha256:bbaf8b4918680251d8f2966addaea0ec8d46e0fa0a4b92dd44d79bc93f7d831f/add-on-stack-node-v1.0.4.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/stack-node/","maintainer":"NXSTYNATE","license":["SPDX:GPL-3.0-or-later"],"tags":["Node"]},{"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":"NieR_Automata_UI","schema_version":"1.0.0","name":"NieR_Automata_UI","version":"1.3.1","tagline":"Glory to Mankind","archive_hash":"sha256:423aac4916d63536601499ef6a0c8de8a2c296bc87d3aedadabd5400bfd51c76","archive_size":5829,"archive_url":"https://extensions.blender.org/download/sha256:423aac4916d63536601499ef6a0c8de8a2c296bc87d3aedadabd5400bfd51c76/theme-nier-automata-ui-v1.3.1.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":"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":"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":"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":"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":"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":"polyzamboni","schema_version":"1.0.0","name":"PolyZamboni","version":"1.3.1","tagline":"Papercraft in Blender","archive_hash":"sha256:ed4c89087f806c5517686cbea42db37b652fd0aa5489237de195f655b88e6894","archive_size":20562449,"archive_url":"https://extensions.blender.org/download/sha256:ed4c89087f806c5517686cbea42db37b652fd0aa5489237de195f655b88e6894/add-on-polyzamboni-v1.3.1-windows-x64.zip","type":"add-on","blender_version_min":"5.1.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":"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.3","tagline":"import csv data to meshes in Blender","archive_hash":"sha256:f3f6b15df15381d0f7ba6a47f161b8552f6c850d5beda4e3471c5ae07a38812b","archive_size":53601988,"archive_url":"https://extensions.blender.org/download/sha256:f3f6b15df15381d0f7ba6a47f161b8552f6c850d5beda4e3471c5ae07a38812b/add-on-csv-importer-v0.2.3-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":"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":"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":"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":"flexytrack","schema_version":"1.0.0","name":"FlexyTrack","version":"1.0.1","tagline":"Physics-free Damped Track rigging for bone chains","archive_hash":"sha256:59e2ae09758d87f47e9cbb3287de30a0ddca3bde0566ba8db5820c6fd0e5bd8f","archive_size":4695,"archive_url":"https://extensions.blender.org/download/sha256:59e2ae09758d87f47e9cbb3287de30a0ddca3bde0566ba8db5820c6fd0e5bd8f/add-on-flexytrack-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/flexytrack/","maintainer":"MignotGeorges","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Rigging"]},{"id":"stop_motion_obj2","schema_version":"1.0.0","name":"OBJSequence","version":"1.0.5","tagline":"Import OBJ sequences as stop motion animation with caching","archive_hash":"sha256:37ca7d94886742f430f5ef0843d4138616544a2d3d4efe431040e2ff28a5de02","archive_size":10861,"archive_url":"https://extensions.blender.org/download/sha256:37ca7d94886742f430f5ef0843d4138616544a2d3d4efe431040e2ff28a5de02/add-on-stop-motion-obj2-v1.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/stop-motion-obj2/","maintainer":"Liam-Courtney","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read OBJ files from folders chosen by the user"}},{"id":"nodesync","schema_version":"1.0.0","name":"NodeSync","version":"1.3.1","tagline":"Git version control for your Geometry and Shader node trees","archive_hash":"sha256:717968e8be00804c33eee501889793f44a8fe6d23f82407675705fae7b78bae0","archive_size":55449,"archive_url":"https://extensions.blender.org/download/sha256:717968e8be00804c33eee501889793f44a8fe6d23f82407675705fae7b78bae0/add-on-nodesync-v1.3.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nodesync/","maintainer":"Matias-1","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Write node trees to disk and manage a local Git repo","network":"Push and pull node trees to/from a user-supplied Git remote"},"tags":["Node"]},{"id":"target_weld","schema_version":"1.0.0","name":"Target Weld","version":"1.1.9","tagline":"Merge vertices and edges","archive_hash":"sha256:db11de4d3d5df2d93c1f3c57aad0ac60a5c07a013bc192d8dd1783ceeb066ca1","archive_size":38324,"archive_url":"https://extensions.blender.org/download/sha256:db11de4d3d5df2d93c1f3c57aad0ac60a5c07a013bc192d8dd1783ceeb066ca1/add-on-target-weld-v1.1.9.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/target-weld/","maintainer":"KewlSheet","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"vmc_link","schema_version":"1.0.0","name":"VMC Link","version":"0.3.1","tagline":"VMC receiver for armature and shape keys","archive_hash":"sha256:faa31295a7a0fd825b1203675f90fe10daeb4101ef0941708dfe07ed94bdb2bf","archive_size":55528,"archive_url":"https://extensions.blender.org/download/sha256:faa31295a7a0fd825b1203675f90fe10daeb4101ef0941708dfe07ed94bdb2bf/add-on-vmc-link-v0.3.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/vmc-link/","maintainer":"Internet-Addict","license":["SPDX:GPL-3.0-or-later"],"permissions":{"network":"Receive OSC / VMC motion data over UDP"},"tags":["System"]},{"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":"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":"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":"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_xnalara","schema_version":"1.0.0","name":"XPS Import/Export","version":"2.3.0","tagline":"Import-Export for XNALara/XPS files","archive_hash":"sha256:0e0197fcccb6a889f53fe48e7734cce58992766d5dded3c219495da76615702c","archive_size":173848,"archive_url":"https://extensions.blender.org/download/sha256:0e0197fcccb6a889f53fe48e7734cce58992766d5dded3c219495da76615702c/add-on-io-xnalara-v2.3.0.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":"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.1.0","tagline":"Import-export 3D models for the GZM game","archive_hash":"sha256:b37590a0769e21e94c2f461faa83e2e54cbe22de6d0a1d45e64f97cd3270b6e9","archive_size":26696,"archive_url":"https://extensions.blender.org/download/sha256:b37590a0769e21e94c2f461faa83e2e54cbe22de6d0a1d45e64f97cd3270b6e9/add-on-gzm-mod-v1.1.0.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":"2.2.1","tagline":"Render animations from multiple selected cameras","archive_hash":"sha256:13cf0fa7db66a4f29c64227622b6211f5d3816008b7aabf71b75e50893985832","archive_size":5224,"archive_url":"https://extensions.blender.org/download/sha256:13cf0fa7db66a4f29c64227622b6211f5d3816008b7aabf71b75e50893985832/add-on-batch-camera-render-v2.2.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.10","tagline":"Blur HDRI Images by creating a new node with a Gaussian Blur","archive_hash":"sha256:8b4ac375baefb660a055d517b0554bc94c6338cb02beeaf13e0993a12ccdc2da","archive_size":7813271,"archive_url":"https://extensions.blender.org/download/sha256:8b4ac375baefb660a055d517b0554bc94c6338cb02beeaf13e0993a12ccdc2da/add-on-blur-hdri-v0.0.10-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":"render_notifications_extension","schema_version":"1.0.0","name":"Render Notifications","version":"1.3.0","tagline":"Notifies you via Discord, desktop, or webhook on render events","archive_hash":"sha256:d434cf139c1797966ab6b7cd54181f46ab0b323f4f27995f2155260511985649","archive_size":5698228,"archive_url":"https://extensions.blender.org/download/sha256:d434cf139c1797966ab6b7cd54181f46ab0b323f4f27995f2155260511985649/add-on-render-notifications-extension-v1.3.0-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":"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":"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":"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.1","tagline":"Fit primitive shapes to verticies","archive_hash":"sha256:b435b06bca5fb8895246639d92d03f3f62adb71b4cb656b3a1e85a08b241be58","archive_size":10853,"archive_url":"https://extensions.blender.org/download/sha256:b435b06bca5fb8895246639d92d03f3f62adb71b4cb656b3a1e85a08b241be58/add-on-shapefitter-v1.3.1.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":"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":"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_Sort_Collections","schema_version":"1.0.0","name":"Auto Sort Collections","version":"1.0.3","tagline":"Automatic organisation of collections","archive_hash":"sha256:6bf044c291ef9e6c9c7fd0fe6eb56c93e9f6925b81adab32f96bbbfd999739fb","archive_size":10344,"archive_url":"https://extensions.blender.org/download/sha256:6bf044c291ef9e6c9c7fd0fe6eb56c93e9f6925b81adab32f96bbbfd999739fb/add-on-auto-sort-collections-v1.0.3.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":"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":"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":"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":"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":"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":"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":"frutigeraero_orange","schema_version":"1.0.0","name":"Frutiger Aero Orange","version":"1.1.0","tagline":"The future we we're promised","archive_hash":"sha256:d4b57d63ab707be3edadbaa4f1c459a811dfea9012846f2bcc53b4692f8aaa61","archive_size":6374,"archive_url":"https://extensions.blender.org/download/sha256:d4b57d63ab707be3edadbaa4f1c459a811dfea9012846f2bcc53b4692f8aaa61/theme-frutigeraero-orange-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/frutigeraero-orange/","maintainer":"Lightmare2000","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"blend_project_packer","schema_version":"1.0.0","name":"Blend Project Packer","version":"1.0.1","tagline":"Preflight and pack portable Blender projects","archive_hash":"sha256:31688f9ba88be0f22ac1828e148d889b1ed405078cea9345f8345db44c47394d","archive_size":152065,"archive_url":"https://extensions.blender.org/download/sha256:31688f9ba88be0f22ac1828e148d889b1ed405078cea9345f8345db44c47394d/add-on-blend-project-packer-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blend-project-packer/","maintainer":"JohnnyCake","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read scene assets and write portable folders or zip archives"},"tags":["Pipeline"]},{"id":"sculpting_planar_clo","schema_version":"1.0.0","name":"Planar Sculpting","version":"1.2.1","tagline":"Restores Classic Planar: Original Normal & Plane behavior","archive_hash":"sha256:6a056275993640de5422d8322304546ef23d8116d5c057e7a21ef9950f1d8578","archive_size":24699,"archive_url":"https://extensions.blender.org/download/sha256:6a056275993640de5422d8322304546ef23d8116d5c057e7a21ef9950f1d8578/add-on-sculpting-planar-clo-v1.2.1.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":"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":"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":"wfc_3d_generator","schema_version":"1.0.0","name":"WFC 3D Generator","version":"1.3.15","tagline":"Simple WFC 3D generator for procedural creation of objects","archive_hash":"sha256:f85fb64dee3a760872a6ef578fa5e7c2d31e27a68897ac6b8ff3418ec802c9b4","archive_size":71927,"archive_url":"https://extensions.blender.org/download/sha256:f85fb64dee3a760872a6ef578fa5e7c2d31e27a68897ac6b8ff3418ec802c9b4/add-on-wfc-3d-generator-v1.3.15.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":"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":"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":"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":"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":"RigFlex","schema_version":"1.0.0","name":"RigFlex","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":"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":"frutigeraero_green","schema_version":"1.0.0","name":"Frutiger Aero Green","version":"1.0.0","tagline":"The future we we're promised","archive_hash":"sha256:bd727fff80e17d0cb2b5bb7601db635ae9366f9455d1e337f3696708e7e7921c","archive_size":6419,"archive_url":"https://extensions.blender.org/download/sha256:bd727fff80e17d0cb2b5bb7601db635ae9366f9455d1e337f3696708e7e7921c/theme-frutigeraero-green-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/frutigeraero-green/","maintainer":"Lightmare2000","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"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":"soretro_5x","schema_version":"1.0.0","name":"So Retro 5X","version":"1.0.0","tagline":"Nostalgia theme by Strawberiie-Orea, 5.1 update by Ozbren","archive_hash":"sha256:c3c3e4950cb6f94d405527164e30b402fb57b4cf69c190e909e3243974438ab5","archive_size":5648,"archive_url":"https://extensions.blender.org/download/sha256:c3c3e4950cb6f94d405527164e30b402fb57b4cf69c190e909e3243974438ab5/theme-soretro-5x-v1.0.0.zip","type":"theme","blender_version_min":"5.1.0","website":"https://extensions.blender.org/themes/soretro-5x/","maintainer":"Ozbren","license":["SPDX:GPL-2.0-or-later"]},{"id":"LocUMan","schema_version":"1.0.0","name":"Local User Manual File URL","version":"0.0.1","tagline":"Override the user manual URL to use a local copy","archive_hash":"sha256:064f69ef467d7dc03f3deac2749191fb14fce3d52e02f1228d850984a1d4c09c","archive_size":7175,"archive_url":"https://extensions.blender.org/download/sha256:064f69ef467d7dc03f3deac2749191fb14fce3d52e02f1228d850984a1d4c09c/add-on-locuman-v0.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/locuman/","maintainer":"dupoxy","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Extract the user manual to disk","network":"Need to download the user manual","clipboard":"Copy and paste the expected folder path"},"tags":["User Interface","System"]},{"id":"Matcha_Latte_Theme","schema_version":"1.0.0","name":"Matcha_Latte_Theme","version":"1.0.1","tagline":"Green Tea and Cream Milk","archive_hash":"sha256:298cac82452e569ba0257b34740d683ee5ca5b4fcf822d811b9033864326657d","archive_size":5916,"archive_url":"https://extensions.blender.org/download/sha256:298cac82452e569ba0257b34740d683ee5ca5b4fcf822d811b9033864326657d/theme-matcha-latte-theme-v1.0.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/matcha-latte-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Light","Colorful"]},{"id":"minislicer","schema_version":"1.0.0","name":"MiniSlicer","version":"1.2.1","tagline":"Slice and export .phz/.ctb files for Phrozen resin printers","archive_hash":"sha256:83dca8081ad6a22b24ca6adc8830d63c8dc2ecf02f71a9f13b1b64dfefbea8a2","archive_size":28018,"archive_url":"https://extensions.blender.org/download/sha256:83dca8081ad6a22b24ca6adc8830d63c8dc2ecf02f71a9f13b1b64dfefbea8a2/add-on-minislicer-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/minislicer/","maintainer":"Germán-Andrés-Soto-Castro","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Write the exported printer file (.phz/.ctb)"},"tags":["Object"]},{"id":"layer_vertex_colors","schema_version":"1.0.0","name":"Layer Vertex Colors","version":"1.0.2","tagline":"Layered vertex color slot system","archive_hash":"sha256:cc1e24f182dfb40cbcf19176e993b2754ae2a034d7085bfffde1f204cbb032dd","archive_size":19283,"archive_url":"https://extensions.blender.org/download/sha256:cc1e24f182dfb40cbcf19176e993b2754ae2a034d7085bfffde1f204cbb032dd/add-on-layer-vertex-colors-v1.0.2.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/layer-vertex-colors/","maintainer":"xqfa","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write mesh attribute data for vertex color slots"}},{"id":"blendgrey","schema_version":"1.0.0","name":"BlendGrey","version":"1.1.0","tagline":"Color-neutral theme inspired by the iconic Blender 2.7 aesthetic","archive_hash":"sha256:9e3a226fd873baf7823ff49cd7619030d225275e6525836f7b5b080f13574653","archive_size":5859,"archive_url":"https://extensions.blender.org/download/sha256:9e3a226fd873baf7823ff49cd7619030d225275e6525836f7b5b080f13574653/theme-blendgrey-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/blendgrey/","maintainer":"iamren","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"mesh_filters","schema_version":"1.0.0","name":"Mesh Filters","version":"1.0.1","tagline":"Combinable filter stack for mesh selection","archive_hash":"sha256:d62c17957450f676d7556e2da8865eac251076245a5ddc997867245e90fceacf","archive_size":5097,"archive_url":"https://extensions.blender.org/download/sha256:d62c17957450f676d7556e2da8865eac251076245a5ddc997867245e90fceacf/add-on-mesh-filters-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/mesh-filters/","maintainer":"Hartface","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"hair_net","schema_version":"1.0.0","name":"Hair Net","version":"1.0.0","tagline":"Converts mesh and curves into particle hair","archive_hash":"sha256:69a746f4c1d8766103b21af13679b3ee843dcf1e0aa396223d40071701327f16","archive_size":67446,"archive_url":"https://extensions.blender.org/download/sha256:69a746f4c1d8766103b21af13679b3ee843dcf1e0aa396223d40071701327f16/add-on-hair-net-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/hair-net/","maintainer":"Holo_X","license":["SPDX:GPL-3.0-or-later"],"tags":["Physics","Pipeline"]},{"id":"image_remap","schema_version":"1.0.0","name":"Image Remap Canvas","version":"0.2.0","tagline":"Extract perspective regions into a GPU canvas","archive_hash":"sha256:dbeb268e2ff39e8324f3ba8c22d14261cae0210b74a7b29990f5b7ce221aa42d","archive_size":34853,"archive_url":"https://extensions.blender.org/download/sha256:dbeb268e2ff39e8324f3ba8c22d14261cae0210b74a7b29990f5b7ce221aa42d/add-on-image-remap-v0.2.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/image-remap/","maintainer":"atticuslv","license":["SPDX:GPL-3.0-or-later"]},{"id":"hardflow","schema_version":"1.0.0","name":"Hardflow","version":"1.21.0","tagline":"Open source hard surface boolean modeling toolkit","archive_hash":"sha256:7840aadec9d0e02b31f6143712b63d784f59ad121f8cd1581ebfecbbb8d2297f","archive_size":256552,"archive_url":"https://extensions.blender.org/download/sha256:7840aadec9d0e02b31f6143712b63d784f59ad121f8cd1581ebfecbbb8d2297f/add-on-hardflow-v1.21.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/hardflow/","maintainer":"ugulay","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Mesh","Object"]},{"id":"unity_style_walk_navigation","schema_version":"1.0.0","name":"Unity Style Walk Navigation","version":"1.2.0","tagline":"Unity-style right-click first-person walk navigation","archive_hash":"sha256:e83f4d3590d7b7ba7d5a4bac587dcec4543c77b0701c8302aceb1a1e6d94d10a","archive_size":23463,"archive_url":"https://extensions.blender.org/download/sha256:e83f4d3590d7b7ba7d5a4bac587dcec4543c77b0701c8302aceb1a1e6d94d10a/add-on-unity-style-walk-navigation-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/unity-style-walk-navigation/","maintainer":"時の勇者","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","User Interface"]},{"id":"img2cube","schema_version":"1.0.0","name":"img2cube","version":"1.0.6","tagline":"Camera-match a photo from drawn lines, then drop 3D snap points","archive_hash":"sha256:442a8134679e1dd8443f052503872df57ea0b07aefd5dbb24ae1be3756803ab6","archive_size":28044,"archive_url":"https://extensions.blender.org/download/sha256:442a8134679e1dd8443f052503872df57ea0b07aefd5dbb24ae1be3756803ab6/add-on-img2cube-v1.0.6.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/img2cube/","maintainer":"LongLiveTheCube","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","Camera","Modeling"]},{"id":"keyboardandmousetracker","schema_version":"1.0.0","name":"Keyboard and mouse tracker","version":"1.0.2","tagline":"Keyboard & mouse tracker","archive_hash":"sha256:9d6ada5db978016212c57fd7e1d34b364353cc2e545dc11abce12f16d1f624ef","archive_size":3761,"archive_url":"https://extensions.blender.org/download/sha256:9d6ada5db978016212c57fd7e1d34b364353cc2e545dc11abce12f16d1f624ef/add-on-keyboardandmousetracker-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/keyboardandmousetracker/","maintainer":"Stefan2814","license":["SPDX:GPL-3.0-or-later"],"tags":["Geometry Nodes"]},{"id":"cad2cube","schema_version":"1.0.0","name":"CAD2Cube — DXF Importer","version":"1.5.0","tagline":"Free DXF importer with layers, units and block instances","archive_hash":"sha256:60c32d9bfcc46fcaf9b415a82a793d8c1f4ac8fa3c98e380a74b9c18c3df6cb5","archive_size":2583424,"archive_url":"https://extensions.blender.org/download/sha256:60c32d9bfcc46fcaf9b415a82a793d8c1f4ac8fa3c98e380a74b9c18c3df6cb5/add-on-cad2cube-v1.5.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/cad2cube/","maintainer":"LongLiveTheCube","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import DXF files from disk"},"tags":["Import-Export"]},{"id":"basic_cad_red","schema_version":"1.0.0","name":"Basic CAD - Red","version":"1.0.1","tagline":"A theme inspired by CAD programs","archive_hash":"sha256:87c05ed777a6c1fda4a4a1a7389b6d910c5339d934be62db38e1dfcf9deaa77b","archive_size":5926,"archive_url":"https://extensions.blender.org/download/sha256:87c05ed777a6c1fda4a4a1a7389b6d910c5339d934be62db38e1dfcf9deaa77b/theme-basic-cad-red-v1.0.1.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/basic-cad-red/","maintainer":"Bebo","license":["SPDX:GPL-3.0-or-later"]},{"id":"pcam_solver","schema_version":"1.0.0","name":"PCamSolver","version":"1.0.2","tagline":"Pseudo 3D camera and object solving from 2D movie clip tracks","archive_hash":"sha256:fb89e97a25718443bf2870ca60790f1f5731a6c7fdfc973e11bd65f4403d2448","archive_size":50205,"archive_url":"https://extensions.blender.org/download/sha256:fb89e97a25718443bf2870ca60790f1f5731a6c7fdfc973e11bd65f4403d2448/add-on-pcam-solver-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pcam-solver/","maintainer":"K_Naoki","license":["SPDX:GPL-3.0-or-later"],"tags":["Tracking","Camera"]},{"id":"arc_interface","schema_version":"1.0.0","name":"ARC Interface","version":"1.0.0","tagline":"Engineering inspired holographic interface","archive_hash":"sha256:6168eee8618fb27fa5f45354b6969da98124c9767010da25acb5dea929f48672","archive_size":6111,"archive_url":"https://extensions.blender.org/download/sha256:6168eee8618fb27fa5f45354b6969da98124c9767010da25acb5dea929f48672/theme-arc-interface-v1.0.0.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/arc-interface/","maintainer":"The_Iron_Maker","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Inspired By","Colorful"]},{"id":"plague_inc_cure_theme","schema_version":"1.0.0","name":"Plague Inc. - Cure Theme","version":"1.0.0","tagline":"Very blue theme","archive_hash":"sha256:6794e252932390d33e0f22bd7b4a31ac20e1f5971ee4fb8be375c6d4fb596bec","archive_size":6078,"archive_url":"https://extensions.blender.org/download/sha256:6794e252932390d33e0f22bd7b4a31ac20e1f5971ee4fb8be375c6d4fb596bec/theme-plague-inc-cure-theme-v1.0.0.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/plague-inc-cure-theme/","maintainer":"Bebo","license":["SPDX:GPL-3.0-or-later"]},{"id":"yaha","schema_version":"1.0.0","name":"Y.A.H.A","version":"1.0.1","tagline":"Yet Another HDRI Addon","archive_hash":"sha256:5ead7ec1c36e1e9e2dff9a49c69a5faa79a0aebef8df00d61fe8dddf0dcde027","archive_size":41767,"archive_url":"https://extensions.blender.org/download/sha256:5ead7ec1c36e1e9e2dff9a49c69a5faa79a0aebef8df00d61fe8dddf0dcde027/add-on-yaha-v1.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/yaha/","maintainer":"ArtinŌr","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Scan local folders to generate thumbnails and map environments"},"tags":["Lighting","Scene"]},{"id":"omi_physics_body_gltf_extension","schema_version":"1.0.0","name":"OMI Physics Body glTF Extension","version":"1.6.5","tagline":"Export primitive collision shapes from Blender to Godot via glTF","archive_hash":"sha256:6e343473b15e4b9d32f53cad59ffa42ca2347a8dfdc457da2cd94112acf1527b","archive_size":16883,"archive_url":"https://extensions.blender.org/download/sha256:6e343473b15e4b9d32f53cad59ffa42ca2347a8dfdc457da2cd94112acf1527b/add-on-omi-physics-body-gltf-extension-v1.6.5.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/omi-physics-body-gltf-extension/","maintainer":"ZycaR","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import/export glTF, GLB and Blender files from/to disk"},"tags":["Import-Export"]},{"id":"arch_generator","schema_version":"1.0.0","name":"Arch Generator","version":"1.0.1","tagline":"Generate procedural architectural arches, pillars and structures","archive_hash":"sha256:b0a902ee3c0ff7b5360c3056bc9a084ba8e9d9f94882f68151abffb8df5abb4c","archive_size":15104,"archive_url":"https://extensions.blender.org/download/sha256:b0a902ee3c0ff7b5360c3056bc9a084ba8e9d9f94882f68151abffb8df5abb4c/add-on-arch-generator-v1.0.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/arch-generator/","maintainer":"Aniruddhya-goswami","license":["SPDX:GPL-3.0-or-later"],"tags":["Modeling","Add Mesh"]},{"id":"blendtopo","schema_version":"1.0.0","name":"Blendtopo - Topology Optimization","version":"1.0.0","tagline":"SIMP topology optimization for solid mesh parts","archive_hash":"sha256:c65502117009b9bfe78b4351baa7bdb20ec3b98d2b4a8b4239b16aed538b320b","archive_size":1205804,"archive_url":"https://extensions.blender.org/download/sha256:c65502117009b9bfe78b4351baa7bdb20ec3b98d2b4a8b4239b16aed538b320b/add-on-blendtopo-v1.0.0-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blendtopo/","maintainer":"Blenderhead-engineer","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Exchanges data with helper subprocesses during optimization"},"platforms":["windows-x64"],"tags":["Mesh","Physics"]},{"id":"exact_radius","schema_version":"1.0.0","name":"Exact Radius","version":"1.9.4","tagline":"Make selected vertex rings exact-radius circles, many at once","archive_hash":"sha256:f2c9ad957a7a3d408503649b9e559d0977dcc09ec2ef3f09dfc0cac2ef2dcd74","archive_size":25280,"archive_url":"https://extensions.blender.org/download/sha256:f2c9ad957a7a3d408503649b9e559d0977dcc09ec2ef3f09dfc0cac2ef2dcd74/add-on-exact-radius-v1.9.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/exact-radius/","maintainer":"Patrick-Tiefenbacher","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"helio","schema_version":"1.0.0","name":"Helio","version":"1.1.1","tagline":"Automatic lighting of the scene based on GPS, date and time","archive_hash":"sha256:a190743fc32fd7d3a1c4937b29405cf92fe717d2a3af8caa9b8928b1bc80f789","archive_size":431226,"archive_url":"https://extensions.blender.org/download/sha256:a190743fc32fd7d3a1c4937b29405cf92fe717d2a3af8caa9b8928b1bc80f789/add-on-helio-v1.1.1.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/helio/","maintainer":"Mikydosh","license":["SPDX:GPL-3.0-or-later"],"tags":["Lighting"]},{"id":"bay_area","schema_version":"1.0.0","name":"Bay Area","version":"1.0.0","tagline":"Red and gold theme for Blender 5","archive_hash":"sha256:64c54a905ead56013de315c78a5d0aff102aeeeffa0a846a8f293eb05c5285eb","archive_size":6539,"archive_url":"https://extensions.blender.org/download/sha256:64c54a905ead56013de315c78a5d0aff102aeeeffa0a846a8f293eb05c5285eb/theme-bay-area-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/bay-area/","maintainer":"WGX3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"sculpt_pose_sync","schema_version":"1.0.0","name":"Sculpt Pose Sync","version":"34.0.0","tagline":"Dual-window workflow for symmetrical posed model sculpting","archive_hash":"sha256:1189b58caee8a175176fb2d64ea034c77043c3d669de8d6748bd067268d2bd73","archive_size":9052,"archive_url":"https://extensions.blender.org/download/sha256:1189b58caee8a175176fb2d64ea034c77043c3d669de8d6748bd067268d2bd73/add-on-sculpt-pose-sync-v34.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sculpt-pose-sync/","maintainer":"mamenr","license":["SPDX:GPL-3.0-or-later"],"tags":["Sculpt"]},{"id":"refboard","schema_version":"1.0.0","name":"RefBoard","version":"1.5.2","tagline":"Arrange image references inside a dedicated node editor","archive_hash":"sha256:63e5ea6e313c58c5df1c575760256350310e93bcfe7a2b4d85744570026c1037","archive_size":3822996,"archive_url":"https://extensions.blender.org/download/sha256:63e5ea6e313c58c5df1c575760256350310e93bcfe7a2b4d85744570026c1037/add-on-refboard-v1.5.2-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/refboard/","maintainer":"MoseenkowAndrew","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Load selected, dropped, or pasted images"},"platforms":["windows-x64"],"tags":["Node","User Interface"]},{"id":"node_exporter","schema_version":"1.0.0","name":"NodeExporter","version":"1.0.2","tagline":"Export node trees to a highly interactive HTML viewer","archive_hash":"sha256:406fd2baafbdb243d85ae258443657860e8c74fd60d0a218a0c16b865296b840","archive_size":20422,"archive_url":"https://extensions.blender.org/download/sha256:406fd2baafbdb243d85ae258443657860e8c74fd60d0a218a0c16b865296b840/add-on-node-exporter-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/node-exporter/","maintainer":"KrazyGFX","license":["SPDX:GPL-3.0-or-later"],"tags":["Node"]},{"id":"moldforge","schema_version":"1.0.0","name":"MoldForge","version":"0.25.7","tagline":"Generate printable silicone mold systems from a mesh","archive_hash":"sha256:b9ddc413ed9a7a3cb6ec17d47590d5b9e48b68ffb4799dec554e3701be3b9b69","archive_size":84605,"archive_url":"https://extensions.blender.org/download/sha256:b9ddc413ed9a7a3cb6ec17d47590d5b9e48b68ffb4799dec554e3701be3b9b69/add-on-moldforge-v0.25.7.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/moldforge/","maintainer":"Lyubomir-Todorov","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export the generated mold parts as STL files"},"tags":["Mesh","Modeling","Object"]},{"id":"black_acid","schema_version":"1.0.0","name":"Black Acid","version":"1.0.0","tagline":"Black and Neon Lime theme for Blender 5","archive_hash":"sha256:8d033728c864fff8f279bca2e415aedb37e65d1c39ed88a8033fbee23d2b7d3b","archive_size":6507,"archive_url":"https://extensions.blender.org/download/sha256:8d033728c864fff8f279bca2e415aedb37e65d1c39ed88a8033fbee23d2b7d3b/theme-black-acid-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/black-acid/","maintainer":"WGX3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"mjolnir","schema_version":"1.0.0","name":"Mjolnir","version":"1.0.0","tagline":"Military green and yellow theme for Blender 5","archive_hash":"sha256:5f93901db3a668b013365b29a35d1e5c87b991a15f8d58be62250ee63f9ed9cb","archive_size":6566,"archive_url":"https://extensions.blender.org/download/sha256:5f93901db3a668b013365b29a35d1e5c87b991a15f8d58be62250ee63f9ed9cb/theme-mjolnir-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/mjolnir/","maintainer":"WGX3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"unreal_viewport_navigation","schema_version":"1.0.0","name":"Unreal Viewport Navigation - WASD","version":"1.1.1","tagline":"Unreal-style RMB navigation with selectable movement keys","archive_hash":"sha256:877ce34f2da4a528ed1381459f4a72135ebb9807feb04d52f2266f1285e81aa9","archive_size":30777,"archive_url":"https://extensions.blender.org/download/sha256:877ce34f2da4a528ed1381459f4a72135ebb9807feb04d52f2266f1285e81aa9/add-on-unreal-viewport-navigation-v1.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/unreal-viewport-navigation/","maintainer":"Matsm-Studio","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"blendguard","schema_version":"1.0.0","name":"BlendGuard","version":"0.5.1","tagline":"See what a .blend will auto-run before you trust it","archive_hash":"sha256:20afde00350dd33eef7dce1624ec064427666e697865b33a826987811f364601","archive_size":30741,"archive_url":"https://extensions.blender.org/download/sha256:20afde00350dd33eef7dce1624ec064427666e697865b33a826987811f364601/add-on-blendguard-v0.5.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blendguard/","maintainer":"Arthur-Dutra","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read user-selected .blend files to inspect for scripts"},"tags":["Pipeline","System"]},{"id":"frutigeraero_blue","schema_version":"1.0.0","name":"Frutiger Aero Blue","version":"1.1.0","tagline":"The future we we're promised","archive_hash":"sha256:835904ec8da7c340003c65e2551266868439819628d76afb20888a9be27f6657","archive_size":6357,"archive_url":"https://extensions.blender.org/download/sha256:835904ec8da7c340003c65e2551266868439819628d76afb20888a9be27f6657/theme-frutigeraero-blue-v1.1.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/frutigeraero-blue/","maintainer":"Lightmare2000","license":["SPDX:GPL-3.0-or-later"],"tags":["Light"]},{"id":"novaskin_export","schema_version":"1.0.0","name":"NovaSkin Export","version":"1.4.2","tagline":"Export Minecraft scenes as re-skinnable browser wallpapers","archive_hash":"sha256:290a394150401c19260b1c21942185f344b909952d010979ce9742468e4f6956","archive_size":104675,"archive_url":"https://extensions.blender.org/download/sha256:290a394150401c19260b1c21942185f344b909952d010979ce9742468e4f6956/add-on-novaskin-export-v1.4.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/novaskin-export/","maintainer":"Saviski","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Write the exported UV/mask/light files next to the .blend"},"tags":["Render","Pipeline"]},{"id":"prosit","schema_version":"1.0.0","name":"Prosit","version":"1.0.0","tagline":"Dark maroon and burnt orange theme for Blender 5","archive_hash":"sha256:fc1407e91787c03e8c2b6fea59d6302490a3c40b43e785c3574d7beb874e4c65","archive_size":6681,"archive_url":"https://extensions.blender.org/download/sha256:fc1407e91787c03e8c2b6fea59d6302490a3c40b43e785c3574d7beb874e4c65/theme-prosit-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/prosit/","maintainer":"WGX3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"scientia","schema_version":"1.0.0","name":"Scientia","version":"1.0.0","tagline":"Dark red theme for Blender 5","archive_hash":"sha256:f185e1642d7a13f8ba860cb0986c4f0f4088e54c01aa8b0dce9a8eb4468f8372","archive_size":6717,"archive_url":"https://extensions.blender.org/download/sha256:f185e1642d7a13f8ba860cb0986c4f0f4088e54c01aa8b0dce9a8eb4468f8372/theme-scientia-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/scientia/","maintainer":"WGX3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"camera_shift_sync","schema_version":"1.0.0","name":"Camera Shift Sync","version":"0.2.2","tagline":"Compose-preserving camera moves around a world-fixed target","archive_hash":"sha256:8b75bb5497577a1d0c7ac80c02841c726b14d684cab0058e216ededf9eed2fb6","archive_size":38104,"archive_url":"https://extensions.blender.org/download/sha256:8b75bb5497577a1d0c7ac80c02841c726b14d684cab0058e216ededf9eed2fb6/add-on-camera-shift-sync-v0.2.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/camera-shift-sync/","maintainer":"a2d4f3s1","license":["SPDX:GPL-3.0-or-later"],"tags":["Camera"]},{"id":"green_viz","schema_version":"1.0.0","name":"Green Viz","version":"1.0.4","tagline":"Dark green theme for Blender 5","archive_hash":"sha256:264334a9bb72b7b0e7b4e309624981067ad303b9c5ffeb75fb3e681d7bad92cf","archive_size":6858,"archive_url":"https://extensions.blender.org/download/sha256:264334a9bb72b7b0e7b4e309624981067ad303b9c5ffeb75fb3e681d7bad92cf/theme-green-viz-v1.0.4.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/green-viz/","maintainer":"WGX3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"IMEBridge","schema_version":"1.0.0","name":"IMEBridge","version":"0.3.0","tagline":"Bridge native IME input into Blender text editing","archive_hash":"sha256:1459f18def25b75fb51718a98505a17f81e67aa36ed731ad0d07ed1a3e84e59c","archive_size":80971,"archive_url":"https://extensions.blender.org/download/sha256:1459f18def25b75fb51718a98505a17f81e67aa36ed731ad0d07ed1a3e84e59c/add-on-imebridge-v0.3.0-windows-x64-macos-arm64.zip","type":"add-on","blender_version_min":"5.0.0","blender_version_max":"5.3.0","website":"https://extensions.blender.org/add-ons/imebridge/","maintainer":"Suenkanwei","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64","macos-arm64"],"tags":["System","Text Editor","User Interface"]},{"id":"float_curve_css","schema_version":"1.0.0","name":"Float Curve CSS","version":"1.0.4","tagline":"Float Curve editing tools and Curve Profile to Float Curve","archive_hash":"sha256:24786037a42e779c64c6ad4abeb6c040abac518037fbe6fb4fb9b007ca60abc2","archive_size":11584,"archive_url":"https://extensions.blender.org/download/sha256:24786037a42e779c64c6ad4abeb6c040abac518037fbe6fb4fb9b007ca60abc2/add-on-float-curve-css-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/float-curve-css/","maintainer":"guillaume_bissieres","license":["SPDX:GPL-3.0-or-later"],"tags":["Node"]},{"id":"copy_pivot_from_active","schema_version":"1.0.0","name":"Copy Pivot From Active","version":"1.0.1","tagline":"Copy pivot offset from active mesh to other selected meshes","archive_hash":"sha256:ebce90935ee999756561ecca4290c45752d0910c789bf3a7ca5de47a9684a78e","archive_size":2334,"archive_url":"https://extensions.blender.org/download/sha256:ebce90935ee999756561ecca4290c45752d0910c789bf3a7ca5de47a9684a78e/add-on-copy-pivot-from-active-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/copy-pivot-from-active/","maintainer":"6cto","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"flat_uv_mapper","schema_version":"1.0.0","name":"Flat UV Mapper","version":"1.1.0","tagline":"CSG-style planar face UV mapping with tile, offset and rotation","archive_hash":"sha256:4b502bfe25ae0417e2f9e7af697d2f7a83cd9194963679eb32c64b3c62be6b84","archive_size":64686,"archive_url":"https://extensions.blender.org/download/sha256:4b502bfe25ae0417e2f9e7af697d2f7a83cd9194963679eb32c64b3c62be6b84/add-on-flat-uv-mapper-v1.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/flat-uv-mapper/","maintainer":"schemann","license":["SPDX:GPL-3.0-or-later"],"tags":["UV"]},{"id":"aiming_helper","schema_version":"1.0.0","name":"Aiming Helper","version":"1.0.1","tagline":"A visual helper for aligning sights","archive_hash":"sha256:9f79716709ca52fbaa55d25b4f006986c9277f8e934f1a8cba938124ec01a967","archive_size":5173,"archive_url":"https://extensions.blender.org/download/sha256:9f79716709ca52fbaa55d25b4f006986c9277f8e934f1a8cba938124ec01a967/add-on-aiming-helper-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/aiming-helper/","maintainer":"Hartface","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"render_pipeline_async","schema_version":"1.0.0","name":"End-to-End Render Pipeline","version":"1.0.0","tagline":"Event-driven automated 3D rendering and VSE video compilation","archive_hash":"sha256:7b8ac050603eac01cea8e1257bb33bfec88488c454750679d1cf03777c57740f","archive_size":18297,"archive_url":"https://extensions.blender.org/download/sha256:7b8ac050603eac01cea8e1257bb33bfec88488c454750679d1cf03777c57740f/add-on-render-pipeline-async-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/render-pipeline-async/","maintainer":"impatient0","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Reads rendered frames and writes compiled video files"},"tags":["Sequencer","Animation","Render"]},{"id":"EyeZenNight","schema_version":"1.0.0","name":"Eye Zen Night","version":"1.0.1","tagline":"A relaxing theme for night work","archive_hash":"sha256:39f3c851847e6a9e0bb62410b12056e070bf69ab41e17b74ad095f0c1bddd3b2","archive_size":5977,"archive_url":"https://extensions.blender.org/download/sha256:39f3c851847e6a9e0bb62410b12056e070bf69ab41e17b74ad095f0c1bddd3b2/theme-eyezennight-v1.0.1.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/eyezennight/","maintainer":"Sekuora","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark","Print"]},{"id":"VDB_Theme","schema_version":"1.0.0","name":"VDB Theme","version":"1.0.3","tagline":"Dark yellow accent theme","archive_hash":"sha256:be09bb9b911cf8cb6702dd99118f6bf0b255b2f3919fa9ca39c41eed4f8887f1","archive_size":5383,"archive_url":"https://extensions.blender.org/download/sha256:be09bb9b911cf8cb6702dd99118f6bf0b255b2f3919fa9ca39c41eed4f8887f1/theme-vdb-theme-v1.0.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/vdb-theme/","maintainer":"Tibe-Van-den-Brande","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"marker_shortcuts","schema_version":"1.0.0","name":"Marker Shortcuts","version":"0.1.1","tagline":"Assign keyboard shortcuts to timeline markers","archive_hash":"sha256:3a0c19925ddb5cce77e3560617f5a3936a04f3c8c89e9dc5e839c71e3061e1c5","archive_size":8666,"archive_url":"https://extensions.blender.org/download/sha256:3a0c19925ddb5cce77e3560617f5a3936a04f3c8c89e9dc5e839c71e3061e1c5/add-on-marker-shortcuts-v0.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/marker-shortcuts/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["Animation","Sequencer"]},{"id":"mandelbulb","schema_version":"1.0.0","name":"Mandelbulb Generator","version":"1.0.2","tagline":"Mandelbulb and Julia Fractal Generator","archive_hash":"sha256:c739e911c0a2362c3bde1ceeef932cbb19f6c024f6f8209fd172b04fd96a2d92","archive_size":8913,"archive_url":"https://extensions.blender.org/download/sha256:c739e911c0a2362c3bde1ceeef932cbb19f6c024f6f8209fd172b04fd96a2d92/add-on-mandelbulb-v1.0.2.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/mandelbulb/","maintainer":"Suussonic","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh","Modeling"]},{"id":"viewport_scalebar","schema_version":"1.0.0","name":"Viewport Scale Bar","version":"1.2.1","tagline":"Cartographic scale bar overlay for the 3D Viewport","archive_hash":"sha256:719ba03403b9eb44145459d39426ad8df1def7749053ea0cb441adefeee78d65","archive_size":9798,"archive_url":"https://extensions.blender.org/download/sha256:719ba03403b9eb44145459d39426ad8df1def7749053ea0cb441adefeee78d65/add-on-viewport-scalebar-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/viewport-scalebar/","maintainer":"Renee-13","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View","User Interface"]},{"id":"io_bugsnax","schema_version":"1.0.0","name":"Bugsnax Cache Importer/Exporter","version":"1.0.1","tagline":"Import/Export Bugsnax .xcache, .objcache, .daecache","archive_hash":"sha256:9231de5a4a99a5a4bf955e494ecad4946b91be50ee3237e6b793bfb2a8c5670d","archive_size":93176,"archive_url":"https://extensions.blender.org/download/sha256:9231de5a4a99a5a4bf955e494ecad4946b91be50ee3237e6b793bfb2a8c5670d/add-on-io-bugsnax-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/io-bugsnax/","maintainer":"SaintBaron","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"backup_modifiers","schema_version":"1.0.0","name":"Backup Modifiers","version":"1.0.4","tagline":"Apply modifiers with a backup. Easily switch to backup object","archive_hash":"sha256:6671ec4cf396c6a47967d0fa9d14936c1a47fd8f92c978add3abd5b4df1c3709","archive_size":3118,"archive_url":"https://extensions.blender.org/download/sha256:6671ec4cf396c6a47967d0fa9d14936c1a47fd8f92c978add3abd5b4df1c3709/add-on-backup-modifiers-v1.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/backup-modifiers/","maintainer":"R4V3N","license":["SPDX:GPL-3.0-or-later"],"tags":["Object"]},{"id":"dark_highlights","schema_version":"1.0.0","name":"CGDive Dark with Area Highlights","version":"1.0.0","tagline":"A standard Dark Theme with area highlights and better panel","archive_hash":"sha256:3d29709eff4497fa06d8679ca14cbb42a972c85cd8355618e7d58463f4bb16b2","archive_size":5611,"archive_url":"https://extensions.blender.org/download/sha256:3d29709eff4497fa06d8679ca14cbb42a972c85cd8355618e7d58463f4bb16b2/theme-dark-highlights-v1.0.0.zip","type":"theme","blender_version_min":"4.4.0","website":"https://extensions.blender.org/themes/dark-highlights/","maintainer":"Todor-CGDive","license":["SPDX:GPL-2.0-or-later"]},{"id":"nukxon_vr_exporter","schema_version":"1.0.0","name":"Nukxon VR Exporter","version":"1.2.1","tagline":"Render VR cubemap tours and export .nukxon packages","archive_hash":"sha256:9d1b0d0e0048d71aaa02377a8097d5172189cf4deb82cab209d73217de613509","archive_size":27069,"archive_url":"https://extensions.blender.org/download/sha256:9d1b0d0e0048d71aaa02377a8097d5172189cf4deb82cab209d73217de613509/add-on-nukxon-vr-exporter-v1.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/nukxon-vr-exporter/","maintainer":"Nukxon","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Write .nukxon export bundle to user-chosen output folder"},"tags":["Render","Import-Export"]},{"id":"io_lottie_export","schema_version":"1.0.0","name":"Lottie Export","version":"0.1.3","tagline":"Export Grease Pencil animation to Lottie JSON / dotLottie / TGS","archive_hash":"sha256:79a424817d6e190bf720c7d76b472d863943689a18899bcaf3b68a0da12c3cd2","archive_size":31309,"archive_url":"https://extensions.blender.org/download/sha256:79a424817d6e190bf720c7d76b472d863943689a18899bcaf3b68a0da12c3cd2/add-on-io-lottie-export-v0.1.3.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/io-lottie-export/","maintainer":"MultLabs","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"magic_wand","schema_version":"1.0.0","name":"Magic Wand","version":"0.0.4","tagline":"Topology-aware mesh selection","archive_hash":"sha256:e1888f95536d3e242e1f449a5fe6c7023df06469c8e27ebab353e8d3af71db8d","archive_size":15676,"archive_url":"https://extensions.blender.org/download/sha256:e1888f95536d3e242e1f449a5fe6c7023df06469c8e27ebab353e8d3af71db8d/add-on-magic-wand-v0.0.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/magic-wand/","maintainer":"Wiffzackius","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh"]},{"id":"dark_purple","schema_version":"1.0.0","name":"Dark Purple","version":"1.0.0","tagline":"Dark Purple gray style","archive_hash":"sha256:90289ec78324072453380e3446997ee1a8c3636d830a0bb4995532a883345796","archive_size":5323,"archive_url":"https://extensions.blender.org/download/sha256:90289ec78324072453380e3446997ee1a8c3636d830a0bb4995532a883345796/theme-dark-purple-v1.0.0.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/dark-purple/","maintainer":"wans7.gumroad.com","license":["SPDX:GPL-3.0-or-later"]},{"id":"local_view_manager","schema_version":"1.0.0","name":"Local View Manager","version":"2.1.0","tagline":"Remove, add and recover to Local View from Outliner and Viewport","archive_hash":"sha256:0a3c4804ad861ca989400ba0b45ab06e2ab512a2f5c3101dddbbd3652d7d1266","archive_size":7078,"archive_url":"https://extensions.blender.org/download/sha256:0a3c4804ad861ca989400ba0b45ab06e2ab512a2f5c3101dddbbd3652d7d1266/add-on-local-view-manager-v2.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/local-view-manager/","maintainer":"3DDinosaur","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"view_selected","schema_version":"1.0.0","name":"View Selected","version":"1.0.0","tagline":"Smart Selection View","archive_hash":"sha256:b6f6fa52bfb361fda7096424fabf5a58816dda0228fc0ffec6f3d54c2e4132ca","archive_size":4107,"archive_url":"https://extensions.blender.org/download/sha256:b6f6fa52bfb361fda7096424fabf5a58816dda0228fc0ffec6f3d54c2e4132ca/add-on-view-selected-v1.0.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/view-selected/","maintainer":"wans7.gumroad.com","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"point_cloud_io","schema_version":"1.0.0","name":"Point Cloud I/O","version":"0.5.1","tagline":"Import and export E57, PLY, LAS, LAZ, PCD, XYZ, PTS files","archive_hash":"sha256:cdd313ea71b0c82ad66e06dcf659984cbad9567cbbad5fee78e948971cd61bc0","archive_size":22372470,"archive_url":"https://extensions.blender.org/download/sha256:cdd313ea71b0c82ad66e06dcf659984cbad9567cbbad5fee78e948971cd61bc0/add-on-point-cloud-io-v0.5.1.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/point-cloud-io/","maintainer":"StudioMedio","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and write point cloud files on disk"},"tags":["Import-Export"]},{"id":"frame_by_plane","schema_version":"1.0.0","name":"Frame By Plane","version":"6.1.1","tagline":"A better Image as Planes workflow for animation","archive_hash":"sha256:a399877c73d90c3af6ac74bbb28041160c17d495c45210ec1674111c836997cf","archive_size":8705695,"archive_url":"https://extensions.blender.org/download/sha256:a399877c73d90c3af6ac74bbb28041160c17d495c45210ec1674111c836997cf/add-on-frame-by-plane-v6.1.1-windows-x64.zip","type":"add-on","blender_version_min":"5.1.2","website":"https://extensions.blender.org/add-ons/frame-by-plane/","maintainer":"Alessandro-Pannoli","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read media and write layered/render cache files","clipboard":"Import media paths and copy diagnostic reports to the clipboard"},"platforms":["windows-x64"],"tags":["3D View","Animation"]},{"id":"slides_pro","schema_version":"1.0.0","name":"Slides","version":"1.6.2","tagline":"Create and play slide-based presentations in the 3D View","archive_hash":"sha256:7ac2d0fdf3e8c2c5b3f96df9aa0d9c5f24cc5ec965d060f756a52b7a339ebbf9","archive_size":10301,"archive_url":"https://extensions.blender.org/download/sha256:7ac2d0fdf3e8c2c5b3f96df9aa0d9c5f24cc5ec965d060f756a52b7a339ebbf9/add-on-slides-pro-v1.6.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/slides-pro/","maintainer":"Alessandro-Pannoli","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"Classic_But_Modern","schema_version":"1.0.0","name":"ClassicButModern","version":"1.0.0","tagline":"A Blender theme inspired by 2.8x releases of Blender","archive_hash":"sha256:85d552cb420bbee1c93c74cff3db87746783785d2d59d1ff9b9a06c622a54907","archive_size":5393,"archive_url":"https://extensions.blender.org/download/sha256:85d552cb420bbee1c93c74cff3db87746783785d2d59d1ff9b9a06c622a54907/theme-classic-but-modern-v1.0.0.zip","type":"theme","blender_version_min":"5.1.0","website":"https://extensions.blender.org/themes/classic-but-modern/","maintainer":"Neon-Hat","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"dji_proxy_switcher","schema_version":"1.0.0","name":"DJI Proxy Switcher","version":"2.1.1","tagline":"Replace LRF proxies with full-res MP4s instantly","archive_hash":"sha256:428feec54a98293aadfe5345a8d2a8905502f922d9696a268ab4900492916301","archive_size":2987,"archive_url":"https://extensions.blender.org/download/sha256:428feec54a98293aadfe5345a8d2a8905502f922d9696a268ab4900492916301/add-on-dji-proxy-switcher-v2.1.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dji-proxy-switcher/","maintainer":"aflynneastwood","license":["SPDX:GPL-3.0-or-later"],"tags":["Sequencer"]},{"id":"siemen_lens_blender_autoaov","schema_version":"1.0.0","name":"AutoAOV","version":"2.1.5","tagline":"Automatically create an AOV structure for exporting","archive_hash":"sha256:2f290ce770220139450ece59048e9fd5ed7e37f0ed1ef1209da58646a1eece3e","archive_size":14417,"archive_url":"https://extensions.blender.org/download/sha256:2f290ce770220139450ece59048e9fd5ed7e37f0ed1ef1209da58646a1eece3e/add-on-siemen-lens-blender-autoaov-v2.1.5.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/siemen-lens-blender-autoaov/","maintainer":"Siemen-Lens","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Uses Files permission to create folders and export camera"},"tags":["Render","Compositing","Node","Pipeline","Lighting"]},{"id":"Lightsaber_VFX","schema_version":"1.0.0","name":"Lightsaber VFX","version":"1.0.2","tagline":"Super simple lightsaber VFX setup for Blender","archive_hash":"sha256:c36b38b4f94b420f67e2ab73c7807babf3529fac3e4cf90abc1ee480faf12267","archive_size":52312,"archive_url":"https://extensions.blender.org/download/sha256:c36b38b4f94b420f67e2ab73c7807babf3529fac3e4cf90abc1ee480faf12267/add-on-lightsaber-vfx-v1.0.2.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/lightsaber-vfx/","maintainer":"Will-Hadfield-1","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write lightsaber preset files in user data folder"},"tags":["Compositing"]},{"id":"wittyming_color_palette","schema_version":"1.0.0","name":"Color Palette","version":"1.2.3","tagline":"Record and drag material node colors in the Shader Editor","archive_hash":"sha256:075775b465c832602804c7d3826a01b36d1207718105173260f73e6488f86454","archive_size":371079,"archive_url":"https://extensions.blender.org/download/sha256:075775b465c832602804c7d3826a01b36d1207718105173260f73e6488f86454/add-on-wittyming-color-palette-v1.2.3.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/wittyming-color-palette/","maintainer":"MingWitty","license":["SPDX:GPL-3.0-or-later"],"tags":["Node","User Interface"]},{"id":"h4rb_scene_director","schema_version":"1.0.0","name":"Scene Director","version":"0.9.5","tagline":"Lighting, world, compositor layers and render planning","archive_hash":"sha256:9160866914a383bbe638718218394c88a76b12826cefcbc4db10ef279b8c3a70","archive_size":79029,"archive_url":"https://extensions.blender.org/download/sha256:9160866914a383bbe638718218394c88a76b12826cefcbc4db10ef279b8c3a70/add-on-h4rb-scene-director-v0.9.5.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/h4rb-scene-director/","maintainer":"Melih-Kayaci","license":["SPDX:GPL-3.0-or-later"],"tags":["Scene","Lighting","Compositing","Render"]},{"id":"theme_dictionary","schema_version":"1.0.0","name":"theme dictionary","version":"0.6.4","tagline":"theme recolor plugin that retrieves relevant options","archive_hash":"sha256:a6a4de727343fac8370d117afc7326501019f19ef7058e10c7971ce9e4d9271e","archive_size":43319,"archive_url":"https://extensions.blender.org/download/sha256:a6a4de727343fac8370d117afc7326501019f19ef7058e10c7971ce9e4d9271e/add-on-theme-dictionary-v0.6.4.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/theme-dictionary/","maintainer":"61+","license":["SPDX:GPL-3.0-or-later"],"tags":["System"]},{"id":"vodi_white","schema_version":"1.0.0","name":"vodi white","version":"0.6.3","tagline":"Ice-feeling elegant white theme, simple and clean","archive_hash":"sha256:4d8cf55af97525b5fcbc10f2afe16f7bebfd6c740c1397b80d68d59f21beb9e2","archive_size":5256,"archive_url":"https://extensions.blender.org/download/sha256:4d8cf55af97525b5fcbc10f2afe16f7bebfd6c740c1397b80d68d59f21beb9e2/theme-vodi-white-v0.6.3.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/vodi-white/","maintainer":"61+","license":["SPDX:GPL-2.0-or-later"],"tags":["Light","Inspired By"]},{"id":"EVA_Unit_01","schema_version":"1.0.0","name":"EVA UNIT 01","version":"1.0.0","tagline":"Color theme inspired by Evangelion Unit-01 purple/green palette","archive_hash":"sha256:65ba4e362eae0a511cae31d10f0b2b587075a9f9d3b8f56005d399f885b7cd5a","archive_size":5944,"archive_url":"https://extensions.blender.org/download/sha256:65ba4e362eae0a511cae31d10f0b2b587075a9f9d3b8f56005d399f885b7cd5a/theme-eva-unit-01-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/eva-unit-01/","maintainer":"mamane-kabirou","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark","Inspired By"]},{"id":"boardtyper_3d","schema_version":"1.0.0","name":"Boardtyper 3D","version":"1.0.1","tagline":"Export Blender models to Tabletop Simulator JSON","archive_hash":"sha256:c11cbe753a7adb9a9274419e1eec0422492b24a1425d279b664a537a4fea7c04","archive_size":7316,"archive_url":"https://extensions.blender.org/download/sha256:c11cbe753a7adb9a9274419e1eec0422492b24a1425d279b664a537a4fea7c04/add-on-boardtyper-3d-v1.0.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/boardtyper-3d/","maintainer":"Skarmuse","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export OBJ and JSON files to the local drive"},"tags":["Import-Export","Game Engine"]},{"id":"CryptoMatte_ID_Color","schema_version":"1.0.0","name":"CryptoMatte ID Color","version":"1.0.4","tagline":"Generate real time ID color compositor nodes using Cryptomatte","archive_hash":"sha256:10db2d4d2bfd31347770ccf8cb1a87e7dc7354cde610931f2e9a93a9c7618d26","archive_size":7710,"archive_url":"https://extensions.blender.org/download/sha256:10db2d4d2bfd31347770ccf8cb1a87e7dc7354cde610931f2e9a93a9c7618d26/add-on-cryptomatte-id-color-v1.0.4.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/cryptomatte-id-color/","maintainer":"61+","license":["SPDX:GPL-3.0-or-later"],"tags":["Compositing"]},{"id":"looking_glass_display_simulator","schema_version":"1.0.0","name":"Looking Glass Display Simulator","version":"1.0.0","tagline":"Simulate Looking Glass displays, create compatible quilts","archive_hash":"sha256:5df5a7704708f42ac229774678869b6c5876166e3f23357c3f1852fb26e0e2b2","archive_size":39179,"archive_url":"https://extensions.blender.org/download/sha256:5df5a7704708f42ac229774678869b6c5876166e3f23357c3f1852fb26e0e2b2/add-on-looking-glass-display-simulator-v1.0.0.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/looking-glass-display-simulator/","maintainer":"Lukas-Vincenc","license":["SPDX:GPL-3.0-or-later"]},{"id":"copy_relative_transform","schema_version":"1.0.0","name":"Copy Relative Transform","version":"0.1.0","tagline":"Copy & paste transforms relative to the view or an object","archive_hash":"sha256:974552489bff1d37969269302e28019e18e930f703e902cc785552ea6b292e54","archive_size":3565,"archive_url":"https://extensions.blender.org/download/sha256:974552489bff1d37969269302e28019e18e930f703e902cc785552ea6b292e54/add-on-copy-relative-transform-v0.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/copy-relative-transform/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"jk3da_theme","schema_version":"1.0.0","name":"JK3DA Theme","version":"1.2.0","tagline":"Dark warm Blender theme with orange accent","archive_hash":"sha256:a4a6fd78e17a7f94988eeddf77b4eb134b9f9cfa091f1feb1798a3ee545ef4c9","archive_size":5512,"archive_url":"https://extensions.blender.org/download/sha256:a4a6fd78e17a7f94988eeddf77b4eb134b9f9cfa091f1feb1798a3ee545ef4c9/theme-jk3da-theme-v1.2.0.zip","type":"theme","blender_version_min":"5.1.0","website":"https://extensions.blender.org/themes/jk3da-theme/","maintainer":"Jonas-Kircher","license":["SPDX:GPL-3.0-or-later"]},{"id":"festivity_flow","schema_version":"1.0.0","name":"Flow","version":"1.3.2","tagline":"One-click procedural wavy bone chain animation","archive_hash":"sha256:393cf29b50cbfa7dfcce828789054525e010b1e86b81c19519205a5f53a032bb","archive_size":30629,"archive_url":"https://extensions.blender.org/download/sha256:393cf29b50cbfa7dfcce828789054525e010b1e86b81c19519205a5f53a032bb/add-on-festivity-flow-v1.3.2.zip","type":"add-on","blender_version_min":"4.4.0","website":"https://extensions.blender.org/add-ons/festivity-flow/","maintainer":"festivity","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read and write preset files in the user scripts directory"},"tags":["Animation"]},{"id":"Dark_Comic_Theme","schema_version":"1.0.0","name":"Dark_Comic_Theme","version":"1.1.1","tagline":"Propaganda Poster","archive_hash":"sha256:0c152091197d76044b1495f7965e869f9aa3fe3644df364fa03cec34b661d554","archive_size":5783,"archive_url":"https://extensions.blender.org/download/sha256:0c152091197d76044b1495f7965e869f9aa3fe3644df364fa03cec34b661d554/theme-dark-comic-theme-v1.1.1.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/dark-comic-theme/","maintainer":"Raze-Demon","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"speedzone","schema_version":"1.0.0","name":"SPEEDZONE","version":"1.2.0","tagline":"Create or Rescale Paths for Realistic Car Speeds","archive_hash":"sha256:4bb9950452578c1e7e33f7bb77bd534fd2f0c9fdabba7e0459429abd2ff471e0","archive_size":4092,"archive_url":"https://extensions.blender.org/download/sha256:4bb9950452578c1e7e33f7bb77bd534fd2f0c9fdabba7e0459429abd2ff471e0/add-on-speedzone-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/speedzone/","maintainer":"KGD","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Save and load path data"},"tags":["Animation"]},{"id":"K3D_UV_Islands_Keeper","schema_version":"1.0.0","name":"K3D UV Islands Keeper","version":"1.1.2","tagline":"Multi-slot memory for UV island selections and transformations","archive_hash":"sha256:ff57d0839efc1c77fc4f2a7645ec37ffdcfb3a44ad0a2806200058506b8b421a","archive_size":3922,"archive_url":"https://extensions.blender.org/download/sha256:ff57d0839efc1c77fc4f2a7645ec37ffdcfb3a44ad0a2806200058506b8b421a/add-on-k3d-uv-islands-keeper-v1.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/k3d-uv-islands-keeper/","maintainer":"Manuel-SEILHES","license":["SPDX:GPL-3.0-or-later"]},{"id":"batchforge_batch_export","schema_version":"1.0.0","name":"BatchForge: Batch Export Tool","version":"2.8.0","tagline":"Batch export with origin control & multi-format support","archive_hash":"sha256:aeb59665434ea614b906fd2a2d950a8f6b0c5e42e99ca373c00aba01d1eedff8","archive_size":9967,"archive_url":"https://extensions.blender.org/download/sha256:aeb59665434ea614b906fd2a2d950a8f6b0c5e42e99ca373c00aba01d1eedff8/add-on-batchforge-batch-export-v2.8.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/batchforge-batch-export/","maintainer":"mabaci","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Addon saves and loads files from disk"},"tags":["Import-Export"]},{"id":"deus_ex_md","schema_version":"1.0.0","name":"Deus Ex MD Theme","version":"1.0.0","tagline":"Inspired by Deus Ex HR/MD","archive_hash":"sha256:91d3fc0d5cd78cf2c3830e89789ce9b3d5a4793e1bbbca18e463b0f4635dfee5","archive_size":6032,"archive_url":"https://extensions.blender.org/download/sha256:91d3fc0d5cd78cf2c3830e89789ce9b3d5a4793e1bbbca18e463b0f4635dfee5/theme-deus-ex-md-v1.0.0.zip","type":"theme","blender_version_min":"5.0.0","website":"https://extensions.blender.org/themes/deus-ex-md/","maintainer":"Andrei-Khrutskii","license":["SPDX:GPL-3.0-or-later"],"tags":["Dark"]},{"id":"a3da_parser","schema_version":"1.0.0","name":"A3DA Parser","version":"1.0.21","tagline":"Import & export Project Diva A3DA animation files","archive_hash":"sha256:12b64807b1b2e96cc43d163e85f564d5cb20e811dc6ef72be6816b52f069de5c","archive_size":167740,"archive_url":"https://extensions.blender.org/download/sha256:12b64807b1b2e96cc43d163e85f564d5cb20e811dc6ef72be6816b52f069de5c/add-on-a3da-parser-v1.0.21.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/a3da-parser/","maintainer":"Hans_Xwh","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Import and export Project Diva A3DA animation files"},"tags":["Import-Export"]},{"id":"sprite_sheet_generator","schema_version":"1.0.0","name":"Sprite Sheet Generator","version":"2.2.3","tagline":"Generate sprite sheets from animations with armature rotation","archive_hash":"sha256:21398e86234dc9672dca0d00881bd9d57a1a0f17d7d8444159e764d653c87474","archive_size":10668,"archive_url":"https://extensions.blender.org/download/sha256:21398e86234dc9672dca0d00881bd9d57a1a0f17d7d8444159e764d653c87474/add-on-sprite-sheet-generator-v2.2.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/sprite-sheet-generator/","maintainer":"mabaci","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Addon saves and loads files from disk"},"tags":["Render","Pipeline","Game Engine"]},{"id":"attribute_baker","schema_version":"1.0.0","name":"Attribute Baker","version":"1.0.2","tagline":"Bake Geometry Nodes attributes to image textures via UV map","archive_hash":"sha256:6fa6d62b875b0270543d73992759dece3db2f156bc7b44b6ba4494154e71068d","archive_size":6945,"archive_url":"https://extensions.blender.org/download/sha256:6fa6d62b875b0270543d73992759dece3db2f156bc7b44b6ba4494154e71068d/add-on-attribute-baker-v1.0.2.zip","type":"add-on","blender_version_min":"5.0.0","website":"https://extensions.blender.org/add-ons/attribute-baker/","maintainer":"ibotpl","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Saves baked images to the chosen output folder on disk"},"tags":["Render","UV","Geometry Nodes"]},{"id":"keychain_builder","schema_version":"1.0.0","name":"Keychain Builder","version":"1.1.3","tagline":"Generate 3D-printable keychains from text in one click","archive_hash":"sha256:52b1b204d589eef3de37b3cac7cfe1ace0c695d490cc14a37bf484b8f0041e38","archive_size":8317,"archive_url":"https://extensions.blender.org/download/sha256:52b1b204d589eef3de37b3cac7cfe1ace0c695d490cc14a37bf484b8f0041e38/add-on-keychain-builder-v1.1.3.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/keychain-builder/","maintainer":"Sergey-Kabanov","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh"]},{"id":"batch_asset_placer","schema_version":"1.0.0","name":"Batch Asset Placer","version":"1.0.1","tagline":"Adds selected assets from Asset Browser to 3D cursor","archive_hash":"sha256:9954ef60d304dd0d8f2a66ac1bf4ddb1a3ab56b7fe68b5c86c969df9cbba2126","archive_size":5307,"archive_url":"https://extensions.blender.org/download/sha256:9954ef60d304dd0d8f2a66ac1bf4ddb1a3ab56b7fe68b5c86c969df9cbba2126/add-on-batch-asset-placer-v1.0.1.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/batch-asset-placer/","maintainer":"Andrey-Pestryakov","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"id":"SimplyLoopy","schema_version":"1.0.0","name":"Simply Loopy","version":"1.2.0-G","tagline":"Simplify a mesh through edge loop collapse","archive_hash":"sha256:1f1e2ebf0343483d112f67612e98e69203ed23aaba1fe2a94ab81ef6b629180d","archive_size":16610,"archive_url":"https://extensions.blender.org/download/sha256:1f1e2ebf0343483d112f67612e98e69203ed23aaba1fe2a94ab81ef6b629180d/add-on-simplyloopy-v1.2.0-G.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/simplyloopy/","maintainer":"Memm","license":["SPDX:GPL-3.0-or-later"],"tags":["Mesh","Modeling"]},{"id":"import_e57","schema_version":"1.0.0","name":"E57 Point Cloud Importer","version":"1.0.1","tagline":"Import E57 point clouds natively","archive_hash":"sha256:dc45109fde3911c1331aabd40a6a62e5e05bf323ac6c223e1c741afa707d9bb5","archive_size":1147241,"archive_url":"https://extensions.blender.org/download/sha256:dc45109fde3911c1331aabd40a6a62e5e05bf323ac6c223e1c741afa707d9bb5/add-on-import-e57-v1.0.1-windows-x64.zip","type":"add-on","blender_version_min":"5.0.1","website":"https://extensions.blender.org/add-ons/import-e57/","maintainer":"Quentin-Misslin","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"]},{"id":"Theme_Tamer","schema_version":"1.0.0","name":"Theme Tamer","version":"3.3.4","tagline":"Search, auto-group and batch-edit theme properties","archive_hash":"sha256:939353904b1d05b836b6b3c97017f1affc6506024e061a885d9ee287417a9a11","archive_size":24424,"archive_url":"https://extensions.blender.org/download/sha256:939353904b1d05b836b6b3c97017f1affc6506024e061a885d9ee287417a9a11/add-on-theme-tamer-v3.3.4.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/theme-tamer/","maintainer":"3DDinosaur","license":["SPDX:GPL-3.0-or-later"],"tags":["User Interface"]},{"id":"copy_to_autograph","schema_version":"1.0.0","name":"Copy to Autograph","version":"0.1.0","tagline":"Copy selected objects to clipboard in Autograph format (JSON)","archive_hash":"sha256:f897b6193f5cce483f7a68dee13c1e8beaf7b33dd895f5fe5215df6228c2d05e","archive_size":5444,"archive_url":"https://extensions.blender.org/download/sha256:f897b6193f5cce483f7a68dee13c1e8beaf7b33dd895f5fe5215df6228c2d05e/add-on-copy-to-autograph-v0.1.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/copy-to-autograph/","maintainer":"SergeyMetelskiy","license":["SPDX:GPL-3.0-or-later"],"permissions":{"clipboard":"Copying JSON formated data to clipboard"},"tags":["Import-Export"]},{"id":"Vikings_Midnight_Round_Theme","schema_version":"1.0.0","name":"Viking's Midnight Round","version":"1.1.0","tagline":"Original theme by Liam , ported by me","archive_hash":"sha256:49e1cb379125e47de200a96475f72734de11ba6bd034d3b4732a546b0349b38b","archive_size":5586,"archive_url":"https://extensions.blender.org/download/sha256:49e1cb379125e47de200a96475f72734de11ba6bd034d3b4732a546b0349b38b/theme-vikings-midnight-round-theme-v1.1.0.zip","type":"theme","blender_version_min":"5.1.1","website":"https://extensions.blender.org/themes/vikings-midnight-round-theme/","maintainer":"IyeViking","license":["SPDX:GPL-2.0-or-later"],"tags":["Dark"]},{"id":"themeable_local_view","schema_version":"1.0.0","name":"Themeable Modes and Views","version":"0.2.0","tagline":"Themeable visual clues for modes, Local View and more","archive_hash":"sha256:dbdf37ca8cc3d3c4623fa2ee0d42b6fa566fb436895a8fcdb3f9dd6de6fc49c6","archive_size":6894,"archive_url":"https://extensions.blender.org/download/sha256:dbdf37ca8cc3d3c4623fa2ee0d42b6fa566fb436895a8fcdb3f9dd6de6fc49c6/add-on-themeable-local-view-v0.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/themeable-local-view/","maintainer":"1P2D","license":["SPDX:GPL-3.0-or-later"],"tags":["3D View"]},{"id":"y2k_futurism_theme","schema_version":"1.0.0","name":"Y2K Futurism Theme","version":"1.0.0","tagline":"A futuristic early-2000s inspired Blender UI theme","archive_hash":"sha256:99ab2d20ee9a5dc52bb6e80c9546b03f9fb3bc9cb286e6e51f04bd8da21fb6cb","archive_size":6450,"archive_url":"https://extensions.blender.org/download/sha256:99ab2d20ee9a5dc52bb6e80c9546b03f9fb3bc9cb286e6e51f04bd8da21fb6cb/theme-y2k-futurism-theme-v1.0.0.zip","type":"theme","blender_version_min":"4.2.0","website":"https://extensions.blender.org/themes/y2k-futurism-theme/","maintainer":"Igor-S-G-Barros","license":["SPDX:GPL-3.0-or-later"],"tags":["Colorful","Inspired By"]},{"id":"pixelsync_porter","schema_version":"1.0.0","name":"PixelSync Porter","version":"2.4.0","tagline":"Professional synchronization bridge for Blender settings","archive_hash":"sha256:0f54de5bfc110d08ca65297909936029ff09419d6f4eee5467803136a24193b9","archive_size":18724,"archive_url":"https://extensions.blender.org/download/sha256:0f54de5bfc110d08ca65297909936029ff09419d6f4eee5467803136a24193b9/add-on-pixelsync-porter-v2.4.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/pixelsync-porter/","maintainer":"CYBER-KING","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Read/write config files for exporting and importing settings"}},{"id":"unity_rig","schema_version":"1.0.0","name":"Unity Rig","version":"1.0.2","tagline":"Create Unity Humanoid-compatible rigs and convert Rigify rigs","archive_hash":"sha256:2c590237c1a824d5f8dafacf294fbb3bff8bea19ed2af3f32c39aee3233ea64f","archive_size":28072,"archive_url":"https://extensions.blender.org/download/sha256:2c590237c1a824d5f8dafacf294fbb3bff8bea19ed2af3f32c39aee3233ea64f/add-on-unity-rig-v1.0.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/unity-rig/","maintainer":"nixkuroi","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Import-Export"]},{"id":"import_gdsii","schema_version":"1.0.0","name":"GDSII Importer","version":"1.0.3","tagline":"GDSII importer with PDK layer stack support","archive_hash":"sha256:c9252550b3ba7b0b8b3098d58976942ff01e354371d047f9cfc2d10e35edafc1","archive_size":28877884,"archive_url":"https://extensions.blender.org/download/sha256:c9252550b3ba7b0b8b3098d58976942ff01e354371d047f9cfc2d10e35edafc1/add-on-import-gdsii-v1.0.3-windows-x64.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/import-gdsii/","maintainer":"dnltz","license":["SPDX:GPL-3.0-or-later"],"platforms":["windows-x64"],"tags":["Import-Export"]},{"id":"unit_to_pixel_converter","schema_version":"1.0.0","name":"Unit to pixel converter","version":"1.3.2","tagline":"Calculates render resolution from different measurement units","archive_hash":"sha256:6a7b6766d96781a1f04cef893f363b3123ced4da2c76a929280720ecb499b77b","archive_size":16645,"archive_url":"https://extensions.blender.org/download/sha256:6a7b6766d96781a1f04cef893f363b3123ced4da2c76a929280720ecb499b77b/add-on-unit-to-pixel-converter-v1.3.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/unit-to-pixel-converter/","maintainer":"Viktor-Kamp","license":["SPDX:GPL-3.0-or-later"],"tags":["Render"]},{"id":"backdrop","schema_version":"1.0.0","name":"Backdrop","version":"3.6.0","tagline":"One click cyclorama","archive_hash":"sha256:a16c8f8e767bd5e2d434de35e8435e1e21f7e071ac37f1923a8e80bca6f2b986","archive_size":3014,"archive_url":"https://extensions.blender.org/download/sha256:a16c8f8e767bd5e2d434de35e8435e1e21f7e071ac37f1923a8e80bca6f2b986/add-on-backdrop-v3.6.0.zip","type":"add-on","blender_version_min":"5.1.0","website":"https://extensions.blender.org/add-ons/backdrop/","maintainer":"Muzammil-Halimov","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh"]},{"id":"edgeflowdraw_extension","schema_version":"1.0.0","name":"EdgeFlowDraw","version":"2.1.2","tagline":"Draw path of quads; begin with edgeflow instead of block/point","archive_hash":"sha256:f0fda6af2998220922c02d6258c1c3ae4d792910ecd204c937cdc58925fd2223","archive_size":23442,"archive_url":"https://extensions.blender.org/download/sha256:f0fda6af2998220922c02d6258c1c3ae4d792910ecd204c937cdc58925fd2223/add-on-edgeflowdraw-extension-v2.1.2.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/edgeflowdraw-extension/","maintainer":"David-Boudreau","license":["SPDX:GPL-3.0-or-later"],"tags":["Add Mesh"]},{"id":"render_commander","schema_version":"1.0.0","name":"Render Commander","version":"1.2.5","tagline":"Configure and export parallel render jobs and standalone scripts","archive_hash":"sha256:70ab38c8e95fe96933ade9f5f35d48ea45f3ad429e5100622af1a760f87aba72","archive_size":92160,"archive_url":"https://extensions.blender.org/download/sha256:70ab38c8e95fe96933ade9f5f35d48ea45f3ad429e5100622af1a760f87aba72/add-on-render-commander-v1.2.5.zip","type":"add-on","blender_version_min":"4.3.0","website":"https://extensions.blender.org/add-ons/render-commander/","maintainer":"n4dirp","license":["SPDX:GPL-3.0-or-later"],"permissions":{"files":"Export script files and temp data","clipboard":"Add data paths from the clipboard"},"tags":["Render","Import-Export"]},{"id":"blink_bg","schema_version":"1.0.0","name":"Blink BG","version":"1.0.2","tagline":"Control camera BG image alpha/depth","archive_hash":"sha256:38fa18cb0ce4d891f3d270ed85e2c5fd029509d490102ddd05d0b1e7f689d2c3","archive_size":4327,"archive_url":"https://extensions.blender.org/download/sha256:38fa18cb0ce4d891f3d270ed85e2c5fd029509d490102ddd05d0b1e7f689d2c3/add-on-blink-bg-v1.0.2.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":"model_decompressor","schema_version":"1.0.0","name":"Compressed GLB Importer","version":"0.0.5","tagline":"Import Meshopt and quantized GLB models with standalone Python","archive_hash":"sha256:63497f21250f22fc7068f9787699551daa9683ded267b0e687be423e4c198cac","archive_size":41838,"archive_url":"https://extensions.blender.org/download/sha256:63497f21250f22fc7068f9787699551daa9683ded267b0e687be423e4c198cac/add-on-model-decompressor-v0.0.5.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/model-decompressor/","maintainer":"Wiffzackius","license":["SPDX:GPL-3.0-or-later"],"tags":["Import-Export"]},{"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.4","tagline":"Export rig to UE5","archive_hash":"sha256:8f9e355559d0ea035e097de7a34d12f416cd953a6063cc03ba8b855722a3c3e1","archive_size":17915,"archive_url":"https://extensions.blender.org/download/sha256:8f9e355559d0ea035e097de7a34d12f416cd953a6063cc03ba8b855722a3c3e1/add-on-blender2ue-rig-exporter-v0.0.4.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":"uv_layers_tools_ult","schema_version":"1.0.0","name":"UV Layers Tools (ULT)","version":"1.2.0","tagline":"Batch UV layer management for Blender","archive_hash":"sha256:b906d776f4305664fa7a6a9a6dd3d19e20e392ee015a0c464fc6465edc67b2e0","archive_size":9977,"archive_url":"https://extensions.blender.org/download/sha256:b906d776f4305664fa7a6a9a6dd3d19e20e392ee015a0c464fc6465edc67b2e0/add-on-uv-layers-tools-ult-v1.2.0.zip","type":"add-on","blender_version_min":"4.5.0","website":"https://extensions.blender.org/add-ons/uv-layers-tools-ult/","maintainer":"AbstracteurDeQuinteEssence","license":["SPDX:GPL-3.0-or-later"],"tags":["UV","Mesh"]},{"id":"blendixserial","schema_version":"1.0.0","name":"blendixserial","version":"2.2.1","tagline":"Connect Blender to External Devices via Simple UART","archive_hash":"sha256:2fc077994af32dc2283b36b31d5b68aa022a27e92fabc013d414bfc4c06f5efc","archive_size":132688,"archive_url":"https://extensions.blender.org/download/sha256:2fc077994af32dc2283b36b31d5b68aa022a27e92fabc013d414bfc4c06f5efc/add-on-blendixserial-v2.2.1.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/blendixserial/","maintainer":"Rurouni-Usman","license":["SPDX:GPL-3.0-or-later"],"tags":["System"]},{"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":"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":"dynamic_rig_render_controls","schema_version":"1.0.0","name":"Dynamic List Manager","version":"1.2.0","tagline":"manages the visibility of mesh objects into Groups","archive_hash":"sha256:338f2d5cc283f940ed5feee9ba342aa0266a20c26a4640c43da239bf1f5fb1cc","archive_size":11081,"archive_url":"https://extensions.blender.org/download/sha256:338f2d5cc283f940ed5feee9ba342aa0266a20c26a4640c43da239bf1f5fb1cc/add-on-dynamic-rig-render-controls-v1.2.0.zip","type":"add-on","blender_version_min":"4.2.0","website":"https://extensions.blender.org/add-ons/dynamic-rig-render-controls/","maintainer":"Eduardito_3D","license":["SPDX:GPL-3.0-or-later"],"tags":["Rigging","Animation"]},{"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":"depotkit","schema_version":"1.0.0","name":"DepotKit","version":"2.0.1","tagline":"Collect & organise all external assets in your .blend file","archive_hash":"sha256:0b7866ffd5f179a2d5f224093dec8580e54b8063e034240f7d0052aee130b199","archive_size":8376,"archive_url":"https://extensions.blender.org/download/sha256:0b7866ffd5f179a2d5f224093dec8580e54b8063e034240f7d0052aee130b199/add-on-depotkit-v2.0.1.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.5","tagline":"Consistent UI, sharp colors, comfortable contrast, 3 birght lvls","archive_hash":"sha256:aa6d95262ae48c8dc60d17cd7570061fd7da8b2ceb5118e9159f6a726ea71338","archive_size":5475,"archive_url":"https://extensions.blender.org/download/sha256:aa6d95262ae48c8dc60d17cd7570061fd7da8b2ceb5118e9159f6a726ea71338/theme-studio-mid-v2.3.5.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.6","tagline":"Consistent UI, sharp colors, comfortable contrast, 3 birght lvls","archive_hash":"sha256:b3c48be16ff02d36e8b1f73711fec9a5ba2b5b1a24f195b8278a90b00885042a","archive_size":5469,"archive_url":"https://extensions.blender.org/download/sha256:b3c48be16ff02d36e8b1f73711fec9a5ba2b5b1a24f195b8278a90b00885042a/theme-studio-light-v2.3.6.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":"2.0.1","tagline":"Separate by loose parts, but parts are joined if they collide","archive_hash":"sha256:a484a8c03a93a95144070ce76736c106646c6b489f6e1e62eb30290e5df690c1","archive_size":745239,"archive_url":"https://extensions.blender.org/download/sha256:a484a8c03a93a95144070ce76736c106646c6b489f6e1e62eb30290e5df690c1/add-on-separate-by-collision-v2.0.1-linux-x64-windows-x64-macos-arm64-macos-x64.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"],"platforms":["linux-x64","windows-x64","macos-arm64","macos-x64"],"tags":["Mesh","Object"]},{"id":"pbr_lookdev","schema_version":"1.0.0","name":"PBR Lookdev","version":"4.2.1","tagline":"Layered PBR materials with masks, overlays and UDIM","archive_hash":"sha256:5d99211dcf113121d59c72ace5b8202c449c48ec45c8789e5e29db75e4685d09","archive_size":37047,"archive_url":"https://extensions.blender.org/download/sha256:5d99211dcf113121d59c72ace5b8202c449c48ec45c8789e5e29db75e4685d09/add-on-pbr-lookdev-v4.2.1.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.2.4","tagline":"Dynamic overlays for the UV Editor","archive_hash":"sha256:cc61784494cc166bd3a3783da290d0428ee61ccaa878ddd8d1ec64d1209e1e0f","archive_size":63718,"archive_url":"https://extensions.blender.org/download/sha256:cc61784494cc166bd3a3783da290d0428ee61ccaa878ddd8d1ec64d1209e1e0f/add-on-uvo-overlays-v1.2.4.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":"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.1.0","tagline":"Highly customizable export of complex scenes to Godot","archive_hash":"sha256:0c0fffa33418f83bf5db8955da88c6a0b593c248056df1b74e2f81545b791d2a","archive_size":102398,"archive_url":"https://extensions.blender.org/download/sha256:0c0fffa33418f83bf5db8955da88c6a0b593c248056df1b74e2f81545b791d2a/add-on-goblend-v2.1.0.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":"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":"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":"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":"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":"Dark_Pro_Max_Theme","schema_version":"1.0.0","name":"Dark_Pro_Max_Theme","version":"1.2.8","tagline":"Dark Default Alternative","archive_hash":"sha256:7a31b13a26e03506646f10c7e9380037cbf1089e13f284e4afe88b2474023396","archive_size":5770,"archive_url":"https://extensions.blender.org/download/sha256:7a31b13a26e03506646f10c7e9380037cbf1089e13f284e4afe88b2474023396/theme-dark-pro-max-theme-v1.2.8.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":"Blueprint_Theme","schema_version":"1.0.0","name":"Blueprint_Theme","version":"1.1.1","tagline":"True Blueprint Color","archive_hash":"sha256:68dace53d5dd2863817b293c4699b80605089b529f0b8e47a8b906dfa70b3303","archive_size":5717,"archive_url":"https://extensions.blender.org/download/sha256:68dace53d5dd2863817b293c4699b80605089b529f0b8e47a8b906dfa70b3303/theme-blueprint-theme-v1.1.1.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.3.5","tagline":"Light Default Alternative","archive_hash":"sha256:cf2c1641d730debc8a62ed8922f03a5107d0d841e8da47573f074d6778c5bd95","archive_size":5675,"archive_url":"https://extensions.blender.org/download/sha256:cf2c1641d730debc8a62ed8922f03a5107d0d841e8da47573f074d6778c5bd95/theme-nostalgia-2bit-ui-v1.3.5.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":"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.7","tagline":"Export and import Blender node trees as JSON","archive_hash":"sha256:8823fccc495530e1739705e86eff7f6015aa00d8fd36df7d044233dc897ca641","archive_size":54864,"archive_url":"https://extensions.blender.org/download/sha256:8823fccc495530e1739705e86eff7f6015aa00d8fd36df7d044233dc897ca641/add-on-tree-clipper-v0.1.7.zip","type":"add-on","blender_version_min":"5.0.0","blender_version_max":"5.3.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.2.2","tagline":"Anotate your blend files","archive_hash":"sha256:31cdd963b15c269ff819321251870c4ea106ee40a6ae5a681e5db3867ddb5ba9","archive_size":4889,"archive_url":"https://extensions.blender.org/download/sha256:31cdd963b15c269ff819321251870c4ea106ee40a6ae5a681e5db3867ddb5ba9/add-on-pataz-notes-v5.2.2.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.7","tagline":"Manage your blender projects in omoospace's way","archive_hash":"sha256:c3b8ce14f38794ad2424bc3f15b598f702f857543ab23bfcf5969da3979e0240","archive_size":1792082,"archive_url":"https://extensions.blender.org/download/sha256:c3b8ce14f38794ad2424bc3f15b598f702f857543ab23bfcf5969da3979e0240/add-on-omoospace-v0.2.7-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 blender files"},"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":"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.4","tagline":"Emulate QWERTY keyboard shortcuts on non-QWERTY keyboard layouts","archive_hash":"sha256:6a476fcb992f89ceb556fbade7f4b1a8d6a7ed3b1f2556f0452613a66a8a556c","archive_size":32244,"archive_url":"https://extensions.blender.org/download/sha256:6a476fcb992f89ceb556fbade7f4b1a8d6a7ed3b1f2556f0452613a66a8a556c/add-on-keyboard-layout-emulation-v1.0.4.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":"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":"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":"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":"quill","schema_version":"1.0.0","name":"Quill Import/Export","version":"1.6.0","tagline":"Import and export Quill VR illustrations and animations","archive_hash":"sha256:4ca095528de167ae98be7ebc886d8b7cd45a4279d6515e11e9d224d65d5cdfda","archive_size":57145,"archive_url":"https://extensions.blender.org/download/sha256:4ca095528de167ae98be7ebc886d8b7cd45a4279d6515e11e9d224d65d5cdfda/add-on-quill-v1.6.0.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.11","tagline":"Define gameplay in Blender and play in Godot with a few clicks","archive_hash":"sha256:5ca30c78f45277f45ed8a808e9b191f515c2207e79e0c4f3acac2de3cb96155a","archive_size":14004,"archive_url":"https://extensions.blender.org/download/sha256:5ca30c78f45277f45ed8a808e9b191f515c2207e79e0c4f3acac2de3cb96155a/add-on-folded-paper-engine-v1.0.11.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":"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":"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.3.0","tagline":"Clean up MetaHuman meshes and match them to UE5 Manny","archive_hash":"sha256:effdd535e6a830738e2a757ca2c250239c81f52f72b4711a2458e205d04b13b4","archive_size":21612,"archive_url":"https://extensions.blender.org/download/sha256:effdd535e6a830738e2a757ca2c250239c81f52f72b4711a2458e205d04b13b4/add-on-metahumantomanny-v1.3.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":"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.3","tagline":"Generate customizable 3D-printable cards, tags, and keychains","archive_hash":"sha256:c2acb335a0bf0db5fe5ec7064021d8a2131c9bd409dabce8bf823a6c44529f7b","archive_size":513559,"archive_url":"https://extensions.blender.org/download/sha256:c2acb335a0bf0db5fe5ec7064021d8a2131c9bd409dabce8bf823a6c44529f7b/add-on-nfc-card-keychain-generator-v1.2.3.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.2","tagline":"Green accent theme","archive_hash":"sha256:b8a2a09aee65bdb1920d3f893f4f9b09b5373a79429fb65652f2c6a4a6eef94a","archive_size":18635,"archive_url":"https://extensions.blender.org/download/sha256:b8a2a09aee65bdb1920d3f893f4f9b09b5373a79429fb65652f2c6a4a6eef94a/theme-pjavel-theme-v1.2.2.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":"2.0.1","tagline":"Navigation Puck like in Sketchbook Pro","archive_hash":"sha256:d98ab22845578d43de090fbf37e306244853a5d0fd6baef835a7ed1c0c066b13","archive_size":145831,"archive_url":"https://extensions.blender.org/download/sha256:d98ab22845578d43de090fbf37e306244853a5d0fd6baef835a7ed1c0c066b13/add-on-navigation-puck-addon-v2.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":"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.3.1","tagline":"Translucent Aqua","archive_hash":"sha256:a2c726fdbd2324ce3cde0db7958d97ff7235286c30ccad1bea50052075843c09","archive_size":5718,"archive_url":"https://extensions.blender.org/download/sha256:a2c726fdbd2324ce3cde0db7958d97ff7235286c30ccad1bea50052075843c09/theme-blueprint-film-theme-v2.3.1.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.2","tagline":"Control viewport and camera focal length with your mouse","archive_hash":"sha256:c6faa64e00e65b00eb736dd21fb52544e3fafe175b77a3bdae4f83753f9c8faa","archive_size":10089,"archive_url":"https://extensions.blender.org/download/sha256:c6faa64e00e65b00eb736dd21fb52544e3fafe175b77a3bdae4f83753f9c8faa/add-on-focallengthtweaker-v1.0.2.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.2.3","tagline":"Invisible Shadow Warrior","archive_hash":"sha256:cc44f2cfc8373ea9f9443472596ba1a9f049e71227d981d0eb92985ac6e83aa1","archive_size":5665,"archive_url":"https://extensions.blender.org/download/sha256:cc44f2cfc8373ea9f9443472596ba1a9f049e71227d981d0eb92985ac6e83aa1/theme-zeratul-theme-v3.2.3.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":"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":"Clip_Tools","schema_version":"1.0.0","name":"Clip Tools","version":"1.2.0","tagline":"Add a simple tool to the Movie Clip Editor","archive_hash":"sha256:593b3aed6333855d96a51a2372ccf82c8cd134531d72a0f7d6d95fcefa78a17a","archive_size":20301,"archive_url":"https://extensions.blender.org/download/sha256:593b3aed6333855d96a51a2372ccf82c8cd134531d72a0f7d6d95fcefa78a17a/add-on-clip-tools-v1.2.0.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":"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.8","tagline":"Remake of Blender3.3 light theme","archive_hash":"sha256:194eb5ea31c0aa3ea3f7da9085a33b09bf07ccae2ece90385bda3f773d052249","archive_size":6143,"archive_url":"https://extensions.blender.org/download/sha256:194eb5ea31c0aa3ea3f7da9085a33b09bf07ccae2ece90385bda3f773d052249/theme-gray50-v1.0.8.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":"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":"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":"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.3","tagline":"Use OpenXR trackers and devices directly in Blender","archive_hash":"sha256:8d264f25ac41fdc4d7f55df231fdf7066fb4fa3411b7618599e45da357723c7a","archive_size":23525930,"archive_url":"https://extensions.blender.org/download/sha256:8d264f25ac41fdc4d7f55df231fdf7066fb4fa3411b7618599e45da357723c7a/add-on-tracking-toolkit-v2.0.3-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.2","tagline":"Square the selection","archive_hash":"sha256:fe3f6130509d805540a80f0bab03e5bae0396de1f3bee2c08d3b84359b5baf43","archive_size":44067,"archive_url":"https://extensions.blender.org/download/sha256:fe3f6130509d805540a80f0bab03e5bae0396de1f3bee2c08d3b84359b5baf43/add-on-to-square-v2.2.2.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":"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.4","tagline":"Import SVG with accurate colors and path processing","archive_hash":"sha256:b705c2ef0296b215256fcefbe87325afd61b4e0888865971df466d5dcbd2345c","archive_size":4025920,"archive_url":"https://extensions.blender.org/download/sha256:b705c2ef0296b215256fcefbe87325afd61b4e0888865971df466d5dcbd2345c/add-on-enhanced-svg-v0.2.4-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.12","tagline":"Easily manage projects with multiple separate animations","archive_hash":"sha256:7bede09c490699c677996c84970e628839ca645be4127c90ebe9a849f31da92d","archive_size":62573,"archive_url":"https://extensions.blender.org/download/sha256:7bede09c490699c677996c84970e628839ca645be4127c90ebe9a849f31da92d/add-on-slot-link-v0.0.12.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.2","tagline":"Auto create better light aovs (diffuse_env, specular_env...)","archive_hash":"sha256:3ce1511db842081ca639c1f1bceea848ace8b389759e073611e6c2cc83f22b40","archive_size":9104,"archive_url":"https://extensions.blender.org/download/sha256:3ce1511db842081ca639c1f1bceea848ace8b389759e073611e6c2cc83f22b40/add-on-industrial-light-aov-splitter-v1.0.2.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.6","tagline":"AC Tools for track modding","archive_hash":"sha256:6bd5108411d366836d9a49d4305bebdd0ea682ed4f15aac24303de5a67f5519a","archive_size":30826,"archive_url":"https://extensions.blender.org/download/sha256:6bd5108411d366836d9a49d4305bebdd0ea682ed4f15aac24303de5a67f5519a/add-on-ac-tools-v0.1.6.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":["Object"]},{"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.10","tagline":"Easily align Objects in your scene by Active Object or 3D Cursor","archive_hash":"sha256:b2f693945760fe9aff223e41471064fce657661381c94ed6e7e1f43c3bc3e542","archive_size":138062,"archive_url":"https://extensions.blender.org/download/sha256:b2f693945760fe9aff223e41471064fce657661381c94ed6e7e1f43c3bc3e542/add-on-sco-buttobjects-v2.0.10.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.8","tagline":"Tools to help layout your UV layout","archive_hash":"sha256:48d1b77f5dccd0f5c05ab05ac9455da0eab6f4b0c1a6cab089ad50f7f3686524","archive_size":30681,"archive_url":"https://extensions.blender.org/download/sha256:48d1b77f5dccd0f5c05ab05ac9455da0eab6f4b0c1a6cab089ad50f7f3686524/add-on-grid-layout-v1.5.8.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":"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":"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":"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.3.0","tagline":"Faster .fbx Exporter for Static Objects With Modifiers","archive_hash":"sha256:7f37c3dff44762c23cc42046599b19ff1154e708723c5850875d421eeca4ab1a","archive_size":139398,"archive_url":"https://extensions.blender.org/download/sha256:7f37c3dff44762c23cc42046599b19ff1154e708723c5850875d421eeca4ab1a/add-on-faster-fbx-exporter-v0.3.0.zip","type":"add-on","blender_version_min":"5.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":"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":"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.4.1","tagline":"Bluish Undertone Metallic Gray","archive_hash":"sha256:1298074feeb7ae7d847985b7d024f3aa57d3f65a4fce1c93d9059b4854ecab34","archive_size":5836,"archive_url":"https://extensions.blender.org/download/sha256:1298074feeb7ae7d847985b7d024f3aa57d3f65a4fce1c93d9059b4854ecab34/theme-graphite-mono-theme-v3.4.1.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":"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":"govietools","schema_version":"1.0.0","name":"Govie Tools","version":"1.0.22","tagline":"Optimize your model for use in the Govie Editor","archive_hash":"sha256:f62adf82bf5d385a783b432b015d7898a1599f8c37a7829639bd4bc9138ad0cc","archive_size":123377,"archive_url":"https://extensions.blender.org/download/sha256:f62adf82bf5d385a783b432b015d7898a1599f8c37a7829639bd4bc9138ad0cc/add-on-govietools-v1.0.22.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":"3.0.1","tagline":"Handling microscopy data in Blender, up to 5D volumes","archive_hash":"sha256:4c071429b7ed13f9331963e3239ed36fde67a9cd9bd393e0bd90be8dcf00469e","archive_size":52752110,"archive_url":"https://extensions.blender.org/download/sha256:4c071429b7ed13f9331963e3239ed36fde67a9cd9bd393e0bd90be8dcf00469e/add-on-microscopynodes-v3.0.1-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.8","tagline":"XROMM toolkit for Blender","archive_hash":"sha256:ea1375fc8caf9b991ea4e11992c0baeb999a97a2f73e3d691a5ed3bd3fcbde95","archive_size":35566,"archive_url":"https://extensions.blender.org/download/sha256:ea1375fc8caf9b991ea4e11992c0baeb999a97a2f73e3d691a5ed3bd3fcbde95/add-on-xromm-tools-v0.9.8.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.3.1","tagline":"Export .ase files used in Unreal Engine 1 & 2","archive_hash":"sha256:6706417e622364381e25d7277bdb66e981ddcddfe6b685464a7d3530a057d427","archive_size":16322,"archive_url":"https://extensions.blender.org/download/sha256:6706417e622364381e25d7277bdb66e981ddcddfe6b685464a7d3530a057d427/add-on-io-scene-ase-v2.3.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.6.0","tagline":"Importer addon for MagicaVoxel vox files","archive_hash":"sha256:12f75a437ac820604692717cc9325eb0c201f05af6b0b15031856f2d817dc8ef","archive_size":27187,"archive_url":"https://extensions.blender.org/download/sha256:12f75a437ac820604692717cc9325eb0c201f05af6b0b15031856f2d817dc8ef/add-on-blender-magicavoxel-v1.6.0.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":"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":"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.8.1","tagline":"Tools for importing DEMoCap motion captures into Blender","archive_hash":"sha256:c007ea7eb409a3831edc0f4d62611c6e32c7a1320c0cfc2cafa4b9ac5b84025c","archive_size":116066,"archive_url":"https://extensions.blender.org/download/sha256:c007ea7eb409a3831edc0f4d62611c6e32c7a1320c0cfc2cafa4b9ac5b84025c/add-on-democap-tools-v1.8.1.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","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/blender_org/bool_tool/__init__.py b/extensions/blender_org/bool_tool/__init__.py index 84b26ac..3f1eda4 100644 --- a/extensions/blender_org/bool_tool/__init__.py +++ b/extensions/blender_org/bool_tool/__init__.py @@ -1,42 +1,36 @@ if "bpy" in locals(): import importlib - for mod in [icons, - operators, + for mod in [operators, tools, + ui, manual, preferences, properties, - ui, - versioning, ]: importlib.reload(mod) print("Add-on Reloaded: Bool Tool") else: import bpy from . import ( - icons, operators, tools, + ui, manual, preferences, properties, - ui, - versioning, ) #### ------------------------------ REGISTRATION ------------------------------ #### -modules = [ - icons, +modules = ( operators, tools, + ui, manual, preferences, properties, - ui, - versioning, -] +) def register(): for module in modules: diff --git a/extensions/blender_org/bool_tool/blender_manifest.toml b/extensions/blender_org/bool_tool/blender_manifest.toml index 7ff1bbc..6f62691 100644 --- a/extensions/blender_org/bool_tool/blender_manifest.toml +++ b/extensions/blender_org/bool_tool/blender_manifest.toml @@ -2,18 +2,17 @@ schema_version = "1.0.0" id = "bool_tool" name = "Bool Tool" -version = "2.0.0" -tagline = "Quick boolean operators and tools for hard surface modeling" +version = "2.1.0" +tagline = "Quick Boolean operators and tools for hard surface modeling" +tags = ["Modeling", "Object"] type = "add-on" -maintainer = "Nika Kutsniashvili " -website = "https://github.com/nickberckley/bool_tool" -tags = ["Modeling", "Object"] +maintainer = "Nika Kutsniashvili" +website = "https://nickberckley.github.io/bool_tool/" +support = "https://github.com/nickberckley/bool_tool/issues/new?template=bug_report.md" blender_version_min = "4.5.0" -# License conforming to https://spdx.org/licenses/ (use "SPDX: prefix) -# https://docs.blender.org/manual/en/dev/advanced/extensions/licenses.html license = [ "SPDX:GPL-3.0-or-later", ] diff --git a/extensions/blender_org/bool_tool/constants.py b/extensions/blender_org/bool_tool/constants.py new file mode 100644 index 0000000..c23dc82 --- /dev/null +++ b/extensions/blender_org/bool_tool/constants.py @@ -0,0 +1,15 @@ +import os + + +# Paths +ICONS_PATH = os.path.join(os.path.dirname(__file__), "ui", "icons") + +# Object types that can have evaluated mesh, and can be converted to Mesh. +CONVERTABLE_TYPES = ( + 'CURVE', + 'CURVES', + 'FONT', + # 'POINTCLOUD', # Doesn't work in Blender 5.2 + # 'GREASEPENCIL' # Doesn't work in Blender 5.2 + 'EMPTY', +) diff --git a/extensions/blender_org/bool_tool/functions/canvas.py b/extensions/blender_org/bool_tool/functions/canvas.py new file mode 100644 index 0000000..5b3fc3f --- /dev/null +++ b/extensions/blender_org/bool_tool/functions/canvas.py @@ -0,0 +1,144 @@ +import bpy + +from .modifier import ( + is_boolean_modifier, +) +from .object import ( + is_linked, + change_parent, +) + + +#### ------------------------------ /poll/ ------------------------------ #### + +def is_canvas(obj): + """Checks whether the object is a Boolean canvas (i.e. has Boolean cutters).""" + + if obj.booleans.canvas == False: + return False + else: + # Even if object is marked as a canvas, check if it actually has any cutters. + cutters, __ = list_canvas_cutters([obj]) + if len(cutters) > 0: + return True + else: + return False + + + +#### ------------------------------ /list/ ------------------------------ #### + +def list_all_canvases(scene): + """Returns the list of all Boolean canvases in the scene.""" + + canvases = [] + + for obj in scene.objects: + if is_canvas(obj): + canvases.append(obj) + + return canvases + + +def list_selected_canvases(context): + """Returns the list of canvases in the selection.""" + + canvases = [] + active_object = context.active_object + selected_objects = context.selected_objects + + if selected_objects: + for obj in selected_objects: + if obj == active_object: + continue + if obj.type != 'MESH': + continue + if is_canvas(obj): + canvases.append(obj) + + if active_object: + if is_canvas(active_object): + canvases.append(active_object) + + return canvases + + +def list_canvas_cutters(canvases: list) -> tuple[list, dict]: + """List cutters (and their associated modifiers) that are used by specified canvases.""" + + cutters = [] + modifiers = {} + for canvas in canvases: + for mod in canvas.modifiers: + if not is_boolean_modifier(mod): + continue + + if mod.object not in cutters: + cutters.append(mod.object) + modifiers.setdefault(canvas, []).append(mod) + + return cutters, modifiers + + +def list_canvas_slices(context, canvases: list): + """Returns the list of slices of specified canvases.""" + + slices = [] + for obj in context.scene.objects: + if obj.booleans.slice: + if obj.booleans.slice_of in canvases: + slices.append(obj) + + return slices + + + +#### ------------------------------ /filter/ ------------------------------ #### + +def filter_canvases(self, context, canvases: list) -> list: + """Filter out objects from the given list if they can't be cut.""" + + usable_canvases = [] + for canvas in canvases: + # Exclude non-Mesh types. + if canvas.type != 'MESH': + self.report({'WARNING'}, f"{canvas.name} is not a Mesh type. Only Meshes can be cut") + continue + # Exclude linked objects. + if is_linked(context, canvas): + self.report({'WARNING'}, f"{canvas.name} is linked and can not be used as a cutter") + continue + + usable_canvases.append(canvas) + + return usable_canvases + + + +#### ------------------------------ /filter/ ------------------------------ #### + +def create_slice(context, canvas, modifier=False): + """Creates copy of canvas to be used as slice.""" + + slice = canvas.copy() + slice.data = canvas.data.copy() + slice.name = slice.data.name = canvas.name + "_slice" + + # Parent to canvas. + change_parent(context, slice, canvas, inverse=True) + + # Set Boolean properties. + if modifier == True: + slice.booleans.canvas = True + slice.booleans.slice = True + slice.booleans.slice_of = canvas + + # Add to canvas collections. + for coll in canvas.users_collection: + coll.objects.link(slice) + + # Add slices to local view. + if context.space_data.local_view: + slice.local_view_set(context.space_data, True) + + return slice diff --git a/extensions/blender_org/bool_tool/functions/cutter.py b/extensions/blender_org/bool_tool/functions/cutter.py new file mode 100644 index 0000000..e862e73 --- /dev/null +++ b/extensions/blender_org/bool_tool/functions/cutter.py @@ -0,0 +1,188 @@ +import bpy +from .. import __package__ as base_package + +from ..constants import ( + CONVERTABLE_TYPES, +) +from .modifier import ( + is_boolean_modifier, +) +from .object import ( + is_linked, + has_evaluated_mesh, + object_visibility_set, + convert_to_mesh, + change_parent, + delete_object, +) +from .scene import ( + ensure_collection, +) + + +#### ------------------------------ /list/ ------------------------------ #### + +def list_selected_cutters(context): + """Returns the list of cutters in the selection.""" + + cutters = [] + active_object = context.active_object + selected_objects = context.selected_objects + + if selected_objects: + for obj in selected_objects: + if obj == active_object: + continue + if obj.type != 'MESH': + continue + if obj.booleans.cutter: + cutters.append(obj) + + if active_object: + if active_object.booleans.cutter: + cutters.append(active_object) + + return cutters + + +def list_cutter_users(cutters: list, exclude: list=None) -> dict: + """ + List canvases that use specified cutters. + Canvases that should be excluded from the search can be specified with the `exclude` arg. + Returns a dict of canvases (keys) and set of their Boolean modifiers that use cutters (values). + """ + + cutter_users = {} + + for key, values in bpy.data.user_map(subset=cutters).items(): + for value in values: + if value.id_type != 'OBJECT': + continue + if exclude and value in exclude: + continue + if len(value.modifiers) == 0: + continue + + for mod in value.modifiers: + if not is_boolean_modifier(mod): + continue + if mod.object not in cutters: + continue + + cutter_users.setdefault(value, set()).add(mod) + + return cutter_users + + + +#### ------------------------------ /filter/ ------------------------------ #### + +def filter_cutters(self, context, cutters: list, canvases: list) -> list: + """ + Filter out objects from the given list if they can't be used as a cutter. + If non-mesh type object has evaluated mesh, and can be converted to mesh it will be. + """ + + usable_cutters = [] + for cutter in cutters: + # Exclude object if it is in both lists. + if cutter in canvases: + continue + # Exclude linked objects. + if is_linked(context, cutter): + self.report({'WARNING'}, f"{cutter.name} is linked and can not be used as a cutter") + continue + + if cutter.type == 'MESH': + # Exclude if object is already a cutter for canvas. + users = list_cutter_users([cutter]).keys() + if any(canvas in users for canvas in canvases): + continue + # Exclude if canvas is cutting the object (avoid dependancy loop). + users = list_cutter_users(canvases).keys() + if cutter in users: + self.report({'WARNING'}, f"{cutter.name} can not cut its own cutter (dependancy loop)") + continue + + usable_cutters.append(cutter) + + elif cutter.type in CONVERTABLE_TYPES: + if not has_evaluated_mesh(context, cutter): + continue + + convert_to_mesh(context, cutter) + usable_cutters.append(cutter) + + return usable_cutters + + + +#### ------------------------------ /operate/ ------------------------------ #### + +def make_cutter(context, cutter, mode: str, display='BOUNDS', collection=True): + """Ensures the cutter has the correct properties.""" + + # Hide Cutters + cutter.hide_render = True + cutter.display_type = display + cutter.lineart.usage = 'EXCLUDE' + object_visibility_set(cutter, value=False) + + # Cutters Collection + if collection: + cutters_collection = ensure_collection(context) + if cutters_collection not in cutter.users_collection: + cutters_collection.objects.link(cutter) + + # Set Boolean Property + cutter.booleans.cutter = mode.capitalize() + + +def restore_cutter(context, cutter, unparent=True, unlink_collection=True): + """Remove Boolean properties from a cutter object to restore it to a normal state.""" + + prefs = context.preferences.addons[base_package].preferences + + # Restore Unused Cutters + cutter.hide_render = False + cutter.display_type = 'TEXTURED' + cutter.lineart.usage = 'INHERIT' + object_visibility_set(cutter, value=True) + cutter.booleans.cutter = "" + + # Remove Parent & Collection + if unparent: + change_parent(context, cutter, None) + + if unlink_collection: + cutters_collection = bpy.data.collections.get(prefs.collection_name) + if cutters_collection in cutter.users_collection: + cutters_collection.objects.unlink(cutter) + + +def handle_unused_cutters(context, cutters: list, canvases: list, delete=True): + """Deletes or restores cutters with no remaining users (besides given list of canvases).""" + + prefs = context.preferences.addons[base_package].preferences + + for cutter in cutters: + other_canvases = list_cutter_users([cutter], exclude=canvases).keys() + + if len(other_canvases) == 0: + if delete: + # Delete unused cutters & transfer their children to canvas. + for child in cutter.children: + change_parent(context, child, cutter.parent, inverse=True) + delete_object(cutter) + + else: + # Restore unused cutters. + restore_cutter(context, cutter, + unparent=prefs.parent and cutter.parent in canvases, + unlink_collection=prefs.use_collection) + + else: + # Cutter has other users, parent it to one of them. + if prefs.parent and cutter.parent in canvases: + new_parent = next(c for c in other_canvases if not c.booleans.slice) + change_parent(context, cutter, new_parent, inverse=True) diff --git a/extensions/blender_org/bool_tool/functions/draw.py b/extensions/blender_org/bool_tool/functions/draw.py index dfcc6e0..036b172 100644 --- a/extensions/blender_org/bool_tool/functions/draw.py +++ b/extensions/blender_org/bool_tool/functions/draw.py @@ -10,7 +10,7 @@ from gpu_extras.batch import batch_for_shader #### ------------------------------ FUNCTIONS ------------------------------ #### def draw_shader(type, color, alpha, coords, size=1, indices=None): - """Creates a batch for a draw type""" + """Sets up and draws a batch for a given GPU shader type.""" gpu.state.blend_set('ALPHA') @@ -48,9 +48,10 @@ def draw_shader(type, color, alpha, coords, size=1, indices=None): gpu.state.blend_set('NONE') -def draw_bmesh_faces(faces, world_matrix): +def draw_bmesh_faces(faces, world_matrix) -> tuple[list, list]: """ - Get world-space vertex pairs and indices from `bmesh` face. To be used in GPU batch. + Gets world-space vertex pairs and indices from `bmesh` faces. + Returns the list of 3D vertices and the list of triangle indices to be used in GPU batch. Adapted from "Blockout" extension by niewinny (https://github.com/niewinny/blockout). """ @@ -65,13 +66,13 @@ def draw_bmesh_faces(faces, world_matrix): for face in faces: face_indices = [] - # Collect unique vertices only (avoid storing verts that are shared by faces multiple times). - # (Iterating over face corners because unlike `face.verts` they're ordered). + # Collect unique vertices only (avoid storing verts that are shared by multiple faces). + # (NOTE: Iterating over face corners because unlike `face.verts` they're ordered). for loop in face.loops: vert = loop.vert - co = world_matrix @ Vector(vert.co) if vert not in vert_index_map: + co = world_matrix @ Vector(vert.co) vertices.append(co) vert_index_map[vert] = vert_count face_indices.append(vert_count) @@ -94,46 +95,28 @@ def draw_bmesh_faces(faces, world_matrix): return vertices, indices -def draw_bmesh_edges(edges, world_matrix): - """Convert bmesh edges into world-space vertex pairs to be used in GPU batch.""" - - if not edges: - return None - - vertices = [] - for edge in edges: - v1 = world_matrix @ edge.verts[0].co - v2 = world_matrix @ edge.verts[1].co - vertices.append(v1) - vertices.append(v2) - - return vertices - - -def draw_circle_around_point(context, obj, vert, radius, segments): +def draw_circle_billboard(context, origin: Vector, radius: float, segments: int) -> list: """ - Draws the screen-aligned circle around given vertex of the object. - Returns the list of vertices for GPU batch. + Draws a view-facing circle in the world-space around the given origin Vector. + Returns the list of 3D vertices. """ region = context.region rv3d = context.region_data - vert_world = obj.matrix_world @ vert.co + origin_2d = view3d_utils.location_3d_to_region_2d(region, rv3d, origin) radius = min(radius, 25) vertices = [] for i in range(segments + 1): angle = i * (2 * math.pi / segments) - # Calculate offset and vertex position in screen-space. + # Add offset in screen-space. offset_x = radius * math.cos(angle) offset_y = radius * math.sin(angle) - vert_screen = view3d_utils.location_3d_to_region_2d(region, rv3d, vert_world) + vert_2d = Vector((origin_2d.x + offset_x, origin_2d.y + offset_y)) - if vert_screen: - # Add offset in screen-space and convert back to world-space. - circle_screen = Vector((vert_screen.x + offset_x, vert_screen.y + offset_y)) - circle_3d = view3d_utils.region_2d_to_location_3d(region, rv3d, circle_screen, vert_world) - vertices.append(circle_3d) + # Convert back to world-space. + vert_3d = view3d_utils.region_2d_to_location_3d(region, rv3d, vert_2d, origin) + vertices.append(vert_3d) return vertices diff --git a/extensions/blender_org/bool_tool/functions/list.py b/extensions/blender_org/bool_tool/functions/list.py deleted file mode 100644 index 02c6dcd..0000000 --- a/extensions/blender_org/bool_tool/functions/list.py +++ /dev/null @@ -1,162 +0,0 @@ -import bpy - - -#### ------------------------------ /all/ ------------------------------ #### - -def list_canvases(): - """List all canvases in the scene""" - - canvas = [] - for obj in bpy.context.scene.objects: - if obj.booleans.canvas: - canvas.append(obj) - - return canvas - - - -#### ------------------------------ /selected/ ------------------------------ #### - -def list_selected_cutters(context): - """List selected cutters""" - - cutters = [] - active_object = context.active_object - selected_objects = context.selected_objects - - if selected_objects: - for obj in selected_objects: - if obj != active_object and obj.type == 'MESH': - if obj.booleans.cutter: - cutters.append(obj) - - if active_object: - if active_object.booleans.cutter: - cutters.append(active_object) - - return cutters - - -def list_selected_canvases(context): - """List selected canvases""" - - canvases = [] - active_object = context.active_object - selected_objects = context.selected_objects - - if selected_objects: - for obj in selected_objects: - if obj != active_object and obj.type == 'MESH': - if obj.booleans.canvas: - canvases.append(obj) - - if active_object: - if active_object.booleans.canvas: - canvases.append(active_object) - - return canvases - - - -#### ------------------------------ /users/ ------------------------------ #### - -def list_canvas_cutters(canvases): - """List cutters that are used by specified canvases""" - - cutters = [] - modifiers = [] - for canvas in canvases: - for mod in canvas.modifiers: - if mod.type == 'BOOLEAN' and "boolean_" in mod.name: - if mod.object: - cutters.append(mod.object) - modifiers.append(mod) - - return cutters, modifiers - - -def list_canvas_slices(canvases): - """Returns list of slices for specified canvases""" - - slices = [] - for obj in bpy.context.scene.objects: - if obj.booleans.slice: - if obj.booleans.slice_of in canvases: - slices.append(obj) - - return slices - - -def list_cutter_users(cutters): - """List canvases that use specified cutters""" - - cutter_users = [] - - for cutter in cutters: - object = bpy.data.objects.get(cutter.name) - - for key, values in bpy.data.user_map(subset=[object]).items(): - for value in values: - # filter_only_object_type_users - if value.id_type == 'OBJECT': - for mod in value.modifiers: - if mod.type == 'BOOLEAN': - if mod.object and mod.object == cutter: - cutter_users.append(value) - - return cutter_users - - -def list_cutter_modifiers(canvases, cutters): - """List modifiers on specified canvases that use specified cutters""" - - if not canvases: - canvases = list_canvases() - - modifiers = [] - for canvas in canvases: - for mod in canvas.modifiers: - if mod.type == 'BOOLEAN': - if mod.object in cutters: - modifiers.append(mod) - - return modifiers - - -def list_unused_cutters(cutters, *canvases, do_leftovers=False): - """Takes in list of cutters and returns only those that have no other user besides specified canvas""" - """When `include_visible` is True it will return cutters that aren't used by any visible modifiers""" - - other_canvases = list_canvases() - original_cutters = cutters[:] - - for obj in other_canvases: - if obj in canvases: - return - - if any(mod.object in cutters for mod in obj.modifiers if mod.type == 'BOOLEAN'): - cutters[:] = [cutter for cutter in cutters if cutter not in [mod.object for mod in obj.modifiers]] - - leftovers = [] - # return_cutters_that_do_have_other_users_(so_that_parents_can_be_reassigned) - if do_leftovers: - leftovers = [cutter for cutter in original_cutters if cutter not in cutters] - - return cutters, leftovers - - -def list_pre_boolean_modifiers(obj) -> list: - """Returns a list of boolean modifiers & modifiers that come before last boolean modifier""" - - # Find the index of a last boolean modifier - last_boolean_index = -1 - for i in reversed(range(len(obj.modifiers))): - if obj.modifiers[i].type == 'BOOLEAN': - last_boolean_index = i - break - - # If boolean modifier is found, list all modifiers that come before it. - if last_boolean_index != -1: - return [mod for mod in obj.modifiers[:last_boolean_index + 1]] - else: - return [] diff --git a/extensions/blender_org/bool_tool/functions/math.py b/extensions/blender_org/bool_tool/functions/math.py deleted file mode 100644 index 409b936..0000000 --- a/extensions/blender_org/bool_tool/functions/math.py +++ /dev/null @@ -1,77 +0,0 @@ -import bpy -import mathutils -from mathutils import Vector -from bpy_extras import view3d_utils - - -#### ------------------------------ FUNCTIONS ------------------------------ #### - -def distance_from_point_to_segment(point, start, end) -> float: - """ - Calculates the shortest distance between a point and a segment. - All three inputs should be `mathutils.Vector` objects. - This is an alternative to `mathutils.geometry.intersect_point_line`. - Adapted from "Blockout" extension by niewinny (https://github.com/niewinny/blockout). - """ - - segment = end - start - start_to_point = point - start - - # projection_along_segment - c1 = start_to_point.dot(segment) - if c1 <= 0: - return (point - start).length - - # segment_length_squared - c2 = segment.dot(segment) - if c2 <= c1: - return (point - end).length - - t = c1 / c2 - closest_point = start + t * segment - distance = (point - closest_point).length - - return distance - - -def region_2d_to_line_3d(region, rv3d, point_2d: Vector, line_origin: Vector, line_direction: Vector) -> tuple[Vector, Vector]: - """ - Converts a 2D screen-space point into a 3D ray and finds closest - points between that ray and a given 3D line. - """ - - if line_origin is None or line_direction is None: - return None, None - - # Convert the screen-space 2D point Vector into a world-space 3D ray (origin + direction). - ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, point_2d) - ray_direction = view3d_utils.region_2d_to_vector_3d(region, rv3d, point_2d) - - # Find closest points to each other on each line (second line being a ray). - closest_points = mathutils.geometry.intersect_line_line(ray_origin, - ray_origin + ray_direction, - line_origin, - line_origin + line_direction) - - return closest_points - - -def region_2d_to_plane_3d(region, rv3d, point_2d: Vector, plane: tuple[Vector]) -> Vector: - """ - Converts a 2D screen-space point into a 3D point on a plane in world-space. - Adapted from "Blockout" extension by niewinny (https://github.com/niewinny/blockout). - """ - - location, normal = plane - - # Convert the screen-space 2D point Vector into a world-space 3D ray (origin + direction). - p3_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, point_2d) - p3_direction = view3d_utils.region_2d_to_vector_3d(region, rv3d, point_2d) - - # Intersect the point with the plane. - p3_on_plane = mathutils.geometry.intersect_line_plane(p3_origin, # First point of line. - p3_origin + p3_direction, # Second point of line. - location, # `plane_co` (a point on the plane). - normal) # `plane_no` (the direction the plane is facing). - - return p3_on_plane diff --git a/extensions/blender_org/bool_tool/functions/mesh.py b/extensions/blender_org/bool_tool/functions/mesh.py index 80c0977..76d66f9 100644 --- a/extensions/blender_org/bool_tool/functions/mesh.py +++ b/extensions/blender_org/bool_tool/functions/mesh.py @@ -1,17 +1,56 @@ import bpy import bmesh -import mathutils import math -from bpy_extras import view3d_utils - -from .object import hide_objects -from .types import Ray +from mathutils import Vector -#### ------------------------------ FUNCTIONS ------------------------------ #### +#### ------------------------------ /poll/ ------------------------------ #### -def extrude_face(bm, face): - """Extrudes cutter face (created by carve operation) along view vector to create a non-manifold mesh""" +def is_instanced_mesh(data): + """ + Checks if `obj.data` has more than one users, i.e. is instanced. + Function only considers object types as users, and excludes other pointers. + """ + + data = bpy.data.meshes.get(data.name) + users = 0 + + for key, values in bpy.data.user_map(subset=[data]).items(): + for value in values: + if value.id_type == 'OBJECT': + users += 1 + + if users > 1: + return True + else: + return False + + +def are_intersecting(obj_a, obj_b): + """Checks if bounding boxes of two given objects intersect.""" + + def world_bounds(obj): + corners = [obj.matrix_world @ Vector(c) for c in obj.bound_box] + xs = [c.x for c in corners] + ys = [c.y for c in corners] + zs = [c.z for c in corners] + return (min(xs), max(xs)), (min(ys), max(ys)), (min(zs), max(zs)) + + (ax0, ax1), (ay0, ay1), (az0, az1) = world_bounds(obj_a) + (bx0, bx1), (by0, by1), (bz0, bz1) = world_bounds(obj_b) + + return ( + ax1 >= bx0 and ax0 <= bx1 and + ay1 >= by0 and ay0 <= by1 and + az1 >= bz0 and az0 <= bz1 + ) + + + +#### ------------------------------ /operate/ ------------------------------ #### + +def extrude_face(bm, face) -> tuple[list[bmesh.types.BMVert], list[bmesh.types.BMEdge], list[bmesh.types.BMFace]]: + """Extrudes the `bmesh` face and returns tuple of lists of extruded vertices, edges and faces.""" bm.faces.ensure_lookup_table() @@ -26,8 +65,8 @@ def extrude_face(bm, face): return extruded_verts, extruded_edges, extruded_faces -def shade_smooth_by_angle(bm, mesh, angle=30): - """Replication of "Auto Smooth" functionality: Marks faces as smooth, sharp edges (by angle) as sharp""" +def shade_smooth_by_angle(bm, mesh, angle: float=30): + """Replication of "Auto Smooth": Marks faces as smooth & edges above the angle as sharp.""" for f in bm.faces: f.smooth = True @@ -51,26 +90,6 @@ def shade_smooth_by_angle(bm, mesh, angle=30): bm.to_mesh(mesh) -def are_intersecting(obj_a, obj_b): - """Checks if bounding boxes of two given objects intersect.""" - - def world_bounds(obj): - corners = [obj.matrix_world @ mathutils.Vector(c) for c in obj.bound_box] - xs = [c.x for c in corners] - ys = [c.y for c in corners] - zs = [c.z for c in corners] - return (min(xs), max(xs)), (min(ys), max(ys)), (min(zs), max(zs)) - - (ax0, ax1), (ay0, ay1), (az0, az1) = world_bounds(obj_a) - (bx0, bx1), (by0, by1), (bz0, bz1) = world_bounds(obj_b) - - return ( - ax1 >= bx0 and ax0 <= bx1 and - ay1 >= by0 and ay0 <= by1 and - az1 >= bz0 and az0 <= bz1 - ) - - def ensure_attribute(bm, name, domain): """Ensure that the attribute with the given name and domain exists on mesh.""" @@ -85,21 +104,3 @@ def ensure_attribute(bm, name, domain): attr = bm.verts.layers.float.new(name) return attr - - -def raycast(context, position, objects): - """Cast a ray in the scene to get the surface on any of the given objects.""" - - region = context.region - rv3d = context.region_data - depsgraph = context.view_layer.depsgraph - - origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, position) - direction = view3d_utils.region_2d_to_vector_3d(region, rv3d, position) - - # Cast Ray - with hide_objects(context, exceptions=objects): - hit, location, normal, index, object, matrix = context.scene.ray_cast(depsgraph, origin, direction) - ray = Ray(hit, location, normal, index, object, matrix) - - return ray diff --git a/extensions/blender_org/bool_tool/functions/modifier.py b/extensions/blender_org/bool_tool/functions/modifier.py index bd5271f..01c2d5e 100644 --- a/extensions/blender_org/bool_tool/functions/modifier.py +++ b/extensions/blender_org/bool_tool/functions/modifier.py @@ -3,42 +3,102 @@ import bmesh from contextlib import contextmanager from .. import __package__ as base_package -from ..functions.list import ( - list_pre_boolean_modifiers, +from .mesh import ( + is_instanced_mesh, ) from .object import ( convert_to_mesh, ) -from .poll import ( - is_instanced_data, -) + + +#### ------------------------------ /list/ ------------------------------ #### + +def enumerate_boolean_modifiers(obj) -> int: + """Returns the number of Boolean modifiers on the object.""" + + num = 0 + for mod in obj.modifiers: + if is_boolean_modifier(mod): + num += 1 + + return num + + +def get_modifiers_to_apply(context, obj, custom_list=None) -> list: + """Returns the list of modifiers that need to be applied based on add-on preferences.""" + + prefs = context.preferences.addons[base_package].preferences + + # Apply all modifiers. + if prefs.apply_order == 'ALL': + modifiers = list(obj.modifiers) + + # Apply only Boolean modifiers. + elif prefs.apply_order == 'BOOLEANS': + if custom_list is None: + modifiers = [mod for mod in obj.modifiers if is_boolean_modifier(mod)] + else: + modifiers = custom_list + + # Apply all modifiers that come before last Boolean modifier. + elif prefs.apply_order == 'BEFORE': + # Find the index of a last Boolean modifier. + last_boolean_index = -1 + for i in reversed(range(len(obj.modifiers))): + if obj.modifiers[i].type == 'BOOLEAN': + last_boolean_index = i + break + + # If a Boolean modifier is found, list all modifiers that come before it. + if last_boolean_index != -1: + modifiers = [mod for mod in obj.modifiers[:last_boolean_index + 1]] + else: + modifiers = [] + + return modifiers + + + +#### ------------------------------ /poll/ ------------------------------ #### + +def is_boolean_modifier(mod, check_cutter=True) -> bool: + """Checks if a modifier is a Boolean modifier (and optionally if it has a valid cutter).""" + + if mod is None: + return False + if mod.type != 'BOOLEAN': + return False + if check_cutter and mod.object is None: + return False + + return True + #### ------------------------------ FUNCTIONS ------------------------------ #### def add_boolean_modifier(self, context, obj, cutter, mode, solver, pin=False, redo=True): - "Adds boolean modifier with specified cutter and properties to a single object" + """Adds the Boolean modifier with specified cutter and properties to a given object.""" if bpy.app.version < (5, 0, 0) and solver == 'FLOAT': solver = 'FAST' prefs = context.preferences.addons[base_package].preferences + name = "boolean_" + cutter.name.replace("boolean_", "") - modifier = obj.modifiers.new("boolean_" + cutter.name.replace("boolean_", ""), 'BOOLEAN') + modifier = obj.modifiers.new(name, 'BOOLEAN') modifier.operation = mode modifier.object = cutter modifier.solver = solver + modifier.show_in_editmode = prefs.show_in_editmode - # Set solver options (inherited from operator properties). + # Set solver options (inherited from operator properties, i.e. `self`). if redo: modifier.material_mode = self.material_mode modifier.use_self = self.use_self modifier.use_hole_tolerant = self.use_hole_tolerant modifier.double_threshold = self.double_threshold - if prefs.show_in_editmode: - modifier.show_in_editmode = True - # Move modifier to the index 0 (make it first in the stack). if pin: index = obj.modifiers.find(modifier.name) @@ -50,19 +110,20 @@ def add_boolean_modifier(self, context, obj, cutter, mode, solver, pin=False, re def apply_modifiers(context, obj, modifiers: list, force_clean=False): """ Apply modifiers on object. - Instead of using `bpy.ops.object.modifier_apply`, this function uses - `bpy.data.meshes.new_from_object` built-in function to create a temporary - mesh from the evaluated object (basically with visible modifiers applied). - Temporary mesh is then transferred to objects mesh with `bmesh`. + Instead of using `bpy.ops.object.modifier_apply`, by default this function uses + `to_mesh` built-in function to create a temporary mesh from the evaluated object + (basically with visible modifiers applied). Temporary mesh is then transferred + to objects mesh using `bmesh`. This method is up to 2x faster, although it's considered experimental and may fail in some cases, so a fallback to `bpy.ops.object.modifier_apply` is kept. """ prefs = context.preferences.addons[base_package].preferences + _stored_active_obj = context.active_object # Make object data unique if it's instanced. - if is_instanced_data(obj): + if is_instanced_mesh(obj.data): context.active_object.data = context.active_object.data.copy() try: @@ -71,10 +132,13 @@ def apply_modifiers(context, obj, modifiers: list, force_clean=False): if not force_clean: raise Exception() + context.view_layer.objects.active = obj with hide_modifiers(obj, excluding=modifiers): # Create a temporary mesh from evaluated object. - evaluated_obj = obj.evaluated_get(context.evaluated_depsgraph_get()) - temp_data = bpy.data.meshes.new_from_object(evaluated_obj) + depsgraph = context.evaluated_depsgraph_get() + evaluated_obj = obj.evaluated_get(depsgraph) + temp_data = evaluated_obj.to_mesh(preserve_all_data_layers=True, + depsgraph=depsgraph) # Create `bmesh` from temporary mesh and update edit mesh. if context.mode == 'EDIT_MESH': @@ -86,11 +150,11 @@ def apply_modifiers(context, obj, modifiers: list, force_clean=False): bm = bmesh.new() bm.from_mesh(temp_data) bm.to_mesh(obj.data) + bm.free() evaluated_obj.to_mesh_clear() - # Remove modifiers and purge temporary mesh. - bpy.data.meshes.remove(temp_data) + # Remove modifiers. for mod in modifiers: obj.modifiers.remove(mod) @@ -99,7 +163,6 @@ def apply_modifiers(context, obj, modifiers: list, force_clean=False): if obj.data.shape_keys: obj.shape_key_clear() - # Use `bpy.ops` operator to apply modifiers if above fails. except Exception as e: # print("Error applying modifiers with `bmesh` method:", e, "falling back to `bpy.ops` method") @@ -118,10 +181,12 @@ def apply_modifiers(context, obj, modifiers: list, force_clean=False): for mod in modifiers: bpy.ops.object.modifier_apply(modifier=mod.name) + context.view_layer.objects.active = _stored_active_obj + @contextmanager def hide_modifiers(obj, excluding: list): - """Hides all modifiers of a given object in viewport except those in excluding list""" + """Hides all modifiers of a given object in the viewport except those in `excluding` list.""" visible_modifiers = [] for mod in obj.modifiers: @@ -139,10 +204,10 @@ def hide_modifiers(obj, excluding: list): def add_modifier_asset(obj, path: str, asset: str): - """Loads the node group asset and adds a Geometry Nodes modifier using it.""" + """Loads in the node group asset and adds a Geometry Nodes modifier using it.""" try: - # Load the node group. + # Load in the node group. if bpy.app.version >= (5, 0, 0): with bpy.data.libraries.load(path, link=True, pack=True) as (data_from, data_to): if asset in data_from.node_groups: @@ -155,7 +220,7 @@ def add_modifier_asset(obj, path: str, asset: str): node_group = bpy.data.node_groups[asset] - # Add modifier on the object. + # Add modifier to the object. mod = obj.modifiers.new(asset, type='NODES') mod.node_group = node_group mod.show_group_selector = False @@ -168,16 +233,19 @@ def add_modifier_asset(obj, path: str, asset: str): return None -def get_modifiers_to_apply(context, obj, new_modifiers) -> list: - """Returns the list of modifiers that need to be applied based on add-on preferences.""" +def update_modifier_input(modifier, socket: str, value): + """Change the value of the geometry nodes modifier input socket.""" - prefs = context.preferences.addons[base_package].preferences - - if prefs.apply_order == 'ALL': - modifiers = [mod for mod in obj.modifiers] - elif prefs.apply_order == 'BOOLEANS': - modifiers = new_modifiers - elif prefs.apply_order == 'BEFORE': - modifiers = list_pre_boolean_modifiers(obj) - - return modifiers + try: + if bpy.app.version >= (5, 2, 0): + socket = getattr(modifier.properties.inputs, socket) + socket.value = value + else: + modifier[f"{socket}"] = value + except: + """ + NOTE: There are plethora of reasons why this can fail, node trees are finicky. + Accounting for all possible cases is borderline impossible, so this check is necessary + to at least fail silently and not throw Python error to users. + """ + pass diff --git a/extensions/blender_org/bool_tool/functions/object.py b/extensions/blender_org/bool_tool/functions/object.py index f0597a5..7af9134 100644 --- a/extensions/blender_org/bool_tool/functions/object.py +++ b/extensions/blender_org/bool_tool/functions/object.py @@ -1,152 +1,129 @@ import bpy import bmesh -import mathutils +from mathutils import Vector, Matrix from contextlib import contextmanager -from .. import __package__ as base_package -#### ------------------------------ FUNCTIONS ------------------------------ #### +#### ------------------------------ /poll/ ------------------------------ #### -def set_cutter_properties(context, cutter, mode, display='BOUNDS', collection=True): - """Ensures cutter is properly set: has right properties, is hidden, in a collection & parented""" +def is_linked(context, obj) -> bool: + """Checks whether the object is linked from an external .blend file (including library-overrides).""" - # Hide Cutters - cutter.hide_render = True - cutter.display_type = display - cutter.lineart.usage = 'EXCLUDE' - object_visibility_set(cutter, value=False) + if obj not in context.editable_objects: + if obj.library: + return True + else: + return False + else: + if obj.override_library: + return True + else: + return False - # Cutters Collection - if collection: - cutters_collection = ensure_collection(context) - if cutters_collection not in cutter.users_collection: - cutters_collection.objects.link(cutter) - # add_boolean_property - cutter.booleans.cutter = mode.capitalize() +def has_evaluated_mesh(context, obj): + """Checks if an evaluated object has mesh (created by Geometry Nodes modifiers).""" + # Exclude cases that return Python errors. + if not obj: + return False + if bpy.app.version < (5, 2, 0) and obj.type == 'EMPTY': + return False + if obj.instance_type != 'NONE': + return False + + depsgraph = context.view_layer.depsgraph + obj_eval = depsgraph.id_eval_get(obj) + + geometry = None + try: + geometry = obj_eval.evaluated_geometry() + except: + pass + + if not geometry or not geometry.mesh: + return False + else: + return True + + + +#### ------------------------------ /operate/ ------------------------------ #### def object_visibility_set(obj, value=False): - "Sets object visibility properties to either True or False" + """Sets object visibility properties to either True or False.""" obj.visible_camera = value + obj.visible_shadow = value obj.visible_diffuse = value obj.visible_glossy = value - obj.visible_shadow = value obj.visible_transmission = value obj.visible_volume_scatter = value + if bpy.app.version >= (5, 2, 0): + obj.visible_raycast = value + + obj.hide_probe_volume = not value + obj.hide_probe_sphere = not value + obj.hide_probe_plane = not value def convert_to_mesh(context, obj): - "Converts active object into mesh (applying all modifiers and shape keys in process)" + """Converts active object into mesh (applying all modifiers and shape keys in the process).""" - # store_selection + original_mode = obj.mode + + if original_mode != 'OBJECT': + edit_objects = context.objects_in_mode + bpy.ops.object.mode_set(mode='OBJECT') + + # Store selection. stored_active = context.active_object stored_selection = context.selected_objects - bpy.ops.object.select_all(action='DESELECT') + for ob in context.scene.objects: + ob.select_set(False) - # Convert + # Make `obj` active and only one selected. obj.select_set(True) context.view_layer.objects.active = obj + + # Convert. bpy.ops.object.convert(target='MESH') - # restore_selection - for obj in stored_selection: - obj.select_set(True) + if original_mode != 'OBJECT': + for ob in edit_objects: + ob.select_set(True) + bpy.ops.object.mode_set(mode=original_mode) + + # Restore selection. + for ob in stored_selection: + ob.select_set(True) context.view_layer.objects.active = stored_active -def ensure_collection(context): - """Checks the existance of boolean cutters collection and creates it if it doesn't exist""" +def change_parent(context, obj, parent, inverse=False): + """Changes or removes parent from an object while keeping the transformation.""" - prefs = context.preferences.addons[base_package].preferences + context.evaluated_depsgraph_get().update() - collection_name = prefs.collection_name - cutters_collection = bpy.data.collections.get(collection_name) - - if cutters_collection is None: - cutters_collection = bpy.data.collections.new(collection_name) - context.scene.collection.children.link(cutters_collection) - cutters_collection.hide_render = True - cutters_collection.color_tag = 'COLOR_01' - # cutters_collection.hide_viewport = True - # context.view_layer.layer_collection.children[collection_name].exclude = True - - return cutters_collection - - -def delete_empty_collection(): - """Removes boolean cutters collection if it has no more objects in it""" - - prefs = bpy.context.preferences.addons[base_package].preferences - - collection = bpy.data.collections.get(prefs.collection_name) - if collection and not collection.objects: - bpy.data.collections.remove(collection) - - -def delete_cutter(cutter): - """Deletes cutter object and purges it's mesh data""" - - orphaned_mesh = cutter.data - bpy.data.objects.remove(cutter) - if orphaned_mesh.users == 0: - bpy.data.meshes.remove(orphaned_mesh) - - -def change_parent(obj, parent, force=False, inverse=False): - """Changes or removes parent from cutter object while keeping the transformation""" - - if obj.parent is not None: - if not force: - return - - matrix_copy = obj.matrix_world.copy() obj.parent = parent - if inverse: + if inverse and parent is not None: obj.matrix_parent_inverse = parent.matrix_world.inverted() - obj.matrix_world = matrix_copy -def create_slice(context, canvas, modifier=False): - """Creates copy of canvas to be used as slice""" - - slice = canvas.copy() - slice.data = canvas.data.copy() - slice.name = slice.data.name = canvas.name + "_slice" - change_parent(slice, canvas) - - # Set Boolean Properties - if modifier == True: - slice.booleans.canvas = True - slice.booleans.slice = True - slice.booleans.slice_of = canvas - - # Add to Canvas Collections - for coll in canvas.users_collection: - coll.objects.link(slice) - - # add_slices_to_local_view - if context.space_data.local_view: - slice.local_view_set(context.space_data, True) - - return slice - - -def set_object_origin(obj, bm, point='CENTER', custom=None): - """Sets object origin to given position by shifting vertices""" +def set_object_origin(obj, bm, point='CENTER', custom: Vector=None): + """Sets the origin of a mesh type object to given position by shifting vertices.""" # Center of the bounding box. if point == 'CENTER_OBJ': - position_local = 0.125 * sum((mathutils.Vector(b) for b in obj.bound_box), mathutils.Vector()) + position_local = 0.125 * sum((Vector(b) for b in obj.bound_box), Vector()) position_world = obj.matrix_world @ position_local # Center of the geometry. elif point == 'CENTER_MESH': if len(bm.verts) > 0: - position_local = sum((v.co for v in bm.verts), mathutils.Vector()) / len(bm.verts) + position_local = sum((v.co for v in bm.verts), Vector()) / len(bm.verts) else: - position_local = mathutils.Vector((0, 0, 0)) + position_local = Vector((0, 0, 0)) position_world = obj.matrix_world @ position_local # Custom origin point (should be local Vector). @@ -154,8 +131,8 @@ def set_object_origin(obj, bm, point='CENTER', custom=None): position_local = custom position_world = obj.matrix_world @ custom - mat = mathutils.Matrix.Translation(position_local) - bmesh.ops.transform(bm, matrix=mat.inverted(), verts=bm.verts) + matrix = Matrix.Translation(position_local) + bmesh.ops.transform(bm, matrix=matrix.inverted(), verts=bm.verts) bm.to_mesh(obj.data) obj.location = position_world @@ -179,3 +156,13 @@ def hide_objects(context, exceptions: list): finally: for obj in hidden_objects: obj.hide_set(False) + + +def delete_object(cutter, purge_data=True): + """Deletes the object and optionally purges its data if it has no more users.""" + + orphaned_data = cutter.data + bpy.data.objects.remove(cutter) + + if purge_data and orphaned_data.users == 0: + bpy.data.meshes.remove(orphaned_data) diff --git a/extensions/blender_org/bool_tool/functions/poll.py b/extensions/blender_org/bool_tool/functions/poll.py index 03f4d92..237d6f3 100644 --- a/extensions/blender_org/bool_tool/functions/poll.py +++ b/extensions/blender_org/bool_tool/functions/poll.py @@ -1,153 +1,44 @@ import bpy -from .list import ( - list_canvas_cutters, - list_cutter_users, +from ..constants import ( + CONVERTABLE_TYPES, +) +from .mesh import ( + is_instanced_mesh, ) from .object import ( - convert_to_mesh, + has_evaluated_mesh, ) #### ------------------------------ FUNCTIONS ------------------------------ #### -def basic_poll(cls, context, check_linked=False): - """Basic poll for boolean operators.""" +def basic_poll(cls, context, check_active=True): + """Basic poll for Boolean operators.""" if context.mode != 'OBJECT': - return False - if context.active_object is None: + cls.poll_message_set("Boolean operators can only be performed in Object Mode") return False - obj = context.active_object - if obj.type != 'MESH': - cls.poll_message_set("Boolean operators can only be used for mesh objects") - return False - - if check_linked and is_linked(context, obj) == True: - cls.poll_message_set("Boolean operators can not be executed on linked objects") - return False + if check_active: + if context.active_object is None: + cls.poll_message_set("No active object") + return False return True -def is_linked(context, obj): - """Checks whether the object is linked from an external .blend file (including library-overrides).""" - - if obj not in context.editable_objects: - if obj.library: - return True - else: - return False - else: - if obj.override_library: - return True - else: - return False - - -def is_canvas(obj): - """Checks whether the object is a boolean canvas (i.e. has boolean cutters).""" - - if obj.booleans.canvas == False: - return False - else: - # Even if object is marked as canvas, check if it actually has any cutters - cutters, __ = list_canvas_cutters([obj]) - if len(cutters) > 0: - return True - else: - return False - - -def is_instanced_data(obj): - """Checks if `obj.data` has more than one users, i.e. is instanced.""" - """Function only considers object types as users, and excludes pointers.""" - - data = bpy.data.meshes.get(obj.data.name) - users = 0 - - for key, values in bpy.data.user_map(subset=[data]).items(): - for value in values: - if value.id_type == 'OBJECT': - users += 1 - - if users > 1: - return True - else: - return False - - -def active_modifier_poll(obj): - """Checks whether the active modifier for active object is a boolean.""" - - # Check if active modifier exists. - if len(obj.modifiers) == 0: - return False - if obj.modifiers.active is None: - return False - - # Check if active modifier is a boolean with a valid object. - modifier = obj.modifiers.active - if modifier.type != "BOOLEAN": - return False - if modifier.object is None: - return False - - return True - - -def has_evaluated_mesh(context, obj): - """Checks if an object (non-mesh type) has an evaluated mesh created by Geometry Nodes modifiers.""" - - depsgraph = context.view_layer.depsgraph - obj_eval = depsgraph.id_eval_get(obj) - geometry = obj_eval.evaluated_geometry() - - if geometry.mesh: - return True - else: - return False - - -def list_candidate_objects(self, context, canvas): - """Filter out objects from the selection that can't be used as a cutter.""" - - cutters = [] - for obj in context.selected_objects: - if obj == context.active_object: - continue - if is_linked(context, obj): - self.report({'WARNING'}, f"{obj.name} is linked and can not be used as a cutter") - continue - - if obj.type == 'MESH': - # Exclude if object is already a cutter for canvas. - if canvas in list_cutter_users([obj]): - continue - # Exclude if canvas is cutting the object (avoid dependancy loop). - if obj in list_cutter_users([canvas]): - self.report({'WARNING'}, f"{obj.name} can not cut its own cutter (dependancy loop)") - continue - - cutters.append(obj) - - elif obj.type in ('CURVE', 'FONT'): - if has_evaluated_mesh(context, obj): - convert_to_mesh(context, obj) - cutters.append(obj) - - return cutters - - -def destructive_op_confirmation(self, context, event, canvases: list, title="Boolean Operation"): +def destructive_op_confirmation(cls, context, event, canvases: list, title="Boolean Operation"): """ - Creates & returns the confirmation pop-up window for destructive boolean operators.\n - Confirmation window is triggered by canvas objects that have instanced object data or shape keys.\n - If none of the canvas objects have them the operator is executed without any confirmation. + Creates & returns the confirmation pop-up window for destructive Boolean operators.\n + Confirmation window is triggered by canvases that have instanced data or shape keys.\n + If none of the canvases have them the operator is executed without any confirmation. """ - has_instanced_data = any(obj for obj in canvases if is_instanced_data(obj)) + if len(canvases) == 0: + return cls.execute(context) + + has_instanced_data = any(obj for obj in canvases if is_instanced_mesh(obj.data)) has_shape_keys = any(obj for obj in canvases if obj.data.shape_keys) if has_instanced_data or has_shape_keys: @@ -166,15 +57,74 @@ def destructive_op_confirmation(self, context, event, canvases: list, title="Boo # Combined message. if has_instanced_data and has_shape_keys: message = ("Object(s) you're trying to cut have shape keys and instanced object data.\n" - "In order to apply modifiers shape keys need to be applied, and object data made single user.\n" + "In order to apply modifiers shape keys need to be applied & object data made single user.\n" "Do you proceed?") - popup = context.window_manager.invoke_confirm(self, event, title=title, + popup = context.window_manager.invoke_confirm(cls, event, title=title, confirm_text="Yes", icon='WARNING', message=message) + cls._unflippable = True return popup # Execute without confirmation window. else: - return self.execute(context) + return cls.execute(context) + + +def convert_to_mesh_confirmation(cls, context, event, cutters: list, title="Boolean Operation"): + """ + Creates & returns the confirmation pop-up window when the object is + about to be converted to mesh to be used as a cutter. + + NOTE (1): Only triggers during brush Boolean operators, + because object gets destroyed in the destructive one anyway. + + NOTE (2): This is only required because of the limitation of legacy Boolean modifier. + Geometry nodes implementation works with any object type. When the add-on is + updated to work with custom modifiers this will not be necesary anymore. + """ + + if len(cutters) == 0: + return cls.execute(context) + + is_convertable = any( + obj.type in CONVERTABLE_TYPES and has_evaluated_mesh(context, obj) + for obj in cutters + ) + + if is_convertable: + message = ("Some of the selected objects are not of the Mesh type, but output mesh.\n" + "In order to use them as cutters, they need to be converted to mesh.\n" + "This is a destructive operator. Do you proceed?") + + popup = context.window_manager.invoke_confirm(cls, event, title=title, + confirm_text="Yes", icon='WARNING', + message=message) + + cls._unflippable = True + return popup + + # Execute without confirmation window. + else: + return cls.execute(context) + + + +#### ------------------------------ /operator_helpers/ ------------------------------ #### + +def _guess_toggle_state(modifiers): + """Guess whether cutters should be hidden or revealed.""" + + enabled = 0 + disabled = 0 + for mod in modifiers: + if mod.show_viewport: + enabled += 1 + else: + disabled += 1 + + if enabled > disabled: + return "On" + else: + return "Off" diff --git a/extensions/blender_org/bool_tool/functions/scene.py b/extensions/blender_org/bool_tool/functions/scene.py new file mode 100644 index 0000000..615defe --- /dev/null +++ b/extensions/blender_org/bool_tool/functions/scene.py @@ -0,0 +1,68 @@ +import bpy +from .. import __package__ as base_package + +from .object import ( + hide_objects, +) +from .types import ( + Ray, +) +from .view import ( + region_2d_to_ray_3d, +) + + +#### ------------------------------ FUNCTIONS ------------------------------ #### + +def ensure_collection(context) -> bpy.types.Collection: + """Returns the Boolean cutters collection and creates it if it doesn't exist.""" + + prefs = context.preferences.addons[base_package].preferences + collection_name = prefs.collection_name + + coll = bpy.data.collections.get(collection_name) + + # Create the collection if it doesn't exist. + if coll is None: + coll = bpy.data.collections.new(collection_name) + coll.hide_render = True + coll.color_tag = 'COLOR_01' + context.scene.collection.children.link(coll) + + return coll + + +def delete_empty_collection(context): + """Removes Boolean cutters collection if it has no more objects in it.""" + + prefs = context.preferences.addons[base_package].preferences + + if not prefs.use_collection: + return + + collection_name = prefs.collection_name + collection = bpy.data.collections.get(collection_name) + + if not collection: + return + if collection.objects: + return + + bpy.data.collections.remove(collection) + + +def raycast(context, position, objects): + """Cast a ray in the scene to get the surface on any of the given objects.""" + + region = context.region + rv3d = context.region_data + depsgraph = context.view_layer.depsgraph + + origin, direction = region_2d_to_ray_3d(region, rv3d, position) + + # Cast Ray + with hide_objects(context, exceptions=objects): + hit, location, normal, index, object, matrix = context.scene.ray_cast(depsgraph, origin, direction) + ray = Ray(hit, location, normal, index, object, matrix) + + return ray diff --git a/extensions/blender_org/bool_tool/functions/types.py b/extensions/blender_org/bool_tool/functions/types.py index 485a742..e8104d6 100644 --- a/extensions/blender_org/bool_tool/functions/types.py +++ b/extensions/blender_org/bool_tool/functions/types.py @@ -1,5 +1,4 @@ import bpy -import mathutils from mathutils import Vector, Matrix @@ -16,8 +15,8 @@ class Ray: obj, matrix: Matrix): self.hit = hit - self.location = location if location is not None else mathutils.Vector() - self.normal = normal if normal is not None else mathutils.Vector() + self.location = location + self.normal = normal self.index = index self.obj = obj - self.matrix = matrix if matrix is not None else mathutils.Matrix() + self.matrix = matrix diff --git a/extensions/blender_org/bool_tool/functions/view.py b/extensions/blender_org/bool_tool/functions/view.py new file mode 100644 index 0000000..d4bdbf3 --- /dev/null +++ b/extensions/blender_org/bool_tool/functions/view.py @@ -0,0 +1,75 @@ +import bpy +import mathutils +from mathutils import Vector +from bpy_extras import view3d_utils + + +#### ------------------------------ FUNCTIONS ------------------------------ #### + +def redraw_regions(context): + """Redraw regions to find the limits of the 3D viewport.""" + + for area in context.window.screen.areas: + if area.type != 'VIEW_3D': + continue + for region in area.regions: + if region.type in {'WINDOW', 'UI'}: + region.tag_redraw() + + +def distance_from_point_to_segment(point: Vector, line_p1: Vector, line_p2: Vector) -> float: + """ + Calculates the shortest distance between the point and the finite segment. + This is an alternative to `mathutils.geometry.intersect_point_line` (w/ clamping). + Adapted from "Blockout" extension by niewinny (https://github.com/niewinny/blockout). + """ + + segment = line_p2 - line_p1 + start_to_point = point - line_p1 + + # Projection along segment. + c1 = start_to_point.dot(segment) + if c1 <= 0: + return (point - line_p1).length + + # Segment length squared. + c2 = segment.dot(segment) + if c2 <= c1: + return (point - line_p2).length + + t = c1 / c2 + closest_point = line_p1 + t * segment + distance = (point - closest_point).length + + return distance + + +def region_2d_to_ray_3d(region, rv3d, point_2d: Vector) -> tuple[Vector, Vector]: + """ + Converts a 2D screen-space point into a 3D ray in the world-space. + Returns a tuple of `ray_origin` and `ray_direction` Vectors. + """ + + origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, point_2d) + direction = view3d_utils.region_2d_to_vector_3d(region, rv3d, point_2d) + + return origin, direction + + +def region_2d_to_plane_3d(region, rv3d, point_2d: Vector, plane: tuple[Vector]) -> Vector: + """ + Converts a 2D screen-space point into a 3D point on a plane in world-space. + Adapted from "Blockout" extension by niewinny (https://github.com/niewinny/blockout). + """ + + location, normal = plane + p3_origin, p3_direction = region_2d_to_ray_3d(region, rv3d, point_2d) + + # Intersect the point with the plane. + p3_on_plane = mathutils.geometry.intersect_line_plane( + p3_origin, # First point of line. + p3_origin + p3_direction, # Second point of line. + location, # `plane_co` (a point on the plane). + normal) # `plane_no` (the direction the plane is facing). + + return p3_on_plane diff --git a/extensions/blender_org/bool_tool/icons/__init__.py b/extensions/blender_org/bool_tool/icons/__init__.py deleted file mode 100644 index 56267db..0000000 --- a/extensions/blender_org/bool_tool/icons/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -import bpy -import os -import bpy.utils.previews - - -#### ------------------------------ REGISTRATION ------------------------------ #### - -svg_icons = {} -icons = bpy.utils.previews.new() -dir = os.path.join(os.path.dirname(__file__)) - -icons.load("MEASURE", os.path.join(dir, "measure.svg"), 'IMAGE') -icons.load("CPU", os.path.join(dir, "cpu.svg"), 'IMAGE') -svg_icons["main"] = icons - - -def register(): - ... - -def unregister(): - # ICONS - for pcoll in svg_icons.values(): - bpy.utils.previews.remove(pcoll) - svg_icons.clear() diff --git a/extensions/blender_org/bool_tool/manual.py b/extensions/blender_org/bool_tool/manual.py index 362d3bd..15742db 100644 --- a/extensions/blender_org/bool_tool/manual.py +++ b/extensions/blender_org/bool_tool/manual.py @@ -4,31 +4,34 @@ import bpy #### ------------------------------ FUNCTIONS ------------------------------ #### def bool_tool_manual_map(): - url_manual_prefix = "https://github.com/nickberckley/bool_tool/wiki/" + url_manual_prefix = "https://nickberckley.github.io/bool_tool/" # Carver - url_manual_mapping = (("bpy.ops.object.carve", "Carver"), - # Brush Boolean - ("bpy.ops.object.boolean_brush_union", "Boolean-Operators"), - ("bpy.ops.object.boolean_brush_intersect", "Boolean-Operators"), - ("bpy.ops.object.boolean_brush_difference", "Boolean-Operators"), - ("bpy.ops.object.boolean_brush_slice", "Boolean-Operators"), + url_manual_mapping = (# Brush Boolean + ("bpy.ops.object.boolean_brush_union", "booleans/brush_booleans.html"), + ("bpy.ops.object.boolean_brush_intersect", "booleans/brush_booleans.html"), + ("bpy.ops.object.boolean_brush_difference", "booleans/brush_booleans.html"), + ("bpy.ops.object.boolean_brush_slice", "booleans/brush_booleans.html"), # Auto Boolean - ("bpy.ops.object.boolean_auto_union", "Boolean-Operators#auto-boolean-operators"), - ("bpy.ops.object.boolean_auto_intersect", "Boolean-Operators#auto-boolean-operators"), - ("bpy.ops.object.boolean_auto_difference", "Boolean-Operators#auto-boolean-operators"), - ("bpy.ops.object.boolean_auto_slice", "Boolean-Operators#auto-boolean-operators"), + ("bpy.ops.object.boolean_auto_union", "booleans/auto_booleans.html"), + ("bpy.ops.object.boolean_auto_intersect", "booleans/auto_booleans.html"), + ("bpy.ops.object.boolean_auto_difference", "booleans/auto_booleans.html"), + ("bpy.ops.object.boolean_auto_slice", "booleans/auto_booleans.html"), + # Carver + ("bpy.ops.object.carve_box", "carver/index.html"), + ("bpy.ops.object.carve_circle", "carver/index.html"), + ("bpy.ops.object.carve_polyline", "carver/index.html"), # Cutter Utilities - ("bpy.ops.object.boolean_toggle_cutter", "Utility-Operators#toggle-cutter"), - ("bpy.ops.object.boolean_remove_cutter", "Utility-Operators#remove-cutter"), - ("bpy.ops.object.boolean_apply_cutter", "Utility-Operators#apply-cutter"), + ("bpy.ops.object.boolean_toggle_cutter", "utilities/toggle.html"), + ("bpy.ops.object.boolean_remove_cutter", "utilities/remove.html"), + ("bpy.ops.object.boolean_apply_cutter", "utilities/apply.html"), # Canvas Utilities - ("bpy.ops.object.boolean_toggle_all", "Utility-Operators#toggle-all-cutters"), - ("bpy.ops.object.boolean_remove_all", "Utility-Operators#remove-all-cutters"), - ("bpy.ops.object.boolean_apply_all", "Utility-Operators#apply-all-cutters"), + ("bpy.ops.object.boolean_toggle_all", "utilities/toggle.html"), + ("bpy.ops.object.boolean_remove_all", "utilities/remove.html"), + ("bpy.ops.object.boolean_apply_all", "utilities/apply.html"), # Select - ("bpy.ops.object.select_cutter_canvas", "Utility-Operators#select-operators"), - ("bpy.ops.object.boolean_select_all", "Utility-Operators#select-operators"), + ("bpy.ops.object.select_cutter_canvas", "utilities/select.html"), + ("bpy.ops.object.boolean_select_all", "utilities/select.html"), ) return url_manual_prefix, url_manual_mapping diff --git a/extensions/blender_org/bool_tool/operators/__init__.py b/extensions/blender_org/bool_tool/operators/__init__.py index ae5ca27..6588ead 100644 --- a/extensions/blender_org/bool_tool/operators/__init__.py +++ b/extensions/blender_org/bool_tool/operators/__init__.py @@ -18,12 +18,12 @@ else: #### ------------------------------ REGISTRATION ------------------------------ #### -modules = [ +modules = ( boolean, canvas, cutter, select, -] +) def register(): for module in modules: diff --git a/extensions/blender_org/bool_tool/operators/boolean.py b/extensions/blender_org/bool_tool/operators/boolean.py index 4794b2c..071389c 100644 --- a/extensions/blender_org/bool_tool/operators/boolean.py +++ b/extensions/blender_org/bool_tool/operators/boolean.py @@ -2,12 +2,13 @@ import bpy from collections import defaultdict from .. import __package__ as base_package -from ..functions.poll import ( - basic_poll, - is_linked, - is_instanced_data, - list_candidate_objects, - destructive_op_confirmation, +from ..functions.canvas import ( + filter_canvases, + create_slice, +) +from ..functions.cutter import ( + filter_cutters, + make_cutter, ) from ..functions.modifier import ( add_boolean_modifier, @@ -15,23 +16,36 @@ from ..functions.modifier import ( get_modifiers_to_apply, ) from ..functions.object import ( - set_cutter_properties, change_parent, - create_slice, - delete_cutter, + delete_object, +) +from ..functions.poll import ( + basic_poll, + convert_to_mesh_confirmation, + destructive_op_confirmation, ) #### ------------------------------ PROPERTIES ------------------------------ #### -class ModifierProperties(): +class BooleanBase(): + # Add-on properties. + flip: bpy.props.BoolProperty( + name = "Flip Canvas & Cutters", + options = {'SKIP_SAVE'}, + default = False, + ) + + # Boolean modifier properties. material_mode: bpy.props.EnumProperty( name = "Materials", description = "Method for setting materials on the new faces", - items = (('INDEX', "Index Based", ("Set the material on new faces based on the order of the material slot lists. If a material doesn't exist on the\n" - "modifier object, the face will use the same material slot or the first if the object doesn't have enough slots.")), - ('TRANSFER', "Transfer", ("Transfer materials from non-empty slots to the result mesh, adding new materials as necessary.\n" - "For empty slots, fall back to using the same material index as the operand mesh."))), + items = (('INDEX', "Index Based", + ("Set the material on new faces based on the order of the material slot lists. If a material doesn't exist on the\n" + "modifier object, the face will use the same material slot or the first if the object doesn't have enough slots.")), + ('TRANSFER', "Transfer", + ("Transfer materials from non-empty slots to the result mesh, adding new materials as necessary.\n" + "For empty slots, fall back to using the same material index as the operand mesh."))), default = 'INDEX', ) use_self: bpy.props.BoolProperty( @@ -52,12 +66,24 @@ class ModifierProperties(): default = 0.000001, ) + # Built-in Methods. + @classmethod + def poll(cls, context): + return basic_poll(cls, context) + + def draw(self, context): prefs = context.preferences.addons[base_package].preferences layout = self.layout layout.use_property_split = True + col = layout.column() + col.prop(self, "flip") + if self._unflippable: + col.enabled = False + + layout.separator() if prefs.solver == 'EXACT': layout.prop(self, "material_mode") layout.prop(self, "use_self") @@ -66,53 +92,86 @@ class ModifierProperties(): layout.prop(self, "double_threshold") + # Custom Methods. + def _filter_objects(self, context) -> tuple[list, list]: + """Returns lists of cutters & canvases.""" + + canvases = [context.active_object] + cutters = [obj for obj in context.selected_objects if obj != context.active_object] + + # Flip. + if self.flip: + canvases, cutters = cutters, canvases + + # Filter Canvases. + canvases = filter_canvases(self, context, canvases) + if len(canvases) == 0: + self.report({'WARNING'}, "No valid canvases selected") + return None, None + + # Filter Cutters. + cutters = filter_cutters(self, context, cutters, canvases) + if len(cutters) == 0: + self.report({'WARNING'}, "No valid cutters selected") + return None, None + + return canvases, cutters + + #### ------------------------------ /brush_boolean/ ------------------------------ #### -class BrushBoolean(ModifierProperties): - @classmethod - def poll(cls, context): - return basic_poll(cls, context) - +class BrushBoolean(BooleanBase): def invoke(self, context, event): - # Abort if there are less than 2 selected objects. + # Abort if there are less than 2 objects selected. if len(context.selected_objects) < 2: self.report({'WARNING'}, "Boolean operator needs at least two selected objects") return {'CANCELLED'} - # Abort if active object is linked. - if is_linked(context, context.active_object): - self.report({'WARNING'}, "Boolean operators cannot be performed on linked objects") - return {'CANCELLED'} + if not self.flip: + cutters = [obj for obj in context.selected_objects if obj != context.active_object] + else: + cutters = [context.active_object] - return self.execute(context) + self._unflippable = False + return convert_to_mesh_confirmation(self, context, event, cutters, "Brush Boolean") def execute(self, context): prefs = context.preferences.addons[base_package].preferences - canvas = context.active_object - cutters = list_candidate_objects(self, context, context.active_object) - if len(cutters) == 0: + # Create lists of cutters & canvases. + canvases, cutters = self._filter_objects(context) + if canvases is None or cutters is None: return {'CANCELLED'} # Create slices. if self.mode == "SLICE": for cutter in cutters: - """NOTE: Slices need to be created in a separate loop to avoid inheriting boolean modifiers that the operator adds.""" - slice = create_slice(context, canvas, modifier=True) - add_boolean_modifier(self, context, slice, cutter, "INTERSECT", prefs.solver, pin=prefs.pin) + """ + NOTE: Slices need to be created in a separate loop to avoid + inheriting Boolean modifiers that the operator adds. + """ + for canvas in canvases: + slice = create_slice(context, canvas, modifier=True) + add_boolean_modifier(self, context, slice, cutter, "INTERSECT", prefs.solver, pin=prefs.pin) for cutter in cutters: - mode = "DIFFERENCE" if self.mode == "SLICE" else self.mode - display = 'WIRE' if prefs.wireframe else 'BOUNDS' - set_cutter_properties(context, cutter, self.mode, display=display, collection=prefs.use_collection) - add_boolean_modifier(self, context, canvas, cutter, mode, prefs.solver, pin=prefs.pin) - if prefs.parent: - change_parent(cutter, canvas) + make_cutter(context, cutter, self.mode, + display=prefs.display, + collection=prefs.use_collection) - canvas.booleans.canvas = True + mode = "DIFFERENCE" if self.mode == "SLICE" else self.mode + for canvas in canvases: + add_boolean_modifier(self, context, canvas, cutter, mode, prefs.solver, pin=prefs.pin) + + if prefs.parent: + change_parent(context, cutter, canvases[0], inverse=True) + + # Set Boolean property to canvases. + for canvas in canvases: + canvas.booleans.canvas = True return {'FINISHED'} @@ -120,29 +179,47 @@ class BrushBoolean(ModifierProperties): class OBJECT_OT_boolean_brush_union(bpy.types.Operator, BrushBoolean): bl_idname = "object.boolean_brush_union" bl_label = "Boolean Union (Brush)" - bl_description = "Merge selected objects into active one" bl_options = {'REGISTER', 'UNDO'} mode = "UNION" + @classmethod + def description(cls, context, properties): + if not properties.flip: + return "Merge selected objects into the active one" + else: + return "Merge the active object into selected ones" + class OBJECT_OT_boolean_brush_intersect(bpy.types.Operator, BrushBoolean): bl_idname = "object.boolean_brush_intersect" bl_label = "Boolean Intersection (Brush)" - bl_description = "Only keep the parts of the active object that are interesecting selected objects" bl_options = {'REGISTER', 'UNDO'} mode = "INTERSECT" + @classmethod + def description(cls, context, properties): + if not properties.flip: + return "Only keep parts of the active object that are interesecting selected objects" + else: + return "Only keep parts of selected objects that are interesecting the active one" + class OBJECT_OT_boolean_brush_difference(bpy.types.Operator, BrushBoolean): bl_idname = "object.boolean_brush_difference" bl_label = "Boolean Difference (Brush)" - bl_description = "Subtract selected objects from active one" bl_options = {'REGISTER', 'UNDO'} mode = "DIFFERENCE" + @classmethod + def description(cls, context, properties): + if not properties.flip: + return "Subtract selected objects from the active one" + else: + return "Subtract the active object from selected ones" + class OBJECT_OT_boolean_brush_slice(bpy.types.Operator, BrushBoolean): bl_idname = "object.boolean_brush_slice" @@ -152,15 +229,18 @@ class OBJECT_OT_boolean_brush_slice(bpy.types.Operator, BrushBoolean): mode = "SLICE" + @classmethod + def description(cls, context, properties): + if not properties.flip: + return "Slice the active object by selected ones. Will create slices as separate objects" + else: + return "Slice selected objects by the active one. Will create slices as separate objects" + #### ------------------------------ /auto_boolean/ ------------------------------ #### -class AutoBoolean(ModifierProperties): - @classmethod - def poll(cls, context): - return basic_poll(cls, context) - +class AutoBoolean(BooleanBase): def invoke(self, context, event): # Abort if there are less than 2 selected objects. @@ -168,55 +248,66 @@ class AutoBoolean(ModifierProperties): self.report({'WARNING'}, "Boolean operator needs at least two selected objects") return {'CANCELLED'} - # Abort if active object is linked. - if is_linked(context, context.active_object): - self.report({'ERROR'}, "Modifiers cannot be applied to linked object") - return {'CANCELLED'} + if not self.flip: + canvases = [context.active_object] + else: + canvases = [obj for obj in context.selected_objects if obj != context.active_object] - return destructive_op_confirmation(self, context, event, [context.active_object], title="Auto Boolean") + for canvas in canvases: + if canvas.type != 'MESH': + canvases.remove(canvas) + + self._unflippable = False + return destructive_op_confirmation(self, context, event, canvases, "Auto Boolean") def execute(self, context): prefs = context.preferences.addons[base_package].preferences - canvas = context.active_object - cutters = list_candidate_objects(self, context, context.active_object) new_modifiers = defaultdict(list) - if len(cutters) == 0: + # Create lists of cutters & canvases. + canvases, cutters = self._filter_objects(context) + if canvases is None or cutters is None: return {'CANCELLED'} # Create slices. if self.mode == "SLICE": for cutter in cutters: - """NOTE: Slices need to be created in a separate loop to avoid inheriting boolean modifiers that the operator adds.""" - slice = create_slice(context, canvas) - modifier = add_boolean_modifier(self, context, slice, cutter, "INTERSECT", prefs.solver, pin=prefs.pin) - new_modifiers[slice].append(modifier) - slice.select_set(True) + """ + NOTE: Slices need to be created in a separate loop to avoid + inheriting Boolean modifiers that the operator adds. + """ + for canvas in canvases: + slice = create_slice(context, canvas) + modifier = add_boolean_modifier(self, context, slice, cutter, "INTERSECT", + prefs.solver, pin=prefs.pin) + new_modifiers[slice].append(modifier) + slice.select_set(True) for cutter in cutters: - # Add boolean modifier on canvas. + # Add Boolean modifier on canvases. mode = "DIFFERENCE" if self.mode == "SLICE" else self.mode - modifier = add_boolean_modifier(self, context, canvas, cutter, mode, prefs.solver, pin=prefs.pin) - new_modifiers[canvas].append(modifier) + for canvas in canvases: + modifier = add_boolean_modifier(self, context, canvas, cutter, mode, prefs.solver, pin=prefs.pin) + new_modifiers[canvas].append(modifier) - # Transfer cutters children to canvas. + # Transfer cutters children to a canvas. for child in cutter.children: - change_parent(child, canvas) + change_parent(context, child, canvases[0]) # Select all faces of the cutter so that newly created faces in canvas # are also selected after applying the modifier. for face in cutter.data.polygons: face.select = True - # Apply modifiers on canvas & slices. + # Apply modifiers on canvases & slices. for obj, modifiers in new_modifiers.items(): modifiers = get_modifiers_to_apply(context, obj, modifiers) apply_modifiers(context, obj, modifiers) # Delete cutters. for cutter in cutters: - delete_cutter(cutter) + delete_object(cutter) return {'FINISHED'} @@ -224,29 +315,47 @@ class AutoBoolean(ModifierProperties): class OBJECT_OT_boolean_auto_union(bpy.types.Operator, AutoBoolean): bl_idname = "object.boolean_auto_union" bl_label = "Boolean Union (Auto)" - bl_description = "Merge selected objects into active one" bl_options = {'REGISTER', 'UNDO'} mode = "UNION" + @classmethod + def description(cls, context, properties): + if not properties.flip: + return "Merge selected objects into the active one" + else: + return "Merge the active object into selected ones" + class OBJECT_OT_boolean_auto_difference(bpy.types.Operator, AutoBoolean): bl_idname = "object.boolean_auto_difference" bl_label = "Boolean Difference (Auto)" - bl_description = "Subtract selected objects from active one" bl_options = {'REGISTER', 'UNDO'} mode = "DIFFERENCE" + @classmethod + def description(cls, context, properties): + if not properties.flip: + return "Subtract selected objects from the active one" + else: + return "Subtract the active object from selected ones" + class OBJECT_OT_boolean_auto_intersect(bpy.types.Operator, AutoBoolean): bl_idname = "object.boolean_auto_intersect" bl_label = "Boolean Intersect (Auto)" - bl_description = "Only keep the parts of the active object that are interesecting selected objects" bl_options = {'REGISTER', 'UNDO'} mode = "INTERSECT" + @classmethod + def description(cls, context, properties): + if not properties.flip: + return "Only keep parts of the active object that are interesecting selected objects" + else: + return "Only keep parts of selected objects that are interesecting the active one" + class OBJECT_OT_boolean_auto_slice(bpy.types.Operator, AutoBoolean): bl_idname = "object.boolean_auto_slice" @@ -256,13 +365,20 @@ class OBJECT_OT_boolean_auto_slice(bpy.types.Operator, AutoBoolean): mode = "SLICE" + @classmethod + def description(cls, context, properties): + if not properties.flip: + return "Slice the active object by selected ones. Will create slices as separate objects" + else: + return "Slice selected objects by the active one. Will create slices as separate objects" + #### ------------------------------ REGISTRATION ------------------------------ #### addon_keymaps = [] -classes = [ +classes = ( OBJECT_OT_boolean_brush_union, OBJECT_OT_boolean_brush_difference, OBJECT_OT_boolean_brush_intersect, @@ -272,7 +388,7 @@ classes = [ OBJECT_OT_boolean_auto_difference, OBJECT_OT_boolean_auto_intersect, OBJECT_OT_boolean_auto_slice, -] +) def register(): diff --git a/extensions/blender_org/bool_tool/operators/canvas.py b/extensions/blender_org/bool_tool/operators/canvas.py index c7000f8..dabcc37 100644 --- a/extensions/blender_org/bool_tool/operators/canvas.py +++ b/extensions/blender_org/bool_tool/operators/canvas.py @@ -2,29 +2,30 @@ import bpy import itertools from .. import __package__ as base_package -from ..functions.poll import ( - basic_poll, - is_canvas, - is_instanced_data, - destructive_op_confirmation, +from ..functions.canvas import ( + list_selected_canvases, + list_canvas_cutters, + list_canvas_slices, +) +from ..functions.cutter import ( + list_cutter_users, + handle_unused_cutters, ) from ..functions.modifier import ( apply_modifiers, + get_modifiers_to_apply, + is_boolean_modifier, ) from ..functions.object import ( - object_visibility_set, - delete_empty_collection, - delete_cutter, - change_parent, + delete_object, ) -from ..functions.list import ( - list_canvases, - list_canvas_slices, - list_canvas_cutters, - list_cutter_users, - list_selected_canvases, - list_unused_cutters, - list_pre_boolean_modifiers, +from ..functions.poll import ( + basic_poll, + destructive_op_confirmation, + _guess_toggle_state, +) +from ..functions.scene import ( + delete_empty_collection, ) @@ -34,41 +35,50 @@ from ..functions.list import ( class OBJECT_OT_boolean_toggle_all(bpy.types.Operator): bl_idname = "object.boolean_toggle_all" bl_label = "Toggle Boolean Cutters" - bl_description = "Toggle all boolean cutters affecting selected canvases" + bl_description = "Toggle all Boolean cutters affecting selected canvases" bl_options = {'UNDO'} @classmethod def poll(cls, context): - return basic_poll(cls, context, check_linked=True) and is_canvas(context.active_object) + return basic_poll(cls, context, check_active=False) def execute(self, context): + # Filter canvases. canvases = list_selected_canvases(context) + if len(canvases) == 0: + self.report({'WARNING'}, "No valid canvases selected") + return {'CANCELLED'} + cutters, modifiers = list_canvas_cutters(canvases) - slices = list_canvas_slices(canvases) + modifiers = list(itertools.chain.from_iterable(modifiers.values())) + slices = list_canvas_slices(context, canvases) + + state = _guess_toggle_state(modifiers) + state = True if state == "On" else False # Toggle Modifiers for mod in modifiers: - mod.show_viewport = not mod.show_viewport - mod.show_render = not mod.show_render + mod.show_viewport = not state + mod.show_render = not state # Hide Slices for slice in slices: - slice.hide_viewport = not slice.hide_viewport - slice.hide_render = not slice.hide_render + slice.hide_viewport = state + slice.hide_render = state + slice.hide_set(state) for mod in slice.modifiers: - if mod.type == 'BOOLEAN' and mod.object in cutters: - mod.show_viewport = not mod.show_viewport - mod.show_render = not mod.show_render + if not is_boolean_modifier(mod): + continue + if mod.object in cutters: + mod.show_viewport = not state + mod.show_render = not state # Hide Unused Cutters - other_canvases = list_canvases() - for obj in other_canvases: - if obj not in canvases + slices: - if any(mod.object in cutters and mod.show_viewport for mod in obj.modifiers if mod.type == 'BOOLEAN'): - cutters[:] = [cutter for cutter in cutters if cutter not in [mod.object for mod in obj.modifiers]] - for cutter in cutters: - cutter.hide_viewport = not cutter.hide_viewport + other_canvases = list_cutter_users([cutter], exclude=canvases + slices).keys() + if len(other_canvases) == 0: + cutter.hide_viewport = state + cutter.hide_set(state) return {'FINISHED'} @@ -77,72 +87,49 @@ class OBJECT_OT_boolean_toggle_all(bpy.types.Operator): class OBJECT_OT_boolean_remove_all(bpy.types.Operator): bl_idname = "object.boolean_remove_all" bl_label = "Remove Boolean Cutters" - bl_description = "Remove all boolean cutters from selected canvases" - bl_options = {'UNDO'} + bl_description = "Remove all Boolean cutters from selected canvases" + bl_options = {'REGISTER', 'UNDO'} + + delete_cutters: bpy.props.BoolProperty( + name = "Delete Unused Cutters", + description = "Completely remove cutters if they're not used by any other remaining canvas", + default = True, + ) @classmethod def poll(cls, context): - return basic_poll(cls, context, check_linked=True) and is_canvas(context.active_object) + return basic_poll(cls, context, check_active=False) def execute(self, context): prefs = context.preferences.addons[base_package].preferences + # Filter canvases. canvases = list_selected_canvases(context) - cutters, __ = list_canvas_cutters(canvases) - slices = list_canvas_slices(canvases) + if len(canvases) == 0: + self.report({'WARNING'}, "No valid canvases selected") + return {'CANCELLED'} + + cutters, modifiers = list_canvas_cutters(canvases) + slices = list_canvas_slices(context, canvases) # Remove Slices for slice in slices: if slice in canvases: canvases.remove(slice) - delete_cutter(slice) + delete_object(slice) - for canvas in canvases: - # Remove Modifiers - for mod in canvas.modifiers: - if mod.type == 'BOOLEAN' and "boolean_" in mod.name: - if mod.object in cutters: - canvas.modifiers.remove(mod) + # Remove Modifiers + for canvas, mods in modifiers.items(): + for mod in mods: + canvas.modifiers.remove(mod) + canvas.booleans.canvas = False - # remove_boolean_properties - if canvas.booleans.canvas == True: - canvas.booleans.canvas = False + # Handle Unused Cutters + handle_unused_cutters(context, list(cutters), canvases + slices, + delete=self.delete_cutters) - - # Restore Orphaned Cutters - unused_cutters, leftovers = list_unused_cutters(cutters, canvases, slices, do_leftovers=True) - - for cutter in unused_cutters: - if cutter.booleans.carver: - delete_cutter(cutter) - else: - # restore_visibility - cutter.hide_render = False - cutter.display_type = 'TEXTURED' - cutter.lineart.usage = 'INHERIT' - object_visibility_set(cutter, value=True) - cutter.booleans.cutter = "" - - # remove_parent_&_collection - if prefs.parent and cutter.parent in canvases: - change_parent(cutter, None) - - if prefs.use_collection: - cutters_collection = bpy.data.collections.get(prefs.collection_name) - if cutters_collection in cutter.users_collection: - bpy.data.collections.get(prefs.collection_name).objects.unlink(cutter) - - # purge_empty_collection - if prefs.use_collection: - delete_empty_collection() - - - # Change Leftover Cutter Parent - if prefs.parent: - for cutter in leftovers: - if cutter.parent in canvases: - other_canvases = list_cutter_users([cutter]) - change_parent(cutter, other_canvases[0]) + # Purge Empty Collection + delete_empty_collection(context) return {'FINISHED'} @@ -151,74 +138,56 @@ class OBJECT_OT_boolean_remove_all(bpy.types.Operator): class OBJECT_OT_boolean_apply_all(bpy.types.Operator): bl_idname = "object.boolean_apply_all" bl_label = "Apply All Boolean Cutters" - bl_description = "Apply all boolean cutters on selected canvases" - bl_options = {'UNDO'} + bl_description = "Apply all Boolean cutters to selected canvases" + bl_options = {'REGISTER', 'UNDO'} + + delete_cutters: bpy.props.BoolProperty( + name = "Delete Unused Cutters", + description = "Completely remove cutters if they're not used by any other remaining canvas", + default = True, + ) @classmethod def poll(cls, context): - return basic_poll(cls, context, check_linked=True) and is_canvas(context.active_object) - + return basic_poll(cls, context, check_active=False) def invoke(self, context, event): - self.canvases = list_selected_canvases(context) - return destructive_op_confirmation(self, context, event, self.canvases, title="Apply Boolean Cutters") + # Filter canvases. + canvases = list_selected_canvases(context) + if len(canvases) == 0: + self.report({'WARNING'}, "No valid canvases selected") + return {'CANCELLED'} + return destructive_op_confirmation(self, context, event, canvases, title="Apply Boolean Cutters") def execute(self, context): prefs = context.preferences.addons[base_package].preferences - cutters, __ = list_canvas_cutters(self.canvases) - slices = list_canvas_slices(self.canvases) + canvases = list_selected_canvases(context) + cutters, __ = list_canvas_cutters(canvases) + slices = list_canvas_slices(context, canvases) # Select all faces of the cutter so that newly created faces in canvas # are also selected after applying the modifier. - for cutter in cutters: + for cutter in list(cutters): for face in cutter.data.polygons: face.select = True - for canvas in itertools.chain(self.canvases, slices): - context.view_layer.objects.active = canvas - + for canvas in itertools.chain(canvases, slices): # Apply Modifiers - if prefs.apply_order == 'ALL': - modifiers = [mod for mod in canvas.modifiers] - elif prefs.apply_order == 'BEFORE': - modifiers = list_pre_boolean_modifiers(canvas) - elif prefs.apply_order == 'BOOLEANS': - modifiers = [mod for mod in canvas.modifiers if mod.type == 'BOOLEAN' and "boolean_" in mod.name] - + modifiers = get_modifiers_to_apply(context, canvas) apply_modifiers(context, canvas, modifiers) - # remove_boolean_properties + # Remove Boolean Properties canvas.booleans.canvas = False canvas.booleans.slice = False + canvas.booleans.slice_of = None + # Handle Unused Cutters + handle_unused_cutters(context, list(cutters), canvases, delete=self.delete_cutters) - # Purge Orphaned Cutters - unused_cutters, leftovers = list_unused_cutters(cutters, self.canvases, slices, do_leftovers=True) - - purged_cutters = [] - for cutter in unused_cutters: - if cutter not in purged_cutters: - # Transfer Children - for child in cutter.children: - change_parent(child, cutter.parent) - - # Purge - delete_cutter(cutter) - purged_cutters.append(cutter) - - # purge_empty_collection - if prefs.use_collection: - delete_empty_collection() - - - # Change Leftover Cutter Parent - if prefs.parent: - for cutter in leftovers: - if cutter.parent in self.canvases: - other_canvases = list_cutter_users([cutter]) - change_parent(cutter, other_canvases[0]) + # Purge Empty Collection + delete_empty_collection(context) return {'FINISHED'} @@ -228,11 +197,11 @@ class OBJECT_OT_boolean_apply_all(bpy.types.Operator): addon_keymaps = [] -classes = [ +classes = ( OBJECT_OT_boolean_toggle_all, OBJECT_OT_boolean_remove_all, OBJECT_OT_boolean_apply_all, -] +) def register(): diff --git a/extensions/blender_org/bool_tool/operators/cutter.py b/extensions/blender_org/bool_tool/operators/cutter.py index d411d1c..30a8d5a 100644 --- a/extensions/blender_org/bool_tool/operators/cutter.py +++ b/extensions/blender_org/bool_tool/operators/cutter.py @@ -1,27 +1,35 @@ import bpy +import itertools from .. import __package__ as base_package -from ..functions.poll import ( - basic_poll, - is_instanced_data, - destructive_op_confirmation, +from ..functions.canvas import ( + list_canvas_cutters, + list_canvas_slices, +) +from ..functions.cutter import ( + list_selected_cutters, + list_cutter_users, + restore_cutter, + handle_unused_cutters, ) from ..functions.modifier import ( apply_modifiers, + is_boolean_modifier, ) from ..functions.object import ( - object_visibility_set, - delete_empty_collection, - delete_cutter, change_parent, + delete_object, ) -from ..functions.list import ( - list_canvases, - list_selected_cutters, - list_canvas_cutters, - list_canvas_slices, - list_cutter_users, - list_unused_cutters, +from ..functions.poll import ( + basic_poll, + destructive_op_confirmation, + _guess_toggle_state, +) +from ..functions.scene import ( + delete_empty_collection, +) +from ..ui.common import ( + preserve_list_index, ) @@ -31,13 +39,19 @@ from ..functions.list import ( class OBJECT_OT_boolean_toggle_cutter(bpy.types.Operator): bl_idname = "object.boolean_toggle_cutter" bl_label = "Toggle Boolean Cutter" - bl_description = "Toggle this boolean cutter. If cutter is the active object it will be toggled for every canvas that uses it" bl_options = {'UNDO'} + @classmethod + def description(cls, context, properties): + if properties.specified_cutter: + return ("Toggle selected cutter and its effect") + else: + return ("Toggle all selected cutters and their effects") + method: bpy.props.EnumProperty( name = "Method", - items = (('ALL', "All", "Remove cutter from all canvases that use it"), - ('SPECIFIED', "Specified", "Remove cutter from specified canvas")), + items = (('ALL', "All", "Toggle all selected cutters"), + ('SPECIFIED', "Specified", "Toggle selected cutter")), default = 'ALL', ) @@ -45,57 +59,71 @@ class OBJECT_OT_boolean_toggle_cutter(bpy.types.Operator): ) specified_canvas: bpy.props.StringProperty( ) + specified_modifier: bpy.props.StringProperty( + ) @classmethod def poll(cls, context): - return basic_poll(cls, context, check_linked=True) + return basic_poll(cls, context, check_active=False) def execute(self, context): + # Create lists of cutters & canvases. if self.method == 'SPECIFIED': - canvases = [context.scene.objects[self.specified_canvas]] - cutters = [context.scene.objects[self.specified_cutter]] - slices = list_canvas_slices(canvases) + cutters: list = [context.scene.objects[self.specified_cutter]] + canvases: list = [context.scene.objects[self.specified_canvas]] + modifiers: list = [canvases[0].modifiers.get(self.specified_modifier)] + slices: list = list_canvas_slices(context, canvases) elif self.method == 'ALL': - cutters = list_selected_cutters(context) - canvases = list_cutter_users(cutters) + cutters: list = list_selected_cutters(context) + canvases: dict = list_cutter_users(cutters) + modifiers: list = list(itertools.chain.from_iterable(canvases.values())) - if cutters: - for canvas in canvases: - # toggle_slices_visibility (for_all_canvases) - if canvas.booleans.slice == True: - if any(modifier.object in cutters for modifier in canvas.modifiers): - canvas.hide_viewport = not canvas.hide_viewport - canvas.hide_render = not canvas.hide_render - - # Toggle Modifiers - for mod in canvas.modifiers: - if mod.type == 'BOOLEAN' and mod.object in cutters: - mod.show_viewport = not mod.show_viewport - mod.show_render = not mod.show_render - - - if self.method == 'SPECIFIED': - # toggle_slices_visibility (for_specified_canvas) - for slice in slices: - for mod in slice.modifiers: - if mod.type == 'BOOLEAN' and mod.object in cutters: - slice.hide_viewport = not slice.hide_viewport - slice.hide_render = not slice.hide_render - mod.show_viewport = not mod.show_viewport - mod.show_render = not mod.show_render - - # hide_cutter_if_not_used_by_any_visible_modifiers - other_canvases = list_canvases() - for obj in other_canvases: - if obj not in canvases + slices: - if any(mod.object in cutters and mod.show_viewport for mod in obj.modifiers if mod.type == 'BOOLEAN'): - cutters[:] = [cutter for cutter in cutters if cutter not in [mod.object for mod in obj.modifiers]] - - for cutter in cutters: - cutter.hide_viewport = not cutter.hide_viewport - - else: + if len(cutters) == 0: self.report({'INFO'}, "Boolean cutters are not selected") + return {'CANCELLED'} + + if not canvases: + return {'CANCELLED'} + + state = _guess_toggle_state(modifiers) + state = True if state == "On" else False + + # Toggle Modifiers + for mod in modifiers: + mod.show_viewport = not state + mod.show_render = not state + + # Hide Slices + if self.method == 'ALL': + for canvas in canvases.keys(): + if not canvas.booleans.slice: + continue + + slice = canvas + if any(modifier.object in cutters for modifier in slice.modifiers): + slice.hide_viewport = state + slice.hide_render = state + slice.hide_set(state) + + elif self.method == 'SPECIFIED': + for slice in slices: + for mod in slice.modifiers: + if not is_boolean_modifier(mod): + continue + if mod.object in cutters: + mod.show_viewport = not state + mod.show_render = not state + + slice.hide_viewport = state + slice.hide_render = state + slice.hide_set(state) + + # Hide Unused Cutters + for cutter in cutters: + other_canvases = list_cutter_users([cutter], exclude=canvases + slices).keys() + if len(other_canvases) == 0: + cutter.hide_viewport = state + cutter.hide_set(state) return {'FINISHED'} @@ -104,9 +132,16 @@ class OBJECT_OT_boolean_toggle_cutter(bpy.types.Operator): class OBJECT_OT_boolean_remove_cutter(bpy.types.Operator): bl_idname = "object.boolean_remove_cutter" bl_label = "Remove Boolean Cutter" - bl_description = "Remove this boolean cutter. If cutter is the active object it will be removed from every canvas that uses it" bl_options = {'UNDO'} + @classmethod + def description(cls, context, properties): + if properties.specified_cutter: + return ("Remove this cutter and the Boolean modifier that uses it.\n" + "If the cutter is not used by any other canvas it will be deleted from the scene") + else: + return ("Remove selected Boolean cutters from all canvases that uses them; restore their visibility") + method: bpy.props.EnumProperty( name = "Method", items = (('ALL', "All", "Remove cutter from all canvases that use it"), @@ -118,86 +153,70 @@ class OBJECT_OT_boolean_remove_cutter(bpy.types.Operator): ) specified_canvas: bpy.props.StringProperty( ) + specified_modifier: bpy.props.StringProperty( + ) @classmethod def poll(cls, context): - return basic_poll(cls, context, check_linked=True) + return basic_poll(cls, context, check_active=False) def execute(self, context): prefs = context.preferences.addons[base_package].preferences - leftovers = [] + # Create lists of cutters & canvases. if self.method == 'SPECIFIED': - canvases = [context.scene.objects[self.specified_canvas]] - cutters = [context.scene.objects[self.specified_cutter]] - slices = list_canvas_slices(canvases) + cutters: list = [context.scene.objects[self.specified_cutter]] + canvases: dict = { + context.scene.objects[self.specified_canvas]: + [context.scene.objects[self.specified_canvas].modifiers.get(self.specified_modifier)] + } elif self.method == 'ALL': - cutters = list_selected_cutters(context) - canvases = list_cutter_users(cutters) + cutters: list = list_selected_cutters(context) + canvases: dict = list_cutter_users(cutters) - if cutters: - # Remove Modifiers - for canvas in canvases: - for mod in canvas.modifiers: - if "boolean_" in mod.name: - if mod.object in cutters: - canvas.modifiers.remove(mod) - - # remove_canvas_property_if_needed - other_cutters, __ = list_canvas_cutters([canvas]) - if len(other_cutters) == 0: - canvas.booleans.canvas = False - - # Remove Slices (for_all_method) - if canvas.booleans.slice == True: - delete_cutter(canvas) - - - if self.method == 'SPECIFIED': - # Remove Slices (for_specified_method) - for slice in slices: - for mod in slice.modifiers: - if mod.type == 'BOOLEAN' and mod.object in cutters: - delete_cutter(slice) - - cutters, leftovers = list_unused_cutters(cutters, canvases, do_leftovers=True) - - - # Restore Orphaned Cutters - for cutter in cutters: - if self.method == 'SPECIFIED' and cutter.booleans.carver: - delete_cutter(cutter) - else: - # restore_visibility - cutter.hide_render = False - cutter.display_type = 'TEXTURED' - cutter.lineart.usage = 'INHERIT' - object_visibility_set(cutter, value=True) - cutter.booleans.cutter = "" - - # remove_parent_&_collection - if prefs.parent and cutter.parent in canvases: - change_parent(cutter, None) - - if prefs.use_collection: - cutters_collection = bpy.data.collections.get(prefs.collection_name) - if cutters_collection in cutter.users_collection: - bpy.data.collections.get(prefs.collection_name).objects.unlink(cutter) - - # purge_empty_collection - if prefs.use_collection: - delete_empty_collection() - - - # Change Leftover Cutter Parent - if prefs.parent and leftovers != None: - for cutter in leftovers: - if cutter.parent in canvases: - other_canvases = list_cutter_users([cutter]) - change_parent(cutter, other_canvases[0]) - - else: + if len(cutters) == 0: self.report({'INFO'}, "Boolean cutters are not selected") + return {'CANCELLED'} + + if not canvases: + return {'CANCELLED'} + + # Remove Slices + slices = list_canvas_slices(context, canvases.keys()) + for slice in slices: + for mod in slice.modifiers: + if not is_boolean_modifier(mod): + continue + if mod.object in cutters: + if slice in canvases: + del canvases[slice] + delete_object(slice) + continue + + # Remove Modifiers + for canvas, modifiers in canvases.items(): + for mod in modifiers: + with preserve_list_index(canvas.booleans, "modifiers_list_index"): + canvas.modifiers.remove(mod) + + # Unset canvas property if it's no longer needed. + other_cutters, __ = list_canvas_cutters([canvas]) + if len(other_cutters) == 0: + canvas.booleans.canvas = False + + # Handle Unused Cutters + if self.method == 'SPECIFIED': + handle_unused_cutters(context, cutters, list(canvases.keys()), delete=True) + + elif self.method == 'ALL': + for cutter in cutters: + # Restore unused cutters, even if they don't have other users. + restore_cutter(context, cutter, + unparent=prefs.parent and cutter.parent in canvases, + unlink_collection=prefs.use_collection) + + # Purge Empty Collection + delete_empty_collection(context) return {'FINISHED'} @@ -206,104 +225,100 @@ class OBJECT_OT_boolean_remove_cutter(bpy.types.Operator): class OBJECT_OT_boolean_apply_cutter(bpy.types.Operator): bl_idname = "object.boolean_apply_cutter" bl_label = "Apply Boolean Cutter" - bl_description = "Apply this boolean cutter. If cutter is the active object it will be applied to every canvas that uses it" - bl_options = {'UNDO'} + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def description(cls, context, properties): + if properties.specified_cutter: + return ("Apply the modifier using this Boolean cutter") + else: + return ("Apply this Boolean cutter to every canvas object that uses it") method: bpy.props.EnumProperty( name = "Method", - items = (('ALL', "All", "Remove cutter from all canvases that use it"), - ('SPECIFIED', "Specified", "Remove cutter from specified canvas")), + items = (('ALL', "All", "Apply all selected cutter to all canvases that use them"), + ('SPECIFIED', "Specified", "Apply selected cutter to a specified canvas")), + options = {'SKIP_SAVE', 'HIDDEN'}, default = 'ALL', ) - specified_cutter: bpy.props.StringProperty( + options = {'SKIP_SAVE', 'HIDDEN'}, ) specified_canvas: bpy.props.StringProperty( + options = {'SKIP_SAVE', 'HIDDEN'}, + ) + + delete: bpy.props.BoolProperty( + name = "Delete Unused Cutter", + description = "Completely remove the cutter object if it's not used by any other canvas", + default = True, ) @classmethod def poll(cls, context): - return basic_poll(cls, context, check_linked=True) - + return basic_poll(cls, context, check_active=False) def invoke(self, context, event): # Filter Objects if self.method == 'SPECIFIED': - self.cutters = [context.scene.objects[self.specified_cutter]] - self.canvases = [context.scene.objects[self.specified_canvas]] - self.slices = list_canvas_slices(self.canvases) - + canvases = [context.scene.objects[self.specified_canvas]] elif self.method == 'ALL': - self.cutters = list_selected_cutters(context) - self.canvases = list_cutter_users(self.cutters) - - return destructive_op_confirmation(self, context, event, self.canvases, title="Apply Boolean Cutter") + cutters = list_selected_cutters(context) + canvases = list_cutter_users(cutters).keys() + return destructive_op_confirmation(self, context, event, canvases, title="Apply Boolean Cutter") def execute(self, context): prefs = bpy.context.preferences.addons[base_package].preferences - leftovers = [] - if self.cutters: - # Select all faces of the cutter so that newly created faces in canvas - # are also selected after applying the modifier. - for cutter in self.cutters: - for face in cutter.data.polygons: - face.select = True + # Create lists of cutters & canvases. + if self.method == 'SPECIFIED': + cutters = [context.scene.objects[self.specified_cutter]] + canvases = [context.scene.objects[self.specified_canvas]] + slices = list_canvas_slices(context, canvases) + elif self.method == 'ALL': + cutters = list_selected_cutters(context) + canvases = list_cutter_users(cutters).keys() + slices = [] - # Apply Modifiers - for canvas in self.canvases: - context.view_layer.objects.active = canvas + if len(cutters) == 0: + self.report({'INFO'}, "Boolean cutters are not selected") + return {'CANCELLED'} - boolean_mods = [] - for mod in canvas.modifiers: - if "boolean_" in mod.name: - if mod.object in self.cutters: - boolean_mods.append(mod) - apply_modifiers(context, canvas, boolean_mods) + if not canvases: + return {'CANCELLED'} - # remove_canvas_property_if_needed + # Select all faces of the cutter so that newly created faces in canvas + # are also selected after applying the modifier. + for cutter in cutters: + for face in cutter.data.polygons: + face.select = True + + # Apply Modifiers + for canvas in itertools.chain(canvases, slices): + boolean_mods = [] + for mod in canvas.modifiers: + if not is_boolean_modifier(mod): + continue + if mod.object in cutters: + boolean_mods.append(mod) + + if boolean_mods: + with preserve_list_index(canvas.booleans, "modifiers_list_index"): + apply_modifiers(context, canvas, boolean_mods) + + # Unset canvas property if it's no longer needed. other_cutters, __ = list_canvas_cutters([canvas]) if len(other_cutters) == 0: canvas.booleans.canvas = False canvas.booleans.slice = False + canvas.booleans.slice_of = None + # Handle Unused Cutters + handle_unused_cutters(context, cutters, canvases, delete=self.delete) - if self.method == 'SPECIFIED': - # Apply Modifier for Slices (for_specified_method) - for slice in self.slices: - boolean_mods = [] - for mod in slice.modifiers: - if mod.type == 'BOOLEAN' and mod.object in self.cutters: - boolean_mods.append(mod) - apply_modifiers(context, slice, boolean_mods) - - - unused_cutters, leftovers = list_unused_cutters(self.cutters, self.canvases, do_leftovers=True) - - - for cutter in unused_cutters: - # Transfer Children - for child in cutter.children: - change_parent(child, cutter.parent) - - # Purge Orphaned Cutters - delete_cutter(cutter) - - # purge_empty_collection - if prefs.use_collection: - delete_empty_collection() - - - # Change Leftover Cutter Parent - if prefs.parent and leftovers != None: - for cutter in leftovers: - if cutter.parent in self.canvases: - other_canvases = list_cutter_users([cutter]) - change_parent(cutter, other_canvases[0]) - - else: - self.report({'INFO'}, "Boolean cutters are not selected") + # Purge Empty Collection + delete_empty_collection(context) return {'FINISHED'} @@ -313,11 +328,11 @@ class OBJECT_OT_boolean_apply_cutter(bpy.types.Operator): addon_keymaps = [] -classes = [ +classes = ( OBJECT_OT_boolean_toggle_cutter, OBJECT_OT_boolean_remove_cutter, OBJECT_OT_boolean_apply_cutter, -] +) def register(): diff --git a/extensions/blender_org/bool_tool/operators/select.py b/extensions/blender_org/bool_tool/operators/select.py index 2285e47..1fa5e0e 100644 --- a/extensions/blender_org/bool_tool/operators/select.py +++ b/extensions/blender_org/bool_tool/operators/select.py @@ -1,17 +1,17 @@ import bpy -from .. import __package__ as base_package -from ..functions.poll import ( - basic_poll, - active_modifier_poll, +from ..functions.canvas import ( is_canvas, -) -from ..functions.list import ( - list_selected_cutters, list_selected_canvases, list_canvas_cutters, +) +from ..functions.cutter import ( + list_selected_cutters, list_cutter_users, ) +from ..functions.poll import ( + basic_poll, +) #### ------------------------------ OPERATORS ------------------------------ #### @@ -20,21 +20,24 @@ from ..functions.list import ( class OBJECT_OT_select_cutter_canvas(bpy.types.Operator): bl_idname = "object.select_cutter_canvas" bl_label = "Select Boolean Canvas" - bl_description = "Select all the objects that use selected objects as boolean cutters" + bl_description = "Select all canvases that use selected objects as Boolean cutters" bl_options = {'UNDO'} @classmethod def poll(cls, context): - return basic_poll(cls, context) and context.active_object.booleans.cutter + return basic_poll(cls, context, check_active=True) and context.active_object.booleans.cutter def execute(self, context): cutters = list_selected_cutters(context) - canvases = list_cutter_users(cutters) + canvases = list_cutter_users(cutters).keys() - # Select Canvases - bpy.ops.object.select_all(action='DESELECT') + for obj in context.scene.objects: + obj.select_set(False) + + # Select canvases. for canvas in canvases: - canvas.select_set(True) + if not canvas.booleans.slice: + canvas.select_set(True) return {'FINISHED'} @@ -43,19 +46,21 @@ class OBJECT_OT_select_cutter_canvas(bpy.types.Operator): class OBJECT_OT_boolean_select_all(bpy.types.Operator): bl_idname = "object.boolean_select_all" bl_label = "Select Boolean Cutters" - bl_description = "Select all boolean cutters affecting active object" + bl_description = "Select all Boolean cutters affecting selected canvases" bl_options = {'UNDO'} @classmethod def poll(cls, context): - return basic_poll(cls, context) and is_canvas(context.active_object) + return basic_poll(cls, context, check_active=True) and is_canvas(context.active_object) def execute(self, context): canvases = list_selected_canvases(context) cutters, __ = list_canvas_cutters(canvases) - # select_cutters - bpy.ops.object.select_all(action='DESELECT') + for obj in context.scene.objects: + obj.select_set(False) + + # Select cutters. for cutter in cutters: cutter.select_set(True) @@ -66,24 +71,24 @@ class OBJECT_OT_boolean_select_all(bpy.types.Operator): class OBJECT_OT_boolean_select_cutter(bpy.types.Operator): bl_idname = "object.boolean_select_cutter" bl_label = "Select Boolean Cutter" - bl_description = "Select object that is used as boolean cutter by this modifier" - bl_options = {'REGISTER', 'UNDO'} + bl_options = {'UNDO'} - @classmethod - def poll(cls, context): - prefs = context.preferences.addons[base_package].preferences - return (basic_poll(cls, context) and active_modifier_poll(context.active_object) and - context.area.type == 'PROPERTIES' and context.space_data.context == 'MODIFIER' and - prefs.double_click) + cutter: bpy.props.StringProperty() + extend: bpy.props.BoolProperty() + + def invoke(self, context, event): + self.extend = event.shift + return self.execute(context) def execute(self, context): - modifier = context.object.modifiers.active - if modifier and modifier.type == "BOOLEAN": - cutter = modifier.object + cutter = bpy.data.objects.get(self.cutter) - bpy.ops.object.select_all(action='DESELECT') + if not self.extend: + for obj in context.scene.objects: + obj.select_set(False) + + if cutter: cutter.select_set(True) - context.view_layer.objects.active = cutter return {'FINISHED'} @@ -93,31 +98,16 @@ class OBJECT_OT_boolean_select_cutter(bpy.types.Operator): addon_keymaps = [] -classes = [ +classes = ( OBJECT_OT_select_cutter_canvas, OBJECT_OT_boolean_select_all, OBJECT_OT_boolean_select_cutter, -] - +) def register(): for cls in classes: bpy.utils.register_class(cls) - # KEYMAP - addon = bpy.context.window_manager.keyconfigs.addon - km = addon.keymaps.new(name="Property Editor", space_type='PROPERTIES') - - kmi = km.keymap_items.new("object.boolean_select_cutter", type='LEFTMOUSE', value='DOUBLE_CLICK') - kmi.active = True - addon_keymaps.append((km, kmi)) - - def unregister(): for cls in reversed(classes): bpy.utils.unregister_class(cls) - - # KEYMAP - for km, kmi in addon_keymaps: - km.keymap_items.remove(kmi) - addon_keymaps.clear() diff --git a/extensions/blender_org/bool_tool/preferences.py b/extensions/blender_org/bool_tool/preferences.py index 627b61b..3fb0c2a 100644 --- a/extensions/blender_org/bool_tool/preferences.py +++ b/extensions/blender_org/bool_tool/preferences.py @@ -8,9 +8,9 @@ def update_sidebar_category(self, context): """Change sidebar category of add-ons panel.""" panel_classes = [ - ui.VIEW3D_PT_boolean, - ui.VIEW3D_PT_boolean_properties, - ui.VIEW3D_PT_boolean_cutters, + ui.panels.VIEW3D_PT_boolean, + ui.panels.VIEW3D_PT_boolean_helpers, + ui.panels.VIEW3D_PT_boolean_cutters, ] for cls in panel_classes: @@ -29,14 +29,22 @@ class BoolToolPreferences(bpy.types.AddonPreferences): bl_idname = __package__ # UI + category: bpy.props.EnumProperty( + name = "Category", + items = (('ADDON', "Add-on", "General add-on features"), + ('SHARED', "Shared", "Features shared by all of add-ons operators and tools"), + ('OPERATORS', "Boolean Operators", "Features for brush and auto Boolean operators")), + default = 'OPERATORS' + ) + show_in_sidebar: bpy.props.BoolProperty( - name = "Show Addon Panel in Sidebar", + name = "Show Add-on Panel in Sidebar", description = "Add a sidebar panel in 3D Viewport with add-ons operators and properties", default = True, ) sidebar_category: bpy.props.StringProperty( name = "Category Name", - description = "Sidebar category name. Using the name of the existing category will add panel there", + description = "Sidebar category name. Using the name of the existing category will add the panel there", default = "Edit", update = update_sidebar_category, ) @@ -44,87 +52,67 @@ class BoolToolPreferences(bpy.types.AddonPreferences): # Defaults solver: bpy.props.EnumProperty( name = "Boolean Solver", - description = "Which solver to use for automatic and brush booleans", + description = "Which solver to use for automatic and brush Boolean operators", items = [('FLOAT', "Float", ""), ('EXACT', "Exact", ""), ('MANIFOLD', "Manifold", "")], default = 'FLOAT', ) - wireframe: bpy.props.BoolProperty( - name = "Display Cutters as Wireframe", - description = ("When enabled cutters will be displayed as wireframes, instead of bounding boxes.\n" - "It's better for visualizating the shape, but might be harder to see and have performance cost"), - default = False, + display: bpy.props.EnumProperty( + name = "Cutter Display", + items = (('WIRE', "Wire", "Display the cutter object as a wireframe"), + ('BOUNDS', "Bounds", "Display only the bounds of the cutter object")), + default = 'BOUNDS' ) show_in_editmode: bpy.props.BoolProperty( name = "Enable 'Show in Edit Mode' by Default", - description = "Every new boolean modifier created with brush boolean wil have 'Show in Edit Mode' enabled by default", + description = "Added Boolean modifiers will have 'Show in Edit Mode' enabled by default", default = True, ) # Advanced use_collection: bpy.props.BoolProperty( name = "Put Cutters in Collection", - description = ("Brush boolean operators will put all cutters in same collection, and create one if it doesn't exist.\n" - "Useful for scene management, and quickly selecting and removing all clutter when needed"), + description = ("Put all cutters in the same collection, and create one if it doesn't exist"), default = True, ) collection_name: bpy.props.StringProperty( name = "Collection Name", + description = "Name of the collection where cutters will be added", default = "boolean_cutters", ) parent: bpy.props.BoolProperty( name = "Parent Cutters to Object", - description = ("Cutters will be parented to first canvas they're applied to. Works best when one cutter is used one canvas.\n" - "NOTE: This doesn't affect Carver tool, which has its own property for this"), + description = ("Cutters will be parented to first canvas they're applied to"), default = True, ) apply_order: bpy.props.EnumProperty( - name = "When Applying Cutters...", - description = ("What happens when boolean cutters are applied on object.\n" - "Either when performing auto-boolean, using 'Apply All Cutters' operator.\n" - "NOTE: This doesn't apply to Carver tool on 'Destructive' mode; or when applying individual cutters"), - items = (('ALL', "Apply All Modifiers", "All modifiers on object will be applied (this includes shape keys as well)"), - ('BEFORE', "Apply Booleans & Everything Before", "Alongside boolean modifiers all modifiers will be applied that come before the last boolean"), - ('BOOLEANS', "Only Apply Booleans", "Only apply boolean modifiers. This method will fail if object has shape keys")), + name = "Apply Modifiers", + description = ("Which modifiers to apply when using add-ons destructive operators.\n" + "NOTE: This option is not used when applying individual cutters"), + items = (('ALL', "All", + "All modifiers on object (and shape keys) will be applied during destructive operators"), + ('BEFORE', "Booleans & Everything Before", + "Apply all modifiers that come before the last Boolean modifier in the stack"), + ('BOOLEANS', "Booleans", + "Only apply Boolean modifiers")), default = 'ALL', ) pin: bpy.props.BoolProperty( name = "Pin Boolean Modifiers", - description = ("When enabled boolean modifiers will be placed above every other modifier on the object (if there are any).\n" - "Order of modifiers can drastically affect the result (especially when performing auto boolean).\n" - "NOTE: This doesn't affect Carver tool, which has its own property for this"), + description = ("Always make new Boolean modifiers first in the modifier stack.\n" + "NOTE: Order of modifiers can drastically affect the final result"), default = False, ) # Features fast_modifier_apply: bpy.props.BoolProperty( name = "Faster Destructive Booleans", - description = ("Experimental method of applying modifiers that results in 30-50% faster destructive booleans.\n" - "Performance improvements also affect the add-ons operators that apply cutters.\n" + description = ("Experimental method of applying modifiers that results in 30-50% faster destructive Booleans.\n" "However, changing modifier properties in the redo panel (like material transfer)\n" "is not available for this method yet."), default = False, ) - double_click: bpy.props.BoolProperty( - name = "Double-click Select", - description = ("Select boolean cutters by dbl-clicking on the boolean modifier.\n" - "This feature works in entire modifier properties area, not just on boolean modifier header,\n" - "therefore can result in lot of misclicks and unintended selections."), - default = False, - ) - - # Debug - versioning: bpy.props.BoolProperty( - name = "Versioning", - description = ("Because of the drastic changes in add-on data, it's necessary to do versioning when loading old files\n" - "where Bool Tool cutters(brushes) are not applied. If you don't have files like that, you can ignore this") - ) - experimental: bpy.props.BoolProperty( - name = "Experimental", - description = "Enable experimental features", - default = False, - ) def draw(self, context): layout = self.layout @@ -132,55 +120,57 @@ class BoolToolPreferences(bpy.types.AddonPreferences): layout.use_property_decorate = False # UI - col = layout.column(align=True, heading="Show in Sidebar") - row = col.row(align=True) - sub = row.row(align=True) - sub.prop(self, "show_in_sidebar", text="") - sub = sub.row(align=True) - sub.active = self.show_in_sidebar - sub.prop(self, "sidebar_category", text="") - - # Defaults + row = layout.row() + row.prop(self, "category", expand=True) layout.separator() - col = layout.column(align=True) - row = col.row(align=True) - row.prop(self, "solver", text="Solver", expand=True) - col.prop(self, "wireframe") - col.prop(self, "show_in_editmode") - # Advanced - layout.separator() - col = layout.column(align=True, heading="Put Cutters in Collection") - row = col.row(align=True) - sub = row.row(align=True) - sub.prop(self, "use_collection", text="") - sub = sub.row(align=True) - sub.active = self.show_in_sidebar - sub.prop(self, "collection_name", text="") + # Add-on Properties + if self.category == 'ADDON': + col = layout.column(align=True, heading="Show in Sidebar") + row = col.row(align=True) + sub = row.row(align=True) + sub.prop(self, "show_in_sidebar", text="") + sub = sub.row(align=True) + sub.active = self.show_in_sidebar + sub.prop(self, "sidebar_category", text="") - col.prop(self, "parent") - col.prop(self, "apply_order") - col.prop(self, "pin") + col.separator() + col = layout.column(align=True, heading="Features") + col.prop(self, "fast_modifier_apply") - # Features - layout.separator() - col = layout.column(align=True, heading="Features") - col.prop(self, "fast_modifier_apply") - col.prop(self, "double_click") + # Shared Properties + if self.category == 'SHARED': + col = layout.column() + col.prop(self, "show_in_editmode") + col.prop(self, "apply_order") - # Experimentals - layout.separator() - col = layout.column(align=True) - col.prop(self, "versioning", text="⚠ Versioning") - col.prop(self, "experimental", text="⚠ Experimental") + # Boolean Operator Properties + if self.category == 'OPERATORS': + col = layout.column(align=True, heading="Put Cutters in Collection") + row = col.row(align=True) + sub = row.row(align=True) + sub.prop(self, "use_collection", text="") + sub = sub.row(align=True) + sub.active = self.show_in_sidebar + sub.prop(self, "collection_name", text="", placeholder="boolean_cutters") + + col = layout.column() + row = col.row(align=True) + row.prop(self, "solver", text="Solver", expand=True) + row = col.row(align=True) + row.prop(self, "display", expand=True) + + col = layout.column() + col.prop(self, "parent") + col.prop(self, "pin") #### ------------------------------ REGISTRATION ------------------------------ #### -classes = [ +classes = ( BoolToolPreferences, -] +) def register(): for cls in classes: diff --git a/extensions/blender_org/bool_tool/properties.py b/extensions/blender_org/bool_tool/properties.py index e2b3d55..64f9f07 100644 --- a/extensions/blender_org/bool_tool/properties.py +++ b/extensions/blender_org/bool_tool/properties.py @@ -32,13 +32,15 @@ class OBJECT_PG_booleans(bpy.types.PropertyGroup): default = False, ) + modifiers_list_index: bpy.props.IntProperty() + #### ------------------------------ REGISTRATION ------------------------------ #### -classes = [ +classes = ( OBJECT_PG_booleans, -] +) def register(): for cls in classes: diff --git a/extensions/blender_org/bool_tool/tools/__init__.py b/extensions/blender_org/bool_tool/tools/__init__.py index 1d488cf..b288a4f 100644 --- a/extensions/blender_org/bool_tool/tools/__init__.py +++ b/extensions/blender_org/bool_tool/tools/__init__.py @@ -21,12 +21,12 @@ else: #### ------------------------------ REGISTRATION ------------------------------ #### """NOTE: Order of modules is important because of dependancies. Don't change without a reason.""" -modules = [ +modules = ( carver_circle, carver_box, carver_polyline, ui, -] +) main_tools = [ carver_box.OBJECT_WT_carve_box, diff --git a/extensions/blender_org/bool_tool/tools/carver_box.py b/extensions/blender_org/bool_tool/tools/carver_box.py index ce43dbd..857d7bf 100644 --- a/extensions/blender_org/bool_tool/tools/carver_box.py +++ b/extensions/blender_org/bool_tool/tools/carver_box.py @@ -1,13 +1,18 @@ import bpy import os from mathutils import Vector -from .. import __file__ as base_file + +from ..constants import ( + ICONS_PATH, +) +from ..functions.view import ( + redraw_regions, +) from .common.base import ( CarverBase, ) from .common.properties import ( - CarverPropsArray, CarverPropsBevel, ) from .common.types import ( @@ -34,7 +39,7 @@ class OBJECT_WT_carve_box(bpy.types.WorkSpaceTool): bl_space_type = 'VIEW_3D' bl_context_mode = 'OBJECT' - bl_icon = os.path.join(os.path.dirname(base_file), "icons", "tool_icons", "ops.object.carver_box") + bl_icon = os.path.join(ICONS_PATH, "dat", "ops.object.carver_box") bl_keymap = ( ("object.carve_box", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, {"properties": None}), ("object.carve_box", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, {"properties": None}), @@ -58,9 +63,7 @@ class MESH_WT_carve_box(OBJECT_WT_carve_box): #### ------------------------------ OPERATORS ------------------------------ #### -class OBJECT_OT_carve_box(CarverBase, - CarverPropsArray, - CarverPropsBevel): +class OBJECT_OT_carve_box(CarverBase, CarverPropsBevel): bl_idname = "object.carve_box" bl_label = "Box Carve" bl_description = description @@ -70,6 +73,7 @@ class OBJECT_OT_carve_box(CarverBase, # SHAPE-properties shape = 'BOX' + # NOTE: There are registered on operator level because they need to be overriden or hidden per-tool. aspect: bpy.props.EnumProperty( name = "Aspect", description = "The initial aspect", @@ -115,8 +119,8 @@ class OBJECT_OT_carve_box(CarverBase, # cached_variables """Important for storing context as it was when operator was invoked (untouched by the modal).""" self.phase = "DRAW" - self.initial_origin = self.origin # Initial shape origin. - self.initial_aspect = self.aspect # Initial shape aspect. + self._initial_origin = self.origin # Initial shape origin. + self._initial_aspect = self.aspect # Initial shape aspect. self._stored_phase = "DRAW" # Add Draw Handler @@ -130,12 +134,11 @@ class OBJECT_OT_carve_box(CarverBase, def modal(self, context, event): + redraw_regions(context) + # Status Bar Text self.status(context) - # find_the_limit_of_the_3d_viewport_region - self.redraw_region(context) - # Modifier Keys self.event_aspect(context, event) self.event_origin(context, event) @@ -151,7 +154,6 @@ class OBJECT_OT_carve_box(CarverBase, if self.phase != "BEVEL": return {'PASS_THROUGH'} - # Mouse Move if event.type == 'MOUSEMOVE': self.mouse.current = Vector((event.mouse_region_x, event.mouse_region_y)) @@ -164,7 +166,6 @@ class OBJECT_OT_carve_box(CarverBase, elif self.phase == "EXTRUDE": self.set_extrusion_depth(context) - # Confirm elif event.type == 'LEFTMOUSE': # Confirm Shape @@ -178,7 +179,7 @@ class OBJECT_OT_carve_box(CarverBase, min_distance = 5 if delta_x < min_distance or delta_y < min_distance: - self.finalize(context, clean_up=True, abort=True) + self.finalize(context, abort=True) return {'FINISHED'} self.extrude_cutter(context) @@ -188,18 +189,15 @@ class OBJECT_OT_carve_box(CarverBase, if self.depth != 'MANUAL': self.confirm(context) return {'FINISHED'} - else: - return {'RUNNING_MODAL'} # Confirm Depth if self.phase == "EXTRUDE" and event.value == 'PRESS': self.confirm(context) return {'FINISHED'} - # Cancel elif event.type in {'RIGHTMOUSE', 'ESC'}: - self.finalize(context, clean_up=True, abort=True) + self.finalize(context, abort=True) return {'FINISHED'} return {'RUNNING_MODAL'} @@ -305,9 +303,9 @@ class OBJECT_OT_carve_box(CarverBase, #### ------------------------------ REGISTRATION ------------------------------ #### -classes = [ +classes = ( OBJECT_OT_carve_box, -] +) def register(): for cls in classes: diff --git a/extensions/blender_org/bool_tool/tools/carver_circle.py b/extensions/blender_org/bool_tool/tools/carver_circle.py index 0f55b76..a44eb5b 100644 --- a/extensions/blender_org/bool_tool/tools/carver_circle.py +++ b/extensions/blender_org/bool_tool/tools/carver_circle.py @@ -1,6 +1,9 @@ import bpy import os -from .. import __file__ as base_file + +from ..constants import ( + ICONS_PATH, +) from .common.ui import ( carver_ui_common, @@ -20,7 +23,7 @@ class OBJECT_WT_carve_circle(bpy.types.WorkSpaceTool): bl_space_type = 'VIEW_3D' bl_context_mode = 'OBJECT' - bl_icon = os.path.join(os.path.dirname(base_file), "icons", "tool_icons", "ops.object.carver_circle") + bl_icon = os.path.join(ICONS_PATH, "dat", "ops.object.carver_circle") bl_keymap = ( ("object.carve_circle", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, {"properties": None}), ("object.carve_circle", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "shift": True}, {"properties": None}), @@ -51,6 +54,7 @@ class OBJECT_OT_carve_circle(OBJECT_OT_carve_box): # SHAPE-properties shape = 'CIRCLE' + # NOTE: There are registered on operator level because they need to be overriden or hidden per-tool. subdivision: bpy.props.IntProperty( name = "Circle Subdivisions", description = "Number of vertices that will make up the circular shape that will be extruded into a cylinder", @@ -76,9 +80,9 @@ class OBJECT_OT_carve_circle(OBJECT_OT_carve_box): #### ------------------------------ REGISTRATION ------------------------------ #### -classes = [ +classes = ( OBJECT_OT_carve_circle, -] +) def register(): for cls in classes: diff --git a/extensions/blender_org/bool_tool/tools/carver_polyline.py b/extensions/blender_org/bool_tool/tools/carver_polyline.py index 979302b..e2e8223 100644 --- a/extensions/blender_org/bool_tool/tools/carver_polyline.py +++ b/extensions/blender_org/bool_tool/tools/carver_polyline.py @@ -1,16 +1,18 @@ import bpy -import math import os from mathutils import Vector from bpy_extras import view3d_utils -from .. import __file__ as base_file + +from ..constants import ( + ICONS_PATH, +) +from ..functions.view import ( + redraw_regions, +) from .common.base import ( CarverBase, ) -from .common.properties import ( - CarverPropsArray, -) from .common.types import ( Selection, Mouse, @@ -35,7 +37,7 @@ class OBJECT_WT_carve_polyline(bpy.types.WorkSpaceTool): bl_space_type = 'VIEW_3D' bl_context_mode = 'OBJECT' - bl_icon = os.path.join(os.path.dirname(base_file), "icons", "tool_icons", "ops.object.carver_polyline") + bl_icon = os.path.join(ICONS_PATH, "dat", "ops.object.carver_polyline") bl_keymap = ( ("object.carve_polyline", {"type": 'LEFTMOUSE', "value": 'CLICK'}, None), ("object.carve_polyline", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, None), @@ -57,8 +59,7 @@ class MESH_WT_carve_polyline(OBJECT_WT_carve_polyline): #### ------------------------------ OPERATORS ------------------------------ #### -class OBJECT_OT_carve_polyline(CarverBase, - CarverPropsArray): +class OBJECT_OT_carve_polyline(CarverBase): bl_idname = "object.carve_polyline" bl_label = "Polyline Carve" bl_description = description @@ -108,12 +109,11 @@ class OBJECT_OT_carve_polyline(CarverBase, def modal(self, context, event): + redraw_regions(context) + # Status Bar Text self.status(context) - # find_the_limit_of_the_3d_viewport_region - self.redraw_region(context) - # Modifier Keys self.event_array(context, event) self.event_move(context, event) @@ -124,7 +124,6 @@ class OBJECT_OT_carve_polyline(CarverBase, if self.phase != "BEVEL": return {'PASS_THROUGH'} - # Mouse Move if event.type == 'MOUSEMOVE': self.mouse.current = Vector((event.mouse_region_x, event.mouse_region_y)) @@ -146,12 +145,15 @@ class OBJECT_OT_carve_polyline(CarverBase, elif self.phase == "EXTRUDE": self.set_extrusion_depth(context) - # Add Points & Confirm elif event.type == 'LEFTMOUSE' and event.value == 'PRESS': if self.phase == "DRAW": - # Confirm Shape (if clicked on the first vert) - if self._distance_from_first > 75: + # Add Point + if self._distance_from_first < 75: + self._insert_polyline_point() + + # Confirm Shape (if clicked near the first vert). + else: verts = self.cutter.verts if len(verts) > 3: self._remove_polyline_point(context, jump_mouse=False) @@ -165,17 +167,12 @@ class OBJECT_OT_carve_polyline(CarverBase, else: return {'RUNNING_MODAL'} - # Add Point - else: - self._insert_polyline_point() - # Confirm Depth if self.phase == "EXTRUDE": self.confirm(context) return {'FINISHED'} - - # Confirm + # Enter (Confirm) elif event.type == 'RET': verts = self.cutter.verts if len(verts) > 2: @@ -195,18 +192,14 @@ class OBJECT_OT_carve_polyline(CarverBase, if self.phase == "EXTRUDE" and event.value == 'PRESS': self.confirm(context) return {'FINISHED'} - else: - self.report({'WARNING'}, "At least three points are required to make a polygonal shape") - # Remove Last Point if event.type == 'BACK_SPACE' and event.value == 'PRESS': self._remove_polyline_point(context) - # Cancel elif event.type in {'RIGHTMOUSE', 'ESC'}: - self.finalize(context, clean_up=True, abort=True) + self.finalize(context, abort=True) return {'FINISHED'} return {'RUNNING_MODAL'} @@ -301,7 +294,7 @@ class OBJECT_OT_carve_polyline(CarverBase, context.workspace.status_text_set(modal_keys_extrude) - # Polyline-specific features. + # Polyline-specific methods. def _insert_polyline_point(self): """Inserts a new vertex in the cutter geometry and connects it to the previous last one.""" @@ -383,15 +376,16 @@ class OBJECT_OT_carve_polyline(CarverBase, context.region_data, vert_world) if screen_pos: - context.window.cursor_warp(int(screen_pos.x), int(screen_pos.y)) + x, y = int(screen_pos.x), int(screen_pos.y) + context.window.cursor_warp(x, y) #### ------------------------------ REGISTRATION ------------------------------ #### -classes = [ +classes = ( OBJECT_OT_carve_polyline, -] +) def register(): for cls in classes: diff --git a/extensions/blender_org/bool_tool/tools/common/base.py b/extensions/blender_org/bool_tool/tools/common/base.py index 2cfdce0..68c126f 100644 --- a/extensions/blender_org/bool_tool/tools/common/base.py +++ b/extensions/blender_org/bool_tool/tools/common/base.py @@ -1,33 +1,22 @@ import bpy import bmesh import math +import mathutils from bpy_extras import view3d_utils from mathutils import Vector, Matrix -from .types import ( - Effects, +from ...functions.cutter import ( + make_cutter, ) -from .properties import ( - CarverPropsOperator, - CarverPropsShape, - CarverPropsModifier, - CarverPropsCutter, -) - from ...functions.draw import ( draw_shader, draw_bmesh_faces, - draw_circle_around_point, -) -from ...functions.math import ( - distance_from_point_to_segment, - region_2d_to_plane_3d, - region_2d_to_line_3d, + draw_circle_billboard, ) from ...functions.mesh import ( + is_instanced_mesh, extrude_face, are_intersecting, - raycast, ) from ...functions.modifier import ( add_boolean_modifier, @@ -35,300 +24,44 @@ from ...functions.modifier import ( get_modifiers_to_apply, ) from ...functions.object import ( - set_cutter_properties, - delete_empty_collection, - delete_cutter, - set_object_origin, -) -from ...functions.poll import ( is_linked, - is_instanced_data, + set_object_origin, + delete_object, +) +from ...functions.scene import ( + delete_empty_collection, + raycast, +) +from ...functions.view import ( + distance_from_point_to_segment, + region_2d_to_ray_3d, + region_2d_to_plane_3d, +) + +from .events import ( + CarverEvents, +) +from .properties import ( + CarverPropsOperator, + CarverPropsShape, + CarverPropsModifier, + CarverPropsCutter, + CarverPropsArray, ) -#### ------------------------------ /base/ ------------------------------ #### - -class CarverEvents(): - - def _custom_modifier_event(self, context, event, modifier, - cursor='NONE', store_values=False, restore_mouse=True, - postprocess=None): - """Creates custom modifier event when key is held and hides cursor until it's released""" - - # Initialize Modifier Phase - if event.value == 'PRESS': - if self.phase in ("DRAW", "EXTRUDE"): - self._stored_phase = self.phase - self.phase = modifier - self.mouse.cached = self.mouse.current - context.window.cursor_set(cursor) - - if store_values: - # Store center of the geometry as a Vector. - verts = [v.co for v in self.cutter.bm.verts] - center = sum(verts, Vector()) / len(verts) - self.cutter.center = self.cutter.obj.matrix_world @ center - - # End Modifier Phase - elif event.value == 'RELEASE': - if self.phase == modifier: - context.window.cursor_set('MUTE') - if restore_mouse: - context.window.cursor_warp(int(self.mouse.cached[0]), int(self.mouse.cached[1]) + 100) - self.mouse.current = self.mouse.cached - self.phase = self._stored_phase - - if postprocess is not None: - postprocess(self) - - return self._stored_phase - - - # Individual Events - def event_aspect(self, context, event): - """Modifier keys for changing aspect of the shape""" - - if event.shift and self.phase == "DRAW": - if self.initial_aspect == 'FREE': - self.aspect = 'FIXED' - elif self.initial_aspect == 'FIXED': - self.aspect = 'FREE' - else: - self.aspect = self.initial_aspect - - - def event_origin(self, context, event): - """Modifier keys for changing the origin of the shape""" - - if event.alt and self.phase == "DRAW": - if self.initial_origin == 'EDGE': - self.origin = 'CENTER' - elif self.initial_origin == 'CENTER': - self.origin = 'EDGE' - else: - self.origin = self.initial_origin - - - def event_rotate(self, context, event): - """Modifier keys for rotating the shape""" - - def _remove_rotate_phase_properties(self): - del self._stored_mouse_pos_3d - del self._stored_rotation - del self._stored_cutter_center - del self._stored_cutter_euler - - # Restore origin at edge (first vertex). - if self.origin == 'EDGE': - point = self.cutter.bm.verts[0].co - set_object_origin(self.cutter.obj, self.cutter.bm, point='CUSTOM', custom=point) - - - # Set correct phase. - if event.type == 'R': - stored_phase = self._custom_modifier_event(context, event, "ROTATE", - cursor='MOVE_X', store_values=True, restore_mouse=False, - postprocess=_remove_rotate_phase_properties) - - if self.phase == "ROTATE": - region = context.region - rv3d = context.region_data - - # Project current mouse position onto the workplane. - current_mouse_pos_3d = region_2d_to_plane_3d(region, rv3d, - self.mouse.current, - (self.workplane.location, self.workplane.normal)) - if current_mouse_pos_3d is not None: - # Store values. - obj = self.cutter.obj - if not hasattr(self, '_stored_mouse_pos_3d'): - self._stored_mouse_pos_3d = current_mouse_pos_3d.copy() - self._stored_rotation = self.rotation - self._stored_cutter_center = self.cutter.center - self._stored_cutter_euler = obj.rotation_euler.copy() - - # Calculate angle and direction. - to_start = (self._stored_mouse_pos_3d - self._stored_cutter_center).normalized() - to_current = (current_mouse_pos_3d - self._stored_cutter_center).normalized() - - angle = to_start.angle(to_current) - cross = to_start.cross(to_current) - if cross.dot(self.workplane.normal) < 0: - angle = -angle - - if abs(angle) > 0.0001: - self.rotation = self._stored_rotation + angle - - # Offset the object location when drawing from edge to move rotation pivot to center. - if self.origin == 'EDGE': - set_object_origin(obj, self.cutter.bm, point='CENTER_OBJ') - - # Calculate rotation amount. - rotation_total = Matrix.Rotation(self.rotation, 4, self.workplane.normal) - rotation_stored = Matrix.Rotation(self._stored_rotation, 4, self.workplane.normal) - rotation_matrix = rotation_total @ rotation_stored.inverted() - new_rot = rotation_matrix @ self._stored_cutter_euler.to_matrix().to_4x4() - - # Rotate. - obj.rotation_euler = new_rot.to_euler() - - - def event_bevel(self, context, event): - """Modifier keys for beveling the shape""" - - def _remove_empty_bevel_modifier(self): - bevel = self.effects.bevel - if bevel.width == 0: - self.cutter.obj.modifiers.remove(bevel) - self.effects.bevel = None - - if self.effects.weld is not None: - self.cutter.obj.modifiers.remove(self.effects.weld) - self.effects.weld = None - - - if self.shape != 'BOX': - return - - # Set correct phase. - if event.type == 'B': - stored_phase = self._custom_modifier_event(context, event, "BEVEL", - cursor='PICK_AREA', store_values=True, - postprocess=_remove_empty_bevel_modifier) - - if self.phase == "BEVEL": - self.use_bevel = True - - # Initialize bevel effect if it doesn't exist. - if self.effects.bevel is None: - self.bevel_width = 0 - affect = 'VERTICES' if stored_phase == "DRAW" else 'EDGES' - self.effects.add_bevel_modifier(self, affect=affect) - - # Force the geometry to update. - if stored_phase == "DRAW": - self.update_cutter_shape(context) - elif stored_phase == "EXTRUDE": - self.set_extrusion_depth(context) - - # Calculate bevel width. - region = context.region - rv3d = context.region_data - - self.mouse.cached_3d = view3d_utils.region_2d_to_location_3d(region, rv3d, self.mouse.cached, self.cutter.center) - self.mouse.current_3d = view3d_utils.region_2d_to_location_3d(region, rv3d, self.mouse.current, self.cutter.center) - d = (self.cutter.center - self.mouse.current_3d).length - (self.cutter.center - self.mouse.cached_3d).length - self.bevel_width = d * 0.2 - - # Adjust bevel segments. - if event.type == 'WHEELUPMOUSE': - self.bevel_segments += 1 - elif event.type == 'WHEELDOWNMOUSE': - self.bevel_segments -= 1 - - # Update modifier. - self.effects.update(self, 'BEVEL') - - - def event_array(self, context, event): - """Modifier keys for creating the array of the shape""" - - # Add duplicates. - if event.type == 'LEFT_ARROW' and event.value == 'PRESS': - self.columns -= 1 - if event.type == 'RIGHT_ARROW' and event.value == 'PRESS': - self.columns += 1 - if event.type == 'DOWN_ARROW' and event.value == 'PRESS': - self.rows -= 1 - if event.type == 'UP_ARROW' and event.value == 'PRESS': - self.rows += 1 - - if event.type in ['LEFT_ARROW', - 'RIGHT_ARROW', - 'DOWN_ARROW', - 'UP_ARROW',] and event.value == 'PRESS': - self.effects.update(self, 'ARRAY_COUNT') - - # Force the geometry to update. - if self.phase == "DRAW": - self.update_cutter_shape(context) - elif self.phase == "EXTRUDE": - self.set_extrusion_depth(context) - - # Adjust gap. - if (self.rows > 1 or self.columns > 1) and (event.type == 'A'): - stored_phase = self._custom_modifier_event(context, event, "ARRAY", cursor='MUTE', - store_values=True, restore_mouse=True) - - if self.phase == "ARRAY": - region = context.region - rv3d = context.region_data - - self.mouse.cached_3d = view3d_utils.region_2d_to_location_3d(region, rv3d, self.mouse.cached, self.cutter.center) - self.mouse.current_3d = view3d_utils.region_2d_to_location_3d(region, rv3d, self.mouse.current, self.cutter.center) - d = (self.cutter.center - self.mouse.current_3d).length - (self.cutter.center - self.mouse.cached_3d).length - self.gap = 1 + (d * 0.2) - - self.effects.update(self, 'ARRAY_GAP') - - - def event_flip(self, context, event): - """Modifier keys for flipping the direction of extrusion.""" - - if event.type == 'F' and event.value == 'PRESS': - if self.phase == 'EXTRUDE': - self.flip_direction = not self.flip_direction - - - def event_move(self, context, event): - """Modifier keys for moving the cutter shape.""" - - def _remove_move_phase_properties(self): - del self._stored_cutter_location - self.mouse.cached_3d = None - - - if event.type == 'SPACE': - stored_phase = self._custom_modifier_event(context, event, "MOVE", - cursor='SCROLL_XY', restore_mouse=False, - postprocess=_remove_move_phase_properties) - - if self.phase == "MOVE": - region = context.region - rv3d = context.region_data - - # Project current mouse position onto the workplane. - current_mouse_pos_3d = region_2d_to_plane_3d(region, rv3d, - self.mouse.current, - (self.workplane.location, self.workplane.normal)) - if current_mouse_pos_3d is not None: - if not hasattr(self, '_stored_cutter_location'): - self.mouse.cached_3d = current_mouse_pos_3d.copy() - self._stored_cutter_location = self.cutter.obj.location.copy() - - offset = current_mouse_pos_3d - self.mouse.cached_3d - self.cutter.obj.location = self._stored_cutter_location + offset - +#### ------------------------------ CLASSES ------------------------------ #### class CarverBase(bpy.types.Operator, CarverEvents, CarverPropsOperator, CarverPropsShape, CarverPropsModifier, - CarverPropsCutter): + CarverPropsCutter, + CarverPropsArray): """Base class for Carver operators.""" - def redraw_region(self, context): - """Redraw the region to find the limits of the 3D viewport.""" - - region_types = {'WINDOW', 'UI'} - for area in context.window.screen.areas: - if area.type == 'VIEW_3D': - for region in area.regions: - if not region_types or region.type in region_types: - region.tag_redraw() - - + # Core Methods def validate_selection(self, context): """Filter out selection to get the list of viable canvases.""" @@ -349,10 +82,14 @@ class CarverBase(bpy.types.Operator, continue if self.mode == 'DESTRUCTIVE': - if is_instanced_data(obj): + if is_instanced_mesh(obj.data): self.report({'WARNING'}, f"Modifiers cannot be applied to {obj.name} because it has instanced object data") continue + if obj.data.shape_keys: + self.report({'WARNING'}, f"Modifiers cannot be applied to {obj.name} because it has shape keys") + continue + selected.append(obj) # Ensure the active object. @@ -367,11 +104,10 @@ class CarverBase(bpy.types.Operator, return selected, active - # Core Methods def calculate_workplane(self, context): """ Calculates matrix, location (origin point), and normal (direction) - of the workplane based on the active alignment method. + of the workplane based on the chosen alignment method. """ if self.alignment == 'SURFACE': @@ -393,7 +129,7 @@ class CarverBase(bpy.types.Operator, def create_cutter(self, context): - """Creates a cutter object with correct properties & initializes `bmesh` geometry.""" + """Creates a cutter object with correct properties & initializes `bmesh`.""" # Create the Mesh & bmesh mesh = bpy.data.meshes.new(name="boolean_cutter") @@ -402,15 +138,15 @@ class CarverBase(bpy.types.Operator, # Create the Object obj = bpy.data.objects.new("boolean_cutter", mesh) obj.matrix_world = self.workplane.matrix - set_cutter_properties(context, obj, "Difference", collection=True, - display='WIRE' if self.shape == 'POLYLINE' else self.display) + make_cutter(context, obj, "Difference", collection=True, + display='WIRE' if self.shape == 'POLYLINE' else self.display) obj.booleans.carver = True # Initial Rotation if self.rotation != 0: rotation_matrix = Matrix.Rotation(self.rotation, 4, self.workplane.normal) - temp_matrix_world = rotation_matrix @ obj.matrix_world - obj.rotation_euler = temp_matrix_world.to_euler() + rotation_matrix = rotation_matrix @ obj.matrix_world + obj.rotation_euler = rotation_matrix.to_euler() # Create Verts if self.shape == 'BOX': @@ -471,18 +207,21 @@ class CarverBase(bpy.types.Operator, # Draw Line if self.phase in ("BEVEL", "ROTATE", "ARRAY"): current_mouse_pos_3d = region_2d_to_plane_3d(context.region, context.region_data, - self.mouse.current, - (self.workplane.location, self.workplane.normal)) + self.mouse.current, + (self.workplane.location, self.workplane.normal)) if current_mouse_pos_3d is not None: vertices = [self.cutter.center, current_mouse_pos_3d] if vertices is not None: draw_shader('LINES', (0.00, 0.00, 0.00), 1.0, vertices) - # Draw Circle around First Vertex + # Draw circle around first vertex. if self.shape == 'POLYLINE' and self.phase == 'DRAW': verts = self.cutter.verts if len(verts) > 3: - vertices = draw_circle_around_point(context, obj, verts[0], self._distance_from_first, 4) + vertices = draw_circle_billboard(context, + obj.matrix_world @ verts[0].co, + radius=self._distance_from_first, + segments=4) if len(vertices) > 0: draw_shader('LINE_LOOP', (0, 0, 0), 1.0, vertices) @@ -497,7 +236,7 @@ class CarverBase(bpy.types.Operator, bm = self.cutter.bm face = self.cutter.faces[0] - # Get the mouse positon on the workplane. + # Get the mouse positon x, y on the workplane. current_mouse_pos_3d = region_2d_to_plane_3d(region, rv3d, self.mouse.current, (self.workplane.location, self.workplane.normal)) @@ -582,7 +321,6 @@ class CarverBase(bpy.types.Operator, if self.alignment == 'CURSOR' and self.depth == 'CURSOR': self.depth = 'AUTO' - # Push the extruded face towards the furthest point of the collective bounding box. if self.depth == 'AUTO': corners = [] @@ -599,10 +337,9 @@ class CarverBase(bpy.types.Operator, offset = self.offset if self.alignment == 'SURFACE' else 0.1 for v in face.verts: - if self.depth == 'AUTO': - v.co += normal * (furthest_corner - offset) + v.co += normal * (furthest_corner - offset) - # Push the extruded face towards the plane of 3D cursor. + # Push the extruded face towards the plane of the 3D cursor. elif self.depth == 'CURSOR': local_cursor = self.cutter.obj.matrix_world.inverted() @ context.scene.cursor.location for v in extruded_verts: @@ -647,20 +384,24 @@ class CarverBase(bpy.types.Operator, region = context.region rv3d = context.region_data - normal = self.cutter.obj.matrix_world.to_3x3().inverted() @ self.workplane.normal - # Find the point on 3D line (along the normal) closest to the cursor. - # and calculate the distance between that and the extrude origin. - closest_points = region_2d_to_line_3d(region, rv3d, - self.mouse.current, - self._extrude_origin, self.workplane.normal) + # Convert the mouse position into a 3D ray and find closest points between... + # that ray and the line coming from the extrude origin along the workplane normal. + ray_origin, ray_direction = region_2d_to_ray_3d(region, rv3d, self.mouse.current) + closest_points = mathutils.geometry.intersect_line_line(ray_origin, + ray_origin + ray_direction, + self._extrude_origin, + self._extrude_origin + self.workplane.normal) + if closest_points is None: return + # Calculate the distance between the extrude origin and mouse position. offset_vector = closest_points[1] - self._extrude_origin distance = offset_vector.dot(self.workplane.normal) # Offset vertices of the extruded face from their their original coordinates. + normal = self.cutter.obj.matrix_world.to_3x3().inverted() @ self.workplane.normal if distance is not None: for v, vert_co in zip(self._extrude_faces[-1].verts, self._extrude_verts_co): offset = normal * distance @@ -695,68 +436,71 @@ class CarverBase(bpy.types.Operator, ray_obj_matrix = ray.obj.matrix_world mesh = ray.obj.evaluated_get(context.view_layer.depsgraph).to_mesh() - if mesh is not None: - # create_temporary_bmesh - temp_bm = bmesh.new() - temp_bm.from_mesh(mesh) - temp_bm.faces.ensure_lookup_table() + if mesh is None: + self.alignment = 'VIEW' + return None, None, None - face = temp_bm.faces[ray.index] + # Create temporary `bmesh`. + temp_bm = bmesh.new() + temp_bm.from_mesh(mesh) + temp_bm.faces.ensure_lookup_table() - if self.orientation == 'FACE': - # Get the tangent, normal, and bitangent from the face normal. - tangent = face.calc_tangent_edge() - normal = face.normal - bitangent = normal.cross(tangent) + face = temp_bm.faces[ray.index] - elif self.orientation in ('CLOSEST_EDGE', 'LONGEST_EDGE'): - # Get the tangent, normal, and bitangent from the longest or the closest edge of the face. + if self.orientation == 'FACE': + # Get the tangent, normal, and bitangent from the face normal. + tangent = face.calc_tangent_edge() + normal = face.normal + bitangent = normal.cross(tangent) - if self.orientation == 'LONGEST_EDGE': - lengths = [ - (ray_obj_matrix @ edge.verts[0].co - ray_obj_matrix @ edge.verts[1].co).length - for edge in face.edges - ] - longest_edge = sorted(zip(lengths, face.edges), key=lambda x: x[0], reverse=True)[0][1] - edge = longest_edge + elif self.orientation in ('CLOSEST_EDGE', 'LONGEST_EDGE'): + # Get the tangent, normal, and bitangent from the longest or the closest edge of the face. - elif self.orientation == 'CLOSEST_EDGE': - distances = [ - distance_from_point_to_segment( - ray.location, - ray_obj_matrix @ edge.verts[0].co, - ray_obj_matrix @ edge.verts[1].co, - ) - for edge in face.edges - ] - closest_edge = sorted(zip(distances, face.edges), key=lambda x: x[0])[0][1] - edge = closest_edge + if self.orientation == 'LONGEST_EDGE': + lengths = [ + (ray_obj_matrix @ edge.verts[0].co - ray_obj_matrix @ edge.verts[1].co).length + for edge in face.edges + ] + longest_edge = sorted(zip(lengths, face.edges), key=lambda x: x[0], reverse=True)[0][1] + edge = longest_edge - # Get the loop (face corner) for the edge that is also in the face. - face_corner = next(loop for loop in edge.link_loops if loop.face == face) + elif self.orientation == 'CLOSEST_EDGE': + distances = [ + distance_from_point_to_segment( + ray.location, + ray_obj_matrix @ edge.verts[0].co, + ray_obj_matrix @ edge.verts[1].co, + ) + for edge in face.edges + ] + closest_edge = sorted(zip(distances, face.edges), key=lambda x: x[0])[0][1] + edge = closest_edge - start = face_corner.vert - end = face_corner.link_loop_next.vert - direction = (end.co - start.co) + # Get the loop (face corner) for the edge that is also in the face. + face_corner = next(loop for loop in edge.link_loops if loop.face == face) - tangent = edge.calc_tangent(face_corner) - normal = direction.cross(tangent) - bitangent = normal.cross(tangent) + start = face_corner.vert + end = face_corner.link_loop_next.vert + direction = (end.co - start.co) - # Construct Matrix - matrix = Matrix.Identity(4) - matrix[0].xyz = (ray_obj_matrix.to_3x3() @ tangent).normalized() - matrix[1].xyz = (ray_obj_matrix.to_3x3() @ bitangent).normalized() - matrix[2].xyz = (ray_obj_matrix.to_3x3() @ normal).normalized() - matrix[3].xyz = ray.location + (ray.normal * self.offset) + tangent = edge.calc_tangent(face_corner) + normal = direction.cross(tangent) + bitangent = normal.cross(tangent) - # destroy_temporary_bmesh - temp_bm.free() - del mesh + # Construct Matrix + matrix = Matrix.Identity(4) + matrix[0].xyz = (ray_obj_matrix.to_3x3() @ tangent).normalized() + matrix[1].xyz = (ray_obj_matrix.to_3x3() @ bitangent).normalized() + matrix[2].xyz = (ray_obj_matrix.to_3x3() @ normal).normalized() + matrix[3].xyz = ray.location + (ray.normal * self.offset) - matrix = matrix.transposed() - location = ray.location + (ray.normal * self.offset) - normal = ray.normal + # destroy_temporary_bmesh + temp_bm.free() + del mesh + + matrix = matrix.transposed() + location = ray.location + (ray.normal * self.offset) + normal = ray.normal return matrix, location, normal @@ -776,8 +520,7 @@ class CarverBase(bpy.types.Operator, context.scene.cursor.location) else: # Put the location at the closest point of the bounding box of all selected objects. - ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, self.mouse.initial) - ray_direction = view3d_utils.region_2d_to_vector_3d(region, rv3d, self.mouse.initial) + ray_origin, ray_direction = region_2d_to_ray_3d(region, rv3d, self.mouse.initial) corners = [] for obj in self.objects.selected: @@ -803,8 +546,7 @@ class CarverBase(bpy.types.Operator, matrix = Matrix.Identity(4) normal = matrix.col[2].xyz - ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, self.mouse.initial) - ray_direction = view3d_utils.region_2d_to_vector_3d(region, rv3d, self.mouse.initial) + ray_origin, ray_direction = region_2d_to_ray_3d(region, rv3d, self.mouse.initial) t = (matrix.translation.z - ray_origin.z) / ray_direction.z location = ray_origin + ray_direction * t matrix.translation = location @@ -851,7 +593,6 @@ class CarverBase(bpy.types.Operator, cutter = self.cutter.obj - # Add Modifier(s) for obj in self.objects.selected: mod = add_boolean_modifier(self, context, obj, cutter, "DIFFERENCE", @@ -877,7 +618,7 @@ class CarverBase(bpy.types.Operator, obj.modifiers.remove(mod) if not intersecting_canvases: - self.finalize(context, clean_up=True) + self.finalize(context) return # Select all faces of the cutter so that newly created faces in canvas @@ -920,7 +661,7 @@ class CarverBase(bpy.types.Operator, for obj in intersecting_canvases: obj.booleans.canvas = True - self.finalize(context) + self.finalize(context, clean_up=False) return elif self.mode == 'DESTRUCTIVE': @@ -930,11 +671,11 @@ class CarverBase(bpy.types.Operator, modifiers = get_modifiers_to_apply(context, obj, [modifiers]) apply_modifiers(context, obj, modifiers, force_clean=True) - self.finalize(context, clean_up=True) + self.finalize(context) return - def finalize(self, context, clean_up=False, abort=False): + def finalize(self, context, clean_up=True, abort=False): """ Finalize and clean-up after the operation ends. Regardless of whether it was confirmed or cancelled. @@ -943,15 +684,19 @@ class CarverBase(bpy.types.Operator, # Operation was aborted, or successfully finished in the Destructive mode. # Delete everything created by the operator (i.e. cutter). if clean_up: - delete_cutter(self.cutter.obj) + delete_object(self.cutter.obj) self.cutter.bm.free() - delete_empty_collection() + delete_empty_collection(context) # Remove modifiers added by the operator. if abort: for obj, mod in self.objects.modifiers.items(): obj.modifiers.remove(mod) + # Clean-up temporary changes made by operator. + if self.effects.array: + self.effects.array.use_pin_to_last = False + bpy.types.SpaceView3D.draw_handler_remove(self._handler, 'WINDOW') context.workspace.status_text_set(None) context.window.cursor_set('DEFAULT' if context.mode == 'OBJECT' else 'CROSSHAIR') diff --git a/extensions/blender_org/bool_tool/tools/common/events.py b/extensions/blender_org/bool_tool/tools/common/events.py new file mode 100644 index 0000000..6eee5dd --- /dev/null +++ b/extensions/blender_org/bool_tool/tools/common/events.py @@ -0,0 +1,285 @@ +import bpy +from bpy_extras import view3d_utils +from mathutils import Vector, Matrix + +from ...functions.object import ( + set_object_origin, +) +from ...functions.view import ( + region_2d_to_plane_3d, +) + + +#### ------------------------------ CLASSES ------------------------------ #### + +class CarverEvents(): + + # Private Methods. + def _custom_modifier_event(self, context, event, modifier, + cursor='NONE', store_values=False, restore_mouse=True, + postprocess=None): + """Creates a custom modifier event when the key is held down.""" + + # Initialize Modifier Phase + if event.value == 'PRESS': + if self.phase in ("DRAW", "EXTRUDE"): + self._stored_phase = self.phase + self.phase = modifier + self.mouse.cached = self.mouse.current + context.window.cursor_set(cursor) + + if store_values: + # Store center of the geometry as a Vector. + verts = [v.co for v in self.cutter.bm.verts] + center = sum(verts, Vector()) / len(verts) + self.cutter.center = self.cutter.obj.matrix_world @ center + + # End Modifier Phase + elif event.value == 'RELEASE': + if self.phase == modifier: + context.window.cursor_set('MUTE') + if restore_mouse: + context.window.cursor_warp(int(self.mouse.cached[0]), int(self.mouse.cached[1]) + 100) + self.mouse.current = self.mouse.cached + self.phase = self._stored_phase + + if postprocess is not None: + postprocess(self) + + return self._stored_phase + + + # Public Methods. + def event_aspect(self, context, event): + """Modifier key for changing the aspect of the shape.""" + + if event.shift and self.phase == "DRAW": + if self._initial_aspect == 'FREE': + self.aspect = 'FIXED' + elif self._initial_aspect == 'FIXED': + self.aspect = 'FREE' + else: + self.aspect = self._initial_aspect + + + def event_origin(self, context, event): + """Modifier key for changing the origin of the shape.""" + + if event.alt and self.phase == "DRAW": + if self._initial_origin == 'EDGE': + self.origin = 'CENTER' + elif self._initial_origin == 'CENTER': + self.origin = 'EDGE' + else: + self.origin = self._initial_origin + + + def event_rotate(self, context, event): + """Modifier key for rotating the shape.""" + + def _remove_rotate_phase_properties(self): + del self._stored_mouse_pos_3d + del self._stored_rotation + del self._stored_cutter_center + del self._stored_cutter_euler + + # Restore origin at edge (first vertex). + if self.origin == 'EDGE': + self.cutter.bm.verts.ensure_lookup_table() + point = self.cutter.bm.verts[0].co + set_object_origin(self.cutter.obj, self.cutter.bm, point='CUSTOM', custom=point) + + + # Set correct phase. + if event.type == 'R': + _rm = False if self._stored_phase == "DRAW" else True + stored_phase = self._custom_modifier_event(context, event, "ROTATE", + cursor='MOVE_X', store_values=True, restore_mouse=_rm, + postprocess=_remove_rotate_phase_properties) + + if self.phase == "ROTATE": + region = context.region + rv3d = context.region_data + + # Project current mouse position onto the workplane. + current_mouse_pos_3d = region_2d_to_plane_3d(region, rv3d, + self.mouse.current, + (self.workplane.location, self.workplane.normal)) + if current_mouse_pos_3d is not None: + # Store values. + obj = self.cutter.obj + if not hasattr(self, '_stored_mouse_pos_3d'): + self._stored_mouse_pos_3d = current_mouse_pos_3d.copy() + self._stored_rotation = self.rotation + self._stored_cutter_center = self.cutter.center + self._stored_cutter_euler = obj.rotation_euler.copy() + + # Calculate angle and direction. + to_start = (self._stored_mouse_pos_3d - self._stored_cutter_center).normalized() + to_current = (current_mouse_pos_3d - self._stored_cutter_center).normalized() + + angle = to_start.angle(to_current) + cross = to_start.cross(to_current) + if cross.dot(self.workplane.normal) < 0: + angle = -angle + + if abs(angle) > 0.0001: + self.rotation = self._stored_rotation + angle + + # Offset the object location when drawing from edge to move rotation pivot to center. + if self.origin == 'EDGE': + set_object_origin(obj, self.cutter.bm, point='CENTER_OBJ') + + # Calculate rotation amount. + rotation_total = Matrix.Rotation(self.rotation, 4, self.workplane.normal) + rotation_stored = Matrix.Rotation(self._stored_rotation, 4, self.workplane.normal) + rotation_matrix = rotation_total @ rotation_stored.inverted() + new_rot = rotation_matrix @ self._stored_cutter_euler.to_matrix().to_4x4() + + # Rotate. + obj.rotation_euler = new_rot.to_euler() + + + def event_bevel(self, context, event): + """Modifier key for beveling the shape.""" + + def _remove_empty_bevel_modifier(self): + bevel = self.effects.bevel + if bevel.width == 0: + self.cutter.obj.modifiers.remove(bevel) + self.effects.bevel = None + + if self.effects.weld is not None: + self.cutter.obj.modifiers.remove(self.effects.weld) + self.effects.weld = None + + + if self.shape != 'BOX': + return + + # Set correct phase. + if event.type == 'B': + stored_phase = self._custom_modifier_event(context, event, "BEVEL", + cursor='PICK_AREA', store_values=True, + postprocess=_remove_empty_bevel_modifier) + + if self.phase == "BEVEL": + self.use_bevel = True + + # Initialize bevel effect if it doesn't exist. + if self.effects.bevel is None: + self.bevel_width = 0 + affect = 'VERTICES' if stored_phase == "DRAW" else 'EDGES' + self.effects.add_bevel_modifier(self, affect=affect) + + # Force the geometry to update. + if stored_phase == "DRAW": + self.update_cutter_shape(context) + elif stored_phase == "EXTRUDE": + self.set_extrusion_depth(context) + + # Calculate bevel width. + region = context.region + rv3d = context.region_data + + self.mouse.cached_3d = view3d_utils.region_2d_to_location_3d(region, rv3d, + self.mouse.cached, + self.cutter.center) + self.mouse.current_3d = view3d_utils.region_2d_to_location_3d(region, rv3d, + self.mouse.current, + self.cutter.center) + d = (self.cutter.center - self.mouse.current_3d).length - (self.cutter.center - self.mouse.cached_3d).length + self.bevel_width = d * 0.2 + + # Adjust bevel segments. + if event.type == 'WHEELUPMOUSE': + self.bevel_segments += 1 + elif event.type == 'WHEELDOWNMOUSE': + self.bevel_segments -= 1 + + # Update modifier. + self.effects.update(self, "BEVEL") + + + def event_array(self, context, event): + """Modifier key for arraying the shape.""" + + # Add duplicates. + if event.type == 'LEFT_ARROW' and event.value == 'PRESS': + self.columns -= 1 + if event.type == 'RIGHT_ARROW' and event.value == 'PRESS': + self.columns += 1 + if event.type == 'DOWN_ARROW' and event.value == 'PRESS': + self.rows -= 1 + if event.type == 'UP_ARROW' and event.value == 'PRESS': + self.rows += 1 + + if event.type in ['LEFT_ARROW', + 'RIGHT_ARROW', + 'DOWN_ARROW', + 'UP_ARROW',] and event.value == 'PRESS': + self.effects.update(self, "ARRAY_COUNT") + + # Force the geometry to update. + if self.phase == "DRAW": + self.update_cutter_shape(context) + elif self.phase == "EXTRUDE": + self.set_extrusion_depth(context) + + # Adjust gap. + if (self.rows > 1 or self.columns > 1) and (event.type == 'A'): + stored_phase = self._custom_modifier_event(context, event, "ARRAY", + cursor='MUTE', store_values=True) + + if self.phase == "ARRAY": + region = context.region + rv3d = context.region_data + + self.mouse.cached_3d = view3d_utils.region_2d_to_location_3d(region, rv3d, + self.mouse.cached, + self.cutter.center) + self.mouse.current_3d = view3d_utils.region_2d_to_location_3d(region, rv3d, + self.mouse.current, + self.cutter.center) + d = (self.cutter.center - self.mouse.current_3d).length - (self.cutter.center - self.mouse.cached_3d).length + self.gap = 1 + (d * 0.2) + + self.effects.update(self, "ARRAY_GAP") + + + def event_flip(self, context, event): + """Modifier key for flipping the direction of extrusion.""" + + if event.type == 'F' and event.value == 'PRESS': + if self.phase == 'EXTRUDE': + self.flip_direction = not self.flip_direction + + + def event_move(self, context, event): + """Modifier key for moving the shape.""" + + def _remove_move_phase_properties(self): + del self._stored_cutter_location + self.mouse.cached_3d = None + + + if event.type == 'SPACE': + stored_phase = self._custom_modifier_event(context, event, "MOVE", + cursor='SCROLL_XY', restore_mouse=False, + postprocess=_remove_move_phase_properties) + + if self.phase == "MOVE": + region = context.region + rv3d = context.region_data + + # Project current mouse position onto the workplane. + current_mouse_pos_3d = region_2d_to_plane_3d(region, rv3d, + self.mouse.current, + (self.workplane.location, self.workplane.normal)) + if current_mouse_pos_3d is not None: + if not hasattr(self, '_stored_cutter_location'): + self.mouse.cached_3d = current_mouse_pos_3d.copy() + self._stored_cutter_location = self.cutter.obj.location.copy() + + offset = current_mouse_pos_3d - self.mouse.cached_3d + self.cutter.obj.location = self._stored_cutter_location + offset diff --git a/extensions/blender_org/bool_tool/tools/common/properties.py b/extensions/blender_org/bool_tool/tools/common/properties.py index 89ed70f..5602b4b 100644 --- a/extensions/blender_org/bool_tool/tools/common/properties.py +++ b/extensions/blender_org/bool_tool/tools/common/properties.py @@ -1,40 +1,59 @@ import bpy import math - -# Import Custom Icons -from ... import icons -svg_icons = icons.svg_icons["main"] -icon_measure = svg_icons["MEASURE"].icon_id -icon_cpu = svg_icons["CPU"].icon_id +from ...ui.icons import ( + get_custom_icon, +) #### ------------------------------ PROPERTIES ------------------------------ #### class CarverPropsOperator(): + + # NOTE: Defining enum items inside a function is necessary to allow correct import of custom icons. + # Without this, classes (and their properties) are registered before `register` function of modules + # are called, resulting in empty preview collections. + def get_depth_items(self, context): + icon_measure = get_custom_icon("MEASURE") + icon_cpu = get_custom_icon("CPU") + + items = [ + ('MANUAL', "Manual", "Depth can be manually set after creating a cutter shape", icon_measure, 0), + ('AUTO', "Auto", "Depth is set automatically to cover selected objects entirely", icon_cpu, 1), + ('CURSOR', "3D Cursor", "Depth is set to 3D cursors location", 'PIVOT_CURSOR', 2), + ] + return items + # OPERATOR-properties mode: bpy.props.EnumProperty( name = "Mode", items = (('DESTRUCTIVE', "Destructive", - "Boolean cutters are immediatelly applied and removed after the cut", 'MESH_DATA', 0), + "Boolean cutters are immediatelly applied and removed after the cut", + 'MESH_DATA', 0), ('MODIFIER', "Modifier", - "Cuts are stored as boolean modifiers and cutters are placed inside the collection", 'MODIFIER_DATA', 1)), + "Cuts are stored as Boolean modifiers and cutters are placed inside the collection", 'MODIFIER_DATA', 1)), default = 'MODIFIER', ) alignment: bpy.props.EnumProperty( name = "Alignment", - items = (('SURFACE', "Surface", "Align cutters to the surface normal of the mesh under the mouse", 'SNAP_NORMAL', 0), - ('VIEW', "View", "Align cutters to the current view", 'VIEW_CAMERA_UNSELECTED', 1), - ('CURSOR', "3D Cursor", "Align cutters to the 3D cursor orientation", 'ORIENTATION_CURSOR', 2), - ('GRID', "Grid", "Align cutters to the world grid", 'GRID', 3)), + items = (('SURFACE', "Surface", + "Align cutters to the surface normal of the mesh under the mouse", + 'SNAP_NORMAL', 0), + ('VIEW', "View", + "Align cutters to the current view", + 'VIEW_CAMERA_UNSELECTED', 1), + ('CURSOR', "3D Cursor", + "Align cutters to the 3D cursor orientation", + 'ORIENTATION_CURSOR', 2), + ('GRID', "Grid", + "Align cutters to the world grid", + 'GRID', 3)), default = 'SURFACE', ) depth: bpy.props.EnumProperty( name = "Depth", - items = (('MANUAL', "Manual", "Depth can be manually set after creating a cutter shape", icon_measure, 0), - ('AUTO', "Auto", "Depth is set automatically to cover selected objects entirely", icon_cpu, 1), - ('CURSOR', "3D Cursor", "Depth is set to 3D cursors location", 'PIVOT_CURSOR', 2)), - default = 'MANUAL', + items = get_depth_items, + default = 0, ) @@ -72,7 +91,7 @@ class CarverPropsShape(): flip_direction: bpy.props.BoolProperty( name = "Flip Direction", description = "Change which way the geometry is extruded", - options = {'SKIP_SAVE', 'HIDDEN', 'SKIP_PRESET', }, + options = {'SKIP_SAVE', 'HIDDEN'}, default = False, ) @@ -88,7 +107,7 @@ class CarverPropsModifier(): ) pin: bpy.props.BoolProperty( name = "Pin Boolean Modifier", - description = ("Boolean modifier will be placed first in modifier stack, above other modifier (if there are any).\n" + description = ("Always make new Boolean modifiers first in the modifier stack.\n" "NOTE: Order of modifiers can drastically affect the result (especially in destructive mode)"), default = True, ) @@ -98,13 +117,13 @@ class CarverPropsCutter(): # CUTTER-properties hide: bpy.props.BoolProperty( name = "Hide Cutter", - description = ("Hide cutter objects in the viewport after they're created."), + description = ("Hide cutter objects in the viewport after they are created."), default = True, ) parent: bpy.props.BoolProperty( name = "Parent to Canvas", - description = ("Cutters will be parented to active object being cut, even if cutting multiple objects.\n" - "If there is no active object in selection cutters parent might be chosen seemingly randomly"), + description = ("Parent new cutters to active object (even if they are cutting multiple objects).\n" + "If there is no active object in the selection, parent might be chosen randomly"), default = True, ) display: bpy.props.EnumProperty( @@ -115,24 +134,29 @@ class CarverPropsCutter(): ) cutter_origin: bpy.props.EnumProperty( name = "Cutter Origin Point", - items = (('CENTER_OBJ', "Bounding Box", "Put the object origin at the center of the cutters bounding box"), - ('CENTER_MESH', "Geometry", "Put the object origin at the center of the cutters geometry (not including effects)"), - ('FACE_CENTER', "First Face", "Put the object origin at the center of cutters first face (i.e. shape)"), - ('MOUSE_INITIAL', "Mouse Click", "Put the object origin at the point where mouse was first clicked"), - ('CANVAS', "Same as Canvas", "Put the object origin of the cutter to the origin point of the cutter")), + items = (('CENTER_OBJ', "Bounding Box", + "Put the object origin at the center of the cutters bounding box"), + ('CENTER_MESH', "Geometry", + "Put the object origin at the center of the cutters geometry (not including effects)"), + ('FACE_CENTER', "First Face", + "Put the object origin at the center of cutters first face (i.e. shape)"), + ('MOUSE_INITIAL', "Mouse Click", + "Put the object origin at the point where mouse was first clicked"), + ('CANVAS', "Same as Canvas", + "Put the object origin of the cutter to the origin point of the cutter")), default = 'CENTER_MESH', ) auto_smooth: bpy.props.BoolProperty( name = "Shade Auto Smooth", - description = ("Cutter object will be shaded smooth with sharp edges (above specified degrees) marked as sharp\n" - "NOTE: This is a one time operator. 'Smooth by Angle' modifier will not be added on cutter"), + description = ("Add 'Smooth by Angle' modifier to cutter object"), default = True, ) sharp_angle: bpy.props.FloatProperty( name = "Angle", description = "Maximum face angle for sharp edges", subtype = "ANGLE", + precision = 3, min = 0, max = math.pi, default = 0.523599, ) @@ -142,13 +166,13 @@ class CarverPropsArray(): # ARRAY-properties rows: bpy.props.IntProperty( name = "Rows", - description = "Number of times shape is duplicated horizontally", + description = "Number of times the shape is duplicated horizontally", min = 1, soft_max = 16, default = 1, ) columns: bpy.props.IntProperty( name = "Columns", - description = "Number of times shape is duplicated vertically", + description = "Number of times the shape is duplicated vertically", min = 1, soft_max = 16, default = 1, ) diff --git a/extensions/blender_org/bool_tool/tools/common/types.py b/extensions/blender_org/bool_tool/tools/common/types.py index 289bd1a..25b86a7 100644 --- a/extensions/blender_org/bool_tool/tools/common/types.py +++ b/extensions/blender_org/bool_tool/tools/common/types.py @@ -9,13 +9,14 @@ from ...functions.mesh import ( ) from ...functions.modifier import ( add_modifier_asset, + update_modifier_input, ) #### ------------------------------ CLASSES ------------------------------ #### class Selection: - """Storage of viable selected and active object(s) throughout the modal.""" + """Storage of viable cannvas objects and their Boolean modifiers.""" def __init__(self, selected, active): self.selected: list = selected @@ -24,10 +25,7 @@ class Selection: class Mouse: - """ - Mouse positions throughout different phases of the modal operator. - Each class variable is a 2D vector in screen space (x, y). - """ + """Mouse positions throughout different phases of the modal operator.""" def __init__(self): self.initial = Vector() @@ -99,17 +97,17 @@ class Effects: return self def update(self, cls, effect): - """Update bevel modifier during modal.""" + """Update cutter modifiers during modal.""" # Update array count. - if effect == 'ARRAY_COUNT': + if effect == "ARRAY_COUNT": if self.array is None: self.add_array_modifier(cls) else: if cls.columns > 1 or cls.rows > 1: - self.array["Socket_2"] = cls.columns - self.array["Socket_3"] = cls.rows + update_modifier_input(self.array, "Socket_2", cls.columns) + update_modifier_input(self.array, "Socket_3", cls.rows) # Remove modifier if it's no longer needed. if cls.columns == 1 and cls.rows == 1: @@ -117,12 +115,12 @@ class Effects: self.array = None # Update array gap. - if effect == 'ARRAY_GAP': - if cls.columns > 1 or cls.row > 1: + if effect == "ARRAY_GAP": + if cls.columns > 1 or cls.rows > 1: if self.array is not None: - self.array["Socket_4"] = cls.gap + update_modifier_input(self.array, "Socket_4", cls.gap) - # Force the modifier to update in viewport. + # NOTE: Force the modifier to update in viewport when key is pressed. self.array.show_viewport = False self.array.show_viewport = True @@ -150,15 +148,16 @@ class Effects: # Columns if cls.columns > 1: - mod["Socket_2"] = cls.columns + update_modifier_input(mod, "Socket_2", cls.columns) # Rows if cls.rows > 1: - mod["Socket_3"] = cls.rows + update_modifier_input(mod, "Socket_3", cls.rows) # Gap - mod["Socket_4"] = cls.gap + update_modifier_input(mod, "Socket_4", cls.gap) + mod.use_pin_to_last = True self.array = mod @@ -233,7 +232,7 @@ class Effects: # Smooth by Angle def add_auto_smooth_modifier(self, cls, context): - """Adds a 'Smooth by Angle' modifier on cutter object, a.k.a. Auto Smooth.""" + """Adds a 'Smooth by Angle' modifier on the cutter object (a.k.a. Auto Smooth).""" obj = cls.cutter.obj mesh = cls.cutter.mesh @@ -262,7 +261,7 @@ class Effects: mod = obj.modifiers.active - # Try loading the node group manually if `bpy.ops` operators fail. + # Try loading the node group manually if `bpy.ops` operators failed. if mod is None: dir = os.path.join(os.path.dirname(bpy.app.binary_path), "5.0", "datafiles", "assets") assets_path = os.path.join(dir, modifier_asset_file) @@ -274,13 +273,13 @@ class Effects: print("Destructively marking sharp edges and smooth faces in the mesh") shade_smooth_by_angle(bm, mesh, angle=math.degrees(cls.sharp_angle)) else: - # Set smoothing angle. + # Set smoothing angle (necessary for all methods except `shade_auto_smooth()`). for face in bm.faces: face.smooth = True bm.to_mesh(mesh) mod.use_pin_to_last = True - mod["Input_1"] = cls.sharp_angle + update_modifier_input(mod, "Input_1", cls.sharp_angle) self.smooth = mod diff --git a/extensions/blender_org/bool_tool/tools/common/ui.py b/extensions/blender_org/bool_tool/tools/common/ui.py index 2d59072..01625b3 100644 --- a/extensions/blender_org/bool_tool/tools/common/ui.py +++ b/extensions/blender_org/bool_tool/tools/common/ui.py @@ -1,5 +1,4 @@ import bpy -from ... import __package__ as base_package #### ------------------------------ /toolbar/ ------------------------------ #### @@ -14,7 +13,7 @@ def carver_ui_common(context, layout, props): layout.prop(props, "solver", expand=True) else: - # Use labels for Properties editor/sidebar. + # NOTE: Use labels for Properties editor/sidebar. layout.prop(props, "mode", text="Mode") layout.prop(props, "alignment", text="Alignment") layout.prop(props, "depth", text="Depth") @@ -43,20 +42,17 @@ class TOPBAR_PT_carver_shape(bpy.types.Panel): layout.use_property_split = True layout.use_property_decorate = False - tool = context.workspace.tools.from_space_view3d_mode('OBJECT' if context.mode == 'OBJECT' else 'EDIT_MESH') + mode = 'OBJECT' if context.mode == 'OBJECT' else 'EDIT_MESH' + tool = context.workspace.tools.from_space_view3d_mode(mode) + props = tool.operator_properties(tool.idname) # Box & Circle if tool.idname == "object.carve_box" or tool.idname == "object.carve_circle": - if tool.idname == "object.carve_box": - props = tool.operator_properties("object.carve_box") - else: - props = tool.operator_properties("object.carve_circle") - if tool.idname == "object.carve_circle": layout.prop(props, "subdivision", text="Vertices") layout.prop(props, "rotation") - layout.prop(props, "aspect", expand=True) layout.prop(props, "origin", expand=True) + layout.prop(props, "aspect", expand=True) if props.alignment == 'SURFACE': layout.prop(props, "orientation") @@ -67,7 +63,6 @@ class TOPBAR_PT_carver_shape(bpy.types.Panel): # Polyline elif tool.idname == "object.carve_polyline": - props = tool.operator_properties("object.carve_polyline") if props.alignment == 'SURFACE': layout.prop(props, "offset", text="Offset") layout.prop(props, "align_to_all") @@ -85,13 +80,9 @@ class TOPBAR_PT_carver_effects(bpy.types.Panel): layout.use_property_split = True layout.use_property_decorate = False - tool = context.workspace.tools.from_space_view3d_mode('OBJECT' if context.mode == 'OBJECT' else 'EDIT_MESH') - if tool.idname == "object.carve_box": - props = tool.operator_properties("object.carve_box") - elif tool.idname == "object.carve_circle": - props = tool.operator_properties("object.carve_circle") - elif tool.idname == "object.carve_polyline": - props = tool.operator_properties("object.carve_polyline") + mode = 'OBJECT' if context.mode == 'OBJECT' else 'EDIT_MESH' + tool = context.workspace.tools.from_space_view3d_mode(mode) + props = tool.operator_properties(tool.idname) # Bevel if tool.idname == 'object.carve_box': @@ -116,6 +107,7 @@ class TOPBAR_PT_carver_effects(bpy.types.Panel): col.prop(props, "rows") col.prop(props, "gap") + class TOPBAR_PT_carver_cutter(bpy.types.Panel): bl_label = "Carver Cutter" bl_idname = "TOPBAR_PT_carver_cutter" @@ -128,25 +120,25 @@ class TOPBAR_PT_carver_cutter(bpy.types.Panel): layout.use_property_split = True layout.use_property_decorate = False - tool = context.workspace.tools.from_space_view3d_mode('OBJECT' if context.mode == 'OBJECT' else 'EDIT_MESH') - if tool.idname == "object.carve_box": - props = tool.operator_properties("object.carve_box") - elif tool.idname == "object.carve_circle": - props = tool.operator_properties("object.carve_circle") - elif tool.idname == "object.carve_polyline": - props = tool.operator_properties("object.carve_polyline") + mode = 'OBJECT' if context.mode == 'OBJECT' else 'EDIT_MESH' + tool = context.workspace.tools.from_space_view3d_mode(mode) + props = tool.operator_properties(tool.idname) - # modifier_&_cutter + # Modifier properties. + col = layout.column() + col.prop(props, "pin", text="Pin Modifier") + col.separator() + + # Cutter object properties. col = layout.column() row = col.row() row.prop(props, "display", text="Display", expand=True) - col.prop(props, "pin", text="Pin Modifier") if props.mode == 'MODIFIER': col.prop(props, "parent") col.prop(props, "hide") col.prop(props, "cutter_origin", text="Origin") - # auto_smooth + # Auto Smooth. layout.separator() col = layout.column(align=True) col.prop(props, "auto_smooth", text="Auto Smooth") @@ -159,11 +151,11 @@ class TOPBAR_PT_carver_cutter(bpy.types.Panel): #### ------------------------------ REGISTRATION ------------------------------ #### -classes = [ +classes = ( TOPBAR_PT_carver_shape, TOPBAR_PT_carver_effects, TOPBAR_PT_carver_cutter, -] +) def register(): for cls in classes: diff --git a/extensions/blender_org/bool_tool/ui.py b/extensions/blender_org/bool_tool/ui.py deleted file mode 100644 index a547bfe..0000000 --- a/extensions/blender_org/bool_tool/ui.py +++ /dev/null @@ -1,270 +0,0 @@ -import bpy -from .functions.poll import is_canvas -from .functions.list import list_canvas_cutters - - -#### ------------------------------ /ui/ ------------------------------ #### - -def carve_menu(self, context): - layout = self.layout - layout.operator("object.carve_box", text="Box Carve").shape='BOX' - layout.operator("object.carve_box", text="Circle Carve").shape='CIRCLE' - layout.operator("object.carve_polyline", text="Polyline Carve") - - -def boolean_operators_menu(self, context): - layout = self.layout - layout.operator_context = 'INVOKE_DEFAULT' - col = layout.column(align=True) - - col.label(text="Auto Boolean") - col.operator("object.boolean_auto_difference", text="Difference", icon='SELECT_SUBTRACT') - col.operator("object.boolean_auto_union", text="Union", icon='SELECT_EXTEND') - col.operator("object.boolean_auto_intersect", text="Intersect", icon='SELECT_INTERSECT') - col.operator("object.boolean_auto_slice", text="Slice", icon='SELECT_DIFFERENCE') - - col.separator() - col.label(text="Brush Boolean") - col.operator("object.boolean_brush_difference", text="Difference", icon='SELECT_SUBTRACT') - col.operator("object.boolean_brush_union", text="Union", icon='SELECT_EXTEND') - col.operator("object.boolean_brush_intersect", text="Intersect", icon='SELECT_INTERSECT') - col.operator("object.boolean_brush_slice", text="Slice", icon='SELECT_DIFFERENCE') - - -def boolean_extras_menu(self, context): - layout = self.layout - layout.operator_context = 'INVOKE_DEFAULT' - col = layout.column(align=True) - - if context.active_object: - # Canvas operators - active_object = context.active_object - if active_object.booleans.canvas == True and any(mod.name.startswith("boolean_") for mod in active_object.modifiers): - col.separator() - col.operator("object.boolean_toggle_all", text="Toggle All Cuters") - col.operator("object.boolean_apply_all", text="Apply All Cutters") - col.operator("object.boolean_remove_all", text="Remove All Cutters") - - # Cutter operators - if active_object.booleans.cutter: - col.separator() - col.operator("object.boolean_toggle_cutter", text="Toggle Cutter").method='ALL' - col.operator("object.boolean_apply_cutter", text="Apply Cutter").method='ALL' - col.operator("object.boolean_remove_cutter", text="Remove Cutter").method='ALL' - - - -#### ------------------------------ PANELS ------------------------------ #### - -# Boolean Operators Panel -class VIEW3D_PT_boolean(bpy.types.Panel): - bl_label = "Boolean" - bl_space_type = "VIEW_3D" - bl_region_type = "UI" - bl_category = "Edit" - bl_context = "objectmode" - bl_options = {'DEFAULT_CLOSED'} - - @classmethod - def poll(cls, context): - prefs = context.preferences.addons[__package__].preferences - return prefs.show_in_sidebar - - def draw(self, context): - boolean_operators_menu(self, context) - - -# Properties Panel -class VIEW3D_PT_boolean_properties(bpy.types.Panel): - bl_label = "Properties" - bl_space_type = "VIEW_3D" - bl_region_type = "UI" - bl_category = "Edit" - bl_context = "objectmode" - bl_parent_id = "VIEW3D_PT_boolean" - - @classmethod - def poll(cls, context): - prefs = context.preferences.addons[__package__].preferences - if prefs.show_in_sidebar: - if context.active_object: - if is_canvas(context.active_object) or context.active_object.booleans.cutter: - return True - else: - return False - else: - return False - else: - return False - - def draw(self, context): - boolean_extras_menu(self, context) - - -# Cutters Panel -class VIEW3D_PT_boolean_cutters(bpy.types.Panel): - bl_label = "Cutters" - bl_space_type = "VIEW_3D" - bl_region_type = "UI" - bl_category = "Edit" - bl_context = "objectmode" - bl_parent_id = "VIEW3D_PT_boolean" - - @classmethod - def poll(cls, context): - prefs = context.preferences.addons[__package__].preferences - if prefs.show_in_sidebar: - if context.active_object: - if is_canvas(context.active_object): - return True - else: - return False - else: - return False - else: - return False - - def draw(self, context): - layout = self.layout - canvas = context.active_object - __, modifiers = list_canvas_cutters([canvas]) - - for mod in modifiers: - col = layout.column(align=True) - row = col.row(align=True) - - # icon - if mod.operation == 'DIFFERENCE': - icon = 'SELECT_SUBTRACT' - elif mod.operation == 'UNION': - icon = 'SELECT_EXTEND' - elif mod.operation == 'INTERSECT': - icon = 'SELECT_INTERSECT' - - row.prop(mod.object, "name", text="", icon=icon) - - # Toggle - op_toggle = row.operator("object.boolean_toggle_cutter", text="", icon='HIDE_OFF' if mod.show_viewport else 'HIDE_ON') - op_toggle.method = 'SPECIFIED' - op_toggle.specified_cutter = mod.object.name - op_toggle.specified_canvas = canvas.name - - # Apply - op_apply = row.operator("object.boolean_apply_cutter", text="", icon='CHECKMARK') - op_apply.method = 'SPECIFIED' - op_apply.specified_cutter = mod.object.name - op_apply.specified_canvas = canvas.name - - # Remove - op_remove = row.operator("object.boolean_remove_cutter", text="", icon='X') - op_remove.method = 'SPECIFIED' - op_remove.specified_cutter = mod.object.name - op_remove.specified_canvas = canvas.name - - - -#### ------------------------------ MENUS ------------------------------ #### - -# Carve Menu -class VIEW3D_MT_carve(bpy.types.Menu): - bl_label = "Carve" - bl_idname = "VIEW3D_MT_carve" - - def draw(self, context): - carve_menu(self, context) - - -# 3D Viewport (Object Mode) -> Object -class VIEW3D_MT_boolean(bpy.types.Menu): - bl_label = "Boolean" - bl_idname = "VIEW3D_MT_boolean" - - def draw(self, context): - layout = self.layout - layout.menu("VIEW3D_MT_carve") - layout.separator() - boolean_operators_menu(self, context) - boolean_extras_menu(self, context) - - -# Shift-Ctrl-B Menu -class VIEW3D_MT_boolean_popup(bpy.types.Menu): - bl_label = "Boolean" - bl_idname = "VIEW3D_MT_boolean_popup" - - def draw(self, context): - boolean_operators_menu(self, context) - boolean_extras_menu(self, context) - - -def object_mode_menu(self, context): - layout = self.layout - layout.separator() - layout.menu("VIEW3D_MT_boolean") - - -def edit_mode_menu(self, context): - layout = self.layout - layout.separator() - layout.menu("VIEW3D_MT_carve") - - -def boolean_select_menu(self, context): - layout = self.layout - active_obj = context.active_object - if active_obj: - if active_obj.booleans.canvas == True or active_obj.booleans.cutter: - layout.separator() - - if active_obj.booleans.canvas == True: - layout.operator("object.boolean_select_all", text="Boolean Cutters") - if active_obj.booleans.cutter: - layout.operator("object.select_cutter_canvas", text="Boolean Canvases") - - - -#### ------------------------------ REGISTRATION ------------------------------ #### - -addon_keymaps = [] - -classes = [ - VIEW3D_MT_carve, - VIEW3D_MT_boolean, - VIEW3D_MT_boolean_popup, - VIEW3D_PT_boolean, - VIEW3D_PT_boolean_properties, - VIEW3D_PT_boolean_cutters, -] - -def register(): - for cls in classes: - bpy.utils.register_class(cls) - - # MENU - bpy.types.VIEW3D_MT_object.append(object_mode_menu) - bpy.types.VIEW3D_MT_select_object.append(boolean_select_menu) - bpy.types.VIEW3D_MT_edit_mesh.append(edit_mode_menu) - - # KEYMAP - addon = bpy.context.window_manager.keyconfigs.addon - km = addon.keymaps.new(name="Object Mode") - - kmi = km.keymap_items.new("wm.call_menu", 'B', 'PRESS', ctrl=True, shift=True) - kmi.properties.name = "VIEW3D_MT_boolean_popup" - kmi.active = True - addon_keymaps.append((km, kmi)) - - -def unregister(): - for cls in reversed(classes): - bpy.utils.unregister_class(cls) - - # MENU - bpy.types.VIEW3D_MT_object.remove(object_mode_menu) - bpy.types.VIEW3D_MT_select_object.remove(boolean_select_menu) - bpy.types.VIEW3D_MT_edit_mesh.remove(edit_mode_menu) - - # KEYMAP - for km, kmi in addon_keymaps: - km.keymap_items.remove(kmi) - addon_keymaps.clear() diff --git a/extensions/blender_org/bool_tool/ui/__init__.py b/extensions/blender_org/bool_tool/ui/__init__.py new file mode 100644 index 0000000..f70ade3 --- /dev/null +++ b/extensions/blender_org/bool_tool/ui/__init__.py @@ -0,0 +1,34 @@ +if "bpy" in locals(): + import importlib + for mod in [icons, + lists, + menus, + panels, + ]: + importlib.reload(mod) +else: + import bpy + from . import ( + icons, + lists, + menus, + panels, + ) + + +#### ------------------------------ REGISTRATION ------------------------------ #### + +modules = ( + icons, + lists, + menus, + panels, +) + +def register(): + for module in modules: + module.register() + +def unregister(): + for module in reversed(modules): + module.unregister() diff --git a/extensions/blender_org/bool_tool/ui/common.py b/extensions/blender_org/bool_tool/ui/common.py new file mode 100644 index 0000000..5c1ded2 --- /dev/null +++ b/extensions/blender_org/bool_tool/ui/common.py @@ -0,0 +1,96 @@ +import bpy +from contextlib import contextmanager + +from ..functions.canvas import ( + is_canvas, +) +from ..functions.modifier import ( + enumerate_boolean_modifiers, + is_boolean_modifier, +) + + +#### ------------------------------ FUNCTIONS ------------------------------ #### + +def get_modifier_from_list_index(obj, index: int): + """ + Returns the modifier of an object based on Cutters list index. + Filters out non-Boolean modifiers to leave a list that matches Cutters one in length. + """ + + # Create a list of only Boolean modifiers. + boolean_modifiers = [] + for mod in obj.modifiers: + if is_boolean_modifier(mod): + boolean_modifiers.append(mod) + + if 0 <= index < len(boolean_modifiers): + return boolean_modifiers[index] + + return None + + +@contextmanager +def preserve_list_index(prop_owner, index_prop: str): + """Preserves index of active item in UI list.""" + + index = getattr(prop_owner, index_prop, 0) + stored_index = index + + try: + yield + + finally: + new_index = stored_index - 1 + + if new_index < 0: + new_index = 0 + + setattr(prop_owner, index_prop, new_index) + + + +#### ------------------------------ /ui/ ------------------------------ #### + +def boolean_operators_menu(self, context): + layout = self.layout + layout.operator_context = 'INVOKE_DEFAULT' + col = layout.column(align=True) + + col.label(text="Auto Boolean") + col.operator("object.boolean_auto_difference", text="Difference", icon='SELECT_SUBTRACT') + col.operator("object.boolean_auto_union", text="Union", icon='SELECT_EXTEND') + col.operator("object.boolean_auto_intersect", text="Intersect", icon='SELECT_INTERSECT') + col.operator("object.boolean_auto_slice", text="Slice", icon='SELECT_DIFFERENCE') + + col.separator() + col.label(text="Brush Boolean") + col.operator("object.boolean_brush_difference", text="Difference", icon='SELECT_SUBTRACT') + col.operator("object.boolean_brush_union", text="Union", icon='SELECT_EXTEND') + col.operator("object.boolean_brush_intersect", text="Intersect", icon='SELECT_INTERSECT') + col.operator("object.boolean_brush_slice", text="Slice", icon='SELECT_DIFFERENCE') + + +def boolean_extras_menu(self, context, cutter_only=False): + layout = self.layout + layout.operator_context = 'INVOKE_DEFAULT' + col = layout.column(align=True) + obj = context.active_object + + if not obj: + return + + # Canvas operators + if is_canvas(obj) and not cutter_only: + col.separator() + col.operator("object.boolean_toggle_all", text="Toggle All Cuters") + col.operator("object.boolean_apply_all", text="Apply All Cutters") + col.operator("object.boolean_remove_all", text="Remove All Cutters") + + # Cutter operators + if obj.booleans.cutter: + if not cutter_only: + col.separator() + col.operator("object.boolean_toggle_cutter", text="Toggle Cutter").method='ALL' + col.operator("object.boolean_apply_cutter", text="Apply Cutter").method='ALL' + col.operator("object.boolean_remove_cutter", text="Remove Cutter").method='ALL' diff --git a/extensions/blender_org/bool_tool/ui/icons/__init__.py b/extensions/blender_org/bool_tool/ui/icons/__init__.py new file mode 100644 index 0000000..bfc8251 --- /dev/null +++ b/extensions/blender_org/bool_tool/ui/icons/__init__.py @@ -0,0 +1,46 @@ +import bpy +import os +import bpy.utils.previews + + +#### ------------------------------ FUNCTIONS ------------------------------ #### + +def get_custom_icon(icon_name: str): + """Returns the ID of a custom icon registered by add-on.""" + + svg_icons = preview_collections["main"] + if not svg_icons: + return 0 + + icon = svg_icons[icon_name].icon_id + if not icon: + return 0 + + return icon + + + +#### ------------------------------ REGISTRATION ------------------------------ #### + +preview_collections = {} +svg_icons_dir = os.path.join(os.path.dirname(__file__), "svg") + +icons = { + "MEASURE": "measure.svg", + "CPU": "cpu.svg", +} + + +def register(): + svg_icons = bpy.utils.previews.new() + + for key, file in icons.items(): + svg_icons.load(key, os.path.join(svg_icons_dir, file), 'IMAGE') + + preview_collections["main"] = svg_icons + + +def unregister(): + for pcoll in preview_collections.values(): + bpy.utils.previews.remove(pcoll) + preview_collections.clear() diff --git a/extensions/blender_org/bool_tool/icons/tool_icons/ops.object.carver_box.dat b/extensions/blender_org/bool_tool/ui/icons/dat/ops.object.carver_box.dat similarity index 100% rename from extensions/blender_org/bool_tool/icons/tool_icons/ops.object.carver_box.dat rename to extensions/blender_org/bool_tool/ui/icons/dat/ops.object.carver_box.dat diff --git a/extensions/blender_org/bool_tool/icons/tool_icons/ops.object.carver_circle.dat b/extensions/blender_org/bool_tool/ui/icons/dat/ops.object.carver_circle.dat similarity index 100% rename from extensions/blender_org/bool_tool/icons/tool_icons/ops.object.carver_circle.dat rename to extensions/blender_org/bool_tool/ui/icons/dat/ops.object.carver_circle.dat diff --git a/extensions/blender_org/bool_tool/icons/tool_icons/ops.object.carver_polyline.dat b/extensions/blender_org/bool_tool/ui/icons/dat/ops.object.carver_polyline.dat similarity index 100% rename from extensions/blender_org/bool_tool/icons/tool_icons/ops.object.carver_polyline.dat rename to extensions/blender_org/bool_tool/ui/icons/dat/ops.object.carver_polyline.dat diff --git a/extensions/blender_org/bool_tool/icons/cpu.svg b/extensions/blender_org/bool_tool/ui/icons/svg/cpu.svg similarity index 100% rename from extensions/blender_org/bool_tool/icons/cpu.svg rename to extensions/blender_org/bool_tool/ui/icons/svg/cpu.svg diff --git a/extensions/blender_org/bool_tool/icons/measure.svg b/extensions/blender_org/bool_tool/ui/icons/svg/measure.svg similarity index 100% rename from extensions/blender_org/bool_tool/icons/measure.svg rename to extensions/blender_org/bool_tool/ui/icons/svg/measure.svg diff --git a/extensions/blender_org/bool_tool/ui/lists.py b/extensions/blender_org/bool_tool/ui/lists.py new file mode 100644 index 0000000..1c7d224 --- /dev/null +++ b/extensions/blender_org/bool_tool/ui/lists.py @@ -0,0 +1,92 @@ +import bpy + +from ..functions.modifier import ( + is_boolean_modifier, +) + + +#### ------------------------------ /cutters_list/ ------------------------------ #### + +class VIEW3D_UL_boolean_cutters(bpy.types.UIList): + + def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): + canvas = context.active_object + mod = item + + # Pick Icon + if mod.operation == 'DIFFERENCE': + icon = 'SELECT_SUBTRACT' + elif mod.operation == 'UNION': + icon = 'SELECT_EXTEND' + elif mod.operation == 'INTERSECT': + icon = 'SELECT_INTERSECT' + + row = layout.row(align=True) + row.prop(mod.object, "name", text="", icon=icon, emboss=False) + + # Select Cutter + op_select = row.operator("object.boolean_select_cutter", text="", icon='RESTRICT_SELECT_OFF', emboss=False) + op_select.cutter = mod.object.name + + # Toggle Cutter + icon = 'HIDE_OFF' if mod.show_viewport else 'HIDE_ON' + op_toggle = row.operator("object.boolean_toggle_cutter", text="", icon=icon, emboss=False) + op_toggle.method = 'SPECIFIED' + op_toggle.specified_cutter = mod.object.name + op_toggle.specified_canvas = canvas.name + op_toggle.specified_modifier = mod.name + + + def filter_items(self, context, data, propname): + flags = [] + indices = [] + + modifiers = getattr(data, propname) + for mod in modifiers: + if is_boolean_modifier(mod): + flags.append(self.bitflag_filter_item) + else: + flags.append(0) + + # Search Filter + if self.filter_name: + filter_name = self.filter_name.lower() + for i, mod in enumerate(modifiers): + if flags[i] != self.bitflag_filter_item: + continue + if filter_name not in mod.object.name.lower(): + flags[i] = 0 + + # Invert + if self.use_filter_invert: + for i, mod in enumerate(modifiers): + if not is_boolean_modifier(mod): + continue + flags[i] ^= self.bitflag_filter_item + + # Sort by Name + indices = list(range(len(modifiers))) + if self.use_filter_sort_alpha: + sorted_indices = sorted(range(len(modifiers)), + key=lambda i: modifiers[i].object.name if modifiers[i].object else "") + indices = [0] * len(modifiers) + for rank, original_i in enumerate(sorted_indices): + indices[original_i] = rank + + return flags, indices + + + +#### ------------------------------ REGISTRATION ------------------------------ #### + +classes = ( + VIEW3D_UL_boolean_cutters, +) + +def register(): + for cls in classes: + bpy.utils.register_class(cls) + +def unregister(): + for cls in reversed(classes): + bpy.utils.unregister_class(cls) diff --git a/extensions/blender_org/bool_tool/ui/menus.py b/extensions/blender_org/bool_tool/ui/menus.py new file mode 100644 index 0000000..3092769 --- /dev/null +++ b/extensions/blender_org/bool_tool/ui/menus.py @@ -0,0 +1,129 @@ +import bpy + +from ..functions.canvas import ( + is_canvas, +) + +from .common import ( + boolean_operators_menu, + boolean_extras_menu, +) + + +#### ------------------------------ /boolean_menu/ ------------------------------ #### + +# 3D Viewport (Object Mode) -> Object +class VIEW3D_MT_boolean(bpy.types.Menu): + bl_label = "Boolean" + bl_idname = "VIEW3D_MT_boolean" + + def draw(self, context): + layout = self.layout + layout.menu("VIEW3D_MT_carve") + layout.separator() + boolean_operators_menu(self, context) + boolean_extras_menu(self, context) + + +def object_mode_menu(self, context): + layout = self.layout + layout.separator() + layout.menu("VIEW3D_MT_boolean") + + + +#### ------------------------------ /popup_menu/ ------------------------------ #### + +# Shift-Ctrl-B Menu +class VIEW3D_MT_boolean_popup(bpy.types.Menu): + bl_label = "Boolean" + bl_idname = "VIEW3D_MT_boolean_popup" + + def draw(self, context): + boolean_operators_menu(self, context) + boolean_extras_menu(self, context) + + + +#### ------------------------------ /carve_menu/ ------------------------------ #### + +class VIEW3D_MT_carve(bpy.types.Menu): + bl_label = "Carve" + bl_idname = "VIEW3D_MT_carve" + + def draw(self, context): + layout = self.layout + layout.operator("object.carve_box", text="Box Carve") + layout.operator("object.carve_circle", text="Circle Carve") + layout.operator("object.carve_polyline", text="Polyline Carve") + + +# Separate "Carve" menu in Edit Mode (where we don't have "Boolean" menu). +def edit_mode_menu(self, context): + layout = self.layout + layout.separator() + layout.menu("VIEW3D_MT_carve") + + + +#### ------------------------------ /select_menu/ ------------------------------ #### + +def select_menu(self, context): + layout = self.layout + obj = context.active_object + + if not obj: + return + + if is_canvas(obj) or obj.booleans.cutter: + layout.separator() + + if is_canvas(obj): + layout.operator("object.boolean_select_all", text="Boolean Cutters") + if obj.booleans.cutter: + layout.operator("object.select_cutter_canvas", text="Boolean Canvases") + + + +#### ------------------------------ REGISTRATION ------------------------------ #### + +addon_keymaps = [] + +classes = ( + VIEW3D_MT_boolean, + VIEW3D_MT_boolean_popup, + VIEW3D_MT_carve, +) + +def register(): + for cls in classes: + bpy.utils.register_class(cls) + + # MENU + bpy.types.VIEW3D_MT_object.append(object_mode_menu) + bpy.types.VIEW3D_MT_edit_mesh.append(edit_mode_menu) + bpy.types.VIEW3D_MT_select_object.append(select_menu) + + # KEYMAP + addon = bpy.context.window_manager.keyconfigs.addon + km = addon.keymaps.new(name="Object Mode") + + kmi = km.keymap_items.new("wm.call_menu", 'B', 'PRESS', ctrl=True, shift=True) + kmi.properties.name = "VIEW3D_MT_boolean_popup" + kmi.active = True + addon_keymaps.append((km, kmi)) + + +def unregister(): + for cls in reversed(classes): + bpy.utils.unregister_class(cls) + + # MENU + bpy.types.VIEW3D_MT_object.remove(object_mode_menu) + bpy.types.VIEW3D_MT_edit_mesh.remove(edit_mode_menu) + bpy.types.VIEW3D_MT_select_object.remove(select_menu) + + # KEYMAP + for km, kmi in addon_keymaps: + km.keymap_items.remove(kmi) + addon_keymaps.clear() diff --git a/extensions/blender_org/bool_tool/ui/panels.py b/extensions/blender_org/bool_tool/ui/panels.py new file mode 100644 index 0000000..809dcf6 --- /dev/null +++ b/extensions/blender_org/bool_tool/ui/panels.py @@ -0,0 +1,182 @@ +import bpy +from .. import __package__ as base_package + +from ..functions.canvas import ( + is_canvas, +) + +from .common import ( + get_modifier_from_list_index, + boolean_extras_menu, +) + + +#### ------------------------------ PANELS ------------------------------ #### + +# Boolean Operators Panel +class VIEW3D_PT_boolean(bpy.types.Panel): + bl_label = "Boolean" + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + bl_category = "Edit" + bl_context = "objectmode" + bl_options = {'DEFAULT_CLOSED'} + + @classmethod + def poll(cls, context): + prefs = context.preferences.addons[base_package].preferences + return prefs.show_in_sidebar + + def draw(self, context): + layout = self.layout + layout.operator_context = 'INVOKE_DEFAULT' + col = layout.column(align=True) + + col.label(text="Auto Boolean") + row = col.row(align=False) + row.operator("object.boolean_auto_difference", text="Difference", icon='SELECT_SUBTRACT') + row.operator("object.boolean_auto_difference", text="", icon='UV_SYNC_SELECT').flip=True + row = col.row(align=False) + row.operator("object.boolean_auto_union", text="Union", icon='SELECT_EXTEND') + row.operator("object.boolean_auto_union", text="", icon='UV_SYNC_SELECT').flip=True + row = col.row(align=False) + row.operator("object.boolean_auto_intersect", text="Intersect", icon='SELECT_INTERSECT') + row.operator("object.boolean_auto_intersect", text="", icon='UV_SYNC_SELECT').flip=True + row = col.row(align=False) + row.operator("object.boolean_auto_slice", text="Slice", icon='SELECT_DIFFERENCE') + row.operator("object.boolean_auto_slice", text="", icon='UV_SYNC_SELECT').flip=True + + col.separator() + col.label(text="Brush Boolean") + row = col.row(align=False) + row.operator("object.boolean_brush_difference", text="Difference", icon='SELECT_SUBTRACT') + row.operator("object.boolean_brush_difference", text="", icon='UV_SYNC_SELECT').flip=True + row = col.row(align=False) + row.operator("object.boolean_brush_union", text="Union", icon='SELECT_EXTEND') + row.operator("object.boolean_brush_union", text="", icon='UV_SYNC_SELECT').flip=True + row = col.row(align=False) + row.operator("object.boolean_brush_intersect", text="Intersect", icon='SELECT_INTERSECT') + row.operator("object.boolean_brush_intersect", text="", icon='UV_SYNC_SELECT').flip=True + row = col.row(align=False) + row.operator("object.boolean_brush_slice", text="Slice", icon='SELECT_DIFFERENCE') + row.operator("object.boolean_brush_slice", text="", icon='UV_SYNC_SELECT').flip=True + + +# Cutters Panel +class VIEW3D_PT_boolean_cutters(bpy.types.Panel): + bl_label = "Cutters" + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + bl_category = "Edit" + bl_context = "objectmode" + bl_parent_id = "VIEW3D_PT_boolean" + + @classmethod + def poll(cls, context): + prefs = context.preferences.addons[base_package].preferences + if prefs.show_in_sidebar: + if context.active_object: + if is_canvas(context.active_object): + return True + else: + return False + else: + return False + else: + return False + + def draw(self, context): + layout = self.layout + canvas = context.active_object + + # Cutters List + row = layout.row() + col = row.column() + col.template_list( + "VIEW3D_UL_boolean_cutters", + "", + canvas, "modifiers", + canvas.booleans, "modifiers_list_index", + rows=5, + ) + + # Filter & Operators + col = row.column(align=True) + cutters_list_index = canvas.booleans.modifiers_list_index + mod = get_modifier_from_list_index(canvas, cutters_list_index) + sub = col.column(align=True) + + # Apply Cutter + op_apply = sub.operator("object.boolean_apply_cutter", text="", icon='CHECKMARK') + op_apply.method = 'SPECIFIED' + op_apply.specified_cutter = mod.object.name if mod else "" + op_apply.specified_canvas = canvas.name + + # Remove Cutter + op_remove = sub.operator("object.boolean_remove_cutter", text="", icon='X') + op_remove.method = 'SPECIFIED' + op_remove.specified_cutter = mod.object.name if mod else "" + op_remove.specified_canvas = canvas.name + op_remove.specified_modifier = mod.name if mod else "" + + if cutters_list_index < 0 or not mod: + sub.enabled = False + + col.separator() + col.menu("VIEW3D_MT_boolean_specials", icon='DOWNARROW_HLT', text="") + + +# Helpers Panel +class VIEW3D_PT_boolean_helpers(bpy.types.Panel): + bl_label = "Helpers" + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + bl_category = "Edit" + bl_context = "objectmode" + bl_parent_id = "VIEW3D_PT_boolean" + + @classmethod + def poll(cls, context): + prefs = context.preferences.addons[base_package].preferences + if not prefs.show_in_sidebar: + return False + if not context.active_object: + return False + if context.active_object.booleans.cutter: + return True + + return False + + def draw(self, context): + boolean_extras_menu(self, context, cutter_only=True) + + + +#### ------------------------------ MENUS ------------------------------ #### + +# Specials +class VIEW3D_MT_boolean_specials(bpy.types.Menu): + bl_label = "Boolean Operators" + bl_idname = "VIEW3D_MT_boolean_specials" + + def draw(self, context): + boolean_extras_menu(self, context) + + + +#### ------------------------------ REGISTRATION ------------------------------ #### + +classes = ( + VIEW3D_PT_boolean, + VIEW3D_PT_boolean_cutters, + VIEW3D_PT_boolean_helpers, + VIEW3D_MT_boolean_specials, +) + +def register(): + for cls in classes: + bpy.utils.register_class(cls) + +def unregister(): + for cls in reversed(classes): + bpy.utils.unregister_class(cls) diff --git a/extensions/blender_org/bool_tool/versioning.py b/extensions/blender_org/bool_tool/versioning.py deleted file mode 100644 index 831891e..0000000 --- a/extensions/blender_org/bool_tool/versioning.py +++ /dev/null @@ -1,43 +0,0 @@ -import bpy - - -#### ------------------------------ FUNCTIONS ------------------------------ #### - -@bpy.app.handlers.persistent -def populate_boolean_properties(scene): - prefs = bpy.context.preferences.addons[__package__].preferences - if prefs.versioning: - for obj in bpy.data.objects: - if not obj.get("BoolToolRoot"): - continue - - # Convert Canvas - if obj.get("BoolToolRoot"): - obj.booleans.canvas = True - del obj["BoolToolRoot"] - if obj.get("BoolTool_FTransform"): - del obj["BoolTool_FTransform"] - - for mod in obj.modifiers: - if mod.type == 'BOOLEAN' and "BTool_" in mod.name: - mod.name = "boolean_" + mod.object.name - cutter = mod.object - - # Convert Canvases - if cutter.get("BoolToolBrush"): - cutter.booleans.cutter = cutter.get("BoolToolBrush") - del cutter["BoolToolBrush"] - if cutter.get("BoolTool_FTransform"): - del cutter["BoolTool_FTransform"] - - - -#### ------------------------------ REGISTRATION ------------------------------ #### - -def register(): - # HANDLERS - bpy.app.handlers.load_post.append(populate_boolean_properties) - -def unregister(): - # HANDLERS - bpy.app.handlers.load_post.remove(populate_boolean_properties) diff --git a/extensions/blender_org/brushstroke_tools/__init__.py b/extensions/blender_org/brushstroke_tools/__init__.py index 427890a..c09ea27 100644 --- a/extensions/blender_org/brushstroke_tools/__init__.py +++ b/extensions/blender_org/brushstroke_tools/__init__.py @@ -2,15 +2,18 @@ # # SPDX-License-Identifier: GPL-3.0-or-later -from . import utils, icons, settings, preferences, ui, draw_tool, ops +import importlib +from . import geomod, utils, icons, settings, preferences, ui, draw_tool, ops import tomllib as toml -modules = [utils, icons, settings, preferences, ui, draw_tool, ops] +modules = [geomod, utils, icons, settings, preferences, ui, draw_tool, ops] def register(): # register modules for m in modules: - m.register() + importlib.reload(m) + if hasattr(m, 'register'): + m.register() # read addon meta-data with open(f"{utils.get_addon_directory()}/blender_manifest.toml", 'rb') as f: @@ -26,7 +29,8 @@ def register(): def unregister(): # un-register modules for m in reversed(modules): - m.unregister() + if hasattr(m, 'unregister'): + m.unregister() # Remove addon asset library utils.unregister_asset_lib() \ No newline at end of file diff --git a/extensions/blender_org/brushstroke_tools/assets/core/brushstroke_tools-resources.blend b/extensions/blender_org/brushstroke_tools/assets/core/brushstroke_tools-resources.blend index 8d52b73..8af0a81 100644 --- a/extensions/blender_org/brushstroke_tools/assets/core/brushstroke_tools-resources.blend +++ b/extensions/blender_org/brushstroke_tools/assets/core/brushstroke_tools-resources.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a10a2db87322784964d7105bd2b218c600ff27bb3a58fba76bc61cebc6ffed6d -size 972695 +oid sha256:11db84523ea8578b4aea112f227b7d1019c7d939d551c13701e3322a7b0bd95d +size 981916 diff --git a/extensions/blender_org/brushstroke_tools/blender_manifest.toml b/extensions/blender_org/brushstroke_tools/blender_manifest.toml index 5a29ba2..1f18fe5 100644 --- a/extensions/blender_org/brushstroke_tools/blender_manifest.toml +++ b/extensions/blender_org/brushstroke_tools/blender_manifest.toml @@ -1,7 +1,7 @@ schema_version = "1.0.0" id = "brushstroke_tools" -version = "1.2.1" +version = "1.2.3" name = "Brushstroke Tools" tagline = "Brushstroke painting tools by the Blender Studio" maintainer = "Simon Thommes " diff --git a/extensions/blender_org/brushstroke_tools/draw_tool.py b/extensions/blender_org/brushstroke_tools/draw_tool.py index 2bca33a..916d881 100644 --- a/extensions/blender_org/brushstroke_tools/draw_tool.py +++ b/extensions/blender_org/brushstroke_tools/draw_tool.py @@ -97,9 +97,7 @@ class BSBST_OT_pre_process_brushstroke(bpy.types.Operator): if bpy.app.version >= (5,1): utils.ensure_resources() ng_process = bpy.data.node_groups['.brushstroke_tools.draw_processing'] - ng_process.asset_mark() # workaround to let Blender register the node tool as an operator with the automatically generated id - ng_process.asset_clear() - + ng_process.is_tool = True # workaround to let Blender register the node tool as an operator with the automatically generated id return {'FINISHED'} class BSBST_OT_post_process_brushstroke(bpy.types.Operator): diff --git a/extensions/blender_org/brushstroke_tools/geomod.py b/extensions/blender_org/brushstroke_tools/geomod.py new file mode 100644 index 0000000..a3f5418 --- /dev/null +++ b/extensions/blender_org/brushstroke_tools/geomod.py @@ -0,0 +1,188 @@ +# SPDX-FileCopyrightText: 2025 Blender Studio Tools Authors +# +# SPDX-License-Identifier: GPL-3.0-or-later + +""" +Compatibility wrappers for the GeoNodes modifier input API. + +Blender 5.2 replaced dict-style custom-property access on GeoNodes modifiers +with proper RNA properties. All modifier input reads and writes in this add-on +go through these helpers so version branching stays in one place. + + Before 5.2: modifier["identifier"] = value + 5.2+: modifier.properties.inputs.identifier.value = value +""" + +from typing import Any +import bpy +from bpy.types import NodesModifier, UILayout, NodeTreeInterfaceSocket + + +_ICON_FOR_SOCKET = { + bpy.types.NodeTreeInterfaceSocketObject: 'OBJECT_DATA', + bpy.types.NodeTreeInterfaceSocketMaterial: 'MATERIAL', + bpy.types.NodeTreeInterfaceSocketImage: 'IMAGE_DATA', + bpy.types.NodeTreeInterfaceSocketCollection: 'OUTLINER_COLLECTION', +} + +_DATA_COLLECTION_FOR_SOCKET = { + bpy.types.NodeTreeInterfaceSocketMaterial: 'materials', + bpy.types.NodeTreeInterfaceSocketImage: 'images', + bpy.types.NodeTreeInterfaceSocketCollection: 'collections', +} + + +def get_value(mod: NodesModifier, identifier: str) -> Any: + if bpy.app.version >= (5, 2, 0): + return getattr(mod.properties.inputs, identifier).value + return mod[identifier] + + +def set_value(mod: NodesModifier, identifier: str, value: Any): + if bpy.app.version >= (5, 2, 0): + getattr(mod.properties.inputs, identifier).value = value + else: + prop_ui = mod.id_properties_ui(identifier).as_dict() + if 'items' in prop_ui.keys(): + for item in prop_ui['items']: + if item[0] == value: + mod[identifier] = item[4] + return + print(f"Error: Item '{value}' not found in menu '{identifier}' of modifier '{mod.name}'") + else: + mod[identifier] = value + + +def is_input_value_settable(mod: NodesModifier, identifier: str) -> bool: + """Return True if the modifier exposes a settable input with this identifier.""" + if bpy.app.version >= (5, 2, 0): + inp = getattr(mod.properties.inputs, identifier, None) + return inp is not None and hasattr(inp, 'value') + return identifier in mod.keys() + + +def can_input_be_attribute(mod: NodesModifier, identifier: str) -> bool: + """Return True if this input can be driven by an attribute field.""" + if bpy.app.version >= (5, 2, 0): + inp = getattr(mod.properties.inputs, identifier, None) + if inp is None or not hasattr(inp, 'type'): + return False + return any(item.identifier == 'ATTRIBUTE' + for item in inp.bl_rna.properties['type'].enum_items) + return f'{identifier}_use_attribute' in mod.keys() + + +def get_input_is_attribute(mod: NodesModifier, identifier: str) -> bool: + """Return True if this input is currently being driven by an attribute field.""" + if bpy.app.version >= (5, 2, 0): + return getattr(mod.properties.inputs, identifier).type == 'ATTRIBUTE' + return mod[f'{identifier}_use_attribute'] + + +def set_input_is_attribute(mod: NodesModifier, identifier: str, value: bool): + if bpy.app.version >= (5, 2, 0): + getattr(mod.properties.inputs, identifier).type = 'ATTRIBUTE' if value else 'VALUE' + else: + mod[f'{identifier}_use_attribute'] = value + + +def set_attribute_name(mod: NodesModifier, identifier: str, name: str): + if bpy.app.version >= (5, 2, 0): + getattr(mod.properties.inputs, identifier).attribute_name = name + else: + mod[f'{identifier}_attribute_name'] = name + + +def get_enum_value_to_compare(mod: NodesModifier, identifier: str) -> list[tuple[str, str | int]]: + """Return list of (identifier_str, comparable_value) pairs for a Menu socket. + The comparable_value matches whatever get_value() returns for the same socket: + an identifier string on 5.2+ (where .value is a string), an integer on older versions.""" + if bpy.app.version >= (5, 2, 0): + inp = getattr(mod.properties.inputs, identifier) + return [(item.identifier, item.identifier) + for item in inp.bl_rna.properties['value'].enum_items] + return [(item[0], item[4]) + for item in mod.id_properties_ui(identifier).as_dict()['items']] + + +def copy_inputs(source_mod: NodesModifier, target_mod: NodesModifier): + """Copy all GeoNodes input values (and attribute settings) between modifiers.""" + if bpy.app.version >= (5, 2, 0): + props = source_mod.properties + if not props: + return + target_props = target_mod.properties + for socket_name in props.inputs.keys(): + source_socket = getattr(props.inputs, socket_name, None) + target_socket = getattr(target_props.inputs, socket_name, None) + if source_socket and target_socket and hasattr(source_socket, "value"): + target_socket.value = source_socket.value + else: + for key, value in source_mod.items(): + try: + target_mod[key] = value + except (TypeError, ValueError): + target_mod[key] = type(target_mod[key])(value) + + +def draw_socket( + layout: UILayout, + mod: NodesModifier, + v: NodeTreeInterfaceSocket, + label: str, + is_preset: bool, +): + """Draw a GeoNodes input socket: value widget plus attribute toggle if supported.""" + if can_input_be_attribute(mod, v.identifier) and not v.force_non_field: + if get_input_is_attribute(mod, v.identifier): + _draw_attribute_name(layout, mod, v.identifier, text=label) + else: + _draw_input_simple(layout, mod, v.identifier, text=label) + operator_id = ('brushstroke_tools.preset_toggle_attribute' if is_preset + else 'brushstroke_tools.brushstrokes_toggle_attribute') + toggle = layout.operator(operator_id, text='', + depress=get_input_is_attribute(mod, v.identifier), + icon='SPREADSHEET') + toggle.modifier_name = mod.name + toggle.input_name = v.identifier + else: + socket_type = type(v) + icon = _ICON_FOR_SOCKET.get(socket_type, 'NONE') + search_prop = _DATA_COLLECTION_FOR_SOCKET.get(socket_type) + _draw_input_simple( + layout, mod, v.identifier, + search_prop=search_prop, + text=label, icon=icon, + ) + + +def _draw_attribute_name( + layout: UILayout, + mod: NodesModifier, + identifier: str, + **kwargs, +): + """Draw a modifier input's attribute-name field.""" + if bpy.app.version >= (5, 2, 0): + layout.prop(getattr(mod.properties.inputs, identifier), 'attribute_name', **kwargs) + else: + layout.prop(mod, f'["{identifier}_attribute_name"]', **kwargs) + + +def _draw_input_simple( + layout: UILayout, + mod: NodesModifier, + identifier: str, + search_prop: str | None = None, + **kwargs, +): + """Draw a modifier input value widget. + Pass search_prop for prop_search on Blender < 4.2. + Later versions use pointers, so no need for prop_search. + """ + if bpy.app.version >= (5, 2, 0): + layout.prop(getattr(mod.properties.inputs, identifier), 'value', **kwargs) + elif search_prop: + layout.prop_search(mod, f'["{identifier}"]', bpy.data, search_prop, **kwargs) + else: + layout.prop(mod, f'["{identifier}"]', **kwargs) diff --git a/extensions/blender_org/brushstroke_tools/ops.py b/extensions/blender_org/brushstroke_tools/ops.py index b2ba5f2..6af3f5b 100644 --- a/extensions/blender_org/brushstroke_tools/ops.py +++ b/extensions/blender_org/brushstroke_tools/ops.py @@ -4,7 +4,7 @@ import bpy import random -from . import utils, settings +from . import utils, settings, geomod import mathutils class BSBST_OT_new_brushstrokes(bpy.types.Operator): @@ -64,7 +64,7 @@ class BSBST_OT_new_brushstrokes(bpy.types.Operator): # link to surface object's collections (fall back to active collection if all are linked data) utils.link_to_collections_by_ref(flow_object, surface_object, unlink=False) - + visibility_options = [ 'visible_camera', 'visible_diffuse', @@ -85,8 +85,8 @@ class BSBST_OT_new_brushstrokes(bpy.types.Operator): utils.mark_socket_context_type(mod_info, 'Socket_2', 'SURFACE_OBJECT') - mod['Socket_2'] = surface_object - mod['Socket_3'] = False + geomod.set_value(mod, 'Socket_2', surface_object) + geomod.set_value(mod, 'Socket_3', False) utils.set_deformable(flow_object, settings.deforming_surface) utils.set_animated(flow_object, settings.animated) @@ -94,7 +94,7 @@ class BSBST_OT_new_brushstrokes(bpy.types.Operator): def main(self, context): settings = context.scene.BSBST_settings - + utils.ensure_resources() if not context.mode == 'OBJECT': bpy.ops.object.mode_set(mode='OBJECT') @@ -135,7 +135,7 @@ class BSBST_OT_new_brushstrokes(bpy.types.Operator): if not settings.preset_object: bpy.ops.brushstroke_tools.init_preset() - + # assign preset material preset_material = getattr(settings.preset_object, '["BSBST_material"]', None) @@ -153,7 +153,7 @@ class BSBST_OT_new_brushstrokes(bpy.types.Operator): # transfer preset modifiers to new brushstrokes TODO: refactor to deduplicate for mod in settings.preset_object.modifiers: utils.transfer_modifier(mod.name, brushstrokes_object, settings.preset_object) - + for v in mod.node_group.interface.items_tree.values(): if type(v) not in utils.linkable_sockets: continue @@ -161,25 +161,26 @@ class BSBST_OT_new_brushstrokes(bpy.types.Operator): continue # initialize linked context parameters link_context_type = settings.preset_object.modifier_info[mod.name].socket_info[v.identifier].link_context_type + bs_mod = brushstrokes_object.modifiers[mod.name] if link_context_type=='SURFACE_OBJECT': - brushstrokes_object.modifiers[mod.name][f'{v.identifier}'] = surface_object + geomod.set_value(bs_mod, v.identifier, surface_object) elif link_context_type=='FLOW_OBJECT': - brushstrokes_object.modifiers[mod.name][f'{v.identifier}'] = flow_object + geomod.set_value(bs_mod, v.identifier, flow_object) elif link_context_type=='MATERIAL': - brushstrokes_object.modifiers[mod.name][f'{v.identifier}'] = settings.context_material + geomod.set_value(bs_mod, v.identifier, settings.context_material) elif link_context_type=='UVMAP': - if type(brushstrokes_object.modifiers[mod.name][f'{v.identifier}']) == str: - brushstrokes_object.modifiers[mod.name][f'{v.identifier}'] = surface_object.data.uv_layers.active.name + if isinstance(geomod.get_value(bs_mod, v.identifier), str): + geomod.set_value(bs_mod, v.identifier, surface_object.data.uv_layers.active.name) else: - brushstrokes_object.modifiers[mod.name][f'{v.identifier}_use_attribute'] = True - brushstrokes_object.modifiers[mod.name][f'{v.identifier}_attribute_name'] = surface_object.data.uv_layers.active.name + geomod.set_input_is_attribute(bs_mod, v.identifier, True) + geomod.set_attribute_name(bs_mod, v.identifier, surface_object.data.uv_layers.active.name) elif link_context_type=='RANDOM': vmin = v.min_value vmax = v.max_value val = vmin + random.random() * (vmax - vmin) - brushstrokes_object.modifiers[mod.name][f'{v.identifier}_use_attribute'] = False - brushstrokes_object.modifiers[mod.name][f'{v.identifier}'] = type(brushstrokes_object.modifiers[mod.name][f'{v.identifier}'])(val) - + geomod.set_input_is_attribute(bs_mod, v.identifier, False) + geomod.set_value(bs_mod, v.identifier, type(geomod.get_value(bs_mod, v.identifier))(val)) + # transfer modifier info data from preset to brush strokes utils.deep_copy_mod_info(settings.preset_object, brushstrokes_object) @@ -195,14 +196,14 @@ class BSBST_OT_new_brushstrokes(bpy.types.Operator): mod = brushstrokes_object.modifiers['Brushstrokes'] if settings.brushstroke_method == 'SURFACE_FILL': # set density - mod['Socket_7'] = utils.round_n((1000 / surf_est) ** 0.5, 2) + geomod.set_value(mod, 'Socket_7', utils.round_n((1000 / surf_est) ** 0.5, 2)) # set length - mod['Socket_11'] = utils.round_n(bb_radius * 0.5, 2) + geomod.set_value(mod, 'Socket_11', utils.round_n(bb_radius * 0.5, 2)) # set width - mod['Socket_13'] = utils.round_n(bb_radius * 0.05, 2) + geomod.set_value(mod, 'Socket_13', utils.round_n(bb_radius * 0.05, 2)) elif settings.brushstroke_method == 'SURFACE_DRAW': # set width - mod['Socket_5'] = utils.round_n(bb_radius * 0.05, 2) + geomod.set_value(mod, 'Socket_5', utils.round_n(bb_radius * 0.05, 2)) # refresh UI for mod in brushstrokes_object.modifiers: @@ -213,7 +214,7 @@ class BSBST_OT_new_brushstrokes(bpy.types.Operator): for v in mod.node_group.interface.items_tree.values(): if type(v) != bpy.types.NodeTreeInterfaceSocketMaterial: continue - mat = mod[v.identifier] + mat = geomod.get_value(mod, v.identifier) if not mat: continue if mat in [m_slot.material for m_slot in brushstrokes_object.material_slots]: @@ -223,13 +224,13 @@ class BSBST_OT_new_brushstrokes(bpy.types.Operator): with context.temp_override(**override): bpy.ops.object.material_slot_add() brushstrokes_object.material_slots[-1].material = mat - + # set deformable set_brushstrokes_deformable(brushstrokes_object, settings.deforming_surface) - + # set animated set_brushstrokes_animated(brushstrokes_object, settings.animated) - + for mod in brushstrokes_object.modifiers: mod.show_group_selector = False @@ -239,7 +240,7 @@ class BSBST_OT_new_brushstrokes(bpy.types.Operator): if name == brushstrokes_object.name: settings.active_context_brushstrokes_index = i break - + utils.edit_active_brushstrokes(context) return {"FINISHED"} @@ -247,10 +248,10 @@ class BSBST_OT_new_brushstrokes(bpy.types.Operator): settings = context.scene.BSBST_settings settings.silent_switch = True state = self.main(context) - + settings.silent_switch = False return state - + class BSBST_OT_edit_brushstrokes(bpy.types.Operator): """ Enter the editing context for the active context brushstrokes. @@ -269,10 +270,10 @@ class BSBST_OT_edit_brushstrokes(bpy.types.Operator): settings = context.scene.BSBST_settings settings.silent_switch = True state = utils.edit_active_brushstrokes(context) - + settings.silent_switch = False return state - + class BSBST_OT_delete_brushstrokes(bpy.types.Operator): """ Delete the active context brushstrokes @@ -324,7 +325,7 @@ class BSBST_OT_delete_brushstrokes(bpy.types.Operator): settings.edit_toggle = edit_toggle return {'FINISHED'} - + class BSBST_OT_duplicate_brushstrokes(bpy.types.Operator): """ Duplicate the active context brushstrokes @@ -345,7 +346,7 @@ class BSBST_OT_duplicate_brushstrokes(bpy.types.Operator): bs_ob = utils.get_active_context_brushstrokes_object(context.scene) if not bs_ob: return {"CANCELLED"} - + if not bs_ob.visible_get(view_layer=context.view_layer): self.report({"WARNING"}, f"Skipped Brushstroke layer '{bs_ob.name}' because it is invisible in this context") return {"CANCELLED"} @@ -354,7 +355,7 @@ class BSBST_OT_duplicate_brushstrokes(bpy.types.Operator): if context.mode != 'OBJECT': bpy.ops.object.mode_set(mode='OBJECT') - + bpy.context.view_layer.objects.active = bs_ob if context.mode != 'OBJECT': bpy.ops.object.mode_set(mode='OBJECT') @@ -371,7 +372,7 @@ class BSBST_OT_duplicate_brushstrokes(bpy.types.Operator): if not mod.type=='NODES': continue if not mod.node_group: - continue + continue for v in mod.node_group.interface.items_tree.values(): if type(v) not in utils.linkable_sockets: continue @@ -383,7 +384,7 @@ class BSBST_OT_duplicate_brushstrokes(bpy.types.Operator): vmin = v.min_value vmax = v.max_value val = vmin + random.random() * (vmax - vmin) - mod[f'{v.identifier}'] = type(ob.modifiers[mod.name][f'{v.identifier}'])(val) + geomod.set_value(mod, v.identifier, type(geomod.get_value(mod, v.identifier))(val)) return {'FINISHED'} @@ -459,7 +460,7 @@ class BSBST_OT_copy_brushstrokes(bpy.types.Operator): ob.parent = surface_object utils.set_surface_object(ob, surface_object) - + for mod in ob.modifiers: if not mod.type: continue @@ -475,27 +476,28 @@ class BSBST_OT_copy_brushstrokes(bpy.types.Operator): continue # re-initialize linked context parameters link_context_type = ob.modifier_info[mod.name].socket_info[v.identifier].link_context_type + ob_mod = ob.modifiers[mod.name] if link_context_type=='SURFACE_OBJECT': - ob.modifiers[mod.name][f'{v.identifier}'] = surface_object + geomod.set_value(ob_mod, v.identifier, surface_object) elif link_context_type=='UVMAP': - if type(ob.modifiers[mod.name][f'{v.identifier}']) == str: - ob.modifiers[mod.name][f'{v.identifier}'] = surface_object.data.uv_layers.active.name + if isinstance(geomod.get_value(ob_mod, v.identifier), str): + geomod.set_value(ob_mod, v.identifier, surface_object.data.uv_layers.active.name) else: - ob.modifiers[mod.name][f'{v.identifier}_use_attribute'] = True - ob.modifiers[mod.name][f'{v.identifier}_attribute_name'] = surface_object.data.uv_layers.active.name + geomod.set_input_is_attribute(ob_mod, v.identifier, True) + geomod.set_attribute_name(ob_mod, v.identifier, surface_object.data.uv_layers.active.name) elif link_context_type=='RANDOM': vmin = v.min_value vmax = v.max_value val = vmin + random.random() * (vmax - vmin) - ob.modifiers[mod.name][f'{v.identifier}_use_attribute'] = False - ob.modifiers[mod.name][f'{v.identifier}'] = type(ob.modifiers[mod.name][f'{v.identifier}'])(val) - + geomod.set_input_is_attribute(ob_mod, v.identifier, False) + geomod.set_value(ob_mod, v.identifier, type(geomod.get_value(ob_mod, v.identifier))(val)) + # enable rest position surface_object.add_rest_position_attribute = True return {'FINISHED'} - + class BSBST_OT_select_surface(bpy.types.Operator): """ Select the surface object for the active context brushstrokes. @@ -547,7 +549,7 @@ class BSBST_OT_assign_surface(bpy.types.Operator): bs_ob = utils.get_active_context_brushstrokes_object(context.scene) if not bs_ob: return {"CANCELLED"} - + surface_object = bpy.data.objects.get(self.surface_object) if not surface_object: @@ -577,11 +579,11 @@ def set_brushstrokes_deformable(bs_ob, deformable): if not mod.node_group: continue if mod.node_group.name == '.brushstroke_tools.pre_processing': - mod['Socket_3'] = deformable + geomod.set_value(mod, 'Socket_3', deformable) elif mod.node_group.name == '.brushstroke_tools.surface_fill': - mod['Socket_27'] = deformable + geomod.set_value(mod, 'Socket_27', deformable) elif mod.node_group.name == '.brushstroke_tools.surface_draw': - mod['Socket_15'] = deformable + geomod.set_value(mod, 'Socket_15', deformable) mod.node_group.interface_update(bpy.context) utils.set_deformable(bs_ob, deformable) @@ -601,7 +603,7 @@ def set_brushstrokes_animated(bs_ob, animated): if not mod: mod = ob.modifiers.new('Animation', 'NODES') mod.node_group = utils.ensure_node_group('.brushstroke_tools.animation') - + mod_info = ob.modifier_info.get(mod.name) if not mod_info: mod_info = ob.modifier_info.add() @@ -610,7 +612,7 @@ def set_brushstrokes_animated(bs_ob, animated): # ui visibility settings mod_info.hide_ui = True else: - mod['Socket_5'] = True + geomod.set_value(mod, 'Socket_5', True) mod.node_group.interface_update(bpy.context) with bpy.context.temp_override(object=ob): bpy.ops.object.modifier_move_to_index(modifier=mod.name, index=0) @@ -632,7 +634,7 @@ class BSBST_OT_copy_flow(bpy.types.Operator): source_bs: bpy.props.StringProperty(name="Brushstroke Layers") bs_list: bpy.props.CollectionProperty(type=settings.BSBST_context_brushstrokes) - + @classmethod def poll(cls, context): settings = context.scene.BSBST_settings @@ -643,7 +645,7 @@ class BSBST_OT_copy_flow(bpy.types.Operator): flow_ob_old = utils.get_flow_object(bs_ob) if not bs_ob: return {"CANCELLED"} - + # get source source_ob = bpy.data.objects.get(self.source_bs) @@ -738,7 +740,7 @@ class BSBST_OT_switch_deformable(bpy.types.Operator): if ob.type == 'GREASEPENCIL': self.report({"WARNING"}, "Grease Pencil does not currently support drawing on deformable surface geometry.") set_brushstrokes_deformable(ob, self.deformable) - + context.view_layer.depsgraph.update() return {"FINISHED"} @@ -775,11 +777,11 @@ class BSBST_OT_switch_animated(bpy.types.Operator): for ob in bs_objects: set_brushstrokes_animated(ob, self.animated) - + context.view_layer.depsgraph.update() return {"FINISHED"} - + class BSBST_OT_init_preset(bpy.types.Operator): """ Initialize the preset to define a modifier stack applied to new brushstrokess. @@ -793,7 +795,7 @@ class BSBST_OT_init_preset(bpy.types.Operator): def poll(cls, context): settings = context.scene.BSBST_settings return settings.preset_object is None - + def init_fill(self, context): settings = context.scene.BSBST_settings @@ -803,7 +805,7 @@ class BSBST_OT_init_preset(bpy.types.Operator): ## input mod = preset_object.modifiers.new('Surface Input', 'NODES') mod.node_group = bpy.data.node_groups['.brushstroke_tools.geometry_input'] - + mod_info = settings.preset_object.modifier_info.get(mod.name) if not mod_info: mod_info = settings.preset_object.modifier_info.add() @@ -820,7 +822,7 @@ class BSBST_OT_init_preset(bpy.types.Operator): ## masking mod = preset_object.modifiers.new('Masking', 'NODES') mod.node_group = bpy.data.node_groups['.brushstroke_tools.mask_surface'] - + mod_info = settings.preset_object.modifier_info.get(mod.name) if not mod_info: mod_info = settings.preset_object.modifier_info.add() @@ -838,7 +840,7 @@ class BSBST_OT_init_preset(bpy.types.Operator): ## brushstrokes mod = preset_object.modifiers.new('Brushstrokes', 'NODES') mod.node_group = bpy.data.node_groups['.brushstroke_tools.surface_fill'] - + mod_info = settings.preset_object.modifier_info.get(mod.name) if not mod_info: mod_info = settings.preset_object.modifier_info.add() @@ -846,7 +848,7 @@ class BSBST_OT_init_preset(bpy.types.Operator): # set fill custom defaults - mod['Socket_59'] = 1 # color method: curves + geomod.set_value(mod, 'Socket_59', 'Curves') # color method: curves # context link settings utils.mark_socket_context_type(mod_info, 'Socket_2', 'FLOW_OBJECT') @@ -879,7 +881,7 @@ class BSBST_OT_init_preset(bpy.types.Operator): ] for p in hide_panels: utils.mark_panel_hidden(mod_info, p) - + def init_draw(self, context): settings = context.scene.BSBST_settings @@ -889,7 +891,7 @@ class BSBST_OT_init_preset(bpy.types.Operator): ## add pre-processing modifier mod = preset_object.modifiers.new('Pre-Processing', 'NODES') mod.node_group = bpy.data.node_groups['.brushstroke_tools.pre_processing'] - + mod_info = settings.preset_object.modifier_info.get(mod.name) if not mod_info: mod_info = settings.preset_object.modifier_info.add() @@ -903,7 +905,7 @@ class BSBST_OT_init_preset(bpy.types.Operator): ## brushstrokes mod = preset_object.modifiers.new('Brushstrokes', 'NODES') mod.node_group = bpy.data.node_groups['.brushstroke_tools.surface_draw'] - + mod_info = settings.preset_object.modifier_info.get(mod.name) if not mod_info: mod_info = settings.preset_object.modifier_info.add() @@ -937,7 +939,7 @@ class BSBST_OT_init_preset(bpy.types.Operator): def execute(self, context): settings = context.scene.BSBST_settings - + utils.ensure_resources() preset_name = f'BSBST-PRESET_{settings.brushstroke_method}' preset_object = bpy.data.objects.new(preset_name, bpy.data.hair_curves.new(preset_name)) @@ -947,7 +949,7 @@ class BSBST_OT_init_preset(bpy.types.Operator): self.init_fill(context) elif settings.brushstroke_method == "SURFACE_DRAW": self.init_draw(context) - + # select preset material mat = bpy.data.materials.get('Brush Material') if not mat: @@ -982,7 +984,7 @@ class BSBST_OT_make_preset(bpy.types.Operator): else: for mod in settings.preset_object.modifiers[:]: settings.preset_object.modifiers.remove(mod) - + # transfer brushstrokes modifiers to preset bs_ob = utils.get_active_context_brushstrokes_object(context.scene) if not bs_ob: @@ -994,7 +996,7 @@ class BSBST_OT_make_preset(bpy.types.Operator): for mod in settings.preset_object.modifiers: # refresh UI mod.node_group.interface_update(context) - + # identify linked sockets for v in mod.node_group.interface.items_tree.values(): if type(v) not in utils.linkable_sockets: @@ -1002,8 +1004,8 @@ class BSBST_OT_make_preset(bpy.types.Operator): if not settings.preset_object.modifier_info[mod.name].socket_info[v.identifier]: continue if type(v) == bpy.types.NodeTreeInterfaceSocketObject: - if bs_ob['BSBST_surface_object']==mod[v.identifier]: - mod[v.identifier] = None + if bs_ob['BSBST_surface_object']==geomod.get_value(mod, v.identifier): + geomod.set_value(mod, v.identifier, None) settings.preset_object.modifier_info[mod.name].socket_info[v.identifier].link_context = True elif type(v) == bpy.types.NodeTreeInterfaceSocketMaterial: pass # TODO: figure out material preset linking @@ -1109,14 +1111,14 @@ class BSBST_OT_brushstrokes_toggle_attribute(bpy.types.Operator): if not bs_ob: settings.edit_toggle = edit_toggle return {"CANCELLED"} - + override = context.copy() override['object'] = bs_ob with context.temp_override(**override): bpy.ops.object.geometry_nodes_input_attribute_toggle(input_name=self.input_name, modifier_name=self.modifier_name) return {"FINISHED"} - + class BSBST_OT_render_setup(bpy.types.Operator): """ Set up render settings. @@ -1165,7 +1167,7 @@ class BSBST_OT_render_setup(bpy.types.Operator): def invoke(self, context, event): return context.window_manager.invoke_props_dialog(self) - + class BSBST_OT_view_all(bpy.types.Operator): """ Enable/disable all brushstrokes for the viewport. @@ -1299,11 +1301,11 @@ class BSBST_OT_select_brush_style(bpy.types.Operator): if bs.name == settings.context_material.brush_style: self.brush_styles_filtered_active_index = i break - + self.name_filter = '' return context.window_manager.invoke_props_dialog(self, width=450) - + class BSBST_OT_upgrade_resources(bpy.types.Operator): """ Upgrade all local BST assets to available addon resources. """ @@ -1331,12 +1333,12 @@ class BSBST_OT_upgrade_resources(bpy.types.Operator): layout = self.layout split = layout.split(factor=.6) - + col = split.column() col.prop(self, 'upgrade_shape_modifiers', icon='MODIFIER') col.prop(self, 'upgrade_materials', icon='MATERIAL') col.prop(self, 'upgrade_brush_styles', icon='BRUSHES_ALL') - + col = split.column() row = col.row() row.active = self.upgrade_shape_modifiers @@ -1422,8 +1424,8 @@ classes = [ def register(): for c in classes: - bpy.utils.register_class(c) + bpy.utils.register_class(c) def unregister(): for c in reversed(classes): - bpy.utils.unregister_class(c) \ No newline at end of file + bpy.utils.unregister_class(c) diff --git a/extensions/blender_org/brushstroke_tools/ui.py b/extensions/blender_org/brushstroke_tools/ui.py index 14ac107..8ef8652 100644 --- a/extensions/blender_org/brushstroke_tools/ui.py +++ b/extensions/blender_org/brushstroke_tools/ui.py @@ -3,8 +3,15 @@ # SPDX-License-Identifier: GPL-3.0-or-later import bpy -from . import utils +from . import utils, geomod from . import settings as settings_py +from bpy.types import ( + UILayout, + NodesModifier, + NodeTreeInterfaceItem, + NodeTreeInterfacePanel, + NodeTreeInterfaceSocketMenu, +) warning_icons_dict = { 'ERROR': 'CANCEL', @@ -12,133 +19,92 @@ warning_icons_dict = { 'INFO': 'INFO', } -def draw_panel_ui_recursive(panel, panel_name, mod, items, display_mode, hide_panel=False): - - scene = bpy.context.scene - settings = scene.BSBST_settings - - is_preset = mod.id_data == settings.preset_object and mod.id_data - +def draw_panel_ui_recursive( + panel: UILayout | None, + panel_name: str, + mod: NodesModifier, + interface_items: tuple[str, NodeTreeInterfaceItem], + display_mode: int, + hide_panel: bool = False, +): if not panel: return - + mod_info = mod.id_data.modifier_info.get(mod.name) - - icon_dict = { - bpy.types.NodeTreeInterfaceSocketObject: 'OBJECT_DATA', - bpy.types.NodeTreeInterfaceSocketMaterial: 'MATERIAL', - bpy.types.NodeTreeInterfaceSocketImage: 'IMAGE_DATA', - bpy.types.NodeTreeInterfaceSocketCollection: 'OUTLINER_COLLECTION', - } + if not mod_info: + return - data_dict = { - bpy.types.NodeTreeInterfaceSocketMaterial: 'materials', - bpy.types.NodeTreeInterfaceSocketImage: 'images', - bpy.types.NodeTreeInterfaceSocketCollection: 'collections', - } + panel_active = not (mod_info.hide_ui or hide_panel) + inactive_mode_names: list[str] = [] - mode_compare = [] - for k, v in items: - if not v.parent.name == panel_name: + for name, interface_item in interface_items: + if interface_item.parent.name != panel_name: continue - if type(v) == bpy.types.NodeTreeInterfacePanel: - v_id = f'Panel_{v.index}' # TODO: replace with panel identifier once that is exposed in Blender 4.3 - - if not mod_info: + if isinstance(interface_item, NodeTreeInterfacePanel): + panel_id = f'Panel_{interface_item.index}' # TODO: replace with panel identifier once exposed in Blender 4.3 + socket_info = mod_info.socket_info.get(panel_id) + if not socket_info: continue - s = mod_info.socket_info.get(v_id) - if not s: + if display_mode == 0 and socket_info.hide_ui: continue - if display_mode == 0: - if s.hide_ui: - continue - subpanel_header, subpanel = panel.panel(k, default_closed = v.default_closed) - subpanel_header.label(text=k) + subpanel_header, subpanel = panel.panel(name, default_closed=interface_item.default_closed) + subpanel_header.label(text=name) if display_mode != 0: col = subpanel_header.column() - col.active = not (mod_info.hide_ui or hide_panel) - col.prop(s, 'hide_ui', icon_only=True, icon='UNPINNED' if s.hide_ui else 'PINNED', emboss=False) - draw_panel_ui_recursive(subpanel, k, mod, v.interface_items.items(), display_mode, s.hide_ui) - mode_compare = [] + col.active = panel_active + col.prop(socket_info, 'hide_ui', icon_only=True, + icon='UNPINNED' if socket_info.hide_ui else 'PINNED', emboss=False) + draw_panel_ui_recursive(subpanel, name, mod, interface_item.interface_items.items(), display_mode, socket_info.hide_ui) + inactive_mode_names = [] else: - if v.parent.name != panel_name: + if not geomod.is_input_value_settable(mod, interface_item.identifier): continue - if f'{v.identifier}' not in mod.keys(): - continue - if not mod_info: + socket_info = mod_info.socket_info.get(interface_item.identifier) + if not socket_info: continue - if type(v) == bpy.types.NodeTreeInterfaceSocketMenu: - for item in mod.id_properties_ui(f'{v.identifier}').as_dict()['items']: - if item[4] == mod[f'{v.identifier}']: - continue - mode_compare += [item[0]] + if isinstance(interface_item, NodeTreeInterfaceSocketMenu): + current_value = geomod.get_value(mod, interface_item.identifier) + inactive_mode_names += [ + mode_id for mode_id, mode_value + in geomod.get_enum_value_to_compare(mod, interface_item.identifier) + if mode_value != current_value + ] - s = mod_info.socket_info.get(v.identifier) - if not s: - continue if display_mode == 0: - comp_match = False - for c in mode_compare: - comp_match = c in v.name - if comp_match: - break - if comp_match: + if socket_info.hide_ui: continue - if s.hide_ui: + if any(mode_name in interface_item.name for mode_name in inactive_mode_names): continue + row = panel.row(align=True) - row.active = not (mod_info.hide_ui or hide_panel or s.hide_ui) + row.active = not (mod_info.hide_ui or hide_panel or socket_info.hide_ui) col = row.column() - input_row = col.row(align=True) - attribute_toggle = False - if f'{v.identifier}_use_attribute' in mod.keys() and not v.force_non_field: - attribute_toggle = mod[f'{v.identifier}_use_attribute'] - if attribute_toggle: - input_row.prop(mod, f'["{v.identifier}_attribute_name"]', text=k) - else: - input_row.prop(mod, f'["{v.identifier}"]', text=k) - if is_preset: - toggle = input_row.operator('brushstroke_tools.preset_toggle_attribute', - text='', - depress=mod[f'{v.identifier}_use_attribute'], - icon='SPREADSHEET') - else: - toggle = input_row.operator('brushstroke_tools.brushstrokes_toggle_attribute', - text='', - depress=mod[f'{v.identifier}_use_attribute'], - icon='SPREADSHEET') - toggle.modifier_name = mod.name - toggle.input_name = v.identifier - else: - if type(v) in icon_dict.keys(): - icon = icon_dict[type(v)] - else: - icon='NONE' - if type(v) in data_dict.keys(): - input_row.prop_search(mod, f'["{v.identifier}"]', bpy.data, data_dict[type(v)], text=k, icon=icon) - else: - input_row.prop(mod, f'["{v.identifier}"]', text=k, icon=icon) - if type(v) in utils.linkable_sockets: - col.active = not s.link_context - icon = settings_py.icon_from_link_type(s.link_context_type) + settings = bpy.context.scene.BSBST_settings + is_preset = bool(mod.id_data and mod.id_data == settings.preset_object) + geomod.draw_socket(col.row(align=True), mod, interface_item, name, is_preset) + + if type(interface_item) in utils.linkable_sockets: + col.active = not socket_info.link_context row.alignment = 'EXPAND' - if s.link_context: - row.prop(s, 'link_context', text='', icon_value=icon) - else: - if display_mode == -1: - row.prop(s, 'link_context_type', text='', emboss=True, icon='LINKED', icon_only=True) + if socket_info.link_context: + row.prop(socket_info, 'link_context', text='', + icon_value=settings_py.icon_from_link_type(socket_info.link_context_type)) + elif display_mode == -1: + row.prop(socket_info, 'link_context_type', text='', emboss=True, icon='LINKED', icon_only=True) + if display_mode != 0: col = row.column() - col.active = not (mod_info.hide_ui or hide_panel) - col.prop(s, 'hide_ui', icon_only=True, icon='UNPINNED' if s.hide_ui else 'PINNED', emboss=False) + col.active = panel_active + icon = 'UNPINNED' if socket_info.hide_ui else 'PINNED' + col.prop(socket_info, 'hide_ui', icon_only=True, icon=icon, emboss=False) -def draw_material_settings(layout, material, surface_object=None): - addon_prefs = bpy.context.preferences.addons[__package__].preferences - settings = bpy.context.scene.BSBST_settings +def draw_material_settings(context, layout, material, surface_object=None): + addon_prefs = context.preferences.addons[__package__].preferences + settings = context.scene.BSBST_settings material_row = layout.row(align=True) material_row.template_ID(settings, 'context_material') @@ -298,7 +264,7 @@ def draw_effect_panel_recursive(effects_panel, material, prev_node): panel.active = False for input in node.inputs[1:]: panel.prop(input, 'default_value', text=input.name) - + draw_effect_panel_recursive(effects_panel, material, node) def draw_advanced_settings(layout, settings): @@ -309,7 +275,7 @@ def draw_advanced_settings(layout, settings): new_advanced_panel.row().prop(settings, 'curve_mode', expand=True) if settings.curve_mode in ['CURVE', 'GP']: new_advanced_panel.label(text='Curve mode does not support drawing on deformed geometry', icon='ERROR') - + new_advanced_panel.prop(settings, 'animated') new_advanced_panel.prop(settings, 'deforming_surface') new_advanced_panel.prop(settings, 'assign_materials') @@ -329,7 +295,7 @@ def draw_shape_properties(layout, settings, style_object, is_preset, display_mod if display_mode == 0: if mod_info.hide_ui: continue - + mod_header, mod_panel = layout.panel(mod.name, default_closed = mod_info.default_closed) row = mod_header.row(align=True) row.label(text='', icon='GEOMETRY_NODES') @@ -362,12 +328,12 @@ def draw_shape_properties(layout, settings, style_object, is_preset, display_mod mod, mod.node_group.interface.items_tree.items(), display_mode) - + draw_mod_warnings(layout, mod) -def draw_material_properties(layout, settings, surface_object): +def draw_material_properties(context, layout, settings, surface_object): if settings.context_material: - draw_material_settings(layout, settings.context_material, surface_object=surface_object) + draw_material_settings(context, layout, settings.context_material, surface_object=surface_object) else: material_row = layout.row(align=True) material_row.template_ID(settings, 'context_material', new='brushstroke_tools.new_material') @@ -383,7 +349,7 @@ def draw_settings_properties(layout, settings, style_object): layout.prop(style_object, 'visible_shadow', icon='LIGHT', emboss=True) -def draw_properties_panel(layout, settings, style_object, surface_object, is_preset, display_mode): +def draw_properties_panel(context, layout, settings, style_object, surface_object, is_preset, display_mode): layout.separator(type='LINE') row = layout.row(align=True) @@ -391,7 +357,7 @@ def draw_properties_panel(layout, settings, style_object, surface_object, is_pre layout.separator(factor=.0, type='SPACE') if settings.view_tab == 'MATERIAL': - draw_material_properties(layout, settings, surface_object) + draw_material_properties(context, layout, settings, surface_object) elif settings.view_tab == 'SHAPE': draw_shape_properties(layout, settings, style_object, is_preset, display_mode) @@ -441,7 +407,7 @@ class BSBST_MT_bs_context_menu(bpy.types.Menu): def draw(self, _context): layout = self.layout - + op = layout.operator('brushstroke_tools.copy_brushstrokes', text='Copy to Selected Objects') op.copy_all = False @@ -545,7 +511,7 @@ class BSBST_PT_brushstroke_tools_panel(bpy.types.Panel): if not settings.preset_object and is_preset: layout.operator("brushstroke_tools.init_preset", icon='MODIFIER') else: - draw_properties_panel(style_panel, settings, style_object, surface_object, is_preset, display_mode) + draw_properties_panel(context, style_panel, settings, style_object, surface_object, is_preset, display_mode) class BSBST_MT_PIE_brushstroke_data_marking(bpy.types.Menu): bl_idname= "BSBST_MT_PIE_brushstroke_data_marking" @@ -607,7 +573,7 @@ def register(): wm = bpy.context.window_manager if wm.keyconfigs.addon is not None: km = wm.keyconfigs.addon.keymaps.new(name="Mesh") - kmi = km.keymap_items.new("brushstroke_tools.data_marking","F", "PRESS",shift=False, ctrl=True, alt=True) + kmi = km.keymap_items.new("brushstroke_tools.data_marking","F", "PRESS",shift=False, ctrl=True, alt=True) def unregister(): for c in reversed(classes): diff --git a/extensions/blender_org/brushstroke_tools/utils.py b/extensions/blender_org/brushstroke_tools/utils.py index 9365414..50a8d4c 100644 --- a/extensions/blender_org/brushstroke_tools/utils.py +++ b/extensions/blender_org/brushstroke_tools/utils.py @@ -10,6 +10,7 @@ from bpy.app.handlers import persistent import math, shutil, errno, numpy from bpy.app.handlers import persistent from mathutils import Vector +from . import geomod addon_version = (0,0,0) @@ -36,6 +37,7 @@ linkable_sockets = [ asset_lib_name = 'Brushstroke Tools Library' + @persistent def find_context_brushstrokes(scene, depsgraph): settings = scene.BSBST_settings @@ -178,7 +180,7 @@ def set_brushstroke_material(ob, material): continue if not s.link_context_type == 'MATERIAL': continue - mod[s.name] = material + geomod.set_value(mod, s.name, material) ob.update_tag() if ob.type == 'EMPTY': @@ -655,11 +657,7 @@ def transfer_modifier(modifier_name, target_obj, source_obj): if source_mod.type == 'NODES': # Transfer geo node attributes - for key, value in source_mod.items(): - try: - target_mod[key] = value - except (TypeError, ValueError) as e: - target_mod[key] = type(target_mod[key])(value) + geomod.copy_inputs(source_mod, target_mod) # Transfer geo node bake settings target_mod.bake_directory = source_mod.bake_directory @@ -744,7 +742,7 @@ def set_surface_object(bs, surf_ob): continue if not s.link_context_type == 'SURFACE_OBJECT': continue - mod[s.name] = surf_ob + geomod.set_value(mod, s.name, surf_ob) ob.parent = surf_ob ob.parent_type = 'OBJECT' surf_ob.update_tag() @@ -775,7 +773,7 @@ def set_flow_object(bs, ob): continue if not s.link_context_type == 'FLOW_OBJECT': continue - mod[s.name] = ob + geomod.set_value(mod, s.name, ob) ob.update_tag() bs['BSBST_flow_object'] = ob @@ -1106,8 +1104,18 @@ def match_mat(tgt_mat, src_mat): for attr_path in path_list: try: - exec(f'tgt_mat.{attr_path} = src_mat.{attr_path}') + path_parts = attr_path.replace("'", '"').split('.') + attr_name = path_parts[-1] + item_path = ".".join(path_parts[:-1]) + if item_path: + tgt_item = tgt_mat.path_resolve(item_path) + src_item = src_mat.path_resolve(item_path) + else: + tgt_item = tgt_mat + src_item = src_mat + setattr(tgt_item, attr_name, getattr(src_item, attr_name)) except: + print(f"Could not copy attribute '{attr_path}' on material '{tgt_mat.name}'") pass tgt_curve_node = tgt_mat.node_tree.nodes.get('Brush Curve') diff --git a/extensions/blender_org/datablock_utils/blender_manifest.toml b/extensions/blender_org/datablock_utils/blender_manifest.toml index 08149a3..118cd97 100644 --- a/extensions/blender_org/datablock_utils/blender_manifest.toml +++ b/extensions/blender_org/datablock_utils/blender_manifest.toml @@ -1,6 +1,6 @@ schema_version = "1.0.0" id = "datablock_utils" -version = "1.3.0" +version = "1.3.2" name = "Data-Block Utilities" tagline = "Show users, merge duplicates, find similar, and more" maintainer = "Leonardo Pike-Excell " diff --git a/extensions/blender_org/datablock_utils/constants.py b/extensions/blender_org/datablock_utils/constants.py index ff275f5..2cb06f4 100644 --- a/extensions/blender_org/datablock_utils/constants.py +++ b/extensions/blender_org/datablock_utils/constants.py @@ -49,6 +49,8 @@ def _generate_id_types() -> dict[str, IDType]: if bpy.app.version >= (4, 3, 0): if bpy.app.version >= (5, 0, 0): collections.remove(next(c for c in collections if c.identifier == 'annotations')) + if bpy.app.version >= (5, 2, 0): + collections.remove(next(c for c in collections if c.identifier == 'all_ids')) _assign('CURVES', 'hair_curves', enums, collections) if bpy.app.version >= (5, 0, 0): _assign('GREASEPENCIL', 'grease_pencils', enums, collections, remove=False) diff --git a/extensions/blender_org/datablock_utils/operators/find_similar.py b/extensions/blender_org/datablock_utils/operators/find_similar.py index b57c679..112ff7b 100644 --- a/extensions/blender_org/datablock_utils/operators/find_similar.py +++ b/extensions/blender_org/datablock_utils/operators/find_similar.py @@ -24,6 +24,10 @@ def get_settings() -> DBU_PG_FindSimilarSettings: return bpy.context.scene.dbu_similar_settings # type: ignore +def is_local_id(id_data: bpy.types.ID) -> bool: + return not id_data.library and not id_data.override_library + + def get_invalid_nodes(ntree: NodeTree) -> set[Node]: settings = get_settings() invalid_nodes = set() @@ -100,6 +104,24 @@ def get_image_props(img: bpy.types.Image) -> tuple[Any, ...]: ) +def get_light_props(light: bpy.types.Light) -> tuple[Any, ...]: + props: list[Any] = [ + tuple(light.color), + light.energy, + light.exposure, + light.use_shadow, + light.normalize, + ] + match light.type: + case 'AREA': + props.extend((light.size, light.size_y, light.shape)) + case 'SPOT': + props.extend((light.spot_size, light.spot_blend)) + case 'SUN': + props.append(light.angle) + return tuple(props) + + @dataclass(slots=True) class NodeProperties: id_data: Node | NodeTree @@ -218,7 +240,7 @@ def contents_of_ntrees( ) -> defaultdict[str, list[NodeProperties]]: content_map = defaultdict(list) for id_data in bl_data: - if id_data.library or (not isinstance(id_data, NodeTree) and not id_data.use_nodes): + if not is_local_id(id_data) or (not isinstance(id_data, NodeTree) and not id_data.use_nodes): continue ntree = id_data if isinstance(id_data, NodeTree) else id_data.node_tree @@ -238,6 +260,9 @@ def contents_of_ntrees( tuple(p) if isinstance(p, bpy.types.bpy_prop_array) else p for p in props] contents.append(props) + if isinstance(id_data, bpy.types.Light) and bpy.app.version >= (5, 1, 0): + contents.append(NodeProperties(id_data, ['LIGHT PROPS', *get_light_props(id_data)])) + if not isinstance(id_data, NodeTree): continue @@ -403,7 +428,7 @@ def find_similar_and_duplicate_ntrees(id_type: str) -> None: def find_duplicate_images() -> None: duplicates = [] - images = [i for i in bpy.data.images if not i.library] + images = [i for i in bpy.data.images if is_local_id(i)] images.sort(key=get_image_props) for _, raw_group in groupby(images, get_image_props): group = [i.name for i in raw_group] @@ -414,7 +439,7 @@ def find_duplicate_images() -> None: def find_duplicate_meshes() -> None: - meshes = [m for m in bpy.data.meshes if not m.library] + meshes = [m for m in bpy.data.meshes if is_local_id(m)] seen = set() results = [] for m1 in meshes: @@ -493,6 +518,8 @@ class DBU_OT_SimilarAndDuplicatesClearResults(Operator): def merge_ids(duplicate_ids: Iterable[Iterable[bpy.types.ID]]) -> int: to_remove = [] for target, *junk in duplicate_ids: + if not is_local_id(target) or any(not is_local_id(id_data) for id_data in junk): + continue to_remove.extend(junk) for id_data in junk: id_data.user_remap(target) diff --git a/extensions/blender_org/govietools/Operator/operator.py b/extensions/blender_org/govietools/Operator/operator.py index a3361f3..8b1f134 100644 --- a/extensions/blender_org/govietools/Operator/operator.py +++ b/extensions/blender_org/govietools/Operator/operator.py @@ -154,19 +154,44 @@ class GOVIE_Quick_Export_GLB_Operator(bpy.types.Operator): # read preset parameters from file if preset_filepath: - - class Container(object): - __slots__ = ("__dict__",) - - op = Container() preset_file = open(preset_filepath, "r") - # storing the values from the preset on the class for line in preset_file.readlines()[3::]: - exec(line, globals(), locals()) + preset_key = line.split("op.")[1].split(" = ")[0] + preset_value = line.split("op.")[1].split(" = ")[1].rstrip() + + if preset_value.startswith("'") and preset_value.endswith("'"): + # value is a string + gltf_export_param[preset_key] = preset_value[1:-1] + continue + + if preset_value == "True": + # value is a bool + gltf_export_param[preset_key] = True + continue + + if preset_value == "False": + # value is a bool + gltf_export_param[preset_key] = False + continue + + try: + preset_value_converted = int(preset_value) + # if no error is thrown its an int + gltf_export_param[preset_key] = preset_value_converted + continue + except ValueError: + try: + # should be a float + preset_value_converted = float(preset_value) + gltf_export_param[preset_key] = preset_value_converted + except ValueError: + print( + "Could not convert preset parameter from gltf preset at line: {}".format( + line + ) + ) - # pass class dictionary to the operator - gltf_export_param = op.__dict__ else: gltf_export_param["export_extras"] = True diff --git a/extensions/blender_org/govietools/__init__.py b/extensions/blender_org/govietools/__init__.py index b9f3ca6..b0c82e3 100644 --- a/extensions/blender_org/govietools/__init__.py +++ b/extensions/blender_org/govietools/__init__.py @@ -29,7 +29,7 @@ bl_info = { "author": "Lorenz Wieseke, 3D Interaction Technologies GmbH (contact@govie.de)", "description": "Transform your model into a web-optimized GLB file for use in the Govie Editor.", "blender": (4, 2, 0), - "version": (1, 0, 20), + "version": (1, 0, 22), "location": "View 3D > Property Panel (N-Key in 3D View)", "warning": "", "category": "Scene", diff --git a/extensions/blender_org/govietools/blender_manifest.toml b/extensions/blender_org/govietools/blender_manifest.toml index 6e4c15c..8422275 100644 --- a/extensions/blender_org/govietools/blender_manifest.toml +++ b/extensions/blender_org/govietools/blender_manifest.toml @@ -1,7 +1,7 @@ schema_version = "1.0.0" id = "govietools" -version = "1.0.20" +version = "1.0.22" name = "Govie Tools" tagline = "Optimize your model for use in the Govie Editor" maintainer = "Stefan Bernstein, 3D Interaction Technologies GmbH " diff --git a/extensions/blender_org/govietools/pyproject.toml b/extensions/blender_org/govietools/pyproject.toml index 22b4aee..38d6c07 100644 --- a/extensions/blender_org/govietools/pyproject.toml +++ b/extensions/blender_org/govietools/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "govietools" -version = "1.0.20" +version = "1.0.21" description = "Optimize your model for use in the Govie Editor" readme = "README.md" requires-python = ">=3.11.13" diff --git a/extensions/blender_org/govietools/uv.lock b/extensions/blender_org/govietools/uv.lock new file mode 100644 index 0000000..62363bc --- /dev/null +++ b/extensions/blender_org/govietools/uv.lock @@ -0,0 +1,8 @@ +version = 1 +revision = 2 +requires-python = ">=3.11.13" + +[[package]] +name = "govietools" +version = "1.0.20" +source = { virtual = "." } diff --git a/extensions/blender_org/incremental_auto_save/README.md b/extensions/blender_org/incremental_auto_save/README.md index d5afc46..4a63d7e 100644 --- a/extensions/blender_org/incremental_auto_save/README.md +++ b/extensions/blender_org/incremental_auto_save/README.md @@ -1,3 +1,5 @@ +### Incremental Auto-Save + [Incremental Auto-Save](https://extensions.blender.org/add-ons/incremental-auto-save/) makes Blender's autosaves more configurable and reliable. ![Addon Preferences UI](/docs/incremental_autosave.png "Addon Preferences UI") @@ -13,4 +15,4 @@ - Save modified images: For texture painting workflows, this will auto-save your images as well as the .blend file. - Save Mesh/Sculpt: If you spend a long time in Edit/Sculpt mode and Blender crashes, you will lose your work, because the mesh data is not written back into the object until you go to Object Mode. The add-on will periodically enter object mode for you, without interrupting any Sculpt/Paint/Transform operations. -It goes without saying that this add-on can introduce periodic lag. This is simply the price of saving data to a disk. A slow disk or a large file will exacerbate this, and all you can do is adjust your save interval according to what you can put up with. \ No newline at end of file +It goes without saying that this add-on can introduce periodic lag. This is simply the price of saving data to a disk. A slow disk or a large file will exacerbate this, and all you can do is adjust your save interval according to what you can put up with. diff --git a/extensions/blender_org/incremental_auto_save/__init__.py b/extensions/blender_org/incremental_auto_save/__init__.py index a77d2a5..730e546 100644 --- a/extensions/blender_org/incremental_auto_save/__init__.py +++ b/extensions/blender_org/incremental_auto_save/__init__.py @@ -1,10 +1,13 @@ # SPDX-License-Identifier: GPL-3.0-or-later +from __future__ import annotations + import json import os import tempfile from datetime import datetime from pathlib import Path +from typing import Any import bpy from bl_ui.generic_ui_list import draw_ui_list @@ -15,15 +18,23 @@ from bpy.props import ( IntProperty, StringProperty, ) -from bpy.types import AddonPreferences, PropertyGroup, UIList +from bpy.types import ( + AddonPreferences, + Context, + PropertyGroup, + UILayout, + UIList, + bpy_prop_collection, +) from rna_prop_ui import IDPropertyGroup - +# The add-on is confirmed to work with Blender 3.5 in 2026. +# As long as that remains true, there's no point removing this bl_info block. bl_info = { "name": "Incremental Autosave", "author": "Demeter Dzadik", - "version": (1, 1, 1), - "blender": (2, 90, 0), + "version": (1, 1, 2), + "blender": (3, 5, 0), "location": "blender", "description": "Autosaves in a way where subsequent autosaves don't overwrite previous ones", "category": "System", @@ -38,7 +49,14 @@ LAUNCH_TIME = datetime.now() class INCSAVE_UL_file_paths(UIList): def draw_item( - self, context, layout, data, item, icon_value, active_data, active_propname + self, + _context: Context, + layout: UILayout, + _data: object, + item: AutoSavePath, + _icon_value: int, + _active_data: object, + _active_propname: str, ): filepath: AutoSavePath = item @@ -51,12 +69,14 @@ class INCSAVE_UL_file_paths(UIList): row.prop(filepath, "path", text="") -def get_addon_prefs(context=None): +def get_addon_prefs( + context: Context | None = None, +) -> IncrementalAutoSavePreferences: context = context or bpy.context return context.preferences.addons[__name__].preferences -def update_prefs_on_file(self=None, context=None): +def update_prefs_on_file(_self=None, context: Context | None = None): prefs = get_addon_prefs(context) if not type(prefs).loading: prefs.save_prefs_to_file() @@ -71,7 +91,7 @@ class PrefsFileSaveLoadMixin: import bpy, json from pathlib import Path - class MyAddonPrefs(PrefsFileSaveLoadMixin, bpy.types.AddonPreferences): + class MyAddonPrefs(PrefsFileSaveLoadMixin, AddonPreferences): some_prop: bpy.props.IntProperty(update=update_prefs_on_file) def register(): @@ -91,7 +111,7 @@ class PrefsFileSaveLoadMixin: @staticmethod def register_autoload_from_file(delay=0.1): - def timer_func(_scene=None): + def timer_func(_scene: object = None): prefs = get_addon_prefs() prefs.load_prefs_from_file() @@ -105,7 +125,7 @@ class PrefsFileSaveLoadMixin: ret = {} rna_class = None - if isinstance(propgroup, bpy.types.AddonPreferences): + if isinstance(propgroup, AddonPreferences): prop_dict = { key: getattr(propgroup, key) for key in propgroup.bl_rna.properties.keys() @@ -113,9 +133,7 @@ class PrefsFileSaveLoadMixin: } else: property_group_class_name = type(propgroup).__name__ - rna_class = bpy.types.PropertyGroup.bl_rna_get_subclass_py( - property_group_class_name - ) + rna_class = PropertyGroup.bl_rna_get_subclass_py(property_group_class_name) if not hasattr(rna_class, "properties"): rna_class = None prop_dict = { @@ -127,7 +145,7 @@ class PrefsFileSaveLoadMixin: for key, value in prop_dict.items(): if key in type(self).omit_from_disk: continue - if type(value) in (list, bpy.types.bpy_prop_collection_idprop): + if type(value) is list or isinstance(value, bpy_prop_collection): ret[key] = [self.prefs_to_dict_recursive(elem) for elem in value] elif type(value) is IDPropertyGroup: ret[key] = self.prefs_to_dict_recursive(value) @@ -143,7 +161,11 @@ class PrefsFileSaveLoadMixin: ret[key] = value return ret - def apply_prefs_from_dict_recursive(self, propgroup, data): + def apply_prefs_from_dict_recursive( + self, + propgroup: IDPropertyGroup, + data: dict[str, Any], + ): for key, value in data.items(): if not hasattr(propgroup, key): # Property got removed or renamed in the implementation. @@ -165,7 +187,7 @@ class PrefsFileSaveLoadMixin: addon_name = __package__.split(".")[-1] return Path(bpy.utils.user_resource("CONFIG")) / Path(addon_name + ".txt") - def save_prefs_to_file(self, _context=None): + def save_prefs_to_file(self, _context: Context | None = None): data_dict = self.prefs_to_dict_recursive(propgroup=self) with open(self.get_prefs_filepath(), "w") as f: @@ -190,7 +212,11 @@ class PrefsFileSaveLoadMixin: class AutoSavePath(PropertyGroup): - name: StringProperty(update=update_prefs_on_file) + name: StringProperty( + name="Autosave Path Identifier", + description="Name of this autosave path", + update=update_prefs_on_file, + ) path: StringProperty( name="Autosave Path", description="An autosave path. If this filepath doesn't exist, the next existing one will be used. If none are valid, the Blender auto-save path will be used. If that's not valid either, the OS default temp folder will be used", @@ -221,7 +247,7 @@ class IncrementalAutoSavePreferences(PrefsFileSaveLoadMixin, AddonPreferences): update=update_prefs_on_file, ) - max_save_files: bpy.props.IntProperty( + max_save_files: IntProperty( name="Max Backups Per File", description="Maximum number of backups to save for each file, 0 means unlimited. Otherwise, the oldest file will be deleted after reaching the limit", default=10, @@ -229,7 +255,7 @@ class IncrementalAutoSavePreferences(PrefsFileSaveLoadMixin, AddonPreferences): max=100, update=update_prefs_on_file, ) - compress_files: bpy.props.BoolProperty( + compress_files: BoolProperty( name="Compress Files", description="Save backups with compression enabled", default=True, @@ -263,7 +289,7 @@ class IncrementalAutoSavePreferences(PrefsFileSaveLoadMixin, AddonPreferences): assert bpy.data.filepath return os.sep.join((os.path.dirname(bpy.data.filepath), "Autosaves")) - def get_valid_autosave_path(self, context) -> str: + def get_valid_autosave_path(self, context: Context) -> str: """Return an autosave path that will always actually exist, no matter how desperate.""" prefs = get_addon_prefs(context) if bpy.data.filepath and prefs.relative_to_blend: @@ -287,12 +313,19 @@ class IncrementalAutoSavePreferences(PrefsFileSaveLoadMixin, AddonPreferences): sys_temp = tempfile.gettempdir() return sys_temp - def draw(self, context): + def draw(self, context: Context): layout = self.layout.column() layout.use_property_decorate = False layout.use_property_split = True - header, panel = layout.panel("Incremental Autosave: Paths", default_closed=True) + if hasattr(layout, "panel"): + header, panel = layout.panel( + "Incremental Autosave: Paths", default_closed=True + ) + else: + header = layout.row() + panel = layout + header.label(text="Autosave Paths") if panel: split = panel.split(factor=0.4) @@ -384,7 +417,7 @@ def save_file(): if addon_prefs.save_images: save_images() if addon_prefs.save_sculpt: - save_sculpt() + realize_sculpt_or_edit_mesh() bpy.ops.wm.save_as_mainfile( filepath=backup_file, copy=True, compress=addon_prefs.compress_files ) @@ -409,25 +442,36 @@ def save_images(): print(f"Incremental Autosave: Failed to save dirty image: {img.name}") -def save_sculpt(): - """We just need to enter object mode and then go back to the original mode.""" +def realize_sculpt_or_edit_mesh(): + """We just need to enter object mode and then go back to the original mode, + to write the mesh data to the object. + """ context = bpy.context - if context.mode == "EDIT_MESH": - bpy.ops.object.mode_set(mode="OBJECT") - bpy.ops.object.mode_set(mode="EDIT") - if context.mode == "SCULPT": - bpy.ops.object.mode_set(mode="OBJECT") - bpy.ops.object.mode_set(mode="SCULPT") + try: + if context.mode == "EDIT_MESH": + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.mode_set(mode="EDIT") + if context.mode == "SCULPT": + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.mode_set(mode="SCULPT") + except RuntimeError: + # This can happen if we happen to catch user during some modal operator that's + # not accounted for by save_after_modal_operation(). + print( + "Incremental Autosave Error: Mesh could not be written to Object due to running modal operators: ", + [op.bl_idname for op in context.window.modal_operators], + ) + print("You could report this as a bug!") @persistent -def save_before_close(_dummy=None): +def save_before_close(_dummy: object = None): # is_dirty means there are changes that haven't been saved to disk if bpy.data.is_dirty and get_addon_prefs().save_before_close: save_file() -def create_autosave_on_timer(): +def create_autosave_on_timer() -> int: now = datetime.now() delta = now - LAUNCH_TIME prefs = get_addon_prefs() @@ -439,7 +483,7 @@ def create_autosave_on_timer(): return prefs.save_interval * 60 -def save_after_modal_operation(): +def save_after_modal_operation() -> float | None: """Mesh edits, sculpt strokes, and texture paint strokes trigger a depsgraph update, so it's better to make a save after one of those operations, rather than on a timer. """ @@ -462,7 +506,7 @@ def save_after_modal_operation(): @persistent -def register_autosave_timer(_dummy=None): +def register_autosave_timer(_dummy: object = None): bpy.app.timers.register(create_autosave_on_timer) diff --git a/extensions/blender_org/incremental_auto_save/blender_manifest.toml b/extensions/blender_org/incremental_auto_save/blender_manifest.toml index e3d2ce6..a2d10f1 100644 --- a/extensions/blender_org/incremental_auto_save/blender_manifest.toml +++ b/extensions/blender_org/incremental_auto_save/blender_manifest.toml @@ -1,12 +1,12 @@ schema_version = "1.0.0" id = "incremental_auto_save" -version = "1.1.1" +version = "1.1.2" name = "Incremental Auto-Save" tagline = "Improvements to Blender's Autosave" maintainer = "Demeter Dzadik " type = "add-on" -website = "https://projects.blender.org/Mets/incremental-autosave" +website = "https://projects.blender.org/Mets/incremental-autosave#incremental-auto-save" tags = ["System"] blender_version_min = "4.2.0" @@ -15,7 +15,7 @@ license = [ "SPDX:GPL-3.0-or-later" ] copyright = [ - "2019-2024 Demeter Dzadik" + "2019-2026 Demeter Dzadik" ] [permissions] files = "Save preferences & .blends in chosen directories" diff --git a/extensions/blender_org/simple_renaming_panel/README.md b/extensions/blender_org/simple_renaming_panel/README.md index 0ba7b98..970b733 100644 --- a/extensions/blender_org/simple_renaming_panel/README.md +++ b/extensions/blender_org/simple_renaming_panel/README.md @@ -1,4 +1,4 @@ -Documentation: https://weisl.github.io/renaming_overview/ +Documentation: https://weisl.github.io/simple_renaming/renaming_overview/ [![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/donate?hosted_button_id=JV7KRF77TY78A) diff --git a/extensions/blender_org/simple_renaming_panel/__init__.py b/extensions/blender_org/simple_renaming_panel/__init__.py index f9b71f6..6d433d9 100644 --- a/extensions/blender_org/simple_renaming_panel/__init__.py +++ b/extensions/blender_org/simple_renaming_panel/__init__.py @@ -18,22 +18,11 @@ Created by Matthias Patscheider along with this program. If not, see . """ -# support reloading sub-modules -if "bpy" in locals(): - import importlib - - importlib.reload(add_suffix_panel) - importlib.reload(operators) - importlib.reload(preferences) - importlib.reload(ui) - importlib.reload(variable_replacer) - -else: - from . import add_suffix_panel - from . import operators - from . import preferences - from . import ui - from . import variable_replacer +from . import add_suffix_panel +from . import operators +from . import preferences +from . import ui +from . import variable_replacer files = [ add_suffix_panel, diff --git a/extensions/blender_org/simple_renaming_panel/add_suffix_panel/renaming_sufPre_operators.py b/extensions/blender_org/simple_renaming_panel/add_suffix_panel/renaming_sufPre_operators.py index 274f053..4a7401f 100644 --- a/extensions/blender_org/simple_renaming_panel/add_suffix_panel/renaming_sufPre_operators.py +++ b/extensions/blender_org/simple_renaming_panel/add_suffix_panel/renaming_sufPre_operators.py @@ -245,7 +245,7 @@ class VIEW3D_OT_add_type_suf_pre(bpy.types.Operator): obj_list = [] for obj in self.get_selection_all(): - if obj.type == 'GPENCIL': + if obj.type in ('GPENCIL', 'GREASEPENCIL'): obj_list.append(obj) self.rename_suffix_prefix(obj_list, pre_suffix=wm.renaming_suffix_prefix_gpencil, object_type='GPENCIL', icon='OUTLINER_OB_GREASEPENCIL') diff --git a/extensions/blender_org/simple_renaming_panel/blender_manifest.toml b/extensions/blender_org/simple_renaming_panel/blender_manifest.toml index 5c56a50..c31c261 100644 --- a/extensions/blender_org/simple_renaming_panel/blender_manifest.toml +++ b/extensions/blender_org/simple_renaming_panel/blender_manifest.toml @@ -1,13 +1,13 @@ schema_version = "1.0.0" id = "simple_renaming_panel" -version = "2.1.6" +version = "2.1.8" name = "Simple Renaming" tagline = "Effortlessly rename multiple objects with this simple addon" maintainer = "Matthias Patscheider " type = "add-on" -website = "https://weisl.github.io/renaming_overview/" +website = "https://weisl.github.io/simple_renaming/renaming_overview/" tags = ["3D View", "Scene", "User Interface"] diff --git a/extensions/blender_org/simple_renaming_panel/operators/__init__.py b/extensions/blender_org/simple_renaming_panel/operators/__init__.py index fd582fe..7f53b6f 100644 --- a/extensions/blender_org/simple_renaming_panel/operators/__init__.py +++ b/extensions/blender_org/simple_renaming_panel/operators/__init__.py @@ -1,5 +1,4 @@ import bpy -from bpy.app.handlers import persistent from bpy.props import ( BoolProperty, EnumProperty, @@ -10,15 +9,12 @@ from bpy.props import ( from . import add_pre_suffix from . import case_transform -from . import reload_addon -from .version_check import start_version_check from . import name_from_data from . import name_replace from . import numerate from . import search_replace from . import search_select from . import trim_string -from .renaming_utilities import update_selection_order enumObjectTypes = [('EMPTY', "", "Rename empty objects", 'OUTLINER_OB_EMPTY', 1), ('MESH', "", "Rename mesh objects", 'OUTLINER_OB_MESH', 2), @@ -29,7 +25,7 @@ enumObjectTypes = [('EMPTY', "", "Rename empty objects", 'OUTLINER_OB_EMPTY', 1) ('CURVE', "", "Rename curve objects", 'OUTLINER_OB_CURVE', 64), ('SURFACE', "", "Rename surface objects", 'OUTLINER_OB_SURFACE', 128), ('FONT', "", "Rename font objects", 'OUTLINER_OB_FONT', 256), - ('GPENCIL', "", "Rename greace pencil objects", 'OUTLINER_OB_GREASEPENCIL', 512), + ('GPENCIL', "", "Rename grease pencil objects", 'OUTLINER_OB_GREASEPENCIL', 512), ('META', "", "Rename metaball objects", 'OUTLINER_OB_META', 1024), ('SPEAKER', "", "Rename empty speakers", 'OUTLINER_OB_SPEAKER', 2048), ('LIGHT_PROBE', "", "Rename mesh lightpropes", 'OUTLINER_OB_LIGHTPROBE', 4096), @@ -83,36 +79,17 @@ classes = ( case_transform.VIEW3D_OT_case_camel, case_transform.VIEW3D_OT_case_snake, case_transform.VIEW3D_OT_case_kebab, - reload_addon.VIEW3D_OT_reload_addon, ) enum_sort_items = [('X', "X Axis", "Sort the object based on the X axis."), ('Y', "Y Axis", "Sort the object based on the Y axis."), - ('Z', "Z Axis", "Sort the object based on the Z axis."), - ('SELECTION', "Selection", "Sort the objects based on the selection order"), ] + ('Z', "Z Axis", "Sort the object based on the Z axis."), ] enum_sort_bone_items = [('X', "X Axis", "Sort the object based on the X axis."), ('Y', "Y Axis", "Sort the object based on the Y axis."), ('Z', "Z Axis", "Sort the object based on the Z axis."), ] -# persistent is needed for handler to work in addons https://docs.blender.org/api/current/bpy.app.handlers.html -@persistent -def PostChange(scene): - if bpy.context.mode != "OBJECT": - return - - # Any() function returns True if any element of an iterable is True. If not, it returns False. - is_selection_update = any( - not u.is_updated_geometry - and not u.is_updated_transform - and not u.is_updated_shading - for u in bpy.context.view_layer.depsgraph.updates - ) - if is_selection_update: - update_selection_order() - - def register(): id_store = bpy.types.Scene @@ -210,8 +187,6 @@ def register(): for cls in classes: register_class(cls) - bpy.app.handlers.depsgraph_update_post.append(PostChange) - start_version_check() def unregister(): @@ -237,4 +212,3 @@ def unregister(): del IDStore.renaming_filter_by_index del IDStore.renaming_index_target - bpy.app.handlers.depsgraph_update_post.remove(PostChange) diff --git a/extensions/blender_org/simple_renaming_panel/operators/reload_addon.py b/extensions/blender_org/simple_renaming_panel/operators/reload_addon.py deleted file mode 100644 index 8563320..0000000 --- a/extensions/blender_org/simple_renaming_panel/operators/reload_addon.py +++ /dev/null @@ -1,61 +0,0 @@ -import bpy -from bpy.types import Operator - - -class VIEW3D_OT_reload_addon(Operator): - """Reload all Simple Renaming scripts.""" - bl_idname = "renaming.reload_addon" - bl_label = "Reload Addon" - bl_description = "Reload all Simple Renaming scripts" - - def execute(self, context): - import importlib - import sys - - # Derive the addon root package name by stripping the sub-package suffix. - # Works for both legacy addons ("simple_renaming.operators") - # and extensions ("bl_ext.user_default.simple_renaming.operators"). - root_pkg = __package__.rsplit(".", 1)[0] - - # Snapshot the module names now, before any reload happens. - # Sort key: deeper modules first (so core.* sub-modules reload before - # core.__init__), and alphabetically within the same depth so that - # "core.*" always reloads before "operators.*" before "ui.*". - mod_names = sorted( - [name for name in sys.modules - if name == root_pkg or name.startswith(root_pkg + ".")], - key=lambda n: (-n.count("."), n), - ) - - # Defer the actual reload to the next event-loop iteration so that this - # operator's own execute() has finished (and its class has been removed - # from the call stack) before we unregister and reload everything. - def _do_reload(): - root_mod = sys.modules.get(root_pkg) - if root_mod and hasattr(root_mod, "unregister"): - try: - root_mod.unregister() - except Exception as exc: - print(f"[RENAMING] unregister error: {exc}") - - for name in mod_names: - mod = sys.modules.get(name) - if mod is not None: - try: - importlib.reload(mod) - except Exception as exc: - print(f"[RENAMING] reload error for '{name}': {exc}") - - # Re-fetch root after in-place reload to pick up any top-level changes. - root_mod = sys.modules.get(root_pkg) - if root_mod and hasattr(root_mod, "register"): - try: - root_mod.register() - except Exception as exc: - print(f"[RENAMING] register error: {exc}") - - print(f"[RENAMING] Reloaded {len(mod_names)} modules from '{root_pkg}'") - - bpy.app.timers.register(_do_reload, first_interval=0.0) - self.report({'INFO'}, f"Queued reload of {len(mod_names)} modules…") - return {'FINISHED'} diff --git a/extensions/blender_org/simple_renaming_panel/operators/renaming_utilities.py b/extensions/blender_org/simple_renaming_panel/operators/renaming_utilities.py index 8d2aa84..b9082c2 100644 --- a/extensions/blender_org/simple_renaming_panel/operators/renaming_utilities.py +++ b/extensions/blender_org/simple_renaming_panel/operators/renaming_utilities.py @@ -37,9 +37,7 @@ def get_renaming_list(context): else: sort_enum = scene.renaming_sort_enum - if sort_enum == 'SELECTION': - obj_list = get_ordered_selection_objects() - elif sort_enum == 'X': + if sort_enum == 'X': obj_list = get_sorted_objects_x(obj_list) elif sort_enum == 'Y': obj_list = get_sorted_objects_y(obj_list) @@ -51,7 +49,8 @@ def get_renaming_list(context): if scene.renaming_object_types == 'OBJECT': for obj in obj_list: - if obj.type in scene.renaming_object_types_specified: + effective_type = 'GPENCIL' if obj.type == 'GREASEPENCIL' else obj.type + if effective_type in scene.renaming_object_types_specified: renaming_list.append(obj) elif scene.renaming_object_types == 'DATA': @@ -65,8 +64,8 @@ def get_renaming_list(context): if selection_only: for obj in context.selected_objects: for mat in obj.material_slots: - if mat is not None and mat.name != '': - renaming_list.append(bpy.data.materials[mat.name]) + if mat.material is not None: + renaming_list.append(mat.material) else: renaming_list = list(bpy.data.materials) @@ -124,7 +123,7 @@ def get_renaming_list(context): renaming_list.append(new_bone) elif scene.renaming_object_types == 'COLLECTION': - if bpy.context.space_data.type == 'OUTLINER' and selection_only is True: + if bpy.context.space_data and bpy.context.space_data.type == 'OUTLINER' and selection_only is True: selected_collections = [c for c in context.selected_ids if c.bl_rna.identifier == "Collection"] for col in selected_collections: renaming_list.append(col) @@ -300,16 +299,6 @@ def get_global_z(obj): return obj.matrix_world.to_translation().z -def get_ordered_selection_objects(): - tagged_objects = [] - for o in bpy.data.objects: - order_index = o.get("selection_order", -1) - if order_index >= 0: - tagged_objects.append((order_index, o)) - tagged_objects = sorted(tagged_objects, key=lambda item: item[0]) - return [o for i, o in tagged_objects] - - def get_sorted_objects_x(objects): # Sort objects by their global X location sorted_objects = sorted(objects, key=get_global_x) @@ -368,44 +357,3 @@ def update_bone_drivers(old_name, new_name): target.data_path = target.data_path.replace(old_token, new_token) -def clear_order_flag(obj): - try: - del obj["selection_order"] - except KeyError: - pass - - -def update_selection_order(): - if not (getattr(bpy.context, 'selected_objects', None) or list(bpy.context.view_layer.objects.selected)): - for o in bpy.data.objects: - clear_order_flag(o) - return - selection_order = get_ordered_selection_objects() - idx = 0 - - for o in selection_order: - if not o.select_get(): - selection_order.remove(o) - clear_order_flag(o) - else: - o["selection_order"] = idx - - # Remove any existing fcurves for 'selection_order' - if o.animation_data and o.animation_data.action: - action = o.animation_data.action - - import bpy_extras.anim_utils as anim_utils - # Get the default channelbag for the action (slot 0) - channelbag = anim_utils.action_get_channelbag_for_slot(action, 0) - if channelbag: - fcurves = channelbag.fcurves - for fcurve in fcurves: - if fcurve.data_path == '["selection_order"]': - fcurves.remove(fcurve) - - - idx += 1 - for o in bpy.context.selected_objects: - if o not in selection_order: - o["selection_order"] = len(selection_order) - selection_order.append(o) diff --git a/extensions/blender_org/simple_renaming_panel/operators/version_check.py b/extensions/blender_org/simple_renaming_panel/operators/version_check.py deleted file mode 100644 index f441282..0000000 --- a/extensions/blender_org/simple_renaming_panel/operators/version_check.py +++ /dev/null @@ -1,62 +0,0 @@ -import threading -import urllib.request -import urllib.error -import json - -# Module-level state — read by the panel draw function -update_available = False -latest_version_str = "" - -_RELEASES_URL = "https://api.github.com/repos/Weisl/simple_renaming/releases/latest" - - -def _parse_version(version_str): - """Convert '2.1.4' or 'v2.1.4' to (2, 1, 4).""" - return tuple(int(x) for x in version_str.lstrip("v").split(".")) - - -def _fetch(): - global update_available, latest_version_str - try: - req = urllib.request.Request( - _RELEASES_URL, - headers={"User-Agent": "simple-renaming-addon"}, - ) - with urllib.request.urlopen(req, timeout=5) as response: - data = json.loads(response.read().decode()) - - tag = data.get("tag_name", "") - if not tag: - return - - latest = _parse_version(tag) - - # Read current version from blender_manifest.toml at the addon root - import os - manifest_path = os.path.join(os.path.dirname(__file__), "..", "blender_manifest.toml") - current_str = "" - with open(manifest_path, encoding="utf-8") as f: - for line in f: - if line.startswith("version"): - current_str = line.split("=")[1].strip().strip('"') - break - - if not current_str: - return - - current = _parse_version(current_str) - - if latest > current: - update_available = True - latest_version_str = tag.lstrip("v") - else: - print(f"[RENAMING] Addon is up to date (v{current_str})") - - except Exception as exc: - print(f"[RENAMING] version check failed: {exc}") - - -def start_version_check(): - """Fire a background thread to check for a newer release on GitHub.""" - t = threading.Thread(target=_fetch, daemon=True) - t.start() diff --git a/extensions/blender_org/simple_renaming_panel/operators_extra/__init__.py b/extensions/blender_org/simple_renaming_panel/operators_extra/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/extensions/blender_org/simple_renaming_panel/preferences/renaming_preferences.py b/extensions/blender_org/simple_renaming_panel/preferences/renaming_preferences.py index 2fdbbe8..6796fd3 100644 --- a/extensions/blender_org/simple_renaming_panel/preferences/renaming_preferences.py +++ b/extensions/blender_org/simple_renaming_panel/preferences/renaming_preferences.py @@ -92,8 +92,7 @@ class VIEW3D_OT_renaming_preferences(bpy.types.AddonPreferences): bl_options = {'REGISTER'} prefs_tabs: EnumProperty(items=(('UI', "General", "General Settings"), - ('KEYMAPS', "Keymaps", "Keymaps"), - ('SUPPORT', "Support & Donation", "Support")), + ('KEYMAPS', "Keymaps", "Keymaps")), default='UI') renaming_category: StringProperty(name="Category", @@ -382,52 +381,3 @@ class VIEW3D_OT_renaming_preferences(bpy.types.AddonPreferences): self.keymap_ui(layout, 'Renaming Sub/Prefix', 'renaming_suf_pre', 'wm.call_panel', "VIEW3D_PT_tools_type_suffix") - - elif self.prefs_tabs == 'SUPPORT': - - text = "Support me developing great tools!" - label_multiline( - context=context, - text=text, - parent=layout - ) - - # Donations - box = layout.box() - text = "Consider supporting the development of this addon with a donation!" - label_multiline( - context=context, - text=text, - parent=box - ) - col = box.column(align=True) - row = col.row() - row.operator("wm.url_open", text="Gumroad", - icon="URL").url = "https://weisl.gumroad.com/l/simple_renaming" - row = col.row() - row.operator("wm.url_open", text="Superhive Market", - icon="URL").url = "https://superhivemarket.com/products/simple-renaming" - row = col.row() - row.operator("wm.url_open", text="PayPal Donation", - icon="URL").url = "https://www.paypal.com/donate?hosted_button_id=JV7KRF77TY78A" - - # Cross Promotion - box = layout.box() - text = "Explore my other Blender Addons designed for more efficient game asset workflows!" - label_multiline( - context=context, - text=text, - parent=box - ) - - col = box.column(align=True) - row = col.row() - row.operator("wm.url_open", text="Simple Collider", - icon="URL").url = "https://superhivemarket.com/products/simple-collider" - row = col.row() - row.operator("wm.url_open", text="Simple Camera Manager", - icon="URL").url = "https://superhivemarket.com/products/simple-camera-manager" - row = col.row() - row.label(text='Support & Feedback') - row = col.row() - row.operator("wm.url_open", text="Join Discord", icon="URL").url = "https://discord.gg/VRzdcFpczm" diff --git a/extensions/blender_org/simple_renaming_panel/ui/renaming_panels.py b/extensions/blender_org/simple_renaming_panel/ui/renaming_panels.py index 9d7fe1a..90ea3ae 100644 --- a/extensions/blender_org/simple_renaming_panel/ui/renaming_panels.py +++ b/extensions/blender_org/simple_renaming_panel/ui/renaming_panels.py @@ -15,13 +15,6 @@ types_of_selected = ( def draw_renaming_panel(layout, context): - from ..operators.version_check import update_available, latest_version_str - - if update_available: - row = layout.row(align=True) - row.alert = True - row.label(text=f"Update available: v{latest_version_str}", icon='ERROR') - scene = context.scene row = layout.row(align=True) @@ -47,7 +40,7 @@ def draw_renaming_panel(layout, context): elif str(scene.renaming_object_types) in types_selected: layout.prop(scene, "renaming_only_selection", text="Only Selected") elif str(scene.renaming_object_types) == 'COLLECTION': - if bpy.context.space_data.type == 'OUTLINER': + if bpy.context.space_data and bpy.context.space_data.type == 'OUTLINER': row = layout.row(align=True) row.prop(scene, "renaming_only_selection", text="Only Selected") else: @@ -191,13 +184,12 @@ class VIEW3D_PT_tools_renaming_panel(bpy.types.Panel): def draw_header(self, context): layout = self.layout row = layout.row(align=True) - row.operator("wm.url_open", text="", icon='HELP').url = "https://weisl.github.io/renaming_overview/" + row.operator("wm.url_open", text="", icon='HELP').url = "https://weisl.github.io/simple_renaming/renaming_overview/" addon_name = get_addon_name() op = row.operator("preferences.rename_addon_search", text="", icon='PREFERENCES') op.addon_name = addon_name op.prefs_tabs = 'UI' - row.operator("renaming.reload_addon", text="", icon='FILE_REFRESH') def draw(self, context): layout = self.layout diff --git a/extensions/blender_org/simple_renaming_panel/ui/ui_helpers.py b/extensions/blender_org/simple_renaming_panel/ui/ui_helpers.py index 2e5f237..84285d0 100644 --- a/extensions/blender_org/simple_renaming_panel/ui/ui_helpers.py +++ b/extensions/blender_org/simple_renaming_panel/ui/ui_helpers.py @@ -21,18 +21,4 @@ class PREFERENCES_OT_open_addon(bpy.types.Operator): prefs = context.preferences.addons[base_package].preferences prefs.prefs_tabs = self.prefs_tabs - import addon_utils - mod = addon_utils.addons_fake_modules.get('simple_renaming') - - # mod is None the first time the operation is called :/ - if mod: - mod.bl_info['show_expanded'] = True - - # Find User Preferences area and redraw it - for window in bpy.context.window_manager.windows: - for area in window.screen.areas: - if area.type == 'USER_PREFERENCES': - area.tag_redraw() - - bpy.ops.preferences.addon_expand(module=self.addon_name) return {'FINISHED'} diff --git a/extensions/blender_org/viewport_pie_menus/__init__.py b/extensions/blender_org/viewport_pie_menus/__init__.py index 5d5cc83..1037a8d 100644 --- a/extensions/blender_org/viewport_pie_menus/__init__.py +++ b/extensions/blender_org/viewport_pie_menus/__init__.py @@ -2,9 +2,10 @@ # # SPDX-License-Identifier: GPL-3.0-or-later +import importlib + import bpy from bpy.utils import register_class, unregister_class -import importlib _VPM_AGENT_IMMEDIATE_REGISTER_DONE = locals().get("_VPM_AGENT_IMMEDIATE_REGISTER_DONE", False) @@ -15,16 +16,19 @@ module_names = ( "prefs", "sidebar", "tweak_builtin_pies", - - "pie_animation", + "pie_playback", + "pie_keyframes", + "pie_copy_attributes", "pie_apply_transform", "pie_camera", + "pie_curve_delete", "pie_preferences", "pie_editor_split_merge", "pie_editor_switch", "pie_file", "pie_manipulator", "pie_mesh_delete", + "pie_mesh_edge", "pie_mesh_flatten", "pie_mesh_merge", "pie_object_add", @@ -33,16 +37,15 @@ module_names = ( "pie_proportional_editing", "pie_relationship_delete", "pie_sculpt_brush_select", + "pie_select_similar", "pie_selection", "pie_set_origin", "pie_view_3d", "pie_window", ) -modules = [ - __import__(__package__ + "." + submod, {}, {}, submod) - for submod in module_names -] +modules = [__import__(__package__ + "." + submod, {}, {}, submod) for submod in module_names] + def register_unregister_modules(modules: list, register: bool): """Recursively register or unregister modules by looking for either @@ -71,12 +74,14 @@ def register_unregister_modules(modules: list, register: bool): elif hasattr(m, 'unregister'): m.unregister() + def delayed_register(_scene=None): # Register whole add-on with a slight delay, # to make sure Keymap data we need already exists on Blender launch. # Otherwise, keyconfigs.user.keymaps is an empty list, we can't find fallback ops. register_unregister_modules(modules, True) + def register(): """ We prefer an *immediate* register during startup, because other add-ons may touch @@ -96,9 +101,10 @@ def register(): # Keep behavior unchanged (fallback to timer), but avoid raising during registration. pass - # NOTE: persistent=True must be set, otherwise this doesn't work when opening + # NOTE: persistent=True must be set, otherwise this doesn't work when opening # a .blend file directly from a file browser. bpy.app.timers.register(delayed_register, first_interval=0.0, persistent=True) + def unregister(): register_unregister_modules(reversed(modules), False) diff --git a/extensions/blender_org/viewport_pie_menus/blender_manifest.toml b/extensions/blender_org/viewport_pie_menus/blender_manifest.toml index 3c14108..208ea79 100644 --- a/extensions/blender_org/viewport_pie_menus/blender_manifest.toml +++ b/extensions/blender_org/viewport_pie_menus/blender_manifest.toml @@ -1,7 +1,7 @@ schema_version = "1.0.0" id = "viewport_pie_menus" name = "3D Viewport Pie Menus" -version = "1.7.3" +version = "1.7.4" tagline = "Various pie menus to speed up your workflow" maintainer = "Community" type = "add-on" diff --git a/extensions/blender_org/viewport_pie_menus/bs_utils/hotkeys.py b/extensions/blender_org/viewport_pie_menus/bs_utils/hotkeys.py index f07afbe..110a3e8 100644 --- a/extensions/blender_org/viewport_pie_menus/bs_utils/hotkeys.py +++ b/extensions/blender_org/viewport_pie_menus/bs_utils/hotkeys.py @@ -5,10 +5,12 @@ # This file requires (and is made possible by) Blender 5.0 due to the find_match() API call. import hashlib -from typing import Callable, Any +import json +from typing import Any, Callable import bpy -import json +from bpy.app.translations import pgettext_n as n_ +from bpy.app.translations import pgettext_rpt as rpt_ from bpy.types import KeyMap, KeyMapItem, UILayout # Preserve across Reload Scripts (module reload) when possible, but also keep @@ -27,11 +29,14 @@ KEYMAP_ICONS = { 'Armature': 'ARMATURE_DATA', 'Pose': 'POSE_HLT', 'Weight Paint': 'WPAINT_HLT', + 'Graph Editor': 'GRAPH', + 'Dopesheet': 'ACTION', + 'Curve': 'CURVE_DATA', } KEYMAP_UI_NAMES = { - 'Armature': "Armature Edit", - 'Object Non-modal': "Object Mode", + 'Armature': n_("Armature Edit"), + 'Object Non-modal': n_("Object Mode"), } KMI_DEFAULTS = { @@ -75,9 +80,9 @@ def register_hotkey( existing_kmi = find_kmi_in_km_by_data(addon_km, hotkey_kwargs, bl_idname, op_kwargs) if existing_kmi: # NOTE: It is extremely important to not register duplicate add-on keymaps, AND - # to NOT remove them on add-on unregister, because once an add-on keymap is registered, + # to NOT remove them on add-on unregister, because once an add-on keymap is registered, # it is SUPPOSED TO stick around for ever. - # This allows Blender to store the associated user keymap, meaning the user's modifications + # This allows Blender to store the associated user keymap, meaning the user's modifications # will be stored and restored as expected, whenever the add-on is enabled again. if (addon_km, existing_kmi) not in ADDON_KEYMAPS: ADDON_KEYMAPS.append((addon_km, existing_kmi)) @@ -213,7 +218,7 @@ def get_kmi_ui_info(km, kmi) -> tuple[str, str, str]: return km_icon, km_name, kmi_name def find_kmi_in_km_by_data(km: KeyMap, hotkey_kwargs: dict, op_idname: str, op_kwargs: dict) -> KeyMapItem | None: - """Loop over KeyMapItems of the provided KeyMap, and return the first entry, + """Loop over KeyMapItems of the provided KeyMap, and return the first entry, if any, which matches the passed key combo, operator, and operator properties. """ @@ -369,7 +374,7 @@ class WINDOW_OT_restore_deleted_hotkeys(bpy.types.Operator): def execute(self, context): num_restored = restore_deleted_keymap_items_global(context) - self.report({'INFO'}, f"Restored {num_restored} deleted keymaps.") + self.report({'INFO'}, rpt_("Restored {num_restored} deleted keymaps.").format(num_restored=num_restored)) return {'FINISHED'} diff --git a/extensions/blender_org/viewport_pie_menus/bs_utils/properties.py b/extensions/blender_org/viewport_pie_menus/bs_utils/properties.py index f690936..29ff506 100644 --- a/extensions/blender_org/viewport_pie_menus/bs_utils/properties.py +++ b/extensions/blender_org/viewport_pie_menus/bs_utils/properties.py @@ -175,7 +175,7 @@ def x_mirror_value(value): if isinstance(value, str): return flip_name(value) elif isinstance(value, Object): - get_opposite_obj(value) + return get_opposite_obj(value) else: return value diff --git a/extensions/blender_org/viewport_pie_menus/op_pie_wrappers.py b/extensions/blender_org/viewport_pie_menus/op_pie_wrappers.py index d9cc9b2..e069402 100644 --- a/extensions/blender_org/viewport_pie_menus/op_pie_wrappers.py +++ b/extensions/blender_org/viewport_pie_menus/op_pie_wrappers.py @@ -1,39 +1,35 @@ -# SPDX-FileCopyrightText: 2016-2024 Blender Foundation +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation # # SPDX-License-Identifier: GPL-3.0-or-later -import bpy -import os -from bpy.types import Operator -from bpy.props import StringProperty, BoolProperty import json +import os +from typing import Any + +import bpy +from bpy.props import BoolProperty, StringProperty +from bpy.types import Context, Event, Operator + from .bs_utils.hotkeys import register_hotkey -def idname_to_op_class(idname: str): - parts = idname.split(".") - op = bpy.ops - for part in parts: - op = getattr(op, part) - return op - - class WM_OT_call_menu_pie_drag_only(Operator): """Summon a pie menu only on mouse drag, otherwise initiate an operator""" - # This class is for cases where we want to overwrite a built-in shortcut which triggers on Press, - # with a pie menu that only appears on mouse drag. + + # This class is for cases where we want to overwrite a built-in shortcut which triggers on Press, + # with a pie menu that only appears on mouse drag. # If the user does not mouse drag, invoke the provided fallback operator. # In register_drag_hotkey(), the fallback operator is automagically extracted from the keymap, # at the moment the hotkey is registered. bl_idname = "wm.call_menu_pie_drag_only" bl_label = "Pie Menu on Drag" - bl_options = {'REGISTER', 'INTERNAL'} + bl_options = {'INTERNAL'} - def update_kmi(self, context): + def update_kmi(self, context: Context) -> None: if not hasattr(context, 'keymapitem'): return - kmi = context.keymapitem # Set via UILayout.context_pointer_set(). + kmi = context.keymapitem # Set via UILayout.context_pointer_set(). kmi.type = kmi.type name: StringProperty(options={'SKIP_SAVE'}) @@ -47,7 +43,7 @@ class WM_OT_call_menu_pie_drag_only(Operator): fallback_operator: StringProperty(options={'SKIP_SAVE'}) fallback_op_kwargs: StringProperty(default="{}", options={'SKIP_SAVE'}) - def invoke(self, context, event): + def invoke(self, context: Context, event: Event) -> set[str]: if not self.on_drag: return self.execute(context) self.init_mouse_x = event.mouse_x @@ -55,33 +51,30 @@ class WM_OT_call_menu_pie_drag_only(Operator): context.window_manager.modal_handler_add(self) return {'RUNNING_MODAL'} - def invoke_fallback_operator(self): + def invoke_fallback_operator(self) -> None: op_cls = idname_to_op_class(self.fallback_operator) if not op_cls: return fallback_op_kwargs = json.loads(self.fallback_op_kwargs) - if type(fallback_op_kwargs) == str: - # Not sure why json.loads seems to sometimes return a string, but it does - # when eg. setting Shift+C to drag, and using it when first launching Blender. - # After Reload Scripts, it works fine without this workaround. Weird af. + if isinstance(fallback_op_kwargs, str): + # Not sure why json.loads sometimes returns a string, but it does + # when eg. setting Shift+C to drag and using it on first launch. + # After Reload Scripts it works fine without this. Weird. fallback_op_kwargs = json.loads(fallback_op_kwargs) if op_cls.poll(): try: - # 1. Execute the original operator and capture the result result = op_cls('INVOKE_DEFAULT', **fallback_op_kwargs) - - # 2. [Added] Check if it's a Save operation and report the message manually if 'FINISHED' in result and self.fallback_operator == 'wm.save_mainfile': - # Get current filename, or default to untitled - filename = os.path.basename(bpy.data.filepath) if bpy.data.filepath else "untitled.blend" + # HACK: Fix save notification not appearing when tapping Ctrl+S. + filename = os.path.basename(bpy.data.filepath) self.report({'INFO'}, f'Saved "{filename}"') except TypeError: # This can apparently happen sometimes, see issue #86. print(f"Pie Menu Fallback Operator failed: {self.fallback_operator}, {self.fallback_op_kwargs}") - def modal(self, context, event): + def modal(self, context: Context, event: Event) -> set[str]: if event.value == 'RELEASE': if self.fallback_operator: self.invoke_fallback_operator() @@ -91,10 +84,9 @@ class WM_OT_call_menu_pie_drag_only(Operator): delta_y = abs(event.mouse_y - self.init_mouse_y) if delta_x > threshold or delta_y > threshold: return self.execute(context) - return {'RUNNING_MODAL'} - def execute(self, context): + def execute(self, _context: Context) -> set[str]: bpy.ops.wm.call_menu_pie(name=self.name) return {'FINISHED'} @@ -104,16 +96,16 @@ class WM_OT_call_menu_pie_drag_only(Operator): *, keymap_name: str, pie_name: str, - hotkey_kwargs=None, - default_fallback_op="", - default_fallback_kwargs=None, - on_drag=True, - ): + hotkey_kwargs: dict[str, Any] | None = None, + default_fallback_op: str = "", + default_fallback_kwargs: dict[str, Any] | None = None, + on_drag: bool = True, + ) -> None: if hotkey_kwargs is None: hotkey_kwargs = {'type': "SPACE", 'value': "PRESS"} context = bpy.context fallback_operator = default_fallback_op - fallback_op_kwargs = default_fallback_kwargs if default_fallback_kwargs is not None else {} + fallback_op_kwargs: dict[str, Any] = default_fallback_kwargs if default_fallback_kwargs is not None else {} # IMPORTANT: # Do NOT derive fallback operator/kwargs from the USER keyconfig. @@ -137,21 +129,24 @@ class WM_OT_call_menu_pie_drag_only(Operator): kmi.oskey == hotkey_kwargs.get('oskey', False), kmi.any == hotkey_kwargs.get('any', False), kmi.key_modifier == hotkey_kwargs.get('key_modifier', 'NONE'), - kmi.active + kmi.active, ]: if not condition: break else: fallback_operator = kmi.idname if kmi.properties: - fallback_op_kwargs = {k:getattr(kmi.properties, k) if hasattr(kmi.properties, k) else v for k, v in kmi.properties.items()} + fallback_op_kwargs = { + k: getattr(kmi.properties, k) if hasattr(kmi.properties, k) else v + for k, v in kmi.properties.items() + } break register_hotkey( cls.bl_idname, op_kwargs={ - 'name': pie_name, - 'fallback_operator': fallback_operator, + 'name': pie_name, + 'fallback_operator': fallback_operator, # Deterministic JSON (sort_keys=True) helps keep KMI identity stable across sessions. 'fallback_op_kwargs': json.dumps(fallback_op_kwargs, sort_keys=True), 'on_drag': on_drag, @@ -160,10 +155,20 @@ class WM_OT_call_menu_pie_drag_only(Operator): keymap_name=keymap_name, ) -def register(): + +def idname_to_op_class(idname: str) -> Any: + parts = idname.split(".") + op = bpy.ops + for part in parts: + op = getattr(op, part) + return op + + +def register() -> None: bpy.utils.register_class(WM_OT_call_menu_pie_drag_only) -def unregister(): + +def unregister() -> None: # HACK: As a workaround to https://projects.blender.org/blender/blender/issues/150229, we do not unregister # this operator when the add-on is uninstalled, which is pretty bad. # bpy.utils.unregister_class(WM_OT_call_menu_pie_drag_only) diff --git a/extensions/blender_org/viewport_pie_menus/pie_apply_transform.py b/extensions/blender_org/viewport_pie_menus/pie_apply_transform.py index 3058e69..b1b0887 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_apply_transform.py +++ b/extensions/blender_org/viewport_pie_menus/pie_apply_transform.py @@ -1,9 +1,10 @@ -# SPDX-FileCopyrightText: 2016-2024 Blender Foundation +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation # # SPDX-License-Identifier: GPL-3.0-or-later import bpy -from bpy.types import Menu, Operator +from bpy.types import Context, Event, Menu, Operator + from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only @@ -11,34 +12,26 @@ class PIE_MT_apply_transforms(Menu): bl_idname = "PIE_MT_apply_transforms" bl_label = "Apply Transforms" - def draw(self, context): + def draw(self, context: Context): layout = self.layout pie = layout.menu_pie() # 4 - LEFT props = pie.operator("object.transform_apply", text="Rot/Scale", icon='CON_SIZELIKE') props.location, props.rotation, props.scale = (False, True, True) # 6 - RIGHT - props = pie.operator( - "object.transform_apply", text="Loc/Rot/Scale", icon='ORIENTATION_LOCAL' - ) + props = pie.operator("object.transform_apply", text="Loc/Rot/Scale", icon='ORIENTATION_LOCAL') props.location, props.rotation, props.scale = (True, True, True) # 2 - BOTTOM pie.operator("object.apply_transforms_of_constraints", text="Soft-Apply Constraints", icon='CONSTRAINT') # 8 - TOP - props = pie.operator( - "object.transform_apply", text="Rotation", icon='CON_ROTLIKE' - ) + props = pie.operator("object.transform_apply", text="Rotation", icon='CON_ROTLIKE') props.location, props.rotation, props.scale = (False, True, False) # 7 - TOP - LEFT - props = pie.operator( - "object.transform_apply", text="Location", icon='CON_LOCLIKE' - ) + props = pie.operator("object.transform_apply", text="Location", icon='CON_LOCLIKE') props.location, props.rotation, props.scale = (True, False, False) # 9 - TOP - RIGHT - props = pie.operator( - "object.transform_apply", text="Scale", icon='CON_SIZELIKE' - ) + props = pie.operator("object.transform_apply", text="Scale", icon='CON_SIZELIKE') props.location, props.rotation, props.scale = (False, False, True) # 1 - BOTTOM - LEFT if ( @@ -49,11 +42,10 @@ class PIE_MT_apply_transforms(Menu): ): pie.operator('object.instancer_empty_to_collection', icon='LINKED') else: - pie.operator( - "object.make_single_user", text="Make Single-User", icon='DUPLICATE' - ).obdata = True + pie.operator("object.apply_modifiers_shapekeys", icon='MODIFIER_DATA') + # 3 - BOTTOM - RIGHT - pie.menu("PIE_MT_clear_menu", text="Clear Transforms", icon='THREE_DOTS') + pie.menu("PIE_MT_apply_transforms_extras", text="More...", icon='THREE_DOTS') class OBJECT_OT_apply_transforms_of_constraints(Operator): @@ -64,18 +56,13 @@ class OBJECT_OT_apply_transforms_of_constraints(Operator): bl_options = {'REGISTER'} @classmethod - def poll(cls, context): - if not any( - [ - any([c.enabled and c.influence > 0 for c in obj.constraints]) - for obj in context.selected_objects - ] - ): + def poll(cls, context: Context) -> bool: + if not any(any(c.enabled and c.influence > 0 for c in obj.constraints) for obj in context.selected_objects): cls.poll_message_set("No selected objects with enabled constraints.") return False return True - def execute(self, context): + def execute(self, _context: Context): # This is just a wrapper operator, to add a better tooltip and poll message. return bpy.ops.object.visual_transform_apply() @@ -88,15 +75,13 @@ class OBJECT_OT_make_meshes_single_user(Operator): bl_options = {'REGISTER'} @classmethod - def poll(cls, context): - if not any( - [obj.data and obj.data.users > 1 for obj in context.selected_objects] - ): + def poll(cls, context: Context) -> bool: + if not any(obj.data and obj.data.users > 1 for obj in context.selected_objects): cls.poll_message_set("No selected objects with multi-user meshes.") return False return True - def execute(self, context): + def execute(self, _context: Context): # This is just a wrapper operator, to add a better tooltip and poll message. return bpy.ops.object.duplicates_make_real() @@ -107,25 +92,63 @@ class OBJECT_OT_clear_all_transforms(Operator): bl_description = "Clear All Transforms" bl_options = {'REGISTER', 'UNDO'} - def execute(self, context): + def execute(self, _context: Context): bpy.ops.object.location_clear() bpy.ops.object.rotation_clear() bpy.ops.object.scale_clear() return {'FINISHED'} +class OBJECT_OT_apply_modifiers_shapekeys(Operator): + """Apply the object's modifier stack and shape keys. Same as calling "Convert To -> Mesh". + + Shift: Keep the original object as a duplicate.""" + + bl_idname = "object.apply_modifiers_shapekeys" + bl_label = "Apply Modifiers & Shape Keys" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context: Context) -> bool: + return bool(context.active_object) + + def invoke(self, _context: Context, event: Event): + bpy.ops.object.convert(target='MESH', keep_original=event.shift) + return {'FINISHED'} + + class PIE_MT_clear_transforms(Menu): - bl_idname = "PIE_MT_clear_menu" - bl_label = "Clear Transforms" + bl_idname = "PIE_MT_apply_transforms_extras" + bl_label = "Apply Transforms Extras" - def draw(self, context): + def draw(self, _context: Context): layout = self.layout - layout.operator("clear.all", text="Clear All", icon='NONE') - layout.operator("object.location_clear", text="Clear Location", icon='NONE') - layout.operator("object.rotation_clear", text="Clear Rotation", icon='NONE') - layout.operator("object.scale_clear", text="Clear Scale", icon='NONE') - layout.operator("object.origin_clear", text="Clear Origin", icon='NONE') + layout.label(text="Clear Transforms") + layout.operator("clear.all", text="Clear All", icon='X') + layout.operator("object.location_clear", text="Clear Location", icon='CON_LOCLIKE') + layout.operator("object.rotation_clear", text="Clear Rotation", icon='CON_ROTLIKE') + layout.operator("object.scale_clear", text="Clear Scale", icon='CON_SIZELIKE') + layout.operator("object.origin_clear", text="Clear Origin", icon='PIVOT_CURSOR') + layout.separator() + layout.label(text="To Deltas") + props = layout.operator("object.transforms_to_deltas", text="Location to Deltas", icon='CON_LOCLIKE') + props.mode = 'LOC' + props = layout.operator("object.transforms_to_deltas", text="Rotation to Deltas", icon='CON_ROTLIKE') + props.mode = 'ROT' + props = layout.operator("object.transforms_to_deltas", text="Scale to Deltas", icon='CON_SIZELIKE') + props.mode = 'SCALE' + props = layout.operator( + "object.transforms_to_deltas", text="All Transforms to Deltas", icon='ORIENTATION_LOCAL' + ) + props.mode = 'ALL' + layout.operator("object.anim_transforms_to_deltas", text="Animated Transforms to Deltas", icon='KEYINGSET') + + layout.separator() + layout.label(text="Mesh") + make_single = layout.operator("object.make_single_user", text="Make Single-User", icon='DUPLICATE') + make_single.obdata = True + layout.operator("object.duplicates_make_real", text="Make Instances Real", icon='DUPLICATE') registry = ( @@ -133,6 +156,7 @@ registry = ( OBJECT_OT_apply_transforms_of_constraints, OBJECT_OT_make_meshes_single_user, OBJECT_OT_clear_all_transforms, + OBJECT_OT_apply_modifiers_shapekeys, PIE_MT_clear_transforms, ) diff --git a/extensions/blender_org/viewport_pie_menus/pie_camera.py b/extensions/blender_org/viewport_pie_menus/pie_camera.py index 2ff077a..fd621e6 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_camera.py +++ b/extensions/blender_org/viewport_pie_menus/pie_camera.py @@ -1,9 +1,10 @@ -# SPDX-FileCopyrightText: 2016-2024 Blender Foundation +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation # # SPDX-License-Identifier: GPL-3.0-or-later import bpy -from bpy.types import Menu, Operator +from bpy.types import Context, Event, Menu, Object, Operator + from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only # Some magic numbers that are either hard-coded into Blender, @@ -16,7 +17,7 @@ class PIE_MT_camera(Menu): bl_idname = "PIE_MT_camera" bl_label = "Camera" - def draw(self, context): + def draw(self, context: Context): pie = self.layout.menu_pie() scene = context.scene space = context.area.spaces.active @@ -35,9 +36,7 @@ class PIE_MT_camera(Menu): text = "View Active Camera" if context.space_data.region_3d.view_perspective == 'CAMERA': text = "Return to Viewport" - pie.operator( - 'view3d.view_camera_with_poll', text=text, icon='VIEW_CAMERA_UNSELECTED' - ) + pie.operator('view3d.view_camera_with_poll', text=text, icon='VIEW_CAMERA_UNSELECTED') # 2 - BOTTOM box = pie.box().column(align=True) row = box.row() @@ -48,9 +47,20 @@ class PIE_MT_camera(Menu): if camera: box.prop(camera.data, 'lens') box.prop(camera.data, 'sensor_width') + + row = box.row(align=True) + row.prop(camera.data.dof, 'use_dof', text="") + fstop_row = row.row() + fstop_row.enabled = camera.data.dof.use_dof + fstop_row.prop(camera.data.dof, 'aperture_fstop', text="Depth of Field F-Stop") + + box.separator() row = box.row(align=True) row.prop(camera.data, 'show_passepartout', text="") - row.prop(camera.data, 'passepartout_alpha') + row_alpha = row.row() + row_alpha.enabled = camera.data.show_passepartout + row_alpha.prop(camera.data, 'passepartout_alpha') + row = box.row(align=True) row.prop(camera.data, 'show_composition_thirds') row.prop(camera.data, 'show_composition_center') @@ -88,13 +98,13 @@ class VIEW3D_OT_lock_active_camera_transforms(Operator): bl_options = {'REGISTER', 'UNDO'} @classmethod - def poll(cls, context): + def poll(cls, context: Context) -> bool: if not get_current_camera(context): cls.poll_message_set("No active camera in this viewport.") return False return True - def execute(self, context): + def execute(self, context: Context): camera = get_current_camera(context) lock = False @@ -119,16 +129,14 @@ class VIEW3D_OT_camera_fit_view(Operator): bl_options = {'REGISTER', 'UNDO'} @classmethod - def poll(cls, context): + def poll(cls, context: Context) -> bool: if not context.space_data or not hasattr(context.space_data, 'region_3d'): return False if context.space_data.region_3d.view_perspective == 'CAMERA': cls.poll_message_set("Already in a camera view.") return False camera = get_current_camera(context) - if not camera and not ( - context.active_object and context.active_object.type == 'CAMERA' - ): + if not camera and not (context.active_object and context.active_object.type == 'CAMERA'): cls.poll_message_set("No active camera.") return False if camera and (any(camera.lock_location) or any(camera.lock_rotation)): @@ -136,14 +144,12 @@ class VIEW3D_OT_camera_fit_view(Operator): return False return True - def invoke(self, context, _event): - if not context.scene.camera and not ( - context.active_object and context.active_object.type == 'CAMERA' - ): + def invoke(self, context: Context, _event: Event): + if not context.scene.camera and not (context.active_object and context.active_object.type == 'CAMERA'): self.create_camera = True return self.execute(context) - def execute(self, context): + def execute(self, context: Context): cam = get_current_camera(context) space = context.space_data @@ -173,7 +179,7 @@ class VIEW3D_OT_camera_from_view(Operator): bl_label = "New Camera from View" bl_options = {'REGISTER', 'UNDO'} - def execute(self, context): + def execute(self, context: Context): if context.mode != 'OBJECT': bpy.ops.object.mode_set(mode='OBJECT') bpy.ops.object.camera_add() @@ -193,7 +199,7 @@ class VIEW3D_OT_set_active_camera(Operator): bl_options = {'REGISTER', 'UNDO'} @classmethod - def poll(cls, context): + def poll(cls, context: Context) -> bool: if not context.active_object: cls.poll_message_set("No active object.") return False @@ -205,7 +211,7 @@ class VIEW3D_OT_set_active_camera(Operator): return False return True - def execute(self, context): + def execute(self, context: Context): context.scene.camera = context.active_object self.report({'INFO'}, f"Set active camera: {context.active_object.name}") return {'FINISHED'} @@ -219,17 +225,17 @@ class VIEW3D_OT_view_camera_with_poll(Operator): bl_options = {'REGISTER', 'UNDO'} @classmethod - def poll(cls, context): + def poll(cls, context: Context) -> bool: if not get_current_camera(context): cls.poll_message_set("No active camera.") return False return True - def execute(self, context): + def execute(self, _context: Context): return bpy.ops.view3d.view_camera() -def get_current_camera(context): +def get_current_camera(context: Context) -> Object | None: space = context.area.spaces.active if space.type == 'VIEW_3D' and space.use_local_camera: return space.camera diff --git a/extensions/blender_org/viewport_pie_menus/pie_copy_attributes.py b/extensions/blender_org/viewport_pie_menus/pie_copy_attributes.py new file mode 100644 index 0000000..b73e869 --- /dev/null +++ b/extensions/blender_org/viewport_pie_menus/pie_copy_attributes.py @@ -0,0 +1,1121 @@ +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation +# +# SPDX-License-Identifier: GPL-3.0-or-later + +from collections.abc import Callable +from typing import Any + +import bpy +from bpy.props import BoolProperty, BoolVectorProperty, EnumProperty +from bpy.types import ID, Context, FCurve, Menu, Modifier, Object, Operator, PoseBone +from mathutils import Matrix + +from .bs_utils.properties import copy_custom_property +from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only + +_UNSUPPORTED_LIGHT_LINK_TYPES = frozenset( + {'GREASEPENCIL', 'ARMATURE', 'LATTICE', 'EMPTY', 'LIGHT_PROBE', 'CAMERA', 'SPEAKER'} +) + + +# ── Pie menus ───────────────────────────────────────────────────────────────── + + +class PIE_MT_copy_object(Menu): + bl_idname = "PIE_MT_copy_object" + bl_label = "Copy Attributes" + + def draw(self, _context: Context): + pie = self.layout.menu_pie() + # 4 - LEFT + op = pie.operator('wm.call_menu_pie', text="Copy Transforms...", icon='CON_LOCLIKE') + op.name = PIE_MT_copy_object_transforms.bl_idname + # 6 - RIGHT + pie.operator('view3d.copybuffer', text="Copy Objects to Clipboard", icon='COPYDOWN') + # 2 - BOTTOM + pie.menu(PIE_MT_copy_collections.bl_idname, text="Copy Collections...", icon='GROUP') + # 8 - TOP + op = pie.operator(OBJECT_OT_copy_modifiers.bl_idname, text="Copy Selected Modifiers", icon='MODIFIER') + op.selected_only = True + # 7 - TOP - LEFT + op = pie.operator(OBJECT_OT_copy_constraints.bl_idname, text="Copy Selected Constraints", icon='CONSTRAINT') + op.selected_only = True + # 9 - TOP - RIGHT + pie.operator(OBJECT_OT_copy_selected_custom_props.bl_idname, icon='PROPERTIES') + # 1 - BOTTOM - LEFT + op = pie.operator(OBJECT_OT_copy_modifiers.bl_idname, text="Copy Modifier Stack", icon='MODIFIER') + op.selected_only = False + # 3 - BOTTOM - RIGHT + pie.menu(PIE_MT_copy_object_properties.bl_idname, text="Object Properties...", icon='OBJECT_DATA') + + +class PIE_MT_copy_pose(Menu): + bl_idname = "PIE_MT_copy_pose" + bl_label = "Copy" + + def draw(self, _context: Context): + pie = self.layout.menu_pie() + # 4 - LEFT + op = pie.operator('wm.call_menu_pie', text="Transforms...", icon='CON_LOCLIKE') + op.name = PIE_MT_copy_pose_transforms.bl_idname + # 6 - RIGHT + pie.operator('pose.copy', text="Pose", icon='COPYDOWN') + # 2 - BOTTOM + pie.separator() + # 8 - TOP + pie.separator() + # 7 - TOP - LEFT + op = pie.operator(POSE_OT_copy_bone_constraints.bl_idname, icon='CONSTRAINT_BONE') + op.selected_only = True + # 9 - TOP - RIGHT + pie.operator(POSE_OT_copy_selected_custom_props.bl_idname, icon='PROPERTIES') + # 1 - BOTTOM - LEFT + pie.operator(POSE_OT_copy_bone_constraints.bl_idname, icon='CONSTRAINT_BONE') + # 3 - BOTTOM - RIGHT + pie.menu(PIE_MT_copy_bone_properties.bl_idname, text="Bone Properties...", icon='BONE_DATA') + + +class PIE_MT_copy_object_transforms(Menu): + bl_idname = "PIE_MT_copy_object_transforms" + bl_label = "Copy Transforms" + + def draw(self, _context: Context): + pie = self.layout.menu_pie() + # 4 - LEFT + pie.separator() + # 6 - RIGHT + op = pie.operator(OBJECT_OT_copy_transform.bl_idname, text="Rotation", icon='CON_ROTLIKE') + op.transform = 'ROTATION' + # 2 - BOTTOM + pie.operator(OBJECT_OT_copy_transform_locks.bl_idname, text="Transform Locks", icon='LOCKED') + # 8 - TOP + pie.separator() + # 7 - TOP - LEFT + pie.separator() + # 9 - TOP - RIGHT + op = pie.operator(OBJECT_OT_copy_transform.bl_idname, text="Location", icon='CON_LOCLIKE') + op.transform = 'LOCATION' + # 1 - BOTTOM - LEFT + pie.separator() + # 3 - BOTTOM - RIGHT + op = pie.operator(OBJECT_OT_copy_transform.bl_idname, text="Scale", icon='CON_SIZELIKE') + op.transform = 'SCALE' + + +class PIE_MT_copy_pose_transforms(Menu): + bl_idname = "PIE_MT_copy_pose_transforms" + bl_label = "Copy Transforms" + + def draw(self, _context: Context): + pie = self.layout.menu_pie() + # 4 - LEFT + op = pie.operator(POSE_OT_copy_transform.bl_idname, text="Visual Rotation", icon='CON_ROTLIKE') + op.transform, op.visual = 'ROTATION', True + # 6 - RIGHT + op = pie.operator(POSE_OT_copy_transform.bl_idname, text="Local Rotation", icon='CON_ROTLIKE') + op.transform, op.visual = 'ROTATION', False + # 2 - BOTTOM + pie.operator(OBJECT_OT_copy_transform_locks.bl_idname, text="Transform Locks", icon='LOCKED') + # 8 - TOP + pie.separator() + # 7 - TOP - LEFT + op = pie.operator(POSE_OT_copy_transform.bl_idname, text="Visual Location", icon='CON_LOCLIKE') + op.transform, op.visual = 'LOCATION', True + # 9 - TOP - RIGHT + op = pie.operator(POSE_OT_copy_transform.bl_idname, text="Local Location", icon='CON_LOCLIKE') + op.transform, op.visual = 'LOCATION', False + # 1 - BOTTOM - LEFT + op = pie.operator(POSE_OT_copy_transform.bl_idname, text="Visual Scale", icon='CON_SIZELIKE') + op.transform, op.visual = 'SCALE', True + # 3 - BOTTOM - RIGHT + op = pie.operator(POSE_OT_copy_transform.bl_idname, text="Local Scale", icon='CON_SIZELIKE') + op.transform, op.visual = 'SCALE', False + + +# ── Sub-menus ───────────────────────────────────────────────────────────────── + + +class PIE_MT_copy_bone_properties(Menu): + bl_idname = "PIE_MT_copy_bone_properties" + bl_label = "Bone Properties" + + def draw(self, _context: Context): + layout = self.layout + layout.operator(POSE_OT_copy_bbone_settings.bl_idname, icon='IPO_BEZIER') + layout.operator(POSE_OT_copy_ik_limits.bl_idname, icon='CON_KINEMATIC') + layout.operator(POSE_OT_copy_bone_shape.bl_idname, icon='BONE_DATA') + layout.operator(POSE_OT_copy_bone_colors.bl_idname, icon='COLOR') + layout.operator(POSE_OT_copy_bone_collections.bl_idname, icon='GROUP_BONE') + + +class PIE_MT_copy_object_properties(Menu): + bl_idname = "PIE_MT_copy_object_properties" + bl_label = "Object Properties" + + def draw(self, _context: Context): + layout = self.layout + layout.operator(OBJECT_OT_copy_draw_options.bl_idname, icon='OBJECT_DATA') + layout.operator(OBJECT_OT_copy_object_color.bl_idname, icon='COLOR') + layout.operator(OBJECT_OT_copy_instancing.bl_idname, icon='OUTLINER_OB_EMPTY') + layout.operator(OBJECT_OT_copy_pass_index.bl_idname, icon='RENDERLAYERS') + layout.separator() + layout.operator(OBJECT_OT_copy_constraints.bl_idname, text="Copy Constraint Stack", icon='CONSTRAINT') + + +class PIE_MT_copy_collections(Menu): + bl_idname = "PIE_MT_copy_collections" + bl_label = "Copy Collections" + + def draw(self, _context: Context): + layout = self.layout + layout.operator(OBJECT_OT_copy_collection_links.bl_idname, icon='GROUP') + layout.separator() + layout.operator(OBJECT_OT_copy_light_linking.bl_idname, icon='LIGHT').mode = 'LIGHT' + layout.operator( + OBJECT_OT_copy_light_linking.bl_idname, text="Copy Shadow Linking", icon='OUTLINER_OB_LIGHT' + ).mode = 'SHADOW' + + +# ── Object mode operators ───────────────────────────────────────────────────── + + +class OBJECT_OT_copy_transform(Operator): + bl_idname = "object.copy_transform" + bl_label = "Copy Object Transform" + bl_options = {'REGISTER', 'UNDO'} + + transform: EnumProperty( + name="Transform", + items=[ + ('LOCATION', "Location", ""), + ('ROTATION', "Rotation", ""), + ('SCALE', "Scale", ""), + ], + default='LOCATION', + ) + + @classmethod + def poll(cls, context: Context) -> bool: + return context.mode == 'OBJECT' and len(context.selected_objects) > 1 + + @classmethod + def description(cls, _context: Context, props) -> str: + return f"Copy {props.transform.lower()} from active to selected objects" + + def execute(self, context: Context): + active_obj = context.active_object + num_objs = 0 + for obj in context.selected_objects: + if obj == active_obj: + continue + matrix = world_to_basis(active_obj, obj) if obj.parent else active_obj.matrix_world + if self.transform == 'LOCATION': + obj.location = matrix.to_translation() + elif self.transform == 'ROTATION': + set_rotation_from_matrix(obj, matrix.to_3x3()) + else: + obj.scale = matrix.to_scale() + num_objs += 1 + self.report({'INFO'}, f"Copied {self.transform.lower()} to {num_objs} object(s).") + return {'FINISHED'} + + +class OBJECT_OT_copy_transform_locks(Operator): + bl_idname = "object.copy_transform_locks" + bl_label = "Copy Transform Locks" + bl_description = "Copy transform lock flags from active to selected objects or bones" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context: Context) -> bool: + if context.mode == 'POSE': + return True + return context.mode == 'OBJECT' and len(context.selected_objects) > 1 + + def execute(self, context: Context): + if context.mode == 'POSE': + active_pb = context.active_pose_bone + targets = [b for b in context.selected_pose_bones if b != active_pb] + else: + active_pb = context.active_object + targets = [o for o in context.selected_objects if o != active_pb] + + for target in targets: + for i, state in enumerate(active_pb.lock_location): + target.lock_location[i] = state + for i, state in enumerate(active_pb.lock_rotation): + target.lock_rotation[i] = state + target.lock_rotations_4d = active_pb.lock_rotations_4d + target.lock_rotation_w = active_pb.lock_rotation_w + for i, state in enumerate(active_pb.lock_scale): + target.lock_scale[i] = state + kind = "bone(s)" if context.mode == 'POSE' else "object(s)" + self.report({'INFO'}, f"Copied transform locks to {len(targets)} {kind}.") + return {'FINISHED'} + + +class OBJECT_OT_copy_draw_options(Operator): + bl_idname = "object.copy_draw_options" + bl_label = "Copy Viewport Display" + bl_description = ( + "Copy viewport display settings (display type, overlays, bounds, etc.) from active to selected objects" + ) + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context: Context) -> bool: + return context.mode == 'OBJECT' and len(context.selected_objects) > 1 + + def execute(self, context: Context): + active_obj = context.active_object + num_objs = 0 + for obj in context.selected_objects: + if obj == active_obj: + continue + obj.display_type = active_obj.display_type + obj.show_axis = active_obj.show_axis + obj.show_bounds = active_obj.show_bounds + obj.display_bounds_type = active_obj.display_bounds_type + obj.show_name = active_obj.show_name + obj.show_texture_space = active_obj.show_texture_space + obj.show_transparent = active_obj.show_transparent + obj.show_wire = active_obj.show_wire + obj.show_all_edges = active_obj.show_all_edges + obj.show_in_front = active_obj.show_in_front + obj.empty_display_type = active_obj.empty_display_type + obj.empty_display_size = active_obj.empty_display_size + num_objs += 1 + self.report({'INFO'}, f"Copied viewport display to {num_objs} object(s).") + return {'FINISHED'} + + +class OBJECT_OT_copy_instancing(Operator): + bl_idname = "object.copy_instancing" + bl_label = "Copy Instancing" + bl_description = "Copy instance type (Verts, Faces, Collection, etc.) from active to selected objects" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context: Context) -> bool: + return context.mode == 'OBJECT' and len(context.selected_objects) > 1 + + def execute(self, context: Context): + active_obj = context.active_object + num_objs = 0 + for obj in context.selected_objects: + if obj == active_obj: + continue + obj.instance_type = active_obj.instance_type + obj.use_instance_vertices_rotation = active_obj.use_instance_vertices_rotation + obj.show_instancer_for_viewport = active_obj.show_instancer_for_viewport + obj.show_instancer_for_render = active_obj.show_instancer_for_render + num_objs += 1 + self.report({'INFO'}, f"Copied instancing to {num_objs} object(s).") + return {'FINISHED'} + + +class OBJECT_OT_copy_object_color(Operator): + bl_idname = "object.copy_object_color" + bl_label = "Copy Object Color" + bl_description = "Copy object color from active to selected objects" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context: Context) -> bool: + return context.mode == 'OBJECT' and len(context.selected_objects) > 1 + + def execute(self, context: Context): + active_obj = context.active_object + num_objs = 0 + for obj in context.selected_objects: + if obj == active_obj: + continue + obj.color = active_obj.color + num_objs += 1 + self.report({'INFO'}, f"Copied object color to {num_objs} object(s).") + return {'FINISHED'} + + +class OBJECT_OT_copy_pass_index(Operator): + bl_idname = "object.copy_pass_index" + bl_label = "Copy Pass Index" + bl_description = "Copy render pass index from active to selected objects" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context: Context) -> bool: + return context.mode == 'OBJECT' and len(context.selected_objects) > 1 + + def execute(self, context: Context): + active_obj = context.active_object + num_objs = 0 + for obj in context.selected_objects: + if obj == active_obj: + continue + obj.pass_index = active_obj.pass_index + num_objs += 1 + self.report({'INFO'}, f"Copied pass index to {num_objs} object(s).") + return {'FINISHED'} + + +class OBJECT_OT_copy_modifiers(Operator): + bl_idname = "object.copy_modifiers" + bl_label = "Copy Modifiers" + bl_options = {'REGISTER', 'UNDO'} + + selected_only: BoolProperty( + name="Selected Only", + description="Show a dialog to choose which modifiers to copy, instead of copying the full stack", + default=False, + ) + selection: BoolVectorProperty(size=32, options={'SKIP_SAVE'}) + + @classmethod + def poll(cls, context: Context) -> bool: + return ( + context.mode == 'OBJECT' + and len(context.selected_objects) > 1 + and bool(context.active_object and context.active_object.modifiers) + ) + + @classmethod + def description(cls, _context: Context, props) -> str: + if props.selected_only: + return "Choose which modifiers to copy from active to selected objects" + return "Replace modifier stack on selected objects with all modifiers from the active object" + + def invoke(self, context: Context, _event): + if self.selected_only: + return context.window_manager.invoke_props_dialog(self) + return self.execute(context) + + def draw(self, context: Context): + for idx, mod in enumerate(context.active_object.modifiers): + self.layout.prop(self, 'selection', index=idx, text=mod.name, toggle=True) + + def execute(self, context: Context): + active_obj = context.active_object + num_objs = 0 + for obj in context.selected_objects: + if obj == active_obj: + continue + if not self.selected_only: + for mod in obj.modifiers: + obj.modifiers.remove(mod) + for idx, src_mod in enumerate(active_obj.modifiers.values()): + if not self.selected_only or self.selection[idx]: + new_mod = obj.modifiers.new(name=src_mod.name, type=src_mod.type) + transfer_modifier_props(context, src_mod, new_mod) + copy_drivers_for_prefix( + active_obj, + obj, + src_prefix=f'modifiers["{src_mod.name}"]', + dst_prefix=f'modifiers["{new_mod.name}"]', + ) + num_objs += 1 + if self.selected_only: + self.report({'INFO'}, f"Copied {sum(self.selection)} modifier(s) to {num_objs} object(s).") + else: + self.report({'INFO'}, f"Copied modifier stack to {num_objs} object(s).") + return {'FINISHED'} + + +class OBJECT_OT_copy_collection_links(Operator): + bl_idname = "object.copy_collection_links" + bl_label = "Copy Collection Links" + bl_description = "Link selected objects into all collections that the active object belongs to" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context: Context) -> bool: + return context.mode == 'OBJECT' and len(context.selected_objects) > 1 + + def execute(self, context: Context): + active_obj = context.active_object + num_objects = 0 + for other_obj in context.selected_objects: + if other_obj == active_obj: + continue + for col in other_obj.users_collection: + col.objects.unlink(other_obj) + for col in active_obj.users_collection: + if other_obj not in set(col.objects): + col.objects.link(other_obj) + num_objects += 1 + self.report({'INFO'}, f"Linked {num_objects} object(s) into collections.") + return {'FINISHED'} + + +class OBJECT_OT_copy_light_linking(Operator): + bl_idname = "object.copy_light_linking" + bl_label = "Copy Light Linking" + bl_options = {'REGISTER', 'UNDO'} + + mode: EnumProperty( + name="Mode", + items=[ + ('LIGHT', "Light Linking", ""), + ('SHADOW', "Shadow Linking", ""), + ], + default='LIGHT', + ) + + @classmethod + def poll(cls, context: Context) -> bool: + if not (context.mode == 'OBJECT' and len(context.selected_objects) > 1): + return False + obj = context.active_object + if not obj or obj.type in _UNSUPPORTED_LIGHT_LINK_TYPES: + cls.poll_message_set("Active object type doesn't support light/shadow linking") + return False + return True + + @classmethod + def description(cls, _context: Context, props) -> str: + kind = "light" if props.mode == 'LIGHT' else "shadow" + return f"Copy {kind} linking collection from active to selected objects" + + def execute(self, context: Context): + src = context.active_object + num_objs = 0 + for obj in context.selected_objects: + if obj == src or obj.type in _UNSUPPORTED_LIGHT_LINK_TYPES: + continue + if self.mode == 'LIGHT': + obj.light_linking.receiver_collection = src.light_linking.receiver_collection + else: + obj.light_linking.blocker_collection = src.light_linking.blocker_collection + num_objs += 1 + kind = "light" if self.mode == 'LIGHT' else "shadow" + self.report({'INFO'}, f"Copied {kind} linking to {num_objs} object(s).") + return {'FINISHED'} + + +class _CopyConstraintsMixin: + """Shared properties and logic for constraint-copying operators.""" + + selected_only: BoolProperty( + name="Selected Only", + description="Show a dialog to choose which constraints to copy, instead of replacing the full stack", + default=False, + ) + selection: BoolVectorProperty(size=32, options={'SKIP_SAVE'}) + + def invoke(self, context: Context, _event): + if self.selected_only: + return context.window_manager.invoke_props_dialog(self) + return self.execute(context) + + def draw(self, context: Context): + for idx, con in enumerate(self._get_active_constraints(context)): + self.layout.prop(self, 'selection', index=idx, text=con.name, toggle=True) + + def _execute_copy_constraints( + self, + active: Object | PoseBone, + targets: list[Object | PoseBone], + src_id: ID, + dst_id_fn: Callable[[Object | PoseBone], ID], + src_prefix_fn: Callable[[str], str], + dst_prefix_fn: Callable[[Object | PoseBone, str], str], + noun: str, + ) -> set[str]: + num = 0 + for target in targets: + if not self.selected_only: + for con in target.constraints: + target.constraints.remove(con) + for idx, src in enumerate(active.constraints.values()): + if not self.selected_only or self.selection[idx]: + new_con = target.constraints.copy(src) + copy_drivers_for_prefix( + src_id, + dst_id_fn(target), + src_prefix=src_prefix_fn(src.name), + dst_prefix=dst_prefix_fn(target, new_con.name), + ) + num += 1 + if self.selected_only: + self.report({'INFO'}, f"Copied {sum(self.selection)} constraint(s) to {num} {noun}.") + else: + self.report({'INFO'}, f"Copied constraints to {num} {noun}.") + return {'FINISHED'} + + +class _CopyCustomPropsMixin: + """Shared properties and logic for custom-property-copying operators.""" + + selection: BoolVectorProperty(size=32, options={'SKIP_SAVE'}) + + def invoke(self, context: Context, _event): + return context.window_manager.invoke_props_dialog(self) + + def draw(self, context: Context): + for idx, key in enumerate(self._get_active_keys(context)): + self.layout.prop(self, 'selection', index=idx, text=key, toggle=True) + + def _execute_copy_props( + self, + active: Object | PoseBone, + targets: list[Object | PoseBone], + noun: str, + src_id: ID, + dst_id_fn: Callable[[Object | PoseBone], ID], + src_prefix_fn: Callable[[str], str], + dst_prefix_fn: Callable[[Object | PoseBone, str], str], + ) -> set[str]: + keys = list(active.keys()) + num = 0 + for target in targets: + for idx, flag in enumerate(self.selection): + if flag: + key = keys[idx] + copy_custom_property(active, target, key) + copy_drivers_for_prefix( + src_id, + dst_id_fn(target), + src_prefix=src_prefix_fn(key), + dst_prefix=dst_prefix_fn(target, key), + ) + num += 1 + self.report({'INFO'}, f"Copied {sum(self.selection)} property(ies) to {num} {noun}.") + return {'FINISHED'} + + +class OBJECT_OT_copy_constraints(_CopyConstraintsMixin, Operator): + bl_idname = "object.copy_constraints" + bl_label = "Copy Constraints" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context: Context) -> bool: + return ( + context.mode == 'OBJECT' + and len(context.selected_objects) > 1 + and bool(context.active_object and context.active_object.constraints) + ) + + @classmethod + def description(cls, _context: Context, props) -> str: + if props.selected_only: + return "Choose which constraints to copy from active to selected objects" + return "Replace constraints on selected objects with all constraints from the active object" + + def _get_active_constraints(self, context: Context): + return context.active_object.constraints + + def execute(self, context: Context): + active = context.active_object + targets = [o for o in context.selected_objects if o != active] + return self._execute_copy_constraints( + active, + targets, + src_id=active, + dst_id_fn=lambda t: t, + src_prefix_fn=lambda name: f'constraints["{name}"]', + dst_prefix_fn=lambda _t, name: f'constraints["{name}"]', + noun="object(s)", + ) + + +class OBJECT_OT_copy_selected_custom_props(_CopyCustomPropsMixin, Operator): + bl_idname = "object.copy_selected_custom_props" + bl_label = "Copy Selected Custom Properties" + bl_description = "Choose which custom properties to copy from active to selected objects" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context: Context) -> bool: + return ( + context.mode == 'OBJECT' + and len(context.selected_objects) > 1 + and bool(context.active_object and context.active_object.keys()) + ) + + def _get_active_keys(self, context: Context): + return context.active_object.keys() + + def execute(self, context: Context): + active = context.active_object + targets = [o for o in context.selected_objects if o != active] + return self._execute_copy_props( + active, + targets, + "object(s)", + src_id=active, + dst_id_fn=lambda t: t, + src_prefix_fn=lambda key: f'["{key}"]', + dst_prefix_fn=lambda _t, key: f'["{key}"]', + ) + + +# ── Pose mode operators ─────────────────────────────────────────────────────── + + +def bone_copy_poll(cls, context): + if not context.mode == 'POSE': + cls.poll_message_set("Must be in pose mode.") + if not context.active_pose_bone: + cls.poll_message_set("No active pose bone.") + return False + if len(context.selected_pose_bones) < 2: + cls.poll_message_set("At least two bones must be selected.") + return False + return True + + +def bone_copy_constraint_poll(cls, context): + if not bone_copy_poll(cls, context): + return False + if not context.active_pose_bone.constraints: + cls.poll_message_set("Active bone has no constraints to copy.") + return False + return True + + +class POSE_OT_copy_bone_constraints(_CopyConstraintsMixin, Operator): + bl_idname = "pose.copy_bone_constraints" + bl_label = "Copy Constraints" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + return bone_copy_constraint_poll(cls, context) + + @classmethod + def description(cls, _context: Context, props) -> str: + if props.selected_only: + return "Choose which constraints to copy from active to selected bones" + return "Copy all constraints from active to selected bones" + + def _get_active_constraints(self, context: Context): + return context.active_pose_bone.constraints + + def execute(self, context: Context): + active = context.active_pose_bone + targets = [pb for pb in context.selected_pose_bones if pb != active] + return self._execute_copy_constraints( + active, + targets, + src_id=active.id_data, + dst_id_fn=lambda t: t.id_data, + src_prefix_fn=lambda name: f'pose.bones["{active.name}"].constraints["{name}"]', + dst_prefix_fn=lambda t, name: f'pose.bones["{t.name}"].constraints["{name}"]', + noun="bone(s)", + ) + + +class POSE_OT_copy_selected_custom_props(_CopyCustomPropsMixin, Operator): + bl_idname = "pose.copy_selected_custom_props" + bl_label = "Copy Selected Custom Properties" + bl_description = "Choose which custom properties to copy from active to selected bones" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + return bone_copy_poll(cls, context) + + def _get_active_keys(self, context: Context): + return context.active_pose_bone.keys() + + def execute(self, context: Context): + active = context.active_pose_bone + targets = [pb for pb in context.selected_pose_bones if pb != active] + return self._execute_copy_props( + active, + targets, + "bone(s)", + src_id=active.id_data, + dst_id_fn=lambda t: t.id_data, + src_prefix_fn=lambda key: f'pose.bones["{active.name}"]["{key}"]', + dst_prefix_fn=lambda t, key: f'pose.bones["{t.name}"]["{key}"]', + ) + + +class POSE_OT_copy_transform(Operator): + bl_idname = "pose.copy_transform" + bl_label = "Copy Bone Transform" + bl_options = {'REGISTER', 'UNDO'} + + transform: EnumProperty( + name="Transform", + items=[ + ('LOCATION', "Location", ""), + ('ROTATION', "Rotation", ""), + ('SCALE', "Scale", ""), + ], + default='LOCATION', + ) + visual: BoolProperty( + name="Visual", + description="Copy visual (constraint-evaluated) transform instead of local", + default=False, + ) + + @classmethod + def poll(cls, context: Context) -> bool: + return context.mode == 'POSE' + + @classmethod + def description(cls, _context: Context, props) -> str: + space = "visual (constraint-evaluated)" if props.visual else "local" + return f"Copy {space} {props.transform.lower()} from active to selected bones" + + def execute(self, context: Context): + active_pb = context.active_pose_bone + num_bones = 0 + for pbone in context.selected_pose_bones: + if pbone == active_pb: + continue + if self.visual: + if self.transform == 'LOCATION': + pbone.location = active_matrix_in_bone_space(pbone, active_pb, context, False).to_translation() + elif self.transform == 'ROTATION': + ignore = not pbone.id_data.data.bones[pbone.name].use_inherit_rotation + set_rotation_from_matrix(pbone, active_matrix_in_bone_space(pbone, active_pb, context, ignore)) + else: + ignore = pbone.id_data.data.bones[pbone.name].inherit_scale not in {'NONE', 'NONE_LEGACY'} + pbone.scale = active_matrix_in_bone_space(pbone, active_pb, context, ignore).to_scale() + else: + if self.transform == 'LOCATION': + pbone.location = active_pb.location + elif self.transform == 'ROTATION': + set_rotation_from_matrix(pbone, active_pb.matrix_basis.to_3x3()) + else: + pbone.scale = active_pb.scale + num_bones += 1 + space = "visual " if self.visual else "" + self.report({'INFO'}, f"Copied {space}{self.transform.lower()} to {num_bones} bone(s).") + return {'FINISHED'} + + +class POSE_OT_copy_bone_shape(Operator): + bl_idname = "pose.copy_bone_shape" + bl_label = "Copy Bone Shape" + bl_description = "Copy custom bone shape and its display settings from active to selected bones" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + return bone_copy_poll(cls, context) + + def execute(self, context): + active_pb = context.active_pose_bone + for i, pb in enumerate(context.selected_pose_bones): + pb.custom_shape = active_pb.custom_shape + pb.custom_shape_scale_xyz = active_pb.custom_shape_scale_xyz + pb.custom_shape_translation = active_pb.custom_shape_translation + pb.custom_shape_rotation_euler = active_pb.custom_shape_rotation_euler + pb.custom_shape_transform = active_pb.custom_shape_transform + pb.use_custom_shape_bone_size = active_pb.use_custom_shape_bone_size + pb.bone.show_wire = active_pb.bone.show_wire + pb.custom_shape_wire_width = active_pb.custom_shape_wire_width + pb.use_transform_at_custom_shape = active_pb.use_transform_at_custom_shape + pb.use_transform_around_custom_shape = active_pb.use_transform_around_custom_shape + pb.bone.display_type = active_pb.bone.display_type + + self.report({'INFO'}, "Copied shape to bones: {num_bones}.".format(num_bones=i)) + + return {'FINISHED'} + + +class POSE_OT_copy_bone_colors(Operator): + bl_idname = "pose.copy_bone_colors" + bl_label = "Copy Bone Colors" + bl_description = "Copy bone colors from active to selected bones" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + return bone_copy_poll(cls, context) + + def execute(self, context): + active_pb = context.active_pose_bone + for i, pb in enumerate(context.selected_pose_bones): + pb.bone.color.palette = active_pb.bone.color.palette + pb.color.palette = active_pb.color.palette + pb.bone.color.custom.normal = active_pb.bone.color.custom.normal + pb.bone.color.custom.select = active_pb.bone.color.custom.select + pb.bone.color.custom.active = active_pb.bone.color.custom.active + pb.color.custom.normal = active_pb.color.custom.normal + pb.color.custom.select = active_pb.color.custom.select + pb.color.custom.active = active_pb.color.custom.active + + self.report({'INFO'}, "Copied colors to bones: {num_bones}.".format(num_bones=i)) + + return {'FINISHED'} + + +class POSE_OT_copy_bone_collections(Operator): + bl_idname = "pose.copy_bone_collections" + bl_label = "Copy Bone Collections" + bl_description = ( + "Copy bone collection assignments from active to selected bones, replacing their existing assignments" + ) + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + return bone_copy_poll(cls, context) + + def execute(self, context: Context): + active_pb = context.active_pose_bone + source_collections = list(active_pb.bone.collections) + num_bones = 0 + for pbone in context.selected_pose_bones: + if pbone == active_pb: + continue + for col in list(pbone.bone.collections): + col.unassign(pbone.bone) + for col in source_collections: + col.assign(pbone.bone) + num_bones += 1 + self.report({'INFO'}, f"Copied bone collections to {num_bones} bone(s).") + return {'FINISHED'} + + +class POSE_OT_copy_ik_limits(Operator): + bl_idname = "pose.copy_ik_limits" + bl_label = "Copy IK Limits" + bl_description = "Copy IK constraint settings from active to selected bones" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + return bone_copy_poll(cls, context) + + def execute(self, context: Context): + active_pb = context.active_pose_bone + num_bones = 0 + for pbone in context.selected_pose_bones: + if pbone != active_pb: + copy_property_values(active_pb, pbone, filter_string="ik_") + num_bones += 1 + self.report({'INFO'}, f"Copied IK limits to {num_bones} bone(s).") + return {'FINISHED'} + + +class POSE_OT_copy_bbone_settings(Operator): + bl_idname = "pose.copy_bbone_settings" + bl_label = "Copy B-Bone Settings" + bl_description = "Copy B-Bone shape settings from active to selected bones" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + return bone_copy_poll(cls, context) + + def execute(self, context: Context): + active_pb = context.active_pose_bone + num_bones = 0 + for pbone in context.selected_pose_bones: + if pbone != active_pb: + copy_property_values(active_pb, pbone, filter_string="bbone_") + copy_property_values(active_pb.bone, pbone.bone, filter_string="bbone_") + pbone.bone.use_endroll_as_inroll = active_pb.bone.use_endroll_as_inroll + pbone.bone.use_scale_easing = active_pb.bone.use_scale_easing + num_bones += 1 + self.report({'INFO'}, f"Copied B-Bone settings to {num_bones} bone(s).") + return {'FINISHED'} + + +# ── Helpers ─────────────────────────────────────────────────────────────────── + + +def copy_property_values(source: Any, target: Any, *, filter_string: str = "") -> None: + """Copy writable RNA properties whose identifier contains string from source to target.""" + for prop in source.bl_rna.properties: + if prop.is_readonly: + continue + if filter_string and filter_string not in prop.identifier: + continue + try: + setattr(target, prop.identifier, getattr(source, prop.identifier)) + except AttributeError: + # Eg. `internal_spring_normal_check` is some read-only cloth property that isn't marked as read-only... + pass + + +def world_to_basis(active: Object, ob: Object) -> Matrix: + """Return the world transform of active expressed in the local basis of ob.""" + local = ob.parent.matrix_world.inverted() @ active.matrix_world + return (ob.matrix_basis @ ob.matrix_local.inverted()) @ local + + +def set_rotation_from_matrix(item: Object | PoseBone, mat: Matrix): + """Set rotation on item from mat, respecting item.rotation_mode.""" + if item.rotation_mode == 'QUATERNION': + item.rotation_quaternion = mat.to_3x3().to_quaternion() + elif item.rotation_mode == 'AXIS_ANGLE': + rot = mat.to_3x3().to_quaternion().to_axis_angle() + item.rotation_axis_angle = rot[1], rot[0][0], rot[0][1], rot[0][2] + else: + item.rotation_euler = mat.to_3x3().to_euler(item.rotation_mode) + + +def active_matrix_in_bone_space(bone: PoseBone, active: PoseBone, _context: Context, ignore_parent: bool) -> Matrix: + """Return the active bone's transform expressed in the local space of bone.""" + obj_bone = bone.id_data + obj_active = active.id_data + data_bone = obj_bone.data.bones[bone.name] + active_matrix = (obj_bone.matrix_world.inverted() @ obj_active.matrix_world) @ active.matrix + bonemat_local = data_bone.matrix_local.copy() + if data_bone.parent: + parentposemat = obj_bone.pose.bones[data_bone.parent.name].matrix.copy() + parentbonemat = data_bone.parent.matrix_local.copy() + else: + parentposemat = parentbonemat = Matrix() + if parentbonemat == parentposemat or ignore_parent: + return bonemat_local.inverted() @ active_matrix + bonemat = parentbonemat.inverted() @ bonemat_local + return bonemat.inverted() @ parentposemat.inverted() @ active_matrix + + +def copy_driver(from_fcurve: FCurve, target: ID, data_path: str = None, index: int = None) -> FCurve: + """Copy an existing FCurve containing a driver to a new ID, by creating a copy + of the existing driver on the target ID. + + Args: + from_fcurve: FCurve containing a driver + target: ID that can have AnimationData + data_path: Data Path of new driver. Defaults to copying the passed fcurve + index: array index of the property to drive. Defaults to copying the passed fcurve + + Returns: + FCurve: Fcurve with new driver on target ID + """ + + # Ensure anim data. + if not target.animation_data: + target.animation_data_create() + + # Remove old driver if it exists. + tgt_drivers = target.animation_data.drivers + if not data_path: + data_path = from_fcurve.data_path + if index not in {-1, None}: + old_fcurve = tgt_drivers.find(data_path, index=index) + else: + old_fcurve = tgt_drivers.find(data_path) + + if old_fcurve: + tgt_drivers.remove(old_fcurve) + + new_fcurve = tgt_drivers.from_existing(src_driver=from_fcurve) + new_fcurve.data_path = data_path + if index not in {None, -1}: + new_fcurve.array_index = index + + return new_fcurve + + +def copy_drivers_for_prefix(src_id: ID, dst_id: ID, src_prefix: str, dst_prefix: str = "") -> int: + """Copy all drivers on src_id whose data_path starts with src_prefix to dst_id. + + dst_prefix replaces src_prefix in the copied path. Defaults to src_prefix when empty. + Returns the number of drivers copied. + """ + if not src_id.animation_data: + return 0 + if not dst_prefix: + dst_prefix = src_prefix + num_copied = 0 + for fc in src_id.animation_data.drivers: + if fc.data_path.startswith(src_prefix): + new_path = dst_prefix + fc.data_path[len(src_prefix) :] + copy_driver(fc, dst_id, data_path=new_path, index=fc.array_index) + num_copied += 1 + return num_copied + + +def transfer_modifier_props(context: Context, source_mod: Modifier, target_mod: Modifier): + copy_property_values(source_mod, target_mod) + if hasattr(source_mod, 'settings'): + copy_property_values(source_mod.settings, target_mod.settings) + if hasattr(source_mod, 'point_cache'): + copy_property_values(source_mod.point_cache, target_mod.point_cache) + + if source_mod.type != 'NODES': + return + + # Transfer geo node attributes + if bpy.app.version >= (5, 2, 0): + props = source_mod.properties + if not props: + # This happens when GeoNode modifier has no node group at all. + # Could arguably raise an error, since such a modifier is useless. + return + target_props = target_mod.properties + for socket_name in props.inputs.keys(): + source_socket = getattr(props.inputs, socket_name, None) + target_socket = getattr(target_props.inputs, socket_name, None) + if source_socket and target_socket and hasattr(source_socket, "value"): + target_socket.value = source_socket.value + else: + for key, value in source_mod.items(): + typ = type(getattr(target_mod, f'["{key}"]')) + if typ in (int, float, bool, str): + if typ is str and type(target_mod[key]) is int: + # skip conversion for enum props + continue + value = typ(value) + target_mod[key] = value + + # Transfer geo node bake settings + target_mod.bake_directory = source_mod.bake_directory + for index, target_bake in enumerate(target_mod.bakes): + source_bake = source_mod.bakes[index] + props = [p.identifier for p in source_bake.bl_rna.properties if not p.is_readonly] + for prop in props: + value = getattr(source_bake, prop) + setattr(target_bake, prop, value) + + # refresh node modifier UI + if target_mod.node_group: + target_mod.node_group.interface_update(context) + + +# ── Registration ────────────────────────────────────────────────────────────── + + +registry = [ + OBJECT_OT_copy_transform, + OBJECT_OT_copy_transform_locks, + OBJECT_OT_copy_draw_options, + OBJECT_OT_copy_instancing, + OBJECT_OT_copy_object_color, + OBJECT_OT_copy_pass_index, + OBJECT_OT_copy_modifiers, + OBJECT_OT_copy_constraints, + OBJECT_OT_copy_collection_links, + OBJECT_OT_copy_selected_custom_props, + OBJECT_OT_copy_light_linking, + POSE_OT_copy_transform, + POSE_OT_copy_bone_shape, + POSE_OT_copy_bone_colors, + POSE_OT_copy_bone_collections, + POSE_OT_copy_bone_constraints, + POSE_OT_copy_ik_limits, + POSE_OT_copy_bbone_settings, + POSE_OT_copy_selected_custom_props, + PIE_MT_copy_object_transforms, + PIE_MT_copy_pose_transforms, + PIE_MT_copy_bone_properties, + PIE_MT_copy_object_properties, + PIE_MT_copy_collections, + PIE_MT_copy_object, + PIE_MT_copy_pose, +] + + +def register(): + for keymap_name, pie_idname in ( + ('Object Mode', PIE_MT_copy_object.bl_idname), + ('Pose', PIE_MT_copy_pose.bl_idname), + ): + WM_OT_call_menu_pie_drag_only.register_drag_hotkey( + keymap_name=keymap_name, + pie_name=pie_idname, + hotkey_kwargs={'type': "C", 'value': "PRESS", 'ctrl': True}, + on_drag=True, + ) diff --git a/extensions/blender_org/viewport_pie_menus/pie_curve_delete.py b/extensions/blender_org/viewport_pie_menus/pie_curve_delete.py new file mode 100644 index 0000000..04c748d --- /dev/null +++ b/extensions/blender_org/viewport_pie_menus/pie_curve_delete.py @@ -0,0 +1,150 @@ +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation +# +# SPDX-License-Identifier: GPL-3.0-or-later + +import bpy +from bpy.types import Context, Menu, Object, Operator, Spline + +from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only + + +class PIE_MT_curve_delete(Menu): + bl_idname = "PIE_MT_curve_delete" + bl_label = "Curve Delete" + + def draw(self, _context: Context): + layout = self.layout + pie = layout.menu_pie() + # 4 - LEFT + pie.operator(CURVE_OT_dissolve_verts.bl_idname, text="Dissolve Points") + # 6 - RIGHT + pie.operator(CURVE_OT_delete_verts.bl_idname, text="Delete Points") + # 2 - BOTTOM + pie.operator(CURVE_OT_delete_segment.bl_idname, text="Delete Segments") + # 8 - TOP + # 7 - TOP - LEFT + # 9 - TOP - RIGHT + # 1 - BOTTOM - LEFT + # 3 - BOTTOM - RIGHT + + +class CURVE_OT_delete_verts(Operator): + """Delete selected curve points""" + + bl_idname = "curve.delete_verts" + bl_label = "Delete Points" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context: Context) -> bool: + curve_objects = _curve_objects_in_edit_mode(context) + if not curve_objects: + cls.poll_message_set("Must be editing a curve.") + return False + if any(spline_has_any_selected(spline) for obj in curve_objects for spline in obj.data.splines): + return True + cls.poll_message_set("No points are selected.") + return False + + def execute(self, _context: Context): + return bpy.ops.curve.delete(type='VERT') + + +class CURVE_OT_dissolve_verts(Operator): + """Dissolve selected Bezier points, preserving the curve shape""" + + bl_idname = "curve.dissolve_verts_py" + bl_label = "Dissolve Points" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context: Context) -> bool: + curve_objects = _curve_objects_in_edit_mode(context) + if not curve_objects: + cls.poll_message_set("Must be editing a curve.") + return False + if any( + spline_has_dissolvable_bezier_point(spline) # + for obj in curve_objects + for spline in obj.data.splines + ): + return True + cls.poll_message_set("No selected Bezier points with neighbours on both sides.") + return False + + def execute(self, _context: Context): + return bpy.ops.curve.dissolve_verts() + + +class CURVE_OT_delete_segment(Operator): + """Delete segments between selected consecutive curve points""" + + bl_idname = "curve.delete_segment" + bl_label = "Delete Segments" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context: Context) -> bool: + curve_objects = _curve_objects_in_edit_mode(context) + if not curve_objects: + cls.poll_message_set("Must be editing a curve.") + return False + if any( + spline_has_consecutive_selected(spline) # + for obj in curve_objects + for spline in obj.data.splines + ): + return True + cls.poll_message_set("No two consecutive points are selected.") + return False + + def execute(self, _context: Context): + return bpy.ops.curve.delete(type='SEGMENT') + + +def _curve_objects_in_edit_mode(context: Context) -> list[Object]: + return [obj for obj in (context.objects_in_mode or []) if obj.type == 'CURVE' and obj.data] + + +def spline_has_dissolvable_bezier_point(spline: Spline) -> bool: + if spline.type != 'BEZIER': + return False + points = spline.bezier_points + point_count = len(points) + if spline.use_cyclic_u: + return point_count > 2 and spline_has_any_selected(spline) + return point_count >= 3 and any(point.select_control_point for point in points[1 : point_count - 1]) + + +def spline_has_any_selected(spline: Spline) -> bool: + if spline.type == 'BEZIER': + return any(point.select_control_point for point in spline.bezier_points) + return any(point.select for point in spline.points) + + +def spline_has_consecutive_selected(spline: Spline) -> bool: + if spline.type == 'BEZIER': + sel = [point.select_control_point for point in spline.bezier_points] + else: + sel = [point.select for point in spline.points] + for prev, curr in zip(sel, sel[1:]): + if prev and curr: + return True + return spline.use_cyclic_u and len(sel) >= 2 and sel[-1] and sel[0] + + +registry = [ + CURVE_OT_delete_verts, + CURVE_OT_dissolve_verts, + CURVE_OT_delete_segment, + PIE_MT_curve_delete, +] + + +def register(): + WM_OT_call_menu_pie_drag_only.register_drag_hotkey( + keymap_name="Curve", + pie_name=PIE_MT_curve_delete.bl_idname, + hotkey_kwargs={'type': "X", 'value': "PRESS"}, + on_drag=True, + ) diff --git a/extensions/blender_org/viewport_pie_menus/pie_editor_switch.py b/extensions/blender_org/viewport_pie_menus/pie_editor_switch.py index 9835153..aa5d203 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_editor_switch.py +++ b/extensions/blender_org/viewport_pie_menus/pie_editor_switch.py @@ -1,109 +1,79 @@ -# SPDX-FileCopyrightText: 2016-2024 Blender Foundation +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation # # SPDX-License-Identifier: GPL-3.0-or-later -import bpy, sys, json -from bpy.types import Menu, Operator +import json + +import bpy from bpy.props import StringProperty +from bpy.types import Context, Menu, Operator + from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only -AVAILABLE_PROPERTIES_EDITORS = [] - - class PIE_MT_editor_switch(Menu): bl_idname = "PIE_MT_editor_switch" bl_label = "Editor Switch" - def draw(self, context): + def draw(self, _context: Context): layout = self.layout pie = layout.menu_pie() # 4 - LEFT - pie.operator( - 'wm.call_menu_pie', text="Video Editing...", icon="SEQUENCE" - ).name = "PIE_MT_editor_switch_video" + pie.operator('wm.call_menu_pie', text="Video Editing...", icon="SEQUENCE").name = "PIE_MT_editor_switch_video" # 6 - RIGHT - pie.operator('wm.call_menu_pie', text="Nodes...", icon="NODETREE").name = ( - "PIE_MT_editor_switch_nodes" - ) + pie.operator('wm.call_menu_pie', text="Nodes...", icon="NODETREE").name = "PIE_MT_editor_switch_nodes" # 2 - BOTTOM - pie.operator('wm.call_menu_pie', text="Data...", icon="PRESET").name = ( - "PIE_MT_editor_switch_data" - ) + pie.operator('wm.call_menu_pie', text="Data...", icon="PRESET").name = "PIE_MT_editor_switch_data" # 8 - TOP - pie.operator( - WM_OT_set_area_type.bl_idname, text="3D View", icon="VIEW3D" - ).ui_type = "VIEW_3D" + pie.operator(WM_OT_set_area_type.bl_idname, text="3D View", icon="VIEW3D").ui_type = "VIEW_3D" # 7 - TOP - LEFT - pie.operator( - 'wm.call_menu_pie', text="2D Editors...", icon="FILE_IMAGE" - ).name = "PIE_MT_editor_switch_image" + pie.operator('wm.call_menu_pie', text="2D Editors...", icon="FILE_IMAGE").name = "PIE_MT_editor_switch_image" # 9 - TOP - RIGHT - pie.operator('wm.call_menu_pie', text="Script...", icon="SCRIPT").name = ( - "PIE_MT_editor_switch_script" - ) + pie.operator('wm.call_menu_pie', text="Script...", icon="SCRIPT").name = "PIE_MT_editor_switch_script" # 1 - BOTTOM - LEFT pie.separator() # 3 - BOTTOM - RIGHT - pie.operator( - 'wm.call_menu_pie', text="Animation...", icon="ARMATURE_DATA" - ).name = "PIE_MT_editor_switch_anim" + pie.operator('wm.call_menu_pie', text="Animation...", icon="ARMATURE_DATA").name = "PIE_MT_editor_switch_anim" class PIE_MT_editor_switch_video(Menu): bl_idname = "PIE_MT_editor_switch_video" bl_label = "Editor Switch: Video" - def draw(self, context): + def draw(self, _context: Context): layout = self.layout pie = layout.menu_pie() # 4 - LEFT - op = pie.operator( - WM_OT_set_area_type.bl_idname, - text="Sequencer & Preview", - icon="SEQ_SPLITVIEW", - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Sequencer & Preview", icon="SEQ_SPLITVIEW") op.ui_type = "SEQUENCE_EDITOR" op.view_type = 'SEQUENCER_PREVIEW' # 6 - RIGHT - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Movie Clip Editor", icon="SEQUENCE" - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Movie Clip Editor", icon="SEQUENCE") op.ui_type = "CLIP_EDITOR" op.mode = 'TRACKING' op.view = 'CLIP' # 2 - BOTTOM - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Clip Mask Editor", icon="MOD_MASK" - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Clip Mask Editor", icon="MOD_MASK") op.ui_type = "CLIP_EDITOR" op.mode = 'MASK' # 8 - TOP pie.separator() # 7 - TOP - LEFT - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Preview", icon="SEQ_PREVIEW" - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Preview", icon="SEQ_PREVIEW") op.ui_type = "SEQUENCE_EDITOR" op.view_type = 'PREVIEW' # 9 - TOP - RIGHT - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Tracking: Dopesheet", icon="ACTION" - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Tracking: Dopesheet", icon="ACTION") op.ui_type = "CLIP_EDITOR" op.mode = 'TRACKING' op.view = 'DOPESHEET' # 1 - BOTTOM - LEFT - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Sequencer", icon="SEQ_SEQUENCER" - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Sequencer", icon="SEQ_SEQUENCER") op.ui_type = "SEQUENCE_EDITOR" op.view_type = 'SEQUENCER' # 3 - BOTTOM - RIGHT - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Tracking: Graph", icon="GRAPH" - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Tracking: Graph", icon="GRAPH") op.ui_type = "CLIP_EDITOR" op.mode = 'TRACKING' op.view = 'GRAPH' @@ -113,42 +83,30 @@ class PIE_MT_editor_switch_nodes(Menu): bl_idname = "PIE_MT_editor_switch_nodes" bl_label = "Editor Switch: Nodes" - def draw(self, context): + def draw(self, context: Context): layout = self.layout pie = layout.menu_pie() # 4 - LEFT - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Compositing", icon="NODE_COMPOSITING" - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Compositing", icon="NODE_COMPOSITING") op.ui_type = 'CompositorNodeTree' # 6 - RIGHT - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Shader", icon="NODE_MATERIAL" - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Shader", icon="NODE_MATERIAL") op.ui_type = 'ShaderNodeTree' op.shader_type = 'OBJECT' # 2 - BOTTOM - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Geometry", icon="GEOMETRY_NODES" - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Geometry", icon="GEOMETRY_NODES") op.ui_type = 'GeometryNodeTree' # 8 - TOP op = pie.operator(WM_OT_set_area_type.bl_idname, text="Texture", icon="TEXTURE") op.ui_type = 'TextureNodeTree' # 7 - TOP - LEFT - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Line Style", icon="LINE_DATA" - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Line Style", icon="LINE_DATA") op.ui_type = 'ShaderNodeTree' op.shader_type = 'LINESTYLE' # 9 - TOP - RIGHT - if get_custom_nodetree_types(context, layout): - pie.menu( - 'PIE_MT_editor_switch_nodes_custom', - text="Custom Nodes", - icon='NODETREE', - ) + if get_custom_nodetree_types(context): + pie.menu('PIE_MT_editor_switch_nodes_custom', text="Custom Nodes", icon='NODETREE') else: pie.separator() # 1 - BOTTOM - LEFT @@ -163,253 +121,117 @@ class PIE_MT_editor_switch_nodes_custom(Menu): bl_idname = "PIE_MT_editor_switch_nodes_custom" bl_label = "Editor Switch: Custom Nodes" - def draw(self, context): + def draw(self, context: Context): layout = self.layout - - for ui_type, label, icon in get_custom_nodetree_types(context, layout): - layout.operator( - WM_OT_set_area_type.bl_idname, text=label, icon=icon - ).ui_type = ui_type - - -def get_custom_nodetree_types(context, layout): - """There are no rules In love, war, and Python scripting. - The only way to get custom node tree types is this: - - Try to set the UI type to some nonsense - - The resulting error tells you the possible UI types - - Catch and crunch the error string into a set - - Subtract from this the set of built-in UI types - - The result is a set of the custom node tree type names - - We can get their class with bl_rna_get_subclass_py - - """ - builtin_types = set( - [ - 'VIEW_3D', - 'IMAGE_EDITOR', - 'UV', - 'CompositorNodeTree', - 'TextureNodeTree', - 'GeometryNodeTree', - 'ShaderNodeTree', - 'SEQUENCE_EDITOR', - 'CLIP_EDITOR', - 'DOPESHEET', - 'TIMELINE', - 'FCURVES', - 'DRIVERS', - 'NLA_EDITOR', - 'TEXT_EDITOR', - 'CONSOLE', - 'INFO', - 'OUTLINER', - 'PROPERTIES', - 'FILES', - 'ASSETS', - 'SPREADSHEET', - 'PREFERENCES', - ] - ) - ret = [] - try: - context.area.ui_type = "Nonsense." - except Exception as exc: - exc_type, exc_value, tb = sys.exc_info() - if not exc_value: - return [] - type_list_str = ( - str(exc_value) - .split("not found in ")[-1] - .replace("(", "[") - .replace(")", "]") - .replace("'", '"') - ) - type_list = set(json.loads(type_list_str)) - custom_types = type_list - builtin_types - - for type_name in custom_types: - type_class = bpy.types.NodeTree.bl_rna_get_subclass_py(type_name) - if not type_class: - continue - ret.append((type_name, type_class.bl_label, type_class.bl_icon)) - - return ret + for ui_type, label, icon in get_custom_nodetree_types(context): + layout.operator(WM_OT_set_area_type.bl_idname, text=label, icon=icon).ui_type = ui_type class PIE_MT_editor_switch_data(Menu): bl_idname = "PIE_MT_editor_switch_data" bl_label = "Editor Switch: Data" - def draw(self, context): + def draw(self, _context: Context): pie = self.layout.menu_pie() # 4 - LEFT - pie.operator( - WM_OT_set_area_type.bl_idname, text="File Browser", icon="FILEBROWSER" - ).ui_type = "FILES" + pie.operator(WM_OT_set_area_type.bl_idname, text="File Browser", icon="FILEBROWSER").ui_type = "FILES" # 6 - RIGHT - pie.operator( - WM_OT_set_area_type.bl_idname, text="Preferences", icon="PREFERENCES" - ).ui_type = "PREFERENCES" + pie.operator(WM_OT_set_area_type.bl_idname, text="Preferences", icon="PREFERENCES").ui_type = "PREFERENCES" # 2 - BOTTOM - pie.operator( - WM_OT_set_area_type.bl_idname, text="Outliner", icon="OUTLINER" - ).ui_type = "OUTLINER" + pie.operator(WM_OT_set_area_type.bl_idname, text="Outliner", icon="OUTLINER").ui_type = "OUTLINER" # 8 - TOP - pie.operator( - WM_OT_set_area_type.bl_idname, text="Properties", icon="PROPERTIES" - ).ui_type = "PROPERTIES" + pie.operator(WM_OT_set_area_type.bl_idname, text="Properties", icon="PROPERTIES").ui_type = "PROPERTIES" # 7 - TOP - LEFT - pie.operator( - WM_OT_set_area_type.bl_idname, text="Asset Browser", icon="ASSET_MANAGER" - ).ui_type = "ASSETS" + pie.operator(WM_OT_set_area_type.bl_idname, text="Asset Browser", icon="ASSET_MANAGER").ui_type = "ASSETS" # 9 - TOP - RIGHT - pie.menu( - "PIE_MT_editor_switch_properties", - text="Properties Types...", - icon="PROPERTIES", - ) + pie.menu("PIE_MT_editor_switch_properties", text="Properties Types...", icon="PROPERTIES") # 1 - BOTTOM - LEFT - pie.operator( - WM_OT_set_area_type.bl_idname, text="Spreadsheet", icon="SPREADSHEET" - ).ui_type = "SPREADSHEET" + pie.operator(WM_OT_set_area_type.bl_idname, text="Spreadsheet", icon="SPREADSHEET").ui_type = "SPREADSHEET" # 3 - BOTTOM - RIGHT - pie.menu( - "PIE_MT_editor_switch_outliner", text="Outliner Types...", icon="OUTLINER" - ) + pie.menu("PIE_MT_editor_switch_outliner", text="Outliner Types...", icon="OUTLINER") class PIE_MT_editor_switch_outliner(Menu): bl_idname = "PIE_MT_editor_switch_outliner" bl_label = "Editor Switch: Outliner" - def draw(self, context): - pie = self.layout#.menu_pie() + def draw(self, _context: Context): + layout = self.layout # 4 - LEFT - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Scenes", icon="SCENE_DATA" - ) + op = layout.operator(WM_OT_set_area_type.bl_idname, text="Scenes", icon="SCENE_DATA") op.ui_type = "OUTLINER" op.display_mode = 'SCENES' # 6 - RIGHT - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="View Layer", icon="RENDERLAYERS" - ) + op = layout.operator(WM_OT_set_area_type.bl_idname, text="View Layer", icon="RENDERLAYERS") op.ui_type = "OUTLINER" op.display_mode = 'VIEW_LAYER' # 2 - BOTTOM - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Video Sequencer", icon="SEQUENCE" - ) + op = layout.operator(WM_OT_set_area_type.bl_idname, text="Video Sequencer", icon="SEQUENCE") op.ui_type = "OUTLINER" op.display_mode = 'SEQUENCE' # 8 - TOP - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Blender File", icon="FILE_BLEND" - ) + op = layout.operator(WM_OT_set_area_type.bl_idname, text="Blender File", icon="FILE_BLEND") op.ui_type = "OUTLINER" op.display_mode = 'LIBRARIES' # 7 - TOP - LEFT - op = pie.operator(WM_OT_set_area_type.bl_idname, text="Data API", icon="RNA") + op = layout.operator(WM_OT_set_area_type.bl_idname, text="Data API", icon="RNA") op.ui_type = "OUTLINER" op.display_mode = 'DATA_API' # 9 - TOP - RIGHT - op = pie.operator( - WM_OT_set_area_type.bl_idname, - text="Library Overrides", - icon="LIBRARY_DATA_OVERRIDE", - ) + op = layout.operator(WM_OT_set_area_type.bl_idname, text="Library Overrides", icon="LIBRARY_DATA_OVERRIDE") op.ui_type = "OUTLINER" op.display_mode = 'LIBRARY_OVERRIDES' # 1 - BOTTOM - LEFT - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Orphan Data", icon="ORPHAN_DATA" - ) + op = layout.operator(WM_OT_set_area_type.bl_idname, text="Orphan Data", icon="ORPHAN_DATA") op.ui_type = "OUTLINER" op.display_mode = 'ORPHAN_DATA' # 3 - BOTTOM - RIGHT -def get_available_properties_editors(context): - """Similar hack as get_custom_nodetree_types. - Ideally we need an existing Properties editor, otherwise - the list of available types is not up to date. - Although even in that case, we still don't get an error, - so this is fine. - """ - org_ui_type = context.area.ui_type - try: - space = None - for area in context.screen.areas: - if area.ui_type == 'PROPERTIES': - space = area.spaces.active - break - if not space: - context.area.ui_type = 'PROPERTIES' - space = context.space_data - space.context = "Nonsense." - except Exception as exc: - exc_type, exc_value, tb = sys.exc_info() - if not exc_value: - return [] - type_list_str = ( - str(exc_value) - .split("not found in ")[-1] - .replace("(", "[") - .replace(")", "]") - .replace("'", '"') - ) - available_types = set(json.loads(type_list_str)) - context.area.ui_type = org_ui_type - return available_types - - class PIE_MT_editor_switch_properties(Menu): bl_idname = "PIE_MT_editor_switch_properties" bl_label = "Editor Switch: Properties" - def draw(self, context): + def draw(self, context: Context): layout = self.layout - available_editors = get_available_properties_editors(context) - def safe_draw(pie, text, icon, context_name): + def draw_entry(text, icon, context_name): if context_name in available_editors: - op = pie.operator(WM_OT_set_area_type.bl_idname, text=text, icon=icon) + op = layout.operator(WM_OT_set_area_type.bl_idname, text=text, icon=icon) op.ui_type = "PROPERTIES" op.context_name = context_name else: - pie.separator() + layout.separator() - safe_draw(layout, "Render", 'SCENE', 'RENDER') - safe_draw(layout, "Output", 'OUTPUT', 'OUTPUT') - safe_draw(layout, "View Layer", 'RENDERLAYERS', 'VIEW_LAYER') - safe_draw(layout, "Scene", 'SCENE_DATA', 'SCENE') - safe_draw(layout, "World", 'WORLD', 'WORLD') + draw_entry("Render", 'SCENE', 'RENDER') + draw_entry("Output", 'OUTPUT', 'OUTPUT') + draw_entry("View Layer", 'RENDERLAYERS', 'VIEW_LAYER') + draw_entry("Scene", 'SCENE_DATA', 'SCENE') + draw_entry("World", 'WORLD', 'WORLD') layout.separator() - safe_draw(layout, "Object", 'OBJECT_DATAMODE', 'OBJECT') - safe_draw(layout, "Modifiers", 'MODIFIER', 'MODIFIER') - safe_draw(layout, "Particles", 'PARTICLES', 'PARTICLES') - safe_draw(layout, "Physics", 'PHYSICS', 'PHYSICS') - safe_draw(layout, "Constraints", 'CONSTRAINT', 'CONSTRAINT') - safe_draw(layout, "Object Data", 'OUTLINER_DATA_MESH', 'DATA') - safe_draw(layout, "Material", 'MATERIAL', 'MATERIAL') + draw_entry("Object", 'OBJECT_DATAMODE', 'OBJECT') + draw_entry("Modifiers", 'MODIFIER', 'MODIFIER') + draw_entry("Particles", 'PARTICLES', 'PARTICLES') + draw_entry("Physics", 'PHYSICS', 'PHYSICS') + draw_entry("Constraints", 'CONSTRAINT', 'CONSTRAINT') + draw_entry("Object Data", 'OUTLINER_DATA_MESH', 'DATA') + draw_entry("Material", 'MATERIAL', 'MATERIAL') layout.separator() - safe_draw(layout, "Texture", 'TEXTURE', 'TEXTURE') + draw_entry("Texture", 'TEXTURE', 'TEXTURE') class PIE_MT_editor_switch_image(Menu): bl_idname = "PIE_MT_editor_switch_image" bl_label = "Editor Switch: 2D Editors" - def draw(self, context): + def draw(self, _context: Context): pie = self.layout.menu_pie() # 4 - LEFT - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Image Viewer", icon="SEQ_PREVIEW" - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Image Viewer", icon="SEQ_PREVIEW") op.ui_type = "IMAGE_EDITOR" op.ui_mode = "VIEW" # 6 - RIGHT @@ -420,17 +242,13 @@ class PIE_MT_editor_switch_image(Menu): # 8 - TOP pie.separator() # 7 - TOP - LEFT - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Image Paint", icon="TPAINT_HLT" - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Image Paint", icon="TPAINT_HLT") op.ui_type = "IMAGE_EDITOR" op.ui_mode = "PAINT" # 9 - TOP - RIGHT pie.separator() # 1 - BOTTOM - LEFT - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Image Masking", icon="MOD_MASK" - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Image Masking", icon="MOD_MASK") op.ui_type = "IMAGE_EDITOR" op.ui_mode = "PAINT" # 3 - BOTTOM - RIGHT @@ -440,23 +258,17 @@ class PIE_MT_editor_switch_script(Menu): bl_idname = "PIE_MT_editor_switch_script" bl_label = "Editor Switch: Script" - def draw(self, context): + def draw(self, _context: Context): pie = self.layout.menu_pie() # 4 - LEFT pie.separator() # 6 - RIGHT - pie.operator( - WM_OT_set_area_type.bl_idname, text="Text Editor", icon="TEXT" - ).ui_type = "TEXT_EDITOR" + pie.operator(WM_OT_set_area_type.bl_idname, text="Text Editor", icon="TEXT").ui_type = "TEXT_EDITOR" # 2 - BOTTOM - pie.operator( - WM_OT_set_area_type.bl_idname, text="Python Console", icon="CONSOLE" - ).ui_type = "CONSOLE" + pie.operator(WM_OT_set_area_type.bl_idname, text="Python Console", icon="CONSOLE").ui_type = "CONSOLE" # 8 - TOP - pie.operator( - WM_OT_set_area_type.bl_idname, text="Info", icon="INFO" - ).ui_type = "INFO" + pie.operator(WM_OT_set_area_type.bl_idname, text="Info", icon="INFO").ui_type = "INFO" # 7 - TOP - LEFT # 9 - TOP - RIGHT # 1 - BOTTOM - LEFT @@ -467,26 +279,20 @@ class PIE_MT_editor_switch_anim(Menu): bl_idname = "PIE_MT_editor_switch_anim" bl_label = "Editor Switch: Animation" - def draw(self, context): + def draw(self, _context: Context): layout = self.layout pie = layout.menu_pie() # 4 - LEFT - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Grease Pencil", icon="GREASEPENCIL" - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Grease Pencil", icon="GREASEPENCIL") op.ui_type = 'DOPESHEET' op.ui_mode = 'GPENCIL' # 6 - RIGHT - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Dopesheet", icon="ACTION" - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Dopesheet", icon="ACTION") op.ui_type = 'DOPESHEET' op.ui_mode = 'DOPESHEET' # 2 - BOTTOM - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Driver Editor", icon="DRIVER" - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Driver Editor", icon="DRIVER") op.ui_type = 'DRIVERS' # 8 - TOP op = pie.operator(WM_OT_set_area_type.bl_idname, text="Timeline", icon="TIME") @@ -494,17 +300,13 @@ class PIE_MT_editor_switch_anim(Menu): # 7 - TOP - LEFT pie.separator() # 9 - TOP - RIGHT - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Graph Editor", icon="GRAPH" - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Graph Editor", icon="GRAPH") op.ui_type = 'FCURVES' # 1 - BOTTOM - LEFT op = pie.operator(WM_OT_set_area_type.bl_idname, text="NLA Editor", icon="NLA") op.ui_type = 'NLA_EDITOR' # 3 - BOTTOM - RIGHT - op = pie.operator( - WM_OT_set_area_type.bl_idname, text="Action Editor", icon="OBJECT_DATAMODE" - ) + op = pie.operator(WM_OT_set_area_type.bl_idname, text="Action Editor", icon="OBJECT_DATAMODE") op.ui_type = 'DOPESHEET' op.ui_mode = 'ACTION' @@ -525,7 +327,7 @@ class WM_OT_set_area_type(Operator): mode: StringProperty(default="", options={'SKIP_SAVE'}) view: StringProperty(default="", options={'SKIP_SAVE'}) - def execute(self, context): + def execute(self, context: Context): context.area.ui_type = self.ui_type if self.view_type: context.space_data.view_type = self.view_type @@ -541,10 +343,66 @@ class WM_OT_set_area_type(Operator): context.space_data.mode = self.mode if self.view: context.space_data.view = self.view - return {'FINISHED'} +def get_custom_nodetree_types(context: Context) -> list[tuple[str, str, str]]: + """There are no rules in love, war, and Python scripting. + The only way to get custom node tree types is this: + - Try to set the UI type to some nonsense + - The resulting error tells you the possible UI types + - Catch and crunch the error string into a set + - Subtract from this the set of built-in UI types + - The result is a set of the custom node tree type names + - We can get their class with bl_rna_get_subclass_py + """ + builtin_types = { + 'VIEW_3D', 'IMAGE_EDITOR', 'UV', + 'CompositorNodeTree', 'TextureNodeTree', 'GeometryNodeTree', 'ShaderNodeTree', + 'SEQUENCE_EDITOR', 'CLIP_EDITOR', + 'DOPESHEET', 'TIMELINE', 'FCURVES', 'DRIVERS', 'NLA_EDITOR', + 'TEXT_EDITOR', 'CONSOLE', 'INFO', + 'OUTLINER', 'PROPERTIES', 'FILES', 'ASSETS', 'SPREADSHEET', 'PREFERENCES', + } + ret = [] + try: + context.area.ui_type = "Nonsense." + except Exception as exc: + type_list_str = str(exc).split("not found in ")[-1].replace("(", "[").replace(")", "]").replace("'", '"') + custom_types = set(json.loads(type_list_str)) - builtin_types + for type_name in custom_types: + type_class = bpy.types.NodeTree.bl_rna_get_subclass_py(type_name) + if not type_class: + continue + ret.append((type_name, type_class.bl_label, type_class.bl_icon)) + return ret + + +def get_available_properties_editors(context: Context) -> set[str]: + """Similar hack as get_custom_nodetree_types. + Ideally we need an existing Properties editor, otherwise + the list of available types is not up to date. + Although even in that case, we still don't get an error, + so this is fine. + """ + org_ui_type = context.area.ui_type + try: + space = None + for area in context.screen.areas: + if area.ui_type == 'PROPERTIES': + space = area.spaces.active + break + if not space: + context.area.ui_type = 'PROPERTIES' + space = context.space_data + space.context = "Nonsense." + except Exception as exc: + type_list_str = str(exc).split("not found in ")[-1].replace("(", "[").replace(")", "]").replace("'", '"') + context.area.ui_type = org_ui_type + return set(json.loads(type_list_str)) + return set() + + registry = [ PIE_MT_editor_switch, PIE_MT_editor_switch_video, diff --git a/extensions/blender_org/viewport_pie_menus/pie_file.py b/extensions/blender_org/viewport_pie_menus/pie_file.py index 03f56fe..0012148 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_file.py +++ b/extensions/blender_org/viewport_pie_menus/pie_file.py @@ -1,11 +1,11 @@ -# SPDX-FileCopyrightText: 2016-2024 Blender Foundation +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation # # SPDX-License-Identifier: GPL-3.0-or-later - import bpy -from bpy.types import Menu, Operator from bpy.props import BoolProperty +from bpy.types import Context, Menu, Operator + from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only @@ -13,7 +13,7 @@ class PIE_MT_file(Menu): bl_idname = "PIE_MT_file" bl_label = "File" - def draw(self, context): + def draw(self, _context: Context): layout = self.layout pie = layout.menu_pie() # 4 - LEFT @@ -25,13 +25,9 @@ class PIE_MT_file(Menu): # 8 - TOP pie.menu("TOPBAR_MT_file_import", text="Import...", icon='IMPORT') # 7 - TOP - LEFT - pie.operator('wm.call_menu_pie', text="Library...", icon='LINK_BLEND').name = ( - "PIE_MT_library" - ) + pie.operator('wm.call_menu_pie', text="Library...", icon='LINK_BLEND').name = "PIE_MT_library" # 9 - TOP - RIGHT - pie.operator( - "wm.save_mainfile", text="Save Incremental", icon='FILE_TICK' - ).incremental = True + pie.operator("wm.save_mainfile", text="Save Incremental", icon='FILE_TICK').incremental = True # 1 - BOTTOM - LEFT pie.menu("TOPBAR_MT_file_open_recent", icon='FILE_FOLDER') # 3 - BOTTOM - RIGHT @@ -42,7 +38,7 @@ class PIE_MT_library(Menu): bl_idname = "PIE_MT_library" bl_label = "Library" - def draw(self, context): + def draw(self, _context: Context): pie = self.layout.menu_pie() # 4 - LEFT @@ -50,29 +46,17 @@ class PIE_MT_library(Menu): # 6 - RIGHT pie.operator("wm.append", text="Append", icon='APPEND_BLEND') # 2 - BOTTOM - pie.operator( - "object.make_local", text="Make All Local", icon='FILE_BLEND' - ).type = 'ALL' + pie.operator("object.make_local", text="Make All Local", icon='FILE_BLEND').type = 'ALL' # 8 - TOP pie.prop(bpy.data, 'use_autopack', text="Auto-pack") # 7 - TOP - LEFT - pie.operator( - "file.pack_res_and_lib", text="Pack All Local", icon='PACKAGE' - ).pack = True + pie.operator("file.pack_res_and_lib", text="Pack All Local", icon='PACKAGE').pack = True # 9 - TOP - RIGHT - pie.operator( - "file.pack_res_and_lib", text="Unpack All Local", icon='UGLYPACKAGE' - ).pack = False + pie.operator("file.pack_res_and_lib", text="Unpack All Local", icon='UGLYPACKAGE').pack = False # 1 - BOTTOM - LEFT - pie.operator( - "file.make_paths_relative", icon='FILE', text="Make Paths Relative" - ) + pie.operator("file.make_paths_relative", icon='FILE', text="Make Paths Relative") # 3 - BOTTOM - RIGHT - pie.operator( - "file.make_paths_absolute", - icon='LIBRARY_DATA_BROKEN', - text="Make Paths Absolute", - ) + pie.operator("file.make_paths_absolute", icon='LIBRARY_DATA_BROKEN', text="Make Paths Absolute") class WM_OT_pack_res_and_lib(Operator): @@ -84,17 +68,21 @@ class WM_OT_pack_res_and_lib(Operator): pack: BoolProperty() - def execute(self, context): + def execute(self, _context: Context): if self.pack: bpy.ops.file.pack_libraries() bpy.ops.file.pack_all() else: bpy.ops.file.unpack_libraries() bpy.ops.file.unpack_all() - return {'FINISHED'} +def draw_revert(self, _context: Context): + self.layout.operator('wm.revert_mainfile', icon='LOOP_BACK') + self.layout.separator() + + registry = [ PIE_MT_file, PIE_MT_library, @@ -102,11 +90,6 @@ registry = [ ] -def draw_revert(self, context): - self.layout.operator('wm.revert_mainfile', icon='LOOP_BACK') - self.layout.separator() - - def register(): WM_OT_call_menu_pie_drag_only.register_drag_hotkey( keymap_name="Window", @@ -115,7 +98,6 @@ def register(): default_fallback_op='wm.save_mainfile', on_drag=True, ) - bpy.types.TOPBAR_MT_file_recover.prepend(draw_revert) diff --git a/extensions/blender_org/viewport_pie_menus/pie_keyframes.py b/extensions/blender_org/viewport_pie_menus/pie_keyframes.py new file mode 100644 index 0000000..3519afb --- /dev/null +++ b/extensions/blender_org/viewport_pie_menus/pie_keyframes.py @@ -0,0 +1,191 @@ +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation +# +# SPDX-License-Identifier: GPL-3.0-or-later + +from bpy.types import Context, Menu + +from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only + + +class PIE_MT_keyframe_type(Menu): + bl_idname = "PIE_MT_keyframe_type" + bl_label = "Keyframe Type" + + def draw(self, context: Context): + pie = self.layout.menu_pie() + + # 4 - LEFT + pie.operator('action.keyframe_type', text="Keyframe", icon='KEYTYPE_KEYFRAME_VEC').type = 'KEYFRAME' + # 6 - RIGHT + pie.operator('action.keyframe_type', text="Extreme", icon='KEYTYPE_EXTREME_VEC').type = 'EXTREME' + # 2 - BOTTOM + pie.operator('action.keyframe_type', text="Breakdown", icon='KEYTYPE_BREAKDOWN_VEC').type = 'BREAKDOWN' + # 8 - TOP + pie.operator('action.keyframe_type', text="Moving Hold", icon='KEYTYPE_MOVING_HOLD_VEC').type = 'MOVING_HOLD' + # 7 - TOP - LEFT + pie.separator() + # 9 - TOP - RIGHT + pie.separator() + # 1 - BOTTOM - LEFT + pie.operator('action.keyframe_type', text="Generated", icon='KEYTYPE_GENERATED_VEC').type = 'GENERATED' + # 3 - BOTTOM - RIGHT + pie.operator('action.keyframe_type', text="Jitter", icon='KEYTYPE_JITTER_VEC').type = 'JITTER' + + +class PIE_MT_handle_type(Menu): + bl_idname = "PIE_MT_handle_type" + bl_label = "Handle Type" + + def draw(self, context: Context): + pie = self.layout.menu_pie() + + base = 'graph' if context.area.type == 'GRAPH_EDITOR' else 'action' + + # 4 - LEFT + pie.operator(f'{base}.handle_type', text="Free", icon='HANDLE_FREE').type = 'FREE' + # 6 - RIGHT + pie.operator(f'{base}.handle_type', text="Aligned", icon='HANDLE_ALIGNED').type = 'ALIGNED' + # 2 - BOTTOM + pie.operator(f'{base}.handle_type', text="Vector", icon='HANDLE_VECTOR').type = 'VECTOR' + # 8 - TOP + pie.operator(f'{base}.handle_type', text="Automatic", icon='HANDLE_AUTO').type = 'AUTO' + # 7 - TOP - LEFT + pie.operator(f'{base}.handle_type', text="Auto Clamped", icon='HANDLE_AUTOCLAMPED').type = 'AUTO_CLAMPED' + + +class PIE_MT_interpolation_mode(Menu): + bl_idname = "PIE_MT_interpolation_mode" + bl_label = "Interpolation Mode" + + def draw(self, context: Context): + pie = self.layout.menu_pie() + + base = 'graph' if context.area.type == 'GRAPH_EDITOR' else 'action' + + # 4 - LEFT + pie.operator(f'{base}.interpolation_type', text="Constant", icon='IPO_CONSTANT').type = 'CONSTANT' + # 6 - RIGHT + pie.operator(f'{base}.interpolation_type', text="Bezier", icon='IPO_BEZIER').type = 'BEZIER' + # 2 - BOTTOM + pie.separator() + # 8 - TOP + pie.operator(f'{base}.interpolation_type', text="Linear", icon='IPO_LINEAR').type = 'LINEAR' + # 7 - TOP - LEFT + pie.separator() + # 9 - TOP - RIGHT + pie.menu("PIE_MT_interpolation_dynamic", text="Dynamic...", icon='IPO_BACK') + # 1 - BOTTOM - LEFT + pie.separator() + # 3 - BOTTOM - RIGHT + pie.menu("PIE_MT_interpolation_easing", text="Easing...", icon='IPO_SINE') + + +class PIE_MT_interpolation_easing(Menu): + bl_idname = "PIE_MT_interpolation_easing" + bl_label = "Easing Interpolation" + + def draw(self, context: Context): + layout = self.layout + base = 'graph' if context.area.type == 'GRAPH_EDITOR' else 'action' + layout.operator(f'{base}.interpolation_type', text="Sinusoidal", icon='IPO_SINE').type = 'SINE' + layout.operator(f'{base}.interpolation_type', text="Quadratic", icon='IPO_QUAD').type = 'QUAD' + layout.operator(f'{base}.interpolation_type', text="Cubic", icon='IPO_CUBIC').type = 'CUBIC' + layout.operator(f'{base}.interpolation_type', text="Quartic", icon='IPO_QUART').type = 'QUART' + layout.operator(f'{base}.interpolation_type', text="Quintic", icon='IPO_QUINT').type = 'QUINT' + layout.operator(f'{base}.interpolation_type', text="Exponential", icon='IPO_EXPO').type = 'EXPO' + layout.operator(f'{base}.interpolation_type', text="Circular", icon='IPO_CIRC').type = 'CIRC' + + +class PIE_MT_interpolation_dynamic(Menu): + bl_idname = "PIE_MT_interpolation_dynamic" + bl_label = "Dynamic Effects" + + def draw(self, context: Context): + layout = self.layout + + base = 'graph' if context.area.type == 'GRAPH_EDITOR' else 'action' + + layout.operator(f'{base}.interpolation_type', text="Back", icon='IPO_BACK').type = 'BACK' + layout.operator(f'{base}.interpolation_type', text="Bounce", icon='IPO_BOUNCE').type = 'BOUNCE' + layout.operator(f'{base}.interpolation_type', text="Elastic", icon='IPO_ELASTIC').type = 'ELASTIC' + + +class PIE_MT_easing_mode(Menu): + bl_idname = "PIE_MT_easing_mode" + bl_label = "Easing Mode" + + def draw(self, context: Context): + pie = self.layout.menu_pie() + + base = 'graph' if context.area.type == 'GRAPH_EDITOR' else 'action' + + # 4 - LEFT + pie.operator(f'{base}.easing_type', text="Ease In", icon='IPO_EASE_IN').type = 'EASE_IN' + # 6 - RIGHT + pie.operator(f'{base}.easing_type', text="Ease Out", icon='IPO_EASE_OUT').type = 'EASE_OUT' + # 2 - BOTTOM + pie.operator(f'{base}.easing_type', text="Ease In and Out", icon='IPO_EASE_IN_OUT').type = 'EASE_IN_OUT' + # 8 - TOP + pie.operator(f'{base}.easing_type', text="Automatic", icon='AUTO').type = 'AUTO' + + +class PIE_MT_extrapolation_mode(Menu): + bl_idname = "PIE_MT_extrapolation_mode" + bl_label = "Extrapolation Mode" + + def draw(self, _context: Context): + pie = self.layout.menu_pie() + + # 4 - LEFT + pie.operator('graph.extrapolation_type', text="Constant", icon='IPO_CONSTANT').type = 'CONSTANT' + # 6 - RIGHT + pie.operator('graph.extrapolation_type', text="Linear", icon='IPO_LINEAR').type = 'LINEAR' + # 2 - BOTTOM + pie.operator('graph.extrapolation_type', text="Clear Cyclic", icon='X').type = 'CLEAR_CYCLIC' + # 8 - TOP + pie.operator('graph.extrapolation_type', text="Make Cyclic", icon='FILE_REFRESH').type = 'MAKE_CYCLIC' + + +registry = [ + PIE_MT_keyframe_type, + PIE_MT_handle_type, + PIE_MT_interpolation_mode, + PIE_MT_interpolation_easing, + PIE_MT_interpolation_dynamic, + PIE_MT_easing_mode, + PIE_MT_extrapolation_mode, +] + + +def register(): + WM_OT_call_menu_pie_drag_only.register_drag_hotkey( + keymap_name='Dopesheet', + pie_name=PIE_MT_keyframe_type.bl_idname, + hotkey_kwargs={'type': "R", 'value': "PRESS"}, + on_drag=False, + ) + for keymap in ('Dopesheet', 'Graph Editor'): + WM_OT_call_menu_pie_drag_only.register_drag_hotkey( + keymap_name=keymap, + pie_name=PIE_MT_handle_type.bl_idname, + hotkey_kwargs={'type': "V", 'value': "PRESS"}, + on_drag=False, + ) + WM_OT_call_menu_pie_drag_only.register_drag_hotkey( + keymap_name=keymap, + pie_name=PIE_MT_interpolation_mode.bl_idname, + hotkey_kwargs={'type': "T", 'value': "PRESS"}, + on_drag=False, + ) + WM_OT_call_menu_pie_drag_only.register_drag_hotkey( + keymap_name=keymap, + pie_name=PIE_MT_easing_mode.bl_idname, + hotkey_kwargs={'type': "E", 'value': "PRESS", 'ctrl': True}, + on_drag=False, + ) + WM_OT_call_menu_pie_drag_only.register_drag_hotkey( + keymap_name=keymap, + pie_name=PIE_MT_extrapolation_mode.bl_idname, + hotkey_kwargs={'type': "E", 'value': "PRESS", 'shift': True}, + on_drag=False, + ) diff --git a/extensions/blender_org/viewport_pie_menus/pie_manipulator.py b/extensions/blender_org/viewport_pie_menus/pie_manipulator.py index 9fda013..8dbfbca 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_manipulator.py +++ b/extensions/blender_org/viewport_pie_menus/pie_manipulator.py @@ -1,9 +1,9 @@ -# SPDX-FileCopyrightText: 2016-2024 Blender Foundation +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation # # SPDX-License-Identifier: GPL-3.0-or-later -from bpy.types import Menu, Operator -from bpy.props import EnumProperty, BoolProperty +from bpy.props import BoolProperty, EnumProperty +from bpy.types import Context, Event, Menu, Operator from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only @@ -12,10 +12,9 @@ class PIE_MT_manipulator(Menu): bl_idname = "PIE_MT_manipulator" bl_label = "Manipulator" - def draw(self, context): + def draw(self, context: Context): layout = self.layout pie = layout.menu_pie() - space = context.space_data # 4 - LEFT @@ -27,25 +26,31 @@ class PIE_MT_manipulator(Menu): 'view3d.set_manipulator', text="Scale", icon='CON_SIZELIKE', depress=space.show_gizmo_object_scale ).manipulator = 'SCALE' # 2 - BOTTOM - pie.operator( - 'view3d.set_manipulator', text="None", icon='X' - ).manipulator='NONE' + pie.operator('view3d.set_manipulator', text="None", icon='X').manipulator = 'NONE' # 8 - TOP pie.operator( 'view3d.set_manipulator', text="Location", icon='CON_LOCLIKE', depress=space.show_gizmo_object_translate ).manipulator = 'LOC' - - # 7 - TOP-LEFT + # 7 - TOP - LEFT pie.operator( - 'view3d.set_manipulator', text="Loc/Rot", icon='CON_LOCLIKE', depress=space.show_gizmo_object_translate and space.show_gizmo_object_rotate - ).manipulator='LOCROT' - # 9 - TOP-RIGHT + 'view3d.set_manipulator', + text="Loc/Rot", + icon='CON_LOCLIKE', + depress=space.show_gizmo_object_translate and space.show_gizmo_object_rotate, + ).manipulator = 'LOCROT' + # 9 - TOP - RIGHT pie.operator( - 'view3d.set_manipulator', text="Loc/Scale", icon='CON_SIZELIKE', depress=space.show_gizmo_object_translate and space.show_gizmo_object_scale - ).manipulator='LOCSCALE' - # 1 - BOT-LEFT + 'view3d.set_manipulator', + text="Loc/Scale", + icon='CON_SIZELIKE', + depress=space.show_gizmo_object_translate and space.show_gizmo_object_scale, + ).manipulator = 'LOCSCALE' + # 1 - BOTTOM - LEFT pie.operator( - 'view3d.set_manipulator', text="Loc/Rot/Scale", icon='CON_LOCLIKE', depress=space.show_gizmo_object_translate and space.show_gizmo_object_rotate and space.show_gizmo_object_scale + 'view3d.set_manipulator', + text="Loc/Rot/Scale", + icon='CON_LOCLIKE', + depress=space.show_gizmo_object_translate and space.show_gizmo_object_rotate and space.show_gizmo_object_scale, ).manipulator = 'LOCROTSCALE' @@ -75,19 +80,19 @@ class VIEW3D_OT_set_manipulator(Operator): name="Toggle", description="Hold Shift to toggle the selected manipulator rather than setting it as the only active one", default=False, - options={'SKIP_SAVE'} + options={'SKIP_SAVE'}, ) @classmethod - def poll(cls, context): + def poll(cls, context: Context) -> bool: space = context.space_data return space and space.type == 'VIEW_3D' - def invoke(self, context, event): + def invoke(self, context: Context, event: Event): self.toggle = event.shift return self.execute(context) - def execute(self, context): + def execute(self, context: Context): space = context.space_data if self.manipulator != 'NONE': diff --git a/extensions/blender_org/viewport_pie_menus/pie_mesh_delete.py b/extensions/blender_org/viewport_pie_menus/pie_mesh_delete.py index 4c154ae..1250074 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_mesh_delete.py +++ b/extensions/blender_org/viewport_pie_menus/pie_mesh_delete.py @@ -1,8 +1,8 @@ -# SPDX-FileCopyrightText: 2016-2024 Blender Foundation +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation # # SPDX-License-Identifier: GPL-3.0-or-later -from bpy.types import Menu +from bpy.types import Context, Menu from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only @@ -11,39 +11,29 @@ class PIE_MT_mesh_delete(Menu): bl_idname = "PIE_MT_mesh_delete" bl_label = "Mesh Delete" - def draw(self, context): + def draw(self, _context: Context): layout = self.layout pie = layout.menu_pie() # 4 - LEFT box = pie.split().column() - box.operator( - "mesh.dissolve_limited", text="Limited Dissolve", icon='STICKY_UVS_LOC' - ) + box.operator("mesh.dissolve_limited", text="Limited Dissolve", icon='STICKY_UVS_LOC') box.operator("mesh.delete_edgeloop", text="Delete Edge Loops", icon='NONE') box.operator("mesh.edge_collapse", text="Edge Collapse", icon='UV_EDGESEL') # 6 - RIGHT box = pie.split().column() box.operator("mesh.remove_doubles", text="Merge By Distance", icon='NONE') - box.operator("mesh.delete", text="Only Edge & Faces", icon='NONE').type = ( - 'EDGE_FACE' - ) - box.operator("mesh.delete", text="Only Faces", icon='UV_FACESEL').type = ( - 'ONLY_FACE' - ) + box.operator("mesh.delete", text="Only Edge & Faces", icon='NONE').type = 'EDGE_FACE' + box.operator("mesh.delete", text="Only Faces", icon='UV_FACESEL').type = 'ONLY_FACE' # 2 - BOTTOM pie.operator("mesh.dissolve_edges", text="Dissolve Edges", icon='SNAP_EDGE') # 8 - TOP pie.operator("mesh.delete", text="Delete Edges", icon='EDGESEL').type = 'EDGE' # 7 - TOP - LEFT - pie.operator("mesh.delete", text="Delete Vertices", icon='VERTEXSEL').type = ( - 'VERT' - ) + pie.operator("mesh.delete", text="Delete Vertices", icon='VERTEXSEL').type = 'VERT' # 9 - TOP - RIGHT pie.operator("mesh.delete", text="Delete Faces", icon='FACESEL').type = 'FACE' # 1 - BOTTOM - LEFT - pie.operator( - "mesh.dissolve_verts", text="Dissolve Vertices", icon='SNAP_VERTEX' - ) + pie.operator("mesh.dissolve_verts", text="Dissolve Vertices", icon='SNAP_VERTEX') # 3 - BOTTOM - RIGHT pie.operator("mesh.dissolve_faces", text="Dissolve Faces", icon='SNAP_FACE') diff --git a/extensions/blender_org/viewport_pie_menus/pie_mesh_edge.py b/extensions/blender_org/viewport_pie_menus/pie_mesh_edge.py new file mode 100644 index 0000000..d5a6705 --- /dev/null +++ b/extensions/blender_org/viewport_pie_menus/pie_mesh_edge.py @@ -0,0 +1,179 @@ +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation +# +# SPDX-License-Identifier: GPL-3.0-or-later + +import bmesh +import bpy +from bmesh.types import BMEdge +from bpy.types import Context, Menu, Object, Operator + +from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only + +# Above this edge count the state check is skipped to avoid poll lag. +_EDGE_POLL_LIMIT = 100_000 + + +class PIE_MT_mesh_edge(Menu): + bl_idname = "PIE_MT_mesh_edge" + bl_label = "Mesh Edge" + + def draw(self, context: Context): + layout = self.layout + pie = layout.menu_pie() + # 4 - LEFT + pie.operator(MESH_OT_pie_clear_seam.bl_idname, text="Clear Seam", icon='EDGE_SEAM') + # 6 - RIGHT + pie.operator(MESH_OT_pie_mark_seam.bl_idname, text="Mark Seam", icon='EDGE_SEAM') + # 2 - BOTTOM + pie.operator(MESH_OT_pie_clear_sharp.bl_idname, text="Clear Sharp", icon='EDGE_SHARP') + # 8 - TOP + pie.operator(MESH_OT_pie_mark_sharp.bl_idname, text="Mark Sharp", icon='EDGE_SHARP') + # 7 - TOP - LEFT + pie.operator(MESH_OT_pie_clear_freestyle_edge.bl_idname, text="Clear Freestyle Edge", icon='EDGESEL') + # 9 - TOP - RIGHT + if context.tool_settings.mesh_select_mode[0]: + pie.operator("transform.vert_crease", text="Vertex Crease", icon='VERTEX_CREASE') + else: + pie.operator("transform.edge_crease", text="Edge Crease", icon='EDGE_CREASE') + # 1 - BOTTOM - LEFT + pie.operator(MESH_OT_pie_mark_freestyle_edge.bl_idname, text="Mark Freestyle Edge", icon='EDGESEL') + # 3 - BOTTOM - RIGHT + pie.operator("transform.edge_bevelweight", text="Edge Bevel Weight", icon='EDGE_BEVEL') + + +class _EdgeMarkBase(Operator): + bl_options = {'REGISTER', 'UNDO'} + edge_data_type: str + do_clear: bool + + @classmethod + def poll(cls, context: Context) -> bool: + obj = context.active_object + if not (obj and obj.type == 'MESH' and obj.mode == 'EDIT'): + cls.poll_message_set("Must be in Mesh Edit mode") + return False + if len(obj.data.edges) > _EDGE_POLL_LIMIT: + return True + any_have, all_have = selected_edge_data_state(obj, cls.edge_data_type) + if not any_have and all_have: + cls.poll_message_set("No edges selected") + return False + if cls.do_clear: + if not any_have: + cls.poll_message_set("No selected edges are marked") + return False + else: + if all_have: + cls.poll_message_set("All selected edges are already marked") + return False + return True + + def execute(self, _context: Context): + if self.edge_data_type == 'SEAM': + bpy.ops.mesh.mark_seam(clear=self.do_clear) + elif self.edge_data_type == 'SHARP': + bpy.ops.mesh.mark_sharp(clear=self.do_clear) + elif self.edge_data_type == 'FREESTYLE': + bpy.ops.mesh.mark_freestyle_edge(clear=self.do_clear) + return {'FINISHED'} + + +class MESH_OT_pie_mark_seam(_EdgeMarkBase): + bl_idname = "mesh.pie_mark_seam" + bl_label = "Mark Seam" + bl_description = "Mark selected edges as seams for UV unwrapping" + edge_data_type = 'SEAM' + do_clear = False + + +class MESH_OT_pie_clear_seam(_EdgeMarkBase): + bl_idname = "mesh.pie_clear_seam" + bl_label = "Clear Seam" + bl_description = "Remove seam marks from selected edges" + edge_data_type = 'SEAM' + do_clear = True + + +class MESH_OT_pie_mark_sharp(_EdgeMarkBase): + bl_idname = "mesh.pie_mark_sharp" + bl_label = "Mark Sharp" + bl_description = "Mark selected edges as sharp" + edge_data_type = 'SHARP' + do_clear = False + + +class MESH_OT_pie_clear_sharp(_EdgeMarkBase): + bl_idname = "mesh.pie_clear_sharp" + bl_label = "Clear Sharp" + bl_description = "Remove sharp marks from selected edges" + edge_data_type = 'SHARP' + do_clear = True + + +class MESH_OT_pie_mark_freestyle_edge(_EdgeMarkBase): + bl_idname = "mesh.pie_mark_freestyle_edge" + bl_label = "Mark Freestyle Edge" + bl_description = "Mark selected edges as Freestyle edges" + edge_data_type = 'FREESTYLE' + do_clear = False + + +class MESH_OT_pie_clear_freestyle_edge(_EdgeMarkBase): + bl_idname = "mesh.pie_clear_freestyle_edge" + bl_label = "Clear Freestyle Edge" + bl_description = "Remove Freestyle marks from selected edges" + edge_data_type = 'FREESTYLE' + do_clear = True + + +def _edge_has_data(edge: BMEdge, edge_data_type: str, freestyle_layer) -> bool: + if edge_data_type == 'SEAM': + return edge.seam + if edge_data_type == 'SHARP': + return not edge.smooth + if edge_data_type == 'FREESTYLE': + return edge[freestyle_layer] if freestyle_layer else False + return False + + +def selected_edge_data_state(obj: Object, edge_data_type: str) -> tuple[bool, bool]: + """Return (any_have, all_have) for selected edges of the given data type.""" + bm = bmesh.from_edit_mesh(obj.data) + freestyle_layer = bm.edges.layers.bool.get("freestyle_edge") if edge_data_type == 'FREESTYLE' else None + + any_have = False + all_have = True + found = False + for edge in bm.edges: + if not edge.select: + continue + found = True + has = _edge_has_data(edge, edge_data_type, freestyle_layer) + any_have |= has + all_have &= has + if any_have and not all_have: + break # Both states seen, result can't change. + + if not found: + return False, False + return any_have, all_have + + +registry = [ + PIE_MT_mesh_edge, + MESH_OT_pie_mark_seam, + MESH_OT_pie_clear_seam, + MESH_OT_pie_mark_sharp, + MESH_OT_pie_clear_sharp, + MESH_OT_pie_mark_freestyle_edge, + MESH_OT_pie_clear_freestyle_edge, +] + + +def register(): + WM_OT_call_menu_pie_drag_only.register_drag_hotkey( + keymap_name="Mesh", + pie_name=PIE_MT_mesh_edge.bl_idname, + hotkey_kwargs={'type': "E", 'value': "PRESS", 'shift': True}, + on_drag=True, + ) diff --git a/extensions/blender_org/viewport_pie_menus/pie_mesh_flatten.py b/extensions/blender_org/viewport_pie_menus/pie_mesh_flatten.py index f0219ab..af97d9f 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_mesh_flatten.py +++ b/extensions/blender_org/viewport_pie_menus/pie_mesh_flatten.py @@ -1,10 +1,10 @@ -# SPDX-FileCopyrightText: 2016-2024 Blender Foundation +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation # # SPDX-License-Identifier: GPL-3.0-or-later import bpy -from bpy.types import Menu, Operator from bpy.props import EnumProperty +from bpy.types import Context, Menu, Operator from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only @@ -13,7 +13,7 @@ class PIE_MT_mesh_flatten(Menu): bl_idname = "PIE_MT_mesh_flatten" bl_label = "Mesh Flatten" - def draw(self, context): + def draw(self, _context: Context): layout = self.layout pie = layout.menu_pie() # 4 - LEFT @@ -65,11 +65,11 @@ class TRANSFORM_OT_flatten_to_center(Operator): ) @classmethod - def poll(cls, context): + def poll(cls, context: Context): obj = context.active_object return obj and obj.type == "MESH" - def execute(self, context): + def execute(self, _context: Context): values = { 'X': [(0, 1, 1), (True, False, False)], 'Y': [(1, 0, 1), (False, True, False)], @@ -106,11 +106,11 @@ class TRANSFORM_OT_flatten_to_object_origin(Operator): ) @classmethod - def poll(cls, context): + def poll(cls, context: Context): obj = context.active_object return obj and obj.type == "MESH" - def execute(self, context): + def execute(self, _context: Context): bpy.ops.object.mode_set(mode='OBJECT') index = "XYZ".find(self.axis) for vert in bpy.context.object.data.vertices: @@ -149,11 +149,11 @@ class TRANSFORM_OT_flatten_to_selection_bounding_box(Operator): ) @classmethod - def poll(cls, context): + def poll(cls, context: Context): obj = context.active_object return obj and obj.type == "MESH" - def execute(self, context): + def execute(self, _context: Context): bpy.ops.object.mode_set(mode='OBJECT') count = 0 axis_idx = "XYZ".find(self.axis) diff --git a/extensions/blender_org/viewport_pie_menus/pie_mesh_merge.py b/extensions/blender_org/viewport_pie_menus/pie_mesh_merge.py index 0120b7d..1654a2e 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_mesh_merge.py +++ b/extensions/blender_org/viewport_pie_menus/pie_mesh_merge.py @@ -1,8 +1,8 @@ -# SPDX-FileCopyrightText: 2016-2024 Blender Foundation +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation # # SPDX-License-Identifier: GPL-3.0-or-later -from bpy.types import Menu +from bpy.types import Context, Menu from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only @@ -11,16 +11,14 @@ class PIE_MT_mesh_merge(Menu): bl_idname = "PIE_MT_mesh_merge" bl_label = "Mesh Merge" - def draw(self, context): + def draw(self, _context: Context): pie = self.layout.menu_pie() # 4 - LEFT pie.operator('mesh.remove_doubles', text="By Distance", icon='PROP_ON') # 6 - RIGHT - pie.operator('mesh.merge', text="At Center", icon='SNAP_FACE_CENTER').type = ( - 'CENTER' - ) + pie.operator('mesh.merge', text="At Center", icon='SNAP_FACE_CENTER').type = 'CENTER' # 2 - BOTTOM op = pie.operator('mesh.merge', text="Collapse", icon='FULLSCREEN_EXIT') @@ -37,13 +35,9 @@ class PIE_MT_mesh_merge(Menu): # This will raise an error if the option isn't available. op.type = 'FIRST' # 7 - TOP - LEFT - pie.operator( - 'mesh.merge', text="At First", icon='TRACKING_REFINE_BACKWARDS' - ).type = 'FIRST' + pie.operator('mesh.merge', text="At First", icon='TRACKING_REFINE_BACKWARDS').type = 'FIRST' # 9 - TOP - RIGHT - pie.operator( - 'mesh.merge', text="At Last", icon='TRACKING_REFINE_FORWARDS' - ).type = 'LAST' + pie.operator('mesh.merge', text="At Last", icon='TRACKING_REFINE_FORWARDS').type = 'LAST' except: op.type = 'COLLAPSE' pie.separator() @@ -52,9 +46,7 @@ class PIE_MT_mesh_merge(Menu): # 1 - BOTTOM - LEFT pie.separator() # 3 - BOTTOM - RIGHT - pie.operator('mesh.merge', text="At 3D Cursor", icon='PIVOT_CURSOR').type = ( - 'CURSOR' - ) + pie.operator('mesh.merge', text="At 3D Cursor", icon='PIVOT_CURSOR').type = 'CURSOR' registry = [PIE_MT_mesh_merge] diff --git a/extensions/blender_org/viewport_pie_menus/pie_object_add.py b/extensions/blender_org/viewport_pie_menus/pie_object_add.py index 9125411..eb08343 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_object_add.py +++ b/extensions/blender_org/viewport_pie_menus/pie_object_add.py @@ -1,10 +1,11 @@ -# SPDX-FileCopyrightText: 2016-2024 Blender Foundation +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation # # SPDX-License-Identifier: GPL-3.0-or-later # Requested by users here: https://projects.blender.org/extensions/space_view3d_pie_menus/issues/67 -from bpy.types import Menu +from bpy.types import Context, Menu + from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only @@ -12,7 +13,7 @@ class PIE_MT_object_add(Menu): bl_idname = "PIE_MT_object_add" bl_label = "Add Object" - def draw(self, context): + def draw(self, _context: Context): pie = self.layout.menu_pie() # 4 - LEFT diff --git a/extensions/blender_org/viewport_pie_menus/pie_object_display.py b/extensions/blender_org/viewport_pie_menus/pie_object_display.py index d58d4b8..973fddd 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_object_display.py +++ b/extensions/blender_org/viewport_pie_menus/pie_object_display.py @@ -1,9 +1,10 @@ -# SPDX-FileCopyrightText: 2016-2024 Blender Foundation +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation # # SPDX-License-Identifier: GPL-3.0-or-later import bpy -from bpy.types import Menu, Operator +from bpy.types import Context, Menu, Operator + from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only @@ -12,10 +13,10 @@ class PIE_MT_object_display(Menu): bl_label = "Object Display" @classmethod - def poll(cls, context): + def poll(cls, context: Context): return context.active_object - def draw(self, context): + def draw(self, context: Context): pie = self.layout.menu_pie() obj = context.active_object @@ -37,7 +38,7 @@ class PIE_MT_object_display(Menu): box.label(text="Color") row = box.row(align=True) row.prop(obj, 'color', text="") - row.operator('view3d.copy_property_to_selected', text="", icon='LOOP_FORWARDS').rna_path='color' + row.operator('view3d.copy_property_to_selected', text="", icon='LOOP_FORWARDS').rna_path = 'color' else: pie.separator() @@ -95,7 +96,7 @@ class OBJECT_OT_add_weighted_normals(Operator): bl_label = "Weighted Normals" bl_options = {'REGISTER', 'UNDO'} - def execute(self, context): + def execute(self, context: Context): for obj in context.selected_objects: if obj.type != 'MESH': continue @@ -113,7 +114,7 @@ class OBJECT_OT_reset_normals(Operator): bl_label = "Reset Normals" bl_options = {'REGISTER', 'UNDO'} - def execute(self, context): + def execute(self, context: Context): for obj in context.selected_objects: if obj.type != 'MESH': continue diff --git a/extensions/blender_org/viewport_pie_menus/pie_object_parenting.py b/extensions/blender_org/viewport_pie_menus/pie_object_parenting.py index 1cf8354..cab5faf 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_object_parenting.py +++ b/extensions/blender_org/viewport_pie_menus/pie_object_parenting.py @@ -1,10 +1,10 @@ -# SPDX-FileCopyrightText: 2016-2024 Blender Foundation +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation # # SPDX-License-Identifier: GPL-3.0-or-later import bpy -from bpy.types import Menu, Operator from bpy.props import BoolProperty, EnumProperty +from bpy.types import Context, Menu, Operator, OperatorProperties from mathutils import Matrix from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only @@ -15,10 +15,10 @@ class OBJECT_MT_parenting_pie(Menu): bl_idname = 'OBJECT_MT_parenting_pie' @classmethod - def poll(cls, context): + def poll(cls, context: Context): return context.mode == 'OBJECT' - def draw(self, context): + def draw(self, _context: Context): layout = self.layout pie = layout.menu_pie() @@ -64,7 +64,7 @@ class OBJECT_MT_parenting_pie(Menu): pie.separator() -def selected_objs_with_parents(context): +def selected_objs_with_parents(context: Context): return [ob for ob in context.selected_objects if ob.parent] @@ -81,21 +81,21 @@ class OBJECT_OT_clear_parent(Operator): ) @classmethod - def description(cls, context, properties): + def description(cls, _context: Context, properties: OperatorProperties): if properties.keep_transform: return "Clear the parent of selected objects, while preserving their position in space" else: return "Clear the parent of selected objects, without affecting their Loc/Rot/Scale values. This may cause the now parentless children to change position" @classmethod - def poll(cls, context): + def poll(cls, context: Context): if not selected_objs_with_parents(context): cls.poll_message_set("No selected objects have parents.") return False return set_parent_poll_check_linked(cls, context) - def execute(self, context): + def execute(self, context: Context): objs = selected_objs_with_parents(context) op_type = 'CLEAR_KEEP_TRANSFORM' if self.keep_transform else 'CLEAR' @@ -115,22 +115,20 @@ class OBJECT_OT_clear_parent_inverse_matrix(Operator): bl_options = {'REGISTER', 'UNDO'} @classmethod - def poll(cls, context): + def poll(cls, context: Context): objs_with_parents = selected_objs_with_parents(context) if not objs_with_parents: cls.poll_message_set("No selected objects have parents.") return False identity_matrix = Matrix.Identity(4) - if not any( - [obj.matrix_parent_inverse != identity_matrix for obj in objs_with_parents] - ): + if not any([obj.matrix_parent_inverse != identity_matrix for obj in objs_with_parents]): cls.poll_message_set("No selected objects have a parenting offset set.") return False return set_parent_poll_check_linked(cls, context) - def execute(self, context): + def execute(self, context: Context): objs = selected_objs_with_parents(context) bpy.ops.object.parent_clear(type='CLEAR_INVERSE') @@ -148,16 +146,14 @@ class OBJECT_OT_parent_set_simple(Operator): bl_options = {'REGISTER', 'UNDO'} @classmethod - def poll(cls, context): + def poll(cls, context: Context): if not len(context.selected_objects) > 1 and context.active_object: - cls.poll_message_set( - "Only one object is selected. You can't parent an object to itself." - ) + cls.poll_message_set("Only one object is selected. You can't parent an object to itself.") return False return set_parent_poll_check_linked(cls, context) - def execute(self, context): + def execute(self, context: Context): parent_ob = context.active_object objs_to_parent = [obj for obj in context.selected_objects if obj != parent_ob] @@ -168,11 +164,7 @@ class OBJECT_OT_parent_set_simple(Operator): return {'CANCELLED'} # Report what was done. - objs_str = ( - objs_to_parent[0].name - if len(objs_to_parent) == 1 - else f"{len(objs_to_parent)} objects" - ) + objs_str = objs_to_parent[0].name if len(objs_to_parent) == 1 else f"{len(objs_to_parent)} objects" self.report({'INFO'}, f"Parented {objs_str} to {parent_ob.name}") return {'FINISHED'} @@ -185,16 +177,14 @@ class OBJECT_OT_parent_set_advanced(Operator): bl_options = {'REGISTER', 'UNDO'} @classmethod - def poll(cls, context): + def poll(cls, context: Context): if not len(context.selected_objects) > 1 and context.active_object: - cls.poll_message_set( - "Only one object is selected. You can't parent an object to itself." - ) + cls.poll_message_set("Only one object is selected. You can't parent an object to itself.") return False return set_parent_poll_check_linked(cls, context) - def get_parent_method_items(self, context): + def get_parent_method_items(self, context: Context): parent_ob = context.active_object items = [ ( @@ -273,9 +263,7 @@ class OBJECT_OT_parent_set_advanced(Operator): ) ) - return [ - (item[0], item[1], item[2], item[3], idx) for idx, item in enumerate(items) - ] + return [(item[0], item[1], item[2], item[3], idx) for idx, item in enumerate(items)] parent_method: EnumProperty( name="Parent Method", @@ -428,9 +416,7 @@ class OBJECT_OT_parent_set_advanced(Operator): keep_transform = self.transform_correction == 'MATRIX_INTERNAL' objs_to_parent = [obj for obj in context.selected_objects if obj != parent_ob] - matrix_backups = [ - (obj.matrix_world.copy(), obj.matrix_local.copy()) for obj in objs_to_parent - ] + matrix_backups = [(obj.matrix_world.copy(), obj.matrix_local.copy()) for obj in objs_to_parent] op_parent_method = self.parent_method @@ -459,9 +445,7 @@ class OBJECT_OT_parent_set_advanced(Operator): return self.parent_with_copy_transforms_con(context) try: - bpy.ops.object.parent_set( - type=op_parent_method, keep_transform=keep_transform - ) + bpy.ops.object.parent_set(type=op_parent_method, keep_transform=keep_transform) except Exception as exc: self.report({'ERROR'}, str(exc)) return {'CANCELLED'} @@ -477,11 +461,7 @@ class OBJECT_OT_parent_set_advanced(Operator): obj.matrix_world = matrices[0] # Report what was done. - objs_str = ( - objs_to_parent[0].name - if len(objs_to_parent) == 1 - else f"{len(objs_to_parent)} objects" - ) + objs_str = objs_to_parent[0].name if len(objs_to_parent) == 1 else f"{len(objs_to_parent)} objects" self.report({'INFO'}, f"Parented {objs_str} to {parent_ob.name}") return {'FINISHED'} @@ -515,9 +495,7 @@ class OBJECT_OT_parent_set_advanced(Operator): target.subtarget = active_bone.name # Draw a nice info message. - objs_str = ( - obj.name if len(objs_to_parent) == 1 else f"{len(objs_to_parent)} objects" - ) + objs_str = obj.name if len(objs_to_parent) == 1 else f"{len(objs_to_parent)} objects" self.report({'INFO'}, f"Constrained {objs_str} to {active_bone.name}") return {'FINISHED'} @@ -543,21 +521,13 @@ class OBJECT_OT_parent_set_advanced(Operator): childof.target = parent_ob if context.active_pose_bone: childof.subtarget = context.active_pose_bone.name - childof.inverse_matrix = ( - parent_ob.matrix_world @ context.active_pose_bone.matrix - ).inverted() + childof.inverse_matrix = (parent_ob.matrix_world @ context.active_pose_bone.matrix).inverted() else: childof.inverse_matrix = parent_ob.matrix_world.inverted() # Draw a nice info message. - objs_str = ( - obj.name if len(objs_to_parent) == 1 else f"{len(objs_to_parent)} objects" - ) - parent_str = ( - context.active_pose_bone.name - if context.active_pose_bone - else parent_ob.name - ) + objs_str = obj.name if len(objs_to_parent) == 1 else f"{len(objs_to_parent)} objects" + parent_str = context.active_pose_bone.name if context.active_pose_bone else parent_ob.name self.report({'INFO'}, f"Constrained {objs_str} to {parent_str}") return {'FINISHED'} @@ -573,23 +543,15 @@ class OBJECT_OT_parent_set_advanced(Operator): copytrans.subtarget = context.active_pose_bone.name # Draw a nice info message. - objs_str = ( - obj.name if len(objs_to_parent) == 1 else f"{len(objs_to_parent)} objects" - ) - parent_str = ( - context.active_pose_bone.name - if context.active_pose_bone - else parent_ob.name - ) + objs_str = obj.name if len(objs_to_parent) == 1 else f"{len(objs_to_parent)} objects" + parent_str = context.active_pose_bone.name if context.active_pose_bone else parent_ob.name self.report({'INFO'}, f"Constrained {objs_str} to {parent_str}") return {'FINISHED'} -def set_parent_poll_check_linked(cls, context): +def set_parent_poll_check_linked(cls, context: Context): if any([ob.library for ob in context.selected_objects]): - cls.poll_message_set( - "An object is linked. You need to override it to change the parenting." - ) + cls.poll_message_set("An object is linked. You need to override it to change the parenting.") return False if any([ob.override_library and ob.override_library.is_system_override for ob in context.selected_objects]): cls.poll_message_set( @@ -598,8 +560,9 @@ def set_parent_poll_check_linked(cls, context): return False return True + ### Header Menu UI -def draw_new_header_menu(self, context): +def draw_new_header_menu(self, _context: Context): layout = self.layout # Set Parent diff --git a/extensions/blender_org/viewport_pie_menus/pie_animation.py b/extensions/blender_org/viewport_pie_menus/pie_playback.py similarity index 65% rename from extensions/blender_org/viewport_pie_menus/pie_animation.py rename to extensions/blender_org/viewport_pie_menus/pie_playback.py index 3b66415..bb6efcb 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_animation.py +++ b/extensions/blender_org/viewport_pie_menus/pie_playback.py @@ -1,16 +1,17 @@ -# SPDX-FileCopyrightText: 2016-2024 Blender Foundation +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation # # SPDX-License-Identifier: GPL-3.0-or-later -from bpy.types import Menu +from bpy.types import Context, Menu + from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only -class PIE_MT_animation(Menu): - bl_idname = "PIE_MT_animation" - bl_label = "Animation" +class PIE_MT_playback(Menu): + bl_idname = "PIE_MT_playback" + bl_label = "Playback" - def draw(self, context): + def draw(self, context: Context): layout = self.layout pie = layout.menu_pie() # 4 - LEFT @@ -18,22 +19,16 @@ class PIE_MT_animation(Menu): # 6 - RIGHT pie.operator("screen.frame_jump", text="Jump to End", icon='FF').end = True # 2 - BOTTOM - pie.operator( - "screen.animation_play", text="Play Reverse", icon='PLAY_REVERSE' - ).reverse = True + pie.operator("screen.animation_play", text="Play Reverse", icon='PLAY_REVERSE').reverse = True # 8 - TOP if not context.screen.is_animation_playing: # Play / Pause pie.operator("screen.animation_play", text="Play", icon='PLAY') else: pie.operator("screen.animation_play", text="Stop", icon='PAUSE') # 7 - TOP - LEFT - pie.operator( - "screen.keyframe_jump", text="Previous Keyframe", icon='PREV_KEYFRAME' - ).next = False + pie.operator("screen.keyframe_jump", text="Previous Keyframe", icon='PREV_KEYFRAME').next = False # 9 - TOP - RIGHT - pie.operator( - "screen.keyframe_jump", text="Next Keyframe", icon='NEXT_KEYFRAME' - ).next = True + pie.operator("screen.keyframe_jump", text="Next Keyframe", icon='NEXT_KEYFRAME').next = True # 1 - BOTTOM - LEFT pie.prop(context.tool_settings, "use_keyframe_insert_auto", text="Auto Keying") # 3 - BOTTOM - RIGHT @@ -41,14 +36,14 @@ class PIE_MT_animation(Menu): registry = [ - PIE_MT_animation, + PIE_MT_playback, ] def register(): WM_OT_call_menu_pie_drag_only.register_drag_hotkey( keymap_name="Object Non-modal", - pie_name=PIE_MT_animation.bl_idname, + pie_name=PIE_MT_playback.bl_idname, hotkey_kwargs={'type': "SPACE", 'value': "PRESS", 'shift': True}, default_fallback_op='screen.animation_play', on_drag=True, diff --git a/extensions/blender_org/viewport_pie_menus/pie_preferences.py b/extensions/blender_org/viewport_pie_menus/pie_preferences.py index dce8347..7c3de50 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_preferences.py +++ b/extensions/blender_org/viewport_pie_menus/pie_preferences.py @@ -3,6 +3,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later from bpy.types import Menu + from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only diff --git a/extensions/blender_org/viewport_pie_menus/pie_proportional_editing.py b/extensions/blender_org/viewport_pie_menus/pie_proportional_editing.py index 4dbd554..6b1b102 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_proportional_editing.py +++ b/extensions/blender_org/viewport_pie_menus/pie_proportional_editing.py @@ -2,8 +2,9 @@ # # SPDX-License-Identifier: GPL-3.0-or-later -from bpy.types import Menu, Operator from bpy.props import StringProperty +from bpy.types import Context, Menu, Operator + from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only @@ -11,38 +12,28 @@ class PIE_MT_proportional_edit(Menu): bl_idname = "PIE_MT_proportional_edit" bl_label = "Proportional Edit" - def draw(self, context): + def draw(self, context: Context): ts = context.tool_settings layout = self.layout pie = layout.menu_pie() # 4 - LEFT - pie.operator( - "object.set_proportional_falloff", text="Smooth", icon='SMOOTHCURVE' - ).falloff_shape = 'SMOOTH' + pie.operator("object.set_proportional_falloff", text="Smooth", icon='SMOOTHCURVE').falloff_shape = 'SMOOTH' # 6 - RIGHT if context.mode == 'OBJECT': - pie.menu( - "PIE_MT_proportional_edit_obj_more", text="More...", icon='THREE_DOTS' - ) + pie.menu("PIE_MT_proportional_edit_obj_more", text="More...", icon='THREE_DOTS') else: - pie.menu( - "PIE_MT_proportional_edit_mesh_more", text="More...", icon='THREE_DOTS' - ) + pie.menu("PIE_MT_proportional_edit_mesh_more", text="More...", icon='THREE_DOTS') # 2 - BOTTOM - pie.operator( - "object.set_proportional_falloff", text="Sharp", icon='SHARPCURVE' - ).falloff_shape = 'SHARP' + pie.operator("object.set_proportional_falloff", text="Sharp", icon='SHARPCURVE').falloff_shape = 'SHARP' if context.mode == 'OBJECT': # 8 - TOP pie.prop(ts, "use_proportional_edit_objects", text="Toggle Proportional") # 7 - TOP - LEFT - pie.operator( - "object.set_proportional_falloff", text="Root", icon='ROOTCURVE' - ).falloff_shape = 'ROOT' + pie.operator("object.set_proportional_falloff", text="Root", icon='ROOTCURVE').falloff_shape = 'ROOT' # 9 - TOP - RIGHT pie.operator( "object.set_proportional_falloff", @@ -51,9 +42,7 @@ class PIE_MT_proportional_edit(Menu): ).falloff_shape = 'INVERSE_SQUARE' else: # 8 - TOP - pie.prop( - ts, "use_proportional_edit", text="Toggle Proportional", icon='PROP_ON' - ) + pie.prop(ts, "use_proportional_edit", text="Toggle Proportional", icon='PROP_ON') # 7 - TOP - LEFT pie.prop( ts, @@ -70,50 +59,36 @@ class PIE_MT_proportional_edit(Menu): ) # 1 - BOTTOM - LEFT - pie.operator( - "object.set_proportional_falloff", text="Linear", icon='LINCURVE' - ).falloff_shape = 'LINEAR' + pie.operator("object.set_proportional_falloff", text="Linear", icon='LINCURVE').falloff_shape = 'LINEAR' # 3 - BOTTOM - RIGHT - pie.operator( - "object.set_proportional_falloff", text="Sphere", icon='SPHERECURVE' - ).falloff_shape = 'SPHERE' + pie.operator("object.set_proportional_falloff", text="Sphere", icon='SPHERECURVE').falloff_shape = 'SPHERE' class PIE_MT_proportional_edit_mesh_more(Menu): bl_idname = "PIE_MT_proportional_edit_mesh_more" bl_label = "More Falloff Shapes" - def draw(self, context): + def draw(self, _context: Context): layout = self.layout - layout.operator( - "object.set_proportional_falloff", text="Root", icon='ROOTCURVE' - ).falloff_shape = 'ROOT' + layout.operator("object.set_proportional_falloff", text="Root", icon='ROOTCURVE').falloff_shape = 'ROOT' layout.operator( "object.set_proportional_falloff", text="Inverse Square", icon='INVERSESQUARECURVE', ).falloff_shape = 'INVERSE_SQUARE' - layout.operator( - "object.set_proportional_falloff", text="Constant", icon='NOCURVE' - ).falloff_shape = 'CONSTANT' - layout.operator( - "object.set_proportional_falloff", text="Random", icon='RNDCURVE' - ).falloff_shape = 'RANDOM' + layout.operator("object.set_proportional_falloff", text="Constant", icon='NOCURVE').falloff_shape = 'CONSTANT' + layout.operator("object.set_proportional_falloff", text="Random", icon='RNDCURVE').falloff_shape = 'RANDOM' class PIE_MT_proportional_edit_obj_more(Menu): bl_idname = "PIE_MT_proportional_edit_obj_more" bl_label = "More Falloff Shapes" - def draw(self, context): + def draw(self, _context: Context): layout = self.layout - layout.operator( - "object.set_proportional_falloff", text="Constant", icon='NOCURVE' - ).falloff_shape = 'CONSTANT' - layout.operator( - "object.set_proportional_falloff", text="Random", icon='RNDCURVE' - ).falloff_shape = 'RANDOM' + layout.operator("object.set_proportional_falloff", text="Constant", icon='NOCURVE').falloff_shape = 'CONSTANT' + layout.operator("object.set_proportional_falloff", text="Random", icon='RNDCURVE').falloff_shape = 'RANDOM' class OBJECT_OT_set_proportional_falloff(Operator): @@ -125,7 +100,7 @@ class OBJECT_OT_set_proportional_falloff(Operator): falloff_shape: StringProperty() - def execute(self, context): + def execute(self, context: Context): ts = context.tool_settings if context.mode == 'OBJECT': ts.use_proportional_edit_objects = True @@ -145,7 +120,10 @@ registry = ( def register(): - for km_name, proportional_name in [('Object Mode', 'use_proportional_edit_objects'), ('Mesh', 'use_proportional_edit')]: + for km_name, proportional_name in [ + ('Object Mode', 'use_proportional_edit_objects'), + ('Mesh', 'use_proportional_edit'), + ]: WM_OT_call_menu_pie_drag_only.register_drag_hotkey( keymap_name=km_name, pie_name=PIE_MT_proportional_edit.bl_idname, diff --git a/extensions/blender_org/viewport_pie_menus/pie_relationship_delete.py b/extensions/blender_org/viewport_pie_menus/pie_relationship_delete.py index c1dcf62..096d0c6 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_relationship_delete.py +++ b/extensions/blender_org/viewport_pie_menus/pie_relationship_delete.py @@ -3,11 +3,23 @@ # SPDX-License-Identifier: GPL-3.0-or-later import os -from typing import Any import bpy -from bpy.types import Object, Collection, Operator, Menu, ID -from bpy.props import StringProperty, CollectionProperty +from bpy.props import BoolProperty, CollectionProperty, StringProperty +from bpy.types import ( + ID, + Collection, + Context, + Event, + Menu, + NodeTree, + Object, + Operator, + OperatorProperties, + PropertyGroup, + Scene, + bpy_prop_collection, +) from bpy_extras import id_map_utils from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only @@ -18,88 +30,95 @@ class OUTLINER_MT_relationship_pie(Menu): bl_idname = 'OUTLINER_MT_relationship_pie' @classmethod - def poll(cls, context): + def poll(cls, context: Context) -> bool: if context.area.type == 'VIEW_3D': return True if context.area.type == 'OUTLINER': return bool(context.id) return False - def draw(self, context): + def draw(self, context: Context) -> None: layout = self.layout active_id = get_active_id(context) + active_override = OUTLINER_OT_delete_override_library_hierarchy.poll(context) pie = layout.menu_pie() # 4 - LEFT - if context.area.type == 'VIEW_3D': + if active_override: + pie.operator( + OUTLINER_OT_delete_override_library_hierarchy.bl_idname, + icon='TRASH', + text="Unlink Override Hierarchy", + ).remove_from_file = False + else: pie.operator( OBJECT_OT_unlink_from_scene.bl_idname, icon='TRASH', text="Unlink From Scene", ) + # 6 - RIGHT + if active_override: + pie.operator( + OUTLINER_OT_delete_override_library_hierarchy.bl_idname, + icon='X', + text='Delete Override Hierarchy', + ).remove_from_file = True else: pie.operator( - 'outliner.id_operation', icon='TRASH', text='Unlink From Scene' - ).type = 'UNLINK' - # 6 - RIGHT - if context.area.type == 'VIEW_3D': - op = pie.operator('object.delete', icon='X', text="Delete From File") - op.use_global = True - op.confirm = False - elif any([type(id) in (bpy.types.Object, bpy.types.Collection) for id in context.selected_ids]): - # NOTE: Objects and other types of IDs cannot be deleted with the same operator, strangely enough. - # If we wanted to support that, we could implement a wrapper operator, but it's a very rare case, so this feels fine. - pie.operator('outliner.delete', icon='X', text='Delete From File') - else: - pie.operator('outliner.id_operation', icon='X', text="Delete IDs From File").type='DELETE' - # 2 - BOTTOM - pie.operator('outliner.pie_purge_orphans', icon='ORPHAN_DATA') - # 8 - TOP - id = get_active_id(context) - if id: - remap = pie.operator( - 'outliner.remap_users_ui', icon='FILE_REFRESH', text="Remap Users" + OBJECT_OT_pie_delete.bl_idname, + icon='X', + text="Delete From File", ) - if id.library: - remap.library_path_source = id.library.filepath + # 2 - BOTTOM + pie.operator( + 'outliner.pie_purge_orphans', + icon='ORPHAN_DATA', + ) + # 8 - TOP + if active_id: + remap = pie.operator( + 'outliner.remap_users_ui', + icon='FILE_REFRESH', + text="Remap Users", + ) + if active_id.library: + remap.library_path_source = active_id.library.filepath else: pie.separator() # 7 - TOP - LEFT pie.operator(OUTLINER_OT_list_users_of_datablock.bl_idname, icon='LOOP_BACK') # 9 - TOP - RIGHT - pie.operator( - OUTLINER_OT_list_dependencies_of_datablock.bl_idname, icon='LOOP_FORWARDS' - ) + pie.operator(OUTLINER_OT_list_dependencies_of_datablock.bl_idname, icon='LOOP_FORWARDS') # 1 - BOTTOM - LEFT if context.area.type == 'OUTLINER' and active_id: pie.operator( 'outliner.id_operation', text="Unlink From Collection", - icon="OUTLINER_COLLECTION", + icon='OUTLINER_COLLECTION', ).type = 'UNLINK' else: pie.separator() # 3 - BOTTOM - RIGHT if context.area.type == 'OUTLINER' and active_id: pie.operator( - 'outliner.delete', text="Delete Hierarchy", icon="OUTLINER" + 'outliner.delete', + text="Delete Hierarchy", + icon='OUTLINER', ).hierarchy = True else: - pie.operator( - OBJECT_OT_instancer_empty_to_collection.bl_idname, icon='LINKED' - ) + pie.operator(OBJECT_OT_instancer_empty_to_collection.bl_idname, icon='LINKED') class OUTLINER_OT_pie_purge_orphans(Operator): """Clear all orphaned data-blocks without any users from the file""" - bl_idname = "outliner.pie_purge_orphans" + bl_idname = 'outliner.pie_purge_orphans' bl_label = "Purge Unused Data" bl_options = {'REGISTER', 'UNDO'} - def execute(self, context): + def execute(self, context: Context) -> set[str]: """Call Blender's purge function, but in a way that works from any editor, not only the 3D View.""" orig_ui = None @@ -112,9 +131,7 @@ class OUTLINER_OT_pie_purge_orphans(Operator): area = context.area with context.temp_override(area=area): - ret = bpy.ops.outliner.orphans_purge( - do_local_ids=True, do_linked_ids=True, do_recursive=True - ) + ret = bpy.ops.outliner.orphans_purge(do_local_ids=True, do_linked_ids=True, do_recursive=True) if orig_ui: context.area.ui_type = orig_ui @@ -123,18 +140,16 @@ class OUTLINER_OT_pie_purge_orphans(Operator): class OBJECT_OT_unlink_from_scene(Operator): - """Unlink selected objects or collections from the current scene""" + """Unlink selected objects or collections from all collections of the current scene""" - bl_idname = "object.unlink_from_scene" + bl_idname = 'object.unlink_from_scene' bl_label = "Unlink Selected From Scene" bl_options = {'REGISTER', 'UNDO'} @classmethod - def poll(cls, context): + def poll(cls, context: Context) -> bool: if context.area.type == 'OUTLINER': - any_selected = bool( - get_objects_to_unlink(context) or get_collections_to_unlink(context) - ) + any_selected = bool(get_objects_to_unlink(context) or get_collections_to_unlink(context)) elif context.area.type == 'VIEW_3D': any_selected = bool(get_objects_to_unlink(context)) else: @@ -144,7 +159,7 @@ class OBJECT_OT_unlink_from_scene(Operator): cls.poll_message_set("Nothing is selected.") return any_selected - def execute(self, context): + def execute(self, context: Context) -> set[str]: unlink_collections_from_scene(get_collections_to_unlink(context), context.scene) unlink_objects_from_scene(get_objects_to_unlink(context), context.scene) @@ -156,7 +171,7 @@ class RelationshipOperatorMixin: datablock_storage: StringProperty() library_filepath: StringProperty() - def get_datablock(self, context) -> ID | None: + def get_datablock(self, context: Context) -> ID | None: if self.datablock_name and self.datablock_storage: storage = getattr(bpy.data, self.datablock_storage) lib_path = self.library_filepath or None @@ -167,30 +182,30 @@ class RelationshipOperatorMixin: return context.active_object @classmethod - def poll(cls, context): + def poll(cls, context: Context) -> bool: id = get_active_id(context) if context.area.type == 'OUTLINER': - if id == None: + if id is None: cls.poll_message_set("No active ID.") return False return True elif context.area.type == '3D_VIEW': - if id == None: + if id is None: cls.poll_message_set("No active object.") return False return True - def invoke(self, context, _event): + def invoke(self, context: Context, _event: Event) -> set[str]: return context.window_manager.invoke_props_dialog(self, width=600) def get_datablocks_to_display(self, id: ID) -> list[ID]: raise NotImplementedError - def get_label(self): + def get_label(self) -> str: return "Listing datablocks that reference this:" - def draw(self, context): + def draw(self, context: Context) -> None: layout = self.layout layout.use_property_decorate = False layout.use_property_split = True @@ -211,9 +226,9 @@ class RelationshipOperatorMixin: id_row = split.row(align=True) name_row = id_row.row() name_row.enabled = False - name_row.prop(datablock, 'name', icon=get_datablock_icon(datablock), text="") + name_row.prop(datablock, 'name', icon=get_datablock_icon(datablock), text='') fake_user_row = id_row.row() - fake_user_row.prop(datablock, 'use_fake_user', text="") + fake_user_row.prop(datablock, 'use_fake_user', text='') layout.separator() @@ -230,14 +245,15 @@ class RelationshipOperatorMixin: row = layout.row() name_row = row.row() name_row.enabled = False - name_row.prop(user, 'name', icon=get_datablock_icon(user), text="") + name_row.prop(user, 'name', icon=get_datablock_icon(user), text='') op_row = row.row() - op = op_row.operator(type(self).bl_idname, text="", icon='LOOP_FORWARDS') + op = op_row.operator(type(self).bl_idname, text='', icon='LOOP_FORWARDS') op.datablock_name = user.name - storage = get_id_storage_by_type_str(user.id_type)[1] + storage = get_id_storage_by_type_str(user.id_type) if not storage: print("Error: Can't find storage: ", user.name, user.id_type) - op.datablock_storage = storage + else: + op.datablock_storage = storage[1] if user.library: op.library_filepath = user.library.filepath name_row.prop( @@ -247,14 +263,22 @@ class RelationshipOperatorMixin: text="", ) - def execute(self, context): + def execute(self, _context: Context) -> set[str]: return {'FINISHED'} +def get_datablock_users(datablock: ID) -> list[ID]: + user_map = bpy.data.user_map() + users = user_map[datablock] + if datablock in users: + users.remove(datablock) + return sorted(users, key=lambda u: (str(type(u)), u.name)) + + class OUTLINER_OT_list_users_of_datablock(RelationshipOperatorMixin, Operator): """Show list of users of this datablock""" - bl_idname = "object.list_datablock_users" + bl_idname = 'object.list_datablock_users' bl_label = "List Datablock Users" datablock_name: StringProperty() @@ -262,18 +286,16 @@ class OUTLINER_OT_list_users_of_datablock(RelationshipOperatorMixin, Operator): library_filepath: StringProperty() def get_datablocks_to_display(self, datablock: ID) -> list[ID]: - user_map = bpy.data.user_map() - users = user_map[datablock] - return sorted(users, key=lambda u: (str(type(u)), u.name)) + return get_datablock_users(datablock) class OUTLINER_OT_list_dependencies_of_datablock(RelationshipOperatorMixin, Operator): """Show list of dependencies of this datablock""" - bl_idname = "object.list_datablock_dependencies" + bl_idname = 'object.list_datablock_dependencies' bl_label = "List Datablock Dependencies" - def get_label(self): + def get_label(self) -> str: return "Listing datablocks that are referenced by this:" def get_datablocks_to_display(self, datablock: ID) -> list[ID]: @@ -283,23 +305,26 @@ class OUTLINER_OT_list_dependencies_of_datablock(RelationshipOperatorMixin, Oper return sorted(dependencies, key=lambda u: (str(type(u)), u.name)) -class RemapTarget(bpy.types.PropertyGroup): +class RemapTarget(PropertyGroup): pass -class OUTLINER_OT_remap_users_ui(bpy.types.Operator): +class OUTLINER_OT_remap_users_ui(Operator): """Remap users of selected IDs to any other ID of the same type""" - bl_idname = "outliner.remap_users_ui" + bl_idname = 'outliner.remap_users_ui' bl_label = "Remap Users" bl_options = {'INTERNAL', 'UNDO'} - def update_library_path(self, context): + def update_library_path(self, context: Context) -> None: # Prepare the ID selector. remap_targets = context.scene.remap_targets remap_targets.clear() source_ids = get_selected_ids_of_active_type(context) - for id in get_id_storage_by_type_str(source_ids[0].id_type)[0]: + storage_info = get_id_storage_by_type_str(source_ids[0].id_type) + if not storage_info: + return + for id in storage_info[0]: if id in source_ids: continue if (self.library_path == 'Local Data' and not id.library) or ( @@ -314,19 +339,20 @@ class OUTLINER_OT_remap_users_ui(bpy.types.Operator): update=update_library_path, ) library_path_source: StringProperty() - id_name_target: StringProperty( - name="Target ID Name", description="Name of the ID we're remapping users to" - ) + id_name_target: StringProperty(name="Target ID Name", description="Name of the ID we're remapping users to") @classmethod - def poll(cls, context): + def poll(cls, context: Context) -> bool: source_ids = get_selected_ids_of_active_type(context) if not source_ids: cls.poll_message_set("No selected IDs.") return False + if any(src_id.override_library for src_id in source_ids if src_id): + cls.poll_message_set("Cannot remap users of library overrides.") + return False return True - def invoke(self, context, _event): + def invoke(self, context: Context, _event: Event) -> set[str]: # Populate the remap_targets string list with possible options based on # selection context. @@ -334,19 +360,21 @@ class OUTLINER_OT_remap_users_ui(bpy.types.Operator): remap_target_libraries = context.scene.remap_target_libraries remap_target_libraries.clear() local = remap_target_libraries.add() - local.name = "Local Data" + local.name = 'Local Data' source_ids = get_selected_ids_of_active_type(context) for lib in bpy.data.libraries: for id in lib.users_id: - if type(id) == type(source_ids[0]): + if isinstance(id, type(source_ids[0])): lib_entry = remap_target_libraries.add() lib_entry.name = lib.filepath break - container = get_id_storage_by_type_str(source_ids[0].id_type)[0] + storage_info = get_id_storage_by_type_str(source_ids[0].id_type) + assert storage_info + container = storage_info[0] - self.library_path = "Local Data" - suffixed_id = next((id for id in source_ids if id.name[-4] == "."), None) + self.library_path = 'Local Data' + suffixed_id = next((id for id in source_ids if id.name[-4] == '.'), None) if suffixed_id: default_target = container.get(suffixed_id.name[:-4]) @@ -355,12 +383,12 @@ class OUTLINER_OT_remap_users_ui(bpy.types.Operator): if default_target.library: self.library_path = default_target.library.filepath else: - self.id_name_target = "" + self.id_name_target = '' self.library_path = 'Local Data' return context.window_manager.invoke_props_dialog(self, width=600) - def draw(self, context): + def draw(self, context: Context) -> None: layout = self.layout layout.use_property_split = True layout.use_property_decorate = False @@ -371,7 +399,7 @@ class OUTLINER_OT_remap_users_ui(bpy.types.Operator): for i, source_id in enumerate(source_ids): row = layout.row() split = row.split() - if i==0: + if i == 0: split.row().label(text="Anything that was referencing these:") else: split.row() @@ -399,7 +427,7 @@ class OUTLINER_OT_remap_users_ui(bpy.types.Operator): icon=id_icon, ) - def execute(self, context): + def execute(self, context: Context) -> set[str]: source_ids = get_selected_ids_of_active_type(context) target_id = get_id(self.id_name_target, source_ids[0].id_type, self.library_path) assert source_ids and target_id, "Error: Failed to find source or target." @@ -409,33 +437,154 @@ class OUTLINER_OT_remap_users_ui(bpy.types.Operator): return {'FINISHED'} +class OBJECT_OT_pie_delete(Operator): + """Delete selected objects or collections from the file.\n\nShift: Show dependent datablocks before confirming deletion""" + + bl_idname = 'object.pie_delete' + bl_label = "Delete From File" + bl_options = {'REGISTER', 'UNDO'} + + @staticmethod + def _get_items_to_delete(context: Context) -> list[ID]: + if context.area and context.area.type == 'OUTLINER': + return list(context.selected_ids or []) + return list(context.selected_objects or []) + + @classmethod + def poll(cls, context: Context) -> bool: + if not cls._get_items_to_delete(context): + cls.poll_message_set("Nothing selected.") + return False + return True + + def invoke(self, context: Context, event: Event) -> set[str]: + if not event or not event.shift: + return self.execute(context) + + self._users_per_obj: list[tuple[ID, list[ID]]] = [] + for item in self._get_items_to_delete(context): + users = get_datablock_users(item) + if context.scene in users: + users.remove(context.scene) + self._users_per_obj.append((item, users)) + + return context.window_manager.invoke_props_dialog(self, width=400) # type: ignore[union-attr] + + def draw(self, _context: Context) -> None: + layout = self.layout + if not layout: + return + layout.use_property_decorate = False + + for obj, users in self._users_per_obj: + if len(self._users_per_obj) > 1 and users: + header, body = layout.panel( + f'delete_dialog_{obj.name}', + default_closed=len(self._users_per_obj) > 3, + ) + header_row = header.row(align=True) + else: + body = layout + header_row = body.row(align=True) + if len(self._users_per_obj) > 1: + header_row.label(text='', icon='BLANK1') + header_row.prop(obj, 'name', icon=get_datablock_icon(obj), text='', emboss=False) + header_row.label(text=f'{len(users)} users') + + if body and users: + for user in users: + split = body.split(factor=0.15) + split.row() + row = split.row() + row.prop( + user, + 'name', + icon=get_datablock_icon(user), + text='', + emboss=False, + ) + + def execute(self, context: Context) -> set[str]: + count = len(self._get_items_to_delete(context)) + if context.area and context.area.type == 'OUTLINER': + items = self._get_items_to_delete(context) + if any(isinstance(id, (Object, Collection)) for id in items): + ret = bpy.ops.outliner.delete() + else: + ret = bpy.ops.outliner.id_operation(type='DELETE') + else: + ret = bpy.ops.object.delete(use_global=True, confirm=False) + if ret == {'FINISHED'}: + self.report({'INFO'}, f"Deleted {count} datablock(s).") + return ret + + +class OUTLINER_OT_delete_override_library_hierarchy(Operator): + """Delete the library override hierarchy that the active datablock belongs to""" + + bl_idname = 'outliner.delete_override_library_hierarchy' + bl_label = "Delete Override Hierarchy" + bl_options = {'REGISTER', 'UNDO'} + + remove_from_file: BoolProperty( + name="Remove from File", + default=True, + ) + + @classmethod + def description(cls, _context: Context, properties: OperatorProperties) -> str: + if properties.remove_from_file: + return cls.bl_description + return "Unlink the library override hierarchy that the active datablock belongs to from the active Scene" + + @classmethod + def poll(cls, context: Context) -> bool: + active_id = get_active_id(context) + if not active_id: + cls.poll_message_set("No active datablock.") + return False + if not active_id.override_library: + cls.poll_message_set("Active datablock is not a library override.") + return False + return True + + def execute(self, context: Context) -> set[str]: + active_id = get_active_id(context) + assert active_id and active_id.override_library + root = active_id.override_library.hierarchy_root + assert root + root_name = root.name + + count = remove_override_hierarchy(root, remove_from_file=self.remove_from_file, scene=context.scene) + + word = "Deleted" if self.remove_from_file else "Unlinked" + self.report( + {'INFO'}, + f"{word} {count} override datablock(s) from hierarchy of {root_name!r}.", + ) + return {'FINISHED'} + + class OBJECT_OT_instancer_empty_to_collection(Operator): """Replace the Empty that instances a collection, with the collection itself""" - bl_idname = "object.instancer_empty_to_collection" + bl_idname = 'object.instancer_empty_to_collection' bl_label = "Instancer Empty To Collection" bl_options = {'UNDO'} @classmethod - def poll(cls, context): + def poll(cls, context: Context) -> bool: obj = get_active_id(context) - if not ( - obj - and obj.type == 'EMPTY' - and obj.instance_type == 'COLLECTION' - and obj.instance_collection - ): + if not (obj and obj.type == 'EMPTY' and obj.instance_type == 'COLLECTION' and obj.instance_collection): cls.poll_message_set("Active object is not an instancer empty.") return False if obj.instance_collection in set(context.scene.collection.children): - cls.poll_message_set( - f'Collection "{obj.instance_collection.name}" is already in the scene.' - ) + cls.poll_message_set(f'Collection "{obj.instance_collection.name}" is already in the scene.') return False return True - def execute(self, context): + def execute(self, context: Context) -> set[str]: obj = get_active_id(context) coll = obj.instance_collection @@ -447,66 +596,97 @@ class OBJECT_OT_instancer_empty_to_collection(Operator): return {'FINISHED'} -def get_objects_to_unlink(context) -> list[Object]: +def get_objects_to_unlink(context: Context) -> list[Object]: if context.area.type == 'OUTLINER': - selected_objs = [id for id in context.selected_ids if type(id) == Object] + selected_objs = [id for id in context.selected_ids if isinstance(id, Object)] elif context.area.type == 'VIEW_3D': - selected_objs = context.selected_objects + selected_objs = list(context.selected_objects) + else: + return [] scene_objs = set(context.scene.objects) return [ob for ob in selected_objs if ob in scene_objs] -def unlink_objects_from_scene(objects, scene): +def unlink_objects_from_scene(objects: list[Object], scene: Scene) -> None: for obj in objects: for coll in [scene.collection] + scene.collection.children_recursive: - if obj.name in coll.objects: + if coll.override_library: + continue + if obj in set(coll.objects): coll.objects.unlink(obj) -def get_collections_to_unlink(context) -> list[Collection]: +def get_collections_to_unlink(context: Context) -> list[Collection]: if context.area.type == 'OUTLINER': - return [id for id in context.selected_ids if type(id) == Collection] + return [id for id in context.selected_ids if isinstance(id, Collection)] return [] -def unlink_collections_from_scene(collections_to_unlink, scene): +def unlink_collections_from_scene(collections_to_unlink: list[Collection], scene: Scene) -> None: for coll_to_unlink in collections_to_unlink: - for coll in scene.collection.children_recursive: - if coll_to_unlink.name in coll.children: + for coll in scene.collection.children_recursive + [scene.collection]: + if coll_to_unlink in set(coll.children): coll.children.unlink(coll_to_unlink) -def get_active_id(context) -> ID | None: +def remove_override_hierarchy(root: ID, *, remove_from_file: bool, scene: Scene | None = None) -> int: + """Find and remove all datablocks belonging to the override hierarchy rooted at `root`. + + If `remove_from_file` is True, permanently deletes from bpy.data via batch_remove. + Otherwise unlinks objects and collections from `scene` (required in this case). + Returns the number of datablocks found in the hierarchy. + """ + root_ptr = root.as_pointer() + + hierarchy_ids = [ + datablock + for *_, container_str in get_id_info() + for datablock in getattr(bpy.data, container_str) + if (ol := datablock.override_library) and (hr := ol.hierarchy_root) and hr.as_pointer() == root_ptr + ] + + if remove_from_file: + bpy.data.batch_remove(ids=hierarchy_ids) + else: + assert scene is not None + unlink_objects_from_scene([db for db in hierarchy_ids if isinstance(db, Object)], scene) + unlink_collections_from_scene([db for db in hierarchy_ids if isinstance(db, Collection)], scene) + + return len(hierarchy_ids) + + +def get_active_id(context: Context) -> ID | None: if context.area.ui_type == 'OUTLINER': return context.id else: return context.active_object -# List of datablock type information tuples: -# (type_class, type_enum_string, bpy.data.) def get_id_info() -> list[tuple[type, str, str]]: - bpy_prop_collection = type(bpy.data.objects) + """Return a list of datablock type information tuples: + (type_class, type_enum_string, bpy.data.) + """ id_info = [] for prop_name in dir(bpy.data): prop = getattr(bpy.data, prop_name) - if type(prop) == bpy_prop_collection: + if isinstance(prop, bpy_prop_collection): if len(prop) == 0: # We can't get full info about the ID type if there isn't at least one entry of it. # But we shouldn't need it, since we don't have any entries of it! continue typ = type(prop[0]) - if issubclass(typ, bpy.types.NodeTree): - typ = bpy.types.NodeTree + if issubclass(typ, NodeTree): + typ = NodeTree id_info.append((typ, prop[0].id_type, prop_name)) return id_info -def get_id_storage_by_type_str(typ_name: str): - for typ, typ_str, container_str in get_id_info(): +def get_id_storage_by_type_str(typ_name: str) -> tuple[bpy_prop_collection, str] | None: + for _typ, typ_str, container_str in get_id_info(): if typ_str == typ_name: return getattr(bpy.data, container_str), container_str + return None def get_datablock_types_enum_items() -> list[tuple[str, str, str, str, int]]: @@ -518,40 +698,26 @@ def get_datablock_types_enum_items() -> list[tuple[str, str, str, str, int]]: ret.append(('SCREEN', 'Screen', 'Screen', 'RESTRICT_VIEW_OFF', len(ret))) ret.append(('METABALL', 'Metaball', 'Metaball', 'OUTLINER_OB_META', len(ret))) ret.append(('CACHE_FILE', 'Cache File', 'Cache File', 'MOD_MESHDEFORM', len(ret))) - ret.append( - ( - 'POINT_CLOUD', - 'Point Cloud', - 'Point Cloud', - 'OUTLINER_OB_POINTCLOUD', - len(ret), - ) - ) - ret.append( - ('HAIR_CURVES', 'Hair Curves', 'Hair Curves', 'OUTLINER_OB_CURVES', len(ret)) - ) + ret.append(('POINT_CLOUD', 'Point Cloud', 'Point Cloud', 'OUTLINER_OB_POINTCLOUD', len(ret))) + ret.append(('HAIR_CURVES', 'Hair Curves', 'Hair Curves', 'OUTLINER_OB_CURVES', len(ret))) ret.append(('PAINT_CURVE', 'Paint Curve', 'Paint Curve', 'FORCE_CURVE', len(ret))) ret.append(('MOVIE_CLIP', 'Movie Clip', 'Movie Clip', 'FILE_MOVIE', len(ret))) return ret # List of 5-tuples that can be used to define the items of an EnumProperty. -ID_TYPE_ENUM_ITEMS: list[tuple[str, str, str, str, int]] = ( - get_datablock_types_enum_items() -) +ID_TYPE_ENUM_ITEMS: list[tuple[str, str, str, str, int]] = get_datablock_types_enum_items() # Map datablock type enum strings to their name and icon strings. -ID_TYPE_INFO: dict[str, tuple[str, str]] = { - tup[0]: (tup[1], tup[3]) for tup in ID_TYPE_ENUM_ITEMS -} +ID_TYPE_INFO: dict[str, tuple[str, str]] = {tup[0]: (tup[1], tup[3]) for tup in ID_TYPE_ENUM_ITEMS} -def get_datablock_icon(id) -> str: +def get_datablock_icon(id: ID) -> str: id_type = get_fundamental_id_type(id)[1] return ID_TYPE_INFO[id_type][1] -def get_fundamental_id_type(datablock: ID) -> tuple[Any, str]: +def get_fundamental_id_type(datablock: ID) -> tuple[type[ID], str]: """Certain datablocks have very specific types. This function should return their fundamental type, ie. parent class.""" id_info = get_id_info() @@ -559,20 +725,19 @@ def get_fundamental_id_type(datablock: ID) -> tuple[Any, str]: if isinstance(datablock, typ): return typ, typ_str - raise Exception( - f"Failed to get fundamental ID type of ID: {datablock.name}, {type(datablock)}" - ) + raise Exception(f"Failed to get fundamental ID type of ID: {datablock.name}, {type(datablock)}") -def get_selected_ids_of_active_type(context): +def get_selected_ids_of_active_type(context: Context) -> list[ID]: active_id = get_active_id(context) - return [ - id for id in context.selected_ids - if type(id) == type(active_id) - ] + return [id for id in (context.selected_ids or []) if active_id and isinstance(id, type(active_id))] -def get_id(id_name: str, id_type: str, lib_path="") -> ID: - container = get_id_storage_by_type_str(id_type)[0] + +def get_id(id_name: str, id_type: str, lib_path: str = '') -> ID | None: + storage_info = get_id_storage_by_type_str(id_type) + if not storage_info: + return None + container = storage_info[0] if lib_path and lib_path != 'Local Data': return container.get((id_name, lib_path)) return container.get((id_name, None)) @@ -591,33 +756,35 @@ def get_library_icon(lib_path: str) -> str: registry = [ OUTLINER_MT_relationship_pie, + OBJECT_OT_pie_delete, OUTLINER_OT_pie_purge_orphans, OBJECT_OT_unlink_from_scene, OUTLINER_OT_list_users_of_datablock, OUTLINER_OT_list_dependencies_of_datablock, RemapTarget, OUTLINER_OT_remap_users_ui, + OUTLINER_OT_delete_override_library_hierarchy, OBJECT_OT_instancer_empty_to_collection, ] -def register(): - bpy.types.Scene.remap_targets = CollectionProperty(type=RemapTarget) - bpy.types.Scene.remap_target_libraries = CollectionProperty(type=RemapTarget) +def register() -> None: + Scene.remap_targets = CollectionProperty(type=RemapTarget) + Scene.remap_target_libraries = CollectionProperty(type=RemapTarget) - for keymap_name in ("Object Mode", "Outliner"): + for keymap_name in ('Object Mode', 'Outliner'): WM_OT_call_menu_pie_drag_only.register_drag_hotkey( keymap_name=keymap_name, pie_name=OUTLINER_MT_relationship_pie.bl_idname, - hotkey_kwargs={'type': "X", 'value': "PRESS"}, + hotkey_kwargs={'type': 'X', 'value': 'PRESS'}, on_drag=False, ) -def unregister(): +def unregister() -> None: try: - del bpy.types.Scene.remap_targets - del bpy.types.Scene.remap_target_libraries + del Scene.remap_targets + del Scene.remap_target_libraries except AttributeError: # Blender Log also implements these same things, which can result in errors. pass diff --git a/extensions/blender_org/viewport_pie_menus/pie_sculpt_brush_select.py b/extensions/blender_org/viewport_pie_menus/pie_sculpt_brush_select.py index 62a69f9..5bf3602 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_sculpt_brush_select.py +++ b/extensions/blender_org/viewport_pie_menus/pie_sculpt_brush_select.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2016-2024 Blender Foundation +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation # # SPDX-License-Identifier: GPL-3.0-or-later @@ -6,8 +6,8 @@ import os from pathlib import Path import bpy -from bpy.types import Menu from bl_ui.properties_paint_common import BrushAssetShelf +from bpy.types import Context, Menu, UILayout from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only @@ -16,8 +16,7 @@ class PIE_MT_sculpt_brush_select(Menu): bl_idname = "PIE_MT_sculpt_brush_select" bl_label = "Sculpt Brush Select" - def draw(self, context): - global brush_icons + def draw(self, context: Context): layout = self.layout pie = layout.menu_pie() pie.scale_y = 1.2 @@ -42,9 +41,7 @@ class PIE_MT_sculpt_brush_select(Menu): brush_row = col.row() brush_row.scale_y = 0.75 brush_row.scale_x = 0.15 - BrushAssetShelf.draw_popup_selector( - brush_row, context, brush, show_name=False - ) + BrushAssetShelf.draw_popup_selector(brush_row, context, brush, show_name=False) name_row = col.row().box() if brush: name_row.label(text=brush.name) @@ -75,7 +72,7 @@ class PIE_MT_sculpt_brush_select_contrast(Menu): bl_idname = "PIE_MT_sculpt_brush_select_contrast" bl_label = "Contrast Brushes" - def draw(self, context): + def draw(self, _context: Context): pie = self.layout.menu_pie() # 4 - LEFT @@ -99,7 +96,7 @@ class PIE_MT_sculpt_brush_select_transform(Menu): bl_idname = "PIE_MT_sculpt_brush_select_transform" bl_label = "Transform Brushes" - def draw(self, context): + def draw(self, _context: Context): pie = self.layout.menu_pie() # 4 - LEFT @@ -124,7 +121,7 @@ class PIE_MT_sculpt_brush_select_volume(Menu): bl_idname = "PIE_MT_sculpt_brush_select_volume" bl_label = "Volume Brushes" - def draw(self, context): + def draw(self, _context: Context): pie = self.layout.menu_pie() # 4 - LEFT draw_brush_operator(pie, 'Blob', 'blob') @@ -148,7 +145,7 @@ class PIE_MT_sculpt_brush_select_special(Menu): bl_idname = "PIE_MT_sculpt_brush_select_special" bl_label = "Special Brushes" - def draw(self, context): + def draw(self, _context: Context): pie = self.layout.menu_pie() # 4 - LEFT draw_brush_operator(pie, 'Grab Cloth', 'cloth') @@ -168,11 +165,11 @@ class PIE_MT_sculpt_brush_select_special(Menu): draw_brush_operator(pie, 'Smear Multires Displacement', 'displacement_smear') -def blender_uses_brush_assets(): +def blender_uses_brush_assets() -> bool: return 'asset_activate' in dir(bpy.ops.brush) -def draw_brush_operator(layout, brush_name: str, brush_icon: str = ""): +def draw_brush_operator(layout: UILayout, brush_name: str, brush_icon: str = ""): """Draw a brush select operator in the provided UI element with the pre-4.3 icons. brush_name must match the name of the Brush Asset. brush_icon must match the name of a file in this add-on's icons folder. @@ -205,7 +202,6 @@ brush_icons = {} def create_icons(): - global brush_icons icons_directory = Path(__file__).parent / "icons" for icon_path in icons_directory.iterdir(): @@ -215,7 +211,6 @@ def create_icons(): def release_icons(): - global brush_icons for value in brush_icons.values(): bpy.app.icons.release(value) diff --git a/extensions/blender_org/viewport_pie_menus/pie_select_similar.py b/extensions/blender_org/viewport_pie_menus/pie_select_similar.py new file mode 100644 index 0000000..c24a648 --- /dev/null +++ b/extensions/blender_org/viewport_pie_menus/pie_select_similar.py @@ -0,0 +1,402 @@ +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation +# +# SPDX-License-Identifier: GPL-3.0-or-later + +from bpy.types import Bone, Context, EditBone, Menu, Object, Operator, PoseBone + +from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only + +SEL_SIMILAR = "mesh.select_similar" + + +class PIE_MT_select_similar_object(Menu): + bl_idname = "PIE_MT_select_similar_object" + bl_label = "Select Similar" + + def draw(self, context: Context): + layout = self.layout + pie = layout.menu_pie() + # 4 - LEFT + pie.operator("object.select_grouped", text="Collection", icon='OUTLINER_COLLECTION').type = 'COLLECTION' + # 6 - RIGHT + pie.operator("object.select_grouped", text="Type", icon='OBJECT_DATA').type = 'TYPE' + # 2 - BOTTOM + pie.operator("object.select_grouped", text="Colour", icon='COLOR').type = 'COLOR' + # 8 - TOP + pie.operator("object.select_grouped", text="Pass", icon='RENDERLAYERS').type = 'PASS' + # 7 - TOP - LEFT + pie.operator("object.select_grouped", text="Keying Set", icon='KEYINGSET').type = 'KEYINGSET' + # 9 - TOP - RIGHT + if context.active_object and context.active_object.type == 'LIGHT': + pie.operator("object.select_grouped", text="Light Type", icon='LIGHT').type = 'LIGHT_TYPE' + else: + pie.separator() + # 1 - BOTTOM - LEFT + pie.operator("object.select_grouped", text="Hook", icon='HOOK').type = 'HOOK' + # 3 - BOTTOM - RIGHT + pie.separator() + + +class PIE_MT_select_similar_mesh(Menu): + bl_idname = "PIE_MT_select_similar_mesh" + bl_label = "Select Similar" + + def draw(self, context: Context): + layout = self.layout + pie = layout.menu_pie() + mode = context.tool_settings.mesh_select_mode + if mode[0]: + _draw_vert_slots(pie) + elif mode[1]: + _draw_edge_slots(pie) + elif mode[2]: + _draw_face_slots(pie) + + +class PIE_MT_select_similar_mesh_edge_more(Menu): + bl_idname = "PIE_MT_select_similar_mesh_edge_more" + bl_label = "Select Similar: More" + + def draw(self, context: Context): + layout = self.layout + pie = layout.menu_pie() + mode = context.tool_settings.mesh_select_mode + if mode[1]: + _draw_edge_more_slots(pie) + + +def _draw_vert_slots(pie): + # 4 - LEFT + pie.operator(SEL_SIMILAR, text="Connected Edge Count", icon='EDGESEL').type = 'VERT_EDGES' + # 6 - RIGHT + pie.separator() + # 2 - BOTTOM + pie.operator('mesh.select_similar_region', text="Face Regions", icon='FACE_MAPS') + # 8 - TOP + pie.operator(SEL_SIMILAR, text="Vertex Groups", icon='GROUP_VERTEX').type = 'VERT_GROUPS' + # 7 - TOP - LEFT + pie.operator(SEL_SIMILAR, text="Normal", icon='NORMALS_VERTEX').type = 'VERT_NORMAL' + # 9 - TOP - RIGHT + pie.operator(SEL_SIMILAR, text="Vertex Crease", icon='EDGE_CREASE').type = 'VERT_CREASE' + # 1 - BOTTOM - LEFT + pie.operator(SEL_SIMILAR, text="Connected Face Count", icon='FACESEL').type = 'VERT_FACES' + # 3 - BOTTOM - RIGHT + + +def _draw_edge_slots(pie): + # 4 - LEFT + pie.operator('wm.call_menu_pie', text="More...", icon='THREE_DOTS').name = ( + PIE_MT_select_similar_mesh_edge_more.bl_idname + ) + # 6 - RIGHT + pie.operator(SEL_SIMILAR, text="Seam", icon='EDGE_SEAM').type = 'EDGE_SEAM' + # 2 - BOTTOM + pie.operator(SEL_SIMILAR, text="Length", icon='DRIVER_DISTANCE').type = 'EDGE_LENGTH' + # 8 - TOP + pie.operator(SEL_SIMILAR, text="Sharp", icon='EDGE_SHARP').type = 'EDGE_SHARP' + # 7 - TOP - LEFT + pie.operator(SEL_SIMILAR, text="Direction", icon='ORIENTATION_NORMAL').type = 'EDGE_DIR' + # 9 - TOP - RIGHT + pie.operator(SEL_SIMILAR, text="Edge Crease", icon='EDGE_CREASE').type = 'EDGE_CREASE' + # 1 - BOTTOM - LEFT + pie.operator(SEL_SIMILAR, text="Connected Face Count", icon='FACESEL').type = 'EDGE_FACES' + # 3 - BOTTOM - RIGHT + pie.operator(SEL_SIMILAR, text="Bevel Weight", icon='EDGE_BEVEL').type = 'EDGE_BEVEL' + + +def _draw_edge_more_slots(pie): + # 4 - LEFT + # 6 - RIGHT + pie.operator(SEL_SIMILAR, text="Freestyle Edge Marks", icon='EDGESEL').type = 'EDGE_FREESTYLE' + # 2 - BOTTOM + pie.operator(SEL_SIMILAR, text="Face Angle", icon='NORMALS_FACE').type = 'EDGE_FACE_ANGLE' + # 8 - TOP + pie.operator('mesh.select_similar_region', text="Face Regions", icon='FACE_MAPS') + # 7 - TOP - LEFT + # 9 - TOP - RIGHT + # 1 - BOTTOM - LEFT + # 3 - BOTTOM - RIGHT + + +def _draw_face_slots(pie): + # 4 - LEFT + pie.operator(SEL_SIMILAR, text="Flat/Smooth", icon='SHADING_SOLID').type = 'FACE_SMOOTH' + # 6 - RIGHT + pie.operator(SEL_SIMILAR, text="Material", icon='MATERIAL').type = 'FACE_MATERIAL' + # 2 - BOTTOM + pie.operator('mesh.select_similar_region', text="Face Regions", icon='FACE_MAPS') + # 8 - TOP + pie.operator(SEL_SIMILAR, text="Coplanar", icon='GRID').type = 'FACE_COPLANAR' + # 7 - TOP - LEFT + pie.operator(SEL_SIMILAR, text="Area", icon='SNAP_FACE').type = 'FACE_AREA' + # 9 - TOP - RIGHT + pie.operator(SEL_SIMILAR, text="Sides", icon='MOD_EDGESPLIT').type = 'FACE_SIDES' + # 1 - BOTTOM - LEFT + pie.operator(SEL_SIMILAR, text="Perimeter", icon='MOD_CURVE_TO_TUBE').type = 'FACE_PERIMETER' + # 3 - BOTTOM - RIGHT + pie.operator(SEL_SIMILAR, text="Normal", icon='NORMALS_FACE').type = 'FACE_NORMAL' + + +class PIE_MT_select_similar_pose(Menu): + bl_idname = "PIE_MT_select_similar_pose" + bl_label = "Select Similar" + + def draw(self, _context: Context): + layout = self.layout + pie = layout.menu_pie() + # 4 - LEFT + pie.operator(POSE_OT_select_parent_bone.bl_idname, text="Parent", icon='FILE_PARENT') + # 6 - RIGHT + pie.operator("pose.select_grouped", text="Direct Children", icon='CON_CHILDOF').type = 'CHILDREN_IMMEDIATE' + # 2 - BOTTOM + pie.operator("pose.select_grouped", text="Colour", icon='COLOR').type = 'COLOR' + # 8 - TOP + pie.operator(POSE_OT_select_similar_custom_shape.bl_idname, text="Custom Shape", icon='OBJECT_DATA') + # 7 - TOP - LEFT + pie.operator("pose.select_grouped", text="Collection", icon='OUTLINER_COLLECTION').type = 'COLLECTION' + # 9 - TOP - RIGHT + pie.operator("pose.select_grouped", text="Siblings", icon='PARTICLES').type = 'SIBLINGS' + # 1 - BOTTOM - LEFT + pie.operator(POSE_OT_select_similar_deform.bl_idname, text="Deform", icon='MOD_ARMATURE') + # 3 - BOTTOM - RIGHT + pie.operator("pose.select_grouped", text="All Children", icon='CON_CHILDOF').type = 'CHILDREN' + + +class PIE_MT_select_similar_armature(Menu): + bl_idname = "PIE_MT_select_similar_armature" + bl_label = "Select Similar" + + def draw(self, _context: Context): + layout = self.layout + pie = layout.menu_pie() + # 4 - LEFT + pie.operator(POSE_OT_select_parent_bone.bl_idname, text="Parent", icon='FILE_PARENT') + # 6 - RIGHT + pie.operator("armature.select_similar", text="Direct Children", icon='CON_CHILDOF').type = 'CHILDREN_IMMEDIATE' + # 2 - BOTTOM + pie.operator("armature.select_similar", text="Colour", icon='COLOR').type = 'COLOR' + # 8 - TOP + pie.operator("armature.select_similar", text="Shape", icon='OBJECT_DATA').type = 'SHAPE' + # 7 - TOP - LEFT + pie.operator("armature.select_similar", text="Collection", icon='OUTLINER_COLLECTION').type = 'BONE_COLLECTION' + # 9 - TOP - RIGHT + pie.operator("armature.select_similar", text="Siblings", icon='PARTICLES').type = 'SIBLINGS' + # 1 - BOTTOM - LEFT + pie.separator() + # 3 - BOTTOM - RIGHT + pie.operator("armature.select_similar", text="All Children", icon='CON_CHILDOF').type = 'CHILDREN' + + +class POSE_OT_select_similar_deform(Operator): + bl_idname = "pose.select_similar_deform" + bl_label = "Select Similar Deform" + bl_description = "Select all visible bones that share the active bone's Deform setting" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context: Context) -> bool: + if not context.active_pose_bone: + cls.poll_message_set("No active pose bone") + return False + return True + + def execute(self, context: Context): + target = context.active_pose_bone.bone.use_deform + for pose_bone in context.visible_pose_bones: + pose_bone.select = (pose_bone.bone.use_deform == target) + return {'FINISHED'} + + +class POSE_OT_select_similar_custom_shape(Operator): + bl_idname = "pose.select_similar_custom_shape" + bl_label = "Select Similar Custom Shape" + bl_description = "Select all visible bones that share the active bone's custom shape object" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context: Context) -> bool: + if not context.active_pose_bone: + cls.poll_message_set("No active pose bone") + return False + return True + + def execute(self, context: Context): + target = context.active_pose_bone.custom_shape + for pose_bone in context.visible_pose_bones: + pose_bone.select = (pose_bone.custom_shape == target) + return {'FINISHED'} + + +class POSE_OT_select_parent_bone(Operator): + """Select parent of the current bone""" + + bl_idname = "pose.select_parent_bone" + bl_label = "Select Parent Bone" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + bones = (context.selected_pose_bones or context.selected_bones or [])[:] + if not bones: + cls.poll_message_set("No selected bones.") + return False + if not any((bone.parent for bone in bones)): + cls.poll_message_set("No selected bones with parents.") + return False + if context.mode not in ('POSE', 'PAINT_WEIGHT', 'EDIT_ARMATURE'): + cls.poll_message_set("Must be in Pose, Weight Paint, or Armature Edit mode.") + return False + if context.mode == 'PAINT_WEIGHT' and not context.pose_object: + cls.poll_message_set("No pose mode armature.") + return False + return True + + def execute(self, context): + bones = (context.selected_pose_bones or context.selected_bones or [])[:] + deselect_all_bones(context) + for bone in bones: + if bone.parent: + print("Parent: ", bone.parent) + reveal_and_select_bone(context, bone.parent, extend_selection=True) + else: + print("No parent!") + + return {'FINISHED'} + + +def reveal_and_select_bone(context, bone: Bone | EditBone | PoseBone, extend_selection=False, set_active=True): + rig = active_rig(context) + + reveal_bone(bone) + if not extend_selection: + deselect_all_bones(context) + + if context.mode == 'EDIT_ARMATURE': + if isinstance(bone, PoseBone): + ebone = bone.id_data.data.edit_bones[bone.name] + else: + ebone = bone.id_data.edit_bones[bone.name] + ebone.select = True + ebone.select_head = True + ebone.select_tail = True + else: + if isinstance(bone, PoseBone): + pbone = bone + bone = bone.bone + elif isinstance(bone, Bone): + pbone = rig.pose.bones.get(bone.name) + pbone.hide = False + pbone.select = True + if set_active: + set_active_bone(context, bone) + + +def active_rig(context) -> Object | None: + """Return the active rig even if we're in weight paint mode.""" + rig = context.pose_object or context.active_object + if not rig: + return + if rig.type == 'ARMATURE': + return rig + + +def deselect_all_bones(context): + if context.mode == 'EDIT_ARMATURE': + bones = context.selected_editable_bones + else: + bones = [pb for pb in context.selected_pose_bones] + for bone in bones: + bone.select = False + if context.mode == 'EDIT_ARMATURE': + bone.select_head = False + bone.select_tail = False + + +def reveal_bone(bone: Bone | EditBone | PoseBone): + ensure_visible_bone_collection(bone) + bone.hide = False + + +def ensure_visible_bone_collection(bone: Bone | EditBone | PoseBone): + """If target bone not in any enabled collections, enable first one.""" + if isinstance(bone, PoseBone): + bone = bone.bone + + armature = bone.id_data + collections = armature.collections + + if len(bone.collections) == 0: + return + + if not any([coll.is_visible_effectively for coll in bone.collections]): + coll = bone.collections[0] + while coll: + if collections.is_solo_active: + coll.is_solo = True + else: + coll.is_visible = True + coll = coll.parent + + +def set_active_bone(context, bone: Bone | EditBone | PoseBone): + """Set the active bone, regardless of if we're in edit mode or not. + Also account for active vertex group when in weight paint mode. + """ + + if not bone: + return + if isinstance(bone, PoseBone): + armature = bone.id_data.data + bone = bone.bone + else: + armature = bone.id_data + + if context.mode == 'EDIT_ARMATURE': + edit_bone = armature.edit_bones.get(bone.name) + armature.edit_bones.active = edit_bone + else: + armature.bones.active = bone + + if context.mode == 'PAINT_WEIGHT': + if bone.name in context.active_object.vertex_groups: + context.active_object.vertex_groups.active = context.active_object.vertex_groups[bone.name] + + + +registry = [ + PIE_MT_select_similar_object, + PIE_MT_select_similar_mesh, + PIE_MT_select_similar_mesh_edge_more, + PIE_MT_select_similar_pose, + PIE_MT_select_similar_armature, + POSE_OT_select_similar_deform, + POSE_OT_select_similar_custom_shape, + POSE_OT_select_parent_bone, +] + + +def register(): + WM_OT_call_menu_pie_drag_only.register_drag_hotkey( + keymap_name="Object Mode", + pie_name=PIE_MT_select_similar_object.bl_idname, + hotkey_kwargs={'type': "G", 'value': "PRESS", 'shift': True}, + on_drag=True, + ) + WM_OT_call_menu_pie_drag_only.register_drag_hotkey( + keymap_name="Mesh", + pie_name=PIE_MT_select_similar_mesh.bl_idname, + hotkey_kwargs={'type': "G", 'value': "PRESS", 'shift': True}, + on_drag=True, + ) + WM_OT_call_menu_pie_drag_only.register_drag_hotkey( + keymap_name="Pose", + pie_name=PIE_MT_select_similar_pose.bl_idname, + hotkey_kwargs={'type': "G", 'value': "PRESS", 'shift': True}, + on_drag=True, + ) + WM_OT_call_menu_pie_drag_only.register_drag_hotkey( + keymap_name="Armature", + pie_name=PIE_MT_select_similar_armature.bl_idname, + hotkey_kwargs={'type': "G", 'value': "PRESS", 'shift': True}, + on_drag=True, + ) diff --git a/extensions/blender_org/viewport_pie_menus/pie_selection.py b/extensions/blender_org/viewport_pie_menus/pie_selection.py index 518ec78..cc87ce4 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_selection.py +++ b/extensions/blender_org/viewport_pie_menus/pie_selection.py @@ -1,12 +1,12 @@ -# SPDX-FileCopyrightText: 2016-2024 Blender Foundation +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation # # SPDX-License-Identifier: GPL-3.0-or-later import re import bpy -from bpy.types import Menu, Operator, Constraint, UILayout, Object from bpy.props import BoolProperty, StringProperty +from bpy.types import Constraint, Context, Event, Menu, Object, Operator, OperatorProperties, UILayout from bpy.utils import flip_name from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only @@ -17,19 +17,19 @@ class PIE_MT_object_selection(Menu): bl_idname = "PIE_MT_object_selection" bl_label = "Object Select" - def draw(self, context): + def draw(self, context: Context): layout = self.layout pie = layout.menu_pie() # 4 - LEFT pie.operator("object.select_parent_object", text="Parent", icon='FILE_PARENT') # 6 - RIGHT - pie.operator("object.select_children_of_active", text=f"Direct Children", icon='CON_CHILDOF') + pie.operator("object.select_children_of_active", text="Direct Children", icon='CON_CHILDOF') # 2 - BOTTOM - pie.operator("object.select_all", text="Deselect All", icon='OUTLINER_DATA_POINTCLOUD').action='DESELECT' + pie.operator("object.select_all", text="Deselect All", icon='OUTLINER_DATA_POINTCLOUD').action = 'DESELECT' # 8 - TOP - pie.operator("object.select_all", text="Select All", icon='OUTLINER_OB_POINTCLOUD').action='SELECT' + pie.operator("object.select_all", text="Select All", icon='OUTLINER_OB_POINTCLOUD').action = 'SELECT' # 7 - TOP - LEFT - pie.operator("object.select_all", text="Invert Selection", icon='CLIPUV_DEHLT').action='INVERT' + pie.operator("object.select_all", text="Invert Selection", icon='CLIPUV_DEHLT').action = 'INVERT' # 9 - TOP - RIGHT pie.operator("object.select_siblings_of_active", text="Siblings", icon='PARTICLES') # 1 - BOTTOM - LEFT @@ -46,9 +46,9 @@ class PIE_MT_object_selection_more(Menu): bl_idname = "PIE_MT_object_selection_more" bl_label = "More Object Select" - def draw(self, context): + def draw(self, _context: Context): layout = self.layout - + # Modal selection operators. layout.separator() layout.operator("view3d.select_circle", text="Circle Select", icon='MESH_CIRCLE') @@ -75,36 +75,33 @@ class VIEW3D_MT_select_any_camera(Menu): bl_idname = "VIEW3D_MT_select_any_camera" bl_label = "Select Camera" - def draw(self, context): + def draw(self, context: Context): layout = self.layout active_cam = get_current_camera(context) - all_cams = [obj for obj in sorted(context.scene.objects, key=lambda o: o.name) if obj.type == 'CAMERA'] for cam in all_cams: icon = 'OUTLINER_DATA_CAMERA' if cam == active_cam: icon = 'OUTLINER_OB_CAMERA' - layout.operator('object.select_object_by_name', text=cam.name, icon=icon).obj_name=cam.name + layout.operator('object.select_object_by_name', text=cam.name, icon=icon).obj_name = cam.name -### Object relationship selection operators. +# Object relationship selection operators. -def get_selected_parents(context) -> list: +def get_selected_parents(context: Context) -> list[Object]: """Return objects which are selected or active, and have children. Active object is always first.""" objects = context.selected_objects or [context.active_object] parents = [o for o in objects if o.children] if context.active_object and context.active_object in parents: - idx = parents.index(context.active_object) - if idx > -1: - parents.pop(idx) + parents.remove(context.active_object) parents.insert(0, context.active_object) return parents -def deselect_all_objects(context): +def deselect_all_objects(context: Context): for obj in context.selected_objects: obj.select_set(False) @@ -115,25 +112,20 @@ class ObjectSelectOperatorMixin: description="Objects that are already selected will remain selected", ) - def invoke(self, context, event): - if event.shift: - self.extend_selection = True - else: - self.extend_selection = False - + def invoke(self, context: Context, event: Event): + self.extend_selection = event.shift return self.execute(context) @classmethod - def poll(cls, context): + def poll(cls, context: Context) -> bool: if context.mode != 'OBJECT': cls.poll_message_set("Must be in Object Mode.") return False return True - def execute(self, context): + def execute(self, context: Context): if not self.extend_selection: deselect_all_objects(context) - return {'FINISHED'} @@ -147,7 +139,7 @@ class OBJECT_OT_select_children_of_active(Operator, ObjectSelectOperatorMixin): recursive: BoolProperty(default=False, options={'SKIP_SAVE'}) @classmethod - def poll(cls, context): + def poll(cls, context: Context) -> bool: if not super().poll(context): return False obj = context.active_object @@ -157,11 +149,11 @@ class OBJECT_OT_select_children_of_active(Operator, ObjectSelectOperatorMixin): return True @classmethod - def description(cls, context, props): + def description(cls, _context: Context, props: OperatorProperties) -> str: recursively = " recursively" if props.recursive else "" return f"Select children of active object{recursively}." + "\n\nShift: Extend current selection" - def execute(self, context): + def execute(self, context: Context): super().execute(context) counter = 0 @@ -185,7 +177,7 @@ class OBJECT_OT_select_siblings_of_active(Operator, ObjectSelectOperatorMixin): bl_options = {'REGISTER', 'UNDO'} @classmethod - def poll(cls, context): + def poll(cls, context: Context) -> bool: if not super().poll(context): return False obj = context.active_object @@ -197,7 +189,7 @@ class OBJECT_OT_select_siblings_of_active(Operator, ObjectSelectOperatorMixin): return False return True - def execute(self, context): + def execute(self, context: Context): super().execute(context) counter = 0 @@ -218,7 +210,7 @@ class OBJECT_OT_select_parent_object(Operator, ObjectSelectOperatorMixin): bl_options = {'REGISTER', 'UNDO'} @classmethod - def poll(cls, context): + def poll(cls, context: Context) -> bool: if not super().poll(context): return False obj = context.active_object @@ -227,14 +219,11 @@ class OBJECT_OT_select_parent_object(Operator, ObjectSelectOperatorMixin): return False return True - def execute(self, context): + def execute(self, context: Context): super().execute(context) - active_obj = context.active_object - active_obj.parent.select_set(True) context.view_layer.objects.active = active_obj.parent - return {'FINISHED'} @@ -246,7 +235,7 @@ class OBJECT_OT_select_active_camera(Operator, ObjectSelectOperatorMixin): bl_options = {'REGISTER', 'UNDO'} @classmethod - def poll(cls, context): + def poll(cls, context: Context) -> bool: cam = get_current_camera(context) if not cam: cls.poll_message_set("No active camera.") @@ -256,17 +245,17 @@ class OBJECT_OT_select_active_camera(Operator, ObjectSelectOperatorMixin): return False return True - def execute(self, context): + def execute(self, context: Context): super().execute(context) cam = get_current_camera(context) - if context.active_object and context.mode != 'MODE': + if context.active_object and context.mode != 'MODE': # TODO: 'MODE' looks like a typo, should be 'OBJECT'? bpy.ops.object.mode_set(mode='OBJECT') cam.select_set(True) context.view_layer.objects.active = cam return {'FINISHED'} -### Object name-based selection operators. +# Object name-based selection operators. class PIE_MT_select_object_name_relation(Menu): @@ -274,35 +263,30 @@ class PIE_MT_select_object_name_relation(Menu): bl_label = "Select by Name" @classmethod - def poll(cls, context): - return context.active_object + def poll(cls, context: Context) -> bool: + return bool(context.active_object) - def draw(self, context): + def draw(self, context: Context): layout = self.layout active_obj = context.active_object - pie = layout.menu_pie() # 4 - LEFT - pie.operator( - OBJECT_OT_select_symmetry_object.bl_idname, - text="Flip Selection", - icon='MOD_MIRROR', - ) + pie.operator(OBJECT_OT_select_symmetry_object.bl_idname, text="Flip Selection", icon='MOD_MIRROR') # 6 - RIGHT pie.operator('object.select_by_name_search', icon='VIEWZOOM') # 2 - BOTTOM lower_obj = context.scene.objects.get(increment_name(active_obj.name, increment=-1)) if lower_obj: - op = pie.operator('object.select_object_by_name', text=lower_obj.name, icon='TRIA_DOWN') - op.obj_name = lower_obj.name + pie.operator('object.select_object_by_name', text=lower_obj.name, icon='TRIA_DOWN').obj_name = lower_obj.name else: pie.separator() # 8 - TOP - higher_obj = context.scene.objects.get(increment_name(active_obj.name, increment=1)) or context.scene.objects.get(active_obj.name + ".001") + higher_obj = context.scene.objects.get( + increment_name(active_obj.name, increment=1) + ) or context.scene.objects.get(active_obj.name + ".001") if higher_obj: - op = pie.operator('object.select_object_by_name', text=higher_obj.name, icon='TRIA_UP') - op.obj_name = higher_obj.name + pie.operator('object.select_object_by_name', text=higher_obj.name, icon='TRIA_UP').obj_name = higher_obj.name else: pie.separator() # 7 - TOP - LEFT @@ -322,7 +306,7 @@ class PIE_MT_select_object_name_relation(Menu): else: pie.separator() # 1 - BOTTOM - LEFT - pie.operator("object.select_pattern", text=f"Select Pattern...", icon='FILTER') + pie.operator("object.select_pattern", text="Select Pattern...", icon='FILTER') # 3 - BOTTOM - RIGHT pie.separator() @@ -335,7 +319,7 @@ class OBJECT_OT_select_symmetry_object(Operator, ObjectSelectOperatorMixin): bl_options = {'REGISTER', 'UNDO'} @classmethod - def poll(cls, context): + def poll(cls, context: Context) -> bool: scene_obs = context.scene.objects sel_obs = context.selected_objects[:] active_obj = context.active_object @@ -349,7 +333,7 @@ class OBJECT_OT_select_symmetry_object(Operator, ObjectSelectOperatorMixin): return False return True - def execute(self, context): + def execute(self, context: Context): scene_obs = context.scene.objects sel_obs = context.selected_objects[:] active_obj = context.active_object @@ -357,16 +341,15 @@ class OBJECT_OT_select_symmetry_object(Operator, ObjectSelectOperatorMixin): flipped_objs = [scene_obs.get(flip_name(ob.name)) for ob in sel_obs] flipped_active = scene_obs.get(flip_name(active_obj.name)) - notflipped = sum([flipped_obj in (obj, None) for obj, flipped_obj in zip(sel_obs, flipped_objs)]) + notflipped = sum(flipped_obj in (obj, None) for obj, flipped_obj in zip(sel_obs, flipped_objs)) if notflipped > 0: self.report({'WARNING'}, f"{notflipped} objects had no opposite.") super().execute(context) for ob in flipped_objs: - if not ob: - continue - ob.select_set(True) + if ob: + ob.select_set(True) if flipped_active: context.view_layer.objects.active = flipped_active @@ -383,30 +366,25 @@ class OBJECT_OT_select_object_by_name_search(Operator, ObjectSelectOperatorMixin obj_name: StringProperty(name="Object") - def invoke(self, context, _event): + def invoke(self, context: Context, _event: Event): obj = context.active_object if obj: self.obj_name = obj.name return context.window_manager.invoke_props_dialog(self) - def draw(self, context): + def draw(self, context: Context): layout = self.layout layout.use_property_split = True layout.use_property_decorate = False - - layout.prop_search( - self, 'obj_name', context.scene, 'objects', icon='OBJECT_DATA' - ) + layout.prop_search(self, 'obj_name', context.scene, 'objects', icon='OBJECT_DATA') layout.prop(self, 'extend_selection') - def execute(self, context): + def execute(self, context: Context): obj = context.scene.objects.get(self.obj_name) if not self.extend_selection: deselect_all_objects(context) - obj.select_set(True) context.view_layer.objects.active = obj - return {'FINISHED'} @@ -417,11 +395,9 @@ class OBJECT_OT_select_object_by_name(Operator, ObjectSelectOperatorMixin): bl_label = "Select Object By Name" bl_options = {'REGISTER', 'UNDO', 'INTERNAL'} - obj_name: StringProperty( - name="Object Name", description="Name of the object to select" - ) + obj_name: StringProperty(name="Object Name", description="Name of the object to select") - def execute(self, context): + def execute(self, context: Context): obj = context.scene.objects.get(self.obj_name) if not obj: @@ -433,27 +409,19 @@ class OBJECT_OT_select_object_by_name(Operator, ObjectSelectOperatorMixin): return {'CANCELLED'} super().execute(context) - obj.select_set(True) context.view_layer.objects.active = obj - return {'FINISHED'} -def increment_name(name: str, increment=1, default_zfill=1) -> str: - # Increment LAST number in the name. - # Negative numbers will be clamped to 0. - # Digit length will be preserved, so 10 will decrement to 09. - # 99 will increment to 100, not 00. +def increment_name(name: str, increment: int = 1, default_zfill: int = 1) -> str: + """Increment the last number in name. - # If no number was found, one will be added at the end of the base name. - # The length of this in digits is set with the `default_zfill` param. - - # This is not meant to be able to add a whole .001 suffix at the end of a name, - # although we can account for the inverse of that easily enough. - - if name.endswith(".001") and increment==-1: - # Special case. + Negative numbers are clamped to 0. Digit length is preserved (10 decrements to 09), + except on overflow (99 increments to 100). If name contains no number, one is appended + with default_zfill digit width. Special case: decrementing a '.001' suffix strips it. + """ + if name.endswith(".001") and increment == -1: return name[:-4] numbers_in_name = re.findall(r'\d+', name) @@ -462,25 +430,27 @@ def increment_name(name: str, increment=1, default_zfill=1) -> str: last = numbers_in_name[-1] incremented = str(max(0, int(last) + increment)).zfill(len(last)) - split = name.rsplit(last, 1) - return incremented.join(split) + return incremented.join(name.rsplit(last, 1)) class OBJECT_MT_PIE_obj_constraint_targets(Menu): bl_label = "Constraint Targets" @staticmethod - def get_constraints_with_target(context): - return [con for con in context.active_object.constraints if hasattr(con, 'target') and con.target in set(context.scene.objects)] + def get_constraints_with_target(context: Context) -> list[Constraint]: + return [ + con + for con in context.active_object.constraints + if hasattr(con, 'target') and con.target in set(context.scene.objects) + ] @classmethod - def poll(cls, context): - return cls.get_constraints_with_target(context) + def poll(cls, context: Context) -> bool: + return bool(cls.get_constraints_with_target(context)) - def draw(self, context): + def draw(self, context: Context): layout = self.layout - - for constraint in self.get_constraint_targets(context): + for constraint in self.get_constraints_with_target(context): draw_select_constraint_target(layout, constraint) @@ -488,9 +458,11 @@ class OBJECT_MT_PIE_constrained_objects(Menu): bl_label = "Constrained Objects" @staticmethod - def get_dependent_constraints(context): + def get_dependent_constraints(context: Context) -> list[Constraint]: dependent_ids = bpy.data.user_map()[context.active_object] - dependent_objects = [id for id in dependent_ids if type(id)==Object and id in set(context.scene.objects)] + dependent_objects = [ + id for id in dependent_ids if isinstance(id, Object) and id in set(context.scene.objects) + ] ret = [] for dependent_object in dependent_objects: for con in dependent_object.constraints: @@ -500,32 +472,31 @@ class OBJECT_MT_PIE_constrained_objects(Menu): return ret @classmethod - def poll(cls, context): - return cls.get_dependent_constraints(context) + def poll(cls, context: Context) -> bool: + return bool(cls.get_dependent_constraints(context)) - def draw(self, context): + def draw(self, context: Context): layout = self.layout - for constraint in self.get_dependent_constraints(context): draw_select_constraint_owner(layout, constraint) -def draw_select_constraint_target(layout, constraint): +def draw_select_constraint_target(layout: UILayout, constraint: Constraint): icon = get_constraint_icon(constraint) layout.operator( 'object.select_object_by_name', text=f"Constraint Target: {constraint.target.name} ({constraint.name})", icon=icon, - ).obj_name=constraint.target.name + ).obj_name = constraint.target.name -def draw_select_constraint_owner(layout, constraint): +def draw_select_constraint_owner(layout: UILayout, constraint: Constraint): icon = get_constraint_icon(constraint) layout.operator( 'object.select_object_by_name', text=f"Constrained Object: {constraint.id_data.name} ({constraint.name})", icon=icon, - ).obj_name=constraint.id_data.name + ).obj_name = constraint.id_data.name def get_constraint_icon(constraint: Constraint) -> str: @@ -534,18 +505,19 @@ def get_constraint_icon(constraint: Constraint) -> str: return 'ACTION' icons = UILayout.bl_rna.functions["prop"].parameters["icon"].enum_items.keys() - # This magic number can change between blender versions. Last updated: 4.1.1 + # This magic number can change between Blender versions. Last updated: 4.1.1 constraint_icon_magic_offset = 42 return icons[UILayout.icon(constraint) - constraint_icon_magic_offset] -### Mesh selection UI. + +# Mesh selection UI. class PIE_MT_mesh_selection(Menu): bl_idname = "PIE_MT_mesh_selection" bl_label = "Mesh Select" - def draw(self, context): + def draw(self, _context: Context): layout = self.layout pie = layout.menu_pie() # 4 - LEFT @@ -553,15 +525,15 @@ class PIE_MT_mesh_selection(Menu): # 6 - RIGHT pie.operator("mesh.select_more", text="Select More", icon='ADD') # 2 - BOTTOM - pie.operator("mesh.select_all", text="Deselect All", icon='OUTLINER_DATA_POINTCLOUD').action='DESELECT' + pie.operator("mesh.select_all", text="Deselect All", icon='OUTLINER_DATA_POINTCLOUD').action = 'DESELECT' # 8 - TOP - pie.operator("mesh.select_all", text="Select All", icon='OUTLINER_OB_POINTCLOUD').action='SELECT' + pie.operator("mesh.select_all", text="Select All", icon='OUTLINER_OB_POINTCLOUD').action = 'SELECT' # 7 - TOP - LEFT - pie.operator("mesh.select_all", text="Invert Selection", icon='CLIPUV_DEHLT').action='INVERT' + pie.operator("mesh.select_all", text="Invert Selection", icon='CLIPUV_DEHLT').action = 'INVERT' # 9 - TOP - RIGHT pie.operator("mesh.select_linked", text="Select Linked", icon='FILE_3D') # 1 - BOTTOM - LEFT - pie.operator('wm.call_menu_pie', text='Select Loops...', icon='MOD_WAVE').name='PIE_MT_mesh_selection_loops' + pie.operator('wm.call_menu_pie', text='Select Loops...', icon='MOD_WAVE').name = 'PIE_MT_mesh_selection_loops' # 3 - BOTTOM - RIGHT pie.menu("PIE_MT_mesh_selection_more", text="More...", icon='THREE_DOTS') @@ -570,9 +542,8 @@ class PIE_MT_mesh_selection_more(Menu): bl_idname = "PIE_MT_mesh_selection_more" bl_label = "Mesh Selection Mode" - def draw(self, context): + def draw(self, context: Context): layout = self.layout - vert_mode, edge_mode, face_mode = context.tool_settings.mesh_select_mode # Selection modes. @@ -606,13 +577,20 @@ class PIE_MT_mesh_selection_loops(Menu): bl_idname = "PIE_MT_mesh_selection_loops" bl_label = "Select Loop" - def draw(self, context): + def draw(self, _context: Context): pie = self.layout.menu_pie() - # 4 - LEFT - pie.operator('mesh.loop_multi_select', text="Edge Loops", icon='MOD_WAVE').ring=False - # 6 - RIGHT - pie.operator('mesh.loop_multi_select', text="Edge Rings", icon='CURVES').ring=True + if bpy.app.version < (5, 1, 0): + # 4 - LEFT + pie.operator('mesh.loop_multi_select', text="Edge Loops", icon='MOD_WAVE').ring = False + # 6 - RIGHT + pie.operator('mesh.loop_multi_select', text="Edge Rings", icon='CURVES').ring = True + else: + # 4 - LEFT + pie.operator('mesh.select_edge_loop_multi', text="Edge Loops", icon='MOD_WAVE') + # 6 - RIGHT + pie.operator('mesh.select_edge_ring_multi', text="Edge Rings", icon='CURVES') + # 2 - BOTTOM pie.operator('mesh.loop_to_region', text="Loop Inner Region", icon='SHADING_SOLID') # 8 - TOP @@ -620,31 +598,26 @@ class PIE_MT_mesh_selection_loops(Menu): registry = [ - PIE_MT_object_selection, + PIE_MT_select_object_name_relation, PIE_MT_object_selection_more, + PIE_MT_object_selection, + PIE_MT_mesh_selection_loops, + PIE_MT_mesh_selection_more, + PIE_MT_mesh_selection, VIEW3D_MT_select_any_camera, - OBJECT_OT_select_children_of_active, OBJECT_OT_select_siblings_of_active, OBJECT_OT_select_parent_object, - OBJECT_OT_select_active_camera, - - PIE_MT_select_object_name_relation, OBJECT_OT_select_symmetry_object, OBJECT_OT_select_object_by_name_search, OBJECT_OT_select_object_by_name, - OBJECT_MT_PIE_obj_constraint_targets, OBJECT_MT_PIE_constrained_objects, - - PIE_MT_mesh_selection, - PIE_MT_mesh_selection_more, - PIE_MT_mesh_selection_loops, ] -def draw_edge_sharpness_in_traits_menu(self, context): +def draw_edge_sharpness_in_traits_menu(self, _context: Context): self.layout.operator("mesh.edges_select_sharp", text="Edge Sharpness") @@ -658,7 +631,7 @@ def register(): hotkey_kwargs={'type': "A", 'value': "PRESS"}, on_drag=True, default_fallback_op='object.select_all', - default_fallback_kwargs={"action": "TOGGLE"} + default_fallback_kwargs={"action": "TOGGLE"}, ) WM_OT_call_menu_pie_drag_only.register_drag_hotkey( keymap_name='Object Mode', @@ -672,7 +645,7 @@ def register(): hotkey_kwargs={'type': "A", 'value': "PRESS"}, on_drag=True, default_fallback_op='mesh.select_all', - default_fallback_kwargs={"action": "TOGGLE"} + default_fallback_kwargs={"action": "TOGGLE"}, ) diff --git a/extensions/blender_org/viewport_pie_menus/pie_set_origin.py b/extensions/blender_org/viewport_pie_menus/pie_set_origin.py index 65f6178..410bc09 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_set_origin.py +++ b/extensions/blender_org/viewport_pie_menus/pie_set_origin.py @@ -1,10 +1,10 @@ -# SPDX-FileCopyrightText: 2016-2024 Blender Foundation +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation # # SPDX-License-Identifier: GPL-3.0-or-later import bpy -from bpy.types import Menu, Operator from bpy.props import StringProperty +from bpy.types import Context, Menu, Object, Operator, OperatorProperties from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only @@ -13,7 +13,7 @@ class PIE_MT_set_origin(Menu): bl_idname = "PIE_MT_set_origin" bl_label = "Set Origin" - def draw(self, context): + def draw(self, _context: Context): pie = self.layout.menu_pie() # 4 - LEFT @@ -29,9 +29,7 @@ class PIE_MT_set_origin(Menu): icon='SNAP_PEEL_OBJECT', ).type = 'ORIGIN_GEOMETRY' # 2 - BOTTOM - pie.operator( - "object.origin_set_to_bottom", text="Origin -> Bottom", icon='TRIA_DOWN' - ) + pie.operator("object.origin_set_to_bottom", text="Origin -> Bottom", icon='TRIA_DOWN') # 8 - TOP pie.operator( "object.origin_set_to_selection", @@ -39,9 +37,7 @@ class PIE_MT_set_origin(Menu): icon='RESTRICT_SELECT_OFF', ) # 7 - TOP - LEFT - pie.operator( - "object.origin_set_any_mode", text="Origin -> Cursor", icon='PIVOT_CURSOR' - ).type = 'ORIGIN_CURSOR' + pie.operator("object.origin_set_any_mode", text="Origin -> Cursor", icon='PIVOT_CURSOR').type = 'ORIGIN_CURSOR' # 9 - TOP - RIGHT pie.operator( "object.origin_set_any_mode", text="Origin -> Mass", icon='SNAP_FACE_CENTER' @@ -53,7 +49,7 @@ class PIE_MT_set_origin(Menu): "object.origin_set_any_mode", text="Origin -> Volume", icon='SNAP_FACE_CENTER', - ).type = 'ORIGIN_CENTER_OF_MASS' + ).type = 'ORIGIN_CENTER_OF_VOLUME' class OBJECT_OT_set_origin_to_selection(Operator): @@ -62,7 +58,7 @@ class OBJECT_OT_set_origin_to_selection(Operator): bl_description = "Snap the origin to the selection" bl_options = {'REGISTER', 'UNDO'} - def execute(self, context): + def execute(self, context: Context): org_mode = 'OBJECT' if context.active_object: org_mode = context.active_object.mode @@ -85,15 +81,13 @@ class OBJECT_OT_set_origin_to_bottom(Operator): bl_options = {'REGISTER', 'UNDO'} @classmethod - def poll(cls, context): - if not any( - [ob.type in {'MESH', 'ARMATURE'} for ob in context.selected_objects] - ): + def poll(cls, context: Context) -> bool: + if not any(ob.type in {'MESH', 'ARMATURE'} for ob in context.selected_objects): cls.poll_message_set("No mesh or armature objects selected.") return False return True - def execute(self, context): + def execute(self, context: Context): org_active_obj = context.active_object for obj in context.selected_objects: @@ -108,14 +102,12 @@ class OBJECT_OT_set_origin_to_bottom(Operator): counter += int(self.origin_to_bottom(context, obj)) context.view_layer.objects.active = org_active_obj - self.report( - {'INFO'}, f"Moved the origins of {counter} objects to their lowest point." - ) + self.report({'INFO'}, f"Moved the origins of {counter} objects to their lowest point.") return {'FINISHED'} @staticmethod - def origin_to_bottom(context, obj) -> bool: + def origin_to_bottom(context: Context, obj: Object) -> bool: if obj.type not in {'MESH', 'ARMATURE'}: return False @@ -124,13 +116,11 @@ class OBJECT_OT_set_origin_to_bottom(Operator): try: if obj.type == 'MESH': bpy.ops.object.mode_set(mode='OBJECT') - min_z = min([v.co.z for v in obj.data.vertices]) + min_z = min(v.co.z for v in obj.data.vertices) elif obj.type == 'ARMATURE': context.view_layer.objects.active = obj bpy.ops.object.mode_set(mode='EDIT') - min_z = min( - [min([bone.head.z, bone.tail.z]) for bone in obj.data.edit_bones] - ) + min_z = min(min(bone.head.z, bone.tail.z) for bone in obj.data.edit_bones) else: return False except ValueError: @@ -168,10 +158,10 @@ class OBJECT_OT_set_origin_any_mode(Operator): } @classmethod - def description(cls, context, params): + def description(cls, _context: Context, params: OperatorProperties) -> str: return cls.messages[params.type].replace("Snapped", "Snap")[:-1] - def execute(self, context): + def execute(self, context: Context): org_mode = 'OBJECT' if context.active_object: org_mode = context.active_object.mode diff --git a/extensions/blender_org/viewport_pie_menus/pie_view_3d.py b/extensions/blender_org/viewport_pie_menus/pie_view_3d.py index 604ca17..a3e6ab2 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_view_3d.py +++ b/extensions/blender_org/viewport_pie_menus/pie_view_3d.py @@ -1,8 +1,8 @@ -# SPDX-FileCopyrightText: 2016-2024 Blender Foundation +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation # # SPDX-License-Identifier: GPL-3.0-or-later -from bpy.types import Menu +from bpy.types import Context, Menu from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only @@ -11,7 +11,7 @@ class PIE_MT_view_pie(Menu): bl_idname = "PIE_MT_view_pie" bl_label = "3D View" - def draw(self, context): + def draw(self, context: Context): pie = self.layout.menu_pie() # 4 - LEFT pie.operator('view3d.render_border', text="Set Render Border", icon='OBJECT_HIDDEN') @@ -24,15 +24,15 @@ class PIE_MT_view_pie(Menu): # 7 - TOP - LEFT pie.operator('view3d.clip_border', text="Toggle Clipping Border", icon='MOD_BEVEL') # 9 - TOP - RIGHT - pie.operator('view3d.view_all', text="Frame All", icon='VIEWZOOM').center=False + pie.operator('view3d.view_all', text="Frame All", icon='VIEWZOOM').center = False # 1 - BOTTOM - LEFT pie.operator('view3d.clear_render_border', text="Clear Render Border", icon='X') # 3 - BOTTOM - RIGHT space = context.area.spaces.active if space.local_view: - pie.operator("view3d.localview", text="Leave Local View", icon='SOLO_OFF').frame_selected=False + pie.operator("view3d.localview", text="Leave Local View", icon='SOLO_OFF').frame_selected = False else: - pie.operator("view3d.localview", text="Enter Local View", icon='SOLO_ON').frame_selected=False + pie.operator("view3d.localview", text="Enter Local View", icon='SOLO_ON').frame_selected = False registry = [ diff --git a/extensions/blender_org/viewport_pie_menus/pie_window.py b/extensions/blender_org/viewport_pie_menus/pie_window.py index 79ef54c..2487acf 100644 --- a/extensions/blender_org/viewport_pie_menus/pie_window.py +++ b/extensions/blender_org/viewport_pie_menus/pie_window.py @@ -5,7 +5,7 @@ from sys import platform import bpy -from bpy.types import Menu, Operator +from bpy.types import Context, Menu, Operator from .op_pie_wrappers import WM_OT_call_menu_pie_drag_only @@ -14,16 +14,14 @@ class PIE_MT_window(Menu): bl_idname = "PIE_MT_window" bl_label = "Window" - def draw(self, context): + def draw(self, context: Context): pie = self.layout.menu_pie() # 4 - LEFT pie.operator('screen.userpref_show', text="Preferences", icon='PREFERENCES') # 6 - RIGHT if not context.screen.show_fullscreen: - pie.operator( - "screen.screen_full_area", text="Maximize Area", icon='PIVOT_BOUNDBOX' - ) + pie.operator("screen.screen_full_area", text="Maximize Area", icon='PIVOT_BOUNDBOX') else: pie.operator("wm.exit_area_fullscreen", icon='SCREEN_BACK') # 2 - BOTTOM @@ -59,7 +57,7 @@ class WM_OT_exit_area_fullscreen(Operator): bl_label = "Exit Area Fullscreen" bl_options = {'REGISTER', 'UNDO'} - def execute(self, context): + def execute(self, context: Context): if context.screen.show_fullscreen: bpy.ops.screen.screen_full_area() if context.screen.show_fullscreen: diff --git a/extensions/blender_org/viewport_pie_menus/prefs.py b/extensions/blender_org/viewport_pie_menus/prefs.py index de674b1..18305b5 100644 --- a/extensions/blender_org/viewport_pie_menus/prefs.py +++ b/extensions/blender_org/viewport_pie_menus/prefs.py @@ -1,21 +1,24 @@ -# SPDX-FileCopyrightText: 2016-2024 Blender Foundation +# SPDX-FileCopyrightText: 2016-2026 Blender Foundation # # SPDX-License-Identifier: GPL-3.0-or-later -import platform, struct, urllib +import platform +import struct +import urllib.parse -import bpy import addon_utils -from bpy.types import AddonPreferences, KeyMap, KeyMapItem -from bpy.props import BoolProperty +import bpy from bl_ui.space_userpref import USERPREF_PT_interface_menus_pie +from bpy.props import BoolProperty +from bpy.types import AddonPreferences, Context, KeyMap, KeyMapItem, UILayout +from .bs_utils.hotkeys import draw_hotkey_list, get_sidebar from .bs_utils.prefs import get_addon_prefs -from .bs_utils.hotkeys import get_sidebar, draw_hotkey_list + class ExtraPies_AddonPrefs( AddonPreferences, - USERPREF_PT_interface_menus_pie, # We use this class's `draw_centered` function to draw built-in pie settings. + USERPREF_PT_interface_menus_pie, # We use this class's `draw_centered` function to draw built-in pie settings. ): bl_idname = __package__ @@ -30,10 +33,11 @@ class ExtraPies_AddonPrefs( description="Enable some debugging UI", ) - def draw(self, context): + def draw(self, context: Context): draw_prefs(self.layout, context, compact=False) -def draw_prefs(layout, context, compact=False): + +def draw_prefs(layout: UILayout, context: Context, compact: bool = False): prefs = get_addon_prefs(context) sidebar = get_sidebar(context) @@ -46,9 +50,7 @@ def draw_prefs(layout, context, compact=False): if not compact: col = layout.column() row = col.row() - row.operator('wm.url_open', text="Report Bug", icon='URL').url = ( - get_bug_report_url() - ) + row.operator('wm.url_open', text="Report Bug", icon='URL').url = get_bug_report_url() row.prop(prefs, 'debug', icon='BLANK1', text="", emboss=False) col.prop(prefs, 'show_in_sidebar') @@ -64,9 +66,12 @@ def draw_prefs(layout, context, compact=False): header.label(text="Hotkeys") if hotkeys_panel: hotkeys_panel.operator('window.restore_deleted_hotkeys', icon='KEY_RETURN') - draw_hotkey_list(context, hotkeys_panel, sort_mode='BY_OPERATOR', compact=compact, button_draw_func=button_draw_func) + draw_hotkey_list( + context, hotkeys_panel, sort_mode='BY_OPERATOR', compact=compact, button_draw_func=button_draw_func + ) -def button_draw_func(layout, km: KeyMap, kmi: KeyMapItem, compact=False): + +def button_draw_func(layout: UILayout, km: KeyMap, kmi: KeyMapItem, compact: bool = False): """This function is passed as a callback to draw_hotkey_list, which will in turn call it with these parameters to draw the key combo UI, where we want to insert a "Drag" button.""" split = layout.split(factor=0.65, align=True) @@ -75,17 +80,18 @@ def button_draw_func(layout, km: KeyMap, kmi: KeyMapItem, compact=False): if kmi.idname != 'wm.call_menu_pie_drag_only': return if not kmi.properties: - sub.label(text="Missing properties. This should never happen!") + layout.label(text="Missing properties. This should never happen!") return text = "" if compact else "Drag" sub = split.row(align=True) sub.enabled = kmi.active sub.context_pointer_set("keymapitem", kmi) - sub.use_property_split=False + sub.use_property_split = False sub.prop(kmi.properties, 'on_drag', icon='MOUSE_MOVE', text=text) -def get_bug_report_url(): + +def get_bug_report_url() -> str: op_sys = "%s %d Bits\n" % ( platform.platform(), struct.calcsize("P") * 8, @@ -114,4 +120,5 @@ def get_bug_report_url(): + urllib.parse.quote(op_sys) ) + registry = [ExtraPies_AddonPrefs] diff --git a/extensions/blender_org/viewport_pie_menus/sidebar.py b/extensions/blender_org/viewport_pie_menus/sidebar.py index dc1931b..7f13f50 100644 --- a/extensions/blender_org/viewport_pie_menus/sidebar.py +++ b/extensions/blender_org/viewport_pie_menus/sidebar.py @@ -2,11 +2,13 @@ # # SPDX-License-Identifier: GPL-3.0-or-later -import bpy +from bpy.types import Context, Panel + from .bs_utils.prefs import get_addon_prefs from .prefs import draw_prefs -class VIEW3D_PT_extra_pies(bpy.types.Panel): + +class VIEW3D_PT_extra_pies(Panel): bl_label = "Extra Pies" bl_idname = "VIEW3D_PT_extra_pies" bl_space_type = 'VIEW_3D' @@ -14,15 +16,16 @@ class VIEW3D_PT_extra_pies(bpy.types.Panel): bl_category = 'Extra Pies' @classmethod - def poll(cls, context): + def poll(cls, context: Context): prefs = get_addon_prefs(context) return prefs.show_in_sidebar - def draw(self, context): + def draw(self, context: Context): layout = self.layout draw_prefs(layout, context, compact=True) + registry = [ VIEW3D_PT_extra_pies, -] \ No newline at end of file +] diff --git a/extensions/lab_blender_org/.blender_ext/index.json b/extensions/lab_blender_org/.blender_ext/index.json new file mode 100644 index 0000000..51e4958 --- /dev/null +++ b/extensions/lab_blender_org/.blender_ext/index.json @@ -0,0 +1,29 @@ +{ + "version": "v1", + "blocklist": [], + "data": [ + { + "schema_version": "1.0.0", + "id": "mcp", + "name": "MCP", + "tagline": "MCP server add-on for LLM interaction", + "version": "1.0.0", + "type": "add-on", + "maintainer": "Blender Lab", + "license": [ + "SPDX:GPL-3.0-or-later" + ], + "blender_version_min": "5.1.0", + "website": "https://www.blender.org/lab/mcp-server", + "permissions": { + "network": "Runs a local TCP socket server for MCP client communication" + }, + "tags": [ + "Development" + ], + "archive_url": "https://projects.blender.org/lab/blender_mcp/releases/download/v1.0.0/mcp-1.0.0.zip", + "archive_size": 16765, + "archive_hash": "sha256:838c3449f01015c861290658ae67f122f0846f7882f60a5dfda0ef7e6a9b8403" + } + ] +} diff --git a/extensions/lab_blender_org/mcp/__init__.py b/extensions/lab_blender_org/mcp/__init__.py new file mode 100644 index 0000000..804871c --- /dev/null +++ b/extensions/lab_blender_org/mcp/__init__.py @@ -0,0 +1,353 @@ +# SPDX-FileCopyrightText: 2026 Blender Authors +# +# SPDX-License-Identifier: GPL-3.0-or-later + +""" +Blender add-on that provides an MCP socket bridge-server. +""" + +__all__ = ( + "register", + "unregister", +) + +import bpy # pylint: disable=import-error +from bpy.props import ( + BoolProperty, + FloatProperty, + IntProperty, + StringProperty, +) # pylint: disable=import-error + +from . import mcp_to_blender_server + +_PORT_MIN = 1024 +_PORT_MAX = 65535 + +# Default seconds to wait after registration before auto-starting the server. +# Avoids adding work to Blender's startup sequence. +_AUTOSTART_DELAY = 1.0 + +# Store the CLI handle, only for correct register/unregister. +_cli_commands: list[object] = [] + +# This error is shown in the UI & command line when online access isn't enabled. +# +# NOTE(@ideasman42): we could consider `localhost` to be acceptable, this is a grey area +# regarding what counts as "online" or not. +_state_offline_error_message = "Online access must be enabled in the system preferences" + + +class _State: + """ + Module-level runtime state that is not persisted across sessions. + """ + + # Communicate to the user if there is a problem. + # Displayed in the preferences UI when non-empty. + autostart_error: str = "" + + @classmethod + def startup_info_set(cls, error: str) -> None: + """ + Store a startup error message to display in the preferences UI. + """ + cls.autostart_error = error + + @classmethod + def startup_info_set_from_exception(cls, ex: Exception) -> None: + """ + Store a startup exception message to display in the preferences UI + and print the full traceback to stderr for debugging. + """ + # NOTE: this is correct but reads like an unhandled exception. + # import traceback + # traceback.print_exception(ex) + cls.autostart_error = str(ex) + + @classmethod + def startup_info_clear(cls) -> None: + """ + Clear any startup error so it no longer appears in the preferences UI. + """ + cls.autostart_error = "" + + @classmethod + def startup_online_ok_or_error(cls) -> bool: + """ + Return True when online access is permitted, otherwise store an error and return False. + """ + if bpy.app.online_access: + return True + cls.startup_info_set(_state_offline_error_message) + if bpy.app.background: + print("Error: {:s}".format(_state_offline_error_message)) + print(" Use --online-mode to enable online access from the command line") + return False + + +class _BlenderMCPPreferences(bpy.types.AddonPreferences): # type: ignore[misc] + bl_idname = __package__ + + host: StringProperty( # type: ignore[valid-type] + name="Host", + default=mcp_to_blender_server.DEFAULT_HOST, + ) + port: IntProperty( # type: ignore[valid-type] + name="Port", + default=mcp_to_blender_server.DEFAULT_PORT, + min=_PORT_MIN, + max=_PORT_MAX, + ) + use_autostart: BoolProperty( # type: ignore[valid-type] + name="Auto Start", + description=( + "Automatically start the MCP bridge server when Blender starts.\n" + "Without this, you must manually start from the preferences UI.\n" + "(ignored in background mode)" + ), + default=True, + ) + autostart_delay: FloatProperty( # type: ignore[valid-type] + name="Auto Start Delay", + description=( + "Seconds to wait after Blender starts before auto-starting the server.\n" + "Avoids adding overhead to Blender's startup sequence" + ), + default=_AUTOSTART_DELAY, + min=0.0, + max=30.0, + step=10, + precision=1, + subtype="TIME_ABSOLUTE", + ) + + def _update_use_log(self, _context: bpy.types.Context) -> None: + mcp_to_blender_server.use_log = self.use_log + + use_log: BoolProperty( # type: ignore[valid-type] + name="Log", + description="Print every tool request and response status to the terminal", + default=False, + update=_update_use_log, + ) + + def _update_timer_interval_active(self, _context: bpy.types.Context) -> None: + # Cached on the server module because the timer callback may fire + # many times a second, avoid slower preferences lookups. + mcp_to_blender_server.timer_internal_vars_calc(active=self.timer_interval_active) + + timer_interval_active: FloatProperty( # type: ignore[valid-type] + name="Timer Interval", + description="Seconds between queue polling ticks in interactive mode", + default=0.25, + min=0.05, + max=5.0, + step=1, + precision=2, + subtype='TIME_ABSOLUTE', + update=_update_timer_interval_active, + ) + + def _update_timer_interval_idle(self, _context: bpy.types.Context) -> None: + # Cached on the server module because the timer callback may fire + # many times a second, avoid slower preferences lookups. + mcp_to_blender_server.timer_internal_vars_calc(idle=self.timer_interval_idle) + + timer_interval_idle: FloatProperty( # type: ignore[valid-type] + name="Timer Interval Idle", + description="Seconds between queue polling ticks while idle (no pending work)", + default=1.0, + min=0.1, + max=10.0, + step=10, + precision=2, + subtype='TIME_ABSOLUTE', + update=_update_timer_interval_idle, + ) + + def _update_timer_interval_idle_delay(self, _context: bpy.types.Context) -> None: + # Cached on the server module because the timer callback may fire + # many times a second, avoid slower preferences lookups. + mcp_to_blender_server.timer_internal_vars_calc(idle_delay=self.timer_interval_idle_delay) + + timer_interval_idle_delay: FloatProperty( # type: ignore[valid-type] + name="Idle Delay", + description="Seconds of inactivity before switching to the idle polling interval", + default=5.0, + min=1.0, + max=60.0, + step=100, + precision=1, + subtype='TIME_ABSOLUTE', + update=_update_timer_interval_idle_delay, + ) + + def draw(self, context: bpy.types.Context) -> None: + del context + layout = self.layout + layout.prop(self, "host") + layout.prop(self, "port") + layout.prop(self, "use_autostart") + layout.prop(self, "autostart_delay") + layout.prop(self, "timer_interval_active") + layout.prop(self, "timer_interval_idle") + layout.prop(self, "timer_interval_idle_delay") + layout.prop(self, "use_log") + + if mcp_to_blender_server.is_running(): + layout.operator("blmcp.server_stop", icon="CANCEL") + layout.label(text="Server is running", icon="CHECKMARK") + else: + layout.operator("blmcp.server_start", icon="PLAY") + layout.label(text="Server is stopped", icon="X") + + if _State.autostart_error: + layout.label(text=_State.autostart_error, icon="ERROR") + + +class _BLMCP_OT_server_start(bpy.types.Operator): # type: ignore[misc] + bl_idname = "blmcp.server_start" + bl_label = "Start MCP Bridge Server" + bl_description = "Start the MCP socket bridge server that the MCP server can connect to" + + def execute(self, context: bpy.types.Context) -> set[str]: + from . import execute_interactive + + # Timers do not fire in background mode. Use the CLI command instead: + # `blender --background file.blend --command blender_mcp`. + if bpy.app.background: + self.report({"ERROR"}, "Use `--command blender_mcp` to start the MCP bridge server in background mode") + return {"CANCELLED"} + if not _State.startup_online_ok_or_error(): + self.report({"ERROR"}, _state_offline_error_message) + return {"CANCELLED"} + # Clear any stale auto-start error so it does not persist in the UI. + _State.startup_info_clear() + prefs = context.preferences.addons[__package__].preferences + mcp_to_blender_server.timer_internal_vars_calc( + active=prefs.timer_interval_active, + idle=prefs.timer_interval_idle, + idle_delay=prefs.timer_interval_idle_delay, + ) + mcp_to_blender_server.use_log = prefs.use_log + try: + mcp_to_blender_server.start(prefs.host, prefs.port) + except Exception as ex: # pylint: disable=broad-exception-caught + _State.startup_info_set_from_exception(ex) + self.report({"ERROR"}, str(ex)) + return {"CANCELLED"} + bpy.app.timers.register( + execute_interactive.run, + first_interval=mcp_to_blender_server.TIMER_INTERVAL_ACTIVE, + persistent=True) + self.report({"INFO"}, "MCP server started on {:s}:{:d}".format(prefs.host, prefs.port)) + return {"FINISHED"} + + +class _BLMCP_OT_server_stop(bpy.types.Operator): # type: ignore[misc] + bl_idname = "blmcp.server_stop" + bl_label = "Stop MCP Server" + bl_description = "Stop the MCP Bridge Server" + + def execute(self, context: bpy.types.Context) -> set[str]: + del context + from . import execute_interactive + + # Clear any stale auto-start error so it does not persist in the UI. + _State.startup_info_clear() + mcp_to_blender_server.stop() + if bpy.app.timers.is_registered(execute_interactive.run): + bpy.app.timers.unregister(execute_interactive.run) + self.report({"INFO"}, "MCP bridge server stopped") + return {"FINISHED"} + + +def _autostart_timer() -> None: + """ + Deferred timer callback that starts the server when ``use_autostart`` + is enabled. Runs after a delay to avoid slowing down Blender's startup. + """ + from . import execute_interactive + + if not _State.startup_online_ok_or_error(): + return + prefs = bpy.context.preferences.addons[__package__].preferences + mcp_to_blender_server.timer_internal_vars_calc( + active=prefs.timer_interval_active, + idle=prefs.timer_interval_idle, + idle_delay=prefs.timer_interval_idle_delay, + ) + mcp_to_blender_server.use_log = prefs.use_log + + # This isn't expected: + # - Maybe the operator is explicitly called as part of an automated action. + # - The user might have set a very long delay for initial startup and + # manually enabled before the timer fires. + # Whatever the case, running multiple servers would cause confusing errors, so don't do it. + if mcp_to_blender_server.is_running(): + return + + try: + mcp_to_blender_server.start(prefs.host, prefs.port) + except Exception as ex: # pylint: disable=broad-exception-caught + _State.startup_info_set_from_exception(ex) + return + + bpy.app.timers.register( + execute_interactive.run, + first_interval=mcp_to_blender_server.TIMER_INTERVAL_ACTIVE, + persistent=True) + + +def _cli_execute_handler(argv: list[str]) -> int: + """ + Callback for the CLI: ``blender -c blender_mcp``. + """ + if not _State.startup_online_ok_or_error(): + return 1 + from .cli import cli_execute + return cli_execute(argv) + + +_classes = ( + _BlenderMCPPreferences, + _BLMCP_OT_server_start, + _BLMCP_OT_server_stop, +) + + +def register() -> None: + for cls in _classes: + bpy.utils.register_class(cls) + _cli_commands.append(bpy.utils.register_cli_command("blender_mcp", _cli_execute_handler)) + + # Defer auto-start so the server does not slow down Blender's startup. + if not bpy.app.background: + if not _State.startup_online_ok_or_error(): + return + + prefs = bpy.context.preferences.addons[__package__].preferences + if prefs.use_autostart: + bpy.app.timers.register( + _autostart_timer, + first_interval=prefs.autostart_delay, + persistent=True, + ) + + +def unregister() -> None: + from . import execute_interactive + + for cmd in _cli_commands: + bpy.utils.unregister_cli_command(cmd) + _cli_commands.clear() + + if bpy.app.timers.is_registered(_autostart_timer): + bpy.app.timers.unregister(_autostart_timer) + + mcp_to_blender_server.stop() + if bpy.app.timers.is_registered(execute_interactive.run): + bpy.app.timers.unregister(execute_interactive.run) + for cls in reversed(_classes): + bpy.utils.unregister_class(cls) diff --git a/extensions/lab_blender_org/mcp/blender_manifest.toml b/extensions/lab_blender_org/mcp/blender_manifest.toml new file mode 100644 index 0000000..1d634fc --- /dev/null +++ b/extensions/lab_blender_org/mcp/blender_manifest.toml @@ -0,0 +1,19 @@ +schema_version = "1.0.0" + +id = "mcp" +version = "1.0.0" +name = "MCP" +tagline = "MCP server add-on for LLM interaction" +maintainer = "Blender Lab" +type = "add-on" +website = "https://www.blender.org/lab/mcp-server/" +blender_version_min = "5.1.0" + +license = [ + "SPDX:GPL-3.0-or-later", +] + +tags = ["Development"] + +[permissions] +network = "Runs a local TCP socket server for MCP client communication" diff --git a/extensions/lab_blender_org/mcp/capture_output.py b/extensions/lab_blender_org/mcp/capture_output.py new file mode 100644 index 0000000..28601f5 --- /dev/null +++ b/extensions/lab_blender_org/mcp/capture_output.py @@ -0,0 +1,82 @@ +# SPDX-FileCopyrightText: 2026 Blender Authors +# +# SPDX-License-Identifier: GPL-3.0-or-later + +""" +Context manager to capture STDOUT/STDERR while also forwarding to the real output. + +Useful so the LLM may use print(..) style debugging and receive the results as part of the response. +""" + +__all__ = ( + "CaptureOutput", +) + +import io +import sys +from typing import IO, Self + + +class _Tee(io.TextIOBase): + """Write to both a :class:`io.StringIO` buffer and the original stream.""" + __slots__ = ( + "_buffer", + "_original", + ) + + def __init__(self, original: IO[str]) -> None: + self._buffer = io.StringIO() + self._original = original + + def write(self, s: str) -> int: + self._original.write(s) + return self._buffer.write(s) + + def flush(self) -> None: + self._original.flush() + self._buffer.flush() + + def getvalue(self) -> str: + return self._buffer.getvalue() + + +class CaptureOutput: + """ + Context manager that captures STDOUT & STDERR. + + Output is forwarded to the original streams in real time + and also stored for retrieval via :meth:`stdout` and :meth:`stderr`. + """ + __slots__ = ( + "_tee_out", + "_tee_err", + "_original_out", + "_original_err", + ) + + def __enter__(self) -> Self: + self._original_out = sys.stdout + self._original_err = sys.stderr + self._tee_out = _Tee(self._original_out) + self._tee_err = _Tee(self._original_err) + sys.stdout = self._tee_out + sys.stderr = self._tee_err + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: object, + ) -> None: + del exc_type, exc_val, exc_tb + sys.stdout = self._original_out + sys.stderr = self._original_err + + @property + def stdout(self) -> str: + return self._tee_out.getvalue() + + @property + def stderr(self) -> str: + return self._tee_err.getvalue() diff --git a/extensions/lab_blender_org/mcp/cli.py b/extensions/lab_blender_org/mcp/cli.py new file mode 100644 index 0000000..ba64e7d --- /dev/null +++ b/extensions/lab_blender_org/mcp/cli.py @@ -0,0 +1,58 @@ +# SPDX-FileCopyrightText: 2026 Blender Authors +# +# SPDX-License-Identifier: GPL-3.0-or-later + +""" +CLI command handler for running the MCP server in background mode. + +Started via ``blender --background file.blend --command blender_mcp``. +""" + +__all__ = ( + "cli_execute", +) + +import argparse + +from . import execute_blocking +from . import mcp_to_blender_server + + +def cli_execute(argv: list[str]) -> int: + """ + Block and serve MCP requests until interrupted. + """ + parser = argparse.ArgumentParser( + prog="blender_mcp", + description=( + "Start the Blender MCP server. " + "Deferred responses are not supported in background mode; " + "each request must complete before returning." + ), + ) + parser.add_argument( + "--host", + default=mcp_to_blender_server.DEFAULT_HOST, + help="Host to bind to.", + ) + parser.add_argument( + "--port", + type=int, + default=mcp_to_blender_server.DEFAULT_PORT, + help="Port to listen on.", + ) + args = parser.parse_args(argv) + + try: + mcp_to_blender_server.start(args.host, args.port) + except Exception as ex: # pylint: disable=broad-exception-caught + print("Error: {:s}".format(str(ex))) + return 1 + + print("MCP server started on {:s}:{:d}, press Ctrl+C to exit.".format(args.host, args.port)) + + try: + execute_blocking.run() + finally: + mcp_to_blender_server.stop() + return 0 diff --git a/extensions/lab_blender_org/mcp/deferred_tool.py b/extensions/lab_blender_org/mcp/deferred_tool.py new file mode 100644 index 0000000..aa4a76f --- /dev/null +++ b/extensions/lab_blender_org/mcp/deferred_tool.py @@ -0,0 +1,216 @@ +# SPDX-FileCopyrightText: 2026 Blender Authors +# +# SPDX-License-Identifier: GPL-3.0-or-later + +""" +Deferred response handling for Blender background jobs. + +When tool-code starts a background job (e.g. rendering with +``INVOKE_DEFAULT``), the response cannot be sent immediately. This +module holds the client connection open and polls a checker callable +until the operation completes, then sends the result. + +The checker (``check_fn``) is called on the server's standard timer +which starts at an active interval but backs off when idle. + +Checkers should be lightweight (e.g. check a flag or file existence) +so they don't block the UI, yet return promptly so the user is not left waiting after the job finishes. + +""" + +__all__ = ( + "add", + "close_all", + "has_pending", + "poll", +) + +import json +import socket +import time +import traceback +from collections.abc import Callable + +from .mcp_to_blender_server import _encode_response + +# Total wall-time in seconds allowed for a background task (e.g. rendering) to complete. +# When exceeded, an error response is sent and the connection is closed. +# The background task itself continues to run in Blender. +# One hour is long for what should typically be an interactive experience, +# but renders can take a long time and it's not desirable for them to simply give up. +_DEFERRED_TIMEOUT = (60.0 * 60.0) + + +class _DeferredClient: + """ + A client connection waiting for a background job to complete. + """ + + __slots__ = ( + "conn", + "check_fn", + "strict_json", + "stdout", + "stderr", + "deadline", + ) + + def __init__( + self, + conn: socket.socket, + check_fn: Callable[[], dict[str, object] | None], + strict_json: bool, + stdout: str, + stderr: str, + ) -> None: + self.conn: socket.socket = conn + self.check_fn: Callable[[], dict[str, object] | None] = check_fn + self.strict_json: bool = strict_json + self.stdout: str = stdout + self.stderr: str = stderr + self.deadline: float = time.monotonic() + _DEFERRED_TIMEOUT + + +# Connections waiting for a background job to finish, polled each timer tick. +_deferred_clients: list[_DeferredClient] = [] + + +def _send_and_close(dc: _DeferredClient, response: dict[str, object]) -> None: + try: + dc.conn.sendall(_encode_response(response)) + except OSError: + pass + try: + dc.conn.close() + except OSError: + pass + try: + _deferred_clients.remove(dc) + except ValueError: + pass + + +def _is_disconnected(conn: socket.socket) -> bool: + """ + Return ``True`` if the remote end has closed the connection. + """ + try: + data = conn.recv(1, socket.MSG_PEEK) + # Empty data means the peer closed the connection. + return len(data) == 0 + except BlockingIOError: + # No data available - connection is still alive. + return False + except OSError: + return True + + +def add( + conn: socket.socket, + check_fn: Callable[[], dict[str, object] | None], + strict_json: bool, + stdout: str, + stderr: str, +) -> None: + """ + Register a deferred client to be polled for completion. + """ + _deferred_clients.append(_DeferredClient(conn, check_fn, strict_json, stdout, stderr)) + + +def poll() -> bool: + """ + Check all deferred clients for completion. + + Return ``True`` if at least one client was resolved or removed. + """ + did_work = False + for dc in _deferred_clients[:]: + # Check for client disconnection. + if _is_disconnected(dc.conn): + try: + dc.conn.close() + except OSError: + pass + try: + _deferred_clients.remove(dc) + except ValueError: + pass + did_work = True + continue + + # Check for timeout. + if time.monotonic() > dc.deadline: + _send_and_close(dc, { + "status": "error", + "message": "Deferred operation timed out after {:.0f} seconds".format(_DEFERRED_TIMEOUT), + }) + did_work = True + continue + + # Call the checker. + try: + result = dc.check_fn() + except Exception: # pylint: disable=broad-exception-caught + _send_and_close(dc, { + "status": "error", + "message": traceback.format_exc(), + }) + did_work = True + continue + + if result is None: + # Still pending. + continue + + if not isinstance(result, dict): + _send_and_close(dc, { + "status": "error", + "message": "check_is_finished must return None or dict, not {:s}".format( + type(result).__name__, + ), + }) + did_work = True + continue + + # Validate JSON serializability when strict_json is set. + if dc.strict_json: + try: + json.dumps(result) + except (TypeError, ValueError) as ex: + _send_and_close(dc, { + "status": "error", + "message": "Deferred result is not JSON-serializable: {:s}".format(str(ex)), + }) + did_work = True + continue + + # Build the final response with the standard envelope. + response: dict[str, object] = {"status": "ok", "result": result} + if dc.stdout: + response["stdout"] = dc.stdout + if dc.stderr: + response["stderr"] = dc.stderr + _send_and_close(dc, response) + did_work = True + + return did_work + + +def has_pending() -> bool: + """ + Return ``True`` if there are deferred clients awaiting completion. + """ + return bool(_deferred_clients) + + +def close_all() -> None: + """ + Close all deferred client connections without sending responses. + """ + for dc in _deferred_clients: + try: + dc.conn.close() + except OSError: + pass + _deferred_clients.clear() diff --git a/extensions/lab_blender_org/mcp/execute_blocking.py b/extensions/lab_blender_org/mcp/execute_blocking.py new file mode 100644 index 0000000..bad2e46 --- /dev/null +++ b/extensions/lab_blender_org/mcp/execute_blocking.py @@ -0,0 +1,32 @@ +# SPDX-FileCopyrightText: 2026 Blender Authors +# +# SPDX-License-Identifier: GPL-3.0-or-later + +""" +Blocking execution loop for the MCP server. + +Uses ``select`` to wait for socket activity, intended for use in +``blender --background`` mode where ``bpy.app.timers`` do not fire. + +Background mode does not support deferred responses; requests must complete +before returning. +""" + +__all__ = ( + "run", +) + +from . import mcp_to_blender_server + + +def run() -> None: + """ + Block polling client connections until the server stops. + + Catches ``KeyboardInterrupt`` so that Ctrl+C exits cleanly. + """ + try: + while mcp_to_blender_server.is_running(): + mcp_to_blender_server.poll_blocking() + except KeyboardInterrupt: + pass diff --git a/extensions/lab_blender_org/mcp/execute_interactive.py b/extensions/lab_blender_org/mcp/execute_interactive.py new file mode 100644 index 0000000..d70189b --- /dev/null +++ b/extensions/lab_blender_org/mcp/execute_interactive.py @@ -0,0 +1,48 @@ +# SPDX-FileCopyrightText: 2026 Blender Authors +# +# SPDX-License-Identifier: GPL-3.0-or-later + +""" +Interactive timer-based execution for the MCP server. + +Polls client connections via ``bpy.app.timers`` so that requests are +handled in Blender's main loop during normal interactive sessions. +""" + +__all__ = ( + "run", +) + +from . import mcp_to_blender_server + + +def run() -> float | None: + """ + Timer callback: poll connections, return next interval. + + Returns ``None`` when the server is no longer running, which causes + ``bpy.app.timers`` to unregister this callback. + """ + # While errors *should* never happen: without exception handling here, + # any error would remove the timer - effectively breaking the add-on. + try: + did_work = mcp_to_blender_server.poll() + except Exception: # pylint: disable=broad-exception-caught + import traceback + import sys + print( + "Error: unhandled exception in the MCP server timer.\n" + "This may be a bug in Blender-MCP, as errors should not be raised at this point, continuing:\n" + "{:s}".format(traceback.format_exc()), + file=sys.stderr, + ) + # This is undefined, set to true so we reset the timer. + did_work = True + + if not mcp_to_blender_server.is_running(): + return None + + if did_work: + mcp_to_blender_server.timer_idle_reset() + + return mcp_to_blender_server.timer_idle_interval() diff --git a/extensions/lab_blender_org/mcp/mcp_to_blender_server.py b/extensions/lab_blender_org/mcp/mcp_to_blender_server.py new file mode 100644 index 0000000..7c44995 --- /dev/null +++ b/extensions/lab_blender_org/mcp/mcp_to_blender_server.py @@ -0,0 +1,615 @@ +# SPDX-FileCopyrightText: 2026 Blender Authors +# +# SPDX-License-Identifier: GPL-3.0-or-later + +""" +Non-blocking TCP socket server that runs inside Blender. + +Listens for null-byte-delimited JSON requests, executes Python code +directly in the calling thread, and returns JSON responses. +All socket operations are non-blocking so the server never blocks +Blender's main thread. +""" + +__all__ = ( + "DEFAULT_HOST", + "DEFAULT_PORT", + "TIMER_INTERVAL_ACTIVE", + "is_running", + "poll", + "poll_blocking", + "start", + "stop", + "timer_idle_interval", + "timer_idle_reset", + "timer_internal_vars_calc", + "use_log", +) + +import json +import math +import select +import socket +import sys +import traceback +from collections.abc import Callable +from typing import NamedTuple + +DEFAULT_HOST = "localhost" +DEFAULT_PORT = 9876 + +# Seconds between main-thread timer ticks. +TIMER_INTERVAL_ACTIVE = 0.05 +# Seconds between main-thread timer ticks while idle (no pending work). +_TIMER_INTERVAL_IDLE = 1.0 +# Seconds of inactivity before switching to the idle interval. +_TIMER_INTERVAL_IDLE_DELAY = 5.0 + + +class _TimerState: + """ + Mutable singleton holding timer-related runtime state. + + This is manipulated from the preferences and updated via ``timer_internal_vars_calc``. + """ + + __slots__ = ( + "interval_active", + "interval_idle", + "interval_idle_delay", + "idle_countdown_reset", + "idle_countdown", + "client_timeout_countdown", + ) + + def __init__(self) -> None: + self.interval_active: float = TIMER_INTERVAL_ACTIVE + self.interval_idle: float = _TIMER_INTERVAL_IDLE + self.interval_idle_delay: float = _TIMER_INTERVAL_IDLE_DELAY + # Number of active-rate ticks before switching to idle. + self.idle_countdown_reset: int = 0 + # Current countdown. When zero, `timer_idle_interval` returns idle. + self.idle_countdown: int = 0 + # Poll ticks before an idle client is evicted. + self.client_timeout_countdown: int = 2 + + +_timer = _TimerState() + + +def timer_internal_vars_calc( + active: float | None = None, + idle: float | None = None, + idle_delay: float | None = None, +) -> None: + """ + Optionally update ``TIMER_*`` constants and recalculate internal variables. + + When keyword arguments are provided they replace the corresponding + module-level ``TIMER_*`` value. Pass ``None`` (the default) to leave + a value unchanged. + """ + if active is not None: + _timer.interval_active = active + if idle is not None: + _timer.interval_idle = idle + if idle_delay is not None: + _timer.interval_idle_delay = idle_delay + # Round up so the delay is never shorter than requested. + _timer.idle_countdown_reset = math.ceil(_timer.interval_idle_delay / _timer.interval_active) + _timer.idle_countdown = _timer.idle_countdown_reset + _timer.client_timeout_countdown = max(2, math.ceil(_CLIENT_TIMEOUT / _timer.interval_active)) + + +def timer_idle_reset() -> None: + """ + Signal that work was processed, resetting the idle countdown. + """ + _timer.idle_countdown = _timer.idle_countdown_reset + + +def timer_idle_interval() -> float: + """ + Return the appropriate timer interval, decrementing the idle countdown. + + Returns ``TIMER_INTERVAL_ACTIVE`` while the countdown is positive, + then ``_TIMER_INTERVAL_IDLE`` once it reaches zero. + """ + if _timer.idle_countdown > 0: + _timer.idle_countdown -= 1 + return _timer.interval_active + return _timer.interval_idle + + +# When True, print every request and response status to STDERR. +use_log: bool = False + +_MAX_REQUEST_BYTES = 10 * 1024 * 1024 # 10 MiB. +# Maximum number of queued incoming connections. +_LISTEN_BACKLOG = 5 +_RECV_BUFFER_SIZE = 4096 +# Seconds before a client that has not sent a complete request is closed. +_CLIENT_TIMEOUT = 10.0 +# How often `poll_blocking` checks for shutdown. +_POLL_BLOCKING_TIMEOUT = 1.0 +_DEFERRED_UNSUPPORTED_MESSAGE = ( + "Deferred responses via `check_is_finished` are only supported " + "by the interactive addon server, and are not available in " + "background mode. Finish the request synchronously instead." +) + +timer_internal_vars_calc() + + +# --------------------------------------------------------------------------- +# Client connection state. + +class _Client: + """ + Per-connection state for a client (the MCP server process) that has not yet sent a complete request. + """ + + __slots__ = ( + "conn", + "buffer", + "timeout", + ) + + def __init__(self, conn: socket.socket) -> None: + self.conn: socket.socket = conn + # Accumulates data until the null-byte delimiter is received. + self.buffer: bytearray = bytearray() + # Poll ticks remaining before this client is evicted. + self.timeout: int = _timer.client_timeout_countdown + + +# --------------------------------------------------------------------------- +# Server state. + +class _State: + """ + Mutable singleton holding the runtime state of this socket server (the Blender add-on side). + """ + + __slots__ = ( + "sock", + "clients", + ) + + def __init__(self) -> None: + # The listening socket, or `None` when not running. + self.sock: socket.socket | None = None + # Connected clients that have not yet sent a complete request. + self.clients: list[_Client] = [] + + +_state = _State() + + +class _ExecResult(NamedTuple): + """ + Result of executing tool-code. + + When *check_fn* is not ``None``, the caller must defer the response + and poll the callable for completion (see ``deferred_tool``). + Otherwise *response* is the final result to send. + """ + + response: dict[str, object] + check_fn: Callable[[], dict[str, object] | None] | None = None + + +def _encode_response(response: dict[str, object]) -> bytes: + """ + Serialize a response dict as null-byte-delimited JSON bytes. + """ + return (json.dumps(response) + "\0").encode("utf-8") + + +def _execute_code( + code: str, + strict_json: bool, +) -> _ExecResult: + """ + Execute *code* and return an ``_ExecResult``. + + :param strict_json: When true, the response *must* be serializable. + Should always be true, when executing Python code we have full-control over, + because any non-serializable data is effectively a bug. + + Only allow it to be false when executing arbitrary LLM generated code, + in this case it's not worth the overhead of correcting the LLM mistake, + just ``__repr__`` the value so it can fumble its way forward. + """ + from .capture_output import CaptureOutput + from .weak_sandbox import WeakSandboxForLLM + + namespace: dict[str, object] = {"result": {}} + with CaptureOutput() as captured, WeakSandboxForLLM(): + try: + exec(code, namespace) + except Exception: # pylint: disable=broad-exception-caught + response: dict[str, object] = {"status": "error", "message": traceback.format_exc()} + if captured.stdout: + response["stdout"] = captured.stdout + if captured.stderr: + response["stderr"] = captured.stderr + return _ExecResult(response) + + # Check for a deferred response (background job in progress). + check_fn_raw = namespace.get("check_is_finished") + if check_fn_raw is not None and callable(check_fn_raw): + check_fn: Callable[[], dict[str, object] | None] = check_fn_raw + response = {} + if captured.stdout: + response["stdout"] = captured.stdout + if captured.stderr: + response["stderr"] = captured.stderr + return _ExecResult(response, check_fn) + + result = namespace["result"] + if not isinstance(result, dict): + response = { + "status": "error", + "message": ( + "The `result` variable must be a dict, not {:s}. " + "Wrap your return value: `result = {{\"key\": value}}`" + ).format(type(result).__name__), + } + else: + # Guard against LLM-generated code storing non-serializable values + # such as Blender objects, e.g. `result = {"obj": bpy.context.active_object}`. + # Without this, `json.dumps` fails inside `_encode_response`. + if strict_json: + try: + json.dumps(result) + except (TypeError, ValueError) as ex: + response = { + "status": "error", + "message": "The `result` value is not JSON-serializable: {:s}".format(str(ex)), + } + else: + response = {"status": "ok", "result": result} + else: + # Use `repr` as a fallback so non-serializable objects + # (e.g. Blender ID types) appear as their string representation. + result = json.loads(json.dumps(result, default=repr)) + response = {"status": "ok", "result": result} + if captured.stdout: + response["stdout"] = captured.stdout + if captured.stderr: + response["stderr"] = captured.stderr + return _ExecResult(response) + + +def _execute_code_from_request( + data: bytes, +) -> tuple[_ExecResult, bool]: + """ + Parse a raw request and execute it. + + Return ``(exec_result, strict_json)``. + """ + + # NOTE: This function is not expected to raise exceptions because we control the MCP server, tool-code and add-on. + # If there is an error, it will be handled by the caller (the LLM will get the stack trace). + # + # Even so, if a tool is misbehaving, or a change in the code causes an error, + # give a "helpful" response - to avoid the hassles of searching about for the root cause. + + # Invalid JSON is not expected since the MCP server serializes requests with `json.dumps`. + # Any error should be rare, the "default" exception path is fine. + request = json.loads(data) + + if request.get("type") != "execute": + return _ExecResult({ + "status": "error", + "message": "Unknown request type: {!r}".format(request.get("type")), + }), False + code = request.get("code", "") + + # Not expected in normal use, but a clear message beats a cryptic trace-back, + # Also make it clear where the error should be addressed. + strict_json = request.get("strict_json") + if not isinstance(strict_json, bool): + return ( + _ExecResult({ + "status": "error", + "message": ( + "Internal error: a blender_mcp tool sent a request without the required 'strict_json' boolean key. " + "This is a bug in the tool that generated this code" + ), + }), + False, + ) + + if use_log: + print("request:\n{:s}".format(code), file=sys.stderr) + exec_result = _execute_code(code, strict_json=strict_json) + if use_log: + if exec_result.check_fn is not None: + print("response: deferred", file=sys.stderr) + else: + print("response: {:s}".format(json.dumps(exec_result.response, indent=2)), file=sys.stderr) + + return exec_result, strict_json + + +def _close_client(client: _Client) -> None: + """ + Close a client connection and remove it from the active list. + """ + try: + client.conn.close() + except Exception: # pylint: disable=broad-exception-caught + pass + try: + _state.clients.remove(client) + except ValueError: + pass + + +# --------------------------------------------------------------------------- +# Polling (called from the execution modules). + +def _accept_clients() -> None: + """ + Accept all pending connections on the listening socket. + """ + if _state.sock is None: + return + while True: + try: + conn, _addr = _state.sock.accept() + conn.setblocking(False) + _state.clients.append(_Client(conn)) + except BlockingIOError: + break + except OSError: + break + + +def _service_clients() -> bool: + """ + Read from all connected clients, execute complete requests. + + Return ``True`` if at least one request was executed. + """ + did_work = False + # Iterate over a copy since clients may be removed during the loop. + for client in _state.clients[:]: + # Evict clients that have not sent a complete request in time. + client.timeout -= 1 + if client.timeout <= 0: + try: + err: dict[str, object] = { + "status": "error", + "message": "Client timed out", + } + client.conn.sendall(_encode_response(err)) + except OSError: + pass + _close_client(client) + continue + + try: + chunk = client.conn.recv(_RECV_BUFFER_SIZE) + except BlockingIOError: + # No data available yet. + continue + except OSError: + _close_client(client) + continue + + if not chunk: + # Client disconnected. + _close_client(client) + continue + + client.buffer.extend(chunk) + + # Guard against unbounded input from a misbehaving client. + if len(client.buffer) > _MAX_REQUEST_BYTES: + try: + err = { + "status": "error", + "message": "Request exceeds {:d} byte limit".format(_MAX_REQUEST_BYTES), + } + client.conn.sendall(_encode_response(err)) + except OSError: + pass + _close_client(client) + continue + + if b"\0" not in client.buffer: + # Request not yet complete. + continue + + # Execute the request and send the response. + request_data = bytes(client.buffer[:client.buffer.index(b"\0")]) + try: + exec_result, strict_json = _execute_code_from_request(request_data) + except Exception: # pylint: disable=broad-exception-caught + exec_result = _ExecResult({"status": "error", "message": traceback.format_exc()}) + strict_json = False + + if exec_result.check_fn is not None: + # Deferred response: hand the connection to deferred_tool. + from . import deferred_tool + deferred_tool.add( + client.conn, + exec_result.check_fn, + strict_json, + str(exec_result.response.get("stdout", "")), + str(exec_result.response.get("stderr", "")), + ) + # Remove from clients without closing the socket. + try: + _state.clients.remove(client) + except ValueError: + pass + else: + try: + client.conn.sendall(_encode_response(exec_result.response)) + except OSError: + pass + _close_client(client) + did_work = True + + return did_work + + +def poll() -> bool: + """ + Non-blocking poll: accept new connections, service existing clients, + and check deferred responses. + + Return ``True`` if work was done or deferred clients are pending. + """ + from . import deferred_tool + _accept_clients() + did_work = _service_clients() + if deferred_tool.poll(): + did_work = True + # Stay in active polling mode while deferred clients exist. + if deferred_tool.has_pending(): + did_work = True + return did_work + + +def _handle_blocking_client(conn: socket.socket) -> bool: + """ + Handle a single client connection synchronously with blocking I/O. + + Return ``True`` if a request was executed. + """ + conn.settimeout(_CLIENT_TIMEOUT) + try: + buf = bytearray() + while b"\0" not in buf: + chunk = conn.recv(_RECV_BUFFER_SIZE) + if not chunk: + # Client disconnected. + return False + buf.extend(chunk) + if len(buf) > _MAX_REQUEST_BYTES: + err: dict[str, object] = { + "status": "error", + "message": "Request exceeds {:d} byte limit".format(_MAX_REQUEST_BYTES), + } + conn.sendall(_encode_response(err)) + return False + + request_data = bytes(buf[:buf.index(b"\0")]) + try: + exec_result, _strict_json = _execute_code_from_request(request_data) + if exec_result.check_fn is not None: + # Unpack to preserve stdout/stderr captured before the deferred handler was set up. + response = {**exec_result.response, "status": "error", "message": _DEFERRED_UNSUPPORTED_MESSAGE} + exec_result = _ExecResult(response) + except Exception: # pylint: disable=broad-exception-caught + exec_result = _ExecResult({"status": "error", "message": traceback.format_exc()}) + conn.sendall(_encode_response(exec_result.response)) + return True + except socket.timeout: + try: + err = {"status": "error", "message": "Client timed out"} + conn.sendall(_encode_response(err)) + except OSError: + pass + return False + except OSError: + return False + finally: + conn.close() + + +def poll_blocking(timeout: float = _POLL_BLOCKING_TIMEOUT) -> bool: + """ + Block until a connection arrives (up to *timeout* seconds), then + handle it synchronously with blocking I/O. + + For use in background mode where the GUI is not running. + Return ``True`` if a request was executed. + """ + if _state.sock is None: + return False + + try: + readable, _writable, _errored = select.select([_state.sock], [], [], timeout) + except (OSError, ValueError): + return False + + if not readable: + return False + + try: + conn, _addr = _state.sock.accept() + except (BlockingIOError, OSError): + return False + + return _handle_blocking_client(conn) + + +# --------------------------------------------------------------------------- +# Public API. + +def start(host: str, port: int) -> None: + """ + Bind the listening socket and begin accepting connections. + + This does not block. The caller must arrange for ``poll`` to be + called periodically (see ``execute_interactive`` and + ``execute_blocking``). + + Callers should catch ``Exception`` broadly rather than specific types, + since failures may be: + - ``RuntimeError``, e.g. server already running. + - ``OSError``, e.g. address already in use. + ...other exceptions that are difficult to predict exhaustively. + """ + if is_running(): + raise RuntimeError("Server is already running") + + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock.setblocking(False) + sock.bind((host, port)) + sock.listen(_LISTEN_BACKLOG) + except OSError: + sock.close() + raise + + _state.sock = sock + + +def stop() -> None: + """ + Close the listening socket, all client connections, and deferred responses. + """ + from . import deferred_tool + + sock = _state.sock + _state.sock = None + if sock is not None: + try: + sock.close() + except Exception: # pylint: disable=broad-exception-caught + pass + + for client in _state.clients: + try: + client.conn.close() + except Exception: # pylint: disable=broad-exception-caught + pass + _state.clients.clear() + + deferred_tool.close_all() + + +def is_running() -> bool: + """ + Return whether the server is currently listening. + """ + return _state.sock is not None diff --git a/extensions/lab_blender_org/mcp/weak_sandbox.py b/extensions/lab_blender_org/mcp/weak_sandbox.py new file mode 100644 index 0000000..8514dd7 --- /dev/null +++ b/extensions/lab_blender_org/mcp/weak_sandbox.py @@ -0,0 +1,161 @@ +# SPDX-FileCopyrightText: 2026 Blender Authors +# +# SPDX-License-Identifier: GPL-3.0-or-later + +""" +Weak sandbox for LLM-generated code execution. + +Note that this isn't really a sandbox, +more guidance that some things should not be done. + +Notes: + +- The reason *not* to use the prompt is that it tends not to be reliable, + sometimes initial requests leave the context window (or are ignored for whatever reason), + so we are better off with a simple way to prevent some things from happening. + +- If the LLM (or its user) is motivated these can be worked around. + This is more of a slap on the wrist not to try some things. +""" + +__all__ = ( + "WeakSandboxForLLM", +) + +import sys +from typing import Any, Self + + +def _blocked_exit(*args: object, **kwargs: object) -> None: # noqa: ARG001 + raise RuntimeError("sys.exit() is not allowed in LLM-generated code") + + +# Each entry is `(object, attr_name, replacement)`. +_OVERRIDES: tuple[tuple[object, str, object], ...] = ( + (sys, "exit", _blocked_exit), +) + +# Operators that LLM-generated code must not access. +# Each entry is `("module.func", "reason")`. +# +# Use this sparingly. +# The rule of thumb for inclusion is: +# +# The operator is guaranteed to cause problems and/or failure. +# +# There are lots of operations that are fairly questionable: +# - `bpy.ops.screen.spacedata_cleanup`. +# - `bpy.ops.wm.previews_clear` +# +# but it's not the purpose of this weak sandbox to disallow +# things the LLM probably shouldn't be doing. +# +# NOTE(@ideasman42): The scope of this may change over time, +# the statement above is a rule of thumb - to apply for now. +# +_BLOCKED_OPS: tuple[tuple[str, str], ...] = ( + ("wm.quit_blender", "Terminates the Blender process, use bpy.app.quit() if you must"), + ( + "wm.read_factory_settings", + "Resets all user preferences and startup file, " + "use bpy.ops.wm.read_homefile() or " + "bpy.ops.wm.read_homefile(use_empty=True, use_factory_startup=True) instead", + ), + ( + "wm.read_factory_userpref", + "Resets all user preferences, " + "use bpy.ops.wm.read_homefile() or " + "bpy.ops.wm.read_homefile(use_empty=True, use_factory_startup=True) instead", + ), + ("wm.read_userpref", "May reset user preferences disabling this add-on, avoid calling"), +) + +_BLOCKED_OPS_SET: frozenset[str] = frozenset(op for op, _reason in _BLOCKED_OPS) + + +class WeakSandboxForLLM: + """Context manager wrapping ``exec()`` of LLM-generated code.""" + __slots__ = ( + "_store_attrs", + "_store_ops", + ) + + # ------------------------------------------------------------------------- + # Attribute overrides + + @staticmethod + def override_store() -> list[tuple[object, str, object]]: + """Save current values listed in ``_OVERRIDES`` and apply replacements.""" + saved: list[tuple[object, str, object]] = [] + for obj, attr, replacement in _OVERRIDES: + saved.append((obj, attr, getattr(obj, attr))) + setattr(obj, attr, replacement) + return saved + + @staticmethod + def override_restore(saved: list[tuple[object, str, object]]) -> None: + """Restore values previously captured by :meth:`override_store`.""" + for obj, attr, original in saved: + setattr(obj, attr, original) + + # ------------------------------------------------------------------------- + # Operator blocking + + @staticmethod + def ops_blocked_store() -> tuple[Any, Any]: + """Replace ``bpy.ops._op_create_function`` with a filtered wrapper. + + Returns ``(bpy_ops_module, original_function)`` for later restore. + """ + import bpy.ops as _bpy_ops # noqa: WPS433 + + original = _bpy_ops._op_create_function + + def _filtered_op_create_function(module: str, func: str) -> Any: + key = "{:s}.{:s}".format(module, func) + if key in _BLOCKED_OPS_SET: + reason = next(r for op, r in _BLOCKED_OPS if op == key) + + def _blocked( + *args: tuple[object, ...], + **kwargs: dict[str, object], + ) -> None: + # Include the arguments as they may help the LLM pin-point the cause of the error. + args_str = ", ".join( + [repr(a) for a in args] + ["{:s}={!r}".format(k, v) for k, v in kwargs.items()] + ) + raise RuntimeError( + "Operator 'bpy.ops.{:s}({:s})' is not allowed in LLM-generated code: {:s}".format( + key, args_str, reason, + ) + ) + + return _blocked + return original(module, func) + + _bpy_ops._op_create_function = _filtered_op_create_function + return (_bpy_ops, original) + + @staticmethod + def ops_blocked_restore(saved: tuple[Any, Any]) -> None: + """Restore the original ``_op_create_function``.""" + bpy_ops_module, original = saved + bpy_ops_module._op_create_function = original + + # ------------------------------------------------------------------------- + # Context manager + + def __enter__(self) -> Self: + self._store_attrs = self.override_store() + self._store_ops = self.ops_blocked_store() + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: object, + ) -> None: + del exc_type, exc_val, exc_tb + self.ops_blocked_restore(self._store_ops) + self.override_restore(self._store_attrs) diff --git a/extensions/rainys_extensions/.blender_ext/index.json b/extensions/rainys_extensions/.blender_ext/index.json index f45366c..2ac3902 100644 --- a/extensions/rainys_extensions/.blender_ext/index.json +++ b/extensions/rainys_extensions/.blender_ext/index.json @@ -2,12 +2,33 @@ "version": "v1", "blocklist": [], "data": [ + { + "schema_version": "1.0.0", + "id": "atomic_data_manager", + "name": "Atomic Data Manager", + "tagline": "Smart cleanup and inspection of Blender data-blocks", + "version": "2.7.0", + "type": "add-on", + "maintainer": "RaincloudTheDragon", + "license": [ + "GPL-3.0-or-later" + ], + "blender_version_min": "4.2.0", + "tags": [ + "utility", + "management", + "cleanup" + ], + "archive_url": "https://github.com/RaincloudTheDragon/atomic-data-manager/releases/download/2.7.0/Atomic_Data_Manager.v2.7.0.zip", + "archive_size": 129728, + "archive_hash": "sha256:d0ab366ff9d6e9341a0670ca7f16e62d6bd9c68974bc2ce93306b56dfbfef028" + }, { "schema_version": "1.0.0", "id": "basedplayblast", "name": "BasedPlayblast", "tagline": "Easily create playblasts from Blender and Flamenco", - "version": "2.6.3", + "version": "2.8.1", "type": "add-on", "maintainer": "RaincloudTheDragon ", "license": [ @@ -24,9 +45,9 @@ "Workflow", "Video" ], - "archive_url": "https://github.com/RaincloudTheDragon/BasedPlayblast/releases/download/v2.6.3/BasedPlayblast.v2.6.3.zip", - "archive_size": 49732, - "archive_hash": "sha256:078b406105ce6f4802e75233569841e2f73d082e09cd1d954696681ebf72b627" + "archive_url": "https://github.com/RaincloudTheDragon/BasedPlayblast/releases/download/2.8.1/BasedPlayblast.2.8.1.zip", + "archive_size": 57862, + "archive_hash": "sha256:ae8657532b2716f01cac077f1ed476d6495dbcad05a0f14286a48650fa06f8a8" }, { "schema_version": "1.0.0", @@ -53,27 +74,6 @@ "archive_size": 80981, "archive_hash": "sha256:419433069465b45ea903bd7bb46d89aa28b9c96c541d587d5f3be651a762811f" }, - { - "schema_version": "1.0.0", - "id": "atomic_data_manager", - "name": "Atomic Data Manager", - "tagline": "Smart cleanup and inspection of Blender data-blocks", - "version": "2.6.3", - "type": "add-on", - "maintainer": "RaincloudTheDragon", - "license": [ - "GPL-3.0-or-later" - ], - "blender_version_min": "4.2.0", - "tags": [ - "utility", - "management", - "cleanup" - ], - "archive_url": "https://github.com/RaincloudTheDragon/atomic-data-manager/releases/download/v2.6.3/Atomic_Data_Manager.v2.6.3.zip", - "archive_size": 122700, - "archive_hash": "sha256:b444463a0443864077abcfe97332406e606a697d3567ac32f85843760da11372" - }, { "schema_version": "1.0.0", "id": "sheepit_project_submitter", diff --git a/extensions/rainys_extensions/.blender_ext/index.json@62c b/extensions/rainys_extensions/.blender_ext/index.json@62c new file mode 100644 index 0000000..2ac3902 --- /dev/null +++ b/extensions/rainys_extensions/.blender_ext/index.json@62c @@ -0,0 +1,100 @@ +{ + "version": "v1", + "blocklist": [], + "data": [ + { + "schema_version": "1.0.0", + "id": "atomic_data_manager", + "name": "Atomic Data Manager", + "tagline": "Smart cleanup and inspection of Blender data-blocks", + "version": "2.7.0", + "type": "add-on", + "maintainer": "RaincloudTheDragon", + "license": [ + "GPL-3.0-or-later" + ], + "blender_version_min": "4.2.0", + "tags": [ + "utility", + "management", + "cleanup" + ], + "archive_url": "https://github.com/RaincloudTheDragon/atomic-data-manager/releases/download/2.7.0/Atomic_Data_Manager.v2.7.0.zip", + "archive_size": 129728, + "archive_hash": "sha256:d0ab366ff9d6e9341a0670ca7f16e62d6bd9c68974bc2ce93306b56dfbfef028" + }, + { + "schema_version": "1.0.0", + "id": "basedplayblast", + "name": "BasedPlayblast", + "tagline": "Easily create playblasts from Blender and Flamenco", + "version": "2.8.1", + "type": "add-on", + "maintainer": "RaincloudTheDragon ", + "license": [ + "GPL-3.0-or-later" + ], + "blender_version_min": "4.2.0", + "website": "https://github.com/RaincloudTheDragon/BasedPlayblast", + "permissions": { + "files": "Import/export files and data" + }, + "tags": [ + "Animation", + "Render", + "Workflow", + "Video" + ], + "archive_url": "https://github.com/RaincloudTheDragon/BasedPlayblast/releases/download/2.8.1/BasedPlayblast.2.8.1.zip", + "archive_size": 57862, + "archive_hash": "sha256:ae8657532b2716f01cac077f1ed476d6495dbcad05a0f14286a48650fa06f8a8" + }, + { + "schema_version": "1.0.0", + "id": "rainclouds_bulk_scene_tools", + "name": "Raincloud's Bulk Scene Tools", + "tagline": "Bulk utilities for optimizing scene data", + "version": "0.17.0", + "type": "add-on", + "maintainer": "RaincloudTheDragon ", + "license": [ + "GPL-3.0-or-later" + ], + "blender_version_min": "4.2.0", + "website": "https://github.com/RaincloudTheDragon/Rainys-Bulk-Scene-Tools", + "permissions": { + "files": "Read and write external resources referenced by scenes" + }, + "tags": [ + "Scene", + "Workflow", + "Materials" + ], + "archive_url": "https://github.com/RaincloudTheDragon/Rainys-Bulk-Scene-Tools/releases/download/v0.17.0/Rainys_Bulk_Scene_Tools.v0.17.0.zip", + "archive_size": 80981, + "archive_hash": "sha256:419433069465b45ea903bd7bb46d89aa28b9c96c541d587d5f3be651a762811f" + }, + { + "schema_version": "1.0.0", + "id": "sheepit_project_submitter", + "name": "SheepIt Project Submitter", + "tagline": "Submit projects to SheepIt render farm", + "version": "0.0.8", + "type": "add-on", + "maintainer": "RaincloudTheDragon", + "license": [ + "GPL-3.0-or-later" + ], + "blender_version_min": "3.0.0", + "tags": [ + "render", + "farm", + "submission", + "utility" + ], + "archive_url": "https://github.com/RaincloudTheDragon/sheepit_project_submitter/releases/download/v0.0.8/SheepIt_Project_Submitter.v0.0.8.zip", + "archive_size": 47667, + "archive_hash": "sha256:93cd8f18456079130c48c66cfd40235f7fe6414f929f59f90670e7a864821110" + } + ] +} \ No newline at end of file diff --git a/extensions/rainys_extensions/atomic_data_manager/CHANGELOG.md b/extensions/rainys_extensions/atomic_data_manager/CHANGELOG.md index cbff4d0..a43bdff 100644 --- a/extensions/rainys_extensions/atomic_data_manager/CHANGELOG.md +++ b/extensions/rainys_extensions/atomic_data_manager/CHANGELOG.md @@ -1,3 +1,21 @@ +## [v2.7.0] - 2026-07-10 + +### Features + +- **Stats → Storage (#17)**: index **in-blend caches** — packed **GeoNodes bakes** (exact `bake_size` via DNA) and **physics point caches** (cloth, soft body, particles, rigid body, dynamic paint) when baked without disk/external storage; Mantaflow/fluid disk caches remain out of scope. +- **Stats → Storage (#18)**: **click a row name** to find scene users and select/activate the object; materials open the Shader Editor, actions open the Dope Sheet. Multiple users show a picker popup. +- **Preferences**: **Frame View on Storage Navigate** (off by default) — optionally frame the user in the 3D viewport after clicking a storage row. +- **Storage row icons**: GeoNodes bakes show **geometry-nodes** then **package** (packed) icons to distinguish baked data from node groups. + +### Internal + +- **Dev fixtures**: `testdata/` storage test `.blend` files (cloth, dynpaint, GeoNodes bakes, Mantaflow, particles, rigid body, soft body). +- **Release / LFS**: track `*.blend` via Git LFS; release workflow sparse-checkout and zip guard exclude `testdata/` from shipped builds. + +### Documentation + +- **README**: **Stats → Storage** section documents scope, icons, navigation, and exclusions (panel help text removed). + ## [v2.6.3] - 2026-04-22 ### Fixes diff --git a/extensions/rainys_extensions/atomic_data_manager/README.md b/extensions/rainys_extensions/atomic_data_manager/README.md index ade9aa7..e7d4d22 100644 --- a/extensions/rainys_extensions/atomic_data_manager/README.md +++ b/extensions/rainys_extensions/atomic_data_manager/README.md @@ -27,6 +27,20 @@ Atomic Data Manager offers Blender artists an intelligent data management soluti Pie Menu Controls, Advanced Fake User Options, Mass Delete Categories, Undo Accidental Deletions, Save Data-Blocks, Delete Data-Blocks, Replace Data-Blocks, Rename Data-Blocks, Reload Missing Files, Remove Missing Files, Replace Missing Files, and Search for Missing Files. +## Stats → Storage + +**Stats for Nerds → Storage** lists local datablocks ranked by estimated footprint inside the current `.blend`. Library-linked IDs from other files are excluded. + +| What | Notes | +|------|--------| +| **Packed total** | Exact bytes embedded in the file (packed images, fonts, sounds, GeoNodes bakes). | +| **Row sizes** | Most types are estimates; disk compression may differ. Physics point caches (cloth, soft body, particles, rigid body, dynamic paint) are in-blend estimates when baked with disk cache off. | +| **GeoNodes bakes** | Packed bake data, not the node group. Icons: geometry nodes, then package (packed). | +| **Mantaflow / fluid** | Disk-only caches are not indexed. | +| **Icons** | Type icon(s), then library-override emblem when applicable. | +| **Click a row name** | Selects and activates a scene user (material → Shader Editor, action → Dope Sheet). Optional **Frame View on Storage Navigate** in add-on preferences. | + + ## TAKE A VIDEO TOUR [![video-thumb](https://remington.pro/wp-content/uploads/2019/08/atomic_addon_tour_play_button-min.jpg)](https://remington.pro/software/blender/atomic/#tour) diff --git a/extensions/rainys_extensions/atomic_data_manager/blender_manifest.toml b/extensions/rainys_extensions/atomic_data_manager/blender_manifest.toml index 08164fd..3a1ca9e 100644 --- a/extensions/rainys_extensions/atomic_data_manager/blender_manifest.toml +++ b/extensions/rainys_extensions/atomic_data_manager/blender_manifest.toml @@ -2,7 +2,7 @@ schema_version = "1.0.0" id = "atomic_data_manager" name = "Atomic Data Manager" -version = "2.6.3" +version = "2.7.0" type = "add-on" author = "RaincloudTheDragon" maintainer = "RaincloudTheDragon" diff --git a/extensions/rainys_extensions/atomic_data_manager/config.py b/extensions/rainys_extensions/atomic_data_manager/config.py index f349cb2..d0f3fb8 100644 --- a/extensions/rainys_extensions/atomic_data_manager/config.py +++ b/extensions/rainys_extensions/atomic_data_manager/config.py @@ -33,6 +33,7 @@ enable_missing_file_warning = True include_fake_users = False enable_pie_menu_ui = True enable_debug_prints = False +storage_navigate_frame_view = False # hidden atomic preferences pie_menu_type = "D" diff --git a/extensions/rainys_extensions/atomic_data_manager/ops/__init__.py b/extensions/rainys_extensions/atomic_data_manager/ops/__init__.py index 28abb60..65ff02f 100644 --- a/extensions/rainys_extensions/atomic_data_manager/ops/__init__.py +++ b/extensions/rainys_extensions/atomic_data_manager/ops/__init__.py @@ -26,6 +26,7 @@ from . import main_ops from . import inspect_ops from . import direct_use_ops from . import missing_file_ops +from . import storage_navigate_ops def register(): @@ -33,10 +34,12 @@ def register(): inspect_ops.register() direct_use_ops.register() missing_file_ops.register() + storage_navigate_ops.register() def unregister(): main_ops.unregister() inspect_ops.unregister() direct_use_ops.unregister() - missing_file_ops.unregister() \ No newline at end of file + missing_file_ops.unregister() + storage_navigate_ops.unregister() \ No newline at end of file diff --git a/extensions/rainys_extensions/atomic_data_manager/ops/storage_navigate_ops.py b/extensions/rainys_extensions/atomic_data_manager/ops/storage_navigate_ops.py new file mode 100644 index 0000000..c3b37fe --- /dev/null +++ b/extensions/rainys_extensions/atomic_data_manager/ops/storage_navigate_ops.py @@ -0,0 +1,113 @@ +""" +Operators for navigating from Atomic Storage rows to datablock users. +""" + +import bpy +from bpy.props import StringProperty +from bpy.utils import register_class +from ..utils import compat +from ..utils import storage_nav + + +class ATOMIC_OT_storage_navigate_pick(bpy.types.Operator): + """Navigate to a specific object from a storage row.""" + + bl_idname = "atomic.storage_navigate_pick" + bl_label = "Show User" + bl_options = {"INTERNAL"} + + object_name: StringProperty(name="Object") + material_name: StringProperty(name="Material", default="") + action_name: StringProperty(name="Action", default="") + nav_mode: StringProperty(name="Navigation", default="viewport") + + def execute(self, context): + target = { + "object": self.object_name, + "material": self.material_name, + "action": self.action_name, + "nav": self.nav_mode, + } + if storage_nav.apply_target(context, target): + return {"FINISHED"} + self.report({"WARNING"}, "Could not select '%s' in the current view layer" % self.object_name) + return {"CANCELLED"} + + +class ATOMIC_OT_storage_navigate(bpy.types.Operator): + """Find and show users of a storage-index datablock.""" + + bl_idname = "atomic.storage_navigate" + bl_label = "Show Storage User" + bl_description = "Select and activate user object(s) from a storage row" + + storage_type: StringProperty(name="Storage Type") + id_name: StringProperty(name="ID Name") + owner_object: StringProperty(name="Owner Object", default="") + owner_scene: StringProperty(name="Owner Scene", default="") + modifier_name: StringProperty(name="Modifier", default="") + + def invoke(self, context, event): + self._targets = storage_nav.resolve_targets( + self.storage_type, + self.id_name, + owner_object=self.owner_object, + owner_scene=self.owner_scene, + modifier_name=self.modifier_name, + ) + if not self._targets: + self.report({"WARNING"}, "No scene users found for '%s'" % self.id_name) + return {"CANCELLED"} + if len(self._targets) == 1: + return self.execute(context) + return context.window_manager.invoke_popup(self, width=240) + + def draw(self, context): + layout = self.layout + layout.label(text="Select user:") + for target in self._targets: + op = layout.operator( + "atomic.storage_navigate_pick", + text=target["object"], + icon="OBJECT_DATA", + ) + op.object_name = target["object"] + op.material_name = target.get("material", "") + op.action_name = target.get("action", "") + op.nav_mode = target.get("nav", "viewport") + + def execute(self, context): + targets = getattr(self, "_targets", None) + if targets is None: + targets = storage_nav.resolve_targets( + self.storage_type, + self.id_name, + owner_object=self.owner_object, + owner_scene=self.owner_scene, + modifier_name=self.modifier_name, + ) + if not targets: + self.report({"WARNING"}, "No scene users found for '%s'" % self.id_name) + return {"CANCELLED"} + if storage_nav.apply_target(context, targets[0]): + if len(targets) > 1: + self.report({"INFO"}, "Showing first of %d users" % len(targets)) + return {"FINISHED"} + self.report({"WARNING"}, "Could not select user in the current view layer") + return {"CANCELLED"} + + +reg_list = ( + ATOMIC_OT_storage_navigate, + ATOMIC_OT_storage_navigate_pick, +) + + +def register(): + for item in reg_list: + register_class(item) + + +def unregister(): + for item in reg_list: + compat.safe_unregister_class(item) diff --git a/extensions/rainys_extensions/atomic_data_manager/stats/users.py b/extensions/rainys_extensions/atomic_data_manager/stats/users.py index 54e6354..a08ea22 100644 --- a/extensions/rainys_extensions/atomic_data_manager/stats/users.py +++ b/extensions/rainys_extensions/atomic_data_manager/stats/users.py @@ -1564,6 +1564,105 @@ def armature_all(armature_key): return distinct(users) +def _obdata_viewport_objects(obdata_key, obj_type=None): + """Objects in a scene whose data block matches obdata_key.""" + users = [] + for obj in bpy.data.objects: + if compat.is_library_or_override(obj): + continue + data = getattr(obj, "data", None) + if data is None or getattr(data, "name", None) != obdata_key: + continue + if obj_type and obj.type != obj_type: + continue + if object_all(obj.name): + users.append(obj.name) + return distinct(users) + + +def mesh_objects(mesh_key): + return _obdata_viewport_objects(mesh_key, "MESH") + + +def curve_objects(curve_key): + return _obdata_viewport_objects(curve_key, "CURVE") + + +def volume_objects(volume_key): + return _obdata_viewport_objects(volume_key, "VOLUME") + + +def pointcloud_objects(pointcloud_key): + return _obdata_viewport_objects(pointcloud_key, "POINTCLOUD") + + +def action_objects(action_key): + users = [] + try: + action = bpy.data.actions[action_key] + except (KeyError, AttributeError): + return [] + for obj in bpy.data.objects: + if compat.is_library_or_override(obj): + continue + ad = getattr(obj, "animation_data", None) + if ad and ad.action == action and object_all(obj.name): + users.append(obj.name) + return distinct(users) + + +def image_viewport_objects(image_key): + users = [] + users.extend(image_geometry_nodes(image_key)) + for mat_name in image_materials(image_key): + users.extend(material_objects(mat_name)) + return distinct(users) + + +def node_group_viewport_objects(node_group_key): + users = [] + users.extend(node_group_objects(node_group_key)) + for mat_name in node_group_materials(node_group_key): + users.extend(material_objects(mat_name)) + return distinct(users) + + +def collection_viewport_objects(collection_key): + users = [] + users.extend(collection_meshes(collection_key)) + users.extend(collection_lights(collection_key)) + users.extend(collection_cameras(collection_key)) + users.extend(collection_others(collection_key)) + return distinct([name for name in users if object_all(name)]) + + +def sound_viewport_objects(sound_key): + users = [] + try: + sound = bpy.data.sounds[sound_key] + except (KeyError, AttributeError): + return [] + for obj in bpy.data.objects: + if obj.type != "SPEAKER": + continue + data = getattr(obj, "data", None) + if data and getattr(data, "sound", None) == sound and object_all(obj.name): + users.append(obj.name) + return distinct(users) + + +def font_viewport_objects(font_key): + users = [] + try: + font = bpy.data.fonts[font_key] + except (KeyError, AttributeError): + return [] + for obj in bpy.data.objects: + if obj.type == "FONT" and obj.data == font and object_all(obj.name): + users.append(obj.name) + return distinct(users) + + def distinct(seq): # returns a list of distinct elements diff --git a/extensions/rainys_extensions/atomic_data_manager/ui/preferences_ui.py b/extensions/rainys_extensions/atomic_data_manager/ui/preferences_ui.py index 60461f2..7d2c8eb 100644 --- a/extensions/rainys_extensions/atomic_data_manager/ui/preferences_ui.py +++ b/extensions/rainys_extensions/atomic_data_manager/ui/preferences_ui.py @@ -139,6 +139,9 @@ def copy_prefs_to_config(self, context): config.enable_debug_prints = \ atomic_preferences.enable_debug_prints + config.storage_navigate_frame_view = \ + atomic_preferences.storage_navigate_frame_view + # hidden atomic preferences config.pie_menu_type = \ atomic_preferences.pie_menu_type @@ -254,6 +257,14 @@ class ATOMIC_PT_preferences_panel(bpy.types.AddonPreferences): default=False ) + storage_navigate_frame_view: bpy.props.BoolProperty( + name="Frame View on Storage Navigate", + description="When clicking a storage index row, frame the user object " + "in the 3D viewport (off by default: only selects and " + "activates)", + default=False, + ) + # hidden atomic preferences pie_menu_type: bpy.props.StringProperty( default="D" @@ -316,6 +327,13 @@ class ATOMIC_PT_preferences_panel(bpy.types.AddonPreferences): text="Enable Debug Prints" ) + # storage navigation + col.prop( + self, + "storage_navigate_frame_view", + text="Frame View on Storage Navigate", + ) + # pie menu settings pie_split = col.split(factor=0.55) # nice diff --git a/extensions/rainys_extensions/atomic_data_manager/ui/stats_panel_ui.py b/extensions/rainys_extensions/atomic_data_manager/ui/stats_panel_ui.py index 75d9481..b7faa97 100644 --- a/extensions/rainys_extensions/atomic_data_manager/ui/stats_panel_ui.py +++ b/extensions/rainys_extensions/atomic_data_manager/ui/stats_panel_ui.py @@ -35,10 +35,10 @@ from ..utils.compat import ( format_bytes, format_embedded_total, get_report, + storage_packed_icon, storage_override_icon, storage_type_icon, ) -from .utils import ui_layouts # Atomic Data Manager Statistics SubPanel @@ -139,13 +139,6 @@ class ATOMIC_PT_stats_panel(bpy.types.Panel): rep = storage_report col = box.column(align=True) - col.label( - text="IDs linked from another .blend (library) are excluded.", - icon='INFO', - ) - col.label(text="Packed = exact bytes stored inside this .blend.") - col.label(text="Other sizes are estimates; disk file may compress.") - col.label(text="Second icon = library override (when applicable).") row = col.row() row.label( @@ -166,11 +159,21 @@ class ATOMIC_PT_stats_panel(bpy.types.Panel): split = col.split(factor=0.68) left = split.row(align=True) left.label(icon=storage_type_icon(r["type"]), text="") + left.label(icon=storage_packed_icon(r["type"]), text="") left.label( icon=storage_override_icon(r.get("is_lib_override", False)), text="", ) - left.label(text=r["name"]) + nav = left.operator( + "atomic.storage_navigate", + text=r["name"], + emboss=False, + ) + nav.storage_type = r["type"] + nav.id_name = r.get("id_name", r["name"]) + nav.owner_object = r.get("owner_object", "") + nav.owner_scene = r.get("owner_scene", "") + nav.modifier_name = r.get("modifier_name", "") split.label(text=format_bytes(r["size_bytes"])) if len(rep["rows"]) > 40: diff --git a/extensions/rainys_extensions/atomic_data_manager/utils/compat.py b/extensions/rainys_extensions/atomic_data_manager/utils/compat.py index 2584737..d113828 100644 --- a/extensions/rainys_extensions/atomic_data_manager/utils/compat.py +++ b/extensions/rainys_extensions/atomic_data_manager/utils/compat.py @@ -4,6 +4,7 @@ between Blender 4.2 LTS, 4.5 LTS, and 5.0. """ +import ctypes import os import bpy from bpy.utils import register_class, unregister_class @@ -220,6 +221,31 @@ def _mesh_vertex_sum_sample(): return s +def _cache_modifier_counts(): + """Cheap counts so storage cache invalidates when physics/GeoNodes mods change.""" + nodes = cloth = soft = dp = particles = 0 + for ob in bpy.data.objects: + try: + for mod in ob.modifiers: + t = getattr(mod, "type", None) + if t == "NODES": + nodes += 1 + elif t == "CLOTH": + cloth += 1 + elif t == "SOFT_BODY": + soft += 1 + elif t == "DYNAMIC_PAINT": + dp += 1 + particles += len(getattr(ob, "particle_systems", [])) + except (AttributeError, RuntimeError, ReferenceError): + pass + rb = 0 + for sc in bpy.data.scenes: + if getattr(sc, "rigidbody_world", None): + rb += 1 + return (nodes, cloth, soft, dp, particles, rb) + + def _light_fingerprint(): fp = bpy.data.filepath try: @@ -236,6 +262,7 @@ def _light_fingerprint(): len(bpy.data.objects), len(bpy.data.armatures), len(bpy.data.collections), + _cache_modifier_counts(), ) @@ -499,6 +526,269 @@ def format_bytes(n): return _fmt_bytes(n) +# DNA layout of blender::NodesModifierBake (64-bit). bake_size is not in RNA. +# See source/blender/makesdna/DNA_modifier_types.h +class _NodesModifierBakeDNA(ctypes.Structure): + _fields_ = [ + ("id", ctypes.c_int32), + ("flag", ctypes.c_uint32), + ("bake_mode", ctypes.c_uint8), + ("bake_target", ctypes.c_int8), + ("_pad", ctypes.c_char * 6), + ("directory", ctypes.c_void_p), + ("frame_start", ctypes.c_int32), + ("frame_end", ctypes.c_int32), + ("data_blocks_num", ctypes.c_int32), + ("active_data_block", ctypes.c_int32), + ("data_blocks", ctypes.c_void_p), + ("packed", ctypes.c_void_p), + ("_pad2", ctypes.c_void_p), + ("bake_size", ctypes.c_int64), + ] + + +_PHYS_BYTES_PER_POINT = 32 + + +def _geonodes_bake_dna_sizes(bake): + """ + Read packed pointer and bake_size from NodesModifierBake DNA. + Returns (bake_size, is_packed) or None if unavailable. + """ + if bake is None or ctypes.sizeof(ctypes.c_void_p) != 8: + return None + try: + ptr = bake.as_pointer() + if not ptr: + return None + dna = _NodesModifierBakeDNA.from_address(ptr) + size = int(dna.bake_size) + packed = bool(dna.packed) + if size < 0: + return None + return (size, packed) + except (AttributeError, TypeError, ValueError, OSError, RuntimeError): + return None + + +def _append_geonodes_bake_rows(rows, is_override): + """Append rows for GeoNodes bakes packed into the .blend.""" + # packed + bake_size DNA fields exist since Blender 4.3 + if not version.is_version_at_least(4, 3): + return + for ob in bpy.data.objects: + if _skip_linked(ob): + continue + try: + mods = ob.modifiers + except (AttributeError, RuntimeError, ReferenceError): + continue + io = is_override(ob) + ow = 0.08 if io else 1.0 + for mod in mods: + if not is_geometry_nodes_modifier(mod): + continue + bakes = getattr(mod, "bakes", None) + if not bakes: + continue + for bake in bakes: + info = _geonodes_bake_dna_sizes(bake) + if info is None: + continue + size, packed = info + if not packed or size <= 0: + continue + node = getattr(bake, "node", None) + node_name = getattr(node, "name", None) if node else None + label = node_name or ("Bake %s" % getattr(bake, "bake_id", "?")) + name = "%s / %s / %s" % (ob.name, mod.name, label) + emb = max(1, int(size * ow)) + rows.append( + { + "type": "GeoNodesBake", + "name": name, + "embedded": emb, + "size_bytes": emb, + "is_lib_override": io, + "kind": "packed", + "owner_object": ob.name, + "modifier_name": mod.name, + } + ) + + +def _point_cache_in_blend(cache): + """True when a point cache is baked into the .blend (not disk/external).""" + if cache is None: + return False + try: + if not cache.is_baked: + return False + if getattr(cache, "use_disk_cache", False): + return False + if getattr(cache, "use_external", False): + return False + return True + except (AttributeError, RuntimeError, ReferenceError): + return False + + +def _iter_point_cache_items(pc): + if pc is None: + return + items = getattr(pc, "point_caches", None) + try: + if items is not None and len(items) > 0: + for item in items: + yield item + return + except (AttributeError, RuntimeError, TypeError): + pass + yield pc + + +def _physics_cache_size_bytes(cache, point_count): + try: + fs = int(cache.frame_start) + fe = int(cache.frame_end) + step = max(1, int(getattr(cache, "frame_step", 1) or 1)) + except (AttributeError, TypeError, ValueError, RuntimeError): + return None + frames = max(1, (fe - fs) // step + 1) + pts = max(1, int(point_count) if point_count else 1) + return max(64, frames * pts * _PHYS_BYTES_PER_POINT) + + +def _object_mesh_vert_count(ob): + data = getattr(ob, "data", None) + if data is None: + return 1 + try: + return max(1, len(data.vertices)) + except (AttributeError, RuntimeError, ReferenceError, TypeError): + return 1 + + +def _append_physics_cache_row( + rows, name, cache, point_count, is_lib_override, owner_object="", owner_scene="" +): + if not _point_cache_in_blend(cache): + return + sz = _physics_cache_size_bytes(cache, point_count) + if sz is None: + return + ow = 0.08 if is_lib_override else 1.0 + sz = max(64, int(sz * ow)) + cname = getattr(cache, "name", "") or "" + display = "%s (%s)" % (name, cname) if cname else name + row = { + "type": "PhysicsCache", + "name": display, + "embedded": 0, + "size_bytes": sz, + "is_lib_override": is_lib_override, + "kind": "override" if is_lib_override else "local", + } + if owner_object: + row["owner_object"] = owner_object + if owner_scene: + row["owner_scene"] = owner_scene + rows.append(row) + + +def _append_physics_cache_rows(rows, is_override): + """Append rows for physics point caches stored inside the .blend.""" + for ob in bpy.data.objects: + if _skip_linked(ob): + continue + io = is_override(ob) + verts = _object_mesh_vert_count(ob) + try: + mods = ob.modifiers + except (AttributeError, RuntimeError, ReferenceError): + mods = [] + for mod in mods: + mtype = getattr(mod, "type", None) + if mtype == "CLOTH": + pc = getattr(mod, "point_cache", None) + for item in _iter_point_cache_items(pc): + _append_physics_cache_row( + rows, "%s / Cloth" % ob.name, item, verts, io, owner_object=ob.name + ) + elif mtype == "SOFT_BODY": + pc = getattr(mod, "point_cache", None) + for item in _iter_point_cache_items(pc): + _append_physics_cache_row( + rows, "%s / Soft Body" % ob.name, item, verts, io, owner_object=ob.name + ) + elif mtype == "DYNAMIC_PAINT": + canvas = getattr(mod, "canvas_settings", None) + surfaces = getattr(canvas, "canvas_surfaces", None) if canvas else None + if not surfaces: + continue + for surf in surfaces: + pc = getattr(surf, "point_cache", None) + fmt = getattr(surf, "surface_format", None) + if fmt == "IMAGE": + res = int(getattr(surf, "image_resolution", 256) or 256) + pts = max(1, res * res) + else: + pts = verts + sname = getattr(surf, "name", "Surface") or "Surface" + for item in _iter_point_cache_items(pc): + _append_physics_cache_row( + rows, + "%s / Dynamic Paint / %s" % (ob.name, sname), + item, + pts, + io, + owner_object=ob.name, + ) + try: + psystems = ob.particle_systems + except (AttributeError, RuntimeError, ReferenceError): + psystems = [] + for ps in psystems: + pc = getattr(ps, "point_cache", None) + settings = getattr(ps, "settings", None) + count = 1 + if settings is not None: + try: + count = max(1, int(getattr(settings, "count", 1) or 1)) + except (TypeError, ValueError): + count = 1 + ps_name = getattr(ps, "name", "Particles") or "Particles" + for item in _iter_point_cache_items(pc): + _append_physics_cache_row( + rows, "%s / %s" % (ob.name, ps_name), item, count, io, owner_object=ob.name + ) + + for sc in bpy.data.scenes: + if _skip_linked(sc): + continue + rbw = getattr(sc, "rigidbody_world", None) + if not rbw: + continue + pc = getattr(rbw, "point_cache", None) + coll = getattr(rbw, "collection", None) + nobj = 1 + if coll is not None: + try: + nobj = max(1, len(coll.objects)) + except (AttributeError, RuntimeError, ReferenceError): + nobj = 1 + io = is_override(sc) + for item in _iter_point_cache_items(pc): + _append_physics_cache_row( + rows, + "%s / Rigid Body" % sc.name, + item, + nobj, + io, + owner_scene=sc.name, + ) + + _STORAGE_TYPE_ICONS = { "Mesh": "MESH_DATA", "Image": "IMAGE_DATA", @@ -514,6 +804,8 @@ _STORAGE_TYPE_ICONS = { "Sound": "SOUND", "Font": "FONT_DATA", "Collection": "OUTLINER_COLLECTION", + "GeoNodesBake": "GEOMETRY_NODES", + "PhysicsCache": "PHYSICS", } @@ -522,8 +814,13 @@ def storage_type_icon(type_name): return _STORAGE_TYPE_ICONS.get(type_name, "BLANK1") +def storage_packed_icon(type_name): + """Packed-in-blend indicator (GeoNodes bake rows only).""" + return "PACKAGE" if type_name == "GeoNodesBake" else "BLANK1" + + def storage_override_icon(is_lib_override): - """Second column: library override emblem vs empty spacer.""" + """Library override emblem vs empty spacer.""" return "LIBRARY_DATA_OVERRIDE" if is_lib_override else "BLANK1" @@ -758,6 +1055,9 @@ def build_report(): } ) + _append_geonodes_bake_rows(rows, _ov) + _append_physics_cache_rows(rows, _ov) + rows.sort(key=lambda r: r["size_bytes"], reverse=True) by_type = {} diff --git a/extensions/rainys_extensions/atomic_data_manager/utils/storage_nav.py b/extensions/rainys_extensions/atomic_data_manager/utils/storage_nav.py new file mode 100644 index 0000000..62d29cd --- /dev/null +++ b/extensions/rainys_extensions/atomic_data_manager/utils/storage_nav.py @@ -0,0 +1,185 @@ +""" +Navigate from Atomic Storage rows to datablock users in the Blender UI. +""" + +import bpy +from .. import config +from ..stats import users + + +def _find_area(context, area_type): + screen = context.screen + if context.window: + screen = context.window.screen + for area in screen.areas: + if area.type == area_type: + region = next((r for r in area.regions if r.type == "WINDOW"), None) + return context.window, area, region + return context.window, None, None + + +def resolve_targets(storage_type, id_name, owner_object="", owner_scene="", modifier_name=""): + """ + Return navigation targets as dicts: + object, material, action, nav (viewport|shader|dopesheet). + """ + targets = [] + + def add_objects(names, nav="viewport", material="", action=""): + for name in names: + if name in bpy.data.objects: + targets.append( + { + "object": name, + "material": material, + "action": action, + "nav": nav, + "modifier": modifier_name if owner_object == name else "", + } + ) + + if storage_type == "Object": + if id_name in bpy.data.objects: + add_objects([id_name]) + return targets + + if storage_type == "GeoNodesBake": + if owner_object: + add_objects([owner_object]) + return targets + + if storage_type == "PhysicsCache": + if owner_object: + add_objects([owner_object]) + return targets + if owner_scene: + scene = bpy.data.scenes.get(owner_scene) + rbw = getattr(scene, "rigidbody_world", None) if scene else None + coll = getattr(rbw, "collection", None) if rbw else None + if coll: + add_objects([ob.name for ob in coll.objects]) + return targets + + if storage_type == "Mesh": + add_objects(users.mesh_objects(id_name)) + elif storage_type == "Curve": + add_objects(users.curve_objects(id_name)) + elif storage_type == "Armature": + add_objects(users.armature_all(id_name)) + elif storage_type == "Volume": + add_objects(users.volume_objects(id_name)) + elif storage_type == "PointCloud": + add_objects(users.pointcloud_objects(id_name)) + elif storage_type == "Image": + add_objects(users.image_viewport_objects(id_name)) + elif storage_type == "Material": + seen = set() + for name in users.material_objects(id_name): + if name not in seen: + seen.add(name) + add_objects([name], nav="shader", material=id_name) + for name in users.material_geometry_nodes(id_name): + if name not in seen: + seen.add(name) + add_objects([name], nav="shader", material=id_name) + elif storage_type == "Action": + for name in users.action_objects(id_name): + add_objects([name], nav="dopesheet", action=id_name) + elif storage_type == "NodeTree": + add_objects(users.node_group_viewport_objects(id_name)) + elif storage_type == "Texture": + add_objects(users.texture_objects(id_name)) + elif storage_type == "Collection": + add_objects(users.collection_viewport_objects(id_name)) + elif storage_type == "Sound": + add_objects(users.sound_viewport_objects(id_name)) + elif storage_type == "Font": + add_objects(users.font_viewport_objects(id_name)) + + return targets + + +def _select_object(context, object_name): + vl = context.view_layer + if object_name not in vl.objects: + return False + for ob in vl.objects: + ob.select_set(False) + ob = vl.objects[object_name] + ob.select_set(True) + vl.objects.active = ob + return True + + +def _frame_view3d(context): + window, area, region = _find_area(context, "VIEW_3D") + if not area or not region: + return + with context.temp_override(window=window, area=area, region=region): + try: + bpy.ops.view3d.view_selected() + except RuntimeError: + pass + + +def _outliner_show_active(context): + window, area, region = _find_area(context, "OUTLINER") + if not area or not region: + return + with context.temp_override(window=window, area=area, region=region): + try: + bpy.ops.outliner.show_active() + except RuntimeError: + pass + + +def _focus_shader_editor(context, material_name): + material = bpy.data.materials.get(material_name) + if not material: + return + ob = context.view_layer.objects.active + if ob and hasattr(ob, "material_slots"): + for i, slot in enumerate(ob.material_slots): + if slot.material == material: + ob.active_material_index = i + break + window, area, _region = _find_area(context, "NODE_EDITOR") + if not area: + return + space = area.spaces.active + if space.type != "NODE_EDITOR": + return + space.tree_type = "ShaderNodeTree" + if hasattr(space, "shader_type"): + space.shader_type = "OBJECT" + if hasattr(space, "pin"): + space.pin = False + + +def _focus_dopesheet(context, action_name): + action = bpy.data.actions.get(action_name) + window, area, _region = _find_area(context, "DOPESHEET_EDITOR") + if not area: + return + space = area.spaces.active + if space.type != "DOPESHEET_EDITOR": + return + if action and hasattr(space, "action"): + space.action = action + + +def apply_target(context, target): + """Select object and open the appropriate editor for one target.""" + if not _select_object(context, target["object"]): + return False + + nav = target.get("nav", "viewport") + if nav == "shader" and target.get("material"): + _focus_shader_editor(context, target["material"]) + elif nav == "dopesheet" and target.get("action"): + _focus_dopesheet(context, target["action"]) + + if config.storage_navigate_frame_view: + _frame_view3d(context) + _outliner_show_active(context) + return True diff --git a/extensions/rainys_extensions/basedplayblast/__init__.py b/extensions/rainys_extensions/basedplayblast/__init__.py index 87b4c7c..0aade80 100644 --- a/extensions/rainys_extensions/basedplayblast/__init__.py +++ b/extensions/rainys_extensions/basedplayblast/__init__.py @@ -12,6 +12,9 @@ from bpy.types import (Panel, Operator, PropertyGroup, AddonPreferences) # type from .rainys_repo_bootstrap import ensure_rainys_extensions_repo from .utils import compat as compat_utils +from .utils import encode as encode_utils +from .utils import ffmpeg_path as ffmpeg_path_utils +from .utils import flamenco_deploy as flamenco_deploy_utils # Pre-defined items lists for EnumProperties RESOLUTION_MODE_ITEMS = [ @@ -40,10 +43,10 @@ FILE_FORMAT_ITEMS = [ ] VIDEO_FORMAT_ITEMS = [ - ('MPEG4', "MP4", "Standard container format with wide compatibility"), - ('QUICKTIME', "QuickTime (MOV)", "Professional container format"), - ('AVI', "AVI", "Classic container format"), - ('MKV', "Matroska (MKV)", "Open source container with wide codec support") + ('MPEG4', "MP4", "MP4 — Standard container format with wide compatibility"), + ('QUICKTIME', "QuickTime (MOV)", "QuickTime (MOV) — Professional container format"), + ('AVI', "AVI", "AVI — Classic container format"), + ('MKV', "Matroska (MKV)", "Matroska (MKV) — Open source container with wide codec support") ] VIDEO_CODEC_ITEMS = [ @@ -55,28 +58,20 @@ VIDEO_CODEC_ITEMS = [ ('NONE', "None", "No video codec") ] -VIDEO_QUALITY_ITEMS = [ - ('LOWEST', "Lowest", "Lowest quality"), - ('VERYLOW', "Very Low", "Very low quality"), - ('LOW', "Low", "Low quality"), - ('MEDIUM', "Medium", "Medium quality"), - ('HIGH', "High", "High quality"), - ('PERC_LOSSLESS', "Perceptually Lossless", "Perceptually lossless quality"), - ('LOSSLESS', "Lossless", "Lossless quality"), -] +ENCODE_SPEED_ITEMS = encode_utils.ENCODE_SPEED_ITEMS AUDIO_CODEC_ITEMS = [ + ('MP3', "MP3", "MP3 codec"), ('AAC', "AAC", "AAC codec"), ('AC3', "AC3", "AC3 codec"), - ('MP3', "MP3", "MP3 codec"), ('NONE', "None", "No audio codec") ] DISPLAY_MODE_ITEMS = [ - ('WIREFRAME', "Wireframe", "Display the wireframe"), - ('SOLID', "Solid", "Display solid shading"), - ('MATERIAL', "Material", "Display material preview"), - ('RENDERED', "Rendered", "Display rendered preview") + ('WIREFRAME', "Wireframe", "Display the wireframe", 'SHADING_WIRE', 0), + ('SOLID', "Solid", "Display solid shading", 'SHADING_SOLID', 1), + ('MATERIAL', "Material", "Display material preview", 'SHADING_TEXTURE', 2), + ('RENDERED', "Rendered", "Display rendered preview", 'SHADING_RENDERED', 3), ] # Helper function to get file extension based on video format @@ -93,57 +88,108 @@ def get_file_extension(video_format): return ".mp4" # Default to mp4 if unknown def _resolve_ffmpeg_path(): - """Resolve ffmpeg executable. Prefer addon pref, then PATH, then Blender's bundled ffmpeg.""" - try: - for addon in (__name__, "basedplayblast", "bl_ext.basedplayblast", "BasedPlayblast"): - prefs = bpy.context.preferences.addons.get(addon) - if prefs and prefs.preferences and hasattr(prefs.preferences, "ffmpeg_path"): - custom = getattr(prefs.preferences, "ffmpeg_path", "").strip() - if custom and os.path.isfile(custom): - return custom - except Exception: - pass - exe = shutil.which("ffmpeg") - if exe: - return exe - try: - blender_dir = os.path.dirname(bpy.app.binary_path) - version_str = f"{bpy.app.version[0]}.{bpy.app.version[1]}" - for search_dir in (blender_dir, os.path.join(blender_dir, version_str)): - for name in ("ffmpeg.exe", "ffmpeg"): - path = os.path.join(search_dir, name) - if os.path.isfile(path): - return path - except Exception: - pass - # Common Windows install locations (Steam/launcher often omit PATH) - for candidate in ( - r"C:\ProgramData\chocolatey\bin\ffmpeg.exe", # Chocolatey - r"C:\Program Files\ffmpeg\bin\ffmpeg.exe", - r"C:\Program Files (x86)\ffmpeg\bin\ffmpeg.exe", - r"C:\ffmpeg\bin\ffmpeg.exe", - os.path.join(os.environ.get("ProgramFiles", "C:\\Program Files"), "ffmpeg", "bin", "ffmpeg.exe"), - os.path.join(os.environ.get("ProgramFiles(x86)", "C:\\Program Files (x86)"), "ffmpeg", "bin", "ffmpeg.exe"), - ): - try: - if candidate and os.path.isfile(candidate): - return candidate - except Exception: - pass - return "ffmpeg" # Fallback; will fail with clear error if missing + """Resolve ffmpeg executable for playblast encoding.""" + return ffmpeg_path_utils.resolve_ffmpeg_path() -# Helper function to convert quality enum to FFmpeg CRF value -def get_ffmpeg_quality(quality_enum): - quality_map = { - 'LOWEST': 'HIGH', # Lowest quality = High CRF value - 'VERYLOW': 'HIGH', - 'LOW': 'MEDIUM', - 'MEDIUM': 'MEDIUM', - 'HIGH': 'LOW', # High quality = Low CRF value - 'PERC_LOSSLESS': 'PERC_LOSSLESS', - 'LOSSLESS': 'LOSSLESS', - } - return quality_map.get(quality_enum, 'MEDIUM') + +FLAMENCO_JOB_BASEDPLAYBLAST = "BasedPlayblast" +FLAMENCO_JOB_OPTIX = "BasedPlayblast_Optix_GPU" + + +def _flamenco_saves_active_blend() -> bool: + """BATv2 (Blender 5.1+) saves the active blend; BATv1 uses a separate .flamenco.blend.""" + return bpy.app.version >= (5, 1, 0) + + +def _get_bpl_addon_preferences(context): + for addon_name in ( + __name__, + "BasedPlayblast", + "basedplayblast", + "bl_ext.basedplayblast", + "bl_ext.user_local.basedplayblast", + ): + addon = context.preferences.addons.get(addon_name) + if addon and addon.preferences: + return addon.preferences + return None + + +def _flamenco_available_job_type_ids() -> list[str]: + """Read job type IDs from Flamenco's dynamic enum (RNA enum_items is unreliable).""" + try: + from flamenco import job_types as flamenco_job_types + + return [ + item[0] + for item in flamenco_job_types._job_type_enum_items + if item[0] != "-" + ] + except Exception as exc: + print(f"[BasedPlayblast] Could not read Flamenco job types: {exc}") + return [] + + +def _flamenco_job_type_available(scene, job_type_id: str) -> bool: + available = _flamenco_available_job_type_ids() + if job_type_id in available: + return True + print(f"[BasedPlayblast] Job type '{job_type_id}' not available. Available: {available}") + return False + + +def _flamenco_set_job_type(scene, job_type_id: str) -> bool: + """Assign scene.flamenco_job_type, returning False if the ID is not registered.""" + try: + scene.flamenco_job_type = job_type_id + return True + except TypeError: + available = _flamenco_available_job_type_ids() + print( + f"[BasedPlayblast] Could not set job type '{job_type_id}'. " + f"Available: {available}" + ) + return False + + +def _resolve_flamenco_job_type(scene, prefs) -> str: + """Pick Flamenco job type from render engine after blast settings are applied.""" + engine = scene.render.engine + if engine == "CYCLES": + use_optix = True + if prefs and hasattr(prefs, "use_flamenco_optix_for_cycles"): + use_optix = prefs.use_flamenco_optix_for_cycles + return FLAMENCO_JOB_OPTIX if use_optix else FLAMENCO_JOB_BASEDPLAYBLAST + return FLAMENCO_JOB_BASEDPLAYBLAST + + +def _flamenco_send_confirm_message() -> str: + if _flamenco_saves_active_blend(): + return ( + "Submitting will save this blend with temporary blast render settings. " + "They are restored after a successful Flamenco submit." + ) + return ( + "Blast settings apply in-memory for the Flamenco job copy only. " + "Your saved blend file on disk will not be overwritten." + ) + + +def _safe_restore_attr(obj, attr, value) -> bool: + try: + if hasattr(obj, attr): + setattr(obj, attr, value) + return True + except Exception as exc: + print(f"Could not restore {attr}: {exc}") + return False + + +def _restore_cycles_settings(cycles, cycles_settings: dict) -> None: + print(f"Restoring Cycles settings - samples: {cycles_settings.get('samples', 'unknown')}") + for attr, value in cycles_settings.items(): + _safe_restore_attr(cycles, attr, value) + print("Cycles settings restoration completed") # Helper function to detect if audio exists in the scene def has_audio_in_scene(scene): @@ -273,6 +319,42 @@ def get_cameras(self, context) -> list[tuple[str, str, str]]: return cameras +def _apply_output_from_blend_file(context, *, clear_last_playblast=True) -> bool: + """Set //blast/ and blast_ from the saved blend file. Returns False if unsaved.""" + props = context.scene.basedplayblast + blend_path = bpy.data.filepath + if blend_path: + target = bpy.path.abspath("//blast/") + if not target.endswith(os.sep): + target += os.sep + props.output_path = target + elif not props.output_path: + props.output_path = "//blast/" + + if not blend_path: + props.file_name = "blast_" + if clear_last_playblast: + props.last_playblast_file = "" + return False + + file_name = os.path.splitext(os.path.basename(blend_path))[0] + if not file_name: + file_name = "blast_" + elif not file_name.startswith("blast_"): + file_name = "blast_" + file_name + + props.file_name = file_name + if clear_last_playblast: + props.last_playblast_file = "" + return True + + +def _update_use_default_output(self, context): + if not self.use_default_output or context is None: + return + _apply_output_from_blend_file(context) + + # Main Properties class class BPLProperties(PropertyGroup): output_path: StringProperty( # type: ignore @@ -287,6 +369,13 @@ class BPLProperties(PropertyGroup): description="Base name for the playblast files", default="blast_" ) + + use_default_output: BoolProperty( # type: ignore + name="Default Output", + description="Use //blast/ and blast_ from the saved blend file", + default=True, + update=_update_use_default_output, + ) last_playblast_file: StringProperty( # type: ignore name="Last Playblast File", @@ -377,16 +466,24 @@ class BPLProperties(PropertyGroup): video_codec: EnumProperty( # type: ignore name="Video Codec", - description="Codec for video file", + description="Codec for Blender's built-in FFMPEG output (legacy direct-video path)", items=VIDEO_CODEC_ITEMS, - default='H264' + default='AV1' ) - video_quality: EnumProperty( # type: ignore - name="Quality", - description="Quality of the video", - items=VIDEO_QUALITY_ITEMS, - default='MEDIUM' + encode_speed: EnumProperty( # type: ignore + name="Encode Speed", + description="Encoder speed preset (CQ/CRF 0 quality is always used)", + items=ENCODE_SPEED_ITEMS, + default='SLOWEST' + ) + + video_bitrate_limit: IntProperty( # type: ignore + name="Bitrate Limit (Mbps)", + description="Optional NVENC VBR bitrate cap in Mbps (0 = uncapped)", + default=0, + min=0, + max=500 ) include_audio: BoolProperty( # type: ignore @@ -399,7 +496,7 @@ class BPLProperties(PropertyGroup): name="Audio Codec", description="Codec for audio", items=AUDIO_CODEC_ITEMS, - default='AAC' + default='MP3' ) audio_bitrate: IntProperty( # type: ignore @@ -486,7 +583,7 @@ class BPLProperties(PropertyGroup): custom_ffmpeg_args: StringProperty( # type: ignore name="Custom FFmpeg Args", description="Custom FFmpeg command line arguments (for advanced users)", - default="-c:v h264_nvenc -preset fast -crf 0" + default="-c:v av1_nvenc -preset p7 -tune hq -rc vbr -rc-lookahead 32 -spatial-aq 1 -aq-strength 15 -cq 0" ) is_rendering: BoolProperty( # type: ignore @@ -521,6 +618,13 @@ class BPLProperties(PropertyGroup): default="" ) +def _make_frame_temp_dir(file_name: str) -> str: + """Create a unique temp directory for intermediate playblast frames.""" + base = os.path.join(tempfile.gettempdir(), "basedplayblast", "frames") + os.makedirs(base, exist_ok=True) + safe_name = "".join(c if c.isalnum() or c in "-_" else "_" for c in file_name) + return tempfile.mkdtemp(prefix=f"{safe_name}_", dir=base) + # Main Operator class BPL_OT_create_playblast(Operator): bl_idname = "bpl.create_playblast" @@ -558,6 +662,17 @@ class BPL_OT_create_playblast(Operator): _render_handlers_registered = False _frame_change_handler = None _render_complete_handler_ref = None + _frame_temp_dir = None + + def _remove_frame_temp_dir(self): + temp_dir = getattr(self, '_frame_temp_dir', None) + if temp_dir and os.path.isdir(temp_dir): + try: + shutil.rmtree(temp_dir, ignore_errors=True) + print(f"Removed frame temp directory: {temp_dir}") + except Exception as e: + print(f"Could not remove frame temp directory {temp_dir}: {e}") + self._frame_temp_dir = None def _register_render_handlers(self): if self._render_handlers_registered: @@ -709,7 +824,9 @@ class BPL_OT_create_playblast(Operator): output_path = bpy.path.abspath(context.scene.render.filepath) if getattr(self, '_use_actual_render', False): - frame_output_dir = os.path.join(bpy.path.abspath(context.scene.basedplayblast.output_path), "frames") + frame_output_dir = getattr(self, '_frame_temp_dir', None) + if not frame_output_dir: + frame_output_dir = os.path.dirname(output_path) if os.path.exists(frame_output_dir): # Check for both PNG and JPEG files frame_files = (glob.glob(os.path.join(frame_output_dir, "*.png")) + @@ -814,6 +931,9 @@ class BPL_OT_create_playblast(Operator): def invoke(self, context, event): scene = context.scene props = scene.basedplayblast + + if props.use_default_output: + _apply_output_from_blend_file(context, clear_last_playblast=False) # DEBUG: Check engine at very start print(f"DEBUG: Engine at very start of invoke: {scene.render.engine}") @@ -831,6 +951,7 @@ class BPL_OT_create_playblast(Operator): self._render_job_was_running = False self._render_job_finished_time = None self._last_frame_change_time = time.time() + self._frame_temp_dir = None self._register_render_handlers() # Temporarily override Blender's frame range if using manual range @@ -1148,7 +1269,7 @@ class BPL_OT_create_playblast(Operator): if hasattr(scene.render, 'ffmpeg'): scene.render.ffmpeg.format = props.video_format scene.render.ffmpeg.codec = props.video_codec - scene.render.ffmpeg.constant_rate_factor = get_ffmpeg_quality(props.video_quality) + scene.render.ffmpeg.constant_rate_factor = 'LOSSLESS' # Audio settings if props.include_audio: @@ -1190,6 +1311,10 @@ class BPL_OT_create_playblast(Operator): frame_range_str = f"_{self._frame_start}-{self._frame_end}" file_name += frame_range_str + # Intermediate frames go to OS temp (faster on network/git-controlled output paths) + self._frame_temp_dir = _make_frame_temp_dir(file_name) + print(f"Frame temp directory: {self._frame_temp_dir}") + # Check if we're using image format (PNG) that needs encoding # NOTE: In Blender 5.0, image_settings.file_format no longer includes video formats # (FFMPEG, AVI_JPEG, etc.). This was an intentional API change by Blender to separate @@ -1204,7 +1329,7 @@ class BPL_OT_create_playblast(Operator): if is_image_format: # For image formats, use proper frame numbering pattern (no video extension) # Blender will append frame numbers automatically (e.g., file_0001.png) - scene.render.filepath = os.path.join(output_dir, file_name + "_") + scene.render.filepath = os.path.join(self._frame_temp_dir, file_name + "_") scene.render.use_file_extension = True # This enables frame numbering scene.render.use_overwrite = True scene.render.use_placeholder = False @@ -1331,10 +1456,8 @@ class BPL_OT_create_playblast(Operator): scene.render.image_settings.color_mode = 'RGBA' scene.render.image_settings.compression = 15 # Minimal compression for speed - # Set frame-based output path for individual frames - frame_output_dir = os.path.join(output_dir, "frames") - os.makedirs(frame_output_dir, exist_ok=True) - scene.render.filepath = os.path.join(frame_output_dir, file_name + "_") + # Set frame-based output path for individual frames (local temp) + scene.render.filepath = os.path.join(self._frame_temp_dir, file_name + "_") print(f"WARNING: Using frame-based rendering for Cycles stability") print(f"Frame output: {scene.render.filepath}") @@ -1456,7 +1579,7 @@ class BPL_OT_create_playblast(Operator): video_ext = get_file_extension(props.video_format) video_output = os.path.join(output_dir, file_name + video_ext) - # Frame pattern for FFmpeg - check both possible locations and patterns + # Frame pattern for FFmpeg - read from temp dir when available # Support both PNG and JPEG (JPEG used in Blender 5.0 for faster encoding) import glob @@ -1464,31 +1587,44 @@ class BPL_OT_create_playblast(Operator): current_format = scene.render.image_settings.file_format frame_ext = ".jpg" if current_format == "JPEG" else ".png" - # Pattern 1: Files in output_dir with format "filename_0001.{ext}" - frame_pattern1 = os.path.join(output_dir, file_name + "_%04d" + frame_ext) - # Pattern 2: Files in frames subdirectory - frame_output_dir = os.path.join(output_dir, "frames") - frame_pattern2 = os.path.join(frame_output_dir, file_name + "_%04d" + frame_ext) - # Pattern 3: Files with .mp4 in name (Blender 5.0 issue - wrong extension in path) - frame_pattern3 = os.path.join(output_dir, file_name + ".mp4%04d" + frame_ext) - - # Try to find which pattern matches actual files - test_patterns = [ - (frame_pattern1, output_dir), - (frame_pattern2, frame_output_dir), - (frame_pattern3, output_dir) - ] - frame_pattern = None frame_dir = None - for pattern, dir_path in test_patterns: - # Test if files matching this pattern exist - test_files = glob.glob(pattern.replace("%04d", "????")) - if test_files: - frame_pattern = pattern - frame_dir = dir_path - print(f"Found frame files matching pattern: {pattern}") - break + frame_temp_dir = getattr(self, '_frame_temp_dir', None) + if frame_temp_dir and os.path.isdir(frame_temp_dir): + temp_pattern = os.path.join(frame_temp_dir, file_name + "_%04d" + frame_ext) + temp_files = glob.glob(temp_pattern.replace("%04d", "????")) + if not temp_files: + for ext in [".png", ".jpg", ".jpeg"]: + temp_files = glob.glob(os.path.join(frame_temp_dir, file_name + "_*" + ext)) + if temp_files: + frame_ext = ext + temp_pattern = os.path.join(frame_temp_dir, file_name + "_%04d" + frame_ext) + break + if temp_files: + frame_pattern = temp_pattern + frame_dir = frame_temp_dir + print(f"Found frame files in temp directory: {frame_temp_dir}") + + if not frame_pattern: + # Fallback: legacy locations when temp dir is unset + frame_pattern1 = os.path.join(output_dir, file_name + "_%04d" + frame_ext) + frame_output_dir = os.path.join(output_dir, "frames") + frame_pattern2 = os.path.join(frame_output_dir, file_name + "_%04d" + frame_ext) + frame_pattern3 = os.path.join(output_dir, file_name + ".mp4%04d" + frame_ext) + + test_patterns = [ + (frame_pattern1, output_dir), + (frame_pattern2, frame_output_dir), + (frame_pattern3, output_dir) + ] + + for pattern, dir_path in test_patterns: + test_files = glob.glob(pattern.replace("%04d", "????")) + if test_files: + frame_pattern = pattern + frame_dir = dir_path + print(f"Found frame files matching pattern: {pattern}") + break if not frame_pattern: # Fallback: search for any frame files (PNG or JPEG) with the base filename @@ -1536,28 +1672,8 @@ class BPL_OT_create_playblast(Operator): # Build FFmpeg command using configured settings framerate = scene.render.fps / scene.render.fps_base - - # Get codec and quality settings from props - codec_map = { - 'H264': 'libx264', - 'H265': 'libx265', - 'AV1': 'libaom-av1', - 'MPEG4': 'mpeg4', - 'FFV1': 'ffv1' - } - video_codec = codec_map.get(props.video_codec, 'libx264') - - # Get CRF value from quality - crf_map = { - 'LOWEST': '28', - 'VERYLOW': '26', - 'LOW': '23', - 'MEDIUM': '20', - 'HIGH': '18', - 'PERC_LOSSLESS': '15', - 'LOSSLESS': '0' - } - crf_value = crf_map.get(props.video_quality, '20') + ffmpeg_exe = _resolve_ffmpeg_path() + print(f"[BasedPlayblast] Using ffmpeg: {ffmpeg_exe}") # Build FFmpeg command with proper structure: # 1. All inputs first (video, then audio if present) @@ -1565,7 +1681,7 @@ class BPL_OT_create_playblast(Operator): # Note: FFmpeg's %04d pattern expects frames starting at 0000, but our frames start at frame_start # We need to add -start_number to tell FFmpeg the actual starting frame number ffmpeg_cmd = [ - _resolve_ffmpeg_path(), "-y", # Overwrite output file + ffmpeg_exe, "-y", # Overwrite output file "-framerate", str(framerate), "-start_number", str(self._frame_start), # Tell FFmpeg the starting frame number "-i", frame_pattern, @@ -1829,56 +1945,35 @@ class BPL_OT_create_playblast(Operator): else: self.report({'WARNING'}, "Audio extraction failed. Rendering video without audio.") - # Now add all encoding options after all inputs - ffmpeg_cmd.extend([ - "-c:v", video_codec, - "-pix_fmt", "yuv420p", - "-crf", crf_value, - ]) - - # Add audio encoding options if audio was added + # Tail after video encode args: pixel format, optional audio, output path + encode_tail = ["-pix_fmt", "yuv420p"] if audio_file and os.path.exists(audio_file): audio_codec_map = { 'AAC': 'aac', 'AC3': 'ac3', 'MP3': 'mp3' } - audio_codec = audio_codec_map.get(props.audio_codec, 'aac') - ffmpeg_cmd.extend([ + audio_codec = audio_codec_map.get(props.audio_codec, 'mp3') + encode_tail.extend([ "-c:a", audio_codec, "-b:a", f"{props.audio_bitrate}k", - "-shortest" # Ensure video and audio end together + "-shortest", ]) - - # Add custom ffmpeg args if provided - if props.use_custom_ffmpeg_args and props.custom_ffmpeg_args: - import shlex - custom_args = shlex.split(props.custom_ffmpeg_args) - ffmpeg_cmd.extend(custom_args) - - ffmpeg_cmd.append(video_output) - - print(f"Converting frames to video...") - print(f"Command: {' '.join(ffmpeg_cmd)}") - - # Run FFmpeg - result = subprocess.run(ffmpeg_cmd, capture_output=True, text=True) - - if result.returncode == 0: - print(f"Video conversion successful: {video_output}") - - # Clean up temporary audio file if it was created + encode_tail.append(video_output) + + def _cleanup_temp_audio(): if audio_file and os.path.exists(audio_file): try: os.remove(audio_file) print(f"Removed temporary audio file: {audio_file}") except Exception as e: print(f"Could not remove temporary audio file {audio_file}: {e}") - - # Clean up frame files from the directory where they were found - import glob - if frame_dir: - # Remove both PNG and JPEG frame files + + def _cleanup_frames_on_success(): + if getattr(self, '_frame_temp_dir', None): + self._remove_frame_temp_dir() + elif frame_dir: + import glob frame_files = (glob.glob(os.path.join(frame_dir, file_name + "*.png")) + glob.glob(os.path.join(frame_dir, file_name + "*.jpg")) + glob.glob(os.path.join(frame_dir, file_name + "*.jpeg"))) @@ -1888,26 +1983,79 @@ class BPL_OT_create_playblast(Operator): print(f"Removed frame file: {frame_file}") except Exception as e: print(f"Could not remove frame file {frame_file}: {e}") - - # Remove frame directory if it exists and is empty - frame_output_dir = os.path.join(output_dir, "frames") - if os.path.exists(frame_output_dir): - try: - if not os.listdir(frame_output_dir): - os.rmdir(frame_output_dir) - except: - pass - + + frame_output_dir = os.path.join(output_dir, "frames") + if os.path.exists(frame_output_dir): + try: + if not os.listdir(frame_output_dir): + os.rmdir(frame_output_dir) + except Exception: + pass + + print("Converting frames to video...") + + if props.use_custom_ffmpeg_args and props.custom_ffmpeg_args: + import shlex + ffmpeg_cmd = list(ffmpeg_cmd) + ffmpeg_cmd.extend(shlex.split(props.custom_ffmpeg_args)) + ffmpeg_cmd.extend(encode_tail) + print(f"Command: {' '.join(ffmpeg_cmd)}") + result = subprocess.run(ffmpeg_cmd, capture_output=True, text=True) + if result.returncode == 0: + print(f"Video conversion successful: {video_output}") + _cleanup_temp_audio() + _cleanup_frames_on_success() + else: + print(f"FFmpeg error: {result.stderr}") + _cleanup_temp_audio() + self.report({'ERROR'}, f"Video conversion failed: {result.stderr}") else: - print(f"FFmpeg error: {result.stderr}") - # Clean up temporary audio file even on failure - if audio_file and os.path.exists(audio_file): - try: - os.remove(audio_file) - print(f"Removed temporary audio file: {audio_file}") - except Exception as e: - print(f"Could not remove temporary audio file {audio_file}: {e}") - self.report({'ERROR'}, f"Video conversion failed: {result.stderr}") + # Try NVENC family then libx264 until one succeeds + candidates = encode_utils.list_encoder_candidates(ffmpeg_exe) + last_stderr = "" + encode_ok = False + warned_driver = False + + for encoder in candidates: + encode_args = encode_utils.build_video_encode_args_for( + encoder, + encode_speed=props.encode_speed, + bitrate_limit_mbps=props.video_bitrate_limit, + ) + attempt_cmd = list(ffmpeg_cmd) + encode_args + encode_tail + print(f"[BasedPlayblast] Using video encoder: {encoder}") + print(f"Command: {' '.join(attempt_cmd)}") + result = subprocess.run(attempt_cmd, capture_output=True, text=True) + + if result.returncode == 0: + encode_utils.remember_working_encoder(ffmpeg_exe, encoder) + print(f"Video conversion successful: {video_output}") + encode_ok = True + break + + last_stderr = result.stderr or "" + print(f"FFmpeg error ({encoder}): {last_stderr}") + + if encode_utils.is_nvenc_driver_error(last_stderr) and not warned_driver: + driver_msg = ( + "NVIDIA driver is too old for this FFmpeg's NVENC. " + "Update your GPU drivers. Trying remaining encoders..." + ) + print(f"[BasedPlayblast] {driver_msg}") + self.report({'WARNING'}, driver_msg) + warned_driver = True + elif encode_utils.is_nvenc_encoder(encoder): + print( + f"[BasedPlayblast] Encoder {encoder} failed; " + "trying next available encoder..." + ) + + if encode_ok: + _cleanup_temp_audio() + _cleanup_frames_on_success() + else: + _cleanup_temp_audio() + self.report({'ERROR'}, f"Video conversion failed: {last_stderr}") except Exception as e: err_msg = str(e) @@ -1938,6 +2086,7 @@ class BPL_OT_create_playblast(Operator): self._remove_render_handlers() self._frames_rendered = 0 self._last_frame_counted = 0 + self._remove_frame_temp_dir() # End progress bar if it's still running context.window_manager.progress_end() @@ -2191,64 +2340,7 @@ class BPL_OT_create_playblast(Operator): # SCENE.CYCLES - Always restore Cycles settings if available if 'cycles' in original and original['cycles']: - cycles_settings = original['cycles'] - cycles = scene.cycles - print(f"Restoring ALL Cycles settings - samples: {cycles_settings.get('samples', 'unknown')}") - - # Restore ALL Cycles settings comprehensively - cycles.device = cycles_settings.get('device', cycles.device) - safe_restore(cycles, 'feature_set', cycles_settings.get('feature_set', 'SUPPORTED')) - safe_restore(cycles, 'shading_system', cycles_settings.get('shading_system', 'SVM')) - cycles.samples = cycles_settings.get('samples', cycles.samples) - cycles.preview_samples = cycles_settings.get('preview_samples', cycles.preview_samples) - safe_restore(cycles, 'aa_samples', cycles_settings.get('aa_samples', 4)) - safe_restore(cycles, 'preview_aa_samples', cycles_settings.get('preview_aa_samples', 4)) - cycles.use_denoising = cycles_settings.get('use_denoising', cycles.use_denoising) - safe_restore(cycles, 'denoiser', cycles_settings.get('denoiser', 'OPENIMAGEDENOISE')) - safe_restore(cycles, 'denoising_input_passes', cycles_settings.get('denoising_input_passes', 'RGB_ALBEDO_NORMAL')) - safe_restore(cycles, 'use_denoising_input_passes', cycles_settings.get('use_denoising_input_passes', True)) - safe_restore(cycles, 'denoising_prefilter', cycles_settings.get('denoising_prefilter', 'ACCURATE')) - cycles.use_adaptive_sampling = cycles_settings.get('use_adaptive_sampling', cycles.use_adaptive_sampling) - cycles.adaptive_threshold = cycles_settings.get('adaptive_threshold', cycles.adaptive_threshold) - cycles.adaptive_min_samples = cycles_settings.get('adaptive_min_samples', cycles.adaptive_min_samples) - safe_restore(cycles, 'time_limit', cycles_settings.get('time_limit', 0.0)) - safe_restore(cycles, 'use_preview_adaptive_sampling', cycles_settings.get('use_preview_adaptive_sampling', False)) - safe_restore(cycles, 'preview_adaptive_threshold', cycles_settings.get('preview_adaptive_threshold', 0.1)) - safe_restore(cycles, 'preview_adaptive_min_samples', cycles_settings.get('preview_adaptive_min_samples', 0)) - safe_restore(cycles, 'seed', cycles_settings.get('seed', 0)) - safe_restore(cycles, 'use_animated_seed', cycles_settings.get('use_animated_seed', False)) - safe_restore(cycles, 'sample_clamp_direct', cycles_settings.get('sample_clamp_direct', 0.0)) - safe_restore(cycles, 'sample_clamp_indirect', cycles_settings.get('sample_clamp_indirect', 0.0)) - cycles.light_sampling_threshold = cycles_settings.get('light_sampling_threshold', cycles.light_sampling_threshold) - safe_restore(cycles, 'sample_all_lights_direct', cycles_settings.get('sample_all_lights_direct', True)) - safe_restore(cycles, 'sample_all_lights_indirect', cycles_settings.get('sample_all_lights_indirect', True)) - cycles.max_bounces = cycles_settings.get('max_bounces', cycles.max_bounces) - cycles.diffuse_bounces = cycles_settings.get('diffuse_bounces', cycles.diffuse_bounces) - cycles.glossy_bounces = cycles_settings.get('glossy_bounces', cycles.glossy_bounces) - cycles.transmission_bounces = cycles_settings.get('transmission_bounces', cycles.transmission_bounces) - cycles.volume_bounces = cycles_settings.get('volume_bounces', cycles.volume_bounces) - safe_restore(cycles, 'transparent_max_bounces', cycles_settings.get('transparent_max_bounces', 8)) - cycles.caustics_reflective = cycles_settings.get('caustics_reflective', cycles.caustics_reflective) - cycles.caustics_refractive = cycles_settings.get('caustics_refractive', cycles.caustics_refractive) - safe_restore(cycles, 'filter_type', cycles_settings.get('filter_type', 'GAUSSIAN')) - safe_restore(cycles, 'filter_width', cycles_settings.get('filter_width', 1.5)) - cycles.pixel_filter_width = cycles_settings.get('pixel_filter_width', cycles.pixel_filter_width) - cycles.use_persistent_data = cycles_settings.get('use_persistent_data', cycles.use_persistent_data) - safe_restore(cycles, 'debug_use_spatial_splits', cycles_settings.get('debug_use_spatial_splits', False)) - safe_restore(cycles, 'debug_use_hair_bvh', cycles_settings.get('debug_use_hair_bvh', True)) - safe_restore(cycles, 'debug_bvh_type', cycles_settings.get('debug_bvh_type', 'DYNAMIC_BVH')) - safe_restore(cycles, 'debug_use_compact_bvh', cycles_settings.get('debug_use_compact_bvh', True)) - safe_restore(cycles, 'tile_size', cycles_settings.get('tile_size', 256)) - safe_restore(cycles, 'use_auto_tile', cycles_settings.get('use_auto_tile', False)) - safe_restore(cycles, 'progressive', cycles_settings.get('progressive', 'PATH')) - safe_restore(cycles, 'use_square_samples', cycles_settings.get('use_square_samples', False)) - safe_restore(cycles, 'blur_glossy', cycles_settings.get('blur_glossy', 0.0)) - safe_restore(cycles, 'use_transparent_shadows', cycles_settings.get('use_transparent_shadows', True)) - safe_restore(cycles, 'volume_step_rate', cycles_settings.get('volume_step_rate', 1.0)) - safe_restore(cycles, 'volume_preview_step_rate', cycles_settings.get('volume_preview_step_rate', 1.0)) - safe_restore(cycles, 'volume_max_steps', cycles_settings.get('volume_max_steps', 1024)) - - print(f"ALL Cycles settings restoration completed") + _restore_cycles_settings(scene.cycles, original['cycles']) # Clear the stored settings props.original_settings = "" @@ -2412,6 +2504,163 @@ class BPL_OT_sync_file_name(Operator): self.report({'INFO'}, f"File name synced with Blender's output file name") return {'FINISHED'} +# Operator to set output path and file name from the current blend file +class BPL_OT_sync_from_blend_file(Operator): + bl_idname = "bpl.sync_from_blend_file" + bl_label = "Set from Blend File" + bl_description = "Set output path and file name from the current blend file" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + blend_path = bpy.data.filepath + if not blend_path: + self.report({'WARNING'}, "Save the blend file first") + return {'CANCELLED'} + + if not _apply_output_from_blend_file(context): + self.report({'WARNING'}, "Save the blend file first") + return {'CANCELLED'} + + props = context.scene.basedplayblast + self.report({'INFO'}, f"Output set from blend file: {props.file_name}") + return {'FINISHED'} + + +class BPL_OT_deploy_flamenco_scripts(Operator): + bl_idname = "bpl.deploy_flamenco_scripts" + bl_label = "Deploy Flamenco Scripts" + bl_description = "Copy BasedPlayblast job scripts to the Flamenco Manager scripts folder" + bl_options = {'REGISTER'} + + directory: StringProperty( # type: ignore + name="Flamenco Manager Directory", + description="Directory containing flamenco-manager.yaml", + subtype='DIR_PATH', + ) + + def invoke(self, context, event): + prefs = _get_bpl_addon_preferences(context) + if prefs and prefs.flamenco_manager_dir: + self.directory = prefs.flamenco_manager_dir + context.window_manager.fileselect_add(self) + return {'RUNNING_MODAL'} + + def execute(self, context): + if not self.directory: + self.report({'WARNING'}, "No directory selected") + return {'CANCELLED'} + + manager_dir = bpy.path.abspath(self.directory) + ok, message, _copied, restart, _version = flamenco_deploy_utils.deploy_scripts(manager_dir) + if not ok: + self.report({'ERROR'}, message) + return {'CANCELLED'} + + prefs = _get_bpl_addon_preferences(context) + if prefs: + prefs.flamenco_manager_dir = manager_dir + + self.report({'WARNING' if restart else 'INFO'}, message) + print(f"[BasedPlayblast] {message}") + return {'FINISHED'} + + +class BPL_OT_send_to_flamenco(Operator): + bl_idname = "bpl.send_to_flamenco" + bl_label = "Send to Flamenco" + bl_description = "Apply blast settings, submit to Flamenco, then restore scene settings" + bl_options = {'REGISTER'} + + @classmethod + def poll(cls, context): + if not bpy.data.filepath: + cls.poll_message_set("Save the blend file first") + return False + if "flamenco" not in context.preferences.addons: + cls.poll_message_set("Flamenco addon is not enabled") + return False + return True + + def invoke(self, context, event): + self.bl_description = _flamenco_send_confirm_message() + return context.window_manager.invoke_confirm(self, event) + + def execute(self, context): + scene = context.scene + props = scene.basedplayblast + if props.use_default_output: + _apply_output_from_blend_file(context, clear_last_playblast=False) + + original_job_type = getattr(scene, "flamenco_job_type", "-") + applied = False + submit_succeeded = False + + try: + apply_result = bpy.ops.bpl.apply_blast_settings('EXEC_DEFAULT') + if 'CANCELLED' in apply_result: + return {'CANCELLED'} + applied = True + + ping_result = bpy.ops.flamenco.ping_manager() + if 'CANCELLED' in ping_result: + self.report({'ERROR'}, "Could not reach Flamenco Manager") + return {'CANCELLED'} + + prefs = _get_bpl_addon_preferences(context) + job_type = _resolve_flamenco_job_type(scene, prefs) + if not _flamenco_job_type_available(scene, job_type): + self.report( + {'ERROR'}, + f"Job type '{job_type}' is not on the Manager. Deploy BasedPlayblast scripts and refresh.", + ) + return {'CANCELLED'} + + if not _flamenco_set_job_type(scene, job_type): + self.report( + {'ERROR'}, + f"Job type '{job_type}' could not be selected. Refresh from Manager in Flamenco.", + ) + return {'CANCELLED'} + print(f"[BasedPlayblast] Flamenco job type set to: {job_type}") + + job_name = getattr(scene, "flamenco_job_name", "").strip() + if not job_name: + job_name = os.path.splitext(os.path.basename(bpy.data.filepath))[0] + + submit_result = bpy.ops.flamenco.submit_job( + job_name=job_name, + ignore_version_mismatch=False, + ) + if 'CANCELLED' in submit_result: + self.report({'ERROR'}, "Flamenco job submission cancelled or failed") + return {'CANCELLED'} + + submit_succeeded = True + self.report({'INFO'}, "Flamenco job submitted; restoring scene settings") + return {'FINISHED'} + finally: + if applied: + if hasattr(scene, "flamenco_job_type"): + scene.flamenco_job_type = original_job_type + restore_ok = False + try: + restore_result = bpy.ops.bpl.restore_original_settings('EXEC_DEFAULT') + restore_ok = 'CANCELLED' not in restore_result + except RuntimeError as exc: + print(f"[BasedPlayblast] Restore failed: {exc}") + if not restore_ok: + self.report({'WARNING'}, "Could not fully restore original render settings") + elif submit_succeeded and _flamenco_saves_active_blend(): + save_result = bpy.ops.wm.save_mainfile() + if 'CANCELLED' in save_result: + self.report( + {'WARNING'}, + "Settings restored in memory but blend could not be saved to disk", + ) + else: + print("[BasedPlayblast] Blend saved with restored settings after Flamenco submit") + + # New operator to apply user defaults class BPL_OT_apply_user_defaults(Operator): bl_idname = "bpl.apply_user_defaults" @@ -2423,9 +2672,11 @@ class BPL_OT_apply_user_defaults(Operator): prefs = context.preferences.addons[__name__].preferences props = context.scene.basedplayblast - props.video_quality = prefs.default_video_quality + props.encode_speed = prefs.default_encode_speed + props.video_bitrate_limit = prefs.default_video_bitrate_limit props.use_custom_ffmpeg_args = prefs.default_use_custom_ffmpeg_args props.custom_ffmpeg_args = prefs.default_ffmpeg_args + props.audio_codec = prefs.default_audio_codec self.report({'INFO'}, "User defaults applied to scene.") return {'FINISHED'} @@ -3364,7 +3615,7 @@ class BPL_OT_apply_blast_settings(Operator): if hasattr(scene.render, 'ffmpeg'): scene.render.ffmpeg.format = props.video_format scene.render.ffmpeg.codec = props.video_codec - scene.render.ffmpeg.constant_rate_factor = get_ffmpeg_quality(props.video_quality) + scene.render.ffmpeg.constant_rate_factor = 'LOSSLESS' # Audio settings if props.include_audio: @@ -3605,64 +3856,7 @@ class BPL_OT_restore_original_settings(Operator): print(f"ERROR: 'cycles' key not found in original settings! Keys available: {list(original.keys())}") if 'cycles' in original and original['cycles']: - cycles_settings = original['cycles'] - cycles = scene.cycles - print(f"Restoring ALL Cycles settings - samples: {cycles_settings.get('samples', 'unknown')}") - - # Restore ALL Cycles settings comprehensively - cycles.device = cycles_settings['device'] - safe_restore(cycles, 'feature_set', cycles_settings.get('feature_set', 'SUPPORTED')) - safe_restore(cycles, 'shading_system', cycles_settings.get('shading_system', 'SVM')) - cycles.samples = cycles_settings['samples'] - cycles.preview_samples = cycles_settings['preview_samples'] - safe_restore(cycles, 'aa_samples', cycles_settings.get('aa_samples', 4)) - safe_restore(cycles, 'preview_aa_samples', cycles_settings.get('preview_aa_samples', 4)) - cycles.use_denoising = cycles_settings['use_denoising'] - safe_restore(cycles, 'denoiser', cycles_settings.get('denoiser', 'OPENIMAGEDENOISE')) - safe_restore(cycles, 'denoising_input_passes', cycles_settings.get('denoising_input_passes', 'RGB_ALBEDO_NORMAL')) - safe_restore(cycles, 'use_denoising_input_passes', cycles_settings.get('use_denoising_input_passes', True)) - safe_restore(cycles, 'denoising_prefilter', cycles_settings.get('denoising_prefilter', 'ACCURATE')) - cycles.use_adaptive_sampling = cycles_settings['use_adaptive_sampling'] - cycles.adaptive_threshold = cycles_settings['adaptive_threshold'] - cycles.adaptive_min_samples = cycles_settings['adaptive_min_samples'] - safe_restore(cycles, 'time_limit', cycles_settings.get('time_limit', 0.0)) - safe_restore(cycles, 'use_preview_adaptive_sampling', cycles_settings.get('use_preview_adaptive_sampling', False)) - safe_restore(cycles, 'preview_adaptive_threshold', cycles_settings.get('preview_adaptive_threshold', 0.1)) - safe_restore(cycles, 'preview_adaptive_min_samples', cycles_settings.get('preview_adaptive_min_samples', 0)) - safe_restore(cycles, 'seed', cycles_settings.get('seed', 0)) - safe_restore(cycles, 'use_animated_seed', cycles_settings.get('use_animated_seed', False)) - safe_restore(cycles, 'sample_clamp_direct', cycles_settings.get('sample_clamp_direct', 0.0)) - safe_restore(cycles, 'sample_clamp_indirect', cycles_settings.get('sample_clamp_indirect', 0.0)) - cycles.light_sampling_threshold = cycles_settings['light_sampling_threshold'] - safe_restore(cycles, 'sample_all_lights_direct', cycles_settings.get('sample_all_lights_direct', True)) - safe_restore(cycles, 'sample_all_lights_indirect', cycles_settings.get('sample_all_lights_indirect', True)) - cycles.max_bounces = cycles_settings['max_bounces'] - cycles.diffuse_bounces = cycles_settings['diffuse_bounces'] - cycles.glossy_bounces = cycles_settings['glossy_bounces'] - cycles.transmission_bounces = cycles_settings['transmission_bounces'] - cycles.volume_bounces = cycles_settings['volume_bounces'] - safe_restore(cycles, 'transparent_max_bounces', cycles_settings.get('transparent_max_bounces', 8)) - cycles.caustics_reflective = cycles_settings['caustics_reflective'] - cycles.caustics_refractive = cycles_settings['caustics_refractive'] - safe_restore(cycles, 'filter_type', cycles_settings.get('filter_type', 'GAUSSIAN')) - safe_restore(cycles, 'filter_width', cycles_settings.get('filter_width', 1.5)) - cycles.pixel_filter_width = cycles_settings['pixel_filter_width'] - cycles.use_persistent_data = cycles_settings['use_persistent_data'] - safe_restore(cycles, 'debug_use_spatial_splits', cycles_settings.get('debug_use_spatial_splits', False)) - safe_restore(cycles, 'debug_use_hair_bvh', cycles_settings.get('debug_use_hair_bvh', True)) - safe_restore(cycles, 'debug_bvh_type', cycles_settings.get('debug_bvh_type', 'DYNAMIC_BVH')) - safe_restore(cycles, 'debug_use_compact_bvh', cycles_settings.get('debug_use_compact_bvh', True)) - safe_restore(cycles, 'tile_size', cycles_settings.get('tile_size', 256)) - safe_restore(cycles, 'use_auto_tile', cycles_settings.get('use_auto_tile', False)) - safe_restore(cycles, 'progressive', cycles_settings.get('progressive', 'PATH')) - safe_restore(cycles, 'use_square_samples', cycles_settings.get('use_square_samples', False)) - safe_restore(cycles, 'blur_glossy', cycles_settings.get('blur_glossy', 0.0)) - safe_restore(cycles, 'use_transparent_shadows', cycles_settings.get('use_transparent_shadows', True)) - safe_restore(cycles, 'volume_step_rate', cycles_settings.get('volume_step_rate', 1.0)) - safe_restore(cycles, 'volume_preview_step_rate', cycles_settings.get('volume_preview_step_rate', 1.0)) - safe_restore(cycles, 'volume_max_steps', cycles_settings.get('volume_max_steps', 1024)) - - print(f"ALL Cycles settings restoration completed") + _restore_cycles_settings(scene.cycles, original['cycles']) # SCENE.EEVEE - Always restore EEVEE settings if available if 'eevee' in original and original['eevee']: @@ -3828,6 +4022,35 @@ class BPL_OT_restore_original_settings(Operator): self.report({'ERROR'}, f"Error restoring settings: {str(e)}") return {'CANCELLED'} +_DISPLAY_MODE_UI = ( + ("WIREFRAME", "Wire"), + ("SOLID", "Solid"), + ("MATERIAL", "Mat"), + ("RENDERED", "Render"), +) + + +def _draw_equal_cells_row(layout, props): + """Flat prop_enum row with short labels — same pattern as the .mp4/.mov encode row.""" + row = layout.row(align=True) + row.use_property_split = False + row.use_property_decorate = False + row.scale_y = 1.5 + for mode, label in _DISPLAY_MODE_UI: + row.prop_enum(props, "display_mode", mode, text=label) + + +def _draw_full_width_toggle_row(layout, props): + """Flat prop row with short labels — fills width like encode settings.""" + row = layout.row(align=True) + row.use_property_split = False + row.use_property_decorate = False + row.scale_y = 1.5 + row.prop(props, "include_audio", text="Audio", toggle=True, icon='OUTLINER_DATA_SPEAKER') + row.separator(factor=0.15) + row.prop(props, "show_metadata", text="Meta", toggle=True, icon='TEXT') + + # UI Panel class BPL_PT_main_panel(Panel): bl_label = "BasedPlayblast" @@ -3842,133 +4065,164 @@ class BPL_PT_main_panel(Panel): layout = self.layout scene = context.scene props = scene.basedplayblast - - # Main buttons - now integrated with output settings + prefs = _get_bpl_addon_preferences(context) + row = layout.row(align=True) row.scale_y = 1.5 row.operator("bpl.create_playblast", text="PLAYBLAST", icon='RENDER_ANIMATION') row.operator("bpl.view_playblast", text="VIEW", icon='PLAY') - - # Show progress if rendering + if not prefs or prefs.show_flamenco_button: + row.operator("bpl.send_to_flamenco", text="FLAMENCO", icon='EXPORT') + if props.is_rendering: box = layout.box() box.label(text=props.status_message) box.prop(props, "render_progress", text="Progress", slider=True) - - # Output settings - always visible - box = layout.box() - box.label(text="Output Settings") - - # Output path with sync button - row = box.row(align=True) - row.prop(props, "output_path") - row.operator("bpl.sync_output_path", text="", icon='FILE_REFRESH') - - # File name with sync button - row = box.row(align=True) - row.prop(props, "file_name") - row.operator("bpl.sync_file_name", text="", icon='FILE_REFRESH') - - # MOVED BUTTONS: Add the settings apply/restore buttons here, after output settings + layout.separator() - - # Settings apply/restore buttons - row = layout.row(align=True) - row.scale_y = 1.2 - row.operator("bpl.apply_blast_settings", text="Apply Blast Render Settings", icon='GREASEPENCIL') - row.operator("bpl.restore_original_settings", text="Restore Original Settings", icon='LOOP_BACK') - - # Properties - single collapsible section + + layout.use_property_decorate = False + _draw_equal_cells_row(layout, props) + _draw_full_width_toggle_row(layout, props) + props_box = layout.box() row = props_box.row(align=True) - show_props = getattr(context.scene, "basedplayblast_show_properties", False) - row.prop(context.scene, "basedplayblast_show_properties", icon="TRIA_DOWN" if show_props else "TRIA_RIGHT", icon_only=True, emboss=False) + show_props = getattr(scene, "basedplayblast_show_properties", False) + row.prop( + scene, + "basedplayblast_show_properties", + icon="TRIA_DOWN" if show_props else "TRIA_RIGHT", + icon_only=True, + emboss=False, + ) row.label(text="Properties") row.operator("bpl.apply_user_defaults", text="", icon='PREFERENCES') - + if show_props: - # 1. Display Mode - display_box = props_box.box() - display_box.label(text="Display Mode", icon='SHADING_RENDERED') - col = display_box.column(align=True) - col.prop(props, "display_mode", text="") + output_box = props_box.box() + output_box.label(text="Output", icon='FILE_FOLDER') + col = output_box.column(align=True) + col.prop(props, "use_default_output") + if props.use_default_output: + col.label(text=f"//blast/ {props.file_name}", icon='FILE_BLEND') + else: + row = col.row(align=True) + row.prop(props, "output_path") + row.operator("bpl.sync_output_path", text="", icon='FILE_REFRESH') + row = col.row(align=True) + row.prop(props, "file_name") + row.operator("bpl.sync_from_blend_file", text="", icon='FILE_BLEND') + row.operator("bpl.sync_file_name", text="", icon='FILE_REFRESH') + + viewport_box = props_box.box() + viewport_box.label(text="Viewport", icon='VIEW3D') + col = viewport_box.column(align=True) col.prop(props, "auto_disable_overlays") col.prop(props, "enable_depth_of_field") - - # 2. Frame Range + frame_range_box = props_box.box() frame_range_box.label(text="Frame Range", icon='TIME') col = frame_range_box.column(align=True) col.prop(props, "use_scene_frame_range") - + if not props.use_scene_frame_range: row = col.row(align=True) row.prop(props, "start_frame") row.prop(props, "end_frame") - - # 3. Resolution + resolution_box = props_box.box() resolution_box.label(text="Resolution", icon='TEXTURE') col = resolution_box.column(align=True) col.prop(props, "resolution_mode", text="") - + if props.resolution_mode == 'PRESET': col.prop(props, "resolution_preset", text="") elif props.resolution_mode == 'CUSTOM': row = col.row(align=True) row.prop(props, "resolution_x") row.prop(props, "resolution_y") - + col.prop(props, "resolution_percentage") - - # 4. Format - format_box = props_box.box() - format_box.label(text="Format", icon='FILE_MOVIE') - col = format_box.column(align=True) - col.prop(props, "video_format", text="") - col.prop(props, "video_codec", text="") - - # Custom FFmpeg arguments + + encode_box = props_box.box() + encode_box.label(text="Encode Settings", icon='FILE_MOVIE') + col = encode_box.column(align=True) + row = col.row(align=True) + row.prop_enum(props, "video_format", "MPEG4", text=".mp4") + row.prop_enum(props, "video_format", "QUICKTIME", text=".mov") + row.prop_enum(props, "video_format", "AVI", text=".avi") + row.prop_enum(props, "video_format", "MKV", text=".mkv") + col.prop(props, "use_custom_ffmpeg_args") if props.use_custom_ffmpeg_args: col.prop(props, "custom_ffmpeg_args", text="") else: - col.prop(props, "video_quality", text="") - - col.prop(props, "include_audio") + col.prop(props, "encode_speed", text="Speed") + col.prop(props, "video_bitrate_limit", text="Bitrate Limit (Mbps)") + if props.include_audio: row = col.row(align=True) row.prop(props, "audio_codec", text="") row.prop(props, "audio_bitrate") - - # 5. Metadata + metadata_box = props_box.box() metadata_box.label(text="Metadata", icon='TEXT') col = metadata_box.column(align=True) - col.prop(props, "show_metadata", text="Show Metadata") - + if props.show_metadata: col.prop(props, "metadata_note", text="") - + row = col.row(align=True) row.prop(props, "metadata_date", toggle=True) row.prop(props, "metadata_frame", toggle=True) row.prop(props, "metadata_scene", toggle=True) - + row = col.row(align=True) row.prop(props, "metadata_camera", toggle=True) row.prop(props, "metadata_lens", toggle=True) row.prop(props, "metadata_resolution", toggle=True) + advanced_box = props_box.box() + row = advanced_box.row(align=True) + show_advanced = getattr(scene, "basedplayblast_show_advanced", False) + row.prop( + scene, + "basedplayblast_show_advanced", + icon="TRIA_DOWN" if show_advanced else "TRIA_RIGHT", + icon_only=True, + emboss=False, + ) + row.label(text="Advanced") + if show_advanced: + row = advanced_box.row(align=True) + row.scale_y = 1.2 + row.operator("bpl.apply_blast_settings", text="Apply Blast Render Settings", icon='GREASEPENCIL') + row.operator("bpl.restore_original_settings", text="Restore Original Settings", icon='LOOP_BACK') + # Define the addon preferences class class BPL_AddonPreferences(AddonPreferences): bl_idname = __name__ - default_video_quality: EnumProperty( - name="Default Video Quality", - description="Default quality setting for the add-on. This will be applied on file load.", - items=VIDEO_QUALITY_ITEMS, - default='PERC_LOSSLESS' + default_encode_speed: EnumProperty( + name="Default Encode Speed", + description="Default encoder speed preset. NVENC uses VBR with CQ 0.", + items=ENCODE_SPEED_ITEMS, + default='SLOWEST' + ) + + default_video_bitrate_limit: IntProperty( + name="Default Bitrate Limit (Mbps)", + description="Default optional NVENC VBR bitrate cap in Mbps (0 = uncapped)", + default=0, + min=0, + max=500 + ) + + default_audio_codec: EnumProperty( + name="Default Audio Codec", + description="Default audio codec when including audio in playblasts", + items=AUDIO_CODEC_ITEMS, + default='MP3', ) default_use_custom_ffmpeg_args: BoolProperty( @@ -3980,16 +4234,35 @@ class BPL_AddonPreferences(AddonPreferences): default_ffmpeg_args: StringProperty( name="Default FFmpeg Arguments", description="Default custom FFmpeg arguments for advanced users.", - default="-c:v h264_nvenc -preset fast -crf 0" + default="-c:v av1_nvenc -preset p7 -tune hq -rc vbr -rc-lookahead 32 -spatial-aq 1 -aq-strength 15 -cq 0" ) ffmpeg_path: StringProperty( name="FFmpeg Path", - description="Full path to ffmpeg.exe (e.g. C:\\ffmpeg\\bin\\ffmpeg.exe). Leave blank to use PATH or Blender's bundled ffmpeg. Required when launching Blender from Steam.", + description="Optional override for ffmpeg. Leave blank to use the addon-bundled ffmpeg (auto-downloaded on first use if needed).", default="", subtype='FILE_PATH' ) + show_flamenco_button: BoolProperty( + name="Show Flamenco Button", + description="Show the Send to Flamenco button in the playblast panel", + default=True, + ) + + use_flamenco_optix_for_cycles: BoolProperty( + name="Use OPTIX GPU Job for Cycles", + description="When sending Cycles playblasts to Flamenco, select BasedPlayblast OPTIX GPU job type", + default=True, + ) + + flamenco_manager_dir: StringProperty( + name="Flamenco Manager Directory", + description="Directory containing flamenco-manager.yaml (set via Deploy Flamenco Scripts)", + default="", + subtype='DIR_PATH', + ) + repo_initialized: BoolProperty( name="Rainy's Extensions Added", description="Internal flag to avoid re-adding Rainy's Extensions repository multiple times.", @@ -4001,10 +4274,17 @@ class BPL_AddonPreferences(AddonPreferences): layout = self.layout layout.label(text="BasedPlayblast User Defaults") box = layout.box() - box.prop(self, "default_video_quality") + box.prop(self, "default_encode_speed") + box.prop(self, "default_video_bitrate_limit") + box.prop(self, "default_audio_codec") box.prop(self, "default_use_custom_ffmpeg_args") box.prop(self, "default_ffmpeg_args") - box.prop(self, "ffmpeg_path", text="FFmpeg Path (Steam)") + box.prop(self, "ffmpeg_path", text="FFmpeg Override") + box.prop(self, "show_flamenco_button") + if self.show_flamenco_button: + box.prop(self, "use_flamenco_optix_for_cycles") + box.prop(self, "flamenco_manager_dir", text="Manager Path") + box.operator("bpl.deploy_flamenco_scripts", icon='FILE_SCRIPT') def on_load_post(dummy): """Applies user defaults after a file is loaded.""" @@ -4025,6 +4305,9 @@ classes = ( BPL_OT_view_latest_playblast, BPL_OT_sync_output_path, BPL_OT_sync_file_name, + BPL_OT_sync_from_blend_file, + BPL_OT_deploy_flamenco_scripts, + BPL_OT_send_to_flamenco, BPL_OT_apply_user_defaults, BPL_OT_apply_blast_settings, BPL_OT_restore_original_settings, @@ -4042,8 +4325,17 @@ def register(): name="Show Properties", default=False ) + bpy.types.Scene.basedplayblast_show_advanced = BoolProperty( + name="Show Advanced", + default=False + ) bpy.app.handlers.load_post.append(on_load_post) ensure_rainys_extensions_repo() + try: + ffmpeg = ffmpeg_path_utils.resolve_ffmpeg_path() + print(f"[BasedPlayblast] Addon loaded; ffmpeg: {ffmpeg}") + except Exception as exc: + print(f"[BasedPlayblast] Addon loaded; ffmpeg resolve failed: {exc}") def unregister(): # Safely remove handler if it exists @@ -4053,6 +4345,8 @@ def unregister(): # Unregister property for collapsible properties section if hasattr(bpy.types.Scene, 'basedplayblast_show_properties'): del bpy.types.Scene.basedplayblast_show_properties + if hasattr(bpy.types.Scene, 'basedplayblast_show_advanced'): + del bpy.types.Scene.basedplayblast_show_advanced for cls in reversed(classes): bpy.utils.unregister_class(cls) diff --git a/extensions/rainys_extensions/basedplayblast/blender_manifest.toml b/extensions/rainys_extensions/basedplayblast/blender_manifest.toml index 50712f4..39d7546 100644 --- a/extensions/rainys_extensions/basedplayblast/blender_manifest.toml +++ b/extensions/rainys_extensions/basedplayblast/blender_manifest.toml @@ -3,7 +3,7 @@ schema_version = "1.0.0" id = "basedplayblast" name = "BasedPlayblast" tagline = "Easily create playblasts from Blender and Flamenco" -version = "2.6.3" +version = "2.8.1" type = "add-on" maintainer = "RaincloudTheDragon " diff --git a/extensions/rainys_extensions/basedplayblast/tools/ffmpeg.exe b/extensions/rainys_extensions/basedplayblast/tools/ffmpeg.exe new file mode 100644 index 0000000..6b74506 --- /dev/null +++ b/extensions/rainys_extensions/basedplayblast/tools/ffmpeg.exe @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1326dde4c84ff1f96fe6b8916c5bed29e163e9b5dccf995f6f3db069d143ec5e +size 101897728 diff --git a/extensions/rainys_extensions/basedplayblast/utils/__init__.py b/extensions/rainys_extensions/basedplayblast/utils/__init__.py index d4c136e..8164f03 100644 --- a/extensions/rainys_extensions/basedplayblast/utils/__init__.py +++ b/extensions/rainys_extensions/basedplayblast/utils/__init__.py @@ -5,8 +5,8 @@ Grouped here so Blender version/compatibility helpers stay isolated from the main add-on module. """ -from . import version, compat +from . import version, compat, encode, ffmpeg_path -__all__ = ["version", "compat"] +__all__ = ["version", "compat", "encode", "ffmpeg_path"] diff --git a/extensions/rainys_extensions/basedplayblast/utils/encode.py b/extensions/rainys_extensions/basedplayblast/utils/encode.py new file mode 100644 index 0000000..459672d --- /dev/null +++ b/extensions/rainys_extensions/basedplayblast/utils/encode.py @@ -0,0 +1,162 @@ +"""FFmpeg video encode helpers for BasedPlayblast.""" + +from __future__ import annotations + +import subprocess + +ENCODE_SPEED_ITEMS = [ + ('FASTEST', "Fastest", "Fastest encode; lowest quality preset"), + ('FAST', "Fast", "Fast encode"), + ('MEDIUM', "Medium", "Balanced encode speed"), + ('SLOW', "Slow", "Slower encode with better compression efficiency"), + ('SLOWEST', "Slowest", "Slowest preset; best detail preservation (default)"), +] + +_NVENC_PRESETS = { + 'FASTEST': 'p1', + 'FAST': 'p3', + 'MEDIUM': 'p5', + 'SLOW': 'p6', + 'SLOWEST': 'p7', +} + +_LIBX264_PRESETS = { + 'FASTEST': 'ultrafast', + 'FAST': 'veryfast', + 'MEDIUM': 'medium', + 'SLOW': 'slow', + 'SLOWEST': 'veryslow', +} + +_NVENC_ENCODERS = ('av1_nvenc', 'hevc_nvenc', 'h264_nvenc') +_ENCODER_PRIORITY = _NVENC_ENCODERS + ('libx264',) + +_ENCODER_CACHE: dict[str, str] = {} + +_NVENC_DRIVER_MARKERS = ( + 'does not support the required nvenc api version', + 'minimum required nvidia driver', + 'no nvenc capable devices found', + 'driver does not support', +) + + +def _encoder_list_text(ffmpeg_path: str) -> str: + try: + result = subprocess.run( + [ffmpeg_path, '-hide_banner', '-encoders'], + capture_output=True, + text=True, + timeout=15, + check=False, + ) + return (result.stdout or '') + (result.stderr or '') + except (OSError, subprocess.SubprocessError): + return '' + + +def list_encoder_candidates(ffmpeg_path: str) -> list[str]: + """Return available encoders in preference order (NVENC family, then libx264). + + A previously successful encoder for this ffmpeg path is tried first. + """ + encoders = _encoder_list_text(ffmpeg_path) + available = [name for name in _ENCODER_PRIORITY if name in encoders] + if not available: + available = ['libx264'] + + cached = _ENCODER_CACHE.get(ffmpeg_path) + if cached and cached in available: + return [cached] + [name for name in available if name != cached] + return available + + +def detect_video_encoder(ffmpeg_path: str) -> str: + """Pick the best available encoder: av1_nvenc, hevc_nvenc, h264_nvenc, then libx264.""" + return list_encoder_candidates(ffmpeg_path)[0] + + +def remember_working_encoder(ffmpeg_path: str, encoder: str) -> None: + """Cache an encoder that successfully encoded on this machine.""" + _ENCODER_CACHE[ffmpeg_path] = encoder + + +def is_nvenc_encoder(encoder: str) -> bool: + return encoder in _NVENC_ENCODERS + + +def is_nvenc_driver_error(stderr: str) -> bool: + """True when FFmpeg failed because the NVIDIA driver is too old / incompatible.""" + text = (stderr or '').lower() + return any(marker in text for marker in _NVENC_DRIVER_MARKERS) + + +def _vbr_bitrate_args(bitrate_limit_mbps: int) -> list[str]: + """Optional NVENC VBR bitrate cap. 0 = uncapped.""" + if bitrate_limit_mbps <= 0: + return [] + return [ + '-b:v', f'{bitrate_limit_mbps}M', + '-maxrate', f'{bitrate_limit_mbps}M', + '-bufsize', f'{bitrate_limit_mbps * 2}M', + ] + + +def _nvenc_encode_args( + encoder: str, + encode_speed: str, + bitrate_limit_mbps: int, +) -> list[str]: + """GigaMux-style NVENC VBR: hq tune, spatial AQ, cq 0; optional bitrate cap.""" + speed = encode_speed if encode_speed in _NVENC_PRESETS else 'SLOWEST' + args = [ + '-c:v', encoder, + '-preset', _NVENC_PRESETS[speed], + '-tune', 'hq', + '-rc', 'vbr', + '-rc-lookahead', '32', + '-spatial-aq', '1', + '-aq-strength', '15', + '-cq', '0', + ] + args.extend(_vbr_bitrate_args(bitrate_limit_mbps)) + return args + + +def build_video_encode_args_for( + encoder: str, + encode_speed: str = 'SLOWEST', + bitrate_limit_mbps: int = 0, +) -> list[str]: + """Build FFmpeg video encode args for a specific encoder.""" + if encoder in _NVENC_ENCODERS: + return _nvenc_encode_args(encoder, encode_speed, bitrate_limit_mbps) + + # CRF/QP 0 is true lossless and forces High 4:4:4 Predictive (breaks WMP). + # CRF 1 is the lowest lossy setting that stays High + yuv420p — nearest to NVENC cq 0. + speed = encode_speed if encode_speed in _LIBX264_PRESETS else 'SLOWEST' + return [ + '-c:v', 'libx264', + '-preset', _LIBX264_PRESETS[speed], + '-crf', '1', + '-profile:v', 'high', + ] + + +def build_video_encode_args( + ffmpeg_path: str, + encode_speed: str = 'SLOWEST', + bitrate_limit_mbps: int = 0, +) -> list[str]: + """Build FFmpeg video encode args for visually lossless playblast output.""" + encoder = detect_video_encoder(ffmpeg_path) + return build_video_encode_args_for( + encoder, + encode_speed=encode_speed, + bitrate_limit_mbps=bitrate_limit_mbps, + ) + + +def default_custom_ffmpeg_args(ffmpeg_path: str, encode_speed: str = 'SLOWEST') -> str: + """Serialize the auto-detected encode args for the custom-args text field.""" + return ' '.join(build_video_encode_args(ffmpeg_path, encode_speed=encode_speed)) diff --git a/extensions/rainys_extensions/basedplayblast/utils/ffmpeg_path.py b/extensions/rainys_extensions/basedplayblast/utils/ffmpeg_path.py new file mode 100644 index 0000000..fef3cd7 --- /dev/null +++ b/extensions/rainys_extensions/basedplayblast/utils/ffmpeg_path.py @@ -0,0 +1,166 @@ +"""Locate an ffmpeg executable for BasedPlayblast.""" + +from __future__ import annotations + +import os +import shutil +import subprocess +import sys +import tempfile +import urllib.request +import zipfile + +_FFMPEG_BOOTSTRAP_ATTEMPTED = False + +# Official Windows essentials build recommended for Blender-adjacent tooling. +_FFMPEG_ESSENTIALS_URL = ( + "https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-essentials.zip" +) + + +def addon_root() -> str: + return os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +def bundled_ffmpeg_path() -> str: + return os.path.join(addon_root(), "tools", "ffmpeg.exe") + + +def iter_blender_bundled_ffmpeg_paths(): + """Yield likely paths to ffmpeg shipped with this Blender install.""" + try: + import bpy # type: ignore + + binary = bpy.app.binary_path + if not binary: + return + binary_dir = os.path.dirname(binary) + version = f"{bpy.app.version[0]}.{bpy.app.version[1]}" + names = ("ffmpeg.exe", "ffmpeg") if sys.platform == "win32" else ("ffmpeg",) + + roots = [binary_dir] + parent = os.path.dirname(binary_dir) + if parent: + roots.append(parent) + if sys.platform == "darwin": + resources = os.path.join(os.path.dirname(binary_dir), "Resources") + if os.path.isdir(resources): + roots.append(resources) + roots.append(os.path.join(resources, version)) + + subdirs = ( + "", + version, + "ffmpeg", + os.path.join(version, "ffmpeg"), + os.path.join(version, "ffmpeg", "bin"), + os.path.join("ffmpeg", "bin"), + ) + + seen = set() + for root in roots: + for sub in subdirs: + for name in names: + path = os.path.normpath( + os.path.join(root, sub, name) if sub else os.path.join(root, name) + ) + if path not in seen: + seen.add(path) + yield path + except Exception: + return + + +def _bootstrap_bundled_ffmpeg() -> str | None: + """Download ffmpeg essentials into addon tools/ when no executable is found.""" + global _FFMPEG_BOOTSTRAP_ATTEMPTED + if _FFMPEG_BOOTSTRAP_ATTEMPTED or sys.platform != "win32": + return None + _FFMPEG_BOOTSTRAP_ATTEMPTED = True + + target = bundled_ffmpeg_path() + if os.path.isfile(target): + return target + + tools_dir = os.path.dirname(target) + os.makedirs(tools_dir, exist_ok=True) + + print("[BasedPlayblast] No ffmpeg found; downloading essentials build to addon tools/...") + try: + with tempfile.TemporaryDirectory(prefix="basedplayblast_ffmpeg_") as tmp_dir: + zip_path = os.path.join(tmp_dir, "ffmpeg-essentials.zip") + with urllib.request.urlopen(_FFMPEG_ESSENTIALS_URL, timeout=120) as response: + with open(zip_path, "wb") as handle: + shutil.copyfileobj(response, handle) + + with zipfile.ZipFile(zip_path) as archive: + member = next( + (name for name in archive.namelist() if name.endswith("/bin/ffmpeg.exe")), + None, + ) + if not member: + print("[BasedPlayblast] ffmpeg bootstrap failed: ffmpeg.exe not found in archive") + return None + archive.extract(member, tmp_dir) + extracted = os.path.join(tmp_dir, member.replace("/", os.sep)) + shutil.copy2(extracted, target) + + if os.path.isfile(target): + print(f"[BasedPlayblast] Installed bundled ffmpeg: {target}") + return target + except Exception as exc: + print(f"[BasedPlayblast] ffmpeg bootstrap failed: {exc}") + + return None + + +def resolve_ffmpeg_path() -> str: + """Resolve ffmpeg: addon override, addon bundle, Blender, bootstrap, then PATH.""" + try: + import bpy # type: ignore + + for addon_name in ( + "BasedPlayblast", + "basedplayblast", + "bl_ext.basedplayblast", + "bl_ext.user_local.basedplayblast", + ): + prefs = bpy.context.preferences.addons.get(addon_name) + if not prefs or not prefs.preferences: + continue + if hasattr(prefs.preferences, "ffmpeg_path"): + custom = getattr(prefs.preferences, "ffmpeg_path", "").strip() + if custom and os.path.isfile(custom): + return custom + except Exception: + pass + + bundled = bundled_ffmpeg_path() + if os.path.isfile(bundled): + return bundled + + for candidate in iter_blender_bundled_ffmpeg_paths(): + if os.path.isfile(candidate): + return candidate + + bootstrapped = _bootstrap_bundled_ffmpeg() + if bootstrapped and os.path.isfile(bootstrapped): + return bootstrapped + + exe = shutil.which("ffmpeg") + if exe: + print( + f"[BasedPlayblast] Warning: no addon-bundled ffmpeg; falling back to PATH: {exe}" + ) + return exe + + for candidate in ( + r"C:\ProgramData\chocolatey\bin\ffmpeg.exe", + r"C:\Program Files\ffmpeg\bin\ffmpeg.exe", + r"C:\Program Files (x86)\ffmpeg\bin\ffmpeg.exe", + r"C:\ffmpeg\bin\ffmpeg.exe", + ): + if candidate and os.path.isfile(candidate): + return candidate + + return "ffmpeg" diff --git a/extensions/rainys_extensions/basedplayblast/utils/flamenco_deploy.py b/extensions/rainys_extensions/basedplayblast/utils/flamenco_deploy.py new file mode 100644 index 0000000..97cd002 --- /dev/null +++ b/extensions/rainys_extensions/basedplayblast/utils/flamenco_deploy.py @@ -0,0 +1,184 @@ +"""Deploy BasedPlayblast job compiler scripts to a Flamenco Manager install.""" + +from __future__ import annotations + +import json +import os +import re +import shutil +import urllib.error +import urllib.request + +MANAGER_CONFIG_NAME = "flamenco-manager.yaml" +SCRIPTS_DIR_NAME = "scripts" + +SCRIPT_FILENAMES = ( + "BasedPlayblast.js", + "BasedPlayblast_Optix_GPU.js", +) + +# Flamenco 3.7+ loads job compiler scripts on demand (no Manager restart). +LIVE_SCRIPTS_MIN_VERSION = (3, 7, 0) + + +def addon_root() -> str: + return os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +def bundled_scripts_dir() -> str: + return os.path.join(addon_root(), "flamenco") + + +def manager_config_path(manager_dir: str) -> str: + return os.path.join(manager_dir, MANAGER_CONFIG_NAME) + + +def manager_scripts_dir(manager_dir: str) -> str: + return os.path.join(manager_dir, SCRIPTS_DIR_NAME) + + +def read_manager_config(manager_dir: str) -> str: + path = manager_config_path(manager_dir) + with open(path, encoding="utf-8") as handle: + return handle.read() + + +def validate_manager_dir(manager_dir: str) -> tuple[bool, str]: + manager_dir = os.path.normpath(manager_dir) + if not manager_dir or not os.path.isdir(manager_dir): + return False, "Selected path is not a directory" + + config_path = manager_config_path(manager_dir) + if not os.path.isfile(config_path): + return ( + False, + f"{MANAGER_CONFIG_NAME} not found. Select the folder that contains the Flamenco Manager executable.", + ) + + return True, config_path + + +def _parse_listen_host_port(config_text: str) -> tuple[str, int]: + match = re.search(r"^listen:\s*['\"]?([^'\"\n#]+)", config_text, re.MULTILINE) + listen = match.group(1).strip() if match else ":8080" + + if listen.startswith(":"): + return "127.0.0.1", int(listen[1:]) + + if "://" in listen: + listen = listen.split("://", 1)[1] + + if ":" in listen: + host, port_text = listen.rsplit(":", 1) + host = host or "127.0.0.1" + return host, int(port_text) + + return listen or "127.0.0.1", 8080 + + +def _parse_version_string(version_text: str) -> tuple[int, int, int] | None: + match = re.search(r"(\d+)\.(\d+)(?:\.(\d+))?", version_text) + if not match: + return None + major = int(match.group(1)) + minor = int(match.group(2)) + patch = int(match.group(3) or 0) + return major, minor, patch + + +def query_manager_version(manager_dir: str) -> tuple[int, int, int] | None: + """Best-effort Manager version lookup via the local HTTP API.""" + try: + config_text = read_manager_config(manager_dir) + except OSError: + return None + + host, port = _parse_listen_host_port(config_text) + endpoints = ( + f"http://{host}:{port}/api/v3/meta/version", + f"http://{host}:{port}/api/v2/meta/version", + f"http://{host}:{port}/version", + ) + + for url in endpoints: + try: + with urllib.request.urlopen(url, timeout=2.0) as response: + payload = json.loads(response.read().decode("utf-8")) + except (OSError, urllib.error.URLError, json.JSONDecodeError, ValueError): + continue + + for key in ("version", "Version", "manager_version"): + if key in payload: + parsed = _parse_version_string(str(payload[key])) + if parsed: + return parsed + + if isinstance(payload, dict) and "name" in payload and "version" in payload: + parsed = _parse_version_string(str(payload["version"])) + if parsed: + return parsed + + return None + + +def needs_manager_restart(version: tuple[int, int, int] | None) -> bool: + if version is None: + return False + return version < LIVE_SCRIPTS_MIN_VERSION + + +def deploy_scripts(manager_dir: str) -> tuple[bool, str, list[str], bool, tuple[int, int, int] | None]: + """ + Copy bundled Flamenco scripts into /scripts. + + Returns: + ok, user_message, copied_files, restart_recommended, detected_version + """ + ok, detail = validate_manager_dir(manager_dir) + if not ok: + return False, detail, [], False, None + + source_dir = bundled_scripts_dir() + missing_sources = [ + name for name in SCRIPT_FILENAMES + if not os.path.isfile(os.path.join(source_dir, name)) + ] + if missing_sources: + return False, f"Missing bundled scripts: {', '.join(missing_sources)}", [], False, None + + try: + read_manager_config(manager_dir) + except OSError as exc: + return False, f"Could not read {MANAGER_CONFIG_NAME}: {exc}", [], False, None + + scripts_dir = manager_scripts_dir(manager_dir) + os.makedirs(scripts_dir, exist_ok=True) + + copied: list[str] = [] + for name in SCRIPT_FILENAMES: + shutil.copy2(os.path.join(source_dir, name), os.path.join(scripts_dir, name)) + copied.append(name) + + version = query_manager_version(manager_dir) + restart = needs_manager_restart(version) + + if version and restart: + version_label = ".".join(str(part) for part in version) + message = ( + f"Deployed {len(copied)} script(s) to {scripts_dir}. " + f"Flamenco Manager {version_label} requires a restart to load new scripts " + f"(live reload was added in 3.7)." + ) + elif version: + version_label = ".".join(str(part) for part in version) + message = ( + f"Deployed {len(copied)} script(s) to {scripts_dir}. " + f"Flamenco Manager {version_label} will load them on the next job compile." + ) + else: + message = ( + f"Deployed {len(copied)} script(s) to {scripts_dir}. " + "Flamenco 3.7+ loads scripts on demand; restart Manager if you are on an older version." + ) + + return True, message, copied, restart, version diff --git a/extensions/user_default/blenderkit/__init__.py b/extensions/user_default/blenderkit/__init__.py index 588927e..39e06a8 100644 --- a/extensions/user_default/blenderkit/__init__.py +++ b/extensions/user_default/blenderkit/__init__.py @@ -20,7 +20,7 @@ bl_info = { "name": "BlenderKit Online Asset Library", "author": "Vilem Duha, Petr Dlouhy, A. Gajdosik, Michal Hons", - "version": (3, 19, 1, 260402), # X.Y.Z.yymmdd + "version": (3, 19, 2, 260411), # X.Y.Z.yymmdd "blender": (3, 0, 0), "location": "View3D > Properties > BlenderKit", "description": "Boost your workflow with drag&drop assets from the community driven library.", @@ -28,7 +28,7 @@ bl_info = { "tracker_url": "https://github.com/BlenderKit/blenderkit/issues", "category": "3D View", } -VERSION = (3, 19, 1, 260402) +VERSION = (3, 19, 2, 260411) import logging import random diff --git a/extensions/user_default/blenderkit/asset_bar_op.py b/extensions/user_default/blenderkit/asset_bar_op.py index c640c01..36fdcd7 100644 --- a/extensions/user_default/blenderkit/asset_bar_op.py +++ b/extensions/user_default/blenderkit/asset_bar_op.py @@ -2778,7 +2778,9 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.scroll_offset = ui_props.scroll_offset self.text_color = (0.9, 0.9, 0.9, 1.0) - self.warning_color = (0.9, 0.5, 0.5, 1.0) + self.info_color = (0.6, 0.6, 0.6, 1.0) + self.caution_color = (0.7, 0.7, 0.5, 1.0) + self.warning_color = (0.9, 0.3, 0.3, 1.0) self.init_ui() self.init_tooltip() @@ -3181,16 +3183,19 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): # preview comments for validators self.update_comments_for_validators(asset_data) - from_newer, difference = utils.asset_from_newer_blender_version( + has_warning, difference = utils.asset_from_newer_blender_version( asset_data ) - if from_newer: - if difference == "major": + if has_warning: + if difference in {"major_newer", "major_older"}: self.version_warning.text = f"Made in Blender {asset_data['sourceAppVersion']}! Use at your own risk." + self.version_warning.text_color = self.warning_color elif difference == "minor": - self.version_warning.text = f"Made in Blender {asset_data['sourceAppVersion']}! Caution advised." + self.version_warning.text = f"Made in Blender {asset_data['sourceAppVersion']}. Caution advised." + self.version_warning.text_color = self.caution_color else: - self.version_warning.text = f"Made in Blender {asset_data['sourceAppVersion']}! Some features may not work." + self.version_warning.text = f"Made in Blender {asset_data['sourceAppVersion']}. Some features may not work." + self.version_warning.text_color = self.info_color else: self.version_warning.text = "" diff --git a/extensions/user_default/blenderkit/asset_drag_op.py b/extensions/user_default/blenderkit/asset_drag_op.py index d4aff2f..25b2750 100644 --- a/extensions/user_default/blenderkit/asset_drag_op.py +++ b/extensions/user_default/blenderkit/asset_drag_op.py @@ -104,6 +104,9 @@ def draw_callback_dragging( None """ + if not self.drag: + return + # Only draw 2D elements in the active region where the mouse is. Guard against destroyed operator. if not is_draw_cb_available(self, context): return @@ -730,9 +733,9 @@ def object_in_particle_collection(o: bpy.types.Object) -> bool: """checks if an object is in a particle system as instance, to not snap to it and not to try to attach material.""" for p in bpy.data.particles: if p.render_type == "COLLECTION" and p.instance_collection: - if o in p.instance_collection.objects: + if o.name in p.instance_collection.objects: return True - if p.render_type == "COLLECTION": + if p.render_type == "OBJECT": if p.instance_object == o: return True return False @@ -1445,10 +1448,10 @@ class AssetDragOperator(bpy.types.Operator): for window in wins: # first let's test if it's in this window, so we know we shall continue - window_x = window.x - window_y = window.y - window_width = window.width - window_height = window.height + window_x = window.x * self.resolution_factor + window_y = window.y * self.resolution_factor + window_width = window.width * self.resolution_factor + window_height = window.height * self.resolution_factor if ( x < window_x or x > window_x + window_width @@ -1739,8 +1742,12 @@ class AssetDragOperator(bpy.types.Operator): cls = type(self) ui_props = bpy.context.window_manager.blenderkitUI - self.mouse_screen_x = int(context.window.x + event.mouse_x) - self.mouse_screen_y = int(context.window.y + event.mouse_y) + self.mouse_screen_x = int( + context.window.x * self.resolution_factor + event.mouse_x + ) + self.mouse_screen_y = int( + context.window.y * self.resolution_factor + event.mouse_y + ) # Find the active region under the mouse cursor using actual screen coordinates found_window, found_area, found_region = self.find_active_region( @@ -1768,10 +1775,14 @@ class AssetDragOperator(bpy.types.Operator): # Convert screen coords (bottom-left) to region-local coords # window.x/y and region.x/y are also in bottom-left coordinate system self.mouse_x = int( - self.mouse_screen_x - self.active_window.x - self.active_region.x + self.mouse_screen_x + - self.active_window.x * self.resolution_factor + - self.active_region.x ) self.mouse_y = int( - self.mouse_screen_y - self.active_window.y - self.active_region.y + self.mouse_screen_y + - self.active_window.y * self.resolution_factor + - self.active_region.y ) # redraw all windows to update cursor and other elements @@ -1909,11 +1920,18 @@ class AssetDragOperator(bpy.types.Operator): # This is critical for multi-window support where active_index is shared across windows self.asset_data = dict(sr[self.asset_search_index]) - # Initialize drag-start coordinates immediately in invoke. If mouse-move - # events are sparse (or arrive late), we still compute threshold against - # the true click/press origin instead of first modal tick. - self.mouse_screen_x = int(context.window.x + event.mouse_x) - self.mouse_screen_y = int(context.window.y + event.mouse_y) + # Initialize drag-start coordinates immediately in invoke. + # resolution factor is essential on Mac OS. don't touch it if you don't know what you are doing. + self.resolution_factor = ( + bpy.context.preferences.system.pixel_size + / bpy.context.preferences.view.ui_scale + ) + self.mouse_screen_x = int( + context.window.x * self.resolution_factor + event.mouse_x + ) + self.mouse_screen_y = int( + context.window.y * self.resolution_factor + event.mouse_y + ) self.start_mouse_x = self.mouse_screen_x self.start_mouse_y = self.mouse_screen_y # Author assets should not be dragged, cancel immediately diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/__init__.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/__init__.py index 5f54c41..588927e 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/__init__.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/__init__.py @@ -19,8 +19,8 @@ bl_info = { "name": "BlenderKit Online Asset Library", - "author": "Vilem Duha, Petr Dlouhy, A. Gajdosik", - "version": (3, 18, 1, 251219), # X.Y.Z.yymmdd + "author": "Vilem Duha, Petr Dlouhy, A. Gajdosik, Michal Hons", + "version": (3, 19, 1, 260402), # X.Y.Z.yymmdd "blender": (3, 0, 0), "location": "View3D > Properties > BlenderKit", "description": "Boost your workflow with drag&drop assets from the community driven library.", @@ -28,7 +28,7 @@ bl_info = { "tracker_url": "https://github.com/BlenderKit/blenderkit/issues", "category": "3D View", } -VERSION = (3, 18, 1, 251219) +VERSION = (3, 19, 1, 260402) import logging import random @@ -96,6 +96,7 @@ if "bpy" in locals(): ui = reload(ui) ui_bgl = reload(ui_bgl) ui_panels = reload(ui_panels) + keymap_utils = reload(keymap_utils) upload = reload(upload) upload_bg = reload(upload_bg) utils = reload(utils) @@ -152,6 +153,7 @@ else: from . import ui from . import ui_bgl from . import ui_panels + from . import keymap_utils from . import upload from . import upload_bg from . import utils @@ -273,7 +275,7 @@ if bpy.app.version >= (4, 5, 0): EXTRA_PATH_OPTIONS = {"options": {"PATH_SUPPORTS_BLEND_RELATIVE"}} -def udate_down_up(self, context): +def update_down_up(self, context): """Perform a search if results are empty.""" props = bpy.context.window_manager.blenderkitUI if search.get_search_results() is None and props.down_up == "SEARCH": @@ -308,6 +310,19 @@ def asset_type_callback(self, context): if bpy.app.version >= (4, 2, 0): items.append(("ADDON", "Add-ons", "Find add-ons", "PLUGIN", 7)) + addon = bpy.context.preferences.addons.get(__package__) + if addon is not None: + preferences = addon.preferences + if preferences.experimental_features and preferences.author_tab: + items.append( + ( + "AUTHOR", + "Authors", + "Find authors", + pcoll["asset_type_author"].icon_id, + 8, + ), + ) else: items = [ ("MODEL", "Model", "Upload a model", "OBJECT_DATAMODE", 0), @@ -330,6 +345,8 @@ def asset_type_callback(self, context): if bpy.app.version >= (4, 2, 0): items.append(("ADDON", "Add-on", "Upload an addon", "PLUGIN", 7)) + # Author is search-only, no upload entry needed + return items @@ -337,6 +354,10 @@ def run_drag_drop_update(self, context): if self.drag_init_button: ui_props = bpy.context.window_manager.blenderkitUI + if ui_props.dragging: + self.drag_init_button = False + return + bpy.ops.view3d.close_popup_button("INVOKE_DEFAULT") bpy.ops.view3d.asset_drag_drop( "INVOKE_DEFAULT", @@ -356,7 +377,7 @@ class BlenderKitUIProps(PropertyGroup): ), description="BlenderKit", default="SEARCH", - update=udate_down_up, + update=update_down_up, ) asset_type: EnumProperty( name=" ", @@ -505,11 +526,11 @@ class BlenderKitUIProps(PropertyGroup): ui_scale = 1 - thumb_size_def = 96 + thumb_size_def = 128 margin_def = 0 thumb_size: IntProperty( - name="Thumbnail Size", default=thumb_size_def, min=-1, max=256 + name="Thumbnail Size", default=thumb_size_def, min=48, max=256 ) margin: IntProperty(name="Margin", default=margin_def, min=-1, max=256) @@ -552,7 +573,6 @@ class BlenderKitUIProps(PropertyGroup): description="Click or drag into scene for download.\nUse mouse wheel during drag to rotate the asset. Cancel the drag by pressing 'Esc'.", update=run_drag_drop_update, ) - drag_length: IntProperty(name="Drag length", default=0) draw_drag_image: BoolProperty(name="Draw Drag Image", default=False) draw_snapped_bounds: BoolProperty(name="Draw Snapped Bounds", default=False) @@ -622,6 +642,32 @@ class BlenderKitUIProps(PropertyGroup): name="Upload HDR", type=bpy.types.Image, description="Pick an image to upload" ) + hdr_use_custom_thumbnail_tone: BoolProperty( + name="Use Custom Thumbnail Tone", + description="Use custom exposure and gamma for HDR thumbnail conversion", + default=False, + ) + + hdr_thumbnail_exposure: FloatProperty( + name="Thumbnail Exposure", + description="Exposure offset used only for HDR thumbnail conversion", + default=0.0, + min=-5.0, + max=5.0, + soft_min=-2.0, + soft_max=2.0, + ) + + hdr_thumbnail_gamma: FloatProperty( + name="Thumbnail Gamma", + description="Gamma used only for HDR thumbnail conversion", + default=1.0, + min=0.2, + max=3.0, + soft_min=0.7, + soft_max=1.6, + ) + nodegroup_upload: PointerProperty( name="Upload Tool", type=bpy.types.GeometryNodeTree, @@ -785,7 +831,7 @@ def update_free(self, context): message="Any material uploaded to BlenderKit is free." " However, it can still earn money for the author," " based on our fair share system. " - "Part of subscription is sent to artists based on usage by paying users.\n", + "Part of subscription is sent to authors based on usage by paying users.\n", ) @@ -868,6 +914,21 @@ class BlenderKitCommonUploadProps(object): description="License. Please read our help for choosing the right licenses", ) + # verification mainly to retrigger processing + verification_status: EnumProperty( + name="Verification status", + description="Verification status of the asset, set by moderators", + items=( + ("UPLOADING", "Uploading", "uploading"), + ("UPLOADED", "Uploaded", "uploaded"), + ("VALIDATED", "Validated", "validated"), + ("ON_HOLD", "On Hold", "on_hold"), + ("REJECTED", "Rejected", "rejected"), + ("DELETED", "Deleted", "deleted"), + ), + default="UPLOADING", + ) + is_private: EnumProperty( name="Thumbnail Style", items=(("PRIVATE", "Private", ""), ("PUBLIC", "Public", "")), @@ -1187,13 +1248,17 @@ class BlenderKitAddonSearchProps(PropertyGroup, BlenderKitCommonSearchProps): description="Show only addons that are already installed in Blender", default=False, update=lambda self, context: ( - search.refresh_search() + search.search_update(self, context) if context.window_manager.blenderkitUI.asset_type == "ADDON" else None ), ) +class BlenderKitAuthorSearchProps(PropertyGroup, BlenderKitCommonSearchProps): + pass + + class BlenderKitHDRUploadProps(PropertyGroup, BlenderKitCommonUploadProps): texture_resolution_max: IntProperty( name="Texture Resolution Max", @@ -1207,6 +1272,15 @@ class BlenderKitHDRUploadProps(PropertyGroup, BlenderKitCommonUploadProps): class BlenderKitBrushUploadProps(PropertyGroup, BlenderKitCommonUploadProps): + thumbnail: StringProperty( + name="Thumbnail", + description="Thumbnail path - at least 1024x1024 .jpg or .png", + subtype="FILE_PATH", + default="", + update=autothumb.update_upload_brush_preview, + **EXTRA_PATH_OPTIONS, + ) + mode: EnumProperty( name="Mode", items=( @@ -1526,6 +1600,13 @@ class BlenderKitModelUploadProps(PropertyGroup, BlenderKitCommonUploadProps): update=autothumb.update_upload_model_preview, ) + is_generating_wire_thumbnail: BoolProperty( + name="Generating Wire Thumbnail", + description="True when background process is running", + default=False, + update=autothumb.update_wire_thumbnail_preview, + ) + has_autotags: BoolProperty( name="Has Autotagging Done", description="True when autotagging done", @@ -1546,6 +1627,26 @@ class BlenderKitModelUploadProps(PropertyGroup, BlenderKitCommonUploadProps): default=False, ) + wire_thumbnail: StringProperty( + name="Wireframe Thumbnail", + description="Wireframe thumbnail (JPG or PNG, preferred size is 1024x1024 or higher)", + subtype="FILE_PATH", + default="", + update=autothumb.update_wire_thumbnail_preview, + **EXTRA_PATH_OPTIONS, + ) + wire_thumbnail_will_upload_on_website: BoolProperty( + name="I will upload wireframe thumbnail on website", + description="True if the wireframe thumbnail will upload on the website\n please read upload tutorial for more information", + default=False, + ) + + wire_thumbnail_generating_state: StringProperty( + name="Wire Thumbnail Generating State", + description="bg process reports for wireframe thumbnail generation", + default="Please add wireframe thumbnail (jpg or png, at least 1024x1024)", + ) + class BlenderKitSceneUploadProps(PropertyGroup, BlenderKitCommonUploadProps): style: EnumProperty( @@ -1923,6 +2024,14 @@ class BlenderKitHDRSearchProps(PropertyGroup, BlenderKitCommonSearchProps): ) +def our_keymap_draw(self, context): + try: + keymap_utils.draw_keymap(self, context) + except Exception: + bk_logger.exception("Failed to draw keymap in preferences") + return + + class BlenderKitSceneSearchProps(PropertyGroup, BlenderKitCommonSearchProps): search_style: EnumProperty( name="Style", @@ -2090,6 +2199,12 @@ class BlenderKitAddonPreferences(AddonPreferences): default=True, ) + assetbar_follows_cursor: BoolProperty( + name="Assetbar follows active viewport", + description="Make the assetbar follow the cursor across the screen", + default=False, + ) + global_dir: StringProperty( name="Global Directory", description="Global storage for your assets, will use subdirectories for the contents. Client will place its files in subdirectory 'client'", @@ -2151,6 +2266,13 @@ class BlenderKitAddonPreferences(AddonPreferences): update=update_unpack, ) + write_asset_metadata: BoolProperty( + name="Write Asset Metadata", + description="Write BlenderKit metadata into downloaded files so tags, description, and preview show in other scenes", + default=True, + update=utils.save_prefs, + ) + # resolution download/import settings resolution: EnumProperty( name="Max resolution", @@ -2317,6 +2439,13 @@ In this case you should also set path to your system CA bundle containing proxy' update=utils.save_prefs, ) + thumbnail_disable_subdivision: BoolProperty( + name="Disable Subdivision for Thumbnails Rendering (For assets upload)", + description="By default this is off. Disable this for wireframe thumbnails to render faster", + default=False, + update=utils.save_prefs, + ) + maximized_assetbar_rows: IntProperty( name="Maximized Assetbar Rows", description="Maximum rows of assetbar in the 3D view when expanded", @@ -2334,8 +2463,8 @@ In this case you should also set path to your system CA bundle containing proxy' thumb_size: IntProperty( name="Assetbar Thumbnail Size", - default=96, - min=-1, + default=128, + min=48, # must newer be zero max=256, update=utils.save_prefs, description="Size of thumbnails of the assetbar in 3D view", @@ -2352,7 +2481,21 @@ In this case you should also set path to your system CA bundle containing proxy' experimental_features: BoolProperty( name="Enable experimental features", - description="Enable experimental features of BlenderKit. Note: There are no experimental features in this version.", + description="Enable experimental features of BlenderKit, such as the Authors tab", + default=False, + update=utils.save_prefs, + ) + + author_tab: BoolProperty( + name="Show Authors tab", + description="Show Authors tab in the assetbar. This tab allows you to see all assets of a specific author and is also used for showing your profile and assets", + default=False, + update=utils.save_prefs, + ) + + author_asset_type_picker: BoolProperty( + name="Author asset type picker", + description="Enable the Authors tab in the asset type picker. When disabled, clicking an author searches in the current tab", default=False, update=utils.save_prefs, ) @@ -2458,22 +2601,45 @@ In this case you should also set path to your system CA bundle containing proxy' options={"SKIP_SAVE"}, ) + enable_wire_thumbnail_upload: BoolProperty( + name="Enable wire thumbnail upload", + description="If enabled, wireframe thumbnails will be uploaded.", + default=False, + # do not save prefs here, it's experimental + options={"SKIP_SAVE"}, + ) + def draw(self, context): layout = self.layout + login_box = layout.box() + login_box.label(text="Login Options") if self.api_key.strip() == "": - ui_panels.draw_login_buttons(layout) - layout.label( + ui_panels.draw_login_buttons(login_box) + login_box.label( text="Sign up to bookmark your favorite assets. Get 200 MiB of private storage in Free Plan." ) else: - layout.operator("wm.blenderkit_logout", text="Logout", icon="URL") - layout.prop(self, "api_key", text="Your API Key") - layout.prop(self, "keep_preferences") - community_row = layout.row() + login_box.operator("wm.blenderkit_logout", text="Logout", icon="URL") + login_box.prop(self, "api_key", text="Your API Key") + login_box.prop(self, "keep_preferences") + community_row = login_box.row() community_row.prop(self, "experimental_features") community_row.operator("wm.blenderkit_join_discord", icon="URL") + if utils.profile_is_validator(): - layout.prop(self, "categories_fix") + validator_box = layout.box() + validator_box.label(text="Validator Settings") + validator_box.prop(self, "categories_fix") + + # REPORT PATHS + report_settings = layout.box() + report_settings.label(text="Report a Bug") + report_settings.label( + text="Create an issue report with version information to help us resolve the issue faster.", + ) + report_settings.operator( + "wm.blenderkit_report_bug", text="Submit Full Bug Report", icon="ERROR" + ) # FILE PATHS locations_settings = layout.box() @@ -2484,6 +2650,7 @@ In this case you should also set path to your system CA bundle containing proxy' if self.directory_behaviour in ("BOTH", "LOCAL"): locations_settings.prop(self, "project_subdir") locations_settings.prop(self, "unpack_files") + locations_settings.prop(self, "write_asset_metadata") # GUI SETTINGS gui_settings = layout.box() @@ -2498,6 +2665,7 @@ In this case you should also set path to your system CA bundle containing proxy' gui_settings.prop(self, "show_VIEW3D_MT_blenderkit_model_properties") gui_settings.prop(self, "tips_on_start") gui_settings.prop(self, "announcements_on_start") + gui_settings.prop(self, "assetbar_follows_cursor") gui_settings.prop(self, "use_clipboard_scan") # NETWORKING SETTINGS @@ -2516,16 +2684,11 @@ In this case you should also set path to your system CA bundle containing proxy' # UPDATER SETTINGS addon_updater_ops.update_settings_ui(self, context) - # EXPERIMENTAL SETTINGS - # only if experimental features enabled - if self.experimental_features: - experimental_settings = layout.box() - experimental_settings.alignment = "EXPAND" - experimental_settings.label(text="Experimental settings") - experimental_settings.prop(self, "ignore_env_for_thumbnails") - # RUNTIME INFO - globdir_op = layout.operator( + directory_box = layout.box() + directory_box.label(text="Directories and Paths") + + globdir_op = directory_box.operator( "wm.blenderkit_open_global_directory", text=f"Global directory: {self.global_dir}", icon="FILE_FOLDER", @@ -2533,7 +2696,7 @@ In this case you should also set path to your system CA bundle containing proxy' globdir_op.directory = self.global_dir clientlog_path = client_lib.get_client_log_path() - clientlog_op = layout.operator( + clientlog_op = directory_box.operator( "wm.blenderkit_open_client_log", text=f"Client log: {clientlog_path}", icon="FILE_FOLDER", @@ -2541,7 +2704,7 @@ In this case you should also set path to your system CA bundle containing proxy' clientlog_op.directory = clientlog_path addondir = path.dirname(__file__) - addondir_op = layout.operator( + addondir_op = directory_box.operator( "wm.blenderkit_open_addon_directory", text=f"Installed at: {addondir}", icon="FILE_FOLDER", @@ -2549,13 +2712,27 @@ In this case you should also set path to your system CA bundle containing proxy' addondir_op.directory = addondir tempdir = paths.get_temp_dir() - tempdir_op = layout.operator( + tempdir_op = directory_box.operator( "wm.blenderkit_open_temp_directory", text=f"Temp directory: {tempdir}", icon="FILE_FOLDER", ) tempdir_op.directory = tempdir + # try to draw also custom keymaps + our_keymap_draw(self, context) + + # EXPERIMENTAL SETTINGS + # only if experimental features enabled + if self.experimental_features: + experimental_settings = layout.box() + experimental_settings.alignment = "EXPAND" + experimental_settings.label(text="Experimental settings") + experimental_settings.prop(self, "author_tab") + experimental_settings.prop(self, "author_asset_type_picker") + experimental_settings.prop(self, "ignore_env_for_thumbnails") + # experimental_settings.prop(self, "enable_wire_thumbnail_upload") + # registration classes = ( @@ -2574,6 +2751,7 @@ classes = ( BlenderKitGeoToolSearchProps, BlenderKitNodeGroupUploadProps, BlenderKitAddonSearchProps, + BlenderKitAuthorSearchProps, ) @@ -2582,6 +2760,9 @@ def register(): global_vars.VERSION = VERSION bpy.utils.register_class(BlenderKitAddonPreferences) + # Drop any downloads that might have been left running if the add-on was re-enabled mid-transfer. + download.cancel_running_downloads("addon register") + addon_updater_ops.register({"version": VERSION}) for cls in classes: bpy.utils.register_class(cls) @@ -2643,9 +2824,13 @@ def register(): bpy.types.WindowManager.blenderkit_addon = PointerProperty( type=BlenderKitAddonSearchProps ) + bpy.types.WindowManager.blenderkit_author = PointerProperty( + type=BlenderKitAuthorSearchProps + ) if bpy.app.factory_startup is False: user_preferences = bpy.context.preferences.addons[__package__].preferences global_vars.PREFS = utils.get_preferences_as_dict() + paths.ensure_asset_library_path(user_preferences.global_dir) client_lib.reorder_ports(user_preferences.client_port) timer.update_trusted_CA_certs(user_preferences.trusted_ca_certs) @@ -2694,6 +2879,8 @@ def register(): def unregister(): bk_logger.info("Unregistering BlenderKit add-on") + # Stop any in-flight downloads to avoid leaving stale UI state when disabling the add-on. + download.cancel_running_downloads("addon unregister") timer.unregister_timers() ui_panels.unregister_ui_panels() ui.unregister_ui() @@ -2726,6 +2913,8 @@ def unregister(): del bpy.types.WindowManager.blenderkit_brush del bpy.types.WindowManager.blenderkit_mat del bpy.types.WindowManager.blenderkit_nodegroup + del bpy.types.WindowManager.blenderkit_addon + del bpy.types.WindowManager.blenderkit_author del bpy.types.Scene.blenderkit del bpy.types.Object.blenderkit diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/_bandit.yaml b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/_bandit.yaml deleted file mode 100644 index df2aeba..0000000 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/_bandit.yaml +++ /dev/null @@ -1,12 +0,0 @@ -include: - - "**/*.py" - -exclude_dirs: - - "tests" - - ".venv" - - "__pycache__" - -skips: - - "B404" # https://bandit.readthedocs.io/en/1.7.10/blacklists/blacklist_imports.html#b404-import-subprocess - - "B603" # https://bandit.readthedocs.io/en/1.7.10/plugins/b603_subprocess_without_shell_equals_true.html - - "B608" # https://bandit.readthedocs.io/en/1.7.10/plugins/b608_hardcoded_sql_expressions.html diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/addon_updater.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/addon_updater.py index 7612eef..d08675b 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/addon_updater.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/addon_updater.py @@ -29,6 +29,7 @@ import fnmatch import json import os import platform +import logging import shutil import ssl import threading @@ -43,6 +44,10 @@ import addon_utils # Blender imports, used in limited cases. import bpy +from . import tasks_queue + + +bk_logger = logging.getLogger(__name__) # ----------------------------------------------------------------------------- # The main class @@ -134,15 +139,15 @@ class SingletonUpdater: self._select_link = select_link_function def print_trace(self): - """Print handled exception details when use_print_traces is set""" + """Logs handled exception details when use_print_traces is set""" if self._use_print_traces: - traceback.print_exc() + bk_logger.error("%s", traceback.format_exc()) def print_verbose(self, msg): - """Print out a verbose logging message if verbose is true.""" + """Logs verbose messages if verbose is true.""" if not self._verbose: return - print("🔄 {}: ".format(self.addon) + msg) + bk_logger.info("%s", msg) # ------------------------------------------------------------------------- # Getters and setters @@ -177,7 +182,7 @@ class SingletonUpdater: def auto_reload_post_update(self, value): try: self._auto_reload_post_update = bool(value) - except: + except Exception: raise ValueError("auto_reload_post_update must be a boolean value") @property @@ -227,7 +232,7 @@ class SingletonUpdater: elif type(tuple_values) is not tuple: try: tuple(tuple_values) - except: + except Exception: raise ValueError("current_version must be a tuple of integers") for i in tuple_values: if type(i) is not int: @@ -277,7 +282,7 @@ class SingletonUpdater: def include_branch_auto_check(self, value): try: self._include_branch_auto_check = bool(value) - except: + except Exception: raise ValueError("include_branch_autocheck must be a boolean") @property @@ -295,7 +300,7 @@ class SingletonUpdater: ) else: self._include_branch_list = value - except: + except Exception: raise ValueError("include_branch_list should be a list of valid branches") @property @@ -306,7 +311,7 @@ class SingletonUpdater: def include_branches(self, value): try: self._include_branches = bool(value) - except: + except Exception: raise ValueError("include_branches must be a boolean value") @property @@ -329,7 +334,7 @@ class SingletonUpdater: def manual_only(self, value): try: self._manual_only = bool(value) - except: + except Exception: raise ValueError("manual_only must be a boolean value") @property @@ -377,7 +382,7 @@ class SingletonUpdater: def repo(self, value): try: self._repo = str(value) - except: + except Exception: raise ValueError("repo must be a string value") @property @@ -404,8 +409,8 @@ class SingletonUpdater: elif value is not None and not os.path.exists(value): try: os.makedirs(value) - except: - self.print_verbose("Error trying to staging path") + except Exception: + self.print_verbose("Error trying to create staging path") self.print_trace() return self._updater_path = value @@ -453,7 +458,7 @@ class SingletonUpdater: def use_releases(self, value): try: self._use_releases = bool(value) - except: + except Exception: raise ValueError("use_releases must be a boolean value") @property @@ -464,7 +469,7 @@ class SingletonUpdater: def user(self, value): try: self._user = str(value) - except: + except Exception: raise ValueError("User must be a string value") @property @@ -476,7 +481,7 @@ class SingletonUpdater: try: self._verbose = bool(value) self.print_verbose("Verbose is enabled") - except: + except Exception: raise ValueError("Verbose must be a boolean value") @property @@ -487,7 +492,7 @@ class SingletonUpdater: def use_print_traces(self, value): try: self._use_print_traces = bool(value) - except: + except Exception: raise ValueError("use_print_traces must be a boolean value") @property @@ -687,7 +692,7 @@ class SingletonUpdater: request = urllib.request.Request(url) try: context = ssl._create_unverified_context() - except: + except Exception: # Some blender packaged python versions don't have this, largely # useful for local network setups otherwise minimal impact. context = None @@ -712,24 +717,24 @@ class SingletonUpdater: if str(e.code) == "403": self._error = "HTTP error (access denied)" self._error_msg = str(e.code) + " - server error response" - print(self._error, self._error_msg) + bk_logger.error("%s %s", self._error, self._error_msg) else: self._error = "HTTP error" self._error_msg = str(e.code) - print(self._error, self._error_msg) - self.print_trace() + bk_logger.error("%s %s", self._error, self._error_msg) + # self.print_trace() self._update_ready = None except urllib.error.URLError as e: reason = str(e.reason) if "TLSV1_ALERT" in reason or "SSL" in reason.upper(): self._error = "Connection rejected, download manually" self._error_msg = reason - print(self._error, self._error_msg) + bk_logger.error("%s %s", self._error, self._error_msg) else: self._error = "URL error, check internet connection" self._error_msg = reason - print(self._error, self._error_msg) - self.print_trace() + bk_logger.error("%s %s", self._error, self._error_msg) + # self.print_trace() self._update_ready = None return None else: @@ -748,7 +753,7 @@ class SingletonUpdater: self._error = "API response has invalid JSON format" self._error_msg = str(e.reason) self._update_ready = None - print(self._error, self._error_msg) + bk_logger.error("%s %s", self._error, self._error_msg) self.print_trace() return None else: @@ -766,13 +771,13 @@ class SingletonUpdater: try: shutil.rmtree(local) os.makedirs(local) - except: + except Exception: error = "failed to remove existing staging directory" self.print_trace() else: try: os.makedirs(local) - except: + except Exception: error = "failed to create staging directory" self.print_trace() @@ -811,8 +816,8 @@ class SingletonUpdater: except Exception as e: self._error = "Error retrieving download, bad link?" self._error_msg = "Error: {}".format(e) - print("Error retrieving download, bad link?") - print("Error: {}".format(e)) + bk_logger.error("Error retrieving download, bad link?") + bk_logger.error("Error: %s", e) self.print_trace() return False @@ -829,7 +834,7 @@ class SingletonUpdater: if os.path.isdir(local): try: shutil.rmtree(local) - except: + except Exception: self.print_verbose( "Failed to removed previous backup folder, continuing" ) @@ -840,7 +845,7 @@ class SingletonUpdater: if os.path.isdir(tempdest): try: shutil.rmtree(tempdest) - except: + except Exception: self.print_verbose("Failed to remove existing temp folder, continuing") self.print_trace() @@ -852,15 +857,15 @@ class SingletonUpdater: tempdest, ignore=shutil.ignore_patterns(*self._backup_ignore_patterns), ) - except: - print("Failed to create backup, still attempting update.") + except Exception: + self.print_verbose("Failed to create backup, still attempting update.") self.print_trace() return else: try: shutil.copytree(self._addon_root, tempdest) - except: - print("Failed to create backup, still attempting update.") + except Exception: + self.print_verbose("Failed to create backup, still attempting update.") self.print_trace() return shutil.move(tempdest, local) @@ -906,23 +911,23 @@ class SingletonUpdater: try: shutil.rmtree(outdir) self.print_verbose("Source folder cleared") - except: + except Exception: + self.print_verbose("Error occurred while clearing extract dir") self.print_trace() # Create parent directories if needed, would not be relevant unless # installing addon into another location or via an addon manager. try: os.mkdir(outdir) - except Exception as err: - print("Error occurred while making extract dir:") - print(str(err)) + except Exception: + self.print_verbose("Error occurred while making extract dir") self.print_trace() self._error = "Install failed" self._error_msg = "Failed to make extract directory" return -1 if not os.path.isdir(outdir): - print("Failed to create source directory") + bk_logger.error("Failed to create source directory") self._error = "Install failed" self._error_msg = "Failed to create extract directory" return -1 @@ -972,7 +977,7 @@ class SingletonUpdater: if not os.path.isdir(unpath): self._error = "Install failed" self._error_msg = "Extracted path does not exist" - print("Extracted path does not exist: ", unpath) + bk_logger.error("Extracted path does not exist: %s", unpath) return -1 if self._subfolder_path: @@ -991,9 +996,8 @@ class SingletonUpdater: # Smarter check for additional sub folders for a single folder # containing the __init__.py file. if not os.path.isfile(os.path.join(unpath, "__init__.py")): - print("Not a valid addon found") - print("Paths:") - print(dirlist) + bk_logger.error("Not a valid addon found") + bk_logger.error("Paths: %s", dirlist) self._error = "Install failed" self._error_msg = "No __init__ file found in new source" return -1 @@ -1052,8 +1056,10 @@ class SingletonUpdater: self.print_verbose( "Clean removing file {}".format(os.path.join(base, f)) ) - except Exception as e: - print(f"Error removing file {os.path.join(base, f)}: {e}") + except Exception: + bk_logger.exception( + "Error removing file %s:", os.path.join(base, f) + ) for f in folders: if os.path.join(base, f) is self._updater_path: continue @@ -1064,12 +1070,14 @@ class SingletonUpdater: os.path.join(base, f) ) ) - except Exception as e: - print(f"Error removing folder {os.path.join(base, f)}: {e}") + except Exception: + bk_logger.exception( + "Error removing folder %s:", os.path.join(base, f) + ) - except Exception as err: + except Exception: error = "failed to create clean existing addon folder" - print(error, str(err)) + self.print_verbose(error) self.print_trace() # Walk through the base addon folder for rules on pre-removing @@ -1087,7 +1095,7 @@ class SingletonUpdater: os.remove(fl) self.print_verbose("Pre-removed file " + file) except OSError: - print("Failed to pre-remove " + file) + self.print_verbose("Failed to pre-remove " + file) self.print_trace() # Walk through the temp addon sub folder for replacements @@ -1134,13 +1142,13 @@ class SingletonUpdater: # File did not previously exist, simply move it over. os.rename(srcFile, dest_file) self.print_verbose("New file " + os.path.basename(dest_file)) - except Exception as e: - print(f"Error replacing file {file}: {e}") + except Exception: + bk_logger.exception("Error replacing file %s:", file) # now remove the temp staging folder and downloaded zip try: shutil.rmtree(staging_path) - except: + except Exception: error = ( "Error: Failed to remove existing staging directory, " "consider manually removing " @@ -1152,7 +1160,7 @@ class SingletonUpdater: # if post_update false, skip this function # else, unload/reload addon & trigger popup if not self._auto_reload_post_update: - print("Restart blender to reload addon and complete update") + bk_logger.info("Restart blender to reload addon and complete update") return self.print_verbose("Reloading addon...") @@ -1165,12 +1173,12 @@ class SingletonUpdater: bpy.ops.wm.addon_disable(module=self._addon_package) bpy.ops.wm.addon_refresh() bpy.ops.wm.addon_enable(module=self._addon_package) - print("2.7 reload complete") + bk_logger.info("2.7 reload complete") else: # 2.8 bpy.ops.preferences.addon_disable(module=self._addon_package) bpy.ops.preferences.addon_refresh() bpy.ops.preferences.addon_enable(module=self._addon_package) - print("2.8 reload complete") + bk_logger.info("2.8 reload complete") # ------------------------------------------------------------------------- # Other non-api functions and setups @@ -1190,10 +1198,10 @@ class SingletonUpdater: while 1: data = url_file.read(chunk) if not data: - # print("done.") + # bk_logger.info("done.") break f.write(data) - # print("Read %s bytes" % len(data)) + # bk_logger.info("Read %s bytes" % len(data)) f.close() def version_tuple_from_text(self, text): @@ -1249,7 +1257,9 @@ class SingletonUpdater: self.print_verbose("Skipping async check, already started") # already running the bg thread elif self._update_ready is None: - print("{} updater: Running background check for update".format(self.addon)) + bk_logger.info( + "%s updater: Running background check for update", self.addon + ) self.start_async_check_update(False, callback) def check_for_update_now(self, callback=None): @@ -1266,7 +1276,7 @@ class SingletonUpdater: self.start_async_check_update(True, callback) def check_for_update(self, now=False): - """Check for update not in a syncrhonous manner. + """Check for update not in a synchronous manner. This function is not async, will always return in sequential fashion but should have a parent which calls it in another thread. @@ -1449,7 +1459,7 @@ class SingletonUpdater: res = self.stage_repository(self._update_link) if not res: - print("Error in staging repository: " + str(res)) + bk_logger.error("Error in staging repository: %s", str(res)) if callback is not None: callback(self._addon_package, self._error_msg) return self._error_msg @@ -1467,7 +1477,7 @@ class SingletonUpdater: res = self.stage_repository(self._update_link) if not res: - print("Error in staging repository: " + str(res)) + bk_logger.error("Error in staging repository: %s", str(res)) if callback: callback(self._addon_package, self._error_msg) return self._error_msg @@ -1525,9 +1535,11 @@ class SingletonUpdater: os.rename(old_json_path, json_path) except FileNotFoundError: pass - except Exception as err: - print("Other OS error occurred while trying to rename old JSON") - print(err) + except Exception: + self.print_verbose( + "Other OS error occurred while trying to rename old JSON" + ) + self.print_trace() return json_path @@ -1571,7 +1583,7 @@ class SingletonUpdater: jpath = self.get_json_path() if not os.path.isdir(os.path.dirname(jpath)): - print( + bk_logger.error( "State error: Directory does not exist, cannot save json: ", os.path.basename(jpath), ) @@ -1580,8 +1592,9 @@ class SingletonUpdater: with open(jpath, "w") as outf: data_out = json.dumps(self._json, indent=4) outf.write(data_out) - except: - print("Failed to open/save data to json: ", jpath) + self.print_verbose(f"Wrote updater JSON settings to file: {jpath}") + except Exception: + self.print_verbose(f"Failed to open/save data to json: {jpath}") self.print_trace() self.print_verbose("Wrote out updater JSON settings with content:") self.print_verbose(str(self._json)) @@ -1630,8 +1643,7 @@ class SingletonUpdater: try: self.check_for_update(now=now) except Exception as exception: - print("Checking for update error:") - print(exception) + self.print_verbose(f"Checking for update error: {exception}") self.print_trace() if not self._error: self._update_ready = False @@ -1644,8 +1656,11 @@ class SingletonUpdater: self._check_thread = None if callback: - self.print_verbose("Finished check update, doing callback") - callback(self._update_ready) + self.print_verbose( + "Finished check update, queueing callback on main thread" + ) + # Run the callback on Blender's main thread to avoid bpy access from a background thread. + tasks_queue.add_task((callback, (self._update_ready,)), wait=0) self.print_verbose("BG thread: Finished check update, no callback") def stop_async_check_update(self): diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/addon_updater_ops.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/addon_updater_ops.py index e1733e0..d6f095e 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/addon_updater_ops.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/addon_updater_ops.py @@ -24,11 +24,14 @@ Implements draw calls, popups, and operators that use the addon_updater. import os import traceback +import logging import bpy from bpy.app.handlers import persistent -from . import client_lib +from . import client_lib, utils + +bk_logger = logging.getLogger(__name__) # Safely import the updater. @@ -37,9 +40,9 @@ from . import client_lib try: from .addon_updater import Updater as updater except Exception as e: - print("ERROR INITIALIZING UPDATER") - print(str(e)) - traceback.print_exc() + bk_logger.error("ERROR INITIALIZING UPDATER") + bk_logger.error(str(e)) + bk_logger.error("%s", traceback.format_exc()) class SingletonUpdaterNone(object): """Fake, bare minimum fields and functions for the updater object.""" @@ -175,6 +178,10 @@ class AddonUpdaterInstallPopup(bpy.types.Operator): return True def invoke(self, context, event): + # Skip opening the popup when we already know there is nothing to show. + if not updater.invalid_updater and updater.update_ready is False: + updater.print_verbose("No update available; skipping popup") + return {"CANCELLED"} return context.window_manager.invoke_props_dialog(self) def draw(self, context): @@ -229,9 +236,9 @@ class AddonUpdaterInstallPopup(bpy.types.Operator): # Should return 0, if not something happened. if updater.verbose: if res == 0: - print("Updater returned successful") + bk_logger.info("Updater returned successful") else: - print("Updater returned {}, error occurred".format(res)) + bk_logger.info("Updater returned {}, error occurred".format(res)) elif updater.update_ready is None: _ = updater.check_for_update(now=True) @@ -322,9 +329,9 @@ class AddonUpdaterUpdateNow(bpy.types.Operator): # Should return 0, if not something happened. if updater.verbose: if res == 0: - print("Updater returned successful") + bk_logger.info("Updater returned successful") else: - print("Updater error response: {}".format(res)) + bk_logger.info("Updater error response: {}".format(res)) except Exception as expt: updater._error = "Error trying to run update" updater._error_msg = str(expt) @@ -450,7 +457,7 @@ class AddonUpdaterInstallManually(bpy.types.Operator): layout.label(text="Updater error") return - # Display error if a prior autoamted install failed. + # Display error if a prior automated install failed. if self.error != "": col = layout.column() col.scale_y = 0.7 @@ -692,7 +699,7 @@ def updater_run_install_popup_handler(scene): updater_run_install_popup_handler ) except Exception as e: - print(e) + bk_logger.error("%s", e) pass if "ignore" in updater.json and updater.json["ignore"]: @@ -833,8 +840,8 @@ def check_for_update_nonthreaded(self, context): settings = get_user_preferences(bpy.context) if not settings: if updater.verbose: - print( - "Could not get {} preferences, update check skipped".format(__package__) + bk_logger.info( + "Could not get %s preferences, update check skipped", __package__ ) return updater.set_check_interval( @@ -1128,6 +1135,15 @@ def update_settings_ui(self, context, element=None): else: row.label(text="Last update check: Never") + version_row = box.row() + version_row.label( + text=f"BlenderKit v{utils.get_addon_version()} · Blender {bpy.app.version_string}", + icon="INFO", + ) + version_row.operator( + "wm.blenderkit_copy_environment_info", text="Copy Info", icon="COPYDOWN" + ) + def update_settings_ui_condensed(self, context, element=None): """Preferences - Condensed drawing within preferences. @@ -1359,7 +1375,7 @@ def register(bl_info): """Registering the operators in this module""" # Safer failure in case of issue loading module. if updater.error: - print("Exiting updater registration, " + updater.error) + bk_logger.error("Exiting updater registration, %s", updater.error) return updater.clear_state() # Clear internal vars, avoids reloading oddities. diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/append_link.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/append_link.py index acfe777..c5232c7 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/append_link.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/append_link.py @@ -299,7 +299,7 @@ def append_material(file_name, matname=None, link=False, fake_user=True): ) except Exception as e: - bk_logger.error(f"{e} - failed to open the asset file") + bk_logger.error("%s - failed to open the asset file", e) # we have to find the new material , due to possible name changes mat = None for m in bpy.data.materials: @@ -532,7 +532,7 @@ def append_particle_system( total_max_threshold = 2000000 # emitting too many parent particles just kills blender now. - # this part tuned child count, we'll leave children to artists only. + # this part tuned child count, we'll leave children to authors only. # if count > total_max_threshold: # ratio = round(count / total_max_threshold) # @@ -621,14 +621,18 @@ def append_objects( return_obs = [] to_hidden_collection = [] + hidden_objects = [] appended_collection = None main_object = None - # get first at least one parent for sure + # first get at least one parent for sure for ob in bpy.context.scene.objects: # type: ignore[union-attr] - if ob.select_get(): - if not ob.parent: - main_object = ob - ob.location = location + if ob.select_get() and not ob.parent: + main_object = ob + ob.location = location + if ( + ob.hide_viewport or ob.hide_render + ): # saved assets only retain hide render state + hidden_objects.append(ob) # do once again to ensure hidden objects are hidden for ob in bpy.context.scene.objects: # type: ignore[union-attr] if ob.select_get(): @@ -654,7 +658,7 @@ def append_objects( main_object.matrix_world.translation = location # move objects that should be hidden to a sub collection - if len(to_hidden_collection) > 0 and appended_collection is not None: + if to_hidden_collection and appended_collection is not None: hidden_collections = [] scene_collection = bpy.context.scene.collection # type: ignore[union-attr] for ob in to_hidden_collection: @@ -682,7 +686,7 @@ def append_objects( if hide_collection in hidden_collections: continue # All other collections are moved to be children of the model collection - bk_logger.info(f"{hide_collection}, {appended_collection}") + bk_logger.info("%s, %s", hide_collection, appended_collection) # If target collection is specified, move collections there instead if collection and bpy.data.collections.get(collection): utils.move_collection( @@ -707,6 +711,12 @@ def append_objects( if orig_active_collection: bpy.context.view_layer.active_layer_collection = orig_active_collection # type: ignore[union-attr] + if hidden_objects: + # only unique objects + hidden_objects = list(set(hidden_objects)) + for ob in hidden_objects: + ob.hide_set(True) + utils.selection_set(sel) # let collection also store info that it was created by BlenderKit, for purging reasons @@ -753,16 +763,18 @@ def append_objects( obj.select_set(True) # we need to unhide object so make_local op can use those too. if link == True: - if obj.hide_viewport: + if ( + obj.hide_viewport or obj.hide_render + ): # saved assets only retain hide render state hidden_objects.append(obj) - obj.hide_viewport = False + obj.hide_set(False) return_obs.append(obj) # Only after all objects are in scene! Otherwise gets broken relationships if link == True: bpy.ops.object.make_local(type="SELECT_OBJECT") for ob in hidden_objects: - ob.hide_viewport = True + ob.hide_set(True) if kwargs.get("rotation") is not None: main_object.rotation_euler = kwargs["rotation"] # type: ignore[union-attr] diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/asset_bar_op.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/asset_bar_op.py index f658e05..c640c01 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/asset_bar_op.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/asset_bar_op.py @@ -21,7 +21,10 @@ import math import os import re import time -from typing import Any, Dict, Union +from functools import partial +from collections import Counter +from types import SimpleNamespace +from typing import Any, Dict, Optional, Union import bpy from bpy.props import BoolProperty, StringProperty @@ -34,38 +37,68 @@ from . import ( ratings_utils, search, ui, + ui_bgl, ui_panels, utils, + viewport_utils, ) from .bl_ui_widgets.bl_ui_button import BL_UI_Button from .bl_ui_widgets.bl_ui_drag_panel import BL_UI_Drag_Panel from .bl_ui_widgets.bl_ui_draw_op import BL_UI_OT_draw_operator from .bl_ui_widgets.bl_ui_image import BL_UI_Image -from .bl_ui_widgets.bl_ui_label import BL_UI_Label +from .bl_ui_widgets.bl_ui_label import BL_UI_Label, BL_UI_DuoLabel from .bl_ui_widgets.bl_ui_widget import BL_UI_Widget - bk_logger = logging.getLogger(__name__) +# Maximum label length for manufacturer chips (e.g. "Ford motor company") +MAX_MANUFACTURER_LABEL_LEN = 17 +# Maximum label length for generic active filter chips (term + value) +MAX_FILTER_LABEL_LEN = 24 + +THUMBNAIL_TYPES = [ + "THUMBNAIL", + "PHOTO", + "WIREFRAME", +] + active_area_pointer = 0 +ROUNDING_RADIUS = 20 + +TOOLTIP_SIZE_PX = 512 + def get_area_height(self): - if type(self.context) != dict: - if self.context is None: - self.context = bpy.context - self.context = self.context.copy() - if self.context.get("area") is not None: - return self.context["area"].height - # else: - # maxw, maxa, region = utils.get_largest_area() - # if maxa: - # self.context['area'] = maxa - # self.context['window'] = maxw - # self.context['region'] = region - # self.update(self.x,self.y) - # - # return self.context['area'].height + ctx = getattr(self, "context", None) + + if isinstance(ctx, dict): + ctx_dict = ctx + elif isinstance(ctx, SimpleNamespace): + ctx_dict = { + "window": getattr(ctx, "window", None), + "area": getattr(ctx, "area", None), + "region": getattr(ctx, "region", None), + } + else: + if ctx is None: + ctx = bpy.context + ctx_dict = { + "window": getattr(ctx, "window", None), + "area": getattr(ctx, "area", None), + "region": getattr(ctx, "region", None), + } + + self.context = ctx_dict + + region = ctx_dict.get("region") + if region is not None: + return region.height + + area = ctx_dict.get("area") + if area is not None: + return area.height + return 100 @@ -75,6 +108,11 @@ BL_UI_Widget.get_area_height = get_area_height # type: ignore[method-assign] def modal_inside(self, context, event): ui_props = bpy.context.window_manager.blenderkitUI + # Initialize mouse coordinates early so shortcut handling in the first modal + # events does not fail on fresh operators (Blender 3.0 lacks these attrs). + if not hasattr(self, "mouse_x") or not hasattr(self, "mouse_y"): + self.mouse_x, self.mouse_y = self._event_coords_in_active_region(event) + if ui_props.turn_off: ui_props.turn_off = False self.finish() @@ -83,6 +121,8 @@ def modal_inside(self, context, event): return {"FINISHED"} user_preferences = bpy.context.preferences.addons[__package__].preferences + if self.context: + context = self.context # HANDLE PHOTO THUMBNAIL SWITCH if hasattr(self, "needs_tooltip_update") and self.needs_tooltip_update: @@ -90,8 +130,8 @@ def modal_inside(self, context, event): sr = search.get_search_results() if sr and self.active_index < len(sr): asset_data = sr[self.active_index] - if asset_data["assetType"].lower() == "printable": - if self.show_photo_thumbnail: + if asset_data["assetType"].lower() in {"printable", "model", "scene"}: + if self.show_thumbnail_variant == "PHOTO": photo_img = ui.get_full_photo_thumbnail(asset_data) if photo_img: self.tooltip_image.set_image(photo_img.filepath) @@ -100,6 +140,15 @@ def modal_inside(self, context, event): self.tooltip_image.set_image( paths.get_addon_thumbnail_path("thumbnail_notready.jpg") ) + elif self.show_thumbnail_variant == "THUMBNAIL": + wire_img = ui.get_full_wire_thumbnail(asset_data) + if wire_img: + self.tooltip_image.set_image(wire_img.filepath) + self.tooltip_image.set_image_colorspace("") + else: + self.tooltip_image.set_image( + paths.get_addon_thumbnail_path("thumbnail_notready.jpg") + ) else: set_thumb_check( self.tooltip_image, asset_data, thumb_type="thumbnail" @@ -112,6 +161,19 @@ def modal_inside(self, context, event): bpy.ops.view3d.run_assetbar_fix_context(keep_running=True, do_search=False) return {"FINISHED"} + is_quad_view = self._is_quad_view(context) + if getattr(self, "_quad_view_state", None) != is_quad_view: + self._quad_view_state = is_quad_view + self.active_area_pointer = None # force refresh of area/region pointers + self.active_region_pointer = None + self.finish() + bpy.ops.view3d.run_assetbar_fix_context(keep_running=True, do_search=False) + return {"FINISHED"} + + # Update active viewport based on cursor location so the asset bar follows the + # region the user is interacting with. + self.update_active_view_from_cursor(context, event) + sr = search.get_search_results() if sr is not None: # this check runs more search, useful especially for first search. Could be moved to a better place where the check @@ -125,10 +187,16 @@ def modal_inside(self, context, event): if len(sr) - ui_props.scroll_offset < (ui_props.wcount * current_max_rows) + 15: self.search_more() + # Toggle overlay stats/text with animation playback + is_playing = getattr(bpy.context.screen, "is_animation_playing", False) + if is_playing != getattr(self, "_animation_playing", False): + self._animation_playing = is_playing + self._set_overlays(context, show=is_playing) + time_diff = time.time() - self.update_timer_start if time_diff > self.update_timer_limit: self.update_timer_start = time.time() - # self.update_buttons() + self.update_buttons() # progress bar # change - let's try to optimize and redraw only when needed @@ -195,7 +263,9 @@ def modal_inside(self, context, event): }[event.type] if tab_idx < len(global_vars.TABS["tabs"]): - bk_logger.info(f"Ctrl+{tab_idx+1} pressed - go to tab {tab_idx+1}") + bk_logger.info( + "Ctrl+%d pressed - go to tab %d", tab_idx + 1, tab_idx + 1 + ) self.switch_to_history_step( tab_idx, global_vars.TABS["tabs"][tab_idx]["history_index"] ) @@ -221,6 +291,12 @@ def modal_inside(self, context, event): return {"RUNNING_MODAL"} # ANY EVENT ACTIVATED = DON'T LET EVENTS THROUGH + # While asset drag operator is active, do not consume pointer events here. + # Otherwise the assetbar can starve the drag operator from MOUSEMOVE events, + # especially with multiple windows/monitors. + if ui_props.dragging: + return {"PASS_THROUGH"} + if self.handle_widget_events(event): return {"RUNNING_MODAL"} @@ -231,8 +307,7 @@ def modal_inside(self, context, event): # return {"FINISHED"} # we can jump out immediately - self.mouse_x = event.mouse_region_x - self.mouse_y = event.mouse_region_y + self.mouse_x, self.mouse_y = self._event_coords_in_active_region(event) # TRACKPAD SCROLL if event.type == "TRACKPADPAN" and self.panel.is_in_rect( @@ -283,9 +358,18 @@ def modal_inside(self, context, event): self.scroll_update() return {"RUNNING_MODAL"} - if self.check_ui_resized(context) or self.check_new_search_results(context): - self.update_assetbar_sizes(context) - self.update_assetbar_layout(context) + if self.check_ui_resized(context): + # Force a clean rebuild when the viewport size changes. + if not getattr(self, "_restart_pending", False): + self._restart_pending = True + ui_props = bpy.context.window_manager.blenderkitUI + ui_props.assetbar_on = False + ui_props.turn_off = True + self.restart_asset_bar() + return {"FINISHED"} + + if self.check_new_search_results(context) or self.check_region_changed(context): + self._refresh_layout(context) # also update tooltip visibility # if there's less results and active button is not visible, hide tooltip # happened only when e.g. running new search from web browser (copying assetbaseid to clipboard) @@ -338,38 +422,58 @@ def asset_bar_invoke(self, context, event): self.active_area_pointer = context.area.as_pointer() active_area_pointer = self.active_area_pointer self.active_region_pointer = context.region.as_pointer() + self.operator_area_pointer = self.active_area_pointer + self.operator_region_pointer = self.active_region_pointer + self._active_area_ref = context.area + self._active_region_ref = context.region return {"RUNNING_MODAL"} -# def set_mouse_down_right(self, mouse_down_right_func): -# self.mouse_down_right_func = mouse_down_right_func - - -# def mouse_down_right(self, x, y): -# if self.is_in_rect(x, y): -# self.__state = 1 -# try: -# self.mouse_down_right_func(self) -# except Exception as e: -# bk_logger.warning(f"{e}") - -# return True - -# return False - - -# BL_UI_Button.mouse_down_right = mouse_down_right # type: ignore[method-assign] -# BL_UI_Button.set_mouse_down_right = set_mouse_down_right # type: ignore[attr-defined] - asset_bar_operator = None +def get_author_tooltip_data(asset_data): + """Build tooltip_data for an author-type search result.""" + author_id = int(asset_data.get("id", asset_data.get("author", {}).get("id", 0))) + author = global_vars.BKIT_AUTHORS.get(author_id) + + display_name = asset_data.get("displayName", "") + about_me = "" + if author: + about_me = getattr(author, "aboutMe", "") or "" + # Fallback: get aboutMe directly from the author sub-object in the result + if not about_me: + about_me = asset_data.get("author", {}).get("aboutMe", "") or "" + + # Asset count from ratingsSum + ratings_sum = asset_data.get("ratingsSum", {}) + asset_count = ratings_sum.get("assetCount", 0) + + asset_data["tooltip_data"] = { + "aname": display_name, + "author_text": "", + "quality": "-", + "about_me": about_me, + "asset_count": asset_count, + "is_author": True, + "user_price_text": "", + "base_price_text": "", + "user_price_color": colors.WHITE, + "base_price_color": colors.WHITE, + "user_price_bg_color": colors.GRAY, + "base_price_bg_color": colors.GRAY, + } + + def get_tooltip_data(asset_data): tooltip_data = asset_data.get("tooltip_data") if tooltip_data is not None: return + if asset_data.get("assetType") == "author": + return get_author_tooltip_data(asset_data) + author_text = "" if global_vars.BKIT_AUTHORS: author_id = int(asset_data["author"]["id"]) @@ -378,7 +482,7 @@ def get_tooltip_data(asset_data): if len(author.firstName) > 0 or len(author.lastName) > 0: author_text = f"by {author.firstName} {author.lastName}" else: - bk_logger.warning(f"get_tooltip_data() AUTHOR NOT FOUND: {author_id}") + bk_logger.warning("get_tooltip_data() AUTHOR NOT FOUND: %s", author_id) aname = asset_data["displayName"] if len(aname) == 0: @@ -399,19 +503,14 @@ def get_tooltip_data(asset_data): quality = str(round(asset_data["ratingsAverage"].get("quality"))) # Add pricing information - price_text = "" - price_color = colors.WHITE - price_background = (0, 0, 0, 0) + base_price_text = "" + user_price_text = "" - def format_price(value): - if value is None: - return "" - value_str = str(value).strip() - if not value_str: - return "" - if value_str.startswith("$"): - return value_str - return f"${value_str}" + user_price_color = colors.WHITE + base_price_color = colors.WHITE + + user_price_bg_color = colors.GRAY + base_price_bg_color = colors.GRAY # Check if asset is free or paid (works for all asset types) is_free = asset_data.get("isFree", True) @@ -420,46 +519,84 @@ def get_tooltip_data(asset_data): if asset_data.get("assetType") == "addon": # Get pricing info from extensions cache. # Pricing info is shown only for add-ons. - base_price = format_price(asset_data.get("basePrice")) - user_price = format_price(asset_data.get("userPrice")) + base_price_text = asset_data.get("basePrice") + user_price_text = asset_data.get("userPrice") is_for_sale = asset_data.get("isForSale") + # for debug show both prices always if utils.profile_is_validator(): - segments = [] - if user_price: - segments.append(f"User {user_price}") - if base_price: - segments.append(f"Base {base_price}") - price_text = " | ".join(segments) - price_background = colors.PURPLE_PRICE + if ( + user_price_text + and base_price_text + and str(user_price_text) != str(base_price_text) + ): + # Sale: show discounted price + strikethrough original + user_price_text = f" ${user_price_text} " + user_price_color = colors.WHITE + user_price_bg_color = colors.PURPLE_PRICE - elif is_for_sale and not can_download and user_price and base_price: - price_text = f"{user_price} (was {base_price})" - price_background = colors.PURPLE_PRICE + base_price_text = f" ${base_price_text} " + base_price_color = colors.TEXT_DIM + base_price_bg_color = colors.PURPLE_PRICE + elif base_price_text: + # No sale or only base price available + base_price_text = f" ${base_price_text} " + base_price_color = colors.WHITE + base_price_bg_color = colors.PURPLE_PRICE - elif is_for_sale and not can_download and base_price: - price_text = base_price - price_background = colors.PURPLE_PRICE - - elif not is_free and not is_for_sale: - price_text = "Full Plan" - price_background = colors.ORANGE_FULL - - elif is_for_sale and can_download: - price_text = "Purchased" - price_background = colors.PURPLE_PRICE + user_price_text = "" + elif user_price_text: + user_price_text = f" ${user_price_text} " + user_price_color = colors.WHITE + user_price_bg_color = colors.PURPLE_PRICE + base_price_text = "" + else: + user_price_text = "" + base_price_text = "" else: - price_text = "Free" - price_background = colors.GREEN_PRICE + if is_for_sale and not can_download and user_price_text and base_price_text: + user_price_text = f" ${user_price_text} " + user_price_bg_color = colors.PURPLE_PRICE + user_price_color = colors.WHITE + + base_price_text = f" (${base_price_text}) " + base_price_bg_color = colors.PURPLE_PRICE + base_price_color = colors.TEXT_DIM + + elif is_for_sale and not can_download and base_price_text: + base_price_text = f" ${base_price_text} " + base_price_bg_color = colors.PURPLE_PRICE + base_price_color = colors.WHITE + + user_price_text = "" + + elif not is_free and not is_for_sale: + base_price_text = " Full Plan " + base_price_bg_color = colors.ORANGE_FULL + base_price_color = colors.WHITE + + user_price_text = "" + + elif is_for_sale and can_download: + # purchased, so we dont show price anymore + base_price_text = f" Purchased " + base_price_bg_color = colors.PURPLE_PRICE + base_price_color = colors.WHITE + + user_price_text = "" tooltip_data = { "aname": aname, "author_text": author_text, "quality": quality, - "price_text": price_text, - "price_color": price_color, - "price_background": price_background, + # --- colors for price texts and backgrounds + "user_price_text": user_price_text, + "base_price_text": base_price_text, + "user_price_color": user_price_color, + "base_price_color": base_price_color, + "user_price_bg_color": user_price_bg_color, + "base_price_bg_color": base_price_bg_color, } asset_data["tooltip_data"] = tooltip_data @@ -473,6 +610,21 @@ def set_thumb_check( - if image download failed, it will be set to 'thumbnail_not_available.jpg' - if image doesn't exist, it will be set to 'thumbnail_notready.jpg' """ + # Author assets have no server thumbnails, use gravatar from BKIT_AUTHORS + if asset.get("assetType") == "author": + author_id = int(asset.get("id", asset.get("author", {}).get("id", 0))) + author = global_vars.BKIT_AUTHORS.get(author_id) + if author and author.gravatarImg: + if element.get_image_path() != author.gravatarImg: + element.set_image(author.gravatarImg) + element.set_image_colorspace("") + return + tpath = paths.get_addon_thumbnail_path("thumbnail_notready.jpg") + if element.get_image_path() != tpath: + element.set_image(tpath) + element.set_image_colorspace("") + return + directory = paths.get_temp_dir("%s_search" % asset["assetType"]) tpath = os.path.join(directory, asset[thumb_type]) @@ -518,13 +670,340 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): default="Runs search and displays the asset bar at the same time" ) - show_photo_thumbnail: BoolProperty( # type: ignore[valid-type] - name="Show Photo Thumbnail", - description="Toggle between normal and photo thumbnail - use [ or ] to cycle through thumbnails. Currently used only for printables.", - default=False, + show_thumbnail_variant: bpy.props.EnumProperty( # type: ignore[valid-type] + name="Show Thumbnail Variant", + description="Toggle between normal, photo and wireframe thumbnail - use [ or ] to cycle through thumbnails. Currently used only for printables, models, and scenes.", + default="THUMBNAIL", + items=[ + ("THUMBNAIL", "Thumbnail", "Normal thumbnail"), + ("PHOTO", "Photo", "Photo thumbnail"), + ("WIREFRAME", "Wireframe", "Wireframe thumbnail"), + ], options={"SKIP_SAVE"}, ) + # ------------------------------------------------------------------ + # Context helpers + # ------------------------------------------------------------------ + + def _resolve_window(self, context): + return getattr(context, "window", None) or bpy.context.window + + def _validated_area(self, area): + if area is None: + return None + try: + area.as_pointer() + except ReferenceError: + return None + return area + + def _validated_region(self, region): + if region is None: + return None + try: + region.as_pointer() + except ReferenceError: + return None + return region + + def _safe_space_data(self, area): + if area is None: + return None + try: + return area.spaces.active + except ReferenceError: + return None + + def _build_context_snapshot(self, context, area=None, region=None): + area = self._validated_area(area) or self._validated_area( + getattr(context, "area", None) + ) + region = self._validated_region(region) or self._validated_region( + getattr(context, "region", None) + ) + return SimpleNamespace( + window=self._resolve_window(context), + area=area, + region=region, + space_data=self._safe_space_data(area), + ) + + def _unwrap_area_region(self, ctx): + if isinstance(ctx, dict): + return ctx.get("area"), ctx.get("region") + return getattr(ctx, "area", None), getattr(ctx, "region", None) + + def _current_area_region(self): + """Return the currently active area and region with sensible fallbacks.""" + area = self._validated_area(getattr(self, "_active_area_ref", None)) + region = self._validated_region(getattr(self, "_active_region_ref", None)) + + ctx_area, ctx_region = self._unwrap_area_region(getattr(self, "context", None)) + if area is None: + area = self._validated_area(ctx_area) + if region is None: + region = self._validated_region(ctx_region) + + if area is None: + area = self._validated_area(getattr(bpy.context, "area", None)) + if region is None: + region = self._validated_region(getattr(bpy.context, "region", None)) + + return area, region + + def _event_window_coords(self, event): + if not hasattr(event, "mouse_x") or not hasattr(event, "mouse_y"): + return None, None + return getattr(event, "mouse_x", None), getattr(event, "mouse_y", None) + + def _apply_widget_context(self, override_ctx): + """Apply the given override context to all widgets in the asset bar. + + All widgets get the new context, + except for the main panel and tooltip panel (and their children). + """ + self._override_context = override_ctx + if not hasattr(self, "widgets"): + return + panel = getattr(self, "panel", None) + panel_children = ( + set(panel.widgets) if isinstance(panel, BL_UI_Drag_Panel) else set() + ) + tooltip_panel = getattr(self, "tooltip_panel", None) + tooltip_children = ( + set(self.tooltip_widgets) if hasattr(self, "tooltip_widgets") else set() + ) + + for widget in self.widgets: + widget.context = override_ctx + if ( + widget is panel + or widget in panel_children + or widget is tooltip_panel + or widget in tooltip_children + ): + continue + widget.update(widget.x, widget.y) + + if isinstance(panel, BL_UI_Drag_Panel): + panel.update(panel.x, panel.y) + panel.layout_widgets() + + if isinstance(tooltip_panel, BL_UI_Drag_Panel): + tooltip_panel.update(tooltip_panel.x, tooltip_panel.y) + tooltip_panel.layout_widgets() + + def _find_area_region_from_event(self, context, event): + x, y = self._event_window_coords(event) + if x is None or y is None: + return None, None + + screen = getattr(self._resolve_window(context), "screen", None) + if screen is None: + return None, None + + for area in screen.areas: + if getattr(area, "type", None) != "VIEW_3D": + continue + if not ( + area.x <= x < area.x + area.width and area.y <= y < area.y + area.height + ): + continue + + target_region = None + fallback_region = None + for region in viewport_utils.iter_view3d_window_regions(area): + if fallback_region is None: + fallback_region = region + if ( + region.x <= x < region.x + region.width + and region.y <= y < region.y + region.height + ): + target_region = region + break + + return area, target_region or fallback_region + + return None, None + + def _cursor_inside_active_area(self, event): + # return False + area = self._validated_area(getattr(self, "_active_area_ref", None)) + if area is None: + return False + + x, y = self._event_window_coords(event) + if x is None or y is None: + return False + + if not ( + area.x <= x < area.x + area.width and area.y <= y < area.y + area.height + ): + return False + + region = self._validated_region(getattr(self, "_active_region_ref", None)) + if region is None: + return True + + return ( + region.x <= x < region.x + region.width + and region.y <= y < region.y + region.height + ) + + def _view_changed( + self, + area_pointer, + region_pointer, + previous_area_pointer, + previous_region_pointer, + ): + return ( + previous_area_pointer != area_pointer + or previous_region_pointer != region_pointer + ) + + def _store_active_view(self, context, area, region, area_pointer, region_pointer): + self.active_area_pointer = area_pointer + self.active_region_pointer = region_pointer + global active_area_pointer + active_area_pointer = area_pointer + self._active_area_ref = area + self._active_region_ref = region + self.context = context + + def _refresh_layout(self, override_ctx): + self.update_assetbar_sizes(override_ctx) + self.update_tooltip_size(override_ctx) + try: + self.update_assetbar_layout(override_ctx) + self.update_tooltip_layout(override_ctx) + if hasattr(self, "tooltip_panel"): + self.tooltip_panel.layout_widgets() + except Exception as e: + bk_logger.log( + 1, "Error updating asset bar layout, some objects may be missing. %s", e + ) + + def _safe_tag_redraw(self, region): + if region is None: + return + try: + region.tag_redraw() + except ReferenceError: + pass + + def _tag_regions_for_redraw(self, current_region, previous_region_ref): + self._safe_tag_redraw(current_region) + if previous_region_ref and previous_region_ref is not current_region: + self._safe_tag_redraw(previous_region_ref) + + def _switch_active_view(self, context, area, region, *, force=True): + """Switch the active area/region the asset bar is attached to. + + If `force` is True, the switch is applied even if the area/region + pointers match the previously stored ones. + """ + area = self._validated_area(area) + region = self._validated_region(region) + if area is None or region is None: + return + + self.area = area + self.region = region + + area_pointer = area.as_pointer() + region_pointer = region.as_pointer() + previous_area_pointer = getattr(self, "active_area_pointer", None) + previous_region_pointer = getattr(self, "active_region_pointer", None) + previous_region_ref = getattr(self, "_active_region_ref", None) + + self._store_active_view(context, area, region, area_pointer, region_pointer) + + override_ctx = self._build_context_snapshot(context, area, region) + self._apply_widget_context(override_ctx) + + if force or self._view_changed( + area_pointer, + region_pointer, + previous_area_pointer, + previous_region_pointer, + ): + # Rebuild sizes/layout whenever we truly jump to a different area (or + # the caller explicitly requests it) so the bar respects the new + # region dimensions/UI scale. Plain cursor moves within the same view + # keep the old layout for performance. + self._refresh_layout(override_ctx) + + # Explicitly request redraws so the handler updates in the new region and + # the previous one releases its stale widgets. + self._tag_regions_for_redraw(region, previous_region_ref) + + def _redraw_tracked_regions(self): + """Request redraw on any region the operator stored explicitly.""" + _, stored_region = self._unwrap_area_region(getattr(self, "context", None)) + regions = { + self._validated_region(getattr(self, "_active_region_ref", None)), + self._validated_region( + getattr(getattr(self, "_override_context", None), "region", None) + ), + self._validated_region(stored_region), + } + + for region in regions: + self._safe_tag_redraw(region) + + def update_active_view_from_cursor(self, context, event): + """Update the active area/region based on the current cursor location. + + This makes the asset bar follow the user's cursor as they move between + different 3D viewports. + """ + if event.type not in {"TIMER", "MOUSEMOVE"}: + return + + user_prefs = bpy.context.preferences.addons[__package__].preferences + follow_cursor = getattr(user_prefs, "assetbar_follows_cursor", True) + + if not follow_cursor and not self._is_quad_view(context): + return + + area, region = self._find_area_region_from_event(context, event) + if area is None or region is None: + return + + # In quad view, only the perspective pane should host the asset bar. Keep the + # legacy "follow any quad" behavior here for potential reuse: + # if self._is_quad_view(context) and self._cursor_inside_active_area(event): + # return + if self._is_quad_view(context) and not self._is_perspective_region(region): + return + + # When follow is disabled, allow switching only within the same area; in quad + # view this lets the bar appear in the hovered quad without jumping across + # different 3D view areas. + if not follow_cursor: + active_area = self._validated_area(getattr(self, "_active_area_ref", None)) + if ( + active_area is not None + and area.as_pointer() != active_area.as_pointer() + ): + return + + if self._cursor_inside_active_area(event): + return + + self._switch_active_view(context, area, region) + + def _event_coords_in_active_region(self, event): + region = self._validated_region(getattr(self, "_active_region_ref", None)) + if region is not None: + x, y = self._event_window_coords(event) + if x is not None and y is not None: + return x - region.x, y - region.y + + return getattr(event, "mouse_region_x", 0), getattr(event, "mouse_region_y", 0) + @classmethod def description(cls, context, properties): """Get the description for the asset bar operator.""" @@ -541,10 +1020,41 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): label._halign = halign return label + def new_duo_text( + self, + text_a, + x, + y, + text_b="", + width=100, + height=15, + text_size=None, + halign="LEFT", + ): + """Create a new text label widget.""" + label = BL_UI_DuoLabel(x, y, width, height) + label.use_rounded_background = True + label.background_corner_radius = "50%" + label.background_padding = (4, 4) + label.text_a = text_a + label.text_b = text_b + if text_size is None: + text_size = 14 + label.text_size = text_size + label.text_a_color = self.text_color + label.text_b_color = self.text_color + + label._halign = halign + return label + + # region tooltip def init_tooltip(self): """Initialize the tooltip panel and its widgets.""" self.tooltip_widgets = [] - self.tooltip_scale = 1.0 + self._tooltip_available_height = None + if not hasattr(self, "tooltip_size"): + self.tooltip_size = int(self.tooltip_base_size_pixels) + self.tooltip_scale = getattr(self, "tooltip_scale", 1.0) # Fallbacks in case update_tooltip_size was not called yet self.tooltip_width = getattr(self, "tooltip_width", self.tooltip_size) @@ -567,6 +1077,8 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): 0, 0, self.tooltip_width, self.tooltip_height ) self.tooltip_panel.bg_color = (0.0, 0.0, 0.0, 0.5) + self.tooltip_panel.use_rounded_background = True + self.tooltip_panel.background_corner_radius = ROUNDING_RADIUS self.tooltip_panel.visible = False tooltip_image = BL_UI_Image(0, 0, 1, 1) @@ -575,8 +1087,30 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): tooltip_image.set_image_size((self.tooltip_width, self.tooltip_image_height)) tooltip_image.set_image_position((0, 0)) tooltip_image.set_image_colorspace("") + tooltip_image.background = False + tooltip_image.bg_color = (0.0, 0.0, 0.0, 0.0) + tooltip_image.use_rounded_background = True + tooltip_image.background_corner_radius = ( + ROUNDING_RADIUS, + ROUNDING_RADIUS, + 0, + 0, + ) self.tooltip_image = tooltip_image self.tooltip_widgets.append(tooltip_image) + + tooltip_image_help = self.new_text( + "Left click to append. Right click for menu.", + self.tooltip_margin, + self.tooltip_image_height - self.tooltip_margin - self.author_text_size, + height=self.author_text_size, + text_size=self.author_text_size, + ) + tooltip_image_help.text_color = (1.0, 0.6, 0.6, 0.9) + tooltip_image_help.visible = False + self.tooltip_image_help = tooltip_image_help + self.tooltip_widgets.append(self.tooltip_image_help) + dark_panel = BL_UI_Widget( 0, self.labels_start, @@ -584,6 +1118,8 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.tooltip_info_height, ) dark_panel.bg_color = (0.0, 0.0, 0.0, 0.7) + dark_panel.use_rounded_background = True + dark_panel.background_corner_radius = (0, 0, ROUNDING_RADIUS, ROUNDING_RADIUS) self.tooltip_dark_panel = dark_panel self.tooltip_widgets.append(dark_panel) @@ -630,6 +1166,12 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): ) gravatar_image.set_image_position((0, 0)) gravatar_image.set_image_colorspace("") + gravatar_image.background_corner_radius = ( + 0, + 0, + ROUNDING_RADIUS / 2, + 0, + ) self.gravatar_image = gravatar_image self.tooltip_widgets.append(gravatar_image) @@ -647,6 +1189,7 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): quality_star.set_image_position((0, 0)) self.quality_star = quality_star self.tooltip_widgets.append(quality_star) + quality_label = self.new_text( "", 2 * self.tooltip_margin + self.asset_name_text_size, @@ -657,8 +1200,8 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.tooltip_widgets.append(quality_label) self.quality_label = quality_label - # Add price label for addons - price_label = self.new_text( + # Add user/base price label for addons + multi_price_label = self.new_duo_text( "", self.tooltip_margin, self.tooltip_height @@ -666,16 +1209,28 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): height=self.asset_name_text_size, text_size=self.asset_name_text_size, ) - price_label.background = True - price_label.padding = (3, 4) - price_label.text_color = ( - 1.0, - 0.8, - 0.2, - 1.0, - ) # Golden color for price - self.tooltip_widgets.append(price_label) - self.price_label = price_label + multi_price_label.use_rounded_background = True + multi_price_label.background_corner_radius = "50%" + multi_price_label.text_a_color = colors.WHITE + multi_price_label.text_b_color = colors.TEXT_DIM + self.multi_price_label = multi_price_label + self.tooltip_widgets.append(self.multi_price_label) + + # Author about-me label (multiline, used only for author-type results) + author_about_me = self.new_text( + "", + self.tooltip_margin, + self.labels_start + + self.tooltip_margin + + self.asset_name_text_size + + self.tooltip_margin, + height=self.author_text_size, + text_size=self.author_text_size, + ) + author_about_me.multiline = True + author_about_me.visible = False + self.author_about_me = author_about_me + self.tooltip_widgets.append(author_about_me) user_preferences = bpy.context.preferences.addons[__package__].preferences offset = 0 @@ -716,6 +1271,7 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.tooltip_panel.visible = False for w in self.tooltip_widgets: w.visible = False + self._redraw_tracked_regions() def show_tooltip(self): """Show the tooltip panel and its widgets.""" @@ -723,103 +1279,76 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.tooltip_panel.active = False for w in self.tooltip_widgets: w.visible = True + self._redraw_tracked_regions() - def show_notifications(self, widget): - """Show notifications on the asset bar.""" - bpy.ops.wm.show_notifications() - if comments_utils.check_notifications_read(): - widget.visible = False + def _reset_tooltip_dimensions(self): + """Restore tooltip scale and panel size before recomputing layout. - def check_new_search_results(self, context): - """checks if results were replaced. - this can happen from search, but also by switching results. - We should rather trigger that update from search. maybe let's add a uuid to the results? + Prevents a previously downscaled tooltip from keeping a shrunken size + on subsequent openings (e.g. after tight vertical space). """ - # Get search results from history - sr = search.get_search_results() - if not hasattr(self, "search_results_count"): - if not sr or len(sr) == 0: - self.search_results_count = 0 - self.last_asset_type = "" - return True - self.search_results_count = len(sr) - self.last_asset_type = sr[0]["assetType"] - if sr is not None and len(sr) != self.search_results_count: - self.search_results_count = len(sr) - return True - return False - def get_region_size(self, context): - """Get the size of the region.""" - # just check the size of region.. + ui_scale = ui_bgl.get_ui_scale() + self.tooltip_scale = ui_scale + self._tooltip_available_height = None - region = context.region - area = context.area - ui_width = 0 - tools_width = 0 - for r in area.regions: - if r.type == "UI": - ui_width = r.width - if r.type == "TOOLS": - tools_width = r.width - total_width = region.width - tools_width - ui_width - return total_width, region.height + base_size = int(self.tooltip_base_size_pixels * ui_scale) + base_height = int(base_size * (1 + self.bottom_panel_fraction)) - def check_ui_resized(self, context): - """Check if the UI has been resized.""" - # TODO this should only check if region was resized, not really care about the UI elements size. - region_width, region_height = self.get_region_size(context) + self.tooltip_size = base_size + self.tooltip_height = base_height - if not hasattr(self, "total_width"): - self.total_width = region_width - self.region_height = region_height - - if region_height != self.region_height or region_width != self.total_width: - self.region_height = region_height - self.total_width = region_width - return True - return False + if hasattr(self, "tooltip_panel"): + self.tooltip_panel.width = base_size + self.tooltip_panel.height = base_height def update_tooltip_size(self, context): """Calculate all important sizes for the tooltip""" region = context.region ui_props = bpy.context.window_manager.blenderkitUI - ui_scale = self.get_ui_scale() - base_panel_height = self.tooltip_base_size_pixels * ( - 1 + self.bottom_panel_fraction - ) + ui_scale = ui_bgl.get_ui_scale() + desired_size = int(self.tooltip_base_size_pixels * ui_scale) + desired_full_height = int(desired_size * (1 + self.bottom_panel_fraction)) - if hasattr(self, "tooltip_panel"): - tooltip_y_available_height = abs( - region.height - self.tooltip_panel.y_screen - ) - # if tooltip is above, we need to reduce it's size if its y is out of region height - if self.tooltip_panel.y_screen <= 0: - tooltip_y_available_height = ( - base_panel_height * ui_scale + self.tooltip_panel.y_screen - ) - self.tooltip_panel.set_location(self.tooltip_panel.x, 0) + available_height = getattr(self, "_tooltip_available_height", None) + if available_height is None: + tooltip_panel = getattr(self, "tooltip_panel", None) + anchor_y = None + if tooltip_panel is not None: + anchor_y = getattr(tooltip_panel, "y_screen", None) + if anchor_y is None: + anchor_y = self.bar_y + self.bar_height + anchor_y = max(-region.height, min(region.height, anchor_y)) + if anchor_y < 0: + available_height = anchor_y + region.height + else: + available_height = region.height - anchor_y + available_height = max(64, int(available_height)) + if desired_full_height > available_height: + scale_factor = available_height / max(desired_full_height, 1) else: - tooltip_y_available_height = abs( - region.height - (self.bar_height + self.bar_y) - ) + scale_factor = 1.0 - self.tooltip_scale = min( - 1.0, tooltip_y_available_height / (base_panel_height * ui_scale) - ) + final_size = max(32, int(desired_size * scale_factor)) + self.tooltip_scale = final_size / self.tooltip_base_size_pixels + self.tooltip_size = final_size self.asset_name_text_size = int( - 0.039 * self.tooltip_base_size_pixels * ui_scale * self.tooltip_scale + 0.039 * self.tooltip_base_size_pixels * self.tooltip_scale ) self.author_text_size = int(self.asset_name_text_size * 0.8) - self.tooltip_size = int( - self.tooltip_base_size_pixels * ui_scale * self.tooltip_scale - ) self.tooltip_margin = int( - 0.017 * self.tooltip_base_size_pixels * ui_scale * self.tooltip_scale + 0.017 * self.tooltip_base_size_pixels * self.tooltip_scale ) + # Check if the active asset is an author for tooltip sizing + self._is_author_tooltip = False + active_idx = getattr(self, "active_index", -1) + sr = search.get_search_results() + if sr and 0 <= active_idx < len(sr): + self._is_author_tooltip = sr[active_idx].get("assetType") == "author" + if ui_props.asset_type == "HDR": self.tooltip_width = self.tooltip_size * 2 self.tooltip_image_height = self.tooltip_size @@ -827,159 +1356,57 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.tooltip_width = self.tooltip_size self.tooltip_image_height = self.tooltip_size - self.tooltip_info_height = max( - int(self.tooltip_image_height * self.bottom_panel_fraction), - self.asset_name_text_size * 3, - ) + if self._is_author_tooltip: + # Author tooltip: sized to actual content (name + about lines) + # Count how many about_me lines we'll actually show + about_line_count = 0 + active_idx = getattr(self, "active_index", -1) + if sr and 0 <= active_idx < len(sr): + ad = sr[active_idx] + td = ad.get("tooltip_data") + if td: + about_me = td.get("about_me", "") + if about_me: + chars_per_line = max( + 20, int(self.tooltip_size / (self.author_text_size * 0.65)) + ) + wrapped = 0 + for paragraph in about_me.split("\n"): + words = paragraph.split() + cur = "" + for word in words: + if cur and len(cur) + 1 + len(word) > chars_per_line: + wrapped += 1 + cur = word + else: + cur = f"{cur} {word}" if cur else word + if cur: + wrapped += 1 + about_line_count += min(wrapped, 8) + self.tooltip_info_height = ( + 4 * self.tooltip_margin + + self.asset_name_text_size + + max(1, about_line_count) * int(self.author_text_size * 1.4) + ) + else: + self.tooltip_info_height = max( + int(self.tooltip_image_height * self.bottom_panel_fraction), + self.asset_name_text_size * 3, + ) self.labels_start = self.tooltip_image_height - self.tooltip_height = self.tooltip_image_height + self.tooltip_info_height + self.comments_text_size = max( + 15, + int(0.034 * self.tooltip_base_size_pixels * self.tooltip_scale), + int(self.author_text_size), + ) + self.tooltip_height = self.tooltip_image_height + self.tooltip_info_height self.gravatar_size = max( int(self.tooltip_info_height - 2 * self.tooltip_margin), self.asset_name_text_size, ) - def get_ui_scale(self): - """Get the UI scale""" - ui_scale = bpy.context.preferences.view.ui_scale - pixel_size = bpy.context.preferences.system.pixel_size - if pixel_size > 1: - # for a reason unknown, - # the pixel size is modified only on mac - # where pixel size is 2.0 - ui_scale = pixel_size - return ui_scale - - def update_assetbar_sizes(self, context): - """Calculate all important sizes for the asset bar""" - region = context.region - area = context.area - - ui_props = bpy.context.window_manager.blenderkitUI - user_preferences = bpy.context.preferences.addons[__package__].preferences - ui_scale = self.get_ui_scale() - # assetbar scaling - self.button_margin = int(0 * ui_scale) - self.assetbar_margin = int(2 * ui_scale) - self.thumb_size = int(user_preferences.thumb_size * ui_scale) - self.button_size = 2 * self.button_margin + self.thumb_size - self.other_button_size = int(30 * ui_scale) - self.icon_size = int(24 * ui_scale) - self.validation_icon_margin = int(3 * ui_scale) - reg_multiplier = 1 - if not bpy.context.preferences.system.use_region_overlap: - reg_multiplier = 0 - - ui_width = 0 - tools_width = 0 - reg_multiplier = 1 - if not bpy.context.preferences.system.use_region_overlap: - reg_multiplier = 0 - for r in area.regions: - if r.type == "UI": - ui_width = r.width * reg_multiplier - if r.type == "TOOLS": - tools_width = r.width * reg_multiplier - self.bar_x = int( - tools_width + self.button_margin + ui_props.bar_x_offset * ui_scale - ) - # self.bar_y = region.height - ui_props.bar_y_offset * ui_scale - - self.bar_y = int(ui_props.bar_y_offset * ui_scale) - - self.bar_end = int(ui_width + 180 * ui_scale + self.other_button_size) - self.bar_width = int(region.width - self.bar_x - self.bar_end) - - self.wcount = math.floor((self.bar_width) / (self.button_size)) - - self.max_hcount = math.floor( - max(region.width, context.window.width) / self.button_size - ) - self.max_wcount = user_preferences.maximized_assetbar_rows - - history_step = search.get_active_history_step() - search_results = history_step.get("search_results") - # we need to init all possible thumb previews in advance/ - # Calculate hcount based on expanded state - if search_results is not None and self.wcount > 0: - if user_preferences.assetbar_expanded: - max_rows = user_preferences.maximized_assetbar_rows - available_height = ( - region.height - - self.bar_y - - 2 * self.assetbar_margin - - self.other_button_size - ) - max_rows_by_height = math.floor(available_height / self.button_size) - max_rows = ( - min(max_rows, max_rows_by_height) if max_rows_by_height > 0 else 1 - ) - else: - max_rows = 1 - self.hcount = min( - max_rows, - math.ceil(len(search_results) / self.wcount), - ) - self.hcount = max(self.hcount, 1) - else: - self.hcount = 1 - - self.bar_height = (self.button_size) * self.hcount + 2 * self.assetbar_margin - if ui_props.down_up == "UPLOAD": - self.reports_y = region.height - self.bar_y - 600 - ui_props.reports_y = region.height - self.bar_y - 600 - self.reports_x = self.bar_x - ui_props.reports_x = self.bar_x - - else: # ui.bar_y - ui.bar_height - 100 - self.reports_y = region.height - self.bar_y - self.bar_height - 50 - ui_props.reports_y = region.height - self.bar_y - self.bar_height - 50 - self.reports_x = self.bar_x - ui_props.reports_x = self.bar_x - - def update_ui_size(self, context): - """Calculate all important sizes for the asset bar and tooltip""" - - self.update_assetbar_sizes(context) - self.update_tooltip_size(context) - - def update_assetbar_layout(self, context): - """Update the layout of the asset bar""" - # usually restarting asset_bar completely since the widgets are too hard to get working with updates. - - self.scroll_update(always=True) - self.position_and_hide_buttons() - - self.button_close.set_location( - self.bar_width - self.other_button_size, -self.other_button_size - ) - self.button_expand.set_location( - self.bar_width - self.other_button_size, self.bar_height - ) - # if hasattr(self, 'button_notifications'): - # self.button_notifications.set_location(self.bar_width - self.other_button_size * 2, -self.other_button_size) - self.button_scroll_up.set_location(self.bar_width, 0) - self.panel.width = self.bar_width - self.panel.height = self.bar_height - # Update tab area background position - self.tab_area_bg.width = self.bar_width - - self.panel.set_location(self.bar_x, self.panel.y) - - ## the block bellow can be probably removed - # Update tab icons positions - for i, tab_button in enumerate(self.tab_buttons): - if hasattr(tab_button, "asset_type_icon"): - tab_button.asset_type_icon.set_location( - tab_button.x - + int( - self.other_button_size * 0.05 - ), # Position at left with small margin - tab_button.y - + int( - (self.other_button_size - tab_button.asset_type_icon.height) / 2 - ), # Center vertically - ) + self._tooltip_available_height = None def update_tooltip_layout(self, context): """Update the layout of the tooltip""" @@ -987,6 +1414,12 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.tooltip_panel.width = self.tooltip_width self.tooltip_panel.height = self.tooltip_height + + self.tooltip_image_help.set_location( + self.tooltip_margin, + self.tooltip_image_height - self.tooltip_margin - self.author_text_size, + ) + self.tooltip_image_help.text_size = self.author_text_size self.tooltip_image.width = self.tooltip_width self.tooltip_image.height = self.tooltip_image_height @@ -1008,12 +1441,21 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): ) ) - self.authors_name.set_location( - self.tooltip_width - self.gravatar_size - (self.tooltip_margin * 2), - self.tooltip_height - self.author_text_size - self.tooltip_margin, - ) - self.authors_name.text_size = self.author_text_size - self.authors_name.height = self.author_text_size + if self._is_author_tooltip: + # Asset count right-aligned on the same row as the author name + self.authors_name.set_location( + self.tooltip_width - self.tooltip_margin, + self.labels_start + self.tooltip_margin, + ) + self.authors_name.text_size = self.asset_name_text_size + self.authors_name.height = self.asset_name_text_size + else: + self.authors_name.set_location( + self.tooltip_width - self.gravatar_size - (self.tooltip_margin * 2), + self.tooltip_height - self.author_text_size - self.tooltip_margin, + ) + self.authors_name.text_size = self.author_text_size + self.authors_name.height = self.author_text_size self.asset_name.set_location( self.tooltip_margin, @@ -1045,18 +1487,85 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): ) # right after the asset name - self.price_label.set_location( + self.multi_price_label.set_location( self.tooltip_margin, self.labels_start + (self.tooltip_margin * 3) + self.asset_name.height, ) - self.price_label.width = self.tooltip_width - 2 * self.tooltip_margin - self.price_label.height = self.asset_name_text_size - self.price_label.text_size = self.asset_name_text_size + self.multi_price_label.width = self.tooltip_width - 2 * self.tooltip_margin + self.multi_price_label.height = self.asset_name_text_size + self.multi_price_label.text_size = self.asset_name_text_size - def update_layout(self, context, event): - """update UI sizes after their recalculation""" - self.update_assetbar_layout(context) - self.update_tooltip_layout(context) + # Author about-me label: positioned directly below asset name + if hasattr(self, "author_about_me"): + about_y = ( + self.labels_start + + self.tooltip_margin + + self.asset_name_text_size + + self.tooltip_margin + ) + self.author_about_me.set_location( + self.tooltip_margin, + about_y, + ) + self.author_about_me.text_size = self.author_text_size + self.author_about_me.height = self.author_text_size + self.author_about_me.width = self.tooltip_width - 2 * self.tooltip_margin + + if hasattr(self, "comments"): + self.comments.set_location( + self.tooltip_margin, + self.tooltip_height + self.tooltip_margin, + ) + self.comments.text_size = self.comments_text_size + + def update_tooltip_image(self, asset_id): + """Update tooltip image when it finishes downloading and the downloaded image matches the active one.""" + search_results = search.get_search_results() + if search_results is None: + return + + if self.active_index == -1: # prev search got no results + return + + if self.active_index >= len(search_results): + return + + asset_data = search_results[self.active_index] + if asset_data["assetBaseId"] == asset_id: + set_thumb_check(self.tooltip_image, asset_data, thumb_type="thumbnail") + + def update_comments_for_validators(self, asset_data): + """Update the comments section in the tooltip for validator profiles.""" + if not utils.profile_is_validator(): + return + + if asset_data.get("assetType") == "author": + self.comments.text = "" + return + + comments = global_vars.DATA.get("asset comments", {}) + comments = comments.get(asset_data["assetBaseId"], []) + comment_text = "No comments yet." + if comments is not None: + comment_text = "" + # iterate comments from last to first + for comment in reversed(comments): + comment_text += f"{comment['userName']}:\n" + # strip urls and stuff + comment_lines = comment["comment"].split("\n") + for line in comment_lines: + urls, text = utils.has_url(line) + if urls: + comment_text += f"{text}{urls[0][0]}\n" + else: + comment_text += f"{text}\n" + comment_text += "\n" + + self.comments.text = comment_text + + # endregion tooltip + + # region panel def asset_button_init(self, asset_x, asset_y, button_idx): """Initialize an asset button at the given position with the given index.""" @@ -1125,6 +1634,29 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): bookmark_button.visible = False new_button.bookmark_button = bookmark_button self.bookmark_buttons.append(bookmark_button) + + # Author type icon (top-left corner) + author_button = BL_UI_Button( + asset_x + self.button_margin + self.validation_icon_margin, + asset_y + self.button_margin + self.validation_icon_margin, + self.icon_size, + self.icon_size, + ) + author_button.set_image_size((self.icon_size, self.icon_size)) + author_button.set_image_position((0, 0)) + img_fp = paths.get_addon_thumbnail_path("asset_type_author.png") + author_button.set_image(img_fp) + author_button.bg_color = fully_transparent_color + author_button.hover_bg_color = self.button_bg_color + author_button.select_bg_color = fully_transparent_color + author_button.visible = False + author_button.button_index = button_idx + author_button.search_index = button_idx + author_button.text = "" + author_button.set_mouse_down(self.show_author_profile) + new_button.author_button = author_button + self.author_buttons.append(author_button) + progress_bar = BL_UI_Widget( asset_x, asset_y + self.button_size - 6, self.button_size, 6 ) @@ -1145,9 +1677,6 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): new_button.red_alert = red_alert self.red_alerts.append(red_alert) - # if result['downloaded'] > 0: - # ui_bgl.draw_rect(x, y, int(ui_props.thumb_size * result['downloaded'] / 100.0), 2, green) - return new_button def init_ui(self): @@ -1161,11 +1690,14 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.asset_buttons = [] self.validation_icons = [] self.bookmark_buttons = [] + self.author_buttons = [] self.progress_bars = [] self.red_alerts = [] self.widgets_panel = [] self.tab_buttons = [] self.close_tab_buttons = [] + self.active_filter_buttons = [] + self.manufacturer_buttons = [] # Create panel with extended height self.panel = BL_UI_Drag_Panel( @@ -1185,6 +1717,13 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): ) # dark blue self.tab_area_bg.bg_color = colors.TOP_BAR_BLUE + self.tab_area_bg.use_rounded_background = True + self.tab_area_bg.background_corner_radius = ( + ROUNDING_RADIUS, + ROUNDING_RADIUS, + 0, + 0, + ) # Add widgets to panel - add tab background first so it's behind everything self.widgets_panel.append(self.tab_area_bg) @@ -1203,6 +1742,7 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.asset_buttons.append(new_button) button_idx += 1 + # add close button self.button_close = BL_UI_Button( self.bar_width - self.other_button_size, -self.other_button_size, @@ -1211,6 +1751,13 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): ) self.button_close.bg_color = self.button_bg_color self.button_close.hover_bg_color = self.button_hover_color + self.button_close.use_rounded_background = True + self.button_close.background_corner_radius = ( + 0, + ROUNDING_RADIUS, + 0, + 0, + ) self.button_close.text = "×" self.button_close.text_size = self.other_button_size * 0.8 self.button_close.set_image_position((0, 0)) @@ -1232,6 +1779,13 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.button_expand.hover_bg_color = self.button_hover_color self.button_expand.text = "" self.button_expand.text_size = self.other_button_size * 0.8 + self.button_expand.use_rounded_background = True + self.button_expand.background_corner_radius = ( + 0, + 0, + ROUNDING_RADIUS, + ROUNDING_RADIUS, + ) self.button_expand.set_image_position((0, 0)) self.button_expand.set_image_size( (self.other_button_size, self.other_button_size) @@ -1246,6 +1800,13 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): ) self.button_scroll_down.bg_color = self.button_bg_color self.button_scroll_down.hover_bg_color = self.button_hover_color + self.button_scroll_down.use_rounded_background = True + self.button_scroll_down.background_corner_radius = ( + ROUNDING_RADIUS, + 0, + 0, + ROUNDING_RADIUS, + ) self.button_scroll_down.text = "" self.button_scroll_down.set_image_size((self.scroll_width, self.button_size)) self.button_scroll_down.set_image_position( @@ -1261,6 +1822,13 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): ) self.button_scroll_up.bg_color = self.button_bg_color self.button_scroll_up.hover_bg_color = self.button_hover_color + self.button_scroll_up.use_rounded_background = True + self.button_scroll_up.background_corner_radius = ( + 0, + ROUNDING_RADIUS, + ROUNDING_RADIUS, + 0, + ) self.button_scroll_up.text = "" self.button_scroll_up.set_image_size((self.scroll_width, self.button_size)) self.button_scroll_up.set_image_position( @@ -1286,6 +1854,13 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): ) self.history_back_button.bg_color = self.button_bg_color self.history_back_button.hover_bg_color = self.button_hover_color + self.history_back_button.use_rounded_background = True + self.history_back_button.background_corner_radius = ( + ROUNDING_RADIUS, + ROUNDING_RADIUS, + 0, + 0, + ) self.history_back_button.text = "" icon_size = int(button_size * 0.6) margin_lr = int((button_size - icon_size) / 2) @@ -1303,6 +1878,13 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): ) self.history_forward_button.bg_color = self.button_bg_color self.history_forward_button.hover_bg_color = self.button_hover_color + self.history_forward_button.use_rounded_background = True + self.history_forward_button.background_corner_radius = ( + ROUNDING_RADIUS, + ROUNDING_RADIUS, + 0, + 0, + ) self.history_forward_button.text = "" self.history_forward_button.set_image( paths.get_addon_thumbnail_path("history_forward.png") @@ -1337,6 +1919,14 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): tab_button.text_size = button_size * 0.5 tab_button.text_color = self.text_color tab_button.bg_color = self.button_bg_color + tab_button.use_rounded_background = True + tab_button.background_padding = (margin, 0) # extra margin + tab_button.background_corner_radius = ( + ROUNDING_RADIUS, + 0, + 0, + 0, + ) if is_active: tab_button.bg_color = self.button_selected_color @@ -1364,6 +1954,8 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): close_tab.text = "×" # Set text after creation close_tab.text_size = button_size * 0.8 close_tab.text_color = self.text_color + close_tab.use_rounded_background = True + close_tab.background_corner_radius = (0, ROUNDING_RADIUS, 0, 0) if is_active: close_tab.bg_color = self.button_selected_color_dim @@ -1401,6 +1993,8 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.new_tab_button.text = "+" self.new_tab_button.text_size = button_size * 0.8 self.new_tab_button.text_color = self.text_color + self.new_tab_button.use_rounded_background = True + self.new_tab_button.background_corner_radius = ROUNDING_RADIUS self.new_tab_button.set_mouse_down(self.add_new_tab) self.widgets_panel.append(self.new_tab_button) @@ -1425,6 +2019,305 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): active_tab["history_index"] < len(active_tab["history"]) - 1 ) + # Manufacturer filter buttons (stay hidden until populated) + # Active filter chips (generic, per tab) + for _ in range(self.max_active_filter_chips): + chip_button = BL_UI_Button(0, 0, 100, self.filter_button_height) + chip_button.bg_color = (0.18, 0.18, 0.18, 0.9) + chip_button.hover_bg_color = (0.22, 0.22, 0.22, 1.0) + chip_button.text = "" + chip_button.text_size = self.filter_button_text_size + chip_button.text_color = self.text_color + chip_button.visible = False + chip_button.use_rounded_background = True + chip_button.background_corner_radius = "50%" + chip_button.background_border = True + chip_button.background_border_color = colors.ACTIVE_BLUE + chip_button.background_border_thickness = 2 + chip_button.set_mouse_down(self.remove_active_filter_chip) + chip_button.active_filter = None + self.active_filter_buttons.append(chip_button) + + self.widgets_panel.extend(self.active_filter_buttons) + + # Manufacturer filter buttons (stay hidden until populated) + for _ in range(self.max_manufacturer_filters): + filter_button = BL_UI_Button(0, 0, 80, self.filter_button_height) + # start with a neutral gray; exact shade is updated when buttons are positioned + base_gray = 50 / 255 + filter_button.bg_color = (base_gray, base_gray, base_gray, 0.85) + filter_button.hover_bg_color = ( + base_gray + 0.1, + base_gray + 0.1, + base_gray + 0.1, + 1.0, + ) + filter_button.text = "" + filter_button.text_size = self.filter_button_text_size + filter_button.text_color = self.text_color + filter_button.visible = False + filter_button.use_rounded_background = True + filter_button.background_corner_radius = "50%" + filter_button.set_mouse_down( + partial(self.apply_term_filter, term="manufacturer") + ) + filter_button.manufacturer_name = "" + self.manufacturer_buttons.append(filter_button) + + # Clear manufacturer filter bubble (red cross) + self.widgets_panel.extend(self.manufacturer_buttons) + + # endregion panel + + def show_notifications(self, widget): + """Show notifications on the asset bar.""" + bpy.ops.wm.show_notifications() + if comments_utils.check_notifications_read(): + widget.visible = False + + # region checks + + def check_new_search_results(self, context): + """checks if results were replaced. + this can happen from search, but also by switching results. + We should rather trigger that update from search. maybe let's add a uuid to the results? + """ + # Get search results from history + sr = search.get_search_results() + current_id = id(sr) if sr is not None else None + + if not hasattr(self, "search_results_count"): + self.search_results_count = len(sr) if sr else 0 + self.last_asset_type = sr[0]["assetType"] if sr else "" + self._last_search_results_id = current_id + return True + + if current_id != getattr(self, "_last_search_results_id", None): + self._last_search_results_id = current_id + self.search_results_count = len(sr) if sr else 0 + if sr: + self.last_asset_type = sr[0]["assetType"] + return True + + if sr is not None and len(sr) != self.search_results_count: + self.search_results_count = len(sr) + return True + return False + + def get_region_size(self, context): + """Get the size of the region.""" + # just check the size of region.. + + region = context.region + area = context.area + ui_width = 0 + tools_width = 0 + for r in area.regions: + if r.type == "UI": + ui_width = r.width + if r.type == "TOOLS": + tools_width = r.width + total_width = region.width - tools_width - ui_width + return total_width, region.height + + def check_region_changed(self, context): + """Check if the region has changed.""" + region_width, region_height = self.get_region_size(context) + + if not hasattr(self, "total_width"): + self.total_width = region_width + self.region_height = region_height + + changed = ( + region_height != self.region_height or region_width != self.total_width + ) + + if changed: + self.region_height = region_height + self.total_width = region_width + return True + return False + + def check_ui_resized(self, context): + """Check if the UI has been resized.""" + scaling = ui_bgl.get_ui_scale() + + if not hasattr(self, "_ui_scale_state"): + self._ui_scale_state = scaling + + scale_changed = scaling != self._ui_scale_state + + if scale_changed: + self._ui_scale_state = scaling + return True + return False + + # endregion checks + + # region updates + + def update_assetbar_sizes(self, context): + """Calculate all important sizes for the asset bar""" + region = context.region + area = context.area + + ui_props = bpy.context.window_manager.blenderkitUI + user_preferences = bpy.context.preferences.addons[__package__].preferences + scale = ui_bgl.get_ui_scale() + self._ui_scale_factor = scale + # assetbar sizing (fixed, not scaled) + + self.button_margin = int(round(0 * scale)) + self.assetbar_margin = int(round(2 * scale)) + # user preference thumb size is in logical pixels; scale to match Blender UI scaling + self.thumb_size = int(round(user_preferences.thumb_size * scale)) + self.button_size = int(2 * self.button_margin + self.thumb_size) + + self.other_button_size = int(round(30 * scale)) + self.filter_button_height = int(round(25 * scale)) + self.filter_button_text_size = int(round(20 * scale)) + + self.free_button_margin = int(self.button_size * 0.05) + self.free_button_text_size = int(self.other_button_size * 0.4) + + self.icon_size = int(round(24 * scale)) + self.validation_icon_margin = int(round(3 * scale)) + reg_multiplier = 1 + if not bpy.context.preferences.system.use_region_overlap: + reg_multiplier = 0 + + ui_width = 0 + tools_width = 0 + reg_multiplier = 1 + if not bpy.context.preferences.system.use_region_overlap: + reg_multiplier = 0 + for r in area.regions: + if r.type == "UI": + ui_width = r.width * reg_multiplier + if r.type == "TOOLS": + tools_width = r.width * reg_multiplier + self.bar_x = int( + tools_width + self.button_margin + ui_props.bar_x_offset * scale + ) + base_bar_y = int(self.button_margin + ui_props.bar_y_offset * scale) + self.bar_y = base_bar_y + + self.bar_end = int(ui_width + 180 + self.other_button_size) + self.bar_width = int(region.width - self.bar_x - self.bar_end) + # Quad view and very small regions can shrink the available width below a single + # thumbnail. Keep the bar wide enough to host at least one column and keep the + # math stable so the buttons do not disappear entirely. + self.bar_width = max(1, self.bar_width) + + effective_bar_width = max(self.bar_width, self.button_size) + self.wcount = max(1, math.floor(effective_bar_width / self.button_size)) + + self.max_hcount = math.floor( + max(region.width, context.window.width) / self.button_size + ) + self.max_wcount = user_preferences.maximized_assetbar_rows + + history_step = search.get_active_history_step() + search_results = history_step.get("search_results") + + self.position_active_filter_buttons() + + bubble_offset = 0 + if self.active_filter_height: + bubble_offset = self.active_filter_height + + self.bar_y = base_bar_y + bubble_offset + + # we need to init all possible thumb previews in advance/ + # Calculate hcount based on expanded state + if search_results is not None and self.wcount > 0: + if user_preferences.assetbar_expanded: + max_rows = user_preferences.maximized_assetbar_rows + available_height = ( + region.height + - self.bar_y + - 2 * self.assetbar_margin + - self.other_button_size + ) + max_rows_by_height = math.floor(available_height / self.button_size) + max_rows = ( + min(max_rows, max_rows_by_height) if max_rows_by_height > 0 else 1 + ) + else: + max_rows = 1 + self.hcount = min( + max_rows, + math.ceil(len(search_results) / self.wcount), + ) + self.hcount = max(self.hcount, 1) + else: + self.hcount = 1 + + self.base_bar_height = self.button_size * self.hcount + 2 * self.assetbar_margin + self._update_manufacturer_data(search_results) + self.bar_height = self.base_bar_height + self.manufacturer_section_height + + if ui_props.down_up == "UPLOAD": + self.reports_y = region.height - self.bar_y - 600 + ui_props.reports_y = region.height - self.bar_y - 600 + self.reports_x = self.bar_x + ui_props.reports_x = self.bar_x + + else: # ui.bar_y - ui.bar_height - 100 + self.reports_y = region.height - self.bar_y - self.bar_height - 50 + ui_props.reports_y = int(region.height - self.bar_y - self.bar_height - 50) + self.reports_x = self.bar_x + ui_props.reports_x = self.bar_x + + def update_ui_size(self, context): + """Calculate all important sizes for the asset bar and tooltip""" + self._refresh_layout(context) + + def update_assetbar_layout(self, context): + """Update the layout of the asset bar""" + self.scroll_update(always=True) + + self.position_and_hide_buttons() + + self.button_close.set_location( + self.bar_width - self.other_button_size, -self.other_button_size + ) + self.button_scroll_up.set_location(self.bar_width, 0) + self.panel.width = self.bar_width + self.panel.height = self.bar_height + + # Update tab area background position + self.tab_area_bg.width = self.bar_width + + self.panel.set_location(self.bar_x, self.bar_y) + + self.position_manufacturer_buttons() + + def update_layout(self, context, event): + """update UI sizes after their recalculation""" + self.update_assetbar_layout(context) + self.update_tooltip_layout(context) + + def _is_quad_view(self, context): + """Return True when the current 3D view runs in quad-view layout.""" + space_data = getattr(context, "space_data", None) + if not space_data or getattr(space_data, "type", "") != "VIEW_3D": + return False + quadviews = getattr(space_data, "region_quadviews", None) + if quadviews is None: + return False + try: + return len(quadviews) > 0 + except TypeError: + return bool(quadviews) + + def _is_perspective_region(self, region): + """Return True if the given region is a perspective (or camera) view.""" + r3d = getattr(region, "data", None) or getattr(region, "regiondata", None) + if r3d is None: + return False + return getattr(r3d, "view_perspective", "") in {"PERSP", "CAMERA"} + def set_element_images(self): """set ui elements images, has to be done after init of UI.""" # img_fp = paths.get_addon_thumbnail_path("vs_rejected.png") @@ -1484,6 +2377,273 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): # Show down arrow when collapsed (to expand) self.button_expand.text = "▼" + # region active filters + + def position_active_filter_buttons(self): + self.active_filter_height = 0 + if not self.active_filter_buttons: + return + + active_filters = search.get_active_filters() + + raw_available = self.bar_width - 2 * self.assetbar_margin + + if not active_filters or raw_available <= 0: + for button in self.active_filter_buttons: + button.visible = False + button.active_filter = None + return + + max_x = self.bar_width - self.assetbar_margin + current_left_offset = ( + self.bar_x + self.assetbar_margin + self.free_button_margin + ) + + current_row = 0 + + # Keep chips below the toolbar but above the asset bar when space is tight + base_y = -( + self.other_button_size + + self.filter_button_height + + (self.free_button_margin * 2) + ) + + for idx in range(self.max_active_filter_chips): + button = self.active_filter_buttons[idx] + if idx >= len(active_filters): + button.visible = False + break + + flt = active_filters[idx] + + term = flt.get("term", "") + value = flt.get("value", "") + label_source = flt.get("label") or value + label = f"{label_source} ×" + width = ( + ui_bgl.get_text_size( + font_id=1, + text=label, + text_size=self.free_button_text_size, + )[0] + + self.free_button_margin * 4 + ) + + # Pre-calculate icon space for author chips + if term == "author_id": + icon_size = int(self.filter_button_height * 0.7) + icon_pad = int((self.filter_button_height - icon_size) / 2) + icon_space = icon_size + icon_pad * 2 + width += icon_space + + img_fp = paths.get_addon_thumbnail_path("asset_type_author.png") + button.set_image(img_fp) + button.set_image_size((icon_size, icon_size)) + button.set_image_position((icon_pad, icon_pad)) + else: + button.set_image(None) + button.set_image_size((0, 0)) + + if current_left_offset + width > max_x: + current_row += 1 + current_left_offset = ( + self.bar_x + self.assetbar_margin + self.free_button_margin + ) + + button.set_location( + current_left_offset, + ( + base_y + - ( + current_row + * (self.filter_button_height + self.free_button_margin) + ) + ), # offset up from bar + ) + + button.width = width + button.height = self.filter_button_height + button.text = label + button.text_size = self.free_button_text_size + button.visible = True + button.active_filter = {"term": term, "value": value} + + current_left_offset += width + (self.free_button_margin * 2) + + self.active_filter_height = (current_row + 1) * ( + self.filter_button_height + self.free_button_margin + ) + + # endregion active filters + + # region manufacturer + + def _extract_manufacturer_name(self, asset_data): + manufacturer = asset_data.get("dictParameters", {}).get("manufacturer") + if not manufacturer: + return "" + return self._sanitize_manufacturer_name(str(manufacturer)) or "" + + def _sanitize_manufacturer_name(self, name: str) -> Optional[str]: + cleaned = name.strip() + if not cleaned: + return None + + lowered = cleaned.lower() + is_url = lowered.startswith(("http://", "https://", "www.")) or "://" in lowered + if is_url: + return None + + tokens = re.split(r"[\s,\\/|_-]+", lowered) + invalid_tokens = {"me", "unknown", "self", "none", "n/a", "na", "null", "nil"} + if any(t in invalid_tokens for t in tokens if t): + return None + + # also use regex to disqualify names without any letters, or with only special characters + if not re.search(r"[a-zA-Z]", cleaned): + return None + + return cleaned + + def _format_manufacturer_label(self, name: str) -> str: + if len(name) <= MAX_MANUFACTURER_LABEL_LEN: + return name + return name[: MAX_MANUFACTURER_LABEL_LEN - 3].rstrip() + "..." + + def _refresh_manufacturer_names(self, search_results): + if not search_results: + self.manufacturer_names = [] + self.manufacturer_counts = Counter() + return + + # Case-insensitive grouping: count by lowercase key, display first-seen casing + counts_lower: Counter = Counter() + display_names: dict = {} + for asset_data in search_results: + name = self._extract_manufacturer_name(asset_data) + if name: + key = name.lower() + counts_lower[key] += 1 + if key not in display_names: + display_names[key] = name + + most_common = counts_lower.most_common(self.max_manufacturer_filters) + self.manufacturer_names = [display_names[key] for key, _ in most_common] + self.manufacturer_counts = Counter( + {display_names[k]: v for k, v in counts_lower.items()} + ) + + def _update_manufacturer_data(self, search_results: Optional[list[dict]] = None): + if not utils.experimental_enabled(): + self.manufacturer_names = [] + self.manufacturer_counts = Counter() + self.manufacturer_section_height = 0 + for btn in self.manufacturer_buttons: + btn.visible = False + return + + self._refresh_manufacturer_names(search_results) + self.position_manufacturer_buttons() + + def _calculate_manufacturer_gray(self, count, min_count, max_count): + """Map manufacturer usage count to a gray value between 50 and 120.""" + min_gray = 50 / 255 + max_gray = 120 / 255 + + if max_count <= min_count: + return min_gray + + factor = (count - min_count) / (max_count - min_count) + gray = min_gray + factor * (max_gray - min_gray) + return min(max_gray, max(min_gray, gray)) + + def position_manufacturer_buttons(self): + """Position manufacturer buttons in the asset bar. + + The number of manufacturer buttons is determined + by the number of unique manufacturers in the search results, + up to a maximum defined by self.max_manufacturer_filters. + The buttons are sized based on the length of the manufacturer name""" + self.manufacturer_section_height = 0 + + names = self.manufacturer_names[: self.max_manufacturer_filters] + content_width = max(0, self.bar_width - 2 * self.assetbar_margin) + + if not utils.experimental_enabled() or not names or content_width <= 0: + for button in self.manufacturer_buttons: + button.visible = False + return + + max_x = self.bar_width - self.assetbar_margin + + # if needed expand this to multiple rows calculation, + # but not now, let's just hide buttons that don't fit in one row + self.manufacturer_section_height = self.filter_button_height + ( + self.free_button_margin * 2 + ) + + if not self.manufacturer_buttons: + return + + counts = self.manufacturer_counts + + base_y = ( + self.active_filter_height + + self.bar_height + + self.other_button_size + + self.filter_button_height + + (self.free_button_margin * 2) + ) + displayed_counts = [counts.get(name, 0) for name in self.manufacturer_names] + + min_count = min(displayed_counts) if displayed_counts else 1 + max_count = max(displayed_counts) if displayed_counts else 1 + + current_left_offset = ( + self.bar_x + self.assetbar_margin + self.free_button_margin + ) + for idx, button in enumerate(self.manufacturer_buttons): + if idx >= len(names): + button.visible = False + continue + name = self.manufacturer_names[idx] + label = self._format_manufacturer_label(name) + + # shift to the right so we leave space for the clear bubble + # button.x += clear_slot + width = ( + ui_bgl.get_text_size( + font_id=1, + text=label.upper(), + text_size=self.free_button_text_size, + )[0] + + self.free_button_margin * 4 + ) + + if self.free_button_margin + width > max_x: + button.visible = False + continue + + button.set_location( + current_left_offset, + self.filter_button_height + base_y, + ) + button.width = width + button.height = self.filter_button_height + button.text = label.upper() + button.text_size = self.free_button_text_size + button.visible = True + button.manufacturer_name = name + count = counts.get(name, min_count) + gray = self._calculate_manufacturer_gray(count, min_count, max_count) + hover_gray = min(gray + 0.1, 1.0) + button.bg_color = (gray, gray, gray, 0.85) + button.hover_bg_color = (hover_gray, hover_gray, hover_gray, 1.0) + + current_left_offset += width + (self.free_button_margin * 2) + + # endregion manufacturer + def position_and_hide_buttons(self): """Position asset buttons in the asset bar and hide unused buttons.""" # position and layout buttons @@ -1525,15 +2685,22 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): button.progress_bar.set_location( asset_x, asset_y + self.button_size - 6 ) + button.author_button.set_location( + asset_x + self.button_margin + self.validation_icon_margin, + asset_y + self.button_margin + self.validation_icon_margin, + ) + if asset_idx < len(sr): button.visible = True button.validation_icon.visible = True button.bookmark_button.visible = False + button.author_button.visible = False # button.progress_bar.visible = True else: button.visible = False button.validation_icon.visible = False button.bookmark_button.visible = False + button.author_button.visible = False button.progress_bar.visible = False if utils.profile_is_validator(): button.red_alert.set_location( @@ -1547,8 +2714,17 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): button.visible = False button.validation_icon.visible = False button.bookmark_button.visible = False + button.author_button.visible = False button.progress_bar.visible = False + self.position_active_filter_buttons() + + # Position expand button and hide it when all results fit in a single row + self.button_expand.set_location( + self.bar_width - self.other_button_size, self.bar_height + ) + self.button_expand.visible = len(sr) > self.wcount + self.button_scroll_down.height = self.bar_height self.button_scroll_down.set_image_position( (0, int((self.bar_height - self.button_size) / 2)) @@ -1558,16 +2734,39 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): (0, int((self.bar_height - self.button_size) / 2)) ) + # endregion updates + + # region setup + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + self._quad_view_state = None + self._restart_pending = False + self.scroll_offset = 0 + self._tooltip_available_height = None + + self.base_bar_height = 0 + + self._last_search_results_id = None + + self.max_active_filter_chips = 12 + self.active_filter_buttons = [] + self.active_filter_height = 0 + + self.max_manufacturer_filters = 10 + self.manufacturer_buttons = [] + self.manufacturer_names = [] + self.manufacturer_counts = Counter() + self.manufacturer_section_height = 0 def on_init(self, context): """Initialize the asset bar operator.""" - self.tooltip_base_size_pixels = 512 + self.tooltip_base_size_pixels = TOOLTIP_SIZE_PX self.tooltip_scale = 1.0 self.bottom_panel_fraction = 0.18 self.needs_tooltip_update = False - self.update_ui_size(bpy.context) + self.update_ui_size(context) + self._quad_view_state = self._is_quad_view(context) # todo move all this to update UI size ui_props = context.window_manager.blenderkitUI @@ -1599,6 +2798,7 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): # we try to put bookmark_buttons before others, because they're on top widgets_panel.extend(self.bookmark_buttons) widgets_panel.extend(self.validation_icons) + widgets_panel.extend(self.author_buttons) widgets_panel.extend(self.progress_bars) widgets = [self.panel] @@ -1608,16 +2808,32 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): widgets += self.tooltip_widgets self.init_widgets(context, widgets) + self.panel.add_widgets(widgets_panel) self.tooltip_panel.add_widgets(self.tooltip_widgets) + stored_area, stored_region = self._unwrap_area_region( + getattr(self, "context", None) + ) + override_ctx = self._build_context_snapshot( + context, + stored_area or context.area, + stored_region or context.region, + ) + self._apply_widget_context(override_ctx) + + # endregion setup + + # region events + def on_invoke(self, context, event): """Invoke the asset bar operator.""" - self.context = context self.instances.append(self) if not context.area: return False + ui_props = context.window_manager.blenderkitUI + self.on_init(context) self.context = context @@ -1625,23 +2841,16 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): if not search.get_search_results(): search.search() - ui_props = context.window_manager.blenderkitUI if ui_props.assetbar_on: - # TODO solve this otherwise to enable more asset bars? - # we don't want to run the assetbar many times, that's why it has a switch on/off behaviour, - # unless being called with 'keep_running' - + # keep_running=True means "reuse" the existing instance instead of toggling it off if not self.keep_running: - # this sends message to the originally running operator, so it quits, and then it ends this one too. - # If it initiated a search, the search will finish in a thread. The switch off procedure is run - # by the 'original' operator, since if we get here, it means - # same operator is already running. ui_props.turn_off = True - # if there was an error, we need to turn off these props so we can restart after 2 clicks + # if there was an error, reset the flag so next invocation can start cleanly ui_props.assetbar_on = False - return False + # Clear stale shutdown flag from previous sessions (e.g. undo or addon reload) + ui_props.turn_off = False ui_props.assetbar_on = True global asset_bar_operator @@ -1654,19 +2863,77 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.set_element_images() self.position_and_hide_buttons() self.hide_tooltip() - # for b in self.buttons: - # b.bookmark_button.visible=False self.panel.set_location(self.bar_x, self.bar_y) - # to hide arrows accordingly self.scroll_update(always=True) self.window = context.window self.area = context.area self.scene = bpy.context.scene + + self._save_and_hide_overlays(context) + return True + def _save_and_hide_overlays(self, context): + """Save and disable viewport overlay stats/text while the asset bar is open.""" + self._saved_overlays = {} + screen = getattr(context.window, "screen", None) if context.window else None + if screen is None: + return + for area in screen.areas: + if area.type != "VIEW_3D": + continue + for space in area.spaces: + if space.type != "VIEW_3D": + continue + try: + ptr = space.as_pointer() + self._saved_overlays[ptr] = { + "show_stats": space.overlay.show_stats, + "show_text": space.overlay.show_text, + } + space.overlay.show_stats = False + space.overlay.show_text = False + except Exception: + pass + break + + def _set_overlays(self, context, show: bool): + """Set or restore viewport overlay stats/text. + + When *show* is True, values are restored from the saved state. + When *show* is False, both flags are forced off (saved state unchanged). + """ + saved = getattr(self, "_saved_overlays", {}) + screen = getattr(context.window, "screen", None) if context.window else None + if screen is None: + return + for area in screen.areas: + if area.type != "VIEW_3D": + continue + for space in area.spaces: + if space.type != "VIEW_3D": + continue + try: + ptr = space.as_pointer() + if show: + state = saved.get(ptr) + if state: + space.overlay.show_stats = state["show_stats"] + space.overlay.show_text = state["show_text"] + else: + space.overlay.show_stats = False + space.overlay.show_text = False + except Exception: + pass + break + + def _restore_overlays(self, context): + """Restore viewport overlay stats/text to their saved state.""" + self._set_overlays(context, show=True) + def on_finish(self, context): # redraw all areas, since otherwise it stays to hang for some more time. # bpy.types.SpaceView3D.draw_handler_remove(self._handle_2d_tooltip, 'WINDOW') @@ -1680,51 +2947,11 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): ui_props.assetbar_on = False ui_props.scroll_offset = self.scroll_offset - # for w in wm.windows: - # for a in w.screen.areas: - # a.tag_redraw() + self._restore_overlays(context) + self._finished = True - - def update_tooltip_image(self, asset_id): - """Update tooltip image when it finishes downloading and the downloaded image matches the active one.""" - search_results = search.get_search_results() - if search_results is None: - return - - if self.active_index == -1: # prev search got no results - return - - if self.active_index >= len(search_results): - return - - asset_data = search_results[self.active_index] - if asset_data["assetBaseId"] == asset_id: - set_thumb_check(self.tooltip_image, asset_data, thumb_type="thumbnail") - - def update_comments_for_validators(self, asset_data): - """Update the comments section in the tooltip for validator profiles.""" - if not utils.profile_is_validator(): - return - - comments = global_vars.DATA.get("asset comments", {}) - comments = comments.get(asset_data["assetBaseId"], []) - comment_text = "No comments yet." - if comments is not None: - comment_text = "" - # iterate comments from last to first - for comment in reversed(comments): - comment_text += f"{comment['userName']}:\n" - # strip urls and stuff - comment_lines = comment["comment"].split("\n") - for line in comment_lines: - urls, text = utils.has_url(line) - if urls: - comment_text += f"{text}{urls[0][0]}\n" - else: - comment_text += f"{text}\n" - comment_text += "\n" - - self.comments.text = comment_text + # to ensure the asset buttons are removed from screen + self._redraw_tracked_regions() # handlers def enter_button(self, widget): @@ -1732,6 +2959,7 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): if not hasattr(widget, "button_index") or widget.button_index < 0: return # click on left/right arrow button gave no attr button_index # we should detect on which button_index scroll/left/right happened to refresh shown thumbnail + bpy.context.window.cursor_set("HAND") search_index = widget.button_index + self.scroll_offset if search_index < self.search_results_count: @@ -1749,131 +2977,306 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): ui_props.active_index = search_index # + self.scroll_offset # Update tooltip size based on asset type - if ( - asset_data["assetType"].lower() == "printable" - and self.show_photo_thumbnail - ): - photo_img = ui.get_full_photo_thumbnail(asset_data) - if photo_img: - self.tooltip_image.set_image(photo_img.filepath) - self.tooltip_image.set_image_colorspace("") - else: - self.tooltip_image.set_image( - paths.get_addon_thumbnail_path("thumbnail_notready.jpg") - ) - else: + thumbnail_found = False + self.tooltip_image_help.visible = False + if asset_data["assetType"].lower() in { + "printable", + "model", + "scene", + } and self.show_thumbnail_variant in {"PHOTO", "WIREFRAME"}: + t_type = self.show_thumbnail_variant.lower() + if t_type == "photo": + photo_img = ui.get_full_photo_thumbnail(asset_data) + if photo_img: + self.tooltip_image.set_image(photo_img.filepath) + self.tooltip_image.set_image_colorspace("") + thumbnail_found = True + else: + self.tooltip_image.set_image( + paths.get_addon_thumbnail_path("thumbnail_notready.jpg") + ) + self.tooltip_image_help.text = "Photo thumbnail not ready yet." + self.tooltip_image_help.visible = True + + elif t_type == "wireframe": + wire_img = ui.get_full_wire_thumbnail(asset_data) + if wire_img: + self.tooltip_image.set_image(wire_img.filepath) + self.tooltip_image.set_image_colorspace("") + thumbnail_found = True + else: + self.tooltip_image.set_image( + paths.get_addon_thumbnail_path("thumbnail_notready.jpg") + ) + self.tooltip_image_help.text = ( + "Wireframe thumbnail not ready yet." + ) + self.tooltip_image_help.visible = True + + if not thumbnail_found: set_thumb_check(self.tooltip_image, asset_data, thumb_type="thumbnail") get_tooltip_data(asset_data) - an = asset_data["displayName"] - max_name_length = 30 - if len(an) > max_name_length + 3: - an = an[:30] + "..." + is_author = asset_data.get("assetType") == "author" - search_props = utils.get_search_props() + if is_author: + # --- Author-specific tooltip content --- + an = asset_data.get("displayName", "") + max_name_length = 30 + if len(an) > max_name_length + 3: + an = an[:30] + "..." + self.asset_name.text = an - # if in top nodegroup category, show which type the nodegroup is - if ( - asset_data["assetType"] == "nodegroup" - and search_props.search_category == "nodegroup" - ): - an = f"{an} - {asset_data['dictParameters']['nodeType']} nodes" + # Show asset count next to name using authors_name (right-aligned) + asset_count = asset_data["tooltip_data"].get("asset_count", 0) + if asset_count > 0: + self.authors_name.text = f"{asset_count} assets" + self.authors_name.text_color = (0.7, 0.7, 0.7, 0.8) + self.authors_name.visible = True + else: + self.authors_name.visible = False - self.asset_name.text = an - self.authors_name.text = asset_data["tooltip_data"]["author_text"] + # Show aboutMe in the dedicated multiline label with word wrapping + about_me = asset_data["tooltip_data"].get("about_me", "") + max_about_lines = 8 + # Estimate chars per line from tooltip width and font size + chars_per_line = max( + 20, int(self.tooltip_width / (self.author_text_size * 0.65)) + ) + lines = [] + if about_me: + # Word-wrap aboutMe text + all_wrapped = [] + for paragraph in about_me.split("\n"): + words = paragraph.split() + current_line = "" + for word in words: + if ( + current_line + and len(current_line) + 1 + len(word) > chars_per_line + ): + all_wrapped.append(current_line) + current_line = word + else: + current_line = ( + f"{current_line} {word}" if current_line else word + ) + if current_line: + all_wrapped.append(current_line) + # Limit to max_about_lines, add ellipsis if truncated + if len(all_wrapped) > max_about_lines: + all_wrapped = all_wrapped[:max_about_lines] + last = all_wrapped[-1] + if len(last) + 3 > chars_per_line: + last = last[: chars_per_line - 3] + all_wrapped[-1] = last + "..." + lines.extend(all_wrapped) + about_text = "\n".join(lines) + self.author_about_me.text = about_text + self.author_about_me.visible = True - # Hide ratings for addons - is_addon = asset_data.get("assetType") == "addon" - if not is_addon: - quality_text = asset_data["tooltip_data"]["quality"] - if utils.profile_is_validator(): - quality_text += f" / {int(asset_data['score'])}" - self.quality_label.text = quality_text - self.quality_label.visible = True - self.quality_star.visible = True - else: + # Set tooltip image to gravatar + author_id = int( + asset_data.get("id", asset_data.get("author", {}).get("id", 0)) + ) + author = global_vars.BKIT_AUTHORS.get(author_id) + if author is not None and author.gravatarImg: + self.tooltip_image.set_image(author.gravatarImg) + else: + img_path = paths.get_addon_thumbnail_path("thumbnail_notready.jpg") + self.tooltip_image.set_image(img_path) + self.tooltip_image.set_image_colorspace("") + + # Show help text + self.tooltip_image_help.text = "Click to search assets by this author" + self.tooltip_image_help.visible = True + + # Hide widgets that don't apply to authors + self.gravatar_image.visible = False self.quality_label.visible = False self.quality_star.visible = False - - # Update price label for addons - price_text = asset_data["tooltip_data"].get("price_text", "") - price_color = asset_data["tooltip_data"].get( - "price_color", (1.0, 0.8, 0.2, 1.0) - ) - price_background = asset_data["tooltip_data"].get( - "price_background", (0.2, 0.2, 0.2, 0.0) - ) - self.price_label.text = price_text - self.price_label.text_color = price_color - self.price_label.visible = bool(price_text) - self.price_label.bg_color = price_background - - # preview comments for validators - self.update_comments_for_validators(asset_data) - - from_newer, difference = utils.asset_from_newer_blender_version(asset_data) - if from_newer: - if difference == "major": - self.version_warning.text = f"Made in Blender {asset_data['sourceAppVersion']}! Use at your own risk." - elif difference == "minor": - self.version_warning.text = f"Made in Blender {asset_data['sourceAppVersion']}! Caution advised." - else: - self.version_warning.text = f"Made in Blender {asset_data['sourceAppVersion']}! Some features may not work." - else: + self.multi_price_label.visible = False self.version_warning.text = "" - - author_id = int(asset_data["author"]["id"]) - author = global_vars.BKIT_AUTHORS.get(author_id) - if author is None: - bk_logger.info("\n\n\nget_tooltip_data() AUTHOR NOT FOUND", author_id) - - if author is not None and author.gravatarImg: - self.gravatar_image.set_image(author.gravatarImg) else: - img_path = paths.get_addon_thumbnail_path("thumbnail_notready.jpg") - self.gravatar_image.set_image(img_path) - self.gravatar_image.set_image_colorspace("") + # --- Regular asset tooltip content --- + self.author_about_me.visible = False + + an = asset_data["displayName"] + max_name_length = 30 + if len(an) > max_name_length + 3: + an = an[:30] + "..." + + search_props = utils.get_search_props() + + # if in top nodegroup category, show which type the nodegroup is + if ( + asset_data["assetType"] == "nodegroup" + and search_props.search_category == "nodegroup" + ): + an = f"{an} - {asset_data['dictParameters']['nodeType']} nodes" + + self.asset_name.text = an + self.authors_name.text = asset_data["tooltip_data"]["author_text"] + self.authors_name.visible = True + self.gravatar_image.visible = True + + # Hide ratings for addons + is_addon = asset_data.get("assetType") == "addon" + if not is_addon: + quality_text = asset_data["tooltip_data"]["quality"] + if utils.profile_is_validator(): + quality_text += f" / {int(asset_data['score'])}" + self.quality_label.text = quality_text + self.quality_label.visible = True + self.quality_star.visible = True + else: + self.quality_label.visible = False + self.quality_star.visible = False + + # Update price labels for addons + user_price_text = asset_data["tooltip_data"].get("user_price_text", "") + base_price_text = asset_data["tooltip_data"].get("base_price_text", "") + + user_price_text_color = asset_data["tooltip_data"].get( + "user_price_color", "" + ) + base_price_text_color = asset_data["tooltip_data"].get( + "base_price_color", "" + ) + + user_price_background_color = asset_data["tooltip_data"].get( + "user_price_bg_color", "" + ) + base_price_background_color = asset_data["tooltip_data"].get( + "base_price_bg_color", "" + ) + + self.multi_price_label.text_a = user_price_text + self.multi_price_label.text_a_color = user_price_text_color + self.multi_price_label.segment_background_color_a = ( + user_price_background_color + ) + + self.multi_price_label.text_b = base_price_text + self.multi_price_label.text_b_color = base_price_text_color + self.multi_price_label.segment_background_color_b = ( + base_price_background_color + ) + + self.multi_price_label.multiline = True + + if user_price_text and base_price_text: + self.multi_price_label.strikethrough_b = True + self.multi_price_label.visible = True + self.multi_price_label.segment_backgrounds = True + elif user_price_text or base_price_text: + self.multi_price_label.visible = True + self.multi_price_label.strikethrough_b = False + self.multi_price_label.segment_backgrounds = True + else: + self.multi_price_label.visible = False + self.multi_price_label.strikethrough_b = False + self.multi_price_label.segment_backgrounds = False + + # preview comments for validators + self.update_comments_for_validators(asset_data) + + from_newer, difference = utils.asset_from_newer_blender_version( + asset_data + ) + if from_newer: + if difference == "major": + self.version_warning.text = f"Made in Blender {asset_data['sourceAppVersion']}! Use at your own risk." + elif difference == "minor": + self.version_warning.text = f"Made in Blender {asset_data['sourceAppVersion']}! Caution advised." + else: + self.version_warning.text = f"Made in Blender {asset_data['sourceAppVersion']}! Some features may not work." + else: + self.version_warning.text = "" + + author_id = int(asset_data["author"]["id"]) + author = global_vars.BKIT_AUTHORS.get(author_id) + if author is None: + bk_logger.info( + "\n\n\nget_tooltip_data() AUTHOR NOT FOUND", author_id + ) + + if author is not None and author.gravatarImg: + self.gravatar_image.set_image(author.gravatarImg) + else: + img_path = paths.get_addon_thumbnail_path("thumbnail_notready.jpg") + self.gravatar_image.set_image(img_path) + self.gravatar_image.set_image_colorspace("") + + area, region = self._current_area_region() properties_width = 0 - for r in bpy.context.area.regions: - if r.type == "UI": - properties_width = r.width + if area is not None: + for r in getattr(area, "regions", []): + if r.type == "UI": + properties_width = r.width + break + + # reset tooltip sizing so each spawn starts from base values + self._reset_tooltip_dimensions() + + fallback_region = getattr(bpy.context, "region", None) + active_region = region or fallback_region + region_width = getattr(active_region, "width", None) + if region_width is None: + region_width = self.tooltip_panel.width + properties_width + region_height = getattr(active_region, "height", None) + if region_height is None: + region_height = self.tooltip_panel.height + widget.height + tooltip_x = min( int(widget.x_screen), - int( - bpy.context.region.width - - self.tooltip_panel.width - - properties_width - ), + int(region_width - self.tooltip_panel.width - properties_width), ) + tooltip_x = max(0, tooltip_x) - # Calculate space above and below the button - ui_scale = self.get_ui_scale() + # Calculate space above and below the button to decide tooltip placement full_tooltip_height = self.tooltip_panel.height space_above = widget.y_screen - space_below = bpy.context.region.height - (widget.y_screen + widget.height) - # If space below is insufficient (would make tooltip < 70% size), position above - if ( + space_below = region_height - (widget.y_screen + widget.height) + place_above = ( space_below < full_tooltip_height and space_below < full_tooltip_height * 0.7 and space_below < space_above - ): - tooltip_y = int(widget.y_screen - full_tooltip_height) + ) + + if place_above: + available_height = space_above else: - tooltip_y = int(widget.y_screen + widget.height) + available_height = space_below + + self._tooltip_available_height = max(64, int(available_height)) # need to set image here because of context issues. img_path = paths.get_addon_thumbnail_path("star_grey.png") self.quality_star.set_image(img_path) - # set location twice for size calculations updates. + tooltip_context = self._build_context_snapshot( + bpy.context, area, active_region + ) + self.update_tooltip_size(tooltip_context) + self.update_tooltip_layout(tooltip_context) + tooltip_width = self.tooltip_width + max_x = max(0, int(region_width - tooltip_width - properties_width)) + tooltip_x = min(max(0, int(widget.x_screen)), max_x) + + if place_above: + tooltip_y = int(widget.y_screen - self.tooltip_height) + else: + tooltip_y = int(widget.y_screen + widget.height) + + max_y = max(0, int(region_height - self.tooltip_height)) + tooltip_y = min(max(0, tooltip_y), max_y) + self.tooltip_panel.set_location(tooltip_x, tooltip_y) - self.update_tooltip_size(bpy.context) - self.update_tooltip_layout(bpy.context) - self.tooltip_panel.set_location(self.tooltip_panel.x, self.tooltip_panel.y) self.tooltip_panel.layout_widgets() - # show bookmark button - always on mouse enter - if widget.bookmark_button: + # show bookmark button - always on mouse enter (but not for authors) + if widget.bookmark_button and not is_author: widget.bookmark_button.visible = True # bpy.ops.wm.blenderkit_asset_popup('INVOKE_DEFAULT') @@ -1891,13 +3294,10 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): ui_props.active_index = self.active_index bpy.context.window.cursor_set("DEFAULT") # hide bookmark button - only when Not bookmarked + # make sure to transfer some data, to prevent missing attribute + widget.bookmark_button.asset_index = widget.button_index + widget.author_button.asset_index = widget.button_index self.update_bookmark_icon(widget.bookmark_button) - # popup asset card on mouse down - # if utils.experimental_enabled(): - # h = widget.get_area_height() - # if utils.experimental_enabled() and self.mouse_y> + # url = author.aboutMeUrl + + # blenderkit site profile >> + url = paths.get_author_gallery_url(author_id) + if url is None: + bk_logger.warning("url is none") + return + bpy.ops.wm.url_open(url=url) + def drag_drop_asset(self, widget): """Start drag and drop operation for the asset linked to this button.""" now = time.time() # avoid double click to download assets under panels, mainly category panel if now - ui_panels.last_time_overlay_panel_active < 0.5: return + ui_props = bpy.context.window_manager.blenderkitUI + if ui_props.dragging: + return + + # Author assets: clicking/dragging triggers search-by-author instead + search_index = widget.search_index + self.scroll_offset + sr = search.get_search_results() + if sr and 0 <= search_index < len(sr): + if sr[search_index].get("assetType") == "author": + self.search_by_author(search_index) + return + # start drag drop bpy.ops.view3d.asset_drag_drop( "INVOKE_DEFAULT", - asset_search_index=widget.search_index + self.scroll_offset, + asset_search_index=search_index, ) def cancel_press(self, widget): @@ -1942,9 +3376,275 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): # Restart the asset bar to apply the new layout self.restart_asset_bar() + def handle_key_input(self, event): + """Handle keyboard shortcuts for asset bar operations.""" + # Check if enough time has passed since last popup/text input activity + # to prevent shortcuts from triggering while typing in text fields + now = time.time() + if now - ui_panels.last_time_overlay_panel_active < 0.5: + return False + + # Shortcut: Toggle between normal, photo and wireframe thumbnail + if event.type in {"ONE"}: + if self.show_thumbnail_variant != "THUMBNAIL": + self.show_thumbnail_variant = "THUMBNAIL" + self.needs_tooltip_update = True + if event.type in {"TWO"}: + if self.show_thumbnail_variant != "PHOTO": + self.show_thumbnail_variant = "PHOTO" + self.needs_tooltip_update = True + if event.type in {"THREE"}: + if self.show_thumbnail_variant != "WIREFRAME": + self.show_thumbnail_variant = "WIREFRAME" + self.needs_tooltip_update = True + if ( + event.type in {"LEFT_BRACKET", "RIGHT_BRACKET"} + and not event.shift + and self.active_index > -1 + ): + # iterate index and update tooltip + c_idx = 0 + was_thumbnail_variant = self.show_thumbnail_variant + if self.show_thumbnail_variant in THUMBNAIL_TYPES: + c_idx = THUMBNAIL_TYPES.index(self.show_thumbnail_variant) + + if event.type == "LEFT_BRACKET": + c_idx -= 1 + elif event.type == "RIGHT_BRACKET": + c_idx += 1 + # clamp index - no rollover + c_idx = min(max(c_idx, 0), len(THUMBNAIL_TYPES) - 1) + + if was_thumbnail_variant == THUMBNAIL_TYPES[c_idx]: + return True + # else update + self.show_thumbnail_variant = THUMBNAIL_TYPES[c_idx] + self.needs_tooltip_update = True + return True + + # Check if active asset is an author (for guarding shortcuts below) + _is_author_active = False + if self.active_index > -1: + _sr = search.get_search_results() + if _sr and self.active_index < len(_sr): + _is_author_active = _sr[self.active_index].get("assetType") == "author" + + # Shortcut: Search by author + if event.type == "A": + self.search_by_author(self.active_index) + return True + + # Shortcut: Delete asset from hard-drive (not for authors) + if event.type == "X" and self.active_index > -1 and not _is_author_active: + # delete downloaded files for this asset + sr = search.get_search_results() + asset_data = sr[self.active_index] + bk_logger.info("deleting asset from local drive: %s", asset_data["name"]) + paths.delete_asset_debug(asset_data) + asset_data["downloaded"] = 0 + return True + + # Shortcut: Open Author's personal Webpage + if event.type == "W" and self.active_index > -1: + sr = search.get_search_results() + asset_data = sr[self.active_index] + author_id = int(asset_data["author"]["id"]) + author = global_vars.BKIT_AUTHORS.get(author_id) + if author is None: + bk_logger.warning("author is none") + return True + utils.p("author:", author) + url = author.aboutMeUrl + if url is None: + bk_logger.warning("url is none") + return True + bpy.ops.wm.url_open(url=url) + return True + + # Shortcut: Search Similar (not for authors) + if event.type == "S" and self.active_index > -1 and not _is_author_active: + self.search_similar(self.active_index) + return True + + if event.type == "C" and self.active_index > -1 and not _is_author_active: + self.search_in_category(self.active_index) + return True + + if event.type == "B" and self.active_index > -1 and not _is_author_active: + sr = search.get_search_results() + asset_data = sr[self.active_index] + bpy.ops.wm.blenderkit_bookmark_asset(asset_id=asset_data["id"]) + return True + + # Shortcut: Open Author's profile on BlenderKit + if event.type == "P" and self.active_index > -1: + sr = search.get_search_results() + asset_data = sr[self.active_index] + author_id = int(asset_data["author"]["id"]) + author = global_vars.BKIT_AUTHORS.get(author_id) + if author is None: + return True + utils.p("author:", author) + url = paths.get_author_gallery_url(author.id) + bpy.ops.wm.url_open(url=url) + return True + + # FastRateMenu (not for authors) + if ( + event.type == "R" + and self.active_index > -1 + and not event.shift + and not _is_author_active + ): + sr = search.get_search_results() + asset_data = sr[self.active_index] + if not utils.user_is_owner(asset_data=asset_data): + bpy.ops.wm.blenderkit_menu_rating_upload( + asset_name=asset_data["name"], + asset_id=asset_data["id"], + asset_type=asset_data["assetType"], + ) + return True + + if ( + event.type == "V" + and event.shift + and self.active_index > -1 + and not _is_author_active + and utils.profile_is_validator() + ): + sr = search.get_search_results() + asset_data = sr[self.active_index] + bpy.ops.object.blenderkit_change_status( + asset_id=asset_data["id"], state="validated" + ) + return True + + if ( + event.type == "H" + and event.shift + and self.active_index > -1 + and not _is_author_active + and utils.profile_is_validator() + ): + sr = search.get_search_results() + asset_data = sr[self.active_index] + bpy.ops.object.blenderkit_change_status( + asset_id=asset_data["id"], state="on_hold" + ) + return True + + if ( + event.type == "U" + and event.shift + and self.active_index > -1 + and not _is_author_active + and utils.profile_is_validator() + ): + sr = search.get_search_results() + asset_data = sr[self.active_index] + bpy.ops.object.blenderkit_change_status( + asset_id=asset_data["id"], state="uploaded" + ) + return True + + if ( + event.type == "R" + and event.shift + and self.active_index > -1 + and not _is_author_active + and utils.profile_is_validator() + ): + sr = search.get_search_results() + asset_data = sr[self.active_index] + bpy.ops.object.blenderkit_change_status( + asset_id=asset_data["id"], state="rejected" + ) + return True + + return False # Let other shortcuts be handled + + def scroll_up(self, widget): + """Scroll up in the asset bar.""" + self.scroll_offset += self.wcount * self.hcount + self.scroll_update() + self.enter_button(widget) + + def scroll_down(self, widget): + """Scroll down in the asset bar.""" + self.scroll_offset -= self.wcount * self.hcount + self.scroll_update() + self.enter_button(widget) + + # endregion events + + # region actions + + def apply_term_filter(self, widget: BL_UI_Button, *, term: str): + """Apply term filter based on the clicked bubble.""" + value = getattr(widget, f"{term}_name", "") + if not value: + self.clear_term_filter(widget, term=term) + return + + label = getattr(widget, "text", value) + # Mark data-driven filters so we can drop them when the asset type changes + search.set_active_filter(term=term, value=value, label=label, origin="data") + search.update_filters() + search.create_history_step(search.get_active_tab()) + search.search() + self.update_ui_size(bpy.context) + self.scroll_update(always=True) + + def clear_term_filter(self, widget: BL_UI_Button, *, term: str): + """Remove term filter from the search keywords.""" + search.remove_active_filter(term=term) + search.update_filters() + search.create_history_step(search.get_active_tab()) + search.search() + self.update_ui_size(bpy.context) + self.scroll_update(always=True) + + def _filter_out_term(self, term: str, keywords: str): + """Remove term:* tokens using regex; return clean token list without extra +/spaces.""" + # strip term segments that may contain spaces until the next '+' or string end + without_term = re.sub( + rf"(?:^|\+)\s*{term}:[^+]+", "", keywords, flags=re.IGNORECASE + ) + # normalize plus separators and drop empty pieces + tokens = [part for part in without_term.replace(" ", "").split("+") if part] + return tokens + + def remove_active_filter_chip(self, widget: BL_UI_Button): + active_filter = getattr(widget, "active_filter", None) + if not active_filter: + return + search.remove_active_filter( + term=active_filter.get("term", ""), value=active_filter.get("value") + ) + search.update_filters() + search.create_history_step(search.get_active_tab()) + search.search() + self.update_ui_size(bpy.context) + self.scroll_update(always=True) + def asset_menu(self, widget): """Open the asset menu for the asset linked to this button.""" self.hide_tooltip() + target_index = getattr(widget, "button_index", None) + if target_index is None: + target_index = getattr(widget, "asset_index", None) + if target_index is not None: + search_index = target_index + self.scroll_offset + history_step = search.get_active_history_step() + sr = history_step.get("search_results") or [] + if 0 <= search_index < len(sr): + # No context menu for author results + if sr[search_index].get("assetType") == "author": + return + self.active_index = search_index + ui_props = bpy.context.window_manager.blenderkitUI + ui_props.active_index = search_index bpy.ops.wm.blenderkit_asset_popup("INVOKE_DEFAULT") # bpy.ops.wm.call_menu(name='OBJECT_MT_blenderkit_asset_menu') @@ -1972,6 +3672,9 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): if asset_index >= len(sr): return asset_data = sr[asset_index] + if asset_data.get("assetType") == "author": + bookmark_button.visible = False + return rating = ratings_utils.get_rating_local(asset_data["id"]) if rating is not None and rating.bookmarks == 1: icon = "bookmark_full.png" @@ -2011,11 +3714,13 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): pb.visible = False return - if bpy.context.region is not None: - bpy.context.region.tag_redraw() + self._safe_tag_redraw(bpy.context.region) def update_validation_icon(self, asset_button, asset_data: dict): """Update the validation icon for each button in asset bar.""" + if asset_data.get("assetType") == "author": + asset_button.validation_icon.visible = False + return if utils.profile_is_validator(): rating = global_vars.RATINGS.get(asset_data["id"]) v_icon = ui.verification_icons[ @@ -2059,6 +3764,10 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): sr = history_step.get("search_results") if not sr: return + visible_results = [] + + # remember also position for manufacturer buttons + for asset_button in self.asset_buttons: if asset_button.visible: asset_button.asset_index = ( @@ -2070,18 +3779,38 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): asset_data = sr[asset_button.asset_index] if asset_data is None: continue - - # show indices for debug purposes - # asset_button.text = str(asset_button.asset_index) + # update bookmark buttons + asset_button.bookmark_button.asset_index = asset_button.asset_index + # update author profile buttons + asset_button.author_button.asset_index = asset_button.asset_index set_thumb_check( asset_button, asset_data, thumb_type="thumbnail_small" ) - # asset_button.set_image(img_filepath) - self.update_validation_icon(asset_button, asset_data) + # Distinguish author cards with a blue border and author icon + if asset_data.get("assetType") == "author": + asset_button.background_border_thickness = 3.0 + asset_button.author_button.visible = True + asset_button.background_corner_radius = 12.0 + asset_button.image_corner_radius = 12.0 + asset_button.background_padding = [-1.0, -1.0] + asset_button.background_border = True + asset_button.background_border_color = colors.ACTIVE_BLUE + asset_button.use_rounded_background = True + asset_button.image_padding = ( + asset_button.background_border_thickness + ) + else: + asset_button.background_border = False + asset_button.background_border_color = None + asset_button.author_button.visible = False + asset_button.use_rounded_background = False + asset_button.background_corner_radius = 0.0 + asset_button.image_corner_radius = None + asset_button.background_padding = [0.0, 0.0] + asset_button.image_padding = 0.0 - # update bookmark buttons - asset_button.bookmark_button.asset_index = asset_button.asset_index + self.update_validation_icon(asset_button, asset_data) self.update_bookmark_icon(asset_button.bookmark_button) @@ -2102,16 +3831,23 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): asset_button.red_alert.visible = False elif utils.profile_is_validator(): asset_button.red_alert.visible = False + visible_results.append(asset_data) + else: asset_button.visible = False asset_button.validation_icon.visible = False asset_button.bookmark_button.visible = False + asset_button.author_button.visible = False asset_button.progress_bar.visible = False if utils.profile_is_validator(): asset_button.red_alert.visible = False + # Refresh manufacturer chips to match currently visible assets + self._update_manufacturer_data(visible_results) + def scroll_update(self, always=False): """Update scroll position and visibility of scroll buttons.""" + self.hide_tooltip() history_step = search.get_active_history_step() sr = history_step.get("search_results") sro = history_step.get("search_results_orig") @@ -2156,21 +3892,42 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): history_step = search.get_active_history_step() sr = history_step.get("search_results", []) asset_data = sr[asset_index] - a = asset_data["author"]["id"] - if a is not None: - sprops = utils.get_search_props() - ui_props = bpy.context.window_manager.blenderkitUI - # if there is already an author id in the search keywords, remove it first, the author_id can be any so - # use regex to find it - # for validators, set verification status to ALL - if utils.profile_is_validator(): - sprops.search_verification_status = "ALL" - ui_props.search_keywords = re.sub( - r"\+author_id:\d+", "", ui_props.search_keywords - ) - ui_props.search_keywords += f"+author_id:{a}" + author_id = asset_data["author"]["id"] + if author_id is None: + return True - search.search() + # For author-type results, prefer displayName for the filter label + author_name = "" + if asset_data.get("assetType") == "author": + author_name = asset_data.get("displayName", "") + + # For author-type cards, check if asset type picker is enabled + if asset_data.get("assetType") == "author": + preferences = bpy.context.preferences.addons[__package__].preferences + if ( + preferences.experimental_features + and preferences.author_asset_type_picker + ): + # Extract per-type asset counts from author data (assetTypeCounts or ratingsCount) + asset_type_counts = asset_data.get("assetTypeCounts", {}) + if not asset_type_counts: + asset_type_counts = asset_data.get("ratingsCount", {}) + search.AuthorAssetTypePopup._asset_type_counts = asset_type_counts or {} + bpy.ops.view3d.blenderkit_author_asset_type_popup( + "INVOKE_DEFAULT", + author_id=str(author_id), + author_name=author_name, + ) + return True + # Picker not enabled — search by author in current tab + search.search_by_author_id(author_id, author_name) + self.update_ui_size(bpy.context) + self.scroll_update(always=True) + return True + + search.search_by_author_id(author_id, author_name) + self.update_ui_size(bpy.context) + self.scroll_update(always=True) return True def search_similar(self, asset_index): @@ -2195,185 +3952,28 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): ui_props.search_category = category search.search() - def handle_key_input(self, event): - """Handle keyboard shortcuts for asset bar operations.""" - # Check if enough time has passed since last popup/text input activity - # to prevent shortcuts from triggering while typing in text fields - now = time.time() - if now - ui_panels.last_time_overlay_panel_active < 0.5: - return False + # endregion actions - # Shortcut: Toggle between normal and photo thumbnail - if event.type in {"ONE"}: - if self.show_photo_thumbnail == True: - self.show_photo_thumbnail = False - self.needs_tooltip_update = True - if event.type in {"TWO"}: - if self.show_photo_thumbnail == False: - self.show_photo_thumbnail = True - self.needs_tooltip_update = True - if ( - event.type in {"LEFT_BRACKET", "RIGHT_BRACKET"} - and not event.shift - and self.active_index > -1 - ): - self.show_photo_thumbnail = not self.show_photo_thumbnail - self.needs_tooltip_update = True - return True - - # Shortcut: Search by author - if event.type == "A": - self.search_by_author(self.active_index) - return True - - # Shortcut: Delete asset from hard-drive - if event.type == "X" and self.active_index > -1: - # delete downloaded files for this asset - sr = search.get_search_results() - asset_data = sr[self.active_index] - bk_logger.info(f'deleting asset from local drive: {asset_data["name"]}') - paths.delete_asset_debug(asset_data) - asset_data["downloaded"] = 0 - return True - - # Shortcut: Open Author's personal Webpage - if event.type == "W" and self.active_index > -1: - sr = search.get_search_results() - asset_data = sr[self.active_index] - author_id = int(asset_data["author"]["id"]) - author = global_vars.BKIT_AUTHORS.get(author_id) - if author is None: - bk_logger.warning("author is none") - return True - utils.p("author:", author) - url = author.get("aboutMeUrl") - if url is None: - bk_logger.warning("url is none") - return True - bpy.ops.wm.url_open(url=url) - return True - - # Shortcut: Search Similar - if event.type == "S" and self.active_index > -1: - self.search_similar(self.active_index) - return True - - if event.type == "C" and self.active_index > -1: - self.search_in_category(self.active_index) - return True - - if event.type == "B" and self.active_index > -1: - sr = search.get_search_results() - asset_data = sr[self.active_index] - bpy.ops.wm.blenderkit_bookmark_asset(asset_id=asset_data["id"]) - return True - - # Shortcut: Open Author's profile on BlenderKit - if event.type == "P" and self.active_index > -1: - sr = search.get_search_results() - asset_data = sr[self.active_index] - author_id = int(asset_data["author"]["id"]) - author = global_vars.BKIT_AUTHORS.get(author_id) - if author is None: - return True - utils.p("author:", author) - url = paths.get_author_gallery_url(author.id) - bpy.ops.wm.url_open(url=url) - return True - - # FastRateMenu - if event.type == "R" and self.active_index > -1 and not event.shift: - sr = search.get_search_results() - asset_data = sr[self.active_index] - if not utils.user_is_owner(asset_data=asset_data): - bpy.ops.wm.blenderkit_menu_rating_upload( - asset_name=asset_data["name"], - asset_id=asset_data["id"], - asset_type=asset_data["assetType"], - ) - return True - - if ( - event.type == "V" - and event.shift - and self.active_index > -1 - and utils.profile_is_validator() - ): - sr = search.get_search_results() - asset_data = sr[self.active_index] - bpy.ops.object.blenderkit_change_status( - asset_id=asset_data["id"], state="validated" - ) - return True - - if ( - event.type == "H" - and event.shift - and self.active_index > -1 - and utils.profile_is_validator() - ): - sr = search.get_search_results() - asset_data = sr[self.active_index] - bpy.ops.object.blenderkit_change_status( - asset_id=asset_data["id"], state="on_hold" - ) - return True - - if ( - event.type == "U" - and event.shift - and self.active_index > -1 - and utils.profile_is_validator() - ): - sr = search.get_search_results() - asset_data = sr[self.active_index] - bpy.ops.object.blenderkit_change_status( - asset_id=asset_data["id"], state="uploaded" - ) - return True - - if ( - event.type == "R" - and event.shift - and self.active_index > -1 - and utils.profile_is_validator() - ): - sr = search.get_search_results() - asset_data = sr[self.active_index] - bpy.ops.object.blenderkit_change_status( - asset_id=asset_data["id"], state="rejected" - ) - return True - - return False # Let other shortcuts be handled - - def scroll_up(self, widget): - """Scroll up in the asset bar.""" - self.scroll_offset += self.wcount * self.hcount - self.scroll_update() - self.enter_button(widget) - - def scroll_down(self, widget): - """Scroll down in the asset bar.""" - self.scroll_offset -= self.wcount * self.hcount - self.scroll_update() - self.enter_button(widget) + # region main operations @classmethod def unregister(cls): """Unregister the asset bar operator and clean up instances.""" - bk_logger.debug(f"unregistering class {cls}") + bk_logger.debug("unregistering class %s", cls) instances_copy = cls.instances.copy() for instance in instances_copy: - bk_logger.debug(f"- instance {instance}") + try: + bk_logger.debug("- instance %s", instance) + except ReferenceError: + bk_logger.debug("- instance ") try: instance.unregister_handlers(instance.context) except Exception as e: - bk_logger.debug(f"-- error unregister_handlers(): {e}") + bk_logger.debug("-- error unregister_handlers(): %s", e) try: instance.on_finish(instance.context) except Exception as e: - bk_logger.debug(f"-- error calling on_finish(): {e}") + bk_logger.debug("-- error calling on_finish(): %s", e) cls.instances.remove(instance) def restart_asset_bar(self): @@ -2384,6 +3984,10 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): if a is not None: bpy.ops.view3d.run_assetbar_fix_context(keep_running=True, do_search=False) + # endregion main operations + + # region tab management + def add_new_tab(self, widget): """Add a new tab when the + button is clicked.""" tabs = global_vars.TABS["tabs"] @@ -2391,6 +3995,7 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): "name": f"Tab {len(tabs) + 1}", # Default name with incremented number "history": [], # Empty history list "history_index": -1, # No history yet + "active_filters": [], } tabs.append(new_tab) @@ -2443,6 +4048,35 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): # Restart asset bar to update UI self.restart_asset_bar() + def update_history_buttons_rounding(self): + """Update the rounding of history navigation buttons based on their visibility.""" + if self.history_back_button.visible and self.history_forward_button.visible: + self.history_back_button.background_corner_radius = ( + ROUNDING_RADIUS, + 0, + 0, + 0, + ) + self.history_forward_button.background_corner_radius = ( + 0, + ROUNDING_RADIUS, + 0, + 0, + ) + else: + self.history_back_button.background_corner_radius = ( + ROUNDING_RADIUS, + ROUNDING_RADIUS, + 0, + 0, + ) + self.history_forward_button.background_corner_radius = ( + ROUNDING_RADIUS, + ROUNDING_RADIUS, + 0, + 0, + ) + def switch_to_history_step(self, tab_index, history_index): """Switch to a specific tab and history step.""" # Update UI properties without triggering update callbacks @@ -2472,7 +4106,6 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): # Update UI properties for prop_name, value in ui_state["ui_props"].items(): if hasattr(ui_props, prop_name): - # print(f"Updating UI property: {prop_name} to {value}") # strings need to be quoted if isinstance(value, str): exec(f"ui_props.{prop_name} = '{value}'") @@ -2489,6 +4122,12 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): else: exec(f"search_props.{prop_name} = {value}") + # Restore active filter chips for this tab + active_tab = global_vars.TABS["tabs"][tab_index] + search.set_active_filters_for_tab( + active_tab, ui_state.get("active_filters", []) + ) + # update tab label # only if the button exists if len(self.tab_buttons) > tab_index: @@ -2497,14 +4136,16 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.scroll_offset = history_step.get("scroll_offset", 0) # Update history button visibility - active_tab = global_vars.TABS["tabs"][tab_index] - self.history_back_button.visible = active_tab["history_index"] > 0 self.history_forward_button.visible = ( active_tab["history_index"] < len(active_tab["history"]) - 1 ) + self.update_history_buttons_rounding() - # update tab colors + # Recalculate layout to reflect active filter chip changes on this history step + self.update_ui_size(bpy.context) + + # set colors and rounding for tabs for tab_button in self.tab_buttons: c_tab_index = tab_button.tab_index if c_tab_index == tab_index: @@ -2549,6 +4190,8 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): global_vars.TABS["tabs"][widget.tab_index]["history_index"], ) + # endregion tab management + def handle_bkclientjs_get_asset(task: search.client_tasks.Task): """Handle incoming bkclientjs/get_asset task after the user asked for download in online gallery. How it goes: @@ -2557,7 +4200,7 @@ def handle_bkclientjs_get_asset(task: search.client_tasks.Task): 3. open the asset bar We handle the task in asset_bar_op because we need access to the asset_bar_operator without circular import from search. """ - bk_logger.info(f"handle_bkclientjs_get_asset: {task.result['asset_data']['name']}") + bk_logger.info("handle_bkclientjs_get_asset: %s", task.result["asset_data"]["name"]) # Get asset data from task result asset_data = task.result.get("asset_data") @@ -2583,7 +4226,7 @@ def handle_bkclientjs_get_asset(task: search.client_tasks.Task): try: bpy.ops.view3d.run_assetbar_fix_context(keep_running=True, do_search=False) # type: ignore[attr-defined] except Exception as e: - bk_logger.error(f"Failed to open asset bar: {e}") + bk_logger.error("Failed to open asset bar: %s", e) return # Force redraw of the region if asset bar exists diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/asset_drag_op.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/asset_drag_op.py index 67595fe..d4aff2f 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/asset_drag_op.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/asset_drag_op.py @@ -21,6 +21,7 @@ import logging import math import os import random +from typing import Any, Optional, Set, Tuple, Union import bpy import mathutils @@ -28,8 +29,6 @@ from bpy.props import IntProperty, StringProperty from bpy_extras import view3d_utils from mathutils import Vector -from typing import Any, Optional, Tuple, Set, Union - from . import ( bg_blender, colors, @@ -38,11 +37,12 @@ from . import ( image_utils, paths, reports, + search, ui, ui_bgl, ui_panels, utils, - search, + viewport_utils, ) from .bl_ui_widgets.bl_ui_button import BL_UI_Button from .bl_ui_widgets.bl_ui_drag_panel import BL_UI_Drag_Panel @@ -56,11 +56,8 @@ handler_2d = None handler_3d = None -DEAD_ZONE = 5 # pixels -"""Number of pixels mouse must move to start drag operation.""" - -DRAG_THRESHOLD = 10 # pixels -"""Number of pixels mouse must move to consider as a drag (vs click).""" +DEFAULT_DRAG_THRESHOLD = 30 # pixels +"""Pointer travel in pixels needed before we start rendering full drag hints.""" def is_draw_cb_available(self: bpy.types.Operator, context: bpy.types.Context) -> bool: @@ -106,8 +103,8 @@ def draw_callback_dragging( Returns: None """ - # Only draw 2D elements in the active region where the mouse is. Guard against destroyed operator. + # Only draw 2D elements in the active region where the mouse is. Guard against destroyed operator. if not is_draw_cb_available(self, context): return @@ -356,6 +353,10 @@ def draw_callback_3d_dragging( if not utils.guard_from_crash(): return + # ignore unless we are dragging + if not self.drag: + return + # Only draw 3D elements in VIEW_3D areas, not in outliner if context.area.type != "VIEW_3D": return @@ -522,19 +523,6 @@ def draw_progress( ui_bgl.draw_text(text, x, y + 8, 16, color) -def find_and_activate_instancers( - obj: bpy.types.Object, -) -> Optional[bpy.types.Object]: - for ob in bpy.context.visible_objects: - if ( - ob.instance_type == "COLLECTION" - and ob.instance_collection - and obj.name in ob.instance_collection.objects - ): - utils.activate(ob) - return ob - - def mouse_raycast( region: bpy.types.Region, rv3d: bpy.types.RegionView3D, mx: int, my: int ) -> Tuple[ @@ -741,11 +729,9 @@ def deep_ray_cast(ray_origin: Vector, vec: Vector) -> Tuple[ def object_in_particle_collection(o: bpy.types.Object) -> bool: """checks if an object is in a particle system as instance, to not snap to it and not to try to attach material.""" for p in bpy.data.particles: - if p.render_type == "COLLECTION": - if p.instance_collection: - for o1 in p.instance_collection.objects: - if o1 == o: - return True + if p.render_type == "COLLECTION" and p.instance_collection: + if o in p.instance_collection.objects: + return True if p.render_type == "COLLECTION": if p.instance_object == o: return True @@ -774,22 +760,6 @@ def get_node_tree(context: bpy.types.Context) -> bpy.types.NodeTree: return context.scene.compositing_node_group -def assign_node_tree( - node_space: bpy.types.SpaceNodeEditor, node_tree: bpy.types.NodeTree -) -> None: - """Blender version invariant way to assign a node tree to the current node editor.""" - if bpy.app.version < (5, 0, 0): - node_space.node_tree = node_tree - return - - # blender 5.0+ - # recover the node_group from data and assign it - if hasattr(node_space, "node_group"): - node_space.node_group = bpy.data.node_groups[node_tree.name] - elif hasattr(node_space, "node_tree"): - node_space.node_tree = node_tree - - class AssetDragOperator(bpy.types.Operator): """Drag & drop assets into scene. Operator being drawn when dragging asset.""" @@ -797,9 +767,9 @@ class AssetDragOperator(bpy.types.Operator): bl_label = "BlenderKit asset drag drop" asset_search_index: IntProperty(name="Active Index", default=0) # type: ignore - drag_length: IntProperty(name="Drag_length", default=0) # type: ignore object_name = None + active_operator_id = None def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) @@ -813,32 +783,28 @@ class AssetDragOperator(bpy.types.Operator): self.hovered_outliner_element: Union[bpy.types.Object, bpy.types.Collection] = ( None ) + self.active_window = None + self.active_area = None + self.active_region = None self.orig_active_object = None self.orig_selected_objects = None + self.orig_active_collection = None self.downloader = None # Mouse tracking variables - self.start_mouse_x = None - self.start_mouse_y = None + self.start_mouse_x = 0 + self.start_mouse_y = 0 self.mouse_x = 0 self.mouse_y = 0 self.mouse_screen_x = 0 self.mouse_screen_y = 0 - self.steps = 0 - - # Store the initial active region pointer - self.active_region_pointer = None # Initialize outliner tracking variables - self.hovered_outliner_element = None self.outliner_area = None self.outliner_region = None - self.orig_selected_objects = None - self.orig_active_object = None - self.orig_active_collection = None self.prev_area_type = None # Initialize node editor tracking @@ -858,6 +824,8 @@ class AssetDragOperator(bpy.types.Operator): self.iname = "" self.drag = False + self.steps = 0 + self.closed_assetbar = False def handlers_remove(self) -> None: """Remove all draw handlers.""" @@ -873,11 +841,8 @@ class AssetDragOperator(bpy.types.Operator): self, nodegroup_type: str, editor_type: Optional[str] = None ) -> bool: """Check if a nodegroup of a specific type is compatible with the given editor type.""" - # Direct matches - if nodegroup_type == editor_type: - return True - # Generic nodegroups can work in any editor - elif nodegroup_type is None: + # Direct matches, or invalid editor + if not nodegroup_type or nodegroup_type == editor_type: return True # Otherwise, not compatible return False @@ -958,7 +923,7 @@ class AssetDragOperator(bpy.types.Operator): if obj.type == "MESH": temp_mesh = object_eval.to_mesh() - mapping = create_material_mapping(obj, temp_mesh) + _mapping = create_material_mapping(obj, temp_mesh) target_slot = temp_mesh.polygons[self.face_index].material_index object_eval.to_mesh_clear() else: @@ -1073,7 +1038,7 @@ class AssetDragOperator(bpy.types.Operator): target_collection = "" # Check what type of element we're dropping on - element_type = type(self.hovered_outliner_element).__name__ + _element_type = type(self.hovered_outliner_element).__name__ # If dropping on a collection, set target_collection parameter if isinstance(self.hovered_outliner_element, bpy.types.Collection): @@ -1480,10 +1445,10 @@ class AssetDragOperator(bpy.types.Operator): for window in wins: # first let's test if it's in this window, so we know we shall continue - window_x = window.x * self.resolution_factor - window_y = window.y * self.resolution_factor - window_width = window.width * self.resolution_factor - window_height = window.height * self.resolution_factor + window_x = window.x + window_y = window.y + window_width = window.width + window_height = window.height if ( x < window_x or x > window_x + window_width @@ -1513,7 +1478,6 @@ class AssetDragOperator(bpy.types.Operator): return None context = bpy.context - scene = context.scene view_layer = context.view_layer selected_objects = context.selected_objects active_object = context.active_object @@ -1630,11 +1594,14 @@ class AssetDragOperator(bpy.types.Operator): ): """Get the active object under the mouse cursor during drag.""" - region_data = None - - for space in active_area.spaces: - if space.type == "VIEW_3D": - region_data = space.region_3d + # precise placement in ortho views, and quad view + region_data = viewport_utils.region_data_for_view(active_area, active_region) + if region_data is None: + for space in active_area.spaces: + if space.type == "VIEW_3D": + region_data = getattr(space, "region_3d", None) + if region_data is not None: + break # Need to temporarily override context for raycasting if bpy.app.version < (3, 2, 0): # B3.0, B3.1 - custom context override @@ -1643,9 +1610,7 @@ class AssetDragOperator(bpy.types.Operator): "screen": active_window.screen, "area": active_area, "region": active_region, - "region_data": active_area.spaces[ - 0 - ].region_3d, # Get region_data from space_data + "region_data": region_data, "scene": context.scene, "view_layer": context.view_layer, } @@ -1757,69 +1722,70 @@ class AssetDragOperator(bpy.types.Operator): self.in_node_editor = False self.node_editor_type = None + def _cleanup_drag(self, ui_props, cls, *, reopen_assetbar: bool = False) -> None: + """Shared teardown: remove handlers, restore cursor, reset drag state.""" + self.handlers_remove() + bpy.context.window.cursor_modal_restore() + ui_props.dragging = False + if self.closed_assetbar: + bpy.ops.view3d.run_assetbar_fix_context(keep_running=True, do_search=False) + if reopen_assetbar: + bpy.ops.view3d.blenderkit_asset_bar_widget( + "INVOKE_REGION_WIN", do_search=False + ) + cls.active_operator_id = None + def modal(self, context: bpy.types.Context, event: bpy.types.Event) -> Set[str]: + cls = type(self) ui_props = bpy.context.window_manager.blenderkitUI - self.resolution_factor = ( - bpy.context.preferences.system.pixel_size - / bpy.context.preferences.view.ui_scale - ) - self.mouse_screen_x = int( - context.window.x * self.resolution_factor + event.mouse_x - ) - self.mouse_screen_y = int( - context.window.y * self.resolution_factor + event.mouse_y - ) + self.mouse_screen_x = int(context.window.x + event.mouse_x) + self.mouse_screen_y = int(context.window.y + event.mouse_y) # Find the active region under the mouse cursor using actual screen coordinates - self.active_window, self.active_area, self.active_region = ( - self.find_active_region(self.mouse_screen_x, self.mouse_screen_y) + found_window, found_area, found_region = self.find_active_region( + self.mouse_screen_x, self.mouse_screen_y ) + if ( + found_region is not None + and found_area is not None + and found_window is not None + ): + self.active_window, self.active_area, self.active_region = ( + found_window, + found_area, + found_region, + ) # --- CURSOR VISIBILITY FIX --- if self.active_region is None or self.active_area is None: - bpy.context.window.cursor_modal_set("STOP") + # bpy.context.window.cursor_modal_set("STOP") + bpy.context.window.cursor_modal_restore() return {"PASS_THROUGH"} - elif self.drag: + + if self.drag: bpy.context.window.cursor_modal_set("NONE") # Convert screen coords (bottom-left) to region-local coords # window.x/y and region.x/y are also in bottom-left coordinate system self.mouse_x = int( - self.mouse_screen_x - - self.active_window.x * self.resolution_factor - - self.active_region.x + self.mouse_screen_x - self.active_window.x - self.active_region.x ) self.mouse_y = int( - self.mouse_screen_y - - self.active_window.y * self.resolution_factor - - self.active_region.y + self.mouse_screen_y - self.active_window.y - self.active_region.y ) - if self.start_mouse_x is None or self.start_mouse_y is None: - self.start_mouse_x = self.mouse_x - self.start_mouse_y = self.mouse_y - - # --- REDRAW ALL WINDOWS/AREAS FOR MULTI-WINDOW DRAG --- + # redraw all windows to update cursor and other elements for window in bpy.context.window_manager.windows: for area in window.screen.areas: area.tag_redraw() - current_area_type = self.active_area.type if self.active_area else None + current_area_type = self.active_area.type # Check if we're transitioning out of the outliner - if ( - self.prev_area_type - and self.prev_area_type == "OUTLINER" - and current_area_type != "OUTLINER" - ): - # If we're leaving the outliner, restore the original selection + if self.prev_area_type == "OUTLINER" and current_area_type != "OUTLINER": self.restore_original_selection() - # shift pressed - if event.shift: - self.shift_pressed = True - else: - self.shift_pressed = False + self.shift_pressed = event.shift # Track if we're in a node editor self._handle_node_editor_type(current_area_type, self.active_area) @@ -1832,12 +1798,8 @@ class AssetDragOperator(bpy.types.Operator): # Store the active region pointer for drawing 2D elements only in this region self.active_region_pointer = self.active_region.as_pointer() - # Make sure all 3D views get redrawn - for area in context.screen.areas: - area.tag_redraw() - # Handle outliner interaction - if self.active_area.type == "OUTLINER": + if current_area_type == "OUTLINER": self.hovered_outliner_element = self.find_outliner_element_under_mouse() self.outliner_window = self.active_window self.outliner_area = self.active_area @@ -1853,48 +1815,46 @@ class AssetDragOperator(bpy.types.Operator): self.active_region_pointer = context.region.as_pointer() # are we dragging already? + delta_x = abs(self.start_mouse_x - self.mouse_screen_x) + delta_y = abs(self.start_mouse_y - self.mouse_screen_y) if not self.drag and ( - abs(self.start_mouse_x - self.mouse_x) > DRAG_THRESHOLD - or abs(self.start_mouse_y - self.mouse_y) > DRAG_THRESHOLD + delta_x > DEFAULT_DRAG_THRESHOLD or delta_y > DEFAULT_DRAG_THRESHOLD ): self.drag = True - if self.drag and ui_props.assetbar_on: - # turn off asset bar here, shout start again after finishing drag drop. + if self.drag and ui_props.assetbar_on and not self.closed_assetbar: + # turn off asset bar here; reopen after placement when we actually dragged ui_props.turn_off = True - - if ( - event.type == "ESC" - or not ui.mouse_in_region(context.region, self.mouse_x, self.mouse_y) - ) and (not self.drag or self.steps < DEAD_ZONE): - # this case is for canceling from inside popup card when there's an escape attempt to close the window - return {"PASS_THROUGH"} + self.closed_assetbar = True if event.type in {"RIGHTMOUSE", "ESC"}: # Restore original selection if we changed it self.restore_original_selection() - self.handlers_remove() - bpy.context.window.cursor_modal_restore() - ui_props.dragging = False - bpy.ops.view3d.blenderkit_asset_bar_widget( - "INVOKE_REGION_WIN", do_search=False - ) - + self._cleanup_drag(ui_props, cls, reopen_assetbar=True) return {"CANCELLED"} + self.steps += 1 + + if ( + event.type == "ESC" + or not ui.mouse_in_region(context.region, self.mouse_x, self.mouse_y) + ) and (not self.drag or self.steps < 5): + # this case is for canceling from inside popup card when there's an escape attempt to close the window + return {"PASS_THROUGH"} + sprops = bpy.context.window_manager.blenderkit_models if event.type == "WHEELUPMOUSE": sprops.offset_rotation_amount += sprops.offset_rotation_step elif event.type == "WHEELDOWNMOUSE": sprops.offset_rotation_amount -= sprops.offset_rotation_step - if ( - event.type == "MOUSEMOVE" - or event.type == "WHEELUPMOUSE" - or event.type == "WHEELDOWNMOUSE" - ): - + if event.type in { + "MOUSEMOVE", + "INBETWEEN_MOUSEMOVE", + "WHEELUPMOUSE", + "WHEELDOWNMOUSE", + }: # sometimes active area or region can be None, so we need to check for that if self.active_area is None or self.active_region is None: return {"RUNNING_MODAL"} @@ -1904,11 +1864,7 @@ class AssetDragOperator(bpy.types.Operator): self.has_hit = False # Only perform raycasting in 3D view areas - if ( - self.active_region - and self.active_area - and self.active_area.type == "VIEW_3D" - ): + if current_area_type == "VIEW_3D": # prefetch the drag active object info self.drag_raycast_3d_view( context, @@ -1921,21 +1877,15 @@ class AssetDragOperator(bpy.types.Operator): if self.asset_data["assetType"] in ["model", "printable"]: self.snapped_bbox_min = Vector(self.asset_data["bbox_min"]) self.snapped_bbox_max = Vector(self.asset_data["bbox_max"]) - elif self.active_area.type != "VIEW_3D": + elif current_area_type != "VIEW_3D": # In outliner, don't do raycasting, but keep has_hit to avoid errors self.has_hit = False if event.type == "LEFTMOUSE" and event.value == "RELEASE": - self.mouse_release(context) # Pass context here - self.handlers_remove() - bpy.context.window.cursor_modal_restore() - - bpy.ops.view3d.run_assetbar_fix_context(keep_running=True, do_search=False) - ui_props.dragging = False + self.mouse_release(context) + self._cleanup_drag(ui_props, cls) return {"FINISHED"} - self.steps += 1 - # pass event to assetbar so it can close itself if ui_props.assetbar_on and ui_props.turn_off: return {"PASS_THROUGH"} @@ -1946,9 +1896,29 @@ class AssetDragOperator(bpy.types.Operator): # Before registering callbacks, check for canceling situations: login and localdir popups, sculpt popup/switch sr = search.get_search_results() ui_props = bpy.context.window_manager.blenderkitUI + if ui_props.dragging: + return {"CANCELLED"} + cls = type(self) + if cls.active_operator_id is not None and cls.active_operator_id != id(self): + return {"CANCELLED"} + # Acquire drag lock immediately so concurrent invoke paths cannot race while this invoke initializes. + ui_props.dragging = True + cls.active_operator_id = id(self) + self.closed_assetbar = False # Use the asset_search_index parameter passed to the operator, not the global ui_props.active_index # This is critical for multi-window support where active_index is shared across windows self.asset_data = dict(sr[self.asset_search_index]) + + # Initialize drag-start coordinates immediately in invoke. If mouse-move + # events are sparse (or arrive late), we still compute threshold against + # the true click/press origin instead of first modal tick. + self.mouse_screen_x = int(context.window.x + event.mouse_x) + self.mouse_screen_y = int(context.window.y + event.mouse_y) + self.start_mouse_x = self.mouse_screen_x + self.start_mouse_y = self.mouse_screen_y + # Author assets should not be dragged, cancel immediately + if self.asset_data.get("assetType") == "author": + return {"CANCELLED"} # add-ons if self.asset_data.get("assetType") == "addon" and not self.asset_data.get( "canDownload" @@ -1959,6 +1929,8 @@ class AssetDragOperator(bpy.types.Operator): bpy.ops.wm.blenderkit_url_dialog( "INVOKE_REGION_WIN", url=url, message=message, link_text=link_text ) + ui_props.dragging = False + cls.active_operator_id = None return {"CANCELLED"} if not self.asset_data.get("canDownload"): @@ -1969,6 +1941,8 @@ class AssetDragOperator(bpy.types.Operator): bpy.ops.wm.blenderkit_url_dialog( "INVOKE_REGION_WIN", url=url, message=message, link_text=link_text ) + ui_props.dragging = False + cls.active_operator_id = None return {"CANCELLED"} prefs = bpy.context.preferences.addons[__package__].preferences @@ -1982,26 +1956,31 @@ class AssetDragOperator(bpy.types.Operator): bpy.ops.wm.blenderkit_url_dialog( "INVOKE_REGION_WIN", url=url, message=message, link_text=link_text ) + ui_props.dragging = False + cls.active_operator_id = None return {"CANCELLED"} - if self.asset_data.get("assetType") == "brush": - if not (context.sculpt_object or context.image_paint_object): - # either switch to sculpt mode and layout automatically or show a popup message - if context.active_object and context.active_object.type == "MESH": - bpy.ops.object.mode_set(mode="SCULPT") - self.mouse_release(context) # does the main job with assets + if self.asset_data.get("assetType") == "brush" and not ( + context.sculpt_object or context.image_paint_object + ): + # either switch to sculpt mode and layout automatically or show a popup message + if context.active_object and context.active_object.type == "MESH": + bpy.ops.object.mode_set(mode="SCULPT") + self.mouse_release(context) # does the main job with assets - if bpy.data.workspaces.get("Sculpting") is not None: - bpy.context.window.workspace = bpy.data.workspaces["Sculpting"] - reports.add_report( - "Automatically switched to sculpt mode to use brushes." - ) - else: - message = "Select a mesh and switch to sculpt or image paint modes to use the brushes." - bpy.ops.wm.blenderkit_popup_dialog( - "INVOKE_REGION_WIN", message=message, width=500 - ) - return {"CANCELLED"} + if bpy.data.workspaces.get("Sculpting") is not None: + bpy.context.window.workspace = bpy.data.workspaces["Sculpting"] + reports.add_report( + "Automatically switched to sculpt mode to use brushes." + ) + else: + message = "Select a mesh and switch to sculpt or image paint modes to use the brushes." + bpy.ops.wm.blenderkit_popup_dialog( + "INVOKE_REGION_WIN", message=message, width=500 + ) + ui_props.dragging = False + cls.active_operator_id = None + return {"CANCELLED"} # the arguments we pass the the callback args = (self, context) @@ -2044,48 +2023,25 @@ class AssetDragOperator(bpy.types.Operator): # but if RNA Struct fails we are not longer able to remove it, so we log an error and store None self._handlers_universal[space_type] = handler except (AttributeError, TypeError) as e: - bk_logger.error(f"Could not register handler for {space_type}: {e}") + bk_logger.error("Could not register handler for %s: %s", space_type, e) self._handlers_universal[space_type] = None self.mouse_x = 0 self.mouse_y = 0 - self.mouse_screen_x = 0 - self.mouse_screen_y = 0 - self.steps = 0 + self.mouse_screen_x = self.start_mouse_x + self.mouse_screen_y = self.start_mouse_y # Store the initial active region pointer self.active_region_pointer = context.region.as_pointer() - # Initialize outliner tracking variables - self.hovered_outliner_element = None - self.outliner_area = None - self.outliner_region = None - self.orig_selected_objects = None - self.orig_active_object = None - self.orig_active_collection = None self.prev_area_type = context.area.type # Track previous area type - # Initialize node editor tracking - self.in_node_editor = False - self.node_editor_type = None - - self.shift_pressed = False - - # Initialize has_hit to False, and set other 3D properties - # We'll only use these in 3D views, not in outliner - self.has_hit = False - self.snapped_location = (0, 0, 0) - self.snapped_normal = (0, 0, 1) - self.snapped_rotation = (0, 0, 0) - self.face_index = 0 - self.matrix = None - self.iname = f".{self.asset_data['thumbnail_small']}" self.iname = (self.iname[:63]) if len(self.iname) > 63 else self.iname - bpy.context.window.cursor_modal_set("NONE") + bpy.context.window.cursor_modal_restore() ui_props = bpy.context.window_manager.blenderkitUI - ui_props.dragging = True self.drag = False + self.steps = 0 context.window_manager.modal_handler_add(self) return {"RUNNING_MODAL"} @@ -2245,7 +2201,7 @@ class DownloadGizmoOperator(BL_UI_OT_draw_operator): self.button_close.set_image_size((button_size, button_size)) self.button_close.set_image_position((0, 0)) - directory = paths.get_temp_dir("%s_search" % self.asset_data["assetType"]) + directory = paths.get_temp_dir(f"{self.asset_data['assetType']}_search") thumbnail_path = os.path.join(directory, self.asset_data["thumbnail_small"]) self.image.set_image(thumbnail_path) @@ -2296,7 +2252,10 @@ class DownloadGizmoOperator(BL_UI_OT_draw_operator): bk_logger.debug("unregistering class %s", cls) instances_copy = cls.instances.copy() for instance in instances_copy: - bk_logger.debug("- class instance %s", instance) + try: + bk_logger.debug("- class instance %s", instance) + except ReferenceError: + bk_logger.debug("- class instance ") try: instance.unregister_handlers(instance.context) except Exception as e: @@ -2407,37 +2366,6 @@ def create_material_mapping(obj, temp_mesh): return mapping -def add_set_material_node(tree): - """Add a Set Material node at the end of the node tree""" - # Find output node - output_node = None - for node in tree.nodes: - if node.type == "GROUP_OUTPUT": - output_node = node - break - - if output_node: - # Create Set Material node - set_mat_node = tree.nodes.new("GeometryNodeSetMaterial") - # Position it before output - set_mat_node.location = (output_node.location.x - 200, output_node.location.y) - - # Connect nodes - last_geometry_socket = None - for source in output_node.inputs: - if source.type == "GEOMETRY": - if source.is_linked: - last_geometry_socket = source.links[0].from_socket - break - - if last_geometry_socket: - tree.links.new(last_geometry_socket, set_mat_node.inputs["Geometry"]) - tree.links.new(set_mat_node.outputs["Geometry"], output_node.inputs[0]) - - return set_mat_node - return None - - classes = ( AssetDragOperator, DownloadGizmoOperator, diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/asset_inspector.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/asset_inspector.py index 247d36b..e93d18f 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/asset_inspector.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/asset_inspector.py @@ -30,6 +30,13 @@ RENDER_OBTYPES = ["MESH", "CURVE", "SURFACE", "METABALL", "TEXT"] _BLE_5_PLUS = bpy.app.version >= (5, 0, 0) +def _image_tile_count(image) -> int: + """Return the number of tiles for a UDIM image, 1 for regular images.""" + if getattr(image, "source", "") == "TILED" and hasattr(image, "tiles"): + return max(1, len(image.tiles)) + return 1 + + def check_material(props, mat): e = bpy.context.scene.render.engine shaders = [] @@ -62,7 +69,10 @@ def check_material(props, mat): if n.image not in textures: textures.append(n.image) props.texture_count += 1 - total_pixels += n.image.size[0] * n.image.size[1] + # Multiply per-tile pixel area by tile count so that + # UDIM images (source='TILED') report the correct total. + n_tiles = _image_tile_count(n.image) + total_pixels += n_tiles * n.image.size[0] * n.image.size[1] maxres = max(n.image.size[0], n.image.size[1]) props.texture_resolution_max = max( @@ -138,7 +148,10 @@ def check_render_engine(props, obs): textures.append(n.image) props.texture_count += 1 - total_pixels += n.image.size[0] * n.image.size[1] + # Multiply per-tile pixel area by tile count so that + # UDIM images (source='TILED') report the correct total. + n_tiles = _image_tile_count(n.image) + total_pixels += n_tiles * n.image.size[0] * n.image.size[1] maxres = max(n.image.size[0], n.image.size[1]) props.texture_resolution_max = max( @@ -344,7 +357,7 @@ def check_meshprops(props, obs): props.manifold = manifold -def countObs(props, obs): +def count_objects(props, obs): ob_types = {} count = len(obs) for ob in obs: @@ -425,7 +438,21 @@ def get_autotags(): check_anim(props, obs) check_meshprops(props, obs) check_modifiers(props, obs) - countObs(props, obs) + count_objects(props, obs) + + elif ui.asset_type == "SCENE": + scene = bpy.context.scene + props = scene.blenderkit + if props.name == "": + props.name = scene.name + dim, bbox_min, bbox_max = utils.get_scene_dimensions(scene) + props.dimensions = dim + props.bbox_min = bbox_min + props.bbox_max = bbox_max + scene_objects = list(scene.objects) + check_meshprops(props, scene_objects) + count_objects(props, scene_objects) + elif ui.asset_type == "MATERIAL": # reset some properties here, because they might not get re-filled at all when they aren't needed anymore. @@ -434,6 +461,7 @@ def get_autotags(): props.texture_resolution_max = 0 props.texture_resolution_min = 0 check_material(props, mat) + elif ui.asset_type == "HDR": # reset some properties here, because they might not get re-filled at all when they aren't needed anymore. diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/autothumb.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/autothumb.py index 865183d..dea9ce7 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/autothumb.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/autothumb.py @@ -32,6 +32,7 @@ from bpy.props import ( FloatProperty, IntProperty, FloatVectorProperty, + StringProperty, ) from . import bg_blender, global_vars, paths, tasks_queue, utils, upload, search @@ -81,16 +82,31 @@ def get_texture_ui(tpath, iname): return tex -def check_thumbnail(props, imgpath): +def check_thumbnail( + props, + imgpath, + *, + texture_name="upload_preview", + flag_attr="has_thumbnail", + state_attr="thumbnail_generating_state", +): + """Reload a thumbnail preview and update status attributes.""" + + def _set_prop(attr_name, value): + if attr_name and hasattr(props, attr_name): + setattr(props, attr_name, value) + # TODO implement check if the file exists, if size is correct etc. needs some care if imgpath == "": - props.has_thumbnail = False + _set_prop(flag_attr, False) return None - img = utils.get_hidden_image(imgpath, "upload_preview", force_reload=True) + img = utils.get_hidden_image(imgpath, texture_name, force_reload=True) if img is not None: # and img.size[0] == img.size[1] and img.size[0] >= 512 and ( # img.file_format == 'JPEG' or img.file_format == 'PNG'): - props.has_thumbnail = True - props.thumbnail_generating_state = "" + _set_prop(flag_attr, True) + if hasattr(props, "THUMBNAIL_GENERATING_STATE"): + props.THUMBNAIL_GENERATING_STATE = "" + _set_prop(state_attr, "") utils.get_hidden_texture(img.name) # pcoll = icons.icon_collections["previews"] @@ -98,7 +114,7 @@ def check_thumbnail(props, imgpath): return img else: - props.has_thumbnail = False + _set_prop(flag_attr, False) output = "" if ( img is None @@ -115,7 +131,7 @@ def check_thumbnail(props, imgpath): # output += 'image too small, should be at least 512x512\n' # if img.file_format != 'JPEG' or img.file_format != 'PNG': # output += 'image has to be a jpeg or png' - props.thumbnail_generating_state = output + _set_prop(state_attr, output) def update_upload_model_preview(self, context): @@ -126,6 +142,20 @@ def update_upload_model_preview(self, context): check_thumbnail(props, imgpath) +def update_wire_thumbnail_preview(self, context): + ob = utils.get_active_model() + if ob is not None: + props = ob.blenderkit + imgpath = props.wire_thumbnail + check_thumbnail( + props, + imgpath, + texture_name=".upload_preview_wire", + flag_attr=None, + state_attr="wire_thumbnail_generating_state", + ) + + def update_upload_scene_preview(self, context): s = bpy.context.scene props = s.blenderkit @@ -149,7 +179,7 @@ def update_upload_brush_preview(self, context): brush = utils.get_active_brush() if brush is not None: props = brush.blenderkit - imgpath = bpy.path.abspath(brush.icon_filepath) + imgpath = props.thumbnail check_thumbnail(props, imgpath) @@ -182,9 +212,26 @@ def start_model_thumbnailer( ): """Start Blender in background and render the thumbnail.""" SCRIPT_NAME = "autothumb_model_bg.py" + thumbnail_upload_type = ( + json_args.get("thumbnail_upload_type") if json_args else None + ) + is_wire_upload = thumbnail_upload_type == "wire_thumbnail" + computing_attr = ( + "is_generating_wire_thumbnail" if is_wire_upload else "is_generating_thumbnail" + ) + state_attr = ( + "wire_thumbnail_generating_state" + if is_wire_upload + else "thumbnail_generating_state" + ) + + def _set_prop(attr_name, value): + if props and hasattr(props, attr_name): + setattr(props, attr_name, value) + if props: - props.is_generating_thumbnail = True - props.thumbnail_generating_state = "Saving .blend file" + _set_prop(computing_attr, True) + _set_prop(state_attr, "Saving .blend file") datafile = os.path.join(json_args["tempdir"], BLENDERKIT_EXPORT_DATA_FILE) user_preferences = bpy.context.preferences.addons[__package__].preferences @@ -194,6 +241,10 @@ def start_model_thumbnailer( "cycles" ].preferences.compute_device_type + json_args["thumbnail_disable_subdivision"] = ( + user_preferences.thumbnail_disable_subdivision + ) + try: with open(datafile, "w", encoding="utf-8") as s: json.dump(json_args, s, ensure_ascii=False, indent=4) @@ -228,9 +279,10 @@ def start_model_thumbnailer( env=env, ) bk_logger.info("Started Blender executing %s on file %s", SCRIPT_NAME, datafile) - eval_path_computing = f"bpy.data.objects['{json_args['asset_name']}'].blenderkit.is_generating_thumbnail" - eval_path_state = f"bpy.data.objects['{json_args['asset_name']}'].blenderkit.thumbnail_generating_state" - eval_path = f"bpy.data.objects['{json_args['asset_name']}']" + eval_path_base = f"bpy.data.objects['{json_args['asset_name']}']" + eval_path = eval_path_base + eval_path_computing = f"{eval_path_base}.blenderkit.{computing_attr}" + eval_path_state = f"{eval_path_base}.blenderkit.{state_attr}" name = f"{json_args['asset_name']} thumbnailer" bg_blender.add_bg_process( name=name, @@ -241,7 +293,7 @@ def start_model_thumbnailer( process=proc, ) if props: - props.thumbnail_generating_state = "Started Blender instance" + _set_prop(state_attr, "Started Blender instance") if wait: while proc.poll() is None: @@ -449,6 +501,132 @@ class GenerateThumbnailOperator(bpy.types.Operator): return wm.invoke_props_dialog(self, width=400) +class GenerateWireframeThumbnailOperator(bpy.types.Operator): + """Generate Cycles wireframe thumbnail for model assets""" + + bl_idname = "object.blenderkit_generate_wireframe_thumbnail" + bl_label = "BlenderKit Wireframe Thumbnail Generator" + bl_options = {"REGISTER", "INTERNAL"} + + @classmethod + def poll(cls, context): + return bpy.context.view_layer.objects.active is not None + + def draw(self, context): + ui_props = bpy.context.window_manager.blenderkitUI + asset_type = ui_props.asset_type + + ob = utils.get_active_model() + props = ob.blenderkit + layout = self.layout + layout.label(text="thumbnailer settings") + layout.prop(props, "thumbnail_background_lightness") + # for printable models + if asset_type == "PRINTABLE": + layout.prop(props, "thumbnail_material_color") + layout.prop(props, "thumbnail_angle") + layout.prop(props, "thumbnail_snap_to") + layout.prop(props, "thumbnail_samples") + layout.prop(props, "thumbnail_resolution") + layout.prop(props, "thumbnail_denoising") + preferences = bpy.context.preferences.addons[__package__].preferences + layout.prop(preferences, "thumbnail_use_gpu") + # TODO: wireframe + # layout.prop(preferences, "thumbnail_disable_subdivision") + + def execute(self, context): + if not upload.wire_thumbnail_upload_enabled(): + self.report({"ERROR"}, "Wireframe thumbnail uploads are disabled.") + return {"CANCELLED"} + asset = utils.get_active_model() + asset.blenderkit.is_generating_wire_thumbnail = True + asset.blenderkit.wire_thumbnail_generating_state = "starting blender instance" + tempdir = tempfile.mkdtemp() + ext = ".blend" + filepath = os.path.join(tempdir, "thumbnailer_wf_blenderkit" + ext) + + path_can_be_relative = True + thumb_dir = os.path.dirname(bpy.data.filepath) + if thumb_dir == "": + thumb_dir = tempdir + path_can_be_relative = False + + an_slug = paths.slugify(asset.name) + + # add suffix to distinguish from regular thumbnail + an_slug += "_wf" + + thumb_path = os.path.join(thumb_dir, an_slug) + + if path_can_be_relative: + rel_thumb_path = f"//{an_slug}" + else: + rel_thumb_path = thumb_path + + i = 0 + while os.path.isfile(thumb_path + ".jpg"): + thumb_name = f"{an_slug}_{str(i).zfill(4)}" + thumb_path = os.path.join(thumb_dir, thumb_name) + if path_can_be_relative: + rel_thumb_path = f"//{thumb_name}" + + i += 1 + bkit = asset.blenderkit + + bkit.wire_thumbnail = rel_thumb_path + ".jpg" + bkit.wire_thumbnail_generating_state = "Saving .blend file" + + # if this isn't here, blender crashes. + if bpy.app.version >= (3, 0, 0): + bpy.context.preferences.filepaths.file_preview_type = "NONE" + # save a copy of actual scene but don't interfere with the users models + + bpy.ops.wm.save_as_mainfile(filepath=filepath, compress=False, copy=True) + # get all included objects + obs = utils.get_hierarchy(asset) + obnames = [] + for ob in obs: + obnames.append(ob.name) + # asset type can be model or printable + ui_props = bpy.context.window_manager.blenderkitUI + asset_type = ui_props.asset_type + args_dict = { + "type": asset_type, + "asset_name": asset.name, + "filepath": filepath, + "thumbnail_path": thumb_path, + "tempdir": tempdir, + "thumbnail_render_type": "WIREFRAME", + "thumbnail_upload_type": "wire_thumbnail", + } + thumbnail_args = { + "type": asset_type, + "models": str(obnames), + "thumbnail_angle": bkit.thumbnail_angle, + "thumbnail_snap_to": bkit.thumbnail_snap_to, + "thumbnail_background_lightness": 0.2, + "thumbnail_material_color": ( + bkit.thumbnail_material_color[0], + bkit.thumbnail_material_color[1], + bkit.thumbnail_material_color[2], + ), + "thumbnail_resolution": bkit.thumbnail_resolution, + "thumbnail_samples": bkit.thumbnail_samples, + "thumbnail_denoising": bkit.thumbnail_denoising, + } + args_dict.update(thumbnail_args) + + start_model_thumbnailer( + self, json_args=args_dict, props=asset.blenderkit, wait=False + ) + return {"FINISHED"} + + def invoke(self, context, event): + wm = context.window_manager + + return wm.invoke_props_dialog(self, width=400) + + class ReGenerateThumbnailOperator(bpy.types.Operator): """ Generate default thumbnail with Cycles renderer and upload it. @@ -464,6 +642,12 @@ class ReGenerateThumbnailOperator(bpy.types.Operator): name="Asset Index", description="asset index in search results", default=-1 ) + asset_type: StringProperty( # type: ignore[valid-type] + name="Asset Type", + description="Asset type used for thumbnail generation", + default="", + ) + render_locally: BoolProperty( # type: ignore[valid-type] name="Render Locally", description="Render thumbnail locally instead of using server-side rendering", @@ -529,7 +713,12 @@ class ReGenerateThumbnailOperator(bpy.types.Operator): layout.label(text="thumbnailer settings") layout.prop(props, "thumbnail_background_lightness") # for printable models - if self.asset_type == "PRINTABLE": + asset_type = ( + getattr(self, "asset_type", "") + or getattr(self, "asset_data", {}).get("assetType", "") + or bpy.context.window_manager.blenderkitUI.asset_type + ).upper() + if asset_type == "PRINTABLE": layout.prop(props, "thumbnail_material_color") layout.prop(props, "thumbnail_angle") layout.prop(props, "thumbnail_snap_to") @@ -545,6 +734,11 @@ class ReGenerateThumbnailOperator(bpy.types.Operator): preferences = bpy.context.preferences.addons[__package__].preferences + # Ensure asset_type is set when execution is triggered directly. + ui_props = bpy.context.window_manager.blenderkitUI + if not getattr(self, "asset_type", ""): + self.asset_type = ui_props.asset_type + if not self.render_locally: # Use server-side thumbnail regeneration success = upload.mark_for_thumbnail( @@ -575,8 +769,7 @@ class ReGenerateThumbnailOperator(bpy.types.Operator): thumb_path = os.path.join(tempdir, an_slug) # asset type can be model or printable - ui_props = bpy.context.window_manager.blenderkitUI - self.asset_type = ui_props.asset_type + self.asset_type = self.asset_type or ui_props.asset_type args_dict = { "type": self.asset_type, "asset_name": self.asset_data["name"], @@ -607,6 +800,12 @@ class ReGenerateThumbnailOperator(bpy.types.Operator): history_step = search.get_active_history_step() sr = history_step.get("search_results", []) self.asset_data = sr[self.asset_index] + # Prepopulate asset_type so draw() can safely access it. + self.asset_type = ( + self.asset_data.get("assetType", "") + if isinstance(self.asset_data, dict) + else "" + ).upper() or bpy.context.window_manager.blenderkitUI.asset_type return wm.invoke_props_dialog(self, width=400) @@ -891,6 +1090,7 @@ class ReGenerateMaterialThumbnailOperator(bpy.types.Operator): def register_thumbnailer(): bpy.utils.register_class(GenerateThumbnailOperator) bpy.utils.register_class(ReGenerateThumbnailOperator) + bpy.utils.register_class(GenerateWireframeThumbnailOperator) bpy.utils.register_class(GenerateMaterialThumbnailOperator) bpy.utils.register_class(ReGenerateMaterialThumbnailOperator) @@ -898,5 +1098,6 @@ def register_thumbnailer(): def unregister_thumbnailer(): bpy.utils.unregister_class(GenerateThumbnailOperator) bpy.utils.unregister_class(ReGenerateThumbnailOperator) + bpy.utils.unregister_class(GenerateWireframeThumbnailOperator) bpy.utils.unregister_class(GenerateMaterialThumbnailOperator) bpy.utils.unregister_class(ReGenerateMaterialThumbnailOperator) diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/autothumb_model_bg.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/autothumb_model_bg.py index ee59c96..23bd6cc 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/autothumb_model_bg.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/autothumb_model_bg.py @@ -17,14 +17,14 @@ # ##### END GPL LICENSE BLOCK ##### # type: ignore +from __future__ import annotations import json import math import os -import random -import colorsys import sys from traceback import print_exc +from typing import Any, Union import bpy @@ -36,47 +36,66 @@ def get_obnames(BLENDERKIT_EXPORT_DATA: str): return obnames -def center_obs_for_thumbnail(obs): - s = bpy.context.scene - # obs = bpy.context.selected_objects +def center_objs_for_thumbnail(obs: list[Any]) -> None: + """Center and scale objects for optimal thumbnail framing. + + Steps: + 1. Center objects in world space (handles parent-child hierarchy) + 2. Adjust camera distance based on object bounds + 3. Scale helper objects to fit the model in frame + + Args: + obs: List of Blender objects to center and frame. + """ + scene = bpy.context.scene parent = obs[0] + + # Handle instanced collections (linked objects) if parent.type == "EMPTY" and parent.instance_collection is not None: obs = parent.instance_collection.objects[:] + # Get top-level parent while parent.parent is not None: parent = parent.parent - # reset parent rotation, so we see how it really snaps. + + # Reset parent rotation for accurate snapping parent.rotation_euler = (0, 0, 0) parent.location = (0, 0, 0) bpy.context.view_layer.update() + + # Calculate bounding box in world space minx, miny, minz, maxx, maxy, maxz = utils.get_bounds_worldspace(obs) + # Center object at world origin cx = (maxx - minx) / 2 + minx cy = (maxy - miny) / 2 + miny - for ob in s.collection.objects: + for ob in scene.collection.objects: ob.select_set(False) bpy.context.view_layer.objects.active = parent - # parent.location += mathutils.Vector((-cx, -cy, -minz)) parent.location = (-cx, -cy, 0) - camZ = s.camera.parent.parent - # camZ.location.z = (maxz - minz) / 2 - camZ.location.z = (maxz) / 2 + # Adjust camera position and scale based on object size + cam_z = scene.camera.parent.parent + cam_z.location.z = maxz / 2 + + # Calculate diagonal size of object for scaling dx = maxx - minx dy = maxy - miny dz = maxz - minz r = math.sqrt(dx * dx + dy * dy + dz * dz) + # Scale scene elements to fit object scaler = bpy.context.view_layer.objects["scaler"] scaler.scale = (r, r, r) - coef = 0.7 + coef = 0.7 # Camera distance coefficient r *= coef - camZ.scale = (r, r, r) + cam_z.scale = (r, r, r) bpy.context.view_layer.update() -def render_thumbnails(): +def render_thumbnails() -> None: + """Render the current scene to a still image (no animation).""" bpy.ops.render.render(write_still=True, animation=False) @@ -112,17 +131,23 @@ def patch_imports(addon_module_name: str): print(f"- Local repository {parts[1]} added") -def replace_materials(obs, material_name): - """Replace all materials on objects with the specified material +def replace_materials( + obs: list[Any], material_name: str +) -> Union[bpy.types.Material, None]: + """Replace all materials on the given objects with a wireframe material. + Args: - obs: List of objects to process - material_name: Name of the material to apply to all objects + obs: List of Blender objects to modify. + material_name: Name of the wireframe material to use. """ - material = bpy.data.materials.get(material_name) - if not material: + # Create or get the wireframe material + if material_name in bpy.data.materials: + material = bpy.data.materials[material_name] + else: bg_blender.progress(f"Material {material_name} not found") return + # Assign the wireframe material to all objects for ob in obs: if ob.type == "MESH": # Clear all material slots and add the specified material @@ -131,6 +156,57 @@ def replace_materials(obs, material_name): return material +def disable_modifier(obs: list[Any], modifier_type: str) -> None: + """Disable a specific type of modifier on all given objects. + + Args: + obs: List of Blender objects to modify. + modifier_type: Type of the modifier to disable (e.g., 'SUBSURF'). + """ + for ob in obs: + if ob.type == "MESH": + for mod in ob.modifiers: + if mod.type == modifier_type: + mod.show_viewport = False + mod.show_render = False + # disable only first found + break + + +def _str_to_color(s: str) -> Union[tuple[float, float, float], None]: + """Convert a color string to an RGB tuple. + + Args: + s: Color string in the format "#RRGGBB" or "R,G,B". + + Returns: + A tuple of (R, G, B) values as floats in the range [0.0, 1.0], or None. + """ + hex_size = 7 # e.g. "#RRGGBB" + rgb_size = 5 # e.g. "R,G,B" + rgb_count = 3 + s = s.strip() + if s.startswith("#") and len(s) == hex_size: + r = int(s[1:3], 16) / 255.0 + g = int(s[3:5], 16) / 255.0 + b = int(s[5:7], 16) / 255.0 + return (r, g, b) + if len(s) == rgb_size: + parts = s.split(",") + if len(parts) == rgb_count: + try: + r = float(parts[0].strip()) + g = float(parts[1].strip()) + b = float(parts[2].strip()) + + except ValueError: + pass + else: + return (r, g, b) + # Default to None + return None + + if __name__ == "__main__": try: # args order must match the order in blenderkit/autothumb.py:get_thumbnailer_args()! @@ -144,6 +220,7 @@ if __name__ == "__main__": with open(BLENDERKIT_EXPORT_DATA, "r", encoding="utf-8") as s: data = json.load(s) thumbnail_use_gpu = data.get("thumbnail_use_gpu") + thumbnail_disable_subdivision = data.get("thumbnail_disable_subdivision", False) if data.get("do_download"): # if this isn't here, blender crashes. @@ -195,7 +272,7 @@ if __name__ == "__main__": } bpy.context.scene.camera = bpy.data.objects[camdict[data["thumbnail_snap_to"]]] - center_obs_for_thumbnail(allobs) + center_objs_for_thumbnail(allobs) bpy.context.scene.render.filepath = data["thumbnail_path"] if thumbnail_use_gpu is True: bpy.context.scene.cycles.device = "GPU" @@ -214,8 +291,8 @@ if __name__ == "__main__": "SIDE": 4, "TOP": 5, } - s = bpy.context.scene - s.frame_set(fdict[data["thumbnail_angle"]]) + scene = bpy.context.scene + scene.frame_set(fdict[data["thumbnail_angle"]]) snapdict = { "GROUND": "Ground", @@ -262,12 +339,19 @@ if __name__ == "__main__": 1 - random_color[2], 1, ) + # disable subdivision for thumbnail rendering if needed + if thumbnail_disable_subdivision: + disable_modifier(allobs, "SUBSURF") + + # replace material if we need to render wireframe thumbnail + if data.get("thumbnail_render_type") == "WIREFRAME": + replace_materials(allobs, "bkit wireframe") bpy.data.materials["bkit background"].node_tree.nodes["Value"].outputs[ "Value" ].default_value = data["thumbnail_background_lightness"] - s.cycles.samples = data["thumbnail_samples"] + scene.cycles.samples = data["thumbnail_samples"] bpy.context.view_layer.cycles.use_denoising = data["thumbnail_denoising"] bpy.context.view_layer.update() @@ -297,14 +381,17 @@ if __name__ == "__main__": ) sys.exit(0) - + # get sub type if we are not generating for main beauty thumbnail + filetype = "thumbnail" + if data.get("thumbnail_upload_type"): + filetype = data["thumbnail_upload_type"].lower() bg_blender.progress("uploading thumbnail") fpath = data["thumbnail_path"] + ".jpg" ok = client_lib.complete_upload_file_blocking( api_key=BLENDERKIT_EXPORT_API_KEY, asset_id=data["asset_data"]["id"], filepath=fpath, - filetype=f"thumbnail", + filetype=filetype, fileindex=0, ) if not ok: diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bg_blender.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bg_blender.py index a724976..a30dd24 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bg_blender.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bg_blender.py @@ -25,7 +25,15 @@ import threading import bpy from bpy.props import EnumProperty -from . import utils +from . import utils, reports + + +def _safe_eval_target(eval_path: str, name: str): + """Try resolving eval_path; fallback to bpy.data.objects by name; return None if missing.""" + try: + return eval(eval_path) + except Exception: + return bpy.data.objects.get(name) if name else None bk_logger = logging.getLogger(__name__) @@ -62,8 +70,9 @@ class ThreadCom: # object passed to threads to read background process stdout i def threadread(tcom: ThreadCom): - """reads stdout of background process. - this threads basically waits for a stdout line to come in, + """Reads stdout of background process. + + This thread basically waits for a stdout line to come in, fills the data, dies.""" found = False while not found: @@ -74,7 +83,12 @@ def threadread(tcom: ThreadCom): # ignore empty lines if inline.strip() == "": continue - bk_logger.info(inline.strip()) + # Background Blender already formats logs; strip a leading emoji/prefix to avoid double branding. + line = inline.strip() + line = re.sub( + r"^(?:[🐞ℹ️⚠️❌🔥]\s*)?blenderkit:\s*", "", line, flags=re.IGNORECASE + ) + bk_logger.info(line) progress = re.findall(r"progress\{(.*?)\}", inline) if len(progress) > 0: if type(progress[0]) == int or type(progress[0]) == float: @@ -116,8 +130,10 @@ def progress(text, n=None): sys.stdout.write(output) sys.stdout.flush() except Exception as e: - print("background progress reporting race condition") - print(e) + bk_logger.exception( + "background progress reporting race condition", exc_info=False + ) + bk_logger.error(f"Error details: {e}") # @bpy.app.handlers.persistent @@ -140,10 +156,15 @@ def bg_update(): for p in remove_processes: bk_logger.info(str(p[1].outtext)) estring = p[1].eval_path_computing + " = False" - try: - exec(estring) - except Exception as e: - bk_logger.error(f"Exception executing eval_path_computing: {e}") + target = _safe_eval_target(p[1].eval_path, p[1].name) + if target is not None: + try: + exec(estring) + except Exception as e: + bk_logger.exception( + "Exception executing eval_path_computing.", exc_info=False + ) + bk_logger.error(f"Error details: {e}") bg_processes.remove(p) # Parse process output @@ -162,7 +183,7 @@ def bg_update(): tcom.outtext = "" text = tcom.lasttext.replace("'", "") # noqa: F841 needed in exec() estring = tcom.eval_path_state + " = text" - # print(tcom.lasttext) + if "finished successfully" in tcom.lasttext: bk_logger.info(str(tcom.lasttext)) bg_processes.remove(p) @@ -174,10 +195,20 @@ def bg_update(): readthread.start() p[0] = readthread if estring: - try: - exec(estring) - except Exception as e: - print(f"Exception while reading from background process: {e}") + target = _safe_eval_target(tcom.eval_path, tcom.name) + if target is not None: + try: + exec(estring) + except Exception as e: + bk_logger.exception( + "Exception while reading from background process.", + exc_info=False, + ) + bk_logger.error(f"Error details: {e}") + else: + bk_logger.debug( + "Skipping state update; target missing for %s", tcom.name + ) # if len(bg_processes) == 0: # bpy.app.timers.unregister(bg_update) @@ -235,6 +266,8 @@ class KillBgProcess(bpy.types.Operator): props.uploading = False if self.process_type == "THUMBNAILER": props.is_generating_thumbnail = False + if hasattr(props, "is_generating_wire_thumbnail"): + props.is_generating_wire_thumbnail = False # print('killing', self.process_source, self.process_type) # then go kill the process. this wasn't working for unsetting props and that was the reason for changing to the method above. @@ -244,36 +277,43 @@ class KillBgProcess(bpy.types.Operator): tcom = p[1] # print(tcom.process_type, self.process_type) if tcom.process_type == self.process_type: - source = eval(tcom.eval_path) + source = _safe_eval_target(tcom.eval_path, tcom.name) kill = False # TODO HDR - add killing of process - if source.bl_rna.name == "Object" and self.process_source == "MODEL": - if source.name == bpy.context.active_object.name: - kill = True - if source.bl_rna.name == "Scene" and self.process_source == "SCENE": - if source.name == bpy.context.scene.name: - kill = True - if source.bl_rna.name == "Image" and self.process_source == "HDR": - ui_props = bpy.context.window_manager.blenderkitUI - if source.name == ui_props.hdr_upload_image.name: - kill = False + if source is not None: + if ( + source.bl_rna.name == "Object" + and self.process_source == "MODEL" + ): + if source.name == bpy.context.active_object.name: + kill = True + if source.bl_rna.name == "Scene" and self.process_source == "SCENE": + if source.name == bpy.context.scene.name: + kill = True + if source.bl_rna.name == "Image" and self.process_source == "HDR": + ui_props = bpy.context.window_manager.blenderkitUI + if source.name == ui_props.hdr_upload_image.name: + kill = False - if ( - source.bl_rna.name == "Material" - and self.process_source == "MATERIAL" - ): - if source.name == bpy.context.active_object.active_material.name: - kill = True - if source.bl_rna.name == "Brush" and self.process_source == "BRUSH": - brush = utils.get_active_brush() - if brush is not None and source.name == brush.name: - kill = True - if ( - source.bl_rna.name == "Object" - and self.process_source == "PRINTABLE" - ): - if source.name == bpy.context.active_object.name: - kill = True + if ( + source.bl_rna.name == "Material" + and self.process_source == "MATERIAL" + ): + if ( + source.name + == bpy.context.active_object.active_material.name + ): + kill = True + if source.bl_rna.name == "Brush" and self.process_source == "BRUSH": + brush = utils.get_active_brush() + if brush is not None and source.name == brush.name: + kill = True + if ( + source.bl_rna.name == "Object" + and self.process_source == "PRINTABLE" + ): + if source.name == bpy.context.active_object.name: + kill = True if kill: estring = tcom.eval_path_computing + " = False" exec(estring) diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bg_utils.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bg_utils.py index 78a044b..0cf8b39 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bg_utils.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bg_utils.py @@ -60,7 +60,7 @@ def delete_unfinished_file(file_name): try: os.remove(file_name) except Exception as e: - bk_logger.error(f"{e}") + bk_logger.error("Could not delete unfinished file %s: %s", file_name, e) asset_dir = os.path.dirname(file_name) if len(os.listdir(asset_dir)) == 0: os.rmdir(asset_dir) diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bkit_oauth.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bkit_oauth.py index a72f5aa..35d9b70 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bkit_oauth.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bkit_oauth.py @@ -23,13 +23,24 @@ import random import secrets import string import time +import uuid from urllib.parse import quote as urlquote from webbrowser import open_new_tab import bpy from bpy.props import BoolProperty -from . import client_lib, client_tasks, datas, global_vars, reports, tasks_queue, utils +from . import ( + client_lib, + client_tasks, + datas, + global_vars, + reports, + search_price, + tasks_queue, + utils, +) + if bpy.app.version >= (4, 2, 0): from . import override_extension_draw @@ -104,6 +115,7 @@ def clean_login_data(): preferences.api_key = "" preferences.api_key_timeout = 0 global_vars.BKIT_PROFILE = datas.MineProfile() + search_price.clear_price_cache() # Cleanup also the api key in the extensions repository setting and clean the cache if bpy.app.version >= (4, 2, 0): override_extension_draw.ensure_repository(api_key="") @@ -128,14 +140,19 @@ def login(signup: bool) -> None: code_verifier, code_challenge = generate_pkce_pair() state = secrets.token_urlsafe() client_lib.send_oauth_verification_data(code_verifier, state) - authorize_url = f"/o/authorize?client_id={CLIENT_ID}&response_type=code&state={state}&redirect_uri={redirect_URI}&code_challenge={code_challenge}&code_challenge_method=S256" + system_id = get_system_id() + authorize_url = ( + f"/o/authorize?client_id={CLIENT_ID}&response_type=code&state={state}" + f"&redirect_uri={redirect_URI}&code_challenge={code_challenge}" + f"&code_challenge_method=S256&system_id={system_id}" + ) if signup: authorize_url = urlquote(authorize_url) authorize_url = f"{global_vars.SERVER}/accounts/register/?next={authorize_url}" else: authorize_url = f"{global_vars.SERVER}{authorize_url}" ok = open_new_tab(authorize_url) - bk_logger.info(f"Login page in browser opened ({ok})") + bk_logger.info("Login page in browser opened (%s)", ok) def generate_pkce_pair() -> tuple[str, str]: @@ -151,12 +168,17 @@ def generate_pkce_pair() -> tuple[str, str]: return code_verifier, code_challenge +def get_system_id() -> str: + return f"{uuid.getnode():015d}" + + def write_tokens(auth_token, refresh_token, oauth_response): preferences = bpy.context.preferences.addons[__package__].preferences preferences.api_key_timeout = int(time.time() + oauth_response["expires_in"]) preferences.login_attempt = False preferences.api_key_refresh = refresh_token preferences.api_key = auth_token # triggers api_key update function + search_price.clear_price_cache() # write token also to extensions repository setting and clear the cache if bpy.app.version >= (4, 2, 0): override_extension_draw.ensure_repository(api_key=auth_token) diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/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/backup/bl_ext.user_default.blenderkit_updater/bl_ext.user_default.blenderkit_updater_status.json index 57fa473..413e40f 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/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/backup/bl_ext.user_default.blenderkit_updater/bl_ext.user_default.blenderkit_updater_status.json @@ -1,17 +1,17 @@ { - "last_check": "2026-04-02 12:41:20.491300", - "backup_date": "January-12-2026", + "last_check": "2026-04-12 17:36:29.915633", + "backup_date": "April-2-2026", "update_ready": true, "ignore": false, "just_restored": false, "just_updated": false, "version_text": { - "link": "https://github.com/BlenderKit/BlenderKit/releases/download/v3.19.1.260402/blenderkit-v3.19.1.260402.zip", + "link": "https://github.com/BlenderKit/BlenderKit/releases/download/v3.19.2.260411/blenderkit-v3.19.2.260411.zip", "version": [ 3, 19, - 1, - 260402 + 2, + 260411 ] } } \ No newline at end of file diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_button.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_button.py index 08d4ff9..873c939 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_button.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_button.py @@ -1,14 +1,12 @@ import os import logging -from typing import Optional import blf import bpy import gpu from .. import image_utils, ui_bgl -from .bl_ui_widget import BL_UI_Widget -from .bl_ui_image import BL_UI_Image +from .bl_ui_widget import BL_UI_Widget, region_redraw bk_logger = logging.getLogger(__name__) @@ -18,6 +16,8 @@ class BL_UI_Button(BL_UI_Widget): def __init__(self, x, y, width, height): super().__init__(x, y, width, height) + self.background = True + self.background_padding = (0, 0) self._text_color = (1.0, 1.0, 1.0, 1.0) self._hover_bg_color = (0.5, 0.5, 0.5, 1.0) self._select_bg_color = (0.7, 0.7, 0.7, 1.0) @@ -30,6 +30,8 @@ class BL_UI_Button(BL_UI_Widget): self.__image = None self.__image_size = (24, 24) self.__image_position = (4, 2) + self.__image_padding = 0.0 + self.image_corner_radius = None @property def text_color(self): @@ -38,7 +40,7 @@ class BL_UI_Button(BL_UI_Widget): @text_color.setter def text_color(self, value): if value != self._text_color: - bpy.context.region.tag_redraw() + region_redraw() self._text_color = value @property @@ -48,7 +50,7 @@ class BL_UI_Button(BL_UI_Widget): @text.setter def text(self, value): if value != self._text: - bpy.context.region.tag_redraw() + region_redraw() self._text = value @property @@ -58,7 +60,7 @@ class BL_UI_Button(BL_UI_Widget): @text_size.setter def text_size(self, value): if value != self._text_size: - bpy.context.region.tag_redraw() + region_redraw() self._text_size = value @property @@ -68,7 +70,7 @@ class BL_UI_Button(BL_UI_Widget): @hover_bg_color.setter def hover_bg_color(self, value): if value != self._hover_bg_color: - bpy.context.region.tag_redraw() + region_redraw() self._hover_bg_color = value @property @@ -78,7 +80,7 @@ class BL_UI_Button(BL_UI_Widget): @select_bg_color.setter def select_bg_color(self, value): if value != self._select_bg_color: - bpy.context.region.tag_redraw() + region_redraw() self._select_bg_color = value def set_image_size(self, image_size): @@ -93,13 +95,16 @@ class BL_UI_Button(BL_UI_Widget): self.__image self.__image.filepath # self.__image.pixels - except Exception as e: + except Exception: self.__image = None def set_image_colorspace(self, colorspace: str = ""): image_utils.set_colorspace(self.__image, colorspace) def set_image(self, rel_filepath): + if rel_filepath is None: + self.__image = None + return # first try to access the image, for cases where it can get removed self.check_image_exists() try: @@ -117,6 +122,17 @@ class BL_UI_Button(BL_UI_Widget): return None return self.__image.filepath + @property + def image_padding(self): + return self.__image_padding + + @image_padding.setter + def image_padding(self, padding: float): + self.__image_padding = padding + + def get_image_padding(self): + return self.__image_padding + def update(self, x, y): super().update(x, y) self._textpos = [x, y] @@ -127,19 +143,30 @@ class BL_UI_Button(BL_UI_Widget): area_height = self.get_area_height() gpu.state.blend_set("ALPHA") + fill_color = self._resolve_panel_color() - self.shader.bind() - - self.set_colors() - - self.batch_panel.draw(self.shader) + if self.use_rounded_background: + rect_y = area_height - self.y_screen - self.height + self.draw_background_rect( + self.x_screen, + rect_y, + self.width, + self.height, + fill_color, + force=True, + fill_color_override=fill_color, + ) + else: + self.shader.bind() + self.shader.uniform_float("color", fill_color) + self.batch_panel.draw(self.shader) self.draw_image() # Draw text self.draw_text(area_height) - def set_colors(self): + def _resolve_panel_color(self): color = self._bg_color # pressed @@ -150,7 +177,7 @@ class BL_UI_Button(BL_UI_Widget): elif self.__state == 2: color = self._hover_bg_color - self.shader.uniform_float("color", color) + return color def draw_text(self, area_height): font_id = 1 @@ -165,9 +192,19 @@ class BL_UI_Button(BL_UI_Widget): size = blf.dimensions(font_id, self._text) + # When an image is present, center text in the remaining space after the image + image_offset = 0 + if self.__image is not None: + image_offset = self.__image_position[0] + self.__image_size[0] + textpos_y = area_height - self._textpos[1] - (self.height + size[1]) / 2.0 blf.position( - font_id, self._textpos[0] + (self.width - size[0]) / 2.0, textpos_y + 1, 0 + font_id, + self._textpos[0] + + image_offset + + (self.width - image_offset - size[0]) / 2.0, + textpos_y + 1, + 0, ) r, g, b, a = self._text_color @@ -180,15 +217,17 @@ class BL_UI_Button(BL_UI_Widget): y_screen_flip = self.get_area_height() - self.y_screen off_x, off_y = self.__image_position sx, sy = self.__image_size + pad = self.__image_padding ui_bgl.draw_image_runtime( - self.x_screen + off_x, - y_screen_flip - off_y - sy, - sx, - sy, + self.x_screen + off_x + pad, + y_screen_flip - off_y - sy + pad, + sx - 2 * pad, + sy - 2 * pad, self.__image, 1.0, crop=(0, 0, 1, 1), batch=None, + corner_radius=self.image_corner_radius, ) return True return False @@ -203,9 +242,7 @@ class BL_UI_Button(BL_UI_Widget): self.mouse_down_func(self) except Exception: bk_logger.exception("BL_UI_BUTTON mouse_down() error:") - return True - return False def set_mouse_down_right(self, mouse_down_right_func): @@ -213,10 +250,11 @@ class BL_UI_Button(BL_UI_Widget): def mouse_down_right(self, x, y): if self.is_in_rect(x, y): - try: - self.mouse_down_right_func(self) - except Exception: - bk_logger.exception("BL_UI_BUTTON mouse_down_right() error:") + if hasattr(self, "mouse_down_right_func"): + try: + self.mouse_down_right_func(self) + except Exception: + bk_logger.exception("BL_UI_BUTTON mouse_down_right() error:") return True diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_drag_panel.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_drag_panel.py index 4fe195e..eb4a60f 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_drag_panel.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_drag_panel.py @@ -20,6 +20,15 @@ class BL_UI_Drag_Panel(BL_UI_Widget): self.widgets = widgets self.layout_widgets() + def remove_widgets(self): + self.widgets = [] + self.update(self.x_screen, self.y_screen) + + def remove_widget(self, widget): + if widget in self.widgets: + self.widgets.remove(widget) + self.layout_widgets() + def layout_widgets(self): for widget in self.widgets: widget.update(self.x_screen + widget.x, self.y_screen + widget.y) diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_draw_op.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_draw_op.py index f1ed8db..5021cfe 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_draw_op.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_draw_op.py @@ -4,9 +4,34 @@ from typing import Optional import bpy from bpy.types import Operator +from .. import ui_bgl +from .bl_ui_widget import region_redraw + bk_logger = logging.getLogger(__name__) +def get_safely(obj, attr_name, default=None): + """Get attribute from object while tolerating freed data.""" + try: + return getattr(obj, attr_name, default) + except ReferenceError: + return default + except Exception: + return default + + +def restart_asset_bar(): + # ignore failures if already gone + from asset_bar_op import BlenderKitAssetBarOperator + + try: + bpy.utils.unregister_class(BlenderKitAssetBarOperator) + except Exception: + pass + bpy.utils.register_class(BlenderKitAssetBarOperator) + bpy.ops.view3d.blenderkit_asset_bar_widget("INVOKE_DEFAULT") + + class BL_UI_OT_draw_operator(Operator): bl_idname = "object.bl_ui_ot_draw_operator" bl_label = "bl ui widgets operator" @@ -36,10 +61,6 @@ class BL_UI_OT_draw_operator(Operator): def invoke(self, context, event): self.on_invoke(context, event) - args = (self, context) - - self.register_handlers(args, context, timer_interval=self._timer_interval) - context.window_manager.modal_handler_add(self) # first set pointers to keep track if the area is still available @@ -47,7 +68,10 @@ class BL_UI_OT_draw_operator(Operator): self.active_area_pointer = context.area.as_pointer() self.active_region_pointer = context.region.as_pointer() - context.region.tag_redraw() + args = (self, context) + self.register_handlers(args, context, timer_interval=self._timer_interval) + + region_redraw(context) return {"RUNNING_MODAL"} def register_handlers(self, args, context, timer_interval=0.1): @@ -80,7 +104,7 @@ class BL_UI_OT_draw_operator(Operator): return {"FINISHED"} if context.area: - context.region.tag_redraw() + region_redraw(context) if self.handle_widget_events(event): return {"RUNNING_MODAL"} @@ -93,8 +117,7 @@ class BL_UI_OT_draw_operator(Operator): def finish(self): self.unregister_handlers(bpy.context) # it is possible that the area has been closed, so we check if it is still available - if bpy.context.region is not None: - bpy.context.region.tag_redraw() + region_redraw() self.on_finish(bpy.context) # Draw handler to paint onto the screen @@ -114,7 +137,27 @@ def draw_callback_px_separated(self, op, context): # hide during animation playback, to improve performance if context.screen.is_animation_playing: return - if context.area.as_pointer() == self.active_area_pointer: + area_pointer = ( + context.area.as_pointer() if getattr(context, "area", None) else None + ) + + # get area, check if RNA failed + active_pointer = get_safely(self, "active_area_pointer", None) + if area_pointer is None or area_pointer != active_pointer: + return + + active_region_pointer = get_safely(self, "active_region_pointer", None) + if active_region_pointer is not None: + region_pointer = ( + context.region.as_pointer() + if getattr(context, "region", None) + else None + ) + if region_pointer is None or region_pointer != active_region_pointer: + return + + region = getattr(context, "region", None) + with ui_bgl.overlay_matrix_guard(region): for widget in self.widgets: widget.draw() except Exception: diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_image.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_image.py index d72de54..c8ee214 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_image.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_image.py @@ -18,11 +18,21 @@ class BL_UI_Image(BL_UI_Widget): def __init__(self, x, y, width, height): super().__init__(x, y, width, height) + self.bg_color = (1.0, 1.0, 1.0, 1.0) self.__state = 0 self.__image = None self.__image_size = (24, 24) self.__image_position = (4, 2) + self.__image_padding: float = 0.0 + + @property + def image_padding(self): + return self.__image_padding + + @image_padding.setter + def image_padding(self, value: float): + self.__image_padding = value def set_image_size(self, image_size): self.__image_size = image_size @@ -67,25 +77,68 @@ class BL_UI_Image(BL_UI_Widget): return gpu.state.blend_set("ALPHA") - self.shader.bind() - self.batch_panel.draw(self.shader) + if self.draw_image(): + return - self.draw_image() + if self.use_rounded_background: + area_height = self.get_area_height() + rect_y = area_height - self.y_screen - self.height + self.draw_background_rect( + self.x_screen, + rect_y, + self.width, + self.height, + self._bg_color, + force=True, + fill_color_override=self._bg_color, + ) + return + + self.shader.bind() + self.shader.uniform_float("color", self._bg_color) + + self.batch_panel.draw(self.shader) def draw_image(self): if self.__image is not None: y_screen_flip = self.get_area_height() - self.y_screen off_x, off_y = self.__image_position sx, sy = self.__image_size + pad = self.image_padding + img_x = self.x_screen + off_x + pad + img_y = y_screen_flip - off_y - sy + pad + img_w = sx - 2 * pad + img_h = sy - 2 * pad + + if self.use_rounded_background: + fill_color = self.bg_color or (1.0, 1.0, 1.0, 1.0) + self.draw_background_rect( + img_x, + img_y, + img_w, + img_h, + fill_color, + force=True, + fill_color_override=fill_color, + ) + + corner_radius = ( + self.background_corner_radius + if self.has_background_corner_radius_override() + else None + ) + ui_bgl.draw_image_runtime( - self.x_screen + off_x, - y_screen_flip - off_y - sy, - sx, - sy, + img_x, + img_y, + img_w, + img_h, self.__image, 1.0, crop=(0, 0, 1, 1), batch=None, + corner_radius=corner_radius, + corner_segments=12, ) return True diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_label.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_label.py index e84fd33..370e09f 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_label.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_label.py @@ -1,17 +1,19 @@ import blf import bpy -import gpu from typing import Tuple, Union from gpu_extras.batch import batch_for_shader -from .bl_ui_widget import BL_UI_Widget +from .bl_ui_widget import BL_UI_Widget, region_redraw, set_font_size class BL_UI_Label(BL_UI_Widget): + """A simple text label widget.""" + def __init__(self, x, y, width, height): super().__init__(x, y, width, height) + self._set_background_corner_radius_default((4.0,)) self._text_color = (1.0, 1.0, 1.0, 1.0) self._text = "Label" @@ -32,7 +34,7 @@ class BL_UI_Label(BL_UI_Widget): @text_color.setter def text_color(self, value): if value != self._text_color: - bpy.context.region.tag_redraw() + region_redraw() self._text_color = value @property @@ -42,13 +44,173 @@ class BL_UI_Label(BL_UI_Widget): @text.setter def text(self, value): if value != self._text: - bpy.context.region.tag_redraw() + region_redraw() self._text = value @property def text_size(self): return self._text_size + @text_size.setter + def text_size(self, value): + if value != self._text_size: + region_redraw() + self._text_size = value + + def is_in_rect(self, x, y): + return False + + def draw(self): + if not self._is_visible or not self._text: + return + + area_height = self.get_area_height() + font_id = 1 + set_font_size(font_id, self._text_size) + + textpos_y = area_height - self.y_screen - self.height + + x = self.x_screen + y = textpos_y + block_width, block_height = blf.dimensions(font_id, self._text) + if self._halign == "RIGHT": + x -= block_width + elif self._halign == "CENTER": + x -= block_width // 2 + if self._halign != "LEFT" and self._valign == "CENTER": + y -= block_height // 2 + + lines = self._text.split("\n") if self.multiline else [self._text] + entries = [] + cursor_y = y + for index, line in enumerate(lines): + if index > 0: + cursor_y -= self.row_height + width, height = blf.dimensions(font_id, line) + if self.multiline and height == 0: + height = self.row_height + elif height == 0: + height = self._text_size + entries.append( + { + "text": line, + "x": x, + "y": cursor_y, + "width": width, + "height": height, + } + ) + + if not entries: + return + + min_x = min(item["x"] for item in entries) + max_x = max(item["x"] + item["width"] for item in entries) + min_y = min(item["y"] for item in entries) + max_y = max(item["y"] + item["height"] for item in entries) + content_width = max(0.0, max_x - min_x) + content_height = max(0.0, max_y - min_y) + + self.draw_background_rect( + min_x, + min_y, + content_width, + content_height, + self._bg_color, + ) + + r, g, b, a = self._text_color + for item in entries: + if not item["text"]: + continue + blf.position(font_id, item["x"], item["y"], 0) + blf.color(font_id, r, g, b, a) + blf.draw(font_id, item["text"]) + + if content_width > 0: + strike_y = min_y + content_height * 0.5 + self.draw_strikethrough( + min_x, + max_x, + strike_y, + self._text_color, + ) + + +class BL_UI_DuoLabel(BL_UI_Widget): + """A label with two text fields, A and B.""" + + def __init__(self, x, y, width, height): + super().__init__(x, y, width, height) + self._set_background_corner_radius_default((4.0,)) + + self._text_a_color = (1.0, 1.0, 1.0, 1.0) + self._text_a = "Label" + + self._text_b_color = (1.0, 1.0, 1.0, 1.0) + self._text_b = "" + + self._text_size = 16 + self._halign = "LEFT" + self._valign = "TOP" + # multiline + self.multiline = False + self.row_height = 20 + self.strikethrough_a = False + self.strikethrough_b = False + self.segment_backgrounds = False + self.segment_background_padding = None + self.segment_background_color_a = None + self.segment_background_color_b = None + self.segment_background_gap = 0.0 + self.segment_spacing = 4.0 + self.segment_background_extra_top = 0.0 + self.segment_background_extra_bottom = 1.5 + + @property + def text_a_color(self): + return self._text_a_color + + @text_a_color.setter + def text_a_color(self, value): + if value != self._text_a_color: + bpy.context.region.tag_redraw() + self._text_a_color = value + + @property + def text_a(self): + return self._text_a + + @text_a.setter + def text_a(self, value): + if value != self._text_a: + bpy.context.region.tag_redraw() + self._text_a = value + + @property + def text_b_color(self): + return self._text_b_color + + @text_b_color.setter + def text_b_color(self, value): + if value != self._text_b_color: + bpy.context.region.tag_redraw() + self._text_b_color = value + + @property + def text_b(self): + return self._text_b + + @text_b.setter + def text_b(self, value): + if value != self._text_b: + bpy.context.region.tag_redraw() + self._text_b = value + + @property + def text_size(self): + return self._text_size + @text_size.setter def text_size(self, value): if value != self._text_size: @@ -65,98 +227,266 @@ class BL_UI_Label(BL_UI_Widget): area_height = self.get_area_height() font_id = 1 - if bpy.app.version < (4, 0, 0): - blf.size(font_id, self._text_size, 72) - else: - blf.size(font_id, self._text_size) - lines = self._text.split("\n") if self.multiline else [self._text] - if not lines: - return - - default_line_height = self.row_height if self.multiline else self._text_size - line_metrics = [] - max_line_width = 0.0 - total_height = 0.0 - - for line in lines: - width, height = blf.dimensions(font_id, line) - if height == 0: - height = default_line_height - line_height = ( - self.row_height if self.multiline else max(height, self._text_size) - ) - if line_height == 0: - line_height = default_line_height - line_metrics.append((line, width, line_height)) - max_line_width = max(max_line_width, width) - total_height += line_height - - if not line_metrics: - return + set_font_size(font_id, self._text_size) textpos_y = area_height - self.y_screen - self.height - r, g, b, a = self._text_color - x = self.x_screen - y = textpos_y - if self._halign != "LEFT": - width, height = blf.dimensions(font_id, self._text) - if self._halign == "RIGHT": - x -= width - elif self._halign == "CENTER": - x -= width // 2 + cursor_x = self.x_screen + spacing = max(0.0, float(self.segment_spacing)) + blocks = [ + ( + self._text_a, + self._text_a_color, + self.strikethrough_a, + self.segment_background_color_a, + ), + ( + self._text_b, + self._text_b_color, + self.strikethrough_b, + self.segment_background_color_b, + ), + ] + segments = [] + for text, color, strike_flag, background_color in blocks: + if not text: + continue + + set_font_size(font_id, self._text_size) + width, height = blf.dimensions(font_id, text) + scaled_size = self._text_size + scaled = False + if self.width > 0: + if self._halign == "LEFT": + available_width = max(1, self.x_screen + self.width - cursor_x) + else: + available_width = self.width + if width > available_width and width > 0: + scale = available_width / width + scaled_size = max(8, int(self._text_size * scale)) + if scaled_size < self._text_size: + set_font_size(font_id, scaled_size) + width, height = blf.dimensions(font_id, text) + scaled = True + + x = cursor_x if self._halign == "LEFT" else self.x_screen + y = textpos_y + if self._halign != "LEFT": + if self._halign == "RIGHT": + x -= width + elif self._halign == "CENTER": + x -= width // 2 if self._valign == "CENTER": y -= height // 2 - # bottom could be here but there's no reason for it - first_line_height = line_metrics[0][2] + if not self.multiline: + lines = [ + { + "text": text, + "x": x, + "y": y, + "width": width, + "height": height or self._text_size, + "font_size": scaled_size, + } + ] + else: + lines = [] + current_y = y + split_lines = text.split("\n") + for index, line in enumerate(split_lines): + if index > 0: + current_y -= self.row_height + line_width, line_height = blf.dimensions(font_id, line) + if line_height == 0: + line_height = self.row_height + lines.append( + { + "text": line, + "x": x, + "y": current_y, + "width": line_width, + "height": line_height, + "font_size": scaled_size, + } + ) + width = max((line["width"] for line in lines), default=width) + height = max(len(lines) * self.row_height, height) - if self.background and (max_line_width > 0 or total_height > 0): - pad_x, pad_y = self._padding_tuple() - text_top = y + first_line_height - text_bottom = text_top - total_height - left = x - pad_x - right = x + max_line_width + pad_x - top = text_top + pad_y - bottom = text_bottom - pad_y - self._draw_background_rect(left, right, bottom, top) + if lines: + seg_min_x = min(line["x"] for line in lines) + seg_max_x = max(line["x"] + line["width"] for line in lines) + seg_min_y = min(line["y"] for line in lines) + seg_max_y = max(line["y"] + line["height"] for line in lines) + bounds = { + "min_x": seg_min_x, + "max_x": seg_max_x, + "min_y": seg_min_y, + "max_y": seg_max_y, + } + else: + bounds = None - current_y = y - if not self.multiline: - blf.position(font_id, x, current_y, 0) - blf.color(font_id, r, g, b, a) - blf.draw(font_id, self._text) - else: - for line, _, line_height in line_metrics: - blf.position(font_id, x, current_y, 0) + segments.append( + { + "lines": lines, + "color": color, + "strikethrough": strike_flag, + "bounds": bounds, + "background_color": background_color, + } + ) + + if self._halign == "LEFT" and bounds: + cursor_x = bounds["max_x"] + spacing + + if scaled: + set_font_size(font_id, self._text_size) + + if not segments: + return + + all_lines = [line for segment in segments for line in segment["lines"]] + if not all_lines: + return + + min_x = min(line["x"] for line in all_lines) + max_x = max(line["x"] + line["width"] for line in all_lines) + min_y = min(line["y"] for line in all_lines) + max_y = max(line["y"] + line["height"] for line in all_lines) + content_width = max(0.0, max_x - min_x) + content_height = max(0.0, max_y - min_y) + + if self.segment_backgrounds: + pad_source = ( + self.segment_background_padding + if self.segment_background_padding is not None + else self.background_padding + ) + if isinstance(pad_source, (list, tuple)): + base_pad_x = float(pad_source[0]) + base_pad_y = ( + float(pad_source[1]) + if len(pad_source) > 1 + else float(pad_source[0]) + ) + else: + base_pad_x = base_pad_y = float(pad_source) + + bounded_segments = [seg for seg in segments if seg.get("bounds")] + total_bounded = len(bounded_segments) + desired_gap = max(0.0, float(self.segment_background_gap)) + spacing = max(0.0, float(self.segment_spacing)) + interior_pad = max(0.0, (spacing - desired_gap) * 0.5) + extra_top = max(0.0, float(self.segment_background_extra_top)) + extra_bottom = max(0.0, float(self.segment_background_extra_bottom)) + + def coerce_corner_radii(value): + if isinstance(value, (tuple, list)): + values = list(value) + else: + values = [value] + if not values: + values = [0.0] + if len(values) == 1: + values = values * 4 + elif len(values) == 2: + values = [values[0], values[1], values[1], values[0]] + elif len(values) < 4: + values = values + [values[-1]] * (4 - len(values)) + return tuple(values[:4]) + + base_corner_radii = coerce_corner_radii(self.background_corner_radius) + + for idx, segment in enumerate(bounded_segments): + bounds = segment.get("bounds") + if not bounds: + continue + seg_width = max(0.0, bounds["max_x"] - bounds["min_x"]) + seg_height = max(0.0, bounds["max_y"] - bounds["min_y"]) + if seg_width <= 0 or seg_height <= 0: + continue + + pad_left = base_pad_x if idx == 0 else interior_pad + pad_right = base_pad_x if idx == total_bounded - 1 else interior_pad + + if total_bounded > 1: + left_edge = idx == 0 + right_edge = idx == total_bounded - 1 + corner_override = ( + base_corner_radii[0] if left_edge else 0.0, + base_corner_radii[1] if right_edge else 0.0, + base_corner_radii[2] if right_edge else 0.0, + base_corner_radii[3] if left_edge else 0.0, + ) + else: + corner_override = None + + padding_override = ( + pad_left, + pad_right, + base_pad_y + extra_bottom, + base_pad_y + extra_top, + ) + self.draw_background_rect( + bounds["min_x"], + bounds["min_y"], + seg_width, + seg_height, + segment.get("background_color") or segment["color"], + force=True, + padding_override=padding_override, + corner_radius_override=corner_override, + ) + + background_drawn = False + if not self.segment_backgrounds: + base_color = segments[0]["color"] if segments else self._text_a_color + self.draw_background_rect( + min_x, + min_y, + content_width, + content_height, + base_color, + ) + background_drawn = True + + for segment in segments: + r, g, b, a = segment["color"] + for line in segment["lines"]: + if not line["text"]: + continue + set_font_size(font_id, line.get("font_size", self._text_size)) + blf.position(font_id, line["x"], line["y"], 0) blf.color(font_id, r, g, b, a) - blf.draw(font_id, line) - current_y -= line_height + blf.draw(font_id, line["text"]) + set_font_size(font_id, self._text_size) - def _padding_tuple(self) -> Tuple[float, float]: - pad = self.padding - if isinstance(pad, (list, tuple)): - if len(pad) == 0: - return (0.0, 0.0) - if len(pad) == 1: - value = float(pad[0]) - return (value, value) - return (float(pad[0]), float(pad[1])) - value = float(pad) - return (value, value) + for segment in segments: + if not segment.get("strikethrough"): + continue + bounds = segment.get("bounds") + if not bounds: + continue + segment_min_x = bounds["min_x"] + segment_max_x = bounds["max_x"] + if segment_max_x <= segment_min_x: + continue + strike_y = bounds["min_y"] + (bounds["max_y"] - bounds["min_y"]) * 0.5 + self.draw_strikethrough( + segment_min_x, + segment_max_x, + strike_y, + segment["color"], + force=True, + ) - def _draw_background_rect(self, left, right, bottom, top): - vertices = ( - (left, top), - (left, bottom), - (right, bottom), - (right, top), - ) - indices = ((0, 1, 2), (0, 2, 3)) - gpu.state.blend_set("ALPHA") - self.shader.bind() - self.shader.uniform_float("color", self._bg_color) - batch = batch_for_shader( - self.shader, "TRIS", {"pos": vertices}, indices=indices - ) - batch.draw(self.shader) + if content_width > 0 and background_drawn: + strike_color = segments[0]["color"] + strike_y = min_y + content_height * 0.5 + self.draw_strikethrough( + min_x, + max_x, + strike_y, + strike_color, + ) diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_widget.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_widget.py index b14e94e..b91d12c 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_widget.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/bl_ui_widgets/bl_ui_widget.py @@ -1,7 +1,53 @@ +import blf import bpy import gpu from gpu_extras.batch import batch_for_shader +from .. import ui_bgl + +from typing import Union + + +def clamp(value, min_value=0.0, max_value=1.0): + return max(min_value, min(max_value, value)) + + +def set_font_size(font_id, size): + if bpy.app.version < (4, 0, 0): + blf.size(font_id, size, 72) + else: + blf.size(font_id, size) + + +def tint_color(color, tint_amount): + if tint_amount == 0.0: + return color + r, g, b, a = color + if tint_amount > 0.0: + r += (1.0 - r) * tint_amount + g += (1.0 - g) * tint_amount + b += (1.0 - b) * tint_amount + else: + r *= 1.0 + tint_amount + g *= 1.0 + tint_amount + b *= 1.0 + tint_amount + return (clamp(r), clamp(g), clamp(b), a) + + +def resolve_fill_color(preferred_color, fallback_color): + color = preferred_color or fallback_color or (1.0, 1.0, 1.0, 1.0) + r, g, b, a = color + return (clamp(r), clamp(g), clamp(b), clamp(a)) + + +def region_redraw(ctx: bpy.types.Context = None): + if ctx is not None: + context = ctx + else: + context = bpy.context + if context.region is not None: + context.region.tag_redraw() + class BL_UI_Widget: def __init__(self, x, y, width, height): @@ -19,15 +65,141 @@ class BL_UI_Widget: self._mouse_down_right = False self._is_visible = True self._is_active = True # if the widget needs to be disabled + # decorative helpers (opt-in per widget) + self._background_enabled = False + self.use_rounded_background = False + self.background_padding: tuple[int, int] = (0, 0) + # Radius can be '50%' for pill shape, each corner individually + self._background_corner_radius: Union[ + tuple[Union[str, float], ...], + str, + float, + ] = (0.0,) + self._background_corner_radius_custom = False + self.background_border = False + self.background_border_color = None + self.background_border_tint = 0.2 + self.background_border_thickness = 1.0 + self.strikethrough = False + self.strikethrough_thickness = 1.25 if bpy.app.version < (4, 0, 0): self.shader = gpu.shader.from_builtin("2D_UNIFORM_COLOR") else: self.shader = gpu.shader.from_builtin("UNIFORM_COLOR") + @property + def background_corner_radius(self): + return self._background_corner_radius + + @background_corner_radius.setter + def background_corner_radius(self, value): + self._background_corner_radius = value + self._background_corner_radius_custom = True + + @property + def background(self): + return self._background_enabled + + @background.setter + def background(self, value): + enabled = bool(value) + self._background_enabled = enabled + if not enabled: + self.use_rounded_background = False + elif enabled and not self.use_rounded_background: + self.use_rounded_background = True + + def _set_background_corner_radius_default(self, value): + self._background_corner_radius = value + self._background_corner_radius_custom = False + + def has_background_corner_radius_override(self): + return self._background_corner_radius_custom + + def resolve_background_fill(self, fallback_color, preferred_color=None): + base_color = fallback_color if preferred_color is None else preferred_color + return resolve_fill_color( + base_color, + fallback_color, + ) + + def resolve_background_border(self, fill_color): + if not self.background_border: + return None + if self.background_border_color: + return self.background_border_color + return tint_color(fill_color, self.background_border_tint) + + def draw_background_rect( + self, + min_x, + min_y, + width, + height, + fallback_color, + *, + force=False, + padding_override=None, + corner_radius_override=None, + fill_color_override=None, + ): + if (not self.use_rounded_background and not force) or width <= 0 or height <= 0: + return + if padding_override is None: + pad_x = self.background_padding[0] + pad_y = self.background_padding[1] + pad_left = pad_right = pad_x + pad_bottom = pad_top = pad_y + else: + if len(padding_override) == 4: + pad_left, pad_right, pad_bottom, pad_top = padding_override + elif len(padding_override) == 2: + pad_left = pad_right = padding_override[0] + pad_bottom = pad_top = padding_override[1] + else: + pad_left = pad_right = padding_override[0] + pad_bottom = pad_top = padding_override[1] + rect_x = min_x - pad_left + rect_y = min_y - pad_bottom + rect_width = width + pad_left + pad_right + rect_height = height + pad_top + pad_bottom + fill_color = self.resolve_background_fill( + fallback_color, + preferred_color=fill_color_override, + ) + border_color = self.resolve_background_border(fill_color) + corner_radius = ( + corner_radius_override + if corner_radius_override is not None + else self.background_corner_radius + ) + ui_bgl.draw_rounded_rect_with_border( + rect_x, + rect_y, + rect_width, + rect_height, + radius=corner_radius, + fill_color=fill_color, + border_color=border_color, + border_thickness=self.background_border_thickness, + ) + + def draw_strikethrough(self, min_x, max_x, y, color, *, force=False): + if (not self.strikethrough and not force) or max_x <= min_x: + return + ui_bgl.draw_line2d( + min_x, + y, + max_x, + y, + self.strikethrough_thickness, + color, + ) + def set_location(self, x, y): # if self.x != x or self.y != y or self.x_screen != x or self.y_screen != y: - # bpy.context.region.tag_redraw() + # region_redraw() self.x = x self.y = y self.x_screen = x @@ -41,8 +213,15 @@ class BL_UI_Widget: @bg_color.setter def bg_color(self, value): self._bg_color = value - if bpy.context.region is not None: - bpy.context.region.tag_redraw() + region_redraw() + + @property + def background_color(self): + return self._bg_color + + @background_color.setter + def background_color(self, value): + self.bg_color = value @property def visible(self): @@ -51,17 +230,17 @@ class BL_UI_Widget: @visible.setter def visible(self, value): if value != self._is_visible: - bpy.context.region.tag_redraw() + region_redraw() self._is_visible = value @property def active(self): return self._is_active - @visible.setter + @active.setter def active(self, value): if value != self._is_active: - bpy.context.region.tag_redraw() + region_redraw() self._is_active = value @property @@ -78,6 +257,20 @@ class BL_UI_Widget: gpu.state.blend_set("ALPHA") + if self.use_rounded_background: + area_height = self.get_area_height() + rect_y = area_height - self.y_screen - self.height + self.draw_background_rect( + self.x_screen, + rect_y, + self.width, + self.height, + self._bg_color, + force=True, + fill_color_override=self._bg_color, + ) + return + self.shader.bind() self.shader.uniform_float("color", self._bg_color) @@ -107,7 +300,7 @@ class BL_UI_Widget: self.batch_panel = batch_for_shader( self.shader, "TRIS", {"pos": vertices}, indices=indices ) - bpy.context.region.tag_redraw() + region_redraw() def handle_event(self, event): """ @@ -121,28 +314,27 @@ class BL_UI_Widget: if not self._is_active: return False - x = event.mouse_region_x - y = event.mouse_region_y + x, y = self._to_widget_region_coords(event) if event.type == "LEFTMOUSE": if event.value == "PRESS": self._mouse_down = True - bpy.context.region.tag_redraw() + region_redraw() return self.mouse_down(x, y) else: self._mouse_down = False - bpy.context.region.tag_redraw() + region_redraw() self.mouse_up(x, y) return False elif event.type == "RIGHTMOUSE": if event.value == "PRESS": self._mouse_down_right = True - bpy.context.region.tag_redraw() + region_redraw() return self.mouse_down_right(x, y) else: self._mouse_down_right = False - bpy.context.region.tag_redraw() + region_redraw() self.mouse_up(x, y) elif event.type == "MOUSEMOVE": @@ -154,13 +346,13 @@ class BL_UI_Widget: self.__inrect = True self.mouse_enter(event, x, y) # we tag redraw since the hover colors are picked in the draw function - bpy.context.region.tag_redraw() + region_redraw() # we are leaving the rect elif self.__inrect and not inrect: self.__inrect = False self.mouse_exit(event, x, y) - bpy.context.region.tag_redraw() + region_redraw() # return always false to enable mouse exit events on other buttons.(would sometimes not hide the tooltip) return False # self.__inrect @@ -174,6 +366,26 @@ class BL_UI_Widget: return False + def _to_widget_region_coords(self, event): + region = None + ctx = self.context + if isinstance(ctx, dict): + region = ctx.get("region") + elif hasattr(ctx, "region"): + region = getattr(ctx, "region") + + if ( + region is not None + and hasattr(event, "mouse_x") + and hasattr(event, "mouse_y") + ): + try: + return event.mouse_x - region.x, event.mouse_y - region.y + except AttributeError: + pass + + return getattr(event, "mouse_region_x", 0), getattr(event, "mouse_region_y", 0) + def get_input_keys(self): return [] diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/blender_manifest.toml b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/blender_manifest.toml index 7a1ab8a..5186114 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/blender_manifest.toml +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/blender_manifest.toml @@ -2,11 +2,11 @@ schema_version = "1.0.0" id = "blenderkit" type = "add-on" -version = "3.18.1-251219" # X.Y.Z-YYYYMMDD, must have a dash instead of a dot +version = "3.19.1-260402" # X.Y.Z-YYYYMMDD, must have a dash instead of a dot name = "BlenderKit Online Asset Library" tagline = "Drag & drop of assets from the community driven library" -maintainer = "Vilém Duha " +maintainer = "Vilem Duha , Petr Dlouhy, A. Gajdosik, Michal Hons" website = "https://blenderkit.com/" tags = ["3D View"] diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/blendfiles/thumbnailer.blend b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/blendfiles/thumbnailer.blend index 03ab320..01e9dab 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/blendfiles/thumbnailer.blend +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/blendfiles/thumbnailer.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1c1319997c57b47620485c9306d201bfb4a4792b01a7d42d2144a3f5de77e35f -size 381302 +oid sha256:f6147c32dd183cc3525c14dcbccc40e99680690c864dc453b05e1c03f17d4b43 +size 414452 diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/categories.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/categories.py index e390612..116e1b5 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/categories.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/categories.py @@ -125,6 +125,7 @@ def handle_categories_task(task: client_tasks.Task): "NODEGROUP": ["nodegroup"], "PRINTABLE": ["printable"], "ADDON": ["addon"], + "AUTHOR": ["author"], } if task.status == "finished": @@ -135,20 +136,20 @@ def handle_categories_task(task: client_tasks.Task): ) # TODO: do this in Client, just saving the file so next time it is updated even without internet return - bk_logger.warning(f"Could not load categories: {task.message}") + bk_logger.warning("Could not load categories: %s", task.message) if not os.path.exists(categories_filepath): source_path = paths.get_addon_file(subpath="data" + os.sep + "categories.json") try: shutil.copy(source_path, categories_filepath) except Exception as e: - bk_logger.warning(f"Could not copy categories file: {e}") + bk_logger.warning("Could not copy categories file: %s", e) return try: with open(categories_filepath, "r", encoding="utf-8") as catfile: global_vars.DATA["bkit_categories"] = json.load(catfile) except Exception as e: - bk_logger.warning(f"Could not read categories file: {e}") + bk_logger.warning("Could not read categories file: %s", e) # def get_upload_asset_type(self): diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.7.0/blenderkit-client-windows-arm64.exe b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.7.0/blenderkit-client-windows-arm64.exe deleted file mode 100644 index 9652ab4..0000000 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.7.0/blenderkit-client-windows-arm64.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60feb36a3c7d39c36c7ca3afb2c169227cd2a0805c27f532362cee853db74c7a -size 10328656 diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.7.0/blenderkit-client-windows-x86_64.exe b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.7.0/blenderkit-client-windows-x86_64.exe deleted file mode 100644 index 8bf00cb..0000000 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.7.0/blenderkit-client-windows-x86_64.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9cb2627c6ee53286a4a8b3b78bd212b94d628afded605c7d2209f1c3dedd9e8a -size 11187280 diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.7.0/blenderkit-client-linux-arm64 b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.8.3/blenderkit-client-linux-arm64 similarity index 64% rename from extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.7.0/blenderkit-client-linux-arm64 rename to extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.8.3/blenderkit-client-linux-arm64 index b9fb000..0bd6847 100644 Binary files a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.7.0/blenderkit-client-linux-arm64 and b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.8.3/blenderkit-client-linux-arm64 differ diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.7.0/blenderkit-client-linux-x86_64 b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.8.3/blenderkit-client-linux-x86_64 similarity index 67% rename from extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.7.0/blenderkit-client-linux-x86_64 rename to extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.8.3/blenderkit-client-linux-x86_64 index 4881ba0..c3510e4 100644 Binary files a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.7.0/blenderkit-client-linux-x86_64 and b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.8.3/blenderkit-client-linux-x86_64 differ diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.7.0/blenderkit-client-macos-arm64 b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.8.3/blenderkit-client-macos-arm64 similarity index 64% rename from extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.7.0/blenderkit-client-macos-arm64 rename to extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.8.3/blenderkit-client-macos-arm64 index 4a20c04..4fcc18f 100644 Binary files a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.7.0/blenderkit-client-macos-arm64 and b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.8.3/blenderkit-client-macos-arm64 differ diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.7.0/blenderkit-client-macos-x86_64 b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.8.3/blenderkit-client-macos-x86_64 similarity index 66% rename from extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.7.0/blenderkit-client-macos-x86_64 rename to extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.8.3/blenderkit-client-macos-x86_64 index 50967eb..49cb4a9 100644 Binary files a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.7.0/blenderkit-client-macos-x86_64 and b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.8.3/blenderkit-client-macos-x86_64 differ diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.8.3/blenderkit-client-windows-arm64.exe b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.8.3/blenderkit-client-windows-arm64.exe new file mode 100644 index 0000000..80ebe8a --- /dev/null +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.8.3/blenderkit-client-windows-arm64.exe @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa03fa31b5280e33df05b7828b3506f1d0bdec4be8ff8f4e3542243355416c5e +size 10345040 diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.8.3/blenderkit-client-windows-x86_64.exe b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.8.3/blenderkit-client-windows-x86_64.exe new file mode 100644 index 0000000..7253834 --- /dev/null +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client/v1.8.3/blenderkit-client-windows-x86_64.exe @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1af9b4b22aa061e4c974476024d7ec3f571a78f48dab5a82aad09c6e9b8f79ac +size 11206224 diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client_lib.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client_lib.py index cde57da..9e23e9a 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client_lib.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/client_lib.py @@ -16,6 +16,8 @@ # # ##### END GPL LICENSE BLOCK ##### +from __future__ import annotations + import dataclasses import logging import os @@ -23,7 +25,7 @@ import platform import shutil import subprocess from os import path -from typing import Optional +from typing import Optional, Union from http.client import responses as http_responses @@ -36,6 +38,8 @@ from . import datas, global_vars, reports, utils bk_logger = logging.getLogger(__name__) NO_PROXIES = {"http": "", "https": ""} TIMEOUT = (0.1, 1) +# Shorter timeout for the frequent report polling that runs on Blender's main thread. +POLL_TIMEOUT = (0.05, 0.25) def get_address() -> str: @@ -127,7 +131,7 @@ def reorder_ports(port: str = ""): ) -def get_reports(app_id: str): +def get_reports(app_id: int): """Get reports for all tasks of app_id Blender instance at once. If few last calls failed, then try to get reports also from other than default ports. """ @@ -152,7 +156,7 @@ def get_reports(app_id: str): reorder_ports(port) return report except Exception as e: - bk_logger.info(f"Failed to get BlenderKit-Client reports: {e}") + bk_logger.info("Failed to get BlenderKit-Client reports: %s", e) last_exception = e if last_exception is not None: raise last_exception @@ -163,7 +167,7 @@ def request_report(url: str, data: dict) -> dict: If something goes south, this function raises requests.HTTPError or requests.JSONDecodeError. """ with requests.Session() as session: - resp = session.get(url, json=data, timeout=TIMEOUT, proxies=NO_PROXIES) + resp = session.get(url, json=data, timeout=POLL_TIMEOUT, proxies=NO_PROXIES) if resp.status_code != 200: # not using resp.raise_for_status() for better message raise requests.HTTPError( @@ -176,7 +180,7 @@ def request_report(url: str, data: dict) -> dict: # SEARCH def asset_search(search_data: datas.SearchData): """Search for specified asset.""" - bk_logger.info(f"Starting search request: {search_data.urlquery}") + bk_logger.info("Starting search request: %s", search_data.urlquery) search_data = ensure_minimal_data_class(search_data) with requests.Session() as session: @@ -184,7 +188,7 @@ def asset_search(search_data: datas.SearchData): resp = session.post( url, json=datas.asdict(search_data), timeout=TIMEOUT, proxies=NO_PROXIES ) - bk_logger.debug("Got search response") + bk_logger.log(5, "Got search response") return resp.json() @@ -219,7 +223,7 @@ def asset_upload(upload_data, export_data, upload_set): data = ensure_minimal_data(data) with requests.Session() as session: url = get_base_url() + "/blender/asset_upload" - bk_logger.debug(f"making a request to: {url}") + bk_logger.debug("making a request to: %s", url) resp = session.post(url, json=data, timeout=TIMEOUT, proxies=NO_PROXIES) return resp @@ -355,12 +359,15 @@ def get_rating(asset_id: str): ) -def send_rating(asset_id: str, rating_type: str, rating_value: str): +def send_rating(asset_id: str, rating_type: str, rating_value: Union[str, int]): data = { "asset_id": asset_id, "rating_type": rating_type, "rating_value": rating_value, } + if rating_type == "bookmarks": + data["rating_value"] = int(rating_value) # type: ignore + data = ensure_minimal_data(data) with requests.Session() as session: return session.post( @@ -674,7 +681,7 @@ def start_blenderkit_client(): reports.add_report(msg, type="ERROR") raise (e) - bk_logger.info(f"BlenderKit-Client {client_version} starting on {get_address()}") + bk_logger.info("BlenderKit-Client %s starting on %s", client_version, get_address()) def decide_client_binary_name() -> str: @@ -760,11 +767,11 @@ def ensure_client_binary_installed(): return preinstalled_client_path = get_preinstalled_client_path() - bk_logger.info(f"Copying BlenderKit-Client binary {preinstalled_client_path}") + bk_logger.info("Copying BlenderKit-Client binary %s", preinstalled_client_path) os.makedirs(path.dirname(client_binary_path), exist_ok=True) shutil.copy(preinstalled_client_path, client_binary_path) os.chmod(client_binary_path, 0o711) - bk_logger.info(f"BlenderKit-Client binary copied to {client_binary_path}") + bk_logger.info("BlenderKit-Client binary copied to %s", client_binary_path) def get_addon_dir(): diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/colors.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/colors.py index 677d3bf..44050f6 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/colors.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/colors.py @@ -40,8 +40,11 @@ RED = (1, 0.5, 0.5, 0.8) BLUE = (0.8, 0.8, 1, 0.8) """BLUE Color for validator reports.""" +ACTIVE_BLUE = (0.7, 0.8, 1.0, 1.0) +"""ACTIVE_BLUE Color for active elements in the UI, mainly filters.""" + GREEN_PRICE = (0.42, 0.49, 0.19, 1.0) -"""Emerald Green to be used on "discounted" add-ons.""" +"""Emerald Green to be used on "free" add-ons.""" PURPLE_PRICE = (0.59, 0.05, 0.82, 1.0) """Lavender Purple to be used on "for sale" add-ons.""" @@ -52,6 +55,9 @@ ORANGE_FULL = (0.702, 0.349, 0.208, 1.0) GRAY = (0.7, 0.7, 0.7, 0.6) """Default color for debug reports.""" +YELLOW = (1.0, 1.0, 0.5, 0.8) +"""Yellow color for warning reports.""" + # pure colors PURE_WHITE = (1, 1, 1, 1) PURE_BLACK = (0, 0, 0, 1) diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/comments_utils.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/comments_utils.py index f2233e8..e376253 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/comments_utils.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/comments_utils.py @@ -26,9 +26,9 @@ bk_logger = logging.getLogger(__name__) ### COMMENTS def handle_get_comments_task(task: client_tasks.Task): - """Handle incomming task which downloads comments on asset.""" + """Handle incoming task which downloads comments on asset.""" if task.status == "error": - return bk_logger.warning(f"failed to get comments: {task.message}") + return bk_logger.warning("failed to get comments: %s", task.message) if task.status == "finished": comments = task.result["results"] store_comments_local(task.data["asset_id"], comments) @@ -38,25 +38,25 @@ def handle_get_comments_task(task: client_tasks.Task): def handle_create_comment_task(task: client_tasks.Task): """Handle incoming task for creating a new comment.""" if task.status == "finished": - return bk_logger.debug(f"Creating comment finished - {task.message}") + return bk_logger.debug("Creating comment finished - %s", task.message) if task.status == "error": - return bk_logger.warning(f"Creating comment failed - {task.message}") + return bk_logger.warning("Creating comment failed - %s", task.message) def handle_feedback_comment_task(task: client_tasks.Task): - """Handle incomming task for update of feedback on comment.""" + """Handle incoming task for update of feedback on comment.""" if task.status == "finished": # action not needed - return bk_logger.debug(f"Comment feedback finished - {task.message}") + return bk_logger.debug("Comment feedback finished - %s", task.message) if task.status == "error": - return bk_logger.warning(f"Comment feedback failed - {task.message}") + return bk_logger.warning("Comment feedback failed - %s", task.message) def handle_mark_comment_private_task(task: client_tasks.Task): - """Handle incomming task for marking the comment as private/public.""" + """Handle incoming task for marking the comment as private/public.""" if task.status == "finished": # action not needed - return bk_logger.debug(f"Marking comment visibility finished - {task.message}") + return bk_logger.debug("Marking comment visibility finished - %s", task.message) if task.status == "error": - return bk_logger.warning(f"Marking comment visibility failed - {task.message}") + return bk_logger.warning("Marking comment visibility failed - %s", task.message) def store_comments_local(asset_id, comments): @@ -69,12 +69,12 @@ def get_comments_local(asset_id): ### NOTIFICATIONS def handle_notifications_task(task: client_tasks.Task): - """Handle incomming task with notifications data.""" + """Handle incoming task with notifications data.""" if task.status == "finished": global_vars.DATA["bkit notifications"] = task.result return if task.status == "error": - return bk_logger.warning(f"Could not load notifications: {task.message}") + return bk_logger.warning("Could not load notifications: %s", task.message) def check_notifications_read(): diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/datas.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/datas.py index 0463389..e16688c 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/datas.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/datas.py @@ -25,6 +25,7 @@ class Prefs: global_dir: str project_subdir: str unpack_files: bool + write_asset_metadata: bool show_on_start: bool thumb_size: int maximized_assetbar_rows: int @@ -32,6 +33,7 @@ class Prefs: search_in_header: bool tips_on_start: bool announcements_on_start: bool + assetbar_follows_cursor: bool client_port: str ip_version: str ssl_context: str @@ -115,7 +117,7 @@ class MineProfile: This is private information about current user's profile. Fields can be also None. Because API can just return null just for fun (https://github.com/BlenderKit/BlenderKit/issues/1545#event-17220997340). None/null is not 0 or "" however, so we keep the None to distinguish both states. - As result the Nones has to be catched later in code, types are just hints in here! + As result the Nones has to be captured later in code, types are just hints in here! """ aboutMe: str = "" diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/disclaimer_op.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/disclaimer_op.py index 491c878..112208d 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/disclaimer_op.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/disclaimer_op.py @@ -58,8 +58,8 @@ class BlenderKitDisclaimerOperator(BL_UI_OT_draw_operator): ) fadeout_time: IntProperty( # type: ignore[valid-type] - name="Fadout time", - description="after how many seconds do fadout", + name="Fadeout time", + description="after how many seconds do fadeout", default=5, min=1, max=50, @@ -224,18 +224,21 @@ class BlenderKitDisclaimerOperator(BL_UI_OT_draw_operator): @classmethod def unregister(cls): - bk_logger.debug(f"unregistering class {cls}") + bk_logger.debug("unregistering class %s", cls) instances_copy = cls.instances.copy() for instance in instances_copy: - bk_logger.debug(f"- class instance {instance}") + try: + bk_logger.debug("- class instance %s", instance) + except ReferenceError: + bk_logger.debug("- class instance ") try: instance.unregister_handlers(instance.context) except Exception as e: - bk_logger.debug(f"-- error unregister_handlers(): {e}") + bk_logger.debug("-- error unregister_handlers(): %s", e) try: instance.on_finish(instance.context) except Exception as e: - bk_logger.debug(f"-- error calling on_finish() {e}") + bk_logger.debug("-- error calling on_finish() %s", e) if bpy.context.region is not None: bpy.context.region.tag_redraw() @@ -290,7 +293,7 @@ def handle_disclaimer_task(task: client_tasks.Task): return if task.status == "error": - bk_logger.warning(f"Could not load disclaimer: {task.message}") + bk_logger.warning("Could not load disclaimer: %s", task.message) return show_random_tip() diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/download.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/download.py index 54f1f60..6ae037f 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/download.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/download.py @@ -16,16 +16,16 @@ # # ##### END GPL LICENSE BLOCK ##### +from __future__ import annotations + import addon_utils import copy import json import logging import os import shutil -import tempfile import time -import urllib.request - +from typing import Optional from . import ( append_link, @@ -56,6 +56,12 @@ from bpy.props import ( bk_logger = logging.getLogger(__name__) +STALE_DOWNLOAD_TIMEOUT = ( + 20.0 # seconds without progress before we treat a download as stalled +) + +download_tasks = {} + def get_blenderkit_repository(): """Find the BlenderKit extensions repository index. @@ -123,7 +129,7 @@ def get_addon_installation_status(asset_data): ) and addon_module.startswith("bl_ext."): is_enabled = True bk_logger.info( - f"Found enabled addon with extension format: {addon_module}" + "Found enabled addon with extension format: %s", addon_module ) break @@ -141,11 +147,12 @@ def get_addon_installation_status(asset_data): ) and addon_module.__name__.startswith("bl_ext."): is_installed = True bk_logger.info( - f"Found installed addon with extension format: {addon_module.__name__}" + "Found installed addon with extension format: %s", + addon_module.__name__, ) break except Exception as e: - bk_logger.warning(f"Error checking addon_utils.modules(): {e}") + bk_logger.warning("Error checking addon_utils.modules(): %s", e) # If found through addon_utils, we know it's installed # But we need to double-check enabled status using the correct module name @@ -160,10 +167,10 @@ def get_addon_installation_status(asset_data): # Check if this specific module name is enabled is_enabled = addon_module.__name__ in enabled_addons if is_enabled: - bk_logger.info(f"Found enabled addon: {addon_module.__name__}") + bk_logger.info("Found enabled addon: %s", addon_module.__name__) break except Exception as e: - bk_logger.warning(f"Error double-checking enabled status: {e}") + bk_logger.warning("Error double-checking enabled status: %s", e) # Method 3: If not found through traditional addon system, check extensions system if not is_installed: @@ -173,7 +180,7 @@ def get_addon_installation_status(asset_data): "blenderkit_extensions_repo_cache", {} ) - for cache_key, pkg_data in bk_ext_cache.items(): + for _cache_key, pkg_data in bk_ext_cache.items(): if isinstance(pkg_data, dict) and pkg_data.get("id") == extension_id: # Check if it's actually installed in the extension system is_installed = pkg_data.get("installed", False) @@ -182,12 +189,11 @@ def get_addon_installation_status(asset_data): is_enabled = pkg_data.get("enabled", False) break except Exception as e: - bk_logger.warning(f"Error checking extension cache: {e}") + bk_logger.warning("Error checking extension cache: %s", e) # Method 4: Check through Blender's extension repositories directly if not is_installed: try: - # Look for BlenderKit repository and check its packages for repo in bpy.context.preferences.extensions.repos: if not repo.enabled: @@ -203,7 +209,7 @@ def get_addon_installation_status(asset_data): # For now, we'll rely on the previous methods break except Exception as e: - bk_logger.warning(f"Error checking extension repositories: {e}") + bk_logger.warning("Error checking extension repositories: %s", e) # Debug: Show some enabled addons for reference blenderkit_addons = [ @@ -252,7 +258,7 @@ def install_addon_from_local_file(asset_data, file_path, enable_on_install=True) reports.add_report(error_msg, type="ERROR") raise Exception(error_msg) - bk_logger.info(f"Installing addon '{addon_name}' from local file: {file_path}") + bk_logger.info("Installing addon '%s' from local file: %s", addon_name, file_path) status = get_addon_installation_status(asset_data) if status["installed"]: @@ -288,7 +294,19 @@ def install_addon_from_local_file(asset_data, file_path, enable_on_install=True) ) -download_tasks = {} +def _reset_progress_for_asset_ids(asset_ids): + """Reset UI progress bars for the given asset ids.""" + if not asset_ids: + return + + search_results = search.get_search_results() + if search_results is None: + return + + for result in search_results: + if result.get("id") in asset_ids: + result["downloaded"] = 0 + INT32_MIN = -2_147_483_648 INT32_MAX = 2_147_483_647 @@ -348,7 +366,7 @@ def check_unused(): for l in bpy.data.libraries: if l not in used_libs and l.getn("asset_data"): - bk_logger.info(f"attempt to remove this library: {l.filepath}") + bk_logger.info("attempt to remove this library: %s", l.filepath) # have to unlink all groups, since the file is a 'user' even if the groups aren't used at all... for user_id in l.users_id: if type(user_id) == bpy.types.Collection: @@ -364,7 +382,7 @@ def get_temp_enabled_addons(): temp_addons_json = prefs.temp_enabled_addons return json.loads(temp_addons_json) except Exception as e: - bk_logger.warning(f"Error reading temporary addons from preferences: {e}") + bk_logger.warning("Error reading temporary addons from preferences: %s", e) return [] @@ -374,9 +392,9 @@ def set_temp_enabled_addons(addon_list): try: prefs = bpy.context.preferences.addons[__package__].preferences prefs.temp_enabled_addons = json.dumps(addon_list) - bk_logger.info(f"Saved {len(addon_list)} temporary addons to preferences") + bk_logger.info("Saved %d temporary addons to preferences", len(addon_list)) except Exception as e: - bk_logger.error(f"Error saving temporary addons to preferences: {e}") + bk_logger.error("Error saving temporary addons to preferences: %s", e) def add_temp_enabled_addon(pkg_id): @@ -385,7 +403,7 @@ def add_temp_enabled_addon(pkg_id): if pkg_id not in temp_enabled: temp_enabled.append(pkg_id) set_temp_enabled_addons(temp_enabled) - bk_logger.info(f"Added {pkg_id} to temporary addons list") + bk_logger.info("Added %s to temporary addons list", pkg_id) def cleanup_temp_enabled_addons(): @@ -398,24 +416,24 @@ def cleanup_temp_enabled_addons(): bk_logger.info("No temporarily enabled addons to clean up") return - bk_logger.info(f"Cleaning up {len(temp_enabled)} temporarily enabled addons") + bk_logger.info("Cleaning up %d temporarily enabled addons", len(temp_enabled)) # Disable all temporarily enabled addons using preferences API for pkg_id in temp_enabled: try: full_module_name = f"bl_ext.www_blenderkit_com.{pkg_id}" bpy.ops.preferences.addon_disable(module=full_module_name) - bk_logger.info(f"Disabled temporarily enabled addon: {pkg_id}") + bk_logger.info("Disabled temporarily enabled addon: %s", pkg_id) except Exception as e: bk_logger.warning( - f"Failed to disable temporarily enabled addon {pkg_id}: {e}" + "Failed to disable temporarily enabled addon %s: %s", pkg_id, e ) # Clear the list in preferences set_temp_enabled_addons([]) bk_logger.info("Temporary addon cleanup completed") except Exception as e: - bk_logger.error(f"Error during temporary addon cleanup: {e}") + bk_logger.error("Error during temporary addon cleanup: %s", e) @persistent @@ -466,7 +484,7 @@ def refresh_addon_search_results_status(): asset_data["enabled"] = False except Exception as e: - bk_logger.warning(f"Error refreshing addon search results status: {e}") + bk_logger.warning("Error refreshing addon search results status: %s", e) @persistent @@ -617,7 +635,7 @@ def _sanitize_for_idprops(value): return value -def udpate_asset_data_in_dicts(asset_data): +def update_asset_data_in_dicts(asset_data): """ updates asset data in all relevant dictionaries, after a threaded download task \ - where the urls were retrieved, and now they can be reused @@ -705,6 +723,8 @@ def append_asset(asset_data, **kwargs): # downloaders=[], location=None, user_preferences = bpy.context.preferences.addons[__package__].preferences user_preferences.download_counter += 1 + asset_main = None + if asset_data["assetType"] == "scene": sprops = wm.blenderkit_scene @@ -758,7 +778,7 @@ def append_asset(asset_data, **kwargs): # downloaders=[], location=None, # also, if it was successful, no other operations are needed , basically all asset data is already ready from the original asset if new_obs: # update here assets rated/used because there might be new download urls? - udpate_asset_data_in_dicts(asset_data) + update_asset_data_in_dicts(asset_data) bpy.ops.ed.undo_push( "INVOKE_REGION_WIN", message="add %s to scene" % asset_data["name"], @@ -772,7 +792,7 @@ def append_asset(asset_data, **kwargs): # downloaders=[], location=None, if downloaders: for downloader in downloaders: # this cares for adding particle systems directly to target mesh, but I had to block it now, - # because of the sluggishnes of it. Possibly re-enable when it's possible to do this faster? + # because of the sluggishness of it. Possibly re-enable when it's possible to do this faster? if ( "particle_plants" in asset_data["tags"] and kwargs["target_object"] != "" @@ -854,6 +874,7 @@ def append_asset(asset_data, **kwargs): # downloaders=[], location=None, lib["asset_data"] = asset_data elif asset_data["assetType"] == "brush": + brush = None inscene = False for b in bpy.data.brushes: if b.blenderkit.id == asset_data["id"]: @@ -910,9 +931,11 @@ def append_asset(asset_data, **kwargs): # downloaders=[], location=None, ) # TODO add grease pencil brushes! # bpy.context.tool_settings.image_paint.brush = brush - asset_main = brush + if brush is not None: + asset_main = brush elif asset_data["assetType"] == "material": + material = None inscene = False sprops = wm.blenderkit_mat @@ -927,12 +950,14 @@ def append_asset(asset_data, **kwargs): # downloaders=[], location=None, file_names[-1], matname=asset_data["name"], link=link, fake_user=False ) - target_object = bpy.data.objects[kwargs["target_object"]] - assign_material(target_object, material, kwargs["material_target_slot"]) + if material is not None: + target_object = bpy.data.objects[kwargs["target_object"]] + assign_material(target_object, material, kwargs["material_target_slot"]) - asset_main = material + asset_main = material elif asset_data["assetType"] == "nodegroup": + nodegroup = None inscene = False sprops = wm.blenderkit_nodegroup for g in bpy.data.node_groups: @@ -979,11 +1004,12 @@ def append_asset(asset_data, **kwargs): # downloaders=[], location=None, model_location=kwargs.get("model_location", (0, 0, 0)), model_rotation=kwargs.get("model_rotation", (0, 0, 0)), ) - bk_logger.info(f"appended nodegroup: {nodegroup}") - asset_main = nodegroup + if nodegroup is not None: + bk_logger.info("appended nodegroup: %s", nodegroup) + asset_main = nodegroup asset_data["resolution"] = kwargs["resolution"] - udpate_asset_data_in_dicts(asset_data) + update_asset_data_in_dicts(asset_data) if asset_main is not None: update_asset_metadata(asset_main, asset_data) @@ -1000,6 +1026,36 @@ def update_asset_metadata(asset_main, asset_data): asset_main.blenderkit.id = asset_data["id"] asset_main.blenderkit.description = asset_data["description"] asset_main.blenderkit.tags = utils.list2string(asset_data["tags"]) + asset_main.blenderkit.is_private = ( + "PRIVATE" if asset_data["isPrivate"] else "PUBLIC" + ) + asset_main.blenderkit.verification_status = asset_data.get( + "verificationStatus", "UPLOADING" + ).upper() + + # manufacturer + if asset_data.get("dictParameters"): + dp = asset_data["dictParameters"] + if dp.get("manufacturer"): + asset_main.blenderkit.manufacturer = dp["manufacturer"] + else: + asset_main.blenderkit.manufacturer = "" + if dp.get("designer"): + asset_main.blenderkit.designer = dp["designer"] + else: + asset_main.blenderkit.designer = "" + if dp.get("designCollection"): + asset_main.blenderkit.design_collection = dp["designCollection"] + else: + asset_main.blenderkit.design_collection = "" + if dp.get("designVariant"): + asset_main.blenderkit.design_variant = dp["designVariant"] + else: + asset_main.blenderkit.design_variant = "" + if dp.get("designYear"): + asset_main.blenderkit.use_design_year = True + asset_main.blenderkit.design_year = int(float(dp["designYear"])) + # BUG #554: categories needs update, but are not in asset_data sanitized = _sanitize_for_idprops(asset_data) # TODO consider reducing stored fields for filesize. @@ -1022,11 +1078,11 @@ def replace_resolution_linked(file_paths, asset_data): bk_logger.debug("try to re-link library") if not os.path.isfile(file_paths[-1]): - bk_logger.debug("library file doesnt exist") + bk_logger.debug("library file doesn't exist") break l.filepath = os.path.join(os.path.dirname(l.filepath), file_name) l.name = file_name - udpate_asset_data_in_dicts(asset_data) + update_asset_data_in_dicts(asset_data) def replace_resolution_appended(file_paths, asset_data, resolution): @@ -1060,7 +1116,7 @@ def replace_resolution_appended(file_paths, asset_data, resolution): for pf in i.packed_files: pf.filepath = fp i.reload() - udpate_asset_data_in_dicts(asset_data) + update_asset_data_in_dicts(asset_data) # TODO: keep this until we check resolution replacement and other features from this one are supported in daemon. @@ -1179,6 +1235,13 @@ def handle_download_task(task: client_tasks.Task): """ global download_tasks + # If the task was already pruned/cancelled, ignore late reports from the client. + if task.task_id not in download_tasks: + bk_logger.debug( + "Ignoring late download task %s (no longer tracked)", task.task_id + ) + return + if task.status == "finished": # we still write progress since sometimes the progress bars wouldn't end on 100% download_write_progress(task.task_id, task) @@ -1188,7 +1251,7 @@ def handle_download_task(task: client_tasks.Task): download_tasks.pop(task.task_id) return except Exception as e: - bk_logger.exception(f"Asset appending/linking has failed") + bk_logger.exception("Asset appending/linking has failed: %s", e) task.message = f"Append failed: {e}" task.status = "error" @@ -1205,15 +1268,92 @@ def clear_downloads(): download_tasks.clear() +def cancel_running_downloads(reason: str = ""): + """Cancel all running downloads for this Blender process and reset local UI state.""" + + global download_tasks + + if not download_tasks: + return + + task_ids = list(download_tasks.keys()) + asset_ids = set() + for task in download_tasks.values(): + if not isinstance(task, dict): + continue + asset_id = task.get("asset_data", {}).get("id") + if asset_id: + asset_ids.add(asset_id) + + suffix = f" ({reason})" if reason else "" + bk_logger.info("Cancelling %d running downloads%s", len(task_ids), suffix) + + for task_id in task_ids: + try: + client_lib.cancel_download(task_id) + except Exception as e: + bk_logger.warning("Failed to cancel download %s: %s", task_id, e) + + clear_downloads() + _reset_progress_for_asset_ids(asset_ids) + + +def prune_stalled_downloads( + max_idle_seconds: float = STALE_DOWNLOAD_TIMEOUT, now: Optional[float] = None +) -> None: + """Cancel downloads that have not reported progress for too long.""" + + if not download_tasks: + return + + now = now if now is not None else time.monotonic() + stalled_task_ids = [] + stalled_asset_ids = set() + + for task_id, task in list(download_tasks.items()): + last_report_time = task.get("last_report_time") or task.get("started_at") + if last_report_time is None: + task["last_report_time"] = now + continue + if now - last_report_time < max_idle_seconds: + continue + + stalled_task_ids.append(task_id) + + asset_info = task.get("asset_data", {}) + asset_id = asset_info.get("id") + asset_name = asset_info.get("name", "Asset") + + reports.add_report( + f"Download for {asset_name} stalled and was cancelled. Please try again.", + type="ERROR", + ) + + if asset_id: + stalled_asset_ids.add(asset_id) + + if not stalled_task_ids: + return + + for task_id in stalled_task_ids: + try: + client_lib.cancel_download(task_id) + except Exception as e: + bk_logger.warning("Failed to cancel stalled download %s: %s", task_id, e) + download_tasks.pop(task_id, None) + + _reset_progress_for_asset_ids(stalled_asset_ids) + + def download_write_progress(task_id, task): """writes progress from client_lib reports to addon tasks list""" global download_tasks task_addon = download_tasks.get(task.task_id) if task_addon is None: - bk_logger.warning(f"couldn't write download progress to {task.progress}") - return + return # task was likely cancelled/stalled and removed; ignore late progress task_addon["progress"] = task.progress task_addon["text"] = task.message + task_addon["last_report_time"] = time.monotonic() # go through search results to write progress to display progress bars sr = search.get_search_results() @@ -1350,6 +1490,7 @@ def download(asset_data, **kwargs): if "unpack_files" in kwargs: # for add-on download prefs["unpack_files"] = kwargs["unpack_files"] + now = time.monotonic() data = { "asset_data": asset_data, "PREFS": prefs, @@ -1362,6 +1503,9 @@ def download(asset_data, **kwargs): data["download_dirs"] = paths.get_download_dirs(asset_data["assetType"]) if "downloaders" in kwargs: data["downloaders"] = kwargs["downloaders"] + data.setdefault("downloaders", []) + data["started_at"] = now + data["last_report_time"] = now response = client_lib.asset_download(data) download_tasks[response["task_id"]] = data @@ -1379,7 +1523,7 @@ def check_downloading(asset_data, **kwargs) -> bool: p_asset_data = task["asset_data"] if p_asset_data["id"] == asset_data["id"]: at = asset_data["assetType"] - if at in ("model", "material"): + if at in ("model", "material", "printable", "scene"): downloader = { "location": kwargs["model_location"], "rotation": kwargs["model_rotation"], @@ -1449,7 +1593,7 @@ def try_finished_append(asset_data, **kwargs): try: os.remove(file_path) except Exception as e1: - bk_logger.error(f"removing file {file_path} failed: {e1}") + bk_logger.error("removing file %s failed: %s", file_path, e1) raise e # Update downloaded status in search results @@ -1619,9 +1763,9 @@ def start_download(asset_data, **kwargs) -> bool: try_finished_append(asset_data, **kwargs) return False except Exception as e: - bk_logger.info(f"Failed to append asset: {e}, continuing with download") + bk_logger.info("Failed to append asset: %s, continuing with download", e) - if asset_data["assetType"] in ("model", "material"): + if asset_data["assetType"] in ("model", "material", "printable", "scene"): downloader = { "location": kwargs["model_location"], "rotation": kwargs["model_rotation"], @@ -1965,7 +2109,7 @@ class BlenderkitAddonChoiceOperator(bpy.types.Operator): self.report({"INFO"}, f"Successfully enabled '{addon_name}'") refresh_addon_search_results_status() except Exception as e: - bk_logger.error(f"Failed to enable addon: {e}") + bk_logger.error("Failed to enable addon: %s", e) reports.add_report( f"Failed to enable '{addon_name}': {e}", type="ERROR" ) @@ -1985,7 +2129,7 @@ class BlenderkitAddonChoiceOperator(bpy.types.Operator): self.report({"INFO"}, f"Successfully disabled '{addon_name}'") refresh_addon_search_results_status() except Exception as e: - bk_logger.error(f"Failed to disable addon: {e}") + bk_logger.error("Failed to disable addon: %s", e) reports.add_report( f"Failed to disable '{addon_name}': {e}", type="ERROR" ) @@ -2000,7 +2144,7 @@ class BlenderkitAddonChoiceOperator(bpy.types.Operator): f"Temporary enable operation failed - returned: {result}" ) except Exception as e: - bk_logger.error(f"Failed to temp enable addon: {e}") + bk_logger.error("Failed to temp enable addon: %s", e) reports.add_report( f"Failed to enable '{addon_name}': {e}", type="ERROR" ) @@ -2016,7 +2160,7 @@ class BlenderkitAddonChoiceOperator(bpy.types.Operator): refresh_addon_search_results_status() except Exception as e: - bk_logger.error(f"Addon operation failed for '{addon_name}': {e}") + bk_logger.error("Addon operation failed for '%s': %s", addon_name, e) error_msg = f"Failed to {selected_action.lower().replace('_', ' ')} '{addon_name}': {e}" reports.add_report(error_msg, type="ERROR") self.report({"ERROR"}, error_msg) @@ -2309,7 +2453,7 @@ class BlenderkitDownloadOperator(bpy.types.Operator): return {"FINISHED"} # replace resolution needs to replace all instances of the resolution in the scene - # and deleting originals has to be thus done after the downlaod + # and deleting originals has to be thus done after the download kwargs = { "cast_parent": self.cast_parent, @@ -2333,7 +2477,7 @@ class BlenderkitDownloadOperator(bpy.types.Operator): return {"FINISHED"} def draw(self, context): - # this timer is there to not let double clicks thorugh the popups down to the asset bar. + # this timer is there to not let double clicks through the popups down to the asset bar. ui_panels.last_time_overlay_panel_active = time.time() layout = self.layout if self.invoke_resolution: diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/global_vars.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/global_vars.py index e71fd13..47fe6d4 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/global_vars.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/global_vars.py @@ -21,10 +21,13 @@ from os import environ from subprocess import Popen from typing import Any, Optional -from . import datas +try: + from . import datas +except ImportError: + # for release CI action + import datas # type: ignore - -CLIENT_VERSION = "v1.7.0" +CLIENT_VERSION = "v1.8.3" CLIENT_ACCESSIBLE = False """Is Client accessible? Can add-on access it and call stuff which uses it?""" CLIENT_RUNNING = False @@ -48,6 +51,7 @@ TABS: dict[str, Any] = { "name": "Default", # Tab name "history": [], # List of history steps "history_index": -1, # Current position in history + "active_filters": [], # Per-tab active filter chips } ], } diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/icons.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/icons.py index 0532176..b9a7215 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/icons.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/icons.py @@ -58,6 +58,7 @@ icons_read = { "logo_x.png": "logo_twitter", "logo_youtube.png": "logo_youtube", "asset_type_printable.png": "asset_type_printable", + "asset_type_author.png": "asset_type_author", } # fill the icon_collections["previews"] with icons of numbers for complexity rating diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/image_utils.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/image_utils.py index f11c0b5..59d5497 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/image_utils.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/image_utils.py @@ -16,11 +16,11 @@ # # ##### END GPL LICENSE BLOCK ##### -import os -import time -from functools import lru_cache import logging from dataclasses import dataclass +from functools import lru_cache +import os +import time import bpy @@ -180,13 +180,97 @@ def analyze_image_is_true_hdr(image): imageHeight = size[1] tempBuffer = numpy.empty(imageWidth * imageHeight * 4, dtype=numpy.float32) image.pixels.foreach_get(tempBuffer) - image.blenderkit.true_hdr = numpy.amax(tempBuffer) > 1.05 + image.blenderkit.true_hdr = bool(numpy.amax(tempBuffer) > 1.05) + + +def _save_hdr_thumbnail_image( + hdr_image, + output_path: str, + max_thumbnail_size: int, + use_custom_tone: bool, + exposure: float, + gamma: float, +): + import numpy + + image_width, image_height = hdr_image.size + ratio = image_width / image_height + thumbnail_width = min(image_width, max_thumbnail_size) + thumbnail_height = min(image_height, int(max_thumbnail_size / ratio)) + + # Read once so we can both detect HDR and safely create a scaled temp image. + pixel_count = image_width * image_height + pixel_buffer = numpy.empty(pixel_count * 4, dtype=numpy.float32) + hdr_image.pixels.foreach_get(pixel_buffer) + hdr_image.blenderkit.true_hdr = bool(numpy.amax(pixel_buffer) > 1.05) + + source_image = hdr_image + temp_image = None + + if thumbnail_width < image_width: + temp_name = f"{hdr_image.name}_thumb_tmp" + temp_image = bpy.data.images.new( + temp_name, + width=image_width, + height=image_height, + alpha=False, + float_buffer=True, + ) + temp_image.pixels.foreach_set(pixel_buffer) + temp_image.scale(thumbnail_width, thumbnail_height) + source_image = temp_image + + try: + scene = bpy.context.scene + view_settings = scene.view_settings + orig_exposure = view_settings.exposure + orig_gamma = view_settings.gamma + + try: + if use_custom_tone: + view_settings.exposure = exposure + view_settings.gamma = gamma + + img_save_as( + source_image, + filepath=output_path, + view_transform="Standard", + ) + finally: + view_settings.exposure = orig_exposure + view_settings.gamma = orig_gamma + finally: + if temp_image is not None: + bpy.data.images.remove(temp_image) + + +def generate_hdr_thumbnail_preview( + hdr_image, + use_custom_tone: bool, + exposure: float, + gamma: float, + max_preview_size: int = 256, +) -> str: + from . import paths + + safe_name = "".join( + c if c.isalnum() or c in ("-", "_", ".") else "_" for c in hdr_image.name + ) + preview_dir = paths.get_temp_dir(subdir="hdr_thumbnail_preview") + preview_path = os.path.join(preview_dir, f"{safe_name}_preview.jpg") + + _save_hdr_thumbnail_image( + hdr_image=hdr_image, + output_path=preview_path, + max_thumbnail_size=max_preview_size, + use_custom_tone=use_custom_tone, + exposure=exposure, + gamma=gamma, + ) + return preview_path def generate_hdr_thumbnail(): - import numpy - - scene = bpy.context.scene ui_props = bpy.context.window_manager.blenderkitUI hdr_image = ( ui_props.hdr_upload_image @@ -194,36 +278,15 @@ def generate_hdr_thumbnail(): base, ext = os.path.splitext(hdr_image.filepath) thumb_path = base + ".jpg" - thumb_name = os.path.basename(thumb_path) - - max_thumbnail_size = 2048 - size = hdr_image.size - ratio = size[0] / size[1] - - imageWidth = size[0] - imageHeight = size[1] - thumbnailWidth = min(size[0], max_thumbnail_size) - thumbnailHeight = min(size[1], int(max_thumbnail_size / ratio)) - - tempBuffer = numpy.empty(imageWidth * imageHeight * 4, dtype=numpy.float32) - inew = bpy.data.images.new( - thumb_name, imageWidth, imageHeight, alpha=False, float_buffer=False + _save_hdr_thumbnail_image( + hdr_image=hdr_image, + output_path=thumb_path, + max_thumbnail_size=2048, + use_custom_tone=ui_props.hdr_use_custom_thumbnail_tone, + exposure=ui_props.hdr_thumbnail_exposure, + gamma=ui_props.hdr_thumbnail_gamma, ) - hdr_image.pixels.foreach_get(tempBuffer) - - hdr_image.blenderkit.true_hdr = numpy.amax(tempBuffer) > 1.05 - - inew.filepath = thumb_path - set_colorspace(inew, "Linear") - inew.pixels.foreach_set(tempBuffer) - - bpy.context.view_layer.update() - if thumbnailWidth < imageWidth: - inew.scale(thumbnailWidth, thumbnailHeight) - - img_save_as(inew, filepath=inew.filepath) - def find_color_mode(image): if not isinstance(image, bpy.types.Image): @@ -257,8 +320,7 @@ def can_erase_alpha(na): alpha = na[3::4] alpha_sum = alpha.sum() if alpha_sum == alpha.size: - print("image can have alpha erased") - # print(alpha_sum, alpha.size) + bk_logger.info("image can have alpha erased") return alpha_sum == alpha.size @@ -269,9 +331,8 @@ def is_image_black(na): rgbsum = r.sum() + g.sum() + b.sum() - # print('rgb sum', rgbsum, r.sum(), g.sum(), b.sum()) if rgbsum == 0: - print("image can have alpha channel dropped") + bk_logger.info("image can have alpha channel dropped") return rgbsum == 0 @@ -284,7 +345,7 @@ def is_image_bw(na): gb_equal = g == b rgbequal = rg_equal.all() and gb_equal.all() if rgbequal: - print("image is black and white, can have channels reduced") + bk_logger.info("image is black and white, can have channels reduced") return rgbequal @@ -326,7 +387,6 @@ def numpytoimage(a, iname, width=0, height=0, channels=3): i = None for image in bpy.data.images: - # print(image.name[:len(iname)],iname, image.size[0],a.shape[0],image.size[1],a.shape[1]) if ( image.name[: len(iname)] == iname and image.size[0] == width @@ -352,7 +412,7 @@ def numpytoimage(a, iname, width=0, height=0, channels=3): # a = a.repeat(channels) # a[3::4] = 1 i.pixels.foreach_set(a) # this gives big speedup! - print("\ntime " + str(time.time() - t)) + bk_logger.info("\ntime " + str(time.time() - t)) return i @@ -363,7 +423,6 @@ def imagetonumpy_flat(i): width = i.size[0] height = i.size[1] - # print(i.channels) size = width * height * i.channels na = numpy.empty(size, numpy.float32) @@ -374,7 +433,6 @@ def imagetonumpy_flat(i): # na = na.reshape(height, width, i.channels) # na = na.swapaxnes(0, 1) - # print('\ntime of image to numpy ' + str(time.time() - t)) return na @@ -385,7 +443,6 @@ def imagetonumpy(i): width = i.size[0] height = i.size[1] - # print(i.channels) size = width * height * i.channels na = np.empty(size, np.float32) @@ -396,7 +453,6 @@ def imagetonumpy(i): na = na.reshape(height, width, i.channels) na = na.swapaxes(0, 1) - # print('\ntime of image to numpy ' + str(time.time() - t)) return na @@ -424,9 +480,9 @@ def get_rgb_mean(i): gmean = g.mean() bmean = b.mean() - rmedian = numpy.median(r) - gmedian = numpy.median(g) - bmedian = numpy.median(b) + # rmedian = numpy.median(r) + # gmedian = numpy.median(g) + # bmedian = numpy.median(b) # return(rmedian,gmedian, bmedian) return (rmean, gmean, bmean) @@ -514,15 +570,13 @@ def check_nmap_ogl_vs_dx(i, mask=None, generated_test_images=False): ogl_std = ogl.std() dx_std = dx.std() - # print(mean_ogl, mean_dx) - # print(max_ogl, max_dx) - print(ogl_std, dx_std) - print(i.name) + bk_logger.info("OpenGL std: %s, DirectX std: %s", ogl_std, dx_std) + bk_logger.info("Image name: %s", i.name) # if abs(mean_ogl) > abs(mean_dx): if abs(ogl_std) > abs(dx_std): - print("this is probably a DirectX texture") + bk_logger.info("this is probably a DirectX texture") else: - print("this is probably an OpenGL texture") + bk_logger.info("this is probably an OpenGL texture") if generated_test_images: # red_x_comparison_img = red_x_comparison_img.swapaxes(0,1) @@ -584,9 +638,9 @@ def make_possible_reductions_on_image( # setup image depth, 8 or 16 bit. # this should normally divide depth with number of channels, but blender always states that number of channels is 4, even if there are only 3 - print(teximage.name) - print(teximage.depth) - print(teximage.channels) + bk_logger.info("Image name: %s", teximage.name) + bk_logger.info("Image depth: %s", teximage.depth) + bk_logger.info("Image channels: %s", teximage.channels) bpy.context.scene.display_settings.display_device = "None" @@ -594,16 +648,16 @@ def make_possible_reductions_on_image( ims.color_mode = find_color_mode(teximage) # image_depth = str(max(min(int(teximage.depth / 3), 16), 8)) - print("resulting depth set to:", image_depth) + bk_logger.info("resulting depth set to: %s", image_depth) fp = input_filepath if do_reductions: na = imagetonumpy_flat(teximage) if can_erase_alpha(na): - print(teximage.file_format) + bk_logger.info("Image file format: %s", teximage.file_format) if teximage.file_format == "PNG": - print("changing type of image to JPG") + bk_logger.info("Changing type of image to JPG") base, ext = os.path.splitext(fp) teximage["original_extension"] = ext diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/keymap_utils.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/keymap_utils.py new file mode 100644 index 0000000..03097d6 --- /dev/null +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/keymap_utils.py @@ -0,0 +1,265 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +from __future__ import annotations + +import logging +from dataclasses import dataclass, field + +import bpy +import rna_keymap_ui + + +bk_logger = logging.getLogger(__name__) + + +@dataclass +class KeyMapItemDef: + """Description of a keymap item we want to register.""" + + idname: str + type: str + value: str + shift: bool = False + ctrl: bool = False + alt: bool = False + oskey: bool = False + key_modifier: str = "NONE" + properties: dict[str, object] = field(default_factory=dict) + + +@dataclass +class KeyMapDef: + """Description of a keymap with its items.""" + + name: str + space_type: str + region_type: str = "WINDOW" + items: list[KeyMapItemDef] = field(default_factory=list) + + +# Default bindings we ship. Users can edit these in Preferences. +DEFAULT_KEYMAP_ITEMS: list[KeyMapItemDef] = [ + KeyMapItemDef( + idname="view3d.run_assetbar_fix_context", + type="SEMI_COLON", + value="PRESS", + properties={"keep_running": False, "do_search": False}, + ), + KeyMapItemDef( + idname="wm.blenderkit_menu_rating_upload", + type="R", + value="PRESS", + ), +] + +DEFAULT_KEYMAPS: list[KeyMapDef] = [ + # Register into the standard "Window" keymap so Blender shows it in the main tree. + KeyMapDef( + name="Window", # must be windows otherwise blender will not show it in the default keymap + space_type="EMPTY", + region_type="WINDOW", + items=DEFAULT_KEYMAP_ITEMS, + ), +] + +# Store only the keymap items we create so we can clean them up without touching user overrides. +_registered_keymaps: list[ + tuple[bpy.types.KeyConfig, bpy.types.KeyMap, bpy.types.KeyMapItem] +] = [] + + +def _keymap_has_item(km: bpy.types.KeyMap, idname: str) -> bpy.types.KeyMapItem | None: + for item in km.keymap_items: + if item.idname == idname: + return item + return None + + +def _find_in_keyconfig( + keyconfig: bpy.types.KeyConfig, idname: str +) -> bpy.types.KeyMapItem | None: + for km in keyconfig.keymaps: + kmi = _keymap_has_item(km, idname) + if kmi: + return kmi + return None + + +def register_keymaps(custom_keymaps: list[KeyMapDef] | None = None) -> None: + """Register keymaps for the add-on. + + Args: + custom_keymaps: Optional iterable of KeyMapDef if callers want to override defaults. + """ + + wm = bpy.context.window_manager + if not wm: + bk_logger.warning("Unable to register keymaps: no window manager available") + return + kc_addon = wm.keyconfigs.addon + kc_user = wm.keyconfigs.user + if not kc_addon: + bk_logger.warning("Unable to register keymaps: no add-on keyconfig available") + return + bk_logger.debug("Registering keymaps for BlenderKit add-on") + + keymaps = list(custom_keymaps) if custom_keymaps is not None else DEFAULT_KEYMAPS + + for km_def in keymaps: + # If the user already has a custom binding in their keyconfig, don't recreate it. + if kc_user and _find_in_keyconfig(kc_user, km_def.items[0].idname): + bk_logger.debug( + f"User keyconfig already has binding for {km_def.items[0].idname}; leaving user override intact" + ) + continue + + km = kc_addon.keymaps.find( + km_def.name, space_type=km_def.space_type, region_type=km_def.region_type + ) + if km is None: + bk_logger.debug( + f"Keymap {km_def.name} not found in {kc_addon.name}, creating new one" + ) + km = kc_addon.keymaps.new( + name=km_def.name, + space_type=km_def.space_type, + region_type=km_def.region_type, + ) + + for item_def in km_def.items: + if _keymap_has_item(km, item_def.idname): + bk_logger.debug( + f"Keymap {km_def.name} in {kc_addon.name} already has item {item_def.idname}, skipping" + ) + continue + bk_logger.debug( + f"Adding keymap item {item_def.idname} to keymap {km_def.name} in {kc_addon.name}" + ) + kmi = km.keymap_items.new( + idname=item_def.idname, + type=item_def.type, + value=item_def.value, + shift=item_def.shift, + ctrl=item_def.ctrl, + alt=item_def.alt, + oskey=item_def.oskey, + key_modifier=item_def.key_modifier, + ) + for prop_name, prop_value in item_def.properties.items(): + bk_logger.debug( + f"Setting property {prop_name}={prop_value} on keymap item {item_def.idname} in {kc_addon.name}" + ) + setattr(kmi.properties, prop_name, prop_value) + _registered_keymaps.append((kc_addon, km, kmi)) + + +def unregister_keymaps() -> None: + if not _registered_keymaps: + return + + for kc, km, kmi in _registered_keymaps: + try: + km.keymap_items.remove(kmi) + except RuntimeError: + # Already removed by user; ignore. + pass + _registered_keymaps.clear() + + +def get_keymap_item(idname: str) -> bpy.types.KeyMapItem | None: + """Return the current keymap item for the given operator. + + Prefers the user's key configuration (where edits are stored) and falls back to the + add-on keyconfig defaults. + """ + + wm = bpy.context.window_manager + if not wm: + return None + + for cfg in (wm.keyconfigs.user, wm.keyconfigs.addon): + if cfg: + kmi = _find_in_keyconfig(cfg, idname) + if kmi: + return kmi + return None + + +def format_keymap_item(kmi: bpy.types.KeyMapItem) -> str: + """Return a human readable shortcut label for a KeyMapItem.""" + + parts = [] + if kmi.ctrl: + parts.append("Ctrl") + if kmi.alt: + parts.append("Alt") + if kmi.shift: + parts.append("Shift") + if kmi.oskey: + parts.append("Cmd") + if kmi.key_modifier and kmi.key_modifier != "NONE": + parts.append(kmi.key_modifier.replace("_", " ").title()) + parts.append(kmi.type.replace("_", " ").title()) + return "+".join(parts) + + +def get_shortcut_label(idname: str, fallback: str = "") -> str: + """Return a formatted shortcut string for the operator if available.""" + + kmi = get_keymap_item(idname) + if not kmi: + return fallback + return format_keymap_item(kmi) + + +def _find_km_and_kmi( + keyconfig: bpy.types.KeyConfig, idname: str +) -> tuple[bpy.types.KeyMap, bpy.types.KeyMapItem] | None: + if not keyconfig: + return None + for km in keyconfig.keymaps: + kmi = _keymap_has_item(km, idname) + if kmi: + return km, kmi + return None + + +def draw_keymap(self, context): + layout = self.layout + wm = context.window_manager + kc_addon = wm.keyconfigs.addon + kc_user = wm.keyconfigs.user + if not kc_addon: + return + + box = layout.box() + box.label(text="BlenderKit Keymaps") + + for item_def in DEFAULT_KEYMAP_ITEMS: + # Prefer user override if available, otherwise show addon default. + entry = _find_km_and_kmi(kc_user, item_def.idname) if kc_user else None + source_kc = kc_user if entry else kc_addon + km, kmi = ( + entry + if entry + else _find_km_and_kmi(kc_addon, item_def.idname) or (None, None) + ) + if not km or not kmi: + continue + rna_keymap_ui.draw_kmi([], source_kc, km, kmi, box, 0) diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/log.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/log.py index 9d71a0c..68276dd 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/log.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/log.py @@ -32,11 +32,11 @@ class BlenderKitFormatter(logging.Formatter): """ EMOJIS = { - logging.DEBUG: "🐞", + logging.DEBUG: "🐞 ", logging.INFO: "ℹ️ ", logging.WARNING: "⚠️ ", - logging.ERROR: "❌", - logging.CRITICAL: "🔥", + logging.ERROR: "❌ ", + logging.CRITICAL: "🔥 ", } def format(self, record): diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/override_extension_draw.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/override_extension_draw.py index 16dad9f..aecd406 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/override_extension_draw.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/override_extension_draw.py @@ -9,10 +9,12 @@ The original method is then called from the new method, with the same arguments, import json import os import time +import re import logging -from . import icons +from . import icons, version_compare +import blf import bpy import bl_pkg.bl_extension_ui as exui from bpy.props import IntProperty, StringProperty @@ -23,6 +25,57 @@ EXTENSIONS_API_URL = "https://www.blenderkit.com/api/v1/extensions/" bk_logger = logging.getLogger(__name__) +# Per-draw-cycle caching for ensure_repo_cache() to avoid repeated +# filesystem stat calls when drawing hundreds of extension items. +_repo_cache_last_check: float = 0.0 +_repo_cache_last_result: bool = False +_REPO_CACHE_CHECK_INTERVAL: float = 3.0 # seconds between filesystem checks + +# Cached repository reference to avoid iterating repos per item. +_cached_repository = None +_cached_repository_time: float = 0.0 +_REPO_LOOKUP_INTERVAL: float = 5.0 # seconds between repo lookups + +# Cache for price padding strings to avoid repeated blf.dimensions() calls. +_price_padding_cache: dict = {} + + +def get_perfect_price_padding(price_str: str, target_length: int = 70) -> str: + """Generate a padding string to align price text nicely in the UI.""" + cache_key = (price_str, target_length) + cached = _price_padding_cache.get(cache_key) + if cached is not None: + return cached + + spaces = [ + (19, "\u2003"), # em space = U+2003 > 19 units + (2, "\u200a"), # hair space = U+200A > 2 units + (3, "\u2009"), # 6 em space = U+2009 > 3 units + (5, "\u2005"), # 4 em space = U+2005 > 5 units + (6, "\u2004"), # 3 em space = U+2004 > 6 units + ] + out = "" + size = blf.dimensions(0, price_str) + w_size = size[0] + final_size = target_length - w_size + if final_size <= 0: + _price_padding_cache[cache_key] = out + return out + while w_size < target_length: + for spc_len, spc_char in spaces: + if w_size + spc_len <= target_length: + out += spc_char + w_size += spc_len + break + else: + break # No suitable space found, exit loop + # double check if we are exporting only white spaces to prevent issues + if re.fullmatch(r"\s*", out) is None: + _price_padding_cache[cache_key] = "" + return "" + _price_padding_cache[cache_key] = out + return out + # --- New Modal Operator --- class BK_OT_buy_extension_and_watch(Operator): @@ -278,23 +331,47 @@ def extension_draw_item_blenderkit( if pkg_block is not None: row_right.label(text="Blocked ") elif is_installed: - if is_outdated: + # double check if we are truly outdated + # local repo can have a newer version than remote if user installed a dev version + # so we compare versions here again + local_older = version_compare.compare_versions( + item_local.version, item_remote.version + ) + if local_older < 0: props = row_right.operator("extensions.package_install", text="Update") props.repo_index = repo_index props.pkg_id = pkg_id props.enable_on_install = is_enabled + elif local_older == 0: + row_right.label(text="Up to date ") + else: + props = row_right.operator( + "extensions.package_install", + text=f"Downgrade {item_remote.version}", + ) + props.repo_index = repo_index + props.pkg_id = pkg_id + props.enable_on_install = is_enabled else: ### BlenderKit specific code # blenderkit logo icon pcoll = icons.icon_collections["main"] icon_value = pcoll["logo"].icon_id - # row.label(text="", icon_value=icon_value) + # only enable install for those for whom it's available if bk_cache_pkg is not None: + can_download_value = bk_cache_pkg.get("can_download") + is_for_sale_flag = bk_cache_pkg.get("is_for_sale") is True + is_free_flag = bk_cache_pkg.get("is_free") is True + + # special case for blenderkit addon itself + if pkg_id == "blenderkit": + can_download_value = True + # Free , purchased and subscribed add-ons, probably also private add-ons - if bk_cache_pkg.get("can_download") is True: + if can_download_value is True: # if the addon is also for sale, it means the user purchased it and we write "install purchased" - if bk_cache_pkg.get("is_for_sale") is True: + if is_for_sale_flag: props = row_right.operator( "extensions.package_install", text="Install purchased", @@ -309,14 +386,13 @@ def extension_draw_item_blenderkit( props.repo_index = repo_index props.pkg_id = pkg_id - # Full plan addons - elif not bk_cache_pkg.get("is_free") and not bk_cache_pkg.get( - "is_for_sale" + # Free addon but limited to full plan + elif (can_download_value == "Rejected in this plan") or ( + not is_free_flag and not is_for_sale_flag ): - # open website to subscribe props = row_right.operator( "wm.url_open", - text="Subscribe to Full Plan", + text="Requires Full Plan", icon_value=icon_value, ) props.url = "https://www.blenderkit.com/plans/pricing/" @@ -324,9 +400,17 @@ def extension_draw_item_blenderkit( # Paid addons get a buy button and lead to their website link else: # Use the new modal operator + base_price_value = bk_cache_pkg.get("user_price") + if base_price_value in {None, "", "None"}: + base_price_value = bk_cache_pkg.get("base_price") + if base_price_value in {None, "", "None"}: + buy_label = "Buy online" + else: + pad_str = get_perfect_price_padding(base_price_value) + buy_label = f"Buy online {pad_str}${base_price_value}" props = row_right.operator( BK_OT_buy_extension_and_watch.bl_idname, # Use bl_idname - text=f"Buy online ${bk_cache_pkg.get('base_price')}", + text=buy_label, icon_value=icon_value, ) props.url = bk_cache_pkg.get("website", "") # Pass URL @@ -528,12 +612,46 @@ def get_repository_by_url(url: str): return None +def get_blenderkit_repository_cached(): + """Get BlenderKit repository with time-based caching to avoid iterating repos per item.""" + global _cached_repository, _cached_repository_time + now = time.time() + if ( + now - _cached_repository_time < _REPO_LOOKUP_INTERVAL + and _cached_repository is not None + ): + # Verify the cached reference is still valid + try: + _ = _cached_repository.remote_url + return _cached_repository + except ReferenceError: + pass + _cached_repository = get_repository_by_url(EXTENSIONS_API_URL) + _cached_repository_time = now + return _cached_repository + + def clear_repo_cache(): """Clear the repository cache.""" + global _repo_cache_last_check, _repo_cache_last_result wm = bpy.context.window_manager cache_key = "blenderkit_extensions_repo_cache" if cache_key in wm: del wm[cache_key] + # Reset throttle so next ensure_repo_cache() does a fresh check + _repo_cache_last_check = 0.0 + _repo_cache_last_result = False + + +def _sanitize_pkg_for_cache(pkg): + """Keep values stored as string to prevent C overflow.""" + sanitized = {} + for k, v in pkg.items(): + if isinstance(v, bool): + sanitized[k] = v + else: + sanitized[k] = str(v) + return sanitized def ensure_repo_cache(): @@ -541,13 +659,28 @@ def ensure_repo_cache(): Reads the .json file blender stores in \extensions\www_blenderkit_com\.blender_ext and parses it to a dict from json, we can use it then for drawing purposes and have the extra data BlenderKit api provides. Checks the modification time of the cache file and reloads it if necessary. + + Uses a time-based throttle so filesystem checks happen at most once per + _REPO_CACHE_CHECK_INTERVAL seconds, avoiding repeated stat calls when this + function is called per-item during extension list drawing. """ + global _repo_cache_last_check, _repo_cache_last_result + + now = time.time() + if now - _repo_cache_last_check < _REPO_CACHE_CHECK_INTERVAL: + # Consume the reload signal so only the first caller in the throttle window + # sees True — prevents the redraw timer from being registered on every draw tick. + result = _repo_cache_last_result + _repo_cache_last_result = False + return result + _repo_cache_last_check = now + reloaded_flag = False # Track if we actually reloaded wm = bpy.context.window_manager cache_key = "blenderkit_extensions_repo_cache" mtime_key = "blenderkit_extensions_repo_cache_mtime" - blenderkit_repository = get_repository_by_url(EXTENSIONS_API_URL) + blenderkit_repository = get_blenderkit_repository_cached() if blenderkit_repository is None: # If repo doesn't exist, clear cache if it exists in window manager if cache_key in wm: @@ -566,7 +699,9 @@ def ensure_repo_cache(): current_mtime = None try: if os.path.exists(cache_file): - current_mtime = os.path.getmtime(cache_file) + # Use int to avoid float precision loss when stored in Blender IDProperty + # (IDProperties use single-precision floats, os.path.getmtime() returns double) + current_mtime = int(os.path.getmtime(cache_file)) except OSError as e: # Handle potential race condition or permission issue bk_logger.exception("Could not get modification time for %s.", cache_file) # Clear cache if we can't verify its freshness? Safer approach. @@ -621,15 +756,13 @@ def ensure_repo_cache(): for pkg in data.get( "data", [] ): # Handle case where 'data' key might be missing - if ( - isinstance(pkg, dict) and "id" in pkg - ): # Ensure pkg is a dict and 'id' key exists - new_cache[pkg["id"][:32]] = pkg - else: + if not (isinstance(pkg, dict) and "id" in pkg): bk_logger.info("Skipping invalid package entry in cache: %s.", pkg) + continue + new_cache[pkg["id"][:32]] = _sanitize_pkg_for_cache(pkg) wm[cache_key] = new_cache - wm[mtime_key] = current_mtime # Update mtime only on successful load + wm[mtime_key] = current_mtime # Stored as int to survive IDProperty round-trip reloaded_flag = True # Mark that we reloaded successfully @@ -652,9 +785,46 @@ def ensure_repo_cache(): if mtime_key in wm: del wm[mtime_key] + _repo_cache_last_result = reloaded_flag return reloaded_flag # Return whether cache was actually reloaded +def update_cache_with_asset_prices(assets): + """Copy addon pricing info from search assets into the extensions cache.""" + if not assets: + return + + wm = bpy.context.window_manager + cache_key = "blenderkit_extensions_repo_cache" + if cache_key not in wm: + wm[cache_key] = {} + + cache = wm[cache_key] + for asset in assets: + if not isinstance(asset, dict): + continue + if asset.get("assetType") != "addon": + continue + dict_params = asset.get("dictParameters") or {} + extension_id = dict_params.get("extensionId") or asset.get("extensionId") + if not extension_id: + continue + + cache_key_entry = extension_id[:32] + cache_entry = cache.get(cache_key_entry) + if cache_entry is None: + cache_entry = {} + cache[cache_key_entry] = cache_entry + + base_price = asset.get("basePrice") + if base_price not in {None, "", "None"}: + cache_entry["base_price"] = str(base_price) + + user_price = asset.get("userPrice") + if user_price not in {None, "", "None"}: + cache_entry["user_price"] = str(user_price) + + def ensure_repo_order(): """Ensure order of repositories in Blender's preferences.""" # get the blenderkit repository diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/paths.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/paths.py index 85f6382..9f59904 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/paths.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/paths.py @@ -16,6 +16,8 @@ # # ##### END GPL LICENSE BLOCK ##### +from __future__ import annotations + import getpass import logging import os @@ -38,6 +40,7 @@ BLENDERKIT_OAUTH_LANDING_URL = f"{global_vars.SERVER}/oauth-landing" BLENDERKIT_PLANS_URL = f"{global_vars.SERVER}/plans/pricing" BLENDERKIT_REPORT_URL = f"{global_vars.SERVER}/usage_report" BLENDERKIT_USER_ASSETS_URL = f"{global_vars.SERVER}/my-assets" +BLENDERKIT_ASSETS_EDIT_URL = f"{global_vars.SERVER}/asset-edit" BLENDERKIT_MANUAL_URL = "https://youtu.be/0P8ZjfbUjeA" BLENDERKIT_MODEL_UPLOAD_INSTRUCTIONS_URL = f"{global_vars.SERVER}/docs/upload/" BLENDERKIT_PRINTABLE_UPLOAD_INSTRUCTIONS_URL = ( @@ -54,6 +57,18 @@ BLENDERKIT_LOGIN_URL = f"{global_vars.SERVER}/accounts/login" BLENDERKIT_SIGNUP_URL = f"{global_vars.SERVER}/accounts/register" WINDOWS_PATH_LIMIT = 250 +ASSET_LIBRARY_NAME = "BlenderKit" + + +def _normalize_path(path_value: str | None) -> str: + """Return an absolute, normalized path for comparisons; blank string if invalid.""" + if not path_value: + return "" + try: + resolved = bpy.path.abspath(path_value) + except Exception: + resolved = path_value + return os.path.normpath(os.path.abspath(resolved)) def cleanup_old_directories(): @@ -63,7 +78,7 @@ def cleanup_old_directories(): try: shutil.rmtree(orig_temp) except Exception as e: - bk_logger.error(f"could not delete old temp directory: {e}") + bk_logger.error("could not delete old temp directory: %s", e) def find_in_local(text=""): @@ -134,11 +149,11 @@ def get_temp_dir(subdir=None): cleanup_old_directories() except Exception as e: reports.add_report("Cache directory not found. Resetting Cache directory path.") - bk_logger.warning(f"due to exception: {e}") + bk_logger.warning("due to exception: %s", e) p = default_global_dict() if p == user_preferences.global_dir: - message = "Global dir was already default, plese set a global directory in addon preferences to a dir where you have write permissions." + message = "Global dir was already default, please set a global directory in addon preferences to a dir where you have write permissions." reports.add_report(message) return None user_preferences.global_dir = p @@ -158,6 +173,7 @@ def get_download_dirs(asset_type): "nodegroup": "nodegroups", "printable": "printables", "addon": "addons", + "author": "authors", } dirs = [] @@ -196,6 +212,84 @@ def get_download_dirs(asset_type): return dirs +def ensure_asset_library_path( + global_dir: str | None = None, previous_global_dir: str | None = None +): + """Ensure Blender's asset library list contains the BlenderKit library path. + + - Creates the library entry when missing. + - Updates an existing entry if the global directory changes. + - Reuses a library that already points to the target path even if the name differs. + """ + if bpy.app.background: + return + + filepaths = getattr(bpy.context.preferences, "filepaths", None) + asset_libraries = getattr(filepaths, "asset_libraries", None) if filepaths else None + if asset_libraries is None: + return + + target_path = _normalize_path( + global_dir + or bpy.context.preferences.addons[__package__].preferences.global_dir # type: ignore + ) + if not target_path: + return + + os.makedirs(target_path, exist_ok=True) + + previous_path = _normalize_path(previous_global_dir) if previous_global_dir else "" + if previous_path: + for lib in asset_libraries: + if _normalize_path(lib.path) == previous_path: + lib.path = target_path + + existing = ( + asset_libraries.get(ASSET_LIBRARY_NAME) + if hasattr(asset_libraries, "get") + else None + ) + if existing is not None: + if _normalize_path(existing.path) != target_path: + existing.path = target_path + return existing + + for lib in asset_libraries: + if _normalize_path(lib.path) == target_path: + try: + lib.name = ASSET_LIBRARY_NAME + except Exception: + pass + return lib + + if hasattr(asset_libraries, "new"): + asset_libraries.new(name=ASSET_LIBRARY_NAME, directory=target_path) + else: + try: + bpy.ops.preferences.asset_library_add(directory=target_path) + # Operator names the library after the directory basename, rename it. + for lib in asset_libraries: + if ( + _normalize_path(lib.path) == target_path + and lib.name != ASSET_LIBRARY_NAME + ): + lib.name = ASSET_LIBRARY_NAME + break + except Exception as e: + logging.getLogger(__name__).warning( + "Failed to add asset library: %s. " + "Please add it manually in Preferences > File Paths", + e, + ) + return None + + return ( + asset_libraries.get(ASSET_LIBRARY_NAME) + if hasattr(asset_libraries, "get") + else None + ) + + def slugify(input: str) -> str: """ Slugify converts a string to a URL-friendly slug. @@ -423,10 +517,10 @@ def delete_asset_debug(asset_data): continue try: shutil.rmtree(asset_dir) - bk_logger.info(f"deleted {asset_dir}") + bk_logger.info("deleted asset dir: %s", asset_dir) except Exception as err: e = sys.exc_info()[0] - bk_logger.error(f"{e} - {err}") + bk_logger.error("%s - %s", e, err) def get_clean_filepath(): diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/pdm.lock b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/pdm.lock deleted file mode 100644 index c45e4d8..0000000 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/pdm.lock +++ /dev/null @@ -1,576 +0,0 @@ -# This file is @generated by PDM. -# It is not intended for manual editing. - -[metadata] -groups = ["default", "dev"] -strategy = ["inherit_metadata"] -lock_version = "4.5.0" -content_hash = "sha256:e66407ebe96aea59816d07e7d141f2564da883f1073e87bb85c544e60644b85a" - -[[metadata.targets]] -requires_python = ">=3.10,<3.13" - -[[package]] -name = "bandit" -version = "1.8.6" -requires_python = ">=3.9" -summary = "Security oriented static analyser for python code." -groups = ["dev"] -dependencies = [ - "PyYAML>=5.3.1", - "colorama>=0.3.9; platform_system == \"Windows\"", - "rich", - "stevedore>=1.20.0", -] -files = [ - {file = "bandit-1.8.6-py3-none-any.whl", hash = "sha256:3348e934d736fcdb68b6aa4030487097e23a501adf3e7827b63658df464dddd0"}, - {file = "bandit-1.8.6.tar.gz", hash = "sha256:dbfe9c25fc6961c2078593de55fd19f2559f9e45b99f1272341f5b95dea4e56b"}, -] - -[[package]] -name = "black" -version = "25.9.0" -requires_python = ">=3.9" -summary = "The uncompromising code formatter." -groups = ["dev"] -dependencies = [ - "click>=8.0.0", - "mypy-extensions>=0.4.3", - "packaging>=22.0", - "pathspec>=0.9.0", - "platformdirs>=2", - "pytokens>=0.1.10", - "tomli>=1.1.0; python_version < \"3.11\"", - "typing-extensions>=4.0.1; python_version < \"3.11\"", -] -files = [ - {file = "black-25.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ce41ed2614b706fd55fd0b4a6909d06b5bab344ffbfadc6ef34ae50adba3d4f7"}, - {file = "black-25.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ab0ce111ef026790e9b13bd216fa7bc48edd934ffc4cbf78808b235793cbc92"}, - {file = "black-25.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f96b6726d690c96c60ba682955199f8c39abc1ae0c3a494a9c62c0184049a713"}, - {file = "black-25.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:d119957b37cc641596063cd7db2656c5be3752ac17877017b2ffcdb9dfc4d2b1"}, - {file = "black-25.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:456386fe87bad41b806d53c062e2974615825c7a52159cde7ccaeb0695fa28fa"}, - {file = "black-25.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a16b14a44c1af60a210d8da28e108e13e75a284bf21a9afa6b4571f96ab8bb9d"}, - {file = "black-25.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aaf319612536d502fdd0e88ce52d8f1352b2c0a955cc2798f79eeca9d3af0608"}, - {file = "black-25.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:c0372a93e16b3954208417bfe448e09b0de5cc721d521866cd9e0acac3c04a1f"}, - {file = "black-25.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1b9dc70c21ef8b43248f1d86aedd2aaf75ae110b958a7909ad8463c4aa0880b0"}, - {file = "black-25.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8e46eecf65a095fa62e53245ae2795c90bdecabd53b50c448d0a8bcd0d2e74c4"}, - {file = "black-25.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9101ee58ddc2442199a25cb648d46ba22cd580b00ca4b44234a324e3ec7a0f7e"}, - {file = "black-25.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:77e7060a00c5ec4b3367c55f39cf9b06e68965a4f2e61cecacd6d0d9b7ec945a"}, - {file = "black-25.9.0-py3-none-any.whl", hash = "sha256:474b34c1342cdc157d307b56c4c65bce916480c4a8f6551fdc6bf9b486a7c4ae"}, - {file = "black-25.9.0.tar.gz", hash = "sha256:0474bca9a0dd1b51791fcc507a4e02078a1c63f6d4e4ae5544b9848c7adfb619"}, -] - -[[package]] -name = "certifi" -version = "2024.8.30" -requires_python = ">=3.6" -summary = "Python package for providing Mozilla's CA Bundle." -groups = ["default"] -files = [ - {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, - {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.4.0" -requires_python = ">=3.7.0" -summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -groups = ["default"] -files = [ - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, - {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, - {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, -] - -[[package]] -name = "click" -version = "8.3.0" -requires_python = ">=3.10" -summary = "Composable command line interface toolkit" -groups = ["dev"] -dependencies = [ - "colorama; platform_system == \"Windows\"", -] -files = [ - {file = "click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc"}, - {file = "click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4"}, -] - -[[package]] -name = "colorama" -version = "0.4.6" -requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -summary = "Cross-platform colored terminal text." -groups = ["dev"] -marker = "platform_system == \"Windows\"" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "docstring-parser-fork" -version = "0.0.14" -requires_python = ">=3.8" -summary = "Parse Python docstrings in reST, Google and Numpydoc format" -groups = ["dev"] -files = [ - {file = "docstring_parser_fork-0.0.14-py3-none-any.whl", hash = "sha256:4c544f234ef2cc2749a3df32b70c437d77888b1099143a1ad5454452c574b9af"}, - {file = "docstring_parser_fork-0.0.14.tar.gz", hash = "sha256:a2743a63d8d36c09650594f7b4ab5b2758fee8629dcf794d1b221b23179baa5c"}, -] - -[[package]] -name = "idna" -version = "3.10" -requires_python = ">=3.6" -summary = "Internationalized Domain Names in Applications (IDNA)" -groups = ["default"] -files = [ - {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, - {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, -] - -[[package]] -name = "isort" -version = "7.0.0" -requires_python = ">=3.10.0" -summary = "A Python utility / library to sort Python imports." -groups = ["dev"] -files = [ - {file = "isort-7.0.0-py3-none-any.whl", hash = "sha256:1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1"}, - {file = "isort-7.0.0.tar.gz", hash = "sha256:5513527951aadb3ac4292a41a16cbc50dd1642432f5e8c20057d414bdafb4187"}, -] - -[[package]] -name = "markdown-it-py" -version = "4.0.0" -requires_python = ">=3.10" -summary = "Python port of markdown-it. Markdown parsing, done right!" -groups = ["dev"] -dependencies = [ - "mdurl~=0.1", -] -files = [ - {file = "markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147"}, - {file = "markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3"}, -] - -[[package]] -name = "mdurl" -version = "0.1.2" -requires_python = ">=3.7" -summary = "Markdown URL utilities" -groups = ["dev"] -files = [ - {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, - {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, -] - -[[package]] -name = "mypy" -version = "1.13.0" -requires_python = ">=3.8" -summary = "Optional static typing for Python" -groups = ["dev"] -dependencies = [ - "mypy-extensions>=1.0.0", - "tomli>=1.1.0; python_version < \"3.11\"", - "typing-extensions>=4.6.0", -] -files = [ - {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, - {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, - {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, - {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, - {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, - {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, - {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, - {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, - {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, - {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, - {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, - {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, - {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, - {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, - {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, - {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, -] - -[[package]] -name = "mypy-extensions" -version = "1.1.0" -requires_python = ">=3.8" -summary = "Type system extensions for programs checked with the mypy type checker." -groups = ["dev"] -files = [ - {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, - {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, -] - -[[package]] -name = "numpy" -version = "1.26.4" -requires_python = ">=3.9" -summary = "Fundamental package for array computing in Python" -groups = ["default"] -files = [ - {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, - {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, - {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, - {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, - {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, - {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, -] - -[[package]] -name = "packaging" -version = "25.0" -requires_python = ">=3.8" -summary = "Core utilities for Python packages" -groups = ["dev"] -files = [ - {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, - {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, -] - -[[package]] -name = "pathspec" -version = "0.12.1" -requires_python = ">=3.8" -summary = "Utility library for gitignore style pattern matching of file paths." -groups = ["dev"] -files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, -] - -[[package]] -name = "platformdirs" -version = "4.5.0" -requires_python = ">=3.10" -summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -groups = ["dev"] -files = [ - {file = "platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3"}, - {file = "platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312"}, -] - -[[package]] -name = "pydoclint" -version = "0.7.3" -requires_python = ">=3.9" -summary = "A Python docstring linter that checks arguments, returns, yields, and raises sections" -groups = ["dev"] -dependencies = [ - "click>=8.1.0", - "docstring-parser-fork>=0.0.12", - "tomli>=2.0.1; python_version < \"3.11\"", -] -files = [ - {file = "pydoclint-0.7.3-py3-none-any.whl", hash = "sha256:a656b0e863565644670ded19a4b506450364e4f1f5e8ff7705d6ba8bb5a82982"}, - {file = "pydoclint-0.7.3.tar.gz", hash = "sha256:3351d5eeb19f8831d992714f71f5ea1175af649503d39b9da0071445a4002138"}, -] - -[[package]] -name = "pygments" -version = "2.19.2" -requires_python = ">=3.8" -summary = "Pygments is a syntax highlighting package written in Python." -groups = ["dev"] -files = [ - {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, - {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, -] - -[[package]] -name = "pytokens" -version = "0.2.0" -requires_python = ">=3.8" -summary = "A Fast, spec compliant Python 3.13+ tokenizer that runs on older Pythons." -groups = ["dev"] -files = [ - {file = "pytokens-0.2.0-py3-none-any.whl", hash = "sha256:74d4b318c67f4295c13782ddd9abcb7e297ec5630ad060eb90abf7ebbefe59f8"}, - {file = "pytokens-0.2.0.tar.gz", hash = "sha256:532d6421364e5869ea57a9523bf385f02586d4662acbcc0342afd69511b4dd43"}, -] - -[[package]] -name = "pyyaml" -version = "6.0.3" -requires_python = ">=3.8" -summary = "YAML parser and emitter for Python" -groups = ["dev"] -files = [ - {file = "pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b"}, - {file = "pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956"}, - {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8"}, - {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198"}, - {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b"}, - {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0"}, - {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69"}, - {file = "pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e"}, - {file = "pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c"}, - {file = "pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e"}, - {file = "pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824"}, - {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c"}, - {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00"}, - {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d"}, - {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a"}, - {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4"}, - {file = "pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b"}, - {file = "pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf"}, - {file = "pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196"}, - {file = "pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"}, - {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28"}, - {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c"}, - {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc"}, - {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e"}, - {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea"}, - {file = "pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5"}, - {file = "pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b"}, - {file = "pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd"}, - {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, -] - -[[package]] -name = "requests" -version = "2.32.3" -requires_python = ">=3.8" -summary = "Python HTTP for Humans." -groups = ["default"] -dependencies = [ - "certifi>=2017.4.17", - "charset-normalizer<4,>=2", - "idna<4,>=2.5", - "urllib3<3,>=1.21.1", -] -files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, -] - -[[package]] -name = "rich" -version = "14.2.0" -requires_python = ">=3.8.0" -summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -groups = ["dev"] -dependencies = [ - "markdown-it-py>=2.2.0", - "pygments<3.0.0,>=2.13.0", -] -files = [ - {file = "rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd"}, - {file = "rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4"}, -] - -[[package]] -name = "ruff" -version = "0.14.1" -requires_python = ">=3.7" -summary = "An extremely fast Python linter and code formatter, written in Rust." -groups = ["dev"] -files = [ - {file = "ruff-0.14.1-py3-none-linux_armv6l.whl", hash = "sha256:083bfc1f30f4a391ae09c6f4f99d83074416b471775b59288956f5bc18e82f8b"}, - {file = "ruff-0.14.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f6fa757cd717f791009f7669fefb09121cc5f7d9bd0ef211371fad68c2b8b224"}, - {file = "ruff-0.14.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d6191903d39ac156921398e9c86b7354d15e3c93772e7dbf26c9fcae59ceccd5"}, - {file = "ruff-0.14.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed04f0e04f7a4587244e5c9d7df50e6b5bf2705d75059f409a6421c593a35896"}, - {file = "ruff-0.14.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5c9e6cf6cd4acae0febbce29497accd3632fe2025c0c583c8b87e8dbdeae5f61"}, - {file = "ruff-0.14.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6fa2458527794ecdfbe45f654e42c61f2503a230545a91af839653a0a93dbc6"}, - {file = "ruff-0.14.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:39f1c392244e338b21d42ab29b8a6392a722c5090032eb49bb4d6defcdb34345"}, - {file = "ruff-0.14.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7382fa12a26cce1f95070ce450946bec357727aaa428983036362579eadcc5cf"}, - {file = "ruff-0.14.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd0bf2be3ae8521e1093a487c4aa3b455882f139787770698530d28ed3fbb37c"}, - {file = "ruff-0.14.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cabcaa9ccf8089fb4fdb78d17cc0e28241520f50f4c2e88cb6261ed083d85151"}, - {file = "ruff-0.14.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:747d583400f6125ec11a4c14d1c8474bf75d8b419ad22a111a537ec1a952d192"}, - {file = "ruff-0.14.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5a6e74c0efd78515a1d13acbfe6c90f0f5bd822aa56b4a6d43a9ffb2ae6e56cd"}, - {file = "ruff-0.14.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0ea6a864d2fb41a4b6d5b456ed164302a0d96f4daac630aeba829abfb059d020"}, - {file = "ruff-0.14.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0826b8764f94229604fa255918d1cc45e583e38c21c203248b0bfc9a0e930be5"}, - {file = "ruff-0.14.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cbc52160465913a1a3f424c81c62ac8096b6a491468e7d872cb9444a860bc33d"}, - {file = "ruff-0.14.1-py3-none-win32.whl", hash = "sha256:e037ea374aaaff4103240ae79168c0945ae3d5ae8db190603de3b4012bd1def6"}, - {file = "ruff-0.14.1-py3-none-win_amd64.whl", hash = "sha256:59d599cdff9c7f925a017f6f2c256c908b094e55967f93f2821b1439928746a1"}, - {file = "ruff-0.14.1-py3-none-win_arm64.whl", hash = "sha256:e3b443c4c9f16ae850906b8d0a707b2a4c16f8d2f0a7fe65c475c5886665ce44"}, - {file = "ruff-0.14.1.tar.gz", hash = "sha256:1dd86253060c4772867c61791588627320abcb6ed1577a90ef432ee319729b69"}, -] - -[[package]] -name = "stevedore" -version = "5.5.0" -requires_python = ">=3.9" -summary = "Manage dynamic plugins for Python applications" -groups = ["dev"] -files = [ - {file = "stevedore-5.5.0-py3-none-any.whl", hash = "sha256:18363d4d268181e8e8452e71a38cd77630f345b2ef6b4a8d5614dac5ee0d18cf"}, - {file = "stevedore-5.5.0.tar.gz", hash = "sha256:d31496a4f4df9825e1a1e4f1f74d19abb0154aff311c3b376fcc89dae8fccd73"}, -] - -[[package]] -name = "tomli" -version = "2.3.0" -requires_python = ">=3.8" -summary = "A lil' TOML parser" -groups = ["dev"] -marker = "python_version < \"3.11\"" -files = [ - {file = "tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45"}, - {file = "tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba"}, - {file = "tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf"}, - {file = "tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441"}, - {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845"}, - {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c"}, - {file = "tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456"}, - {file = "tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be"}, - {file = "tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac"}, - {file = "tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22"}, - {file = "tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f"}, - {file = "tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52"}, - {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8"}, - {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6"}, - {file = "tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876"}, - {file = "tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878"}, - {file = "tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b"}, - {file = "tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae"}, - {file = "tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b"}, - {file = "tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf"}, - {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f"}, - {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05"}, - {file = "tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606"}, - {file = "tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999"}, - {file = "tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e"}, - {file = "tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3"}, - {file = "tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc"}, - {file = "tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0"}, - {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879"}, - {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005"}, - {file = "tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463"}, - {file = "tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8"}, - {file = "tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77"}, - {file = "tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf"}, - {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530"}, - {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b"}, - {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67"}, - {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f"}, - {file = "tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0"}, - {file = "tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba"}, - {file = "tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b"}, - {file = "tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549"}, -] - -[[package]] -name = "types-requests" -version = "2.32.0.20241016" -requires_python = ">=3.8" -summary = "Typing stubs for requests" -groups = ["default"] -dependencies = [ - "urllib3>=2", -] -files = [ - {file = "types-requests-2.32.0.20241016.tar.gz", hash = "sha256:0d9cad2f27515d0e3e3da7134a1b6f28fb97129d86b867f24d9c726452634d95"}, - {file = "types_requests-2.32.0.20241016-py3-none-any.whl", hash = "sha256:4195d62d6d3e043a4eaaf08ff8a62184584d2e8684e9d2aa178c7915a7da3747"}, -] - -[[package]] -name = "typing-extensions" -version = "4.15.0" -requires_python = ">=3.9" -summary = "Backported and Experimental Type Hints for Python 3.9+" -groups = ["dev"] -files = [ - {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, - {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, -] - -[[package]] -name = "urllib3" -version = "2.2.3" -requires_python = ">=3.8" -summary = "HTTP library with thread-safe connection pooling, file post, and more." -groups = ["default"] -files = [ - {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, -] diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/persistent_preferences.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/persistent_preferences.py index d46b568..6198162 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/persistent_preferences.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/persistent_preferences.py @@ -42,9 +42,9 @@ def write_preferences_to_JSON(preferences: dict): try: with open(preferences_path, "w", encoding="utf-8") as s: json.dump(preferences, s, ensure_ascii=False, indent=4) - bk_logger.info(f"Saved preferences to {preferences_path}") + bk_logger.info("Saved preferences to %s", preferences_path) except Exception as e: - bk_logger.warning(f"Failed to save preferences: {e}") + bk_logger.warning("Failed to save preferences: %s", e) def load_preferences_from_JSON(): @@ -100,6 +100,9 @@ def load_preferences_from_JSON(): user_preferences.unpack_files = prefs.get( "unpack_files", user_preferences.unpack_files ) + user_preferences.write_asset_metadata = prefs.get( + "write_asset_metadata", user_preferences.write_asset_metadata + ) # GUI user_preferences.show_on_start = prefs.get( @@ -121,6 +124,9 @@ def load_preferences_from_JSON(): user_preferences.announcements_on_start = prefs.get( "announcements_on_start", user_preferences.announcements_on_start ) + user_preferences.assetbar_follows_cursor = prefs.get( + "assetbar_follows_cursor", user_preferences.assetbar_follows_cursor + ) # NETWORK user_preferences.client_port = prefs.get( @@ -159,7 +165,7 @@ def load_preferences_from_JSON(): # IMPORT SETTINGS user_preferences.resolution = prefs.get("resolution", user_preferences.resolution) - bk_logger.info(f"Successfully loaded preferences from {preferences_path}") + bk_logger.info("Successfully loaded preferences from %s", preferences_path) user_preferences.preferences_lock = False return prefs @@ -177,7 +183,7 @@ def property_keep_preferences_updated(user_preferences, context): try: os.remove(preferences_path) - bk_logger.info(f"Deleted preferences file {preferences_path}") + bk_logger.info("Deleted preferences file %s", preferences_path) except Exception as e: - bk_logger.error(f"Failed to delete preferences file {preferences_path}: {e}") + bk_logger.error("Failed to delete preferences file %s: %s", preferences_path, e) utils.save_prefs(user_preferences, context) diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/pyproject.toml b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/pyproject.toml deleted file mode 100644 index 8b00a7d..0000000 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/pyproject.toml +++ /dev/null @@ -1,105 +0,0 @@ -[project] -requires-python = ">=3.10,<3.13" # in order to support numpy<2.0.0 -dependencies = [ - "requests>=2.18.4", - "types-requests>=2.31.0.5", - "numpy>=1.21.0,<2.0.0", -] - -# these will not be included in build distributions -[dependency-groups] -dev = [ - ## dev dependencies - "black==25.9.0", - "isort==7.0.0", - "mypy==1.13.0", - - ## I would like to enable these in the future - "bandit>=1.8.2", # code is currently invalid for bandit - "ruff>=0.14.1", # code is currently invalid for ruff - "pydoclint>=0.7.3", # code is currently invalid for pydoclint -] - -[tool.isort] -multi_line_output = 3 -lines_after_imports = 2 -skip = ["lib", "out", ".venv"] -profile = "black" - -[tool.black] -target-version = ['py310'] -include = '\.pyi?$' -exclude = ''' -/(\.git|lib|out)/ -''' - -[tool.ruff] -target-version = "py310" -line-length = 120 -include = ["pyproject.toml", - "**/*.py", - "*.py" - ] -exclude = [ - "lib", - "out", - "addon_updater.py", - "addon_updater_ops.py", - "_debug/**", - "_bck/**", - "*.tmp", - "__pycache__/**", - ".venv/**", - "*.pyi", - "sentry_sdk", -] -ignore = [ - "E501", # Line too long -] - -[tool.ruff.format] -line-ending = "auto" - -[tool.ruff.lint] -select = ["F", "E", "W", "C90", "I", "N", "D", "UP", "S1", "S2", "S3", "S5", "BLE", "FBT", - "B", "A", "C4", "COM", "DTZ", "T10", "FA", "ISC", "ICN", "LOG", "G", "INP", "PIE", "T20", "Q", "RSE", "RET", "SLF", - "SLOT", "SIM", "TID", - "TC001", "TC004", "TC005", "TC010", - "INT", "ARG", "FIX", "ERA", "PL", "TRY", "FLY", "PERF", "RUF" -] - -ignore = [ - "D105", # https://docs.astral.sh/ruff/rules/undocumented-magic-method/ - "D107", # https://docs.astral.sh/ruff/rules/undocumented-public-init/ - "PLC0415", # https://docs.astral.sh/ruff/rules/import-outside-top-level/ - "RET504", # https://docs.astral.sh/ruff/rules/unnecessary-assign/ -] - -[tool.ruff.lint.pydocstyle] -convention = "google" - - -[tool.mypy] -exclude = ['test_*', 'out', 'lib'] -disallow_untyped_globals = false # remove this in the future - -[[tool.mypy.overrides]] -module = [ - "bpy", - "bpy.*", - "bpy_extras", - "mathutils", - "addonutils", - "blf", - "gpu", - "gpu_extras.*" -] -ignore_missing_imports = true # Ignore missing type hints for bpy - -[tool.pydoclint] -style = "google" -arg-type-hints-in-docstring = false -check-return-types = false -ignore-private-args = true -ignore-underscore-args = true -exclude = "\\.venv|\\sentry_sdk" diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ratings.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ratings.py index 73750cf..dc24597 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ratings.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ratings.py @@ -36,7 +36,6 @@ from . import ( utils, ) - bk_logger = logging.getLogger(__name__) @@ -170,7 +169,7 @@ class FastRateMenu(Operator, ratings_utils.RatingProperties): else: if bpy.context.view_layer.objects.active is not None: ob = utils.get_active_model() - ad = ob.get("asset_data") + ad = utils.get_asset_data_from_ob(ob) if ad: self.asset_data = ad self.asset_id = self.asset_data["id"] @@ -184,8 +183,9 @@ class FastRateMenu(Operator, ratings_utils.RatingProperties): self.img = ui.get_large_thumbnail_image(self.asset_data) utils.img_to_preview(self.img, copy_original=True) - ratings_utils.ensure_rating(self.asset_id) - self.prefill_ratings() + if self.asset_type != "author": + ratings_utils.ensure_rating(self.asset_id) + self.prefill_ratings() # Update last popup activity time to prevent shortcut interference from . import ui_panels @@ -223,6 +223,12 @@ class SetBookmark(bpy.types.Operator): return True def execute(self, context): + # Authors cannot be bookmarked + sr = search.get_search_results() + for r in sr: + if r.get("id") == self.asset_id and r.get("assetType") == "author": + return {"CANCELLED"} + rating = ratings_utils.get_rating_local(self.asset_id) if rating is None: rating = datas.AssetRating() @@ -233,7 +239,7 @@ class SetBookmark(bpy.types.Operator): ratings_utils.store_rating_local( self.asset_id, rating_type="bookmarks", value=bookmark_value ) - client_lib.send_rating(self.asset_id, "bookmarks", str(bookmark_value)) + client_lib.send_rating(self.asset_id, "bookmarks", bookmark_value) return {"FINISHED"} @@ -323,7 +329,7 @@ class RatingStarWidget(Gizmo): def should_be_rated(ob) -> bool: - ad = ob.get("asset_data") + ad = utils.get_asset_data_from_ob(ob) if ad is None: return False rating = ratings_utils.get_rating_local(ad["id"]) @@ -354,7 +360,8 @@ class RatingStarWidgetGroup(GizmoGroup): ob = utils.get_active_model() gz = self.gizmos.new(RatingStarWidget.bl_idname) props = gz.target_set_operator("wm.blenderkit_menu_rating_upload") - props.asset_id = ob["asset_data"]["assetBaseId"] + ad = utils.get_asset_data_from_ob(ob) + props.asset_id = ad["assetBaseId"] if ad else "" gz.color = 0.5, 0.5, 0.0 gz.alpha = 0.5 diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ratings_utils.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ratings_utils.py index 9d4ef70..86935da 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ratings_utils.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ratings_utils.py @@ -46,11 +46,11 @@ bk_logger = logging.getLogger(__name__) def handle_get_rating_task(task: client_tasks.Task): - """Handle incomming get_rating task by saving the results into global_vars.""" + """Handle incoming get_rating task by saving the results into global_vars.""" if task.status == "created": return if task.status == "error": - return bk_logger.warning(f"{task.task_type} task failed: {task.message}") + return bk_logger.warning("%s task failed: %s", task.task_type, task.message) asset_id = task.data["asset_id"] ratings = task.result["results"] @@ -64,23 +64,23 @@ def handle_get_rating_task(task: client_tasks.Task): def handle_get_ratings_task(task: client_tasks.Task): - """Handle incomming get_ratings task. This is a special task used only by validators which fetches the ratings + """Handle incoming get_ratings task. This is a special task used only by validators which fetches the ratings in big batch right after the search results come into the Client. This is used only to signal problems in the Goroutine which fetches the ratings. The individual ratings are then sent as normal 'get_rating' tasks. """ if task.status == "error": # only reason this task type exists right now - return bk_logger.warning(f"{task.task_type} task failed: {task.message}") + return bk_logger.warning("%s task failed: %s", task.task_type, task.message) def handle_get_bookmarks_task(task: client_tasks.Task): - """Handle incomming get_bookmarks task by saving the results into global_vars. + """Handle incoming get_bookmarks task by saving the results into global_vars. This is different from standard ratings - the results come from elastic search API instead of ratings API. """ if task.status == "created": return if task.status == "error": - bk_logger.warning(f"Could not load bookmarks: {task.message}") + bk_logger.warning("Could not load bookmarks: %s", task.message) return for asset in task.result["results"]: @@ -134,7 +134,7 @@ def ensure_rating(asset_id: str): if rating is None: client_lib.get_rating(asset_id) return - if not rating.quality_fetched or rating.working_hours_fetched: + if not rating.quality_fetched or not rating.working_hours_fetched: client_lib.get_rating(asset_id) @@ -419,7 +419,7 @@ class RatingProperties(PropertyGroup): whs = "0" self.rating_work_hours_ui = whs except Exception as e: - bk_logger.warning(f"exception setting rating_work_hours_ui: {e}") + bk_logger.warning("exception setting rating_work_hours_ui: %s", e) self.rating_work_hours = round(rating.working_hours, 2) self.rating_work_hours_lock = False diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/reports.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/reports.py index 1047064..67fe2bc 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/reports.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/reports.py @@ -36,12 +36,12 @@ reports = [] def add_report( text: str = "", timeout: float = -1, - type: Literal["INFO", "ERROR", "VALIDATOR"] = "INFO", + type: Literal["INFO", "ERROR", "VALIDATOR", "WARNING"] = "INFO", details: str = "", ) -> None: """Add text report to GUI. Function checks for same reports and make them longer by the timeout. - Also log the text and details into the console with levels: ERROR=RED, INFO=GREEN, VALIDATOR=BLUE. - When timeout is not specified, default 15s will be used for ERROR, 5s for INFO/VALIDATOR. + Also log the text and details into the console with levels: ERROR=RED, INFO=GREEN, VALIDATOR=BLUE, WARNING=YELLOW. + When timeout is not specified, default 15s will be used for ERROR, 5s for INFO/VALIDATOR/WARNING. """ global reports text = text.strip() @@ -72,6 +72,9 @@ def add_report( elif type == "VALIDATOR": bk_logger.info(full_message, stacklevel=2) color = colors.BLUE + elif type == "WARNING": + bk_logger.warning(full_message, stacklevel=2) + color = colors.YELLOW # check for same reports and just make them longer by the timeout. for old_report in reports: @@ -113,7 +116,7 @@ class Report: try: reports.remove(self) except Exception as e: - bk_logger.warning(f"exception in fading: {e}") + bk_logger.warning("exception in fading: %s", e) def draw(self, x, y): if ( diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/resolutions.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/resolutions.py index ec8ab7c..f403be9 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/resolutions.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/resolutions.py @@ -17,16 +17,12 @@ # ##### END GPL LICENSE BLOCK ##### -import json import logging import os -import sys import time import bpy -from . import paths, utils - bk_logger = logging.getLogger(__name__) diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/search.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/search.py index 47f35dd..09aeec6 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/search.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/search.py @@ -20,7 +20,6 @@ import copy import json import logging import math -from functools import lru_cache import os import re import unicodedata @@ -35,12 +34,14 @@ from bpy.types import Operator from . import ( asset_bar_op, + categories, client_lib, client_tasks, comments_utils, datas, download, global_vars, + icons, image_utils, paths, reports, @@ -50,11 +51,340 @@ from . import ( utils, ) +if bpy.app.version >= (4, 2, 0): + from . import override_extension_draw +else: + override_extension_draw = None + bk_logger = logging.getLogger(__name__) + +MAX_PAGE_SIZE = 80 +"""Maximum number of assets to fetch per search page.""" + search_tasks = {} +# ------------------------------------------------------------------ +# Active filter helpers (per tab) +# ------------------------------------------------------------------ + + +def _ensure_tab_filters(tab: dict) -> list[dict]: + if "active_filters" not in tab: + tab["active_filters"] = [] + if tab["active_filters"] is None: + tab["active_filters"] = [] + return tab["active_filters"] + + +def get_active_filters(tab: Optional[dict] = None) -> list[dict]: + tab = tab or get_active_tab() + return copy.deepcopy(_ensure_tab_filters(tab)) + + +PANEL_FILTER_TERMS: set[str] = { + "style", + "geometry_nodes", + "design_year", + "polycount", + "texture_resolution", + "file_size", + "condition", + "animated", + "free_only", + "bookmarks", + "quality_limit", + "license", + "blender_version", + "order", + "category", +} + + +def _collect_panel_filters() -> list[dict]: + """Translate UI filter state into active filter chip descriptors.""" + ui_props = bpy.context.window_manager.blenderkitUI + sprops = utils.get_search_props() + preferences = bpy.context.preferences.addons[__package__].preferences + + panel_filters: list[dict] = [] + + if ui_props.free_only: + panel_filters.append( + {"term": "free_only", "value": "true", "label": "Free first"} + ) + + if ui_props.search_bookmarks: + panel_filters.append( + {"term": "bookmarks", "value": "true", "label": "Bookmarks"} + ) + + if getattr(sprops, "search_style", "ANY") != "ANY": + panel_filters.append( + { + "term": "style", + "value": sprops.search_style, + "label": sprops.search_style.capitalize(), + } + ) + + if getattr(sprops, "search_condition", "UNSPECIFIED") != "UNSPECIFIED": + panel_filters.append( + { + "term": "condition", + "value": sprops.search_condition, + "label": sprops.search_condition.capitalize(), + } + ) + + if getattr(sprops, "search_design_year", False): + label = f"{sprops.search_design_year_min}-{sprops.search_design_year_max}" + panel_filters.append( + { + "term": "design_year", + "value": label, + "label": label, + } + ) + + if getattr(sprops, "search_polycount", False): + label = f"Poly {sprops.search_polycount_min}-{sprops.search_polycount_max}" + panel_filters.append( + { + "term": "polycount", + "value": label, + "label": label, + } + ) + + if getattr(sprops, "search_texture_resolution", False): + label = f"TexRes {sprops.search_texture_resolution_min}-{sprops.search_texture_resolution_max}" + panel_filters.append( + { + "term": "texture_resolution", + "value": label, + "label": label, + } + ) + + if getattr(sprops, "search_file_size", False): + label = f"File {sprops.search_file_size_min}-{sprops.search_file_size_max}MB" + panel_filters.append( + { + "term": "file_size", + "value": label, + "label": label, + } + ) + + if getattr(sprops, "search_animated", False): + panel_filters.append({"term": "animated", "value": "true", "label": "Animated"}) + + if getattr(sprops, "search_geometry_nodes", False): + panel_filters.append( + { + "term": "geometry_nodes", + "value": "true", + "label": "GeoNodes", + } + ) + + if ui_props.quality_limit > 0: + panel_filters.append( + { + "term": "quality_limit", + "value": str(ui_props.quality_limit), + "label": f"Q≥{ui_props.quality_limit}", + } + ) + + if ui_props.search_license != "ANY": + panel_filters.append( + { + "term": "license", + "value": ui_props.search_license, + "label": ui_props.search_license, + } + ) + + if ui_props.search_blender_version: + label = f"Blender {ui_props.search_blender_version_min}-{ui_props.search_blender_version_max}" + panel_filters.append( + { + "term": "blender_version", + "value": label, + "label": label, + } + ) + + if ui_props.search_order_by != "default": + panel_filters.append( + { + "term": "order", + "value": ui_props.search_order_by, + "label": ui_props.search_order_by, + } + ) + + # NSFW is intentionally left out; it already changes server query and badge state. + + category = getattr(sprops, "search_category", "") + if category and category != ui_props.asset_type.lower(): + bkit_categories = global_vars.DATA.get("bkit_categories") or [] + name_path = categories.get_category_name_path(bkit_categories, category) + label = name_path[-1] if name_path else category.split("/")[-1] + panel_filters.append({"term": "category", "value": category, "label": label}) + + return panel_filters + + +def _sync_panel_filters_into_active(tab: dict): + """Merge panel-derived filters with existing ad-hoc filters (e.g., manufacturer).""" + current = _ensure_tab_filters(tab) + preserved = [f for f in current if f.get("term") not in PANEL_FILTER_TERMS] + tab["active_filters"] = preserved + _collect_panel_filters() + + +def set_active_filter( + term: str, + value: str, + label: Optional[str] = None, + origin: Optional[str] = None, +): + tab = get_active_tab() + filters = _ensure_tab_filters(tab) + # drop existing entry for the same term to keep one value per term for now + filters = [f for f in filters if f.get("term") != term] + filters.append( + {"term": term, "value": value, "label": label or value, "origin": origin} + ) + tab["active_filters"] = filters + + +def remove_active_filter(term: str, value: Optional[str] = None): + tab = get_active_tab() + filters = _ensure_tab_filters(tab) + if term in PANEL_FILTER_TERMS: + _clear_panel_filter(term) + if value is None: + filters = [f for f in filters if f.get("term") != term] + else: + filters = [ + f + for f in filters + if not (f.get("term") == term and f.get("value") == value) + ] + tab["active_filters"] = filters + + +def set_active_filters_for_tab(tab: dict, filters: list[dict]): + tab["active_filters"] = copy.deepcopy(filters) if filters else [] + + +def search_by_author_id(author_id: str, author_name: str = ""): + """Set author filter, clean keywords of author name parts, and run search. + + This is the single entry point for all "search by author" actions: + asset bar click, keyboard shortcut, popup card button, etc. + """ + author_id = str(author_id) + if not author_name or author_name == author_id: + author = global_vars.BKIT_AUTHORS.get(int(author_id)) + if author: + full = f"{author.firstName} {author.lastName}".strip() + if full: + author_name = full + if not author_name: + author_name = author_id + + ui_props = bpy.context.window_manager.blenderkitUI + keywords = ui_props.search_keywords + if keywords and author_name: + kw_parts = keywords.split() + if len(kw_parts) <= 1: + # Single word — user was clearly searching for this author, clear it + keywords = "" + else: + name_parts = author_name.lower().split() + keywords = " ".join(w for w in kw_parts if w.lower() not in name_parts) + # Strip any legacy +author_id: from keywords + keywords = re.sub(r"\+author_id:\d+", "", keywords).strip() + ui_props.search_keywords = keywords + + sprops = utils.get_search_props() + if utils.profile_is_validator(): + sprops.search_verification_status = "ALL" + + set_active_filter( + term="author_id", + value=author_id, + label=author_name, + origin="data", + ) + update_filters() + create_history_step(get_active_tab()) + search() + + +def _clear_panel_filter(term: str): + """Reset underlying filter props when a panel-derived chip is removed.""" + ui_props = bpy.context.window_manager.blenderkitUI + sprops = utils.get_search_props() + + if term == "style" and hasattr(sprops, "search_style"): + sprops.search_style = "ANY" + elif term == "condition" and hasattr(sprops, "search_condition"): + sprops.search_condition = "UNSPECIFIED" + elif term == "design_year" and hasattr(sprops, "search_design_year"): + sprops.search_design_year = False + elif term == "polycount" and hasattr(sprops, "search_polycount"): + sprops.search_polycount = False + elif term == "texture_resolution" and hasattr(sprops, "search_texture_resolution"): + sprops.search_texture_resolution = False + elif term == "file_size" and hasattr(sprops, "search_file_size"): + sprops.search_file_size = False + elif term == "animated" and hasattr(sprops, "search_animated"): + sprops.search_animated = False + elif term == "geometry_nodes" and hasattr(sprops, "search_geometry_nodes"): + sprops.search_geometry_nodes = False + elif term == "free_only": + ui_props.free_only = False + elif term == "bookmarks": + ui_props.search_bookmarks = False + elif term == "quality_limit": + ui_props.quality_limit = 0 + elif term == "license": + ui_props.search_license = "ANY" + elif term == "blender_version": + ui_props.search_blender_version = False + elif term == "order": + ui_props.search_order_by = "default" + elif term == "category" and hasattr(sprops, "search_category"): + sprops.search_category = "" + # Reset the category browse path back to the root for this asset type + asset_type = ui_props.asset_type + active_browse = global_vars.DATA.get("active_category_browse") + if active_browse is not None and asset_type in active_browse: + active_browse[asset_type] = [asset_type.lower()] + + +def get_active_filter_keywords(tab: Optional[dict] = None) -> list[str]: + tab = tab or get_active_tab() + filters = _ensure_tab_filters(tab) + tokens = [] + for f in filters: + term = f.get("term") + value = f.get("value") + # Panel-derived filters (style, free_only, order, etc.) are represented + # directly in query parameters and should not emit keyword tokens. + if term in PANEL_FILTER_TERMS: + continue + if term and value: + tokens.append(f"+{term}:{value}") + return tokens + + def _inject_user_price_data(assets: list[dict]) -> None: """Augment search results with per-user pricing info when available.""" if not assets: @@ -67,6 +397,7 @@ def _inject_user_price_data(assets: list[dict]) -> None: return try: + # returns entry per versionUuid price_response = search_price.query_user_price( version_uuids=version_uuids, page_size=len(version_uuids), @@ -84,17 +415,17 @@ def _inject_user_price_data(assets: list[dict]) -> None: price_by_uuid: dict[str, dict] = {} for entry in price_response: - version_uuid = entry.get("versionUuid") # maybe assetUuid ? - if not version_uuid: + base_uuid = entry.get("versionUuid") + if not base_uuid: continue - price_by_uuid[version_uuid] = entry + price_by_uuid[base_uuid] = entry if not price_by_uuid: return for asset in assets: - version_uuid = asset["id"] - price_info = price_by_uuid.get(version_uuid) + base_uuid = asset["id"] + price_info = price_by_uuid.get(base_uuid) if not price_info: continue asset["userPrice"] = price_info["discountedPrice"] @@ -185,7 +516,7 @@ def check_clipboard(): try: # could be problematic on Linux current_clipboard = str(bpy.context.window_manager.clipboard) except Exception as e: - bk_logger.warning(f"Failed to get clipboard: {e}") + bk_logger.warning("Failed to get clipboard: %s", e) return if current_clipboard == last_clipboard: @@ -217,6 +548,8 @@ def check_clipboard(): target_asset_type = "NODEGROUP" elif asset_type_string.find("addon") > -1 or asset_type_string.find("add-on") > -1: target_asset_type = "ADDON" + elif asset_type_string.find("artist") > -1 or asset_type_string.find("author") > -1: + target_asset_type = "AUTHOR" else: bk_logger.debug("Clipboard does not contain valid asset type.") return @@ -229,6 +562,73 @@ def check_clipboard(): ui_props.search_keywords = current_clipboard[:asset_type_index].rstrip() +def parse_author_result(r) -> dict: + """Parse an author-type search result into asset_data with safe defaults. + + Author results have full author data in the ``author`` sub-object (same + structure as regular assets). We use it to populate ``BKIT_AUTHORS`` and + fetch the gravatar, then synthesize the remaining fields that downstream + code expects but the server doesn't provide for authors. + """ + author_id = r.get("id", r.get("author", {}).get("id", 0)) + display_name = r.get("displayName", r.get("name", "")) + + asset_data = { + "thumbnail": "", + "thumbnail_small": "", + "downloaded": 0, + "available_resolutions": [], + "max_resolution": 0, + "filesSize": 0, + "dictParameters": {}, + "files": [], + "verificationStatus": "validated", + "canDownload": False, + "isFree": True, + "score": 0, + "ratingsCount": {}, + "ratingsAverage": {}, + "assetBaseId": str(author_id), + "displayName": display_name, + } + + # Process full author profile data (fetches gravatar, populates BKIT_AUTHORS) + # NOTE: generate_author_profile sends id to the GO client which expects int, + # so we must NOT convert id to string before calling it (same as parse_result). + adata = r.get("author") + if adata and isinstance(adata, dict) and len(adata) > 1: + # Full author data available — parse it like regular assets do + adata = dict(adata) # copy so pop() doesn't mutate the original + social_networks = datas.parse_social_networks( + adata.pop("socialNetworks", None) or [] + ) + author = datas.UserProfile(**adata, socialNetworks=social_networks) + generate_author_profile(author) + r["author"]["id"] = str(r["author"]["id"]) + else: + # Minimal author data — just ensure id is a string + if "author" not in r: + r["author"] = {"id": str(author_id)} + else: + r["author"]["id"] = str(r["author"]["id"]) + + # Apply server data, then re-apply safe defaults for any fields that ended + # up as None or empty (Go serializes nil maps/slices as null → Python None, + # and some string fields come back as "" instead of a valid value). + safe_defaults = { + "dictParameters": {}, + "files": [], + "ratingsCount": {}, + "ratingsAverage": {}, + "verificationStatus": "validated", + } + asset_data.update(r) + for key, default in safe_defaults.items(): + if not asset_data.get(key): + asset_data[key] = default + return asset_data + + # TODO: type annotate and check this crazy function! # Are we sure it behaves correctly on network issues, malfunctioning search etc? def parse_result(r) -> dict: @@ -248,6 +648,9 @@ def parse_result(r) -> dict: utils.p("asset with no files-size") asset_type = r["assetType"] + if asset_type == "author": + return parse_author_result(r) + adata = r["author"] social_networks = datas.parse_social_networks(adata.pop("socialNetworks", [])) author = datas.UserProfile(**adata, socialNetworks=social_networks) @@ -302,7 +705,7 @@ def parse_result(r) -> dict: r["max_resolution"] = max(r["available_resolutions"]) # tooltip = generate_tooltip(r) - # for some reason, the id was still int on some occurances. investigate this. + # for some reason, the id was still int on some occurrences. investigate this. r["author"]["id"] = str(r["author"]["id"]) # some helper props, but generally shouldn't be renaming/duplifiying original properties, @@ -373,7 +776,7 @@ def cleanup_search_results(): def handle_search_task_error(task: client_tasks.Task) -> None: - """Handle incomming search task error.""" + """Handle incoming search task error.""" # First find the history step that the task belongs to for history_step in get_history_steps().values(): if task.task_id in history_step.get("search_tasks", {}).keys(): @@ -434,6 +837,8 @@ def handle_search_task(task: client_tasks.Task) -> bool: result_field.append(asset_data) if not utils.profile_is_validator(): continue + if asset_data.get("assetType") == "author": + continue # VALIDATORS # fetch all comments if user is validator to preview them faster # these comments are also shown as part of the tooltip oh mouse hover in asset bar. @@ -441,6 +846,12 @@ def handle_search_task(task: client_tasks.Task) -> bool: if comments is None: client_lib.get_comments(asset_data["assetBaseId"]) + # Separate author results from regular assets, put authors first + author_results = [r for r in result_field if r.get("assetType") == "author"] + asset_results = [r for r in result_field if r.get("assetType") != "author"] + + result_field = author_results + asset_results + # Apply addon-specific status checking and filtering if needed if ui_props.asset_type == "ADDON": # Always process addon search results to store installation status @@ -450,14 +861,18 @@ def handle_search_task(task: client_tasks.Task) -> bool: addon_props = bpy.context.window_manager.blenderkit_addon if addon_props.search_installed: - # Filter to only show installed addons + # Filter to only show installed addons, but preserve author results result_field = [ - asset for asset in result_field if asset.get("downloaded", 0) > 0 + asset + for asset in result_field + if asset.get("assetType") == "author" or asset.get("downloaded", 0) > 0 ] # TODO: if ever needed, implement for other future types if result_field: _inject_user_price_data(result_field) + if override_extension_draw is not None: + override_extension_draw.update_cache_with_asset_prices(result_field) # Store results in history step history_step["search_results"] = result_field @@ -512,6 +927,11 @@ def handle_thumbnail_download_task(task: client_tasks.Task) -> None: if task.data["thumbnail_type"] == "full": asset_bar_op.asset_bar_operator.update_tooltip_image(task.data["assetBaseId"]) + return + + if task.data["thumbnail_type"] in {"photo_full", "wire_full"}: + asset_bar_op.asset_bar_operator.needs_tooltip_update = True + return def load_preview(asset): @@ -623,6 +1043,7 @@ def write_block_from_value(tooltip, value, pretext="", width=2000): # for longe if not value: return tooltip + intext = value if type(value) == list: intext = list_to_str(value) elif type(value) == float: @@ -682,11 +1103,14 @@ def generate_author_textblock(first_name: str, last_name: str, about_me: str): def handle_fetch_gravatar_task(task: client_tasks.Task): - """Handle incomming fetch_gravatar_task which contains path to author's image on the disk.""" + """Handle incoming fetch_gravatar_task which contains path to author's image on the disk.""" if task.status == "finished": author_id = int(task.data["id"]) gravatar_path = task.result["gravatar_path"] global_vars.BKIT_AUTHORS[author_id].gravatarImg = gravatar_path + # Notify asset bar to refresh author thumbnails + if asset_bar_op.asset_bar_operator is not None: + asset_bar_op.asset_bar_operator.update_image(str(author_id)) def generate_author_profile(author_data: datas.UserProfile): @@ -708,12 +1132,12 @@ def generate_author_profile(author_data: datas.UserProfile): def handle_get_user_profile(task: client_tasks.Task): - """Handle incomming get_user_profile task which contains data about current logged-in user.""" + """Handle incoming get_user_profile task which contains data about current logged-in user.""" if task.status not in ["finished", "error"]: return if task.status == "error": - bk_logger.warning(f"Could not load user profile: {task.message}") + bk_logger.warning("Could not load user profile: %s", task.message) return user_data = task.result.get("user") @@ -782,7 +1206,13 @@ def query_to_url( for q in query: if q in ["query", "free_first", "search_order_by"]: continue - requeststring += f"+{q}:{urllib.parse.quote_plus(str(query[q]))}" + value = str(query[q]) + if q == "asset_type" and value != "author": + has_keywords = query.get("query") not in ("", None) + has_author_filter = query.get("author_id") not in ("", None) + if has_keywords and not has_author_filter: + value += ",author" + requeststring += f"+{q}:{urllib.parse.quote_plus(value)}" # add dict_parameters to make results smaller @@ -864,9 +1294,15 @@ def build_query_common(query: dict, props, ui_props) -> dict: """ query = copy.deepcopy(query) query_common = {} - if ui_props.search_keywords != "": - keywords = ui_props.search_keywords.replace("&", "%26") - query_common["query"] = keywords + base_keywords = ui_props.search_keywords.strip() + filter_tokens = get_active_filter_keywords() + combined_parts = [] + if base_keywords: + combined_parts.append(base_keywords.replace("&", "%26")) + combined_parts.extend(filter_tokens) + combined_keywords = " ".join(part for part in combined_parts if part) + if combined_keywords: + query_common["query"] = combined_keywords if props.search_verification_status != "ALL" and utils.profile_is_validator(): query_common["verification_status"] = props.search_verification_status.lower() @@ -1009,6 +1445,26 @@ def build_query_addon(props, ui_props) -> dict: return build_query_common(query, props, ui_props) +def build_query_author(props, ui_props) -> dict: + """Pure function to construct search query dict for authors.""" + query = {"asset_type": "author"} + query = build_query_common(query, props, ui_props) + # +author_id:XXX doesn't match author profile documents in elasticsearch + # (that field only exists on asset documents). Replace it with the + # author's name so the API can do a text-search for the profile instead. + q = query.get("query", "") + match = re.search(r"\+author_id:(\d+)", q) + if match: + aid = int(match.group(1)) + author = global_vars.BKIT_AUTHORS.get(aid) + name = author.fullName if author else "" + q = re.sub(r"\+author_id:\d+\s*", "", q).strip() + if name: + q = f"{name} {q}".strip() if q else name + query["query"] = q or None + return query + + def filter_addon_search_results(search_results, filter_installed_only=False): """ Filter addon search results based on local installation status. @@ -1026,10 +1482,8 @@ def filter_addon_search_results(search_results, filter_installed_only=False): filtered_results = [] for asset in search_results: - if asset.get("assetType") != "addon": - # Skip non-addon assets (shouldn't happen in addon search but safety check) - if not filter_installed_only: - filtered_results.append(asset) + if not filter_installed_only: + filtered_results.append(asset) continue # Check installation and enablement status for addon @@ -1054,7 +1508,9 @@ def filter_addon_search_results(search_results, filter_installed_only=False): except Exception as e: # If we can't determine status, mark as not installed/enabled bk_logger.warning( - f"Could not determine installation status for addon {asset.get('name', 'Unknown')}: {e}" + "Could not determine installation status for addon %s : %s", + asset.get("name", "Unknown"), + e, ) asset["downloaded"] = 0 asset["enabled"] = False @@ -1135,7 +1591,7 @@ def get_search_simple( page_index = 2 page_count = math.ceil(search_results["count"] / page_size) while search_results.get("next") and len(results) < max_results: - bk_logger.info(f"getting page {page_index} , total pages {page_count}") + bk_logger.info("getting page %d , total pages %d", page_index, page_count) response = client_lib.blocking_request(search_results["next"], "GET", headers) search_results = response.json() results.extend(search_results["results"]) @@ -1146,7 +1602,7 @@ def get_search_simple( with open(filepath, "w", encoding="utf-8") as s: json.dump(results, s, ensure_ascii=False, indent=4) - bk_logger.info(f"retrieved {len(results)} assets from elastic search") + bk_logger.info("retrieved %d assets from elastic search", len(results)) return results @@ -1249,6 +1705,12 @@ def search(get_next=False, query=None, author_id=""): ui_props=bpy.context.window_manager.blenderkitUI, ) + if ui_props.asset_type == "AUTHOR": + query = build_query_author( + props=bpy.context.window_manager.blenderkit_author, + ui_props=bpy.context.window_manager.blenderkitUI, + ) + # crop long searches if query.get("query"): if len(query["query"]) > 50: @@ -1278,8 +1740,9 @@ def search(get_next=False, query=None, author_id=""): active_history_step["is_searching"] = True - page_size = min(40, ui_props.wcount * user_preferences.maximized_assetbar_rows + 5) - + page_size = min( + MAX_PAGE_SIZE, ui_props.wcount * user_preferences.maximized_assetbar_rows + 5 + ) next_url = "" if get_next and active_history_step.get("search_results_orig"): next_url = active_history_step["search_results_orig"].get("next", "") @@ -1292,6 +1755,7 @@ def clean_filters(): """Cleanup filters in case search needs to be reset, typically when asset id is copy pasted.""" sprops = utils.get_search_props() ui_props = bpy.context.window_manager.blenderkitUI + active_tab = get_active_tab() ui_props.property_unset("own_only") sprops.property_unset("search_texture_resolution") sprops.property_unset("search_file_size") @@ -1326,6 +1790,7 @@ def update_filters(): sprops = utils.get_search_props() ui_props = bpy.context.window_manager.blenderkitUI + active_tab = get_active_tab() if ui_props.search_bookmarks and not utils.user_logged_in(): ui_props.search_bookmarks = False @@ -1341,6 +1806,8 @@ def update_filters(): ) return False + _sync_panel_filters_into_active(active_tab) + fcommon = ( ui_props.own_only or sprops.search_texture_resolution @@ -1352,6 +1819,7 @@ def update_filters(): or ui_props.search_license != "ANY" or ui_props.search_blender_version or ui_props.search_order_by != "default" + or len(get_active_filters()) > 0 # NSFW filter is signaled in a special way and should not affect the filter icon ) @@ -1377,6 +1845,8 @@ def update_filters(): sprops.use_filters = fcommon elif ui_props.asset_type == "ADDON": sprops.use_filters = fcommon + elif ui_props.asset_type == "AUTHOR": + sprops.use_filters = fcommon return True @@ -1428,6 +1898,8 @@ def detect_asset_type_from_keywords(keywords: str) -> tuple[str, str]: "addon": "ADDON", "add-on": "ADDON", "extension": "ADDON", + "artist": "AUTHOR", + "author": "AUTHOR", } # Convert to lowercase for matching @@ -1449,6 +1921,20 @@ def search_update(self, context): # when search is locked, don't trigger search update ui_props = bpy.context.window_manager.blenderkitUI + # Drop data-driven filters (e.g. manufacturer chips) when switching asset type. + # Seed the tracker on first run to avoid wiping filters during the initial update. + last_asset_type = getattr(ui_props, "_last_asset_type", None) + if last_asset_type is None: + ui_props._last_asset_type = ui_props.asset_type + elif last_asset_type != ui_props.asset_type: + tab = get_active_tab() + filters = _ensure_tab_filters(tab) + # Keep only panel-defined filters; drop all ad-hoc/data-derived ones + tab["active_filters"] = [ + f for f in filters if f.get("term") in PANEL_FILTER_TERMS + ] + ui_props._last_asset_type = ui_props.asset_type + if ui_props.search_lock: return @@ -1507,6 +1993,11 @@ def search_update(self, context): target_asset_type = "PRINTABLE" elif asset_type_string.find("addon") > -1: target_asset_type = "ADDON" + elif ( + asset_type_string.find("artist") > -1 + or asset_type_string.find("author") > -1 + ): + target_asset_type = "AUTHOR" if ui_props.asset_type != target_asset_type: ui_props.search_keywords = "" @@ -1541,9 +2032,9 @@ def strip_accents(s): def refresh_search(): """Refresh search results. Useful after login/logout.""" - props = utils.get_search_props() - if props is not None: - props.report = "" + sprops = utils.get_search_props() + ui_props = bpy.context.window_manager.blenderkitUI + active_tab = get_active_tab() ui_props = bpy.context.window_manager.blenderkitUI if ui_props.assetbar_on: @@ -1631,20 +2122,18 @@ class SearchOperator(Operator): search_keywords = str(ui_props.search_keywords) - if self.keywords != "": - search_keywords = self.keywords - # remove all search keywords if force_clear is set if self.force_clear: # self.force_clear = False # reset the force clear search_keywords = "" + if self.keywords != "": + search_keywords = self.keywords + if self.author_id != "": - bk_logger.info(f"Author ID: {self.author_id}") - # if there is already an author id in the search keywords, remove it first, the author_id can be any so - # use regex to find it - search_keywords = re.sub(r"\+author_id:\d+", "", search_keywords) - search_keywords += f"+author_id:{self.author_id}" + ui_props.search_keywords = search_keywords + search_by_author_id(self.author_id) + return {"FINISHED"} ui_props.search_keywords = search_keywords @@ -1704,7 +2193,115 @@ def get_search_similar_keywords(asset_data: dict) -> str: return keywords -classes = [SearchOperator, UrlOperator, TooltipLabelOperator] +class AuthorAssetTypeSearch(Operator): + """Switch to a specific asset type tab and search by author""" + + bl_idname = "view3d.blenderkit_author_asset_type_search" + bl_label = "Search Author Assets" + bl_options = {"REGISTER", "INTERNAL"} + + author_id: StringProperty(name="Author ID", default="", options={"SKIP_SAVE"}) + author_name: StringProperty(name="Author Name", default="", options={"SKIP_SAVE"}) + asset_type: StringProperty( + name="Asset Type", default="MODEL", options={"SKIP_SAVE"} + ) + + def execute(self, context): + ui_props = bpy.context.window_manager.blenderkitUI + ui_props.search_lock = True + ui_props.asset_type = self.asset_type + ui_props.search_keywords = "" + ui_props.search_lock = False + search_by_author_id(self.author_id, self.author_name) + return {"FINISHED"} + + +class AuthorAssetTypePopup(Operator): + """Choose which asset type to browse for this author""" + + bl_idname = "view3d.blenderkit_author_asset_type_popup" + bl_label = "Find Author's Assets" + bl_options = {"REGISTER", "INTERNAL"} + + author_id: StringProperty(name="Author ID", default="", options={"SKIP_SAVE"}) + author_name: StringProperty(name="Author Name", default="", options={"SKIP_SAVE"}) + + # Set by caller before invoke — per-type asset counts from the author result + _asset_type_counts: dict = {} + + def execute(self, context): + return {"FINISHED"} + + def invoke(self, context, event): + wm = context.window_manager + return wm.invoke_popup(self, width=200) + + def draw(self, context): + layout = self.layout + layout.label(text=self.author_name or "Author") + layout.separator() + + counts = self._asset_type_counts + pcoll = icons.icon_collections["main"] + asset_types = [ + ("MODEL", "Models", "OBJECT_DATAMODE", "model"), + ("MATERIAL", "Materials", "MATERIAL", "material"), + ("SCENE", "Scenes", "SCENE_DATA", "scene"), + ("HDR", "HDRs", "WORLD", "hdr"), + ("BRUSH", "Brushes", "BRUSH_DATA", "brush"), + ("NODEGROUP", "Node Groups", "NODETREE", "nodegroup"), + ] + + for at_id, at_label, at_icon, at_key in asset_types: + count = counts.get(at_key, 0) + if counts and count == 0: + continue + label = f"{at_label} ({count})" if count else at_label + op = layout.operator( + "view3d.blenderkit_author_asset_type_search", + text=label, + icon=at_icon, + ) + op.author_id = self.author_id + op.author_name = self.author_name + op.asset_type = at_id + + # Printable + printable_count = counts.get("printable", 0) + if not counts or printable_count > 0: + label = ( + f"Printables ({printable_count})" if printable_count else "Printables" + ) + op = layout.operator( + "view3d.blenderkit_author_asset_type_search", + text=label, + icon_value=pcoll["asset_type_printable"].icon_id, + ) + op.author_id = self.author_id + op.author_name = self.author_name + op.asset_type = "PRINTABLE" + + # Add-ons (Blender 4.2+) + addon_count = counts.get("addon", 0) + if bpy.app.version >= (4, 2, 0) and (not counts or addon_count > 0): + label = f"Add-ons ({addon_count})" if addon_count else "Add-ons" + op = layout.operator( + "view3d.blenderkit_author_asset_type_search", + text=label, + icon="PLUGIN", + ) + op.author_id = self.author_id + op.author_name = self.author_name + op.asset_type = "ADDON" + + +classes = [ + SearchOperator, + UrlOperator, + TooltipLabelOperator, + AuthorAssetTypeSearch, + AuthorAssetTypePopup, +] def register_search(): @@ -1744,6 +2341,7 @@ def unregister_search(): def get_ui_state(): """Get the current UI state.""" ui_props = bpy.context.window_manager.blenderkitUI + active_tab = get_active_tab() ui_state = { "ui_props": { @@ -1759,6 +2357,7 @@ def get_ui_state(): "search_blender_version_max": ui_props.search_blender_version_max, }, "search_props": {}, + "active_filters": get_active_filters(active_tab), } # we need to add all props manually since they are a mess now and some should not be stored. @@ -1823,6 +2422,8 @@ def get_ui_state(): store_props = store_model_props elif asset_type == "ADDON": store_props = [] # Addons don't need to store specific props + elif asset_type == "AUTHOR": + store_props = [] # Authors don't need to store specific props search_props = utils.get_search_props() @@ -1849,15 +2450,13 @@ def update_tab_name(active_tab): # Update tab name based on search or category search_keywords = ui_state.get("ui_props", {}).get("search_keywords", "").strip() - # if there's author_id let's get the author's name from db of authors - # we need to get the number after +author_id: - author_id = re.search(r"\+author_id:(\d+)", search_keywords) + # Check active filters for author_id author_name = None - if author_id is not None: - author_id = author_id.group(1) - author = global_vars.BKIT_AUTHORS.get(int(author_id)) - if author: - author_name = author.fullName + active_filters = ui_state.get("active_filters", []) + for flt in active_filters: + if flt.get("term") == "author_id": + author_name = flt.get("label") + break search_category = ( ui_state.get("search_props", {}).get("search_category", "").strip() @@ -1893,7 +2492,7 @@ def update_tab_name(active_tab): if asset_bar.area and asset_bar.area.region: asset_bar.area.tag_redraw() except Exception as e: - bk_logger.debug(f"Could not update tab name in UI: {e}") + bk_logger.debug("Could not update tab name in UI: %s", e) return history_step diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/search_price.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/search_price.py index 08c9baf..3ef5562 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/search_price.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/search_price.py @@ -1,7 +1,40 @@ +"""Search price lookup helper.""" + +from __future__ import annotations + +import time +import logging from typing import Iterable, List, Optional, Tuple from . import client_lib, paths, utils +bk_logger = logging.getLogger(__name__) + +# Simple in-memory cache to avoid repeated price lookups per version UUID. +# TTL keeps cache fresh-ish while drastically reducing chatter on paged searches. +_PRICE_CACHE: dict[str, tuple[float, dict]] = {} +_PRICE_CACHE_TTL_SEC = 300.0 # 5 minutes is plenty for session-level reuse + + +def _cache_get(uuid: str) -> Optional[dict]: + entry = _PRICE_CACHE.get(uuid) + if not entry: + return None + ts, payload = entry + if time.perf_counter() - ts > _PRICE_CACHE_TTL_SEC: + _PRICE_CACHE.pop(uuid, None) + return None + return payload + + +def _cache_put(uuid: str, payload: dict) -> None: + _PRICE_CACHE[uuid] = (time.perf_counter(), payload) + + +def clear_price_cache() -> None: + """Clear cached price responses (e.g. on login/logout/user switch).""" + _PRICE_CACHE.clear() + def _normalize_version_uuid_list(values: Optional[Iterable[str]]) -> List[str]: if values is None: @@ -21,7 +54,7 @@ def query_user_price( version_uuids: list[str] = [], page_size: int = 15, timeout: Tuple[float, float] = (1, 30), -) -> dict: +) -> list[dict]: """Return results for price lookup of multiple asset versions. The server endpoint now expects a POST body with `version_uuids`, so we keep @@ -36,22 +69,44 @@ def query_user_price( if page_size > 0: version_uuid_list = version_uuid_list[:page_size] - payload: dict = {"version_uuids": version_uuid_list} - - url = f"{paths.BLENDERKIT_API}/cart/request-price-bulk/" - - if not payload["version_uuids"]: + if not version_uuid_list: raise ValueError("No version UUIDs provided for price lookup.") - headers = utils.get_simple_headers() - headers.setdefault("Content-Type", "application/json") + # Pull cached entries first. + fresh_uuids: list[str] = [] + cached_results: list[dict] = [] + for vu in version_uuid_list: + cached = _cache_get(vu) + if cached is None: + fresh_uuids.append(vu) + else: + cached_results.append(cached) - response = client_lib.blocking_request( - url, - "POST", - headers, - json_data=payload, - timeout=timeout, - ) - search_results = response.json() - return search_results + fetched_results: list[dict] = [] + if fresh_uuids: + payload: dict = {"version_uuids": fresh_uuids} + url = f"{paths.BLENDERKIT_API}/cart/request-price-bulk/" + + headers = utils.get_simple_headers() + headers.setdefault("Content-Type", "application/json") + response = client_lib.blocking_request( + url, + "POST", + headers, + json_data=payload, + timeout=timeout, + ) + fetched_results = response.json() or [] + bk_logger.debug("Fetched price for %d version UUIDs", len(fetched_results)) + + for entry in fetched_results: + version_uuid = entry.get("versionUuid") + if not version_uuid: + continue + _cache_put(str(version_uuid), entry) + + # Merge cached + fetched for the caller; order doesn't matter. + merged = [] + merged.extend(cached_results) + merged.extend(fetched_results) + return merged diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/tasks_queue.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/tasks_queue.py index c6c25a4..3cbff6a 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/tasks_queue.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/tasks_queue.py @@ -50,7 +50,7 @@ class task_object: self, command="", arguments=(), - wait=0, + wait: float = 0, only_last=False, fake_context=False, fake_context_area="VIEW_3D", @@ -65,7 +65,7 @@ class task_object: def add_task( task: Tuple, - wait=0, + wait: float = 0, only_last=False, fake_context=False, fake_context_area="VIEW_3D", @@ -122,8 +122,8 @@ def queue_worker(): task.wait -= time_step back_to_queue.append(task) else: - bk_logger.debug( - "task queue task:" + str(task.command) + str(task.arguments) + bk_logger.log( + 5, "task queue task: %s %s", task.command, task.arguments[10:] ) try: if task.fake_context: @@ -137,12 +137,11 @@ def queue_worker(): task.command(*task.arguments) else: task.command(*task.arguments) - except Exception as e: - bk_logger.error( - "task queue failed task:" - + str(task.command) - + str(task.arguments) - + str(e) + except Exception: + bk_logger.exception( + "task queue failed task: %s %s %s", + task.command, + task.arguments[10:], ) # bk_logger.exception('Got exception on main handler') # raise diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/thumbnails/asset_type_author.png b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/thumbnails/asset_type_author.png new file mode 100644 index 0000000..1d9bec3 --- /dev/null +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/thumbnails/asset_type_author.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7fb94c876d934fccf4a93dc711e220cf045e66197091d151d29b110f3a62efc +size 923 diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/timer.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/timer.py index 82ad34b..0ad2714 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/timer.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/timer.py @@ -19,6 +19,7 @@ import logging import os import queue +import time import requests import bpy @@ -49,7 +50,7 @@ bk_logger = logging.getLogger(__name__) reports_queue: queue.Queue = queue.Queue() pending_tasks = ( list() -) # pending tasks are tasks that were not parsed correclty and should be tried to be parsed later. +) # pending tasks are tasks that were not parsed correctly and should be tried to be parsed later. def handle_failed_reports(exception: Exception) -> float: @@ -133,6 +134,7 @@ def client_communication_timer(): results = client_lib.get_reports(os.getpid()) global_vars.CLIENT_FAILED_REPORTS = 0 except Exception as e: + download.prune_stalled_downloads(now=time.monotonic()) return handle_failed_reports(e) if global_vars.CLIENT_ACCESSIBLE is False: @@ -168,6 +170,7 @@ def client_communication_timer(): for task in results_converted_tasks: handle_task(task) + download.prune_stalled_downloads(now=time.monotonic()) bk_logger.log(5, "Task handling finished") delay = user_preferences.client_polling if len(download.download_tasks) > 0: @@ -201,8 +204,8 @@ def save_prefs_cancel_all_tasks_and_restart_client(user_preferences, context): try: cancel_all_tasks(user_preferences, context) client_lib.shutdown_client() - except Exception as e: - bk_logger.warning(str(e)) + except Exception: + bk_logger.exception("Error shutting down client") client_lib.reorder_ports( user_preferences.client_port @@ -233,7 +236,7 @@ def cancel_all_tasks(self, context): """Cancel all tasks.""" global pending_tasks pending_tasks.clear() - download.clear_downloads() + download.cancel_running_downloads("cancel all tasks") search.clear_searches() # TODO: should add uploads @@ -257,7 +260,7 @@ def task_error_overdrive(task: client_tasks.Task) -> None: def handle_task(task: client_tasks.Task): - """Handle incomming task information. Sort tasks by type and call apropriate functions.""" + """Handle incoming task information. Sort tasks by type and call appropriate functions.""" if task.status == "error": task_error_overdrive(task) @@ -349,7 +352,7 @@ def handle_task(task: client_tasks.Task): # HANDLE MESSAGE FROM CLIENT if ( - task.task_type == "message_from_daemon" # TODO: depracate message_from_daemon + task.task_type == "message_from_daemon" # TODO: deprecate message_from_daemon or task.task_type == "message_from_client" ): level = task.result.get("level", "INFO").upper() diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ui.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ui.py index 6970c27..efc6a8a 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ui.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ui.py @@ -23,7 +23,7 @@ from typing import Any import bpy from bpy.props import BoolProperty, FloatVectorProperty, IntProperty, StringProperty -from . import colors, global_vars, paths, search, ui_bgl, utils +from . import colors, global_vars, keymap_utils, paths, search, ui_bgl, utils draw_time = 0 @@ -103,41 +103,63 @@ def get_large_thumbnail_image(asset_data): return img -def get_full_photo_thumbnail(asset_data): - """Get full photo thumbnail from asset data. This is different from the large thumbnail - as the photo_thumbnails are not available on the asset data root, but inside the files[]. - We need to get the data from files[] where assetType=='photo_thumbnail'.""" - # Find the photo thumbnail file - photo_file = None +def get_full_thumbnail_variant(asset_data, variant: str): + """Get full thumbnail variant from asset data. + + Args: + asset_data: The asset data dictionary. + variant (str): The variant type to retrieve ('photo' or 'wire'). + Returns: + The Blender image object for the requested variant, or None if not found. + """ + # Find the file corresponding to the requested variant + file_data = None for file in asset_data.get("files", []): - if file.get("fileType") == "photo_thumbnail": - photo_file = file + if file.get("fileType") == f"{variant.lower()}_thumbnail": + file_data = file break - if photo_file is None: - bk_logger.warning("No photo thumbnail file found in asset data") + if file_data is None: + bk_logger.log(1, f"No {variant} thumbnail file found in asset data") return None - photo_url = photo_file.get("thumbnailMiddleUrl") - if photo_url is None: - bk_logger.warning("No thumbnail URL found in photo file") + file_url = file_data.get("thumbnailMiddleUrl") + if file_url is None: + bk_logger.warning(f"No thumbnail URL found in {variant} file") return None # Get the directory and construct the path ui_props = bpy.context.window_manager.blenderkitUI directory = paths.get_temp_dir(f"{ui_props.asset_type.lower()}_search") - photo_name = os.path.basename(photo_url) - tpath = os.path.join(directory, photo_name) + file_name = os.path.basename(file_url) + tpath = os.path.join(directory, file_name) # Load the image into Blender if os.path.exists(tpath): - img = utils.get_hidden_image(tpath, photo_name, colorspace="") + img = utils.get_hidden_image(tpath, file_name, colorspace="") + bk_logger.debug(f"{variant} thumbnail loaded from path: {tpath}") return img - bk_logger.info(f"Photo thumbnail file not found at path: {tpath}") + bk_logger.info("Thumbnail file not found at path: %s", tpath) return None +def get_full_photo_thumbnail(asset_data): + """Get full photo thumbnail from asset data. This is different from the large thumbnail + as the photo_thumbnails are not available on the asset data root, but inside the files[]. + We need to get the data from files[] where assetType=='photo_thumbnail'.""" + # Find the photo thumbnail file + thumb = get_full_thumbnail_variant(asset_data, "photo") + return thumb + + +def get_full_wire_thumbnail(asset_data): + """Get full wireframe thumbnail from asset data.""" + # Find the photo thumbnail file + thumb = get_full_thumbnail_variant(asset_data, "wire") + return thumb + + def is_rating_possible() -> tuple[bool, bool, Any, Any]: # TODO remove this, but first check and reuse the code for new rating system... ao = bpy.context.active_object @@ -472,9 +494,6 @@ classes = ( ParticlesDropDialog, ) -# store keymap items here to access after registration -addon_keymapitems = [] - # @persistent def pre_load(context): @@ -490,32 +509,7 @@ def register_ui(): for c in classes: bpy.utils.register_class(c) - wm = bpy.context.window_manager - - # spaces solved by registering shortcut to Window. Couldn't register object mode before somehow. - if not wm.keyconfigs.addon: - return - km = wm.keyconfigs.addon.keymaps.new(name="Window", space_type="EMPTY") - # asset bar shortcut - kmi = km.keymap_items.new( - "view3d.run_assetbar_fix_context", - "SEMI_COLON", - "PRESS", - ctrl=False, - shift=False, - ) - kmi.properties.keep_running = False - kmi.properties.do_search = False - addon_keymapitems.append(kmi) - # fast rating shortcut - wm = bpy.context.window_manager - km = wm.keyconfigs.addon.keymaps["Window"] - kmi = km.keymap_items.new( - "wm.blenderkit_menu_rating_upload", "R", "PRESS", ctrl=False, shift=False - ) - addon_keymapitems.append(kmi) - # kmi = km.keymap_items.new(upload.FastMetadata.bl_idname, 'F', 'PRESS', ctrl=True, shift=False) - # addon_keymapitems.append(kmi) + keymap_utils.register_keymaps() def unregister_ui(): @@ -524,15 +518,4 @@ def unregister_ui(): for c in classes: bpy.utils.unregister_class(c) - wm = bpy.context.window_manager - if not wm.keyconfigs.addon: - return - - km = wm.keyconfigs.addon.keymaps.get("Window") - if km: - for kmi in addon_keymapitems: - try: - km.keymap_items.remove(kmi) - except: - pass - del addon_keymapitems[:] + keymap_utils.unregister_keymaps() diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ui_bgl.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ui_bgl.py index 6f6bb00..925c78b 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ui_bgl.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ui_bgl.py @@ -18,7 +18,12 @@ import os import logging +from collections.abc import Mapping +from contextlib import contextmanager from typing import Optional, Tuple, Union +import math + +from mathutils import Matrix import blf import bpy @@ -29,7 +34,6 @@ from gpu_extras.batch import batch_for_shader from .image_utils import IMG - bk_logger = logging.getLogger(__name__) cached_images = {} @@ -38,6 +42,83 @@ cached_gpu_textures = {} _cached_image_shader: Optional[gpu.types.GPUShader] = None +SEGMENTS_DEFAULT = 4 + + +def _resolve_region_dimensions(region) -> Tuple[float, float]: + width = getattr(region, "width", None) if region else None + height = getattr(region, "height", None) if region else None + + if width is None or width <= 0 or height is None or height <= 0: + ctx_region = getattr(bpy.context, "region", None) + if ctx_region is not None: + width = width or getattr(ctx_region, "width", None) + height = height or getattr(ctx_region, "height", None) + + width = float(width or 1.0) + height = float(height or 1.0) + return width, height + + +@contextmanager +def overlay_matrix_guard(region=None, *args, **kwargs): + """Ensure viewport overlays draw in screen space regardless of other handlers.""" + + pushed = False + try: + try: + gpu.matrix.push() + pushed = True + gpu.matrix.load_identity() + width, height = _resolve_region_dimensions(region) + _set_overlay_projection(width, height) + except Exception: # noqa: BLE001 + bk_logger.exception("Failed to prepare overlay matrix state") + yield + finally: + if pushed: + try: + gpu.matrix.pop() + except Exception: # noqa: BLE001 + bk_logger.exception("Failed to restore overlay matrix state") + + +def _ortho_projection_matrix(width: float, height: float, *, near=-100.0, far=100.0): + """Return a pixel-aligned orthographic projection matrix.""" + + if width <= 0.0: + width = 1.0 + if height <= 0.0: + height = 1.0 + if far == near: + far = near + 0.001 + + sx = 2.0 / width + sy = 2.0 / height + sz = -2.0 / (far - near) + tx = -1.0 + ty = -1.0 + tz = -(far + near) / (far - near) + + return Matrix( + ( + (sx, 0.0, 0.0, tx), + (0.0, sy, 0.0, ty), + (0.0, 0.0, sz, tz), + (0.0, 0.0, 0.0, 1.0), + ) + ) + + +def _set_overlay_projection(width: float, height: float): + """Set the 2D projection matrix used by BlenderKit overlays.""" + + try: + projection = _ortho_projection_matrix(width, height) + gpu.matrix.load_projection_matrix(projection) + except Exception: # noqa: BLE001 + bk_logger.exception("overlay_matrix_guard: Failed to load projection matrix") + VERTEX_SHADER_LEGACY = """ uniform mat4 ModelViewProjectionMatrix; @@ -169,6 +250,34 @@ def create_image_shader(): return shader +def get_ui_scale() -> float: + """Get the UI scale + + Returns: + The UI scale factor as a float. + """ + return bpy.context.preferences.system.dpi / 96.0 + # sources: + # "sys" values are from system, + # and for current monitor on which the blender is running + sys_ps = bpy.context.preferences.system.pixel_size + # dpi scaling 72 =-> 1.0, 126 -> 1.75 (dpi -> sys_ui_scale) + # 96 / dpi gives correct scale factor + sys_dpi = bpy.context.preferences.system.dpi + # global scaler + sys_sc = bpy.context.preferences.system.ui_scale + # local ui scaler (can be set by user per blender window) + view_sc = bpy.context.preferences.view.ui_scale + + +def _get_flat_shader_2d(): + if app.version < (4, 0, 0): + shader_name = "2D_UNIFORM_COLOR" + else: + shader_name = "UNIFORM_COLOR" + return gpu.shader.from_builtin(shader_name) + + def draw_rect(x, y, width, height, color): """Used for drawing 2D rectangle backgrounds.""" xmax = x + width @@ -181,10 +290,7 @@ def draw_rect(x, y, width, height, color): ) indices = ((0, 1, 2), (2, 3, 0)) - if app.version < (4, 0, 0): - shader = gpu.shader.from_builtin("2D_UNIFORM_COLOR") - else: - shader = gpu.shader.from_builtin("UNIFORM_COLOR") + shader = _get_flat_shader_2d() batch = batch_for_shader(shader, "TRIS", {"pos": points}, indices=indices) gpu.state.blend_set("ALPHA") @@ -205,10 +311,7 @@ def draw_rect_outline(x, y, width, height, color, line_width=1.0): ) indices = ((0, 1), (1, 2), (2, 3), (3, 0)) - if app.version < (4, 0, 0): - shader = gpu.shader.from_builtin("2D_UNIFORM_COLOR") - else: - shader = gpu.shader.from_builtin("UNIFORM_COLOR") + shader = _get_flat_shader_2d() batch = batch_for_shader(shader, "LINES", {"pos": coords}, indices=indices) gpu.state.blend_set("ALPHA") @@ -223,19 +326,286 @@ def draw_line2d(x1, y1, x2, y2, width, color): coords = ((x1, y1), (x2, y2)) indices = ((0, 1),) - if app.version < (4, 0, 0): - shader = gpu.shader.from_builtin("2D_UNIFORM_COLOR") - elif app.version < (4, 5, 0): - shader = gpu.shader.from_builtin("UNIFORM_COLOR") - else: - shader_info = create_shader_info() - shader = gpu.shader.create_from_info(shader_info) + shader = _get_flat_shader_2d() batch = batch_for_shader(shader, "LINES", {"pos": coords}, indices=indices) gpu.state.blend_set("ALPHA") + gpu.state.line_width_set(max(1.0, width)) shader.bind() shader.uniform_float("color", color) batch.draw(shader) + gpu.state.line_width_set(1.0) + + +def _parse_radius_value( + value, + *, + max_radius: float, + min_dimension: float, + ui_scale: float = 1.0, +) -> float: + """Return a clamped radius in pixels. + + Accepts raw pixel values, strings with percentages (e.g. "50%"), + mapping types containing ``percent``/``pct``/``ratio`` or ``px`` keys, + and falls back to treating anything else as raw pixels. + """ + + def clamp_radius(radius: float) -> float: + return max(0.0, min(radius, max_radius)) + + effective_scale = ui_scale if ui_scale > 0.0 else 1.0 + + def scale_px_value(px_value: float) -> float: + return clamp_radius(px_value * effective_scale) + + if isinstance(value, str): + text = value.strip() + if text.endswith("%"): + number = text[:-1].strip() + try: + pct = float(number) / 100.0 + except ValueError: + return 0.0 + radius_px = pct * min_dimension + return clamp_radius(radius_px) + # plain numeric string interpreted as pixels + try: + value = float(text) + except ValueError: + return 0.0 + return scale_px_value(value) + + if isinstance(value, Mapping): + if "percent" in value: + try: + pct = float(value["percent"]) / 100.0 + except (TypeError, ValueError): + pct = 0.0 + radius_px = pct * min_dimension + return clamp_radius(radius_px) + if "pct" in value: + try: + pct = float(value["pct"]) / 100.0 + except (TypeError, ValueError): + pct = 0.0 + radius_px = pct * min_dimension + return clamp_radius(radius_px) + if "ratio" in value: + try: + ratio = float(value["ratio"]) + except (TypeError, ValueError): + ratio = 0.0 + radius_px = ratio * min_dimension + return clamp_radius(radius_px) + if "px" in value: + try: + px_value = float(value["px"]) + except (TypeError, ValueError): + px_value = 0.0 + return scale_px_value(px_value) + + try: + numeric_value = float(value) # type: ignore + except (TypeError, ValueError): + numeric_value = 0.0 + return scale_px_value(numeric_value) + + +def _rounded_rect_outline( + x: float, + y: float, + width: float, + height: float, + radius: Union[tuple[Union[str, float], ...], str, float] = (0.0,), + segments: int = SEGMENTS_DEFAULT, +): + if width <= 0 or height <= 0: + return [] + min_dimension = min(width, height) + max_radius = max(0.0, min_dimension / 2.0) + + if isinstance(radius, (tuple, list)): + raw_radii = list(radius) + else: + raw_radii = [radius] + if not raw_radii: + raw_radii = [0.0] + ui_scale = get_ui_scale() + parsed_radii = [ + _parse_radius_value( + value, + max_radius=max_radius, + min_dimension=min_dimension, + ui_scale=ui_scale, + ) + for value in raw_radii + ] + while len(parsed_radii) < 4: + parsed_radii.append(parsed_radii[-1]) + radii = parsed_radii[:4] + + r_tl, r_tr, r_br, r_bl = radii + + if all(r == 0.0 for r in radii): + outline = [ + (x, y), + (x + width, y), + (x + width, y + height), + (x, y + height), + ] + outline.append(outline[0]) + return outline + + steps = max(1, int(segments)) + outline = [] + steps = max(1, int(segments)) + outline = [] + + def emit_corner(cx, cy, start_angle, end_angle, radius_value, fallback_point): + if radius_value <= 0.0: + outline.append(fallback_point) + return + for step in range(steps + 1): + t = step / steps + angle = start_angle + (end_angle - start_angle) * t + outline.append( + ( + cx + math.cos(angle) * radius_value, + cy + math.sin(angle) * radius_value, + ) + ) + + emit_corner( + x + r_tl, + y + height - r_tl, + math.pi, + math.pi / 2.0, + r_tl, + (x, y + height), + ) + emit_corner( + x + width - r_tr, + y + height - r_tr, + math.pi / 2.0, + 0.0, + r_tr, + (x + width, y + height), + ) + emit_corner( + x + width - r_br, + y + r_br, + 0.0, + -math.pi / 2.0, + r_br, + (x + width, y), + ) + emit_corner( + x + r_bl, + y + r_bl, + -math.pi / 2.0, + -math.pi, + r_bl, + (x, y), + ) + + if outline and outline[0] != outline[-1]: + outline.append(outline[0]) + return outline + + +def _rounded_rect_mesh( + x: float, + y: float, + width: float, + height: float, + radius: Union[tuple[Union[str, float], ...], str, float], + crop: Tuple[float, float, float, float], + segments: int = SEGMENTS_DEFAULT, +): + if width <= 0.0 or height <= 0.0: + return None + outline = _rounded_rect_outline( + x, + y, + width, + height, + radius, + segments=segments, + ) + if not outline: + return None + loop = outline[:-1] if len(outline) > 1 and outline[0] == outline[-1] else outline + if len(loop) < 3: + return None + crop_u0, crop_v0, crop_u1, crop_v1 = crop + u_span = crop_u1 - crop_u0 + v_span = crop_v1 - crop_v0 + if u_span == 0.0: + u_span = 1.0 + if v_span == 0.0: + v_span = 1.0 + coords = list(loop) + try: + inv_width = 1.0 / width + except ZeroDivisionError: + inv_width = 0.0 + try: + inv_height = 1.0 / height + except ZeroDivisionError: + inv_height = 0.0 + uvs = [] + for vx, vy in coords: + rel_x = (vx - x) * inv_width + rel_y = (vy - y) * inv_height + u = crop_u0 + rel_x * u_span + v = crop_v0 + rel_y * v_span + uvs.append((u, v)) + indices = [(0, idx, idx + 1) for idx in range(1, len(coords) - 1)] + return coords, uvs, indices + + +def draw_rounded_rect_with_border( + x: float, + y: float, + width: float, + height: float, + radius: Union[tuple[Union[str, float], ...], str, float] = (0.0,), + fill_color: Tuple[float, float, float, float] = (0.0, 0.0, 0.0, 1.0), + border_color: Optional[Tuple[float, float, float, float]] = None, + border_thickness: float = 1.0, +): + if width <= 0 or height <= 0: + return + outline = _rounded_rect_outline(x, y, width, height, radius) + if not outline: + return + loop = outline[:-1] if len(outline) > 1 and outline[0] == outline[-1] else outline + if len(loop) < 3: + return + shader = _get_flat_shader_2d() + indices = [(0, idx, idx + 1) for idx in range(1, len(loop) - 1)] + batch = batch_for_shader(shader, "TRIS", {"pos": loop}, indices=indices) + gpu.state.blend_set("ALPHA") + shader.bind() + shader.uniform_float("color", fill_color) + batch.draw(shader) + if border_color and border_thickness > 0: + gpu.state.line_width_set(border_thickness) + if outline[0] == outline[-1]: + line_points = outline + else: + line_points = outline + [outline[0]] + line_batch = batch_for_shader(shader, "LINE_STRIP", {"pos": line_points}) + shader.uniform_float("color", border_color) + line_batch.draw(shader) + gpu.state.line_width_set(1.0) + + +def draw_strikethrough_line(x_start, x_end, y, color, thickness): + if x_end <= x_start: + return + draw_line2d(x_start, y, x_end, y, thickness, color) def create_shader_info(): @@ -325,80 +695,101 @@ def draw_image_runtime( transparency: Optional[float] = 1.0, crop: Tuple[float, float, float, float] = (0, 0, 1, 1), batch: Optional[gpu.types.GPUBatch] = None, + corner_radius: Optional[Union[tuple[Union[str, float], ...], str, float]] = None, + corner_segments: int = SEGMENTS_DEFAULT, ) -> Optional[gpu.types.GPUBatch]: """Draws an image at given location with given size. + Supports optional rounded corner clipping by supplying ``corner_radius``. + Returns: The batch object if successful, or None if the image is invalid. """ - if not image.name or not image.filepath: + if width <= 0.0 or height <= 0.0 or not image.name or not image.filepath: return None image_shader = create_image_shader() + rounded_segments = max(1, int(corner_segments)) + cache_key = ( + image.filepath, + float(x), + float(y), + float(width), + float(height), + tuple(float(component) for component in crop), + repr(corner_radius) if corner_radius is not None else None, + rounded_segments, + ) texture = None - ci = cached_images.get(image.filepath + "GPU_TEXTURE") - if ci is not None: - if ( - ci["x"] == x - and ci["y"] == y - and ci["width"] == width - and ci["height"] == height - ): + if batch is None: + ci = cached_images.get(cache_key) + if ci is not None: batch = ci["batch"] image_shader = ci["image_shader"] texture = ci["texture"] - if not batch: - coords = [(x, y), (x + width, y), (x, y + height), (x + width, y + height)] - - uvs = [ - (crop[0], crop[1]), - (crop[2], crop[1]), - (crop[0], crop[3]), - (crop[2], crop[3]), - ] - - indices = [(0, 1, 2), (2, 1, 3)] - + if batch is None: + coords = None + uvs = None + indices = None + if corner_radius is not None: + mesh_data = _rounded_rect_mesh( + x, + y, + width, + height, + corner_radius, + crop, + rounded_segments, + ) + if mesh_data: + coords, uvs, indices = mesh_data + if coords is None or uvs is None or indices is None: + coords = [(x, y), (x + width, y), (x, y + height), (x + width, y + height)] + uvs = [ + (crop[0], crop[1]), + (crop[2], crop[1]), + (crop[0], crop[3]), + (crop[2], crop[3]), + ] + indices = [(0, 1, 2), (2, 1, 3)] batch = batch_for_shader( image_shader, "TRIS", {"pos": coords, "texCoord": uvs}, indices=indices ) - texture = path_to_gpu_texture(image.filepath) - - # tell shader to use the image that is bound to image unit 0 - cached_images[image.filepath + "GPU_TEXTURE"] = { - "x": x, - "y": y, - "width": width, - "height": height, + cached_images[cache_key] = { "batch": batch, "image_shader": image_shader, "texture": texture, } - if batch is None: + if batch is None or image_shader is None: return None - if image_shader and texture: - color_space_mode = _resolve_color_space_mode() + if texture is None: + texture = path_to_gpu_texture(image.filepath) - gpu.state.blend_set("ALPHA") + if texture is None: + return None - image_shader.bind() - image_shader.uniform_sampler("image", texture) + color_space_mode = _resolve_color_space_mode() - # may not be available in simple shader - try: - # set floats - image_shader.uniform_float("transparency", transparency) + gpu.state.blend_set("ALPHA") - # set color space mode - image_shader.uniform_int("color_space_mode", color_space_mode) - batch.draw(image_shader) - except Exception: - pass + image_shader.bind() + image_shader.uniform_sampler("image", texture) + + # may not be available in simple shader + try: + # set floats + image_shader.uniform_float("transparency", transparency) + + # set color space mode + image_shader.uniform_int("color_space_mode", color_space_mode) + batch.draw(image_shader) + except Exception: + pass return batch @@ -427,7 +818,9 @@ def path_to_gpu_texture(path: str) -> Optional[gpu.types.GPUTexture]: return tex -def get_text_size(font_id=0, text="", text_size=16, dpi=72): +def get_text_size( + font_id: int = 0, text: str = "", text_size: float = 16, dpi: int = 72 +): if app.version < (4, 0, 0): blf.size(font_id, text_size, dpi) else: diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ui_panels.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ui_panels.py index 15ca49d..36bc6ee 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ui_panels.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/ui_panels.py @@ -16,14 +16,21 @@ # # ##### END GPL LICENSE BLOCK ##### +from __future__ import annotations + import logging import os +import platform import random +import sys +import textwrap import time +from typing import Any +from urllib.parse import quote from webbrowser import open_new_tab import bpy -from bpy.props import IntProperty, StringProperty, FloatVectorProperty, EnumProperty +from bpy.props import EnumProperty, FloatVectorProperty, IntProperty, StringProperty from bpy.types import Context, Menu, Panel, UILayout from . import ( @@ -37,6 +44,8 @@ from . import ( download, global_vars, icons, + image_utils, + keymap_utils, paths, ratings, ratings_utils, @@ -46,11 +55,21 @@ from . import ( utils, ) - ACCEPTABLE_ENGINES = ("CYCLES", "BLENDER_EEVEE", "BLENDER_EEVEE_NEXT") bk_logger = logging.getLogger(__name__) +# Maximum length for manufacturer labels before truncation (e.g. "Ford motor company") +MAX_MANUFACTURER_LABEL_LEN = 17 + +INVALID_TOKENS = { + "me", + "unknown", + "self", + "none", + "n/a", +} + last_time_overlay_panel_active = 0.0 @@ -173,6 +192,11 @@ def draw_upload_common(layout, props, asset_type, context): layout.prop(props, "license") layout.prop(props, "is_free", expand=True) + # row = layout.row() + # # Lock verification status editing in UI for all users; shown for info only. + # row.enabled = False + # row.prop(props, "verification_status", expand=True) + prop_needed(layout, props, "name", props.name) if props.is_private == "PUBLIC": prop_needed(layout, props, "description", props.description) @@ -182,7 +206,7 @@ def draw_upload_common(layout, props, asset_type, context): layout.prop(props, "tags") -def prop_needed(layout, props, name, value="", is_not_filled=""): +def prop_needed(layout, props, name, value: Any = "", is_not_filled: Any = ""): row = layout.row() if value == is_not_filled: # row.label(text='', icon = 'ERROR') @@ -196,12 +220,84 @@ def prop_needed(layout, props, name, value="", is_not_filled=""): row.prop(props, name) +class BLENDERKIT_OT_show_validation_popup(bpy.types.Operator): + bl_idname = "wm.blenderkit_show_validation_popup" + bl_label = "Manufacturer Validation Result" + bl_options = {"REGISTER", "INTERNAL"} + + message: StringProperty(name="Message", default="", options={"SKIP_SAVE"}) # type: ignore + + def invoke(self, context, event): + # Ensure we always have something to show so the dialog renders on older Blender versions. + if not self.message: + self.message = "No validation output available." + return context.window_manager.invoke_props_dialog(self, width=500) + + def execute(self, context): + # The dialog is read-only; nothing to execute beyond closing it. + return {"FINISHED"} + + def draw(self, context): + layout = self.layout + clean_text = self.message.replace("\r\n", "\n").replace("\r", "\n") + # Keep rendering even if the text is short or empty. + if not clean_text.strip(): + layout.label(text="No validation output available.") + return + + for paragraph in clean_text.split("\n"): + utils.label_multiline(layout, text=paragraph, width=480) + + +def draw_validated_manufacturer( + layout: bpy.types.UILayout, asset: Any, props: Any = None +) -> None: + """Show manufacturer validation output when present on an asset's dictParameters.""" + if asset is None: + return + + asset_data = None + try: + if hasattr(asset, "get"): + asset_data = asset.get("asset_data") + except Exception: + asset_data = None + + if asset_data is None: + asset_data = getattr(asset, "asset_data", None) + + if not asset_data: + return + + validated_output = asset_data.get("dictParameters", {}).get( + "validatedManufacturerOutput" + ) + if not validated_output: + return + + box = layout.box() + row = box.row(align=True) + row.label(text="Manufacturer validation", icon="ERROR") + row.operator_context = "INVOKE_DEFAULT" + op = row.operator( + "wm.blenderkit_show_validation_popup", + text="Show result", + icon="VIEWZOOM", + emboss=True, + ) + op.message = str(validated_output) + + def draw_panel_hdr_upload(self, context): layout = self.layout ui_props = bpy.context.window_manager.blenderkitUI layout.prop(ui_props, "hdr_upload_image") + tone_box = layout.box() + tone_box.label(text="Thumbnail Conversion", icon="IMAGE_RGB") + tone_box.prop(ui_props, "hdr_use_custom_thumbnail_tone") + hdr = utils.get_active_HDR() if hdr is not None: @@ -239,6 +335,19 @@ def draw_panel_addon_search(self, context): utils.label_multiline(layout, text=addon_props.report) +def draw_panel_author_search(self, context): + wm = context.window_manager + ui_props = wm.blenderkitUI + author_props = wm.blenderkit_author + + layout = self.layout + row = layout.row() + row.prop(ui_props, "search_keywords", text="", icon="VIEWZOOM") + draw_assetbar_show_hide(row, author_props) + + utils.label_multiline(layout, text=author_props.report) + + def draw_panel_nodegroup_upload(self, context): layout = self.layout ui_props = bpy.context.window_manager.blenderkitUI @@ -296,6 +405,14 @@ def draw_thumbnail_upload_panel(layout, props): box.template_icon(icon_value=tex.image.preview.icon_id, scale=6.0) +def draw_wire_thumbnail_upload_panel(layout, props): + tex = autothumb.get_texture_ui(props.wire_thumbnail, ".upload_preview_wire") + if not tex or not tex.image: + return + box = layout.box() + box.template_icon(icon_value=tex.image.preview.icon_id, scale=6.0) + + def draw_panel_model_upload(self, context): """Draw upload panel for model and printable assets""" ob = utils.get_active_model() @@ -325,12 +442,34 @@ def draw_panel_model_upload(self, context): prop_needed(col, props, "thumbnail", props.thumbnail) if bpy.context.scene.render.engine in ACCEPTABLE_ENGINES: - col.operator( + col.operator_context = "INVOKE_DEFAULT" + op = col.operator( "object.blenderkit_generate_thumbnail", text="Generate thumbnail", icon="IMAGE", ) + # DISABLED WIRE THUMBNAIL FOR NOW + # TODO: re-enable later, when the shaders are fixed for it. + user_preferences = bpy.context.preferences.addons[__package__].preferences + wire_upload_enabled = getattr( + user_preferences, "enable_wire_thumbnail_upload", False + ) + if wire_upload_enabled: + layout.prop(props, "wire_thumbnail_will_upload_on_website") + if not props.wire_thumbnail_will_upload_on_website: + draw_wire_thumbnail_upload_panel(layout, props) + col = layout.column() + if getattr(props, "is_generating_wire_thumbnail", False): + col.enabled = False + prop_needed(col, props, "wire_thumbnail", props.wire_thumbnail) + if bpy.context.scene.render.engine in ACCEPTABLE_ENGINES: + col.operator( + "object.blenderkit_generate_wireframe_thumbnail", + text="Generate wire thumbnail", + icon="IMAGE", + ) + if props.is_generating_thumbnail: row = layout.row(align=True) row.label(text=props.thumbnail_generating_state) @@ -340,6 +479,17 @@ def draw_panel_model_upload(self, context): elif props.thumbnail_generating_state != "": utils.label_multiline(layout, text=props.thumbnail_generating_state) + # must be experimental feature enabled + if wire_upload_enabled: + if getattr(props, "is_generating_wire_thumbnail", False): + row = layout.row(align=True) + row.label(text=props.wire_thumbnail_generating_state) + op = row.operator("object.kill_bg_process", text="", icon="CANCEL") + op.process_source = asset_type + op.process_type = "THUMBNAILER" + elif getattr(props, "wire_thumbnail_generating_state", "") != "": + utils.label_multiline(layout, text=props.wire_thumbnail_generating_state) + # Only show these properties for MODEL type if asset_type == "MODEL": layout.prop(props, "style") @@ -358,6 +508,9 @@ def draw_panel_model_upload(self, context): if props.use_design_year: design_box.prop(props, "design_year") + # Show manufacturer validation feedback when available on the asset. + draw_validated_manufacturer(design_box, ob) + row = layout.row() row.prop(props, "work_hours") @@ -397,6 +550,20 @@ def draw_panel_scene_upload(self, context): # if bpy.context.scene.render.engine == 'CYCLES': # col.operator("object.blenderkit_generate_thumbnail", text='Generate thumbnail', icon='IMAGE_COL') + # # DISABLED WIRE THUMBNAIL FOR NOW + # # TODO: re-enable later, when the shaders are fixed for it. + # layout.prop(props, "wire_thumbnail_will_upload_on_website") + # if not props.wire_thumbnail_will_upload_on_website: + # draw_wire_thumbnail_upload_panel(layout, props) + # col = layout.column() + # prop_needed(col, props, "wire_thumbnail", props.wire_thumbnail) + # if bpy.context.scene.render.engine in ACCEPTABLE_ENGINES: + # col.operator( + # "object.blenderkit_generate_wireframe_thumbnail", + # text="Generate wire thumbnail", + # icon="IMAGE", + # ) + # row = layout.row(align=True) # if props.is_generating_thumbnail: # row = layout.row(align=True) @@ -413,6 +580,7 @@ def draw_panel_scene_upload(self, context): if props.use_design_year: layout.prop(props, "design_year") layout.prop(props, "condition") + draw_validated_manufacturer(layout, s) row = layout.row() row.prop(props, "work_hours") @@ -421,12 +589,17 @@ def draw_assetbar_show_hide(layout, props): s = bpy.context.scene ui_props = bpy.context.window_manager.blenderkitUI + shortcut = keymap_utils.get_shortcut_label( + "view3d.run_assetbar_fix_context", fallback="" + ) + shortcut_hint = f"\nShortcut: {shortcut}" if shortcut else "" + if ui_props.assetbar_on: icon = "HIDE_OFF" - ttip = "Click to Hide Asset Bar.\nShortcut: ;" + ttip = f"Click to Hide Asset Bar.{shortcut_hint}" else: icon = "HIDE_ON" - ttip = "Click to Show Asset Bar.\nShortcut: ;" + ttip = f"Click to Show Asset Bar.{shortcut_hint}" op = layout.operator("view3d.blenderkit_asset_bar_widget", text="", icon=icon) op.keep_running = False @@ -474,15 +647,14 @@ def draw_model_context_menu(self, context): o = utils.get_active_model() if not o: return - if o.get("asset_data") is None: + ad = utils.get_asset_data_from_ob(o) + if ad is None: utils.label_multiline( layout, text="To upload this asset to BlenderKit, go to the Find and Upload Assets panel.", ) layout.prop(o, "name") - - if o.get("asset_data") is not None: - ad = o["asset_data"] + else: layout.label(text=str(ad["name"])) if o.instance_type == "COLLECTION" and o.instance_collection is not None: layout.operator("object.blenderkit_bring_to_scene", text="Bring to scene") @@ -1228,6 +1400,8 @@ def draw_panel_material_upload(self, context): layout.prop(props, "animated") layout.prop(props, "texture_size_meters") + draw_validated_manufacturer(layout, mat) + # tname = "." + bpy.context.active_object.active_material.name + "_thumbnail" # if props.has_thumbnail and bpy.data.textures.get(tname) is not None: # row = layout.row() @@ -1265,6 +1439,10 @@ def draw_panel_brush_upload(self, context): draw_upload_common(layout, props, "BRUSH", context) + col = layout.column() + draw_thumbnail_upload_panel(col, props) + prop_needed(col, props, "thumbnail", props.thumbnail) + def draw_panel_brush_search(self, context): wm = context.window_manager @@ -1326,6 +1504,64 @@ class OpenBlenderKitDiscord(bpy.types.Operator): return {"FINISHED"} +def get_environment_info() -> str: + """Get formatted environment info for bug reports and clipboard.""" + ver = global_vars.VERSION + addon_ver = f"{ver[0]}.{ver[1]}.{ver[2]}.{ver[3]}" + blender_ver = bpy.app.version_string + os_info = f"{platform.system()} {platform.release()} ({platform.machine()})" + user_preferences = bpy.context.preferences.addons[__package__].preferences + proxy = user_preferences.proxy_which + python_ver = ( + f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}" + ) + return ( + f"- BlenderKit version: v{addon_ver}\n" + f"- Blender version: v{blender_ver} (from: )\n" + f"- Python version: {python_ver}\n" + f"- Operating system & architecture: {os_info}\n" + f"- Proxy setting: {proxy}\n" + f"- Using VPN, proxy, or firewall? " + ) + + +class CopyEnvironmentInfo(bpy.types.Operator): + """Copy BlenderKit and Blender version information to clipboard""" + + bl_idname = "wm.blenderkit_copy_environment_info" + bl_label = "Copy Environment Info" + + def execute(self, context): + context.window_manager.clipboard = get_environment_info() + self.report({"INFO"}, "Environment info copied to clipboard") + return {"FINISHED"} + + +def get_report_bug_url() -> str: + """Build GitHub issue URL with pre-filled environment information.""" + env_info = get_environment_info() + description_body = ( + f"When I...\n\n### Environment Information - Bug happens on:\n{env_info}" + ) + return ( + "https://github.com/BlenderKit/blenderkit/issues/new" + f"?template=bug-report.yaml" + f"&title={quote('BlenderKit bug: ')}" + f"&description={quote(description_body)}" + ) + + +class ReportBug(bpy.types.Operator): + """Open GitHub issue page with pre-filled environment information""" + + bl_idname = "wm.blenderkit_report_bug" + bl_label = "Report a Bug" + + def execute(self, context): + bpy.ops.wm.url_open(url=get_report_bug_url()) + return {"FINISHED"} + + class VIEW3D_PT_blenderkit_advanced_model_search(Panel): bl_category = "BlenderKit" bl_idname = "VIEW3D_PT_blenderkit_advanced_model_search" @@ -1605,6 +1841,27 @@ class VIEW3D_PT_blenderkit_advanced_addon_search(Panel): row.prop(addon_props, "search_installed", text="Installed Only") +class VIEW3D_PT_blenderkit_advanced_author_search(Panel): + bl_category = "BlenderKit" + bl_idname = "VIEW3D_PT_blenderkit_advanced_author_search" + bl_parent_id = "VIEW3D_PT_blenderkit_unified" + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + bl_label = "Search filters" + bl_options = {"DEFAULT_CLOSED"} + + @classmethod + def poll(cls, context): + ui_props = bpy.context.window_manager.blenderkitUI + if not global_vars.CLIENT_RUNNING: + return False + return ui_props.down_up == "SEARCH" and ui_props.asset_type == "AUTHOR" + + def draw(self, context): + ui_props = bpy.context.window_manager.blenderkitUI + draw_common_filters(self.layout, ui_props) + + class VIEW3D_PT_blenderkit_advanced_printable_search(Panel): bl_category = "BlenderKit" bl_idname = "VIEW3D_PT_blenderkit_advanced_printable_search" @@ -1716,8 +1973,19 @@ class VIEW3D_PT_blenderkit_import_settings(Panel): if ui_props.asset_type == "HDR": props = wm.blenderkit_HDR - if ui_props.asset_type in ["MATERIAL", "MODEL", "HDR"]: + if ui_props.asset_type in [ + "MATERIAL", + "MODEL", + "SCENE", + "PRINTABLE", + "NODEGROUP", + "MATERIAL", + "BRUSH", + ]: layout.prop(preferences, "unpack_files") + layout.prop(preferences, "write_asset_metadata") + layout.prop(preferences, "resolution") + elif ui_props.asset_type in ["HDR"]: layout.prop(preferences, "resolution") # layout.prop(props, 'unpack_files') @@ -1868,6 +2136,9 @@ class VIEW3D_PT_blenderkit_unified(Panel): if ui_props.asset_type == "ADDON": return draw_panel_addon_search(self, context) + if ui_props.asset_type == "AUTHOR": + return draw_panel_author_search(self, context) + def draw_upload(self, context, layout, ui_props): obj = utils.get_active_asset() props = getattr(obj, "blenderkit", None) @@ -1919,6 +2190,10 @@ class VIEW3D_PT_blenderkit_unified(Panel): op.url = paths.BLENDERKIT_ADDON_UPLOAD_INSTRUCTIONS_URL return + if ui_props.asset_type == "AUTHOR": + layout.label(text="Author profiles are search-only.") + return + class BlenderKitWelcomeOperator(bpy.types.Operator): """Login online on BlenderKit webpage""" @@ -2053,6 +2328,166 @@ class OpenTempDirectory(OpenSystemDirectory): bl_label = "Open temp directory" +class BLENDERKIT_OT_hdr_thumbnail_tune(bpy.types.Operator): + """Edit HDR thumbnail conversion settings with live preview.""" + + bl_idname = "wm.blenderkit_hdr_thumbnail_tune" + bl_label = "Edit Thumbnail Before Upload" + bl_options = {"REGISTER", "INTERNAL"} + + use_custom_tone: bpy.props.BoolProperty( # type: ignore[valid-type] + name="Use Custom Thumbnail Tone", + default=False, + ) + exposure: bpy.props.FloatProperty( # type: ignore[valid-type] + name="Exposure", + default=0.0, + min=-5.0, + max=5.0, + soft_min=-2.0, + soft_max=2.0, + precision=3, + step=1, + ) + gamma: bpy.props.FloatProperty( # type: ignore[valid-type] + name="Gamma", + default=1.0, + min=0.2, + max=3.0, + soft_min=0.7, + soft_max=1.6, + precision=3, + step=1, + ) + + _preview_image_prefix = "blenderkit_hdr_thumbnail_preview_" + _created_preview_names: set[str] = set() + preview_image_name: bpy.props.StringProperty( # type: ignore[valid-type] + name="Preview Image Name", + default="", + options={"SKIP_SAVE", "HIDDEN"}, + ) + _preview_error = "" + + trigger_upload: bpy.props.BoolProperty( # type: ignore[valid-type] + name="Trigger Upload", + default=False, + options={"SKIP_SAVE"}, + ) + upload_reupload: bpy.props.BoolProperty( # type: ignore[valid-type] + name="Reupload", + default=False, + options={"SKIP_SAVE"}, + ) + + @classmethod + def poll(cls, context): + ui_props = context.window_manager.blenderkitUI + return ui_props.hdr_upload_image is not None + + def _cleanup_preview_image(self): + # Cleanup only images created by this operator instance. + for name in list(self._created_preview_names): + img = bpy.data.images.get(name) + if img is None: + self._created_preview_names.discard(name) + continue + try: + bpy.data.images.remove(img) + except Exception: + pass + self._created_preview_names.discard(name) + + def _refresh_preview(self, context): + ui_props = context.window_manager.blenderkitUI + hdr_image = ui_props.hdr_upload_image + if hdr_image is None: + return + self._preview_error = "" + try: + preview_path = image_utils.generate_hdr_thumbnail_preview( + hdr_image=hdr_image, + use_custom_tone=self.use_custom_tone, + exposure=self.exposure, + gamma=self.gamma, + max_preview_size=512, + ) + preview_image = bpy.data.images.load(preview_path, check_existing=False) + preview_image.name = f"{self._preview_image_prefix}{time.time_ns()}" + preview_image.reload() + if hasattr(preview_image, "preview"): + preview_image.preview_ensure() + self.preview_image_name = preview_image.name + self._created_preview_names.add(preview_image.name) + except Exception as e: + self.preview_image_name = "" + self._preview_error = str(e) + + # Force dialog refresh in Blender 3.x/4.x where icon updates can lag. + if context.area is not None: + context.area.tag_redraw() + + def check(self, context): + self._refresh_preview(context) + return True + + def draw(self, context): + layout = self.layout + layout.prop(self, "use_custom_tone") + col = layout.column(align=True) + col.enabled = self.use_custom_tone + col.prop(self, "exposure") + col.prop(self, "gamma") + + preview_box = layout.box() + preview_box.label(text="Thumbnail Preview (live)", icon="IMAGE_DATA") + + preview_image = bpy.data.images.get(self.preview_image_name) + if preview_image is not None: + # Use preview icon rendering for reliable display in popup dialogs. + if hasattr(preview_image, "preview"): + preview_image.preview_ensure() + preview_box.template_icon( + icon_value=preview_image.preview.icon_id, + scale=14, + ) + elif self._preview_error: + preview_box.label( + text=f"Preview failed: {self._preview_error}", icon="ERROR" + ) + else: + preview_box.label(text="Preparing preview...", icon="TIME") + + def invoke(self, context, event): + ui_props = context.window_manager.blenderkitUI + self._cleanup_preview_image() + self.preview_image_name = "" + self.use_custom_tone = ui_props.hdr_use_custom_thumbnail_tone + self.exposure = ui_props.hdr_thumbnail_exposure + self.gamma = ui_props.hdr_thumbnail_gamma + self._refresh_preview(context) + return context.window_manager.invoke_props_dialog(self, width=560) + + def execute(self, context): + ui_props = context.window_manager.blenderkitUI + ui_props.hdr_use_custom_thumbnail_tone = self.use_custom_tone + ui_props.hdr_thumbnail_exposure = self.exposure + ui_props.hdr_thumbnail_gamma = self.gamma + self._cleanup_preview_image() + + if self.trigger_upload: + bpy.ops.object.blenderkit_upload( + "INVOKE_DEFAULT", + asset_type="HDR", + reupload=self.upload_reupload, + skip_hdr_tune_popup=True, + ) + return {"FINISHED"} + + def cancel(self, context): + self._cleanup_preview_image() + + def draw_asset_context_menu( layout, context: Context, asset_data: dict, from_panel: bool = False ): @@ -2060,7 +2495,7 @@ def draw_asset_context_menu( author_id = int(asset_data["author"].get("id")) layout.operator_context = "INVOKE_DEFAULT" - if utils.user_logged_in(): + if utils.user_logged_in() and asset_data.get("assetType") != "author": rating = ratings_utils.get_rating_local(asset_data["id"]) if rating is None: rating = datas.AssetRating() @@ -2077,7 +2512,7 @@ def draw_asset_context_menu( ) op.asset_id = asset_data["id"] - if from_panel: + if from_panel and asset_data.get("assetType") != "author": op = layout.operator( "wm.blenderkit_menu_rating_upload", text="Add Rating", icon="SOLO_ON" ) @@ -2297,6 +2732,17 @@ def draw_asset_context_menu( if utils.profile_is_validator(): layout.label(text="Dev Tools:") + # edit asset online < currently here for testing, + # this will soon be the main method to edit asset, + # locally we will only generate scene metadata + op = layout.operator( + "wm.blenderkit_url", + text="Edit Asset Online", + icon="GREASEPENCIL", + ) + op.url = f'{paths.BLENDERKIT_ASSETS_EDIT_URL}/{asset_data["assetBaseId"]}/' + + # output asset debug info to console, for easier diagnostics op = layout.operator( "object.blenderkit_print_asset_debug", text="Print asset debug" ) @@ -2441,6 +2887,13 @@ def label_or_url_or_operator( layout.label(text=text) +THUMBNAIL_MODE_ITEMS = [ + ("main", "Render", "Show the standard asset thumbnail", "IMAGE_DATA", 0), + ("photo", "Photo", "Show the photo reference thumbnail", "SCENE", 1), + ("wire", "Wire", "Show the wireframe thumbnail", "SHADING_WIRE", 2), +] + + class AssetPopupCard(bpy.types.Operator, ratings_utils.RatingProperties): """ This is the popup card that appears when you click on an asset in the asset bar. @@ -2452,6 +2905,14 @@ class AssetPopupCard(bpy.types.Operator, ratings_utils.RatingProperties): width = 800 + thumbnail_mode: EnumProperty( # type: ignore[valid-type] + name="Thumbnail Variant", + description="Choose which preview image to display", + items=THUMBNAIL_MODE_ITEMS, + default="main", + options={"SKIP_SAVE"}, + ) + @classmethod def poll(cls, context): return True @@ -2511,30 +2972,67 @@ class AssetPopupCard(bpy.types.Operator, ratings_utils.RatingProperties): parameter = utils.get_param(self.asset_data, key) if parameter == None: return + + # Keep search value unformatted so server queries stay clean. + search_value = parameter + display_value = parameter + if type(parameter) == int: if decimal: - parameter = f"{parameter:,d}" + display_value = f"{parameter:,d}" else: - parameter = f"{parameter}" + display_value = f"{parameter}" elif type(parameter) == float: - parameter = f"{parameter:,.1f}" + display_value = f"{parameter:,.1f}" + elif isinstance(parameter, str): + display_value = parameter.strip() + search_value = display_value + + if key == "manufacturer": + lowered = display_value.lower() + # quick sanity checks to avoid garbage manufacturers + is_url = ( + lowered.startswith(("http://", "https://", "www.")) + or "://" in lowered + ) + tokens = ( + lowered.replace(",", " ") + .replace("/", " ") + .replace("\\", " ") + .replace("|", " ") + .replace("-", " ") + .strip() + .split() + ) + has_invalid_token = any(t in INVALID_TOKENS for t in tokens) + + if is_url or has_invalid_token: + return + + if len(display_value) > MAX_MANUFACTURER_LABEL_LEN: + display_value = ( + display_value[: MAX_MANUFACTURER_LABEL_LEN - 3].rstrip() + "..." + ) + + display_value = str(display_value) + if do_search: kwargs = { "esc": True, - "keywords": f"+{key}:{parameter}", - "tooltip": f"search by {parameter}", + "keywords": f"+{key}:{search_value}", + "tooltip": f"search by {display_value}", } # search gets auto emboss self.draw_property( layout, pretext, - parameter, + display_value, operator="view3d.blenderkit_search", operator_kwargs=kwargs, emboss=True, ) else: - self.draw_property(layout, pretext, parameter) + self.draw_property(layout, pretext, display_value) def draw_description(self, layout, width=250): if len(self.asset_data["description"]) > 0: @@ -2607,6 +3105,7 @@ class AssetPopupCard(bpy.types.Operator, ratings_utils.RatingProperties): "deleted": "You deleted this asset", "validated": "Your asset passed our validation process, " "and is now available to BlenderKit users", + "ready": "Your asset is validated and ready to be used by everyone", } self.draw_property( box, @@ -2614,9 +3113,9 @@ class AssetPopupCard(bpy.types.Operator, ratings_utils.RatingProperties): self.asset_data["verificationStatus"], icon_value=icon.icon_id, url=f"{global_vars.SERVER}/docs/validation-status/", - tooltip=verification_status_tooltips[ - self.asset_data["verificationStatus"] - ], + tooltip=verification_status_tooltips.get( + self.asset_data["verificationStatus"], "unknown status" + ), ) # resolution/s resolution = utils.get_param(self.asset_data, "textureResolutionMax") @@ -2736,15 +3235,29 @@ class AssetPopupCard(bpy.types.Operator, ratings_utils.RatingProperties): if self.asset_data["isPrivate"]: text = "Private" self.draw_property(box, "Access", text, icon="LOCKED") + elif utils.profile_is_validator() and user_price and base_price: + text = f"${user_price} (was ${base_price})" + icon = pcoll["for_sale"] + self.draw_property( + box, + "Pricing (Validator)", + text, + icon_value=icon.icon_id, + ) + elif is_for_sale and not can_download and user_price and base_price: - text = f"${user_price} (Not purchased)" + if str(user_price) != str(base_price): + text = f"${user_price} (was ${base_price})" + else: + text = f"${base_price}" + text += " (Not purchased)" icon = pcoll["for_sale"] self.draw_property( box, "Price", text, icon_value=icon.icon_id, - tooltip="This addon is for sale but you haven't purchased it yet.\nPrice shown is your price / base price", + tooltip="This addon is for sale but you haven't purchased it yet.\nPrice shown is your discounted price / original price", ) elif is_for_sale and not can_download and base_price: text = f"${base_price} (Not purchased)" @@ -3049,29 +3562,71 @@ class AssetPopupCard(bpy.types.Operator, ratings_utils.RatingProperties): op.url = url # type: ignore[attr-defined] op.tooltip = f"Go to {social_network.name} profile" # type: ignore[attr-defined] + def _get_active_thumbnail(self): + mode = getattr(self, "thumbnail_mode", "main") + if mode == "photo" and getattr(self, "full_photo_thumbnail", None): + return self.full_photo_thumbnail + if mode == "wire" and getattr(self, "full_wire_thumbnail", None): + return self.full_wire_thumbnail + return self.img + + def _has_additional_thumbnails(self): + return bool( + getattr(self, "full_photo_thumbnail", None) + or getattr(self, "full_wire_thumbnail", None) + ) + def draw_thumbnail_box(self, layout, width=250): layout.emboss = "NORMAL" box_thumbnail = layout.box() + thumb_image = self._get_active_thumbnail() box_thumbnail.scale_y = 0.4 box_thumbnail.template_icon( - icon_value=self.img.preview.icon_id, scale=width * 0.12 + icon_value=thumb_image.preview.icon_id, scale=width * 0.12 ) - self.img.gl_touch() + thumb_image.gl_touch() - # Display photo thumbnail for printable objects - if ( - self.asset_data.get("assetType") == "printable" - and hasattr(self, "full_photo_thumbnail") - and self.full_photo_thumbnail - ): - box_thumbnail.scale_y = 0.4 - box_thumbnail.template_icon( - icon_value=self.full_photo_thumbnail.preview.icon_id, - scale=width * 0.12, + if self._has_additional_thumbnails(): + selector_col = box_thumbnail.column() + selector_col.separator() + selector_col.label(text="Preview variations:") + buttons = selector_col.row(align=True) + buttons.alignment = "CENTER" + buttons.scale_x = 1.3 + buttons.scale_y = 3.0 + + buttons.prop_enum( + self, + "thumbnail_mode", + "main", + icon="IMAGE_DATA", + text="", ) - self.full_photo_thumbnail.gl_touch() + if self.asset_data.get("assetType") == "printable" and getattr( + self, "full_photo_thumbnail", None + ): + buttons.prop_enum( + self, + "thumbnail_mode", + "photo", + icon="SCENE", + text="", + ) + if self.asset_data.get("assetType") in { + "printable", + "model", + "scene", + } and getattr(self, "full_wire_thumbnail", None): + buttons.prop_enum( + self, + "thumbnail_mode", + "wire", + icon="SHADING_WIRE", + text="", + ) + selector_col.separator() # op = row.operator('view3d.asset_drag_drop', text='Drag & Drop from here', depress=True) # From here on, only ratings are drawn, which won't be displayed for private assets from now on. @@ -3402,12 +3957,11 @@ class AssetPopupCard(bpy.types.Operator, ratings_utils.RatingProperties): self.draw_thumbnail_box(left_column, width=int(self.width * split_ratio)) - if ( - not utils.user_is_owner(asset_data=self.asset_data) - and self.asset_data.get("assetType") != "addon" - ): + if not utils.user_is_owner(asset_data=self.asset_data) and self.asset_data.get( + "assetType" + ) not in ("addon", "author"): # Draw ratings, but not for owners of assets - doesn't make sense. - # also addons are now disabled until we figure out how to handle them. + # also addons and authors are excluded. ratings_box = left_column.box() self.prefill_ratings() ratings.draw_ratings_menu(self, context, ratings_box) @@ -3454,6 +4008,14 @@ class AssetPopupCard(bpy.types.Operator, ratings_utils.RatingProperties): if self.full_photo_thumbnail: utils.img_to_preview(self.full_photo_thumbnail, copy_original=True) + # NOTE: not used currently + if asset_data["assetType"] in {"printable", "model", "scene"}: + self.full_wire_thumbnail = ui.get_full_wire_thumbnail(asset_data) + if self.full_wire_thumbnail: + utils.img_to_preview(self.full_wire_thumbnail, copy_original=True) + + self.thumbnail_mode = "main" + self.asset_type = asset_data["assetType"] self.asset_id = asset_data["id"] # self.tex = utils.get_hidden_texture(self.img) @@ -3466,7 +4028,7 @@ class AssetPopupCard(bpy.types.Operator, ratings_utils.RatingProperties): self.tip = f"Tip: {random.choice(global_vars.TIPS)[0]}" - if utils.user_logged_in(): + if utils.user_logged_in() and asset_data.get("assetType") != "author": ratings_utils.ensure_rating(self.asset_id) # pre-fill ratings self.prefill_ratings() @@ -3479,13 +4041,16 @@ class AssetPopupCard(bpy.types.Operator, ratings_utils.RatingProperties): user_preferences.asset_popup_counter += 1 # get comments api_key = user_preferences.api_key - comments = comments_utils.get_comments_local(asset_data["assetBaseId"]) - # if comments is None: - client_lib.get_comments(asset_data["assetBaseId"], api_key) + if asset_data.get("assetType") != "author": + comments = comments_utils.get_comments_local(asset_data["assetBaseId"]) + # if comments is None: + client_lib.get_comments(asset_data["assetBaseId"], api_key) - # TODO: SHOULD BE DONE ONCE COMMENTS TASK IS RETURNED - HOW TO INVOKE REFRESH FROM HANDLE_GET_COMMENTS_TASK - comments = global_vars.DATA.get("asset comments", {}) - self.comments = comments.get(asset_data["assetBaseId"], []) + # TODO: SHOULD BE DONE ONCE COMMENTS TASK IS RETURNED - HOW TO INVOKE REFRESH FROM HANDLE_GET_COMMENTS_TASK + comments = global_vars.DATA.get("asset comments", {}) + self.comments = comments.get(asset_data["assetBaseId"], []) + else: + self.comments = [] return wm.invoke_popup(self, width=self.width) @@ -3879,6 +4444,7 @@ def header_search_draw(self, context): "SCENE": wm.blenderkit_scene, "NODEGROUP": wm.blenderkit_nodegroup, "ADDON": wm.blenderkit_addon, + "AUTHOR": wm.blenderkit_author, } props = props_dict[ui_props.asset_type] pcoll = icons.icon_collections["main"] @@ -3893,6 +4459,7 @@ def header_search_draw(self, context): "SCENE": "SCENE_DATA", "NODEGROUP": "NODETREE", "ADDON": "PLUGIN", + "AUTHOR": pcoll["asset_type_author"].icon_id, } asset_type_icon = icons_dict[ui_props.asset_type] @@ -4036,6 +4603,12 @@ def header_search_draw(self, context): text="", icon_value=icon_id, ) + elif ui_props.asset_type == "AUTHOR": + layout.popover( + panel="VIEW3D_PT_blenderkit_advanced_author_search", + text="", + icon_value=icon_id, + ) elif ui_props.asset_type == "PRINTABLE": layout.popover( panel="VIEW3D_PT_blenderkit_advanced_printable_search", @@ -4255,6 +4828,8 @@ class NodegroupDropDialog(bpy.types.Operator): classes = ( + BLENDERKIT_OT_hdr_thumbnail_tune, + BLENDERKIT_OT_show_validation_popup, SetCategoryOperatorOrigin, SetCategoryOperator, SetCategoryOperatorInPopupCard, @@ -4272,6 +4847,7 @@ classes = ( VIEW3D_PT_blenderkit_advanced_brush_search, VIEW3D_PT_blenderkit_advanced_nodegroup_search, VIEW3D_PT_blenderkit_advanced_addon_search, + VIEW3D_PT_blenderkit_advanced_author_search, VIEW3D_PT_blenderkit_advanced_printable_search, VIEW3D_PT_blenderkit_categories, VIEW3D_PT_blenderkit_import_settings, @@ -4279,6 +4855,8 @@ classes = ( VIEW3D_MT_blenderkit_model_properties, NODE_PT_blenderkit_material_properties, OpenBlenderKitDiscord, + CopyEnvironmentInfo, + ReportBug, OpenSystemDirectory, OpenAssetDirectory, OpenAddonDirectory, diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/unpack_asset_bg.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/unpack_asset_bg.py index e51bc46..e49bd64 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/unpack_asset_bg.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/unpack_asset_bg.py @@ -16,29 +16,69 @@ # # ##### END GPL LICENSE BLOCK ##### +from __future__ import annotations import json import os import sys import traceback +import urllib.request +import uuid +import logging import bpy +bk_logger = logging.getLogger(__name__) -def get_texture_filepath(tex_dir_path, image, resolution="blend"): - if len(image.packed_files) > 0: +_INT32_MIN = -2_147_483_648 +_INT32_MAX = 2_147_483_647 + + +def _sanitize_for_idprops(value): + """Recursively sanitize a value so it can be stored as a Blender IDProperty. + Large integers that would overflow int32 are converted to strings. + """ + if isinstance(value, int): + if value < _INT32_MIN or value > _INT32_MAX: + return str(value) + return value + if isinstance(value, dict): + return {k: _sanitize_for_idprops(v) for k, v in value.items()} + if isinstance(value, (list, tuple, set)): + return [_sanitize_for_idprops(v) for v in value] + return value + + +_ASSET_TYPE_DIRS = { + "models", + "materials", + "hdrs", + "scenes", + "brushes", + "textures", + "nodegroups", + "printables", + "addons", +} + + +def get_texture_filepath(tex_dir_path, image, resolution="blend", source_path=""): + if source_path: + path = source_path + elif len(image.packed_files) > 0: path = image.packed_files[0].filepath else: path = image.filepath # backslashes needs to be replaced because bpy.path.basename(path) # does not work on Mac for Windows paths + path = path or "" path = path.replace("\\", "/") image_file_name = bpy.path.basename(path) if image_file_name == "": image_file_name = image.name.split(".")[0] - # check if there is allready an image with same name and thus also assigned path - # (can happen easily with genearted tex sets and more materials) + # check if there is already an image with same name and thus also assigned path + # (can happen easily with generated tex sets and more materials) file_path_original = os.path.join(tex_dir_path, image_file_name) file_path_final = file_path_original @@ -72,51 +112,523 @@ def get_resolution_from_file_path(file_path): return "blend" -def unpack_asset(data): - print("🗃️ unpacking asset") - asset_data = data["asset_data"] - resolution = get_resolution_from_file_path(bpy.data.filepath) +def _resolve_author_name(asset_data: dict) -> str: + author = asset_data.get("author") or {} + full_name = author.get("fullName") or "" + if full_name: + return full_name + first = author.get("firstName") or "" + last = author.get("lastName") or "" + return f"{first} {last}".strip() - # TODO - passing resolution inside asset data might not be the best solution - tex_dir_path = paths.get_texture_directory(asset_data, resolution=resolution) - tex_dir_abs = bpy.path.abspath(tex_dir_path) - if not os.path.exists(tex_dir_abs): + +def _resolve_thumbnail_url(asset_data: dict) -> str: + for key in ("thumbnailMiddleUrl", "thumbnailSmallUrl", "thumbnailLargeUrl"): + url = asset_data.get(key) + if url: + return str(url) + + for file in asset_data.get("files", []): + if file.get("fileType") not in ( + "thumbnail", + "photo_thumbnail", + "wire_thumbnail", + ): + continue + for key in ( + "thumbnailMiddleUrl", + "thumbnailSmallUrl", + "fileThumbnailLarge", + "fileThumbnail", + ): + url = file.get(key) + if url: + return str(url) + + return "" + + +def _library_dir_from_fpath(blend_path: str) -> str: + """Derive library root from a blend file path by stripping the asset_type folder. + + Expected structure: ///.blend + Returns the portion up to . Falls back to two levels above the blend file directory. + """ + if not blend_path: + return "" + + norm_path = os.path.abspath(blend_path) + parts = norm_path.split(os.sep) + for idx, part in enumerate(parts): + if part.lower() in _ASSET_TYPE_DIRS and idx > 0: + return os.sep.join(parts[:idx]) + + # Fallback: go two levels up from the blend file directory + dir_path = os.path.dirname(norm_path) + return os.path.abspath(os.path.join(dir_path, os.pardir, os.pardir)) + + +def _download_thumbnail(url: str) -> str: + """Download the thumbnail image from the given URL and save it to the same directory as the current .blend file. + + Returns the file path of the downloaded thumbnail, or an empty string if the download failed. + """ + if not url: + return "" + base_name = "preview.png" + target_dir = os.path.dirname(bpy.data.filepath) + if not target_dir: + return "" + target_path = os.path.join(target_dir, base_name) + if os.path.exists(target_path): + return target_path + try: + req = urllib.request.Request(url) + req.add_header("User-Agent", "BlenderKit") + req.add_header("Accept", "image/*") + with urllib.request.urlopen(req, timeout=15) as response: + with open(target_path, "wb") as handle: + handle.write(response.read()) + return target_path + except Exception: + return "" + + +def _sanitize_preview_image(preview_path: str) -> str: + """Some thumbnail images have issues libEx support. + + This function tries to sanitize the image by re-saving it as PNG from the blender. + """ + if not preview_path or not os.path.exists(preview_path): + return "" + base_dir = os.path.dirname(preview_path) + base_name = os.path.splitext(os.path.basename(preview_path))[0] + sanitized_path = os.path.join(base_dir, f"{base_name}_clean.png") + if os.path.exists(sanitized_path): + return sanitized_path + img = None + try: + img = bpy.data.images.load(preview_path, check_existing=False) + img.filepath_raw = sanitized_path + img.file_format = "PNG" + img.save() + return sanitized_path + except Exception: + return "" + finally: + if img is not None: + try: + bpy.data.images.remove(img) + except Exception: + pass + + +def _op_poll(op_callable, data_block) -> bool: + """Check if the operator can run in the context of the given data block.""" + try: + if hasattr(bpy.context, "temp_override"): + with bpy.context.temp_override(id=data_block): + return op_callable.poll() + override = bpy.context.copy() + override["id"] = data_block + return op_callable.poll(override) + except Exception: + return False + + +def _op_call(op_callable, data_block, **kwargs): + """Call the operator in the context of the given data block.""" + if hasattr(bpy.context, "temp_override"): + with bpy.context.temp_override(id=data_block): + return op_callable(**kwargs) + override = bpy.context.copy() + override["id"] = data_block + return op_callable(override, **kwargs) + + +def _apply_asset_preview(data_block, asset_data: dict) -> None: + """Apply asset preview image to the asset data block. + + It first tries to download the thumbnail from the URL provided in asset data. + If that fails, it falls back to generating a preview within Blender.""" + if data_block is None: + return + print("🖼️ applying asset preview") + url = _resolve_thumbnail_url(asset_data) + preview_path = _download_thumbnail(url) if url else "" + if preview_path: + clean_path = _sanitize_preview_image(preview_path) + if clean_path: + preview_path = clean_path try: - os.mkdir(tex_dir_abs) + loaded = False + if _op_poll(bpy.ops.ed.lib_id_load_custom_preview, data_block): + result = _op_call( + bpy.ops.ed.lib_id_load_custom_preview, + data_block, + filepath=preview_path, + ) + loaded = "FINISHED" in result + if loaded: + print(" Thumbnail preview applied successfully.") + return + except Exception as e: + print( + "Failed to load thumbnail preview, falling back to generating preview: " + f"{e}" + ) + + try: + if _op_poll(bpy.ops.ed.lib_id_generate_preview, data_block): + _op_call(bpy.ops.ed.lib_id_generate_preview, data_block) + print(" Generated preview applied successfully.") + except Exception: + print("Failed to generate preview, asset will have no preview") + return + + +def _write_metadata(data_block, asset_data: dict) -> None: + """Write asset metadata to the asset data block. + + This includes tags, author, and description.""" + if data_block is None: + return + print("📝 writing asset metadata") + tags = data_block.asset_data.tags + for t in tags: + tags.remove(t) + tags = data_block.asset_data.tags + for t in asset_data.get("tags", []): + tags.new(str(t)) + + # assign more metadata in tags, so it is searchable in asset browser, and also visible in metadata panel + other_meta = {} + + if asset_data.get("assetBaseId"): + other_meta["id"] = asset_data["assetBaseId"] + if asset_data.get("assetType"): + other_meta["asset_type"] = asset_data.get("assetType", "") + if asset_data.get("sourceAppVersion"): + other_meta["source_app_version"] = asset_data.get("sourceAppVersion", "") + + # further custom meta from dictParameters + dict_parameters = asset_data.get("dictParameters", {}) + if "category" in dict_parameters: + other_meta["category"] = dict_parameters["category"] + if "condition" in dict_parameters: + other_meta["condition"] = dict_parameters["condition"] + if "pbrType" in dict_parameters: + other_meta["pbr_type"] = dict_parameters["pbrType"] + if "materialStyle" in dict_parameters: + other_meta["material_style"] = dict_parameters["materialStyle"] + if "engine" in dict_parameters: + other_meta["engine"] = dict_parameters["engine"] + if "animated" in dict_parameters and dict_parameters["animated"]: + other_meta["animated"] = "yes" + if "simulation" in dict_parameters and dict_parameters["simulation"]: + other_meta["simulation"] = "yes" + + # ad additional metadata to tags + for key, value in other_meta.items(): + tags.new(f"{key}:{value}") + + description = asset_data.get("description", "") + author_name = _resolve_author_name(asset_data) + + data_block.asset_data.author = author_name + data_block.asset_data.description = description + if hasattr(data_block.asset_data, "copyright"): + data_block.asset_data.copyright = asset_data.get("copyright", "") + if hasattr(data_block.asset_data, "license"): + data_block.asset_data.license = asset_data.get("license", "") + + +def _sanitize_catalog_segment(segment: str) -> str: + cleaned = (segment or "").strip() + cleaned = cleaned.replace(":", "-").replace("/", "-").replace("\\", "-") + return cleaned or "Uncategorized" + + +def _resolve_category_segments(asset_data: dict) -> list[str]: + category_slug = asset_data.get("category") or asset_data.get( + "dictParameters", {} + ).get("category") + if not category_slug: + return [] + + parts = [p for p in str(category_slug).split("-") if p] + return [_sanitize_catalog_segment(part) for part in parts] + + +def _resolve_catalog_path_parts(asset_data: dict) -> list[str]: + asset_type = (asset_data.get("assetType") or "").lower() + catalog_map = { + "model": "Models", + "material": "Materials", + "hdr": "HDRIs", + "hdri": "HDRIs", + "printable": "Printables", + "scene": "Scenes", + "brush": "Brushes", + "texture": "Textures", + "nodegroup": "Node Groups", + "addon": "Add-ons", + } + + parts = [] + top_level = catalog_map.get(asset_type) + if top_level: + parts.append(top_level) + + parts.extend(_resolve_category_segments(asset_data)) + bk_logger.debug( + "Resolved catalog path parts: %s for asset type '%s' and category '%s'", + parts, + asset_type, + asset_data.get("category"), + ) + return parts + + +def _ensure_catalog_exists( + library_path: str, catalog_path: str, catalog_simple_name: str +) -> str: + """Ensure that an asset catalog exists for the given path. + + Returns the catalog ID if it exists or was created successfully, otherwise returns an empty string. + """ + # TODO use python exposed API, (currently only C API is available)) + head = ( + "# This is an Asset Catalog Definition file for Blender.\n" + "#\n" + "# Empty lines and lines starting with `#` will be ignored.\n" + "# The first non-ignored line should be the version indicator.\n" + '# Other lines are of the format "UUID:catalog/path/for/assets:simple catalog name"\n' + "\n" + "VERSION 1\n" + ) + + # check if file exists in library, if not create it + # this is needed to assign asset to catalog, otherwise it will be assigned to "unc + cat_path = os.path.join(library_path, "blender_assets.cats.txt") + if not os.path.exists(cat_path): + try: + with open(cat_path, "w", encoding="utf-8") as f: + f.write(head) except Exception as e: traceback.print_exc() + return "" + # create file if it does not exists with uuid and name + # get all catalogs in the file, if there is one with same name, return its uuid + cats = {} + # read existing catalogs + with open(cat_path, "r", encoding="utf-8") as f: + for line in f: + line = line.strip() + if not line or line.startswith("#"): + continue + parts = line.split(":") + if len(parts) != 3: + continue + cat_uuid, cat_path_entry, _ = parts + cats[cat_path_entry] = cat_uuid - bpy.data.use_autopack = False - for image in bpy.data.images: - if image.name == "Render Result": - continue # skip rendered images + # use regex to found the library name + if catalog_path in cats: + return cats[catalog_path] - # suffix = paths.resolution_suffix(data['suffix']) - fp = get_texture_filepath(tex_dir_path, image, resolution=resolution) - print(f"🖼️ unpacking file: {image.name} - {image.filepath}, {fp}") + # create new catalog entry + new_uuid = str(uuid.uuid4()) + cats[catalog_path] = new_uuid - for pf in image.packed_files: - pf.filepath = fp # bpy.path.abspath(fp) - image.filepath = fp # bpy.path.abspath(fp) - image.filepath_raw = fp # bpy.path.abspath(fp) - # image.save() - if len(image.packed_files) > 0: - # image.unpack(method='REMOVE') - image.unpack(method="WRITE_ORIGINAL") + # write new catalog entry to file + try: + with open(cat_path, "a", encoding="utf-8") as f: + f.write(f"{new_uuid}:{catalog_path}:{catalog_simple_name}\n") + return new_uuid + except Exception as e: + traceback.print_exc() + return "" + + +def _assign_asset_catalog( + data_block, asset_data: dict, blend_path: str | None = None +) -> None: + """Assign the asset to a catalog based on its type and category hierarchy.""" + if data_block is None or data_block.asset_data is None: + return + print("📁 assigning asset to catalog") + + if not blend_path: + print("Asset catalog assignment skipped: blend path missing.") + return + + library_dir = _library_dir_from_fpath(blend_path) + library_dir = os.path.abspath(bpy.path.abspath(library_dir)) + print("Resolved library directory: '%s'" % library_dir) + if not os.path.exists(library_dir): + try: + os.makedirs(library_dir, exist_ok=True) + except Exception: + print(f"Asset catalog assignment skipped: cannot create '{library_dir}'.") + return + + path_parts = _resolve_catalog_path_parts(asset_data) + print(f"Resolved catalog path parts: {path_parts}") + if not path_parts: + print( + "Asset catalog assignment skipped: could not resolve catalog path from asset data." + ) + return + + catalog_path = "/".join(path_parts) + catalog_simple_name = path_parts[-1] + + print( + "Resolved catalog path: '%s' and simple name: '%s' for asset with type '%s'" + % ( + catalog_path, + catalog_simple_name, + asset_data.get("assetType"), + ) + ) + catalog_id = _ensure_catalog_exists(library_dir, catalog_path, catalog_simple_name) + if not catalog_id: + print("Asset catalog assignment skipped: failed to create catalog entry.") + return + print(f"Assigning asset to catalog '{catalog_path}' with ID {catalog_id}") + asset_meta = data_block.asset_data + if hasattr(asset_meta, "catalog_id"): + try: + asset_meta.catalog_id = catalog_id + except AttributeError: + print("Asset catalog assignment skipped: catalog_id is read-only.") + else: + print( + "Asset catalog assignment skipped: asset_data does not have catalog_id attribute." + ) + + +def unpack_asset(data): + """Unpack asset data into the current Blender file. + + This function handles unpacking textures, writing metadata, + applying previews, and assigning the asset to a catalog based on its type. + """ + asset_data = data["asset_data"] + + # assume unpack is true + unpack = True + if data.get("prefs", {}).get("unpack_files") is False: + unpack = False + + # assume write_metadata is true + write_metadata = True + if data.get("prefs", {}).get("write_asset_metadata") is False: + write_metadata = False + + if unpack: + print("🗃️ unpacking asset") + resolution = get_resolution_from_file_path(bpy.data.filepath) + + # TODO - passing resolution inside asset data might not be the best solution + tex_dir_path = paths.get_texture_directory(asset_data, resolution=resolution) + tex_dir_abs = bpy.path.abspath(tex_dir_path) + if not os.path.exists(tex_dir_abs): + try: + os.mkdir(tex_dir_abs) + except Exception as e: + traceback.print_exc() + + bpy.data.use_autopack = False + for image in bpy.data.images: + if image.name == "Render Result": + continue # skip rendered images + + # Keep per-packed-file paths (UDIM/sequence) so image.unpack writes all frames/tiles. + if len(image.packed_files) > 0: + unpack_paths = [] + for pf in image.packed_files: + pf_path = get_texture_filepath( + tex_dir_path, + image, + resolution=resolution, + source_path=pf.filepath, + ) + unpack_paths.append(pf_path) + pf.filepath = pf_path # bpy.path.abspath(pf_path) + + image_path = get_texture_filepath( + tex_dir_path, + image, + resolution=resolution, + source_path=image.filepath, + ) + image.filepath = image_path # bpy.path.abspath(image_path) + image.filepath_raw = image_path # bpy.path.abspath(image_path) + print( + f"🖼️ unpacking file: {image.name} - {image.filepath}, " + f"{len(unpack_paths)} packed file(s)" + ) + image.unpack(method="WRITE_ORIGINAL") + else: + fp = get_texture_filepath( + tex_dir_path, + image, + resolution=resolution, + source_path=image.filepath, + ) + print(f"🖼️ unpacking file: {image.name} - {image.filepath}, {fp}") + image.filepath = fp # bpy.path.abspath(fp) + image.filepath_raw = fp # bpy.path.abspath(fp) # mark asset browser asset + print("🏷️ marking asset") data_block = None if asset_data["assetType"] in ("model", "printable"): + # Mark the main collection as the asset instead of the root object. + # When upload_bg.py prepares a model for upload it places ALL objects + # (including children) as direct members of a single named collection that + # is a direct child of the scene collection. If we mark only the root + # object, Blender's asset browser will import just that one object and + # its children are left behind, resulting in an empty appearing in the + # scene. Marking the collection lets Blender create a proper collection + # instance that shows every object in the hierarchy. + # + # upload_bg.py calls asset_mark() on the root object before uploading, so + # every downloaded .blend arrives with the root object already marked as an + # asset. Clear those object-level marks first so only the collection entry + # appears in the asset browser (no duplicates). for ob in bpy.data.objects: - if ob.parent is None and ob in bpy.context.visible_objects: - if bpy.app.version >= (3, 0, 0): - ob.asset_mark() - # for c in bpy.data.collections: - # if c.get('asset_data') is not None: - # if bpy.app.version >= (3, 0, 0): + if ob.asset_data is not None: + ob.asset_clear() - # c.asset_mark() - # data_block = c + scene_collection = bpy.context.scene.collection + main_collection = None + for col in scene_collection.children: + has_root_objects = any( + ob.parent is None and ob in bpy.context.visible_objects + for ob in col.objects + ) + if has_root_objects: + main_collection = col + break + + if main_collection is not None: + if bpy.app.version >= (3, 0, 0): + main_collection.asset_mark() + # Store asset_data on the collection so that collection-instance + # EMPTYs added via Blender's native asset browser can be identified + # as BlenderKit assets (rating, bookmarking, etc.). + main_collection["asset_data"] = _sanitize_for_idprops(asset_data) + data_block = main_collection + else: + # Fallback: no suitable collection found – mark root visible objects. + for ob in bpy.data.objects: + if ob.parent is None and ob in bpy.context.visible_objects: + if bpy.app.version >= (3, 0, 0): + ob.asset_mark() + data_block = ob elif asset_data["assetType"] == "material": for m in bpy.data.materials: if bpy.app.version >= (3, 0, 0): @@ -125,18 +637,34 @@ def unpack_asset(data): elif asset_data["assetType"] == "scene": if bpy.app.version >= (3, 0, 0): bpy.context.scene.asset_mark() + data_block = bpy.context.scene elif asset_data["assetType"] == "brush": for b in bpy.data.brushes: - if b.get("asset_data") is not None: + if hasattr(b, "asset_data") and b.asset_data is not None: if bpy.app.version >= (3, 0, 0): b.asset_mark() data_block = b - if bpy.app.version >= (3, 0, 0) and data_block is not None: - tags = data_block.asset_data.tags - for t in tags: - tags.remove(t) - tags.new("description: " + asset_data.get("description", "")) - tags.new("tags: " + ",".join(asset_data.get("tags", []))) + elif asset_data["assetType"] == "nodegroup": + for ng in bpy.data.node_groups: + if hasattr(ng, "asset_data") and ng.asset_data is not None: + if ( + hasattr(ng.asset_data, "copyright") + and ng.asset_data.copyright == "Blender Foundation" + or ng.asset_data.is_property_readonly("author") + ): + continue # skip official node groups, they are not assets + if bpy.app.version >= (3, 0, 0): + ng.asset_mark() + data_block = ng + + if bpy.app.version >= (3, 0, 0) and data_block is not None and write_metadata: + _write_metadata(data_block, asset_data) + _apply_asset_preview(data_block, asset_data) + _assign_asset_catalog( + data_block, + asset_data, + blend_path=data.get("fpath"), + ) # if this isn't here, blender crashes when saving file. if bpy.app.version >= (3, 0, 0): @@ -194,6 +722,7 @@ if __name__ == "__main__": from . import paths + print(json_path) with open(json_path, "r", encoding="utf-8") as f: data = json.load(f) unpack_asset(data) diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/upload.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/upload.py index 74b2003..530712d 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/upload.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/upload.py @@ -20,12 +20,15 @@ import json import logging import os import re +import sys +import requests import tempfile from pathlib import Path -from typing import Optional +from typing import Optional, Any import bpy from bpy.props import ( # TODO only keep the ones actually used when cleaning + IntProperty, BoolProperty, EnumProperty, StringProperty, @@ -49,7 +52,6 @@ from . import ( search, ) - NAME_MINIMUM = 3 NAME_MAXIMUM = 40 TAGS_MINIMUM = 3 @@ -64,6 +66,15 @@ licenses = ( ) +def wire_thumbnail_upload_enabled() -> bool: + """Feature gate for experimental wireframe thumbnail uploads.""" + addon = bpy.context.preferences.addons.get(__package__) + if addon is None: + return False + preferences = addon.preferences + return getattr(preferences, "enable_wire_thumbnail_upload", False) + + def add_version(data): data["sourceAppName"] = "blender" data["sourceAppVersion"] = utils.get_blender_version() @@ -199,7 +210,7 @@ def check_missing_data(asset_type, props, upload_set): ) if "THUMBNAIL" in upload_set: - if asset_type in ("MODEL", "SCENE", "MATERIAL", "PRINTABLE"): + if asset_type in ("MODEL", "SCENE", "MATERIAL", "PRINTABLE", "BRUSH"): thumb_path = bpy.path.abspath(props.thumbnail) if props.thumbnail == "": write_to_report( @@ -213,23 +224,6 @@ def check_missing_data(asset_type, props, upload_set): "Thumbnail filepath does not exist on the disk.\n" " Please check the filepath and try again.", ) - - if asset_type == "BRUSH": - brush = utils.get_active_brush() - if brush is not None: - thumb_path = bpy.path.abspath(brush.icon_filepath) - if thumb_path == "": - write_to_report( - props, - "Brush Icon Filepath has not been provided.\n" - " Please check Custom Icon option add a Brush Icon in JPG or PNG format, ensuring at least 1024x1024 pixels.", - ) - elif not os.path.exists(Path(thumb_path)): - write_to_report( - props, - "Brush Icon Filepath does not exist on the disk.\n" - " Please check the filepath and try again.", - ) if "PHOTO_THUMBNAIL" in upload_set: # for printable assets # Add validation for the photo thumbnail for printable assets # only if it's in the upload set @@ -251,6 +245,24 @@ def check_missing_data(asset_type, props, upload_set): " Please check the filepath and try again.", ) + if wire_thumbnail_upload_enabled() and "WIRE_THUMBNAIL" in upload_set: + if props.wire_thumbnail_will_upload_on_website: + pass + else: + wire_thumb_path = bpy.path.abspath(props.wire_thumbnail) + if props.wire_thumbnail == "": + write_to_report( + props, + "A wireframe thumbnail image has not been provided.\n" + " Please add a wireframe thumbnail in JPG or PNG format, ensuring at least 1024x1024 pixels.", + ) + elif not os.path.exists(Path(wire_thumb_path)): + write_to_report( + props, + "Wireframe thumbnail filepath does not exist on the disk.\n" + " Please check the filepath and try again.", + ) + if props.is_private == "PUBLIC": check_public_requirements(props) @@ -333,7 +345,7 @@ def sub_to_camel(content): def get_upload_data(caller=None, context=None, asset_type=None): """ - works though metadata from addom props and prepares it for upload to dicts. + works though metadata from addon props and prepares it for upload to dicts. Parameters ---------- caller - upload operator or none @@ -342,8 +354,8 @@ def get_upload_data(caller=None, context=None, asset_type=None): Returns ------- - export_ddta- all extra data that the process needs to upload and communicate with UI from a thread. - - eval_path_computing - string path to UI prop that denots if upload is still running + export_data- all extra data that the process needs to upload and communicate with UI from a thread. + - eval_path_computing - string path to UI prop that denotes if upload is still running - eval_path_state - string path to UI prop that delivers messages about upload to ui - eval_path - path to object holding upload data to be able to access it with various further commands - models - in case of model upload, list of objects @@ -353,10 +365,13 @@ def get_upload_data(caller=None, context=None, asset_type=None): """ user_preferences = bpy.context.preferences.addons[__package__].preferences - export_data = { + export_data: dict[str, Any] = { # "type": asset_type, } - upload_params = {} + upload_params: dict[str, Any] = {} + # initialize here to prevent unbound + upload_data: dict[str, Any] = {} + if asset_type in ("MODEL", "PRINTABLE"): # Prepare to save the file mainmodel = utils.get_active_model() @@ -375,6 +390,13 @@ def get_upload_data(caller=None, context=None, asset_type=None): export_data["photo_thumbnail_path"] = bpy.path.abspath( props.photo_thumbnail ) + # Add wire thumbnail path to export_data for models and printable assets + if ( + wire_thumbnail_upload_enabled() + and asset_type in ("MODEL", "SCENE", "PRINTABLE") + and props.wire_thumbnail + ): + export_data["wire_thumbnail_path"] = bpy.path.abspath(props.wire_thumbnail) eval_path_computing = ( "bpy.data.objects['%s'].blenderkit.uploading" % mainmodel.name @@ -511,9 +533,9 @@ def get_upload_data(caller=None, context=None, asset_type=None): "animated": props.animated, # "simulation": props.simulation, "purePbr": props.pbr, - "faceCount": 1, # props.face_count, - "faceCountRender": 1, # props.face_count_render, - "objectCount": 1, # props.object_count, + "faceCount": max(0, props.face_count), + "faceCountRender": max(0, props.face_count_render), + "objectCount": max(0, props.object_count), # "scene": props.is_scene, } if props.use_design_year: @@ -588,7 +610,7 @@ def get_upload_data(caller=None, context=None, asset_type=None): # props.name = brush.name export_data["brush"] = str(brush.name) - export_data["thumbnail_path"] = bpy.path.abspath(brush.icon_filepath) + export_data["thumbnail_path"] = bpy.path.abspath(props.thumbnail) eval_path_computing = "bpy.data.brushes['%s'].blenderkit.uploading" % brush.name eval_path_state = "bpy.data.brushes['%s'].blenderkit.upload_state" % brush.name @@ -749,7 +771,7 @@ def update_free_full(self, context): message="Any material uploaded to BlenderKit is free." " However, it can still earn money for the author," " based on our fair share system. " - "Part of subscription is sent to artists based on usage by paying users.", + "Part of subscription is sent to authors based on usage by paying users.", ) @@ -883,6 +905,38 @@ class FastMetadata(bpy.types.Operator): update=update_free_full, ) + # Design metadata + manufacturer: StringProperty( # type: ignore[valid-type] + name="Manufacturer", + description="Manufacturer, company making a design piece or product.", + default="", + ) + designer: StringProperty( # type: ignore[valid-type] + name="Designer", + description="Author of the original design piece depicted.", + default="", + ) + design_collection: StringProperty( # type: ignore[valid-type] + name="Design Collection", + description="Name of the collection this design belongs to.", + default="", + ) + design_variant: StringProperty( # type: ignore[valid-type] + name="Design Variant", + description="Colour or material variant of the product.", + default="", + ) + use_design_year: BoolProperty( # type: ignore[valid-type] + name="Use Design Year", + description="Whether to include the design year in the metadata. If enabled, the design year will be included as a parameter in the asset metadata.", + default=False, + ) + design_year: IntProperty( # type: ignore[valid-type] + name="Design Year", + description="When this item was designed.", + default=1960, + ) + #################### @classmethod @@ -905,6 +959,13 @@ class FastMetadata(bpy.types.Operator): layout.prop(self, "free_full", expand=True) if self.is_private == "PUBLIC": layout.prop(self, "license") + layout.prop(self, "manufacturer") + layout.prop(self, "designer") + layout.prop(self, "design_collection") + layout.prop(self, "design_variant") + layout.prop(self, "use_design_year") + if self.use_design_year: + layout.prop(self, "design_year") # layout.label(text="Content Flags:") content_flag_box = layout.box() content_flag_box.alignment = "EXPAND" @@ -934,9 +995,38 @@ class FastMetadata(bpy.types.Operator): }, ], } + + # Optional design-related parameters + extra_parameters = [] + if self.designer: + extra_parameters.append( + {"parameterType": "designer", "value": self.designer} + ) + if self.manufacturer: + extra_parameters.append( + {"parameterType": "manufacturer", "value": self.manufacturer} + ) + if self.design_collection: + extra_parameters.append( + { + "parameterType": "designCollection", + "value": self.design_collection, + } + ) + if self.design_variant: + extra_parameters.append( + {"parameterType": "designVariant", "value": self.design_variant} + ) + if self.use_design_year: + extra_parameters.append( + {"parameterType": "designYear", "value": self.design_year} + ) + + if extra_parameters: + metadata["parameters"].extend(extra_parameters) url = f"{paths.BLENDERKIT_API}/assets/{self.asset_id}/" messages = { - "success": "Metadata upload succeded", + "success": "Metadata upload succeeded", "error": "Metadata upload failed", } client_lib.nonblocking_request(url, "PATCH", {}, metadata, messages) @@ -984,6 +1074,13 @@ class FastMetadata(bpy.types.Operator): "sexualizedContent", False ) + params = asset_data.get("dictParameters", {}) + self.designer = params.get("designer", "") + self.manufacturer = params.get("manufacturer", "") + self.design_collection = params.get("designCollection", "") + self.design_variant = params.get("designVariant", "") + self.design_year = params.get("designYear", 1960) + wm = context.window_manager return wm.invoke_props_dialog(self, width=600) @@ -991,7 +1088,7 @@ class FastMetadata(bpy.types.Operator): def get_upload_location(props): """ - not used by now, gets location of uploaded asset - potentially usefull if we draw a nice upload gizmo in viewport. + not used by now, gets location of uploaded asset - potentially useful if we draw a nice upload gizmo in viewport. Parameters ---------- props @@ -1037,6 +1134,179 @@ def storage_quota_available(props) -> bool: return False +def _get_upload_datablock(asset_type: str): + if bpy.app.version < (3, 0, 0): + return None + if asset_type in ("MODEL", "PRINTABLE"): + return utils.get_active_model() + if asset_type == "SCENE": + return bpy.context.scene + if asset_type == "MATERIAL": + obj = bpy.context.active_object + if obj is not None: + return obj.active_material + return None + if asset_type == "BRUSH": + return utils.get_active_brush() + if asset_type == "NODEGROUP": + return bpy.context.window_manager.blenderkitUI.nodegroup_upload + return None + + +def ensure_asset_metadata_on_datablock(asset_type: str, props) -> None: + """Write tags/description/author into the datablock before we save for upload.""" + + data_block = _get_upload_datablock(asset_type) + if data_block is None: + return + + if getattr(data_block, "asset_data", None) is None: + mark_fn = getattr(data_block, "asset_mark", None) + if callable(mark_fn): + mark_fn() + + asset_meta = getattr(data_block, "asset_data", None) + if asset_meta is None: + return + + try: + tags_prop = asset_meta.tags + for tag in list(tags_prop): + tags_prop.remove(tag) + for tag in utils.string2list(props.tags): + tags_prop.new(str(tag)) + + profile = global_vars.BKIT_PROFILE + author_name = getattr(profile, "fullName", "") or getattr( + profile, "username", "" + ) + asset_meta.author = author_name + asset_meta.description = props.description + + # inject also additional metadata + other_meta = {} + + if props.id: + other_meta["id"] = props.asset_base_id + + # further custom meta from dictParameters + if props.condition: + other_meta["condition"] = props.condition + if props.pbr_type: + other_meta["pbr_type"] = props.pbr_type + if props.style: + other_meta["style"] = props.style + if props.engine: + other_meta["engine"] = props.engine + if props.animated: + other_meta["animated"] = "yes" + if props.simulation: + other_meta["simulation"] = "yes" + + # ad additional metadata to tags + for key, value in other_meta.items(): + tags_prop.new(f"{key}:{value}") + + except Exception as e: # pragma: no cover - defensive for asset_data API quirks + bk_logger.warning("Failed to write asset metadata before upload: %s", e) + + +def _sanitize_preview_image(preview_path: str) -> str: + """Some thumbnail images have issues libEx support. + + This function tries to sanitize the image by re-saving it as PNG from the blender. + """ + if not preview_path or not os.path.exists(preview_path): + return "" + base_dir = os.path.dirname(preview_path) + base_name = os.path.splitext(os.path.basename(preview_path))[0] + sanitized_path = os.path.join(base_dir, f"{base_name}_clean.png") + if os.path.exists(sanitized_path): + return sanitized_path + img = None + try: + img = bpy.data.images.load(preview_path, check_existing=False) + img.filepath_raw = sanitized_path + img.file_format = "PNG" + img.save() + return sanitized_path + except Exception: + return "" + finally: + if img is not None: + try: + bpy.data.images.remove(img) + except Exception: + pass + + +def _op_poll(op_callable, data_block) -> bool: + """Check if the operator can run in the context of the given data block.""" + try: + if hasattr(bpy.context, "temp_override"): + with bpy.context.temp_override(id=data_block): + return op_callable.poll() + override = bpy.context.copy() + override["id"] = data_block + return op_callable.poll(override) + except Exception: + return False + + +def _op_call(op_callable, data_block, **kwargs): + """Call the operator in the context of the given data block.""" + if hasattr(bpy.context, "temp_override"): + with bpy.context.temp_override(id=data_block): + return op_callable(**kwargs) + override = bpy.context.copy() + override["id"] = data_block + return op_callable(override, **kwargs) + + +def apply_asset_preview(data_block, props) -> None: + """Apply asset preview image to the asset data block. + + It first tries to download the thumbnail from the URL provided in asset data. + If that fails, it falls back to generating a preview within Blender.""" + if data_block is None: + return + thumbnail = getattr(props, "thumbnail", "") + if not thumbnail: + return + thmb_path = bpy.path.abspath(thumbnail) + if not os.path.exists(thmb_path): + return + if thmb_path: + clean_path = _sanitize_preview_image(thmb_path) + if clean_path: + thmb_path = clean_path + try: + loaded = False + if _op_poll(bpy.ops.ed.lib_id_load_custom_preview, data_block): + result = _op_call( + bpy.ops.ed.lib_id_load_custom_preview, + data_block, + filepath=thmb_path, + ) + loaded = "FINISHED" in result + if loaded: + bk_logger.info("Thumbnail preview applied successfully.") + return + except Exception as e: + bk_logger.warning( + "Failed to load thumbnail preview, falling back to generating preview: " + f"{e}" + ) + + try: + if _op_poll(bpy.ops.ed.lib_id_generate_preview, data_block): + _op_call(bpy.ops.ed.lib_id_generate_preview, data_block) + bk_logger.info("Generated preview applied successfully.") + except Exception: + bk_logger.warning("Failed to generate preview, asset will have no preview") + return + + def auto_fix(asset_type=""): # this applies various procedures to ensure coherency in the database. asset = utils.get_active_asset() @@ -1067,6 +1337,9 @@ def prepare_asset_data(self, context, asset_type, reupload, upload_set): if props.report != "": return False, None, None + ensure_asset_metadata_on_datablock(asset_type, props) + apply_asset_preview(_get_upload_datablock(asset_type), props) + if not reupload: props.asset_base_id = "" props.id = "" @@ -1097,6 +1370,13 @@ def prepare_asset_data(self, context, asset_type, reupload, upload_set): props.uploading = False return False, None, None + # check if we have wire_thumbnail + if wire_thumbnail_upload_enabled() and "wire_thumbnail" in upload_set: + if not os.path.exists(export_data.get("wire_thumbnail_path", "")): + props.upload_state = "0% - wire thumbnail not found" + props.uploading = False + return False, None, None + # save a copy of the file for processing. Only for blend files _, ext = os.path.splitext(bpy.data.filepath) if not ext: @@ -1164,8 +1444,17 @@ class UploadOperator(Operator): # Add new property for photo thumbnail photo_thumbnail: BoolProperty(name="photo thumbnail", default=False, options={"SKIP_SAVE"}) # type: ignore[valid-type] + # Add new property for wire thumbnail + wire_thumbnail: BoolProperty(name="wire thumbnail", default=False, options={"SKIP_SAVE"}) # type: ignore[valid-type] + main_file: BoolProperty(name="main file", default=False, options={"SKIP_SAVE"}) # type: ignore[valid-type] + skip_hdr_tune_popup: BoolProperty( # type: ignore[valid-type] + name="Skip HDR tune popup", + default=False, + options={"SKIP_SAVE", "HIDDEN"}, + ) + @classmethod def poll(cls, context): return utils.uploadable_asset_poll() @@ -1173,6 +1462,7 @@ class UploadOperator(Operator): def execute(self, context): bpy.ops.object.blenderkit_auto_tags() props = utils.get_upload_props() + wire_upload_enabled = wire_thumbnail_upload_enabled() upload_set = [] if not self.reupload: @@ -1180,6 +1470,14 @@ class UploadOperator(Operator): # Add photo_thumbnail to the upload set for printable assets if self.asset_type == "PRINTABLE" and props.photo_thumbnail: upload_set.append("photo_thumbnail") + + # add wire_thumbnail for models if it exists + if ( + wire_upload_enabled + and self.asset_type in {"MODEL", "SCENE", "PRINTABLE"} + and props.wire_thumbnail + ): + upload_set.append("wire_thumbnail") else: if self.metadata: upload_set.append("METADATA") @@ -1187,6 +1485,8 @@ class UploadOperator(Operator): upload_set.append("THUMBNAIL") if self.photo_thumbnail: upload_set.append("photo_thumbnail") + if wire_upload_enabled and self.wire_thumbnail: + upload_set.append("wire_thumbnail") if self.main_file: upload_set.append("MAINFILE") @@ -1207,6 +1507,7 @@ class UploadOperator(Operator): props.uploading = True client_lib.asset_upload(upload_data, export_data, upload_set) + return {"FINISHED"} def draw(self, context): @@ -1227,6 +1528,14 @@ class UploadOperator(Operator): if self.asset_type == "PRINTABLE": layout.prop(self, "photo_thumbnail") + # Show wire_thumbnail option for models, scenes, and printable assets + if wire_thumbnail_upload_enabled() and self.asset_type in { + "MODEL", + "SCENE", + "PRINTABLE", + }: + layout.prop(self, "wire_thumbnail") + if props.asset_base_id != "" and not self.reupload: utils.label_multiline( layout, @@ -1290,7 +1599,7 @@ class UploadOperator(Operator): utils.label_multiline( layout, width=500, - text="Would you like tu upload your asset to BlenderKit?", + text="Would you like to upload your asset to BlenderKit?", ) def invoke(self, context, event): @@ -1300,6 +1609,20 @@ class UploadOperator(Operator): ) return {"CANCELLED"} + ui_props = bpy.context.window_manager.blenderkitUI + + if ( + self.asset_type == "HDR" + and ui_props.hdr_use_custom_thumbnail_tone + and not self.skip_hdr_tune_popup + ): + bpy.ops.wm.blenderkit_hdr_thumbnail_tune( + "INVOKE_DEFAULT", + trigger_upload=True, + upload_reupload=self.reupload, + ) + return {"CANCELLED"} + if self.asset_type == "HDR": # getting upload data for images ensures true_hdr check so users can be informed about their handling # simple 360 photos or renders with LDR are hidden by default.. @@ -1425,7 +1748,7 @@ def handle_asset_upload(task: client_tasks.Task): task.message, type="ERROR", details=task.message_detailed ) - # crazy shit to parse stupid Django incosistent error messages + # crazy shit to parse stupid Django inconsistent error messages if "detail" in task.result: if type(task.result["detail"]) == dict: for key in task.result["detail"]: @@ -1458,7 +1781,7 @@ def handle_asset_upload(task: client_tasks.Task): if task.status == "finished": asset.uploading = False - return reports.add_report("Upload successfull") + return reports.add_report("Upload successful") def handle_asset_metadata_upload(task: client_tasks.Task): @@ -1469,20 +1792,20 @@ def handle_asset_metadata_upload(task: client_tasks.Task): new_asset_base_id = task.result.get("assetBaseId", "") if new_asset_base_id != "": asset.asset_base_id = new_asset_base_id - bk_logger.info(f"Assigned new asset.asset_base_id: {new_asset_base_id}") + bk_logger.info("Assigned new asset.asset_base_id: %s", new_asset_base_id) else: asset.asset_base_id = task.data["export_data"]["assetBaseId"] - bk_logger.info(f"Assigned original asset.asset_base_id: {asset.asset_base_id}") + bk_logger.info("Assigned original asset.asset_base_id: %s", asset.asset_base_id) new_asset_id = task.result.get("id", "") if new_asset_id != "": asset.id = new_asset_id - bk_logger.info(f"Assigned new asset.id: {new_asset_id}") + bk_logger.info("Assigned new asset.id: %s", new_asset_id) else: asset.id = task.data["export_data"]["id"] - bk_logger.info(f"Assigned original asset.id: {asset.id}") + bk_logger.info("Assigned original asset.id: %s", asset.id) - return reports.add_report("Metadata upload successfull") + return reports.add_report("Metadata upload successful") def patch_individual_parameter(asset_id="", param_name="", param_value="", api_key=""): @@ -1593,7 +1916,7 @@ def mark_for_thumbnail( asset_id, "markThumbnailRender", json_data, api_key ) except Exception as e: - bk_logger.error(f"Failed to mark asset for thumbnail regeneration: {e}") + bk_logger.error("Failed to mark asset for thumbnail regeneration: %s", e) return False diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/upload_bg.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/upload_bg.py index bb839cb..8f7adbe 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/upload_bg.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/upload_bg.py @@ -227,6 +227,28 @@ if __name__ == "__main__": except Exception as e: print(f"Exception {type(e)} during pack_all(): {e}") + # Blender 5.0+ does not pack all tiles of UDIM (source='TILED') images via + # pack_all(). Iterate and explicitly pack any tiled images whose tiles are not + # yet fully packed so that every UDIM tile file is included in the upload. + for image in bpy.data.images: + if getattr(image, "source", "") != "TILED": + continue + n_tiles = len(image.tiles) if hasattr(image, "tiles") else 0 + n_packed = len(image.packed_files) + print( + f"UDIM image '{image.name}': {n_tiles} tile(s), " + f"{n_packed} packed file(s), filepath='{image.filepath}'" + ) + if n_packed < n_tiles: + try: + image.pack() + print( + f" Explicitly packed UDIM image '{image.name}': " + f"{len(image.packed_files)} packed file(s)" + ) + except Exception as e: + print(f" Could not pack UDIM image '{image.name}': {e}") + main_source.blenderkit.uploading = False # write ID here. main_source.blenderkit.asset_base_id = export_data["assetBaseId"] diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/utils.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/utils.py index 4d80fd6..7e565d5 100644 --- a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/utils.py +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/utils.py @@ -19,12 +19,12 @@ import datetime import json import logging -import numpy as np import os import platform import re import shutil import sys +import tempfile import uuid from typing import Optional @@ -43,7 +43,6 @@ from . import ( search, ) - bk_logger = logging.getLogger(__name__) ABOVE_NORMAL_PRIORITY_CLASS = 0x00008000 @@ -123,8 +122,26 @@ def selection_set(sel): bpy.context.view_layer.objects.active = sel[0] for ob in sel[1]: ob.select_set(True) - except Exception as e: - bk_logger.exception(f"failed to select objects: {str(e)}") + except Exception: + bk_logger.exception("Failed to select objects:") + + +def get_asset_data_from_ob(ob) -> Optional[dict]: + """Return the BlenderKit asset_data dict for an object. + + Checks the object's own IDProperty first. When the object is a + collection-instance EMPTY (imported from a local asset library) it falls + back to the asset_data stored on the instanced collection, which + unpack_asset_bg.py writes there during local-library processing. + """ + if ob is None: + return None + ad = ob.get("asset_data") + if ad is not None: + return ad + if ob.instance_collection is not None: + return ob.instance_collection.get("asset_data") + return None def get_active_model() -> Optional[bpy.types.Object]: @@ -309,6 +326,11 @@ def get_search_props(): if not hasattr(wm, "blenderkit_addon"): return props = wm.blenderkit_addon + + if uiprops.asset_type == "AUTHOR": + if not hasattr(wm, "blenderkit_author"): + return + props = wm.blenderkit_author return props @@ -383,6 +405,8 @@ def get_active_asset(): return get_active_nodegroup() elif ui_props.asset_type == "ADDON": return None # Addons don't have an active asset concept + elif ui_props.asset_type == "AUTHOR": + return None # Authors don't have an active asset concept return None @@ -422,6 +446,8 @@ def get_upload_props(): return b.blenderkit elif ui_props.asset_type == "ADDON": return None # Addons don't have upload props + elif ui_props.asset_type == "AUTHOR": + return None # Authors don't have upload props return None @@ -444,6 +470,41 @@ def get_active_brush(): return brush +def get_brush_icon_path(brush) -> str: + """Get the path to the brush icon image. + + In Blender <= 4.5, brushes have icon_filepath. In Blender 5.0+, icon_filepath + was removed and brush preview is stored as in-memory pixels (brush.preview). + For 5.0+ we save the preview pixels to a temp PNG file. + """ + if bpy.app.version <= (4, 5, 0): + return bpy.path.abspath(brush.icon_filepath) + + if brush.preview is None: + return "" + width, height = brush.preview.image_size + if width == 0 or height == 0: + return "" + + filepath = os.path.join( + tempfile.gettempdir(), f"blenderkit_brush_{brush.name}_icon.png" + ) + img = bpy.data.images.new( + name=f".bk_brush_preview_{brush.name}", + width=width, + height=height, + alpha=True, + ) + try: + img.pixels.foreach_set(brush.preview.image_pixels_float) + img.filepath_raw = filepath + img.file_format = "PNG" + img.save() + finally: + bpy.data.images.remove(img) + return filepath + + def get_scene_id(): """gets scene id and possibly also generates a new one""" bpy.context.scene["uuid"] = bpy.context.scene.get("uuid", str(uuid.uuid4())) @@ -474,6 +535,7 @@ def get_preferences_as_dict(): "global_dir": user_preferences.global_dir, "project_subdir": user_preferences.project_subdir, "unpack_files": user_preferences.unpack_files, + "write_asset_metadata": user_preferences.write_asset_metadata, # GUI "show_on_start": user_preferences.show_on_start, "thumb_size": user_preferences.thumb_size, @@ -482,6 +544,7 @@ def get_preferences_as_dict(): "search_in_header": user_preferences.search_in_header, "tips_on_start": user_preferences.tips_on_start, "announcements_on_start": user_preferences.announcements_on_start, + "assetbar_follows_cursor": user_preferences.assetbar_follows_cursor, # NETWORK "client_port": user_preferences.client_port, "ip_version": user_preferences.ip_version, @@ -525,6 +588,7 @@ def get_preferences() -> datas.Prefs: global_dir=user_preferences.global_dir, # type: ignore[union-attr] project_subdir=user_preferences.project_subdir, # type: ignore[union-attr] unpack_files=user_preferences.unpack_files, # type: ignore[union-attr] + write_asset_metadata=user_preferences.write_asset_metadata, # type: ignore[union-attr] # GUI show_on_start=user_preferences.show_on_start, # type: ignore[union-attr] thumb_size=user_preferences.thumb_size, # type: ignore[union-attr] @@ -533,6 +597,7 @@ def get_preferences() -> datas.Prefs: search_in_header=user_preferences.search_in_header, # type: ignore[union-attr] tips_on_start=user_preferences.tips_on_start, # type: ignore[union-attr] announcements_on_start=user_preferences.announcements_on_start, # type: ignore[union-attr] + assetbar_follows_cursor=user_preferences.assetbar_follows_cursor, # type: ignore[union-attr] # NETWORK client_port=user_preferences.client_port, # type: ignore[union-attr] ip_version=user_preferences.ip_version, # type: ignore[union-attr] @@ -562,7 +627,15 @@ def save_prefs(user_preferences, context, **kwargs): if bpy.app.background is True or bpy.app.factory_startup is True: return + previous_global_dir = ( + global_vars.PREFS.get("global_dir") + if isinstance(global_vars.PREFS, dict) + else None + ) global_vars.PREFS = get_preferences_as_dict() + paths.ensure_asset_library_path( + global_vars.PREFS.get("global_dir"), previous_global_dir + ) if user_preferences.preferences_lock is True: return @@ -637,6 +710,8 @@ def img_to_preview(img, copy_original=False): if not copy_original: return + import numpy as np + # Only process if image has alpha channel and needs filling if img.channels == 4 and ( img.alpha_mode == "STRAIGHT" or img.alpha_mode == "PREMUL" @@ -800,7 +875,7 @@ def copy_asset(fp1, fp2): """Synchronizes the asset between directories, including it's texture subdirectories.""" if 1: bk_logger.debug("copy asset") - bk_logger.debug(fp1 + " " + fp2) + bk_logger.debug("%s %s", fp1, fp2) if not os.path.exists(fp2): shutil.copyfile(fp1, fp2) bk_logger.debug("copied") @@ -989,6 +1064,58 @@ def get_dimensions(obs): return dim, bbmin, bbmax +def get_scene_dimensions(scene: bpy.types.Scene) -> tuple[Vector, Vector, Vector]: + """Calculate world-space bounds for the entire scene.""" + + minx = miny = minz = float("inf") + maxx = maxy = maxz = float("-inf") + has_geometry = False + depsgraph = bpy.context.evaluated_depsgraph_get() + + def accumulate(coord: Vector) -> None: + nonlocal minx, miny, minz, maxx, maxy, maxz, has_geometry + has_geometry = True + minx = min(minx, coord.x) + miny = min(miny, coord.y) + minz = min(minz, coord.z) + maxx = max(maxx, coord.x) + maxy = max(maxy, coord.y) + maxz = max(maxz, coord.z) + + mesh_like_types = {"MESH", "CURVE", "SURFACE", "META", "FONT", "GPENCIL"} + + for ob in scene.objects: + object_eval = ob.evaluated_get(depsgraph) + mw = object_eval.matrix_world + + if ob.type in mesh_like_types: + to_mesh = getattr(object_eval, "to_mesh", None) + mesh = to_mesh() if callable(to_mesh) else None + if mesh: + for vert in mesh.vertices: + accumulate(mw @ vert.co) + to_mesh_clear = getattr(object_eval, "to_mesh_clear", None) + if callable(to_mesh_clear): + to_mesh_clear() + elif ob.type == "VOLUME": + for corner in object_eval.bound_box: + accumulate(mw @ Vector(corner)) + elif hasattr(object_eval, "bound_box") and object_eval.bound_box: + for corner in object_eval.bound_box: + accumulate(mw @ Vector(corner)) + else: + accumulate(mw @ Vector((0.0, 0.0, 0.0))) + + if not has_geometry: + zero = Vector((0.0, 0.0, 0.0)) + return zero.copy(), zero.copy(), zero.copy() + + bbmin = Vector((minx, miny, minz)) + bbmax = Vector((maxx, maxy, maxz)) + dim = Vector((maxx - minx, maxy - miny, maxz - minz)) + return dim, bbmin, bbmax + + def get_simple_headers() -> dict[str, str]: headers = { "accept": "application/json", @@ -1147,7 +1274,7 @@ def name_update(props, context=None): fname = fname.replace("'", "") fname = fname.replace('"', "") if ui_props.asset_type == "HDR" or fname == "": - bk_logger.info(f"Skiping the rename") + bk_logger.info("Skipping the rename") return # don't rename HDR's or with empty name else: asset = get_active_asset() @@ -1273,6 +1400,8 @@ def asset_from_newer_blender_version(asset_data, blender_version=None): # addons don't have a blender version, so we return False if asset_data["assetType"] == "addon": return False, "" + if asset_data["assetType"] == "author": + return False, "" asset_ver = asset_data["sourceAppVersion"].split(".") if blender_version is None: blender_version = bpy.app.version @@ -1543,7 +1672,7 @@ def check_globaldir_permissions(): ) return False if not os.path.isdir(global_dir): - bk_logger.info(f"Global dir does not exist. Creating it at {global_dir}") + bk_logger.info("Global dir does not exist. Creating it at %s", global_dir) try: os.mkdir(global_dir) except Exception as e: diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/version_compare.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/version_compare.py new file mode 100644 index 0000000..2ad3663 --- /dev/null +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/version_compare.py @@ -0,0 +1,85 @@ +"""Tolerant version comparator for real-world pipelines.""" + +import re +from functools import total_ordering + + +@total_ordering +class Version: + """ + Tolerant version comparator for real-world pipelines. + + Handles: + v1.2 + 3.19 + 3.19.0-260127 + 3.19.0-rc1 + 3.19.0-rc1-260127 + 3.19_final + build_42 + anything with numbers in it + """ + + _PRERELEASE_RE = re.compile(r"(rc|alpha|beta|a|b)", re.I) + + def __init__(self, raw: str): + self.raw = raw + self.parts = tuple(int(n) for n in re.findall(r"\d+", raw)) + self.is_prerelease = bool(self._PRERELEASE_RE.search(raw)) + + def __eq__(self, other): + if not isinstance(other, Version): + return NotImplemented + return self.parts == other.parts and self.is_prerelease == other.is_prerelease + + def __lt__(self, other): + if not isinstance(other, Version): + return NotImplemented + + # compare numeric parts first + if self.parts != other.parts: + return self.parts < other.parts + + # stable > prerelease + return self.is_prerelease and not other.is_prerelease + + def __repr__(self): + return f"Version({self.raw!r})" + + +# ------------------------------- +# Micro helpers +# ------------------------------- + + +def version_gt(v1, v2): + """Greater than""" + return Version(v1) > Version(v2) + + +def version_lt(v1, v2): + """Less than""" + return Version(v1) < Version(v2) + + +def version_eq(v1, v2): + """Equal""" + return Version(v1) == Version(v2) + + +def compare_versions(v1, v2): + """Compare two version strings. + + Returns: + -1 if v1 < v2 + 0 if v1 == v2 + 1 if v1 > v2 + """ + ver1 = Version(v1) + ver2 = Version(v2) + if ver1 < ver2: + return -1 + elif ver1 > ver2: + return 1 + else: + return 0 diff --git a/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/viewport_utils.py b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/viewport_utils.py new file mode 100644 index 0000000..52d3d3e --- /dev/null +++ b/extensions/user_default/blenderkit/bl_ext.user_default.blenderkit_updater/backup/viewport_utils.py @@ -0,0 +1,88 @@ +import bpy + + +def _unique_window_regions(area): + if area is None: + return + + seen = set() + + def _register(region): + if getattr(region, "type", None) != "WINDOW": + return None + try: + handle = region.as_pointer() + except ReferenceError: + return None + if handle in seen: + return None + seen.add(handle) + return region + + for region in getattr(area, "regions", []): + candidate = _register(region) + if candidate is not None: + yield candidate + + space = None + try: + space = area.spaces.active + except ReferenceError: + space = None + + if getattr(space, "type", None) != "VIEW_3D": + return + + quadviews = getattr(space, "region_quadviews", None) + if not quadviews: + return + + for quad in quadviews: + candidate = _register(getattr(quad, "region", None)) + if candidate is not None: + yield candidate + + +def iter_view3d_window_regions(area): + """Yield every VIEW_3D window region for the given area (quad view included).""" + yield from _unique_window_regions(area) + + +def region_data_for_view(area, region): + """Return the RegionView3D that belongs to the given area/region pair.""" + if region is None or getattr(region, "type", None) != "WINDOW": + return None + + direct_data = getattr(region, "data", None) + if direct_data is not None: + return direct_data + + if area is None: + return None + + try: + region_ptr = region.as_pointer() + except ReferenceError: + return None + + for space in getattr(area, "spaces", []): + if getattr(space, "type", None) != "VIEW_3D": + continue + + quadviews = getattr(space, "region_quadviews", None) + if quadviews: + for quad in quadviews: + quad_region = getattr(quad, "region", None) + if quad_region is None: + continue + try: + if quad_region.as_pointer() == region_ptr: + return getattr(quad, "region_3d", None) + except ReferenceError: + continue + + region_3d = getattr(space, "region_3d", None) + if region_3d is not None: + return region_3d + + return None 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 413e40f..fe4050e 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,17 +1,17 @@ { - "last_check": "2026-04-12 17:36:29.915633", - "backup_date": "April-2-2026", + "last_check": "2026-07-10 12:03:20.821089", + "backup_date": "July-10-2026", "update_ready": true, "ignore": false, "just_restored": false, "just_updated": false, "version_text": { - "link": "https://github.com/BlenderKit/BlenderKit/releases/download/v3.19.2.260411/blenderkit-v3.19.2.260411.zip", + "link": "https://github.com/BlenderKit/BlenderKit/releases/download/v3.21.0.260628/blenderkit-v3.21.0.260628.zip", "version": [ 3, - 19, - 2, - 260411 + 21, + 0, + 260628 ] } } \ No newline at end of file diff --git a/extensions/user_default/blenderkit/blender_manifest.toml b/extensions/user_default/blenderkit/blender_manifest.toml index 5186114..1b71315 100644 --- a/extensions/user_default/blenderkit/blender_manifest.toml +++ b/extensions/user_default/blenderkit/blender_manifest.toml @@ -2,7 +2,7 @@ schema_version = "1.0.0" id = "blenderkit" type = "add-on" -version = "3.19.1-260402" # X.Y.Z-YYYYMMDD, must have a dash instead of a dot +version = "3.19.2-260411" # X.Y.Z-YYYYMMDD, must have a dash instead of a dot name = "BlenderKit Online Asset Library" tagline = "Drag & drop of assets from the community driven library" diff --git a/extensions/user_default/blenderkit/ui_panels.py b/extensions/user_default/blenderkit/ui_panels.py index 36bc6ee..19e2bef 100644 --- a/extensions/user_default/blenderkit/ui_panels.py +++ b/extensions/user_default/blenderkit/ui_panels.py @@ -3390,12 +3390,16 @@ class AssetPopupCard(bpy.types.Operator, ratings_utils.RatingProperties): self.asset_data.get("dictParameters", {}).get("sexualizedContent"), ) - from_newer, difference = utils.asset_from_newer_blender_version(self.asset_data) - if from_newer: - if difference == "major": + has_warning, difference = utils.asset_from_newer_blender_version( + self.asset_data + ) + if has_warning: + if difference == "major_newer": warning = ( f"{self.asset_data['sourceAppVersion']} - newer major version!" ) + elif difference == "major_older": + warning = f"{self.asset_data['sourceAppVersion']} - older major version, may be incompatible!" elif difference == "minor": warning = ( f"{self.asset_data['sourceAppVersion']} - newer minor version!" diff --git a/extensions/user_default/blenderkit/utils.py b/extensions/user_default/blenderkit/utils.py index 7e565d5..f02c0fb 100644 --- a/extensions/user_default/blenderkit/utils.py +++ b/extensions/user_default/blenderkit/utils.py @@ -1396,7 +1396,16 @@ def user_is_owner(asset_data: Optional[dict] = None) -> bool: def asset_from_newer_blender_version(asset_data, blender_version=None): - """Check if asset is from a newer blender version, to avoid incompatibility. Give info if difference is in major, minor or patch version.""" + """Check asset vs Blender version compatibility. Warn on any major version + difference (per Blender compatibility docs) and on newer minor/patch versions. + + Returns (needs_warning: bool, difference: str) where difference is one of: + - "major_newer": asset from a newer major version (high risk) + - "major_older": asset from an older major version (possible incompatibility) + - "minor": asset from a newer minor version within same major + - "patch": asset from a newer patch version within same major.minor + - "": no compatibility concern + """ # addons don't have a blender version, so we return False if asset_data["assetType"] == "addon": return False, "" @@ -1410,9 +1419,9 @@ def asset_from_newer_blender_version(asset_data, blender_version=None): asset_ver.append("0") if blender_version[0] < int(asset_ver[0]): - return True, "major" + return True, "major_newer" elif blender_version[0] > int(asset_ver[0]): - return False, "" + return True, "major_older" if blender_version[1] < int(asset_ver[1]): return True, "minor" diff --git a/extensions/www_blenderkit_com/.blender_ext/index.json b/extensions/www_blenderkit_com/.blender_ext/index.json index 9b49035..af57d55 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.21.0-260628","type":"add-on","archive_size":39143952,"archive_hash":"sha256:fbeee0f603b5ca23aeb493d7826051d0d47ec2dd28ce1469b1a0f3197d2e1e8c","archive_url":"https://www.blendkit.com/addon-download/blenderkit.zip","blender_version_min":"4.2.0","maintainer":"Petr Dlouhý","tags":["blenderkit"],"license":["gpl"],"website":"https://www.blendkit.com/get-blendkit/","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","version":"0.1.1","type":"add-on","archive_size":3221,"archive_hash":"sha256:290e3502ded6546478da53ca321a15e1594a2b2bcef260bc02bc9cfcbcd28c31","archive_url":"https://www.blendkit.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.blendkit.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","version":"2.7.0","type":"add-on","archive_size":357801,"archive_hash":"sha256:0821a1b427ac6433ebb2ef0b802c50a48d8e5d268a70743fcec1f1e4c768307f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/b9a4a456-14ab-48c8-8942-1b387e386163/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.blendkit.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, ga","version":"2.0.2","type":"add-on","archive_size":2854741,"archive_hash":"sha256:d925ad69670118b04c21d28ab90bc39e60c434b8b6ba403d59b863459b51c812","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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 w","version":"0.4.5","type":"add-on","archive_size":9390,"archive_hash":"sha256:d283cea78c26d58101e5ba437df4a2e0ac222065039dd4ff33a9f0edb03c7b16","archive_url":"https://www.blendkit.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.blendkit.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","version":"1.0.0","type":"add-on","archive_size":1497,"archive_hash":"sha256:89883f484061eeaa1d810a7675211f87a62807f7d59e7e6bc4f10ed949595421","archive_url":"https://www.blendkit.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.blendkit.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 w","version":"1.0.2","type":"add-on","archive_size":7039,"archive_hash":"sha256:d9323c5ba0a4a3d6443a0091369f3e77a541dcfe14910bf13c54b90c97c55e97","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/13ae67a5-e751-4e40-99f0-b3e4631d9f97/","schema_version":"1.0.0"},{"id":"auto_paint_boundaries","name":"Auto Paint Boundaries [FREE]","tagline":"Paint cleanly inside smart, selection-limited regions with quick","version":"1.1.1","type":"add-on","archive_size":14645,"archive_hash":"sha256:5db1c2668d80db2e149ac3dd75fc2d15b7a6603e2da184468bd3588f29edb496","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/b5efacec-5ae6-46af-9576-79e2cefd69cb/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":["Paint","weight","vertex"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/45dcce2c-0aa2-4fd7-a989-104d9c074165/","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 t","version":"0.2.3","type":"add-on","archive_size":3489,"archive_hash":"sha256:ee0eb525953c0cf7c259636f1b747bc94c5e5f324bd61a1b54fd3c68bfa608bd","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.com/asset-gallery-detail/967c5989-0d66-402a-a1ca-56be2299f718/","schema_version":"1.0.0"},{"id":"batch_bg_cams","name":"Batch BG Cams [FREE]","tagline":"Automate multi-camera setups: Batch import clips, auto-configure","version":"2.3.1","type":"add-on","archive_size":5729,"archive_hash":"sha256:5b9c970deea58baf77051ba10d84244744e4f1ad5c425560a9630664ce3a2e0c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/74b24024-c0c4-40b0-b200-400c078cde58/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":"Hannes Werner","tags":["addon","camera","layout","background","import","timeline","productivity","automation","animation","video"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a30ce0f8-752f-4a55-b0e0-1cee72949d24/","schema_version":"1.0.0"},{"id":"batch_render_manager","name":"batch_render_manager [FREE]","tagline":"A Blender addon for efficient batch rendering from multiple came","version":"1.0.0","type":"add-on","archive_size":14882,"archive_hash":"sha256:9be8f16641985d1efab5f68c4d5c3a1b36c5a0f7a373df1a2f5aa3f13e5a909b","archive_url":"https://www.blendkit.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.blendkit.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 Lay","version":"1.2.3","type":"add-on","archive_size":4335,"archive_hash":"sha256:63187cc826a44655a1f20a4647aacf7c6967bf7007b91ceeb7291725dff35f17","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/052f32bc-4fdb-412c-8eb9-cd158434f84e/","schema_version":"1.0.0"},{"id":"benchmark_fps_v1","name":"Benchmark FPS & Vram refresher helps reduce crashes [FREE]","tagline":"Unlock real-time performance insights in Blender with the Viewpo","version":"1.0.5","type":"add-on","archive_size":7924,"archive_hash":"sha256:b3f167cd024e33a75f6b014429097d8910ad54b87e7cabce765b203a676d8332","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e3f39d7e-5eff-4703-a412-1a4b76006714/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":["memory","fps","gpu","cpu","test","addon","2025","blender","vram","refresh"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/47c7ca2c-4a53-4a7f-a858-34c5fa29dbb8/","schema_version":"1.0.0"},{"id":"motion_path","name":"Better Motion Path [FREE]","tagline":"A blender add-on that allows motion path adjustment inside the 3","version":"1.5.8","type":"add-on","archive_size":13164,"archive_hash":"sha256:c293b0fde8bc921e4ef7bdf8494e5a23d3cb6055f168d8f8ccff1f7c28488ea4","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/4f549895-734c-4ff0-85d1-ed79feac9976/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":"ジディー Jideeh","tags":["Animation","3DView"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/eba7a4e2-886b-48be-a304-4f7c69916793/","schema_version":"1.0.0"},{"id":"blender_revision_lite","name":"Blender Render Lite [FREE]","tagline":"BlenderRevision Lite is a free community edition that lets you r","version":"1.0.0","type":"add-on","archive_size":7727,"archive_hash":"sha256:ae14b80c7ec559f0c88eedf2b48fff0844e336d02789b8dc3a914b70f87738ab","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7925961a-194c-4612-bc12-72e38bed2abd/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":["render","compositing","workflow","optimization","revision","blender","addon","vfx","pipeline","tools"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e6ea1e56-5d03-45de-a0f8-463c7bf6d731/","schema_version":"1.0.0"},{"id":"shader_switcher","name":"Blender Shader Switcher Addon [FREE]","tagline":"The Ultimate Shader & Color Switcher Node System","version":"4.0.2","type":"add-on","archive_size":11114,"archive_hash":"sha256:03b4aed110d4613695a60fd94fd8f7a8d98c358dd5f2b2a813afc093ff642640","archive_url":"https://www.blendkit.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.blendkit.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 mor","version":"1.1.0","type":"add-on","archive_size":274896,"archive_hash":"sha256:531f8552ec19afeb5c55d7fecbeefa97fd456effe6310df0c696457969fab8d4","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/d7529892-10a8-4f96-86de-933d584bb9f5/","schema_version":"1.0.0"},{"id":"body_sculptor","name":"Body_Sculptor [FREE]","tagline":"A powerful Blender addon for advanced body proportions editing","version":"1.0.0","type":"add-on","archive_size":14676,"archive_hash":"sha256:af709f55a754174d26230a8f3cbcacff154bc3c651f46a9851f3aa93c91e174c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c26ff3b2-7474-451e-b957-cfa80dfd8a6f/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.0.0","maintainer":"ANDRIY LIA$HKEVI$H","tags":["blender","addon","body_sculptor","3d_modeling","character_design","character_creator","rigging","proportions","armature","non_destructive"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/75280d36-9b63-45bf-952b-bfa0f2d00a6d/","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","version":"1.0.0","type":"add-on","archive_size":1858,"archive_hash":"sha256:3c9b99fda4e7b5345fbf151c0db1fc14bdb7bcce44f65753ba4c14bb8f4d0666","archive_url":"https://www.blendkit.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.blendkit.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","version":"2.0.0","type":"add-on","archive_size":251303,"archive_hash":"sha256:fdc1a528d7808c897d7cf3469b09921a5b29174cfa6293400f82a1cd0eb65efb","archive_url":"https://www.blendkit.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.blendkit.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 objec","version":"4.3.0","type":"add-on","archive_size":6791,"archive_hash":"sha256:eab0f22f85eeb43acd57024e2f967002c09f335c83a8163bcc64ff0005fa7510","archive_url":"https://www.blendkit.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.blendkit.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 assig","version":"1.0.0","type":"add-on","archive_size":1838,"archive_hash":"sha256:c066fafb8e07e092ad7f5f806f042f71662cc6183657be1ef1f2a0c861cc08f5","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/1a9af258-e75e-44c8-81e9-869249addb8d/","schema_version":"1.0.0"},{"id":"camera_switcher","name":"Camera switcher [FREE]","tagline":"Quickly switch between all cameras in the scene from a dedicated","version":"1.0.0","type":"add-on","archive_size":2308,"archive_hash":"sha256:fe505d31d4cbc6a364c8a48b63aafc8d04e816b041fcbe852f5da61bddc1025d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/68c92d93-988d-48f7-95c1-bdb084c22362/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.00.0","maintainer":"Remigiusz Waluś","tags":["camera","view","active"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/056e30fd-f62d-4fb4-9a53-95be346475c3/","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","version":"1.2.2","type":"add-on","archive_size":513576,"archive_hash":"sha256:61fc9b726002f7cd17ffb5b1e54bfa1827e8edf538881e72749f4faf931dc384","archive_url":"https://www.blendkit.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.blendkit.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","version":"1.0.0","type":"add-on","archive_size":1490,"archive_hash":"sha256:607cf00fe41582b4eaeb640cb6ad8dc9944731be643022c810fbb2a799abef0b","archive_url":"https://www.blendkit.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.blendkit.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 starte","version":"1.0.0","type":"add-on","archive_size":135827,"archive_hash":"sha256:d2d49d2c9665add7c55181a343759dde9bfa5de723d4bb3075b93694822d46ac","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/f8432983-2d65-4d16-a7ef-36ee5fcc7220/","schema_version":"1.0.0"},{"id":"cgheven_blender","name":"CGHEVEN Asset Library [FREE]","tagline":"100+ Cloud VDBs (fire, smoke, tornado, portals, explosions, dust","version":"1.0.0","type":"add-on","archive_size":138712,"archive_hash":"sha256:f4f3d8461ac1edb6f56b6e3a56b5047784bb854606fa01cdbc40cf99255cdfe4","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c16124bd-9c82-44c8-82eb-51dc2cc79e7f/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":"CGHEVEN","tags":["free","VFX","VDB","Flipbooks","clouds","fire","explosion","Magicfx","3dscan"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/ba084cd6-c1af-459f-8d71-f645489708ba/","schema_version":"1.0.0"},{"id":"cleanx","name":"CleanX [FREE]","tagline":"CleanX is a Blender right-click menu addon designed for 3D asset","version":"1.0.0","type":"add-on","archive_size":13355,"archive_hash":"sha256:4e312c21ac1dbb00023ab28c841ff7acd14ea714250363ae6b32f8fbba538cb3","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/797da2fb-3b8a-49dd-8bb0-62e0474258a0/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":"Free poly","tags":["clean","texture","delete","pack","model","packages","compress","resize","snap","hierarchy"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/307f20ee-8d34-4371-9bb0-5f417f43e870/","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.blendkit.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.blendkit.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 transfor","version":"2.0.0","type":"add-on","archive_size":1925,"archive_hash":"sha256:0b5ea205238edbd92d77f10ac909b9e66fda38c14bdc05a52e4253c10bece865","archive_url":"https://www.blendkit.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.blendkit.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 yo","version":"1.5.0","type":"add-on","archive_size":4799,"archive_hash":"sha256:49bbf5981614ed4fef283a4501654b98312dc61ea0790cab12e856f66f875a84","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/cafb5d64-82e6-45d5-ae1f-2a6c504a3838/","schema_version":"1.0.0"},{"id":"custom_snap","name":"Custom Snap [FREE]","tagline":"Custom Snap is a fast addon that enhances the default snap syste","version":"1.0.0","type":"add-on","archive_size":2927,"archive_hash":"sha256:4b3745f1bc6df4dd0f9575248ded2a3a11ed5858bfa3d5e85a99396d0b1baf65","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/053f20f2-683f-46c3-b7d1-79c47453eb13/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.0.0","maintainer":"Jeslin Paul","tags":["3DView","snap","origin","selection"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0e6e9617-b4f3-4267-adca-e8a2d557f509/","schema_version":"1.0.0"},{"id":"Delete_Loose","name":"Delete Loose [FREE]","tagline":"with this handy addon, you eliminate smaller and loose parts of","version":"1.2.3","type":"add-on","archive_size":2391,"archive_hash":"sha256:9fdf99f92ab399377ec92a0d3bf25bce5891384b9a0ed61ce8def18314b60f58","archive_url":"https://www.blendkit.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.blendkit.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 consta","version":"1.0.0","type":"add-on","archive_size":2873,"archive_hash":"sha256:9d0cb8dbcfadb9e4e70c7ba952299be23f179d4d458951db659f0a5a551f7670","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/f7a51ab2-f758-464f-817b-ad010cb643bd/","schema_version":"1.0.0"},{"id":"dice_forge_pro","name":"Dice Forge Pro [FREE]","tagline":"Generate canonical polyhedral dice (D4–D20, D100) with text, cus","version":"1.1.1","type":"add-on","archive_size":36003,"archive_hash":"sha256:75344c4ace13fa032f5cb7cc4a0c823bc09057180faeb77c68cc026055f0b865","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9e97f36d-99ac-4e8f-807b-e0f09fccfa8f/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.0.0","maintainer":"Fabio Malvaldi","tags":["ttrpg","rpgdice","dicemaker","dicegenerator","tabletoprpg","dnd","3dprinting","customdice","RPG","DICE"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/fbf85f8a-1963-420d-a8d7-6c54b538fcf0/","schema_version":"1.0.0"},{"id":"down_to_earth","name":"Down-To-Earth [FREE]","tagline":"Auto-snap any object to the nearest surface in your scene — no s","version":"1.0.0","type":"add-on","archive_size":6404,"archive_hash":"sha256:8e008319495acce4379943ad4ee198a531d7a6367cffdc245b8a8e23c5f410f7","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/dab12edc-301b-4772-b1fd-a5abe89bf212/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":"GoldFish CG","tags":["Snap","Tool","base","surface_snap","placement","object_tool","scene_assemble","one_click","grounding","productivity"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/81e4af0c-b0a4-4c7d-b7b4-190afdbd1e99/","schema_version":"1.0.0"},{"id":"easy_measure_tool","name":"Easy Measure Tool [FREE]","tagline":"A lightweight add-on for quick measurements","version":"1.8.3","type":"add-on","archive_size":11147,"archive_hash":"sha256:d8e8f97500e44d4e9c77fe133dccca151df3f1c08f7aa50e7e7feaa0adbb8010","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/8142dce2-f9c4-4f20-a5c6-402460d5f145/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.blendkit.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 a","version":"1.0.0","type":"add-on","archive_size":4790,"archive_hash":"sha256:2aad46cd10d876e3ab5d5f69a927c9b423a0f2d14eb47fbedbd6c380f65293cc","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/f31d8f0b-ee2b-45ec-9f4b-4aae75a7160f/","schema_version":"1.0.0"},{"id":"essential_tools","name":"Essential Tools - Ultimate Blender Workflow Utility Addon [FREE]","tagline":"The only utility toolset you need: Set origins, batch rename, al","version":"1.2.0","type":"add-on","archive_size":8386,"archive_hash":"sha256:82f74b1ca38610307c632f973a30b46d1b657debd85c64db871d01b69c98ad74","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/56c9a4f9-8a62-420b-9434-90fe387ae942/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"3.0.0","maintainer":"The Smart King","tags":["Mesh","blender","blender","workflow","batch","booster","origin","essential","batchrename"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/80aefc7f-9502-4e57-8cb9-6a3e3ec089f3/","schema_version":"1.0.0"},{"id":"facemesh_capture","name":"FaceMesh Capture (MediaPipe) [FREE]","tagline":"Create a textured FaceMesh from webcam or photo using MediaPipe,","version":"0.4.0","type":"add-on","archive_size":11286,"archive_hash":"sha256:8714eff32dcda7ff8fc554d0714ae815805c17f6def1b4e45027d6ff0e3a9dc8","archive_url":"https://www.blendkit.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.blendkit.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 suppor","version":"2.0.0","type":"add-on","archive_size":4059,"archive_hash":"sha256:77bbac7d17fd132350d9bf065ef2c2de2f4f575fec639d72149d7cb0d5ab77d3","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/7d69be65-9004-4469-bd9c-beb29e1ec99b/","schema_version":"1.0.0"},{"id":"global_clip_sync","name":"Global Clip Sync [FREE]","tagline":"Adjust Clip Start and Clip End across all Blender workspaces fro","version":"1.2.0","type":"add-on","archive_size":1725,"archive_hash":"sha256:928d5139fbc88bd54e54eafa1d46833264d8ef7d622ebfb7c4991729588645d5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/1112186c-ba61-43b7-83d3-e607ef234c4d/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"5.1.0","maintainer":"Leo Villanueva","tags":["Viewport","Clipping","UI","View","Tools","Clip","Display","Distance"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d673a38f-4133-495e-9875-fb020048cef0/","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 Sta","version":"1.0.0","type":"add-on","archive_size":2292946,"archive_hash":"sha256:b77a68f7e34b9c5f9c66fafef6825a0575fe8605c8da51a567dff3cd94fa358f","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/26a86759-a4b3-4545-ad67-106a89737f54/","schema_version":"1.0.0"},{"id":"graphi_free","name":"Graphi Free [FREE]","tagline":"Graphi Free is a lightweight Blender add-on for shaping easing c","version":"1.0.0","type":"add-on","archive_size":5009,"archive_hash":"sha256:f1336e92f03ccf6314eab0c9cf739b95316d9da669e10294e146b5d1c5495b3d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e508361c-87aa-4460-8427-f354e4cdf83d/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":"AHMED KETTUR","tags":["Animation","GraphEditor","Keyframes","Addon","Easing","Bezier","FCurves","MotionDesign","Workflow","3DAnimation"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a3ac0ded-6b76-40bb-83d3-9a8ef1d547f6/","schema_version":"1.0.0"},{"id":"item_transform","name":"item transform [FREE]","tagline":"A Blender addon that provides quick transform operations for sel","version":"1.0.2","type":"add-on","archive_size":6957,"archive_hash":"sha256:6a78724c1d6cb68d9a691c6f2e8403844860a064f9257d0b22eac7a124bc7ecf","archive_url":"https://www.blendkit.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.blendkit.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","version":"1.3.1","type":"add-on","archive_size":6538,"archive_hash":"sha256:afe900cdb0a244c3f4aadab240cbfc5ce0942f68673803924e7ed72d4023d406","archive_url":"https://www.blendkit.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.blendkit.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","version":"1.1.1","type":"add-on","archive_size":54772,"archive_hash":"sha256:2ef9d7ad94bce0ff2e811677230a5daa4f8fc607fa1123478d923f624fa933d0","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/8626f2ca-193c-4f15-8011-200c5d0a2e9b/","schema_version":"1.0.0"},{"id":"Lets_turn_on_fake_user","name":"Let's turn on Fake User [FREE]","tagline":"Are you tired of Blender delete your file(s)?, Even though you s","version":"1.0.3","type":"add-on","archive_size":6837,"archive_hash":"sha256:3815d47845cdb03a46c26891a69e7be9b4fd2952e88081a327f92244bf4ec4e1","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/4bfd4128-90b5-40cc-aa29-3b48be5b8b14/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":"Theiyn tnz","tags":["System","Workflow","Animation","Save","FakeUser"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e1c19457-113b-4f5d-b1f2-317318942cb7/","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 n","version":"1.0.0","type":"add-on","archive_size":2046,"archive_hash":"sha256:46ac6e96e5eb3cda09a1ad70342f492abcc28b276ceba020a2c891e50c016820","archive_url":"https://www.blendkit.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.blendkit.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","version":"1.0.0","type":"add-on","archive_size":2026,"archive_hash":"sha256:07c076a2f8e842a5eb167a7e90f64a5805ccd2582d78625da664d833a61e1b82","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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 geomet","version":"1.3.0","type":"add-on","archive_size":10274,"archive_hash":"sha256:1293382cde627aa9f16c8c25e9e2e2775ee8b1793ebf672f87ccbc60e5f672cf","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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 professio","version":"0.1.0-beta","type":"add-on","archive_size":107115,"archive_hash":"sha256:fc2a66562a83772e8752a1d4acad647634ef20c09e117578924b3adc62d249f5","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/20da5129-5479-4f45-a450-ef70cfc0ee5e/","schema_version":"1.0.0"},{"id":"teca3d_mesh_welder","name":"Mesh Welder - Merges Two Meshes into One, and Vice Versa [FREE]","tagline":"Mesh Welder is a simple add-on for merging and splitting models;","version":"1.1.0","type":"add-on","archive_size":10360,"archive_hash":"sha256:f3e75ef3a17e04447cf9a2ae943654026ab15fcf431029722a57de242d5bb385","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/cd7b88aa-a1f9-4c7a-a027-bbb6c84a2f0e/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"5.0.0","maintainer":"TECA 3D","tags":["3DView","Mesh","UserInterface"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a467e686-8d87-473a-9aa6-39154f685dfa/","schema_version":"1.0.0"},{"id":"multi_object_export","name":"Multi Object Export [FREE]","tagline":"Export multiple selected objects individually in one click using","version":"1.3.0","type":"add-on","archive_size":7107,"archive_hash":"sha256:54acc7d04a2938e3da46c303d15f131960209d60c4e91fb8792410ff4342c04f","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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","version":"1.0.3","type":"add-on","archive_size":4752,"archive_hash":"sha256:e59fd49dbc701c9f45705e7f28dcf4d5d93dc13bf8820a5c8bf813a50c33b1e7","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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 hier","version":"1.2.1","type":"add-on","archive_size":2022,"archive_hash":"sha256:92acc75cacffd655deae6760fe888a19acfbc48e5366bb232adb202a28c1b8ac","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/da7cfd8c-36eb-44ef-b5b5-44cf92c63506/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.blendkit.com/asset-gallery-detail/67ab12d4-3e48-4bce-affb-30a6b6095fb2/","schema_version":"1.0.0"},{"id":"pinned_modifiers","name":"Pinned Modifiers [FREE]","tagline":"Pinned Modifiers is a Blender add-on designed to speed up our mo","version":"1.0.0","type":"add-on","archive_size":21507,"archive_hash":"sha256:c17a73e1a8c07ffc63c9c58626fd38e72e939fc23a2b6f122b59a20374ea77e6","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/eb576247-2e8e-4b41-9b81-b82243cf9e4a/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.3.0","maintainer":"Francesco Yoshi Gobbo","tags":["UserInterface","Modeling"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2f242640-80dc-45d1-9baf-bc0de85e1fc5/","schema_version":"1.0.0"},{"id":"pomodoro_timer","name":"Pomodoro Timer [FREE]","tagline":"Boost your productivity with this amazing N-Panel widget! If you","version":"1.0.0","type":"add-on","archive_size":5004,"archive_hash":"sha256:3ae73f0701bbae44934d253689dea84f7858f61f3a5e88c02966623c911cede3","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/e382a037-62c0-4266-a312-9c4fecf2e494/","schema_version":"1.0.0"},{"id":"procedural_building_generator","name":"Procedural Building Generator [FREE]","tagline":"Create instant, game-ready 3D cities with the Procedural Buildin","version":"1.0.0","type":"add-on","archive_size":10370,"archive_hash":"sha256:cc91376be52c17e60fd7657b12eb03e49da8b020571610a6a86147cc55d5cce3","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/429bb6e8-0c26-400b-8545-c60984c390b7/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":["AddMesh","Modeling","addon","procedural","building","generator","plugin","city"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/040d9c18-3746-4987-a087-8257751611a4/","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.blendkit.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.blendkit.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 ca","version":"1.0.0","type":"add-on","archive_size":2587,"archive_hash":"sha256:bd88afe070d59e6df44c4d7e2f6a264508f31cb96d67edda45d5dc5adbd22dab","archive_url":"https://www.blendkit.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.blendkit.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,","version":"1.1.0","type":"add-on","archive_size":5948,"archive_hash":"sha256:7cd0d15de0a31d89fa52284f109c191164e99f4ac31ef151f9b32f5d362413c9","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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. Simp","version":"1.3.0","type":"add-on","archive_size":3248,"archive_hash":"sha256:9a6d7fcdf5ab075c3731d5253413f71fc7b5b92c4e8ccec5ebbb2d8100380720","archive_url":"https://www.blendkit.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.blendkit.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, Sm","version":"1.0.0","type":"add-on","archive_size":3266,"archive_hash":"sha256:d1bbf787a368b4f2dd956c1cb14710bc9b3caa76fd1ca56b9a4fbdc56b4ea6c2","archive_url":"https://www.blendkit.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 Shahbaz","tags":["Object"],"license":["default_addon_license"],"website":"https://www.blendkit.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.blendkit.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.blendkit.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,","version":"1.1.4","type":"add-on","archive_size":182021,"archive_hash":"sha256:d62a0e5ac70943ea42fa5d54d7e047792b45b16cb0e602f8278369c3e1fb5500","archive_url":"https://www.blendkit.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.blendkit.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 b","version":"2.0.0","type":"add-on","archive_size":16684,"archive_hash":"sha256:5b3b0b59abad0e887e6b5b9511ef3ef64830b75e0ddfabaabdbdf82283efabdb","archive_url":"https://www.blendkit.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.blendkit.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 & displacemen","version":"1.3.3","type":"add-on","archive_size":161147,"archive_hash":"sha256:9efc25e28b0dd1199d59f501ad1625e046cbb5616c1634660e6166bf96076199","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/a2d0027b-8cc7-450e-9e6e-18e4c8e7f734/","schema_version":"1.0.0"},{"id":"ReadyScene_addon","name":"Ready Scene 1.0 [FREE]","tagline":"Ready Scene– Blender Addon for Quick Scene Setup","version":"1.0.0","type":"add-on","archive_size":4741,"archive_hash":"sha256:6c17f1d4f95da37b2375b5a26890db5cc21eb8cc4dbd620187aeccb89582a928","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f2eacecd-ef95-4fa2-b6ef-8d25415f29a9/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":"ANDRIY LIA$HKEVI$H","tags":["parallax","scene","camera","layers"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0f55cc80-1fdd-4d66-9346-9614039486d6/","schema_version":"1.0.0"},{"id":"reflectiveaudiomachine","name":"Reflective Audio Machine v1.3.4 [FREE]","tagline":"Reflective Audio Machine - Turn Your Music Into 3D Visuals in Bl","version":"1.3.4","type":"add-on","archive_size":36299830,"archive_hash":"sha256:1695810a6bb5809540f9d07093a5d3acad3215b683450c01fc25560827ececc6","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/6455ae0e-e1af-42df-81b9-e3b73f7cc4cb/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.5","maintainer":"Jacques Durocher","tags":["audio","sound","music","wav","visualisation","reaction","react","animation","pulse","wave"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/11608830-074c-4fc8-94ba-4fbd90a87531/","schema_version":"1.0.0"},{"id":"reflux_addon","name":"ReFlux Render Optimizer [FREE]","tagline":"⚡ ReFlux — Faster Renders, Smarter Workflow","version":"1.0.0","type":"add-on","archive_size":6105,"archive_hash":"sha256:319dd16b471cf3e1e9254952ae12851b5f3a63381372b548282c4a13aee49c24","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/35d38941-00bf-4349-b7aa-f88f41339dc4/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.0.0","maintainer":"Swastik Rout","tags":["rendering","render","fast"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/5aefa8de-dde0-4c0f-a7d6-8b01b75ea519/","schema_version":"1.0.0"},{"id":"render_alert","name":"Render Alert [FREE]","tagline":"An addon that alerts the user once blender is done rendering","version":"1.1.2","type":"add-on","archive_size":2979,"archive_hash":"sha256:3f749a92dff7e039724e9a8b9f1d08700f282c0671eace50ac0a0dd8a86e0394","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e162ae62-7936-45a4-adb6-a4aa222e4d80/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":"ジディー Jideeh","tags":["Render","UserInterface"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/bdc3f751-d493-4997-847b-77f328d560f5/","schema_version":"1.0.0"},{"id":"rendermanager","name":"Render Manager [FREE]","tagline":"Render Manager - A render queue management tool for Blender. Cre","version":"1.7.0","type":"add-on","archive_size":4101,"archive_hash":"sha256:d657357fbdb72f75d28157d2d98cc0dd58e93e7e9966f1dba9121b8ca4da4530","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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":"5555dnl_3d","tags":["render","scene","studio","toolkit","preview","libary","asset","lighting","presets","setup"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/5238fe33-ff61-4add-bee5-27c885666c89/","schema_version":"1.0.0"},{"id":"scatter_directional","name":"Scatter Directional [FREE]","tagline":"Precise density and orientation controls (primarily to follow th","version":"1.2.0","type":"add-on","archive_size":9904,"archive_hash":"sha256:88676fc546dd29d363628a11a83ad2d03d21735fbf2f5b348910ef3ab7851592","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/3d6829ba-ee12-445d-93a7-a4ffcf10b336/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":"3DFIGURES rian","tags":["scatter","directional","proxy","previewer","trianglepreviewer","randomize","convertmesh","aligntonormalorientation","orientation","normal"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0facc425-e629-414c-b30b-397abf1a01ce/","schema_version":"1.0.0"},{"id":"scene_data_exporter","name":"Scene Data Exporter [FREE]","tagline":"Exports scene data for AI analysis (TXT/JSON)","version":"1.26.0","type":"add-on","archive_size":9942,"archive_hash":"sha256:08675fc6fa158c3d99eb5c47f19186237d58608d42dc8681bf045e7294bf44ef","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/5f6b80d0-8db7-47e8-9e56-e16e55aed861/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":"Joachim Bornemann","tags":["ai","export","json","data","workflow","scene","python","automation","analysis","development"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2c90b1d0-f252-4510-abc5-880d1aa6826b/","schema_version":"1.0.0"},{"id":"scriptpilot","name":"ScriptPilot [FREE]","tagline":"A lightweight add-on to increase search and navigation functiona","version":"1.2.0","type":"add-on","archive_size":12017,"archive_hash":"sha256:417168679a551ce8c6ec5a74e6955efa953bef5bf80fe7a83157b03e303eb5d8","archive_url":"https://www.blendkit.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.blendkit.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","version":"1.0.4","type":"add-on","archive_size":4277,"archive_hash":"sha256:56b28e5fb681ea4ab21f6539c6264e5eaa209a30df9ce3b1fb58a70ee2ffc748","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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","version":"3.0.2","type":"add-on","archive_size":49645,"archive_hash":"sha256:cd64d1e255d54f373ee9220c0a208ce299dc0169faa307af642de46cd402c51f","archive_url":"https://www.blendkit.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.blendkit.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":551003,"archive_hash":"sha256:86b18a7ba0d743812eb871e1a573b3d58ca66bdfc78077aa1cf7a59f65d3e11b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/5bfc561c-3796-4225-899d-efed286bd197/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.blendkit.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","version":"1.5.3","type":"add-on","archive_size":9723,"archive_hash":"sha256:d278b9416739f1baf80bc178f8b621cc198bd2353a22b0b8da5a0188115357ab","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/4043ed89-4af5-4502-828b-5fc3f5ec55e1/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.80.0","blender_version_max":"5.0.0","maintainer":"Yakiv Sankov","tags":["gamedev","rigging","animation","addon","scale","unity","unreal","fix_animation","armature"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/8d205ca1-cbf6-4a10-903f-0148e9d631a0/","schema_version":"1.0.0"},{"id":"sol","name":"SOL [FREE]","tagline":"8 one-click particle presets for Blender: sparks, fire, firework","version":"1.11.0","type":"add-on","archive_size":59092,"archive_hash":"sha256:9383c79b02a06833c6c7fdfd7bcb4f5e4124c8b72fb3ad1c209a8cec5ab1a60c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/562ad6a9-f189-4bb9-8d66-18bff85d1c34/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","blender_version_max":"5.2.0","maintainer":"Cloudy Sky","tags":["Object","Physics","presets","particles","fx","Fx","Vfx","VFX"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/4b2ad94d-559b-4705-9009-323d60693976/","schema_version":"1.0.0"},{"id":"solo_mode","name":"Solo Mode [FREE]","tagline":"Solo Mode helps Blender artists work faster by isolating selecte","version":"1.0.3","type":"add-on","archive_size":3323,"archive_hash":"sha256:8890473d4c81ed5b3c9e66a25c4c0205cca146e3e48e9c050fb3d5a2c256166a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/ed1a7e7a-b8bf-457f-9dd7-c07bdd5aa89b/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"3.6.0","maintainer":"Vincent Ilagan","tags":["3DView","Object","3D","View","Workflow","Productivity","Viewport","Solo","Solomode"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/fd8b8c65-7ded-48f1-afa7-b2908baafcdc/","schema_version":"1.0.0"},{"id":"subdivide_selected","name":"Subdivide Selected [FREE]","tagline":"This plugin applies subdivision to a selection with clean topolo","version":"1.2.3","type":"add-on","archive_size":2597,"archive_hash":"sha256:f964bb44f8f1dccfa4cb7c880b5fc3b742b749190e88ec0b39b57842c0097bf8","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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 al","version":"1.0.0","type":"add-on","archive_size":19532,"archive_hash":"sha256:1cfb365cb2667c8d5a600275a81ba033c21e426423885d228fd57aa85c525d3d","archive_url":"https://www.blendkit.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.blendkit.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 Landsc","version":"2.1.0","type":"add-on","archive_size":1891,"archive_hash":"sha256:e6bc031d13a16343fd7f0672f97edbb5567ef29600b457881be11c477cfa1c42","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.com/asset-gallery-detail/d55d15f7-22f3-433f-9e6a-e7b3544256c0/","schema_version":"1.0.0"},{"id":"texture_bakery_image_buddy","name":"Texture baking image buddy [FREE]","tagline":"Add-on for creating empty images and their image texture nodes i","version":"1.6.8","type":"add-on","archive_size":134546,"archive_hash":"sha256:384048dd9e5c08c899b7d19c453a5be841b9b8ba89064ed607d5ba21fe479204","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/4c531eb1-ecd6-4b20-835c-85e8bcce698f/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":["Material","Node","Workflow","Baking"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/c52a840f-f69b-48c9-92ff-520bd166ecab/","schema_version":"1.0.0"},{"id":"texture_upscaler","name":"Texture Upscaler - Offine Image Upscaler For Blender [FREE]","tagline":"This addon lets you upscale your textures in image editor","version":"1.3.0","type":"add-on","archive_size":200727626,"archive_hash":"sha256:6a71e383d902259c98be3deed66ebb7426c32aa2faf638295e6e4a0ab15078e5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/6964e35b-6cf3-484e-ab91-e8600f5b418f/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":"Haseeb Ahmed","tags":["upscale","texture","PBR"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/999f5f40-469c-4d46-8647-42babafe320e/","schema_version":"1.0.0"},{"id":"amazing_hypotrochoid","name":"The Amazing Hypotrochoid 1.0.9 [FREE]","tagline":"Generates intricate hypotrochoid curves with adjustable paramete","version":"1.0.9","type":"add-on","archive_size":28189,"archive_hash":"sha256:25a502b65b9332a0b53c601d66096dc8a1ceaf7af82ea7cf510d832b0b910c0e","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.com/asset-gallery-detail/efb9a92c-fe00-40dd-a3cd-70c4086143c0/","schema_version":"1.0.0"},{"id":"tmeasure","name":"Tmeasure v1.1 [FREE]","tagline":"It accurately calculates the curved or linear edge paths of the","version":"1.1.2","type":"add-on","archive_size":4978,"archive_hash":"sha256:112307b7d10a7d3e66ca7245e8f52aa4a5df709d1c453bcd1ffc268472f4b9bf","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/26d14398-683e-48ff-8c34-dd15191bcae3/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 Tonka","tags":["Mesh","Modeling","3DView","measure","calculation","measurement","precision","tools","hardsurface","editmode"],"license":["default_addon_license"],"website":"https://www.blendkit.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 Emu","version":"1.4.0","type":"add-on","archive_size":1343,"archive_hash":"sha256:e0eb54d5bc012e9d262c255df472ac0cdcf194a366f914d4c488525ed795c497","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.com/asset-gallery-detail/fb812bd3-5913-4549-91fc-1ff8e5c486b7/","schema_version":"1.0.0"},{"id":"tuberig","name":"TubeRig — Make your rig controls actually visible [FREE]","tagline":"TubeRig takes your existing Custom Bone Shapes and wraps them in","version":"1.1.0","type":"add-on","archive_size":24455,"archive_hash":"sha256:02d6cec8b3486cbe1e84272c5af48e13b78d8e801feb1b1ff7b39ed155cb32f5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d1cd8f43-1581-4de9-97dc-326c0bcfd853/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":["Rigging","Animation","Addon","bone_widget","custom_bone_shape","geometry_nodes","rig_controls","tuberig"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e2da7972-168a-4dd1-a415-f971c73a8503/","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.blendkit.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.blendkit.com/asset-gallery-detail/8ebcbb43-4807-42e2-9ae1-9bef04b58aea/","schema_version":"1.0.0"},{"id":"xcut","name":"XCut [FREE]","tagline":"Cut (Ctrl+X) for Blender's Outliner and animation editors","version":"1.0.0","type":"add-on","archive_size":4238,"archive_hash":"sha256:4065b43f89015d76880252c2d8e2b3a2e91ed19a304f71c5c11f5c60a1c5bc11","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c0561ccb-79ea-4633-86e7-122673f9a21a/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","Scene","Animation","cut","edit","useful","Cut","shortcut"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/73d5e3e9-c9e5-43d6-91e6-11ea780a3004/","schema_version":"1.0.0"},{"id":"cobweb","name":"Cobweb [FULL]","tagline":"FULL plan required - upgrade to download","version":"2.2.1","type":"add-on","archive_size":50711,"archive_hash":"sha256:0706d2533db72a8d7e824ede71d7bfe84e3fea73a6454b3c3672900d7a8b8b41","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/20d48d8d-39a5-4d1f-9fb0-994401b2a9c2/","schema_version":"1.0.0"},{"id":"final_topology","name":"Final Topology for Artists [FULL]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":627177,"archive_hash":"sha256:0a9d55a9a02cb026fa969eeaf7f7eb11258732eeb8322e09c136e28da0aa8a4f","archive_url":"https://www.blendkit.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":"Blendkit Community","tags":["System"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/388b195c-5a7d-4d9f-a632-0dac12c9198c/","schema_version":"1.0.0"},{"id":"two_d_people_archviz","name":"2D People [Before: $11.99, Now: $9.59]","tagline":"FULL plan required - upgrade to download","version":"1.6.0","type":"add-on","archive_size":256485,"archive_hash":"sha256:ab84c4836a19c106c9c4cc64772b1a793c71c119258eacb7efaf532d9857d4cd","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2f40621f-a3c3-4b2f-9266-11e3b7e3be2c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"9.59","blender_version_min":"4.3.0","blender_version_max":"5.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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":42045461,"archive_hash":"sha256:9b8c84af187c955f914a5b0b78e1e4284e0b59c0c1fe1a9c2ac28f18ee7d1e2d","archive_url":"https://www.blendkit.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.00","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":73577,"archive_hash":"sha256:b1aff6a799bce2cb9891d217dc2795c1b57830f81d430e40fd15fbd613798a92","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"3dquads blender","tags":["Material","Texturing","Procedural"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.1.1","type":"add-on","archive_size":41658,"archive_hash":"sha256:d1e2b4545aafd73466c8f3525f2f7baf2ac4fc418e20fb31c9eed4ead61cf0f1","archive_url":"https://www.blendkit.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.00","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.blendkit.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: $4.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":26641,"archive_hash":"sha256:390d9e74a4786fd18958d7bf5adb8f9eb9bbc60527a136e8b6f8da045d63e054","archive_url":"https://www.blendkit.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":"4.80","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":12066,"archive_hash":"sha256:52f11f2ebfd2f323c7f6d0497bc4cf7f9e182c956a59bc06f8333316769f3b24","archive_url":"https://www.blendkit.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.00","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.blendkit.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.59]","tagline":"FULL plan required - upgrade to download","version":"2.8.0","type":"add-on","archive_size":11078,"archive_hash":"sha256:99844c2df0e2bd04d5f1326e199a57507ad60affc64223a7b5809b33e0c23997","archive_url":"https://www.blendkit.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.59","blender_version_min":"4.2.0","maintainer":"Zahit Erdem Guzel","tags":["ai","gemini","addon","blender","shortcut"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/4f4adf7a-d4c9-400d-85ee-53b73a3cc14f/","schema_version":"1.0.0"},{"id":"align_distribute_objects_pro","name":"Align & Distribute Objects Pro ULTIMATE [Before: $2.00, Now: $1.60]","tagline":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":4516,"archive_hash":"sha256:198a0ba8b51c2fea507da48921704fdc39f6f506420881efd7b3b689c543f7f5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9f79e7e7-f980-427d-88fb-96b0ef350e39/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.60","blender_version_min":"4.0.0","maintainer":"isac lima","tags":["Object","Modeling","Scene"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/14106c2f-74a6-4d17-9447-a93f2bd0b56f/","schema_version":"1.0.0"},{"id":"align_toolkit","name":"Align Toolkit [Before: $5.00, Now: $4.00]","tagline":"FULL plan required - upgrade to download","version":"1.1.1","type":"add-on","archive_size":15041,"archive_hash":"sha256:024b25133b7ba4de512a7043fcd1fdf4e1dda61fb407db9118d477cb293743b4","archive_url":"https://www.blendkit.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.00","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":20121,"archive_hash":"sha256:393d1f896b9aba97226956a59a1b15cc0d0ae501517ab8c54a46603f967b3eb9","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","colors","colour","palette","generator","color"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $32.00]","tagline":"FULL plan required - upgrade to download","version":"2.5.0","type":"add-on","archive_size":64598868,"archive_hash":"sha256:2c2840bbfceada6d70b37dfac28bae7e3b347be5ad871d64332b24c91bb647a8","archive_url":"https://www.blendkit.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":"32.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.blendkit.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: $16.00]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":385592,"archive_hash":"sha256:b72f2d7159a888113322cda4646363adb8e52698b1af624e0e4c4fcdcf380133","archive_url":"https://www.blendkit.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":"16.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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":11811259,"archive_hash":"sha256:a6da266309f0c9e57df4ac8c73c96a8cc539751b413283b5d8c53c42bc055236","archive_url":"https://www.blendkit.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.00","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.blendkit.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.40]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":187750,"archive_hash":"sha256:ab0672cd273718e0b180a0b62885c7700f3a9c87e012368f4aaa56135563802b","archive_url":"https://www.blendkit.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.40","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","pixel","pixelart","2d","shader","workflow"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $52.00]","tagline":"FULL plan required - upgrade to download","version":"1.1.4","type":"add-on","archive_size":174446,"archive_hash":"sha256:6ba53c2008f5ebbe9eb4cd5a58b37f2cf008729a95875a37dffc32628af00b6d","archive_url":"https://www.blendkit.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":"52.00","blender_version_min":"4.2.0","maintainer":"David Hallows","tags":["animation","character","keyframing","graph","editor","motion","workflow"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/fe9df247-5dd5-441d-91dc-aafdde63db3e/","schema_version":"1.0.0"},{"id":"animation_layers","name":"Animation Layers [Before: $30.00, Now: $24.00]","tagline":"FULL plan required - upgrade to download","version":"2.4.1","type":"add-on","archive_size":99251,"archive_hash":"sha256:9c20bef2b59833a0663a26d96dabb2eceaa71760be15bd49922c5e132c3584b6","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/14f01b6a-4082-4c6c-8229-9ac05d0d3158/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"24.00","blender_version_min":"4.2.0","maintainer":"Tal Hershkovich","tags":["Animation","layers","motion","capture","mocap","nla"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/797ac060-785e-49dc-a98f-d0ecf4abc555/","schema_version":"1.0.0"},{"id":"anime_outline","name":"Anime Outline [Before: $10.00, Now: $8.00]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":740454,"archive_hash":"sha256:be4d38ab3ece3bc788ffa1ada8dfd9883925db1ecd6916a34937adfa56aab70c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/5d916717-58fe-4e6e-b6b8-1d10ee208c75/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.00","blender_version_min":"3.6.23","maintainer":"Andy Hellgrim","tags":["Modelling","Import","Export","Outline","Anime","Eevee"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/6a6bb31d-7a31-456f-a05c-dae63d03a1c5/","schema_version":"1.0.0"},{"id":"animtex","name":"AnimTex - Animate Texture Transitions [BETA] [Before: $19.00, Now: $15.20]","tagline":"FULL plan required - upgrade to download","version":"1.0.8","type":"add-on","archive_size":1581140,"archive_hash":"sha256:880d8c49a4b1f7dcfec4993eeb2e07e027f302f5bf515e8393a6aad62c3dceb9","archive_url":"https://www.blendkit.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":"15.20","blender_version_min":"4.2.0","maintainer":"Doctor Legion","tags":["3DView","Material","Animation","Texture","Disolve","Disintegrate","Effect"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/f1f0d459-3a41-45bb-a502-8eb0fc86fd85/","schema_version":"1.0.0"},{"id":"archiform","name":"ArchiForm [Before: $1.00, Now: $0.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":42977,"archive_hash":"sha256:85b7c71aea23717ad2cd040897a2cf31a74b22b23691d2b00bf1c9cf5bfd25f6","archive_url":"https://www.blendkit.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.80","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.blendkit.com/asset-gallery-detail/7ce6dc77-79fc-4a75-8f35-f241946e834c/","schema_version":"1.0.0"},{"id":"archviz_camera","name":"Archviz Camera [Before: $28.00, Now: $22.40]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":7573,"archive_hash":"sha256:4b1731b758ae452d3b7e94e18041181660942afd3c57ccf16e374a6d1231679a","archive_url":"https://www.blendkit.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":"22.40","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.blendkit.com/asset-gallery-detail/fd4522ac-f70a-4d3a-9955-7c133b4572b3/","schema_version":"1.0.0"},{"id":"arkit_toolset","name":"ARKit Toolset [Before: $10.00, Now: $8.00]","tagline":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":5563553,"archive_hash":"sha256:352d8627021d11aaa88347e0492e8e4d3c82ff8f45a54be7466ed5b62951f91e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7ecd80cc-66ca-4be5-b7fd-0dd688097110/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.00","blender_version_min":"2.83.0","maintainer":"Andy Hellgrim","tags":["Animation","Modelling","Rigging"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/c6250a59-cb9b-4040-8dec-74df05e04bd4/","schema_version":"1.0.0"},{"id":"Arrowify","name":"Arrowify FULL VERSION [Before: $50.00, Now: $40.00]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":4692987,"archive_hash":"sha256:e95bd263c94ac3bcf6b4499b202ca195b722d6d77e5edc1d36e804340f196073","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/6b514bc5-7041-4155-851b-d62cb6a712f1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"40.00","blender_version_min":"4.2.0","maintainer":"RR3D","tags":["arrows","spline","procedual","animated","annotation","nodes","customizable","technical","guide","visual"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/7e5c82e6-ddbd-48d1-98d2-c7077a0a4261/","schema_version":"1.0.0"},{"id":"defoq_assetify","name":"Assetify | The Ultimate Bake & Export Tool [Before: $34.99, Now: $27.99]","tagline":"FULL plan required - upgrade to download","version":"2.1.5","type":"add-on","archive_size":438131,"archive_hash":"sha256:bf0fcb963fe97edf240ab8f350102829bcaaca07880e30b4ebe5a08ec6ac3b12","archive_url":"https://www.blendkit.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":"27.99","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.blendkit.com/asset-gallery-detail/82a1fc6a-bb0a-4162-bf87-ce2d6f1d80bb/","schema_version":"1.0.0"},{"id":"quick_lighting_presets","name":"AT_Quick Lighting Presets [Before: $4.00, Now: $3.20]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":4208,"archive_hash":"sha256:f401b70f3a58b2dafa039b4d4458bbb3e5b6e287a53ea04e9c956ee667d24f20","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/ff81e91c-8620-41e6-9dfe-f2b12a6b352b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.20","blender_version_min":"4.0.0","maintainer":"Alireza Taherpor","tags":["LightingSetups","LightingStudio","StudioLighting","RenderSetup","BlenderLighting","CinematicStudio","CinematicLighting","ProductLighting","DramaticLighting","RimLighting"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/dc146555-325d-4adc-ba04-71d982d85781/","schema_version":"1.0.0"},{"id":"auto_apply_scale","name":"Auto Apply Scale [Before: $5.00, Now: $4.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3401,"archive_hash":"sha256:ee30a47355275e1eef8b09809bf0afd33c8e21a648101523992fd22e5cd77f73","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","scale","autoapply","workflow","modeling","addon"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e9e08a2f-273e-4dc1-833a-9bb00e7c0140/","schema_version":"1.0.0"},{"id":"auto_file_cleaner","name":"Auto File Cleaner - Remove Unused Materials, Images & Meshes | Blender 4.0–5.0+ [Before: $5.99, Now: $4.79]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":7669,"archive_hash":"sha256:06e0ba15d24ea745cc5f70dbdb127899d8cc8abf425c5ecdfbbe98b8bebb4c54","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2de4d389-0f76-4b8c-b1ee-d1b5526e395e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.79","blender_version_min":"4.2.0","maintainer":"NovaStrikes Shahbaz","tags":["System","Pipeline","file","cleaner","blender","cleanup","unused","materials","datablocks","optimize"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d7f60920-88bf-4e93-8ba9-2c1d978c7a17/","schema_version":"1.0.0"},{"id":"auto_displacement_and_bump","name":"Automatically set material to \"Displacement and Bump\" [Before: $1.00, Now: $0.80]","tagline":"FULL plan required - upgrade to download","version":"2.7.0","type":"add-on","archive_size":4305,"archive_hash":"sha256:5cfd1524435be43a647fa5867e72f99ebb7961675ad78b4c19365c44f4e4d591","archive_url":"https://www.blendkit.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.80","blender_version_min":"4.2.0","maintainer":"Alhakam Kain","tags":["Material","Displacement","Bump","Cycles","Auto","Workflow","Subdivide"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":4268,"archive_hash":"sha256:938ba462e6a0bcef16a7150db22fd86bd823f80c73846ac946cf20e502165c10","archive_url":"https://www.blendkit.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.00","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":13478980,"archive_hash":"sha256:f89242c71ba41ab17fb1938b94e8cd82e0e8a3aaeb6536755dff6fdf97a088b1","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9409b4d6-59e4-4f7b-93bf-9b51a9811b8e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.00","blender_version_min":"5.1.1","maintainer":"Giambattista Von Nettesheim","tags":["optimization","decimation","tool","topology","cleanup","quad","remesher","mesh","repair","remesh"],"license":["default_addon_license"],"website":"https://www.blendkit.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.60]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":11826,"archive_hash":"sha256:97bbf97c0794a1fe1a71563ccb04287667b32ca08dc579436757408fc6f04668","archive_url":"https://www.blendkit.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.60","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["System","Development","autosave","blendchecker"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/18ba6214-e44c-4603-a654-19123100e06f/","schema_version":"1.0.0"},{"id":"auto_uv_unwrap_3_pro","name":"Auto Uv Unwrap & Pack 3 - Create clean UVs in seconds [Before: $25.00, Now: $20.00]","tagline":"FULL plan required - upgrade to download","version":"3.0.0","type":"add-on","archive_size":28163,"archive_hash":"sha256:1fc915d1effc311bdb98272a78c866dc61d2e596114c6ebaa304e34f723391ce","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/402c8540-9b3f-44a8-a1db-fe11518d62f9/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"20.00","blender_version_min":"3.6.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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":8971,"archive_hash":"sha256:a52e5ed61919cfceabcc799a50ddf9ef0bfd143ea8a891f08b1dec71820d0ee3","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/5683ae75-d590-4756-8292-1ecbb4aa66cf/","schema_version":"1.0.0"},{"id":"batch_export_selected","name":"Batch Export Selected [Before: $5.00, Now: $4.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2703,"archive_hash":"sha256:6998f2db2bd89bf52d165e69566e97cbb1e21c2bd6ea48af63bf5978669b44b8","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/110a268e-9661-4a69-b1b0-0970e718bb99/","schema_version":"1.0.0"},{"id":"BatchGenie","name":"Batchgenie: Asset Assistant [$1000.00]","tagline":"FULL plan required - upgrade to download","version":"1.3.1","type":"add-on","archive_size":14941835,"archive_hash":"sha256:6b510374f080da157ad4a432507f68ad9832f80c7870c47510b2cf98e484d322","archive_url":"https://www.blendkit.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":"1000.00","blender_version_min":"4.2.0","maintainer":"Roberd Palm","tags":["Asset","Library","Batch","Rendering","Import","export"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1745,"archive_hash":"sha256:1b4be6000c75875c5db989d606cf9dafc4ae84b29829b9ec656b041ab9bf365a","archive_url":"https://www.blendkit.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.00","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2746,"archive_hash":"sha256:87eff844dff87b5aece9b41f3c2fee5a1de0baa8837ce4a88b85560996cb328c","archive_url":"https://www.blendkit.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.00","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.blendkit.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: $16.00]","tagline":"FULL plan required - upgrade to download","version":"2.5.0","type":"add-on","archive_size":58465,"archive_hash":"sha256:1869ac939e037aac1143217cfa2a8eea118f1d3b30c5d3df6e53b5efe45e2f98","archive_url":"https://www.blendkit.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":"16.00","blender_version_min":"4.2.0","maintainer":"K","tags":["Material","Object","Render"],"license":["default_addon_license"],"website":"https://www.blendkit.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.19]","tagline":"FULL plan required - upgrade to download","version":"1.0.8","type":"add-on","archive_size":56758,"archive_hash":"sha256:412b2098d35238a1766808a2d49895488e42f8bb98df0bde33cd1ba5fc5e6cb6","archive_url":"https://www.blendkit.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.19","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.blendkit.com/asset-gallery-detail/f953d832-362d-4e0c-9caf-208f6e7936b0/","schema_version":"1.0.0"},{"id":"better_bend","name":"Better Bend - Geometry Nodes Bend Modifier with Intuitive Controls [Before: $9.00, Now: $7.20]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":25767,"archive_hash":"sha256:be4346fef203ac6c042afee66e50722aee1f7b765a2dc8225bc0a8eaa7d37aef","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e10a39ab-dfbd-4fa7-825a-c854ba5440d9/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.20","blender_version_min":"4.2.0","maintainer":"Junaid Alam","tags":["Mesh","Modeling","GeometryNodes"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/7c1cf022-c9a5-4e7f-b821-057c1c4abe99/","schema_version":"1.0.0"},{"id":"better_cutter","name":"Better Cutter V1.1 [Before: $19.00, Now: $15.20]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":32438,"archive_hash":"sha256:d8a1153ba01c79e55c1ba97c79a1982415e47e77d41c5742cca7e01636212f0f","archive_url":"https://www.blendkit.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":"15.20","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.blendkit.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: $12.40]","tagline":"FULL plan required - upgrade to download","version":"7.1.4","type":"add-on","archive_size":5098125,"archive_hash":"sha256:24f90dd72619dfe4d9aaf8b459afb6d4891112017332c909483514da91533a44","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9ed7281e-0ef8-4c7d-9d19-641ace4aae44/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.40","blender_version_min":"3.6.0","maintainer":"Mr Steve Lee","tags":["bevel","join","mesh","blender","manifold","clean","2025"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $20.00]","tagline":"FULL plan required - upgrade to download","version":"2.5.2","type":"add-on","archive_size":3428172806,"archive_hash":"sha256:d92474aa863833fe86450406a8be876c00e87e70a97f08938947899b4986358d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/99036cb8-dde5-4767-b670-5e1b2ccd4c0d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"20.00","blender_version_min":"5.1.1","maintainer":"Giambattista Von Nettesheim","tags":["basrelief","heightmap","zbrush","reliefmaker","depthmap","bildeform","displacement","3dprinting","CNC","maps"],"license":["default_addon_license"],"website":"https://www.blendkit.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.52]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":2506,"archive_hash":"sha256:efb37d88992f8a1271da4c4e0012fd4992b4306dfc50382aeb5e6494a048ae11","archive_url":"https://www.blendkit.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.52","blender_version_min":"4.2.0","maintainer":"AHMED KETTUR","tags":["translation","search","assets","tools","language","utilities","workflow"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $20.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":11478,"archive_hash":"sha256:ca92bbdafac363ea15437189b1555e4fc52d97f62ceb0a14a67876fdb1b1ef02","archive_url":"https://www.blendkit.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":"20.00","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5883785,"archive_hash":"sha256:117804828d165ade5fed594f79a3f4c17e292297a6beae975915d2f6b096b416","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/02dacd43-eafd-435f-badf-d01756834f35/","schema_version":"1.0.0"},{"id":"blender_revision","name":"Blender Revision V 2.1.0 [Before: $15.00, Now: $12.00]","tagline":"FULL plan required - upgrade to download","version":"2.2.0","type":"add-on","archive_size":14849,"archive_hash":"sha256:382d4beed3837ab319fb112ebea32de5aa1e5f5ab911c0ce679ccca4fb29137a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9e625b8f-41e1-4494-bdc0-2b7eb5dfa078/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.00","blender_version_min":"4.2.0","maintainer":"Vincent Ilagan","tags":["render","revision","compositing","cycles","eevee","optimization","selected","objects","pipeline","vfx"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/476556b5-ed65-485f-b566-16ff3c967291/","schema_version":"1.0.0"},{"id":"rizom_livelink","name":"Blender - RizomUV Live Link [Before: $15.00, Now: $12.00]","tagline":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":8979,"archive_hash":"sha256:23be20e366669ef8256b5e80087fd134b49dc4cb8ed9d49877bef38900c4d4ee","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/8f53f3ac-b38f-469f-856a-99b9a72fe6c7/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.00","blender_version_min":"5.1.0","blender_version_max":"5.1.99","maintainer":"Milad Kambari","tags":["rizomuv","uv","mapping","bridge","live","link","pipeline","uv","unwrap","uv"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/abd3b5f4-b476-4104-a791-aeac6a1573ba/","schema_version":"1.0.0"},{"id":"blender_sp_live_link","name":"BLENDER <-> Substance Painter Live Link [Before: $18.00, Now: $14.40]","tagline":"FULL plan required - upgrade to download","version":"2.1.0","type":"add-on","archive_size":25427070,"archive_hash":"sha256:375ff3ee561d16e1ba47e809c660a75c6f0901796dd9de698c4addd2d782ba53","archive_url":"https://www.blendkit.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":"14.40","blender_version_min":"4.2.0","maintainer":"Milad Kambari","tags":["blender","addon","livelink","bridge","substance","substancepainter","blendertosubstancepainter"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $16.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.3","type":"add-on","archive_size":431945,"archive_hash":"sha256:b09ee9b1ebbb6ee2701103945d9d1957c7027372e48d8227545bd02e6c1f58c2","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/26a91aca-41d3-471b-a71b-8fb1a5da3fce/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.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.blendkit.com/asset-gallery-detail/0bc81975-693c-42e6-8465-ad0e2e37d9d7/","schema_version":"1.0.0"},{"id":"blender_to_unity","name":"Blender to Unity [Before: $25.00, Now: $20.00]","tagline":"FULL plan required - upgrade to download","version":"2.6.4","type":"add-on","archive_size":445627,"archive_hash":"sha256:b38ae9ef546719c5be97fdbe07d7b726d8d338b3f457039c59624cf4f6368f36","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e3743448-3cd0-4ccd-85ae-16c918350590/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"20.00","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.blendkit.com/asset-gallery-detail/7c884710-57d8-438e-a89f-1c51bb88bb9c/","schema_version":"1.0.0"},{"id":"blender_to_unreal","name":"Blender to Unreal [Before: $25.00, Now: $20.00]","tagline":"FULL plan required - upgrade to download","version":"2.5.8","type":"add-on","archive_size":439859,"archive_hash":"sha256:7f96e285c9fd83e4f5a8b5a2c0a77f3b25d5fe14e1f7f430de6b4c92cd3aa5c5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e24e7aec-90ce-4344-b981-910f066797e8/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"20.00","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.blendkit.com/asset-gallery-detail/7c047180-1c4f-4280-b4dd-56953673651a/","schema_version":"1.0.0"},{"id":"vse_lottie_exporter","name":"Blender VSE To Lottie Json Exporter [Before: $19.99, Now: $15.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":478198,"archive_hash":"sha256:df934207034410d289ecaa5a0560701937fd4710c4136d657c6b0e2550b37eee","archive_url":"https://www.blendkit.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":"15.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.blendkit.com/asset-gallery-detail/624848c3-08c0-438b-8177-a4bb8680e563/","schema_version":"1.0.0"},{"id":"blendoptimizer","name":"BlendOptimizer [Before: $4.49, Now: $3.59]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":44178,"archive_hash":"sha256:6d92091fd9695d3b2e93f05ef43ae4cf203364ddc14cffea5606ff444c0d9bab","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/1f5bc0d6-e10e-478a-8e6a-a69efe1953b0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.59","blender_version_min":"4.2.0","maintainer":"Steven Seidler","tags":["Pipeline","System"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/bfd43647-78e8-4252-92bf-a5c349b82f15/","schema_version":"1.0.0"},{"id":"blenquick_autorigger_v2","name":"BlenQuick Auto-Rigger [Before: $32.50, Now: $26.00]","tagline":"FULL plan required - upgrade to download","version":"2.7.3","type":"add-on","archive_size":7306982,"archive_hash":"sha256:ffd7a5221adbbc41e75c09b427de6a18a51c4fda4308941d03a9df9ec174f9cd","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/46f3ba7b-a4da-4064-98b0-ed9b4c6c960b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"26.00","blender_version_min":"4.5.0","maintainer":"Stellart","tags":["rig","rigging","autorig","autorigger","advanced","detection","export","character","smart","animation"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/8844f27d-31e1-44a6-ab42-9518a22f0490/","schema_version":"1.0.0"},{"id":"bl_objector","name":"BL Objector [Before: $3.00, Now: $2.40]","tagline":"FULL plan required - upgrade to download","version":"0.1.2","type":"add-on","archive_size":48724,"archive_hash":"sha256:e99fa9a3ed65ab17d0c113a57b950b083b1cdcba1f918489791d178ce00a3c4e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/ff7aaa8f-20f5-4c4c-813f-bfc57ce8c652/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.40","blender_version_min":"3.0.0","maintainer":"Michal Hons","tags":["3DView","style","dressing","random","scene","blenderkit","replace"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0ba0acf6-cd24-4aa1-b677-d3ea874ccd5d/","schema_version":"1.0.0"},{"id":"booleanbite","name":"Booleanbite: 1-Click Procedural Edge Damage For Blender [Before: $3.00, Now: $2.40]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":8394,"archive_hash":"sha256:c7f3318eeea5cc01f51bd76af0afb1c74275f0b331cf261891cac5a9f042a536","archive_url":"https://www.blendkit.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.40","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.blendkit.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.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.9","type":"add-on","archive_size":11944507,"archive_hash":"sha256:52b7f858bb8dbf122f7e8b04e5556cc199844b6ec5a1f1f20bbe0e378bf54c89","archive_url":"https://www.blendkit.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.80","blender_version_min":"4.2.0","maintainer":"Applebharath","tags":["Material","Render"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":380172,"archive_hash":"sha256:8eb955f27e800b3fca95a09efccfc6cfde49bcfbdc7409479f7f76c99dce579d","archive_url":"https://www.blendkit.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.00","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.blendkit.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.20]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":6263,"archive_hash":"sha256:442334badc75322a02f1b12e047930c9deff79bd99f1496517c9241597936cec","archive_url":"https://www.blendkit.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.20","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.blendkit.com/asset-gallery-detail/99529f45-bc25-4e04-8ff0-792af864a549/","schema_version":"1.0.0"},{"id":"breakdown_master","name":"Breakdown Master [Before: $10.96, Now: $8.77]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":318236,"archive_hash":"sha256:77d5adad2e2ab51fbc5b2cb83c695f8f09ee2074dea3da1b7801d951aef67b51","archive_url":"https://www.blendkit.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":"8.77","blender_version_min":"4.2.0","maintainer":"Zahit Erdem Guzel","tags":["breakdown","animation","addon"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $9.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":22657,"archive_hash":"sha256:a2030b664b8b229e59b89bd097644e7ae1dc70cbedd0c5af0670c528b9983cb8","archive_url":"https://www.blendkit.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":"9.60","blender_version_min":"4.2.0","maintainer":"Milad Kambari","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blendkit.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.40]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":339168,"archive_hash":"sha256:2c677a7a66aa6bec8aa6ebdbbc83b183a40a0c6cd6cfce83c2582cb0fc7632bd","archive_url":"https://www.blendkit.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.40","blender_version_min":"4.2.0","maintainer":"Julien Winé","tags":["architecture","reference","plan","scale","distance"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e7a459b1-81e4-4869-b684-d23bbe22c20e/","schema_version":"1.0.0"},{"id":"bslicer","name":"B.slicer [$15.00]","tagline":"FULL plan required - upgrade to download","version":"1.4.1","type":"add-on","archive_size":1678975,"archive_hash":"sha256:4765df4bbf8d2fc1660a86ed662abedf62e334437033cfea920ae977a6236dca","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/3c1d581e-77fa-43f3-a63a-018fd2186025/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"15.00","blender_version_min":"3.5.0","maintainer":"belaid ziane","tags":["slice","slicing","export","svg","flatten","modeling","parametric"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/45e0a112-b302-4020-881b-3a91fc139236/","schema_version":"1.0.0"},{"id":"b_working_pivot","name":"B- Working Pivot [Before: $5.00, Now: $4.00]","tagline":"FULL plan required - upgrade to download","version":"1.1.8","type":"add-on","archive_size":18308,"archive_hash":"sha256:d03208917bb899d6e9ab99cb1956c37524dc354f8523d761dc56fee5656826c7","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d4ae5882-e7bc-4a66-8b05-5b071f86165a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.00","blender_version_min":"4.2.0","maintainer":"Robert Ross","tags":["modo","pivot","snapping","gizmo","3D","cursor"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/94bc13f4-fd31-4a84-8dcc-b7caf7b3648b/","schema_version":"1.0.0"},{"id":"camera_autofocus","name":"Camera Autofocus [Before: $2.00, Now: $1.60]","tagline":"FULL plan required - upgrade to download","version":"1.9.0-20251005","type":"add-on","archive_size":5307,"archive_hash":"sha256:56752e1d4365f09bf9ce871f8d1c41fc499b943f794913698b96878065f09989","archive_url":"https://www.blendkit.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.60","blender_version_min":"4.2.0","maintainer":"Vixymiles","tags":["camera","autofocus","dof","focus"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2b81f79c-ab9d-4d7c-8181-cb4236963e5a/","schema_version":"1.0.0"},{"id":"camera_director_pro","name":"Camera Director Pro [Before: $4.49, Now: $3.59]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":32145,"archive_hash":"sha256:50119c301834ae33a304447005d11da04aca913722e4ff6a05020a028cc501ce","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/a1dbe7b6-312d-417f-906b-ca40df8e1560/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.59","blender_version_min":"4.2.0","maintainer":"Steven Seidler","tags":["Camera","Animation","Scene","Optimization"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d807b46e-842f-4a7d-8f83-773d73ecaa94/","schema_version":"1.0.0"},{"id":"camera_orbit_render","name":"Camera Orbit Render [Before: $5.00, Now: $4.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":10074,"archive_hash":"sha256:684a165b077372fe487504ac7314ff822817b24193fe0be962c8333bb4990682","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"Dennis Hafemann","tags":["3dview","camera","orbit","render","product","cursor","objects"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.5.3","type":"add-on","archive_size":38959,"archive_hash":"sha256:aeb2eb83fe7690228387c899c8d25e8e3135e15fcaecb86bd8e2236bfc08d6bf","archive_url":"https://www.blendkit.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.00","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.blendkit.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.20]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":9056,"archive_hash":"sha256:eb1b21ea9778e55cd6e341aeb92473d301e3655bb2a0f10374d16f48dce6b771","archive_url":"https://www.blendkit.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.20","blender_version_min":"4.2.0","maintainer":"Zahit Erdem Guzel","tags":["camera","render","rendering","settings"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $7.99]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":13521,"archive_hash":"sha256:5c1e20ea372426f7299a477dc73f08bd44e7d2504ddfc47ffea36ee8bacec14a","archive_url":"https://www.blendkit.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":"7.99","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.blendkit.com/asset-gallery-detail/035556c6-4189-45dc-9249-be5558d0c54e/","schema_version":"1.0.0"},{"id":"car_rigger_v1","name":"Car Rigger [Before: $11.00, Now: $8.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":1803530,"archive_hash":"sha256:aede98204f16af8773b3230007b1e002e12906b6cb99d8ccc38adf50fe6f53f2","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/0d9bbe47-7189-460b-85e1-71aec35d524e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.80","blender_version_min":"4.5.0","maintainer":"Stellart","tags":["blender","rig","rigging","rigger","car","truck","vehicle","animation","4x4","autorig"],"license":["default_addon_license"],"website":"https://www.blendkit.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.60]","tagline":"FULL plan required - upgrade to download","version":"1.6.2","type":"add-on","archive_size":31881,"archive_hash":"sha256:be48e1779b44df451e744e99c2008526c7685124ef7617e4cc88bc82ffe50b88","archive_url":"https://www.blendkit.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.60","blender_version_min":"4.2.0","maintainer":"Chaitanya Garg","tags":["editors","nodes","compisitor","faster","workflow","animation"],"license":["default_addon_license"],"website":"https://www.blendkit.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.60]","tagline":"FULL plan required - upgrade to download","version":"1.6.0","type":"add-on","archive_size":23262,"archive_hash":"sha256:eb2fd1e49c3ef09eb2ef931671ee5529b55510c9b1fea4d846fa7f41023f9dd7","archive_url":"https://www.blendkit.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.60","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.blendkit.com/asset-gallery-detail/dc9d076e-b83a-4132-b48c-03a863c17e7a/","schema_version":"1.0.0"},{"id":"chain_generator","name":"Chain Generator [Before: $26.00, Now: $20.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":16909104,"archive_hash":"sha256:038d7bcb0ac96b490ab2f97d1a4d06be5e0d1e07903fc40bcd17fdc487ab5cc9","archive_url":"https://www.blendkit.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":"20.80","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.blendkit.com/asset-gallery-detail/323235cb-5286-42b0-85eb-d36eb388674a/","schema_version":"1.0.0"},{"id":"cid","name":"CID [Before: $7.50, Now: $6.00]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":22352,"archive_hash":"sha256:826b68d462541991755bf30491319ce46059185838f22098774171e897ccf25e","archive_url":"https://www.blendkit.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":"6.00","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.blendkit.com/asset-gallery-detail/aeb02b02-f395-4310-a629-6a864b3c4a6c/","schema_version":"1.0.0"},{"id":"cinespline","name":"CineSpline – Cinematic Camera Rig for Blender [$10.00]","tagline":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":70651,"archive_hash":"sha256:a3760b42bc393b1bc519ccfa93dc4a8cca340b48ba8cfe552b4f5aa3585d0722","archive_url":"https://www.blendkit.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":"10.00","blender_version_min":"4.2.0","maintainer":"Mazen Lawand","tags":["camera","cinematic","animation","storytelling","motion","timeline","morph"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"0.2.1","type":"add-on","archive_size":1501,"archive_hash":"sha256:4a9e91da91039e184f87e65411130cef1f621b9d40d7ca0d30114e0f98c2966a","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/0462ad01-9d76-4cdf-80cd-d408df81b69d/","schema_version":"1.0.0"},{"id":"cleaner_ps","name":"Cleaner [Before: $7.50, Now: $6.00]","tagline":"FULL plan required - upgrade to download","version":"2.5.0","type":"add-on","archive_size":2818,"archive_hash":"sha256:ccc8d13da56ecca03a61b904561135e6197ccb5da32292cb20dcf5cd126ef2f1","archive_url":"https://www.blendkit.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":"6.00","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.blendkit.com/asset-gallery-detail/99558ea3-aa07-4857-b623-f636dfbc6179/","schema_version":"1.0.0"},{"id":"clippy","name":"Clippy [Before: $2.50, Now: $2.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":4360,"archive_hash":"sha256:983e222541b1c79a60e5d98c7d03667322ddbc60217caf299008f15d8829e8c8","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"carlosmu","tags":["ux","ui","camera","presets","viewport","clipping","user","interface"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2346,"archive_hash":"sha256:4b0b1cc4ffc72ef8935b2158641226855e4bfb02f642cfe462350008fd5290ef","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/161371d5-eb46-4252-b994-b74517b6e336/","schema_version":"1.0.0"},{"id":"cloth_collision_visualizer","name":"Cloth Collision Visualizer [Before: $2.00, Now: $1.60]","tagline":"FULL plan required - upgrade to download","version":"4.0.0","type":"add-on","archive_size":5527,"archive_hash":"sha256:e7ac994e09d05b5a2ee7d642807dd031d24255af9574b55e384971bba6995f98","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/ac45edb8-1e56-4afd-a680-81169b2fddfc/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.60","blender_version_min":"4.2.0","maintainer":"3DFIGURES rian","tags":["Cloth","Physics","collision","Viewport","simulation","visualizer","debugging","selfcollision","realtime"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/bd8326c9-879d-4e41-a462-12dcdb0ce6c3/","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.79]","tagline":"FULL plan required - upgrade to download","version":"3.4.1","type":"add-on","archive_size":2128,"archive_hash":"sha256:d749ef1fba32ceb555db5b35e7b7089b64632e253e2f00e2792bc8d07f0b16f7","archive_url":"https://www.blendkit.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.79","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.blendkit.com/asset-gallery-detail/aef8a90b-e532-4020-bda5-a0c62336b9f4/","schema_version":"1.0.0"},{"id":"collection_zones","name":"Collection Zones [Before: $10.00, Now: $8.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":47447,"archive_hash":"sha256:3b90e6f0b6311866ace35b299a5f8f1699e92dfc77a1eb167357b890981da4b4","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/efaae058-471b-43ec-bcf2-f18b94310c57/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.00","blender_version_min":"5.0.0","maintainer":"Giorgi Samukashvili","tags":["collection","zones","sorting","layout","outliner","organization","automation","kitbashing","assist","hierarchy"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/4b723716-c093-494a-ae03-9fe0c49f4c10/","schema_version":"1.0.0"},{"id":"collision_director_pro","name":"Collision Director Pro [Before: $6.49, Now: $5.19]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":14838,"archive_hash":"sha256:d8af64aba17b04dd0d233bb67aea6ab39fbcd6fc90b8ea8027c9ac3859cbf2b6","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9424fb67-776b-4c97-b392-74d0c7e0ddb7/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.19","blender_version_min":"4.2.0","maintainer":"Steven Seidler","tags":["collision","gamedev"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/12025de8-850a-411d-a840-5ba053539670/","schema_version":"1.0.0"},{"id":"colormatrixel","name":"Colormatixel - Advanced Material & Color Management Add-On For Blender [Before: $2.99, Now: $2.39]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":166059,"archive_hash":"sha256:eda137854baf27d4e75648abde8dfae400aa0d03d16aa07482d587e8284cde36","archive_url":"https://www.blendkit.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":"2.39","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.blendkit.com/asset-gallery-detail/c31ef79f-2a05-41c6-9bad-963d95c51128/","schema_version":"1.0.0"},{"id":"compositor_mask","name":"Compositor Mask [Before: $3.00, Now: $2.40]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":3209,"archive_hash":"sha256:5c26e2e4fdd7fabebad3f5293d5c7a8ffdbf3b61ead6b59323a436ef08d79a1b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7acfb099-a2d4-4422-a939-7c6b723749d1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.40","blender_version_min":"4.2.0","maintainer":"Jeslin Paul","tags":["Compositing","compositor_mask","mask","cryptomattee","layer_mask"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/ea16769d-5c28-4c21-ba68-26171929bd1c/","schema_version":"1.0.0"},{"id":"Cool_Addons_Menu","name":"Cool Addons Menu [Before: $2.99, Now: $2.39]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":18495,"archive_hash":"sha256:7df4cf79cda76ee6dda75c26877773126c7ed510aec208b723de88500a6d2adc","archive_url":"https://www.blendkit.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.39","blender_version_min":"4.2.0","maintainer":"Kito Studio","tags":["blender","menu","ui","addons"],"license":["default_addon_license"],"website":"https://www.blendkit.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.19]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":8831991,"archive_hash":"sha256:4852ac6c2dcea0e7e287f79628438b59fdc87a7c16f696386aae6ee215588d1c","archive_url":"https://www.blendkit.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.19","blender_version_min":"4.2.0","maintainer":"Kito Studio","tags":["blender","shader","toon","style","render"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2ea6e2ac-96c8-4579-b998-7c833227dacd/","schema_version":"1.0.0"},{"id":"copyx","name":"CopyX — Cross-Version Copy & Paste for Blender Objects [Before: $10.00, Now: $8.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5027,"archive_hash":"sha256:af90abab4b0fdeba0b41982697f3b28b08cb549a4465e9e1da7fba52e090f0db","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/1031b3ec-dfbc-415f-b0c0-d7954d7596af/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.00","blender_version_min":"4.2.0","maintainer":"Free poly","tags":["3DView","Object","copy","paste"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a97311ce-49fa-4191-b7aa-ce3e70f1beef/","schema_version":"1.0.0"},{"id":"cracks_51","name":"\"Cracks\" Damage addon 💥Windows, Linux, Mac approved [Before: $14.95, Now: $11.96]","tagline":"FULL plan required - upgrade to download","version":"5.1.5","type":"add-on","archive_size":12203298,"archive_hash":"sha256:c2b7f94f7658938886bc1b9df549451a005217e4888abb608a0632eac18ad183","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/8bf8a941-900f-4335-a566-7b78be33451d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"11.96","blender_version_min":"3.6.0","maintainer":"Mr Steve Lee","tags":["Damage","blender4","simulation","geometry","nodes","addon","2025","cracks","crack","modifier"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d303f488-d48d-407b-8615-ebf1a5e0883b/","schema_version":"1.0.0"},{"id":"creator_export_toolkit","name":"Creator Export Toolkit [Before: $15.00, Now: $12.00]","tagline":"FULL plan required - upgrade to download","version":"0.1.2","type":"add-on","archive_size":5747,"archive_hash":"sha256:f9a8bbc437b9b66743679964f43f93af23e07f27bd870d7e84914c80437f3d7e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/ffdf2b59-8ec2-450e-92ee-d394c1c66f0a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.00","blender_version_min":"4.2.0","maintainer":"Yassine elyaakoub","tags":["blender","addon","export","fbx","glb","asset","cleanup","thumbnail","roblox","vrcha"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/702e4481-4b33-4588-a593-4c0b03241f33/","schema_version":"1.0.0"},{"id":"credit_manager_pro","name":"Credit Manager Pro [Before: $5.00, Now: $4.00]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":11780,"archive_hash":"sha256:bd8c24779461eba6babb5089b8d754b79ef3a0cf2c04b5131c4c2ade5adbea9c","archive_url":"https://www.blendkit.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.00","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.blendkit.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.20]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1880,"archive_hash":"sha256:be9e467bd7b3356bc1235fa8bd1ef798760c5a9d194c620f901ec316e9ead34e","archive_url":"https://www.blendkit.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.20","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"2.0.2","type":"add-on","archive_size":184522,"archive_hash":"sha256:a519002013b85e2ed4f8862c487182edb4656a240f5471eaf185b3bebbc32d0a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7d23ca82-6feb-4185-af64-51e3b0860b6e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.00","blender_version_min":"4.2.0","maintainer":"Đức Mạnh Huỳnh","tags":["Lighting","product","softbox"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $15.20]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":14282,"archive_hash":"sha256:66848a0091fb86b52516cb5c6ef7d8670998c5d2162957c806ff2c9ffdbd5209","archive_url":"https://www.blendkit.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":"15.20","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.blendkit.com/asset-gallery-detail/3600d73e-4bb8-4742-888e-4cde99610da0/","schema_version":"1.0.0"},{"id":"dae_exporter","name":"DAE (Collada) Exporter (Blender 5.0+ Compatible) [Before: $6.50, Now: $5.20]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":395378,"archive_hash":"sha256:bbefa64d4240f963f3d2b743d1f67754414cad8fe1556e1923c49acc3621d353","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/926dc1f4-c0e3-4862-be23-6b7aa08040ee/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.20","blender_version_min":"4.0.0","maintainer":"The Smart King","tags":["3DView","sketchup","export","dae","collada"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/c2f30c32-8f22-422b-bbf4-7637b3b383d1/","schema_version":"1.0.0"},{"id":"dae_import","name":"DAE Importer for Blender 5.0+ (COLLADA Restore) [Before: $11.25, Now: $9.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":9801,"archive_hash":"sha256:d58e2539454969c9490afa8d38a90defef9a549863d38083b136bc9efc8aa246","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/569e678d-5a8c-45ad-80db-9f0cedfce5d2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"9.00","blender_version_min":"4.0.0","maintainer":"The Smart King","tags":["3DView","dae","dae_import","blender_dae_import","collada_import","dae_restore","sketchup_to_blender","dae_to_blender","dae_collada_import"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/92fb0bcc-f2d1-4c18-814c-1f2ef721526d/","schema_version":"1.0.0"},{"id":"daexport","name":"DaeXport | One-click DAE (Collada) export [Before: $10.99, Now: $8.79]","tagline":"FULL plan required - upgrade to download","version":"1.3.2","type":"add-on","archive_size":30036,"archive_hash":"sha256:7046dddcfa457e38907929879ebbe20a93b295f56527cf4cc6b78dc4c944c966","archive_url":"https://www.blendkit.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":"8.79","blender_version_min":"4.2.0","maintainer":"Arun C","tags":["Baking","GameEngine"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e5652919-6e8c-4d24-aeb5-cf64403e2455/","schema_version":"1.0.0"},{"id":"damtools","name":"damTools [Before: $15.00, Now: $12.00]","tagline":"FULL plan required - upgrade to download","version":"1.6.955","type":"add-on","archive_size":1246131,"archive_hash":"sha256:2da8052b74e032b9b06600a7c2af845c937dc9b9292ed2d2cf92818ca2b7362e","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"SynrgStudio","tags":["hardsurface","tools","toolkit","suite","modeling"],"license":["default_addon_license"],"website":"https://www.blendkit.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.60]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":170084,"archive_hash":"sha256:400cfa84c860cbb746cac72d7693f651cc4c6a14d09032076b2ade2a7beb462c","archive_url":"https://www.blendkit.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.60","blender_version_min":"4.2.0","maintainer":"H3D","tags":["decal","export","meshtoimage","decalcreator","normalmap","oneclick"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $20.00]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":109377,"archive_hash":"sha256:4c240fa5d716732363b067c72696c334aca67f5f7885b4cc5ee326c2e231f9bb","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d7bbda8f-bcb3-446e-a7ef-f3ce6a2d7e4a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"20.00","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.blendkit.com/asset-gallery-detail/a2846c5c-f395-4bfe-aaca-a53cc9ac6400/","schema_version":"1.0.0"},{"id":"dovetail_key","name":"Dovetail Key [Before: $15.00, Now: $12.00]","tagline":"FULL plan required - upgrade to download","version":"1.13.2","type":"add-on","archive_size":8390,"archive_hash":"sha256:3d4a06e308392ccdffb9bfd0783b52521e6a3b979cea9c037c209c4ea722879d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/200aedb0-216f-4a30-afbb-1202ffc9d361/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.00","blender_version_min":"4.2.0","maintainer":"Milad Kambari","tags":["Mesh","Modeling","3dprint","dovetail","joint"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/5329ff47-74d3-4db3-ad1b-a696e9849c0b/","schema_version":"1.0.0"},{"id":"drh_addons_audit","name":"DRH - Add-ons Audit [Before: $4.99, Now: $3.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":88690,"archive_hash":"sha256:b21fe34d058611bc6bc306323e46fb212b838033f0b44e3c86dd275aa25a6ad4","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/4dd9a00d-77f3-4832-a7ee-02a9e955c905/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.99","blender_version_min":"4.2.0","maintainer":"Paco Salas","tags":["addons","audit","snapshot","reporting","maintenance","packaging","troubleshooting","extensions","pipeline"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/4436e85f-073d-4eb2-8271-d58648303a3f/","schema_version":"1.0.0"},{"id":"drh_color_ramp_studio","name":"DRH - Color Ramp Studio [Before: $9.99, Now: $7.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":148730,"archive_hash":"sha256:3a823a0772546fb37338b3606861828c10ac53857986a68b717ce4c426c08660","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/26d3b56d-f2ac-402b-9b5b-ccb8515597dc/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.99","blender_version_min":"4.2.0","maintainer":"Paco Salas","tags":["colorramp","gradient","palette","nodes","shader","geometrynodes","compositor","workflow","utility","ramp"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/45ca1690-0ca4-4265-8a35-8b0d69f5dbb6/","schema_version":"1.0.0"},{"id":"drh_dual_units","name":"DRH - Dual Units [Before: $4.99, Now: $3.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":38935,"archive_hash":"sha256:7ddf08c4bb6c857cb5c4711bdf8f9b2207ac7b9bbd03c6324f08b911db421896","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/4b229646-35a8-4447-a72b-829ae5ba0fd0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.99","blender_version_min":"4.2.0","maintainer":"Paco Salas","tags":["3DView","Updated","Tags","units","transform","npanel","measurement","metric","imperial","dimensions"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/4c29e51b-2fc4-4b44-86f4-20139299b434/","schema_version":"1.0.0"},{"id":"lorenzofranciosi_droplets_gen","name":"Droplets GENERATOR [$2.00]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":5318931,"archive_hash":"sha256:11bfc221585d101bb52e1b4918ddc8535575fd95fec7ccc2d74a5c50541d197c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/98cbe92d-132c-4dc9-8dbb-d64596f4dff4/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.00","blender_version_min":"5.0.0","blender_version_max":"5.9.0","maintainer":"Lorenzo Franciosi","tags":["GeometryNodes","Object","FX","Drops","Droplets","Wet","Water"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/b242f91c-884f-4a7f-901c-20373ed1910a/","schema_version":"1.0.0"},{"id":"dxf_import_export","name":"DXF Import Export [Before: $19.00, Now: $15.20]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":16203551,"archive_hash":"sha256:fd478752118247bca42a485638370ccb1e259bc7a3a0adb3950c43c7cfbe49cb","archive_url":"https://www.blendkit.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":"15.20","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.blendkit.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: $16.00]","tagline":"FULL plan required - upgrade to download","version":"2.1.0","type":"add-on","archive_size":12768,"archive_hash":"sha256:c0c6990da08608037f8305dccf3d37f9e1ff8f01c20aab699ba3907a171f59cc","archive_url":"https://www.blendkit.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":"16.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.blendkit.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: $4.80]","tagline":"FULL plan required - upgrade to download","version":"0.8.0","type":"add-on","archive_size":75988305,"archive_hash":"sha256:213ba1a25aeb6e3e4cd54127a73b6cac17ec6bcf64f717f20bb0d69ad993514c","archive_url":"https://www.blendkit.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":"4.80","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.blendkit.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: $9.60]","tagline":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":23263,"archive_hash":"sha256:6d80600a51aabfd83df414de15917846092dd8fc182ef727a35f702c167ec8ab","archive_url":"https://www.blendkit.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":"9.60","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.blendkit.com/asset-gallery-detail/7c379e9e-95f2-4b1e-8eab-90739fd1e70e/","schema_version":"1.0.0"},{"id":"easy_batch_render","name":"Easy Batch Render [Before: $3.00, Now: $2.40]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":6875,"archive_hash":"sha256:15e7ff505530560cfdb9177046e0d8473413f8a80777e46f4ff50bcbc6ad0142","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/a426042c-2fcd-4829-a53e-7527987b17fd/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.40","blender_version_min":"4.2.0","maintainer":"Vaishakh Vinod","tags":["Render","Pipeline","Workflow","Batch","Automation"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/03b93d66-510b-441b-a0d3-14b5935f5e32/","schema_version":"1.0.0"},{"id":"easycameramatcher","name":"Easy Camera Matcher [Before: $12.50, Now: $10.00]","tagline":"FULL plan required - upgrade to download","version":"2.1.0","type":"add-on","archive_size":505906,"archive_hash":"sha256:ec28a2e76724965042c0ad063bb79d9e9d9215bc73b2dda63497f6dcf1b71cdb","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f0a38b54-e9ee-4f98-b103-905e5391cf07/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.00","blender_version_min":"4.3.0","maintainer":"Sander Wit","tags":["Camera","Matching","Lens","Calibration","Perspective","Tracking","VFX","fSpy","plotter","plotting"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/70090236-772f-4576-8a24-187a2ff3f31e/","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.20]","tagline":"FULL plan required - upgrade to download","version":"1.6.5","type":"add-on","archive_size":4309,"archive_hash":"sha256:e95b13538c5906c23d4b616b6ca757cc7e29e14c6a57827fbc45406c7674d770","archive_url":"https://www.blendkit.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.20","blender_version_min":"4.2.0","maintainer":"Junaid Alam","tags":["Paint","Texture","Workflow"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/dc893ce9-b31f-4def-acee-641d73ae8579/","schema_version":"1.0.0"},{"id":"easy_transfer","name":"Easy Transfer [Before: $12.00, Now: $9.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2083,"archive_hash":"sha256:b0b2cc453e1195bb49f617e39b0d21193dc6c597cdcc367fc49424d4e09663a0","archive_url":"https://www.blendkit.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":"9.60","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":13668,"archive_hash":"sha256:9f7ecbf98f690f5571627cb80f8794210b6606ed20686f821a21946cc9c25c6f","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"Abishek Raja","tags":["light","easylighting","Cinematic","Neon","Cyberpunk"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.3.1","type":"add-on","archive_size":18012,"archive_hash":"sha256:7d3157c242859fc7aee71d91adfbf03207020ebf8be4c43f3a001425e088edc6","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"carlosmu","tags":["interface","ui","ux","swap","editors","area","customization","user"],"license":["default_addon_license"],"website":"https://www.blendkit.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.40]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1464,"archive_hash":"sha256:791964a72a51067d429f9b17bb6287798ba5012e966f7ebb1234f14558fbfcee","archive_url":"https://www.blendkit.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.40","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.blendkit.com/asset-gallery-detail/a993b9b8-37ce-4b99-8371-83f0d161c969/","schema_version":"1.0.0"},{"id":"essentials_addon","name":"Essentials [Before: $12.00, Now: $9.60]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":42799,"archive_hash":"sha256:9d76e27ff1a5f5b160780a537af067d4661418258e7ef20065e141b259f552d0","archive_url":"https://www.blendkit.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":"9.60","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.blendkit.com/asset-gallery-detail/0f34a339-e478-4d6c-b328-9be1daa65f67/","schema_version":"1.0.0"},{"id":"export_director_pro","name":"Export Director Pro [Before: $6.49, Now: $5.19]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":25356,"archive_hash":"sha256:e644eb8adff6b35fda1e89c2cb8b463ce4f1b7d0cbfab0714b807a28330f3191","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c119ec48-fb8f-4a72-b864-73d847628183/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.19","blender_version_min":"4.2.0","maintainer":"Steven Seidler","tags":["export","gamedev"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/35d745dc-cf9d-4d51-8be3-139c69351042/","schema_version":"1.0.0"},{"id":"export_each","name":"Export Each - Batch Export Collections / Object with One Click [Before: $9.00, Now: $7.20]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":13844,"archive_hash":"sha256:39cd568a69a765b3962796e66f0491d700db90cb5542570084e69568e8df2ed5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/873e9048-1759-4fb3-9653-42a025deface/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.20","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Pipeline","AssetManagement"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/f2dc078b-d6ac-4cb3-a750-4d6c1a834ac9/","schema_version":"1.0.0"},{"id":"face_layers","name":"Face Layers v1.5 Add-on [Before: $5.00, Now: $4.00]","tagline":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":45390,"archive_hash":"sha256:501b57c7dd8cd9549b3d93cce966fbc3effccec925b75e19168274c8bb0ef088","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/8996ef60-23df-44c7-98f0-7161c54ba379/","schema_version":"1.0.0"},{"id":"facial_tools","name":"Facial Tools [Before: $11.00, Now: $8.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":1655706,"archive_hash":"sha256:154d3764584593e419e06789e9a7aee4a9916a83c3d65e2469fb4387cc3cf682","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/eb138716-7e6b-4545-9045-768caa5c7aad/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.80","blender_version_min":"5.0.0","maintainer":"Stellart","tags":["facialrig","autorig","animation","facial","rig","rigging","rigger","export","bind","preset"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0c790066-7eb7-477a-80d9-1296f8fd3ca0/","schema_version":"1.0.0"},{"id":"falcon_cam","name":"Falconcam [Before: $8.98, Now: $7.18]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1022399,"archive_hash":"sha256:5d655a371dba853226c36680e7e9b15f917bb4c2f8e223138cf8c7502911dab1","archive_url":"https://www.blendkit.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.18","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.blendkit.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.20]","tagline":"FULL plan required - upgrade to download","version":"1.8.0","type":"add-on","archive_size":29599,"archive_hash":"sha256:53c1f5ca9ea2f7f7c17a8ab85d9710eef21ca451825f56e06f9055fbaa0b5047","archive_url":"https://www.blendkit.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.20","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Fast","Screenshot","quicksc","fastscreenshot","quickcapture","viewportscreenshot"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $79.20]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":646630,"archive_hash":"sha256:e8383b08b908f263d0aae7acda685acf991ceeeb65d65682b9f9bae7147ddd3f","archive_url":"https://www.blendkit.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":"79.20","blender_version_min":"2.92.0","maintainer":"Blendkit Community","tags":["System"],"license":["default_addon_license"],"website":"https://www.blendkit.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.20]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2888,"archive_hash":"sha256:2f2384e5a2f3c1f45829c43df6cff9b34d9867f0de677b5f9f1b972f03d62376","archive_url":"https://www.blendkit.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.20","blender_version_min":"4.2.0","maintainer":"Alex De Pario","tags":["find","search","object","management","interface","tools"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/7cd259e6-5a4c-485d-8095-da2d56c56e79/","schema_version":"1.0.0"},{"id":"fire_maze","name":"FireMaze [Before: $5.00, Now: $4.00]","tagline":"FULL plan required - upgrade to download","version":"3.3.0","type":"add-on","archive_size":119891,"archive_hash":"sha256:e71f6535f3a51ab8062baf61d043ec91cff7481eecdadde838f34bbc96dc4da1","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f1a5d42c-86f2-483e-a4ee-86bb1f90da5f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.00","blender_version_min":"4.2.0","maintainer":"FireRat","tags":["Maze"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/195283e4-b066-4d52-a01d-d6bcd5d0d097/","schema_version":"1.0.0"},{"id":"fixamo2","name":"FIXAMO 2 - Combine , Loop, Create [Before: $9.00, Now: $7.20]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":5033,"archive_hash":"sha256:1d3192b6ac527e5ee2a86dc7fd938e0e370b786cca2d492cce507a2a437ede5f","archive_url":"https://www.blendkit.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.20","blender_version_min":"4.2.0","maintainer":"Kohdy mcintyre","tags":["Animation","Addon","Bossposes","Tools","New","Mixamo"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0f4fd714-0c97-401f-bcea-bbb42ab9fbdd/","schema_version":"1.0.0"},{"id":"FlowProManager","name":"Flow5 - The Ultimate Asset Tool [Before: $15.00, Now: $12.00]","tagline":"FULL plan required - upgrade to download","version":"5.0.0","type":"add-on","archive_size":25884218,"archive_hash":"sha256:bb89d1998a97e7ccbdfc79a045ea7ea86e6e9ff328b27d7a79aecc69ae24153f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/266f9e83-b74b-4242-940a-b446bc513f2e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.00","blender_version_min":"4.3.0","maintainer":"polyspaace","tags":["assets","flow","workflow","scatter","asset_browser","asset_library","polyspaace"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/542f1515-6422-4da3-bf4d-05803f890e1b/","schema_version":"1.0.0"},{"id":"fog_planes","name":"Fog Planes Addon [Before: $35.00, Now: $28.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":198697240,"archive_hash":"sha256:8fa4132df3fd070aa5a3b58a8a0aebca811315a8f0da5a22ff106619780c79bb","archive_url":"https://www.blendkit.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":"28.00","blender_version_min":"4.2.0","maintainer":"Besa Art","tags":["fog","haze","environment","nature","atmosphere","mist","moody"],"license":["default_addon_license"],"website":"https://www.blendkit.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.20]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":44112,"archive_hash":"sha256:62071024eaa41b615793d482d62813f100c2a2a54271fac6db7891c0f06eca11","archive_url":"https://www.blendkit.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.20","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Interface","UserInterface","Hotkeys","Keyboard","AZERTY","French"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/105400e9-bac4-46d4-8c08-616dbf54f334/","schema_version":"1.0.0"},{"id":"frosting","name":"Frosting [Before: $10.00, Now: $8.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":44908,"archive_hash":"sha256:bb914e82bc2228ef36e862e437aa40eb83d4b6ecdc68c6fe6a1176dd64e9c090","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/3f1186c6-6dde-4a5b-9f62-c562e605bbfa/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.00","blender_version_min":"4.2.0","blender_version_max":"5.2.0","maintainer":"Cloudy Sky","tags":["physics","scatter","simulation"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/14c8c8d0-a3f4-402d-8e7f-97df5aab476c/","schema_version":"1.0.0"},{"id":"fsx3d_blueprint_tool","name":"FSX3D Blueprint Tool [Before: $18.99, Now: $15.19]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":465117,"archive_hash":"sha256:2a70844d12b9de6ae5803f535ee2c77935a67e33df14d59bee1b6732f0e6fa36","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7e4a7a85-7dc8-4ce0-a149-6217dc659b4b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"15.19","blender_version_min":"4.2.0","maintainer":"Eric Bauduin","tags":["Blender","Blueprint","Vehicle","Car","Modeling","UV","Mapping","Game","Low","Poly"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/152e3275-74ed-44dc-aa4e-6eac6d7be8ac/","schema_version":"1.0.0"},{"id":"fusion","name":"Fusion: Extension For Blender [Before: $59.99, Now: $47.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":24640,"archive_hash":"sha256:57beb6af17e7d10f8331d39e8e75b7f678cdd182ae0342d628c24e483e8b1d26","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/598e9407-781e-4079-9ff6-7643b2ba0d1a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"47.99","blender_version_min":"5.0.0","maintainer":"Egret Studios","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a812dae2-08e7-47f6-b981-878077f5780c/","schema_version":"1.0.0"},{"id":"fz_material_kit","name":"F.Z. Material Kit – Ultimate Material Manager For Blender [Before: $4.99, Now: $3.99]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":3828,"archive_hash":"sha256:8f4e5c94a8adf3ee9e104b3030c60f797f7d7365d767cbec08f8e56496b830de","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/0da4c36f-dcc9-49f3-a916-97dcfe1f9765/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.99","blender_version_min":"4.4.0","blender_version_max":"5.9.9","maintainer":"F.Z Studio","tags":["Material","Management","Texture","Import","Viewport","Shading","PBR","Workflow","Shader","Tools"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"2.3.0","type":"add-on","archive_size":5658312,"archive_hash":"sha256:373a4e01e4a65587a73ad699e43663a1d6ee511947f364f3a4a5042d173f6d60","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/acc1fd8e-e8a8-465e-864d-0c6a09c32077/","schema_version":"1.0.0"},{"id":"GLBOptimizer","name":"GLB Optmizer [Before: $15.00, Now: $12.00]","tagline":"FULL plan required - upgrade to download","version":"0.0.5","type":"add-on","archive_size":192462,"archive_hash":"sha256:3d43e5fd646576f31643e616c0712c5d227d7ad38a3902df011f1c68fc104748","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"Lorenz Wieseke","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blendkit.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.60]","tagline":"FULL plan required - upgrade to download","version":"1.3.2","type":"add-on","archive_size":29212,"archive_hash":"sha256:1740ab04111b0aeb6289e20e8e2e1d2bc65605640aa6a5df2305e6f5f42f8818","archive_url":"https://www.blendkit.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.60","blender_version_min":"4.2.0","maintainer":"Arun C","tags":["Baking","GameEngine","AR","GLB","Export","Texture","WebAR"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/4b653b4f-5424-4cb1-9ed5-0067daafe581/","schema_version":"1.0.0"},{"id":"graphi","name":"Graphi [Before: $9.99, Now: $7.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.3","type":"add-on","archive_size":13816,"archive_hash":"sha256:3255ac67672bd68ef09dd22a1d0e67e1c55402a27c1c4710feb4569a0c1eae3f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/86af64b7-5820-47bd-af13-df1464479124/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.99","blender_version_min":"4.2.0","maintainer":"AHMED KETTUR","tags":["Animation","GraphEditor","Keyframes"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0b94a38b-1ad9-4c9d-888c-96ab43ed6a44/","schema_version":"1.0.0"},{"id":"Greaseliner","name":"Greaseliner [$23.00]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":3377084,"archive_hash":"sha256:5f33f69cfe2fc7749e205abd4e84c7f46010d927f32c040763d566f6baa2bd94","archive_url":"https://www.blendkit.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":"23.00","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.blendkit.com/asset-gallery-detail/1cc36d5a-82e3-48d4-a195-abc5d9f9549c/","schema_version":"1.0.0"},{"id":"Hatchliner","name":"Hatchliner [Before: $16.00, Now: $12.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":53789715,"archive_hash":"sha256:cb1cb3557c12f856e99e7b7b53de9c99d25327e720c24b4dd01c6f6fcedcf9eb","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/a4542fa7-ded6-40b8-90b9-aea923676312/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.80","blender_version_min":"5.1.0","maintainer":"Kito Studio","tags":["anime","hatching","style","npr","cellshading","preset","EEVEE","material","shader","node"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e9c5c7f5-ccea-48b1-8b86-eb8c9b549b3c/","schema_version":"1.0.0"},{"id":"hedge_it","name":"Hedge It! [Before: $7.99, Now: $6.39]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":11478819,"archive_hash":"sha256:e0c9a2a1686e7af794326772826984fc49997f9118bef2ad29df7fd58e804004","archive_url":"https://www.blendkit.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.39","blender_version_min":"4.2.0","maintainer":"Blender Bits","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $3.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.5","type":"add-on","archive_size":4247,"archive_hash":"sha256:13a22d85fcf61dee646bd011d7a99878667070cdb7b9e8137ad70eed2c9c3fa3","archive_url":"https://www.blendkit.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":"3.99","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3256,"archive_hash":"sha256:a5f443eae0fbcea81787b8237618c0a73b6e8678578c8a81ac4fc9d0b4b30e5c","archive_url":"https://www.blendkit.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.00","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.blendkit.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.20]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":50182,"archive_hash":"sha256:a9b6ccf44294677f275adb4b504e9f562b1bf17eeb2fca48a799967ce6685ffe","archive_url":"https://www.blendkit.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.20","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.blendkit.com/asset-gallery-detail/7e838867-0ce1-4f38-9081-037c097fc723/","schema_version":"1.0.0"},{"id":"house_designer_AL","name":"House Designer (AL) — Procedural Building Generator. [Before: $4.99, Now: $3.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":22654,"archive_hash":"sha256:3a2f1b99a80ee5f03c4ff1e67f39eb9b6cb98ce82e3c4dd0fd6b8638fcc4d6b8","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/01d0a001-2345-4b4a-bf7f-0f929874ca42/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.99","blender_version_min":"4.0.0","maintainer":"ANDRIY LIA$HKEVI$H","tags":["architecture","procedural","facade","urban","geometry_nodes","building_generator","city_builder"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/aa8829b7-2059-4fe0-9f5a-468318daed3a/","schema_version":"1.0.0"},{"id":"hud_and_ui_elements","name":"HUD & UI Elements [Before: $18.98, Now: $15.18]","tagline":"FULL plan required - upgrade to download","version":"1.16.3","type":"add-on","archive_size":3054185,"archive_hash":"sha256:bc9b4cba6292a78bd51ab4d4c3b4fc2003d9a4300ac00259c960c71aed467526","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/11422bca-41d3-401c-9d50-59d2af96f91e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"15.18","blender_version_min":"2.81.0","maintainer":"N. Emmanuel","tags":["huduielements","hud","ui","fui","motion","design","Animation","Modeling","Mesh","AddMesh"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e01a622f-9495-4e9b-81f3-cba574349e1e/","schema_version":"1.0.0"},{"id":"ideagen","name":"Idea Gen [Before: $3.99, Now: $3.19]","tagline":"FULL plan required - upgrade to download","version":"1.6.0","type":"add-on","archive_size":7498,"archive_hash":"sha256:195787a0aeb3237fa8ca14a73aded6c12d329b3f8c88318b7b2ba458209d8048","archive_url":"https://www.blendkit.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.19","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.blendkit.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.40]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":78889498,"archive_hash":"sha256:bfdd9d71934e2fe77fe67245976ddf895aaee05f7618db9c0ef952486180cf48","archive_url":"https://www.blendkit.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.40","blender_version_min":"4.2.0","maintainer":"Giambattista Von Nettesheim","tags":["gif","animation","blender","addon","rendering"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/655a3cfa-ee24-432a-a34a-d2c1859d19b0/","schema_version":"1.0.0"},{"id":"inkto3d","name":"Inkto3D [Before: $4.99, Now: $3.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.3","type":"add-on","archive_size":6737,"archive_hash":"sha256:60c50ea7c6ca171a5c0c2e5fa70591b5e1436b9e9bf367133fa0d07ede30c2be","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f5a633f4-559b-45d3-82ca-4e152c6c74f3/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.99","blender_version_min":"4.2.0","maintainer":"F.Z Studio","tags":["image","trace","imagetrace","imagetomesh","mesh"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/9ad75f77-de59-42f1-b371-f81a02e61fa7/","schema_version":"1.0.0"},{"id":"instantclean","name":"Instant Clean - The Ultimate Mesh Clean [$9.99]","tagline":"FULL plan required - upgrade to download","version":"2.2.3","type":"add-on","archive_size":125029,"archive_hash":"sha256:0ee941a43e27b95d0ae41d9f179c7b00bcf497c125392ef604e27bfd752c9d93","archive_url":"https://www.blendkit.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":"9.99","blender_version_min":"4.2.0","maintainer":"Ruben Messerschmidt","tags":["mesh_clean","mesh","clean","print","manifold","cleanup"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/44c1aeac-bf6d-4c0a-a575-54b0466f25a2/","schema_version":"1.0.0"},{"id":"jigglegen","name":"JiggleGen [Before: $10.00, Now: $8.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.5","type":"add-on","archive_size":28952230,"archive_hash":"sha256:300b3ba9f8e40ef93c7e0a4b4d15e26589ba566eabfd2914ff8b2f183b84f7b5","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"pathnode","tags":["simulation","cloth","cage","generator","animation"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":16383,"archive_hash":"sha256:edeade332c49b82882fb46ea8e42656c6765df317b574b0261fcdf852f72ee7d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/1f35b35f-1f45-4437-8161-b0971400eb9d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.00","blender_version_min":"4.0.0","maintainer":"RUIDO VFX","tags":["Animation","Decimator","VFX","Keyframe","addon","optimize"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":36340,"archive_hash":"sha256:57ae3b0b9dbee06ac3ecbbd630beb3065e95862f0f4d5966176aad01895d0f38","archive_url":"https://www.blendkit.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.00","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.blendkit.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: $12.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":21438,"archive_hash":"sha256:e498afbddd68d78eb73b0b4cbf95ab07db05d99d15f3f78daa81600fabf144bd","archive_url":"https://www.blendkit.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":"12.80","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.blendkit.com/asset-gallery-detail/39505adc-0694-4efe-a77f-d982d53bfb5e/","schema_version":"1.0.0"},{"id":"daexport_legacy","name":"Legacy DAE Export for Blender 5 [Before: $7.00, Now: $5.60]","tagline":"FULL plan required - upgrade to download","version":"2.0.1","type":"add-on","archive_size":29090,"archive_hash":"sha256:8e40598f64128c7336754ba29bb2c3ff9515b9406cdf2b75f3c04cce253c95f2","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7f96c5ae-1312-417b-9d3a-7cf33641616a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.60","blender_version_min":"4.2.0","maintainer":"Arun C","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/9253938a-d7de-4892-9831-832c2697e4f6/","schema_version":"1.0.0"},{"id":"letter_board_text_creator","name":"Letter board - Text creator [Before: $2.00, Now: $1.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":562941,"archive_hash":"sha256:8c12f39662866981da9dc9ec4b06b2e680ec069a62ba71f112d365a259838a59","archive_url":"https://www.blendkit.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":"1.60","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.4.22","type":"add-on","archive_size":22743109,"archive_hash":"sha256:f8aff9c92a1a5e06f06b57afd968f233c7302c95c6badf6df3ac581edb0c1faf","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/9ecb49b0-9be7-4b4c-8fd8-901bf7c8e655/","schema_version":"1.0.0"},{"id":"light_painter","name":"Light Painter [Before: $45.00, Now: $36.00]","tagline":"FULL plan required - upgrade to download","version":"1.1.1","type":"add-on","archive_size":149404,"archive_hash":"sha256:49578f00c20b4263adfd81ee3f7032d3b682d8847f3d6a6d632688861c351d67","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/69119226-0d05-4ef8-a088-3a7b1d7ab106/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"36.00","blender_version_min":"3.6.0","maintainer":"ShaderError","tags":["lighting","Light","painting","light","texture","gobo","viewport","shadows"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/454164f1-182f-419f-ac8f-3139b1eea769/","schema_version":"1.0.0"},{"id":"livecut","name":"Live Cut [Before: $12.00, Now: $9.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5961,"archive_hash":"sha256:344e826b17c18f8c85f0d608ce004b5c60f464767415f9fc8452da5de19b760c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/6ddbe436-5f33-4f2f-ad73-145f4be40360/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"9.60","blender_version_min":"4.2.0","maintainer":"Milad Kambari","tags":["Modeling","Mesh","addon","cut","slice","window","door","frame","slicer"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/fd172489-a974-4246-a792-81d1360074f4/","schema_version":"1.0.0"},{"id":"lm_studio_pro","name":"LM Studio Gobos & Volumetrics [Before: $9.50, Now: $7.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.8","type":"add-on","archive_size":267095919,"archive_hash":"sha256:2a52ce50df73acc701de918a4f649090e986b6a0531a9047f1d7c6a4574a39c2","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9d80283e-a2b7-4ff9-acda-08222fcd7425/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.60","blender_version_min":"4.0.0","maintainer":"Mr Steve Lee","tags":["Lighting","fog","volumetrics","2026","addon","blender"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/14c5daee-5691-4c63-8bea-789b5e47113d/","schema_version":"1.0.0"},{"id":"skava_lod_generator_pro","name":"LOD Generator Pro - Ultimate Edition [Before: $9.99, Now: $7.99]","tagline":"FULL plan required - upgrade to download","version":"3.2.6","type":"add-on","archive_size":29745,"archive_hash":"sha256:6610b853ed8672ec051da8fa260e7e37a278bc735d0b71253353999ba0f3d15d","archive_url":"https://www.blendkit.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":"7.99","blender_version_min":"4.2.0","maintainer":"SKAVA Piatkov","tags":["automation","decimation","godot","lod","performance","unreal","unity"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d87d6532-edea-4ee0-a90a-37bf7390f8b1/","schema_version":"1.0.0"},{"id":"lod_generator_v2","name":"LOD GENERATOR v2.0 [Before: $29.99, Now: $23.99]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":12591,"archive_hash":"sha256:56aeba95403754a8088bdf67a6a9d69853fa45c7f4196223484839812035f91f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/5b53c74b-5c5b-4fd8-97fc-f3c72c049307/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"23.99","blender_version_min":"4.2.0","maintainer":"Pradeep Prasad","tags":["Mesh","Asset","GameEngine","optimize","gamedev","lods"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e6b9b8df-2eda-470b-b4df-fb747a57a81a/","schema_version":"1.0.0"},{"id":"lottie_addon","name":"Lottie Animation Addon [Before: $30.00, Now: $24.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":68472,"archive_hash":"sha256:7a61a0f782303f92384b3076efa073b4f03e2464569b943afb70a4882a7f3c45","archive_url":"https://www.blendkit.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":"24.00","blender_version_min":"4.2.0","maintainer":"Nicolai Prodromov","tags":["lottie","web","animation","json","webdesign"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $15.92]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":134264,"archive_hash":"sha256:5993304df2b155c02d92eced383dff07dd63bb70e98976f1cbffd5045b4faf8d","archive_url":"https://www.blendkit.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":"15.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.blendkit.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: $4.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":7584,"archive_hash":"sha256:07fd66208c0c388f9923f42b5832915dae0591b2891eb914f4fb47e705ebd981","archive_url":"https://www.blendkit.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":"4.80","blender_version_min":"4.2.0","maintainer":"Vaishakh Vinod","tags":["Object","Scene","Workflow","Pipeline","Animation","Rigging","rename"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/985de1bd-37f2-4e13-9fc2-d41c3521bd44/","schema_version":"1.0.0"},{"id":"matcaps_forever","name":"MATCAPS FOREVER [Before: $9.99, Now: $7.99]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":4801,"archive_hash":"sha256:ab2c85d1afff16262e29102956fa13f0e63e25c1500fa82428e665497896e2b7","archive_url":"https://www.blendkit.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":"7.99","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.blendkit.com/asset-gallery-detail/5e190400-1471-4118-99ea-079be8ee661f/","schema_version":"1.0.0"},{"id":"flat_pallete","name":"Material Colors to Texture atlas [Before: $3.00, Now: $2.40]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2994,"archive_hash":"sha256:f752b1c38cd58ffa9d90fcb6dd273fe8e42283cef1dd1d0a97ef27404ac95437","archive_url":"https://www.blendkit.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":"2.40","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.blendkit.com/asset-gallery-detail/4d46d04a-0269-4c0c-bb78-6b4abb84903e/","schema_version":"1.0.0"},{"id":"material_overrider_plus","name":"Material Overrider + [Before: $2.00, Now: $1.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3357,"archive_hash":"sha256:e2d67029d11cce5015292769e3e51198c442b955e0d127c0c4d74714ea1e4f30","archive_url":"https://www.blendkit.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":"1.60","blender_version_min":"4.2.0","maintainer":"Brahim Houari","tags":["override","materialoverride","overrider"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/41e0e1c8-7940-4ebe-9ed5-67a9144c7365/","schema_version":"1.0.0"},{"id":"materialpicker","name":"Material Picker - Select And Browse Materials [$7.99]","tagline":"FULL plan required - upgrade to download","version":"1.3.2","type":"add-on","archive_size":339989,"archive_hash":"sha256:ed9347567f8cf94a3ac11d725ba55f232bf95ee81d3c3024e69717b332073b75","archive_url":"https://www.blendkit.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":"7.99","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.blendkit.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.40]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3814,"archive_hash":"sha256:0ffd38163d6d70c4d9fbbc3d36e20198feb94c1f714472fc8f6854efdacfddb1","archive_url":"https://www.blendkit.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.40","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.3","type":"add-on","archive_size":11376,"archive_hash":"sha256:866db1a3dac81c24001d92f72e3b93ccc15b5046d884e9cf061ca159106ba813","archive_url":"https://www.blendkit.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.00","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.blendkit.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: $17.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":926239,"archive_hash":"sha256:39113a92d620c5a9ad82b6cbb24fc5697dfba4c3ba27ec8c19c494e457533916","archive_url":"https://www.blendkit.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":"17.60","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.blendkit.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: $29.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2604916,"archive_hash":"sha256:f3b563325e1ac70edc9f632110771fddacc6aaf5b414e107359850a4bf0430a1","archive_url":"https://www.blendkit.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":"29.60","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.blendkit.com/asset-gallery-detail/81704036-143d-48a5-baca-bd4906793518/","schema_version":"1.0.0"},{"id":"meeting_room","name":"Meeting Room [Before: $12.00, Now: $9.60]","tagline":"FULL plan required - upgrade to download","version":"2.3.7","type":"add-on","archive_size":227745137,"archive_hash":"sha256:af2f30607909bdebabb46371a0407b1dcccf5f73add016d87ccb9f1da9d59b32","archive_url":"https://www.blendkit.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":"9.60","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.blendkit.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: $16.00]","tagline":"FULL plan required - upgrade to download","version":"2.4.0","type":"add-on","archive_size":217644,"archive_hash":"sha256:95e279244505ba2f335f42205dad6cd6770701f7b6c9619d9bc9d1a10d29bf7c","archive_url":"https://www.blendkit.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":"16.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.blendkit.com/asset-gallery-detail/0a231655-c32c-4025-a718-582af4e25c5a/","schema_version":"1.0.0"},{"id":"microstox","name":"🚀MicrostoX | Smart Exporter for Contributor [Before: $11.00, Now: $8.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":34254,"archive_hash":"sha256:7a00508838cdc8704e6d71169ff3b95c1e4db8729382776a230f681e3c8ee6d6","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/6ce4681b-6b98-4bad-b076-9b45a3e0b38d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.80","blender_version_min":"4.0.0","maintainer":"budijozz semangat pagi","tags":["Export"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/3dfe7d5c-b064-404a-9b1b-abba03b33642/","schema_version":"1.0.0"},{"id":"migration_manager","name":"Migration Manager: Your Workspace, Everywhere. [Before: $5.99, Now: $4.79]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":4548,"archive_hash":"sha256:abcec391e80b360e7c3f2af380df302c528846c41be372769ac45de3b274c811","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/80568778-1bf1-4e25-ac41-1fffebaec520/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.79","blender_version_min":"4.2.0","maintainer":"Hey Arnold","tags":["System","export","import","ui","migrate","workspace","themes"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/33dd26c1-228a-4854-b33c-3100c1d95211/","schema_version":"1.0.0"},{"id":"mk_roughness_browser","name":"MK Roughness Builder [Before: $12.00, Now: $9.60]","tagline":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":4728852238,"archive_hash":"sha256:65e6ebe517087fb30c77916635504d8d6a5660ed44e557015a098cd0b197c5d8","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/94002b05-96be-4954-a0a3-e8333ad7a681/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"9.60","blender_version_min":"4.2.0","maintainer":"Milad Kambari","tags":["Material","3DView"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/85333172-af22-4158-9f1d-eaf25a971fb0/","schema_version":"1.0.0"},{"id":"blenquick_mocap_lite","name":"Mocap Lite [Before: $13.00, Now: $10.40]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":286687930,"archive_hash":"sha256:11767f1a1a56829ac080a760db0162deffdb17eb61aa5cc9ec8a995018123dc5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/58617425-e908-469d-8527-38afe9aaac86/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.40","blender_version_min":"4.5.0","maintainer":"Stellart","tags":["mocap","motioncapture","face","capture","motion","lite","basic","animation","3d"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/851c73c9-c226-4f1e-a4fd-d10eb0bdcae1/","schema_version":"1.0.0"},{"id":"blenquick_mocap_pro","name":"Mocap Pro [Before: $26.00, Now: $20.80]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":139514705,"archive_hash":"sha256:853fe025d14a5a4e0b3a42866a099e4ac7ff74bafd9f11da7778938042ad7573","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/a0e33e40-fad5-436a-89c3-65b615d2b8b8/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"20.80","blender_version_min":"4.5.0","maintainer":"Stellart","tags":["advanced","mapping","mocap","retargeting","rig","live","face","capture","motion"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.1.2","type":"add-on","archive_size":16067,"archive_hash":"sha256:ccf1b84a9617e8d52b84659ff9c74f8499d636586f9cda4924ca421f0a3537ed","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"carlosmu","tags":["toolbox","modifiers","favourites","user","ui","ux","quick"],"license":["default_addon_license"],"website":"https://www.blendkit.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 [$9.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":92368,"archive_hash":"sha256:4c10ee77ba44e0fb663fbf160c590eb9d930f10f50e02518781bddada90b3356","archive_url":"https://www.blendkit.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":"9.99","blender_version_min":"4.2.0","maintainer":"Ruben Messerschmidt","tags":["3DView","Modeling","Modifiers","Presets","Hardsurface","Nondestructive"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/8f6686ab-238a-4a6e-8c33-1d0cf3ad96bf/","schema_version":"1.0.0"},{"id":"modular_medieval_house_creator","name":"Modular Medieval House Creator [Before: $9.99, Now: $7.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1040719091,"archive_hash":"sha256:7dba7c4115ce7064edc349fb697a4906271a79cc559344cf28aeb09f74eb6a6f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9a296711-2409-4b38-b028-2af93cac33b6/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.99","blender_version_min":"4.2.0","maintainer":"FANNΞC","tags":["architecture","buildings","environment","exterior","fantasy","interior","kitbash","medieval","modular","Village"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/240b303e-4368-4e45-9ae8-9cbdbd2e477e/","schema_version":"1.0.0"},{"id":"modular_suburban_house_creator","name":"Modular Suburban House Creator [Before: $9.99, Now: $7.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1100698310,"archive_hash":"sha256:1ee9250c031f1b4333afa6ad3882ccb08f352bb8bd61826fbed32093f76ebb12","archive_url":"https://www.blendkit.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":"7.99","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.blendkit.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: $17.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1617645,"archive_hash":"sha256:9e8f0487fb6d1df9beee2a0e987d36e5d264a55c776ff74897bf0e146a709097","archive_url":"https://www.blendkit.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":"17.60","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.blendkit.com/asset-gallery-detail/aad33ffc-2016-4aa1-b895-b1a9257130a0/","schema_version":"1.0.0"},{"id":"motionpro","name":"MotionPro [Before: $19.99, Now: $15.99]","tagline":"FULL plan required - upgrade to download","version":"3.1.0","type":"add-on","archive_size":325988,"archive_hash":"sha256:1d85fca4bdcb5cf8b3f4198d5cecb0fe454a0c36b3b1c1613cb006d1892dbe21","archive_url":"https://www.blendkit.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":"15.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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":3056,"archive_hash":"sha256:afa36cab047702f58a04708ae2529774106f2b0323de434aa126070b7e82af80","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"MR XD","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blendkit.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.39]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":20029,"archive_hash":"sha256:422408ca88216e626bcf0aa425de73ddcb0b34f5da08afc29464406724f20a1d","archive_url":"https://www.blendkit.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.39","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Pipeline","Scene","importexport","murge","multi","blend"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/21b72c0a-b02d-4a8f-8aa9-3ada5908538f/","schema_version":"1.0.0"},{"id":"multi_mat_baker","name":"Multi-Mat Baker - Bake Multiple Materials into One PBR Texture Set in One Click [Before: $15.00, Now: $12.00]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":21297,"archive_hash":"sha256:bf89bdee36ce70c86813b2f4e2cb52bacd0478f16fbd234201a734286ca1d081","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/8feae2cf-72cd-413c-a7fc-889cb4fb46dc/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.00","blender_version_min":"3.0.0","maintainer":"Junaid Alam","tags":["Baking","Material","UV","GameEngine","Texture"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2124f634-f2e2-4f4e-8bc8-320673cff0bf/","schema_version":"1.0.0"},{"id":"multixport_pro","name":"MultiXport Pro [Before: $14.99, Now: $11.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":30134,"archive_hash":"sha256:c9a47b80240933e964cb542724e119d7ba371083048bbacf74f72df8535e8571","archive_url":"https://www.blendkit.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":"11.99","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.blendkit.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: $21.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":51509952,"archive_hash":"sha256:4198442c63c083ec27ece9a06ff9917783286565ca617314d6bd058c43a06ef0","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/29e22ab7-79b3-4733-b3db-7b0e2b9920dc/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"21.60","blender_version_min":"5.1.1","maintainer":"Giambattista Von Nettesheim","tags":["Mesh","Object","Modeling","Sculpt","import","export","remesh","retopology","remeshing","mesh"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d4ca1fc2-a0e8-4ccf-bc6e-076b26d09e7b/","schema_version":"1.0.0"},{"id":"name_your_things","name":"NAME YOUR THINGS [Before: $8.00, Now: $6.40]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":8465,"archive_hash":"sha256:3657a86a882dea913494ab0bf397a97435663d4bdebd4ad8a5a0367a44c5b9f8","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/b4d3d12f-6d51-4a3c-8b65-e796bfe1f011/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.40","blender_version_min":"4.0.0","maintainer":"ImNoah","tags":["naming","mesh","clean","cleanup","namer","name","organise","things"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/295ca03c-0ff2-4209-8cb4-885a8614f4b1/","schema_version":"1.0.0"},{"id":"neural_upscaler_x4","name":"Neural Upscaler X4 [Before: $10.00, Now: $8.00]","tagline":"FULL plan required - upgrade to download","version":"3.1.0","type":"add-on","archive_size":3652555628,"archive_hash":"sha256:333631ea85fb768eaa46f19418329e052599e5b678727eb4199638c4efc98e28","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/01d335b6-82ae-40e4-985a-5a758b6d8ecc/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.00","blender_version_min":"5.0.0","maintainer":"Cloudy Sky","tags":["AI","tool","4K","Upscale","x4"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/ee306f1d-b7f4-4e8e-8e0d-86e8777c3af0/","schema_version":"1.0.0"},{"id":"ngone_pro","name":"N-Gone Pro [Before: $12.99, Now: $10.39]","tagline":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":21732,"archive_hash":"sha256:7a52568df96c5ee3f424333dad15d6de143868fa544a5de3adf9d6848b09f54c","archive_url":"https://www.blendkit.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":"10.39","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":64311,"archive_hash":"sha256:d13c9fcbb9e5ac7547c4eb6c1fda5922171daf6870898830adb2a6dad931b20b","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"kanwei sun","tags":["Node","Tools","Workflow","Editor"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/8804d2f3-775e-4d39-9f86-a38aa0f95062/","schema_version":"1.0.0"},{"id":"node_navigator","name":"Node Navigator [Before: $5.00, Now: $4.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.7","type":"add-on","archive_size":21242,"archive_hash":"sha256:4dcf9bc5e77e463708218799e5a56235295d577861088e77856cae6cce40296f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f6c592fe-b043-4572-8799-1be5c1ba6c0b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.00","blender_version_min":"3.6.0","maintainer":"Mr Steve Lee","tags":["geometry","nodes","organize","arrange","preset"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/cecb7191-5348-4e5a-a6a8-7b01f6ab7136/","schema_version":"1.0.0"},{"id":"n_panel_navigator","name":"N-panel Navigator [$8.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":27286,"archive_hash":"sha256:1800311d9beb2ad4993fa0be51f8216209b20e25c41251a3afe5b1ea8d545569","archive_url":"https://www.blendkit.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":"8.00","blender_version_min":"4.2.0","maintainer":"belaid ziane","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/72bab743-cb6a-4b75-9d9b-433088728648/","schema_version":"1.0.0"},{"id":"npanel_tab_reorder","name":"N-Panel Tab Reorder [Before: $1.99, Now: $1.59]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":34378,"archive_hash":"sha256:d03dd14657f4434a3c4d15a7eb69aab39a5ac4b7448ebddd2eea5fcb0f8ef81a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/fe28eede-1569-464b-86b7-f41037ec5744/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.59","blender_version_min":"3.6.0","maintainer":"Joy","tags":["ui","interface","customization","panel","management"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/74ca75ae-fafd-4ad0-a99d-c3215b9ea4bc/","schema_version":"1.0.0"},{"id":"n_panel_tabs","name":"N-Panel Tabs [$6.50]","tagline":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":6626,"archive_hash":"sha256:a4f36946fd4d25572d27f1fda1fbab96334e7fe321d20c6176c79383c9ee769b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c2b0fa8d-b323-4a43-8774-b34931e4f49a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.50","blender_version_min":"5.1.0","maintainer":"Eros Fornasari","tags":["manager","sidebar","tab","tabmanager","workflow","optimization","Interface","UserInterface","3DView"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/271b8c2d-5132-4d12-8696-f9504eff2a58/","schema_version":"1.0.0"},{"id":"null_game_toolkit","name":"Null Game Toolkit [Before: $32.00, Now: $25.60]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":28327,"archive_hash":"sha256:519f5dc600ae12492c11bb1a4f8f6d6b90dea42d3d63ad8dfe552e3d4001c9de","archive_url":"https://www.blendkit.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":"25.60","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.blendkit.com/asset-gallery-detail/96b340d7-9c98-4933-8f65-06a676918b1d/","schema_version":"1.0.0"},{"id":"nview","name":"nView [Before: $22.98, Now: $18.38]","tagline":"FULL plan required - upgrade to download","version":"3.7.0","type":"add-on","archive_size":76727,"archive_hash":"sha256:969eb684b871e4c1af888f818373056c191d00c587370f65e57e57c2dc2c14a3","archive_url":"https://www.blendkit.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":"18.38","blender_version_min":"4.2.0","maintainer":"Spencer Magnusson","tags":["viewport","optimization","object","visibility","performance"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":74608,"archive_hash":"sha256:154d6d78fe2620b60cc25ebe87054defc72f7eb76c3cad58d86cf4ae6dad2b16","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"belaid ziane","tags":["Bendshape","bender","bend","curve"],"license":["default_addon_license"],"website":"https://www.blendkit.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.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2739,"archive_hash":"sha256:d9b10d648c575ee0b17ee027f20296051e975e2f498673d6a8b16ca697e6de7c","archive_url":"https://www.blendkit.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.60","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.blendkit.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.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":9257,"archive_hash":"sha256:932e313907fed8ebe4f7359a41f4e3e0f95745bbd86b1dc049e821cb4083c559","archive_url":"https://www.blendkit.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.60","blender_version_min":"4.2.0","maintainer":"Arun C","tags":["obj","export","bake"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $9.50, Now: $7.60]","tagline":"FULL plan required - upgrade to download","version":"5.0.0","type":"add-on","archive_size":46749971,"archive_hash":"sha256:44bbf8936bbcf524aeacdc5567cb68f6fb98b8e814d5e7d7859c48a470ead90a","archive_url":"https://www.blendkit.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":"7.60","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.blendkit.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.19]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":11397,"archive_hash":"sha256:e6e72c938979613a4a794b2284a75bb0ef8f90f35d07e42c5c8593f9a94ca366","archive_url":"https://www.blendkit.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.19","blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["OCRImageextraction"],"license":["default_addon_license"],"website":"https://www.blendkit.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.20]","tagline":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":5231,"archive_hash":"sha256:4173b4cdf0ec617585b4f2ad40eac2917293298a27dc016a7c63ba9b6de82ca2","archive_url":"https://www.blendkit.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.20","blender_version_min":"4.2.0","maintainer":"Yaroslav Okhranchuk","tags":["Animation","Object"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"2.2.3","type":"add-on","archive_size":20453,"archive_hash":"sha256:14197ff44de0374d1709be60d844a69cdcac1ef00679d4ae5a9c01f8fc8705d4","archive_url":"https://www.blendkit.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.00","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.blendkit.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: $14.40]","tagline":"FULL plan required - upgrade to download","version":"2.0.2","type":"add-on","archive_size":224274155,"archive_hash":"sha256:202feaec961debe8852a37397bd4f171cc93b9b7c811cead6e792b89f9a4c759","archive_url":"https://www.blendkit.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":"14.40","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"3.2.0","type":"add-on","archive_size":17131,"archive_hash":"sha256:2522018ef3f2d98e91300c6793f57fb9fe8faea6034be2076bb364a621902c1d","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/31b436e2-7cca-442c-aeee-6f7004275252/","schema_version":"1.0.0"},{"id":"ez_studio_pro","name":"One Click Studio [Before: $5.85, Now: $4.68]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":10860,"archive_hash":"sha256:ed68ce19f9006a39a588d0e35d12004517975916112867b14dde807bfa2b23cf","archive_url":"https://www.blendkit.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":"4.68","blender_version_min":"4.2.0","maintainer":"The Smart King","tags":["Render","Lighting","Optimization","Productivity","studio","camera","blender"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/1c5d0887-7382-4dbd-9ba3-bee0cfd933e3/","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.00]","tagline":"FULL plan required - upgrade to download","version":"1.7.0","type":"add-on","archive_size":17635288,"archive_hash":"sha256:22bd48bd5b54bc8b9c1d5be2a97e840667d3ad7ddf724cf0e0ccabcc82000233","archive_url":"https://www.blendkit.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.00","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"0.2.0","type":"add-on","archive_size":318904565,"archive_hash":"sha256:9207d2b84a10bc3bf33d477424b3d863ae8c4b63d1de89a2f64b8d0cc1fcaa6c","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"Haseeb Ahmed","tags":["2d","video","tracker","3d","tracking"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $3.92]","tagline":"FULL plan required - upgrade to download","version":"1.2.1","type":"add-on","archive_size":15593,"archive_hash":"sha256:281998905bd7fc71b8993a71fa64ffd28394f999a146d0f4f4c24db02e81b13a","archive_url":"https://www.blendkit.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":"3.92","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Render","Animation","3DView"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":510578,"archive_hash":"sha256:ff24edd79a427cca1f6439c4edbdc950e6acd25b7555d8acf254986fd70085e3","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","organix","shapes","modeling","organic","procedural"],"license":["default_addon_license"],"website":"https://www.blendkit.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.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1963,"archive_hash":"sha256:ed7ae5e3669860275c5e8477a4e545f39efb15cbe49679994c199b86f8e4c4e6","archive_url":"https://www.blendkit.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.80","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.blendkit.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.80]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":2056,"archive_hash":"sha256:412d83a0176f31a6d328ecab304d75d38c91eb6aacd163277301bbd0028b76d4","archive_url":"https://www.blendkit.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.80","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.blendkit.com/asset-gallery-detail/3f2afda8-dce0-4fa3-9aad-44cad17c2043/","schema_version":"1.0.0"},{"id":"palette_manager_pro","name":"Palette Manager Pro — Color Palette System For Blender (Pro Tier) [Before: $12.99, Now: $10.39]","tagline":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":45276,"archive_hash":"sha256:491dd63e67a545673cf7b18646aaf30dfd733df3e280a3ef99cd240fb3b106ab","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/06d812db-bfe3-4726-b68e-832e3c3f118e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.39","blender_version_min":"4.2.0","maintainer":"NovaStrikes Shahbaz","tags":["Material","Paint","Color","palette","texture","blender","gradient"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/8e0a91d3-79a8-4205-8c69-de1ca083c7ae/","schema_version":"1.0.0"},{"id":"tobip_particles_catalog","name":"Particles addon [Before: $5.00, Now: $4.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":47741747,"archive_hash":"sha256:502c9f726ea418185363df9c3d0947fff2639ca7331895cbbaec3de79cf2a91a","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/693ffd00-e10e-4f18-8419-ba55fe48ff07/","schema_version":"1.0.0"},{"id":"eztexture_pro","name":"PBR Texture Pro [Before: $2.50, Now: $2.00]","tagline":"FULL plan required - upgrade to download","version":"3.0.0","type":"add-on","archive_size":3294637,"archive_hash":"sha256:345223ed17af25f05ad21e942476bfd3addb4c382eee83df3f242aa4b48a32b0","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"The Smart King","tags":["Texture","PBR","Material","autouv","shaders","udim","Node","Smart","UV"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/18b6c783-c973-4abc-90f2-5f380e6e86d8/","schema_version":"1.0.0"},{"id":"perforated_panel","name":"Perforated Panel [Before: $1.00, Now: $0.80]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":844690,"archive_hash":"sha256:5e86344238ef6499fc3e0fdc58d591c46f746eb477622e2a34ae46024edfe900","archive_url":"https://www.blendkit.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.80","blender_version_min":"4.2.0","maintainer":"Abbos Mirzaev","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/7b1c87c0-04c4-4272-977e-17ea92ee85b5/","schema_version":"1.0.0"},{"id":"physicsgen","name":"Physics Gen [Before: $4.99, Now: $3.99]","tagline":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":4354,"archive_hash":"sha256:8f6a1c5c5c4eec0e0893e94ec9230e2dd78f87e3e2f985da3586c50cdf2aa0d5","archive_url":"https://www.blendkit.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":"3.99","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.blendkit.com/asset-gallery-detail/dfe61d32-24aa-4b8d-8bbb-6863cfbe628a/","schema_version":"1.0.0"},{"id":"wk_tools","name":"PickUp Tools [Before: $16.00, Now: $12.80]","tagline":"FULL plan required - upgrade to download","version":"1.7.0","type":"add-on","archive_size":149362,"archive_hash":"sha256:cfbd5b940ae8191ce873be6d2b813c3bf940521891e33ee82ed75665ffd2ba84","archive_url":"https://www.blendkit.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":"12.80","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"3.0.0","type":"add-on","archive_size":21168,"archive_hash":"sha256:e140cc12a36bda67d704adb6f7ca250f111630313f356995127313910aa3b0f9","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/12da713a-b0be-496b-a8e3-46477249e30e/","schema_version":"1.0.0"},{"id":"playblast","name":"Playblast [Before: $7.50, Now: $6.00]","tagline":"FULL plan required - upgrade to download","version":"1.3.2","type":"add-on","archive_size":19161,"archive_hash":"sha256:dca5cd406ed0fd14ee53bd59a6a3cf48e863fe537a3e9f170dd8479d1065892d","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/93ad9257-b229-445b-8277-c702bde1eab4/","schema_version":"1.0.0"},{"id":"polymating","name":"Polymating [Before: $10.00, Now: $8.00]","tagline":"FULL plan required - upgrade to download","version":"1.3.1","type":"add-on","archive_size":78737,"archive_hash":"sha256:a129c270d00436e1f8eb0e5f1ba2b6b3d9cb6e143047b9a9d02350d054a708de","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"Mozzarella ARC","tags":["modeling","retopology","topology","sculpt"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/3d3d0b48-a9e1-4081-bfdd-ebe34bcebe72/","schema_version":"1.0.0"},{"id":"Polyviews","name":"Polyviews [Before: $9.00, Now: $7.20]","tagline":"FULL plan required - upgrade to download","version":"3.1.0","type":"add-on","archive_size":36022,"archive_hash":"sha256:2aac9cae99896126264c23d6025ede4cf88678d25fe2d91947935d7363a179c2","archive_url":"https://www.blendkit.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.20","blender_version_min":"4.2.0","maintainer":"polyspaace","tags":["render","manager","rendermanagement","views","cameras","scenes","scene"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":220543,"archive_hash":"sha256:9742a530dbfadf2f5d349c8a5b54b891878e955d8daa8fc2004c0221d7f65687","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"Nicolai Prodromov","tags":["procedural","nodegroups","geometrynodes","extension","community"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":2386869,"archive_hash":"sha256:c3365d6bcdbdff2c522f3f1448fad875fb172e94bf461a33fe1334246ac874c0","archive_url":"https://www.blendkit.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.00","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.blendkit.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.60]","tagline":"FULL plan required - upgrade to download","version":"1.2.2","type":"add-on","archive_size":8027,"archive_hash":"sha256:900105e74ba1de500ce56b946e998c2b475b6a2a07345116996736720f1402cf","archive_url":"https://www.blendkit.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.60","blender_version_min":"4.2.0","maintainer":"CG Galaxy","tags":["align","rotation","autoalign","proaligner","worldalign","objectalign"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/ed839737-ce8c-412c-8753-80a2bc968b59/","schema_version":"1.0.0"},{"id":"procedural_clouds","name":"Procedural Clouds [Before: $25.00, Now: $20.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":24305854,"archive_hash":"sha256:b6d83cf36baa39f432f698749b6d57efd0a21c36d08e9c0a38366560da491b00","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/72fb912b-ceae-4fec-9e03-d099f4518290/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"20.00","blender_version_min":"4.5.0","maintainer":"Suzanne studio","tags":["clouds","cloud","sky","skies","volume","volumetrics","storm","addon","atmosphere","procedural"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/70f5bfd0-0c25-4a15-a694-384875e86a6e/","schema_version":"1.0.0"},{"id":"neo_cables","name":"Procedural Neo Cables [Before: $11.00, Now: $8.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":4199,"archive_hash":"sha256:22bfb3d0dc05b9f0c8533e937331f967edbbfbc7c17717fcfae2907f08f42877","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/6c980f63-dcc9-4ed6-923b-c1bec5bce747/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.80","blender_version_min":"4.5.0","maintainer":"Stellart","tags":["procedural","generator","cable","wire","rope","generate","oneclick","string","thread","modifier"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/bb5d18f8-b5b6-4fb1-9f53-00fbf0c7aacb/","schema_version":"1.0.0"},{"id":"relief_generator","name":"Procedural Relief Generator [Before: $11.00, Now: $8.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":14488,"archive_hash":"sha256:989a13be349b0d31de10706c0f77102db3d9f2a107b43ef6e68fd85345cadd28","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/0c08788c-385f-4672-a739-3f1ff514de87/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.80","blender_version_min":"4.5.0","maintainer":"Stellart","tags":["generator","landscape","Surface","objects","procedural","parts","relief","stone","3d_landscape","3d_hard_surface"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/78d02e2e-39af-4044-a0cd-6af304fde263/","schema_version":"1.0.0"},{"id":"Procedural_Sky_System","name":"Procedural Sky System [Before: $15.00, Now: $12.00]","tagline":"FULL plan required - upgrade to download","version":"0.2.6","type":"add-on","archive_size":724389,"archive_hash":"sha256:78d907ff64c92dc9fe436fe10cdc90f2fa51f47f1145d4e700a8a10bbb3c37dc","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"Other Realms","tags":["World","sky","HDRI","shader","cartoon","anime"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"2.0.3","type":"add-on","archive_size":39573,"archive_hash":"sha256:bc1060a598e1f490c0b5f06542dcecfd0afb6e414efdb56dd50d098be5367665","archive_url":"https://www.blendkit.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.00","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.blendkit.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: $16.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":31931,"archive_hash":"sha256:1c78dd9539e0a76f95d94acf2e2c03b6b9f04d73e311c03ef1465e44a195774c","archive_url":"https://www.blendkit.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":"16.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.blendkit.com/asset-gallery-detail/b8679695-2084-4bab-82d7-2a880628e8e6/","schema_version":"1.0.0"},{"id":"POS_shelf_display_generator","name":"Product Display Generator [Before: $20.00, Now: $16.00]","tagline":"FULL plan required - upgrade to download","version":"3.0.0","type":"add-on","archive_size":10667988,"archive_hash":"sha256:7b4aba700c52b3bdc15b5f152f8d1267e087295202f024a92bd6570d7336afb7","archive_url":"https://www.blendkit.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":"16.00","blender_version_min":"4.2.0","maintainer":"brandPOS Karpeta","tags":["Object","cardboard","packaging","FSDU","display","generator","model"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/f2880b5e-ba2f-4f2f-9556-16dd98491c38/","schema_version":"1.0.0"},{"id":"profiler","name":"Profiler 2.0 - Advanced curve beveling tool [Before: $15.00, Now: $12.00]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":310438,"archive_hash":"sha256:71cdedf04df387f1594eff9f4152ad68289aca5a273faddbf03b4366c7960032","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/82e161cd-8bfb-4b8a-9903-5aad49739ee2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.00","blender_version_min":"4.2.0","maintainer":"Mike Radjabov","tags":["Modeling","curve","spline","sweep","profile","cornice","bevel","molding","svg"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/1cd6fbe1-c385-4941-ad49-06342734572d/","schema_version":"1.0.0"},{"id":"psd_layers","name":"PSD-LAYERS V1.6 Add-on [Before: $5.00, Now: $4.00]","tagline":"FULL plan required - upgrade to download","version":"1.6.0","type":"add-on","archive_size":50355,"archive_hash":"sha256:c767d1916b98c2348e38ff329b065a32caae4525a278bcbd3cfdda3e50e7e27a","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/b1964db5-95ce-454a-ae93-74a3a17d37a2/","schema_version":"1.0.0"},{"id":"quadify_premium","name":"Quadify Premium [Before: $24.97, Now: $19.98]","tagline":"FULL plan required - upgrade to download","version":"2.6.0","type":"add-on","archive_size":26623,"archive_hash":"sha256:cbae5724dbd151f7aead7e85d4837a07e8906fc432edcbbb63b8a7cf0a515409","archive_url":"https://www.blendkit.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":"19.98","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.blendkit.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: $64.00]","tagline":"FULL plan required - upgrade to download","version":"2.3.4","type":"add-on","archive_size":82832,"archive_hash":"sha256:73b148cf5c29fc62024b7bd4bba1dbaf99914395a8f0faf6efa0c0077caeb4e5","archive_url":"https://www.blendkit.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":"64.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.blendkit.com/asset-gallery-detail/489eaa7f-5ad4-402b-8a65-7404010df89b/","schema_version":"1.0.0"},{"id":"quadify_ultra","name":"Quadify Ultra [Before: $150.00, Now: $120.00]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":2569263,"archive_hash":"sha256:4202b7d30673354503fb49a643b0a4e46dd3c03ea18d2f8bee0117fb3c952741","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c3815f1e-2cf4-4d0e-b037-19e6a568cb00/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"120.00","blender_version_min":"4.2.0","maintainer":"Anvil Interactive Solutions Anibe","tags":["Modeling","Mesh","Retopology","Topology","Quad","Optimization"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/1113757c-3829-4c33-bf49-11d38d30003d/","schema_version":"1.0.0"},{"id":"quick_align","name":"Quick Align [Before: $2.50, Now: $2.00]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":30856,"archive_hash":"sha256:cb1e0440c5f4407c455fbd2e5510a508c4982fe3123a9a489420ea00603b482a","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"Null Station","tags":["Object","Aligner","Evenly","Distribution","Illustrator","Adobe","tools"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/91bec957-fe14-459a-83cc-5ce477214631/","schema_version":"1.0.0"},{"id":"quick_apply","name":"Quick Apply [Before: $6.00, Now: $4.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3846,"archive_hash":"sha256:74bc61eb7fc7f873cf32786b90f7ca80441528bd3deb36ea590c0a2311eba562","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e76474a4-7bce-44f2-9786-a90c4711eaec/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.80","blender_version_min":"3.0.0","maintainer":"Siva T","tags":["Object","Material","Modifier","Utility","easyapply"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/46c1cbcd-3c06-4aa0-92ef-4c81446359ed/","schema_version":"1.0.0"},{"id":"quick_baker","name":"Quick Baker [Before: $30.00, Now: $24.00]","tagline":"FULL plan required - upgrade to download","version":"3.2.2","type":"add-on","archive_size":299690,"archive_hash":"sha256:7f1117807074aeac02c4bb2ac24586d64469cc66b983f71b9599a0a1351c78a6","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/1524c9a1-2563-4302-873f-61b33abc799c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"24.00","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2426,"archive_hash":"sha256:384d34cb9c86629eac51f09fa6a1af15ca086b9ffdf75ef2dd3ee88c91370f9a","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"isac lima","tags":["Fast","Texturing","Texture","Material","Color","Picker","lowpoly"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/b6528286-f9b0-4dbc-b032-5c479193a350/","schema_version":"1.0.0"},{"id":"quick_decal","name":"Quick Decal [Before: $20.00, Now: $16.00]","tagline":"FULL plan required - upgrade to download","version":"1.7.1","type":"add-on","archive_size":268191,"archive_hash":"sha256:3ba5d820d9b24cda4c9dfcaaad7e949bb21bc3db49be474d22fa509970b328ac","archive_url":"https://www.blendkit.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":"16.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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3310,"archive_hash":"sha256:cf518a244930f26fa64b6d4dc4021709f5038921a7f1785c1c74059144263c40","archive_url":"https://www.blendkit.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.00","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2168,"archive_hash":"sha256:04df4f1afbcdab212124e22da346cdb6311a67fee86ec844fb08bc81b5dd6b96","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"George Art","tags":["outliner","addon"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":25611,"archive_hash":"sha256:64a293894e7513a9274c0d4fe2c52a9f543167742a7e0af6542b1441b389261c","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"Karan @b3dhub","tags":["duplicate","split","switch","management","interface","swap","join"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"0.8.2","type":"add-on","archive_size":5964,"archive_hash":"sha256:f46aa86875dd6e14060aa47a207bc8fde1db70b3da9bd3d90ace0f81cb9b927d","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"carlosmu","tags":["quick","lattice","tools","modeling","automatic","modifiers"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":21529,"archive_hash":"sha256:78d8b62da830760d7696930879fbbeb388001785e4a697d06df212f248e08546","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f21b81d6-4827-432c-ab0b-95c87f8f85e2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.00","blender_version_min":"3.6.0","maintainer":"Studio156","tags":["texture","baking","materialtotexture","material","textures","texturecreator","shader","object"],"license":["default_addon_license"],"website":"https://www.blendkit.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.40]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":10495,"archive_hash":"sha256:47f2ba1015744e3cb035404188dfb389b28281743027534f6f9c8bf2eaf17616","archive_url":"https://www.blendkit.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.40","blender_version_min":"4.2.0","maintainer":"Puneeth Saravanan","tags":["Material","substancepainter","adobe","autotexture","Texture","Import_Export"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $16.00]","tagline":"FULL plan required - upgrade to download","version":"2.0.5","type":"add-on","archive_size":149550,"archive_hash":"sha256:590b9b24988895ddac71cab3a1cba32bd448f26aad4ae404c7c6ce579ffabbc2","archive_url":"https://www.blendkit.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":"16.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.blendkit.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.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2182,"archive_hash":"sha256:692d1665c5fee4220e79f228ee7c92357bfda113651282424ce6192314e8b5f7","archive_url":"https://www.blendkit.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.80","blender_version_min":"4.2.0","maintainer":"3DAssets Kit","tags":["tool","tools","batch","origin","quick","blender","addon"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5971,"archive_hash":"sha256:692f347bf98a84c06c57d3628c023733777b4d5f93dabb14032de8bc46756673","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"Alt Tab","tags":["alttab","render","preview"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.2.1","type":"add-on","archive_size":106813,"archive_hash":"sha256:55954eb891d859c257510bcd7462d843fb6ffc69b129a8344dfc75d94bffbd62","archive_url":"https://www.blendkit.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.00","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.3.2","type":"add-on","archive_size":25703,"archive_hash":"sha256:b2fa794392702d933b726740de51337950654f54d63fc47633d25f257ccf8bc6","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/c785c99e-f1c2-4fbc-82b8-651761f6101a/","schema_version":"1.0.0"},{"id":"quikv_pro","name":"QUiKV PRO — Quick Keyframe Value | Animation [Before: $17.60, Now: $14.08]","tagline":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":41859,"archive_hash":"sha256:1b710658f7e92026c6f12824694a523183eab7dcc5788416f02e1c8525de9b4a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e531b319-c0bb-45a3-a5d2-0bfef96183aa/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"14.08","blender_version_min":"3.0.0","maintainer":"eFcoelum","tags":["keyframe","animation","Interface","value","click"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/bd8897f7-1111-43ea-860f-f956e1d4c0c7/","schema_version":"1.0.0"},{"id":"random_object_colorizer","name":"Random Object Colorizer [Before: $5.00, Now: $4.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3343,"archive_hash":"sha256:154dfae4dd35cef3d4f2ee5757abd3ef8790e89f0ec4d61f2803c2c8c4b2f7d7","archive_url":"https://www.blendkit.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.00","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":2140094,"archive_hash":"sha256:2b2e2822ab1911da95e7100a079c86a1a9364df9137425aca3523a8f02759db6","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/61fabc4e-aa4f-463c-8bff-d771f0b85cb2/","schema_version":"1.0.0"},{"id":"renametool","name":"Rename Tool [Before: $4.99, Now: $3.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":1859,"archive_hash":"sha256:31dcfacba225cd89975fd7f1c19fa3b94cc09f95ce6c07096f628c0676467c8e","archive_url":"https://www.blendkit.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":"3.99","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.blendkit.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.19]","tagline":"FULL plan required - upgrade to download","version":"2.1.0","type":"add-on","archive_size":2469,"archive_hash":"sha256:7eb243aeb9da5906a755214d9e78162c5e867bbd91037dc768e250f5b40314ff","archive_url":"https://www.blendkit.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.19","blender_version_min":"4.2.0","maintainer":"Elton Matiwane","tags":["command","line","rendering","fast","render"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/b9d51d20-8ec3-4b14-8da3-0f7413830280/","schema_version":"1.0.0"},{"id":"RenderForgeAI","name":"RenderForgeAI [Before: $25.00, Now: $20.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1879679,"archive_hash":"sha256:0dc385a33ba081c8e7863db348534383ec5c26e0c10d20e728ca70e1466db6c5","archive_url":"https://www.blendkit.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":"20.00","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.blendkit.com/asset-gallery-detail/244c9e2d-6185-4f62-9501-864aef9d908c/","schema_version":"1.0.0"},{"id":"render_manager","name":"Render Manager [Before: $17.99, Now: $14.39]","tagline":"FULL plan required - upgrade to download","version":"2.5.1","type":"add-on","archive_size":95404,"archive_hash":"sha256:4914ec65c8c5f5649e0e9b385179258cb382034d697a459369c0039f1a98a80d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/170c9ea3-5d5f-4d59-ab71-addb88c81ec2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"14.39","blender_version_min":"4.2.0","maintainer":"Hassan Hussain","tags":["render","pipeline","animation","scene","camera"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/502f4b0a-b0c2-4b08-8414-424c287bc8ca/","schema_version":"1.0.0"},{"id":"render_negative_frames","name":"Render Negative Frames [Before: $7.00, Now: $5.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1879,"archive_hash":"sha256:2ba36c9790061f0bf0a448114c2cb1719f4a1cffebe061a383f8c4aa7de28039","archive_url":"https://www.blendkit.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.60","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.blendkit.com/asset-gallery-detail/0eaa2786-bfb2-44d6-aa57-1b3ecdd79892/","schema_version":"1.0.0"},{"id":"Render_Presets","name":"Render Preset Manager [$1.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2792,"archive_hash":"sha256:586e53a0c3d4c433d5d116672994d69a2a20413e310774af3043e382f0f083c1","archive_url":"https://www.blendkit.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.99","blender_version_min":"4.2.0","maintainer":"James Middleton","tags":["render","preset"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2760,"archive_hash":"sha256:88bf2295c1d2a4efbdec61981f5b46c9f3d84de1f2ae9aa5214c1aeba2eb8a20","archive_url":"https://www.blendkit.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.00","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":51865,"archive_hash":"sha256:7acca1532f7eefc9deb6031439dc7302a55449f02caaab0c1c147ba88eb97bde","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/01c747ba-fe17-40cc-9a06-ddb66fca62f4/","schema_version":"1.0.0"},{"id":"rendertools","name":"Render Tools [Before: $11.99, Now: $9.59]","tagline":"FULL plan required - upgrade to download","version":"1.8.0","type":"add-on","archive_size":55255,"archive_hash":"sha256:740459440b6441a7130c3cabdfe29c1b7685b2b9973315e10954bc5815e73454","archive_url":"https://www.blendkit.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":"9.59","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.blendkit.com/asset-gallery-detail/193a112f-1f47-464f-9481-4eb07e57dfda/","schema_version":"1.0.0"},{"id":"rendervise","name":"RenderVise [Before: $9.00, Now: $7.20]","tagline":"FULL plan required - upgrade to download","version":"1.0.9","type":"add-on","archive_size":9789,"archive_hash":"sha256:57e84968a668fabf8d2877346e66eacc63b551237a86a3edf07fa5281eaae1a4","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7e325318-9d07-42c6-8cc8-51320b3fac5b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.20","blender_version_min":"3.0.0","maintainer":"antoine f","tags":["Render","Pipeline","Camera","Preview","History","Compare","Compositor","Thumbnail","Workflow"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/9caef8fc-7e27-4778-a711-4e0c4f65d665/","schema_version":"1.0.0"},{"id":"resmax","name":"Resmax - Upscale AI [Before: $14.00, Now: $11.20]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":45049478,"archive_hash":"sha256:0922535ea56912848573cb1b8e9c867351cd9954c6e16a63935818422df6a582","archive_url":"https://www.blendkit.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.20","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.blendkit.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: $16.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":9399,"archive_hash":"sha256:1318864822da93978eb7171758723f405929829aec55d440b4fab81118e7b5fd","archive_url":"https://www.blendkit.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":"16.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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":32929,"archive_hash":"sha256:330e68364f7398892036bd42414008db1d1a675d9e478930fa447eae445fdd0c","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"RUIDO VFX","tags":["Render","Compositing","Materials","VFX","Retro"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/c4461f3c-28a5-46a6-a776-377693db678b/","schema_version":"1.0.0"},{"id":"rigify_exporter","name":"Rigify Exporter [Before: $11.00, Now: $8.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":16046,"archive_hash":"sha256:3d758fc27afb06d104c0b1b6da32f03752bb54b880075e4e7d2862ea59ce3db0","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2dac3f2f-efb2-478b-81f1-664f5811a049/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.80","blender_version_min":"4.5.0","maintainer":"Stellart","tags":["export","rigify","unreal","unity","godot","addon","blender","rig","rigging","rigger"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/ac766b5e-b730-4763-aba8-fe8f4bea7544/","schema_version":"1.0.0"},{"id":"rigify_retargeter","name":"Rigify Retargeter [Before: $11.00, Now: $8.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.4","type":"add-on","archive_size":35673,"archive_hash":"sha256:0017a0759d1e8a607e341fab85475d5ca0eeb6659cbfe620c2893a7bf73f3d9d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d2699e3e-2458-4b11-bbea-733e6f03d2b2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.80","blender_version_min":"4.5.0","maintainer":"Stellart","tags":["retarget","retargeting","retargetting","bones","rigify","transfer","animation","rigging","rigger","rig"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/08108568-865c-4219-87e7-144df8ab7fa2/","schema_version":"1.0.0"},{"id":"save_director_pro","name":"Save Director Pro [Before: $6.49, Now: $5.19]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":17820,"archive_hash":"sha256:6c56ba1b5cc51803d8d3b91fafb4c64facc6c8ec6a209fbda8604729232e03df","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2c627b8d-effa-4c1d-bee0-74c298a0234a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.19","blender_version_min":"4.2.0","maintainer":"Steven Seidler","tags":["Save","Director","Pro"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/92851ab9-2d63-4c4f-8746-41f233d57fb9/","schema_version":"1.0.0"},{"id":"scale_print_camera","name":"Scale Print Camera – Pdf & Exact Scale [Before: $16.00, Now: $12.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":43786,"archive_hash":"sha256:b53a1ba15aaf4cf1c20493dd9e7b7e13f0250d8424c9aebf22d10ed3a7c5079a","archive_url":"https://www.blendkit.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":"12.80","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.blendkit.com/asset-gallery-detail/08f3b586-69b8-4fef-8b34-09426bb88b06/","schema_version":"1.0.0"},{"id":"scan_cleaner","name":"Scan Cleaner [Before: $4.00, Now: $3.20]","tagline":"FULL plan required - upgrade to download","version":"1.2.3","type":"add-on","archive_size":20651,"archive_hash":"sha256:9c486142f1d6a78f90f31a2c648635a8b616b1a90197507f50cd82b4ad98b0dc","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/3546b856-e505-4915-befa-b736873f785f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.20","blender_version_min":"4.2.0","maintainer":"Zack hough","tags":["Mesh","Modeling","Pipeline","scaning","scan","automated"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/aad93279-f98f-4884-8a4a-2a05f0491421/","schema_version":"1.0.0"},{"id":"scatter_forge","name":"Scatter Forge [Before: $15.00, Now: $12.00]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":1238739,"archive_hash":"sha256:fb6bed06c1de23c9d97d80672a4ecedf7744d6a7697ba851ed2967bee46d487f","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"Spectre 3D","tags":["developement","lod","GameDev","Export","Procedural","Scatter"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/561addae-d8e9-497f-9c73-961d3d0ab281/","schema_version":"1.0.0"},{"id":"scene_state_bookmarks","name":"Scene State Bookmarks - Save and Restore Full Scene States in One Click [Before: $9.99, Now: $7.99]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":7818,"archive_hash":"sha256:6405e1a41d62fa8920f3b7c858590b54096a84c9bc4b06a11ad62235bc223612","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e70fbd8e-2b48-4699-93d7-0573eab3420b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.99","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Scene","Render","3DView"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/912c7fdc-6b35-45fb-9843-2f751a2cc833/","schema_version":"1.0.0"},{"id":"scenesweeper","name":"SceneSweeper - Clean-Up Commander [Before: $5.00, Now: $4.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":23168,"archive_hash":"sha256:869b3b93d15c2f7d138697210c3434c97e31849e776517c73185fd4f4eda5f80","archive_url":"https://www.blendkit.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.00","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.6.7","type":"add-on","archive_size":634022,"archive_hash":"sha256:6cea718ed1fcf44841dfa3eda665725af2d870be6e419ae724a357ca79db2c0a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/00e6ba6b-f6c2-4b95-a0a9-c2aa133c1bc5/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.00","blender_version_min":"5.0.0","maintainer":"Wolfram Kampffmeyer","tags":["Schematic","Rigging","Hierarchy","Constraint","Editor","Visualization"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/92b4b030-65f1-48eb-84d9-4f3786c9ba9d/","schema_version":"1.0.0"},{"id":"SeasonSlider","name":"Season Slider [Before: $10.00, Now: $8.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":46257,"archive_hash":"sha256:562d8eaa29b82b144bba800ce5f367e204d11e7f4d96929940437db0fc33b0f3","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"Mutanzom3D","tags":["Season","Material","Node","forest","nature","trees","tree","seasons"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/40705d46-2d85-44fd-8d8b-1db3e6f7a1b0/","schema_version":"1.0.0"},{"id":"sectionbox","name":"Section Box - Cross Sections, Elevations, And Visualization [$29.99]","tagline":"FULL plan required - upgrade to download","version":"2.4.8","type":"add-on","archive_size":6748565,"archive_hash":"sha256:1aefdbcf980556de2b10d3fb8bde0d260d9da45d31f50a7a8557a94eb28d843b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/cc3a7f57-ddb0-4795-bf23-2677d325c8c0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"29.99","blender_version_min":"5.1.0","maintainer":"Ruben Messerschmidt","tags":["section","box","cross_section","elevation","archviz","architecture","plan","drawing","floor_plan","cut"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/42a79447-b3f5-4683-a253-73d7360142a8/","schema_version":"1.0.0"},{"id":"section_pro","name":"Section Pro - Sections, Projections & Technical Drawings [$59.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":25516976,"archive_hash":"sha256:bf0b7360645992c567af82d242bab14867bf6008d91f322f8f3eaa41f2420dc7","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/302ead32-dda5-42ee-8bd1-ddbb59fde059/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"59.99","blender_version_min":"4.5.1","maintainer":"Ruben Messerschmidt","tags":["elevation","ArchViz","section","floor_plan","technical_drawing","interior_design","architecture","cad","dxf_export","bim"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/c472fc66-b1c3-4110-8cd4-ebcb25080734/","schema_version":"1.0.0"},{"id":"selective_wireframe","name":"Selective Wireframe - Per-Object Wireframe Control for Blender [Before: $4.00, Now: $3.20]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":10492,"archive_hash":"sha256:d1a68e64f6698d3e1aff0c7f56381d0189a3f4ed0b128efc3f06bca6f535779b","archive_url":"https://www.blendkit.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.20","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Selective","Control","wirframe","everyobject"],"license":["default_addon_license"],"website":"https://www.blendkit.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.79]","tagline":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":1445,"archive_hash":"sha256:f3e259eceeebeb7c6455e1e9bab7e6686a2c67517723d927a2895d999aba37b2","archive_url":"https://www.blendkit.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.79","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.blendkit.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.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":1838,"archive_hash":"sha256:81c9c1e0b887bc18f5e413ca02edfa649da3df61230e2ffca2f3f04a19c1072d","archive_url":"https://www.blendkit.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.60","blender_version_min":"4.2.0","maintainer":"Mutanzom3D","tags":["origin","center","bottom","tool","qol","qualityoflife","object"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/7381a6d4-7480-4a6c-8beb-10180bdb7169/","schema_version":"1.0.0"},{"id":"shakemaker","name":"ShakeMaker [Before: $5.49, Now: $4.39]","tagline":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":14206,"archive_hash":"sha256:36e39fdd146abe3cf1d89d7ad4bbcc6cb3e70b140a09812592aaf647fa7c1ea6","archive_url":"https://www.blendkit.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.39","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.blendkit.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.40]","tagline":"FULL plan required - upgrade to download","version":"1.5.1","type":"add-on","archive_size":18152,"archive_hash":"sha256:42cf19cca7b18383d173077cd7db74c46dabe6b71cab8fbebcd2fedbe110236a","archive_url":"https://www.blendkit.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.40","blender_version_min":"4.2.0","maintainer":"Junaid Alam","tags":["animation","blendshapes","rigging","productivity"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/1f14a313-1319-4921-8043-394825fcf083/","schema_version":"1.0.0"},{"id":"ShareTextures","name":"ShareTextures Asset Library [Before: $14.99, Now: $11.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":783093,"archive_hash":"sha256:65e40563f57e0fedf66457e7c8c74154c1b32a7cf16c1222436cc96342eccb3b","archive_url":"https://www.blendkit.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":"11.99","blender_version_min":"4.2.0","maintainer":"Share Textures","tags":["Object","Material","Pipeline","UserInterface","asset","library"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/822222fd-6e10-4da6-960d-cb12d7ec3fbf/","schema_version":"1.0.0"},{"id":"mk_shelf_filler","name":"Shelf Filler [Before: $10.00, Now: $8.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":12857,"archive_hash":"sha256:80218adeb5de818a77d0e927e073c2ff4fea020fd78742d383288df09a17f344","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/617da19f-6a35-41f7-b5d5-26c1fe3eaef6/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.00","blender_version_min":"4.2.0","maintainer":"Milad Kambari","tags":["Object","Modeling","fill","book","decorative","decoration","shelf"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/fa82ee50-842d-450a-a6bd-8837926fc743/","schema_version":"1.0.0"},{"id":"jd_shot_handler","name":"Shot Handler [Before: $12.00, Now: $9.60]","tagline":"FULL plan required - upgrade to download","version":"3.0.2","type":"add-on","archive_size":49735,"archive_hash":"sha256:f113416a330accfae028bb41d95cb7014d2f1967c4b80653dc98c870f29836d2","archive_url":"https://www.blendkit.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":"9.60","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.blendkit.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: $30.40]","tagline":"FULL plan required - upgrade to download","version":"2.0.8","type":"add-on","archive_size":23120812,"archive_hash":"sha256:2746c692194068d3ebc32a9fe50733e46ab11d930447893b8051b096660556f6","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2a84adfb-908e-4601-abe2-bfdfc5ae0dd5/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"30.40","blender_version_min":"4.3.0","maintainer":"Other Realms","tags":["shot","takes","macros","states","batch","render","burnin","burntin","stamp"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2ace843e-c14f-4eda-b697-fb7065f344d1/","schema_version":"1.0.0"},{"id":"shotweaver","name":"ShotWeaver — Multi-Camera Shot Organiser for Blender [Before: $5.00, Now: $4.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":10493,"archive_hash":"sha256:8d025358a4b0165f91d26504ac126d77aa8e77aff50e88af94d902ea47b29c9f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/bc94be10-941c-44ca-882b-ddc30679da8d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.00","blender_version_min":"4.5.0","maintainer":"Ynleyn","tags":["camera","animation","storyboard","management","render","queue"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/f3a2d99d-e315-4918-ba7a-e8bf576afa51/","schema_version":"1.0.0"},{"id":"showcase_studio_pro","name":"Showcase Studio Pro [Before: $30.00, Now: $24.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":139482,"archive_hash":"sha256:3e3d1586f1ac59458f084ea5a859bd6c515dd7cae24c3eef933a1c31a969235f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/50c7137d-dbcf-457c-9ac0-7a1d6c8d4ea0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"24.00","blender_version_min":"4.5.0","maintainer":"3dquads blender","tags":["3DView","Render","Lighting"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/ff65ae79-6580-433d-8e18-98f4d64c7af1/","schema_version":"1.0.0"},{"id":"simple_layouts","name":"Simple Layouts - Full Version [Before: $12.00, Now: $9.60]","tagline":"FULL plan required - upgrade to download","version":"0.1.5","type":"add-on","archive_size":308012,"archive_hash":"sha256:c773d88ee7a6158743c98df12a7ab8c81f844b0efb9d3da28f0f8f5b57a75520","archive_url":"https://www.blendkit.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":"9.60","blender_version_min":"4.2.0","maintainer":"Other Realms","tags":["Layouts","states","Views"],"license":["default_addon_license"],"website":"https://www.blendkit.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.60]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":2190,"archive_hash":"sha256:de5bcf5bf9a3cfd8b3773925b91061c63fa50a44cd032def5b7f44bf3e7c04b9","archive_url":"https://www.blendkit.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.60","blender_version_min":"4.2.0","maintainer":"Braulio Pedraza López","tags":["archviz","photogrammetry","beginner"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $19.19]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":136739,"archive_hash":"sha256:957887d9eef18a40d9d095f20c09aa90ccf0706556582b0f7dfe27eebdcd9bb6","archive_url":"https://www.blendkit.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":"19.19","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.blendkit.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: $21.60]","tagline":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":967509,"archive_hash":"sha256:94ec87ede7ebadd708c879d1476a48b2e3d4589968ca74660477aa757348a49a","archive_url":"https://www.blendkit.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":"21.60","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.blendkit.com/asset-gallery-detail/ee2ffd44-5bed-40e0-be94-43b22b2e80e3/","schema_version":"1.0.0"},{"id":"smart_align","name":"Smart Align [Before: $9.99, Now: $7.99]","tagline":"FULL plan required - upgrade to download","version":"1.40.0","type":"add-on","archive_size":30781,"archive_hash":"sha256:59e65c8482bfb52cbc7d894afa19958f492587f38a6693c299120f3a381ee372","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/85389cd7-26fb-46c8-91ca-8a69b1315e9e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"7.99","blender_version_min":"4.2.0","maintainer":"Gabor Kiss","tags":["align","snapping","transform","alignment","modeling","move","workflow","addon"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2528d6bc-faa7-4231-bc63-8eba09c4b88f/","schema_version":"1.0.0"},{"id":"smart_autosave_pro","name":"Smart AutoSave+ (Basic Tier) - NovaStrikes [Before: $8.99, Now: $7.19]","tagline":"FULL plan required - upgrade to download","version":"7.0.3","type":"add-on","archive_size":7530,"archive_hash":"sha256:fbe220ec55dcf6147bd900c982c9c1c91fa53c725dd5e00af7c1997aac7fb987","archive_url":"https://www.blendkit.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":"7.19","blender_version_min":"4.2.0","maintainer":"NovaStrikes Shahbaz","tags":["crash","autosave","scene","safety","backup","system"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/c45fc3db-f2a8-4375-a767-48bffaf432d6/","schema_version":"1.0.0"},{"id":"smart_explode","name":"Smart Explode [Before: $45.00, Now: $36.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":16997,"archive_hash":"sha256:edd41a20f4dce1fa76ffb3a26e3bf5b7f2c29e371d93bfc95de374ac51334846","archive_url":"https://www.blendkit.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":"36.00","blender_version_min":"4.2.0","maintainer":"Daniel Farjoun","tags":["Explode","Animation","Archviz","Product","Exploded_View","Procedural"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a152acb9-f8b5-41df-b32c-3b2d4790a934/","schema_version":"1.0.0"},{"id":"smart_material_painter","name":"Smart Material Painter [Before: $15.00, Now: $12.00]","tagline":"FULL plan required - upgrade to download","version":"4.2.0","type":"add-on","archive_size":25766,"archive_hash":"sha256:f9f5ab77f2a434cfbdbc6f3533abb2058de2faa82487c2a7c3c5df5700fc73ea","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e95a879a-6837-4a56-944b-b331d0777c09/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.00","blender_version_min":"4.0.0","maintainer":"Meshmind egwoba","tags":["Material","Paint","UV","Object"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/5a7e38f5-4ea4-4f65-b2c6-5b96d9344c4f/","schema_version":"1.0.0"},{"id":"smart_scene_organizer","name":"Smart Scene Organizer [Before: $2.99, Now: $2.39]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":6316,"archive_hash":"sha256:8640f77e625614002d0e286a46e13c0e59036ea360c43aed31ba35343f6a044e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d8039a3c-8734-402f-92ba-94900c493f39/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.39","blender_version_min":"3.0.0","maintainer":"SHAXBOZ Ergashev","tags":["blender","addon","scene","organizer","asset","manager"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/7f474641-f0f4-418c-8e3a-8506a93064cb/","schema_version":"1.0.0"},{"id":"snappy_rigger","name":"SNAPPY Rigger [Before: $16.50, Now: $13.20]","tagline":"FULL plan required - upgrade to download","version":"1.2.2","type":"add-on","archive_size":1664368,"archive_hash":"sha256:00101c2fadcbe97df886a9b505f692422683897a1bcd686a5f4309bec04ecd54","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f4047669-f313-4cdb-ac01-3b8772cbf69a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"13.20","blender_version_min":"4.5.0","maintainer":"Stellart","tags":["Rigging","autorigger","bones","detection","generator","snappy","rig","autorig","rigger","animation"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/c9841f8d-5056-41a5-972d-6c6cea2fd4d4/","schema_version":"1.0.0"},{"id":"solaris_creator","name":"SolarisCreator Pro 2.0 - One click cinematic lighting [Before: $69.00, Now: $55.20]","tagline":"FULL plan required - upgrade to download","version":"2.1.0","type":"add-on","archive_size":32693,"archive_hash":"sha256:2955231eb9c54f768dc8fc2362fa9fc865e8d1a8154494cf382468fb0d0a6fed","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/526f9eac-bba6-4639-bbab-9607e0c3c1d3/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"55.20","blender_version_min":"4.0.0","blender_version_max":"5.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.blendkit.com/asset-gallery-detail/78fdf920-b5dd-4e2d-ae89-d6c53ac7bc2f/","schema_version":"1.0.0"},{"id":"sort_objects","name":"Sort Objects [Before: $6.00, Now: $4.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2080,"archive_hash":"sha256:acf397a1ef0376442ae348b5eda74aec9f0787b232ac393b33f7b33b09fa8e15","archive_url":"https://www.blendkit.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":"4.80","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.blendkit.com/asset-gallery-detail/90804401-0756-4678-bbee-9482723b8db3/","schema_version":"1.0.0"},{"id":"space_generator_v1","name":"Space Generator [Before: $11.00, Now: $8.80]","tagline":"FULL plan required - upgrade to download","version":"3.2.2","type":"add-on","archive_size":543142656,"archive_hash":"sha256:1f2a09faa7d927fbfd0b093da716f7e528f212ec1d5eba94438599399775cf67","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2be1351b-e513-4d23-b808-c204a8e2b27c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.80","blender_version_min":"4.0.0","maintainer":"Stellart","tags":["Space","Universe","Planet","Moon","Sun","Star","Exoplanet","Asset","8k","4k"],"license":["default_addon_license"],"website":"https://www.blendkit.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.60]","tagline":"FULL plan required - upgrade to download","version":"3.2.0","type":"add-on","archive_size":21428,"archive_hash":"sha256:5c5cfaf48d121a201d15970d8af3b75cb043d2c2aa5b027360aede3ea796c984","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9049369d-6bbf-4849-a0aa-5430dd486a82/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.60","blender_version_min":"4.0.0","maintainer":"RUIDO VFX","tags":["Render","Camera","Output","VFX","Batch","Pipeline"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/eda01abf-f2e3-4f3c-b7e4-3441c6dd4e2c/","schema_version":"1.0.0"},{"id":"stairs_maker","name":"Stairs Maker [$15.00]","tagline":"FULL plan required - upgrade to download","version":"3.5.2","type":"add-on","archive_size":1954483,"archive_hash":"sha256:12ccbe83ae847b6db4b544475b1ecc8ca59e80a09d5a6bf95d622a2eb89dd0c8","archive_url":"https://www.blendkit.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":"15.00","blender_version_min":"4.2.0","maintainer":"Blender Bash","tags":["stairs","architecture","maker"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/9489f9e0-91cc-414f-a7c0-b637a70a4eae/","schema_version":"1.0.0"},{"id":"starconnect_pro","name":"Star Connect - Smart Mesh Triangulation [$19.99]","tagline":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":128633,"archive_hash":"sha256:5cac8b7f6fd6438709d3d9ba30a7136f3d5d23ae172b1e38eb6ae0e8fb189ed8","archive_url":"https://www.blendkit.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":"19.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.blendkit.com/asset-gallery-detail/4b59c688-c13b-4611-8e18-98ad327133c9/","schema_version":"1.0.0"},{"id":"mk_surface_blend","name":"Surface Blend [Before: $10.00, Now: $8.00]","tagline":"FULL plan required - upgrade to download","version":"1.5.4","type":"add-on","archive_size":7077,"archive_hash":"sha256:5c277e0eb5c327d4ad603dbd2922b0658ee0c864f334b3ebfac3e88987d25b37","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/af887228-87b3-4b3d-8e5e-d227fcc6ca8d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.00","blender_version_min":"4.2.0","maintainer":"Milad Kambari","tags":["Object","Material","GeometryNodes","blend","dissolve"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/553fe958-98eb-475c-9531-218ea6cabfed/","schema_version":"1.0.0"},{"id":"surface_effects","name":"Surface Effects – Procedural Material Enhancer [Before: $10.00, Now: $8.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":23835,"archive_hash":"sha256:db1541adbb92cd4aa13b3bd73bb0c57bb7cde085c11536f63d0a887da810c828","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/d212f51d-4f0e-465e-9ac3-883925e83903/","schema_version":"1.0.0"},{"id":"SurfacePainter","name":"Surface Painter [Before: $9.00, Now: $7.20]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":36113940,"archive_hash":"sha256:26a3e456bf03fb45ab2912e4c3b659b38cf2b9a9c298f550a7d1f54c0b8a6735","archive_url":"https://www.blendkit.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.20","blender_version_min":"4.2.0","maintainer":"polyspaace","tags":["materials","painting","surfaces","modelling","pbr"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $15.20]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":60460,"archive_hash":"sha256:2653c075f02776bdff274fad70e43d9885a8d40d3f0aa4021202a97809ce4599","archive_url":"https://www.blendkit.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":"15.20","blender_version_min":"4.2.0","maintainer":"Jan Holinka","tags":["3DView","UserInterface","Mesh","Object","Annotation","Survey"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $15.20]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":39261,"archive_hash":"sha256:7296dc8dada42dda5ee981c8f96b7b6598c300c5d2ddfa0caff01dd91904e42a","archive_url":"https://www.blendkit.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":"15.20","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.blendkit.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: $15.20]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":48116,"archive_hash":"sha256:07dae0d5d8f657eb750fc5b2599c3398a22017f881d5331a27ba40033f4ebd30","archive_url":"https://www.blendkit.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":"15.20","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.blendkit.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: $15.20]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":43979,"archive_hash":"sha256:ec0f9da235bf43c1719622cf91a37f5fb38e880201ae9f6c7dce6e54661f88a6","archive_url":"https://www.blendkit.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":"15.20","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":67446,"archive_hash":"sha256:5f1feb0d46de24a8816f6d6d0fe4baffba23e6b3855054571c9d918b209f1b46","archive_url":"https://www.blendkit.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.00","blender_version_min":"4.2.0","maintainer":"Nicolai Prodromov","tags":["svg","export","illustrator","vectors"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/3c751ebd-c083-408b-a82a-50ad796f78ec/","schema_version":"1.0.0"},{"id":"swiftlod","name":"Swiftlod - Level Of Detail Creator [Before: $3.00, Now: $2.40]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5669,"archive_hash":"sha256:5e989039793ea4a133614d77893ef0a6f0a0f024c3dc5ef1f79c924b8b2e1fc3","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2464af97-146a-47d1-be1a-b6521114e96d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.40","blender_version_min":"4.2.0","maintainer":"FANNΞC","tags":["easy","lod","optimizer","plugin","pro","Level","Detail","Optmize"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/cb8119b8-835b-4104-881d-9e6524c2fecb/","schema_version":"1.0.0"},{"id":"tcam_render_pro","name":"TCam Render Pro V1.1 [Before: $5.00, Now: $4.00]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":5907,"archive_hash":"sha256:d376325dd7c4970f743d9bce95659dbf155916c9fc073bba6674f539910bdf50","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/cb0fea4d-5722-44d0-bc66-fb4a904cc0e0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.00","blender_version_min":"4.2.0","maintainer":"Otonkart Tonka","tags":["render","multicam","queue","renderqueue","camera","studio","video","automation","batch","rendering"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/317bf5e7-cf4a-40c4-8fd0-37e7400fa359/","schema_version":"1.0.0"},{"id":"textopbr","name":"TEXtoPBR [Before: $5.00, Now: $4.00]","tagline":"FULL plan required - upgrade to download","version":"2.5.0","type":"add-on","archive_size":15465,"archive_hash":"sha256:7dc82c0e29fc8a939fd4480d424cf0707df2bfe08d83578017dba0211e62aa50","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/c9c54d68-ae48-4d39-bd29-5109652c19bf/","schema_version":"1.0.0"},{"id":"texture_layer_manager","name":"Texture Layer Manager [Before: $19.99, Now: $15.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":882964,"archive_hash":"sha256:5acc884513e5397e93eb2727fe36edc2dbda6a2ba4e755e2d65f74068eb493b9","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/a4449ebe-d709-412c-93d1-4d9134f00ec1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"15.99","blender_version_min":"5.0.0","maintainer":"riccardo scuto","tags":["Material","Node"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0c579cdc-7c9d-4738-90f9-d22e0b6ff810/","schema_version":"1.0.0"},{"id":"texture_resolution_manager","name":"Texture Resolution Manager [Before: $9.99, Now: $7.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5016,"archive_hash":"sha256:2acab6532846076f2be8681a9fe3728a88e475e4d5e9129f1b2954374e524f8d","archive_url":"https://www.blendkit.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":"7.99","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.blendkit.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.40]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3275,"archive_hash":"sha256:cf87113efe4f2741f72324e75b0b7d22a511a9d838afe3272ee70026f9a20b0c","archive_url":"https://www.blendkit.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.40","blender_version_min":"4.2.0","maintainer":"ImNoah","tags":["texture","setup","pbr","material","easy","beginner"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $7.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":6640,"archive_hash":"sha256:da5b85b68abcc1a6a9d40235e689d142a16f871f50f6b9f948d6b121728514fc","archive_url":"https://www.blendkit.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":"7.99","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.blendkit.com/asset-gallery-detail/2b074e8a-844b-458a-a01b-84cada557d0f/","schema_version":"1.0.0"},{"id":"blender_ustad_texture_transfer","name":"Texture Transfer - High-Poly to Low-Poly Texture Baking [Before: $14.00, Now: $11.20]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":10623,"archive_hash":"sha256:9e26d18f2777c9476ac61b89f9fe6b6e7929cca9735b70fc708554b8445a9b96","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e5c46144-0572-41f7-aba3-4c34f0fa7c90/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"11.20","blender_version_min":"4.2.0","maintainer":"Junaid Alam","tags":["Bake","Material","Object","UV"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/48a8128a-6a37-4ec7-a3d7-656e69946d4b/","schema_version":"1.0.0"},{"id":"Texturology","name":"Texturology™ | AI PBR Textures from a Single Image in Blender [Before: $19.50, Now: $15.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1459005875,"archive_hash":"sha256:466e058cf39b8566902b14f79011afc18d525d1a0a7e3b6448b65e287463f644","archive_url":"https://www.blendkit.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":"15.60","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.blendkit.com/asset-gallery-detail/9d7fb688-d32f-4b21-acb7-a8726d96ddd9/","schema_version":"1.0.0"},{"id":"the_bakery","name":"The Bakery : One click material baker [Before: $7.50, Now: $6.00]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":1833039,"archive_hash":"sha256:e28b0a1f08f75a93ed72593d4f2073affaae653c2dfb0480ae15912ec464e154","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/704a83c3-e237-48cf-8c00-cb98e02d7816/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.00","blender_version_min":"4.2.0","maintainer":"Zahit Erdem Guzel","tags":["Material","Baking","Pipeline","addon","texture","bake"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/438cef85-944d-48a9-b7c7-2ffb63901baa/","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: $3.00, Now: $2.40]","tagline":"FULL plan required - upgrade to download","version":"2.0.7","type":"add-on","archive_size":159086065,"archive_hash":"sha256:1965899e1578da49188a948210b5700cf32c08c2831608397ebaa2efeea62a68","archive_url":"https://www.blendkit.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":"2.40","blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["HardSurfacetools"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/8c9ca364-7c7b-4a70-86b9-28e94fd80583/","schema_version":"1.0.0"},{"id":"Tiles_Importer","name":"Tile Importer [Before: $30.00, Now: $24.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":944337,"archive_hash":"sha256:e397582008ec0eee3d81c380277ea2b6d4dcf988db8b704c236b06c681110003","archive_url":"https://www.blendkit.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":"24.00","blender_version_min":"4.2.0","maintainer":"Haseeb Ahmed","tags":["map","blosm","google","3d","tiles"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $5.00, Now: $4.00]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":33678,"archive_hash":"sha256:5cf1de2c7a8892f13a98f74f6cfe821babf13f03e67f328ebf762f46e51611d4","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7e3d7593-f190-40b5-b1ab-809767a248b2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.00","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["System","Productivity","Tracking","Analytics","Workflow"],"license":["default_addon_license"],"website":"https://www.blendkit.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.40]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":257056,"archive_hash":"sha256:41fd3f67885ff8ba32652e9145ac1eec5c7c95cc791827a954e5e10a1cea4f55","archive_url":"https://www.blendkit.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.40","blender_version_min":"4.2.0","maintainer":"Rohit Punnen","tags":["timelapse","hyperlapse","screenshot","video","tutorial"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a3f446a9-e8bb-422e-bfc5-d424d1c421a4/","schema_version":"1.0.0"},{"id":"trimotion","name":"Trimotion-Animation Optimizer [Before: $32.00, Now: $25.60]","tagline":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":55849,"archive_hash":"sha256:dad0d50ae418ffb09385ea1ae481d8bc5df9dcb71b92fb1f51c6921cfffd4eed","archive_url":"https://www.blendkit.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":"25.60","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.blendkit.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: $15.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.4","type":"add-on","archive_size":44729,"archive_hash":"sha256:7f03b201ca49a0146bbe4d2ef7a1eadf1acdecc0374e7a2502ea7d77ccf3d530","archive_url":"https://www.blendkit.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":"15.99","blender_version_min":"4.2.0","maintainer":"Troublesome Eissa","tags":["trimsheet","texturepacking","baking","sheet","materials"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/24639bd7-bbf1-40cf-950c-2454ab9d1a7a/","schema_version":"1.0.0"},{"id":"triplanar_displace","name":"Triplanar Displace [Before: $12.00, Now: $9.60]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":5585,"archive_hash":"sha256:a682057b8e0a7f681d97fa0f791304416186ac4486b94c5f2ccf68d73d0b883b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/196e3b7e-3797-4fc3-b255-12fc1515244a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"9.60","blender_version_min":"4.2.0","maintainer":"Anas Herba","tags":["blender","procedural","displacement","no","uv","triplanar","displacement","rock","cliff"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/9a81bcf4-4a33-4248-ab1f-d28c901c465a/","schema_version":"1.0.0"},{"id":"ultimate_animation_suite","name":"Ultimate Animation Suite [Before: $15.00, Now: $12.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":26615,"archive_hash":"sha256:a0a86c9d504534758288888410cf529c8ce667664a2aed66a7f223cdc42b0bbe","archive_url":"https://www.blendkit.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.00","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"5.5.0","type":"add-on","archive_size":18870,"archive_hash":"sha256:df401a91fc4bb160b3b90bb20ac4f3a9d4e5e033f6e11f99278aaeb4f5ed198f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d908778e-fd57-4b1a-8b54-0ffdaa96823b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.00","blender_version_min":"4.0.0","maintainer":"RUIDO VFX","tags":["Animation","Camera","VFX","Shake","motion","cinematic","keyframe","tool","vibration","rotation"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.6.1","type":"add-on","archive_size":17488,"archive_hash":"sha256:93f174a95ce78dea36cbbb201b75d0e739a40721082ee5d53600f74fa37ce1e7","archive_url":"https://www.blendkit.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.00","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.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"14.2.0","type":"add-on","archive_size":17570,"archive_hash":"sha256:8967d03e228f333c5d4608539b6cf5e4d3273db8f8de94be4722df80ab36a52a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/5f7473a3-aba2-42d8-84fa-b14ce497d261/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.00","blender_version_min":"4.0.0","maintainer":"RUIDO VFX","tags":["Animation","StopMotion","Keyframes","Timing","Stylized","Tools","frame","nose","jitter","claymation"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":18967,"archive_hash":"sha256:46cb4e81cadfeb449a090f56e07799ab99a17eed3a3906b2178c7934fe2f8f54","archive_url":"https://www.blendkit.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.00","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.blendkit.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.20]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":1268,"archive_hash":"sha256:ec7b88c1fbdd7e24b8b34597ca78c8383c80035b65f47999ce849ab4633a76b3","archive_url":"https://www.blendkit.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.20","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.blendkit.com/asset-gallery-detail/110a0e8d-f1d8-4479-9c3b-9188da0f4fc2/","schema_version":"1.0.0"},{"id":"mk_universal_converter","name":"Universal Batch Converter [Before: $4.00, Now: $3.20]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":6018,"archive_hash":"sha256:cc9392e15f66b50687a68c7453880cbc005db6692a23dcf61edc596b53321a99","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c3beb4fb-eb7e-42be-97ff-82d67a1fd76f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.20","blender_version_min":"4.2.0","maintainer":"Milad Kambari","tags":["converter","batch","fbx","obj","stl","gltf","glb","import","export","pipeline"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/aa445dda-b4cd-4936-9cc2-88c9c3fff545/","schema_version":"1.0.0"},{"id":"upscalar","name":"Upscalar | The Image AI Upscaling For Blender [Before: $5.00, Now: $4.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":679178887,"archive_hash":"sha256:4317b3a0a42e7699e5429e570d07193be262e09462c6822ad63222c11a984313","archive_url":"https://www.blendkit.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.00","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.blendkit.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: $13.60]","tagline":"FULL plan required - upgrade to download","version":"2.2.1","type":"add-on","archive_size":1531633,"archive_hash":"sha256:d21e31cbcaa2b3587163abe394472c4024d10a76b8fd618f7b40116a2a090f33","archive_url":"https://www.blendkit.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":"13.60","blender_version_min":"4.2.0","maintainer":"Arun C","tags":["UV","UVPACK","UVunwrap"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/6c03319b-087f-4446-a9bc-959f4e0eea65/","schema_version":"1.0.0"},{"id":"vacuum_wrap","name":"Vacuum Wrap [Before: $6.00, Now: $4.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":9503,"archive_hash":"sha256:7ac023d64ac0968bd7ec2940a9285222b24c13037ac1cc8a06f1c9e4e9ee666e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/71fd3df5-c65d-4ade-b32a-e176c906ca5a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"4.80","blender_version_min":"4.2.0","maintainer":"Milad Kambari","tags":["blender","addon","shrinkwrap","physics","packaging","cloth","simulation","vacuum","wrap","plastic"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/8251d25a-ed34-41e4-b702-eed07c681495/","schema_version":"1.0.0"},{"id":"vfx_scene_builder","name":"VFX Scene Builder - After Effects to Blender [Before: $9.99, Now: $7.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":129261,"archive_hash":"sha256:6161d5fabb72404e17e05f1dfcb71922ef9062bd1f3134a7162090623a3f8241","archive_url":"https://www.blendkit.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":"7.99","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.blendkit.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.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":12335,"archive_hash":"sha256:6fb559947a155ba05be51d97f7e57ff6831eb1b976903503e20833c869f23430","archive_url":"https://www.blendkit.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.60","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Object","Search","Finder","Outliner","3DView"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":9926,"archive_hash":"sha256:bc0931eacd7c2c282e27e3747fefa76f036ec804b7ce38029f136cb220139de1","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/14ab582e-2794-4406-9427-af93348e7cf9/","schema_version":"1.0.0"},{"id":"VSEDAWFX","name":"VSE-DAW FX [Before: $4.99, Now: $3.99]","tagline":"FULL plan required - upgrade to download","version":"1.9.7","type":"add-on","archive_size":466900,"archive_hash":"sha256:eb835556e726cb4e92ae6a38940e657fd3e460ec5bf9261403584cd747a54d02","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e1231647-89e7-4925-8b67-1a44dc3151d1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.99","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.blendkit.com/asset-gallery-detail/dea4de69-4f56-4791-b8f7-a315f0d489c7/","schema_version":"1.0.0"},{"id":"wireframe_lens","name":"Wireframe Lens - Inspect topology without switching modes. [Before: $4.00, Now: $3.20]","tagline":"FULL plan required - upgrade to download","version":"2.3.0","type":"add-on","archive_size":13384,"archive_hash":"sha256:99c4709ad0b3ecf7afc2e71bb25a1bf8d60dbafbf48fd72ce888f4c952c4c8c9","archive_url":"https://www.blendkit.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.20","blender_version_min":"4.2.0","maintainer":"Salman Naseem","tags":["Mesh","3DView","Modeling","UserInterface"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $9.60]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":3391954,"archive_hash":"sha256:ffa35fd309f79fd2c1f6d55a2f732f20f855b047f1c3fec900d871ae4e72a457","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/5bc3a7d5-5b6c-450b-bd51-b0570f8099c1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"9.60","blender_version_min":"4.5.0","maintainer":"Wolfram Kampffmeyer","tags":["BookArt","BookFolding","Papercraft","Pattern","SVG","CSV","Manufacturing","Layout"],"license":["default_addon_license"],"website":"https://www.blendkit.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: $10.40]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1144829,"archive_hash":"sha256:5954c8ee130e0ec355c161ff81250db8925ec8c75e451d42cf06f4ce4bbc69f0","archive_url":"https://www.blendkit.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":"10.40","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.blendkit.com/asset-gallery-detail/cd687c32-9fa6-427b-8142-49fdaad99279/","schema_version":"1.0.0"},{"id":"wk_mechanics","name":"Wk_Mechanics - Mechanical Linkage, Cam Designer & Automata [Before: $27.00, Now: $21.60]","tagline":"FULL plan required - upgrade to download","version":"0.8.0","type":"add-on","archive_size":6234341,"archive_hash":"sha256:4039181e864ab4aebb2a1ba46ca9dfb0c3db42e563ed50b9c72f2969706f4ccf","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/0b59a8a2-8d24-4754-89cd-330f5cabac29/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"21.60","blender_version_min":"5.1.0","maintainer":"Wolfram Kampffmeyer","tags":["Rigging","Animation","simulation","automata","mechanics","drawingmachine","strandbeest","walker","engineering","linkages"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/904f8506-9293-426c-8c21-9a7d287a497c/","schema_version":"1.0.0"},{"id":"wk_powerpin","name":"wk_PowerPin [Before: $8.00, Now: $6.40]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":428466,"archive_hash":"sha256:6f3531a8c30c320101e009edabafa6745dea2f4de766529bfd5f159000fde0e8","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/3027755a-2542-4559-8ce4-5eb83a2cc929/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"6.40","blender_version_min":"4.2.0","maintainer":"Wolfram Kampffmeyer","tags":["Animation","Walkcycle","NLA","FootPinning","Baking","GraphEditor","Rigging"],"license":["default_addon_license"],"website":"https://www.blendkit.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.00]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":307370,"archive_hash":"sha256:69942a26f934364e86bcf70a0981259d4e7ea425e8e5c78e9220297c45075b71","archive_url":"https://www.blendkit.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.00","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.blendkit.com/asset-gallery-detail/8e23b6e9-abf3-4200-8b07-fc01d4ee8443/","schema_version":"1.0.0"},{"id":"teca3d_wrap_for_blender","name":"Wrap For Blender - An Alternative To R3DS Wrap - Fitting A Base Mesh (Topology) To A Target [Before: $49.00, Now: $39.20]","tagline":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":26588917,"archive_hash":"sha256:c30d63a326fd39fc891fa5d6211080834bcf1f54841cec23324040faa7721081","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7748a436-368d-4e4c-8152-4ca6579945ad/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"39.20","blender_version_min":"5.0.0","maintainer":"TECA 3D","tags":["mesh","modeling","wrap","retopology","character"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/3b628c1f-b0f3-4563-b7e1-e6da8c054d12/","schema_version":"1.0.0"},{"id":"xray_selection_pro","name":"X-Ray Selection Pro [Before: $7.99, Now: $6.39]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5532,"archive_hash":"sha256:b82c8b8e7e2354ec9af6a4b91b9696f5270645869c88cfe2d26ab7705418458a","archive_url":"https://www.blendkit.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.39","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.blendkit.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.21.0-260628","type":"add-on","archive_size":39143952,"archive_hash":"sha256:fbeee0f603b5ca23aeb493d7826051d0d47ec2dd28ce1469b1a0f3197d2e1e8c","archive_url":"https://www.blendkit.com/addon-download/blenderkit.zip","blender_version_min":"4.2.0","maintainer":"Petr Dlouhý","tags":["blenderkit"],"license":["gpl"],"website":"https://www.blendkit.com/get-blendkit/","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","version":"0.1.1","type":"add-on","archive_size":3221,"archive_hash":"sha256:290e3502ded6546478da53ca321a15e1594a2b2bcef260bc02bc9cfcbcd28c31","archive_url":"https://www.blendkit.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.blendkit.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","version":"2.7.0","type":"add-on","archive_size":357801,"archive_hash":"sha256:0821a1b427ac6433ebb2ef0b802c50a48d8e5d268a70743fcec1f1e4c768307f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/b9a4a456-14ab-48c8-8942-1b387e386163/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.blendkit.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, ga","version":"2.0.2","type":"add-on","archive_size":2854741,"archive_hash":"sha256:d925ad69670118b04c21d28ab90bc39e60c434b8b6ba403d59b863459b51c812","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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 w","version":"0.4.5","type":"add-on","archive_size":9390,"archive_hash":"sha256:d283cea78c26d58101e5ba437df4a2e0ac222065039dd4ff33a9f0edb03c7b16","archive_url":"https://www.blendkit.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.blendkit.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","version":"1.0.0","type":"add-on","archive_size":1497,"archive_hash":"sha256:89883f484061eeaa1d810a7675211f87a62807f7d59e7e6bc4f10ed949595421","archive_url":"https://www.blendkit.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.blendkit.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 w","version":"1.0.2","type":"add-on","archive_size":7039,"archive_hash":"sha256:d9323c5ba0a4a3d6443a0091369f3e77a541dcfe14910bf13c54b90c97c55e97","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/13ae67a5-e751-4e40-99f0-b3e4631d9f97/","schema_version":"1.0.0"},{"id":"auto_file_cleaner","name":"Auto File Cleaner - Remove Unused Materials, Images & Meshes | Blender 4.0–5.0+ [FREE]","tagline":"Auto File Cleaner scans your .blend file for unused materials, i","version":"2.0.0","type":"add-on","archive_size":7669,"archive_hash":"sha256:06e0ba15d24ea745cc5f70dbdb127899d8cc8abf425c5ecdfbbe98b8bebb4c54","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2de4d389-0f76-4b8c-b1ee-d1b5526e395e/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":["System","Pipeline","file","cleaner","blender","cleanup","unused","materials","datablocks","optimize"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d7f60920-88bf-4e93-8ba9-2c1d978c7a17/","schema_version":"1.0.0"},{"id":"auto_paint_boundaries","name":"Auto Paint Boundaries [FREE]","tagline":"Paint cleanly inside smart, selection-limited regions with quick","version":"1.1.1","type":"add-on","archive_size":14645,"archive_hash":"sha256:5db1c2668d80db2e149ac3dd75fc2d15b7a6603e2da184468bd3588f29edb496","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/b5efacec-5ae6-46af-9576-79e2cefd69cb/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":["Paint","weight","vertex"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/45dcce2c-0aa2-4fd7-a989-104d9c074165/","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 t","version":"0.2.3","type":"add-on","archive_size":3489,"archive_hash":"sha256:ee0eb525953c0cf7c259636f1b747bc94c5e5f324bd61a1b54fd3c68bfa608bd","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.com/asset-gallery-detail/967c5989-0d66-402a-a1ca-56be2299f718/","schema_version":"1.0.0"},{"id":"batch_bg_cams","name":"Batch BG Cams [FREE]","tagline":"Automate multi-camera setups: Batch import clips, auto-configure","version":"2.3.1","type":"add-on","archive_size":5729,"archive_hash":"sha256:5b9c970deea58baf77051ba10d84244744e4f1ad5c425560a9630664ce3a2e0c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/74b24024-c0c4-40b0-b200-400c078cde58/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":"Hannes Werner","tags":["addon","camera","layout","background","import","timeline","productivity","automation","animation","video"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a30ce0f8-752f-4a55-b0e0-1cee72949d24/","schema_version":"1.0.0"},{"id":"batch_render_manager","name":"batch_render_manager [FREE]","tagline":"A Blender addon for efficient batch rendering from multiple came","version":"1.0.0","type":"add-on","archive_size":14882,"archive_hash":"sha256:9be8f16641985d1efab5f68c4d5c3a1b36c5a0f7a373df1a2f5aa3f13e5a909b","archive_url":"https://www.blendkit.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.blendkit.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 Lay","version":"1.2.3","type":"add-on","archive_size":4335,"archive_hash":"sha256:63187cc826a44655a1f20a4647aacf7c6967bf7007b91ceeb7291725dff35f17","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/052f32bc-4fdb-412c-8eb9-cd158434f84e/","schema_version":"1.0.0"},{"id":"benchmark_fps_v1","name":"Benchmark FPS & Vram refresher helps reduce crashes [FREE]","tagline":"Unlock real-time performance insights in Blender with the Viewpo","version":"1.0.5","type":"add-on","archive_size":7924,"archive_hash":"sha256:b3f167cd024e33a75f6b014429097d8910ad54b87e7cabce765b203a676d8332","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e3f39d7e-5eff-4703-a412-1a4b76006714/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":["memory","fps","gpu","cpu","test","addon","2025","blender","vram","refresh"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/47c7ca2c-4a53-4a7f-a858-34c5fa29dbb8/","schema_version":"1.0.0"},{"id":"motion_path","name":"Better Motion Path [FREE]","tagline":"A blender add-on that allows motion path adjustment inside the 3","version":"1.5.8","type":"add-on","archive_size":13164,"archive_hash":"sha256:c293b0fde8bc921e4ef7bdf8494e5a23d3cb6055f168d8f8ccff1f7c28488ea4","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/4f549895-734c-4ff0-85d1-ed79feac9976/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":"ジディー Jideeh","tags":["Animation","3DView"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/eba7a4e2-886b-48be-a304-4f7c69916793/","schema_version":"1.0.0"},{"id":"blender_revision_lite","name":"Blender Render Lite [FREE]","tagline":"BlenderRevision Lite is a free community edition that lets you r","version":"1.0.0","type":"add-on","archive_size":7727,"archive_hash":"sha256:ae14b80c7ec559f0c88eedf2b48fff0844e336d02789b8dc3a914b70f87738ab","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7925961a-194c-4612-bc12-72e38bed2abd/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":["render","compositing","workflow","optimization","revision","blender","addon","vfx","pipeline","tools"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e6ea1e56-5d03-45de-a0f8-463c7bf6d731/","schema_version":"1.0.0"},{"id":"shader_switcher","name":"Blender Shader Switcher Addon [FREE]","tagline":"The Ultimate Shader & Color Switcher Node System","version":"4.0.2","type":"add-on","archive_size":11114,"archive_hash":"sha256:03b4aed110d4613695a60fd94fd8f7a8d98c358dd5f2b2a813afc093ff642640","archive_url":"https://www.blendkit.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.blendkit.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 mor","version":"1.1.0","type":"add-on","archive_size":274896,"archive_hash":"sha256:531f8552ec19afeb5c55d7fecbeefa97fd456effe6310df0c696457969fab8d4","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/d7529892-10a8-4f96-86de-933d584bb9f5/","schema_version":"1.0.0"},{"id":"body_sculptor","name":"Body_Sculptor [FREE]","tagline":"A powerful Blender addon for advanced body proportions editing","version":"1.0.0","type":"add-on","archive_size":14676,"archive_hash":"sha256:af709f55a754174d26230a8f3cbcacff154bc3c651f46a9851f3aa93c91e174c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c26ff3b2-7474-451e-b957-cfa80dfd8a6f/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.0.0","maintainer":"ANDRIY LIA$HKEVI$H","tags":["blender","addon","body_sculptor","3d_modeling","character_design","character_creator","rigging","proportions","armature","non_destructive"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/75280d36-9b63-45bf-952b-bfa0f2d00a6d/","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","version":"1.0.0","type":"add-on","archive_size":1858,"archive_hash":"sha256:3c9b99fda4e7b5345fbf151c0db1fc14bdb7bcce44f65753ba4c14bb8f4d0666","archive_url":"https://www.blendkit.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.blendkit.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","version":"2.0.0","type":"add-on","archive_size":251303,"archive_hash":"sha256:fdc1a528d7808c897d7cf3469b09921a5b29174cfa6293400f82a1cd0eb65efb","archive_url":"https://www.blendkit.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.blendkit.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 objec","version":"4.3.0","type":"add-on","archive_size":6791,"archive_hash":"sha256:eab0f22f85eeb43acd57024e2f967002c09f335c83a8163bcc64ff0005fa7510","archive_url":"https://www.blendkit.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.blendkit.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 assig","version":"1.0.0","type":"add-on","archive_size":1838,"archive_hash":"sha256:c066fafb8e07e092ad7f5f806f042f71662cc6183657be1ef1f2a0c861cc08f5","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/1a9af258-e75e-44c8-81e9-869249addb8d/","schema_version":"1.0.0"},{"id":"camera_switcher","name":"Camera switcher [FREE]","tagline":"Quickly switch between all cameras in the scene from a dedicated","version":"1.0.0","type":"add-on","archive_size":2308,"archive_hash":"sha256:fe505d31d4cbc6a364c8a48b63aafc8d04e816b041fcbe852f5da61bddc1025d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/68c92d93-988d-48f7-95c1-bdb084c22362/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.00.0","maintainer":"Remigiusz Waluś","tags":["camera","view","active"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/056e30fd-f62d-4fb4-9a53-95be346475c3/","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","version":"1.2.2","type":"add-on","archive_size":513576,"archive_hash":"sha256:61fc9b726002f7cd17ffb5b1e54bfa1827e8edf538881e72749f4faf931dc384","archive_url":"https://www.blendkit.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.blendkit.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","version":"1.0.0","type":"add-on","archive_size":1490,"archive_hash":"sha256:607cf00fe41582b4eaeb640cb6ad8dc9944731be643022c810fbb2a799abef0b","archive_url":"https://www.blendkit.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.blendkit.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 starte","version":"1.0.0","type":"add-on","archive_size":135827,"archive_hash":"sha256:d2d49d2c9665add7c55181a343759dde9bfa5de723d4bb3075b93694822d46ac","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/f8432983-2d65-4d16-a7ef-36ee5fcc7220/","schema_version":"1.0.0"},{"id":"cgheven_blender","name":"CGHEVEN Asset Library [FREE]","tagline":"100+ Cloud VDBs (fire, smoke, tornado, portals, explosions, dust","version":"1.0.0","type":"add-on","archive_size":138712,"archive_hash":"sha256:f4f3d8461ac1edb6f56b6e3a56b5047784bb854606fa01cdbc40cf99255cdfe4","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c16124bd-9c82-44c8-82eb-51dc2cc79e7f/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":"CGHEVEN","tags":["free","VFX","VDB","Flipbooks","clouds","fire","explosion","Magicfx","3dscan"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/ba084cd6-c1af-459f-8d71-f645489708ba/","schema_version":"1.0.0"},{"id":"cleanx","name":"CleanX [FREE]","tagline":"CleanX is a Blender right-click menu addon designed for 3D asset","version":"1.0.0","type":"add-on","archive_size":13355,"archive_hash":"sha256:4e312c21ac1dbb00023ab28c841ff7acd14ea714250363ae6b32f8fbba538cb3","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/797da2fb-3b8a-49dd-8bb0-62e0474258a0/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":"Free poly","tags":["clean","texture","delete","pack","model","packages","compress","resize","snap","hierarchy"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/307f20ee-8d34-4371-9bb0-5f417f43e870/","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.blendkit.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.blendkit.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 transfor","version":"2.0.0","type":"add-on","archive_size":1925,"archive_hash":"sha256:0b5ea205238edbd92d77f10ac909b9e66fda38c14bdc05a52e4253c10bece865","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/e4d8305e-3eca-477f-8b08-afa17bf621ce/","schema_version":"1.0.0"},{"id":"copyx","name":"CopyX — Cross-Version Copy & Paste for Blender Objects [FREE]","tagline":"CopyX lets you copy selected objects from one Blender file and p","version":"1.0.0","type":"add-on","archive_size":5027,"archive_hash":"sha256:af90abab4b0fdeba0b41982697f3b28b08cb549a4465e9e1da7fba52e090f0db","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/1031b3ec-dfbc-415f-b0c0-d7954d7596af/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":"Free poly","tags":["3DView","Object","copy","paste"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a97311ce-49fa-4191-b7aa-ce3e70f1beef/","schema_version":"1.0.0"},{"id":"CountDown3d","name":"Countdown 3d [FREE]","tagline":"Quickly add customizable 3D timers (countdown or count‑up) to yo","version":"1.5.0","type":"add-on","archive_size":4799,"archive_hash":"sha256:49bbf5981614ed4fef283a4501654b98312dc61ea0790cab12e856f66f875a84","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/cafb5d64-82e6-45d5-ae1f-2a6c504a3838/","schema_version":"1.0.0"},{"id":"custom_snap","name":"Custom Snap [FREE]","tagline":"Custom Snap is a fast addon that enhances the default snap syste","version":"1.0.0","type":"add-on","archive_size":2927,"archive_hash":"sha256:4b3745f1bc6df4dd0f9575248ded2a3a11ed5858bfa3d5e85a99396d0b1baf65","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/053f20f2-683f-46c3-b7d1-79c47453eb13/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.0.0","maintainer":"Jeslin Paul","tags":["3DView","snap","origin","selection"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0e6e9617-b4f3-4267-adca-e8a2d557f509/","schema_version":"1.0.0"},{"id":"Delete_Loose","name":"Delete Loose [FREE]","tagline":"with this handy addon, you eliminate smaller and loose parts of","version":"1.2.3","type":"add-on","archive_size":2391,"archive_hash":"sha256:9fdf99f92ab399377ec92a0d3bf25bce5891384b9a0ed61ce8def18314b60f58","archive_url":"https://www.blendkit.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.blendkit.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 consta","version":"1.0.0","type":"add-on","archive_size":2873,"archive_hash":"sha256:9d0cb8dbcfadb9e4e70c7ba952299be23f179d4d458951db659f0a5a551f7670","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/f7a51ab2-f758-464f-817b-ad010cb643bd/","schema_version":"1.0.0"},{"id":"dice_forge_pro","name":"Dice Forge Pro [FREE]","tagline":"Generate canonical polyhedral dice (D4–D20, D100) with text, cus","version":"1.1.1","type":"add-on","archive_size":36003,"archive_hash":"sha256:75344c4ace13fa032f5cb7cc4a0c823bc09057180faeb77c68cc026055f0b865","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9e97f36d-99ac-4e8f-807b-e0f09fccfa8f/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.0.0","maintainer":"Fabio Malvaldi","tags":["ttrpg","rpgdice","dicemaker","dicegenerator","tabletoprpg","dnd","3dprinting","customdice","RPG","DICE"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/fbf85f8a-1963-420d-a8d7-6c54b538fcf0/","schema_version":"1.0.0"},{"id":"down_to_earth","name":"Down-To-Earth [FREE]","tagline":"Auto-snap any object to the nearest surface in your scene — no s","version":"1.0.0","type":"add-on","archive_size":6404,"archive_hash":"sha256:8e008319495acce4379943ad4ee198a531d7a6367cffdc245b8a8e23c5f410f7","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/dab12edc-301b-4772-b1fd-a5abe89bf212/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":"GoldFish CG","tags":["Snap","Tool","base","surface_snap","placement","object_tool","scene_assemble","one_click","grounding","productivity"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/81e4af0c-b0a4-4c7d-b7b4-190afdbd1e99/","schema_version":"1.0.0"},{"id":"easy_measure_tool","name":"Easy Measure Tool [FREE]","tagline":"A lightweight add-on for quick measurements","version":"1.8.3","type":"add-on","archive_size":11147,"archive_hash":"sha256:d8e8f97500e44d4e9c77fe133dccca151df3f1c08f7aa50e7e7feaa0adbb8010","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/8142dce2-f9c4-4f20-a5c6-402460d5f145/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.blendkit.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 a","version":"1.0.0","type":"add-on","archive_size":4790,"archive_hash":"sha256:2aad46cd10d876e3ab5d5f69a927c9b423a0f2d14eb47fbedbd6c380f65293cc","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/f31d8f0b-ee2b-45ec-9f4b-4aae75a7160f/","schema_version":"1.0.0"},{"id":"Eyes_of_Masyaf","name":"Eyes of Masyaf [FREE]","tagline":"Asset inspection and workflow guardian for Blender","version":"0.5.2","type":"add-on","archive_size":20333,"archive_hash":"sha256:d6f4f04d0420347b0cc1270796776e010304250caa82c77c8998fac4ef4b3791","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/61711621-e714-497b-9b3e-67a9354eaf0b/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":"Reza NeoMasyaf","tags":["Object","Mesh","UV","Workflow"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e26feba5-e5df-469b-98cc-076cfc3c5748/","schema_version":"1.0.0"},{"id":"facemesh_capture","name":"FaceMesh Capture (MediaPipe) [FREE]","tagline":"Create a textured FaceMesh from webcam or photo using MediaPipe,","version":"0.4.0","type":"add-on","archive_size":11286,"archive_hash":"sha256:8714eff32dcda7ff8fc554d0714ae815805c17f6def1b4e45027d6ff0e3a9dc8","archive_url":"https://www.blendkit.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.blendkit.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 suppor","version":"2.0.0","type":"add-on","archive_size":4059,"archive_hash":"sha256:77bbac7d17fd132350d9bf065ef2c2de2f4f575fec639d72149d7cb0d5ab77d3","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/7d69be65-9004-4469-bd9c-beb29e1ec99b/","schema_version":"1.0.0"},{"id":"global_clip_sync","name":"Global Clip Sync [FREE]","tagline":"Adjust Clip Start and Clip End across all Blender workspaces fro","version":"1.2.0","type":"add-on","archive_size":1725,"archive_hash":"sha256:928d5139fbc88bd54e54eafa1d46833264d8ef7d622ebfb7c4991729588645d5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/1112186c-ba61-43b7-83d3-e607ef234c4d/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"5.1.0","maintainer":"Leo Villanueva","tags":["Viewport","Clipping","UI","View","Tools","Clip","Display","Distance"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d673a38f-4133-495e-9875-fb020048cef0/","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 Sta","version":"1.0.0","type":"add-on","archive_size":2292946,"archive_hash":"sha256:b77a68f7e34b9c5f9c66fafef6825a0575fe8605c8da51a567dff3cd94fa358f","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/26a86759-a4b3-4545-ad67-106a89737f54/","schema_version":"1.0.0"},{"id":"graphi_free","name":"Graphi Free [FREE]","tagline":"Graphi Free is a lightweight Blender add-on for shaping easing c","version":"1.0.0","type":"add-on","archive_size":5009,"archive_hash":"sha256:f1336e92f03ccf6314eab0c9cf739b95316d9da669e10294e146b5d1c5495b3d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e508361c-87aa-4460-8427-f354e4cdf83d/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":"AHMED KETTUR","tags":["Animation","GraphEditor","Keyframes","Addon","Easing","Bezier","FCurves","MotionDesign","Workflow","3DAnimation"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a3ac0ded-6b76-40bb-83d3-9a8ef1d547f6/","schema_version":"1.0.0"},{"id":"item_transform","name":"item transform [FREE]","tagline":"A Blender addon that provides quick transform operations for sel","version":"1.0.2","type":"add-on","archive_size":6957,"archive_hash":"sha256:6a78724c1d6cb68d9a691c6f2e8403844860a064f9257d0b22eac7a124bc7ecf","archive_url":"https://www.blendkit.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.blendkit.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","version":"1.3.1","type":"add-on","archive_size":6538,"archive_hash":"sha256:afe900cdb0a244c3f4aadab240cbfc5ce0942f68673803924e7ed72d4023d406","archive_url":"https://www.blendkit.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.blendkit.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","version":"1.1.1","type":"add-on","archive_size":54772,"archive_hash":"sha256:2ef9d7ad94bce0ff2e811677230a5daa4f8fc607fa1123478d923f624fa933d0","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/8626f2ca-193c-4f15-8011-200c5d0a2e9b/","schema_version":"1.0.0"},{"id":"Lets_turn_on_fake_user","name":"Let's turn on Fake User [FREE]","tagline":"Are you tired of Blender delete your file(s)?, Even though you s","version":"1.0.3","type":"add-on","archive_size":6837,"archive_hash":"sha256:3815d47845cdb03a46c26891a69e7be9b4fd2952e88081a327f92244bf4ec4e1","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/4bfd4128-90b5-40cc-aa29-3b48be5b8b14/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":"Theiyn tnz","tags":["System","Workflow","Animation","Save","FakeUser"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e1c19457-113b-4f5d-b1f2-317318942cb7/","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 n","version":"1.0.0","type":"add-on","archive_size":2046,"archive_hash":"sha256:46ac6e96e5eb3cda09a1ad70342f492abcc28b276ceba020a2c891e50c016820","archive_url":"https://www.blendkit.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.blendkit.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","version":"1.0.0","type":"add-on","archive_size":2026,"archive_hash":"sha256:07c076a2f8e842a5eb167a7e90f64a5805ccd2582d78625da664d833a61e1b82","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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 geomet","version":"1.3.0","type":"add-on","archive_size":10274,"archive_hash":"sha256:1293382cde627aa9f16c8c25e9e2e2775ee8b1793ebf672f87ccbc60e5f672cf","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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 professio","version":"0.1.0-beta","type":"add-on","archive_size":107115,"archive_hash":"sha256:fc2a66562a83772e8752a1d4acad647634ef20c09e117578924b3adc62d249f5","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/20da5129-5479-4f45-a450-ef70cfc0ee5e/","schema_version":"1.0.0"},{"id":"teca3d_mesh_welder","name":"Mesh Welder - Merges Two Meshes into One, and Vice Versa [FREE]","tagline":"Mesh Welder is a simple add-on for merging and splitting models;","version":"1.1.0","type":"add-on","archive_size":10360,"archive_hash":"sha256:f3e75ef3a17e04447cf9a2ae943654026ab15fcf431029722a57de242d5bb385","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/cd7b88aa-a1f9-4c7a-a027-bbb6c84a2f0e/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"5.0.0","maintainer":"TECA 3D","tags":["3DView","Mesh","UserInterface"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a467e686-8d87-473a-9aa6-39154f685dfa/","schema_version":"1.0.0"},{"id":"multi_object_export","name":"Multi Object Export [FREE]","tagline":"Export multiple selected objects individually in one click using","version":"1.3.0","type":"add-on","archive_size":7107,"archive_hash":"sha256:54acc7d04a2938e3da46c303d15f131960209d60c4e91fb8792410ff4342c04f","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.com/asset-gallery-detail/9076e710-cedc-4b37-92b2-16b38fa0997b/","schema_version":"1.0.0"},{"id":"NeonSignPro","name":"NeonSignPro (Development) [FREE]","tagline":"Professional Neon Sign Generator with HEX, Flicker & Custom Font","version":"0.0.1","type":"add-on","archive_size":3465,"archive_hash":"sha256:a6d40a2c6245256a1a6a76b9b3636f55e955a7e0bcfb47502aa1c0f31f0dc103","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/65c1c0b5-a3ad-49bc-8af9-903817e9ddcd/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"5.0.0","maintainer":"Wikz B","tags":["easywaytogenerateaneonsign","neonsignpro"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/36f58375-aa62-4424-bfb0-51c80302bb4f/","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","version":"1.0.3","type":"add-on","archive_size":4752,"archive_hash":"sha256:e59fd49dbc701c9f45705e7f28dcf4d5d93dc13bf8820a5c8bf813a50c33b1e7","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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 hier","version":"1.2.1","type":"add-on","archive_size":2022,"archive_hash":"sha256:92acc75cacffd655deae6760fe888a19acfbc48e5366bb232adb202a28c1b8ac","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/da7cfd8c-36eb-44ef-b5b5-44cf92c63506/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.blendkit.com/asset-gallery-detail/67ab12d4-3e48-4bce-affb-30a6b6095fb2/","schema_version":"1.0.0"},{"id":"pinned_modifiers","name":"Pinned Modifiers [FREE]","tagline":"Pinned Modifiers is a Blender add-on designed to speed up our mo","version":"1.0.0","type":"add-on","archive_size":21507,"archive_hash":"sha256:c17a73e1a8c07ffc63c9c58626fd38e72e939fc23a2b6f122b59a20374ea77e6","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/eb576247-2e8e-4b41-9b81-b82243cf9e4a/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.3.0","maintainer":"Francesco Yoshi Gobbo","tags":["UserInterface","Modeling"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2f242640-80dc-45d1-9baf-bc0de85e1fc5/","schema_version":"1.0.0"},{"id":"pomodoro_timer","name":"Pomodoro Timer [FREE]","tagline":"Boost your productivity with this amazing N-Panel widget! If you","version":"1.0.0","type":"add-on","archive_size":5004,"archive_hash":"sha256:3ae73f0701bbae44934d253689dea84f7858f61f3a5e88c02966623c911cede3","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/e382a037-62c0-4266-a312-9c4fecf2e494/","schema_version":"1.0.0"},{"id":"procedural_building_generator","name":"Procedural Building Generator [FREE]","tagline":"Create instant, game-ready 3D cities with the Procedural Buildin","version":"1.0.0","type":"add-on","archive_size":10370,"archive_hash":"sha256:cc91376be52c17e60fd7657b12eb03e49da8b020571610a6a86147cc55d5cce3","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/429bb6e8-0c26-400b-8545-c60984c390b7/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":["AddMesh","Modeling","addon","procedural","building","generator","plugin","city"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/040d9c18-3746-4987-a087-8257751611a4/","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.blendkit.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.blendkit.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 ca","version":"1.0.0","type":"add-on","archive_size":2587,"archive_hash":"sha256:bd88afe070d59e6df44c4d7e2f6a264508f31cb96d67edda45d5dc5adbd22dab","archive_url":"https://www.blendkit.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.blendkit.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,","version":"1.1.0","type":"add-on","archive_size":5948,"archive_hash":"sha256:7cd0d15de0a31d89fa52284f109c191164e99f4ac31ef151f9b32f5d362413c9","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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. Simp","version":"1.3.0","type":"add-on","archive_size":3248,"archive_hash":"sha256:9a6d7fcdf5ab075c3731d5253413f71fc7b5b92c4e8ccec5ebbb2d8100380720","archive_url":"https://www.blendkit.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.blendkit.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, Sm","version":"1.0.0","type":"add-on","archive_size":3266,"archive_hash":"sha256:d1bbf787a368b4f2dd956c1cb14710bc9b3caa76fd1ca56b9a4fbdc56b4ea6c2","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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,","version":"1.1.4","type":"add-on","archive_size":182021,"archive_hash":"sha256:d62a0e5ac70943ea42fa5d54d7e047792b45b16cb0e602f8278369c3e1fb5500","archive_url":"https://www.blendkit.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.blendkit.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 b","version":"2.0.0","type":"add-on","archive_size":16684,"archive_hash":"sha256:5b3b0b59abad0e887e6b5b9511ef3ef64830b75e0ddfabaabdbdf82283efabdb","archive_url":"https://www.blendkit.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.blendkit.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 & displacemen","version":"1.3.3","type":"add-on","archive_size":161147,"archive_hash":"sha256:9efc25e28b0dd1199d59f501ad1625e046cbb5616c1634660e6166bf96076199","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/a2d0027b-8cc7-450e-9e6e-18e4c8e7f734/","schema_version":"1.0.0"},{"id":"ReadyScene_addon","name":"Ready Scene 1.0 [FREE]","tagline":"Ready Scene– Blender Addon for Quick Scene Setup","version":"1.0.0","type":"add-on","archive_size":4741,"archive_hash":"sha256:6c17f1d4f95da37b2375b5a26890db5cc21eb8cc4dbd620187aeccb89582a928","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f2eacecd-ef95-4fa2-b6ef-8d25415f29a9/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":"ANDRIY LIA$HKEVI$H","tags":["parallax","scene","camera","layers"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0f55cc80-1fdd-4d66-9346-9614039486d6/","schema_version":"1.0.0"},{"id":"reflectiveaudiomachine","name":"Reflective Audio Machine v1.3.4 [FREE]","tagline":"Reflective Audio Machine - Turn Your Music Into 3D Visuals in Bl","version":"1.3.4","type":"add-on","archive_size":36299830,"archive_hash":"sha256:1695810a6bb5809540f9d07093a5d3acad3215b683450c01fc25560827ececc6","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/6455ae0e-e1af-42df-81b9-e3b73f7cc4cb/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.5","maintainer":"Jacques Durocher","tags":["audio","sound","music","wav","visualisation","reaction","react","animation","pulse","wave"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/11608830-074c-4fc8-94ba-4fbd90a87531/","schema_version":"1.0.0"},{"id":"reflux_addon","name":"ReFlux Render Optimizer [FREE]","tagline":"⚡ ReFlux — Faster Renders, Smarter Workflow","version":"1.0.0","type":"add-on","archive_size":6105,"archive_hash":"sha256:319dd16b471cf3e1e9254952ae12851b5f3a63381372b548282c4a13aee49c24","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/35d38941-00bf-4349-b7aa-f88f41339dc4/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.0.0","maintainer":"Swastik Rout","tags":["rendering","render","fast"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/5aefa8de-dde0-4c0f-a7d6-8b01b75ea519/","schema_version":"1.0.0"},{"id":"render_alert","name":"Render Alert [FREE]","tagline":"An addon that alerts the user once blender is done rendering","version":"1.1.2","type":"add-on","archive_size":2979,"archive_hash":"sha256:3f749a92dff7e039724e9a8b9f1d08700f282c0671eace50ac0a0dd8a86e0394","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e162ae62-7936-45a4-adb6-a4aa222e4d80/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":"ジディー Jideeh","tags":["Render","UserInterface"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/bdc3f751-d493-4997-847b-77f328d560f5/","schema_version":"1.0.0"},{"id":"rendermanager","name":"Render Manager [FREE]","tagline":"Render Manager - A render queue management tool for Blender. Cre","version":"1.7.0","type":"add-on","archive_size":4101,"archive_hash":"sha256:d657357fbdb72f75d28157d2d98cc0dd58e93e7e9966f1dba9121b8ca4da4530","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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":"5555dnl_3d","tags":["render","scene","studio","toolkit","preview","libary","asset","lighting","presets","setup"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/5238fe33-ff61-4add-bee5-27c885666c89/","schema_version":"1.0.0"},{"id":"scatter_directional","name":"Scatter Directional [FREE]","tagline":"Precise density and orientation controls (primarily to follow th","version":"1.2.0","type":"add-on","archive_size":9904,"archive_hash":"sha256:88676fc546dd29d363628a11a83ad2d03d21735fbf2f5b348910ef3ab7851592","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/3d6829ba-ee12-445d-93a7-a4ffcf10b336/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":"3DFIGURES rian","tags":["scatter","directional","proxy","previewer","trianglepreviewer","randomize","convertmesh","aligntonormalorientation","orientation","normal"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0facc425-e629-414c-b30b-397abf1a01ce/","schema_version":"1.0.0"},{"id":"scene_data_exporter","name":"Scene Data Exporter [FREE]","tagline":"Exports scene data for AI analysis (TXT/JSON)","version":"1.26.0","type":"add-on","archive_size":9942,"archive_hash":"sha256:08675fc6fa158c3d99eb5c47f19186237d58608d42dc8681bf045e7294bf44ef","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/5f6b80d0-8db7-47e8-9e56-e16e55aed861/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":"Joachim Bornemann","tags":["ai","export","json","data","workflow","scene","python","automation","analysis","development"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2c90b1d0-f252-4510-abc5-880d1aa6826b/","schema_version":"1.0.0"},{"id":"scriptpilot","name":"ScriptPilot [FREE]","tagline":"A lightweight add-on to increase search and navigation functiona","version":"1.2.0","type":"add-on","archive_size":12017,"archive_hash":"sha256:417168679a551ce8c6ec5a74e6955efa953bef5bf80fe7a83157b03e303eb5d8","archive_url":"https://www.blendkit.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.blendkit.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","version":"1.0.4","type":"add-on","archive_size":4277,"archive_hash":"sha256:56b28e5fb681ea4ab21f6539c6264e5eaa209a30df9ce3b1fb58a70ee2ffc748","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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","version":"3.0.2","type":"add-on","archive_size":49645,"archive_hash":"sha256:cd64d1e255d54f373ee9220c0a208ce299dc0169faa307af642de46cd402c51f","archive_url":"https://www.blendkit.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.blendkit.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":551003,"archive_hash":"sha256:86b18a7ba0d743812eb871e1a573b3d58ca66bdfc78077aa1cf7a59f65d3e11b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/5bfc561c-3796-4225-899d-efed286bd197/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.blendkit.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","version":"1.5.3","type":"add-on","archive_size":9723,"archive_hash":"sha256:d278b9416739f1baf80bc178f8b621cc198bd2353a22b0b8da5a0188115357ab","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/4043ed89-4af5-4502-828b-5fc3f5ec55e1/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.80.0","blender_version_max":"5.0.0","maintainer":"Yakiv Sankov","tags":["gamedev","rigging","animation","addon","scale","unity","unreal","fix_animation","armature"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/8d205ca1-cbf6-4a10-903f-0148e9d631a0/","schema_version":"1.0.0"},{"id":"smart_material_painter","name":"Smart Material Painter [FREE]","tagline":"​Smart Material Painter","version":"4.2.0","type":"add-on","archive_size":25766,"archive_hash":"sha256:f9f5ab77f2a434cfbdbc6f3533abb2058de2faa82487c2a7c3c5df5700fc73ea","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e95a879a-6837-4a56-944b-b331d0777c09/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.0.0","maintainer":"Meshmind egwoba","tags":["Material","Paint","UV","Object"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/5a7e38f5-4ea4-4f65-b2c6-5b96d9344c4f/","schema_version":"1.0.0"},{"id":"sol","name":"SOL [FREE]","tagline":"8 one-click particle presets for Blender: sparks, fire, firework","version":"1.11.0","type":"add-on","archive_size":59092,"archive_hash":"sha256:9383c79b02a06833c6c7fdfd7bcb4f5e4124c8b72fb3ad1c209a8cec5ab1a60c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/562ad6a9-f189-4bb9-8d66-18bff85d1c34/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","blender_version_max":"5.2.0","maintainer":"Cloudy Sky","tags":["Object","Physics","presets","particles","fx","Fx","Vfx","VFX"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/4b2ad94d-559b-4705-9009-323d60693976/","schema_version":"1.0.0"},{"id":"solo_mode","name":"Solo Mode [FREE]","tagline":"Solo Mode helps Blender artists work faster by isolating selecte","version":"1.0.3","type":"add-on","archive_size":3323,"archive_hash":"sha256:8890473d4c81ed5b3c9e66a25c4c0205cca146e3e48e9c050fb3d5a2c256166a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/ed1a7e7a-b8bf-457f-9dd7-c07bdd5aa89b/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"3.6.0","maintainer":"Vincent Ilagan","tags":["3DView","Object","3D","View","Workflow","Productivity","Viewport","Solo","Solomode"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/fd8b8c65-7ded-48f1-afa7-b2908baafcdc/","schema_version":"1.0.0"},{"id":"subdivide_selected","name":"Subdivide Selected [FREE]","tagline":"This plugin applies subdivision to a selection with clean topolo","version":"1.2.3","type":"add-on","archive_size":2597,"archive_hash":"sha256:f964bb44f8f1dccfa4cb7c880b5fc3b742b749190e88ec0b39b57842c0097bf8","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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 al","version":"1.0.0","type":"add-on","archive_size":19532,"archive_hash":"sha256:1cfb365cb2667c8d5a600275a81ba033c21e426423885d228fd57aa85c525d3d","archive_url":"https://www.blendkit.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.blendkit.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 Landsc","version":"2.1.0","type":"add-on","archive_size":1891,"archive_hash":"sha256:e6bc031d13a16343fd7f0672f97edbb5567ef29600b457881be11c477cfa1c42","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.com/asset-gallery-detail/d55d15f7-22f3-433f-9e6a-e7b3544256c0/","schema_version":"1.0.0"},{"id":"texture_bakery_image_buddy","name":"Texture baking image buddy [FREE]","tagline":"Add-on for creating empty images and their image texture nodes i","version":"1.6.8","type":"add-on","archive_size":134546,"archive_hash":"sha256:384048dd9e5c08c899b7d19c453a5be841b9b8ba89064ed607d5ba21fe479204","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/4c531eb1-ecd6-4b20-835c-85e8bcce698f/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":["Material","Node","Workflow","Baking"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/c52a840f-f69b-48c9-92ff-520bd166ecab/","schema_version":"1.0.0"},{"id":"texture_upscaler","name":"Texture Upscaler - Offine Image Upscaler For Blender [FREE]","tagline":"This addon lets you upscale your textures in image editor","version":"1.3.0","type":"add-on","archive_size":200727626,"archive_hash":"sha256:6a71e383d902259c98be3deed66ebb7426c32aa2faf638295e6e4a0ab15078e5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/6964e35b-6cf3-484e-ab91-e8600f5b418f/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":"Haseeb Ahmed","tags":["upscale","texture","PBR"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/999f5f40-469c-4d46-8647-42babafe320e/","schema_version":"1.0.0"},{"id":"amazing_hypotrochoid","name":"The Amazing Hypotrochoid 1.0.9 [FREE]","tagline":"Generates intricate hypotrochoid curves with adjustable paramete","version":"1.0.9","type":"add-on","archive_size":28189,"archive_hash":"sha256:25a502b65b9332a0b53c601d66096dc8a1ceaf7af82ea7cf510d832b0b910c0e","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.com/asset-gallery-detail/efb9a92c-fe00-40dd-a3cd-70c4086143c0/","schema_version":"1.0.0"},{"id":"tmeasure","name":"Tmeasure v1.1 [FREE]","tagline":"It accurately calculates the curved or linear edge paths of the","version":"1.1.2","type":"add-on","archive_size":4978,"archive_hash":"sha256:112307b7d10a7d3e66ca7245e8f52aa4a5df709d1c453bcd1ffc268472f4b9bf","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/26d14398-683e-48ff-8c34-dd15191bcae3/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 Tonka","tags":["Mesh","Modeling","3DView","measure","calculation","measurement","precision","tools","hardsurface","editmode"],"license":["default_addon_license"],"website":"https://www.blendkit.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 Emu","version":"1.4.0","type":"add-on","archive_size":1343,"archive_hash":"sha256:e0eb54d5bc012e9d262c255df472ac0cdcf194a366f914d4c488525ed795c497","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.com/asset-gallery-detail/fb812bd3-5913-4549-91fc-1ff8e5c486b7/","schema_version":"1.0.0"},{"id":"tuberig","name":"TubeRig — Make your rig controls actually visible [FREE]","tagline":"TubeRig takes your existing Custom Bone Shapes and wraps them in","version":"1.1.0","type":"add-on","archive_size":24455,"archive_hash":"sha256:02d6cec8b3486cbe1e84272c5af48e13b78d8e801feb1b1ff7b39ed155cb32f5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d1cd8f43-1581-4de9-97dc-326c0bcfd853/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":["Rigging","Animation","Addon","bone_widget","custom_bone_shape","geometry_nodes","rig_controls","tuberig"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e2da7972-168a-4dd1-a415-f971c73a8503/","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.blendkit.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.blendkit.com/asset-gallery-detail/8ebcbb43-4807-42e2-9ae1-9bef04b58aea/","schema_version":"1.0.0"},{"id":"xcut","name":"XCut [FREE]","tagline":"Cut (Ctrl+X) for Blender's Outliner and animation editors","version":"1.0.0","type":"add-on","archive_size":4238,"archive_hash":"sha256:4065b43f89015d76880252c2d8e2b3a2e91ed19a304f71c5c11f5c60a1c5bc11","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c0561ccb-79ea-4633-86e7-122673f9a21a/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","Scene","Animation","cut","edit","useful","Cut","shortcut"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/73d5e3e9-c9e5-43d6-91e6-11ea780a3004/","schema_version":"1.0.0"},{"id":"cobweb","name":"Cobweb [FULL]","tagline":"FULL plan required - upgrade to download","version":"2.2.1","type":"add-on","archive_size":50711,"archive_hash":"sha256:0706d2533db72a8d7e824ede71d7bfe84e3fea73a6454b3c3672900d7a8b8b41","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/20d48d8d-39a5-4d1f-9fb0-994401b2a9c2/","schema_version":"1.0.0"},{"id":"final_topology","name":"Final Topology for Artists [FULL]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":627177,"archive_hash":"sha256:0a9d55a9a02cb026fa969eeaf7f7eb11258732eeb8322e09c136e28da0aa8a4f","archive_url":"https://www.blendkit.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":"Blendkit Community","tags":["System"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/388b195c-5a7d-4d9f-a632-0dac12c9198c/","schema_version":"1.0.0"},{"id":"two_d_people_archviz","name":"2D People [Before: $11.99, Now: $10.19]","tagline":"FULL plan required - upgrade to download","version":"1.6.0","type":"add-on","archive_size":256485,"archive_hash":"sha256:ab84c4836a19c106c9c4cc64772b1a793c71c119258eacb7efaf532d9857d4cd","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2f40621f-a3c3-4b2f-9266-11e3b7e3be2c/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.3.0","blender_version_max":"5.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":42045461,"archive_hash":"sha256:9b8c84af187c955f914a5b0b78e1e4284e0b59c0c1fe1a9c2ac28f18ee7d1e2d","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":73577,"archive_hash":"sha256:b1aff6a799bce2cb9891d217dc2795c1b57830f81d430e40fd15fbd613798a92","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.1","type":"add-on","archive_size":41658,"archive_hash":"sha256:d1e2b4545aafd73466c8f3525f2f7baf2ac4fc418e20fb31c9eed4ead61cf0f1","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/e0bc8018-886c-4c41-ae18-2097088e3b48/","schema_version":"1.0.0"},{"id":"advanced_modifier_tools","name":"Advanced Modifier Tools (AMT) [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":26641,"archive_hash":"sha256:390d9e74a4786fd18958d7bf5adb8f9eb9bbc60527a136e8b6f8da045d63e054","archive_url":"https://www.blendkit.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":"8.50","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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":12066,"archive_hash":"sha256:52f11f2ebfd2f323c7f6d0497bc4cf7f9e182c956a59bc06f8333316769f3b24","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.8.0","type":"add-on","archive_size":11078,"archive_hash":"sha256:99844c2df0e2bd04d5f1326e199a57507ad60affc64223a7b5809b33e0c23997","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/4f4adf7a-d4c9-400d-85ee-53b73a3cc14f/","schema_version":"1.0.0"},{"id":"align_distribute_objects_pro","name":"Align & Distribute Objects Pro ULTIMATE [Before: $2.00, Now: $1.70]","tagline":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":4516,"archive_hash":"sha256:198a0ba8b51c2fea507da48921704fdc39f6f506420881efd7b3b689c543f7f5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9f79e7e7-f980-427d-88fb-96b0ef350e39/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.0.0","maintainer":"isac lima","tags":["Object","Modeling","Scene"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/14106c2f-74a6-4d17-9447-a93f2bd0b56f/","schema_version":"1.0.0"},{"id":"align_toolkit","name":"Align Toolkit [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.1.1","type":"add-on","archive_size":15041,"archive_hash":"sha256:024b25133b7ba4de512a7043fcd1fdf4e1dda61fb407db9118d477cb293743b4","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":20121,"archive_hash":"sha256:393d1f896b9aba97226956a59a1b15cc0d0ae501517ab8c54a46603f967b3eb9","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.5.0","type":"add-on","archive_size":64598868,"archive_hash":"sha256:2c2840bbfceada6d70b37dfac28bae7e3b347be5ad871d64332b24c91bb647a8","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":385592,"archive_hash":"sha256:b72f2d7159a888113322cda4646363adb8e52698b1af624e0e4c4fcdcf380133","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":11811259,"archive_hash":"sha256:a6da266309f0c9e57df4ac8c73c96a8cc539751b413283b5d8c53c42bc055236","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":187750,"archive_hash":"sha256:ab0672cd273718e0b180a0b62885c7700f3a9c87e012368f4aaa56135563802b","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.4","type":"add-on","archive_size":174446,"archive_hash":"sha256:6ba53c2008f5ebbe9eb4cd5a58b37f2cf008729a95875a37dffc32628af00b6d","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/fe9df247-5dd5-441d-91dc-aafdde63db3e/","schema_version":"1.0.0"},{"id":"animation_layers","name":"Animation Layers [Before: $30.00, Now: $25.50]","tagline":"FULL plan required - upgrade to download","version":"2.4.1","type":"add-on","archive_size":99251,"archive_hash":"sha256:9c20bef2b59833a0663a26d96dabb2eceaa71760be15bd49922c5e132c3584b6","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/14f01b6a-4082-4c6c-8229-9ac05d0d3158/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":"Tal Hershkovich","tags":["Animation","layers","motion","capture","mocap","nla"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/797ac060-785e-49dc-a98f-d0ecf4abc555/","schema_version":"1.0.0"},{"id":"anime_outline","name":"Anime Outline [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":740454,"archive_hash":"sha256:be4d38ab3ece3bc788ffa1ada8dfd9883925db1ecd6916a34937adfa56aab70c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/5d916717-58fe-4e6e-b6b8-1d10ee208c75/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":"3.6.23","maintainer":"Andy Hellgrim","tags":["Modelling","Import","Export","Outline","Anime","Eevee"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/6a6bb31d-7a31-456f-a05c-dae63d03a1c5/","schema_version":"1.0.0"},{"id":"animtex","name":"AnimTex - Animate Texture Transitions [BETA] [Before: $19.00, Now: $16.15]","tagline":"FULL plan required - upgrade to download","version":"1.0.8","type":"add-on","archive_size":1581140,"archive_hash":"sha256:880d8c49a4b1f7dcfec4993eeb2e07e027f302f5bf515e8393a6aad62c3dceb9","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":42977,"archive_hash":"sha256:85b7c71aea23717ad2cd040897a2cf31a74b22b23691d2b00bf1c9cf5bfd25f6","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":7573,"archive_hash":"sha256:4b1731b758ae452d3b7e94e18041181660942afd3c57ccf16e374a6d1231679a","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/fd4522ac-f70a-4d3a-9955-7c133b4572b3/","schema_version":"1.0.0"},{"id":"arkit_toolset","name":"ARKit Toolset [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":5563553,"archive_hash":"sha256:352d8627021d11aaa88347e0492e8e4d3c82ff8f45a54be7466ed5b62951f91e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7ecd80cc-66ca-4be5-b7fd-0dd688097110/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":"2.83.0","maintainer":"Andy Hellgrim","tags":["Animation","Modelling","Rigging"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/c6250a59-cb9b-4040-8dec-74df05e04bd4/","schema_version":"1.0.0"},{"id":"Arrowify","name":"Arrowify FULL VERSION [Before: $50.00, Now: $42.50]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":4692987,"archive_hash":"sha256:e95bd263c94ac3bcf6b4499b202ca195b722d6d77e5edc1d36e804340f196073","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/6b514bc5-7041-4155-851b-d62cb6a712f1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"42.50","blender_version_min":"4.2.0","maintainer":"RR3D","tags":["arrows","spline","procedual","animated","annotation","nodes","customizable","technical","guide","visual"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/7e5c82e6-ddbd-48d1-98d2-c7077a0a4261/","schema_version":"1.0.0"},{"id":"defoq_assetify","name":"Assetify | The Ultimate Bake & Export Tool [Before: $34.99, Now: $29.74]","tagline":"FULL plan required - upgrade to download","version":"2.1.5","type":"add-on","archive_size":438131,"archive_hash":"sha256:bf0fcb963fe97edf240ab8f350102829bcaaca07880e30b4ebe5a08ec6ac3b12","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/82a1fc6a-bb0a-4162-bf87-ce2d6f1d80bb/","schema_version":"1.0.0"},{"id":"quick_lighting_presets","name":"AT_Quick Lighting Presets [Before: $4.00, Now: $3.40]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":4208,"archive_hash":"sha256:f401b70f3a58b2dafa039b4d4458bbb3e5b6e287a53ea04e9c956ee667d24f20","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/ff81e91c-8620-41e6-9dfe-f2b12a6b352b/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.0.0","maintainer":"Alireza Taherpor","tags":["LightingSetups","LightingStudio","StudioLighting","RenderSetup","BlenderLighting","CinematicStudio","CinematicLighting","ProductLighting","DramaticLighting","RimLighting"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/dc146555-325d-4adc-ba04-71d982d85781/","schema_version":"1.0.0"},{"id":"auto_apply_scale","name":"Auto Apply Scale [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3401,"archive_hash":"sha256:ee30a47355275e1eef8b09809bf0afd33c8e21a648101523992fd22e5cd77f73","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.7.0","type":"add-on","archive_size":4305,"archive_hash":"sha256:5cfd1524435be43a647fa5867e72f99ebb7961675ad78b4c19365c44f4e4d591","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":4268,"archive_hash":"sha256:938ba462e6a0bcef16a7150db22fd86bd823f80c73846ac946cf20e502165c10","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":13478980,"archive_hash":"sha256:f89242c71ba41ab17fb1938b94e8cd82e0e8a3aaeb6536755dff6fdf97a088b1","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9409b4d6-59e4-4f7b-93bf-9b51a9811b8e/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":"5.1.1","maintainer":"Giambattista Von Nettesheim","tags":["optimization","decimation","tool","topology","cleanup","quad","remesher","mesh","repair","remesh"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":11826,"archive_hash":"sha256:97bbf97c0794a1fe1a71563ccb04287667b32ca08dc579436757408fc6f04668","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/18ba6214-e44c-4603-a654-19123100e06f/","schema_version":"1.0.0"},{"id":"auto_uv_unwrap_3_pro","name":"Auto Uv Unwrap & Pack 3 - Create clean UVs in seconds [Before: $25.00, Now: $21.25]","tagline":"FULL plan required - upgrade to download","version":"3.0.0","type":"add-on","archive_size":28163,"archive_hash":"sha256:1fc915d1effc311bdb98272a78c866dc61d2e596114c6ebaa304e34f723391ce","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/402c8540-9b3f-44a8-a1db-fe11518d62f9/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":"3.6.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":8971,"archive_hash":"sha256:a52e5ed61919cfceabcc799a50ddf9ef0bfd143ea8a891f08b1dec71820d0ee3","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/5683ae75-d590-4756-8292-1ecbb4aa66cf/","schema_version":"1.0.0"},{"id":"batch_export_selected","name":"Batch Export Selected [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2703,"archive_hash":"sha256:6998f2db2bd89bf52d165e69566e97cbb1e21c2bd6ea48af63bf5978669b44b8","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/110a268e-9661-4a69-b1b0-0970e718bb99/","schema_version":"1.0.0"},{"id":"BatchGenie","name":"Batchgenie: Asset Assistant [Before: $1000.00, Now: $850.00]","tagline":"FULL plan required - upgrade to download","version":"1.3.1","type":"add-on","archive_size":14941835,"archive_hash":"sha256:6b510374f080da157ad4a432507f68ad9832f80c7870c47510b2cf98e484d322","archive_url":"https://www.blendkit.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":"850.00","blender_version_min":"4.2.0","maintainer":"Roberd Palm","tags":["Asset","Library","Batch","Rendering","Import","export"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1745,"archive_hash":"sha256:1b4be6000c75875c5db989d606cf9dafc4ae84b29829b9ec656b041ab9bf365a","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2746,"archive_hash":"sha256:87eff844dff87b5aece9b41f3c2fee5a1de0baa8837ce4a88b85560996cb328c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.5.0","type":"add-on","archive_size":58465,"archive_hash":"sha256:1869ac939e037aac1143217cfa2a8eea118f1d3b30c5d3df6e53b5efe45e2f98","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.8","type":"add-on","archive_size":56758,"archive_hash":"sha256:412b2098d35238a1766808a2d49895488e42f8bb98df0bde33cd1ba5fc5e6cb6","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/f953d832-362d-4e0c-9caf-208f6e7936b0/","schema_version":"1.0.0"},{"id":"better_bend","name":"Better Bend - Geometry Nodes Bend Modifier with Intuitive Controls [Before: $9.00, Now: $7.65]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":25767,"archive_hash":"sha256:be4346fef203ac6c042afee66e50722aee1f7b765a2dc8225bc0a8eaa7d37aef","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d44ed407-bd2f-45e3-ae58-5aa57482461b/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":"Junaid Alam","tags":["Mesh","Modeling","GeometryNodes"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/7c1cf022-c9a5-4e7f-b821-057c1c4abe99/","schema_version":"1.0.0"},{"id":"better_cutter","name":"Better Cutter V1.1 [Before: $19.00, Now: $16.15]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":32438,"archive_hash":"sha256:d8a1153ba01c79e55c1ba97c79a1982415e47e77d41c5742cca7e01636212f0f","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"7.1.4","type":"add-on","archive_size":5098125,"archive_hash":"sha256:24f90dd72619dfe4d9aaf8b459afb6d4891112017332c909483514da91533a44","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9ed7281e-0ef8-4c7d-9d19-641ace4aae44/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":"3.6.0","maintainer":"Mr Steve Lee","tags":["bevel","join","mesh","blender","manifold","clean","2025"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"2.5.2","type":"add-on","archive_size":3428172806,"archive_hash":"sha256:d92474aa863833fe86450406a8be876c00e87e70a97f08938947899b4986358d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/99036cb8-dde5-4767-b670-5e1b2ccd4c0d/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":"5.1.1","maintainer":"Giambattista Von Nettesheim","tags":["basrelief","heightmap","zbrush","reliefmaker","depthmap","bildeform","displacement","3dprinting","CNC","maps"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":2506,"archive_hash":"sha256:efb37d88992f8a1271da4c4e0012fd4992b4306dfc50382aeb5e6494a048ae11","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":11478,"archive_hash":"sha256:ca92bbdafac363ea15437189b1555e4fc52d97f62ceb0a14a67876fdb1b1ef02","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5883785,"archive_hash":"sha256:117804828d165ade5fed594f79a3f4c17e292297a6beae975915d2f6b096b416","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/02dacd43-eafd-435f-badf-d01756834f35/","schema_version":"1.0.0"},{"id":"blendermcp_pro","name":"BlenderMCP Pro [Before: $25.00, Now: $21.25]","tagline":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":72361,"archive_hash":"sha256:32aba972d1ab39cf45271a511277987628eaf5721ce36dbde7d9868a84fa3d1e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2c9032bf-1d16-4a87-be09-1e77e6ee7036/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":"5.0.0","maintainer":"Anvil Interactive Solutions Anibe","tags":["Interface","Pipeline","MCP","automation","AI","Chat"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2119db70-e04f-4bf6-bd8e-a38675987a98/","schema_version":"1.0.0"},{"id":"blender_revision","name":"Blender Revision V 2.1.0 [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"2.2.0","type":"add-on","archive_size":14849,"archive_hash":"sha256:382d4beed3837ab319fb112ebea32de5aa1e5f5ab911c0ce679ccca4fb29137a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9e625b8f-41e1-4494-bdc0-2b7eb5dfa078/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":"Vincent Ilagan","tags":["render","revision","compositing","cycles","eevee","optimization","selected","objects","pipeline","vfx"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/476556b5-ed65-485f-b566-16ff3c967291/","schema_version":"1.0.0"},{"id":"rizom_livelink","name":"Blender - RizomUV Live Link [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":8979,"archive_hash":"sha256:23be20e366669ef8256b5e80087fd134b49dc4cb8ed9d49877bef38900c4d4ee","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/8f53f3ac-b38f-469f-856a-99b9a72fe6c7/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":"5.1.0","blender_version_max":"5.1.99","maintainer":"Milad Kambari","tags":["rizomuv","uv","mapping","bridge","live","link","pipeline","uv","unwrap","uv"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/abd3b5f4-b476-4104-a791-aeac6a1573ba/","schema_version":"1.0.0"},{"id":"blender_sp_live_link","name":"BLENDER <-> Substance Painter Live Link [Before: $18.00, Now: $15.30]","tagline":"FULL plan required - upgrade to download","version":"2.1.0","type":"add-on","archive_size":25427070,"archive_hash":"sha256:375ff3ee561d16e1ba47e809c660a75c6f0901796dd9de698c4addd2d782ba53","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.3","type":"add-on","archive_size":431945,"archive_hash":"sha256:b09ee9b1ebbb6ee2701103945d9d1957c7027372e48d8227545bd02e6c1f58c2","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/26a91aca-41d3-471b-a71b-8fb1a5da3fce/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.blendkit.com/asset-gallery-detail/0bc81975-693c-42e6-8465-ad0e2e37d9d7/","schema_version":"1.0.0"},{"id":"blender_to_unity","name":"Blender to Unity [Before: $25.00, Now: $21.25]","tagline":"FULL plan required - upgrade to download","version":"2.6.4","type":"add-on","archive_size":445627,"archive_hash":"sha256:b38ae9ef546719c5be97fdbe07d7b726d8d338b3f457039c59624cf4f6368f36","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e3743448-3cd0-4ccd-85ae-16c918350590/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":"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.blendkit.com/asset-gallery-detail/7c884710-57d8-438e-a89f-1c51bb88bb9c/","schema_version":"1.0.0"},{"id":"blender_to_unreal","name":"Blender to Unreal [Before: $25.00, Now: $21.25]","tagline":"FULL plan required - upgrade to download","version":"2.5.8","type":"add-on","archive_size":439859,"archive_hash":"sha256:7f96e285c9fd83e4f5a8b5a2c0a77f3b25d5fe14e1f7f430de6b4c92cd3aa5c5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e24e7aec-90ce-4344-b981-910f066797e8/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":"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.blendkit.com/asset-gallery-detail/7c047180-1c4f-4280-b4dd-56953673651a/","schema_version":"1.0.0"},{"id":"vse_lottie_exporter","name":"Blender VSE To Lottie Json Exporter [Before: $19.99, Now: $16.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":478198,"archive_hash":"sha256:df934207034410d289ecaa5a0560701937fd4710c4136d657c6b0e2550b37eee","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/624848c3-08c0-438b-8177-a4bb8680e563/","schema_version":"1.0.0"},{"id":"blendoptimizer","name":"BlendOptimizer [Before: $4.49, Now: $3.82]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":44178,"archive_hash":"sha256:6d92091fd9695d3b2e93f05ef43ae4cf203364ddc14cffea5606ff444c0d9bab","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/1f5bc0d6-e10e-478a-8e6a-a69efe1953b0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.82","blender_version_min":"4.2.0","maintainer":"Steven Seidler","tags":["Pipeline","System"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/bfd43647-78e8-4252-92bf-a5c349b82f15/","schema_version":"1.0.0"},{"id":"blenquick_autorigger_v2","name":"BlenQuick Auto-Rigger [Before: $30.80, Now: $26.18]","tagline":"FULL plan required - upgrade to download","version":"2.7.3","type":"add-on","archive_size":7306982,"archive_hash":"sha256:ffd7a5221adbbc41e75c09b427de6a18a51c4fda4308941d03a9df9ec174f9cd","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/46f3ba7b-a4da-4064-98b0-ed9b4c6c960b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"26.18","blender_version_min":"4.5.0","maintainer":"Stellart","tags":["rig","rigging","autorig","autorigger","advanced","detection","export","character","smart","animation"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/8844f27d-31e1-44a6-ab42-9518a22f0490/","schema_version":"1.0.0"},{"id":"bl_objector","name":"BL Objector [Before: $3.00, Now: $2.55]","tagline":"FULL plan required - upgrade to download","version":"0.1.2","type":"add-on","archive_size":48724,"archive_hash":"sha256:e99fa9a3ed65ab17d0c113a57b950b083b1cdcba1f918489791d178ce00a3c4e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/ff7aaa8f-20f5-4c4c-813f-bfc57ce8c652/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":"3.0.0","maintainer":"Michal Hons","tags":["3DView","style","dressing","random","scene","blenderkit","replace"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0ba0acf6-cd24-4aa1-b677-d3ea874ccd5d/","schema_version":"1.0.0"},{"id":"booleanbite","name":"Booleanbite: 1-Click Procedural Edge Damage For Blender [Before: $3.00, Now: $2.55]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":8394,"archive_hash":"sha256:c7f3318eeea5cc01f51bd76af0afb1c74275f0b331cf261891cac5a9f042a536","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.9","type":"add-on","archive_size":11944507,"archive_hash":"sha256:52b7f858bb8dbf122f7e8b04e5556cc199844b6ec5a1f1f20bbe0e378bf54c89","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":380172,"archive_hash":"sha256:8eb955f27e800b3fca95a09efccfc6cfde49bcfbdc7409479f7f76c99dce579d","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":6263,"archive_hash":"sha256:442334badc75322a02f1b12e047930c9deff79bd99f1496517c9241597936cec","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":318236,"archive_hash":"sha256:77d5adad2e2ab51fbc5b2cb83c695f8f09ee2074dea3da1b7801d951aef67b51","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":22657,"archive_hash":"sha256:a2030b664b8b229e59b89bd097644e7ae1dc70cbedd0c5af0670c528b9983cb8","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":339168,"archive_hash":"sha256:2c677a7a66aa6bec8aa6ebdbbc83b183a40a0c6cd6cfce83c2582cb0fc7632bd","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/e7a459b1-81e4-4869-b684-d23bbe22c20e/","schema_version":"1.0.0"},{"id":"bslicer","name":"B.slicer [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"1.4.1","type":"add-on","archive_size":1678975,"archive_hash":"sha256:4765df4bbf8d2fc1660a86ed662abedf62e334437033cfea920ae977a6236dca","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/3c1d581e-77fa-43f3-a63a-018fd2186025/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":"3.5.0","maintainer":"belaid ziane","tags":["slice","slicing","export","svg","flatten","modeling","parametric"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/45e0a112-b302-4020-881b-3a91fc139236/","schema_version":"1.0.0"},{"id":"b_working_pivot","name":"B- Working Pivot [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.1.8","type":"add-on","archive_size":18308,"archive_hash":"sha256:d03208917bb899d6e9ab99cb1956c37524dc354f8523d761dc56fee5656826c7","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d4ae5882-e7bc-4a66-8b05-5b071f86165a/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":"Robert Ross","tags":["modo","pivot","snapping","gizmo","3D","cursor"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/94bc13f4-fd31-4a84-8dcc-b7caf7b3648b/","schema_version":"1.0.0"},{"id":"camera_autofocus","name":"Camera Autofocus [Before: $2.00, Now: $1.70]","tagline":"FULL plan required - upgrade to download","version":"1.9.0-20251005","type":"add-on","archive_size":5307,"archive_hash":"sha256:56752e1d4365f09bf9ce871f8d1c41fc499b943f794913698b96878065f09989","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/2b81f79c-ab9d-4d7c-8181-cb4236963e5a/","schema_version":"1.0.0"},{"id":"camera_director_pro","name":"Camera Director Pro [Before: $4.49, Now: $3.82]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":32145,"archive_hash":"sha256:50119c301834ae33a304447005d11da04aca913722e4ff6a05020a028cc501ce","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/a1dbe7b6-312d-417f-906b-ca40df8e1560/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.82","blender_version_min":"4.2.0","maintainer":"Steven Seidler","tags":["Camera","Animation","Scene","Optimization"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d807b46e-842f-4a7d-8f83-773d73ecaa94/","schema_version":"1.0.0"},{"id":"camera_orbit_render","name":"Camera Orbit Render [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":10074,"archive_hash":"sha256:684a165b077372fe487504ac7314ff822817b24193fe0be962c8333bb4990682","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.5.3","type":"add-on","archive_size":38959,"archive_hash":"sha256:aeb2eb83fe7690228387c899c8d25e8e3135e15fcaecb86bd8e2236bfc08d6bf","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":9056,"archive_hash":"sha256:eb1b21ea9778e55cd6e341aeb92473d301e3655bb2a0f10374d16f48dce6b771","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":13521,"archive_hash":"sha256:5c1e20ea372426f7299a477dc73f08bd44e7d2504ddfc47ffea36ee8bacec14a","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/035556c6-4189-45dc-9249-be5558d0c54e/","schema_version":"1.0.0"},{"id":"car_rigger_v1","name":"Car Rigger [Before: $10.50, Now: $8.92]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":1803530,"archive_hash":"sha256:aede98204f16af8773b3230007b1e002e12906b6cb99d8ccc38adf50fe6f53f2","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/0d9bbe47-7189-460b-85e1-71aec35d524e/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.5.0","maintainer":"Stellart","tags":["blender","rig","rigging","rigger","car","truck","vehicle","animation","4x4","autorig"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.6.2","type":"add-on","archive_size":31881,"archive_hash":"sha256:be48e1779b44df451e744e99c2008526c7685124ef7617e4cc88bc82ffe50b88","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.6.0","type":"add-on","archive_size":23262,"archive_hash":"sha256:eb2fd1e49c3ef09eb2ef931671ee5529b55510c9b1fea4d846fa7f41023f9dd7","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":16909104,"archive_hash":"sha256:038d7bcb0ac96b490ab2f97d1a4d06be5e0d1e07903fc40bcd17fdc487ab5cc9","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/323235cb-5286-42b0-85eb-d36eb388674a/","schema_version":"1.0.0"},{"id":"cid","name":"CID [Before: $7.50, Now: $6.38]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":22352,"archive_hash":"sha256:826b68d462541991755bf30491319ce46059185838f22098774171e897ccf25e","archive_url":"https://www.blendkit.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":"6.38","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.blendkit.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":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":70651,"archive_hash":"sha256:a3760b42bc393b1bc519ccfa93dc4a8cca340b48ba8cfe552b4f5aa3585d0722","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"0.2.1","type":"add-on","archive_size":1501,"archive_hash":"sha256:4a9e91da91039e184f87e65411130cef1f621b9d40d7ca0d30114e0f98c2966a","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/0462ad01-9d76-4cdf-80cd-d408df81b69d/","schema_version":"1.0.0"},{"id":"cleaner_ps","name":"Cleaner [Before: $7.50, Now: $6.38]","tagline":"FULL plan required - upgrade to download","version":"2.5.0","type":"add-on","archive_size":2818,"archive_hash":"sha256:ccc8d13da56ecca03a61b904561135e6197ccb5da32292cb20dcf5cd126ef2f1","archive_url":"https://www.blendkit.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":"6.38","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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":4360,"archive_hash":"sha256:983e222541b1c79a60e5d98c7d03667322ddbc60217caf299008f15d8829e8c8","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2346,"archive_hash":"sha256:4b0b1cc4ffc72ef8935b2158641226855e4bfb02f642cfe462350008fd5290ef","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/161371d5-eb46-4252-b994-b74517b6e336/","schema_version":"1.0.0"},{"id":"cloth_collision_visualizer","name":"Cloth Collision Visualizer [Before: $2.00, Now: $1.70]","tagline":"FULL plan required - upgrade to download","version":"4.0.0","type":"add-on","archive_size":5527,"archive_hash":"sha256:e7ac994e09d05b5a2ee7d642807dd031d24255af9574b55e384971bba6995f98","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/ac45edb8-1e56-4afd-a680-81169b2fddfc/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":"3DFIGURES rian","tags":["Cloth","Physics","collision","Viewport","simulation","visualizer","debugging","selfcollision","realtime"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/bd8326c9-879d-4e41-a462-12dcdb0ce6c3/","schema_version":"1.0.0"},{"id":"code_completer","name":"Code Completer [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":56500,"archive_hash":"sha256:4b79233d8c715d61e47af89c3737a56236e9240a46018c5dfce62d8046e85228","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/3b82d2d9-ce19-42fc-9b68-979061dbcef6/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":"Haseeb Ahmed","tags":["Blender","python","plugin","load","operator","Text","Editor","Essentials"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d0dd08e8-57ac-4fb3-85cd-f7c5e40f88b5/","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":"FULL plan required - upgrade to download","version":"3.4.1","type":"add-on","archive_size":2128,"archive_hash":"sha256:d749ef1fba32ceb555db5b35e7b7089b64632e253e2f00e2792bc8d07f0b16f7","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/aef8a90b-e532-4020-bda5-a0c62336b9f4/","schema_version":"1.0.0"},{"id":"collection_zones","name":"Collection Zones [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":47447,"archive_hash":"sha256:3b90e6f0b6311866ace35b299a5f8f1699e92dfc77a1eb167357b890981da4b4","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/efaae058-471b-43ec-bcf2-f18b94310c57/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":"5.0.0","maintainer":"Giorgi Samukashvili","tags":["collection","zones","sorting","layout","outliner","organization","automation","kitbashing","assist","hierarchy"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/4b723716-c093-494a-ae03-9fe0c49f4c10/","schema_version":"1.0.0"},{"id":"collision_director_pro","name":"Collision Director Pro [Before: $6.49, Now: $5.52]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":14838,"archive_hash":"sha256:d8af64aba17b04dd0d233bb67aea6ab39fbcd6fc90b8ea8027c9ac3859cbf2b6","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9424fb67-776b-4c97-b392-74d0c7e0ddb7/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.52","blender_version_min":"4.2.0","maintainer":"Steven Seidler","tags":["collision","gamedev"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/12025de8-850a-411d-a840-5ba053539670/","schema_version":"1.0.0"},{"id":"colormatrixel","name":"Colormatixel - Advanced Material & Color Management Add-On For Blender [Before: $2.99, Now: $2.54]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":166059,"archive_hash":"sha256:eda137854baf27d4e75648abde8dfae400aa0d03d16aa07482d587e8284cde36","archive_url":"https://www.blendkit.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":"2.54","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.blendkit.com/asset-gallery-detail/c31ef79f-2a05-41c6-9bad-963d95c51128/","schema_version":"1.0.0"},{"id":"compositor_mask","name":"Compositor Mask [Before: $3.00, Now: $2.55]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":3209,"archive_hash":"sha256:5c26e2e4fdd7fabebad3f5293d5c7a8ffdbf3b61ead6b59323a436ef08d79a1b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7acfb099-a2d4-4422-a939-7c6b723749d1/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":["Compositing","compositor_mask","mask","cryptomattee","layer_mask"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/ea16769d-5c28-4c21-ba68-26171929bd1c/","schema_version":"1.0.0"},{"id":"Cool_Addons_Menu","name":"Cool Addons Menu [Before: $2.99, Now: $2.54]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":18495,"archive_hash":"sha256:7df4cf79cda76ee6dda75c26877773126c7ed510aec208b723de88500a6d2adc","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":8831991,"archive_hash":"sha256:4852ac6c2dcea0e7e287f79628438b59fdc87a7c16f696386aae6ee215588d1c","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/2ea6e2ac-96c8-4579-b998-7c833227dacd/","schema_version":"1.0.0"},{"id":"cracks_pro","name":"\"Cracks\" Damage addon 💥Windows, Linux, Mac approved [Before: $14.95, Now: $12.71]","tagline":"FULL plan required - upgrade to download","version":"5.2.2","type":"add-on","archive_size":12392962,"archive_hash":"sha256:82a0ff40df509898f687d5b31524686432783ff976132a31f99937c2c4ae231d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/0f3aae67-2a39-47c0-82d6-a983945ed330/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.71","blender_version_min":"3.6.0","maintainer":"Mr Steve Lee","tags":["Damage","blender4","simulation","geometry","nodes","addon","2025","cracks","crack","modifier"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d303f488-d48d-407b-8615-ebf1a5e0883b/","schema_version":"1.0.0"},{"id":"creator_export_toolkit","name":"Creator Export Toolkit [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"0.1.2","type":"add-on","archive_size":5747,"archive_hash":"sha256:f9a8bbc437b9b66743679964f43f93af23e07f27bd870d7e84914c80437f3d7e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/ffdf2b59-8ec2-450e-92ee-d394c1c66f0a/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":"Yassine elyaakoub","tags":["blender","addon","export","fbx","glb","asset","cleanup","thumbnail","roblox","vrcha"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/702e4481-4b33-4588-a593-4c0b03241f33/","schema_version":"1.0.0"},{"id":"credit_manager_pro","name":"Credit Manager Pro [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":11780,"archive_hash":"sha256:bd8c24779461eba6babb5089b8d754b79ef3a0cf2c04b5131c4c2ade5adbea9c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1880,"archive_hash":"sha256:be9e467bd7b3356bc1235fa8bd1ef798760c5a9d194c620f901ec316e9ead34e","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.1.5","type":"add-on","archive_size":200094,"archive_hash":"sha256:fc3db31bb619eed9048c299878c280a657791860cf94987b4100278c652755bb","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/fe1be7d3-4283-4337-8f86-60268bb5e4ee/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","softbox"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":14282,"archive_hash":"sha256:66848a0091fb86b52516cb5c6ef7d8670998c5d2162957c806ff2c9ffdbd5209","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/3600d73e-4bb8-4742-888e-4cde99610da0/","schema_version":"1.0.0"},{"id":"dae_exporter","name":"DAE (Collada) Exporter (Blender 5.0+ Compatible) [Before: $7.00, Now: $5.95]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":395378,"archive_hash":"sha256:bbefa64d4240f963f3d2b743d1f67754414cad8fe1556e1923c49acc3621d353","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/926dc1f4-c0e3-4862-be23-6b7aa08040ee/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.0.0","maintainer":"The Smart King","tags":["3DView","sketchup","export","dae","collada"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/c2f30c32-8f22-422b-bbf4-7637b3b383d1/","schema_version":"1.0.0"},{"id":"dae_import","name":"DAE Importer for Blender 5.0+ (COLLADA Restore) [Before: $11.25, Now: $9.56]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":9801,"archive_hash":"sha256:d58e2539454969c9490afa8d38a90defef9a549863d38083b136bc9efc8aa246","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/569e678d-5a8c-45ad-80db-9f0cedfce5d2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"9.56","blender_version_min":"4.0.0","maintainer":"The Smart King","tags":["3DView","dae","dae_import","blender_dae_import","collada_import","dae_restore","sketchup_to_blender","dae_to_blender","dae_collada_import"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/92fb0bcc-f2d1-4c18-814c-1f2ef721526d/","schema_version":"1.0.0"},{"id":"daexport","name":"DaeXport | One-click DAE (Collada) export [Before: $10.99, Now: $9.34]","tagline":"FULL plan required - upgrade to download","version":"1.3.2","type":"add-on","archive_size":30036,"archive_hash":"sha256:7046dddcfa457e38907929879ebbe20a93b295f56527cf4cc6b78dc4c944c966","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.6.955","type":"add-on","archive_size":1246131,"archive_hash":"sha256:2da8052b74e032b9b06600a7c2af845c937dc9b9292ed2d2cf92818ca2b7362e","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":170084,"archive_hash":"sha256:400cfa84c860cbb746cac72d7693f651cc4c6a14d09032076b2ade2a7beb462c","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/e3dcfcad-3efa-468a-9f27-ddf695e12313/","schema_version":"1.0.0"},{"id":"dem_blender","name":"DEM Blender – Easy Animation [Before: $39.00, Now: $33.15]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":103506,"archive_hash":"sha256:8762d3865db1823a84159c18cbf2c74bff0bae077362a62bdb1baa1a632677f5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/326256ac-562b-49cd-9d67-ab40e2f7110e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"33.15","blender_version_min":"4.5.0","maintainer":"Giuliano Dasky","tags":["Animation","keyframes","Timeline","Motion","3D","Tools","Workflow","Layers","Spline","Object"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/1933a851-cf9f-49e0-854c-1489b3a1db6c/","schema_version":"1.0.0"},{"id":"dimensions_and_lines","name":"Dimensions and Lines [Before: $25.00, Now: $21.25]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":109377,"archive_hash":"sha256:4c240fa5d716732363b067c72696c334aca67f5f7885b4cc5ee326c2e231f9bb","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d7bbda8f-bcb3-446e-a7ef-f3ce6a2d7e4a/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.blendkit.com/asset-gallery-detail/a2846c5c-f395-4bfe-aaca-a53cc9ac6400/","schema_version":"1.0.0"},{"id":"dovetail_key","name":"Dovetail Key [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"1.13.2","type":"add-on","archive_size":8390,"archive_hash":"sha256:3d4a06e308392ccdffb9bfd0783b52521e6a3b979cea9c037c209c4ea722879d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/200aedb0-216f-4a30-afbb-1202ffc9d361/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":"Milad Kambari","tags":["Mesh","Modeling","3dprint","dovetail","joint"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/5329ff47-74d3-4db3-ad1b-a696e9849c0b/","schema_version":"1.0.0"},{"id":"drh_addons_audit","name":"DRH - Add-ons Audit [Before: $4.99, Now: $4.24]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":88690,"archive_hash":"sha256:b21fe34d058611bc6bc306323e46fb212b838033f0b44e3c86dd275aa25a6ad4","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/4dd9a00d-77f3-4832-a7ee-02a9e955c905/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":"Paco Salas","tags":["addons","audit","snapshot","reporting","maintenance","packaging","troubleshooting","extensions","pipeline"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/4436e85f-073d-4eb2-8271-d58648303a3f/","schema_version":"1.0.0"},{"id":"drh_color_ramp_studio","name":"DRH - Color Ramp Studio [Before: $9.99, Now: $8.49]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":148730,"archive_hash":"sha256:3a823a0772546fb37338b3606861828c10ac53857986a68b717ce4c426c08660","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/26d3b56d-f2ac-402b-9b5b-ccb8515597dc/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":"Paco Salas","tags":["colorramp","gradient","palette","nodes","shader","geometrynodes","compositor","workflow","utility","ramp"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/45ca1690-0ca4-4265-8a35-8b0d69f5dbb6/","schema_version":"1.0.0"},{"id":"drh_dual_units","name":"DRH - Dual Units [Before: $4.99, Now: $4.24]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":38935,"archive_hash":"sha256:7ddf08c4bb6c857cb5c4711bdf8f9b2207ac7b9bbd03c6324f08b911db421896","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/4b229646-35a8-4447-a72b-829ae5ba0fd0/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":"Paco Salas","tags":["3DView","Updated","Tags","units","transform","npanel","measurement","metric","imperial","dimensions"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/4c29e51b-2fc4-4b44-86f4-20139299b434/","schema_version":"1.0.0"},{"id":"lorenzofranciosi_droplets_gen","name":"Droplets GENERATOR [Before: $2.00, Now: $1.70]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":5318931,"archive_hash":"sha256:11bfc221585d101bb52e1b4918ddc8535575fd95fec7ccc2d74a5c50541d197c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/98cbe92d-132c-4dc9-8dbb-d64596f4dff4/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":"5.0.0","blender_version_max":"5.9.0","maintainer":"Lorenzo Franciosi","tags":["GeometryNodes","Object","FX","Drops","Droplets","Wet","Water"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/b242f91c-884f-4a7f-901c-20373ed1910a/","schema_version":"1.0.0"},{"id":"dxf_import_export","name":"DXF Import Export [Before: $19.00, Now: $16.15]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":16203551,"archive_hash":"sha256:fd478752118247bca42a485638370ccb1e259bc7a3a0adb3950c43c7cfbe49cb","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.1.0","type":"add-on","archive_size":12768,"archive_hash":"sha256:c0c6990da08608037f8305dccf3d37f9e1ff8f01c20aab699ba3907a171f59cc","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"0.8.0","type":"add-on","archive_size":75988305,"archive_hash":"sha256:213ba1a25aeb6e3e4cd54127a73b6cac17ec6bcf64f717f20bb0d69ad993514c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":23263,"archive_hash":"sha256:6d80600a51aabfd83df414de15917846092dd8fc182ef727a35f702c167ec8ab","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/7c379e9e-95f2-4b1e-8eab-90739fd1e70e/","schema_version":"1.0.0"},{"id":"easy_batch_render","name":"Easy Batch Render [Before: $3.00, Now: $2.55]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":6875,"archive_hash":"sha256:15e7ff505530560cfdb9177046e0d8473413f8a80777e46f4ff50bcbc6ad0142","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/a426042c-2fcd-4829-a53e-7527987b17fd/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":"Vaishakh Vinod","tags":["Render","Pipeline","Workflow","Batch","Automation"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/03b93d66-510b-441b-a0d3-14b5935f5e32/","schema_version":"1.0.0"},{"id":"easycameramatcher","name":"Easy Camera Matcher [Before: $12.50, Now: $10.62]","tagline":"FULL plan required - upgrade to download","version":"2.1.0","type":"add-on","archive_size":505906,"archive_hash":"sha256:ec28a2e76724965042c0ad063bb79d9e9d9215bc73b2dda63497f6dcf1b71cdb","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f0a38b54-e9ee-4f98-b103-905e5391cf07/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.62","blender_version_min":"4.3.0","maintainer":"Sander Wit","tags":["Camera","Matching","Lens","Calibration","Perspective","Tracking","VFX","fSpy","plotter","plotting"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/70090236-772f-4576-8a24-187a2ff3f31e/","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":"FULL plan required - upgrade to download","version":"1.6.5","type":"add-on","archive_size":4309,"archive_hash":"sha256:e95b13538c5906c23d4b616b6ca757cc7e29e14c6a57827fbc45406c7674d770","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2083,"archive_hash":"sha256:b0b2cc453e1195bb49f617e39b0d21193dc6c597cdcc367fc49424d4e09663a0","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":13668,"archive_hash":"sha256:9f7ecbf98f690f5571627cb80f8794210b6606ed20686f821a21946cc9c25c6f","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.3.1","type":"add-on","archive_size":18012,"archive_hash":"sha256:7d3157c242859fc7aee71d91adfbf03207020ebf8be4c43f3a001425e088edc6","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1464,"archive_hash":"sha256:791964a72a51067d429f9b17bb6287798ba5012e966f7ebb1234f14558fbfcee","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":42799,"archive_hash":"sha256:9d76e27ff1a5f5b160780a537af067d4661418258e7ef20065e141b259f552d0","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/0f34a339-e478-4d6c-b328-9be1daa65f67/","schema_version":"1.0.0"},{"id":"essential_tools","name":"Essential Tools - Ultimate Blender Workflow Utility Addon [Before: $4.00, Now: $3.40]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":8386,"archive_hash":"sha256:82f74b1ca38610307c632f973a30b46d1b657debd85c64db871d01b69c98ad74","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/56c9a4f9-8a62-420b-9434-90fe387ae942/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":"3.0.0","maintainer":"The Smart King","tags":["Mesh","blender","blender","workflow","batch","booster","origin","essential","batchrename"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/80aefc7f-9502-4e57-8cb9-6a3e3ec089f3/","schema_version":"1.0.0"},{"id":"export_director_pro","name":"Export Director Pro [Before: $6.49, Now: $5.52]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":25356,"archive_hash":"sha256:e644eb8adff6b35fda1e89c2cb8b463ce4f1b7d0cbfab0714b807a28330f3191","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c119ec48-fb8f-4a72-b864-73d847628183/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.52","blender_version_min":"4.2.0","maintainer":"Steven Seidler","tags":["export","gamedev"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/35d745dc-cf9d-4d51-8be3-139c69351042/","schema_version":"1.0.0"},{"id":"export_each","name":"Export Each - Batch Export Collections / Object with One Click [Before: $9.00, Now: $7.65]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":13844,"archive_hash":"sha256:39cd568a69a765b3962796e66f0491d700db90cb5542570084e69568e8df2ed5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/873e9048-1759-4fb3-9653-42a025deface/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":["Pipeline","AssetManagement"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/f2dc078b-d6ac-4cb3-a750-4d6c1a834ac9/","schema_version":"1.0.0"},{"id":"face_layers","name":"Face Layers v1.5 Add-on [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":45390,"archive_hash":"sha256:501b57c7dd8cd9549b3d93cce966fbc3effccec925b75e19168274c8bb0ef088","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/8996ef60-23df-44c7-98f0-7161c54ba379/","schema_version":"1.0.0"},{"id":"face_swapper","name":"Face Swapper 2.0 [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":6571,"archive_hash":"sha256:630a58f6b0aaceb22b647de1997b13ab887c3dfb98b2e4e826f6846c5301e3a2","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/07d93e51-07e9-4499-a432-0cec88ec9bc4/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.0.0","maintainer":"Georges Dahdouh","tags":["Animation","Material","2D","image","texture","keyframing","character","expressions","facial","face"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/16562180-0830-4138-9d70-a9db074c493e/","schema_version":"1.0.0"},{"id":"facial_tools","name":"Facial Tools [Before: $10.50, Now: $8.92]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":1655706,"archive_hash":"sha256:154d3764584593e419e06789e9a7aee4a9916a83c3d65e2469fb4387cc3cf682","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/eb138716-7e6b-4545-9045-768caa5c7aad/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":"5.0.0","maintainer":"Stellart","tags":["facialrig","autorig","animation","facial","rig","rigging","rigger","export","bind","preset"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0c790066-7eb7-477a-80d9-1296f8fd3ca0/","schema_version":"1.0.0"},{"id":"falcon_cam","name":"Falconcam [Before: $8.98, Now: $7.63]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1022399,"archive_hash":"sha256:5d655a371dba853226c36680e7e9b15f917bb4c2f8e223138cf8c7502911dab1","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.8.0","type":"add-on","archive_size":29599,"archive_hash":"sha256:53c1f5ca9ea2f7f7c17a8ab85d9710eef21ca451825f56e06f9055fbaa0b5047","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":646630,"archive_hash":"sha256:e8383b08b908f263d0aae7acda685acf991ceeeb65d65682b9f9bae7147ddd3f","archive_url":"https://www.blendkit.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":"Blendkit Community","tags":["System"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2888,"archive_hash":"sha256:2f2384e5a2f3c1f45829c43df6cff9b34d9867f0de677b5f9f1b972f03d62376","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/7cd259e6-5a4c-485d-8095-da2d56c56e79/","schema_version":"1.0.0"},{"id":"fire_maze","name":"FireMaze [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"3.3.0","type":"add-on","archive_size":119891,"archive_hash":"sha256:e71f6535f3a51ab8062baf61d043ec91cff7481eecdadde838f34bbc96dc4da1","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f1a5d42c-86f2-483e-a4ee-86bb1f90da5f/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":"FireRat","tags":["Maze"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/195283e4-b066-4d52-a01d-d6bcd5d0d097/","schema_version":"1.0.0"},{"id":"fixamo2","name":"FIXAMO 2 - Combine , Loop, Create [Before: $9.00, Now: $7.65]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":5033,"archive_hash":"sha256:1d3192b6ac527e5ee2a86dc7fd938e0e370b786cca2d492cce507a2a437ede5f","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/0f4fd714-0c97-401f-bcea-bbb42ab9fbdd/","schema_version":"1.0.0"},{"id":"FlowProManager","name":"Flow5 - The Ultimate Asset Tool [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"5.0.0","type":"add-on","archive_size":25884218,"archive_hash":"sha256:bb89d1998a97e7ccbdfc79a045ea7ea86e6e9ff328b27d7a79aecc69ae24153f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/266f9e83-b74b-4242-940a-b446bc513f2e/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.3.0","maintainer":"polyspaace","tags":["assets","flow","workflow","scatter","asset_browser","asset_library","polyspaace"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/542f1515-6422-4da3-bf4d-05803f890e1b/","schema_version":"1.0.0"},{"id":"fog_planes","name":"Fog Planes Addon [Before: $35.00, Now: $29.75]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":198697240,"archive_hash":"sha256:8fa4132df3fd070aa5a3b58a8a0aebca811315a8f0da5a22ff106619780c79bb","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":44112,"archive_hash":"sha256:62071024eaa41b615793d482d62813f100c2a2a54271fac6db7891c0f06eca11","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/105400e9-bac4-46d4-8c08-616dbf54f334/","schema_version":"1.0.0"},{"id":"frosting","name":"Frosting [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":44908,"archive_hash":"sha256:bb914e82bc2228ef36e862e437aa40eb83d4b6ecdc68c6fe6a1176dd64e9c090","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/3f1186c6-6dde-4a5b-9f62-c562e605bbfa/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","blender_version_max":"5.2.0","maintainer":"Cloudy Sky","tags":["physics","scatter","simulation"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/14c8c8d0-a3f4-402d-8e7f-97df5aab476c/","schema_version":"1.0.0"},{"id":"fsx3d_blueprint_tool","name":"FSX3D Blueprint Tool [Before: $18.99, Now: $16.14]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":465117,"archive_hash":"sha256:2a70844d12b9de6ae5803f535ee2c77935a67e33df14d59bee1b6732f0e6fa36","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7e4a7a85-7dc8-4ce0-a149-6217dc659b4b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.14","blender_version_min":"4.2.0","maintainer":"Eric Bauduin","tags":["Blender","Blueprint","Vehicle","Car","Modeling","UV","Mapping","Game","Low","Poly"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/152e3275-74ed-44dc-aa4e-6eac6d7be8ac/","schema_version":"1.0.0"},{"id":"fusion","name":"Fusion: Extension For Blender [Before: $59.99, Now: $50.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":24640,"archive_hash":"sha256:57beb6af17e7d10f8331d39e8e75b7f678cdd182ae0342d628c24e483e8b1d26","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/598e9407-781e-4079-9ff6-7643b2ba0d1a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"50.99","blender_version_min":"5.0.0","maintainer":"Egret Studios","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a812dae2-08e7-47f6-b981-878077f5780c/","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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":3828,"archive_hash":"sha256:8f4e5c94a8adf3ee9e104b3030c60f797f7d7365d767cbec08f8e56496b830de","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/0da4c36f-dcc9-49f3-a916-97dcfe1f9765/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.4.0","blender_version_max":"5.9.9","maintainer":"F.Z Studio","tags":["Material","Management","Texture","Import","Viewport","Shading","PBR","Workflow","Shader","Tools"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"2.3.0","type":"add-on","archive_size":5658312,"archive_hash":"sha256:373a4e01e4a65587a73ad699e43663a1d6ee511947f364f3a4a5042d173f6d60","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"0.0.5","type":"add-on","archive_size":192462,"archive_hash":"sha256:3d43e5fd646576f31643e616c0712c5d227d7ad38a3902df011f1c68fc104748","archive_url":"https://www.blendkit.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":"Lorenz Wieseke","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.3.2","type":"add-on","archive_size":29212,"archive_hash":"sha256:1740ab04111b0aeb6289e20e8e2e1d2bc65605640aa6a5df2305e6f5f42f8818","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/4b653b4f-5424-4cb1-9ed5-0067daafe581/","schema_version":"1.0.0"},{"id":"anime_shader_studio","name":"GOE Anime Shader Studio [Before: $19.99, Now: $16.99]","tagline":"FULL plan required - upgrade to download","version":"3.3.1","type":"add-on","archive_size":2235826,"archive_hash":"sha256:2b01c90a83c694134090684c555be3334bbab3fac03ed7b85ccd5254ad40193e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/b46b4ae5-c5b8-4969-ba08-0533f25f8f83/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.1.0","blender_version_max":"5.9.0","maintainer":"DanilGoE Goe","tags":["Mesh","Modeling","anime","toon","shader","cel","shading","manga","shader","materials"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/33aa65d8-331c-4c98-a5af-7ae7f379660d/","schema_version":"1.0.0"},{"id":"body_type_generator_pro","name":"GOE Body Type Generator Pro [Before: $29.99, Now: $25.49]","tagline":"FULL plan required - upgrade to download","version":"3.0.3","type":"add-on","archive_size":79093,"archive_hash":"sha256:cab65c3f09bfcba0663c70b8e895f6466223784ceb69d3cf48ef4ec9f46b61f0","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f6978ebf-7532-49de-9426-3b60a9ee2368/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.0.0","maintainer":"DanilGoE Goe","tags":["Mesh","Rigging","Animation","body","generator","character","creator","shape","keys","body"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a9f4f3d2-e0a9-407b-ae2b-985ac28ff7e7/","schema_version":"1.0.0"},{"id":"goe_jiggle_studio_adult","name":"GOE Jiggle Studio: Body Physics [Before: $19.99, Now: $16.99]","tagline":"FULL plan required - upgrade to download","version":"1.1.1","type":"add-on","archive_size":38237,"archive_hash":"sha256:18cfb23987127959a342b242a8d56b6582382c3bd8f1d544510e2dba7ec11d3b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/81192bdf-5d33-48f3-a4aa-cc7107d1d43d/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":"3.6.0","maintainer":"DanilGoE Goe","tags":["Animation","Rigging","jiggle","physics","soft","body","cloth","simulation","secondary","motion"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/f1ed260b-ec35-42a6-99a7-f8a9efa86c75/","schema_version":"1.0.0"},{"id":"portfolio_creator_pro","name":"GOE Portfolio Creator Pro [Before: $39.99, Now: $33.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":60393,"archive_hash":"sha256:f1aab33d72a97e645f795c499f3a958e3f719e97434c4832d6a1460e4f44805a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c00cdd22-6755-4c81-be38-8a557210cc60/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"33.99","blender_version_min":"4.2.0","maintainer":"DanilGoE Goe","tags":["Render","Camera","Lighting","portfolio","render","automation","studio","lighting","turntable"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/9fa7c636-5276-4fad-8324-9fa437ba47b5/","schema_version":"1.0.0"},{"id":"shapekey_doctor_pro","name":"GOE Shape Key Doctor Pro [Before: $19.99, Now: $16.99]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":24098,"archive_hash":"sha256:ecc8d24acb316b900bb12628d30396176d1b8d5b003c7b238aa7ea408e95690f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f3fb4af2-e4d4-4aec-b49d-53c2270b6435/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":"3.2.0","maintainer":"DanilGoE Goe","tags":["Mesh","Rigging","shape","keys","blendshapes","morph","targets","repair","transfer","mirror"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a7712c16-600c-4165-ad9e-63a165be51e8/","schema_version":"1.0.0"},{"id":"graphi","name":"Graphi [Before: $9.99, Now: $8.49]","tagline":"FULL plan required - upgrade to download","version":"1.0.3","type":"add-on","archive_size":13816,"archive_hash":"sha256:3255ac67672bd68ef09dd22a1d0e67e1c55402a27c1c4710feb4569a0c1eae3f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/86af64b7-5820-47bd-af13-df1464479124/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":"AHMED KETTUR","tags":["Animation","GraphEditor","Keyframes"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0b94a38b-1ad9-4c9d-888c-96ab43ed6a44/","schema_version":"1.0.0"},{"id":"Greaseliner","name":"Greaseliner [Before: $23.00, Now: $19.55]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":3377084,"archive_hash":"sha256:5f33f69cfe2fc7749e205abd4e84c7f46010d927f32c040763d566f6baa2bd94","archive_url":"https://www.blendkit.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":"19.55","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.blendkit.com/asset-gallery-detail/1cc36d5a-82e3-48d4-a195-abc5d9f9549c/","schema_version":"1.0.0"},{"id":"Hatchliner","name":"Hatchliner [Before: $16.00, Now: $13.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":53789715,"archive_hash":"sha256:cb1cb3557c12f856e99e7b7b53de9c99d25327e720c24b4dd01c6f6fcedcf9eb","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/a4542fa7-ded6-40b8-90b9-aea923676312/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":"5.1.0","maintainer":"Kito Studio","tags":["anime","hatching","style","npr","cellshading","preset","EEVEE","material","shader","node"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e9c5c7f5-ccea-48b1-8b86-eb8c9b549b3c/","schema_version":"1.0.0"},{"id":"hedge_it","name":"Hedge It! [Before: $7.99, Now: $6.79]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":11478819,"archive_hash":"sha256:e0c9a2a1686e7af794326772826984fc49997f9118bef2ad29df7fd58e804004","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.5","type":"add-on","archive_size":4247,"archive_hash":"sha256:13a22d85fcf61dee646bd011d7a99878667070cdb7b9e8137ad70eed2c9c3fa3","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3256,"archive_hash":"sha256:a5f443eae0fbcea81787b8237618c0a73b6e8678578c8a81ac4fc9d0b4b30e5c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":50182,"archive_hash":"sha256:a9b6ccf44294677f275adb4b504e9f562b1bf17eeb2fca48a799967ce6685ffe","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/7e838867-0ce1-4f38-9081-037c097fc723/","schema_version":"1.0.0"},{"id":"house_designer_AL","name":"House Designer (AL) — Procedural Building Generator. [Before: $4.99, Now: $4.24]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":22654,"archive_hash":"sha256:3a2f1b99a80ee5f03c4ff1e67f39eb9b6cb98ce82e3c4dd0fd6b8638fcc4d6b8","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/01d0a001-2345-4b4a-bf7f-0f929874ca42/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.0.0","maintainer":"ANDRIY LIA$HKEVI$H","tags":["architecture","procedural","facade","urban","geometry_nodes","building_generator","city_builder"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/aa8829b7-2059-4fe0-9f5a-468318daed3a/","schema_version":"1.0.0"},{"id":"hud_and_ui_elements","name":"HUD & UI Elements [Before: $18.98, Now: $16.13]","tagline":"FULL plan required - upgrade to download","version":"1.16.3","type":"add-on","archive_size":3054185,"archive_hash":"sha256:bc9b4cba6292a78bd51ab4d4c3b4fc2003d9a4300ac00259c960c71aed467526","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/11422bca-41d3-401c-9d50-59d2af96f91e/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":"2.81.0","maintainer":"N. Emmanuel","tags":["huduielements","hud","ui","fui","motion","design","Animation","Modeling","Mesh","AddMesh"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.6.0","type":"add-on","archive_size":7498,"archive_hash":"sha256:195787a0aeb3237fa8ca14a73aded6c12d329b3f8c88318b7b2ba458209d8048","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":78889498,"archive_hash":"sha256:bfdd9d71934e2fe77fe67245976ddf895aaee05f7618db9c0ef952486180cf48","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.3","type":"add-on","archive_size":6737,"archive_hash":"sha256:60c50ea7c6ca171a5c0c2e5fa70591b5e1436b9e9bf367133fa0d07ede30c2be","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f5a633f4-559b-45d3-82ca-4e152c6c74f3/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.blendkit.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":"FULL plan required - upgrade to download","version":"2.2.3","type":"add-on","archive_size":125029,"archive_hash":"sha256:0ee941a43e27b95d0ae41d9f179c7b00bcf497c125392ef604e27bfd752c9d93","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.5","type":"add-on","archive_size":28952230,"archive_hash":"sha256:300b3ba9f8e40ef93c7e0a4b4d15e26589ba566eabfd2914ff8b2f183b84f7b5","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":16383,"archive_hash":"sha256:edeade332c49b82882fb46ea8e42656c6765df317b574b0261fcdf852f72ee7d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/1f35b35f-1f45-4437-8161-b0971400eb9d/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.0.0","maintainer":"RUIDO VFX","tags":["Animation","Decimator","VFX","Keyframe","addon","optimize"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":36340,"archive_hash":"sha256:57ae3b0b9dbee06ac3ecbbd630beb3065e95862f0f4d5966176aad01895d0f38","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":21438,"archive_hash":"sha256:e498afbddd68d78eb73b0b4cbf95ab07db05d99d15f3f78daa81600fabf144bd","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/39505adc-0694-4efe-a77f-d982d53bfb5e/","schema_version":"1.0.0"},{"id":"daexport_legacy","name":"Legacy DAE Export for Blender 5 [Before: $7.00, Now: $5.95]","tagline":"FULL plan required - upgrade to download","version":"2.0.1","type":"add-on","archive_size":29090,"archive_hash":"sha256:8e40598f64128c7336754ba29bb2c3ff9515b9406cdf2b75f3c04cce253c95f2","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7f96c5ae-1312-417b-9d3a-7cf33641616a/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":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/9253938a-d7de-4892-9831-832c2697e4f6/","schema_version":"1.0.0"},{"id":"letter_board_text_creator","name":"Letter board - Text creator [Before: $2.00, Now: $1.70]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":562941,"archive_hash":"sha256:8c12f39662866981da9dc9ec4b06b2e680ec069a62ba71f112d365a259838a59","archive_url":"https://www.blendkit.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":"1.70","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.blendkit.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":"FULL plan required - upgrade to download","version":"1.4.22","type":"add-on","archive_size":22743109,"archive_hash":"sha256:f8aff9c92a1a5e06f06b57afd968f233c7302c95c6badf6df3ac581edb0c1faf","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/9ecb49b0-9be7-4b4c-8fd8-901bf7c8e655/","schema_version":"1.0.0"},{"id":"light_painter","name":"Light Painter [Before: $45.00, Now: $38.25]","tagline":"FULL plan required - upgrade to download","version":"1.1.1","type":"add-on","archive_size":149404,"archive_hash":"sha256:49578f00c20b4263adfd81ee3f7032d3b682d8847f3d6a6d632688861c351d67","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/69119226-0d05-4ef8-a088-3a7b1d7ab106/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":"3.6.0","maintainer":"ShaderError","tags":["lighting","Light","painting","light","texture","gobo","viewport","shadows"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/454164f1-182f-419f-ac8f-3139b1eea769/","schema_version":"1.0.0"},{"id":"livecut","name":"Live Cut [Before: $12.00, Now: $10.20]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5961,"archive_hash":"sha256:344e826b17c18f8c85f0d608ce004b5c60f464767415f9fc8452da5de19b760c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/6ddbe436-5f33-4f2f-ad73-145f4be40360/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":["Modeling","Mesh","addon","cut","slice","window","door","frame","slicer"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/fd172489-a974-4246-a792-81d1360074f4/","schema_version":"1.0.0"},{"id":"lm_studio_pro","name":"LM Studio Gobos & Volumetrics [Before: $9.50, Now: $8.08]","tagline":"FULL plan required - upgrade to download","version":"1.0.8","type":"add-on","archive_size":267095919,"archive_hash":"sha256:2a52ce50df73acc701de918a4f649090e986b6a0531a9047f1d7c6a4574a39c2","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9d80283e-a2b7-4ff9-acda-08222fcd7425/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.08","blender_version_min":"4.0.0","maintainer":"Mr Steve Lee","tags":["Lighting","fog","volumetrics","2026","addon","blender"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/14c5daee-5691-4c63-8bea-789b5e47113d/","schema_version":"1.0.0"},{"id":"skava_lod_generator_pro","name":"LOD Generator Pro - Ultimate Edition [Before: $9.99, Now: $8.49]","tagline":"FULL plan required - upgrade to download","version":"3.2.6","type":"add-on","archive_size":29745,"archive_hash":"sha256:6610b853ed8672ec051da8fa260e7e37a278bc735d0b71253353999ba0f3d15d","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/d87d6532-edea-4ee0-a90a-37bf7390f8b1/","schema_version":"1.0.0"},{"id":"lod_generator_v2","name":"LOD GENERATOR v2.0 [Before: $29.99, Now: $25.49]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":12591,"archive_hash":"sha256:56aeba95403754a8088bdf67a6a9d69853fa45c7f4196223484839812035f91f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/5b53c74b-5c5b-4fd8-97fc-f3c72c049307/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":"Pradeep Prasad","tags":["Mesh","Asset","GameEngine","optimize","gamedev","lods"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e6b9b8df-2eda-470b-b4df-fb747a57a81a/","schema_version":"1.0.0"},{"id":"lottie_addon","name":"Lottie Animation Addon [Before: $30.00, Now: $25.50]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":68472,"archive_hash":"sha256:7a61a0f782303f92384b3076efa073b4f03e2464569b943afb70a4882a7f3c45","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":134264,"archive_hash":"sha256:5993304df2b155c02d92eced383dff07dd63bb70e98976f1cbffd5045b4faf8d","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":7584,"archive_hash":"sha256:07fd66208c0c388f9923f42b5832915dae0591b2891eb914f4fb47e705ebd981","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":4801,"archive_hash":"sha256:ab2c85d1afff16262e29102956fa13f0e63e25c1500fa82428e665497896e2b7","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/5e190400-1471-4118-99ea-079be8ee661f/","schema_version":"1.0.0"},{"id":"flat_pallete","name":"Material Colors to Texture atlas [Before: $3.00, Now: $2.55]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2994,"archive_hash":"sha256:f752b1c38cd58ffa9d90fcb6dd273fe8e42283cef1dd1d0a97ef27404ac95437","archive_url":"https://www.blendkit.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":"2.55","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.blendkit.com/asset-gallery-detail/4d46d04a-0269-4c0c-bb78-6b4abb84903e/","schema_version":"1.0.0"},{"id":"material_overrider_plus","name":"Material Overrider + [Before: $2.00, Now: $1.70]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3357,"archive_hash":"sha256:e2d67029d11cce5015292769e3e51198c442b955e0d127c0c4d74714ea1e4f30","archive_url":"https://www.blendkit.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":"1.70","blender_version_min":"4.2.0","maintainer":"Brahim Houari","tags":["override","materialoverride","overrider"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.3.2","type":"add-on","archive_size":339989,"archive_hash":"sha256:ed9347567f8cf94a3ac11d725ba55f232bf95ee81d3c3024e69717b332073b75","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3814,"archive_hash":"sha256:0ffd38163d6d70c4d9fbbc3d36e20198feb94c1f714472fc8f6854efdacfddb1","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.3","type":"add-on","archive_size":11376,"archive_hash":"sha256:866db1a3dac81c24001d92f72e3b93ccc15b5046d884e9cf061ca159106ba813","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":926239,"archive_hash":"sha256:39113a92d620c5a9ad82b6cbb24fc5697dfba4c3ba27ec8c19c494e457533916","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2604916,"archive_hash":"sha256:f3b563325e1ac70edc9f632110771fddacc6aaf5b414e107359850a4bf0430a1","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/81704036-143d-48a5-baca-bd4906793518/","schema_version":"1.0.0"},{"id":"matshelf","name":"Matshelf [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":11310,"archive_hash":"sha256:81977af395ab78eeb2bc66fd792093185942ecc6455efd020f25624240c54e28","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/362e0982-ca77-4e9e-a5f8-ac2ca3dce9fe/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":"Haseeb Ahmed","tags":["MatShelf","Shader","organize","Material","browse","search","2d"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/483bcc37-4187-4810-92c1-4b24c90e1585/","schema_version":"1.0.0"},{"id":"meeting_room","name":"Meeting Room [Before: $12.00, Now: $10.20]","tagline":"FULL plan required - upgrade to download","version":"2.3.7","type":"add-on","archive_size":227745137,"archive_hash":"sha256:af2f30607909bdebabb46371a0407b1dcccf5f73add016d87ccb9f1da9d59b32","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.4.0","type":"add-on","archive_size":217644,"archive_hash":"sha256:95e279244505ba2f335f42205dad6cd6770701f7b6c9619d9bc9d1a10d29bf7c","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/0a231655-c32c-4025-a718-582af4e25c5a/","schema_version":"1.0.0"},{"id":"microstox","name":"🚀MicrostoX | Smart Exporter for Contributor [Before: $11.00, Now: $9.35]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":34254,"archive_hash":"sha256:7a00508838cdc8704e6d71169ff3b95c1e4db8729382776a230f681e3c8ee6d6","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/6ce4681b-6b98-4bad-b076-9b45a3e0b38d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"9.35","blender_version_min":"4.0.0","maintainer":"budijozz semangat pagi","tags":["Export"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/3dfe7d5c-b064-404a-9b1b-abba03b33642/","schema_version":"1.0.0"},{"id":"migration_manager","name":"Migration Manager: Your Workspace, Everywhere. [Before: $5.99, Now: $5.09]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":4548,"archive_hash":"sha256:abcec391e80b360e7c3f2af380df302c528846c41be372769ac45de3b274c811","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/80568778-1bf1-4e25-ac41-1fffebaec520/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.09","blender_version_min":"4.2.0","maintainer":"Hey Arnold","tags":["System","export","import","ui","migrate","workspace","themes"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/33dd26c1-228a-4854-b33c-3100c1d95211/","schema_version":"1.0.0"},{"id":"mk_roughness_browser","name":"MK Roughness Builder [Before: $12.00, Now: $10.20]","tagline":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":4728852238,"archive_hash":"sha256:65e6ebe517087fb30c77916635504d8d6a5660ed44e557015a098cd0b197c5d8","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/94002b05-96be-4954-a0a3-e8333ad7a681/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":["Material","3DView"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/85333172-af22-4158-9f1d-eaf25a971fb0/","schema_version":"1.0.0"},{"id":"blenquick_mocap_lite","name":"Mocap Lite [Before: $12.30, Now: $10.46]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":286687930,"archive_hash":"sha256:11767f1a1a56829ac080a760db0162deffdb17eb61aa5cc9ec8a995018123dc5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/58617425-e908-469d-8527-38afe9aaac86/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.46","blender_version_min":"4.5.0","maintainer":"Stellart","tags":["mocap","motioncapture","face","capture","motion","lite","basic","animation","3d"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/851c73c9-c226-4f1e-a4fd-d10eb0bdcae1/","schema_version":"1.0.0"},{"id":"blenquick_mocap_pro","name":"Mocap Pro [Before: $24.70, Now: $21.00]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":139514705,"archive_hash":"sha256:853fe025d14a5a4e0b3a42866a099e4ac7ff74bafd9f11da7778938042ad7573","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/a0e33e40-fad5-436a-89c3-65b615d2b8b8/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"21.00","blender_version_min":"4.5.0","maintainer":"Stellart","tags":["advanced","mapping","mocap","retargeting","rig","live","face","capture","motion"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.2","type":"add-on","archive_size":16067,"archive_hash":"sha256:ccf1b84a9617e8d52b84659ff9c74f8499d636586f9cda4924ca421f0a3537ed","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":92368,"archive_hash":"sha256:4c10ee77ba44e0fb663fbf160c590eb9d930f10f50e02518781bddada90b3356","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/8f6686ab-238a-4a6e-8c33-1d0cf3ad96bf/","schema_version":"1.0.0"},{"id":"modular_medieval_house_creator","name":"Modular Medieval House Creator [Before: $9.99, Now: $8.49]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1040719091,"archive_hash":"sha256:7dba7c4115ce7064edc349fb697a4906271a79cc559344cf28aeb09f74eb6a6f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9a296711-2409-4b38-b028-2af93cac33b6/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":["architecture","buildings","environment","exterior","fantasy","interior","kitbash","medieval","modular","Village"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/240b303e-4368-4e45-9ae8-9cbdbd2e477e/","schema_version":"1.0.0"},{"id":"modular_suburban_house_creator","name":"Modular Suburban House Creator [Before: $9.99, Now: $8.49]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1100698310,"archive_hash":"sha256:1ee9250c031f1b4333afa6ad3882ccb08f352bb8bd61826fbed32093f76ebb12","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1617645,"archive_hash":"sha256:9e8f0487fb6d1df9beee2a0e987d36e5d264a55c776ff74897bf0e146a709097","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"3.1.0","type":"add-on","archive_size":325988,"archive_hash":"sha256:1d85fca4bdcb5cf8b3f4198d5cecb0fe454a0c36b3b1c1613cb006d1892dbe21","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":3056,"archive_hash":"sha256:afa36cab047702f58a04708ae2529774106f2b0323de434aa126070b7e82af80","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":20029,"archive_hash":"sha256:422408ca88216e626bcf0aa425de73ddcb0b34f5da08afc29464406724f20a1d","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/21b72c0a-b02d-4a8f-8aa9-3ada5908538f/","schema_version":"1.0.0"},{"id":"multi_mat_baker","name":"Multi-Mat Baker - Bake Multiple Materials into One PBR Texture Set in One Click [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":21297,"archive_hash":"sha256:bf89bdee36ce70c86813b2f4e2cb52bacd0478f16fbd234201a734286ca1d081","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/8feae2cf-72cd-413c-a7fc-889cb4fb46dc/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":"3.0.0","maintainer":"Junaid Alam","tags":["Baking","Material","UV","GameEngine","Texture"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2124f634-f2e2-4f4e-8bc8-320673cff0bf/","schema_version":"1.0.0"},{"id":"multixport_pro","name":"MultiXport Pro [Before: $14.99, Now: $12.74]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":30134,"archive_hash":"sha256:c9a47b80240933e964cb542724e119d7ba371083048bbacf74f72df8535e8571","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":51509952,"archive_hash":"sha256:4198442c63c083ec27ece9a06ff9917783286565ca617314d6bd058c43a06ef0","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/29e22ab7-79b3-4733-b3db-7b0e2b9920dc/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":"5.1.1","maintainer":"Giambattista Von Nettesheim","tags":["Mesh","Object","Modeling","Sculpt","import","export","remesh","retopology","remeshing","mesh"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d4ca1fc2-a0e8-4ccf-bc6e-076b26d09e7b/","schema_version":"1.0.0"},{"id":"name_your_things","name":"NAME YOUR THINGS [Before: $8.00, Now: $6.80]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":8465,"archive_hash":"sha256:3657a86a882dea913494ab0bf397a97435663d4bdebd4ad8a5a0367a44c5b9f8","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/b4d3d12f-6d51-4a3c-8b65-e796bfe1f011/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.0.0","maintainer":"ImNoah","tags":["naming","mesh","clean","cleanup","namer","name","organise","things"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/295ca03c-0ff2-4209-8cb4-885a8614f4b1/","schema_version":"1.0.0"},{"id":"neural_upscaler_x4","name":"Neural Upscaler X4 [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"3.1.0","type":"add-on","archive_size":3652555628,"archive_hash":"sha256:333631ea85fb768eaa46f19418329e052599e5b678727eb4199638c4efc98e28","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/01d335b6-82ae-40e4-985a-5a758b6d8ecc/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":"5.0.0","maintainer":"Cloudy Sky","tags":["AI","tool","4K","Upscale","x4"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/ee306f1d-b7f4-4e8e-8e0d-86e8777c3af0/","schema_version":"1.0.0"},{"id":"ngone_pro","name":"N-Gone Pro [Before: $12.99, Now: $11.04]","tagline":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":21732,"archive_hash":"sha256:7a52568df96c5ee3f424333dad15d6de143868fa544a5de3adf9d6848b09f54c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":64311,"archive_hash":"sha256:d13c9fcbb9e5ac7547c4eb6c1fda5922171daf6870898830adb2a6dad931b20b","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/8804d2f3-775e-4d39-9f86-a38aa0f95062/","schema_version":"1.0.0"},{"id":"node_navigator","name":"Node Navigator [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.7","type":"add-on","archive_size":21242,"archive_hash":"sha256:4dcf9bc5e77e463708218799e5a56235295d577861088e77856cae6cce40296f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f6c592fe-b043-4572-8799-1be5c1ba6c0b/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":"3.6.0","maintainer":"Mr Steve Lee","tags":["geometry","nodes","organize","arrange","preset"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/cecb7191-5348-4e5a-a6a8-7b01f6ab7136/","schema_version":"1.0.0"},{"id":"n_panel_navigator","name":"N-panel Navigator [Before: $8.00, Now: $6.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":27286,"archive_hash":"sha256:1800311d9beb2ad4993fa0be51f8216209b20e25c41251a3afe5b1ea8d545569","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/72bab743-cb6a-4b75-9d9b-433088728648/","schema_version":"1.0.0"},{"id":"npanel_tab_reorder","name":"N-Panel Tab Reorder [Before: $1.99, Now: $1.69]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":34378,"archive_hash":"sha256:d03dd14657f4434a3c4d15a7eb69aab39a5ac4b7448ebddd2eea5fcb0f8ef81a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/fe28eede-1569-464b-86b7-f41037ec5744/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":"3.6.0","maintainer":"Joy","tags":["ui","interface","customization","panel","management"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/74ca75ae-fafd-4ad0-a99d-c3215b9ea4bc/","schema_version":"1.0.0"},{"id":"n_panel_tabs","name":"N-Panel Tabs [Before: $6.50, Now: $5.52]","tagline":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":6626,"archive_hash":"sha256:a4f36946fd4d25572d27f1fda1fbab96334e7fe321d20c6176c79383c9ee769b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c2b0fa8d-b323-4a43-8774-b34931e4f49a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.52","blender_version_min":"5.1.0","maintainer":"Eros Fornasari","tags":["manager","sidebar","tab","tabmanager","workflow","optimization","Interface","UserInterface","3DView"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/271b8c2d-5132-4d12-8696-f9504eff2a58/","schema_version":"1.0.0"},{"id":"null_game_toolkit","name":"Null Game Toolkit [Before: $32.00, Now: $27.20]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":28327,"archive_hash":"sha256:519f5dc600ae12492c11bb1a4f8f6d6b90dea42d3d63ad8dfe552e3d4001c9de","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"3.7.0","type":"add-on","archive_size":76727,"archive_hash":"sha256:969eb684b871e4c1af888f818373056c191d00c587370f65e57e57c2dc2c14a3","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":74608,"archive_hash":"sha256:154d6d78fe2620b60cc25ebe87054defc72f7eb76c3cad58d86cf4ae6dad2b16","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2739,"archive_hash":"sha256:d9b10d648c575ee0b17ee027f20296051e975e2f498673d6a8b16ca697e6de7c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":9257,"archive_hash":"sha256:932e313907fed8ebe4f7359a41f4e3e0f95745bbd86b1dc049e821cb4083c559","archive_url":"https://www.blendkit.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.blendkit.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: $9.50, Now: $8.08]","tagline":"FULL plan required - upgrade to download","version":"5.0.0","type":"add-on","archive_size":46749971,"archive_hash":"sha256:44bbf8936bbcf524aeacdc5567cb68f6fb98b8e814d5e7d7859c48a470ead90a","archive_url":"https://www.blendkit.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":"8.08","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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":11397,"archive_hash":"sha256:e6e72c938979613a4a794b2284a75bb0ef8f90f35d07e42c5c8593f9a94ca366","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":5231,"archive_hash":"sha256:4173b4cdf0ec617585b4f2ad40eac2917293298a27dc016a7c63ba9b6de82ca2","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.2.3","type":"add-on","archive_size":20453,"archive_hash":"sha256:14197ff44de0374d1709be60d844a69cdcac1ef00679d4ae5a9c01f8fc8705d4","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.0.2","type":"add-on","archive_size":224274155,"archive_hash":"sha256:202feaec961debe8852a37397bd4f171cc93b9b7c811cead6e792b89f9a4c759","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"3.2.0","type":"add-on","archive_size":17131,"archive_hash":"sha256:2522018ef3f2d98e91300c6793f57fb9fe8faea6034be2076bb364a621902c1d","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/31b436e2-7cca-442c-aeee-6f7004275252/","schema_version":"1.0.0"},{"id":"ez_studio_pro","name":"One Click Studio [Before: $5.85, Now: $4.97]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":10860,"archive_hash":"sha256:ed68ce19f9006a39a588d0e35d12004517975916112867b14dde807bfa2b23cf","archive_url":"https://www.blendkit.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":"4.97","blender_version_min":"4.2.0","maintainer":"The Smart King","tags":["Render","Lighting","Optimization","Productivity","studio","camera","blender"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/1c5d0887-7382-4dbd-9ba3-bee0cfd933e3/","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":"FULL plan required - upgrade to download","version":"1.7.0","type":"add-on","archive_size":17635288,"archive_hash":"sha256:22bd48bd5b54bc8b9c1d5be2a97e840667d3ad7ddf724cf0e0ccabcc82000233","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"0.2.0","type":"add-on","archive_size":318904565,"archive_hash":"sha256:9207d2b84a10bc3bf33d477424b3d863ae8c4b63d1de89a2f64b8d0cc1fcaa6c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.1","type":"add-on","archive_size":15593,"archive_hash":"sha256:281998905bd7fc71b8993a71fa64ffd28394f999a146d0f4f4c24db02e81b13a","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":510578,"archive_hash":"sha256:ff24edd79a427cca1f6439c4edbdc950e6acd25b7555d8acf254986fd70085e3","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1963,"archive_hash":"sha256:ed7ae5e3669860275c5e8477a4e545f39efb15cbe49679994c199b86f8e4c4e6","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":2056,"archive_hash":"sha256:412d83a0176f31a6d328ecab304d75d38c91eb6aacd163277301bbd0028b76d4","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/3f2afda8-dce0-4fa3-9aad-44cad17c2043/","schema_version":"1.0.0"},{"id":"palette_manager_pro","name":"Palette Manager Pro — Color Palette System For Blender (Pro Tier) [Before: $12.99, Now: $11.04]","tagline":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":45276,"archive_hash":"sha256:491dd63e67a545673cf7b18646aaf30dfd733df3e280a3ef99cd240fb3b106ab","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/06d812db-bfe3-4726-b68e-832e3c3f118e/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":"NovaStrikes","tags":["Material","Paint","Color","palette","texture","blender","gradient"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/8e0a91d3-79a8-4205-8c69-de1ca083c7ae/","schema_version":"1.0.0"},{"id":"tobip_particles_catalog","name":"Particles addon [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":47741747,"archive_hash":"sha256:502c9f726ea418185363df9c3d0947fff2639ca7331895cbbaec3de79cf2a91a","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/693ffd00-e10e-4f18-8419-ba55fe48ff07/","schema_version":"1.0.0"},{"id":"eztexture_pro","name":"PBR Texture Pro [Before: $2.50, Now: $2.12]","tagline":"FULL plan required - upgrade to download","version":"3.0.0","type":"add-on","archive_size":3294637,"archive_hash":"sha256:345223ed17af25f05ad21e942476bfd3addb4c382eee83df3f242aa4b48a32b0","archive_url":"https://www.blendkit.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.12","blender_version_min":"4.2.0","maintainer":"The Smart King","tags":["Texture","PBR","Material","autouv","shaders","udim","Node","Smart","UV"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/18b6c783-c973-4abc-90f2-5f380e6e86d8/","schema_version":"1.0.0"},{"id":"perforated_panel","name":"Perforated Panel [Before: $1.00, Now: $0.85]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":844690,"archive_hash":"sha256:5e86344238ef6499fc3e0fdc58d591c46f746eb477622e2a34ae46024edfe900","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":4354,"archive_hash":"sha256:8f6a1c5c5c4eec0e0893e94ec9230e2dd78f87e3e2f985da3586c50cdf2aa0d5","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.7.0","type":"add-on","archive_size":149362,"archive_hash":"sha256:cfbd5b940ae8191ce873be6d2b813c3bf940521891e33ee82ed75665ffd2ba84","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"3.0.0","type":"add-on","archive_size":21168,"archive_hash":"sha256:e140cc12a36bda67d704adb6f7ca250f111630313f356995127313910aa3b0f9","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.3.2","type":"add-on","archive_size":19161,"archive_hash":"sha256:dca5cd406ed0fd14ee53bd59a6a3cf48e863fe537a3e9f170dd8479d1065892d","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/93ad9257-b229-445b-8277-c702bde1eab4/","schema_version":"1.0.0"},{"id":"polymating","name":"Polymating [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"1.3.1","type":"add-on","archive_size":78737,"archive_hash":"sha256:a129c270d00436e1f8eb0e5f1ba2b6b3d9cb6e143047b9a9d02350d054a708de","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"3.1.0","type":"add-on","archive_size":36022,"archive_hash":"sha256:2aac9cae99896126264c23d6025ede4cf88678d25fe2d91947935d7363a179c2","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":220543,"archive_hash":"sha256:9742a530dbfadf2f5d349c8a5b54b891878e955d8daa8fc2004c0221d7f65687","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":2386869,"archive_hash":"sha256:c3365d6bcdbdff2c522f3f1448fad875fb172e94bf461a33fe1334246ac874c0","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.2","type":"add-on","archive_size":8027,"archive_hash":"sha256:900105e74ba1de500ce56b946e998c2b475b6a2a07345116996736720f1402cf","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/ed839737-ce8c-412c-8753-80a2bc968b59/","schema_version":"1.0.0"},{"id":"procedural_clouds","name":"Procedural Clouds [Before: $25.00, Now: $21.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":24305854,"archive_hash":"sha256:b6d83cf36baa39f432f698749b6d57efd0a21c36d08e9c0a38366560da491b00","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/72fb912b-ceae-4fec-9e03-d099f4518290/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.5.0","maintainer":"Suzanne studio","tags":["clouds","cloud","sky","skies","volume","volumetrics","storm","addon","atmosphere","procedural"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/70f5bfd0-0c25-4a15-a694-384875e86a6e/","schema_version":"1.0.0"},{"id":"neo_cables","name":"Procedural Neo Cables [Before: $10.50, Now: $8.92]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":4199,"archive_hash":"sha256:22bfb3d0dc05b9f0c8533e937331f967edbbfbc7c17717fcfae2907f08f42877","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/6c980f63-dcc9-4ed6-923b-c1bec5bce747/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.5.0","maintainer":"Stellart","tags":["procedural","generator","cable","wire","rope","generate","oneclick","string","thread","modifier"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/bb5d18f8-b5b6-4fb1-9f53-00fbf0c7aacb/","schema_version":"1.0.0"},{"id":"Procedural_Sky_System","name":"Procedural Sky System [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"0.2.6","type":"add-on","archive_size":724389,"archive_hash":"sha256:78d907ff64c92dc9fe436fe10cdc90f2fa51f47f1145d4e700a8a10bbb3c37dc","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.0.3","type":"add-on","archive_size":39573,"archive_hash":"sha256:bc1060a598e1f490c0b5f06542dcecfd0afb6e414efdb56dd50d098be5367665","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/9ef8471a-d401-4404-98f9-093837891b43/","schema_version":"1.0.0"},{"id":"procedural_weather_pro","name":"Procedural Weather Pro [Before: $14.89, Now: $12.66]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":43934,"archive_hash":"sha256:05d2bde702f2253f8b1b8f9e7fcbf7c77b4a065de9505a68f7384007ffa1174c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/8066341e-34a2-475b-ab74-47c40ec2180c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.66","blender_version_min":"4.2.0","maintainer":"Junaid Alam","tags":["Lighting","Render"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/77731762-5b91-4e38-b188-4c5b8ff7061f/","schema_version":"1.0.0"},{"id":"product_lighting_setup","name":"Product Autouploader [Before: $20.00, Now: $17.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":31931,"archive_hash":"sha256:1c78dd9539e0a76f95d94acf2e2c03b6b9f04d73e311c03ef1465e44a195774c","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/b8679695-2084-4bab-82d7-2a880628e8e6/","schema_version":"1.0.0"},{"id":"POS_shelf_display_generator","name":"Product Display Generator [Before: $20.00, Now: $17.00]","tagline":"FULL plan required - upgrade to download","version":"3.0.0","type":"add-on","archive_size":10667988,"archive_hash":"sha256:7b4aba700c52b3bdc15b5f152f8d1267e087295202f024a92bd6570d7336afb7","archive_url":"https://www.blendkit.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":"17.00","blender_version_min":"4.2.0","maintainer":"brandPOS Karpeta","tags":["Object","cardboard","packaging","FSDU","display","generator","model"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/f2880b5e-ba2f-4f2f-9556-16dd98491c38/","schema_version":"1.0.0"},{"id":"profiler","name":"Profiler 2.0 - Advanced curve beveling tool [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"2.1.0","type":"add-on","archive_size":293184,"archive_hash":"sha256:4d04209df47b869f68075cb013d9163ebecfd6ac5801c8d63db4894f55251b7f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/837faf74-0d9a-4493-b871-6bd776237892/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":"Mike Radjabov","tags":["Modeling","curve","spline","sweep","profile","cornice","bevel","molding","svg"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/1cd6fbe1-c385-4941-ad49-06342734572d/","schema_version":"1.0.0"},{"id":"psd_layers","name":"PSD-LAYERS V1.6 Add-on [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.6.0","type":"add-on","archive_size":50355,"archive_hash":"sha256:c767d1916b98c2348e38ff329b065a32caae4525a278bcbd3cfdda3e50e7e27a","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.6.0","type":"add-on","archive_size":26623,"archive_hash":"sha256:cbae5724dbd151f7aead7e85d4837a07e8906fc432edcbbb63b8a7cf0a515409","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.3.4","type":"add-on","archive_size":82832,"archive_hash":"sha256:73b148cf5c29fc62024b7bd4bba1dbaf99914395a8f0faf6efa0c0077caeb4e5","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/489eaa7f-5ad4-402b-8a65-7404010df89b/","schema_version":"1.0.0"},{"id":"quadify_ultra","name":"Quadify Ultra [Before: $150.00, Now: $127.50]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":2569263,"archive_hash":"sha256:4202b7d30673354503fb49a643b0a4e46dd3c03ea18d2f8bee0117fb3c952741","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c3815f1e-2cf4-4d0e-b037-19e6a568cb00/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"127.50","blender_version_min":"4.2.0","maintainer":"Anvil Interactive Solutions Anibe","tags":["Modeling","Mesh","Retopology","Topology","Quad","Optimization"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/1113757c-3829-4c33-bf49-11d38d30003d/","schema_version":"1.0.0"},{"id":"quick_align","name":"Quick Align [Before: $2.50, Now: $2.12]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":30856,"archive_hash":"sha256:cb1e0440c5f4407c455fbd2e5510a508c4982fe3123a9a489420ea00603b482a","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/91bec957-fe14-459a-83cc-5ce477214631/","schema_version":"1.0.0"},{"id":"quick_apply","name":"Quick Apply [Before: $6.00, Now: $5.10]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3846,"archive_hash":"sha256:74bc61eb7fc7f873cf32786b90f7ca80441528bd3deb36ea590c0a2311eba562","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e76474a4-7bce-44f2-9786-a90c4711eaec/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":"3.0.0","maintainer":"Re Siva","tags":["Object","Material","Modifier","Utility","easyapply"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/46c1cbcd-3c06-4aa0-92ef-4c81446359ed/","schema_version":"1.0.0"},{"id":"quick_baker","name":"Quick Baker [Before: $30.00, Now: $25.50]","tagline":"FULL plan required - upgrade to download","version":"3.3.0","type":"add-on","archive_size":300019,"archive_hash":"sha256:20b055b5b7f2f1e522fabbaf5947e03d8780e8bcc0fef5c9bf094d3c3239de08","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/0a560c82-5404-4da0-afdc-3c646af6a61e/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":["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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2426,"archive_hash":"sha256:384d34cb9c86629eac51f09fa6a1af15ca086b9ffdf75ef2dd3ee88c91370f9a","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.7.1","type":"add-on","archive_size":268191,"archive_hash":"sha256:3ba5d820d9b24cda4c9dfcaaad7e949bb21bc3db49be474d22fa509970b328ac","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3310,"archive_hash":"sha256:cf518a244930f26fa64b6d4dc4021709f5038921a7f1785c1c74059144263c40","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2168,"archive_hash":"sha256:04df4f1afbcdab212124e22da346cdb6311a67fee86ec844fb08bc81b5dd6b96","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":25611,"archive_hash":"sha256:64a293894e7513a9274c0d4fe2c52a9f543167742a7e0af6542b1441b389261c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"0.8.2","type":"add-on","archive_size":5964,"archive_hash":"sha256:f46aa86875dd6e14060aa47a207bc8fde1db70b3da9bd3d90ace0f81cb9b927d","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":21529,"archive_hash":"sha256:78d8b62da830760d7696930879fbbeb388001785e4a697d06df212f248e08546","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f21b81d6-4827-432c-ab0b-95c87f8f85e2/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":"3.6.0","maintainer":"Studio156","tags":["texture","baking","materialtotexture","material","textures","texturecreator","shader","object"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":10495,"archive_hash":"sha256:47f2ba1015744e3cb035404188dfb389b28281743027534f6f9c8bf2eaf17616","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.0.5","type":"add-on","archive_size":149550,"archive_hash":"sha256:590b9b24988895ddac71cab3a1cba32bd448f26aad4ae404c7c6ce579ffabbc2","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2182,"archive_hash":"sha256:692d1665c5fee4220e79f228ee7c92357bfda113651282424ce6192314e8b5f7","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5971,"archive_hash":"sha256:692f347bf98a84c06c57d3628c023733777b4d5f93dabb14032de8bc46756673","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.1","type":"add-on","archive_size":106813,"archive_hash":"sha256:55954eb891d859c257510bcd7462d843fb6ffc69b129a8344dfc75d94bffbd62","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.3.2","type":"add-on","archive_size":25703,"archive_hash":"sha256:b2fa794392702d933b726740de51337950654f54d63fc47633d25f257ccf8bc6","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/c785c99e-f1c2-4fbc-82b8-651761f6101a/","schema_version":"1.0.0"},{"id":"quikv_pro","name":"QUiKV PRO — Quick Keyframe Value | Animation [Before: $17.60, Now: $14.96]","tagline":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":41859,"archive_hash":"sha256:1b710658f7e92026c6f12824694a523183eab7dcc5788416f02e1c8525de9b4a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e531b319-c0bb-45a3-a5d2-0bfef96183aa/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"14.96","blender_version_min":"3.0.0","maintainer":"eFcoelum","tags":["keyframe","animation","Interface","value","click"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/bd8897f7-1111-43ea-860f-f956e1d4c0c7/","schema_version":"1.0.0"},{"id":"random_object_colorizer","name":"Random Object Colorizer [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3343,"archive_hash":"sha256:154dfae4dd35cef3d4f2ee5757abd3ef8790e89f0ec4d61f2803c2c8c4b2f7d7","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":2140094,"archive_hash":"sha256:2b2e2822ab1911da95e7100a079c86a1a9364df9137425aca3523a8f02759db6","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/61fabc4e-aa4f-463c-8bff-d771f0b85cb2/","schema_version":"1.0.0"},{"id":"renametool","name":"Rename Tool [Before: $4.99, Now: $4.24]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":1859,"archive_hash":"sha256:31dcfacba225cd89975fd7f1c19fa3b94cc09f95ce6c07096f628c0676467c8e","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.1.0","type":"add-on","archive_size":2469,"archive_hash":"sha256:7eb243aeb9da5906a755214d9e78162c5e867bbd91037dc768e250f5b40314ff","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1879679,"archive_hash":"sha256:0dc385a33ba081c8e7863db348534383ec5c26e0c10d20e728ca70e1466db6c5","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/244c9e2d-6185-4f62-9501-864aef9d908c/","schema_version":"1.0.0"},{"id":"render_manager","name":"Render Manager [Before: $17.99, Now: $15.29]","tagline":"FULL plan required - upgrade to download","version":"2.5.1","type":"add-on","archive_size":95404,"archive_hash":"sha256:4914ec65c8c5f5649e0e9b385179258cb382034d697a459369c0039f1a98a80d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/170c9ea3-5d5f-4d59-ab71-addb88c81ec2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"15.29","blender_version_min":"4.2.0","maintainer":"Hassan Hussain","tags":["render","pipeline","animation","scene","camera"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/502f4b0a-b0c2-4b08-8414-424c287bc8ca/","schema_version":"1.0.0"},{"id":"render_negative_frames","name":"Render Negative Frames [Before: $7.00, Now: $5.95]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1879,"archive_hash":"sha256:2ba36c9790061f0bf0a448114c2cb1719f4a1cffebe061a383f8c4aa7de28039","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2792,"archive_hash":"sha256:586e53a0c3d4c433d5d116672994d69a2a20413e310774af3043e382f0f083c1","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2760,"archive_hash":"sha256:88bf2295c1d2a4efbdec61981f5b46c9f3d84de1f2ae9aa5214c1aeba2eb8a20","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":51865,"archive_hash":"sha256:7acca1532f7eefc9deb6031439dc7302a55449f02caaab0c1c147ba88eb97bde","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.8.0","type":"add-on","archive_size":55255,"archive_hash":"sha256:740459440b6441a7130c3cabdfe29c1b7685b2b9973315e10954bc5815e73454","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/193a112f-1f47-464f-9481-4eb07e57dfda/","schema_version":"1.0.0"},{"id":"rendervise","name":"RenderVise [Before: $9.00, Now: $7.65]","tagline":"FULL plan required - upgrade to download","version":"1.0.9","type":"add-on","archive_size":9789,"archive_hash":"sha256:57e84968a668fabf8d2877346e66eacc63b551237a86a3edf07fa5281eaae1a4","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7e325318-9d07-42c6-8cc8-51320b3fac5b/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":"3.0.0","maintainer":"antoine f","tags":["Render","Pipeline","Camera","Preview","History","Compare","Compositor","Thumbnail","Workflow"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/9caef8fc-7e27-4778-a711-4e0c4f65d665/","schema_version":"1.0.0"},{"id":"resmax","name":"Resmax - Upscale AI [Before: $14.00, Now: $11.90]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":45049478,"archive_hash":"sha256:0922535ea56912848573cb1b8e9c867351cd9954c6e16a63935818422df6a582","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":9399,"archive_hash":"sha256:1318864822da93978eb7171758723f405929829aec55d440b4fab81118e7b5fd","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":32929,"archive_hash":"sha256:330e68364f7398892036bd42414008db1d1a675d9e478930fa447eae445fdd0c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":16046,"archive_hash":"sha256:3d758fc27afb06d104c0b1b6da32f03752bb54b880075e4e7d2862ea59ce3db0","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2dac3f2f-efb2-478b-81f1-664f5811a049/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.5.0","maintainer":"Stellart","tags":["export","rigify","unreal","unity","godot","addon","blender","rig","rigging","rigger"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.4","type":"add-on","archive_size":35673,"archive_hash":"sha256:0017a0759d1e8a607e341fab85475d5ca0eeb6659cbfe620c2893a7bf73f3d9d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d2699e3e-2458-4b11-bbea-733e6f03d2b2/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.5.0","maintainer":"Stellart","tags":["retarget","retargeting","retargetting","bones","rigify","transfer","animation","rigging","rigger","rig"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/08108568-865c-4219-87e7-144df8ab7fa2/","schema_version":"1.0.0"},{"id":"save_director_pro","name":"Save Director Pro [Before: $6.49, Now: $5.52]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":17820,"archive_hash":"sha256:6c56ba1b5cc51803d8d3b91fafb4c64facc6c8ec6a209fbda8604729232e03df","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2c627b8d-effa-4c1d-bee0-74c298a0234a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.52","blender_version_min":"4.2.0","maintainer":"Steven Seidler","tags":["Save","Director","Pro"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/92851ab9-2d63-4c4f-8746-41f233d57fb9/","schema_version":"1.0.0"},{"id":"scale_print_camera","name":"Scale Print Camera – Pdf & Exact Scale [Before: $16.00, Now: $13.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":43786,"archive_hash":"sha256:b53a1ba15aaf4cf1c20493dd9e7b7e13f0250d8424c9aebf22d10ed3a7c5079a","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/08f3b586-69b8-4fef-8b34-09426bb88b06/","schema_version":"1.0.0"},{"id":"scan_cleaner","name":"Scan Cleaner [Before: $6.00, Now: $5.10]","tagline":"FULL plan required - upgrade to download","version":"1.2.3","type":"add-on","archive_size":20651,"archive_hash":"sha256:9c486142f1d6a78f90f31a2c648635a8b616b1a90197507f50cd82b4ad98b0dc","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/3546b856-e505-4915-befa-b736873f785f/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":"Zack hough","tags":["Mesh","Modeling","Pipeline","scaning","scan","automated"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/aad93279-f98f-4884-8a4a-2a05f0491421/","schema_version":"1.0.0"},{"id":"scatter_forge","name":"Scatter Forge [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":1238739,"archive_hash":"sha256:fb6bed06c1de23c9d97d80672a4ecedf7744d6a7697ba851ed2967bee46d487f","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/561addae-d8e9-497f-9c73-961d3d0ab281/","schema_version":"1.0.0"},{"id":"scene_state_bookmarks","name":"Scene State Bookmarks - Save and Restore Full Scene States in One Click [Before: $9.99, Now: $8.49]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":7818,"archive_hash":"sha256:6405e1a41d62fa8920f3b7c858590b54096a84c9bc4b06a11ad62235bc223612","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e70fbd8e-2b48-4699-93d7-0573eab3420b/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":"Salman Naseem","tags":["Scene","Render","3DView"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/912c7fdc-6b35-45fb-9843-2f751a2cc833/","schema_version":"1.0.0"},{"id":"scenesweeper","name":"SceneSweeper - Clean-Up Commander [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":23168,"archive_hash":"sha256:869b3b93d15c2f7d138697210c3434c97e31849e776517c73185fd4f4eda5f80","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.6.7","type":"add-on","archive_size":634022,"archive_hash":"sha256:6cea718ed1fcf44841dfa3eda665725af2d870be6e419ae724a357ca79db2c0a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/00e6ba6b-f6c2-4b95-a0a9-c2aa133c1bc5/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":"5.0.0","maintainer":"Wolfram Kampffmeyer","tags":["Schematic","Rigging","Hierarchy","Constraint","Editor","Visualization"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":46257,"archive_hash":"sha256:562d8eaa29b82b144bba800ce5f367e204d11e7f4d96929940437db0fc33b0f3","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.4.8","type":"add-on","archive_size":6748565,"archive_hash":"sha256:1aefdbcf980556de2b10d3fb8bde0d260d9da45d31f50a7a8557a94eb28d843b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/cc3a7f57-ddb0-4795-bf23-2677d325c8c0/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":"5.1.0","maintainer":"Ruben Messerschmidt","tags":["section","box","cross_section","elevation","archviz","architecture","plan","drawing","floor_plan","cut"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/42a79447-b3f5-4683-a253-73d7360142a8/","schema_version":"1.0.0"},{"id":"section_pro","name":"Section Pro - Sections, Projections & Technical Drawings [Before: $59.99, Now: $50.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":25516976,"archive_hash":"sha256:bf0b7360645992c567af82d242bab14867bf6008d91f322f8f3eaa41f2420dc7","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/302ead32-dda5-42ee-8bd1-ddbb59fde059/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"50.99","blender_version_min":"4.5.1","maintainer":"Ruben Messerschmidt","tags":["elevation","ArchViz","section","floor_plan","technical_drawing","interior_design","architecture","cad","dxf_export","bim"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/c472fc66-b1c3-4110-8cd4-ebcb25080734/","schema_version":"1.0.0"},{"id":"selective_wireframe","name":"Selective Wireframe - Per-Object Wireframe Control for Blender [Before: $4.00, Now: $3.40]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":10492,"archive_hash":"sha256:d1a68e64f6698d3e1aff0c7f56381d0189a3f4ed0b128efc3f06bca6f535779b","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":1445,"archive_hash":"sha256:f3e259eceeebeb7c6455e1e9bab7e6686a2c67517723d927a2895d999aba37b2","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":1838,"archive_hash":"sha256:81c9c1e0b887bc18f5e413ca02edfa649da3df61230e2ffca2f3f04a19c1072d","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":14206,"archive_hash":"sha256:36e39fdd146abe3cf1d89d7ad4bbcc6cb3e70b140a09812592aaf647fa7c1ea6","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.5.1","type":"add-on","archive_size":18152,"archive_hash":"sha256:42cf19cca7b18383d173077cd7db74c46dabe6b71cab8fbebcd2fedbe110236a","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/1f14a313-1319-4921-8043-394825fcf083/","schema_version":"1.0.0"},{"id":"ShareTextures","name":"ShareTextures Asset Library [Before: $14.99, Now: $12.74]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":783093,"archive_hash":"sha256:65e40563f57e0fedf66457e7c8c74154c1b32a7cf16c1222436cc96342eccb3b","archive_url":"https://www.blendkit.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":"12.74","blender_version_min":"4.2.0","maintainer":"Share Textures","tags":["Object","Material","Pipeline","UserInterface","asset","library"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/822222fd-6e10-4da6-960d-cb12d7ec3fbf/","schema_version":"1.0.0"},{"id":"mk_shelf_filler","name":"Shelf Filler [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":12857,"archive_hash":"sha256:80218adeb5de818a77d0e927e073c2ff4fea020fd78742d383288df09a17f344","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/617da19f-6a35-41f7-b5d5-26c1fe3eaef6/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":"Milad Kambari","tags":["Object","Modeling","fill","book","decorative","decoration","shelf"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/fa82ee50-842d-450a-a6bd-8837926fc743/","schema_version":"1.0.0"},{"id":"jd_shot_handler","name":"Shot Handler [Before: $12.00, Now: $10.20]","tagline":"FULL plan required - upgrade to download","version":"3.0.2","type":"add-on","archive_size":49735,"archive_hash":"sha256:f113416a330accfae028bb41d95cb7014d2f1967c4b80653dc98c870f29836d2","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/93e43d6b-8f20-478b-bb88-94c4ac387d4b/","schema_version":"1.0.0"},{"id":"shot_manager_pro","name":"Shot Manager 2.0 Pro (Blender 5.1+) [Before: $35.00, Now: $29.75]","tagline":"FULL plan required - upgrade to download","version":"2.0.8","type":"add-on","archive_size":23139698,"archive_hash":"sha256:46f766bfec0a4383b9c90dd172387fd3d15e919fea9343b98ab4c81feb454e47","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/575d0fec-e3f3-47e6-935b-cc39b7f08b39/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.3.0","maintainer":"Other Realms","tags":["shot","takes","macros","states","batch","render","burnin","burntin","stamp"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2ace843e-c14f-4eda-b697-fb7065f344d1/","schema_version":"1.0.0"},{"id":"shotweaver","name":"ShotWeaver — Multi-Camera Shot Organiser for Blender [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":10493,"archive_hash":"sha256:8d025358a4b0165f91d26504ac126d77aa8e77aff50e88af94d902ea47b29c9f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/bc94be10-941c-44ca-882b-ddc30679da8d/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.5.0","maintainer":"Ynleyn","tags":["camera","animation","storyboard","management","render","queue"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/f3a2d99d-e315-4918-ba7a-e8bf576afa51/","schema_version":"1.0.0"},{"id":"showcase_studio_pro","name":"Showcase Studio Pro [Before: $30.00, Now: $25.50]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":139482,"archive_hash":"sha256:3e3d1586f1ac59458f084ea5a859bd6c515dd7cae24c3eef933a1c31a969235f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/50c7137d-dbcf-457c-9ac0-7a1d6c8d4ea0/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.5.0","maintainer":"3dquads blender","tags":["3DView","Render","Lighting"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/ff65ae79-6580-433d-8e18-98f4d64c7af1/","schema_version":"1.0.0"},{"id":"simple_layouts","name":"Simple Layouts - Full Version [Before: $12.00, Now: $10.20]","tagline":"FULL plan required - upgrade to download","version":"0.1.5","type":"add-on","archive_size":308012,"archive_hash":"sha256:c773d88ee7a6158743c98df12a7ab8c81f844b0efb9d3da28f0f8f5b57a75520","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":2190,"archive_hash":"sha256:de5bcf5bf9a3cfd8b3773925b91061c63fa50a44cd032def5b7f44bf3e7c04b9","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":136739,"archive_hash":"sha256:957887d9eef18a40d9d095f20c09aa90ccf0706556582b0f7dfe27eebdcd9bb6","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":967509,"archive_hash":"sha256:94ec87ede7ebadd708c879d1476a48b2e3d4589968ca74660477aa757348a49a","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/ee2ffd44-5bed-40e0-be94-43b22b2e80e3/","schema_version":"1.0.0"},{"id":"smart_align","name":"Smart Align [Before: $9.99, Now: $8.49]","tagline":"FULL plan required - upgrade to download","version":"1.40.0","type":"add-on","archive_size":30781,"archive_hash":"sha256:59e65c8482bfb52cbc7d894afa19958f492587f38a6693c299120f3a381ee372","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/85389cd7-26fb-46c8-91ca-8a69b1315e9e/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":"Gabor Kiss","tags":["align","snapping","transform","alignment","modeling","move","workflow","addon"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2528d6bc-faa7-4231-bc63-8eba09c4b88f/","schema_version":"1.0.0"},{"id":"smart_autosave_pro","name":"Smart AutoSave+ (Basic Tier) - NovaStrikes [Before: $8.99, Now: $7.64]","tagline":"FULL plan required - upgrade to download","version":"7.0.3","type":"add-on","archive_size":7530,"archive_hash":"sha256:fbe220ec55dcf6147bd900c982c9c1c91fa53c725dd5e00af7c1997aac7fb987","archive_url":"https://www.blendkit.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":"7.64","blender_version_min":"4.2.0","maintainer":"NovaStrikes","tags":["crash","autosave","scene","safety","backup","system"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":16997,"archive_hash":"sha256:edd41a20f4dce1fa76ffb3a26e3bf5b7f2c29e371d93bfc95de374ac51334846","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/a152acb9-f8b5-41df-b32c-3b2d4790a934/","schema_version":"1.0.0"},{"id":"smart_scene_organizer","name":"Smart Scene Organizer [Before: $2.99, Now: $2.54]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":6316,"archive_hash":"sha256:8640f77e625614002d0e286a46e13c0e59036ea360c43aed31ba35343f6a044e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d8039a3c-8734-402f-92ba-94900c493f39/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":"3.0.0","maintainer":"SHAXBOZ Ergashev","tags":["blender","addon","scene","organizer","asset","manager"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/7f474641-f0f4-418c-8e3a-8506a93064cb/","schema_version":"1.0.0"},{"id":"snappy_rigger","name":"SNAPPY Rigger [Before: $15.80, Now: $13.43]","tagline":"FULL plan required - upgrade to download","version":"1.2.2","type":"add-on","archive_size":1664368,"archive_hash":"sha256:00101c2fadcbe97df886a9b505f692422683897a1bcd686a5f4309bec04ecd54","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f4047669-f313-4cdb-ac01-3b8772cbf69a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"13.43","blender_version_min":"4.5.0","maintainer":"Stellart","tags":["Rigging","autorigger","bones","detection","generator","snappy","rig","autorig","rigger","animation"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/c9841f8d-5056-41a5-972d-6c6cea2fd4d4/","schema_version":"1.0.0"},{"id":"solaris_creator","name":"SolarisCreator Pro 2.0 - One click cinematic lighting [Before: $69.00, Now: $58.65]","tagline":"FULL plan required - upgrade to download","version":"2.1.0","type":"add-on","archive_size":32693,"archive_hash":"sha256:2955231eb9c54f768dc8fc2362fa9fc865e8d1a8154494cf382468fb0d0a6fed","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/526f9eac-bba6-4639-bbab-9607e0c3c1d3/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.0.0","blender_version_max":"5.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2080,"archive_hash":"sha256:acf397a1ef0376442ae348b5eda74aec9f0787b232ac393b33f7b33b09fa8e15","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"3.2.2","type":"add-on","archive_size":543142656,"archive_hash":"sha256:1f2a09faa7d927fbfd0b093da716f7e528f212ec1d5eba94438599399775cf67","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2be1351b-e513-4d23-b808-c204a8e2b27c/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.0.0","maintainer":"Stellart","tags":["Space","Universe","Planet","Moon","Sun","Star","Exoplanet","Asset","8k","4k"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"3.2.0","type":"add-on","archive_size":21428,"archive_hash":"sha256:5c5cfaf48d121a201d15970d8af3b75cb043d2c2aa5b027360aede3ea796c984","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9049369d-6bbf-4849-a0aa-5430dd486a82/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.0.0","maintainer":"RUIDO VFX","tags":["Render","Camera","Output","VFX","Batch","Pipeline"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"3.5.2","type":"add-on","archive_size":1954483,"archive_hash":"sha256:12ccbe83ae847b6db4b544475b1ecc8ca59e80a09d5a6bf95d622a2eb89dd0c8","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":128633,"archive_hash":"sha256:5cac8b7f6fd6438709d3d9ba30a7136f3d5d23ae172b1e38eb6ae0e8fb189ed8","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/4b59c688-c13b-4611-8e18-98ad327133c9/","schema_version":"1.0.0"},{"id":"stylized_water_pro","name":"Stylized Water Pro Shader - One-Click System [Before: $24.00, Now: $20.40]","tagline":"FULL plan required - upgrade to download","version":"0.5.0","type":"add-on","archive_size":8005660,"archive_hash":"sha256:3cad70c57a27ae2acf27a2d0a2fa9a16b0511d15b6a1c710e663568c086b4af5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/03e0ce35-7260-4f9a-aa81-e37f633667e5/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"20.40","blender_version_min":"4.2.0","maintainer":"Anton Maltsev","tags":["Object","Material","Node"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d438949d-5bb7-4d33-89bf-19893c0290d9/","schema_version":"1.0.0"},{"id":"mk_surface_blend","name":"Surface Blend [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"1.5.4","type":"add-on","archive_size":7077,"archive_hash":"sha256:5c277e0eb5c327d4ad603dbd2922b0658ee0c864f334b3ebfac3e88987d25b37","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/af887228-87b3-4b3d-8e5e-d227fcc6ca8d/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":"Milad Kambari","tags":["Object","Material","GeometryNodes","blend","dissolve"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/553fe958-98eb-475c-9531-218ea6cabfed/","schema_version":"1.0.0"},{"id":"surface_effects","name":"Surface Effects – Procedural Material Enhancer [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":23835,"archive_hash":"sha256:db1541adbb92cd4aa13b3bd73bb0c57bb7cde085c11536f63d0a887da810c828","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":36113940,"archive_hash":"sha256:26a3e456bf03fb45ab2912e4c3b659b38cf2b9a9c298f550a7d1f54c0b8a6735","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":60460,"archive_hash":"sha256:2653c075f02776bdff274fad70e43d9885a8d40d3f0aa4021202a97809ce4599","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":39261,"archive_hash":"sha256:7296dc8dada42dda5ee981c8f96b7b6598c300c5d2ddfa0caff01dd91904e42a","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":48116,"archive_hash":"sha256:07dae0d5d8f657eb750fc5b2599c3398a22017f881d5331a27ba40033f4ebd30","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":43979,"archive_hash":"sha256:ec0f9da235bf43c1719622cf91a37f5fb38e880201ae9f6c7dce6e54661f88a6","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":67446,"archive_hash":"sha256:5f1feb0d46de24a8816f6d6d0fe4baffba23e6b3855054571c9d918b209f1b46","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/3c751ebd-c083-408b-a82a-50ad796f78ec/","schema_version":"1.0.0"},{"id":"swiftlod","name":"Swiftlod - Level Of Detail Creator [Before: $3.00, Now: $2.55]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5669,"archive_hash":"sha256:5e989039793ea4a133614d77893ef0a6f0a0f024c3dc5ef1f79c924b8b2e1fc3","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2464af97-146a-47d1-be1a-b6521114e96d/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":"FANNΞC","tags":["easy","lod","optimizer","plugin","pro","Level","Detail","Optmize"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/cb8119b8-835b-4104-881d-9e6524c2fecb/","schema_version":"1.0.0"},{"id":"tcam_render_pro","name":"TCam Render Pro V1.1 [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":5907,"archive_hash":"sha256:d376325dd7c4970f743d9bce95659dbf155916c9fc073bba6674f539910bdf50","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/cb0fea4d-5722-44d0-bc66-fb4a904cc0e0/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":"Otonkart Tonka","tags":["render","multicam","queue","renderqueue","camera","studio","video","automation","batch","rendering"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/317bf5e7-cf4a-40c4-8fd0-37e7400fa359/","schema_version":"1.0.0"},{"id":"textopbr","name":"TEXtoPBR [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"2.5.0","type":"add-on","archive_size":15465,"archive_hash":"sha256:7dc82c0e29fc8a939fd4480d424cf0707df2bfe08d83578017dba0211e62aa50","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/c9c54d68-ae48-4d39-bd29-5109652c19bf/","schema_version":"1.0.0"},{"id":"texture_layer_manager","name":"Texture Layer Manager [Before: $19.99, Now: $16.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":882964,"archive_hash":"sha256:5acc884513e5397e93eb2727fe36edc2dbda6a2ba4e755e2d65f74068eb493b9","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/a4449ebe-d709-412c-93d1-4d9134f00ec1/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":"5.0.0","maintainer":"riccardo scuto","tags":["Material","Node"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0c579cdc-7c9d-4738-90f9-d22e0b6ff810/","schema_version":"1.0.0"},{"id":"texture_resolution_manager","name":"Texture Resolution Manager [Before: $9.99, Now: $8.49]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5016,"archive_hash":"sha256:2acab6532846076f2be8681a9fe3728a88e475e4d5e9129f1b2954374e524f8d","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3275,"archive_hash":"sha256:cf87113efe4f2741f72324e75b0b7d22a511a9d838afe3272ee70026f9a20b0c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":6640,"archive_hash":"sha256:da5b85b68abcc1a6a9d40235e689d142a16f871f50f6b9f948d6b121728514fc","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/2b074e8a-844b-458a-a01b-84cada557d0f/","schema_version":"1.0.0"},{"id":"blender_ustad_texture_transfer","name":"Texture Transfer - High-Poly to Low-Poly Texture Baking [Before: $14.00, Now: $11.90]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":10623,"archive_hash":"sha256:9e26d18f2777c9476ac61b89f9fe6b6e7929cca9735b70fc708554b8445a9b96","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e5c46144-0572-41f7-aba3-4c34f0fa7c90/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":["Bake","Material","Object","UV"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/48a8128a-6a37-4ec7-a3d7-656e69946d4b/","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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1459005875,"archive_hash":"sha256:466e058cf39b8566902b14f79011afc18d525d1a0a7e3b6448b65e287463f644","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/9d7fb688-d32f-4b21-acb7-a8726d96ddd9/","schema_version":"1.0.0"},{"id":"the_bakery","name":"The Bakery : One click material baker [Before: $7.50, Now: $6.38]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":1833039,"archive_hash":"sha256:e28b0a1f08f75a93ed72593d4f2073affaae653c2dfb0480ae15912ec464e154","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/704a83c3-e237-48cf-8c00-cb98e02d7816/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":"Zahit Erdem Guzel","tags":["Material","Baking","Pipeline","addon","texture","bake"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/438cef85-944d-48a9-b7c7-2ffb63901baa/","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: $3.00, Now: $2.55]","tagline":"FULL plan required - upgrade to download","version":"2.0.7","type":"add-on","archive_size":159086065,"archive_hash":"sha256:1965899e1578da49188a948210b5700cf32c08c2831608397ebaa2efeea62a68","archive_url":"https://www.blendkit.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":"2.55","blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["HardSurfacetools"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":944337,"archive_hash":"sha256:e397582008ec0eee3d81c380277ea2b6d4dcf988db8b704c236b06c681110003","archive_url":"https://www.blendkit.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.blendkit.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: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":33678,"archive_hash":"sha256:5cf1de2c7a8892f13a98f74f6cfe821babf13f03e67f328ebf762f46e51611d4","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7e3d7593-f190-40b5-b1ab-809767a248b2/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":"Salman Naseem","tags":["System","Productivity","Tracking","Analytics","Workflow"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":257056,"archive_hash":"sha256:41fd3f67885ff8ba32652e9145ac1eec5c7c95cc791827a954e5e10a1cea4f55","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":55849,"archive_hash":"sha256:dad0d50ae418ffb09385ea1ae481d8bc5df9dcb71b92fb1f51c6921cfffd4eed","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.4","type":"add-on","archive_size":44729,"archive_hash":"sha256:7f03b201ca49a0146bbe4d2ef7a1eadf1acdecc0374e7a2502ea7d77ccf3d530","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/24639bd7-bbf1-40cf-950c-2454ab9d1a7a/","schema_version":"1.0.0"},{"id":"triplanar_displace","name":"Triplanar Displace [Before: $12.00, Now: $10.20]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":5585,"archive_hash":"sha256:a682057b8e0a7f681d97fa0f791304416186ac4486b94c5f2ccf68d73d0b883b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/196e3b7e-3797-4fc3-b255-12fc1515244a/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":"Anas Herba","tags":["blender","procedural","displacement","no","uv","triplanar","displacement","rock","cliff"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/9a81bcf4-4a33-4248-ab1f-d28c901c465a/","schema_version":"1.0.0"},{"id":"udim_atlas_builder","name":"UDIM Atlas Builder [Before: $18.00, Now: $15.30]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":46153,"archive_hash":"sha256:6ce8871915b669feb3bc9e7fbf0818b0e1b1179d3c388b2a1cd8361e82bf57c7","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/fbfd2505-0b56-4e62-84a0-34ae9ec8c3b3/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.5.0","maintainer":"Ashish kumar Maurya","tags":["UDIM","UV","Mapping","FBX","Optimization","Materials","texture","baking","gameasset","atlas"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/b4048c30-85fc-4fb3-9e15-d13a36ea90b8/","schema_version":"1.0.0"},{"id":"ultimate_animation_suite","name":"Ultimate Animation Suite [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":26615,"archive_hash":"sha256:a0a86c9d504534758288888410cf529c8ce667664a2aed66a7f223cdc42b0bbe","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"5.5.0","type":"add-on","archive_size":18870,"archive_hash":"sha256:df401a91fc4bb160b3b90bb20ac4f3a9d4e5e033f6e11f99278aaeb4f5ed198f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d908778e-fd57-4b1a-8b54-0ffdaa96823b/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.0.0","maintainer":"RUIDO VFX","tags":["Animation","Camera","VFX","Shake","motion","cinematic","keyframe","tool","vibration","rotation"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.6.1","type":"add-on","archive_size":17488,"archive_hash":"sha256:93f174a95ce78dea36cbbb201b75d0e739a40721082ee5d53600f74fa37ce1e7","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"14.2.0","type":"add-on","archive_size":17570,"archive_hash":"sha256:8967d03e228f333c5d4608539b6cf5e4d3273db8f8de94be4722df80ab36a52a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/5f7473a3-aba2-42d8-84fa-b14ce497d261/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.0.0","maintainer":"RUIDO VFX","tags":["Animation","StopMotion","Keyframes","Timing","Stylized","Tools","frame","nose","jitter","claymation"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":18967,"archive_hash":"sha256:46cb4e81cadfeb449a090f56e07799ab99a17eed3a3906b2178c7934fe2f8f54","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":1268,"archive_hash":"sha256:ec7b88c1fbdd7e24b8b34597ca78c8383c80035b65f47999ce849ab4633a76b3","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/110a0e8d-f1d8-4479-9c3b-9188da0f4fc2/","schema_version":"1.0.0"},{"id":"mk_universal_converter","name":"Universal Batch Converter [Before: $4.00, Now: $3.40]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":6018,"archive_hash":"sha256:cc9392e15f66b50687a68c7453880cbc005db6692a23dcf61edc596b53321a99","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c3beb4fb-eb7e-42be-97ff-82d67a1fd76f/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":"Milad Kambari","tags":["converter","batch","fbx","obj","stl","gltf","glb","import","export","pipeline"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/aa445dda-b4cd-4936-9cc2-88c9c3fff545/","schema_version":"1.0.0"},{"id":"upscalar","name":"Upscalar | The Image AI Upscaling For Blender [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":679178887,"archive_hash":"sha256:4317b3a0a42e7699e5429e570d07193be262e09462c6822ad63222c11a984313","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.2.1","type":"add-on","archive_size":1531633,"archive_hash":"sha256:d21e31cbcaa2b3587163abe394472c4024d10a76b8fd618f7b40116a2a090f33","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/6c03319b-087f-4446-a9bc-959f4e0eea65/","schema_version":"1.0.0"},{"id":"vacuum_wrap","name":"Vacuum Wrap [Before: $6.00, Now: $5.10]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":9503,"archive_hash":"sha256:7ac023d64ac0968bd7ec2940a9285222b24c13037ac1cc8a06f1c9e4e9ee666e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/71fd3df5-c65d-4ade-b32a-e176c906ca5a/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":"Milad Kambari","tags":["blender","addon","shrinkwrap","physics","packaging","cloth","simulation","vacuum","wrap","plastic"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/8251d25a-ed34-41e4-b702-eed07c681495/","schema_version":"1.0.0"},{"id":"version_keeper","name":"Version Keeper - Premium Project Management [Before: $7.00, Now: $5.95]","tagline":"FULL plan required - upgrade to download","version":"2.0.5","type":"add-on","archive_size":19589,"archive_hash":"sha256:d4c1cfdd5a4c1b4af4581cb4fe9203ab8d4ced9ab51f48678714a16449ef875b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/83c0a989-7b1d-4657-9c1a-0af96a578a8e/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":"Re Siva","tags":["System","workflow","productivity","Utility","Interface","Organization","Asset","Management","Backup"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/b7f2f7e1-86cd-490d-9097-dd22a319d9f0/","schema_version":"1.0.0"},{"id":"vfx_scene_builder","name":"VFX Scene Builder - After Effects to Blender [Before: $9.99, Now: $8.49]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":129261,"archive_hash":"sha256:6161d5fabb72404e17e05f1dfcb71922ef9062bd1f3134a7162090623a3f8241","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/17256fe9-432d-46eb-9245-892fad2faaf7/","schema_version":"1.0.0"},{"id":"view2cam","name":"View2Cam [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":11420,"archive_hash":"sha256:e27bdd8360c49857bf00336296af0e1363874f7711ec84199770dc42684ba0a9","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/97960a97-5440-4859-b168-913fdf693ebb/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":"Milad Kambari","tags":["Camera","animation","movment","viewport"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/75354932-0842-48fb-a148-bda2078edd81/","schema_version":"1.0.0"},{"id":"viewport_object_finder","name":"Viewport Object Finder [Before: $2.00, Now: $1.70]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":12335,"archive_hash":"sha256:6fb559947a155ba05be51d97f7e57ff6831eb1b976903503e20833c869f23430","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":9926,"archive_hash":"sha256:bc0931eacd7c2c282e27e3747fefa76f036ec804b7ce38029f136cb220139de1","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/14ab582e-2794-4406-9427-af93348e7cf9/","schema_version":"1.0.0"},{"id":"VSEDAWFX","name":"VSE-DAW FX [Before: $4.99, Now: $4.24]","tagline":"FULL plan required - upgrade to download","version":"1.9.7","type":"add-on","archive_size":466900,"archive_hash":"sha256:eb835556e726cb4e92ae6a38940e657fd3e460ec5bf9261403584cd747a54d02","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e1231647-89e7-4925-8b67-1a44dc3151d1/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":"Jacques Durocher","tags":["DAW","effects","audio","music","FFmpeg","compressor","mix","mastering","sound","reverb"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/dea4de69-4f56-4791-b8f7-a315f0d489c7/","schema_version":"1.0.0"},{"id":"wireframe_lens","name":"Wireframe Lens - Inspect topology without switching modes. [Before: $4.00, Now: $3.40]","tagline":"FULL plan required - upgrade to download","version":"2.3.0","type":"add-on","archive_size":13384,"archive_hash":"sha256:99c4709ad0b3ecf7afc2e71bb25a1bf8d60dbafbf48fd72ce888f4c952c4c8c9","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":3391954,"archive_hash":"sha256:ffa35fd309f79fd2c1f6d55a2f732f20f855b047f1c3fec900d871ae4e72a457","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/5bc3a7d5-5b6c-450b-bd51-b0570f8099c1/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.5.0","maintainer":"Wolfram Kampffmeyer","tags":["BookArt","BookFolding","Papercraft","Pattern","SVG","CSV","Manufacturing","Layout"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1144829,"archive_hash":"sha256:5954c8ee130e0ec355c161ff81250db8925ec8c75e451d42cf06f4ce4bbc69f0","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/cd687c32-9fa6-427b-8142-49fdaad99279/","schema_version":"1.0.0"},{"id":"wk_mechanics","name":"Wk_Mechanics - Mechanical Linkage, Cam Designer & Automata [Before: $27.00, Now: $22.95]","tagline":"FULL plan required - upgrade to download","version":"0.8.0","type":"add-on","archive_size":6234341,"archive_hash":"sha256:4039181e864ab4aebb2a1ba46ca9dfb0c3db42e563ed50b9c72f2969706f4ccf","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/0b59a8a2-8d24-4754-89cd-330f5cabac29/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":"5.1.0","maintainer":"Wolfram Kampffmeyer","tags":["Rigging","Animation","simulation","automata","mechanics","drawingmachine","strandbeest","walker","engineering","linkages"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/904f8506-9293-426c-8c21-9a7d287a497c/","schema_version":"1.0.0"},{"id":"wk_powerpin","name":"wk_PowerPin [Before: $8.00, Now: $6.80]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":428466,"archive_hash":"sha256:6f3531a8c30c320101e009edabafa6745dea2f4de766529bfd5f159000fde0e8","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/3027755a-2542-4559-8ce4-5eb83a2cc929/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.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":307370,"archive_hash":"sha256:69942a26f934364e86bcf70a0981259d4e7ea425e8e5c78e9220297c45075b71","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/8e23b6e9-abf3-4200-8b07-fc01d4ee8443/","schema_version":"1.0.0"},{"id":"teca3d_wrap_for_blender","name":"Wrap For Blender - An Alternative To R3DS Wrap - Fitting A Base Mesh (Topology) To A Target [Before: $19.00, Now: $16.15]","tagline":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":26588917,"archive_hash":"sha256:c30d63a326fd39fc891fa5d6211080834bcf1f54841cec23324040faa7721081","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7748a436-368d-4e4c-8152-4ca6579945ad/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":"5.0.0","maintainer":"TECA 3D","tags":["mesh","modeling","wrap","retopology","character"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/3b628c1f-b0f3-4563-b7e1-e6da8c054d12/","schema_version":"1.0.0"},{"id":"xray_selection_pro","name":"X-Ray Selection Pro [Before: $7.99, Now: $6.79]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5532,"archive_hash":"sha256:b82c8b8e7e2354ec9af6a4b91b9696f5270645869c88cfe2d26ab7705418458a","archive_url":"https://www.blendkit.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.blendkit.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/extensions/www_blenderkit_com/.blender_ext/index.json@62c b/extensions/www_blenderkit_com/.blender_ext/index.json@62c new file mode 100644 index 0000000..af57d55 --- /dev/null +++ b/extensions/www_blenderkit_com/.blender_ext/index.json@62c @@ -0,0 +1 @@ +{"data":[{"id":"blenderkit","name":"BlenderKit [FREE]","tagline":"BlenderKit official add-on","version":"3.21.0-260628","type":"add-on","archive_size":39143952,"archive_hash":"sha256:fbeee0f603b5ca23aeb493d7826051d0d47ec2dd28ce1469b1a0f3197d2e1e8c","archive_url":"https://www.blendkit.com/addon-download/blenderkit.zip","blender_version_min":"4.2.0","maintainer":"Petr Dlouhý","tags":["blenderkit"],"license":["gpl"],"website":"https://www.blendkit.com/get-blendkit/","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","version":"0.1.1","type":"add-on","archive_size":3221,"archive_hash":"sha256:290e3502ded6546478da53ca321a15e1594a2b2bcef260bc02bc9cfcbcd28c31","archive_url":"https://www.blendkit.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.blendkit.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","version":"2.7.0","type":"add-on","archive_size":357801,"archive_hash":"sha256:0821a1b427ac6433ebb2ef0b802c50a48d8e5d268a70743fcec1f1e4c768307f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/b9a4a456-14ab-48c8-8942-1b387e386163/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.blendkit.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, ga","version":"2.0.2","type":"add-on","archive_size":2854741,"archive_hash":"sha256:d925ad69670118b04c21d28ab90bc39e60c434b8b6ba403d59b863459b51c812","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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 w","version":"0.4.5","type":"add-on","archive_size":9390,"archive_hash":"sha256:d283cea78c26d58101e5ba437df4a2e0ac222065039dd4ff33a9f0edb03c7b16","archive_url":"https://www.blendkit.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.blendkit.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","version":"1.0.0","type":"add-on","archive_size":1497,"archive_hash":"sha256:89883f484061eeaa1d810a7675211f87a62807f7d59e7e6bc4f10ed949595421","archive_url":"https://www.blendkit.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.blendkit.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 w","version":"1.0.2","type":"add-on","archive_size":7039,"archive_hash":"sha256:d9323c5ba0a4a3d6443a0091369f3e77a541dcfe14910bf13c54b90c97c55e97","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/13ae67a5-e751-4e40-99f0-b3e4631d9f97/","schema_version":"1.0.0"},{"id":"auto_file_cleaner","name":"Auto File Cleaner - Remove Unused Materials, Images & Meshes | Blender 4.0–5.0+ [FREE]","tagline":"Auto File Cleaner scans your .blend file for unused materials, i","version":"2.0.0","type":"add-on","archive_size":7669,"archive_hash":"sha256:06e0ba15d24ea745cc5f70dbdb127899d8cc8abf425c5ecdfbbe98b8bebb4c54","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2de4d389-0f76-4b8c-b1ee-d1b5526e395e/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":["System","Pipeline","file","cleaner","blender","cleanup","unused","materials","datablocks","optimize"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d7f60920-88bf-4e93-8ba9-2c1d978c7a17/","schema_version":"1.0.0"},{"id":"auto_paint_boundaries","name":"Auto Paint Boundaries [FREE]","tagline":"Paint cleanly inside smart, selection-limited regions with quick","version":"1.1.1","type":"add-on","archive_size":14645,"archive_hash":"sha256:5db1c2668d80db2e149ac3dd75fc2d15b7a6603e2da184468bd3588f29edb496","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/b5efacec-5ae6-46af-9576-79e2cefd69cb/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":["Paint","weight","vertex"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/45dcce2c-0aa2-4fd7-a989-104d9c074165/","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 t","version":"0.2.3","type":"add-on","archive_size":3489,"archive_hash":"sha256:ee0eb525953c0cf7c259636f1b747bc94c5e5f324bd61a1b54fd3c68bfa608bd","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.com/asset-gallery-detail/967c5989-0d66-402a-a1ca-56be2299f718/","schema_version":"1.0.0"},{"id":"batch_bg_cams","name":"Batch BG Cams [FREE]","tagline":"Automate multi-camera setups: Batch import clips, auto-configure","version":"2.3.1","type":"add-on","archive_size":5729,"archive_hash":"sha256:5b9c970deea58baf77051ba10d84244744e4f1ad5c425560a9630664ce3a2e0c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/74b24024-c0c4-40b0-b200-400c078cde58/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":"Hannes Werner","tags":["addon","camera","layout","background","import","timeline","productivity","automation","animation","video"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a30ce0f8-752f-4a55-b0e0-1cee72949d24/","schema_version":"1.0.0"},{"id":"batch_render_manager","name":"batch_render_manager [FREE]","tagline":"A Blender addon for efficient batch rendering from multiple came","version":"1.0.0","type":"add-on","archive_size":14882,"archive_hash":"sha256:9be8f16641985d1efab5f68c4d5c3a1b36c5a0f7a373df1a2f5aa3f13e5a909b","archive_url":"https://www.blendkit.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.blendkit.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 Lay","version":"1.2.3","type":"add-on","archive_size":4335,"archive_hash":"sha256:63187cc826a44655a1f20a4647aacf7c6967bf7007b91ceeb7291725dff35f17","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/052f32bc-4fdb-412c-8eb9-cd158434f84e/","schema_version":"1.0.0"},{"id":"benchmark_fps_v1","name":"Benchmark FPS & Vram refresher helps reduce crashes [FREE]","tagline":"Unlock real-time performance insights in Blender with the Viewpo","version":"1.0.5","type":"add-on","archive_size":7924,"archive_hash":"sha256:b3f167cd024e33a75f6b014429097d8910ad54b87e7cabce765b203a676d8332","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e3f39d7e-5eff-4703-a412-1a4b76006714/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":["memory","fps","gpu","cpu","test","addon","2025","blender","vram","refresh"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/47c7ca2c-4a53-4a7f-a858-34c5fa29dbb8/","schema_version":"1.0.0"},{"id":"motion_path","name":"Better Motion Path [FREE]","tagline":"A blender add-on that allows motion path adjustment inside the 3","version":"1.5.8","type":"add-on","archive_size":13164,"archive_hash":"sha256:c293b0fde8bc921e4ef7bdf8494e5a23d3cb6055f168d8f8ccff1f7c28488ea4","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/4f549895-734c-4ff0-85d1-ed79feac9976/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":"ジディー Jideeh","tags":["Animation","3DView"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/eba7a4e2-886b-48be-a304-4f7c69916793/","schema_version":"1.0.0"},{"id":"blender_revision_lite","name":"Blender Render Lite [FREE]","tagline":"BlenderRevision Lite is a free community edition that lets you r","version":"1.0.0","type":"add-on","archive_size":7727,"archive_hash":"sha256:ae14b80c7ec559f0c88eedf2b48fff0844e336d02789b8dc3a914b70f87738ab","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7925961a-194c-4612-bc12-72e38bed2abd/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":["render","compositing","workflow","optimization","revision","blender","addon","vfx","pipeline","tools"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e6ea1e56-5d03-45de-a0f8-463c7bf6d731/","schema_version":"1.0.0"},{"id":"shader_switcher","name":"Blender Shader Switcher Addon [FREE]","tagline":"The Ultimate Shader & Color Switcher Node System","version":"4.0.2","type":"add-on","archive_size":11114,"archive_hash":"sha256:03b4aed110d4613695a60fd94fd8f7a8d98c358dd5f2b2a813afc093ff642640","archive_url":"https://www.blendkit.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.blendkit.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 mor","version":"1.1.0","type":"add-on","archive_size":274896,"archive_hash":"sha256:531f8552ec19afeb5c55d7fecbeefa97fd456effe6310df0c696457969fab8d4","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/d7529892-10a8-4f96-86de-933d584bb9f5/","schema_version":"1.0.0"},{"id":"body_sculptor","name":"Body_Sculptor [FREE]","tagline":"A powerful Blender addon for advanced body proportions editing","version":"1.0.0","type":"add-on","archive_size":14676,"archive_hash":"sha256:af709f55a754174d26230a8f3cbcacff154bc3c651f46a9851f3aa93c91e174c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c26ff3b2-7474-451e-b957-cfa80dfd8a6f/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.0.0","maintainer":"ANDRIY LIA$HKEVI$H","tags":["blender","addon","body_sculptor","3d_modeling","character_design","character_creator","rigging","proportions","armature","non_destructive"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/75280d36-9b63-45bf-952b-bfa0f2d00a6d/","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","version":"1.0.0","type":"add-on","archive_size":1858,"archive_hash":"sha256:3c9b99fda4e7b5345fbf151c0db1fc14bdb7bcce44f65753ba4c14bb8f4d0666","archive_url":"https://www.blendkit.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.blendkit.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","version":"2.0.0","type":"add-on","archive_size":251303,"archive_hash":"sha256:fdc1a528d7808c897d7cf3469b09921a5b29174cfa6293400f82a1cd0eb65efb","archive_url":"https://www.blendkit.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.blendkit.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 objec","version":"4.3.0","type":"add-on","archive_size":6791,"archive_hash":"sha256:eab0f22f85eeb43acd57024e2f967002c09f335c83a8163bcc64ff0005fa7510","archive_url":"https://www.blendkit.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.blendkit.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 assig","version":"1.0.0","type":"add-on","archive_size":1838,"archive_hash":"sha256:c066fafb8e07e092ad7f5f806f042f71662cc6183657be1ef1f2a0c861cc08f5","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/1a9af258-e75e-44c8-81e9-869249addb8d/","schema_version":"1.0.0"},{"id":"camera_switcher","name":"Camera switcher [FREE]","tagline":"Quickly switch between all cameras in the scene from a dedicated","version":"1.0.0","type":"add-on","archive_size":2308,"archive_hash":"sha256:fe505d31d4cbc6a364c8a48b63aafc8d04e816b041fcbe852f5da61bddc1025d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/68c92d93-988d-48f7-95c1-bdb084c22362/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.00.0","maintainer":"Remigiusz Waluś","tags":["camera","view","active"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/056e30fd-f62d-4fb4-9a53-95be346475c3/","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","version":"1.2.2","type":"add-on","archive_size":513576,"archive_hash":"sha256:61fc9b726002f7cd17ffb5b1e54bfa1827e8edf538881e72749f4faf931dc384","archive_url":"https://www.blendkit.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.blendkit.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","version":"1.0.0","type":"add-on","archive_size":1490,"archive_hash":"sha256:607cf00fe41582b4eaeb640cb6ad8dc9944731be643022c810fbb2a799abef0b","archive_url":"https://www.blendkit.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.blendkit.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 starte","version":"1.0.0","type":"add-on","archive_size":135827,"archive_hash":"sha256:d2d49d2c9665add7c55181a343759dde9bfa5de723d4bb3075b93694822d46ac","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/f8432983-2d65-4d16-a7ef-36ee5fcc7220/","schema_version":"1.0.0"},{"id":"cgheven_blender","name":"CGHEVEN Asset Library [FREE]","tagline":"100+ Cloud VDBs (fire, smoke, tornado, portals, explosions, dust","version":"1.0.0","type":"add-on","archive_size":138712,"archive_hash":"sha256:f4f3d8461ac1edb6f56b6e3a56b5047784bb854606fa01cdbc40cf99255cdfe4","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c16124bd-9c82-44c8-82eb-51dc2cc79e7f/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":"CGHEVEN","tags":["free","VFX","VDB","Flipbooks","clouds","fire","explosion","Magicfx","3dscan"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/ba084cd6-c1af-459f-8d71-f645489708ba/","schema_version":"1.0.0"},{"id":"cleanx","name":"CleanX [FREE]","tagline":"CleanX is a Blender right-click menu addon designed for 3D asset","version":"1.0.0","type":"add-on","archive_size":13355,"archive_hash":"sha256:4e312c21ac1dbb00023ab28c841ff7acd14ea714250363ae6b32f8fbba538cb3","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/797da2fb-3b8a-49dd-8bb0-62e0474258a0/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":"Free poly","tags":["clean","texture","delete","pack","model","packages","compress","resize","snap","hierarchy"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/307f20ee-8d34-4371-9bb0-5f417f43e870/","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.blendkit.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.blendkit.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 transfor","version":"2.0.0","type":"add-on","archive_size":1925,"archive_hash":"sha256:0b5ea205238edbd92d77f10ac909b9e66fda38c14bdc05a52e4253c10bece865","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/e4d8305e-3eca-477f-8b08-afa17bf621ce/","schema_version":"1.0.0"},{"id":"copyx","name":"CopyX — Cross-Version Copy & Paste for Blender Objects [FREE]","tagline":"CopyX lets you copy selected objects from one Blender file and p","version":"1.0.0","type":"add-on","archive_size":5027,"archive_hash":"sha256:af90abab4b0fdeba0b41982697f3b28b08cb549a4465e9e1da7fba52e090f0db","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/1031b3ec-dfbc-415f-b0c0-d7954d7596af/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":"Free poly","tags":["3DView","Object","copy","paste"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a97311ce-49fa-4191-b7aa-ce3e70f1beef/","schema_version":"1.0.0"},{"id":"CountDown3d","name":"Countdown 3d [FREE]","tagline":"Quickly add customizable 3D timers (countdown or count‑up) to yo","version":"1.5.0","type":"add-on","archive_size":4799,"archive_hash":"sha256:49bbf5981614ed4fef283a4501654b98312dc61ea0790cab12e856f66f875a84","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/cafb5d64-82e6-45d5-ae1f-2a6c504a3838/","schema_version":"1.0.0"},{"id":"custom_snap","name":"Custom Snap [FREE]","tagline":"Custom Snap is a fast addon that enhances the default snap syste","version":"1.0.0","type":"add-on","archive_size":2927,"archive_hash":"sha256:4b3745f1bc6df4dd0f9575248ded2a3a11ed5858bfa3d5e85a99396d0b1baf65","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/053f20f2-683f-46c3-b7d1-79c47453eb13/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.0.0","maintainer":"Jeslin Paul","tags":["3DView","snap","origin","selection"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0e6e9617-b4f3-4267-adca-e8a2d557f509/","schema_version":"1.0.0"},{"id":"Delete_Loose","name":"Delete Loose [FREE]","tagline":"with this handy addon, you eliminate smaller and loose parts of","version":"1.2.3","type":"add-on","archive_size":2391,"archive_hash":"sha256:9fdf99f92ab399377ec92a0d3bf25bce5891384b9a0ed61ce8def18314b60f58","archive_url":"https://www.blendkit.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.blendkit.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 consta","version":"1.0.0","type":"add-on","archive_size":2873,"archive_hash":"sha256:9d0cb8dbcfadb9e4e70c7ba952299be23f179d4d458951db659f0a5a551f7670","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/f7a51ab2-f758-464f-817b-ad010cb643bd/","schema_version":"1.0.0"},{"id":"dice_forge_pro","name":"Dice Forge Pro [FREE]","tagline":"Generate canonical polyhedral dice (D4–D20, D100) with text, cus","version":"1.1.1","type":"add-on","archive_size":36003,"archive_hash":"sha256:75344c4ace13fa032f5cb7cc4a0c823bc09057180faeb77c68cc026055f0b865","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9e97f36d-99ac-4e8f-807b-e0f09fccfa8f/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.0.0","maintainer":"Fabio Malvaldi","tags":["ttrpg","rpgdice","dicemaker","dicegenerator","tabletoprpg","dnd","3dprinting","customdice","RPG","DICE"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/fbf85f8a-1963-420d-a8d7-6c54b538fcf0/","schema_version":"1.0.0"},{"id":"down_to_earth","name":"Down-To-Earth [FREE]","tagline":"Auto-snap any object to the nearest surface in your scene — no s","version":"1.0.0","type":"add-on","archive_size":6404,"archive_hash":"sha256:8e008319495acce4379943ad4ee198a531d7a6367cffdc245b8a8e23c5f410f7","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/dab12edc-301b-4772-b1fd-a5abe89bf212/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":"GoldFish CG","tags":["Snap","Tool","base","surface_snap","placement","object_tool","scene_assemble","one_click","grounding","productivity"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/81e4af0c-b0a4-4c7d-b7b4-190afdbd1e99/","schema_version":"1.0.0"},{"id":"easy_measure_tool","name":"Easy Measure Tool [FREE]","tagline":"A lightweight add-on for quick measurements","version":"1.8.3","type":"add-on","archive_size":11147,"archive_hash":"sha256:d8e8f97500e44d4e9c77fe133dccca151df3f1c08f7aa50e7e7feaa0adbb8010","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/8142dce2-f9c4-4f20-a5c6-402460d5f145/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.blendkit.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 a","version":"1.0.0","type":"add-on","archive_size":4790,"archive_hash":"sha256:2aad46cd10d876e3ab5d5f69a927c9b423a0f2d14eb47fbedbd6c380f65293cc","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/f31d8f0b-ee2b-45ec-9f4b-4aae75a7160f/","schema_version":"1.0.0"},{"id":"Eyes_of_Masyaf","name":"Eyes of Masyaf [FREE]","tagline":"Asset inspection and workflow guardian for Blender","version":"0.5.2","type":"add-on","archive_size":20333,"archive_hash":"sha256:d6f4f04d0420347b0cc1270796776e010304250caa82c77c8998fac4ef4b3791","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/61711621-e714-497b-9b3e-67a9354eaf0b/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":"Reza NeoMasyaf","tags":["Object","Mesh","UV","Workflow"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e26feba5-e5df-469b-98cc-076cfc3c5748/","schema_version":"1.0.0"},{"id":"facemesh_capture","name":"FaceMesh Capture (MediaPipe) [FREE]","tagline":"Create a textured FaceMesh from webcam or photo using MediaPipe,","version":"0.4.0","type":"add-on","archive_size":11286,"archive_hash":"sha256:8714eff32dcda7ff8fc554d0714ae815805c17f6def1b4e45027d6ff0e3a9dc8","archive_url":"https://www.blendkit.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.blendkit.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 suppor","version":"2.0.0","type":"add-on","archive_size":4059,"archive_hash":"sha256:77bbac7d17fd132350d9bf065ef2c2de2f4f575fec639d72149d7cb0d5ab77d3","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/7d69be65-9004-4469-bd9c-beb29e1ec99b/","schema_version":"1.0.0"},{"id":"global_clip_sync","name":"Global Clip Sync [FREE]","tagline":"Adjust Clip Start and Clip End across all Blender workspaces fro","version":"1.2.0","type":"add-on","archive_size":1725,"archive_hash":"sha256:928d5139fbc88bd54e54eafa1d46833264d8ef7d622ebfb7c4991729588645d5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/1112186c-ba61-43b7-83d3-e607ef234c4d/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"5.1.0","maintainer":"Leo Villanueva","tags":["Viewport","Clipping","UI","View","Tools","Clip","Display","Distance"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d673a38f-4133-495e-9875-fb020048cef0/","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 Sta","version":"1.0.0","type":"add-on","archive_size":2292946,"archive_hash":"sha256:b77a68f7e34b9c5f9c66fafef6825a0575fe8605c8da51a567dff3cd94fa358f","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/26a86759-a4b3-4545-ad67-106a89737f54/","schema_version":"1.0.0"},{"id":"graphi_free","name":"Graphi Free [FREE]","tagline":"Graphi Free is a lightweight Blender add-on for shaping easing c","version":"1.0.0","type":"add-on","archive_size":5009,"archive_hash":"sha256:f1336e92f03ccf6314eab0c9cf739b95316d9da669e10294e146b5d1c5495b3d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e508361c-87aa-4460-8427-f354e4cdf83d/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":"AHMED KETTUR","tags":["Animation","GraphEditor","Keyframes","Addon","Easing","Bezier","FCurves","MotionDesign","Workflow","3DAnimation"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a3ac0ded-6b76-40bb-83d3-9a8ef1d547f6/","schema_version":"1.0.0"},{"id":"item_transform","name":"item transform [FREE]","tagline":"A Blender addon that provides quick transform operations for sel","version":"1.0.2","type":"add-on","archive_size":6957,"archive_hash":"sha256:6a78724c1d6cb68d9a691c6f2e8403844860a064f9257d0b22eac7a124bc7ecf","archive_url":"https://www.blendkit.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.blendkit.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","version":"1.3.1","type":"add-on","archive_size":6538,"archive_hash":"sha256:afe900cdb0a244c3f4aadab240cbfc5ce0942f68673803924e7ed72d4023d406","archive_url":"https://www.blendkit.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.blendkit.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","version":"1.1.1","type":"add-on","archive_size":54772,"archive_hash":"sha256:2ef9d7ad94bce0ff2e811677230a5daa4f8fc607fa1123478d923f624fa933d0","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/8626f2ca-193c-4f15-8011-200c5d0a2e9b/","schema_version":"1.0.0"},{"id":"Lets_turn_on_fake_user","name":"Let's turn on Fake User [FREE]","tagline":"Are you tired of Blender delete your file(s)?, Even though you s","version":"1.0.3","type":"add-on","archive_size":6837,"archive_hash":"sha256:3815d47845cdb03a46c26891a69e7be9b4fd2952e88081a327f92244bf4ec4e1","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/4bfd4128-90b5-40cc-aa29-3b48be5b8b14/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":"Theiyn tnz","tags":["System","Workflow","Animation","Save","FakeUser"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e1c19457-113b-4f5d-b1f2-317318942cb7/","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 n","version":"1.0.0","type":"add-on","archive_size":2046,"archive_hash":"sha256:46ac6e96e5eb3cda09a1ad70342f492abcc28b276ceba020a2c891e50c016820","archive_url":"https://www.blendkit.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.blendkit.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","version":"1.0.0","type":"add-on","archive_size":2026,"archive_hash":"sha256:07c076a2f8e842a5eb167a7e90f64a5805ccd2582d78625da664d833a61e1b82","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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 geomet","version":"1.3.0","type":"add-on","archive_size":10274,"archive_hash":"sha256:1293382cde627aa9f16c8c25e9e2e2775ee8b1793ebf672f87ccbc60e5f672cf","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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 professio","version":"0.1.0-beta","type":"add-on","archive_size":107115,"archive_hash":"sha256:fc2a66562a83772e8752a1d4acad647634ef20c09e117578924b3adc62d249f5","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/20da5129-5479-4f45-a450-ef70cfc0ee5e/","schema_version":"1.0.0"},{"id":"teca3d_mesh_welder","name":"Mesh Welder - Merges Two Meshes into One, and Vice Versa [FREE]","tagline":"Mesh Welder is a simple add-on for merging and splitting models;","version":"1.1.0","type":"add-on","archive_size":10360,"archive_hash":"sha256:f3e75ef3a17e04447cf9a2ae943654026ab15fcf431029722a57de242d5bb385","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/cd7b88aa-a1f9-4c7a-a027-bbb6c84a2f0e/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"5.0.0","maintainer":"TECA 3D","tags":["3DView","Mesh","UserInterface"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a467e686-8d87-473a-9aa6-39154f685dfa/","schema_version":"1.0.0"},{"id":"multi_object_export","name":"Multi Object Export [FREE]","tagline":"Export multiple selected objects individually in one click using","version":"1.3.0","type":"add-on","archive_size":7107,"archive_hash":"sha256:54acc7d04a2938e3da46c303d15f131960209d60c4e91fb8792410ff4342c04f","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.com/asset-gallery-detail/9076e710-cedc-4b37-92b2-16b38fa0997b/","schema_version":"1.0.0"},{"id":"NeonSignPro","name":"NeonSignPro (Development) [FREE]","tagline":"Professional Neon Sign Generator with HEX, Flicker & Custom Font","version":"0.0.1","type":"add-on","archive_size":3465,"archive_hash":"sha256:a6d40a2c6245256a1a6a76b9b3636f55e955a7e0bcfb47502aa1c0f31f0dc103","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/65c1c0b5-a3ad-49bc-8af9-903817e9ddcd/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"5.0.0","maintainer":"Wikz B","tags":["easywaytogenerateaneonsign","neonsignpro"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/36f58375-aa62-4424-bfb0-51c80302bb4f/","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","version":"1.0.3","type":"add-on","archive_size":4752,"archive_hash":"sha256:e59fd49dbc701c9f45705e7f28dcf4d5d93dc13bf8820a5c8bf813a50c33b1e7","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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 hier","version":"1.2.1","type":"add-on","archive_size":2022,"archive_hash":"sha256:92acc75cacffd655deae6760fe888a19acfbc48e5366bb232adb202a28c1b8ac","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/da7cfd8c-36eb-44ef-b5b5-44cf92c63506/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.blendkit.com/asset-gallery-detail/67ab12d4-3e48-4bce-affb-30a6b6095fb2/","schema_version":"1.0.0"},{"id":"pinned_modifiers","name":"Pinned Modifiers [FREE]","tagline":"Pinned Modifiers is a Blender add-on designed to speed up our mo","version":"1.0.0","type":"add-on","archive_size":21507,"archive_hash":"sha256:c17a73e1a8c07ffc63c9c58626fd38e72e939fc23a2b6f122b59a20374ea77e6","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/eb576247-2e8e-4b41-9b81-b82243cf9e4a/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.3.0","maintainer":"Francesco Yoshi Gobbo","tags":["UserInterface","Modeling"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2f242640-80dc-45d1-9baf-bc0de85e1fc5/","schema_version":"1.0.0"},{"id":"pomodoro_timer","name":"Pomodoro Timer [FREE]","tagline":"Boost your productivity with this amazing N-Panel widget! If you","version":"1.0.0","type":"add-on","archive_size":5004,"archive_hash":"sha256:3ae73f0701bbae44934d253689dea84f7858f61f3a5e88c02966623c911cede3","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/e382a037-62c0-4266-a312-9c4fecf2e494/","schema_version":"1.0.0"},{"id":"procedural_building_generator","name":"Procedural Building Generator [FREE]","tagline":"Create instant, game-ready 3D cities with the Procedural Buildin","version":"1.0.0","type":"add-on","archive_size":10370,"archive_hash":"sha256:cc91376be52c17e60fd7657b12eb03e49da8b020571610a6a86147cc55d5cce3","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/429bb6e8-0c26-400b-8545-c60984c390b7/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":["AddMesh","Modeling","addon","procedural","building","generator","plugin","city"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/040d9c18-3746-4987-a087-8257751611a4/","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.blendkit.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.blendkit.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 ca","version":"1.0.0","type":"add-on","archive_size":2587,"archive_hash":"sha256:bd88afe070d59e6df44c4d7e2f6a264508f31cb96d67edda45d5dc5adbd22dab","archive_url":"https://www.blendkit.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.blendkit.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,","version":"1.1.0","type":"add-on","archive_size":5948,"archive_hash":"sha256:7cd0d15de0a31d89fa52284f109c191164e99f4ac31ef151f9b32f5d362413c9","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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.blendkit.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. Simp","version":"1.3.0","type":"add-on","archive_size":3248,"archive_hash":"sha256:9a6d7fcdf5ab075c3731d5253413f71fc7b5b92c4e8ccec5ebbb2d8100380720","archive_url":"https://www.blendkit.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.blendkit.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, Sm","version":"1.0.0","type":"add-on","archive_size":3266,"archive_hash":"sha256:d1bbf787a368b4f2dd956c1cb14710bc9b3caa76fd1ca56b9a4fbdc56b4ea6c2","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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,","version":"1.1.4","type":"add-on","archive_size":182021,"archive_hash":"sha256:d62a0e5ac70943ea42fa5d54d7e047792b45b16cb0e602f8278369c3e1fb5500","archive_url":"https://www.blendkit.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.blendkit.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 b","version":"2.0.0","type":"add-on","archive_size":16684,"archive_hash":"sha256:5b3b0b59abad0e887e6b5b9511ef3ef64830b75e0ddfabaabdbdf82283efabdb","archive_url":"https://www.blendkit.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.blendkit.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 & displacemen","version":"1.3.3","type":"add-on","archive_size":161147,"archive_hash":"sha256:9efc25e28b0dd1199d59f501ad1625e046cbb5616c1634660e6166bf96076199","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/a2d0027b-8cc7-450e-9e6e-18e4c8e7f734/","schema_version":"1.0.0"},{"id":"ReadyScene_addon","name":"Ready Scene 1.0 [FREE]","tagline":"Ready Scene– Blender Addon for Quick Scene Setup","version":"1.0.0","type":"add-on","archive_size":4741,"archive_hash":"sha256:6c17f1d4f95da37b2375b5a26890db5cc21eb8cc4dbd620187aeccb89582a928","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f2eacecd-ef95-4fa2-b6ef-8d25415f29a9/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":"ANDRIY LIA$HKEVI$H","tags":["parallax","scene","camera","layers"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0f55cc80-1fdd-4d66-9346-9614039486d6/","schema_version":"1.0.0"},{"id":"reflectiveaudiomachine","name":"Reflective Audio Machine v1.3.4 [FREE]","tagline":"Reflective Audio Machine - Turn Your Music Into 3D Visuals in Bl","version":"1.3.4","type":"add-on","archive_size":36299830,"archive_hash":"sha256:1695810a6bb5809540f9d07093a5d3acad3215b683450c01fc25560827ececc6","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/6455ae0e-e1af-42df-81b9-e3b73f7cc4cb/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.5","maintainer":"Jacques Durocher","tags":["audio","sound","music","wav","visualisation","reaction","react","animation","pulse","wave"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/11608830-074c-4fc8-94ba-4fbd90a87531/","schema_version":"1.0.0"},{"id":"reflux_addon","name":"ReFlux Render Optimizer [FREE]","tagline":"⚡ ReFlux — Faster Renders, Smarter Workflow","version":"1.0.0","type":"add-on","archive_size":6105,"archive_hash":"sha256:319dd16b471cf3e1e9254952ae12851b5f3a63381372b548282c4a13aee49c24","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/35d38941-00bf-4349-b7aa-f88f41339dc4/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.0.0","maintainer":"Swastik Rout","tags":["rendering","render","fast"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/5aefa8de-dde0-4c0f-a7d6-8b01b75ea519/","schema_version":"1.0.0"},{"id":"render_alert","name":"Render Alert [FREE]","tagline":"An addon that alerts the user once blender is done rendering","version":"1.1.2","type":"add-on","archive_size":2979,"archive_hash":"sha256:3f749a92dff7e039724e9a8b9f1d08700f282c0671eace50ac0a0dd8a86e0394","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e162ae62-7936-45a4-adb6-a4aa222e4d80/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":"ジディー Jideeh","tags":["Render","UserInterface"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/bdc3f751-d493-4997-847b-77f328d560f5/","schema_version":"1.0.0"},{"id":"rendermanager","name":"Render Manager [FREE]","tagline":"Render Manager - A render queue management tool for Blender. Cre","version":"1.7.0","type":"add-on","archive_size":4101,"archive_hash":"sha256:d657357fbdb72f75d28157d2d98cc0dd58e93e7e9966f1dba9121b8ca4da4530","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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":"5555dnl_3d","tags":["render","scene","studio","toolkit","preview","libary","asset","lighting","presets","setup"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/5238fe33-ff61-4add-bee5-27c885666c89/","schema_version":"1.0.0"},{"id":"scatter_directional","name":"Scatter Directional [FREE]","tagline":"Precise density and orientation controls (primarily to follow th","version":"1.2.0","type":"add-on","archive_size":9904,"archive_hash":"sha256:88676fc546dd29d363628a11a83ad2d03d21735fbf2f5b348910ef3ab7851592","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/3d6829ba-ee12-445d-93a7-a4ffcf10b336/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":"3DFIGURES rian","tags":["scatter","directional","proxy","previewer","trianglepreviewer","randomize","convertmesh","aligntonormalorientation","orientation","normal"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0facc425-e629-414c-b30b-397abf1a01ce/","schema_version":"1.0.0"},{"id":"scene_data_exporter","name":"Scene Data Exporter [FREE]","tagline":"Exports scene data for AI analysis (TXT/JSON)","version":"1.26.0","type":"add-on","archive_size":9942,"archive_hash":"sha256:08675fc6fa158c3d99eb5c47f19186237d58608d42dc8681bf045e7294bf44ef","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/5f6b80d0-8db7-47e8-9e56-e16e55aed861/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":"Joachim Bornemann","tags":["ai","export","json","data","workflow","scene","python","automation","analysis","development"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2c90b1d0-f252-4510-abc5-880d1aa6826b/","schema_version":"1.0.0"},{"id":"scriptpilot","name":"ScriptPilot [FREE]","tagline":"A lightweight add-on to increase search and navigation functiona","version":"1.2.0","type":"add-on","archive_size":12017,"archive_hash":"sha256:417168679a551ce8c6ec5a74e6955efa953bef5bf80fe7a83157b03e303eb5d8","archive_url":"https://www.blendkit.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.blendkit.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","version":"1.0.4","type":"add-on","archive_size":4277,"archive_hash":"sha256:56b28e5fb681ea4ab21f6539c6264e5eaa209a30df9ce3b1fb58a70ee2ffc748","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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","version":"3.0.2","type":"add-on","archive_size":49645,"archive_hash":"sha256:cd64d1e255d54f373ee9220c0a208ce299dc0169faa307af642de46cd402c51f","archive_url":"https://www.blendkit.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.blendkit.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":551003,"archive_hash":"sha256:86b18a7ba0d743812eb871e1a573b3d58ca66bdfc78077aa1cf7a59f65d3e11b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/5bfc561c-3796-4225-899d-efed286bd197/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.blendkit.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","version":"1.5.3","type":"add-on","archive_size":9723,"archive_hash":"sha256:d278b9416739f1baf80bc178f8b621cc198bd2353a22b0b8da5a0188115357ab","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/4043ed89-4af5-4502-828b-5fc3f5ec55e1/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.80.0","blender_version_max":"5.0.0","maintainer":"Yakiv Sankov","tags":["gamedev","rigging","animation","addon","scale","unity","unreal","fix_animation","armature"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/8d205ca1-cbf6-4a10-903f-0148e9d631a0/","schema_version":"1.0.0"},{"id":"smart_material_painter","name":"Smart Material Painter [FREE]","tagline":"​Smart Material Painter","version":"4.2.0","type":"add-on","archive_size":25766,"archive_hash":"sha256:f9f5ab77f2a434cfbdbc6f3533abb2058de2faa82487c2a7c3c5df5700fc73ea","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e95a879a-6837-4a56-944b-b331d0777c09/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.0.0","maintainer":"Meshmind egwoba","tags":["Material","Paint","UV","Object"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/5a7e38f5-4ea4-4f65-b2c6-5b96d9344c4f/","schema_version":"1.0.0"},{"id":"sol","name":"SOL [FREE]","tagline":"8 one-click particle presets for Blender: sparks, fire, firework","version":"1.11.0","type":"add-on","archive_size":59092,"archive_hash":"sha256:9383c79b02a06833c6c7fdfd7bcb4f5e4124c8b72fb3ad1c209a8cec5ab1a60c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/562ad6a9-f189-4bb9-8d66-18bff85d1c34/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","blender_version_max":"5.2.0","maintainer":"Cloudy Sky","tags":["Object","Physics","presets","particles","fx","Fx","Vfx","VFX"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/4b2ad94d-559b-4705-9009-323d60693976/","schema_version":"1.0.0"},{"id":"solo_mode","name":"Solo Mode [FREE]","tagline":"Solo Mode helps Blender artists work faster by isolating selecte","version":"1.0.3","type":"add-on","archive_size":3323,"archive_hash":"sha256:8890473d4c81ed5b3c9e66a25c4c0205cca146e3e48e9c050fb3d5a2c256166a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/ed1a7e7a-b8bf-457f-9dd7-c07bdd5aa89b/addon.zip","verification_status":"validated","can_download":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"blender_version_min":"3.6.0","maintainer":"Vincent Ilagan","tags":["3DView","Object","3D","View","Workflow","Productivity","Viewport","Solo","Solomode"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/fd8b8c65-7ded-48f1-afa7-b2908baafcdc/","schema_version":"1.0.0"},{"id":"subdivide_selected","name":"Subdivide Selected [FREE]","tagline":"This plugin applies subdivision to a selection with clean topolo","version":"1.2.3","type":"add-on","archive_size":2597,"archive_hash":"sha256:f964bb44f8f1dccfa4cb7c880b5fc3b742b749190e88ec0b39b57842c0097bf8","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.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 al","version":"1.0.0","type":"add-on","archive_size":19532,"archive_hash":"sha256:1cfb365cb2667c8d5a600275a81ba033c21e426423885d228fd57aa85c525d3d","archive_url":"https://www.blendkit.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.blendkit.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 Landsc","version":"2.1.0","type":"add-on","archive_size":1891,"archive_hash":"sha256:e6bc031d13a16343fd7f0672f97edbb5567ef29600b457881be11c477cfa1c42","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.com/asset-gallery-detail/d55d15f7-22f3-433f-9e6a-e7b3544256c0/","schema_version":"1.0.0"},{"id":"texture_bakery_image_buddy","name":"Texture baking image buddy [FREE]","tagline":"Add-on for creating empty images and their image texture nodes i","version":"1.6.8","type":"add-on","archive_size":134546,"archive_hash":"sha256:384048dd9e5c08c899b7d19c453a5be841b9b8ba89064ed607d5ba21fe479204","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/4c531eb1-ecd6-4b20-835c-85e8bcce698f/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":["Material","Node","Workflow","Baking"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/c52a840f-f69b-48c9-92ff-520bd166ecab/","schema_version":"1.0.0"},{"id":"texture_upscaler","name":"Texture Upscaler - Offine Image Upscaler For Blender [FREE]","tagline":"This addon lets you upscale your textures in image editor","version":"1.3.0","type":"add-on","archive_size":200727626,"archive_hash":"sha256:6a71e383d902259c98be3deed66ebb7426c32aa2faf638295e6e4a0ab15078e5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/6964e35b-6cf3-484e-ab91-e8600f5b418f/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":"Haseeb Ahmed","tags":["upscale","texture","PBR"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/999f5f40-469c-4d46-8647-42babafe320e/","schema_version":"1.0.0"},{"id":"amazing_hypotrochoid","name":"The Amazing Hypotrochoid 1.0.9 [FREE]","tagline":"Generates intricate hypotrochoid curves with adjustable paramete","version":"1.0.9","type":"add-on","archive_size":28189,"archive_hash":"sha256:25a502b65b9332a0b53c601d66096dc8a1ceaf7af82ea7cf510d832b0b910c0e","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.com/asset-gallery-detail/efb9a92c-fe00-40dd-a3cd-70c4086143c0/","schema_version":"1.0.0"},{"id":"tmeasure","name":"Tmeasure v1.1 [FREE]","tagline":"It accurately calculates the curved or linear edge paths of the","version":"1.1.2","type":"add-on","archive_size":4978,"archive_hash":"sha256:112307b7d10a7d3e66ca7245e8f52aa4a5df709d1c453bcd1ffc268472f4b9bf","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/26d14398-683e-48ff-8c34-dd15191bcae3/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 Tonka","tags":["Mesh","Modeling","3DView","measure","calculation","measurement","precision","tools","hardsurface","editmode"],"license":["default_addon_license"],"website":"https://www.blendkit.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 Emu","version":"1.4.0","type":"add-on","archive_size":1343,"archive_hash":"sha256:e0eb54d5bc012e9d262c255df472ac0cdcf194a366f914d4c488525ed795c497","archive_url":"https://www.blendkit.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.blendkit.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.blendkit.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.blendkit.com/asset-gallery-detail/fb812bd3-5913-4549-91fc-1ff8e5c486b7/","schema_version":"1.0.0"},{"id":"tuberig","name":"TubeRig — Make your rig controls actually visible [FREE]","tagline":"TubeRig takes your existing Custom Bone Shapes and wraps them in","version":"1.1.0","type":"add-on","archive_size":24455,"archive_hash":"sha256:02d6cec8b3486cbe1e84272c5af48e13b78d8e801feb1b1ff7b39ed155cb32f5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d1cd8f43-1581-4de9-97dc-326c0bcfd853/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":["Rigging","Animation","Addon","bone_widget","custom_bone_shape","geometry_nodes","rig_controls","tuberig"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e2da7972-168a-4dd1-a415-f971c73a8503/","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.blendkit.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.blendkit.com/asset-gallery-detail/8ebcbb43-4807-42e2-9ae1-9bef04b58aea/","schema_version":"1.0.0"},{"id":"xcut","name":"XCut [FREE]","tagline":"Cut (Ctrl+X) for Blender's Outliner and animation editors","version":"1.0.0","type":"add-on","archive_size":4238,"archive_hash":"sha256:4065b43f89015d76880252c2d8e2b3a2e91ed19a304f71c5c11f5c60a1c5bc11","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c0561ccb-79ea-4633-86e7-122673f9a21a/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","Scene","Animation","cut","edit","useful","Cut","shortcut"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/73d5e3e9-c9e5-43d6-91e6-11ea780a3004/","schema_version":"1.0.0"},{"id":"cobweb","name":"Cobweb [FULL]","tagline":"FULL plan required - upgrade to download","version":"2.2.1","type":"add-on","archive_size":50711,"archive_hash":"sha256:0706d2533db72a8d7e824ede71d7bfe84e3fea73a6454b3c3672900d7a8b8b41","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/20d48d8d-39a5-4d1f-9fb0-994401b2a9c2/","schema_version":"1.0.0"},{"id":"final_topology","name":"Final Topology for Artists [FULL]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":627177,"archive_hash":"sha256:0a9d55a9a02cb026fa969eeaf7f7eb11258732eeb8322e09c136e28da0aa8a4f","archive_url":"https://www.blendkit.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":"Blendkit Community","tags":["System"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/388b195c-5a7d-4d9f-a632-0dac12c9198c/","schema_version":"1.0.0"},{"id":"two_d_people_archviz","name":"2D People [Before: $11.99, Now: $10.19]","tagline":"FULL plan required - upgrade to download","version":"1.6.0","type":"add-on","archive_size":256485,"archive_hash":"sha256:ab84c4836a19c106c9c4cc64772b1a793c71c119258eacb7efaf532d9857d4cd","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2f40621f-a3c3-4b2f-9266-11e3b7e3be2c/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.3.0","blender_version_max":"5.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":42045461,"archive_hash":"sha256:9b8c84af187c955f914a5b0b78e1e4284e0b59c0c1fe1a9c2ac28f18ee7d1e2d","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":73577,"archive_hash":"sha256:b1aff6a799bce2cb9891d217dc2795c1b57830f81d430e40fd15fbd613798a92","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.1","type":"add-on","archive_size":41658,"archive_hash":"sha256:d1e2b4545aafd73466c8f3525f2f7baf2ac4fc418e20fb31c9eed4ead61cf0f1","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/e0bc8018-886c-4c41-ae18-2097088e3b48/","schema_version":"1.0.0"},{"id":"advanced_modifier_tools","name":"Advanced Modifier Tools (AMT) [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":26641,"archive_hash":"sha256:390d9e74a4786fd18958d7bf5adb8f9eb9bbc60527a136e8b6f8da045d63e054","archive_url":"https://www.blendkit.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":"8.50","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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":12066,"archive_hash":"sha256:52f11f2ebfd2f323c7f6d0497bc4cf7f9e182c956a59bc06f8333316769f3b24","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.8.0","type":"add-on","archive_size":11078,"archive_hash":"sha256:99844c2df0e2bd04d5f1326e199a57507ad60affc64223a7b5809b33e0c23997","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/4f4adf7a-d4c9-400d-85ee-53b73a3cc14f/","schema_version":"1.0.0"},{"id":"align_distribute_objects_pro","name":"Align & Distribute Objects Pro ULTIMATE [Before: $2.00, Now: $1.70]","tagline":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":4516,"archive_hash":"sha256:198a0ba8b51c2fea507da48921704fdc39f6f506420881efd7b3b689c543f7f5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9f79e7e7-f980-427d-88fb-96b0ef350e39/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.0.0","maintainer":"isac lima","tags":["Object","Modeling","Scene"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/14106c2f-74a6-4d17-9447-a93f2bd0b56f/","schema_version":"1.0.0"},{"id":"align_toolkit","name":"Align Toolkit [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.1.1","type":"add-on","archive_size":15041,"archive_hash":"sha256:024b25133b7ba4de512a7043fcd1fdf4e1dda61fb407db9118d477cb293743b4","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":20121,"archive_hash":"sha256:393d1f896b9aba97226956a59a1b15cc0d0ae501517ab8c54a46603f967b3eb9","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.5.0","type":"add-on","archive_size":64598868,"archive_hash":"sha256:2c2840bbfceada6d70b37dfac28bae7e3b347be5ad871d64332b24c91bb647a8","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":385592,"archive_hash":"sha256:b72f2d7159a888113322cda4646363adb8e52698b1af624e0e4c4fcdcf380133","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":11811259,"archive_hash":"sha256:a6da266309f0c9e57df4ac8c73c96a8cc539751b413283b5d8c53c42bc055236","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":187750,"archive_hash":"sha256:ab0672cd273718e0b180a0b62885c7700f3a9c87e012368f4aaa56135563802b","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.4","type":"add-on","archive_size":174446,"archive_hash":"sha256:6ba53c2008f5ebbe9eb4cd5a58b37f2cf008729a95875a37dffc32628af00b6d","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/fe9df247-5dd5-441d-91dc-aafdde63db3e/","schema_version":"1.0.0"},{"id":"animation_layers","name":"Animation Layers [Before: $30.00, Now: $25.50]","tagline":"FULL plan required - upgrade to download","version":"2.4.1","type":"add-on","archive_size":99251,"archive_hash":"sha256:9c20bef2b59833a0663a26d96dabb2eceaa71760be15bd49922c5e132c3584b6","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/14f01b6a-4082-4c6c-8229-9ac05d0d3158/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":"Tal Hershkovich","tags":["Animation","layers","motion","capture","mocap","nla"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/797ac060-785e-49dc-a98f-d0ecf4abc555/","schema_version":"1.0.0"},{"id":"anime_outline","name":"Anime Outline [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":740454,"archive_hash":"sha256:be4d38ab3ece3bc788ffa1ada8dfd9883925db1ecd6916a34937adfa56aab70c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/5d916717-58fe-4e6e-b6b8-1d10ee208c75/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":"3.6.23","maintainer":"Andy Hellgrim","tags":["Modelling","Import","Export","Outline","Anime","Eevee"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/6a6bb31d-7a31-456f-a05c-dae63d03a1c5/","schema_version":"1.0.0"},{"id":"animtex","name":"AnimTex - Animate Texture Transitions [BETA] [Before: $19.00, Now: $16.15]","tagline":"FULL plan required - upgrade to download","version":"1.0.8","type":"add-on","archive_size":1581140,"archive_hash":"sha256:880d8c49a4b1f7dcfec4993eeb2e07e027f302f5bf515e8393a6aad62c3dceb9","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":42977,"archive_hash":"sha256:85b7c71aea23717ad2cd040897a2cf31a74b22b23691d2b00bf1c9cf5bfd25f6","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":7573,"archive_hash":"sha256:4b1731b758ae452d3b7e94e18041181660942afd3c57ccf16e374a6d1231679a","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/fd4522ac-f70a-4d3a-9955-7c133b4572b3/","schema_version":"1.0.0"},{"id":"arkit_toolset","name":"ARKit Toolset [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":5563553,"archive_hash":"sha256:352d8627021d11aaa88347e0492e8e4d3c82ff8f45a54be7466ed5b62951f91e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7ecd80cc-66ca-4be5-b7fd-0dd688097110/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":"2.83.0","maintainer":"Andy Hellgrim","tags":["Animation","Modelling","Rigging"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/c6250a59-cb9b-4040-8dec-74df05e04bd4/","schema_version":"1.0.0"},{"id":"Arrowify","name":"Arrowify FULL VERSION [Before: $50.00, Now: $42.50]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":4692987,"archive_hash":"sha256:e95bd263c94ac3bcf6b4499b202ca195b722d6d77e5edc1d36e804340f196073","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/6b514bc5-7041-4155-851b-d62cb6a712f1/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"42.50","blender_version_min":"4.2.0","maintainer":"RR3D","tags":["arrows","spline","procedual","animated","annotation","nodes","customizable","technical","guide","visual"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/7e5c82e6-ddbd-48d1-98d2-c7077a0a4261/","schema_version":"1.0.0"},{"id":"defoq_assetify","name":"Assetify | The Ultimate Bake & Export Tool [Before: $34.99, Now: $29.74]","tagline":"FULL plan required - upgrade to download","version":"2.1.5","type":"add-on","archive_size":438131,"archive_hash":"sha256:bf0fcb963fe97edf240ab8f350102829bcaaca07880e30b4ebe5a08ec6ac3b12","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/82a1fc6a-bb0a-4162-bf87-ce2d6f1d80bb/","schema_version":"1.0.0"},{"id":"quick_lighting_presets","name":"AT_Quick Lighting Presets [Before: $4.00, Now: $3.40]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":4208,"archive_hash":"sha256:f401b70f3a58b2dafa039b4d4458bbb3e5b6e287a53ea04e9c956ee667d24f20","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/ff81e91c-8620-41e6-9dfe-f2b12a6b352b/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.0.0","maintainer":"Alireza Taherpor","tags":["LightingSetups","LightingStudio","StudioLighting","RenderSetup","BlenderLighting","CinematicStudio","CinematicLighting","ProductLighting","DramaticLighting","RimLighting"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/dc146555-325d-4adc-ba04-71d982d85781/","schema_version":"1.0.0"},{"id":"auto_apply_scale","name":"Auto Apply Scale [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3401,"archive_hash":"sha256:ee30a47355275e1eef8b09809bf0afd33c8e21a648101523992fd22e5cd77f73","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.7.0","type":"add-on","archive_size":4305,"archive_hash":"sha256:5cfd1524435be43a647fa5867e72f99ebb7961675ad78b4c19365c44f4e4d591","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":4268,"archive_hash":"sha256:938ba462e6a0bcef16a7150db22fd86bd823f80c73846ac946cf20e502165c10","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":13478980,"archive_hash":"sha256:f89242c71ba41ab17fb1938b94e8cd82e0e8a3aaeb6536755dff6fdf97a088b1","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9409b4d6-59e4-4f7b-93bf-9b51a9811b8e/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":"5.1.1","maintainer":"Giambattista Von Nettesheim","tags":["optimization","decimation","tool","topology","cleanup","quad","remesher","mesh","repair","remesh"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":11826,"archive_hash":"sha256:97bbf97c0794a1fe1a71563ccb04287667b32ca08dc579436757408fc6f04668","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/18ba6214-e44c-4603-a654-19123100e06f/","schema_version":"1.0.0"},{"id":"auto_uv_unwrap_3_pro","name":"Auto Uv Unwrap & Pack 3 - Create clean UVs in seconds [Before: $25.00, Now: $21.25]","tagline":"FULL plan required - upgrade to download","version":"3.0.0","type":"add-on","archive_size":28163,"archive_hash":"sha256:1fc915d1effc311bdb98272a78c866dc61d2e596114c6ebaa304e34f723391ce","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/402c8540-9b3f-44a8-a1db-fe11518d62f9/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":"3.6.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":8971,"archive_hash":"sha256:a52e5ed61919cfceabcc799a50ddf9ef0bfd143ea8a891f08b1dec71820d0ee3","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/5683ae75-d590-4756-8292-1ecbb4aa66cf/","schema_version":"1.0.0"},{"id":"batch_export_selected","name":"Batch Export Selected [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2703,"archive_hash":"sha256:6998f2db2bd89bf52d165e69566e97cbb1e21c2bd6ea48af63bf5978669b44b8","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/110a268e-9661-4a69-b1b0-0970e718bb99/","schema_version":"1.0.0"},{"id":"BatchGenie","name":"Batchgenie: Asset Assistant [Before: $1000.00, Now: $850.00]","tagline":"FULL plan required - upgrade to download","version":"1.3.1","type":"add-on","archive_size":14941835,"archive_hash":"sha256:6b510374f080da157ad4a432507f68ad9832f80c7870c47510b2cf98e484d322","archive_url":"https://www.blendkit.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":"850.00","blender_version_min":"4.2.0","maintainer":"Roberd Palm","tags":["Asset","Library","Batch","Rendering","Import","export"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1745,"archive_hash":"sha256:1b4be6000c75875c5db989d606cf9dafc4ae84b29829b9ec656b041ab9bf365a","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2746,"archive_hash":"sha256:87eff844dff87b5aece9b41f3c2fee5a1de0baa8837ce4a88b85560996cb328c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.5.0","type":"add-on","archive_size":58465,"archive_hash":"sha256:1869ac939e037aac1143217cfa2a8eea118f1d3b30c5d3df6e53b5efe45e2f98","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.8","type":"add-on","archive_size":56758,"archive_hash":"sha256:412b2098d35238a1766808a2d49895488e42f8bb98df0bde33cd1ba5fc5e6cb6","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/f953d832-362d-4e0c-9caf-208f6e7936b0/","schema_version":"1.0.0"},{"id":"better_bend","name":"Better Bend - Geometry Nodes Bend Modifier with Intuitive Controls [Before: $9.00, Now: $7.65]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":25767,"archive_hash":"sha256:be4346fef203ac6c042afee66e50722aee1f7b765a2dc8225bc0a8eaa7d37aef","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d44ed407-bd2f-45e3-ae58-5aa57482461b/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":"Junaid Alam","tags":["Mesh","Modeling","GeometryNodes"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/7c1cf022-c9a5-4e7f-b821-057c1c4abe99/","schema_version":"1.0.0"},{"id":"better_cutter","name":"Better Cutter V1.1 [Before: $19.00, Now: $16.15]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":32438,"archive_hash":"sha256:d8a1153ba01c79e55c1ba97c79a1982415e47e77d41c5742cca7e01636212f0f","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"7.1.4","type":"add-on","archive_size":5098125,"archive_hash":"sha256:24f90dd72619dfe4d9aaf8b459afb6d4891112017332c909483514da91533a44","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9ed7281e-0ef8-4c7d-9d19-641ace4aae44/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":"3.6.0","maintainer":"Mr Steve Lee","tags":["bevel","join","mesh","blender","manifold","clean","2025"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"2.5.2","type":"add-on","archive_size":3428172806,"archive_hash":"sha256:d92474aa863833fe86450406a8be876c00e87e70a97f08938947899b4986358d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/99036cb8-dde5-4767-b670-5e1b2ccd4c0d/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":"5.1.1","maintainer":"Giambattista Von Nettesheim","tags":["basrelief","heightmap","zbrush","reliefmaker","depthmap","bildeform","displacement","3dprinting","CNC","maps"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":2506,"archive_hash":"sha256:efb37d88992f8a1271da4c4e0012fd4992b4306dfc50382aeb5e6494a048ae11","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":11478,"archive_hash":"sha256:ca92bbdafac363ea15437189b1555e4fc52d97f62ceb0a14a67876fdb1b1ef02","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5883785,"archive_hash":"sha256:117804828d165ade5fed594f79a3f4c17e292297a6beae975915d2f6b096b416","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/02dacd43-eafd-435f-badf-d01756834f35/","schema_version":"1.0.0"},{"id":"blendermcp_pro","name":"BlenderMCP Pro [Before: $25.00, Now: $21.25]","tagline":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":72361,"archive_hash":"sha256:32aba972d1ab39cf45271a511277987628eaf5721ce36dbde7d9868a84fa3d1e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2c9032bf-1d16-4a87-be09-1e77e6ee7036/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":"5.0.0","maintainer":"Anvil Interactive Solutions Anibe","tags":["Interface","Pipeline","MCP","automation","AI","Chat"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2119db70-e04f-4bf6-bd8e-a38675987a98/","schema_version":"1.0.0"},{"id":"blender_revision","name":"Blender Revision V 2.1.0 [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"2.2.0","type":"add-on","archive_size":14849,"archive_hash":"sha256:382d4beed3837ab319fb112ebea32de5aa1e5f5ab911c0ce679ccca4fb29137a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9e625b8f-41e1-4494-bdc0-2b7eb5dfa078/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":"Vincent Ilagan","tags":["render","revision","compositing","cycles","eevee","optimization","selected","objects","pipeline","vfx"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/476556b5-ed65-485f-b566-16ff3c967291/","schema_version":"1.0.0"},{"id":"rizom_livelink","name":"Blender - RizomUV Live Link [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":8979,"archive_hash":"sha256:23be20e366669ef8256b5e80087fd134b49dc4cb8ed9d49877bef38900c4d4ee","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/8f53f3ac-b38f-469f-856a-99b9a72fe6c7/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":"5.1.0","blender_version_max":"5.1.99","maintainer":"Milad Kambari","tags":["rizomuv","uv","mapping","bridge","live","link","pipeline","uv","unwrap","uv"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/abd3b5f4-b476-4104-a791-aeac6a1573ba/","schema_version":"1.0.0"},{"id":"blender_sp_live_link","name":"BLENDER <-> Substance Painter Live Link [Before: $18.00, Now: $15.30]","tagline":"FULL plan required - upgrade to download","version":"2.1.0","type":"add-on","archive_size":25427070,"archive_hash":"sha256:375ff3ee561d16e1ba47e809c660a75c6f0901796dd9de698c4addd2d782ba53","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.3","type":"add-on","archive_size":431945,"archive_hash":"sha256:b09ee9b1ebbb6ee2701103945d9d1957c7027372e48d8227545bd02e6c1f58c2","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/26a91aca-41d3-471b-a71b-8fb1a5da3fce/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.blendkit.com/asset-gallery-detail/0bc81975-693c-42e6-8465-ad0e2e37d9d7/","schema_version":"1.0.0"},{"id":"blender_to_unity","name":"Blender to Unity [Before: $25.00, Now: $21.25]","tagline":"FULL plan required - upgrade to download","version":"2.6.4","type":"add-on","archive_size":445627,"archive_hash":"sha256:b38ae9ef546719c5be97fdbe07d7b726d8d338b3f457039c59624cf4f6368f36","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e3743448-3cd0-4ccd-85ae-16c918350590/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":"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.blendkit.com/asset-gallery-detail/7c884710-57d8-438e-a89f-1c51bb88bb9c/","schema_version":"1.0.0"},{"id":"blender_to_unreal","name":"Blender to Unreal [Before: $25.00, Now: $21.25]","tagline":"FULL plan required - upgrade to download","version":"2.5.8","type":"add-on","archive_size":439859,"archive_hash":"sha256:7f96e285c9fd83e4f5a8b5a2c0a77f3b25d5fe14e1f7f430de6b4c92cd3aa5c5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e24e7aec-90ce-4344-b981-910f066797e8/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":"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.blendkit.com/asset-gallery-detail/7c047180-1c4f-4280-b4dd-56953673651a/","schema_version":"1.0.0"},{"id":"vse_lottie_exporter","name":"Blender VSE To Lottie Json Exporter [Before: $19.99, Now: $16.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":478198,"archive_hash":"sha256:df934207034410d289ecaa5a0560701937fd4710c4136d657c6b0e2550b37eee","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/624848c3-08c0-438b-8177-a4bb8680e563/","schema_version":"1.0.0"},{"id":"blendoptimizer","name":"BlendOptimizer [Before: $4.49, Now: $3.82]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":44178,"archive_hash":"sha256:6d92091fd9695d3b2e93f05ef43ae4cf203364ddc14cffea5606ff444c0d9bab","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/1f5bc0d6-e10e-478a-8e6a-a69efe1953b0/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.82","blender_version_min":"4.2.0","maintainer":"Steven Seidler","tags":["Pipeline","System"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/bfd43647-78e8-4252-92bf-a5c349b82f15/","schema_version":"1.0.0"},{"id":"blenquick_autorigger_v2","name":"BlenQuick Auto-Rigger [Before: $30.80, Now: $26.18]","tagline":"FULL plan required - upgrade to download","version":"2.7.3","type":"add-on","archive_size":7306982,"archive_hash":"sha256:ffd7a5221adbbc41e75c09b427de6a18a51c4fda4308941d03a9df9ec174f9cd","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/46f3ba7b-a4da-4064-98b0-ed9b4c6c960b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"26.18","blender_version_min":"4.5.0","maintainer":"Stellart","tags":["rig","rigging","autorig","autorigger","advanced","detection","export","character","smart","animation"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/8844f27d-31e1-44a6-ab42-9518a22f0490/","schema_version":"1.0.0"},{"id":"bl_objector","name":"BL Objector [Before: $3.00, Now: $2.55]","tagline":"FULL plan required - upgrade to download","version":"0.1.2","type":"add-on","archive_size":48724,"archive_hash":"sha256:e99fa9a3ed65ab17d0c113a57b950b083b1cdcba1f918489791d178ce00a3c4e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/ff7aaa8f-20f5-4c4c-813f-bfc57ce8c652/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":"3.0.0","maintainer":"Michal Hons","tags":["3DView","style","dressing","random","scene","blenderkit","replace"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0ba0acf6-cd24-4aa1-b677-d3ea874ccd5d/","schema_version":"1.0.0"},{"id":"booleanbite","name":"Booleanbite: 1-Click Procedural Edge Damage For Blender [Before: $3.00, Now: $2.55]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":8394,"archive_hash":"sha256:c7f3318eeea5cc01f51bd76af0afb1c74275f0b331cf261891cac5a9f042a536","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.9","type":"add-on","archive_size":11944507,"archive_hash":"sha256:52b7f858bb8dbf122f7e8b04e5556cc199844b6ec5a1f1f20bbe0e378bf54c89","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":380172,"archive_hash":"sha256:8eb955f27e800b3fca95a09efccfc6cfde49bcfbdc7409479f7f76c99dce579d","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":6263,"archive_hash":"sha256:442334badc75322a02f1b12e047930c9deff79bd99f1496517c9241597936cec","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":318236,"archive_hash":"sha256:77d5adad2e2ab51fbc5b2cb83c695f8f09ee2074dea3da1b7801d951aef67b51","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":22657,"archive_hash":"sha256:a2030b664b8b229e59b89bd097644e7ae1dc70cbedd0c5af0670c528b9983cb8","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":339168,"archive_hash":"sha256:2c677a7a66aa6bec8aa6ebdbbc83b183a40a0c6cd6cfce83c2582cb0fc7632bd","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/e7a459b1-81e4-4869-b684-d23bbe22c20e/","schema_version":"1.0.0"},{"id":"bslicer","name":"B.slicer [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"1.4.1","type":"add-on","archive_size":1678975,"archive_hash":"sha256:4765df4bbf8d2fc1660a86ed662abedf62e334437033cfea920ae977a6236dca","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/3c1d581e-77fa-43f3-a63a-018fd2186025/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":"3.5.0","maintainer":"belaid ziane","tags":["slice","slicing","export","svg","flatten","modeling","parametric"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/45e0a112-b302-4020-881b-3a91fc139236/","schema_version":"1.0.0"},{"id":"b_working_pivot","name":"B- Working Pivot [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.1.8","type":"add-on","archive_size":18308,"archive_hash":"sha256:d03208917bb899d6e9ab99cb1956c37524dc354f8523d761dc56fee5656826c7","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d4ae5882-e7bc-4a66-8b05-5b071f86165a/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":"Robert Ross","tags":["modo","pivot","snapping","gizmo","3D","cursor"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/94bc13f4-fd31-4a84-8dcc-b7caf7b3648b/","schema_version":"1.0.0"},{"id":"camera_autofocus","name":"Camera Autofocus [Before: $2.00, Now: $1.70]","tagline":"FULL plan required - upgrade to download","version":"1.9.0-20251005","type":"add-on","archive_size":5307,"archive_hash":"sha256:56752e1d4365f09bf9ce871f8d1c41fc499b943f794913698b96878065f09989","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/2b81f79c-ab9d-4d7c-8181-cb4236963e5a/","schema_version":"1.0.0"},{"id":"camera_director_pro","name":"Camera Director Pro [Before: $4.49, Now: $3.82]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":32145,"archive_hash":"sha256:50119c301834ae33a304447005d11da04aca913722e4ff6a05020a028cc501ce","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/a1dbe7b6-312d-417f-906b-ca40df8e1560/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.82","blender_version_min":"4.2.0","maintainer":"Steven Seidler","tags":["Camera","Animation","Scene","Optimization"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d807b46e-842f-4a7d-8f83-773d73ecaa94/","schema_version":"1.0.0"},{"id":"camera_orbit_render","name":"Camera Orbit Render [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":10074,"archive_hash":"sha256:684a165b077372fe487504ac7314ff822817b24193fe0be962c8333bb4990682","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.5.3","type":"add-on","archive_size":38959,"archive_hash":"sha256:aeb2eb83fe7690228387c899c8d25e8e3135e15fcaecb86bd8e2236bfc08d6bf","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":9056,"archive_hash":"sha256:eb1b21ea9778e55cd6e341aeb92473d301e3655bb2a0f10374d16f48dce6b771","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":13521,"archive_hash":"sha256:5c1e20ea372426f7299a477dc73f08bd44e7d2504ddfc47ffea36ee8bacec14a","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/035556c6-4189-45dc-9249-be5558d0c54e/","schema_version":"1.0.0"},{"id":"car_rigger_v1","name":"Car Rigger [Before: $10.50, Now: $8.92]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":1803530,"archive_hash":"sha256:aede98204f16af8773b3230007b1e002e12906b6cb99d8ccc38adf50fe6f53f2","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/0d9bbe47-7189-460b-85e1-71aec35d524e/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.5.0","maintainer":"Stellart","tags":["blender","rig","rigging","rigger","car","truck","vehicle","animation","4x4","autorig"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.6.2","type":"add-on","archive_size":31881,"archive_hash":"sha256:be48e1779b44df451e744e99c2008526c7685124ef7617e4cc88bc82ffe50b88","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.6.0","type":"add-on","archive_size":23262,"archive_hash":"sha256:eb2fd1e49c3ef09eb2ef931671ee5529b55510c9b1fea4d846fa7f41023f9dd7","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":16909104,"archive_hash":"sha256:038d7bcb0ac96b490ab2f97d1a4d06be5e0d1e07903fc40bcd17fdc487ab5cc9","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/323235cb-5286-42b0-85eb-d36eb388674a/","schema_version":"1.0.0"},{"id":"cid","name":"CID [Before: $7.50, Now: $6.38]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":22352,"archive_hash":"sha256:826b68d462541991755bf30491319ce46059185838f22098774171e897ccf25e","archive_url":"https://www.blendkit.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":"6.38","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.blendkit.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":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":70651,"archive_hash":"sha256:a3760b42bc393b1bc519ccfa93dc4a8cca340b48ba8cfe552b4f5aa3585d0722","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"0.2.1","type":"add-on","archive_size":1501,"archive_hash":"sha256:4a9e91da91039e184f87e65411130cef1f621b9d40d7ca0d30114e0f98c2966a","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/0462ad01-9d76-4cdf-80cd-d408df81b69d/","schema_version":"1.0.0"},{"id":"cleaner_ps","name":"Cleaner [Before: $7.50, Now: $6.38]","tagline":"FULL plan required - upgrade to download","version":"2.5.0","type":"add-on","archive_size":2818,"archive_hash":"sha256:ccc8d13da56ecca03a61b904561135e6197ccb5da32292cb20dcf5cd126ef2f1","archive_url":"https://www.blendkit.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":"6.38","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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":4360,"archive_hash":"sha256:983e222541b1c79a60e5d98c7d03667322ddbc60217caf299008f15d8829e8c8","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2346,"archive_hash":"sha256:4b0b1cc4ffc72ef8935b2158641226855e4bfb02f642cfe462350008fd5290ef","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/161371d5-eb46-4252-b994-b74517b6e336/","schema_version":"1.0.0"},{"id":"cloth_collision_visualizer","name":"Cloth Collision Visualizer [Before: $2.00, Now: $1.70]","tagline":"FULL plan required - upgrade to download","version":"4.0.0","type":"add-on","archive_size":5527,"archive_hash":"sha256:e7ac994e09d05b5a2ee7d642807dd031d24255af9574b55e384971bba6995f98","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/ac45edb8-1e56-4afd-a680-81169b2fddfc/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":"3DFIGURES rian","tags":["Cloth","Physics","collision","Viewport","simulation","visualizer","debugging","selfcollision","realtime"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/bd8326c9-879d-4e41-a462-12dcdb0ce6c3/","schema_version":"1.0.0"},{"id":"code_completer","name":"Code Completer [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":56500,"archive_hash":"sha256:4b79233d8c715d61e47af89c3737a56236e9240a46018c5dfce62d8046e85228","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/3b82d2d9-ce19-42fc-9b68-979061dbcef6/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":"Haseeb Ahmed","tags":["Blender","python","plugin","load","operator","Text","Editor","Essentials"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d0dd08e8-57ac-4fb3-85cd-f7c5e40f88b5/","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":"FULL plan required - upgrade to download","version":"3.4.1","type":"add-on","archive_size":2128,"archive_hash":"sha256:d749ef1fba32ceb555db5b35e7b7089b64632e253e2f00e2792bc8d07f0b16f7","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/aef8a90b-e532-4020-bda5-a0c62336b9f4/","schema_version":"1.0.0"},{"id":"collection_zones","name":"Collection Zones [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":47447,"archive_hash":"sha256:3b90e6f0b6311866ace35b299a5f8f1699e92dfc77a1eb167357b890981da4b4","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/efaae058-471b-43ec-bcf2-f18b94310c57/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":"5.0.0","maintainer":"Giorgi Samukashvili","tags":["collection","zones","sorting","layout","outliner","organization","automation","kitbashing","assist","hierarchy"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/4b723716-c093-494a-ae03-9fe0c49f4c10/","schema_version":"1.0.0"},{"id":"collision_director_pro","name":"Collision Director Pro [Before: $6.49, Now: $5.52]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":14838,"archive_hash":"sha256:d8af64aba17b04dd0d233bb67aea6ab39fbcd6fc90b8ea8027c9ac3859cbf2b6","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9424fb67-776b-4c97-b392-74d0c7e0ddb7/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.52","blender_version_min":"4.2.0","maintainer":"Steven Seidler","tags":["collision","gamedev"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/12025de8-850a-411d-a840-5ba053539670/","schema_version":"1.0.0"},{"id":"colormatrixel","name":"Colormatixel - Advanced Material & Color Management Add-On For Blender [Before: $2.99, Now: $2.54]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":166059,"archive_hash":"sha256:eda137854baf27d4e75648abde8dfae400aa0d03d16aa07482d587e8284cde36","archive_url":"https://www.blendkit.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":"2.54","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.blendkit.com/asset-gallery-detail/c31ef79f-2a05-41c6-9bad-963d95c51128/","schema_version":"1.0.0"},{"id":"compositor_mask","name":"Compositor Mask [Before: $3.00, Now: $2.55]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":3209,"archive_hash":"sha256:5c26e2e4fdd7fabebad3f5293d5c7a8ffdbf3b61ead6b59323a436ef08d79a1b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7acfb099-a2d4-4422-a939-7c6b723749d1/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":["Compositing","compositor_mask","mask","cryptomattee","layer_mask"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/ea16769d-5c28-4c21-ba68-26171929bd1c/","schema_version":"1.0.0"},{"id":"Cool_Addons_Menu","name":"Cool Addons Menu [Before: $2.99, Now: $2.54]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":18495,"archive_hash":"sha256:7df4cf79cda76ee6dda75c26877773126c7ed510aec208b723de88500a6d2adc","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":8831991,"archive_hash":"sha256:4852ac6c2dcea0e7e287f79628438b59fdc87a7c16f696386aae6ee215588d1c","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/2ea6e2ac-96c8-4579-b998-7c833227dacd/","schema_version":"1.0.0"},{"id":"cracks_pro","name":"\"Cracks\" Damage addon 💥Windows, Linux, Mac approved [Before: $14.95, Now: $12.71]","tagline":"FULL plan required - upgrade to download","version":"5.2.2","type":"add-on","archive_size":12392962,"archive_hash":"sha256:82a0ff40df509898f687d5b31524686432783ff976132a31f99937c2c4ae231d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/0f3aae67-2a39-47c0-82d6-a983945ed330/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.71","blender_version_min":"3.6.0","maintainer":"Mr Steve Lee","tags":["Damage","blender4","simulation","geometry","nodes","addon","2025","cracks","crack","modifier"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d303f488-d48d-407b-8615-ebf1a5e0883b/","schema_version":"1.0.0"},{"id":"creator_export_toolkit","name":"Creator Export Toolkit [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"0.1.2","type":"add-on","archive_size":5747,"archive_hash":"sha256:f9a8bbc437b9b66743679964f43f93af23e07f27bd870d7e84914c80437f3d7e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/ffdf2b59-8ec2-450e-92ee-d394c1c66f0a/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":"Yassine elyaakoub","tags":["blender","addon","export","fbx","glb","asset","cleanup","thumbnail","roblox","vrcha"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/702e4481-4b33-4588-a593-4c0b03241f33/","schema_version":"1.0.0"},{"id":"credit_manager_pro","name":"Credit Manager Pro [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":11780,"archive_hash":"sha256:bd8c24779461eba6babb5089b8d754b79ef3a0cf2c04b5131c4c2ade5adbea9c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1880,"archive_hash":"sha256:be9e467bd7b3356bc1235fa8bd1ef798760c5a9d194c620f901ec316e9ead34e","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.1.5","type":"add-on","archive_size":200094,"archive_hash":"sha256:fc3db31bb619eed9048c299878c280a657791860cf94987b4100278c652755bb","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/fe1be7d3-4283-4337-8f86-60268bb5e4ee/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","softbox"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":14282,"archive_hash":"sha256:66848a0091fb86b52516cb5c6ef7d8670998c5d2162957c806ff2c9ffdbd5209","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/3600d73e-4bb8-4742-888e-4cde99610da0/","schema_version":"1.0.0"},{"id":"dae_exporter","name":"DAE (Collada) Exporter (Blender 5.0+ Compatible) [Before: $7.00, Now: $5.95]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":395378,"archive_hash":"sha256:bbefa64d4240f963f3d2b743d1f67754414cad8fe1556e1923c49acc3621d353","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/926dc1f4-c0e3-4862-be23-6b7aa08040ee/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.0.0","maintainer":"The Smart King","tags":["3DView","sketchup","export","dae","collada"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/c2f30c32-8f22-422b-bbf4-7637b3b383d1/","schema_version":"1.0.0"},{"id":"dae_import","name":"DAE Importer for Blender 5.0+ (COLLADA Restore) [Before: $11.25, Now: $9.56]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":9801,"archive_hash":"sha256:d58e2539454969c9490afa8d38a90defef9a549863d38083b136bc9efc8aa246","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/569e678d-5a8c-45ad-80db-9f0cedfce5d2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"9.56","blender_version_min":"4.0.0","maintainer":"The Smart King","tags":["3DView","dae","dae_import","blender_dae_import","collada_import","dae_restore","sketchup_to_blender","dae_to_blender","dae_collada_import"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/92fb0bcc-f2d1-4c18-814c-1f2ef721526d/","schema_version":"1.0.0"},{"id":"daexport","name":"DaeXport | One-click DAE (Collada) export [Before: $10.99, Now: $9.34]","tagline":"FULL plan required - upgrade to download","version":"1.3.2","type":"add-on","archive_size":30036,"archive_hash":"sha256:7046dddcfa457e38907929879ebbe20a93b295f56527cf4cc6b78dc4c944c966","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.6.955","type":"add-on","archive_size":1246131,"archive_hash":"sha256:2da8052b74e032b9b06600a7c2af845c937dc9b9292ed2d2cf92818ca2b7362e","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":170084,"archive_hash":"sha256:400cfa84c860cbb746cac72d7693f651cc4c6a14d09032076b2ade2a7beb462c","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/e3dcfcad-3efa-468a-9f27-ddf695e12313/","schema_version":"1.0.0"},{"id":"dem_blender","name":"DEM Blender – Easy Animation [Before: $39.00, Now: $33.15]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":103506,"archive_hash":"sha256:8762d3865db1823a84159c18cbf2c74bff0bae077362a62bdb1baa1a632677f5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/326256ac-562b-49cd-9d67-ab40e2f7110e/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"33.15","blender_version_min":"4.5.0","maintainer":"Giuliano Dasky","tags":["Animation","keyframes","Timeline","Motion","3D","Tools","Workflow","Layers","Spline","Object"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/1933a851-cf9f-49e0-854c-1489b3a1db6c/","schema_version":"1.0.0"},{"id":"dimensions_and_lines","name":"Dimensions and Lines [Before: $25.00, Now: $21.25]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":109377,"archive_hash":"sha256:4c240fa5d716732363b067c72696c334aca67f5f7885b4cc5ee326c2e231f9bb","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d7bbda8f-bcb3-446e-a7ef-f3ce6a2d7e4a/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.blendkit.com/asset-gallery-detail/a2846c5c-f395-4bfe-aaca-a53cc9ac6400/","schema_version":"1.0.0"},{"id":"dovetail_key","name":"Dovetail Key [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"1.13.2","type":"add-on","archive_size":8390,"archive_hash":"sha256:3d4a06e308392ccdffb9bfd0783b52521e6a3b979cea9c037c209c4ea722879d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/200aedb0-216f-4a30-afbb-1202ffc9d361/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":"Milad Kambari","tags":["Mesh","Modeling","3dprint","dovetail","joint"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/5329ff47-74d3-4db3-ad1b-a696e9849c0b/","schema_version":"1.0.0"},{"id":"drh_addons_audit","name":"DRH - Add-ons Audit [Before: $4.99, Now: $4.24]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":88690,"archive_hash":"sha256:b21fe34d058611bc6bc306323e46fb212b838033f0b44e3c86dd275aa25a6ad4","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/4dd9a00d-77f3-4832-a7ee-02a9e955c905/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":"Paco Salas","tags":["addons","audit","snapshot","reporting","maintenance","packaging","troubleshooting","extensions","pipeline"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/4436e85f-073d-4eb2-8271-d58648303a3f/","schema_version":"1.0.0"},{"id":"drh_color_ramp_studio","name":"DRH - Color Ramp Studio [Before: $9.99, Now: $8.49]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":148730,"archive_hash":"sha256:3a823a0772546fb37338b3606861828c10ac53857986a68b717ce4c426c08660","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/26d3b56d-f2ac-402b-9b5b-ccb8515597dc/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":"Paco Salas","tags":["colorramp","gradient","palette","nodes","shader","geometrynodes","compositor","workflow","utility","ramp"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/45ca1690-0ca4-4265-8a35-8b0d69f5dbb6/","schema_version":"1.0.0"},{"id":"drh_dual_units","name":"DRH - Dual Units [Before: $4.99, Now: $4.24]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":38935,"archive_hash":"sha256:7ddf08c4bb6c857cb5c4711bdf8f9b2207ac7b9bbd03c6324f08b911db421896","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/4b229646-35a8-4447-a72b-829ae5ba0fd0/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":"Paco Salas","tags":["3DView","Updated","Tags","units","transform","npanel","measurement","metric","imperial","dimensions"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/4c29e51b-2fc4-4b44-86f4-20139299b434/","schema_version":"1.0.0"},{"id":"lorenzofranciosi_droplets_gen","name":"Droplets GENERATOR [Before: $2.00, Now: $1.70]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":5318931,"archive_hash":"sha256:11bfc221585d101bb52e1b4918ddc8535575fd95fec7ccc2d74a5c50541d197c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/98cbe92d-132c-4dc9-8dbb-d64596f4dff4/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":"5.0.0","blender_version_max":"5.9.0","maintainer":"Lorenzo Franciosi","tags":["GeometryNodes","Object","FX","Drops","Droplets","Wet","Water"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/b242f91c-884f-4a7f-901c-20373ed1910a/","schema_version":"1.0.0"},{"id":"dxf_import_export","name":"DXF Import Export [Before: $19.00, Now: $16.15]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":16203551,"archive_hash":"sha256:fd478752118247bca42a485638370ccb1e259bc7a3a0adb3950c43c7cfbe49cb","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.1.0","type":"add-on","archive_size":12768,"archive_hash":"sha256:c0c6990da08608037f8305dccf3d37f9e1ff8f01c20aab699ba3907a171f59cc","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"0.8.0","type":"add-on","archive_size":75988305,"archive_hash":"sha256:213ba1a25aeb6e3e4cd54127a73b6cac17ec6bcf64f717f20bb0d69ad993514c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":23263,"archive_hash":"sha256:6d80600a51aabfd83df414de15917846092dd8fc182ef727a35f702c167ec8ab","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/7c379e9e-95f2-4b1e-8eab-90739fd1e70e/","schema_version":"1.0.0"},{"id":"easy_batch_render","name":"Easy Batch Render [Before: $3.00, Now: $2.55]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":6875,"archive_hash":"sha256:15e7ff505530560cfdb9177046e0d8473413f8a80777e46f4ff50bcbc6ad0142","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/a426042c-2fcd-4829-a53e-7527987b17fd/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":"Vaishakh Vinod","tags":["Render","Pipeline","Workflow","Batch","Automation"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/03b93d66-510b-441b-a0d3-14b5935f5e32/","schema_version":"1.0.0"},{"id":"easycameramatcher","name":"Easy Camera Matcher [Before: $12.50, Now: $10.62]","tagline":"FULL plan required - upgrade to download","version":"2.1.0","type":"add-on","archive_size":505906,"archive_hash":"sha256:ec28a2e76724965042c0ad063bb79d9e9d9215bc73b2dda63497f6dcf1b71cdb","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f0a38b54-e9ee-4f98-b103-905e5391cf07/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.62","blender_version_min":"4.3.0","maintainer":"Sander Wit","tags":["Camera","Matching","Lens","Calibration","Perspective","Tracking","VFX","fSpy","plotter","plotting"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/70090236-772f-4576-8a24-187a2ff3f31e/","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":"FULL plan required - upgrade to download","version":"1.6.5","type":"add-on","archive_size":4309,"archive_hash":"sha256:e95b13538c5906c23d4b616b6ca757cc7e29e14c6a57827fbc45406c7674d770","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2083,"archive_hash":"sha256:b0b2cc453e1195bb49f617e39b0d21193dc6c597cdcc367fc49424d4e09663a0","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":13668,"archive_hash":"sha256:9f7ecbf98f690f5571627cb80f8794210b6606ed20686f821a21946cc9c25c6f","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.3.1","type":"add-on","archive_size":18012,"archive_hash":"sha256:7d3157c242859fc7aee71d91adfbf03207020ebf8be4c43f3a001425e088edc6","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1464,"archive_hash":"sha256:791964a72a51067d429f9b17bb6287798ba5012e966f7ebb1234f14558fbfcee","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":42799,"archive_hash":"sha256:9d76e27ff1a5f5b160780a537af067d4661418258e7ef20065e141b259f552d0","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/0f34a339-e478-4d6c-b328-9be1daa65f67/","schema_version":"1.0.0"},{"id":"essential_tools","name":"Essential Tools - Ultimate Blender Workflow Utility Addon [Before: $4.00, Now: $3.40]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":8386,"archive_hash":"sha256:82f74b1ca38610307c632f973a30b46d1b657debd85c64db871d01b69c98ad74","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/56c9a4f9-8a62-420b-9434-90fe387ae942/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":"3.0.0","maintainer":"The Smart King","tags":["Mesh","blender","blender","workflow","batch","booster","origin","essential","batchrename"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/80aefc7f-9502-4e57-8cb9-6a3e3ec089f3/","schema_version":"1.0.0"},{"id":"export_director_pro","name":"Export Director Pro [Before: $6.49, Now: $5.52]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":25356,"archive_hash":"sha256:e644eb8adff6b35fda1e89c2cb8b463ce4f1b7d0cbfab0714b807a28330f3191","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c119ec48-fb8f-4a72-b864-73d847628183/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.52","blender_version_min":"4.2.0","maintainer":"Steven Seidler","tags":["export","gamedev"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/35d745dc-cf9d-4d51-8be3-139c69351042/","schema_version":"1.0.0"},{"id":"export_each","name":"Export Each - Batch Export Collections / Object with One Click [Before: $9.00, Now: $7.65]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":13844,"archive_hash":"sha256:39cd568a69a765b3962796e66f0491d700db90cb5542570084e69568e8df2ed5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/873e9048-1759-4fb3-9653-42a025deface/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":["Pipeline","AssetManagement"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/f2dc078b-d6ac-4cb3-a750-4d6c1a834ac9/","schema_version":"1.0.0"},{"id":"face_layers","name":"Face Layers v1.5 Add-on [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":45390,"archive_hash":"sha256:501b57c7dd8cd9549b3d93cce966fbc3effccec925b75e19168274c8bb0ef088","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/8996ef60-23df-44c7-98f0-7161c54ba379/","schema_version":"1.0.0"},{"id":"face_swapper","name":"Face Swapper 2.0 [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":6571,"archive_hash":"sha256:630a58f6b0aaceb22b647de1997b13ab887c3dfb98b2e4e826f6846c5301e3a2","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/07d93e51-07e9-4499-a432-0cec88ec9bc4/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.0.0","maintainer":"Georges Dahdouh","tags":["Animation","Material","2D","image","texture","keyframing","character","expressions","facial","face"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/16562180-0830-4138-9d70-a9db074c493e/","schema_version":"1.0.0"},{"id":"facial_tools","name":"Facial Tools [Before: $10.50, Now: $8.92]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":1655706,"archive_hash":"sha256:154d3764584593e419e06789e9a7aee4a9916a83c3d65e2469fb4387cc3cf682","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/eb138716-7e6b-4545-9045-768caa5c7aad/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":"5.0.0","maintainer":"Stellart","tags":["facialrig","autorig","animation","facial","rig","rigging","rigger","export","bind","preset"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0c790066-7eb7-477a-80d9-1296f8fd3ca0/","schema_version":"1.0.0"},{"id":"falcon_cam","name":"Falconcam [Before: $8.98, Now: $7.63]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1022399,"archive_hash":"sha256:5d655a371dba853226c36680e7e9b15f917bb4c2f8e223138cf8c7502911dab1","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.8.0","type":"add-on","archive_size":29599,"archive_hash":"sha256:53c1f5ca9ea2f7f7c17a8ab85d9710eef21ca451825f56e06f9055fbaa0b5047","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":646630,"archive_hash":"sha256:e8383b08b908f263d0aae7acda685acf991ceeeb65d65682b9f9bae7147ddd3f","archive_url":"https://www.blendkit.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":"Blendkit Community","tags":["System"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2888,"archive_hash":"sha256:2f2384e5a2f3c1f45829c43df6cff9b34d9867f0de677b5f9f1b972f03d62376","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/7cd259e6-5a4c-485d-8095-da2d56c56e79/","schema_version":"1.0.0"},{"id":"fire_maze","name":"FireMaze [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"3.3.0","type":"add-on","archive_size":119891,"archive_hash":"sha256:e71f6535f3a51ab8062baf61d043ec91cff7481eecdadde838f34bbc96dc4da1","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f1a5d42c-86f2-483e-a4ee-86bb1f90da5f/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":"FireRat","tags":["Maze"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/195283e4-b066-4d52-a01d-d6bcd5d0d097/","schema_version":"1.0.0"},{"id":"fixamo2","name":"FIXAMO 2 - Combine , Loop, Create [Before: $9.00, Now: $7.65]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":5033,"archive_hash":"sha256:1d3192b6ac527e5ee2a86dc7fd938e0e370b786cca2d492cce507a2a437ede5f","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/0f4fd714-0c97-401f-bcea-bbb42ab9fbdd/","schema_version":"1.0.0"},{"id":"FlowProManager","name":"Flow5 - The Ultimate Asset Tool [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"5.0.0","type":"add-on","archive_size":25884218,"archive_hash":"sha256:bb89d1998a97e7ccbdfc79a045ea7ea86e6e9ff328b27d7a79aecc69ae24153f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/266f9e83-b74b-4242-940a-b446bc513f2e/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.3.0","maintainer":"polyspaace","tags":["assets","flow","workflow","scatter","asset_browser","asset_library","polyspaace"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/542f1515-6422-4da3-bf4d-05803f890e1b/","schema_version":"1.0.0"},{"id":"fog_planes","name":"Fog Planes Addon [Before: $35.00, Now: $29.75]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":198697240,"archive_hash":"sha256:8fa4132df3fd070aa5a3b58a8a0aebca811315a8f0da5a22ff106619780c79bb","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":44112,"archive_hash":"sha256:62071024eaa41b615793d482d62813f100c2a2a54271fac6db7891c0f06eca11","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/105400e9-bac4-46d4-8c08-616dbf54f334/","schema_version":"1.0.0"},{"id":"frosting","name":"Frosting [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":44908,"archive_hash":"sha256:bb914e82bc2228ef36e862e437aa40eb83d4b6ecdc68c6fe6a1176dd64e9c090","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/3f1186c6-6dde-4a5b-9f62-c562e605bbfa/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","blender_version_max":"5.2.0","maintainer":"Cloudy Sky","tags":["physics","scatter","simulation"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/14c8c8d0-a3f4-402d-8e7f-97df5aab476c/","schema_version":"1.0.0"},{"id":"fsx3d_blueprint_tool","name":"FSX3D Blueprint Tool [Before: $18.99, Now: $16.14]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":465117,"archive_hash":"sha256:2a70844d12b9de6ae5803f535ee2c77935a67e33df14d59bee1b6732f0e6fa36","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7e4a7a85-7dc8-4ce0-a149-6217dc659b4b/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"16.14","blender_version_min":"4.2.0","maintainer":"Eric Bauduin","tags":["Blender","Blueprint","Vehicle","Car","Modeling","UV","Mapping","Game","Low","Poly"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/152e3275-74ed-44dc-aa4e-6eac6d7be8ac/","schema_version":"1.0.0"},{"id":"fusion","name":"Fusion: Extension For Blender [Before: $59.99, Now: $50.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":24640,"archive_hash":"sha256:57beb6af17e7d10f8331d39e8e75b7f678cdd182ae0342d628c24e483e8b1d26","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/598e9407-781e-4079-9ff6-7643b2ba0d1a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"50.99","blender_version_min":"5.0.0","maintainer":"Egret Studios","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a812dae2-08e7-47f6-b981-878077f5780c/","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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":3828,"archive_hash":"sha256:8f4e5c94a8adf3ee9e104b3030c60f797f7d7365d767cbec08f8e56496b830de","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/0da4c36f-dcc9-49f3-a916-97dcfe1f9765/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.4.0","blender_version_max":"5.9.9","maintainer":"F.Z Studio","tags":["Material","Management","Texture","Import","Viewport","Shading","PBR","Workflow","Shader","Tools"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"2.3.0","type":"add-on","archive_size":5658312,"archive_hash":"sha256:373a4e01e4a65587a73ad699e43663a1d6ee511947f364f3a4a5042d173f6d60","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"0.0.5","type":"add-on","archive_size":192462,"archive_hash":"sha256:3d43e5fd646576f31643e616c0712c5d227d7ad38a3902df011f1c68fc104748","archive_url":"https://www.blendkit.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":"Lorenz Wieseke","tags":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.3.2","type":"add-on","archive_size":29212,"archive_hash":"sha256:1740ab04111b0aeb6289e20e8e2e1d2bc65605640aa6a5df2305e6f5f42f8818","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/4b653b4f-5424-4cb1-9ed5-0067daafe581/","schema_version":"1.0.0"},{"id":"anime_shader_studio","name":"GOE Anime Shader Studio [Before: $19.99, Now: $16.99]","tagline":"FULL plan required - upgrade to download","version":"3.3.1","type":"add-on","archive_size":2235826,"archive_hash":"sha256:2b01c90a83c694134090684c555be3334bbab3fac03ed7b85ccd5254ad40193e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/b46b4ae5-c5b8-4969-ba08-0533f25f8f83/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.1.0","blender_version_max":"5.9.0","maintainer":"DanilGoE Goe","tags":["Mesh","Modeling","anime","toon","shader","cel","shading","manga","shader","materials"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/33aa65d8-331c-4c98-a5af-7ae7f379660d/","schema_version":"1.0.0"},{"id":"body_type_generator_pro","name":"GOE Body Type Generator Pro [Before: $29.99, Now: $25.49]","tagline":"FULL plan required - upgrade to download","version":"3.0.3","type":"add-on","archive_size":79093,"archive_hash":"sha256:cab65c3f09bfcba0663c70b8e895f6466223784ceb69d3cf48ef4ec9f46b61f0","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f6978ebf-7532-49de-9426-3b60a9ee2368/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.0.0","maintainer":"DanilGoE Goe","tags":["Mesh","Rigging","Animation","body","generator","character","creator","shape","keys","body"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a9f4f3d2-e0a9-407b-ae2b-985ac28ff7e7/","schema_version":"1.0.0"},{"id":"goe_jiggle_studio_adult","name":"GOE Jiggle Studio: Body Physics [Before: $19.99, Now: $16.99]","tagline":"FULL plan required - upgrade to download","version":"1.1.1","type":"add-on","archive_size":38237,"archive_hash":"sha256:18cfb23987127959a342b242a8d56b6582382c3bd8f1d544510e2dba7ec11d3b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/81192bdf-5d33-48f3-a4aa-cc7107d1d43d/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":"3.6.0","maintainer":"DanilGoE Goe","tags":["Animation","Rigging","jiggle","physics","soft","body","cloth","simulation","secondary","motion"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/f1ed260b-ec35-42a6-99a7-f8a9efa86c75/","schema_version":"1.0.0"},{"id":"portfolio_creator_pro","name":"GOE Portfolio Creator Pro [Before: $39.99, Now: $33.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":60393,"archive_hash":"sha256:f1aab33d72a97e645f795c499f3a958e3f719e97434c4832d6a1460e4f44805a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c00cdd22-6755-4c81-be38-8a557210cc60/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"33.99","blender_version_min":"4.2.0","maintainer":"DanilGoE Goe","tags":["Render","Camera","Lighting","portfolio","render","automation","studio","lighting","turntable"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/9fa7c636-5276-4fad-8324-9fa437ba47b5/","schema_version":"1.0.0"},{"id":"shapekey_doctor_pro","name":"GOE Shape Key Doctor Pro [Before: $19.99, Now: $16.99]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":24098,"archive_hash":"sha256:ecc8d24acb316b900bb12628d30396176d1b8d5b003c7b238aa7ea408e95690f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f3fb4af2-e4d4-4aec-b49d-53c2270b6435/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":"3.2.0","maintainer":"DanilGoE Goe","tags":["Mesh","Rigging","shape","keys","blendshapes","morph","targets","repair","transfer","mirror"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/a7712c16-600c-4165-ad9e-63a165be51e8/","schema_version":"1.0.0"},{"id":"graphi","name":"Graphi [Before: $9.99, Now: $8.49]","tagline":"FULL plan required - upgrade to download","version":"1.0.3","type":"add-on","archive_size":13816,"archive_hash":"sha256:3255ac67672bd68ef09dd22a1d0e67e1c55402a27c1c4710feb4569a0c1eae3f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/86af64b7-5820-47bd-af13-df1464479124/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":"AHMED KETTUR","tags":["Animation","GraphEditor","Keyframes"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0b94a38b-1ad9-4c9d-888c-96ab43ed6a44/","schema_version":"1.0.0"},{"id":"Greaseliner","name":"Greaseliner [Before: $23.00, Now: $19.55]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":3377084,"archive_hash":"sha256:5f33f69cfe2fc7749e205abd4e84c7f46010d927f32c040763d566f6baa2bd94","archive_url":"https://www.blendkit.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":"19.55","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.blendkit.com/asset-gallery-detail/1cc36d5a-82e3-48d4-a195-abc5d9f9549c/","schema_version":"1.0.0"},{"id":"Hatchliner","name":"Hatchliner [Before: $16.00, Now: $13.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":53789715,"archive_hash":"sha256:cb1cb3557c12f856e99e7b7b53de9c99d25327e720c24b4dd01c6f6fcedcf9eb","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/a4542fa7-ded6-40b8-90b9-aea923676312/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":"5.1.0","maintainer":"Kito Studio","tags":["anime","hatching","style","npr","cellshading","preset","EEVEE","material","shader","node"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e9c5c7f5-ccea-48b1-8b86-eb8c9b549b3c/","schema_version":"1.0.0"},{"id":"hedge_it","name":"Hedge It! [Before: $7.99, Now: $6.79]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":11478819,"archive_hash":"sha256:e0c9a2a1686e7af794326772826984fc49997f9118bef2ad29df7fd58e804004","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.5","type":"add-on","archive_size":4247,"archive_hash":"sha256:13a22d85fcf61dee646bd011d7a99878667070cdb7b9e8137ad70eed2c9c3fa3","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3256,"archive_hash":"sha256:a5f443eae0fbcea81787b8237618c0a73b6e8678578c8a81ac4fc9d0b4b30e5c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":50182,"archive_hash":"sha256:a9b6ccf44294677f275adb4b504e9f562b1bf17eeb2fca48a799967ce6685ffe","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/7e838867-0ce1-4f38-9081-037c097fc723/","schema_version":"1.0.0"},{"id":"house_designer_AL","name":"House Designer (AL) — Procedural Building Generator. [Before: $4.99, Now: $4.24]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":22654,"archive_hash":"sha256:3a2f1b99a80ee5f03c4ff1e67f39eb9b6cb98ce82e3c4dd0fd6b8638fcc4d6b8","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/01d0a001-2345-4b4a-bf7f-0f929874ca42/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.0.0","maintainer":"ANDRIY LIA$HKEVI$H","tags":["architecture","procedural","facade","urban","geometry_nodes","building_generator","city_builder"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/aa8829b7-2059-4fe0-9f5a-468318daed3a/","schema_version":"1.0.0"},{"id":"hud_and_ui_elements","name":"HUD & UI Elements [Before: $18.98, Now: $16.13]","tagline":"FULL plan required - upgrade to download","version":"1.16.3","type":"add-on","archive_size":3054185,"archive_hash":"sha256:bc9b4cba6292a78bd51ab4d4c3b4fc2003d9a4300ac00259c960c71aed467526","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/11422bca-41d3-401c-9d50-59d2af96f91e/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":"2.81.0","maintainer":"N. Emmanuel","tags":["huduielements","hud","ui","fui","motion","design","Animation","Modeling","Mesh","AddMesh"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.6.0","type":"add-on","archive_size":7498,"archive_hash":"sha256:195787a0aeb3237fa8ca14a73aded6c12d329b3f8c88318b7b2ba458209d8048","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":78889498,"archive_hash":"sha256:bfdd9d71934e2fe77fe67245976ddf895aaee05f7618db9c0ef952486180cf48","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.3","type":"add-on","archive_size":6737,"archive_hash":"sha256:60c50ea7c6ca171a5c0c2e5fa70591b5e1436b9e9bf367133fa0d07ede30c2be","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f5a633f4-559b-45d3-82ca-4e152c6c74f3/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.blendkit.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":"FULL plan required - upgrade to download","version":"2.2.3","type":"add-on","archive_size":125029,"archive_hash":"sha256:0ee941a43e27b95d0ae41d9f179c7b00bcf497c125392ef604e27bfd752c9d93","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.5","type":"add-on","archive_size":28952230,"archive_hash":"sha256:300b3ba9f8e40ef93c7e0a4b4d15e26589ba566eabfd2914ff8b2f183b84f7b5","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":16383,"archive_hash":"sha256:edeade332c49b82882fb46ea8e42656c6765df317b574b0261fcdf852f72ee7d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/1f35b35f-1f45-4437-8161-b0971400eb9d/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.0.0","maintainer":"RUIDO VFX","tags":["Animation","Decimator","VFX","Keyframe","addon","optimize"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":36340,"archive_hash":"sha256:57ae3b0b9dbee06ac3ecbbd630beb3065e95862f0f4d5966176aad01895d0f38","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":21438,"archive_hash":"sha256:e498afbddd68d78eb73b0b4cbf95ab07db05d99d15f3f78daa81600fabf144bd","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/39505adc-0694-4efe-a77f-d982d53bfb5e/","schema_version":"1.0.0"},{"id":"daexport_legacy","name":"Legacy DAE Export for Blender 5 [Before: $7.00, Now: $5.95]","tagline":"FULL plan required - upgrade to download","version":"2.0.1","type":"add-on","archive_size":29090,"archive_hash":"sha256:8e40598f64128c7336754ba29bb2c3ff9515b9406cdf2b75f3c04cce253c95f2","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7f96c5ae-1312-417b-9d3a-7cf33641616a/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":["NO TAGS PROVIDED"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/9253938a-d7de-4892-9831-832c2697e4f6/","schema_version":"1.0.0"},{"id":"letter_board_text_creator","name":"Letter board - Text creator [Before: $2.00, Now: $1.70]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":562941,"archive_hash":"sha256:8c12f39662866981da9dc9ec4b06b2e680ec069a62ba71f112d365a259838a59","archive_url":"https://www.blendkit.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":"1.70","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.blendkit.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":"FULL plan required - upgrade to download","version":"1.4.22","type":"add-on","archive_size":22743109,"archive_hash":"sha256:f8aff9c92a1a5e06f06b57afd968f233c7302c95c6badf6df3ac581edb0c1faf","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/9ecb49b0-9be7-4b4c-8fd8-901bf7c8e655/","schema_version":"1.0.0"},{"id":"light_painter","name":"Light Painter [Before: $45.00, Now: $38.25]","tagline":"FULL plan required - upgrade to download","version":"1.1.1","type":"add-on","archive_size":149404,"archive_hash":"sha256:49578f00c20b4263adfd81ee3f7032d3b682d8847f3d6a6d632688861c351d67","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/69119226-0d05-4ef8-a088-3a7b1d7ab106/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":"3.6.0","maintainer":"ShaderError","tags":["lighting","Light","painting","light","texture","gobo","viewport","shadows"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/454164f1-182f-419f-ac8f-3139b1eea769/","schema_version":"1.0.0"},{"id":"livecut","name":"Live Cut [Before: $12.00, Now: $10.20]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5961,"archive_hash":"sha256:344e826b17c18f8c85f0d608ce004b5c60f464767415f9fc8452da5de19b760c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/6ddbe436-5f33-4f2f-ad73-145f4be40360/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":["Modeling","Mesh","addon","cut","slice","window","door","frame","slicer"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/fd172489-a974-4246-a792-81d1360074f4/","schema_version":"1.0.0"},{"id":"lm_studio_pro","name":"LM Studio Gobos & Volumetrics [Before: $9.50, Now: $8.08]","tagline":"FULL plan required - upgrade to download","version":"1.0.8","type":"add-on","archive_size":267095919,"archive_hash":"sha256:2a52ce50df73acc701de918a4f649090e986b6a0531a9047f1d7c6a4574a39c2","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9d80283e-a2b7-4ff9-acda-08222fcd7425/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"8.08","blender_version_min":"4.0.0","maintainer":"Mr Steve Lee","tags":["Lighting","fog","volumetrics","2026","addon","blender"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/14c5daee-5691-4c63-8bea-789b5e47113d/","schema_version":"1.0.0"},{"id":"skava_lod_generator_pro","name":"LOD Generator Pro - Ultimate Edition [Before: $9.99, Now: $8.49]","tagline":"FULL plan required - upgrade to download","version":"3.2.6","type":"add-on","archive_size":29745,"archive_hash":"sha256:6610b853ed8672ec051da8fa260e7e37a278bc735d0b71253353999ba0f3d15d","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/d87d6532-edea-4ee0-a90a-37bf7390f8b1/","schema_version":"1.0.0"},{"id":"lod_generator_v2","name":"LOD GENERATOR v2.0 [Before: $29.99, Now: $25.49]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":12591,"archive_hash":"sha256:56aeba95403754a8088bdf67a6a9d69853fa45c7f4196223484839812035f91f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/5b53c74b-5c5b-4fd8-97fc-f3c72c049307/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":"Pradeep Prasad","tags":["Mesh","Asset","GameEngine","optimize","gamedev","lods"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/e6b9b8df-2eda-470b-b4df-fb747a57a81a/","schema_version":"1.0.0"},{"id":"lottie_addon","name":"Lottie Animation Addon [Before: $30.00, Now: $25.50]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":68472,"archive_hash":"sha256:7a61a0f782303f92384b3076efa073b4f03e2464569b943afb70a4882a7f3c45","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":134264,"archive_hash":"sha256:5993304df2b155c02d92eced383dff07dd63bb70e98976f1cbffd5045b4faf8d","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":7584,"archive_hash":"sha256:07fd66208c0c388f9923f42b5832915dae0591b2891eb914f4fb47e705ebd981","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":4801,"archive_hash":"sha256:ab2c85d1afff16262e29102956fa13f0e63e25c1500fa82428e665497896e2b7","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/5e190400-1471-4118-99ea-079be8ee661f/","schema_version":"1.0.0"},{"id":"flat_pallete","name":"Material Colors to Texture atlas [Before: $3.00, Now: $2.55]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2994,"archive_hash":"sha256:f752b1c38cd58ffa9d90fcb6dd273fe8e42283cef1dd1d0a97ef27404ac95437","archive_url":"https://www.blendkit.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":"2.55","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.blendkit.com/asset-gallery-detail/4d46d04a-0269-4c0c-bb78-6b4abb84903e/","schema_version":"1.0.0"},{"id":"material_overrider_plus","name":"Material Overrider + [Before: $2.00, Now: $1.70]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3357,"archive_hash":"sha256:e2d67029d11cce5015292769e3e51198c442b955e0d127c0c4d74714ea1e4f30","archive_url":"https://www.blendkit.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":"1.70","blender_version_min":"4.2.0","maintainer":"Brahim Houari","tags":["override","materialoverride","overrider"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.3.2","type":"add-on","archive_size":339989,"archive_hash":"sha256:ed9347567f8cf94a3ac11d725ba55f232bf95ee81d3c3024e69717b332073b75","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3814,"archive_hash":"sha256:0ffd38163d6d70c4d9fbbc3d36e20198feb94c1f714472fc8f6854efdacfddb1","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.3","type":"add-on","archive_size":11376,"archive_hash":"sha256:866db1a3dac81c24001d92f72e3b93ccc15b5046d884e9cf061ca159106ba813","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":926239,"archive_hash":"sha256:39113a92d620c5a9ad82b6cbb24fc5697dfba4c3ba27ec8c19c494e457533916","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2604916,"archive_hash":"sha256:f3b563325e1ac70edc9f632110771fddacc6aaf5b414e107359850a4bf0430a1","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/81704036-143d-48a5-baca-bd4906793518/","schema_version":"1.0.0"},{"id":"matshelf","name":"Matshelf [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":11310,"archive_hash":"sha256:81977af395ab78eeb2bc66fd792093185942ecc6455efd020f25624240c54e28","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/362e0982-ca77-4e9e-a5f8-ac2ca3dce9fe/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":"Haseeb Ahmed","tags":["MatShelf","Shader","organize","Material","browse","search","2d"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/483bcc37-4187-4810-92c1-4b24c90e1585/","schema_version":"1.0.0"},{"id":"meeting_room","name":"Meeting Room [Before: $12.00, Now: $10.20]","tagline":"FULL plan required - upgrade to download","version":"2.3.7","type":"add-on","archive_size":227745137,"archive_hash":"sha256:af2f30607909bdebabb46371a0407b1dcccf5f73add016d87ccb9f1da9d59b32","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.4.0","type":"add-on","archive_size":217644,"archive_hash":"sha256:95e279244505ba2f335f42205dad6cd6770701f7b6c9619d9bc9d1a10d29bf7c","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/0a231655-c32c-4025-a718-582af4e25c5a/","schema_version":"1.0.0"},{"id":"microstox","name":"🚀MicrostoX | Smart Exporter for Contributor [Before: $11.00, Now: $9.35]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":34254,"archive_hash":"sha256:7a00508838cdc8704e6d71169ff3b95c1e4db8729382776a230f681e3c8ee6d6","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/6ce4681b-6b98-4bad-b076-9b45a3e0b38d/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"9.35","blender_version_min":"4.0.0","maintainer":"budijozz semangat pagi","tags":["Export"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/3dfe7d5c-b064-404a-9b1b-abba03b33642/","schema_version":"1.0.0"},{"id":"migration_manager","name":"Migration Manager: Your Workspace, Everywhere. [Before: $5.99, Now: $5.09]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":4548,"archive_hash":"sha256:abcec391e80b360e7c3f2af380df302c528846c41be372769ac45de3b274c811","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/80568778-1bf1-4e25-ac41-1fffebaec520/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.09","blender_version_min":"4.2.0","maintainer":"Hey Arnold","tags":["System","export","import","ui","migrate","workspace","themes"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/33dd26c1-228a-4854-b33c-3100c1d95211/","schema_version":"1.0.0"},{"id":"mk_roughness_browser","name":"MK Roughness Builder [Before: $12.00, Now: $10.20]","tagline":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":4728852238,"archive_hash":"sha256:65e6ebe517087fb30c77916635504d8d6a5660ed44e557015a098cd0b197c5d8","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/94002b05-96be-4954-a0a3-e8333ad7a681/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":["Material","3DView"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/85333172-af22-4158-9f1d-eaf25a971fb0/","schema_version":"1.0.0"},{"id":"blenquick_mocap_lite","name":"Mocap Lite [Before: $12.30, Now: $10.46]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":286687930,"archive_hash":"sha256:11767f1a1a56829ac080a760db0162deffdb17eb61aa5cc9ec8a995018123dc5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/58617425-e908-469d-8527-38afe9aaac86/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"10.46","blender_version_min":"4.5.0","maintainer":"Stellart","tags":["mocap","motioncapture","face","capture","motion","lite","basic","animation","3d"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/851c73c9-c226-4f1e-a4fd-d10eb0bdcae1/","schema_version":"1.0.0"},{"id":"blenquick_mocap_pro","name":"Mocap Pro [Before: $24.70, Now: $21.00]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":139514705,"archive_hash":"sha256:853fe025d14a5a4e0b3a42866a099e4ac7ff74bafd9f11da7778938042ad7573","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/a0e33e40-fad5-436a-89c3-65b615d2b8b8/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"21.00","blender_version_min":"4.5.0","maintainer":"Stellart","tags":["advanced","mapping","mocap","retargeting","rig","live","face","capture","motion"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.2","type":"add-on","archive_size":16067,"archive_hash":"sha256:ccf1b84a9617e8d52b84659ff9c74f8499d636586f9cda4924ca421f0a3537ed","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":92368,"archive_hash":"sha256:4c10ee77ba44e0fb663fbf160c590eb9d930f10f50e02518781bddada90b3356","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/8f6686ab-238a-4a6e-8c33-1d0cf3ad96bf/","schema_version":"1.0.0"},{"id":"modular_medieval_house_creator","name":"Modular Medieval House Creator [Before: $9.99, Now: $8.49]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1040719091,"archive_hash":"sha256:7dba7c4115ce7064edc349fb697a4906271a79cc559344cf28aeb09f74eb6a6f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9a296711-2409-4b38-b028-2af93cac33b6/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":["architecture","buildings","environment","exterior","fantasy","interior","kitbash","medieval","modular","Village"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/240b303e-4368-4e45-9ae8-9cbdbd2e477e/","schema_version":"1.0.0"},{"id":"modular_suburban_house_creator","name":"Modular Suburban House Creator [Before: $9.99, Now: $8.49]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1100698310,"archive_hash":"sha256:1ee9250c031f1b4333afa6ad3882ccb08f352bb8bd61826fbed32093f76ebb12","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1617645,"archive_hash":"sha256:9e8f0487fb6d1df9beee2a0e987d36e5d264a55c776ff74897bf0e146a709097","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"3.1.0","type":"add-on","archive_size":325988,"archive_hash":"sha256:1d85fca4bdcb5cf8b3f4198d5cecb0fe454a0c36b3b1c1613cb006d1892dbe21","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":3056,"archive_hash":"sha256:afa36cab047702f58a04708ae2529774106f2b0323de434aa126070b7e82af80","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":20029,"archive_hash":"sha256:422408ca88216e626bcf0aa425de73ddcb0b34f5da08afc29464406724f20a1d","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/21b72c0a-b02d-4a8f-8aa9-3ada5908538f/","schema_version":"1.0.0"},{"id":"multi_mat_baker","name":"Multi-Mat Baker - Bake Multiple Materials into One PBR Texture Set in One Click [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":21297,"archive_hash":"sha256:bf89bdee36ce70c86813b2f4e2cb52bacd0478f16fbd234201a734286ca1d081","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/8feae2cf-72cd-413c-a7fc-889cb4fb46dc/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":"3.0.0","maintainer":"Junaid Alam","tags":["Baking","Material","UV","GameEngine","Texture"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2124f634-f2e2-4f4e-8bc8-320673cff0bf/","schema_version":"1.0.0"},{"id":"multixport_pro","name":"MultiXport Pro [Before: $14.99, Now: $12.74]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":30134,"archive_hash":"sha256:c9a47b80240933e964cb542724e119d7ba371083048bbacf74f72df8535e8571","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":51509952,"archive_hash":"sha256:4198442c63c083ec27ece9a06ff9917783286565ca617314d6bd058c43a06ef0","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/29e22ab7-79b3-4733-b3db-7b0e2b9920dc/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":"5.1.1","maintainer":"Giambattista Von Nettesheim","tags":["Mesh","Object","Modeling","Sculpt","import","export","remesh","retopology","remeshing","mesh"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d4ca1fc2-a0e8-4ccf-bc6e-076b26d09e7b/","schema_version":"1.0.0"},{"id":"name_your_things","name":"NAME YOUR THINGS [Before: $8.00, Now: $6.80]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":8465,"archive_hash":"sha256:3657a86a882dea913494ab0bf397a97435663d4bdebd4ad8a5a0367a44c5b9f8","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/b4d3d12f-6d51-4a3c-8b65-e796bfe1f011/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.0.0","maintainer":"ImNoah","tags":["naming","mesh","clean","cleanup","namer","name","organise","things"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/295ca03c-0ff2-4209-8cb4-885a8614f4b1/","schema_version":"1.0.0"},{"id":"neural_upscaler_x4","name":"Neural Upscaler X4 [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"3.1.0","type":"add-on","archive_size":3652555628,"archive_hash":"sha256:333631ea85fb768eaa46f19418329e052599e5b678727eb4199638c4efc98e28","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/01d335b6-82ae-40e4-985a-5a758b6d8ecc/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":"5.0.0","maintainer":"Cloudy Sky","tags":["AI","tool","4K","Upscale","x4"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/ee306f1d-b7f4-4e8e-8e0d-86e8777c3af0/","schema_version":"1.0.0"},{"id":"ngone_pro","name":"N-Gone Pro [Before: $12.99, Now: $11.04]","tagline":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":21732,"archive_hash":"sha256:7a52568df96c5ee3f424333dad15d6de143868fa544a5de3adf9d6848b09f54c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":64311,"archive_hash":"sha256:d13c9fcbb9e5ac7547c4eb6c1fda5922171daf6870898830adb2a6dad931b20b","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/8804d2f3-775e-4d39-9f86-a38aa0f95062/","schema_version":"1.0.0"},{"id":"node_navigator","name":"Node Navigator [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.7","type":"add-on","archive_size":21242,"archive_hash":"sha256:4dcf9bc5e77e463708218799e5a56235295d577861088e77856cae6cce40296f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f6c592fe-b043-4572-8799-1be5c1ba6c0b/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":"3.6.0","maintainer":"Mr Steve Lee","tags":["geometry","nodes","organize","arrange","preset"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/cecb7191-5348-4e5a-a6a8-7b01f6ab7136/","schema_version":"1.0.0"},{"id":"n_panel_navigator","name":"N-panel Navigator [Before: $8.00, Now: $6.80]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":27286,"archive_hash":"sha256:1800311d9beb2ad4993fa0be51f8216209b20e25c41251a3afe5b1ea8d545569","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/72bab743-cb6a-4b75-9d9b-433088728648/","schema_version":"1.0.0"},{"id":"npanel_tab_reorder","name":"N-Panel Tab Reorder [Before: $1.99, Now: $1.69]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":34378,"archive_hash":"sha256:d03dd14657f4434a3c4d15a7eb69aab39a5ac4b7448ebddd2eea5fcb0f8ef81a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/fe28eede-1569-464b-86b7-f41037ec5744/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":"3.6.0","maintainer":"Joy","tags":["ui","interface","customization","panel","management"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/74ca75ae-fafd-4ad0-a99d-c3215b9ea4bc/","schema_version":"1.0.0"},{"id":"n_panel_tabs","name":"N-Panel Tabs [Before: $6.50, Now: $5.52]","tagline":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":6626,"archive_hash":"sha256:a4f36946fd4d25572d27f1fda1fbab96334e7fe321d20c6176c79383c9ee769b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c2b0fa8d-b323-4a43-8774-b34931e4f49a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.52","blender_version_min":"5.1.0","maintainer":"Eros Fornasari","tags":["manager","sidebar","tab","tabmanager","workflow","optimization","Interface","UserInterface","3DView"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/271b8c2d-5132-4d12-8696-f9504eff2a58/","schema_version":"1.0.0"},{"id":"null_game_toolkit","name":"Null Game Toolkit [Before: $32.00, Now: $27.20]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":28327,"archive_hash":"sha256:519f5dc600ae12492c11bb1a4f8f6d6b90dea42d3d63ad8dfe552e3d4001c9de","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"3.7.0","type":"add-on","archive_size":76727,"archive_hash":"sha256:969eb684b871e4c1af888f818373056c191d00c587370f65e57e57c2dc2c14a3","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":74608,"archive_hash":"sha256:154d6d78fe2620b60cc25ebe87054defc72f7eb76c3cad58d86cf4ae6dad2b16","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2739,"archive_hash":"sha256:d9b10d648c575ee0b17ee027f20296051e975e2f498673d6a8b16ca697e6de7c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":9257,"archive_hash":"sha256:932e313907fed8ebe4f7359a41f4e3e0f95745bbd86b1dc049e821cb4083c559","archive_url":"https://www.blendkit.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.blendkit.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: $9.50, Now: $8.08]","tagline":"FULL plan required - upgrade to download","version":"5.0.0","type":"add-on","archive_size":46749971,"archive_hash":"sha256:44bbf8936bbcf524aeacdc5567cb68f6fb98b8e814d5e7d7859c48a470ead90a","archive_url":"https://www.blendkit.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":"8.08","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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":11397,"archive_hash":"sha256:e6e72c938979613a4a794b2284a75bb0ef8f90f35d07e42c5c8593f9a94ca366","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":5231,"archive_hash":"sha256:4173b4cdf0ec617585b4f2ad40eac2917293298a27dc016a7c63ba9b6de82ca2","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.2.3","type":"add-on","archive_size":20453,"archive_hash":"sha256:14197ff44de0374d1709be60d844a69cdcac1ef00679d4ae5a9c01f8fc8705d4","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.0.2","type":"add-on","archive_size":224274155,"archive_hash":"sha256:202feaec961debe8852a37397bd4f171cc93b9b7c811cead6e792b89f9a4c759","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"3.2.0","type":"add-on","archive_size":17131,"archive_hash":"sha256:2522018ef3f2d98e91300c6793f57fb9fe8faea6034be2076bb364a621902c1d","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/31b436e2-7cca-442c-aeee-6f7004275252/","schema_version":"1.0.0"},{"id":"ez_studio_pro","name":"One Click Studio [Before: $5.85, Now: $4.97]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":10860,"archive_hash":"sha256:ed68ce19f9006a39a588d0e35d12004517975916112867b14dde807bfa2b23cf","archive_url":"https://www.blendkit.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":"4.97","blender_version_min":"4.2.0","maintainer":"The Smart King","tags":["Render","Lighting","Optimization","Productivity","studio","camera","blender"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/1c5d0887-7382-4dbd-9ba3-bee0cfd933e3/","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":"FULL plan required - upgrade to download","version":"1.7.0","type":"add-on","archive_size":17635288,"archive_hash":"sha256:22bd48bd5b54bc8b9c1d5be2a97e840667d3ad7ddf724cf0e0ccabcc82000233","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"0.2.0","type":"add-on","archive_size":318904565,"archive_hash":"sha256:9207d2b84a10bc3bf33d477424b3d863ae8c4b63d1de89a2f64b8d0cc1fcaa6c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.1","type":"add-on","archive_size":15593,"archive_hash":"sha256:281998905bd7fc71b8993a71fa64ffd28394f999a146d0f4f4c24db02e81b13a","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":510578,"archive_hash":"sha256:ff24edd79a427cca1f6439c4edbdc950e6acd25b7555d8acf254986fd70085e3","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1963,"archive_hash":"sha256:ed7ae5e3669860275c5e8477a4e545f39efb15cbe49679994c199b86f8e4c4e6","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":2056,"archive_hash":"sha256:412d83a0176f31a6d328ecab304d75d38c91eb6aacd163277301bbd0028b76d4","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/3f2afda8-dce0-4fa3-9aad-44cad17c2043/","schema_version":"1.0.0"},{"id":"palette_manager_pro","name":"Palette Manager Pro — Color Palette System For Blender (Pro Tier) [Before: $12.99, Now: $11.04]","tagline":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":45276,"archive_hash":"sha256:491dd63e67a545673cf7b18646aaf30dfd733df3e280a3ef99cd240fb3b106ab","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/06d812db-bfe3-4726-b68e-832e3c3f118e/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":"NovaStrikes","tags":["Material","Paint","Color","palette","texture","blender","gradient"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/8e0a91d3-79a8-4205-8c69-de1ca083c7ae/","schema_version":"1.0.0"},{"id":"tobip_particles_catalog","name":"Particles addon [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":47741747,"archive_hash":"sha256:502c9f726ea418185363df9c3d0947fff2639ca7331895cbbaec3de79cf2a91a","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/693ffd00-e10e-4f18-8419-ba55fe48ff07/","schema_version":"1.0.0"},{"id":"eztexture_pro","name":"PBR Texture Pro [Before: $2.50, Now: $2.12]","tagline":"FULL plan required - upgrade to download","version":"3.0.0","type":"add-on","archive_size":3294637,"archive_hash":"sha256:345223ed17af25f05ad21e942476bfd3addb4c382eee83df3f242aa4b48a32b0","archive_url":"https://www.blendkit.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.12","blender_version_min":"4.2.0","maintainer":"The Smart King","tags":["Texture","PBR","Material","autouv","shaders","udim","Node","Smart","UV"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/18b6c783-c973-4abc-90f2-5f380e6e86d8/","schema_version":"1.0.0"},{"id":"perforated_panel","name":"Perforated Panel [Before: $1.00, Now: $0.85]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":844690,"archive_hash":"sha256:5e86344238ef6499fc3e0fdc58d591c46f746eb477622e2a34ae46024edfe900","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":4354,"archive_hash":"sha256:8f6a1c5c5c4eec0e0893e94ec9230e2dd78f87e3e2f985da3586c50cdf2aa0d5","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.7.0","type":"add-on","archive_size":149362,"archive_hash":"sha256:cfbd5b940ae8191ce873be6d2b813c3bf940521891e33ee82ed75665ffd2ba84","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"3.0.0","type":"add-on","archive_size":21168,"archive_hash":"sha256:e140cc12a36bda67d704adb6f7ca250f111630313f356995127313910aa3b0f9","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.3.2","type":"add-on","archive_size":19161,"archive_hash":"sha256:dca5cd406ed0fd14ee53bd59a6a3cf48e863fe537a3e9f170dd8479d1065892d","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/93ad9257-b229-445b-8277-c702bde1eab4/","schema_version":"1.0.0"},{"id":"polymating","name":"Polymating [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"1.3.1","type":"add-on","archive_size":78737,"archive_hash":"sha256:a129c270d00436e1f8eb0e5f1ba2b6b3d9cb6e143047b9a9d02350d054a708de","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"3.1.0","type":"add-on","archive_size":36022,"archive_hash":"sha256:2aac9cae99896126264c23d6025ede4cf88678d25fe2d91947935d7363a179c2","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":220543,"archive_hash":"sha256:9742a530dbfadf2f5d349c8a5b54b891878e955d8daa8fc2004c0221d7f65687","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":2386869,"archive_hash":"sha256:c3365d6bcdbdff2c522f3f1448fad875fb172e94bf461a33fe1334246ac874c0","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.2","type":"add-on","archive_size":8027,"archive_hash":"sha256:900105e74ba1de500ce56b946e998c2b475b6a2a07345116996736720f1402cf","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/ed839737-ce8c-412c-8753-80a2bc968b59/","schema_version":"1.0.0"},{"id":"procedural_clouds","name":"Procedural Clouds [Before: $25.00, Now: $21.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":24305854,"archive_hash":"sha256:b6d83cf36baa39f432f698749b6d57efd0a21c36d08e9c0a38366560da491b00","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/72fb912b-ceae-4fec-9e03-d099f4518290/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.5.0","maintainer":"Suzanne studio","tags":["clouds","cloud","sky","skies","volume","volumetrics","storm","addon","atmosphere","procedural"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/70f5bfd0-0c25-4a15-a694-384875e86a6e/","schema_version":"1.0.0"},{"id":"neo_cables","name":"Procedural Neo Cables [Before: $10.50, Now: $8.92]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":4199,"archive_hash":"sha256:22bfb3d0dc05b9f0c8533e937331f967edbbfbc7c17717fcfae2907f08f42877","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/6c980f63-dcc9-4ed6-923b-c1bec5bce747/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.5.0","maintainer":"Stellart","tags":["procedural","generator","cable","wire","rope","generate","oneclick","string","thread","modifier"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/bb5d18f8-b5b6-4fb1-9f53-00fbf0c7aacb/","schema_version":"1.0.0"},{"id":"Procedural_Sky_System","name":"Procedural Sky System [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"0.2.6","type":"add-on","archive_size":724389,"archive_hash":"sha256:78d907ff64c92dc9fe436fe10cdc90f2fa51f47f1145d4e700a8a10bbb3c37dc","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.0.3","type":"add-on","archive_size":39573,"archive_hash":"sha256:bc1060a598e1f490c0b5f06542dcecfd0afb6e414efdb56dd50d098be5367665","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/9ef8471a-d401-4404-98f9-093837891b43/","schema_version":"1.0.0"},{"id":"procedural_weather_pro","name":"Procedural Weather Pro [Before: $14.89, Now: $12.66]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":43934,"archive_hash":"sha256:05d2bde702f2253f8b1b8f9e7fcbf7c77b4a065de9505a68f7384007ffa1174c","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/8066341e-34a2-475b-ab74-47c40ec2180c/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"12.66","blender_version_min":"4.2.0","maintainer":"Junaid Alam","tags":["Lighting","Render"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/77731762-5b91-4e38-b188-4c5b8ff7061f/","schema_version":"1.0.0"},{"id":"product_lighting_setup","name":"Product Autouploader [Before: $20.00, Now: $17.00]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":31931,"archive_hash":"sha256:1c78dd9539e0a76f95d94acf2e2c03b6b9f04d73e311c03ef1465e44a195774c","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/b8679695-2084-4bab-82d7-2a880628e8e6/","schema_version":"1.0.0"},{"id":"POS_shelf_display_generator","name":"Product Display Generator [Before: $20.00, Now: $17.00]","tagline":"FULL plan required - upgrade to download","version":"3.0.0","type":"add-on","archive_size":10667988,"archive_hash":"sha256:7b4aba700c52b3bdc15b5f152f8d1267e087295202f024a92bd6570d7336afb7","archive_url":"https://www.blendkit.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":"17.00","blender_version_min":"4.2.0","maintainer":"brandPOS Karpeta","tags":["Object","cardboard","packaging","FSDU","display","generator","model"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/f2880b5e-ba2f-4f2f-9556-16dd98491c38/","schema_version":"1.0.0"},{"id":"profiler","name":"Profiler 2.0 - Advanced curve beveling tool [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"2.1.0","type":"add-on","archive_size":293184,"archive_hash":"sha256:4d04209df47b869f68075cb013d9163ebecfd6ac5801c8d63db4894f55251b7f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/837faf74-0d9a-4493-b871-6bd776237892/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":"Mike Radjabov","tags":["Modeling","curve","spline","sweep","profile","cornice","bevel","molding","svg"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/1cd6fbe1-c385-4941-ad49-06342734572d/","schema_version":"1.0.0"},{"id":"psd_layers","name":"PSD-LAYERS V1.6 Add-on [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.6.0","type":"add-on","archive_size":50355,"archive_hash":"sha256:c767d1916b98c2348e38ff329b065a32caae4525a278bcbd3cfdda3e50e7e27a","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.6.0","type":"add-on","archive_size":26623,"archive_hash":"sha256:cbae5724dbd151f7aead7e85d4837a07e8906fc432edcbbb63b8a7cf0a515409","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.3.4","type":"add-on","archive_size":82832,"archive_hash":"sha256:73b148cf5c29fc62024b7bd4bba1dbaf99914395a8f0faf6efa0c0077caeb4e5","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/489eaa7f-5ad4-402b-8a65-7404010df89b/","schema_version":"1.0.0"},{"id":"quadify_ultra","name":"Quadify Ultra [Before: $150.00, Now: $127.50]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":2569263,"archive_hash":"sha256:4202b7d30673354503fb49a643b0a4e46dd3c03ea18d2f8bee0117fb3c952741","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c3815f1e-2cf4-4d0e-b037-19e6a568cb00/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"127.50","blender_version_min":"4.2.0","maintainer":"Anvil Interactive Solutions Anibe","tags":["Modeling","Mesh","Retopology","Topology","Quad","Optimization"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/1113757c-3829-4c33-bf49-11d38d30003d/","schema_version":"1.0.0"},{"id":"quick_align","name":"Quick Align [Before: $2.50, Now: $2.12]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":30856,"archive_hash":"sha256:cb1e0440c5f4407c455fbd2e5510a508c4982fe3123a9a489420ea00603b482a","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/91bec957-fe14-459a-83cc-5ce477214631/","schema_version":"1.0.0"},{"id":"quick_apply","name":"Quick Apply [Before: $6.00, Now: $5.10]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3846,"archive_hash":"sha256:74bc61eb7fc7f873cf32786b90f7ca80441528bd3deb36ea590c0a2311eba562","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e76474a4-7bce-44f2-9786-a90c4711eaec/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":"3.0.0","maintainer":"Re Siva","tags":["Object","Material","Modifier","Utility","easyapply"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/46c1cbcd-3c06-4aa0-92ef-4c81446359ed/","schema_version":"1.0.0"},{"id":"quick_baker","name":"Quick Baker [Before: $30.00, Now: $25.50]","tagline":"FULL plan required - upgrade to download","version":"3.3.0","type":"add-on","archive_size":300019,"archive_hash":"sha256:20b055b5b7f2f1e522fabbaf5947e03d8780e8bcc0fef5c9bf094d3c3239de08","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/0a560c82-5404-4da0-afdc-3c646af6a61e/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":["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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2426,"archive_hash":"sha256:384d34cb9c86629eac51f09fa6a1af15ca086b9ffdf75ef2dd3ee88c91370f9a","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.7.1","type":"add-on","archive_size":268191,"archive_hash":"sha256:3ba5d820d9b24cda4c9dfcaaad7e949bb21bc3db49be474d22fa509970b328ac","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3310,"archive_hash":"sha256:cf518a244930f26fa64b6d4dc4021709f5038921a7f1785c1c74059144263c40","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2168,"archive_hash":"sha256:04df4f1afbcdab212124e22da346cdb6311a67fee86ec844fb08bc81b5dd6b96","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":25611,"archive_hash":"sha256:64a293894e7513a9274c0d4fe2c52a9f543167742a7e0af6542b1441b389261c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"0.8.2","type":"add-on","archive_size":5964,"archive_hash":"sha256:f46aa86875dd6e14060aa47a207bc8fde1db70b3da9bd3d90ace0f81cb9b927d","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":21529,"archive_hash":"sha256:78d8b62da830760d7696930879fbbeb388001785e4a697d06df212f248e08546","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f21b81d6-4827-432c-ab0b-95c87f8f85e2/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":"3.6.0","maintainer":"Studio156","tags":["texture","baking","materialtotexture","material","textures","texturecreator","shader","object"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":10495,"archive_hash":"sha256:47f2ba1015744e3cb035404188dfb389b28281743027534f6f9c8bf2eaf17616","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.0.5","type":"add-on","archive_size":149550,"archive_hash":"sha256:590b9b24988895ddac71cab3a1cba32bd448f26aad4ae404c7c6ce579ffabbc2","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2182,"archive_hash":"sha256:692d1665c5fee4220e79f228ee7c92357bfda113651282424ce6192314e8b5f7","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5971,"archive_hash":"sha256:692f347bf98a84c06c57d3628c023733777b4d5f93dabb14032de8bc46756673","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.1","type":"add-on","archive_size":106813,"archive_hash":"sha256:55954eb891d859c257510bcd7462d843fb6ffc69b129a8344dfc75d94bffbd62","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.3.2","type":"add-on","archive_size":25703,"archive_hash":"sha256:b2fa794392702d933b726740de51337950654f54d63fc47633d25f257ccf8bc6","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/c785c99e-f1c2-4fbc-82b8-651761f6101a/","schema_version":"1.0.0"},{"id":"quikv_pro","name":"QUiKV PRO — Quick Keyframe Value | Animation [Before: $17.60, Now: $14.96]","tagline":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":41859,"archive_hash":"sha256:1b710658f7e92026c6f12824694a523183eab7dcc5788416f02e1c8525de9b4a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e531b319-c0bb-45a3-a5d2-0bfef96183aa/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"14.96","blender_version_min":"3.0.0","maintainer":"eFcoelum","tags":["keyframe","animation","Interface","value","click"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/bd8897f7-1111-43ea-860f-f956e1d4c0c7/","schema_version":"1.0.0"},{"id":"random_object_colorizer","name":"Random Object Colorizer [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3343,"archive_hash":"sha256:154dfae4dd35cef3d4f2ee5757abd3ef8790e89f0ec4d61f2803c2c8c4b2f7d7","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":2140094,"archive_hash":"sha256:2b2e2822ab1911da95e7100a079c86a1a9364df9137425aca3523a8f02759db6","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/61fabc4e-aa4f-463c-8bff-d771f0b85cb2/","schema_version":"1.0.0"},{"id":"renametool","name":"Rename Tool [Before: $4.99, Now: $4.24]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":1859,"archive_hash":"sha256:31dcfacba225cd89975fd7f1c19fa3b94cc09f95ce6c07096f628c0676467c8e","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.1.0","type":"add-on","archive_size":2469,"archive_hash":"sha256:7eb243aeb9da5906a755214d9e78162c5e867bbd91037dc768e250f5b40314ff","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1879679,"archive_hash":"sha256:0dc385a33ba081c8e7863db348534383ec5c26e0c10d20e728ca70e1466db6c5","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/244c9e2d-6185-4f62-9501-864aef9d908c/","schema_version":"1.0.0"},{"id":"render_manager","name":"Render Manager [Before: $17.99, Now: $15.29]","tagline":"FULL plan required - upgrade to download","version":"2.5.1","type":"add-on","archive_size":95404,"archive_hash":"sha256:4914ec65c8c5f5649e0e9b385179258cb382034d697a459369c0039f1a98a80d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/170c9ea3-5d5f-4d59-ab71-addb88c81ec2/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"15.29","blender_version_min":"4.2.0","maintainer":"Hassan Hussain","tags":["render","pipeline","animation","scene","camera"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/502f4b0a-b0c2-4b08-8414-424c287bc8ca/","schema_version":"1.0.0"},{"id":"render_negative_frames","name":"Render Negative Frames [Before: $7.00, Now: $5.95]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1879,"archive_hash":"sha256:2ba36c9790061f0bf0a448114c2cb1719f4a1cffebe061a383f8c4aa7de28039","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2792,"archive_hash":"sha256:586e53a0c3d4c433d5d116672994d69a2a20413e310774af3043e382f0f083c1","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2760,"archive_hash":"sha256:88bf2295c1d2a4efbdec61981f5b46c9f3d84de1f2ae9aa5214c1aeba2eb8a20","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":51865,"archive_hash":"sha256:7acca1532f7eefc9deb6031439dc7302a55449f02caaab0c1c147ba88eb97bde","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.8.0","type":"add-on","archive_size":55255,"archive_hash":"sha256:740459440b6441a7130c3cabdfe29c1b7685b2b9973315e10954bc5815e73454","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/193a112f-1f47-464f-9481-4eb07e57dfda/","schema_version":"1.0.0"},{"id":"rendervise","name":"RenderVise [Before: $9.00, Now: $7.65]","tagline":"FULL plan required - upgrade to download","version":"1.0.9","type":"add-on","archive_size":9789,"archive_hash":"sha256:57e84968a668fabf8d2877346e66eacc63b551237a86a3edf07fa5281eaae1a4","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7e325318-9d07-42c6-8cc8-51320b3fac5b/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":"3.0.0","maintainer":"antoine f","tags":["Render","Pipeline","Camera","Preview","History","Compare","Compositor","Thumbnail","Workflow"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/9caef8fc-7e27-4778-a711-4e0c4f65d665/","schema_version":"1.0.0"},{"id":"resmax","name":"Resmax - Upscale AI [Before: $14.00, Now: $11.90]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":45049478,"archive_hash":"sha256:0922535ea56912848573cb1b8e9c867351cd9954c6e16a63935818422df6a582","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":9399,"archive_hash":"sha256:1318864822da93978eb7171758723f405929829aec55d440b4fab81118e7b5fd","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":32929,"archive_hash":"sha256:330e68364f7398892036bd42414008db1d1a675d9e478930fa447eae445fdd0c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":16046,"archive_hash":"sha256:3d758fc27afb06d104c0b1b6da32f03752bb54b880075e4e7d2862ea59ce3db0","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2dac3f2f-efb2-478b-81f1-664f5811a049/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.5.0","maintainer":"Stellart","tags":["export","rigify","unreal","unity","godot","addon","blender","rig","rigging","rigger"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.4","type":"add-on","archive_size":35673,"archive_hash":"sha256:0017a0759d1e8a607e341fab85475d5ca0eeb6659cbfe620c2893a7bf73f3d9d","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d2699e3e-2458-4b11-bbea-733e6f03d2b2/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.5.0","maintainer":"Stellart","tags":["retarget","retargeting","retargetting","bones","rigify","transfer","animation","rigging","rigger","rig"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/08108568-865c-4219-87e7-144df8ab7fa2/","schema_version":"1.0.0"},{"id":"save_director_pro","name":"Save Director Pro [Before: $6.49, Now: $5.52]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":17820,"archive_hash":"sha256:6c56ba1b5cc51803d8d3b91fafb4c64facc6c8ec6a209fbda8604729232e03df","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2c627b8d-effa-4c1d-bee0-74c298a0234a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"5.52","blender_version_min":"4.2.0","maintainer":"Steven Seidler","tags":["Save","Director","Pro"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/92851ab9-2d63-4c4f-8746-41f233d57fb9/","schema_version":"1.0.0"},{"id":"scale_print_camera","name":"Scale Print Camera – Pdf & Exact Scale [Before: $16.00, Now: $13.60]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":43786,"archive_hash":"sha256:b53a1ba15aaf4cf1c20493dd9e7b7e13f0250d8424c9aebf22d10ed3a7c5079a","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/08f3b586-69b8-4fef-8b34-09426bb88b06/","schema_version":"1.0.0"},{"id":"scan_cleaner","name":"Scan Cleaner [Before: $6.00, Now: $5.10]","tagline":"FULL plan required - upgrade to download","version":"1.2.3","type":"add-on","archive_size":20651,"archive_hash":"sha256:9c486142f1d6a78f90f31a2c648635a8b616b1a90197507f50cd82b4ad98b0dc","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/3546b856-e505-4915-befa-b736873f785f/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":"Zack hough","tags":["Mesh","Modeling","Pipeline","scaning","scan","automated"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/aad93279-f98f-4884-8a4a-2a05f0491421/","schema_version":"1.0.0"},{"id":"scatter_forge","name":"Scatter Forge [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":1238739,"archive_hash":"sha256:fb6bed06c1de23c9d97d80672a4ecedf7744d6a7697ba851ed2967bee46d487f","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/561addae-d8e9-497f-9c73-961d3d0ab281/","schema_version":"1.0.0"},{"id":"scene_state_bookmarks","name":"Scene State Bookmarks - Save and Restore Full Scene States in One Click [Before: $9.99, Now: $8.49]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":7818,"archive_hash":"sha256:6405e1a41d62fa8920f3b7c858590b54096a84c9bc4b06a11ad62235bc223612","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e70fbd8e-2b48-4699-93d7-0573eab3420b/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":"Salman Naseem","tags":["Scene","Render","3DView"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/912c7fdc-6b35-45fb-9843-2f751a2cc833/","schema_version":"1.0.0"},{"id":"scenesweeper","name":"SceneSweeper - Clean-Up Commander [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":23168,"archive_hash":"sha256:869b3b93d15c2f7d138697210c3434c97e31849e776517c73185fd4f4eda5f80","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.6.7","type":"add-on","archive_size":634022,"archive_hash":"sha256:6cea718ed1fcf44841dfa3eda665725af2d870be6e419ae724a357ca79db2c0a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/00e6ba6b-f6c2-4b95-a0a9-c2aa133c1bc5/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":"5.0.0","maintainer":"Wolfram Kampffmeyer","tags":["Schematic","Rigging","Hierarchy","Constraint","Editor","Visualization"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":46257,"archive_hash":"sha256:562d8eaa29b82b144bba800ce5f367e204d11e7f4d96929940437db0fc33b0f3","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.4.8","type":"add-on","archive_size":6748565,"archive_hash":"sha256:1aefdbcf980556de2b10d3fb8bde0d260d9da45d31f50a7a8557a94eb28d843b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/cc3a7f57-ddb0-4795-bf23-2677d325c8c0/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":"5.1.0","maintainer":"Ruben Messerschmidt","tags":["section","box","cross_section","elevation","archviz","architecture","plan","drawing","floor_plan","cut"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/42a79447-b3f5-4683-a253-73d7360142a8/","schema_version":"1.0.0"},{"id":"section_pro","name":"Section Pro - Sections, Projections & Technical Drawings [Before: $59.99, Now: $50.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":25516976,"archive_hash":"sha256:bf0b7360645992c567af82d242bab14867bf6008d91f322f8f3eaa41f2420dc7","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/302ead32-dda5-42ee-8bd1-ddbb59fde059/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"50.99","blender_version_min":"4.5.1","maintainer":"Ruben Messerschmidt","tags":["elevation","ArchViz","section","floor_plan","technical_drawing","interior_design","architecture","cad","dxf_export","bim"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/c472fc66-b1c3-4110-8cd4-ebcb25080734/","schema_version":"1.0.0"},{"id":"selective_wireframe","name":"Selective Wireframe - Per-Object Wireframe Control for Blender [Before: $4.00, Now: $3.40]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":10492,"archive_hash":"sha256:d1a68e64f6698d3e1aff0c7f56381d0189a3f4ed0b128efc3f06bca6f535779b","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":1445,"archive_hash":"sha256:f3e259eceeebeb7c6455e1e9bab7e6686a2c67517723d927a2895d999aba37b2","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":1838,"archive_hash":"sha256:81c9c1e0b887bc18f5e413ca02edfa649da3df61230e2ffca2f3f04a19c1072d","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":14206,"archive_hash":"sha256:36e39fdd146abe3cf1d89d7ad4bbcc6cb3e70b140a09812592aaf647fa7c1ea6","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.5.1","type":"add-on","archive_size":18152,"archive_hash":"sha256:42cf19cca7b18383d173077cd7db74c46dabe6b71cab8fbebcd2fedbe110236a","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/1f14a313-1319-4921-8043-394825fcf083/","schema_version":"1.0.0"},{"id":"ShareTextures","name":"ShareTextures Asset Library [Before: $14.99, Now: $12.74]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":783093,"archive_hash":"sha256:65e40563f57e0fedf66457e7c8c74154c1b32a7cf16c1222436cc96342eccb3b","archive_url":"https://www.blendkit.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":"12.74","blender_version_min":"4.2.0","maintainer":"Share Textures","tags":["Object","Material","Pipeline","UserInterface","asset","library"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/822222fd-6e10-4da6-960d-cb12d7ec3fbf/","schema_version":"1.0.0"},{"id":"mk_shelf_filler","name":"Shelf Filler [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":12857,"archive_hash":"sha256:80218adeb5de818a77d0e927e073c2ff4fea020fd78742d383288df09a17f344","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/617da19f-6a35-41f7-b5d5-26c1fe3eaef6/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":"Milad Kambari","tags":["Object","Modeling","fill","book","decorative","decoration","shelf"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/fa82ee50-842d-450a-a6bd-8837926fc743/","schema_version":"1.0.0"},{"id":"jd_shot_handler","name":"Shot Handler [Before: $12.00, Now: $10.20]","tagline":"FULL plan required - upgrade to download","version":"3.0.2","type":"add-on","archive_size":49735,"archive_hash":"sha256:f113416a330accfae028bb41d95cb7014d2f1967c4b80653dc98c870f29836d2","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/93e43d6b-8f20-478b-bb88-94c4ac387d4b/","schema_version":"1.0.0"},{"id":"shot_manager_pro","name":"Shot Manager 2.0 Pro (Blender 5.1+) [Before: $35.00, Now: $29.75]","tagline":"FULL plan required - upgrade to download","version":"2.0.8","type":"add-on","archive_size":23139698,"archive_hash":"sha256:46f766bfec0a4383b9c90dd172387fd3d15e919fea9343b98ab4c81feb454e47","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/575d0fec-e3f3-47e6-935b-cc39b7f08b39/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.3.0","maintainer":"Other Realms","tags":["shot","takes","macros","states","batch","render","burnin","burntin","stamp"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2ace843e-c14f-4eda-b697-fb7065f344d1/","schema_version":"1.0.0"},{"id":"shotweaver","name":"ShotWeaver — Multi-Camera Shot Organiser for Blender [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":10493,"archive_hash":"sha256:8d025358a4b0165f91d26504ac126d77aa8e77aff50e88af94d902ea47b29c9f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/bc94be10-941c-44ca-882b-ddc30679da8d/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.5.0","maintainer":"Ynleyn","tags":["camera","animation","storyboard","management","render","queue"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/f3a2d99d-e315-4918-ba7a-e8bf576afa51/","schema_version":"1.0.0"},{"id":"showcase_studio_pro","name":"Showcase Studio Pro [Before: $30.00, Now: $25.50]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":139482,"archive_hash":"sha256:3e3d1586f1ac59458f084ea5a859bd6c515dd7cae24c3eef933a1c31a969235f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/50c7137d-dbcf-457c-9ac0-7a1d6c8d4ea0/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.5.0","maintainer":"3dquads blender","tags":["3DView","Render","Lighting"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/ff65ae79-6580-433d-8e18-98f4d64c7af1/","schema_version":"1.0.0"},{"id":"simple_layouts","name":"Simple Layouts - Full Version [Before: $12.00, Now: $10.20]","tagline":"FULL plan required - upgrade to download","version":"0.1.5","type":"add-on","archive_size":308012,"archive_hash":"sha256:c773d88ee7a6158743c98df12a7ab8c81f844b0efb9d3da28f0f8f5b57a75520","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":2190,"archive_hash":"sha256:de5bcf5bf9a3cfd8b3773925b91061c63fa50a44cd032def5b7f44bf3e7c04b9","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":136739,"archive_hash":"sha256:957887d9eef18a40d9d095f20c09aa90ccf0706556582b0f7dfe27eebdcd9bb6","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.5.0","type":"add-on","archive_size":967509,"archive_hash":"sha256:94ec87ede7ebadd708c879d1476a48b2e3d4589968ca74660477aa757348a49a","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/ee2ffd44-5bed-40e0-be94-43b22b2e80e3/","schema_version":"1.0.0"},{"id":"smart_align","name":"Smart Align [Before: $9.99, Now: $8.49]","tagline":"FULL plan required - upgrade to download","version":"1.40.0","type":"add-on","archive_size":30781,"archive_hash":"sha256:59e65c8482bfb52cbc7d894afa19958f492587f38a6693c299120f3a381ee372","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/85389cd7-26fb-46c8-91ca-8a69b1315e9e/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":"Gabor Kiss","tags":["align","snapping","transform","alignment","modeling","move","workflow","addon"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/2528d6bc-faa7-4231-bc63-8eba09c4b88f/","schema_version":"1.0.0"},{"id":"smart_autosave_pro","name":"Smart AutoSave+ (Basic Tier) - NovaStrikes [Before: $8.99, Now: $7.64]","tagline":"FULL plan required - upgrade to download","version":"7.0.3","type":"add-on","archive_size":7530,"archive_hash":"sha256:fbe220ec55dcf6147bd900c982c9c1c91fa53c725dd5e00af7c1997aac7fb987","archive_url":"https://www.blendkit.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":"7.64","blender_version_min":"4.2.0","maintainer":"NovaStrikes","tags":["crash","autosave","scene","safety","backup","system"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":16997,"archive_hash":"sha256:edd41a20f4dce1fa76ffb3a26e3bf5b7f2c29e371d93bfc95de374ac51334846","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/a152acb9-f8b5-41df-b32c-3b2d4790a934/","schema_version":"1.0.0"},{"id":"smart_scene_organizer","name":"Smart Scene Organizer [Before: $2.99, Now: $2.54]","tagline":"FULL plan required - upgrade to download","version":"2.0.0","type":"add-on","archive_size":6316,"archive_hash":"sha256:8640f77e625614002d0e286a46e13c0e59036ea360c43aed31ba35343f6a044e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d8039a3c-8734-402f-92ba-94900c493f39/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":"3.0.0","maintainer":"SHAXBOZ Ergashev","tags":["blender","addon","scene","organizer","asset","manager"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/7f474641-f0f4-418c-8e3a-8506a93064cb/","schema_version":"1.0.0"},{"id":"snappy_rigger","name":"SNAPPY Rigger [Before: $15.80, Now: $13.43]","tagline":"FULL plan required - upgrade to download","version":"1.2.2","type":"add-on","archive_size":1664368,"archive_hash":"sha256:00101c2fadcbe97df886a9b505f692422683897a1bcd686a5f4309bec04ecd54","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/f4047669-f313-4cdb-ac01-3b8772cbf69a/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"13.43","blender_version_min":"4.5.0","maintainer":"Stellart","tags":["Rigging","autorigger","bones","detection","generator","snappy","rig","autorig","rigger","animation"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/c9841f8d-5056-41a5-972d-6c6cea2fd4d4/","schema_version":"1.0.0"},{"id":"solaris_creator","name":"SolarisCreator Pro 2.0 - One click cinematic lighting [Before: $69.00, Now: $58.65]","tagline":"FULL plan required - upgrade to download","version":"2.1.0","type":"add-on","archive_size":32693,"archive_hash":"sha256:2955231eb9c54f768dc8fc2362fa9fc865e8d1a8154494cf382468fb0d0a6fed","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/526f9eac-bba6-4639-bbab-9607e0c3c1d3/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.0.0","blender_version_max":"5.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":2080,"archive_hash":"sha256:acf397a1ef0376442ae348b5eda74aec9f0787b232ac393b33f7b33b09fa8e15","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"3.2.2","type":"add-on","archive_size":543142656,"archive_hash":"sha256:1f2a09faa7d927fbfd0b093da716f7e528f212ec1d5eba94438599399775cf67","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2be1351b-e513-4d23-b808-c204a8e2b27c/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.0.0","maintainer":"Stellart","tags":["Space","Universe","Planet","Moon","Sun","Star","Exoplanet","Asset","8k","4k"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"3.2.0","type":"add-on","archive_size":21428,"archive_hash":"sha256:5c5cfaf48d121a201d15970d8af3b75cb043d2c2aa5b027360aede3ea796c984","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/9049369d-6bbf-4849-a0aa-5430dd486a82/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.0.0","maintainer":"RUIDO VFX","tags":["Render","Camera","Output","VFX","Batch","Pipeline"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"3.5.2","type":"add-on","archive_size":1954483,"archive_hash":"sha256:12ccbe83ae847b6db4b544475b1ecc8ca59e80a09d5a6bf95d622a2eb89dd0c8","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":128633,"archive_hash":"sha256:5cac8b7f6fd6438709d3d9ba30a7136f3d5d23ae172b1e38eb6ae0e8fb189ed8","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/4b59c688-c13b-4611-8e18-98ad327133c9/","schema_version":"1.0.0"},{"id":"stylized_water_pro","name":"Stylized Water Pro Shader - One-Click System [Before: $24.00, Now: $20.40]","tagline":"FULL plan required - upgrade to download","version":"0.5.0","type":"add-on","archive_size":8005660,"archive_hash":"sha256:3cad70c57a27ae2acf27a2d0a2fa9a16b0511d15b6a1c710e663568c086b4af5","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/03e0ce35-7260-4f9a-aa81-e37f633667e5/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"20.40","blender_version_min":"4.2.0","maintainer":"Anton Maltsev","tags":["Object","Material","Node"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/d438949d-5bb7-4d33-89bf-19893c0290d9/","schema_version":"1.0.0"},{"id":"mk_surface_blend","name":"Surface Blend [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"1.5.4","type":"add-on","archive_size":7077,"archive_hash":"sha256:5c277e0eb5c327d4ad603dbd2922b0658ee0c864f334b3ebfac3e88987d25b37","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/af887228-87b3-4b3d-8e5e-d227fcc6ca8d/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":"Milad Kambari","tags":["Object","Material","GeometryNodes","blend","dissolve"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/553fe958-98eb-475c-9531-218ea6cabfed/","schema_version":"1.0.0"},{"id":"surface_effects","name":"Surface Effects – Procedural Material Enhancer [Before: $10.00, Now: $8.50]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":23835,"archive_hash":"sha256:db1541adbb92cd4aa13b3bd73bb0c57bb7cde085c11536f63d0a887da810c828","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":36113940,"archive_hash":"sha256:26a3e456bf03fb45ab2912e4c3b659b38cf2b9a9c298f550a7d1f54c0b8a6735","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":60460,"archive_hash":"sha256:2653c075f02776bdff274fad70e43d9885a8d40d3f0aa4021202a97809ce4599","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":39261,"archive_hash":"sha256:7296dc8dada42dda5ee981c8f96b7b6598c300c5d2ddfa0caff01dd91904e42a","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":48116,"archive_hash":"sha256:07dae0d5d8f657eb750fc5b2599c3398a22017f881d5331a27ba40033f4ebd30","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":43979,"archive_hash":"sha256:ec0f9da235bf43c1719622cf91a37f5fb38e880201ae9f6c7dce6e54661f88a6","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":67446,"archive_hash":"sha256:5f1feb0d46de24a8816f6d6d0fe4baffba23e6b3855054571c9d918b209f1b46","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/3c751ebd-c083-408b-a82a-50ad796f78ec/","schema_version":"1.0.0"},{"id":"swiftlod","name":"Swiftlod - Level Of Detail Creator [Before: $3.00, Now: $2.55]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5669,"archive_hash":"sha256:5e989039793ea4a133614d77893ef0a6f0a0f024c3dc5ef1f79c924b8b2e1fc3","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/2464af97-146a-47d1-be1a-b6521114e96d/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":"FANNΞC","tags":["easy","lod","optimizer","plugin","pro","Level","Detail","Optmize"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/cb8119b8-835b-4104-881d-9e6524c2fecb/","schema_version":"1.0.0"},{"id":"tcam_render_pro","name":"TCam Render Pro V1.1 [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":5907,"archive_hash":"sha256:d376325dd7c4970f743d9bce95659dbf155916c9fc073bba6674f539910bdf50","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/cb0fea4d-5722-44d0-bc66-fb4a904cc0e0/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":"Otonkart Tonka","tags":["render","multicam","queue","renderqueue","camera","studio","video","automation","batch","rendering"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/317bf5e7-cf4a-40c4-8fd0-37e7400fa359/","schema_version":"1.0.0"},{"id":"textopbr","name":"TEXtoPBR [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"2.5.0","type":"add-on","archive_size":15465,"archive_hash":"sha256:7dc82c0e29fc8a939fd4480d424cf0707df2bfe08d83578017dba0211e62aa50","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/c9c54d68-ae48-4d39-bd29-5109652c19bf/","schema_version":"1.0.0"},{"id":"texture_layer_manager","name":"Texture Layer Manager [Before: $19.99, Now: $16.99]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":882964,"archive_hash":"sha256:5acc884513e5397e93eb2727fe36edc2dbda6a2ba4e755e2d65f74068eb493b9","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/a4449ebe-d709-412c-93d1-4d9134f00ec1/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":"5.0.0","maintainer":"riccardo scuto","tags":["Material","Node"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/0c579cdc-7c9d-4738-90f9-d22e0b6ff810/","schema_version":"1.0.0"},{"id":"texture_resolution_manager","name":"Texture Resolution Manager [Before: $9.99, Now: $8.49]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5016,"archive_hash":"sha256:2acab6532846076f2be8681a9fe3728a88e475e4d5e9129f1b2954374e524f8d","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":3275,"archive_hash":"sha256:cf87113efe4f2741f72324e75b0b7d22a511a9d838afe3272ee70026f9a20b0c","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":6640,"archive_hash":"sha256:da5b85b68abcc1a6a9d40235e689d142a16f871f50f6b9f948d6b121728514fc","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/2b074e8a-844b-458a-a01b-84cada557d0f/","schema_version":"1.0.0"},{"id":"blender_ustad_texture_transfer","name":"Texture Transfer - High-Poly to Low-Poly Texture Baking [Before: $14.00, Now: $11.90]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":10623,"archive_hash":"sha256:9e26d18f2777c9476ac61b89f9fe6b6e7929cca9735b70fc708554b8445a9b96","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e5c46144-0572-41f7-aba3-4c34f0fa7c90/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":["Bake","Material","Object","UV"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/48a8128a-6a37-4ec7-a3d7-656e69946d4b/","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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1459005875,"archive_hash":"sha256:466e058cf39b8566902b14f79011afc18d525d1a0a7e3b6448b65e287463f644","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/9d7fb688-d32f-4b21-acb7-a8726d96ddd9/","schema_version":"1.0.0"},{"id":"the_bakery","name":"The Bakery : One click material baker [Before: $7.50, Now: $6.38]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":1833039,"archive_hash":"sha256:e28b0a1f08f75a93ed72593d4f2073affaae653c2dfb0480ae15912ec464e154","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/704a83c3-e237-48cf-8c00-cb98e02d7816/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":"Zahit Erdem Guzel","tags":["Material","Baking","Pipeline","addon","texture","bake"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/438cef85-944d-48a9-b7c7-2ffb63901baa/","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: $3.00, Now: $2.55]","tagline":"FULL plan required - upgrade to download","version":"2.0.7","type":"add-on","archive_size":159086065,"archive_hash":"sha256:1965899e1578da49188a948210b5700cf32c08c2831608397ebaa2efeea62a68","archive_url":"https://www.blendkit.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":"2.55","blender_version_min":"4.2.0","maintainer":"Mr Steve Lee","tags":["HardSurfacetools"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":944337,"archive_hash":"sha256:e397582008ec0eee3d81c380277ea2b6d4dcf988db8b704c236b06c681110003","archive_url":"https://www.blendkit.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.blendkit.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: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.3.0","type":"add-on","archive_size":33678,"archive_hash":"sha256:5cf1de2c7a8892f13a98f74f6cfe821babf13f03e67f328ebf762f46e51611d4","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7e3d7593-f190-40b5-b1ab-809767a248b2/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":"Salman Naseem","tags":["System","Productivity","Tracking","Analytics","Workflow"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":257056,"archive_hash":"sha256:41fd3f67885ff8ba32652e9145ac1eec5c7c95cc791827a954e5e10a1cea4f55","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.4.0","type":"add-on","archive_size":55849,"archive_hash":"sha256:dad0d50ae418ffb09385ea1ae481d8bc5df9dcb71b92fb1f51c6921cfffd4eed","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.4","type":"add-on","archive_size":44729,"archive_hash":"sha256:7f03b201ca49a0146bbe4d2ef7a1eadf1acdecc0374e7a2502ea7d77ccf3d530","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/24639bd7-bbf1-40cf-950c-2454ab9d1a7a/","schema_version":"1.0.0"},{"id":"triplanar_displace","name":"Triplanar Displace [Before: $12.00, Now: $10.20]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":5585,"archive_hash":"sha256:a682057b8e0a7f681d97fa0f791304416186ac4486b94c5f2ccf68d73d0b883b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/196e3b7e-3797-4fc3-b255-12fc1515244a/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":"Anas Herba","tags":["blender","procedural","displacement","no","uv","triplanar","displacement","rock","cliff"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/9a81bcf4-4a33-4248-ab1f-d28c901c465a/","schema_version":"1.0.0"},{"id":"udim_atlas_builder","name":"UDIM Atlas Builder [Before: $18.00, Now: $15.30]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":46153,"archive_hash":"sha256:6ce8871915b669feb3bc9e7fbf0818b0e1b1179d3c388b2a1cd8361e82bf57c7","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/fbfd2505-0b56-4e62-84a0-34ae9ec8c3b3/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.5.0","maintainer":"Ashish kumar Maurya","tags":["UDIM","UV","Mapping","FBX","Optimization","Materials","texture","baking","gameasset","atlas"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/b4048c30-85fc-4fb3-9e15-d13a36ea90b8/","schema_version":"1.0.0"},{"id":"ultimate_animation_suite","name":"Ultimate Animation Suite [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":26615,"archive_hash":"sha256:a0a86c9d504534758288888410cf529c8ce667664a2aed66a7f223cdc42b0bbe","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"5.5.0","type":"add-on","archive_size":18870,"archive_hash":"sha256:df401a91fc4bb160b3b90bb20ac4f3a9d4e5e033f6e11f99278aaeb4f5ed198f","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/d908778e-fd57-4b1a-8b54-0ffdaa96823b/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.0.0","maintainer":"RUIDO VFX","tags":["Animation","Camera","VFX","Shake","motion","cinematic","keyframe","tool","vibration","rotation"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.6.1","type":"add-on","archive_size":17488,"archive_hash":"sha256:93f174a95ce78dea36cbbb201b75d0e739a40721082ee5d53600f74fa37ce1e7","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"14.2.0","type":"add-on","archive_size":17570,"archive_hash":"sha256:8967d03e228f333c5d4608539b6cf5e4d3273db8f8de94be4722df80ab36a52a","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/5f7473a3-aba2-42d8-84fa-b14ce497d261/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.0.0","maintainer":"RUIDO VFX","tags":["Animation","StopMotion","Keyframes","Timing","Stylized","Tools","frame","nose","jitter","claymation"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":18967,"archive_hash":"sha256:46cb4e81cadfeb449a090f56e07799ab99a17eed3a3906b2178c7934fe2f8f54","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.1.0","type":"add-on","archive_size":1268,"archive_hash":"sha256:ec7b88c1fbdd7e24b8b34597ca78c8383c80035b65f47999ce849ab4633a76b3","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/110a0e8d-f1d8-4479-9c3b-9188da0f4fc2/","schema_version":"1.0.0"},{"id":"mk_universal_converter","name":"Universal Batch Converter [Before: $4.00, Now: $3.40]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":6018,"archive_hash":"sha256:cc9392e15f66b50687a68c7453880cbc005db6692a23dcf61edc596b53321a99","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/c3beb4fb-eb7e-42be-97ff-82d67a1fd76f/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":"Milad Kambari","tags":["converter","batch","fbx","obj","stl","gltf","glb","import","export","pipeline"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/aa445dda-b4cd-4936-9cc2-88c9c3fff545/","schema_version":"1.0.0"},{"id":"upscalar","name":"Upscalar | The Image AI Upscaling For Blender [Before: $5.00, Now: $4.25]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":679178887,"archive_hash":"sha256:4317b3a0a42e7699e5429e570d07193be262e09462c6822ad63222c11a984313","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"2.2.1","type":"add-on","archive_size":1531633,"archive_hash":"sha256:d21e31cbcaa2b3587163abe394472c4024d10a76b8fd618f7b40116a2a090f33","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/6c03319b-087f-4446-a9bc-959f4e0eea65/","schema_version":"1.0.0"},{"id":"vacuum_wrap","name":"Vacuum Wrap [Before: $6.00, Now: $5.10]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":9503,"archive_hash":"sha256:7ac023d64ac0968bd7ec2940a9285222b24c13037ac1cc8a06f1c9e4e9ee666e","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/71fd3df5-c65d-4ade-b32a-e176c906ca5a/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":"Milad Kambari","tags":["blender","addon","shrinkwrap","physics","packaging","cloth","simulation","vacuum","wrap","plastic"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/8251d25a-ed34-41e4-b702-eed07c681495/","schema_version":"1.0.0"},{"id":"version_keeper","name":"Version Keeper - Premium Project Management [Before: $7.00, Now: $5.95]","tagline":"FULL plan required - upgrade to download","version":"2.0.5","type":"add-on","archive_size":19589,"archive_hash":"sha256:d4c1cfdd5a4c1b4af4581cb4fe9203ab8d4ced9ab51f48678714a16449ef875b","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/83c0a989-7b1d-4657-9c1a-0af96a578a8e/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":"Re Siva","tags":["System","workflow","productivity","Utility","Interface","Organization","Asset","Management","Backup"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/b7f2f7e1-86cd-490d-9097-dd22a319d9f0/","schema_version":"1.0.0"},{"id":"vfx_scene_builder","name":"VFX Scene Builder - After Effects to Blender [Before: $9.99, Now: $8.49]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":129261,"archive_hash":"sha256:6161d5fabb72404e17e05f1dfcb71922ef9062bd1f3134a7162090623a3f8241","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/17256fe9-432d-46eb-9245-892fad2faaf7/","schema_version":"1.0.0"},{"id":"view2cam","name":"View2Cam [Before: $15.00, Now: $12.75]","tagline":"FULL plan required - upgrade to download","version":"1.0.1","type":"add-on","archive_size":11420,"archive_hash":"sha256:e27bdd8360c49857bf00336296af0e1363874f7711ec84199770dc42684ba0a9","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/97960a97-5440-4859-b168-913fdf693ebb/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":"Milad Kambari","tags":["Camera","animation","movment","viewport"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/75354932-0842-48fb-a148-bda2078edd81/","schema_version":"1.0.0"},{"id":"viewport_object_finder","name":"Viewport Object Finder [Before: $2.00, Now: $1.70]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":12335,"archive_hash":"sha256:6fb559947a155ba05be51d97f7e57ff6831eb1b976903503e20833c869f23430","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":9926,"archive_hash":"sha256:bc0931eacd7c2c282e27e3747fefa76f036ec804b7ce38029f136cb220139de1","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/14ab582e-2794-4406-9427-af93348e7cf9/","schema_version":"1.0.0"},{"id":"VSEDAWFX","name":"VSE-DAW FX [Before: $4.99, Now: $4.24]","tagline":"FULL plan required - upgrade to download","version":"1.9.7","type":"add-on","archive_size":466900,"archive_hash":"sha256:eb835556e726cb4e92ae6a38940e657fd3e460ec5bf9261403584cd747a54d02","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/e1231647-89e7-4925-8b67-1a44dc3151d1/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":"Jacques Durocher","tags":["DAW","effects","audio","music","FFmpeg","compressor","mix","mastering","sound","reverb"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/dea4de69-4f56-4791-b8f7-a315f0d489c7/","schema_version":"1.0.0"},{"id":"wireframe_lens","name":"Wireframe Lens - Inspect topology without switching modes. [Before: $4.00, Now: $3.40]","tagline":"FULL plan required - upgrade to download","version":"2.3.0","type":"add-on","archive_size":13384,"archive_hash":"sha256:99c4709ad0b3ecf7afc2e71bb25a1bf8d60dbafbf48fd72ce888f4c952c4c8c9","archive_url":"https://www.blendkit.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.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":3391954,"archive_hash":"sha256:ffa35fd309f79fd2c1f6d55a2f732f20f855b047f1c3fec900d871ae4e72a457","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/5bc3a7d5-5b6c-450b-bd51-b0570f8099c1/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.5.0","maintainer":"Wolfram Kampffmeyer","tags":["BookArt","BookFolding","Papercraft","Pattern","SVG","CSV","Manufacturing","Layout"],"license":["default_addon_license"],"website":"https://www.blendkit.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":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":1144829,"archive_hash":"sha256:5954c8ee130e0ec355c161ff81250db8925ec8c75e451d42cf06f4ce4bbc69f0","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/cd687c32-9fa6-427b-8142-49fdaad99279/","schema_version":"1.0.0"},{"id":"wk_mechanics","name":"Wk_Mechanics - Mechanical Linkage, Cam Designer & Automata [Before: $27.00, Now: $22.95]","tagline":"FULL plan required - upgrade to download","version":"0.8.0","type":"add-on","archive_size":6234341,"archive_hash":"sha256:4039181e864ab4aebb2a1ba46ca9dfb0c3db42e563ed50b9c72f2969706f4ccf","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/0b59a8a2-8d24-4754-89cd-330f5cabac29/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":"5.1.0","maintainer":"Wolfram Kampffmeyer","tags":["Rigging","Animation","simulation","automata","mechanics","drawingmachine","strandbeest","walker","engineering","linkages"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/904f8506-9293-426c-8c21-9a7d287a497c/","schema_version":"1.0.0"},{"id":"wk_powerpin","name":"wk_PowerPin [Before: $8.00, Now: $6.80]","tagline":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":428466,"archive_hash":"sha256:6f3531a8c30c320101e009edabafa6745dea2f4de766529bfd5f159000fde0e8","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/3027755a-2542-4559-8ce4-5eb83a2cc929/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.blendkit.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":"FULL plan required - upgrade to download","version":"1.2.0","type":"add-on","archive_size":307370,"archive_hash":"sha256:69942a26f934364e86bcf70a0981259d4e7ea425e8e5c78e9220297c45075b71","archive_url":"https://www.blendkit.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.blendkit.com/asset-gallery-detail/8e23b6e9-abf3-4200-8b07-fc01d4ee8443/","schema_version":"1.0.0"},{"id":"teca3d_wrap_for_blender","name":"Wrap For Blender - An Alternative To R3DS Wrap - Fitting A Base Mesh (Topology) To A Target [Before: $19.00, Now: $16.15]","tagline":"FULL plan required - upgrade to download","version":"1.0.2","type":"add-on","archive_size":26588917,"archive_hash":"sha256:c30d63a326fd39fc891fa5d6211080834bcf1f54841cec23324040faa7721081","archive_url":"https://www.blendkit.com/api/v1/assetfile-download/7748a436-368d-4e4c-8152-4ca6579945ad/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":"5.0.0","maintainer":"TECA 3D","tags":["mesh","modeling","wrap","retopology","character"],"license":["default_addon_license"],"website":"https://www.blendkit.com/asset-gallery-detail/3b628c1f-b0f3-4563-b7e1-e6da8c054d12/","schema_version":"1.0.0"},{"id":"xray_selection_pro","name":"X-Ray Selection Pro [Before: $7.99, Now: $6.79]","tagline":"FULL plan required - upgrade to download","version":"1.0.0","type":"add-on","archive_size":5532,"archive_hash":"sha256:b82c8b8e7e2354ec9af6a4b91b9696f5270645869c88cfe2d26ab7705418458a","archive_url":"https://www.blendkit.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.blendkit.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/extensions/www_blenderkit_com/.blender_ext/index.json@b938 b/extensions/www_blenderkit_com/.blender_ext/index.json@b938 deleted file mode 100644 index 07c2c72..0000000 --- a/extensions/www_blenderkit_com/.blender_ext/index.json@b938 +++ /dev/null @@ -1 +0,0 @@ -{"data":[{"id":"blenderkit","name":"BlenderKit [FREE]","tagline":"BlenderKit official add-on","version":"3.18.0-251121","type":"add-on","archive_size":38637430,"archive_hash":"sha256:68fc779b92beae80430b91bdcc528680fe8833b4a47875b8c4dccda47f47cecf","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":"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":"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.1","type":"add-on","archive_size":48471,"archive_hash":"sha256:ce9740ad252a00643f75202b53c9ef1e9c6ee8b5a2d34cbaf751b4084e78665c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1ac66d8b-51f8-4511-b4b1-fe32737310b6/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":"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.1.8","type":"add-on","archive_size":506845,"archive_hash":"sha256:e9c95c1f2f509f0416f5454482a9f4efa025be43b359ee9f8ff22e276aaa0682","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c9ea6c5d-a21a-4a16-b2b2-a5bfffed0526/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":"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_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":"dimensions_and_lines","name":"Dimensions and Lines [FREE]","tagline":"create technical drawings, dimensions and lines","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":true,"is_private":false,"is_free":true,"is_for_sale":false,"base_price":null,"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":"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":25882535,"archive_hash":"sha256:2b97479f5e4b4b9c477b2c772558548567acc1ba8b598f27b9a172980130cd78","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/e0fe9724-d85a-4ab1-8cac-0f8807667b73/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":"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":"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":"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":"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":"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":"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":"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":23868900,"archive_hash":"sha256:ba7bf2bacd902027732b620cdd7b852f7f5916b4fcf3d67444d91dd8e68d0d04","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f31a9950-6cb8-4c2f-ba6e-23cb51883a54/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_autosave_pro","name":"Smart AutoSave+ Pro - NovaStrikes [FREE]","tagline":"Intelligent autosave with triggers, crash recovery, profiles, and pop-up notifications.\nSave your hours of works without any fear.","version":"4.0.0","type":"add-on","archive_size":6382,"archive_hash":"sha256:2b8927e3d773db93b74fd5560f219b361c29f8ac51c4788f830f31025ae66778","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/2621df49-351f-442a-8678-477d4d1ba5d1/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":["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":"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":"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":"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":25572,"archive_hash":"sha256:8a25ea2b2959b63c3dfc4c11ad49901feec23c2bd749a4cf976818a752ef94b5","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/158acb38-f472-46c6-b6af-e8e11257a1dc/addon.zip","verification_status":"validated","can_download":"Rejected in this plan","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":"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":"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":"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: $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":"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":"15.30","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_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.2.9","type":"add-on","archive_size":10451602,"archive_hash":"sha256:a9e4fabdd2b9bc187e4bd715054d4fff449af9fec9fb4b7a2611b224792f982c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/5f232d7f-d4b9-4c3f-98f4-7919e228758f/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":"bevel_joints_v5_pro","name":"Bevel Joints - Join Meshes cleanly with bevel presets & set mesh normal quick button [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":"4.4.0","type":"add-on","archive_size":1320631,"archive_hash":"sha256:2da53f7d37c7a80eb30723a106d5cd336af303c91fe84cd7a79d31c3bfb9005f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ceb675cf-70c2-438d-8309-f06e14cb6ae3/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":["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":"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_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_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.5","type":"add-on","archive_size":437091,"archive_hash":"sha256:48fcd8eddaa130a900c5003af6dc7859c8fc2a6493b179ff857bcc2ba6bb6d8a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/4eda78fa-8690-444f-92a7-6163203c6b2b/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 [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":"2.6.1","type":"add-on","archive_size":6225788,"archive_hash":"sha256:460fd7fc9bf0224962a291a49551368d33ce3cac6ba2c2eee635d334240fedbe","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b5b21779-1821-4caf-be60-882bbd45c885/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":"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":"blenquick_mocap_lite","name":"BlenQuick Mocap Lite [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.1.0","type":"add-on","archive_size":287100833,"archive_hash":"sha256:8442e88ebd4a1fe6bd9ad1e2234e616ee4317caf073fdadea770df1342ba64b2","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/7c6e5c10-9e4d-46ef-b488-c05d4456756e/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":"Stellart","tags":["blenquick","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":"BlenQuick Mocap Pro [Before: $21.00, Now: $17.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.2.7","type":"add-on","archive_size":287494304,"archive_hash":"sha256:655c31ffa945e98ce6e0bd6ba5c4b22c2addcecb95be4124b706c3a51ad9d480","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1130cd1a-a8a9-467d-b5e2-803aed0dd05f/addon.zip","verification_status":"validated","can_download":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"17.85","blender_version_min":"4.2.0","maintainer":"Stellart","tags":["advanced","blenquick","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":"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":"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: $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.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":"2.55","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":"cgp_all_in_1_transform","name":"CGP: All In 1 Transform [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":5196,"archive_hash":"sha256:c28b18a65adfedc93a4762098cd5a8cab3830a529cf66d93b13f0ba1ea5f524f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6ac1bc62-1a7e-4a21-9975-0db0b4d9e81c/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":"Chaitanya Garg","tags":["faster","workflow","transformation","navigation"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/9f2c483b-7c9f-44bd-9e9d-477cb7d6cee5/","schema_version":"1.0.0"},{"id":"cgp_editor_switch","name":"CGP: Editor Switch [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":5525,"archive_hash":"sha256:e43f3d0861020e5f8494100787f8e6a38b7a3c5fe2d0678a15479ad3d253fea4","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/36b41651-1ead-42b5-8102-d1d2abeeb82d/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":"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: $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":5637,"archive_hash":"sha256:412965477f84cd4c86f67a2e0171f224e280e463fad4cbc8d82576a7cb6c660c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/8975289a-ef37-448a-9bd6-dbe5ef6c45d4/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":"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","name":"Cleaner [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":"2.0.1","type":"add-on","archive_size":3925,"archive_hash":"sha256:9577803bab5e2150696d510cadf263470e6a2917bd30997bd67c2733d9481cea","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/eef5c3b8-2146-4b92-bd22-5abe8f19b29d/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":"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.0.0","type":"add-on","archive_size":8829175,"archive_hash":"sha256:c5a8a31698d3e7e20882516a31c1386a132e6cabc418a7e018681d31fd3d5a81","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c9bde43d-df28-4b0d-a271-5b108223d01b/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_v5_pro","name":"\"Cracks\" Damage addon 💥Windows, Linux, Mac approved [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.1","type":"add-on","archive_size":6700209,"archive_hash":"sha256:6dbb386402cf95a86aa82e742a5d3e06e42c8a31dd02d7320aec6d2a78050987","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/6b1a8813-25c3-4498-813d-8c3207c9f454/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":["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":"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":"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":"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.0.4","type":"add-on","archive_size":140695,"archive_hash":"sha256:5bb41c9a957d55836602573d7ddd04cd72c3d03ef35799afb1ab2e95e7de037f","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d1ab170e-0e96-46d9-8182-4d657c351980/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":"Delete_Loose","name":"Delete Loose [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.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":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"1.70","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":"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":"easy_batch_render","name":"Easy Batch Render [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.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":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"2.55","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_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: $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.2.0","type":"add-on","archive_size":12720,"archive_hash":"sha256:4831012e01a0b9a886a8b76e55945183c6e2aec775b69d522d693aafa3815f97","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/c85a224a-e598-43d9-916f-20cfe8a45b8c/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":"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":"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":"hotkeyboard_azerty","name":"French Keyboard Shortcuts - HotkeyBoard AZERTY [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.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":"10.20","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 Zuhair","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":"Greaseliner","name":"Greaseliner [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":27965,"archive_hash":"sha256:8c7217d4df284584d1f29f753755573932382309ef04f5086dea6b9edd7626e9","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/49fc405a-a1d4-4590-922f-f99e6bc723bc/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":"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":"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: $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":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":"10.20","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":"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 Zuhair","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":"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":"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":"light_wrangler","name":"Light Wrangler: The Must-Have Lighting Add-On for Blender [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.3.0","type":"add-on","archive_size":241810757,"archive_hash":"sha256:52b3b640744a583653ccf17ae4e0fced3c3be06ab5a576bcfe5998b1de6c3e1c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/1b60d0f0-f251-4bcd-8d1e-d9de014a6a80/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":"Leonid Altman","tags":["addon","plugin","lighting","hdri","gobo","lights","ies","light_wrangler","blender_addon","studio_lighting"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/7c4870a4-2ccf-4c18-b861-1b4670fdc343/","schema_version":"1.0.0"},{"id":"lim_addon","name":"LIM – Life In Motion: Animation Toolkit for Human Generator [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":"1.0.1","type":"add-on","archive_size":244332,"archive_hash":"sha256:e793e8fbe24a71f30e36b5d48b40d9b38d8b225b15d99ea2bab1ed2e718b7045","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/ab5de41c-d5ca-491e-945f-85ad7826dd5d/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":"Mateusz Kopeć","tags":["animation","rigging","character","human","generator","shapekeys","tools","motion","mirror","actions"],"license":["default_addon_license"],"website":"https://www.blenderkit.com/asset-gallery-detail/f76a7154-e368-4f4b-bc83-734ed745e96c/","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.2","type":"add-on","archive_size":3497,"archive_hash":"sha256:45e172453410214bf4ac257427b140cb35e357c1e4563f7e21a7578681551177","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/44a068f0-bf5e-4ac1-9ac6-95758df6591c/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":"Efe Kekikciler","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: $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":"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":"1.70","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.3.2","type":"add-on","archive_size":10359962,"archive_hash":"sha256:2db09964d56021996a78c03941fda55e1c18abdf60d2122bafd77141393e0f90","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/08dfedaa-c990-4ae6-a5ca-afd9b3ad444f/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":"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":"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":"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.4.3","type":"add-on","archive_size":13645,"archive_hash":"sha256:2a2d6169c5cf4e40302e5201b272720633b3c490d4fa472450b068ac115c1a3a","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/cd45b087-f121-4ba1-b077-f308fc293afd/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":"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":"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":"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":"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":"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":"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":"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: $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":"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":"34.00","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":736200,"archive_hash":"sha256:9a7688596f1042e58cde985fa8bc5de19e819475f388b2e25f14d94e712207dc","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f9f3c32a-f5ca-4840-beb5-dfc6ce73de47/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 Generator & Material Blending Tool [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":7985,"archive_hash":"sha256:0c8f3dec228fb9557d746b6e3408453f46551e7cd21d13c73e8b88c1d254ede6","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/b1465a14-c8ab-4aaa-bbcf-a64322f38472/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_terrain","procedural_generation","terrain_generator","game_development","landscape","texture_blending","terrain","terrain_mesh","landscape_mesh","realistic"],"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":"quadify_premium","name":"Quadify Premium [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":11192,"archive_hash":"sha256:57b5d188bbb8d243e5caad5ec138c60853f6ae8d4da72420aef73738ceab754c","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/55e77745-c0d5-4507-83f5-00769c7684b5/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":["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":"2.9.6","type":"add-on","archive_size":342427,"archive_hash":"sha256:6557ce959b698833450c30a7b690af3ab3a7e6ad7aefde1c2724f6b7596e5cda","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/0d6248ef-7c6b-4905-87fe-4d2eb5ca9e92/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":"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":"reflectiveaudiomachine","name":"Reflective Audio Machine v1.0 [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.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":"Is for sale","is_private":false,"is_free":false,"is_for_sale":true,"base_price":"3.39","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":"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":"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.2.0","type":"add-on","archive_size":32501,"archive_hash":"sha256:ebad257a98fd3c36d0f76126cd289c151bef50d80d6bfd9b8659e54b9d4973d3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/55abd399-287b-428a-967a-45361293d7ca/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":"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":"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.5.0","type":"add-on","archive_size":520474,"archive_hash":"sha256:a4db1697457008d6fb6a575adf4691f2126c50f9f4ce03a7cd8afe248507bec3","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/9038530c-91e6-413f-87a6-0b9655507bb3/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":"Efe Kekikciler","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":"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.0","type":"add-on","archive_size":1885,"archive_hash":"sha256:1340f41c88593ebe2f5b12e16a82ab1d18deb3aee779fae6a7aa7e7d4b0a0e2d","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/341c14bf-d6ba-4dd8-baee-2995534a6515/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":"Efe Kekikciler","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":782995,"archive_hash":"sha256:9e5e9476b0bfe81ece321a37c42bcdf363aca7a1e5f37a7a1954c7778c8c6107","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/faf21524-962a-4ce1-a364-4ab74038fa15/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: $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":"2.0.8","type":"add-on","archive_size":12114989,"archive_hash":"sha256:ae67416cc3434a394e9a1a363132c84220caa557f8ebd466fc609d8993c088d1","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/d0019909-c6ad-4ec5-a1ed-6937e8bcf79b/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":"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.4","type":"add-on","archive_size":221504,"archive_hash":"sha256:1c985b52beb89f03d15d0ec3b39c42ef295875648633eabeb7ef7fb1f4a46bd8","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/68407532-723a-41c9-a7b3-b541603ae1e4/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_explode","name":"Smart Explode [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":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":"12.75","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 Rigger [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.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":"12.75","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":"solaris_creator_pro","name":"SolarisCreator Pro [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.0","type":"add-on","archive_size":11032,"archive_hash":"sha256:2ee092ad1185bdb55d58c6b8bf3631b4e96e4b1e7cdf0c8c8fcf5eba36273f50","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/f22fae41-a7ec-4fcf-891e-c7b9186ee102/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":"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: $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.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":"12.75","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":"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":"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":"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 Ahmed","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":"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.2.1","type":"add-on","archive_size":10524,"archive_hash":"sha256:7d30443c92b0e8a9d688b20b819041ad79762b5faba6b4aba8fb2b476cf6d825","archive_url":"https://www.blenderkit.com/api/v1/assetfile-download/efd9299b-aa4f-482d-9ebe-99565bd4d208/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":"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":"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":"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 Ahmed","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/Animation_Layers/.gitignore b/scripts/addons/Animation_Layers/.gitignore new file mode 100644 index 0000000..007874b --- /dev/null +++ b/scripts/addons/Animation_Layers/.gitignore @@ -0,0 +1,14 @@ +# Claude Code +.claude/ + +# Python cache +__pycache__/ +*.pyc + +# Non-addon folders +diagnostics/ +diagnostics.zip +animation_layers_updater/ + +# Experimental, not shipped +ultra_bake.py diff --git a/scripts/addons/Animation_Layers/__init__.py b/scripts/addons/Animation_Layers/__init__.py index a5310c1..b0be336 100644 --- a/scripts/addons/Animation_Layers/__init__.py +++ b/scripts/addons/Animation_Layers/__init__.py @@ -20,7 +20,7 @@ bl_info = { "name": "Animation Layers", "author": "Tal Hershkovich", - "version" : (2, 4, 1), + "version" : (2, 4, 2), "blender" : (3, 2, 0), "location": "View3D - Properties - Animation Panel", "description": "Simplifying the NLA editor into an animation layers UI and workflow", @@ -110,7 +110,9 @@ class AnimLayersSettings(bpy.types.PropertyGroup): upper_stack : bpy.props.BoolProperty(name="Upper Stack Evaluation", description="Checks if tweak mode uses upper stack", default=False, override = {'LIBRARY_OVERRIDABLE'}) #Tools - inbetweener : bpy.props.FloatProperty(name='Inbetween Keyframe', description="Adds an inbetween Keyframe between the Layer's neighbor keyframes", soft_min = 0, soft_max = 1, default=0.5, options = set(), override = {'LIBRARY_OVERRIDABLE'}, update = anim_layers.add_inbetween_key) + inbetweener : bpy.props.FloatProperty(name='Inbetween Keyframe', description="Adds an inbetween Keyframe between the Layer's neighbor keyframes", soft_min = 0.0, soft_max = 1.0, default=0.5, options = set(), override = {'LIBRARY_OVERRIDABLE'}, update = anim_layers.add_inbetween_key, get = anim_layers.get_inbetweener, set = anim_layers.set_inbetweener) + inbetweener_push : bpy.props.FloatProperty(name='Inbetween Keyframe', description="Adds an inbetween Keyframe between the Layer's neighbor keyframes, further values push past the neighbor keyframes", soft_min = -0.5, soft_max = 1.5, default=0.5, options = set(), override = {'LIBRARY_OVERRIDABLE'}, update = anim_layers.add_inbetween_key, get = anim_layers.get_inbetweener, set = anim_layers.set_inbetweener) + push: bpy.props.BoolProperty(name ='Toggle Push', description = 'Changing the min and max values further for pushing', default = False) share_layer_keys: bpy.props.EnumProperty(name = 'Share Layer Keys', description="Share keyframes positions between layers", items = anim_layers.share_layerkeys_items, override = {'LIBRARY_OVERRIDABLE'}) influence_hide: bpy.props.BoolProperty(name="Hide Influence", description="Hide Influence Fcurves", default=False, update = anim_layers.influence_hide_keyframes, override = {'LIBRARY_OVERRIDABLE'}) @@ -145,6 +147,12 @@ class AnimLayersItems(bpy.types.PropertyGroup): assigned_group: bpy.props.EnumProperty(name='Parent', description='Set this layer\'s parent (None = root)', items=anim_layers.layer_group_enum_items, get=anim_layers.layer_group_get, set=anim_layers.layer_group_set, options={'HIDDEN'}) + # Set once per file-load/turn-on by anim_layers.tag_unusable_layers: True on + # rows that come from a linked-library source file and have no matching NLA + # track locally. Such rows can't be removed here (the library owns them), so + # the row<->track index mapping skips them until the layer is deleted in the + # rig source file. + not_usable: bpy.props.BoolProperty(name="Not Usable", description="Layer stored in the linked source file without a matching NLA track. Remove the layer in the rig source file to get rid of it", default=False, options={'HIDDEN'}, override = {'LIBRARY_OVERRIDABLE'}) # Legacy field for pre-migration data. Read by migrate_object_to_hierarchical # and ignored thereafter. Schema retained so old .blend files load cleanly. type: bpy.props.EnumProperty(name="Item Type (legacy)", default='LAYER', diff --git a/scripts/addons/Animation_Layers/anim_layers.py b/scripts/addons/Animation_Layers/anim_layers.py index c42cc95..d0d8b03 100644 --- a/scripts/addons/Animation_Layers/anim_layers.py +++ b/scripts/addons/Animation_Layers/anim_layers.py @@ -17,32 +17,82 @@ from . import multikey # layer; "group" identity is derived (a layer is a group iff something points # to it via parent_layer). The helpers below are thin wrappers that exist for # call-site readability and to keep one place to harden against bad state. +# +# One sanctioned exception to the 1:1 mirror: rows tagged `not_usable`. +# A linked-library rig can ship Anim_Layers rows in its source file that have +# no NLA track here, and the local file cannot remove them. Those rows are +# tagged once per file-load/turn-on (tag_unusable_layers) and the mapping +# helpers below skip them, so the USABLE rows stay 1:1 with nla_tracks. # Re-entrancy guard for mute/lock cascades (parent → descendants). _group_cascade_skip = False def row_to_layer_index(obj, row): - """Row in obj.Anim_Layers -> NLA-track index. Identity since the mirror is 1:1.""" + """Row in obj.Anim_Layers -> NLA-track index. Identity when every row is + usable; otherwise skips not_usable rows. Returns -1 for an invalid row or + a not_usable row (it has no track).""" if obj is None or row < 0: return -1 - if row >= len(obj.Anim_Layers): + items = obj.Anim_Layers + if row >= len(items): return -1 - return row + if items[row].not_usable: + return -1 + return row - sum(1 for i in range(row) if items[i].not_usable) def layer_to_row_index(obj, layer_idx): - """NLA-track index -> row in obj.Anim_Layers. Identity since the mirror is 1:1.""" + """NLA-track index -> row in obj.Anim_Layers, skipping not_usable rows. + Clamps to the last usable row when layer_idx is out of range (mirrors the + old min() clamp); returns 0 when there are no usable rows.""" if obj is None or layer_idx < 0: return 0 - return min(layer_idx, max(0, len(obj.Anim_Layers) - 1)) + usable = -1 + last_usable_row = 0 + for row, it in enumerate(obj.Anim_Layers): + if it.not_usable: + continue + usable += 1 + last_usable_row = row + if usable == layer_idx: + return row + return last_usable_row + +def layer_row_index(item): + """Row index of a layer item inside obj.Anim_Layers, derived positionally + from the item's RNA path (no name lookup). Returns -1 if it can't be + determined.""" + try: + path = item.path_from_id() + return int(path[path.rindex('[') + 1:path.rindex(']')]) + except (ValueError, AttributeError): + return -1 + +def layer_track_index(item): + """NLA-track index of a layer item, derived positionally from its row + (no name lookup): row index minus the not_usable rows below it. Returns + -1 when the item has no track (not_usable row, invalid path, or track + out of range).""" + obj = item.id_data + idx = row_to_layer_index(obj, layer_row_index(item)) + if idx == -1: + return -1 + anim_data = anim_data_type(obj) + if anim_data is None or not hasattr(anim_data, 'nla_tracks') or idx >= len(anim_data.nla_tracks): + return -1 + return idx def active_item(obj): - """The currently-active Anim_Layers item, or None.""" + """The currently-active Anim_Layers item, or None. A not_usable row (layer + from a linked source file without an NLA track) is never a valid active + item — operators and handlers must not act on it.""" if obj is None: return None items = obj.Anim_Layers row = obj.als.layer_index if not items or row < 0 or row >= len(items): return None + if items[row].not_usable: + return None return items[row] def is_layer_row_active(obj): @@ -51,16 +101,19 @@ def is_layer_row_active(obj): return active_item(obj) is not None def nla_idx(obj): - """NLA-track index for the active row. Identity wrapper around layer_index - (the row-vs-track distinction is gone post-migration). Returns -1 if no - valid active row.""" + """NLA-track index for the active row, skipping not_usable rows. Returns + -1 if there is no valid active row (out of range, not_usable, or no + matching track). Callers must guard against -1 before indexing + nla_tracks — Python would silently wrap to the last track.""" if obj is None: return -1 - items = obj.Anim_Layers - row = obj.als.layer_index - if not items or row < 0 or row >= len(items): + idx = row_to_layer_index(obj, obj.als.layer_index) + if idx == -1: return -1 - return row + anim_data = anim_data_type(obj) + if anim_data is None or not hasattr(anim_data, 'nla_tracks') or idx >= len(anim_data.nla_tracks): + return -1 + return idx # --- Hierarchical helpers (Phase 0 of GROUP-row -> hierarchical refactor) --- # These operate on the new `parent_layer` string field. During Phase 0 they @@ -203,7 +256,9 @@ def sync_nla_to_layer_order(obj, context=None): return False nla_tracks = anim_data.nla_tracks - desired = [it.name for it in obj.Anim_Layers] + # not_usable rows (linked-source layers without a track) are outside the + # mirror — only the usable rows must match the NLA order. + desired = [it.name for it in obj.Anim_Layers if not it.not_usable] # Counts disagree -> the LAYER<->NLA mirror is broken (e.g. blend just # loaded with stale state, or external NLA edits). Rebuild from NLA. @@ -238,11 +293,40 @@ def sync_nla_to_layer_order(obj, context=None): return True def nla_layer_count(obj): - """Number of layer rows in obj.Anim_Layers. Equals len(nla_tracks) when the - collection is in sync (the post-migration invariant).""" + """Number of USABLE layer rows in obj.Anim_Layers (rows tagged not_usable + are excluded). Equals len(nla_tracks) when the collection is in sync (the + post-migration invariant).""" if obj is None: return 0 - return len(obj.Anim_Layers) + return sum(1 for it in obj.Anim_Layers if not it.not_usable) + +def tag_unusable_layers(obj): + '''One-time consistency check, run when Anim Layers turns on and when a + file loads with it on (not on every index lookup). Tags rows that come + from a linked-library source file (override reference) and have no + matching NLA track locally as not_usable. Such rows cannot be removed here + — only in the rig source file — and would otherwise shift the row<->track + index mapping. Tagged rows are skipped by row_to_layer_index / + layer_to_row_index / nla_idx and excluded from nla_layer_count. + Local rows without a track are NOT tagged; the visible_layers rebuild is + the correct recovery for those. Matching is by name (the same key + visible_layers uses to restore state).''' + if obj is None: + return + ref_names = {layer.name for layer in check_override_layers(obj)} + anim_data = anim_data_type(obj) + track_names = set() + if anim_data is not None and hasattr(anim_data, 'nla_tracks'): + track_names = {track.name for track in anim_data.nla_tracks} + for it in obj.Anim_Layers: + flag = it.name in ref_names and it.name not in track_names + if it.get('not_usable', False) != bool(flag): + try: + it['not_usable'] = flag + except TypeError: + # Fully linked (not overridden) data is write-restricted; the + # mapping helpers then read the flag as False, same as before. + pass # Cache for assigned_group enum items. Blender requires the items list # returned by an `items` callback to be referenced by Python so strings @@ -340,6 +424,9 @@ def loadanimlayers(self, context): # One-time hierarchical-schema migration. Idempotent; bumps # obj.als.schema_version on success so subsequent loads skip the work. migrate_object_to_hierarchical(obj) + # Tag linked-source layers that have no NLA track so the index + # mapping skips them (stored check — not repeated per lookup). + tag_unusable_layers(obj) #Make sure layer index is not more then the layers row_count = len(obj.Anim_Layers) if row_count and obj.als.layer_index > row_count - 1: @@ -370,6 +457,9 @@ def turn_animlayers_on(self, context): return if self.turn_on: + # Stored one-time check: layers from a linked rig source file without + # an NLA track get tagged not_usable before any count comparisons run. + tag_unusable_layers(obj) check_anim_data_start(self, obj, anim_data) #workaround for issues coming from version 4.1.0 if bpy.app.version == (4, 1, 0): @@ -451,7 +541,12 @@ def check_anim_data_start(self, obj, selected_anim_data): if anim_data != selected_anim_data: continue if nla_layer_count(obj) > len(anim_data.nla_tracks): - obj.Anim_Layers.clear() + try: + obj.Anim_Layers.clear() + except TypeError: + # Write-restricted (linked/override) collection — rows that + # can't be removed were already tagged by tag_unusable_layers. + pass if not nla_layer_count(obj) and len(anim_data.nla_tracks): start = True @@ -502,8 +597,8 @@ def load_none_view_layer(obj): anim_data = anim_data_type(obj) if not len(obj.Anim_Layers) or not len(anim_data.nla_tracks): return - i = obj.als.layer_index - if obj.Anim_Layers[i].lock: + item = active_item(obj) + if item is None or item.lock: return obj.als.viewlayer = False if not anim_data.use_tweak_mode: @@ -543,6 +638,10 @@ def start_animlayers(obj): if len(nla_tracks[i].strips) == 1: nla_tracks[i].strips[0].name = track_names[i] + # Re-tag before any count/order comparison: rows from a linked rig source + # file without an NLA track must not participate in the 1:1 mirror. + tag_unusable_layers(obj) + # If the saved obj.Anim_Layers ordering disagrees with the NLA-track order # (e.g. after loading a .blend whose NLA was edited externally), bring NLA # in line with the saved layer order before the iteration that follows. @@ -558,7 +657,9 @@ def start_animlayers(obj): frame_start, frame_end = subscriptions.get_frame_range(scene) #synchronize the temporary influence prorpery - layer_items = [l for l in obj.Anim_Layers if l.type == 'LAYER'] + # not_usable rows have no track, so exclude them to keep enumerate(...) + # aligned with nla_tracks. + layer_items = [l for l in obj.Anim_Layers if l.type == 'LAYER' and not l.not_usable] for i, layer in enumerate(layer_items): if i >= len(nla_tracks) or len(nla_tracks[i].strips) != 1: continue @@ -782,6 +883,13 @@ def register_layers(obj, nla_tracks): strip = track.strips[0] use_animated_influence(strip) +def _restore_influence(layer, strip): + '''restore influence value if it has no keyframes and using the temprorary property''' + if strip.fcurves: + if len(strip.fcurves[0].keyframe_points): + return + layer['influence'] = strip.influence + #updating the ui list with the nla track names def visible_layers(obj, nla_tracks): '''Mirror obj.Anim_Layers 1:1 with NLA tracks (same order). Per-layer state @@ -791,13 +899,6 @@ def visible_layers(obj, nla_tracks): The collection-order = NLA-order invariant is the single source of truth; hierarchy is purely metadata on top of that order.''' - def restore_influence(layer, strip): - '''restore influence value if it has no keyframes and using the temprorary property''' - if strip.fcurves: - if len(strip.fcurves[0].keyframe_points): - return - layer['influence'] = strip.influence - # 1. Snapshot per-layer state, keyed by name. layer_state = {} for it in obj.Anim_Layers: @@ -815,6 +916,18 @@ def visible_layers(obj, nla_tracks): } # 2. Rebuild one row per NLA track, preserving NLA order. + # On write-restricted data (linked/override collections) the rebuild can + # raise TypeError — fall back to tagging so the index mapping stays valid + # even though the stale rows couldn't be removed. + try: + _rebuild_layer_rows(obj, nla_tracks, layer_state) + except TypeError: + tag_unusable_layers(obj) + + +def _rebuild_layer_rows(obj, nla_tracks, layer_state): + '''clear-and-rebuild body of visible_layers. Split out so the caller can + catch TypeError from write-restricted (linked/override) collections.''' obj.Anim_Layers.clear() for track in nla_tracks: layer = obj.Anim_Layers.add() @@ -827,7 +940,7 @@ def visible_layers(obj, nla_tracks): strip.name = track.name if strip.action is not None: layer['action'] = strip.action - restore_influence(layer, strip) + _restore_influence(layer, strip) s = layer_state.get(track.name) if s is not None: @@ -995,10 +1108,11 @@ def use_animated_influence(strip): def check_override_layers(obj): if obj.override_library is None: - return False - if len(obj.override_library.reference.Anim_Layers): - return True - return False + return [] + reference_layers = obj.override_library.reference.Anim_Layers + if len(reference_layers): + return reference_layers + return [] def check_override_tracks(obj, anim_data): if obj.override_library is None: @@ -1076,9 +1190,10 @@ def hide_view_all_keyframes(obj, anim_data): anim_data.action.groups['Anim Layers'].lock = True return #if the group was not found or renamed iterate over the layers - layer_items = [l for l in obj.Anim_Layers if l.type == 'LAYER'] + # multilayer fcurves are indexed in TRACK space, so exclude not_usable rows + layer_items = [l for l in obj.Anim_Layers if l.type == 'LAYER' and not l.not_usable] for i, layer in enumerate(layer_items): - if layer.lock or obj.als.layer_index == i: + if layer.lock or nla_idx(obj) == i: continue fcu = fcurves.find(layer.name, index = i) if fcu is None: @@ -1119,7 +1234,11 @@ class EditAllLayersOperator(bpy.types.Operator): for i, layer in enumerate(self.obj.Anim_Layers): #look for the Anim Layers fcurve if layer.lock or anim_data.action is None or i == self.obj.als.layer_index: continue - fcu_layer = fcurves.find(layer.name, index = i) + # multilayer fcurves are indexed in TRACK space (-1 = not_usable row) + ti = row_to_layer_index(self.obj, i) + if ti == -1: + continue + fcu_layer = fcurves.find(layer.name, index = ti) if fcu_layer is None or not len(fcu_layer.keyframe_points): continue @@ -1191,9 +1310,13 @@ class EditAllLayersOperator(bpy.types.Operator): for i, layer in enumerate(self.obj.Anim_Layers): #look for the Anim Layers fcurve if layer.lock or anim_data.action is None or i == self.obj.als.layer_index: continue + # multilayer fcurves and nla_tracks are indexed in TRACK space + ti = row_to_layer_index(self.obj, i) + if ti == -1: + continue fcurves = get_fcurves(self.obj, anim_data.action) - fcu_layer = fcurves.find(layer.name, index = i) + fcu_layer = fcurves.find(layer.name, index = ti) if fcu_layer is None or not len(fcu_layer.keyframe_points): continue @@ -1211,7 +1334,7 @@ class EditAllLayersOperator(bpy.types.Operator): org_pairs = pairs # Adding the offset from the layers and the current layers - pairs = multilayer_reverse_offset(pairs, anim_data.nla_tracks[i].strips[0]) + pairs = multilayer_reverse_offset(pairs, anim_data.nla_tracks[ti].strips[0]) pairs = multilayer_offset_evaluation(pairs, anim_data.nla_tracks[nla_idx(self.obj)].strips[0]) #Creating a column from each pair @@ -1224,7 +1347,7 @@ class EditAllLayersOperator(bpy.types.Operator): #check if keyframes were deleted if self.fcu_layers.get(fcu_layer.data_path) != len(fcu_layer.keyframe_points): - fcurves = get_fcurves(self.obj, anim_data.nla_tracks[i].strips[0].action) + fcurves = get_fcurves(self.obj, anim_data.nla_tracks[ti].strips[0].action) self.remove_keyframes(fcurves, frames) self.fcu_layers[fcu_layer.data_path] = len(fcu_layer.keyframe_points) continue @@ -1236,8 +1359,8 @@ class EditAllLayersOperator(bpy.types.Operator): if not changed_keys.size: continue - #iterate through the fcurves in the original action - fcurves = get_fcurves(self.obj, anim_data.nla_tracks[i].strips[0].action) + #iterate through the fcurves in the original action + fcurves = get_fcurves(self.obj, anim_data.nla_tracks[ti].strips[0].action) self.update_keyframes_postion(fcurves, changed_keys) @@ -1370,9 +1493,14 @@ def view_all_keyframes(self, context): self.edit_all_keyframes = False return + active_track_idx = nla_idx(obj) + if active_track_idx == -1: + return + for i, track in enumerate(nla_tracks): track_fcurves = get_fcurves(obj, track.strips[0].action) - if i == obj.als.layer_index or track.strips[0].action is None or not len(track_fcurves) or obj.Anim_Layers[i].lock: + # i is a TRACK index; map it back to the layer row (skips not_usable rows) + if i == active_track_idx or track.strips[0].action is None or not len(track_fcurves) or obj.Anim_Layers[layer_to_row_index(obj, i)].lock: continue #create a new fcurve with the name of the track fcurves = get_fcurves(obj, anim_data.action) @@ -1387,7 +1515,7 @@ def view_all_keyframes(self, context): continue frames = multilayer_offset_evaluation(frames, track.strips[0]) - frames = multilayer_reverse_offset(frames, nla_tracks[nla_idx(obj)].strips[0]) + frames = multilayer_reverse_offset(frames, nla_tracks[active_track_idx].strips[0]) keyframes = np.repeat(frames, 2) @@ -1415,9 +1543,10 @@ def unlock_edit_keyframes(self, context): anim_data = anim_data_type(obj) - layer_items = [l for l in obj.Anim_Layers if l.type == 'LAYER'] + # multilayer fcurves are indexed in TRACK space, so exclude not_usable rows + layer_items = [l for l in obj.Anim_Layers if l.type == 'LAYER' and not l.not_usable] for i, layer in enumerate(layer_items): #look for the Anim Layers fcurve - if layer.lock or anim_data.action is None or i == obj.als.layer_index: + if layer.lock or anim_data.action is None or i == nla_idx(obj): continue fcurves = get_fcurves(obj, anim_data.action) fcu = fcurves.find(layer.name, index = i) @@ -1591,6 +1720,16 @@ def update_layer_index(self, context): anim_data = anim_data_type(obj) if anim_data is None or not hasattr(anim_data, 'nla_tracks'): return + # A not_usable row (linked-source layer without an NLA track) can't be the + # working layer — bounce the selection to the nearest usable row. + items = obj.Anim_Layers + row = self.layer_index + if 0 <= row < len(items) and items[row].not_usable: + new_row = next((i for i in range(row - 1, -1, -1) if not items[i].not_usable), + next((i for i in range(row + 1, len(items)) if not items[i].not_usable), -1)) + if new_row != -1: + self.layer_index = new_row # re-fires this update with a usable row + return # If the active row is a GROUP, there's no NLA strip to switch to. nla_index = nla_idx(obj) if nla_index < 0 or nla_index >= len(anim_data.nla_tracks): @@ -1646,8 +1785,8 @@ def layer_mute(self, context): if anim_data is None: return - # Sync own NLA track. - layer_idx = anim_data.nla_tracks.find(self.name) + # Sync own NLA track (positional row->track mapping). + layer_idx = layer_track_index(self) if layer_idx != -1: anim_data.nla_tracks[layer_idx].mute = self.mute @@ -1712,9 +1851,9 @@ def layer_solo(self, context): else: # Restore each track's mute from its layer-row mute (which itself # reflects ancestor-cascade state from layer_mute). - for it in obj.Anim_Layers: - track_idx = nla_tracks.find(it.name) - if track_idx != -1: + for row, it in enumerate(obj.Anim_Layers): + track_idx = row_to_layer_index(obj, row) + if track_idx != -1 and track_idx < len(nla_tracks): nla_tracks[track_idx].mute = it.mute finally: _group_cascade_skip = False @@ -1730,7 +1869,7 @@ def layer_lock(self, context): return nla_tracks = anim_data.nla_tracks - layer_idx = nla_tracks.find(self.name) + layer_idx = layer_track_index(self) if layer_idx == -1: return @@ -1751,7 +1890,8 @@ def layer_lock(self, context): _group_cascade_skip = False # Get out of tweak mode if the locked row is the active one. - if layer_idx == obj.als.layer_index: + # layer_idx is a TRACK index (find by name), so compare in track space. + if layer_idx == nla_idx(obj): obj.als.layer_index = obj.als.layer_index #Exclude locked layers from view all keyframes @@ -1801,14 +1941,11 @@ def layer_name_update(self, context): return nla_tracks = anim_data.nla_tracks override_tracks = check_override_tracks(obj, anim_data) - layer_idx = nla_tracks.find(self.name) + # Positional row->track mapping — works whether or not the track has been + # renamed to match the row yet. + layer_idx = layer_track_index(self) if layer_idx == -1: - # Track name hasn't been synced yet. Locate by previous name via the - # collection's row index. - row = list(obj.Anim_Layers).index(self) - if row >= len(nla_tracks): - return - layer_idx = row + return track = nla_tracks[layer_idx] if not len(track.strips): return @@ -1840,7 +1977,10 @@ def influence_get_strips(context): obj = context.object anim_data = anim_data_type(obj) scene = context.scene - current_strip = anim_data.nla_tracks[nla_idx(obj)].strips[0] + index = nla_idx(obj) + if index == -1 or not len(anim_data.nla_tracks[index].strips): + return [] + current_strip = anim_data.nla_tracks[index].strips[0] strips = [current_strip] if scene.als.influence_global: strips += [strip for track in anim_data.nla_tracks for strip in track.strips] @@ -1902,10 +2042,9 @@ def influence_update(self, context): obj = context.object if not len(obj.Anim_Layers): return - # index = obj.Anim_Layers.find(self.name) - index = obj.als.layer_index + index = nla_idx(obj) anim_data = anim_data_type(obj) - if not len(anim_data.nla_tracks[index].strips): + if index == -1 or not len(anim_data.nla_tracks[index].strips): return strip = anim_data.nla_tracks[index].strips[0] strip.influence = self.influence @@ -1942,7 +2081,10 @@ def blend_type_update(self, context): '''synchronize the blend property with the NLA Blend''' obj = self.id_data anim_data = anim_data_type(obj) - strip = anim_data.nla_tracks[nla_idx(obj)].strips[0] + index = nla_idx(obj) + if index == -1 or not len(anim_data.nla_tracks[index].strips): + return + strip = anim_data.nla_tracks[index].strips[0] if self.blend_type == strip.blend_type: return if obj.als.auto_blend: @@ -1963,10 +2105,13 @@ def auto_rename(self, context): return if anim_data.action is None: return + index = nla_idx(obj) + if index == -1 or not len(anim_data.nla_tracks[index].strips): + return name = anim_data.action.name obj.Anim_Layers[obj.als.layer_index].name = name - anim_data.nla_tracks[nla_idx(obj)].name = name - anim_data.nla_tracks[nla_idx(obj)].strips[0].name = name + anim_data.nla_tracks[index].name = name + anim_data.nla_tracks[index].strips[0].name = name def auto_rename_default(obj): '''Apply the default auto renaming from the addon preferences''' @@ -1978,11 +2123,20 @@ def addon_folder_path(): folder_name = os.path.basename(folder_path) return folder_name +def get_inbetweener(self): + return self.get('_inbetweener', 0.5) + +def set_inbetweener(self, value): + self['_inbetweener'] = value + def add_inbetween_key(self, context): '''Adding a Breakdown keyframe that works also in Layers''' obj = self.id_data anim_data = anim_data_type(obj) - strip = anim_data.nla_tracks[nla_idx(obj)].strips[0] + index = nla_idx(obj) + if index == -1 or not len(anim_data.nla_tracks[index].strips): + return + strip = anim_data.nla_tracks[index].strips[0] frame = round(bake_ops.frame_evaluation(context.scene.frame_current, strip), 3) fcurves = get_fcurves(obj, anim_data.action) @@ -2015,18 +2169,22 @@ def add_inbetween_key(self, context): del key_before del key_added - self['inbetweener'] = 0.5 + self['_inbetweener'] = 0.5 def load_action(self, context): '''Load a new action from the layer list''' obj = self.id_data - index = obj.Anim_Layers.find(self.name) + index = layer_row_index(self) anim_data = anim_data_type(obj) # if self.lock: # return if self.action == 'None': return - track = anim_data.nla_tracks[index] + # Positional row->track mapping (skips not_usable rows). + track_idx = layer_track_index(self) + if track_idx == -1: + return + track = anim_data.nla_tracks[track_idx] action = self.action if not len(track.strips): strip = track.strips.new(name = track.name, start=0, action = action) @@ -2090,12 +2248,12 @@ def layer_frame_start(self, context): if self.frame_start > self.frame_end: self.frame_end = self.frame_start obj = self.id_data - index = obj.Anim_Layers.find(self.name) anim_data = anim_data_type(obj) - if not len(anim_data.nla_tracks[index].strips): + index = layer_track_index(self) + if index == -1 or not len(anim_data.nla_tracks[index].strips): return strip = anim_data.nla_tracks[index].strips[0] - strip.frame_start = self.frame_start + strip.frame_start = self.frame_start if strip.repeat <= 1: strip_action_recalc(self, strip) @@ -2133,9 +2291,9 @@ def layer_frame_end(self, context): if self.frame_end < self.frame_start: self.frame_start = self.frame_end obj = self.id_data - index = obj.Anim_Layers.find(self.name) anim_data = anim_data_type(obj) - if not len(anim_data.nla_tracks[index].strips): + index = layer_track_index(self) + if index == -1 or not len(anim_data.nla_tracks[index].strips): return strip = anim_data.nla_tracks[index].strips[0] @@ -2150,7 +2308,9 @@ def layer_frame_range(self, context): '''update the custom frame range when turned on and off''' obj = self.id_data anim_data = anim_data_type(obj) - index = obj.Anim_Layers.find(self.name) + index = layer_track_index(self) + if index == -1 or not len(anim_data.nla_tracks[index].strips): + return strip = anim_data.nla_tracks[index].strips[0] if not self.custom_frame_range: @@ -2182,11 +2342,11 @@ def layer_frame_range(self, context): def layer_repeat(self, context): '''Multiply the action speed but keep strip limits the same''' - + obj = self.id_data - index = obj.Anim_Layers.find(self.name) anim_data = anim_data_type(obj) - if not len(anim_data.nla_tracks[index].strips): + index = layer_track_index(self) + if index == -1 or not len(anim_data.nla_tracks[index].strips): return strip = anim_data.nla_tracks[index].strips[0] if strip.repeat == self.repeat == 1: @@ -2198,9 +2358,9 @@ def layer_speed(self, context): '''Multiply the action speed but keep strip limits the same''' obj = self.id_data - index = obj.Anim_Layers.find(self.name) anim_data = anim_data_type(obj) - if not len(anim_data.nla_tracks[index].strips): + index = layer_track_index(self) + if index == -1 or not len(anim_data.nla_tracks[index].strips): return strip = anim_data.nla_tracks[index].strips[0] frame_end = strip.frame_end @@ -2223,11 +2383,11 @@ def layer_speed(self, context): def layer_offset(self, context): '''Offset the action keyframes but keep strip limits the same''' - + obj = self.id_data - index = obj.Anim_Layers.find(self.name) anim_data = anim_data_type(obj) - if not len(anim_data.nla_tracks[index].strips): + index = layer_track_index(self) + if index == -1 or not len(anim_data.nla_tracks[index].strips): return strip = anim_data.nla_tracks[index].strips[0] @@ -2338,7 +2498,10 @@ def action_search(action, nla_tracks): def select_layer_bones(self, context): obj = context.object - strips = obj.animation_data.nla_tracks[nla_idx(obj)].strips + index = nla_idx(obj) + if index == -1: + return + strips = obj.animation_data.nla_tracks[index].strips if len(strips) != 1 or strips[0].action is None: return fcurves = get_fcurves(obj, strips[0].action) @@ -2377,13 +2540,34 @@ class SelectBonesInLayer(bpy.types.Operator): select_layer_bones(self, context) return {'FINISHED'} +def override_source_summary(obj): + '''describes the animation layers and/or nla tracks assigned in obj's override + library source file, returning (kind_text, names_text) for use in a UI message. + When both are assigned only the layer names are listed, since they're normally + synced with the tracks and listing both would just be a duplicate.''' + layer_names = [layer.name for layer in check_override_layers(obj)] + + track_names = [] + for anim_data in anim_datas_append(obj): + if anim_data is None: + continue + for track in check_override_tracks(obj, anim_data): + if track.name not in track_names: + track_names.append(track.name) + + if layer_names and track_names: + return "animation layers and nla tracks", ", ".join(layer_names) + if layer_names: + return "animation layers", ", ".join(layer_names) + return "nla tracks", ", ".join(track_names) + class OverrideError(bpy.types.Operator): bl_idname = "message.layersoverride" bl_label = "WARNING!" bl_icon = "ERROR" - + confirm: bpy.props.BoolProperty(default=False) - + def execute(self, context): if not self.confirm: return {'FINISHED'} @@ -2397,16 +2581,19 @@ class OverrideError(bpy.types.Operator): def invoke(self, context, event): wm = context.window_manager obj_name = context.object.name - return wm.invoke_props_dialog(self, width=450+len(obj_name)) + _, names_text = override_source_summary(context.object) + return wm.invoke_props_dialog(self, width=450+len(obj_name)+len(names_text)) def draw(self, context): layout = self.layout - row = layout.row() obj_name = context.object.name + kind_text, names_text = override_source_summary(context.object) row = layout.row() - row.label(text="The object %s is an override library that uses layers or tracks in its source file."%obj_name) + row.label(text="The object %s is an override library that uses %s in its source file:"%(obj_name, kind_text)) row = layout.row() - row.label(text="Please clean the source file from animation layers or nla tracks.") + row.label(text=names_text) + row = layout.row() + row.label(text="Please clean the source file from %s."%kind_text) layout.separator(factor = 2) row = layout.row() row.alignment = 'LEFT' @@ -2552,11 +2739,13 @@ class AutoCustomFrameRange(bpy.types.Operator): def invoke(self, context, event): obj = context.object - anim_data = anim_data_type(obj) - index = obj.als.layer_index + anim_data = anim_data_type(obj) + index = nla_idx(obj) + if index == -1 or not len(anim_data.nla_tracks[index].strips): + return {'CANCELLED'} track = anim_data.nla_tracks[index] self.strip = track.strips[0] - self.layer = obj.Anim_Layers[index] + self.layer = obj.Anim_Layers[obj.als.layer_index] # Since the operator is running from a handler it can use the wrong context window # Which can cause the user to miss the operator dialogue. So it's checking for the view 3d @@ -2614,11 +2803,11 @@ def update_action_list(scene): if obj is None: continue anim_data = anim_data_type(obj) - i = obj.als.layer_index - if len(anim_data.nla_tracks[i].strips) != 1: + i = nla_idx(obj) + if i == -1 or len(anim_data.nla_tracks[i].strips) != 1: return obj.Anim_Layers.update() - layer = obj.Anim_Layers[0] + layer = obj.Anim_Layers[layer_to_row_index(obj, 0)] layer.action = anim_data.nla_tracks[0].strips[0].action def add_animlayer(layer_name = 'Anim_Layer' , duplicate = False, index = 1, blend_type = 'COMBINE', prev_track = None): @@ -2635,7 +2824,7 @@ def add_animlayer(layer_name = 'Anim_Layer' , duplicate = False, index = 1, blen if prev_track is not None: previous = prev_track else: - previous = None if index == 0 else nla_tracks[nla_idx(obj)] + previous = None if index == 0 or nla_idx(obj) == -1 else nla_tracks[nla_idx(obj)] new_track = nla_tracks.new(prev = previous) new_track.name = layer_name @@ -2671,7 +2860,7 @@ def add_animlayer(layer_name = 'Anim_Layer' , duplicate = False, index = 1, blen if hasattr(new_strip, 'action_slot') and slot: new_strip.action_slot = slot - if duplicate: + if duplicate and nla_idx(obj) != -1 and len(anim_data.nla_tracks[nla_idx(obj)].strips): copy_strip_settings(new_strip, anim_data.nla_tracks[nla_idx(obj)].strips[0]) else: new_strip.action_frame_start = 0 @@ -2724,13 +2913,14 @@ class AddAnimLayer(bpy.types.Operator): obj.als['layer_index'] = 0 add_animlayer(base_name, index = 0, blend_type = blend_type) #using a temporary variable instead of calling update_track_list all the time with obj.als.layer_index - index = 0 if anim_data.action: + auto_rename(obj.als, context) add_animlayer(layer_name, index, blend_type = blend_type) index += 1 anim_data.action.use_fake_user = True + anim_data.action = None new_track_name = anim_data.nla_tracks[index].name parent_layer_to_inherit = '' @@ -2824,13 +3014,15 @@ class DuplicateAnimLayer(bpy.types.Operator): return context.object is not None and is_layer_row_active(context.object) def execute(self, context): - if subscriptions.check_handler in bpy.app.handlers.depsgraph_update_pre: - bpy.app.handlers.depsgraph_update_pre.remove(subscriptions.check_handler) - obj = context.object anim_data = anim_data_type(obj) nla_tracks = anim_data.nla_tracks i = nla_idx(obj) + if i == -1 or not len(nla_tracks[i].strips): + return {'CANCELLED'} + + if subscriptions.check_handler in bpy.app.handlers.depsgraph_update_pre: + bpy.app.handlers.depsgraph_update_pre.remove(subscriptions.check_handler) strip = nla_tracks[i].strips[0] blend = strip.blend_type @@ -2879,19 +3071,21 @@ class ExtractSelection(bpy.types.Operator): obj = context.object return obj and obj.type == 'ARMATURE' and obj.mode == 'POSE' - def execute(self, context): - - if subscriptions.check_handler in bpy.app.handlers.depsgraph_update_pre: - bpy.app.handlers.depsgraph_update_pre.remove(subscriptions.check_handler) - + def execute(self, context): obj = context.object anim_data = anim_data_type(obj) nla_tracks = anim_data.nla_tracks - - blend = nla_tracks[nla_idx(obj)].strips[0].blend_type - track_name = nla_tracks[nla_idx(obj)].name - + index = nla_idx(obj) + if index == -1 or not len(nla_tracks[index].strips): + return {'CANCELLED'} + + if subscriptions.check_handler in bpy.app.handlers.depsgraph_update_pre: + bpy.app.handlers.depsgraph_update_pre.remove(subscriptions.check_handler) + + blend = nla_tracks[index].strips[0].blend_type + track_name = nla_tracks[index].name + name = unique_name(obj.Anim_Layers, track_name + ' Extract') new_track = add_animlayer(layer_name = name, duplicate = True, blend_type = blend) bones_path = [bone.path_from_id() for bone in context.selected_pose_bones] @@ -2954,17 +3148,20 @@ class ExtractMarkers(bpy.types.Operator): return len(context.scene.timeline_markers) def execute(self, context): - - if subscriptions.check_handler in bpy.app.handlers.depsgraph_update_pre: - bpy.app.handlers.depsgraph_update_pre.remove(subscriptions.check_handler) - obj = context.object anim_data = anim_data_type(obj) nla_tracks = anim_data.nla_tracks - - blend = nla_tracks[nla_idx(obj)].strips[0].blend_type - track_name = nla_tracks[nla_idx(obj)].name - + + index = nla_idx(obj) + if index == -1 or not len(nla_tracks[index].strips): + return {'CANCELLED'} + + if subscriptions.check_handler in bpy.app.handlers.depsgraph_update_pre: + bpy.app.handlers.depsgraph_update_pre.remove(subscriptions.check_handler) + + blend = nla_tracks[index].strips[0].blend_type + track_name = nla_tracks[index].name + name = unique_name(obj.Anim_Layers, track_name + ' Extract') new_track = add_animlayer(layer_name = name, duplicate = True, blend_type = blend) if obj.type == 'ARMATURE': @@ -3154,8 +3351,11 @@ class RemoveAnimLayer(bpy.types.Operator): subscriptions.subscriptions_add(context.scene) new_count = len(obj.Anim_Layers) - if obj.als.layer_index >= new_count: - obj.als.layer_index = max(0, new_count - 1) + # Reassign even when the index is still in range: the assignment fires + # update_layer_index, which re-enters tweak mode (use_tweak_mode was + # turned off above for the removal). Without it the check handler sees + # tweak mode off and auto-locks the newly active layer. + obj.als.layer_index = min(obj.als.layer_index, max(0, new_count - 1)) return {'FINISHED'} def share_layerkeys_items(self, context): @@ -3180,7 +3380,10 @@ class ShareLayerKeys(bpy.types.Operator): obj = context.object anim_data = anim_data_type(obj) fcu_frames = dict() - current_strip = anim_data.nla_tracks[nla_idx(obj)].strips[0] + index = nla_idx(obj) + if index == -1 or not len(anim_data.nla_tracks[index].strips): + return {'CANCELLED'} + current_strip = anim_data.nla_tracks[index].strips[0] #get the layer from the enumarator layer = obj.als.share_layer_keys if len(anim_data.nla_tracks[layer].strips) != 1: @@ -3291,6 +3494,10 @@ def move_layer(dir, context, track_name=None): return else: idx_to_select = nla_idx(obj) + if idx_to_select == -1: + screen.areas[0].type = old_area + screen.areas[0].ui_type = ui_type + return anim_data.nla_tracks[idx_to_select].select = True with context.temp_override(window=window, area=area, region=region): bpy.ops.anim.channels_expand() @@ -3600,7 +3807,10 @@ class ResetLayerKeyframes(bpy.types.Operator): # fcurves = anim_data.action.fcurves fcurves = get_fcurves(obj, anim_data.action) frame_current = context.scene.frame_current - strip = anim_data.nla_tracks[nla_idx(obj)].strips[0] + index = nla_idx(obj) + if index == -1 or not len(anim_data.nla_tracks[index].strips): + return {'CANCELLED'} + strip = anim_data.nla_tracks[index].strips[0] frame_current = round(bake_ops.frame_evaluation(frame_current, strip), 3) for fcu in fcurves: @@ -3644,10 +3854,13 @@ class AddAction(bpy.types.Operator): def execute(self, context): obj = context.object anim_data = anim_data_type(obj) - + index = nla_idx(obj) + if index == -1 or not len(anim_data.nla_tracks[index].strips): + return {'CANCELLED'} + tweak_mode_upper_stack(context, obj, anim_data, enter = False) #If there is no action get the layer name - if anim_data.nla_tracks[nla_idx(obj)].strips[0].action is None: + if anim_data.nla_tracks[index].strips[0].action is None: action = bpy.data.actions.new(obj.Anim_Layers[obj.als.layer_index].name) #otherwise get the previous action name else: @@ -3670,9 +3883,12 @@ class RemoveAction(bpy.types.Operator): def execute(self, context): obj = context.object anim_data = anim_data_type(obj) - + index = nla_idx(obj) + if index == -1 or not len(anim_data.nla_tracks[index].strips): + return {'CANCELLED'} + tweak_mode_upper_stack(context, obj, anim_data, enter = False) - anim_data.nla_tracks[nla_idx(obj)].strips[0].action = None + anim_data.nla_tracks[index].strips[0].action = None obj.Anim_Layers[obj.als.layer_index].action = 'None' obj.als.layer_index = obj.als.layer_index @@ -3695,10 +3911,10 @@ class AddSlot(bpy.types.Operator): return {'FINISHED'} if not hasattr(anim_data, 'action_slot'): return {'FINISHED'} - index = obj.als.layer_index - if not len(anim_data.nla_tracks[index].strips): + index = nla_idx(obj) + if index == -1 or not len(anim_data.nla_tracks[index].strips): return {'FINISHED'} - + strip = anim_data.nla_tracks[index].strips[0] action = strip.action @@ -3724,10 +3940,10 @@ class RemoveSlot(bpy.types.Operator): return {'FINISHED'} if not hasattr(anim_data, 'action_slot'): return {'FINISHED'} - index = obj.als.layer_index - if not len(anim_data.nla_tracks[index].strips): + index = nla_idx(obj) + if index == -1 or not len(anim_data.nla_tracks[index].strips): return {'FINISHED'} - + strip = anim_data.nla_tracks[index].strips[0] action = strip.action action_slot = strip.action_slot @@ -3740,8 +3956,11 @@ def sync_frame_range(context): """Sync Frame Range to Action Length""" obj = context.object anim_data = anim_data_type(obj) - use_frame_range = False - strip = anim_data.nla_tracks[nla_idx(obj)].strips[0] + use_frame_range = False + index = nla_idx(obj) + if index == -1 or not len(anim_data.nla_tracks[index].strips): + return + strip = anim_data.nla_tracks[index].strips[0] layer = obj.Anim_Layers[obj.als.layer_index] action = strip.action action_range = action.frame_range[1] - action.frame_range[0] @@ -3767,8 +3986,8 @@ class InfluenceNextKeyframe(bpy.types.Operator): @classmethod def poll(cls, context): - anim_data = anim_data_type(context.object) - return hasattr(anim_data,"nla_tracks") and len(anim_data.nla_tracks[nla_idx(context.object)].strips) + strip = get_strip(context.object) + return bool(strip) def execute(self, context): @@ -3819,8 +4038,8 @@ class InfluencePrevKeyframe(bpy.types.Operator): @classmethod def poll(cls, context): - anim_data = anim_data_type(context.object) - return hasattr(anim_data,"nla_tracks") and len(anim_data.nla_tracks[nla_idx(context.object)].strips) + strip = get_strip(context.object) + return bool(strip) def execute(self, context): @@ -3871,8 +4090,8 @@ class SelectInfluenceKeys(bpy.types.Operator): @classmethod def poll(cls, context): - anim_data = anim_data_type(context.object) - return hasattr(anim_data,"nla_tracks") and len(anim_data.nla_tracks[nla_idx(context.object)].strips) + strip = get_strip(context.object) + return bool(strip) def execute(self, context): @@ -3908,6 +4127,31 @@ class SelectInfluenceKeys(bpy.types.Operator): fcu.keyframe_points.foreach_set('select_left_handle', selected_keys) return {'FINISHED'} + +def get_strip(obj): + + """First strip on the active layer's NLA track, or False.""" + + if obj is None: + return False + + anim_data = anim_data_type(obj) + tracks = getattr(anim_data, "nla_tracks", None) + + if not tracks: + return False + + idx = nla_idx(obj) + + if idx == -1: + return False + + track = tracks[idx] + + if not len(track.strips): + return False + + return track.strips[0] class SyncActionLength(bpy.types.Operator): """Sync Frame Range to Action Length""" @@ -3917,12 +4161,10 @@ class SyncActionLength(bpy.types.Operator): @classmethod def poll(cls, context): - anim_data = anim_data_type(context.object) - if not hasattr(anim_data,"nla_tracks"): + strip = get_strip(context.object) + if not strip: return False - if not len(anim_data.nla_tracks[nla_idx(context.object)].strips): - return False - return not anim_data.nla_tracks[nla_idx(context.object)].strips[0].use_sync_length + return not strip.use_sync_length def execute(self, context): sync_frame_range(context) @@ -4108,9 +4350,15 @@ class LAYERS_UL_list(bpy.types.UIList): # else: # row.label(text='', icon='BLANK1') - layer_idx = nla_tracks.find(item.name) if nla_tracks else -1 + layer_idx = layer_track_index(item) if nla_tracks else -1 if nla_tracks is None or layer_idx == -1: - row.prop(item, 'name', text='', emboss=False) + if item.not_usable: + # Layer shipped by the linked rig's source file without an NLA + # track — unusable here until removed in the source file. + row.enabled = False + row.label(text=item.name, icon='LIBRARY_DATA_BROKEN') + else: + row.prop(item, 'name', text='', emboss=False) return track = nla_tracks[layer_idx] @@ -4261,18 +4509,21 @@ def panelFactory(space_type): # Skip layer-specific controls when the active row is a group header. if not is_layer_row_active(obj): return - - track = anim_data.nla_tracks[nla_idx(obj)] - - # col=layout.column(align = True) - row = layout.row(align = True) - - if not len(track.strips): + + + strip = get_strip(context.object) + if not strip: return - strip = track.strips[0] + + # # col=layout.column(align = True) + + # if not len(track.strips): + # return + # strip = track.strips[0] if not len(strip.fcurves): return + row = layout.row(align = True) #Drawing the influence slider if len(strip.fcurves[0].keyframe_points) and not strip.fcurves[0].mute: row.prop(strip, 'influence', slider = True, text = 'Influence') @@ -4309,6 +4560,8 @@ def panelFactory(space_type): row.prop(obj.als, 'influence_lock', icon_only=True, icon = lock_icon) row = layout.row() + + track = anim_data.nla_tracks[nla_idx(obj)] row.prop(track.strips[0], 'blend_type', text = 'Blend') class ANIMLAYERS_PT_Ops(ANIMLAYERS_PT_Panel, bpy.types.Panel): @@ -4378,7 +4631,8 @@ def panelFactory(space_type): row = box.row() row.operator("anim.layer_reset_keyframes", text="Reset Key Layer ", icon = 'KEYTYPE_MOVING_HOLD_VEC') row = box.row() - row.prop(obj.als, 'inbetweener', text = 'Inbetweener', slider = True) + row.prop(obj.als, 'inbetweener_push' if obj.als.push else 'inbetweener', text = 'Inbetweener', slider = True) + row.prop(obj.als, 'push', icon = 'TRACKING_FORWARDS_SINGLE', text = '') layout.separator(factor = 0.2) row = layout.row() @@ -4436,7 +4690,10 @@ def panelFactory(space_type): layout = self.layout - track = nla_tracks[nla_idx(obj)] + index = nla_idx(obj) + if index == -1: + return + track = nla_tracks[index] strip = track.strips[0] if len(track.strips) else anim_data layer = obj.Anim_Layers[obj.als.layer_index] diff --git a/scripts/addons/Animation_Layers/animation_layers_updater/Animation_Layers_updater_status.json b/scripts/addons/Animation_Layers/animation_layers_updater/Animation_Layers_updater_status.json index 2f51432..e486f42 100644 --- a/scripts/addons/Animation_Layers/animation_layers_updater/Animation_Layers_updater_status.json +++ b/scripts/addons/Animation_Layers/animation_layers_updater/Animation_Layers_updater_status.json @@ -1,6 +1,6 @@ { - "last_check": "2026-06-22 15:11:23.788257", - "backup_date": "May-27-2026", + "last_check": "2026-07-14 14:42:39.577911", + "backup_date": "July-14-2026", "update_ready": false, "ignore": false, "just_restored": false, diff --git a/scripts/addons/Animation_Layers/animation_layers_updater/backup/__init__.py b/scripts/addons/Animation_Layers/animation_layers_updater/backup/__init__.py index 3595581..a5310c1 100644 --- a/scripts/addons/Animation_Layers/animation_layers_updater/backup/__init__.py +++ b/scripts/addons/Animation_Layers/animation_layers_updater/backup/__init__.py @@ -20,7 +20,7 @@ bl_info = { "name": "Animation Layers", "author": "Tal Hershkovich", - "version" : (2, 4, 0), + "version" : (2, 4, 1), "blender" : (3, 2, 0), "location": "View3D - Properties - Animation Panel", "description": "Simplifying the NLA editor into an animation layers UI and workflow", @@ -73,7 +73,10 @@ class AnimLayersSceneSettings(bpy.types.PropertyGroup): class AnimLayersSettings(bpy.types.PropertyGroup): turn_on: bpy.props.BoolProperty(name="Turn Animation Layers On", description="Turn on and start Animation Layers", default=False, options={'HIDDEN'}, update = anim_layers.turn_animlayers_on, override = {'LIBRARY_OVERRIDABLE'}) + # Active row in obj.Anim_Layers. Post-migration, 1:1 with NLA-track index. layer_index: bpy.props.IntProperty(update = anim_layers.update_layer_index, options={'LIBRARY_EDITABLE'}, default = 0, override = {'LIBRARY_OVERRIDABLE'}) + # Schema version. 0 = pre-hierarchical (legacy GROUP rows); 1 = hierarchical (parent_layer refs). + schema_version: bpy.props.IntProperty(name="Schema Version", default=0, options={'HIDDEN'}, override = {'LIBRARY_OVERRIDABLE'}) linked: bpy.props.BoolProperty(name="Linked", description="Duplicate a layer with a linked action", default=False, options={'HIDDEN'}, override = {'LIBRARY_OVERRIDABLE'}) #Bake settings @@ -125,13 +128,31 @@ class AnimLayersItems(bpy.types.PropertyGroup): action_range: bpy.props.FloatVectorProperty(name='action range', description="used to check if layer needs to update frame range", override = {'LIBRARY_OVERRIDABLE'}, size = 2) custom_frame_range: bpy.props.BoolProperty(name="Custom Frame Range", description="Use a custom frame range per layer instead of the scene frame range", default=False, options={'HIDDEN'}, override = {'LIBRARY_OVERRIDABLE'}, update = anim_layers.layer_frame_range) - + frame_start: bpy.props.FloatProperty(name='Action Start Frame', description="First frame of the layer's action",min = 0, default=0, override = {'LIBRARY_OVERRIDABLE'}, update = anim_layers.layer_frame_start) frame_end: bpy.props.FloatProperty(name='Action End Frame', description="End frame of the layer's action", default=0, override = {'LIBRARY_OVERRIDABLE'}, update = anim_layers.layer_frame_end) speed: bpy.props.FloatProperty(name='Speed of the action', description="Speed of the action strip", default = 1, override = {'LIBRARY_OVERRIDABLE'}, update = anim_layers.layer_speed) offset: bpy.props.FloatProperty(name='Offset when the action starts', description="Offseting the whole layer animation", default = 0, precision = 2, override = {'LIBRARY_OVERRIDABLE'}, update = anim_layers.layer_offset) repeat: bpy.props.FloatProperty(name="Repeat", description="Repeat the action", min = 0.1, default = 1, options={'HIDDEN'}, override = {'LIBRARY_OVERRIDABLE'}, update = anim_layers.layer_repeat) + # Hierarchical layer fields. Every layer is NLA-backed; a layer is a + # "group" iff something else points to it via parent_layer. + expanded: bpy.props.BoolProperty(name="Expanded", description="Show this layer's children in the UI list", default=True, options={'HIDDEN'}, override = {'LIBRARY_OVERRIDABLE'}) + parent_layer: bpy.props.StringProperty(name="Parent Layer", description="Name of this layer's parent (empty = root)", default="", options={'HIDDEN'}, override = {'LIBRARY_OVERRIDABLE'}) + group_color: bpy.props.FloatVectorProperty(name="Group Color", subtype='COLOR', size=4, min=0.0, max=1.0, default=(0.3, 0.5, 0.8, 1.0), options={'HIDDEN'}, override = {'LIBRARY_OVERRIDABLE'}) + # Dynamic-enum dropdown for picking parent_layer in the UI. The setter + # refuses cycles (self + descendants are excluded from the options). + assigned_group: bpy.props.EnumProperty(name='Parent', description='Set this layer\'s parent (None = root)', + items=anim_layers.layer_group_enum_items, get=anim_layers.layer_group_get, set=anim_layers.layer_group_set, + options={'HIDDEN'}) + # Legacy field for pre-migration data. Read by migrate_object_to_hierarchical + # and ignored thereafter. Schema retained so old .blend files load cleanly. + type: bpy.props.EnumProperty(name="Item Type (legacy)", default='LAYER', + items=[('LAYER', 'Layer', 'NLA-backed layer'), + ('GROUP', 'Group', 'Legacy phantom group row')], + options={'HIDDEN'}, override = {'LIBRARY_OVERRIDABLE'}) + parent_group: bpy.props.StringProperty(name="Parent Group (legacy)", description="Pre-migration field. Read once by the schema-v1 migration, then unused.", default="", options={'HIDDEN'}, override = {'LIBRARY_OVERRIDABLE'}) + class AnimLayersObjects(bpy.types.PropertyGroup): diff --git a/scripts/addons/Animation_Layers/animation_layers_updater/backup/anim_layers.py b/scripts/addons/Animation_Layers/animation_layers_updater/backup/anim_layers.py index 8102a52..c42cc95 100644 --- a/scripts/addons/Animation_Layers/animation_layers_updater/backup/anim_layers.py +++ b/scripts/addons/Animation_Layers/animation_layers_updater/backup/anim_layers.py @@ -11,7 +11,318 @@ from . import subscriptions from . import addon_updater_ops from . import multikey -@persistent +# --- Layer helpers --------------------------------------------------------- +# Post-hierarchical-migration invariant: obj.Anim_Layers is 1:1 with +# anim_data.nla_tracks in the same order. Each layer is a "real" NLA-backed +# layer; "group" identity is derived (a layer is a group iff something points +# to it via parent_layer). The helpers below are thin wrappers that exist for +# call-site readability and to keep one place to harden against bad state. + +# Re-entrancy guard for mute/lock cascades (parent → descendants). +_group_cascade_skip = False + +def row_to_layer_index(obj, row): + """Row in obj.Anim_Layers -> NLA-track index. Identity since the mirror is 1:1.""" + if obj is None or row < 0: + return -1 + if row >= len(obj.Anim_Layers): + return -1 + return row + +def layer_to_row_index(obj, layer_idx): + """NLA-track index -> row in obj.Anim_Layers. Identity since the mirror is 1:1.""" + if obj is None or layer_idx < 0: + return 0 + return min(layer_idx, max(0, len(obj.Anim_Layers) - 1)) + +def active_item(obj): + """The currently-active Anim_Layers item, or None.""" + if obj is None: + return None + items = obj.Anim_Layers + row = obj.als.layer_index + if not items or row < 0 or row >= len(items): + return None + return items[row] + +def is_layer_row_active(obj): + """True if there's a valid active row. Kept as a thin wrapper because many + operator poll() methods read clearer with this name.""" + return active_item(obj) is not None + +def nla_idx(obj): + """NLA-track index for the active row. Identity wrapper around layer_index + (the row-vs-track distinction is gone post-migration). Returns -1 if no + valid active row.""" + if obj is None: + return -1 + items = obj.Anim_Layers + row = obj.als.layer_index + if not items or row < 0 or row >= len(items): + return -1 + return row + +# --- Hierarchical helpers (Phase 0 of GROUP-row -> hierarchical refactor) --- +# These operate on the new `parent_layer` string field. During Phase 0 they +# coexist with the legacy `parent_group`/`type=='GROUP'` model: parent_layer is +# empty until migration runs, so these helpers return trivial results for +# pre-migrated data — which is the correct answer for a flat hierarchy. + +def layer_children(obj, layer_name): + """Layers whose `parent_layer` equals `layer_name`. Pass '' for root-level layers.""" + if obj is None: + return [] + return [it for it in obj.Anim_Layers if it.parent_layer == layer_name] + +def layer_descendants(obj, layer_name): + """All transitive descendants of `layer_name`, BFS order. Cycle-safe via visited set.""" + if obj is None or not layer_name: + return [] + result = [] + queue = [layer_name] + seen = {layer_name} + while queue: + current = queue.pop(0) + for it in obj.Anim_Layers: + if it.parent_layer == current and it.name not in seen: + result.append(it) + seen.add(it.name) + queue.append(it.name) + return result + +def layer_ancestors(obj, layer_name): + """Chain from immediate parent up to root, in that order. Stops on cycle or broken ref.""" + if obj is None or not layer_name: + return [] + by_name = {it.name: it for it in obj.Anim_Layers} + cur = by_name.get(layer_name) + if cur is None: + return [] + result = [] + seen = {cur.name} + while cur.parent_layer: + if cur.parent_layer in seen: + break + parent = by_name.get(cur.parent_layer) + if parent is None: + break + result.append(parent) + seen.add(parent.name) + cur = parent + return result + +def subtree_root(obj, layer_name): + """Topmost ancestor with no `parent_layer`. Returns the layer itself if already root, or None if not found.""" + if obj is None or not layer_name: + return None + by_name = {it.name: it for it in obj.Anim_Layers} + cur = by_name.get(layer_name) + if cur is None: + return None + seen = {cur.name} + while cur.parent_layer: + if cur.parent_layer in seen: + break + parent = by_name.get(cur.parent_layer) + if parent is None: + break + seen.add(parent.name) + cur = parent + return cur + +def is_group_layer(obj, layer_name): + """True iff any other layer references `layer_name` as its `parent_layer`.""" + if obj is None or not layer_name: + return False + return any(it.parent_layer == layer_name for it in obj.Anim_Layers) + +def _would_create_cycle(obj, child_name, new_parent_name): + """True if setting child.parent_layer = new_parent would create a cycle. + Returns False for no-op cases (empty new_parent, self-parenting, broken ref).""" + if obj is None or not new_parent_name or new_parent_name == child_name: + return False + by_name = {it.name: it for it in obj.Anim_Layers} + if new_parent_name not in by_name: + return False + cur = by_name[new_parent_name] + seen = {new_parent_name} + while cur.parent_layer: + if cur.parent_layer == child_name: + return True + if cur.parent_layer in seen: + return False # pre-existing cycle (sanitization handles elsewhere) + parent = by_name.get(cur.parent_layer) + if parent is None: + return False + seen.add(parent.name) + cur = parent + return False + +def layer_subtree_size(obj, layer_name): + """Number of layers in the subtree rooted at `layer_name` (self + descendants).""" + if obj is None or not layer_name: + return 0 + if obj.Anim_Layers.find(layer_name) == -1: + return 0 + return 1 + len(layer_descendants(obj, layer_name)) + +def subtree_size_above(obj, nla_tracks, nla_index): + """Size of the subtree of the layer at `nla_index + 1`. Returns 0 if at top of NLA. + Used by move-up logic to decide how many positions to shift the active subtree.""" + above = nla_index + 1 + if above < 0 or above >= len(nla_tracks): + return 0 + return layer_subtree_size(obj, nla_tracks[above].name) + +def subtree_size_below(obj, nla_tracks, nla_index): + """Size of the subtree of the layer at `nla_index - 1`. Returns 0 if at bottom of NLA.""" + below = nla_index - 1 + if below < 0 or below >= len(nla_tracks): + return 0 + return layer_subtree_size(obj, nla_tracks[below].name) + +def sync_nla_to_layer_order(obj, context=None): + """Ensure anim_data.nla_tracks is in the same order as the rows in + obj.Anim_Layers. The addon's invariant post-hierarchical-migration is + 1:1 between collection and NLA (same order). + + Behavior: + * If counts already match and orders agree -> no-op, returns False. + * If counts differ (the collection-vs-NLA mirror has broken) -> rebuilds + obj.Anim_Layers from nla_tracks via visible_layers() (cheap NLA-as-truth + recovery) and returns True. + * If counts match but orders differ -> reorders nla_tracks via + move_layer() (operator-based, walks each track to its target slot) and + returns True. + + Call this anywhere the LAYER/NLA pair might have drifted out of sync — + start_animlayers, before loops that iterate the pair, etc. The function + is a no-op in the common case so it's cheap to call defensively.""" + anim_data = anim_data_type(obj) + if anim_data is None or not hasattr(anim_data, 'nla_tracks'): + return False + nla_tracks = anim_data.nla_tracks + + desired = [it.name for it in obj.Anim_Layers] + + # Counts disagree -> the LAYER<->NLA mirror is broken (e.g. blend just + # loaded with stale state, or external NLA edits). Rebuild from NLA. + if len(desired) != len(nla_tracks): + visible_layers(obj, nla_tracks) + return True + + # Fast path: already in sync. + if all(nla_tracks[i].name == n for i, n in enumerate(desired)): + return False + + if context is None: + context = bpy.context + + # Selection-sort: for each target NLA position, walk the named track there. + # Pass track_name to move_layer so it selects the right track by NAME, + # avoiding any dependence on obj.als.layer_index (which may not correspond + # to the same track when the LAYER<->NLA pair has just been desynced by + # the caller). + for target_idx, name in enumerate(desired): + if nla_tracks[target_idx].name == name: + continue + current_idx = nla_tracks.find(name) + if current_idx == -1 or current_idx == target_idx: + continue + if current_idx > target_idx: + for _ in range(current_idx - target_idx): + move_layer('DOWN', context, track_name=name) + else: + for _ in range(target_idx - current_idx): + move_layer('UP', context, track_name=name) + return True + +def nla_layer_count(obj): + """Number of layer rows in obj.Anim_Layers. Equals len(nla_tracks) when the + collection is in sync (the post-migration invariant).""" + if obj is None: + return 0 + return len(obj.Anim_Layers) + +# Cache for assigned_group enum items. Blender requires the items list +# returned by an `items` callback to be referenced by Python so strings +# aren't garbage-collected mid-frame. +_assigned_group_items_cache = {} + +def layer_group_enum_items(self, context): + """Dynamic enum items for AnimLayersItems.assigned_group: '(None)' plus + every other layer (excluding self and the self's descendants — cycle + prevention).""" + obj = self.id_data + items = [('NONE', '(None)', 'Root layer (no parent)', 'X', 0)] + if obj is not None: + excluded = {self.name} | {d.name for d in layer_descendants(obj, self.name)} + idx = 1 + for it in obj.Anim_Layers: + if it.name in excluded: + continue + items.append((it.name, it.name, f"Set parent to '{it.name}'", + 'OUTLINER_COLLECTION', idx)) + idx += 1 + _assigned_group_items_cache[id(self)] = items + return items + +def layer_group_get(self): + """Return enum index based on the current parent_layer string.""" + obj = self.id_data + if obj is None or not self.parent_layer: + return 0 + excluded = {self.name} | {d.name for d in layer_descendants(obj, self.name)} + idx = 1 + for it in obj.Anim_Layers: + if it.name in excluded: + continue + if it.name == self.parent_layer: + return idx + idx += 1 + return 0 # missing -> (None) + +def layer_group_set(self, value): + """Set parent_layer from enum index. Refuses cycles. After the change, + enforces subtree contiguity in NLA so the layer's subtree sits adjacent + to its new parent, and the just-linked layer takes the top slot among + its siblings (above any other children of the same parent).""" + obj = self.id_data + if obj is None: + return + self_name = self.name + if value == 0: + self['parent_layer'] = '' + else: + excluded = {self.name} | {d.name for d in layer_descendants(obj, self.name)} + idx = 1 + target_name = None + for it in obj.Anim_Layers: + if it.name in excluded: + continue + if idx == value: + target_name = it.name + break + idx += 1 + if target_name is None: + return + # Cycle guard (redundant with descendants-excluded above, defensive). + if _would_create_cycle(obj, self.name, target_name): + return + self['parent_layer'] = target_name + + # Reorder NLA. priority_name puts the just-linked layer at the top of its + # parent's children stack — "above the other children". + subscriptions.subscriptions_remove() + try: + enforce_subtree_contiguity(obj, priority_name=self_name) + finally: + if bpy.context.scene is not None: + subscriptions.subscriptions_add(bpy.context.scene) + +# --- End group helpers ----------------------------------------------------- + +@persistent def loadanimlayers(self, context): '''When loading a file check if the current selected object is with animlayers, if not then check if there is something else turned on''' scene = bpy.context.scene @@ -26,9 +337,13 @@ def loadanimlayers(self, context): continue if obj.als.turn_on and len(obj.users_scene): add_obj_to_animlayers(obj, anim_layer_objects) + # One-time hierarchical-schema migration. Idempotent; bumps + # obj.als.schema_version on success so subsequent loads skip the work. + migrate_object_to_hierarchical(obj) #Make sure layer index is not more then the layers - if obj.als.layer_index > len(obj.Anim_Layers) - 1: - obj.als['layer_index'] = len(obj.Anim_Layers) - 1 + row_count = len(obj.Anim_Layers) + if row_count and obj.als.layer_index > row_count - 1: + obj.als['layer_index'] = row_count - 1 subscribe = True if obj in bpy.context.view_layer.objects.values(): start_animlayers(obj) @@ -135,16 +450,16 @@ def check_anim_data_start(self, obj, selected_anim_data): continue if anim_data != selected_anim_data: continue - if len(obj.Anim_Layers) > len(anim_data.nla_tracks): + if nla_layer_count(obj) > len(anim_data.nla_tracks): obj.Anim_Layers.clear() - - if not len(obj.Anim_Layers) and len(anim_data.nla_tracks): + + if not nla_layer_count(obj) and len(anim_data.nla_tracks): start = True #Turn off until it gets a confirmation how to proceed self['turn_on'] = False bpy.ops.anim.clear_nla_warning('INVOKE_DEFAULT') continue - if len(obj.Anim_Layers) and not action_search(anim_data.action, anim_data.nla_tracks) and anim_data.action: + if nla_layer_count(obj) and not action_search(anim_data.action, anim_data.nla_tracks) and anim_data.action: start = True self['turn_on'] = False bpy.ops.anim.clear_active_action_warning('INVOKE_DEFAULT') @@ -153,8 +468,9 @@ def check_anim_data_start(self, obj, selected_anim_data): bpy.ops.message.layersoverride('INVOKE_DEFAULT') # continue - if len(obj.Anim_Layers) and obj.als.layer_index > len(obj.Anim_Layers) - 1: - obj.als['layer_index'] = len(obj.Anim_Layers) - 1 + row_count = len(obj.Anim_Layers) + if row_count and obj.als.layer_index > row_count - 1: + obj.als['layer_index'] = row_count - 1 if not start: # subscriptions.subscriptions_remove() @@ -170,13 +486,13 @@ def remove_old_setup(obj): continue if not len(anim_data.nla_tracks): continue - if len(anim_data.nla_tracks) == len(obj.Anim_Layers): + if len(anim_data.nla_tracks) == nla_layer_count(obj): continue subtract = anim_data.nla_tracks[-1] if len(subtract.strips) != 1: continue - - if subtract.strips[0].blend_type == 'SUBTRACT' and len(anim_data.nla_tracks) > len(obj.Anim_Layers): + + if subtract.strips[0].blend_type == 'SUBTRACT' and len(anim_data.nla_tracks) > nla_layer_count(obj): tweak_mode_upper_stack(bpy.context, obj, anim_data, enter = False) anim_data.action = None anim_data.nla_tracks.remove(subtract) @@ -199,9 +515,14 @@ def start_animlayers(obj): scene = bpy.context.scene AnimLayer_objects = [AnimLayers.object for AnimLayers in scene.AL_objects] remove_old_setup(obj) - + if obj not in AnimLayer_objects: add_obj_to_animlayers(obj, AnimLayer_objects) + # Idempotent hierarchical-schema migration. The file-load path also calls + # this from loadanimlayers; running again here covers the turn-on toggle + # for objects that were saved with turn_on=False but still hold legacy + # GROUP rows. The schema_version guard makes repeat calls free. + migrate_object_to_hierarchical(obj) anim_data = anim_data_type(obj) if not hasattr(anim_data, 'nla_tracks'): return @@ -221,13 +542,25 @@ def start_animlayers(obj): nla_tracks[i].name = track_names[i] if len(nla_tracks[i].strips) == 1: nla_tracks[i].strips[0].name = track_names[i] - + + # If the saved obj.Anim_Layers ordering disagrees with the NLA-track order + # (e.g. after loading a .blend whose NLA was edited externally), bring NLA + # in line with the saved layer order before the iteration that follows. + sync_nla_to_layer_order(obj) + register_layers(obj, nla_tracks) + + # Check-up: enforce subtree contiguity every time start_animlayers runs. + # Migration only fires once (schema_version guard); this catches any drift + # introduced afterward — externally-edited NLA, Python-console parent_layer + # writes that bypassed the dropdown setter, etc. + enforce_subtree_contiguity(obj) frame_start, frame_end = subscriptions.get_frame_range(scene) #synchronize the temporary influence prorpery - for i, layer in enumerate(obj.Anim_Layers): - if len(nla_tracks[i].strips) != 1: + layer_items = [l for l in obj.Anim_Layers if l.type == 'LAYER'] + for i, layer in enumerate(layer_items): + if i >= len(nla_tracks) or len(nla_tracks[i].strips) != 1: continue strip = nla_tracks[i].strips[0] @@ -251,6 +584,180 @@ def add_obj_to_animlayers(obj, anim_layer_objects): new_obj.object = obj new_obj.name = new_obj.object.name +def migrate_object_to_hierarchical(obj): + """One-time migration: convert legacy GROUP-type phantom rows to real NLA-backed + layers linked via the new `parent_layer` field. Idempotent; gated by + `obj.als.schema_version` (0 = pre-hierarchical, 1 = post-migration). + + Returns True on success or no-op; False if migration could not run (e.g. the + object is a library override and writes raise TypeError). On failure, the + schema_version is NOT bumped, so the next file load will retry. + + Placement convention: each migrated group's new NLA track is created just + below the lowest-NLA-index member of its subtree (parent at bottom). When + the lowest member is already at NLA index 0, we fall back to creating the + new track at index 1 (one above the lowest) — Phase 2's visible_layers + contiguity repair will normalize this later. + """ + try: + if obj.als.schema_version >= 1: + return True + + anim_data = anim_data_type(obj) + if anim_data is None or not hasattr(anim_data, 'nla_tracks'): + obj.als.schema_version = 1 + return True + + nla_tracks = anim_data.nla_tracks + + groups = [it for it in obj.Anim_Layers if it.type == 'GROUP'] + if not groups: + # No GROUP rows: copy any straggler parent_group → parent_layer and bump version. + for it in obj.Anim_Layers: + if it.parent_group and not it.parent_layer: + it['parent_layer'] = it.parent_group + obj.als.schema_version = 1 + return True + + # Snapshot GROUP data (the rows themselves will be removed). + group_data = {} + for g in groups: + group_data[g.name] = { + 'expanded': g.expanded, + 'group_color': tuple(g.group_color), + 'mute': g.mute, + 'lock': g.lock, + 'solo': g.solo, + 'influence': g.influence, + 'parent_group': g.parent_group, + } + + # Snapshot LAYER-row parent_group references (we restore these as parent_layer post-rebuild). + layer_parents_snapshot = {} + for it in obj.Anim_Layers: + if it.type == 'LAYER' and it.parent_group: + layer_parents_snapshot[it.name] = it.parent_group + + # Topological order: leaves first (groups not named as parent_group by any other group). + # When a cycle exists, break it by treating one arbitrary remaining group as a leaf. + sorted_groups = [] + remaining = {name: data['parent_group'] for name, data in group_data.items()} + while remaining: + is_parent = {pg for pg in remaining.values() if pg in remaining} + leaves = [name for name in remaining if name not in is_parent] + if not leaves: + leaves = [next(iter(remaining))] + for leaf in leaves: + sorted_groups.append(leaf) + del remaining[leaf] + + # Create one new NLA track per group, in leaves-first order. + track_names_set = {t.name for t in nla_tracks} + name_map = {} + new_track_props = {} + + for old_name in sorted_groups: + data = group_data[old_name] + new_name = unique_name(list(track_names_set), old_name) + track_names_set.add(new_name) + name_map[old_name] = new_name + + # Collect this group's members (LAYERs by parent_group + any already-migrated nested groups). + member_names = [ln for ln, pg in layer_parents_snapshot.items() if pg == old_name] + for inner_old, inner_data in group_data.items(): + if inner_data['parent_group'] == old_name and inner_old in name_map: + member_names.append(name_map[inner_old]) + + member_indices = [nla_tracks.find(mn) for mn in member_names] + member_indices = [i for i in member_indices if i != -1] + + # Position: aim for "just below the lowest-index member" via nla_tracks.new(prev=lower_neighbor). + prev_track = None + if member_indices: + min_idx = min(member_indices) + if min_idx > 0: + prev_track = nla_tracks[min_idx - 1] + else: + # No track below the lowest member exists; best-effort: insert just above the lowest. + # Phase 2's contiguity repair will normalize. + prev_track = nla_tracks[0] + + # Create an empty action so the strip is a non-META action strip (avoids auto-lock + # by register_layers, which locks layers with !=1 strip or with a META strip). + new_action = bpy.data.actions.new(name=new_name) + if hasattr(new_action, 'id_root'): + new_action.id_root = obj.als.data_type + slot = add_action_slot(obj, new_action) + + new_track = nla_tracks.new(prev=prev_track) + new_track.name = new_name + new_strip = new_track.strips.new(name=new_name, start=0, action=new_action) + if hasattr(new_strip, 'action_slot') and slot: + new_strip.action_slot = slot + new_strip.use_sync_length = False + use_animated_influence(new_strip) + + # Reflect the legacy GROUP's mute on the new track so visible_layers picks it up. + new_track.mute = data['mute'] + + new_parent_layer = name_map.get(data['parent_group'], '') if data['parent_group'] else '' + new_track_props[new_name] = { + 'expanded': data['expanded'], + 'group_color': data['group_color'], + 'mute': data['mute'], + 'lock': data['lock'], + 'solo': data['solo'], + 'influence': data['influence'], + 'parent_layer': new_parent_layer, + } + + # Drop GROUP rows from the collection — they're now real NLA-backed layers. + for i in range(len(obj.Anim_Layers) - 1, -1, -1): + if obj.Anim_Layers[i].type == 'GROUP': + obj.Anim_Layers.remove(i) + + # Rebuild collection from NLA. The Phase-0 visible_layers preserves the per-LAYER + # snapshot (lock/frame_range/speed/etc.) but does NOT preserve parent_layer (the + # snapshot only tracks parent_group). We patch parent_layer back in the next step. + visible_layers(obj, nla_tracks) + + # Apply group-derived properties to the migrated layer rows. + for new_name, props in new_track_props.items(): + idx = obj.Anim_Layers.find(new_name) + if idx == -1: + continue + layer = obj.Anim_Layers[idx] + layer['expanded'] = props['expanded'] + layer['group_color'] = props['group_color'] + layer['mute'] = props['mute'] + layer['lock'] = props['lock'] + layer['solo'] = props['solo'] + layer['influence'] = props['influence'] + layer['parent_layer'] = props['parent_layer'] + + # Restore parent_layer for member LAYER rows (mapped through any name dedup). + for member_name, old_parent in layer_parents_snapshot.items(): + new_parent = name_map.get(old_parent, '') + if not new_parent: + continue + idx = obj.Anim_Layers.find(member_name) + if idx != -1: + obj.Anim_Layers[idx]['parent_layer'] = new_parent + + # Enforce subtree contiguity: each parent's descendants must sit + # contiguously above it in NLA, with the parent at the lowest index of + # its subtree. Members that pre-migration sat anywhere in the stack are + # repositioned next to their parent. This is the hierarchical analogue + # of the legacy "group members stay grouped" rule. + enforce_subtree_contiguity(obj) + + obj.als.schema_version = 1 + return True + except TypeError: + # Library override or other write-restricted state; leave version untouched + # so the next file load can retry once the override is removed. + return False + def clean_AL_objects(scene): '''Cleaning AL objects list in case objects were removed from the scene''' i = 0 @@ -264,18 +771,26 @@ def clean_AL_objects(scene): def register_layers(obj, nla_tracks): visible_layers(obj, nla_tracks) #apply the correct setup for the strips. If there are more then one strip then lock the layer + layer_count = nla_layer_count(obj) for i, track in enumerate(nla_tracks): - - if len(track.strips) != 1 or track.strips[0].type == 'META' and len(obj.Anim_Layers) > i+1: - obj.Anim_Layers[i].lock = True + + if len(track.strips) != 1 or track.strips[0].type == 'META' and layer_count > i + 1: + row_idx = layer_to_row_index(obj, i) + if 0 <= row_idx < len(obj.Anim_Layers): + obj.Anim_Layers[row_idx].lock = True continue strip = track.strips[0] use_animated_influence(strip) #updating the ui list with the nla track names def visible_layers(obj, nla_tracks): - '''Creates a list of all the tracks without the top subtrack for the UI List''' - + '''Mirror obj.Anim_Layers 1:1 with NLA tracks (same order). Per-layer state + (lock, frame range, speed, parent_layer, expanded, group_color, ...) is + preserved across the rebuild by name. parent_layer refs that point at a + missing layer are cleared; cycles are broken by clearing the offending ref. + The collection-order = NLA-order invariant is the single source of truth; + hierarchy is purely metadata on top of that order.''' + def restore_influence(layer, strip): '''restore influence value if it has no keyframes and using the temprorary property''' if strip.fcurves: @@ -283,58 +798,179 @@ def visible_layers(obj, nla_tracks): return layer['influence'] = strip.influence - lock = [] - frame_range = [] + # 1. Snapshot per-layer state, keyed by name. + layer_state = {} + for it in obj.Anim_Layers: + layer_state[it.name] = { + 'lock': it.lock, + 'frame_start': it.frame_start, + 'frame_end': it.frame_end, + 'speed': it.speed, + 'repeat': it.repeat, + 'offset': it.offset, + 'custom_frame_range': it.custom_frame_range, + 'parent_layer': it.parent_layer, + 'expanded': it.expanded, + 'group_color': tuple(it.group_color), + } - #store all the layer properties - for layer in obj.Anim_Layers: - lock.append(layer.lock) - frame_range.append((layer.frame_start, layer.frame_end, layer.speed, layer.repeat, layer.offset, layer.custom_frame_range)) - - #check if a layer was removed and adjust the stored properties - if len(nla_tracks) < len(obj.Anim_Layers): - removed = 0 - for i, layer in enumerate(obj.Anim_Layers): - if layer.name not in nla_tracks: - lock.pop(i - removed) - frame_range.pop(i - removed) - removed += 1 - - #check if a layer was added and adjust the stored properties - if len(nla_tracks) > len(obj.Anim_Layers): - obj.Anim_Layers.update() - for i, track in enumerate(nla_tracks): - if track.name not in obj.Anim_Layers: - lock.insert(i, False) - frame_range.insert(i, (0, 0, 1, 1, 0, False)) - #write layers + # 2. Rebuild one row per NLA track, preserving NLA order. obj.Anim_Layers.clear() - #check if there are still layers because of overrides - length = len(obj.Anim_Layers) - - for i, track in enumerate(nla_tracks): - if length > i: - continue + for track in nla_tracks: layer = obj.Anim_Layers.add() + layer['type'] = 0 # 'LAYER' — only one row type now (post-hierarchical migration). layer['name'] = track.name layer['mute'] = track.mute if len(track.strips): strip = track.strips[0] strip.name = track.name - if strip.action != None: + if strip.action is not None: layer['action'] = strip.action restore_influence(layer, strip) - if not lock: #check if the list is appended and lock list is not empty + s = layer_state.get(track.name) + if s is not None: + layer['lock'] = s['lock'] + layer['frame_start'] = s['frame_start'] + layer['frame_end'] = s['frame_end'] + layer['speed'] = s['speed'] + layer['repeat'] = s['repeat'] + layer['offset'] = s['offset'] + layer['custom_frame_range'] = s['custom_frame_range'] + layer['parent_layer'] = s['parent_layer'] + layer['expanded'] = s['expanded'] + layer['group_color'] = s['group_color'] + else: + # Fresh layer (not in the pre-rebuild snapshot). Init bracket keys + # so subscriptions/ops that read via layer['key'] don't KeyError. + layer['lock'] = False + layer['frame_start'] = 0.0 + layer['frame_end'] = 0.0 + layer['speed'] = 1.0 + layer['repeat'] = 1.0 + layer['offset'] = 0.0 + layer['custom_frame_range'] = False + layer['parent_layer'] = '' + + # 3. Sanitize parent_layer: clear refs to names that don't exist anymore, + # and break any cycles by clearing the offending ref. + existing_names = {it.name for it in obj.Anim_Layers} + for it in obj.Anim_Layers: + if it.parent_layer and it.parent_layer not in existing_names: + it['parent_layer'] = "" + # Cycle detection: walk each layer's ancestor chain; if we revisit, break. + by_name = {it.name: it for it in obj.Anim_Layers} + for it in obj.Anim_Layers: + cur = it + seen = {cur.name} + while cur.parent_layer: + if cur.parent_layer in seen: + # Cycle: clear the closing-edge ref on `cur` to break it. + cur['parent_layer'] = "" + break + parent = by_name.get(cur.parent_layer) + if parent is None: + break + seen.add(parent.name) + cur = parent + + +def enforce_subtree_contiguity(obj, context=None, priority_name=None): + """Reorder anim_data.nla_tracks so each parent's subtree forms one + contiguous block: parent at the LOWEST NLA index of the block, descendants + stacked above recursively. obj.Anim_Layers follows via visible_layers(). + + Sibling order at each level: ascending current NLA index by default — the + sibling that was lower pre-reorder ends up closer to the parent. When + `priority_name` is given, that layer is bumped to the top of its siblings + (matches the interactive "just-linked layer goes above the other + children" rule). Migration callers leave priority_name unset to preserve + the user's original sibling NLA order. + + Idempotent: returns False if the NLA is already in the desired order. + """ + anim_data = anim_data_type(obj) + if anim_data is None or not hasattr(anim_data, 'nla_tracks'): + return False + nla_tracks = anim_data.nla_tracks + n = len(nla_tracks) + if n < 2: + return False + + # Snapshot current NLA position of every track (used to break ties between siblings). + current_index = {nla_tracks[i].name: i for i in range(n)} + + # Sort key: priority_name gets the highest rank within its sibling group; + # all others sort by current NLA index ascending. + def sibling_key(name): + if priority_name is not None and name == priority_name: + return n + 1 # higher than any real NLA index + return current_index.get(name, 0) + + children_by_parent = {} + for it in obj.Anim_Layers: + children_by_parent.setdefault(it.parent_layer, []).append(it.name) + for plist in children_by_parent.values(): + plist.sort(key=sibling_key) + + # DFS pre-order (parent first, then descendants): parent lands at lowest + # NLA index of its subtree; descendants stack above. + target = [] + visited = set() + + def emit_subtree(name): + if name in visited or name not in current_index: + return + visited.add(name) + target.append(name) + for child in children_by_parent.get(name, []): + emit_subtree(child) + + for root_name in children_by_parent.get('', []): + emit_subtree(root_name) + + # Orphans (parent_layer pointing at a name that no longer exists). + for i in range(n): + nm = nla_tracks[i].name + if nm not in visited: + target.append(nm) + visited.add(nm) + + current_order = [nla_tracks[i].name for i in range(n)] + if current_order == target: + return False + + # Reorder NLA. Try nla_tracks.move(from, to) per shift and verify it + # actually took effect; otherwise fall back to channels_move via bpy.ops + # (which always works under an NLA-editor context override). + use_bpy_ops = False + ctx = context if context is not None else bpy.context + for target_idx, name in enumerate(target): + current_idx = nla_tracks.find(name) + if current_idx == -1 or current_idx == target_idx: continue - layer['lock'] = lock[i] - layer['frame_start'] = frame_range[i][0] - layer['frame_end'] = frame_range[i][1] - layer['speed'] = frame_range[i][2] - layer['repeat'] = frame_range[i][3] - layer['offset'] = frame_range[i][4] - layer['custom_frame_range'] = frame_range[i][5] + moved = False + if not use_bpy_ops: + try: + nla_tracks.move(current_idx, target_idx) + # Verify the move stuck. If not, the API exists but isn't + # actually shifting in this Blender version/context. + if nla_tracks.find(name) == target_idx: + moved = True + else: + use_bpy_ops = True + except (AttributeError, RuntimeError, TypeError): + use_bpy_ops = True + if not moved: + diff = current_idx - target_idx + direction = 'DOWN' if diff > 0 else 'UP' + for _ in range(abs(diff)): + move_layer(direction, ctx, track_name=name) + + # Resync the collection to the new NLA order. + visible_layers(obj, nla_tracks) + return True def use_animated_influence(strip): @@ -440,7 +1076,8 @@ def hide_view_all_keyframes(obj, anim_data): anim_data.action.groups['Anim Layers'].lock = True return #if the group was not found or renamed iterate over the layers - for i, layer in enumerate(obj.Anim_Layers): + layer_items = [l for l in obj.Anim_Layers if l.type == 'LAYER'] + for i, layer in enumerate(layer_items): if layer.lock or obj.als.layer_index == i: continue fcu = fcurves.find(layer.name, index = i) @@ -575,7 +1212,7 @@ class EditAllLayersOperator(bpy.types.Operator): # Adding the offset from the layers and the current layers pairs = multilayer_reverse_offset(pairs, anim_data.nla_tracks[i].strips[0]) - pairs = multilayer_offset_evaluation(pairs, anim_data.nla_tracks[self.obj.als.layer_index].strips[0]) + pairs = multilayer_offset_evaluation(pairs, anim_data.nla_tracks[nla_idx(self.obj)].strips[0]) #Creating a column from each pair changed_keys = pairs[pairs[:,0] != pairs[:,1]] @@ -723,7 +1360,7 @@ def view_all_keyframes(self, context): anim_data = anim_data_type(obj) nla_tracks = anim_data.nla_tracks #if animation layers is still not completly loaded then return - if len(anim_data.nla_tracks) != len(obj.Anim_Layers) or anim_data.action is None: + if len(anim_data.nla_tracks) != nla_layer_count(obj) or anim_data.action is None: return #remove old Anim Layers fcurves @@ -750,7 +1387,7 @@ def view_all_keyframes(self, context): continue frames = multilayer_offset_evaluation(frames, track.strips[0]) - frames = multilayer_reverse_offset(frames, nla_tracks[obj.als.layer_index].strips[0]) + frames = multilayer_reverse_offset(frames, nla_tracks[nla_idx(obj)].strips[0]) keyframes = np.repeat(frames, 2) @@ -778,7 +1415,8 @@ def unlock_edit_keyframes(self, context): anim_data = anim_data_type(obj) - for i, layer in enumerate(obj.Anim_Layers): #look for the Anim Layers fcurve + layer_items = [l for l in obj.Anim_Layers if l.type == 'LAYER'] + for i, layer in enumerate(layer_items): #look for the Anim Layers fcurve if layer.lock or anim_data.action is None or i == obj.als.layer_index: continue fcurves = get_fcurves(obj, anim_data.action) @@ -939,104 +1577,183 @@ def tweak_mode_upper_stack(context, obj, anim_data, enter = True): screen.areas[0].ui_type = ui_type def update_layer_index(self, context): - '''select the new action clip when there is a new selection in the ui list and make all the updates for this Layer''' + '''UIList selection changed (layer_index is the active row in obj.Anim_Layers). + When the active row is a LAYER, switch NLA tweak mode and select the + corresponding strip/track. When the active row is a GROUP, no NLA work to + do — just skip the side effects.''' obj = self.id_data - if obj is None:# or context.object is None: + if obj is None: return if not self.turn_on: return if not len(obj.Anim_Layers): return anim_data = anim_data_type(obj) + if anim_data is None or not hasattr(anim_data, 'nla_tracks'): + return + # If the active row is a GROUP, there's no NLA strip to switch to. + nla_index = nla_idx(obj) + if nla_index < 0 or nla_index >= len(anim_data.nla_tracks): + return for track in anim_data.nla_tracks: track.select = False if len(track.strips): track.strips[0].select = False - nla_track = anim_data.nla_tracks[self.layer_index] + nla_track = anim_data.nla_tracks[nla_index] if not len(nla_track.strips): anim_data.use_tweak_mode = False return strip = nla_track.strips[0] # Update the fake influence property with the actual strip influence context.scene.als['influence'] = strip.influence - + if strip.action is None: anim_data.use_tweak_mode = False return - + #select and activate the strip and track strip.select = True nla_track.select = True anim_data.nla_tracks.active = nla_track - - if obj.Anim_Layers[self.layer_index].lock: + + active_row = self.layer_index + if obj.Anim_Layers[active_row].lock: #anim_data.use_tweak_mode = False tweak_mode_upper_stack(context, obj, anim_data, enter = False) return - + if not obj.als.upper_stack: subscriptions.subscriptions_remove() tweak_mode_upper_stack(context, obj, anim_data) subscriptions.subscriptions_add(context.scene) else: anim_data.use_tweak_mode = False - if not obj.Anim_Layers[self.layer_index].lock: + if not obj.Anim_Layers[active_row].lock: anim_data.use_tweak_mode = True - + if obj.als.view_all_keyframes: obj.als.view_all_keyframes = True def layer_mute(self, context): + """Sync self.mute to the NLA track. If the layer is a parent of others, + cascade the mute change down its subtree (so descendants reflect the same + effective mute state).""" obj = self.id_data - index = list(obj.Anim_Layers).index(self) + global _group_cascade_skip anim_data = anim_data_type(obj) - anim_data.nla_tracks[index].mute = self.mute - + if anim_data is None: + return + + # Sync own NLA track. + layer_idx = anim_data.nla_tracks.find(self.name) + if layer_idx != -1: + anim_data.nla_tracks[layer_idx].mute = self.mute + + # Cascade to descendants. Guard against re-entry from the per-descendant + # update callback firing again. + if not _group_cascade_skip: + _group_cascade_skip = True + try: + for d in layer_descendants(obj, self.name): + if d.mute != self.mute: + d.mute = self.mute + finally: + _group_cascade_skip = False + #Exclude muted layers from view all keyframes if obj.als.view_all_keyframes: obj.als.view_all_keyframes = True - + def layer_solo(self, context): - + """Subtree-vs-subtree solo: muting every layer whose subtree-root differs + from self's subtree-root. Internal mute/solo within self's own subtree is + preserved. Toggling off restores each track's mute from the per-layer + mute property.""" obj = context.object + if obj is None: + return anim_data = anim_data_type(obj) - #added a skip boolean so that when layer.solo = False it doesnt iterate through all the layers because of the call, since only one layer can be solo - global skip + if anim_data is None or not hasattr(anim_data, 'nla_tracks'): + return + nla_tracks = anim_data.nla_tracks + global skip, _group_cascade_skip try: if skip: return except NameError: skip = False - if self.solo: - for i, layer in enumerate(obj.Anim_Layers): - if layer != self: - skip = True - layer.solo = False - anim_data.nla_tracks[i].mute = True - else: - anim_data.nla_tracks[i].mute = False - skip = False - else: - #when turned off restore track mute from the layers mute property - for i, track in enumerate(anim_data.nla_tracks): - track.mute = obj.Anim_Layers[i].mute - + if _group_cascade_skip: + return + _group_cascade_skip = True + try: + if self.solo: + # Turn off solo on every other layer so only one is the "soloed". + for it in obj.Anim_Layers: + if it.name == self.name: + continue + if it.solo: + skip = True + it.solo = False + skip = False + + # Mute every layer whose subtree-root differs from self's + # subtree-root; unmute every layer inside self's subtree-root. + self_root = subtree_root(obj, self.name) + self_root_name = self_root.name if self_root is not None else self.name + self_subtree_names = {self_root_name} | {d.name for d in layer_descendants(obj, self_root_name)} + for track in nla_tracks: + if track.name in self_subtree_names: + track.mute = False + else: + track.mute = True + else: + # Restore each track's mute from its layer-row mute (which itself + # reflects ancestor-cascade state from layer_mute). + for it in obj.Anim_Layers: + track_idx = nla_tracks.find(it.name) + if track_idx != -1: + nla_tracks[track_idx].mute = it.mute + finally: + _group_cascade_skip = False + def layer_lock(self, context): + """Sync self.lock to the NLA track. Cascade to descendants (parent locked + means everything inside is locked too). Forces re-lock when the track has + an invalid strip layout (!=1 strip or META).""" obj = self.id_data - index = list(obj.Anim_Layers).index(self) + global _group_cascade_skip anim_data = anim_data_type(obj) + if anim_data is None: + return nla_tracks = anim_data.nla_tracks - + + layer_idx = nla_tracks.find(self.name) + if layer_idx == -1: + return + + # If the user tried to unlock but the strip layout is invalid, snap back. if not self.lock: - if len(nla_tracks[index].strips) != 1 or nla_tracks[index].strips[0].type == 'META': + if len(nla_tracks[layer_idx].strips) != 1 or nla_tracks[layer_idx].strips[0].type == 'META': self.lock = True - #Get out of tweak mode - if index == obj.als.layer_index: + return # second update fires; let it through + + # Cascade to descendants. + if not _group_cascade_skip: + _group_cascade_skip = True + try: + for d in layer_descendants(obj, self.name): + if d.lock != self.lock: + d.lock = self.lock + finally: + _group_cascade_skip = False + + # Get out of tweak mode if the locked row is the active one. + if layer_idx == obj.als.layer_index: obj.als.layer_index = obj.als.layer_index - + #Exclude locked layers from view all keyframes if obj.als.view_all_keyframes: obj.als.view_all_keyframes = True @@ -1069,11 +1786,13 @@ def data_type_update(self, context): self.baketype = 'AL' def layer_name_update(self, context): - - #if layer name exists then add a unique name + """Sync the renamed layer's NLA track + action names, and propagate the + rename to every other layer's parent_layer reference.""" obj = self.id_data if context.object is None: return + + # Deduplicate against sibling names. layer_names = [layer.name for layer in context.object.Anim_Layers if layer != self] if self.name in layer_names: self.name = unique_name(layer_names, self.name) @@ -1082,18 +1801,35 @@ def layer_name_update(self, context): return nla_tracks = anim_data.nla_tracks override_tracks = check_override_tracks(obj, anim_data) - index = list(obj.Anim_Layers).index(self) - track = nla_tracks[index] + layer_idx = nla_tracks.find(self.name) + if layer_idx == -1: + # Track name hasn't been synced yet. Locate by previous name via the + # collection's row index. + row = list(obj.Anim_Layers).index(self) + if row >= len(nla_tracks): + return + layer_idx = row + track = nla_tracks[layer_idx] if not len(track.strips): return strip = track.strips[0] + # Capture the old name BEFORE renaming the track, so parent_layer refs + # can be propagated. Prefer _prev_name (last observed name) and fall back + # to the current track name (which still holds the pre-rename value here). + rename_from = self.get('_prev_name', '') or track.name if self.name != track.name: - #synchronize override_tracks if track.name in override_tracks: override_tracks[track.name].name = self.name track.name = self.name if len(track.strips) == 1: strip.name = self.name + if rename_from and rename_from != self.name: + for it in obj.Anim_Layers: + if it is self: + continue + if it.parent_layer == rename_from: + it['parent_layer'] = self.name + self['_prev_name'] = self.name if strip.action is None: return if obj.als.auto_rename and strip.action.name != self.name: @@ -1104,7 +1840,7 @@ def influence_get_strips(context): obj = context.object anim_data = anim_data_type(obj) scene = context.scene - current_strip = anim_data.nla_tracks[obj.als.layer_index].strips[0] + current_strip = anim_data.nla_tracks[nla_idx(obj)].strips[0] strips = [current_strip] if scene.als.influence_global: strips += [strip for track in anim_data.nla_tracks for strip in track.strips] @@ -1206,7 +1942,7 @@ def blend_type_update(self, context): '''synchronize the blend property with the NLA Blend''' obj = self.id_data anim_data = anim_data_type(obj) - strip = anim_data.nla_tracks[obj.als.layer_index].strips[0] + strip = anim_data.nla_tracks[nla_idx(obj)].strips[0] if self.blend_type == strip.blend_type: return if obj.als.auto_blend: @@ -1229,8 +1965,8 @@ def auto_rename(self, context): return name = anim_data.action.name obj.Anim_Layers[obj.als.layer_index].name = name - anim_data.nla_tracks[obj.als.layer_index].name = name - anim_data.nla_tracks[obj.als.layer_index].strips[0].name = name + anim_data.nla_tracks[nla_idx(obj)].name = name + anim_data.nla_tracks[nla_idx(obj)].strips[0].name = name def auto_rename_default(obj): '''Apply the default auto renaming from the addon preferences''' @@ -1246,7 +1982,7 @@ def add_inbetween_key(self, context): '''Adding a Breakdown keyframe that works also in Layers''' obj = self.id_data anim_data = anim_data_type(obj) - strip = anim_data.nla_tracks[obj.als.layer_index].strips[0] + strip = anim_data.nla_tracks[nla_idx(obj)].strips[0] frame = round(bake_ops.frame_evaluation(context.scene.frame_current, strip), 3) fcurves = get_fcurves(obj, anim_data.action) @@ -1425,7 +2161,7 @@ def layer_frame_range(self, context): layer_offset(self, context) return - if len(anim_data.nla_tracks) != len(obj.Anim_Layers): + if len(anim_data.nla_tracks) != nla_layer_count(obj): return if self.repeat > 1: calculate_repeat_settings(self, strip) @@ -1602,7 +2338,7 @@ def action_search(action, nla_tracks): def select_layer_bones(self, context): obj = context.object - strips = obj.animation_data.nla_tracks[obj.als.layer_index].strips + strips = obj.animation_data.nla_tracks[nla_idx(obj)].strips if len(strips) != 1 or strips[0].action is None: return fcurves = get_fcurves(obj, strips[0].action) @@ -1776,11 +2512,11 @@ class ClearActiveAction(bpy.types.Operator): elif self.proceed == 'ADD_ACTION': action = anim_data.action # anim_data.action = None - index = len(obj.Anim_Layers) - 1 - obj.als.layer_index = index + index = nla_layer_count(obj) - 1 # NLA-track index + obj.als.layer_index = layer_to_row_index(obj, max(0, index)) #add_animlayer(layer_name = action.name , duplicate = False, index = 1, blend_type = 'COMBINE') add_animlayer(unique_name(obj.Anim_Layers, action.name), index = index, blend_type = 'REPLACE') - obj.als.layer_index += 1 + obj.als.layer_index = layer_to_row_index(obj, index + 1) # new_track.strips[0].action = action subscriptions.subscriptions_remove() @@ -1885,16 +2621,22 @@ def update_action_list(scene): layer = obj.Anim_Layers[0] layer.action = anim_data.nla_tracks[0].strips[0].action -def add_animlayer(layer_name = 'Anim_Layer' , duplicate = False, index = 1, blend_type = 'COMBINE'): - '''Add an animation layer''' +def add_animlayer(layer_name = 'Anim_Layer' , duplicate = False, index = 1, blend_type = 'COMBINE', prev_track = None): + '''Add an animation layer. `prev_track` overrides the default insertion + anchor (just-above-the-active-track). Pass it when the caller needs the + new track to land somewhere other than active+1 — for example, above the + active layer's entire subtree.''' obj = bpy.context.object check_overrides_ALobjects(obj) anim_data = anim_data_type(obj) action = anim_data.action nla_tracks = anim_data.nla_tracks if obj.als.layer_index < 0 : obj.als['layer_index'] = 0 - previous = None if index == 0 else nla_tracks[obj.als.layer_index] - + if prev_track is not None: + previous = prev_track + else: + previous = None if index == 0 else nla_tracks[nla_idx(obj)] + new_track = nla_tracks.new(prev = previous) new_track.name = layer_name @@ -1930,7 +2672,7 @@ def add_animlayer(layer_name = 'Anim_Layer' , duplicate = False, index = 1, blen new_strip.action_slot = slot if duplicate: - copy_strip_settings(new_strip, anim_data.nla_tracks[obj.als.layer_index].strips[0]) + copy_strip_settings(new_strip, anim_data.nla_tracks[nla_idx(obj)].strips[0]) else: new_strip.action_frame_start = 0 visible_layers(obj, anim_data.nla_tracks) @@ -1982,17 +2724,44 @@ class AddAnimLayer(bpy.types.Operator): obj.als['layer_index'] = 0 add_animlayer(base_name, index = 0, blend_type = blend_type) #using a temporary variable instead of calling update_track_list all the time with obj.als.layer_index - + index = 0 - + if anim_data.action: add_animlayer(layer_name, index, blend_type = blend_type) index += 1 anim_data.action.use_fake_user = True anim_data.action = None + new_track_name = anim_data.nla_tracks[index].name + parent_layer_to_inherit = '' else: - add_animlayer(unique_name(obj.Anim_Layers, layer_name), blend_type = blend_type) - index = obj.als.layer_index + 1 + # Capture the active row's info BEFORE add_animlayer mutates state. + # The new layer is always a SIBLING of the active row (inherits its + # parent_layer). What changes based on whether the active has + # children is only the INSERTION ANCHOR — a parent layer plus its + # descendants is treated as a single unit, so the new layer goes + # above the whole subtree instead of between parent and children. + prev_active = active_item(obj) + custom_prev_track = None + parent_layer_to_inherit = '' + if prev_active is not None: + parent_layer_to_inherit = prev_active.parent_layer + if is_group_layer(obj, prev_active.name): + descendants = layer_descendants(obj, prev_active.name) + top_desc_idx = -1 + for d in descendants: + di = nla_tracks.find(d.name) + if di > top_desc_idx: + top_desc_idx = di + if top_desc_idx != -1: + custom_prev_track = nla_tracks[top_desc_idx] + + new_track = add_animlayer(unique_name(obj.Anim_Layers, layer_name), + blend_type = blend_type, + prev_track = custom_prev_track) + new_track_name = new_track.name + index = anim_data.nla_tracks.find(new_track_name) + #register_layers(obj, nla_tracks) override_tracks = check_override_tracks(obj, anim_data) if override_tracks: @@ -2000,13 +2769,38 @@ class AddAnimLayer(bpy.types.Operator): #if override tracks exist then make sure selection is on top of them while anim_data.nla_tracks[index].name in override_tracks: index += 1 - obj.als.layer_index = index + new_track_name = anim_data.nla_tracks[index].name + + # Apply parent_layer to the freshly-added LAYER row. + if parent_layer_to_inherit: + row_idx = obj.Anim_Layers.find(new_track_name) + if row_idx != -1: + obj.Anim_Layers[row_idx]['parent_layer'] = parent_layer_to_inherit + + # Defensive: enforce contiguity in case the existing NLA was already + # out of order. The prev_track we passed to add_animlayer puts the new + # row in the right slot (just above the active's subtree), so in the + # normal case this is a fast no-op. No priority_name — we do NOT want + # the new layer bumped to the top of its sibling stack; we want it + # exactly where prev_track placed it. + subscriptions.subscriptions_remove() + try: + enforce_subtree_contiguity(obj, context) + finally: + if context.scene is not None: + subscriptions.subscriptions_add(context.scene) + + # Pin selection on the new layer (its row index may have shifted + # after enforce_subtree_contiguity ran). + final_idx = obj.Anim_Layers.find(new_track_name) + if final_idx != -1: + obj.als.layer_index = final_idx subscriptions.animlayers_frame(context.scene, context) if subscriptions.check_handler not in bpy.app.handlers.depsgraph_update_pre: - bpy.app.handlers.depsgraph_update_pre.append(subscriptions.check_handler) - - return {'FINISHED'} + bpy.app.handlers.depsgraph_update_pre.append(subscriptions.check_handler) + + return {'FINISHED'} def copy_strip_settings(new_strip, old_strip): '''Copy strip settings when duplicating them''' @@ -2024,38 +2818,54 @@ class DuplicateAnimLayer(bpy.types.Operator): bl_idname = "anim.duplicate_anim_layer" bl_label = "Duplicate Animation Layer" bl_options = {'REGISTER', 'UNDO'} - - def execute(self, context): + + @classmethod + def poll(cls, context): + return context.object is not None and is_layer_row_active(context.object) + + def execute(self, context): if subscriptions.check_handler in bpy.app.handlers.depsgraph_update_pre: bpy.app.handlers.depsgraph_update_pre.remove(subscriptions.check_handler) - + obj = context.object anim_data = anim_data_type(obj) - nla_tracks = anim_data.nla_tracks - i = obj.als.layer_index - + nla_tracks = anim_data.nla_tracks + i = nla_idx(obj) + strip = nla_tracks[i].strips[0] blend = strip.blend_type track_name = nla_tracks[i].name - - + + # Capture source layer's parent_layer before duplication so the dup inherits it. + source_parent_layer = '' + a = active_item(obj) + if a is not None: + source_parent_layer = a.parent_layer + name = unique_name(obj.Anim_Layers, track_name) new_track = add_animlayer(layer_name = name, duplicate = True, blend_type = blend) new_strip = new_track.strips[0] action = new_strip.action if obj.als.linked == False: tweak_mode_upper_stack(context, obj, anim_data, enter = False) - new_strip.action = action.copy() - - + new_strip.action = action.copy() + + register_layers(obj, nla_tracks) - - obj.als.layer_index += 1 + + # Point the UIList at the newly-added layer by name. + new_layer_name = new_track.name + ridx = obj.Anim_Layers.find(new_layer_name) + if ridx != -1: + obj.als.layer_index = ridx + if source_parent_layer: + obj.Anim_Layers[ridx]['parent_layer'] = source_parent_layer + #Turn on frame range if it was duplicated tweak_mode_upper_stack(context, obj, anim_data) if subscriptions.check_handler not in bpy.app.handlers.depsgraph_update_pre: - bpy.app.handlers.depsgraph_update_pre.append(subscriptions.check_handler) - + bpy.app.handlers.depsgraph_update_pre.append(subscriptions.check_handler) + return {'FINISHED'} class ExtractSelection(bpy.types.Operator): @@ -2079,8 +2889,8 @@ class ExtractSelection(bpy.types.Operator): nla_tracks = anim_data.nla_tracks - blend = nla_tracks[obj.als.layer_index].strips[0].blend_type - track_name = nla_tracks[obj.als.layer_index].name + blend = nla_tracks[nla_idx(obj)].strips[0].blend_type + track_name = nla_tracks[nla_idx(obj)].name name = unique_name(obj.Anim_Layers, track_name + ' Extract') new_track = add_animlayer(layer_name = name, duplicate = True, blend_type = blend) @@ -2116,11 +2926,16 @@ class ExtractSelection(bpy.types.Operator): new_fcurves.remove(fcu) new_fcurves.update() - + register_layers(obj, nla_tracks) - - obj.als.layer_index += 1 - + + # Point the UIList at the newly-extracted layer. + new_layer_name = new_track.name + for ridx, it in enumerate(obj.Anim_Layers): + if it.type == 'LAYER' and it.name == new_layer_name: + obj.als.layer_index = ridx + break + tweak_mode_upper_stack(context, obj, anim_data) if subscriptions.check_handler not in bpy.app.handlers.depsgraph_update_pre: @@ -2147,8 +2962,8 @@ class ExtractMarkers(bpy.types.Operator): anim_data = anim_data_type(obj) nla_tracks = anim_data.nla_tracks - blend = nla_tracks[obj.als.layer_index].strips[0].blend_type - track_name = nla_tracks[obj.als.layer_index].name + blend = nla_tracks[nla_idx(obj)].strips[0].blend_type + track_name = nla_tracks[nla_idx(obj)].name name = unique_name(obj.Anim_Layers, track_name + ' Extract') new_track = add_animlayer(layer_name = name, duplicate = True, blend_type = blend) @@ -2218,62 +3033,137 @@ class ExtractMarkers(bpy.types.Operator): # context.scene.frame_set(current_frame) fcurves.update() - + register_layers(obj, nla_tracks) - - obj.als.layer_index += 1 - + + # Point the UIList at the newly-extracted layer. + new_layer_name = new_track.name + for ridx, it in enumerate(obj.Anim_Layers): + if it.type == 'LAYER' and it.name == new_layer_name: + obj.als.layer_index = ridx + break + tweak_mode_upper_stack(context, obj, anim_data) if subscriptions.check_handler not in bpy.app.handlers.depsgraph_update_pre: - bpy.app.handlers.depsgraph_update_pre.append(subscriptions.check_handler) + bpy.app.handlers.depsgraph_update_pre.append(subscriptions.check_handler) return {'FINISHED'} class RemoveAnimLayer(bpy.types.Operator): - """Remove animation layer""" + """Remove animation layer. If the layer has children, prompts whether to delete the whole subtree or promote children to the parent.""" bl_idname = "anim.remove_anim_layer" bl_label = "Remove Animation Layer" bl_options = {'REGISTER', 'UNDO'} - + + children_action: bpy.props.EnumProperty( + name='Children', + description="What to do with descendants when removing a layer that has children", + items=[ + ('PROMOTE', 'Promote children', "Re-parent direct children to this layer's parent (or root if it was a root layer)"), + ('DELETE_SUBTREE', 'Delete subtree', "Delete this layer and all its descendants"), + ], + default='PROMOTE', + ) + @classmethod def poll(cls, context): - anim_data = anim_data_type(context.object) if context.object else None + if context.object is None: + return False + anim_data = anim_data_type(context.object) if hasattr(anim_data, 'nla_tracks'): - return len(anim_data.nla_tracks) - - def execute(self, context): + return len(anim_data.nla_tracks) > 0 + return False + def invoke(self, context, event): obj = context.object + a = active_item(obj) + if a is None: + return {'CANCELLED'} + if is_group_layer(obj, a.name): + # Has descendants — ask the user what to do. + return context.window_manager.invoke_props_dialog(self) + return self.execute(context) + + def draw(self, context): + layout = self.layout + obj = context.object + a = active_item(obj) + if a is None: + return + descendants = layer_descendants(obj, a.name) + layout.label(text=f"'{a.name}' has {len(descendants)} descendant layer(s).") + layout.prop(self, 'children_action', expand=True) + + def execute(self, context): + obj = context.object + a = active_item(obj) + if a is None: + return {'CANCELLED'} anim_data = anim_data_type(obj) + if anim_data is None or not hasattr(anim_data, 'nla_tracks'): + return {'CANCELLED'} nla_tracks = anim_data.nla_tracks - track = nla_tracks[obj.als.layer_index] + active_name = a.name + active_parent = a.parent_layer + + # Decide which rows to remove based on the children policy. + promoted_children = False + if is_group_layer(obj, active_name): + if self.children_action == 'DELETE_SUBTREE': + names_to_remove = [active_name] + [d.name for d in layer_descendants(obj, active_name)] + else: + # PROMOTE: re-parent direct children to the active's parent. + for child in layer_children(obj, active_name): + child['parent_layer'] = active_parent + names_to_remove = [active_name] + promoted_children = True + else: + names_to_remove = [active_name] + override_tracks = check_override_tracks(obj, anim_data) - if track.name in override_tracks: - return {'CANCELLED'} - try: - obj.Anim_Layers.remove(obj.als.layer_index) - except TypeError: #library overrides currently can not remove items - return {'CANCELLED'} - - #Since Blender 4.4 Blender is crashing when removing strips while in tweak mode + for n in names_to_remove: + if n in override_tracks: + return {'CANCELLED'} + + # Blender 4.4 can crash when removing strips while in tweak mode. anim_data.use_tweak_mode = False - if len(nla_tracks) == 1: - tweak_mode_upper_stack(context, obj, anim_data, enter = False) + try: + for n in names_to_remove: + idx = obj.Anim_Layers.find(n) + if idx != -1: + obj.Anim_Layers.remove(idx) + except TypeError: # library overrides + return {'CANCELLED'} - nla_tracks.remove(track) - #update the ui list item's index - if obj.als.layer_index != 0: - obj.als.layer_index -= 1 - else: - obj.als.layer_index = 0 + for n in names_to_remove: + track_idx = nla_tracks.find(n) + if track_idx != -1: + if len(nla_tracks) == 1: + tweak_mode_upper_stack(context, obj, anim_data, enter=False) + nla_tracks.remove(nla_tracks[track_idx]) - return {'FINISHED'} + # If children were promoted to the grandparent, their subtrees may now + # be far from the new parent in NLA. Re-establish contiguity. + if promoted_children: + subscriptions.subscriptions_remove() + try: + enforce_subtree_contiguity(obj, context) + finally: + if context.scene is not None: + subscriptions.subscriptions_add(context.scene) + + new_count = len(obj.Anim_Layers) + if obj.als.layer_index >= new_count: + obj.als.layer_index = max(0, new_count - 1) + return {'FINISHED'} def share_layerkeys_items(self, context): - '''create the layer items for the share keys excluding the current layer''' + '''create the layer items for the share keys excluding the current layer''' obj = self.id_data - return [(layer.name, layer.name, layer.name) for layer in obj.Anim_Layers if layer != obj.Anim_Layers[obj.als.layer_index]] + active = obj.Anim_Layers[obj.als.layer_index] if len(obj.Anim_Layers) else None + return [(layer.name, layer.name, layer.name) for layer in obj.Anim_Layers + if layer.type == 'LAYER' and layer != active] class ShareLayerKeys(bpy.types.Operator): '''Share keyframes positions between layers''' @@ -2290,7 +3180,7 @@ class ShareLayerKeys(bpy.types.Operator): obj = context.object anim_data = anim_data_type(obj) fcu_frames = dict() - current_strip = anim_data.nla_tracks[obj.als.layer_index].strips[0] + current_strip = anim_data.nla_tracks[nla_idx(obj)].strips[0] #get the layer from the enumarator layer = obj.als.share_layer_keys if len(anim_data.nla_tracks[layer].strips) != 1: @@ -2350,7 +3240,18 @@ class ShareLayerKeys(bpy.types.Operator): return{'FINISHED'} -def move_layer(dir, context): +def move_layer(dir, context, track_name=None): + """Move a single NLA track via bpy.ops.anim.channels_move. + + If `track_name` is provided, that named track is the one moved. This is + important when the addon's LAYER<->NLA mirror is temporarily out of sync + (e.g. the caller just mutated obj.Anim_Layers manually and is about to + sync NLA to match) — in that state, nla_idx(obj) cannot be trusted to + point at the right track. + + Falls back to selecting the track at nla_idx(obj) (the active LAYER row) + when no track_name is given — the legacy behavior used by + MoveAnimLayerUp/Down's LAYER branches.""" window = context.window screen = context.screen #Storing the first area in the screen @@ -2363,11 +3264,11 @@ def move_layer(dir, context): obj = context.object anim_data = anim_data_type(obj) - + #exit global tweakmode if context.scene.is_nla_tweakmode: tweak_mode_upper_stack(context, obj, anim_data, enter = False) - + #deselect all track strips for obj in context.scene.objects: anim_data = anim_data_type(obj) @@ -2377,96 +3278,185 @@ def move_layer(dir, context): continue for track in anim_data.nla_tracks: track.select = False - - #select only the current track strip + + #select the track to move obj = context.object anim_data = anim_data_type(obj) - anim_data.nla_tracks[obj.als.layer_index].select = True + if track_name is not None: + idx_to_select = anim_data.nla_tracks.find(track_name) + if idx_to_select == -1: + # Restore area before bailing. + screen.areas[0].type = old_area + screen.areas[0].ui_type = ui_type + return + else: + idx_to_select = nla_idx(obj) + anim_data.nla_tracks[idx_to_select].select = True with context.temp_override(window=window, area=area, region=region): bpy.ops.anim.channels_expand() - + bpy.ops.anim.channels_move(direction=dir) - - #restoring the old area + + #restoring the old area screen.areas[0].type = old_area screen.areas[0].ui_type = ui_type visible_layers(obj, anim_data.nla_tracks) - + +def _move_subtree_one_step(context, obj, subtree_root_name, direction): + """Shift the subtree rooted at `subtree_root_name` past its next sibling + subtree in `direction` ('UP' = higher NLA index, 'DOWN' = lower). Returns + True if a move happened. Blocks at parent boundary (won't cross out of the + current parent's subtree) and at NLA stack ends. + + Subtree contiguity invariant assumed: parent at lowest NLA index of its + subtree, descendants immediately above, recursively. This is what the move + operators themselves preserve; if the user manually breaks contiguity via + the NLA editor, results are best-effort. + """ + anim_data = anim_data_type(obj) + if anim_data is None or not hasattr(anim_data, 'nla_tracks'): + return False + nla_tracks = anim_data.nla_tracks + + my_idx = nla_tracks.find(subtree_root_name) + if my_idx == -1: + return False + my_row = obj.Anim_Layers.get(subtree_root_name) + if my_row is None: + return False + my_parent = my_row.parent_layer + my_size = layer_subtree_size(obj, subtree_root_name) + + # Find the sibling subtree just above/below my subtree in NLA. + if direction == 'UP': + above_idx = my_idx + my_size + if above_idx >= len(nla_tracks): + return False + sibling_name = nla_tracks[above_idx].name + else: # DOWN + if my_idx == 0: + return False + sibling_name = None + for i in range(my_idx - 1, -1, -1): + cand = obj.Anim_Layers.get(nla_tracks[i].name) + if cand is None: + continue + if cand.parent_layer == my_parent: + sibling_name = cand.name + break + if sibling_name is None: + return False + + sibling_row = obj.Anim_Layers.get(sibling_name) + if sibling_row is None or sibling_row.parent_layer != my_parent: + # Crossing a parent boundary (or sibling row missing). + return False + sibling_size = layer_subtree_size(obj, sibling_name) + + # Move every member of my subtree past the sibling's subtree, one slot at + # a time. Order matters: for UP, move top-of-subtree first so members + # don't swap with each other; for DOWN, bottom-first. + subtree_names = [subtree_root_name] + [d.name for d in layer_descendants(obj, subtree_root_name)] + + def _resort_by_position(): + pairs = [(nla_tracks.find(n), n) for n in subtree_names] + pairs = [(i, n) for (i, n) in pairs if i != -1] + if direction == 'UP': + pairs.sort(key=lambda x: -x[0]) + else: + pairs.sort(key=lambda x: x[0]) + return pairs + + for _ in range(sibling_size): + for _, name in _resort_by_position(): + move_layer(direction, context, track_name=name) + return True + class MoveAnimLayerUp(bpy.types.Operator): - """Move the selected layer up. Hold shift to move to the top""" + """Move the selected layer (and its subtree) up. Hold shift to move to the top of the parent's subtree.""" bl_idname = "anim.layer_move_up" bl_label = "Move the selected Animation layer up." bl_options = {'REGISTER', 'UNDO'} - + @classmethod def poll(cls, context): obj = context.object - anim_data = anim_data_type(obj) if obj else None + if obj is None: + return False + anim_data = anim_data_type(obj) if hasattr(anim_data, 'nla_tracks'): return len(anim_data.nla_tracks) > 1 - + return False + def invoke(self, context, event): self.shift = event.shift return self.execute(context) - + def execute(self, context): - obj = context.object - index = obj.als.layer_index - if index >= len(obj.animation_data.nla_tracks)-1: + a = active_item(obj) + if a is None: return {'CANCELLED'} - + active_name = a.name + subscriptions.subscriptions_remove() - if self.shift: - top_layer = len(obj.animation_data.nla_tracks)-1 - obj.Anim_Layers.move(index, top_layer) - move_layer('TOP', context) - obj.als.layer_index = top_layer - else: - obj.Anim_Layers.move(index, index + 1) - move_layer('UP', context) - obj.als.layer_index += 1 - subscriptions.subscriptions_add(context.scene) - - return {'FINISHED'} - + moved_any = False + try: + max_steps = len(obj.Anim_Layers) if self.shift else 1 + for _ in range(max_steps): + if not _move_subtree_one_step(context, obj, active_name, 'UP'): + break + moved_any = True + finally: + # Pin selection back on the moved layer by name. + idx = obj.Anim_Layers.find(active_name) + if idx != -1: + obj.als.layer_index = idx + subscriptions.subscriptions_add(context.scene) + return {'FINISHED'} if moved_any else {'CANCELLED'} + class MoveAnimLayerDown(bpy.types.Operator): - """Move the selected layer down. Hold shift to move to the bottom""" + """Move the selected layer (and its subtree) down. Hold shift to move to the bottom of the parent's subtree.""" bl_idname = "anim.layer_move_down" bl_label = "Move the selected animation layer down" bl_options = {'REGISTER', 'UNDO'} - + @classmethod def poll(cls, context): - anim_data = anim_data_type(context.object) if context.object else None + obj = context.object + if obj is None: + return False + anim_data = anim_data_type(obj) if hasattr(anim_data, 'nla_tracks'): return len(anim_data.nla_tracks) > 1 - + return False + def invoke(self, context, event): self.shift = event.shift return self.execute(context) - + def execute(self, context): - obj = context.object - index = obj.als.layer_index - if index == 0: + a = active_item(obj) + if a is None: return {'CANCELLED'} - + active_name = a.name + subscriptions.subscriptions_remove() - if self.shift: - bottom_layer = 0 - obj.Anim_Layers.move(index, bottom_layer) - move_layer('BOTTOM', context) - obj.als.layer_index = bottom_layer - else: - obj.Anim_Layers.move(index, index -1) - move_layer('DOWN', context) - obj.als.layer_index -= 1 - subscriptions.subscriptions_add(context.scene) - - return {'FINISHED'} + moved_any = False + try: + max_steps = len(obj.Anim_Layers) if self.shift else 1 + for _ in range(max_steps): + if not _move_subtree_one_step(context, obj, active_name, 'DOWN'): + break + moved_any = True + finally: + idx = obj.Anim_Layers.find(active_name) + if idx != -1: + obj.als.layer_index = idx + subscriptions.subscriptions_add(context.scene) + return {'FINISHED'} if moved_any else {'CANCELLED'} def copy_modifiers(modifier, mod_list): attr = {} @@ -2610,7 +3600,7 @@ class ResetLayerKeyframes(bpy.types.Operator): # fcurves = anim_data.action.fcurves fcurves = get_fcurves(obj, anim_data.action) frame_current = context.scene.frame_current - strip = anim_data.nla_tracks[obj.als.layer_index].strips[0] + strip = anim_data.nla_tracks[nla_idx(obj)].strips[0] frame_current = round(bake_ops.frame_evaluation(frame_current, strip), 3) for fcu in fcurves: @@ -2657,7 +3647,7 @@ class AddAction(bpy.types.Operator): tweak_mode_upper_stack(context, obj, anim_data, enter = False) #If there is no action get the layer name - if anim_data.nla_tracks[obj.als.layer_index].strips[0].action is None: + if anim_data.nla_tracks[nla_idx(obj)].strips[0].action is None: action = bpy.data.actions.new(obj.Anim_Layers[obj.als.layer_index].name) #otherwise get the previous action name else: @@ -2682,7 +3672,7 @@ class RemoveAction(bpy.types.Operator): anim_data = anim_data_type(obj) tweak_mode_upper_stack(context, obj, anim_data, enter = False) - anim_data.nla_tracks[obj.als.layer_index].strips[0].action = None + anim_data.nla_tracks[nla_idx(obj)].strips[0].action = None obj.Anim_Layers[obj.als.layer_index].action = 'None' obj.als.layer_index = obj.als.layer_index @@ -2751,7 +3741,7 @@ def sync_frame_range(context): obj = context.object anim_data = anim_data_type(obj) use_frame_range = False - strip = anim_data.nla_tracks[obj.als.layer_index].strips[0] + strip = anim_data.nla_tracks[nla_idx(obj)].strips[0] layer = obj.Anim_Layers[obj.als.layer_index] action = strip.action action_range = action.frame_range[1] - action.frame_range[0] @@ -2778,7 +3768,7 @@ class InfluenceNextKeyframe(bpy.types.Operator): @classmethod def poll(cls, context): anim_data = anim_data_type(context.object) - return hasattr(anim_data,"nla_tracks") and len(anim_data.nla_tracks[context.object.als.layer_index].strips) + return hasattr(anim_data,"nla_tracks") and len(anim_data.nla_tracks[nla_idx(context.object)].strips) def execute(self, context): @@ -2830,7 +3820,7 @@ class InfluencePrevKeyframe(bpy.types.Operator): @classmethod def poll(cls, context): anim_data = anim_data_type(context.object) - return hasattr(anim_data,"nla_tracks") and len(anim_data.nla_tracks[context.object.als.layer_index].strips) + return hasattr(anim_data,"nla_tracks") and len(anim_data.nla_tracks[nla_idx(context.object)].strips) def execute(self, context): @@ -2882,7 +3872,7 @@ class SelectInfluenceKeys(bpy.types.Operator): @classmethod def poll(cls, context): anim_data = anim_data_type(context.object) - return hasattr(anim_data,"nla_tracks") and len(anim_data.nla_tracks[context.object.als.layer_index].strips) + return hasattr(anim_data,"nla_tracks") and len(anim_data.nla_tracks[nla_idx(context.object)].strips) def execute(self, context): @@ -2930,46 +3920,293 @@ class SyncActionLength(bpy.types.Operator): anim_data = anim_data_type(context.object) if not hasattr(anim_data,"nla_tracks"): return False - if not len(anim_data.nla_tracks[context.object.als.layer_index].strips): + if not len(anim_data.nla_tracks[nla_idx(context.object)].strips): return False - return not anim_data.nla_tracks[context.object.als.layer_index].strips[0].use_sync_length + return not anim_data.nla_tracks[nla_idx(context.object)].strips[0].use_sync_length def execute(self, context): sync_frame_range(context) - return {'FINISHED'} - + return {'FINISHED'} + +class ToggleGroupExpanded(bpy.types.Operator): + """Toggle the expanded/collapsed state of a parent layer's subtree in the UI""" + bl_idname = "anim.toggle_group_expanded" + bl_label = "Toggle Expand" + bl_options = {'REGISTER', 'UNDO'} + + group_name: bpy.props.StringProperty(name='Layer Name', default='') + + def execute(self, context): + obj = context.object + if obj is None: + return {'CANCELLED'} + idx = obj.Anim_Layers.find(self.group_name) + if idx == -1: + return {'CANCELLED'} + obj.Anim_Layers[idx].expanded = not obj.Anim_Layers[idx].expanded + return {'FINISHED'} + +class UnlinkFromParent(bpy.types.Operator): + """Remove this layer from its parent (make it a root). The layer keeps + its NLA neighborhood; unrelated subtrees are not disturbed.""" + bl_idname = "anim.unlink_from_parent" + bl_label = "Unlink From Parent" + bl_options = {'REGISTER', 'UNDO'} + + layer_name: bpy.props.StringProperty(name='Layer Name', default='') + + @classmethod + def poll(cls, context): + return context.object is not None + + def execute(self, context): + obj = context.object + if not self.layer_name: + return {'CANCELLED'} + idx = obj.Anim_Layers.find(self.layer_name) + if idx == -1: + return {'CANCELLED'} + layer = obj.Anim_Layers[idx] + if not layer.parent_layer: + return {'CANCELLED'} # already a root + + layer['parent_layer'] = '' + + subscriptions.subscriptions_remove() + try: + # No priority_name — the unlinked layer stays where it is in NLA; + # we don't want it jumping to the top of the root layers stack. + enforce_subtree_contiguity(obj, context) + finally: + if context.scene is not None: + subscriptions.subscriptions_add(context.scene) + + # Pin selection on the unlinked layer (rows may have shifted). + new_idx = obj.Anim_Layers.find(self.layer_name) + if new_idx != -1: + obj.als.layer_index = new_idx + return {'FINISHED'} + +class LinkToLayer(bpy.types.Operator): + """Make the currently active layer a child of this layer. + + Bound to the `+` button on each row of the UIList. `target_name` is the + layer whose row was clicked. The active layer (obj.Anim_Layers[layer_index]) + gets its parent_layer set to `target_name`. Refuses self-parenting and + cycles. After linking, the active subtree is repositioned so it sits at + the top of `target_name`'s children stack (above any existing children).""" + bl_idname = "anim.link_to_layer" + bl_label = "Link Active Layer As Child" + bl_options = {'REGISTER', 'UNDO'} + + target_name: bpy.props.StringProperty(name='Target Layer', default='') + + @classmethod + def poll(cls, context): + return context.object is not None and active_item(context.object) is not None + + def execute(self, context): + obj = context.object + a = active_item(obj) + if a is None or not self.target_name: + return {'CANCELLED'} + if a.name == self.target_name: + self.report({'WARNING'}, "Can't link a layer to itself") + return {'CANCELLED'} + if obj.Anim_Layers.find(self.target_name) == -1: + self.report({'WARNING'}, f"Layer '{self.target_name}' not found") + return {'CANCELLED'} + if _would_create_cycle(obj, a.name, self.target_name): + self.report({'WARNING'}, "Can't link: target is a descendant of the active layer") + return {'CANCELLED'} + if a.parent_layer == self.target_name: + # Already linked to this parent — no-op rather than an error. + return {'CANCELLED'} + + active_name = a.name + a['parent_layer'] = self.target_name + + # Reorder NLA so the newly-linked layer sits at the top of the + # target's children stack (priority_name), with its subtree contiguous. + subscriptions.subscriptions_remove() + try: + enforce_subtree_contiguity(obj, context, priority_name=active_name) + finally: + if context.scene is not None: + subscriptions.subscriptions_add(context.scene) + + # Pin selection back on the moved layer (its row index has shifted). + idx = obj.Anim_Layers.find(active_name) + if idx != -1: + obj.als.layer_index = idx + return {'FINISHED'} + +class AssignLayerToGroup(bpy.types.Operator): + """Set the active layer's parent layer (empty name = root). Refuses cycles.""" + bl_idname = "anim.assign_layer_to_group" + bl_label = "Set Parent Layer" + bl_options = {'REGISTER', 'UNDO'} + + group_name: bpy.props.StringProperty(name='Parent Name', default='') + + @classmethod + def poll(cls, context): + return context.object is not None and active_item(context.object) is not None + + def execute(self, context): + obj = context.object + a = active_item(obj) + if a is None: + return {'CANCELLED'} + if self.group_name: + if obj.Anim_Layers.find(self.group_name) == -1: + self.report({'WARNING'}, f"Layer '{self.group_name}' not found") + return {'CANCELLED'} + if _would_create_cycle(obj, a.name, self.group_name): + self.report({'WARNING'}, f"Cannot set parent: would create a cycle.") + return {'CANCELLED'} + layer_name = a.name + a['parent_layer'] = self.group_name + # Reorder NLA: the just-linked layer takes the top slot among its + # new siblings (priority_name), with its subtree adjacent to the parent. + subscriptions.subscriptions_remove() + try: + enforce_subtree_contiguity(obj, context, priority_name=layer_name) + finally: + if context.scene is not None: + subscriptions.subscriptions_add(context.scene) + # Pin selection back on the moved layer (visible_layers shuffles rows). + idx = obj.Anim_Layers.find(layer_name) + if idx != -1: + obj.als.layer_index = idx + return {'FINISHED'} + class LAYERS_UL_list(bpy.types.UIList): def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index, reversed): - obj = bpy.context.object + # filter_items below computes the full display order (hierarchical + # walk, newest-first per level), so disable Blender's built-in reverse. + self.use_filter_sort_reverse = False + if self.layout_type not in {'DEFAULT', 'COMPACT'}: + return + + obj = data anim_data = anim_data_type(obj) - nla_tracks = anim_data.nla_tracks - self.use_filter_sort_reverse = True - if self.layout_type in {'DEFAULT', 'COMPACT'}: - row = layout.row(align = True) - icon = 'SOLO_ON' if nla_tracks[index].is_solo else 'SOLO_OFF' - row.prop(nla_tracks[index], 'is_solo', text = '', invert_checkbox=False, icon = icon, emboss=False) - row.prop(item, "name", text="", emboss=False) - - split = row.split(factor=0, align = True) - sub_row_right = row.row(align=True) - sub_row_right.alignment = 'RIGHT' - if len(nla_tracks[index].strips): - blend_type = nla_tracks[index].strips[0].blend_type - sub_row_right.label(text = blend_type[0] + ' ') - # sub_row_right.prop_menu_enum(nla_tracks[index].strips[0], 'blend_type', text = blend_type[0]) - - icon = 'HIDE_ON' if nla_tracks[index].mute else 'HIDE_OFF' - sub_row_right.prop(nla_tracks[index], 'mute', text = '', invert_checkbox=False, icon = icon, emboss=False) - - icon = 'LOCKED' if item.lock else 'UNLOCKED' - sub_row_right.prop(item,'lock', text = '', invert_checkbox=False, icon = icon, emboss=False) - # split = row.split(factor=0, align = True) - - elif self.layout_type in {'GRID'}: - pass + nla_tracks = anim_data.nla_tracks if anim_data else None + + # Depth-based indentation. Computed via parent_layer chain. + depth = len(layer_ancestors(obj, item.name)) + has_children = is_group_layer(obj, item.name) + + row = layout.row(align=True) + for _ in range(depth): + row.label(text='', icon='BLANK1') + + if has_children: + tri = 'TRIA_UP' if item.expanded else 'DISCLOSURE_TRI_RIGHT' + op = row.operator('anim.toggle_group_expanded', text='', icon=tri, emboss=False) + op.group_name = item.name + # else: + # row.label(text='', icon='BLANK1') + + layer_idx = nla_tracks.find(item.name) if nla_tracks else -1 + if nla_tracks is None or layer_idx == -1: + row.prop(item, 'name', text='', emboss=False) + return + + track = nla_tracks[layer_idx] + + # `-` button on child rows (left of solo). Spacer for root rows so the + # solo/name columns stay aligned regardless of hierarchy depth. + if item.parent_layer: + unlink_op = row.operator('anim.unlink_from_parent', text='', icon='REMOVE', emboss=False) + unlink_op.layer_name = item.name + # else: + # row.label(text='', icon='BLANK1') + + solo_icon = 'SOLO_ON' if track.is_solo else 'SOLO_OFF' + row.prop(track, 'is_solo', text='', invert_checkbox=False, icon=solo_icon, emboss=False) + row.prop(item, "name", text="", emboss=False) + + sub_row_right = row.row(align=True) + sub_row_right.alignment = 'RIGHT' + # `+` button: re-parent the currently-active layer under this row's layer. + link_op = sub_row_right.operator('anim.link_to_layer', text='', icon='ADD', emboss=False) + link_op.target_name = item.name - # def invoke(self, context, event): - # pass + if len(track.strips): + blend_type = track.strips[0].blend_type + sub_row_right.label(text=blend_type[0] + ' ') + + + # Bind mute to item.mute (not track.mute) so the layer_mute update + # callback fires and cascades to descendants. layer_mute keeps + # track.mute in sync. + mute_icon = 'HIDE_ON' if item.mute else 'HIDE_OFF' + sub_row_right.prop(item, 'mute', text='', invert_checkbox=False, icon=mute_icon, emboss=False) + lock_icon = 'LOCKED' if item.lock else 'UNLOCKED' + sub_row_right.prop(item, 'lock', text='', invert_checkbox=False, icon=lock_icon, emboss=False) + + def filter_items(self, context, data, propname): + items = getattr(data, propname) + n = len(items) + flt_flags = [self.bitflag_filter_item] * n + + # Build parent → list-of-child-indices map (NLA-index ascending, since + # collection order == NLA order). Sort descending below for "newest-first" UI. + children_by_parent = {} + name_to_idx = {} + for i, it in enumerate(items): + name_to_idx[it.name] = i + children_by_parent.setdefault(it.parent_layer, []).append(i) + for plist in children_by_parent.values(): + plist.sort(reverse=True) # highest NLA index first per level + + # Hide descendants of any collapsed parent. + collapsed = set() + for i, it in enumerate(items): + if not it.expanded and children_by_parent.get(it.name): + collapsed.add(it.name) + if collapsed: + for i, it in enumerate(items): + cur = it + while cur.parent_layer: + if cur.parent_layer in collapsed: + flt_flags[i] &= ~self.bitflag_filter_item + break + pidx = name_to_idx.get(cur.parent_layer) + if pidx is None: + break + cur = items[pidx] + + # Visual order: depth-first walk where each parent emits its + # descendants (newest-first per level) BEFORE itself. Result is + # children above their parent in the UI list, matching the + # "parent at lowest NLA index of its subtree" invariant. + visual_order = [] + visited = set() + + def emit_subtree(idx): + if idx in visited: + return + visited.add(idx) + it = items[idx] + for child_idx in children_by_parent.get(it.name, []): + emit_subtree(child_idx) + visual_order.append(idx) + + for root_idx in children_by_parent.get('', []): + emit_subtree(root_idx) + + # Orphans (parent_layer set but parent missing): emit by NLA-descending index. + leftover = [i for i in range(n) if i not in visited] + leftover.sort(reverse=True) + for i in leftover: + visual_order.append(i) + + neworder = [0] * n + for display_pos, original_idx in enumerate(visual_order): + neworder[original_idx] = display_pos + return flt_flags, neworder def panelFactory(space_type): '''Adding Anim layers panel to different space types''' @@ -3009,8 +4246,8 @@ def panelFactory(space_type): split.label(text = 'Data Type:') split.prop(obj.als, 'data_type', text ='') - row = layout.row() - row.template_list("LAYERS_UL_list", "", context.object, "Anim_Layers", context.object.als, "layer_index", rows=2) + row = layout.row() + row.template_list("LAYERS_UL_list", "", context.object, "Anim_Layers", context.object.als, "layer_index", rows=2) col = row.column(align=True) col.operator('anim.add_anim_layer', text="", icon = 'ADD') col.operator('anim.remove_anim_layer', text="", icon = 'REMOVE') @@ -3021,17 +4258,21 @@ def panelFactory(space_type): if not hasattr(anim_data, 'nla_tracks') or not len(obj.Anim_Layers):# or obj.Anim_Layers[obj.als.layer_index].lock: return - track = anim_data.nla_tracks[obj.als.layer_index] - + # Skip layer-specific controls when the active row is a group header. + if not is_layer_row_active(obj): + return + + track = anim_data.nla_tracks[nla_idx(obj)] + # col=layout.column(align = True) - row = layout.row(align = True) - + row = layout.row(align = True) + if not len(track.strips): return strip = track.strips[0] if not len(strip.fcurves): return - + #Drawing the influence slider if len(strip.fcurves[0].keyframe_points) and not strip.fcurves[0].mute: row.prop(strip, 'influence', slider = True, text = 'Influence') @@ -3085,11 +4326,13 @@ def panelFactory(space_type): anim_data = anim_data_type(obj) if not hasattr(anim_data, 'nla_tracks') or not len(obj.Anim_Layers):# or obj.Anim_Layers[obj.als.layer_index].lock: return - layout = self.layout + if not is_layer_row_active(obj): + return + layout = self.layout merge_layers = layout.column() #merge_layers.operator("anim.layers_merge_down", text="New Baked Layer", icon = 'NLA') merge_layers.operator("anim.layers_merge_down", text="Merge / Bake", icon = 'NLA_PUSHDOWN') - + duplicateanimlayer = layout.row(align=True) duplicateanimlayer.operator('anim.duplicate_anim_layer', text="Duplicate Layer", icon = 'SEQ_STRIP_DUPLICATE') icon = 'LINKED' if obj.als.linked else 'UNLINKED' @@ -3112,6 +4355,8 @@ def panelFactory(space_type): return if not obj.als.turn_on: return + if not is_layer_row_active(obj): + return if len(obj.Anim_Layers): if obj.Anim_Layers[obj.als.layer_index].lock: return @@ -3181,20 +4426,35 @@ def panelFactory(space_type): # if len(obj.Anim_Layers): # if obj.Anim_Layers[obj.als.layer_index].lock: # return - + anim_data = anim_data_type(obj) if not hasattr(anim_data, 'nla_tracks'): return - nla_tracks = anim_data.nla_tracks + nla_tracks = anim_data.nla_tracks if not len(nla_tracks): return - track = nla_tracks[obj.als.layer_index] + + layout = self.layout + + track = nla_tracks[nla_idx(obj)] strip = track.strips[0] if len(track.strips) else anim_data layer = obj.Anim_Layers[obj.als.layer_index] - layout = self.layout + + # Parent assignment dropdown. Shown whenever there's more than one + # layer (so there's a potential parent to pick). + if len(obj.Anim_Layers) > 1: + grp_box = layout.box() + row = grp_box.row(align=True) + row.label(text='Parent:', icon='OUTLINER_COLLECTION') + row.prop(layer, 'assigned_group', text='') + if is_group_layer(obj, layer.name): + desc_count = len(layer_descendants(obj, layer.name)) + grp_box.prop(layer, 'group_color', text='Group Color') + grp_box.label(text=f"{desc_count} descendant layer(s)") + box = layout.box() - if anim_data is not None: + if anim_data is not None: row = box.row(align = True) split = box.split(factor=0.3, align = True) # row.alignment = 'CENTER' @@ -3409,8 +4669,9 @@ def remove_empty_slots(action): classes = (AutoCustomFrameRange, ResetLayerKeyframes, LAYERS_UL_list, AddAnimLayer, ExtractSelection, ExtractMarkers, DuplicateAnimLayer, RemoveAnimLayer, CyclicFcurves, RemoveFcurves, MoveAnimLayerUp, - MoveAnimLayerDown, SelectBonesInLayer, ClearNLA, ClearActiveAction, OverrideError, AddAction, SyncActionLength, RemoveAction, ShareLayerKeys, SelectInfluenceKeys, - AddSlot, RemoveSlot, EditAllLayersOperator, InfluencePrevKeyframe, InfluenceNextKeyframe) + MoveAnimLayerDown, SelectBonesInLayer, ClearNLA, ClearActiveAction, OverrideError, AddAction, SyncActionLength, RemoveAction, ShareLayerKeys, SelectInfluenceKeys, + AddSlot, RemoveSlot, EditAllLayersOperator, InfluencePrevKeyframe, InfluenceNextKeyframe, + ToggleGroupExpanded, AssignLayerToGroup, LinkToLayer, UnlinkFromParent) spaceTypes = ['VIEW_3D', 'GRAPH_EDITOR', 'DOPESHEET_EDITOR', 'NLA_EDITOR'] # panel_classes = (cls for spaceType in spaceTypes for cls in panelFactory(spaceType)) diff --git a/scripts/addons/Animation_Layers/animation_layers_updater/backup/animation_layers_updater/Animation_Layers_updater_status.json b/scripts/addons/Animation_Layers/animation_layers_updater/backup/animation_layers_updater/Animation_Layers_updater_status.json index dbe7df9..47e3e89 100644 --- a/scripts/addons/Animation_Layers/animation_layers_updater/backup/animation_layers_updater/Animation_Layers_updater_status.json +++ b/scripts/addons/Animation_Layers/animation_layers_updater/backup/animation_layers_updater/Animation_Layers_updater_status.json @@ -1,16 +1,16 @@ { - "last_check": "2026-05-27 14:41:11.263249", - "backup_date": "April-21-2026", + "last_check": "2026-07-14 14:42:39.577911", + "backup_date": "May-27-2026", "update_ready": true, "ignore": false, "just_restored": false, "just_updated": false, "version_text": { - "link": "https://gitlab.com/api/v4/projects/22294607/repository/archive.zip?sha=321d411a449bc9acee2a759e30cd3d0f36bbd2ab", + "link": "https://gitlab.com/api/v4/projects/22294607/repository/archive.zip?sha=e32318861bdc35e0b02381eb2119f4492051027d", "version": [ 2, 4, - 1 + 2 ] } } \ No newline at end of file diff --git a/scripts/addons/Animation_Layers/animation_layers_updater/backup/bake_ops.py b/scripts/addons/Animation_Layers/animation_layers_updater/backup/bake_ops.py index 7700712..45b4fb0 100644 --- a/scripts/addons/Animation_Layers/animation_layers_updater/backup/bake_ops.py +++ b/scripts/addons/Animation_Layers/animation_layers_updater/backup/bake_ops.py @@ -180,10 +180,11 @@ def smart_bake(context): fcurves = anim_layers.get_fcurves(obj, track.strips[0].action) total_iterations += len(fcurves) - wm.progress_begin(0, total_iterations) + wm.progress_begin(0, total_iterations) processed = 0 - for layer, track in zip(obj.Anim_Layers, anim_data.nla_tracks): + layer_items = [l for l in obj.Anim_Layers if l.type == 'LAYER'] + for layer, track in zip(layer_items, anim_data.nla_tracks): if track.mute: continue if len(track.strips) != 1 or track.strips[0].action is None: @@ -242,9 +243,9 @@ def smart_bake(context): smartkeys = smart_start_end(smartkeys, strip.frame_start, strip.frame_end) smartkeys = remove_outofrange_keys(smartkeys, strip.frame_start, strip.frame_end) - #if the strip is cutting with a different strip, then add keyframes in the cut + #if the strip is cutting with a different strip, then add keyframes in the cut for layercut in obj.Anim_Layers: - if layercut.mute or not layercut.custom_frame_range or layercut == layer: + if layercut.type == 'GROUP' or layercut.mute or not layercut.custom_frame_range or layercut == layer: continue if strip_start < layercut.frame_start < strip_end: smartkeys = smart_start_end(smartkeys, (layercut.frame_start-1), strip.frame_end-1) @@ -407,7 +408,7 @@ def unmute_modifiers(obj, nla_tracks, modifier_rec): for mod in fcu.modifiers: if mod in modifier_rec: mod.mute = False - elif obj.als.mergefcurves and track == nla_tracks[obj.als.layer_index]: + elif obj.als.mergefcurves and track == nla_tracks[anim_layers.nla_idx(obj)]: mod.mute = True def invisible_layers(b_layers): @@ -426,7 +427,14 @@ def select_keyframed_bones(self, context, obj): if obj.mode != 'POSE': bpy.ops.object.posemode_toggle() bpy.ops.pose.select_all(action='DESELECT') - for i in range(0, obj.als.layer_index+1): + # Iterate over LAYER rows up to (and including) the active row, skipping + # group headers (they have no NLA track and no bones to select). + current_row = obj.als.layer_index + for i, it in enumerate(obj.Anim_Layers): + if i > current_row: + break + if it.type != 'LAYER': + continue obj.als['layer_index'] = i anim_layers.select_layer_bones(self, context) @@ -446,7 +454,7 @@ def smartbake_apply(obj, nla_tracks, fcu_keys, extrapolations): #apply smartbake for blenders bake #smart bake - delete unnecessery keyframes: # transform_types = ['location', 'rotation_euler', 'rotation_quaternion', 'scale'] - strip = nla_tracks[obj.als.layer_index].strips[0] + strip = nla_tracks[anim_layers.nla_idx(obj)].strips[0] # if strip.action is None: # return @@ -641,7 +649,7 @@ def AL_bake(frame_start, frame_end, nla_tracks, fcu_keys, additive, step, action return anim_data = anim_layers.anim_data_type(obj) # baked_action = anim_data.action - track = nla_tracks[obj.als.layer_index] + track = nla_tracks[anim_layers.nla_idx(obj)] baked_action = track.strips[0].action clean_no_user_slots(baked_action) #create the baked fcurve @@ -1065,10 +1073,18 @@ class MergeAnimLayerDown(bpy.types.Operator): bl_idname = "anim.layers_merge_down" bl_label = "Merge_Layers_Down" bl_options = {'REGISTER', 'UNDO'} - + step: bpy.props.IntProperty(name='Step', description='Bake every number of frame steps', default=1) actioncopy: bpy.props.BoolProperty(name='Copy original merged action', description='Create a copy of the original action that is being overwritten', default = False) + @classmethod + def poll(cls, context): + obj = context.object + if obj is None: + return False + # Disable when active row is a group header — merge only applies to NLA-backed layers. + return anim_layers.is_layer_row_active(obj) + def invoke(self, context, event): obj = context.object bake_range_type(context.scene.als, context) @@ -1143,7 +1159,8 @@ class MergeAnimLayerDown(bpy.types.Operator): # Incase the strips are shorter then the keyframe range (because scene is shorter) # Then updating the strips length - for layer, track in zip(obj.Anim_Layers, anim_data.nla_tracks): + layer_items = [l for l in obj.Anim_Layers if l.type == 'LAYER'] + for layer, track in zip(layer_items, anim_data.nla_tracks): if layer.custom_frame_range: continue if len(track.strips) != 1: @@ -1181,7 +1198,7 @@ class MergeAnimLayerDown(bpy.types.Operator): if obj.als.direction == 'DOWN': obj.als.layer_index = 0 baked_layer = None - strip = anim_data.nla_tracks[obj.als.layer_index].strips[0] + strip = anim_data.nla_tracks[anim_layers.nla_idx(obj)].strips[0] action = strip.action if hasattr(strip, 'action_slot'): action_slot = strip.action_slot @@ -1190,21 +1207,29 @@ class MergeAnimLayerDown(bpy.types.Operator): #if baking to a new layer then setup the new index and layer elif obj.als.operator == 'NEW': self.actioncopy = False + # `add_at_nla` is the NLA-track index passed to add_animlayer. if obj.als.direction == 'UP' and additive and 'REPLACE' in blendings: - obj.als.layer_index = layer_index + blendings.index('REPLACE') - 1 + add_at_nla = layer_index + blendings.index('REPLACE') - 1 elif obj.als.direction == 'UP' or obj.als.direction == 'ALL': - obj.als.layer_index = len(obj.Anim_Layers)-1 + add_at_nla = anim_layers.nla_layer_count(obj) - 1 + else: + add_at_nla = anim_layers.nla_idx(obj) - layer_names = [layer.name for layer in obj.Anim_Layers] - baked_layer = anim_layers.add_animlayer(layer_name = anim_layers.unique_name(layer_names, 'Baked_Layer') , duplicate = False, index = obj.als.layer_index, blend_type = blend) + layer_names = [layer.name for layer in obj.Anim_Layers if layer.type == 'LAYER'] + baked_layer = anim_layers.add_animlayer(layer_name = anim_layers.unique_name(layer_names, 'Baked_Layer') , duplicate = False, index = add_at_nla, blend_type = blend) anim_layers.register_layers(obj, nla_tracks) - - obj.als.layer_index += 1 + + # Point layer_index at the newly-added baked layer's collection row. + if baked_layer is not None: + for ridx, it in enumerate(obj.Anim_Layers): + if it.type == 'LAYER' and it.name == baked_layer.name: + obj.als.layer_index = ridx + break #remove subsciption again after adding a layer there was new subsciption applied subscriptions.subscriptions_remove() - track = nla_tracks[obj.als.layer_index] + track = nla_tracks[anim_layers.nla_idx(obj)] #use internal bake if obj.als.baketype =='NLA': modifier_rec, extrapolations = mute_modifiers(obj, nla_tracks) @@ -1282,7 +1307,7 @@ class MergeAnimLayerDown(bpy.types.Operator): strip.action_slot = anim_layers.get_obj_slot(obj, action) #reset layer settings - baked_layer = obj.Anim_Layers[obj.als.layer_index] + baked_layer = obj.Anim_Layers[obj.als.layer_index] baked_layer.repeat, baked_layer.speed, baked_layer.offset = 1, 1, 0 strip.use_sync_length = False if baked_layer.custom_frame_range: diff --git a/scripts/addons/Animation_Layers/animation_layers_updater/backup/subscriptions.py b/scripts/addons/Animation_Layers/animation_layers_updater/backup/subscriptions.py index dcf4fff..4eb2094 100644 --- a/scripts/addons/Animation_Layers/animation_layers_updater/backup/subscriptions.py +++ b/scripts/addons/Animation_Layers/animation_layers_updater/backup/subscriptions.py @@ -106,7 +106,10 @@ def animlayers_frame(scene, context): if len(track.strips) != 1: continue #checks if the layer has a custom frame range - layer = obj.Anim_Layers[i] + row_idx = anim_layers.layer_to_row_index(obj, i) + if row_idx < 0 or row_idx >= len(obj.Anim_Layers): + continue + layer = obj.Anim_Layers[row_idx] if layer.custom_frame_range: continue if not reset_subscription: @@ -169,6 +172,10 @@ def check_handler(scene): return anim_layers.add_obj_to_animlayers(obj, [item.object for item in scene.AL_objects]) nla_tracks = anim_data.nla_tracks + # When the active UIList row is a group header (no NLA track of its own), + # skip the LAYER-specific syncs below — they assume a real layer. + if not anim_layers.is_layer_row_active(obj): + return layer = obj.Anim_Layers[obj.als.layer_index] active_action_update(obj, anim_data, nla_tracks) #check if a keyframe was removed @@ -189,7 +196,7 @@ def check_handler(scene): if track_layer_synchronization(obj, nla_tracks): return - track = nla_tracks[obj.als.layer_index] + track = nla_tracks[anim_layers.nla_idx(obj)] sync_frame_range(scene, track, layer) # sync_strip_range(scene) @@ -217,18 +224,20 @@ def check_handler(scene): anim_layers.hide_view_all_keyframes(obj, anim_data) check_selected_bones(obj) - influence_check(nla_tracks[obj.als.layer_index]) + influence_check(nla_tracks[anim_layers.nla_idx(obj)]) def track_layer_synchronization(obj, nla_tracks): '''check if track and layers are synchronized, running only when adding/removing tracks via the nla''' - if len(nla_tracks) == len(obj.Anim_Layers): + if len(nla_tracks) == anim_layers.nla_layer_count(obj): return False - - new_layers_names = set(track.name for track in nla_tracks).difference(set(layer.name for layer in obj.Anim_Layers)) + + layer_items = [layer for layer in obj.Anim_Layers if layer.type == 'LAYER'] + new_layers_names = set(track.name for track in nla_tracks).difference(set(layer.name for layer in layer_items)) anim_layers.visible_layers(obj, nla_tracks) - if obj.als.layer_index > len(obj.Anim_Layers)-1: - obj.als.layer_index = len(obj.Anim_Layers)-1 + row_count = len(obj.Anim_Layers) + if row_count and obj.als.layer_index > row_count - 1: + obj.als.layer_index = row_count - 1 if not bpy.context.preferences.addons[__package__].preferences.auto_custom_range: return @@ -261,9 +270,9 @@ def active_action_update(obj, anim_data, nla_tracks): anim_data.action = None subscriptions_add(bpy.context.scene) return - if anim_data.action == nla_tracks[obj.als.layer_index].strips[0].action: + if anim_data.action == nla_tracks[anim_layers.nla_idx(obj)].strips[0].action: return - if not len(nla_tracks[obj.als.layer_index].strips): + if not len(nla_tracks[anim_layers.nla_idx(obj)].strips): return if not anim_data.action or anim_data.is_property_readonly('action'): return @@ -434,7 +443,7 @@ def influence_sync(scene, obj, nla_tracks): if action.name == scene.name + 'Action' and not len(scene.animation_data.nla_tracks) and not len(fcurves): bpy.data.actions.remove(action) - strip = nla_tracks[obj.als.layer_index].strips[0] + strip = nla_tracks[anim_layers.nla_idx(obj)].strips[0] if strip.fcurves[0].mute: return strip.fcurves[0].lock = False @@ -546,9 +555,10 @@ def frameend_update_callback(): for anim_data in anim_datas: if anim_data is None: continue - if len(anim_data.nla_tracks) != len(obj.Anim_Layers): + if len(anim_data.nla_tracks) != anim_layers.nla_layer_count(obj): continue - for layer, track in zip(obj.Anim_Layers, anim_data.nla_tracks): + layer_items = [l for l in obj.Anim_Layers if l.type == 'LAYER'] + for layer, track in zip(layer_items, anim_data.nla_tracks): if layer.custom_frame_range: continue if len(track.strips) != 1: @@ -653,10 +663,12 @@ def action_name_callback(): nla_tracks = anim_data.nla_tracks if not len(nla_tracks): return - layer = obj.Anim_Layers[obj.als.layer_index] - if not len(nla_tracks[obj.als.layer_index].strips): + if not anim_layers.is_layer_row_active(obj): return - action = nla_tracks[obj.als.layer_index].strips[0].action + layer = obj.Anim_Layers[obj.als.layer_index] + if not len(nla_tracks[anim_layers.nla_idx(obj)].strips): + return + action = nla_tracks[anim_layers.nla_idx(obj)].strips[0].action if action is None: return if not obj.als.auto_rename or layer.name == action.name: @@ -774,10 +786,10 @@ def slot_update_callback(): if not len(obj.Anim_Layers): return - if not len(anim_data.nla_tracks[obj.als.layer_index].strips): + if not len(anim_data.nla_tracks[anim_layers.nla_idx(obj)].strips): return - strip = anim_data.nla_tracks[obj.als.layer_index].strips[0] + strip = anim_data.nla_tracks[anim_layers.nla_idx(obj)].strips[0] anim_data.action_slot = strip.action_slot @@ -848,9 +860,11 @@ def strip_settings_callback(): return # sync_strip_range() - if not len(anim_data.nla_tracks[obj.als.layer_index].strips): + if not anim_layers.is_layer_row_active(obj): return - strip = anim_data.nla_tracks[obj.als.layer_index].strips[0] + if not len(anim_data.nla_tracks[anim_layers.nla_idx(obj)].strips): + return + strip = anim_data.nla_tracks[anim_layers.nla_idx(obj)].strips[0] layer = obj.Anim_Layers[obj.als.layer_index] update_strip_layer_settings(strip, layer) diff --git a/scripts/addons/Animation_Layers/animation_layers_updater/update_staging/source.zip b/scripts/addons/Animation_Layers/animation_layers_updater/update_staging/source.zip index 763d310..ef73dc2 100644 --- a/scripts/addons/Animation_Layers/animation_layers_updater/update_staging/source.zip +++ b/scripts/addons/Animation_Layers/animation_layers_updater/update_staging/source.zip @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:436a61a1fdd7fb3b4b25185ec8425b63ee519e4413d81cf4f9c2c102ae3355b7 -size 99665 +oid sha256:899d8493fccb5963ef9f59fd202c1a5ac0ce5ef1bda094afad2e5d6d3b382e08 +size 105170 diff --git a/scripts/addons/Animation_Layers/bake_ops.py b/scripts/addons/Animation_Layers/bake_ops.py index 45b4fb0..feb797f 100644 --- a/scripts/addons/Animation_Layers/bake_ops.py +++ b/scripts/addons/Animation_Layers/bake_ops.py @@ -183,7 +183,7 @@ def smart_bake(context): wm.progress_begin(0, total_iterations) processed = 0 - layer_items = [l for l in obj.Anim_Layers if l.type == 'LAYER'] + layer_items = [l for l in obj.Anim_Layers if l.type == 'LAYER' and not l.not_usable] for layer, track in zip(layer_items, anim_data.nla_tracks): if track.mute: continue @@ -433,7 +433,7 @@ def select_keyframed_bones(self, context, obj): for i, it in enumerate(obj.Anim_Layers): if i > current_row: break - if it.type != 'LAYER': + if it.type != 'LAYER' or it.not_usable: continue obj.als['layer_index'] = i anim_layers.select_layer_bones(self, context) @@ -1141,12 +1141,17 @@ class MergeAnimLayerDown(bpy.types.Operator): return {'CANCELLED'} anim_data = anim_layers.anim_data_type(obj) nla_tracks = anim_data.nla_tracks - - if obj.als.direction == 'DOWN' and not obj.als.layer_index: + + # Track-space index of the active layer (skips not_usable rows). + nla_index = anim_layers.nla_idx(obj) + if nla_index == -1: + return {'CANCELLED'} + + if obj.als.direction == 'DOWN' and not nla_index: return {'CANCELLED'} #disable baking up from Blender's bake - if obj.als.direction == 'UP' and obj.als.layer_index == len(nla_tracks)-1: + if obj.als.direction == 'UP' and nla_index == len(nla_tracks)-1: return {'CANCELLED'} if obj.als.baketype == 'NLA': @@ -1159,7 +1164,7 @@ class MergeAnimLayerDown(bpy.types.Operator): # Incase the strips are shorter then the keyframe range (because scene is shorter) # Then updating the strips length - layer_items = [l for l in obj.Anim_Layers if l.type == 'LAYER'] + layer_items = [l for l in obj.Anim_Layers if l.type == 'LAYER' and not l.not_usable] for layer, track in zip(layer_items, anim_data.nla_tracks): if layer.custom_frame_range: continue @@ -1175,7 +1180,7 @@ class MergeAnimLayerDown(bpy.types.Operator): if context.scene.frame_current > frame_end: context.scene.frame_current = frame_end - layer_index = obj.als.layer_index + layer_index = nla_index blendings = [track.strips[0].blend_type for track in nla_tracks[layer_index:] if len(track.strips) == 1] #define if the new baked layer is going to be additive or replace diff --git a/scripts/addons/Animation_Layers/blender_manifest.toml b/scripts/addons/Animation_Layers/blender_manifest.toml new file mode 100644 index 0000000..84f9f2d --- /dev/null +++ b/scripts/addons/Animation_Layers/blender_manifest.toml @@ -0,0 +1,75 @@ +schema_version = "1.0.0" + +# Example of manifest file for a Blender extension +# Change the values according to your extension +id = "animation_layers" +version = "2.4.1" +name = "Animation Layers" +tagline = "Simplifying the NLA editor into an animation layers UI and workflow" +maintainer = "Tal Hershkovich " +# Supported types: "add-on", "theme" +type = "add-on" + +# # Optional: link to documentation, support, source files, etc +website = "https://blendermarket.com/products/animation-layers/docs" + +# Tag list defined by Blender and server, see: +# https://docs.blender.org/manual/en/dev/advanced/extensions/tags.html +tags = ["Animation"] + +blender_version_min = "4.2.0" +# # Optional: Blender version that the extension does not support, earlier versions are supported. +# # This can be omitted and defined later on the extensions platform if an issue is found. +# blender_version_max = "5.1.0" + +# License conforming to https://spdx.org/licenses/ (use "SPDX: prefix) +# https://docs.blender.org/manual/en/dev/advanced/extensions/licenses.html +license = [ + "SPDX:GPL-3.0-or-later", +] +# # Optional: required by some licenses. +# copyright = [ +# "2002-2024 Developer Name", +# "1998 Company Name", +# ] + +# # Optional: list of supported platforms. If omitted, the extension will be available in all operating systems. +# platforms = ["windows-x64", "macos-arm64", "linux-x64"] +# # Other supported platforms: "windows-arm64", "macos-x64" + +# # Optional: bundle 3rd party Python modules. +# # https://docs.blender.org/manual/en/dev/advanced/extensions/python_wheels.html +# wheels = [ +# "./wheels/hexdump-3.3-py3-none-any.whl", +# "./wheels/jsmin-3.0.1-py3-none-any.whl", +# ] + +# # Optional: add-ons can list which resources they will require: +# # * files (for access of any filesystem operations) +# # * network (for internet access) +# # * clipboard (to read and/or write the system clipboard) +# # * camera (to capture photos and videos) +# # * microphone (to capture audio) +# # +# # If using network, remember to also check `bpy.app.online_access` +# # https://docs.blender.org/manual/en/dev/advanced/extensions/addons.html#internet-access +# # +# # For each permission it is important to also specify the reason why it is required. +# # Keep this a single short sentence without a period (.) at the end. +# # For longer explanations use the documentation or detail page. +# +# [permissions] +# network = "Need to sync motion-capture data to server" +# files = "Import/export FBX from/to disk" +# clipboard = "Copy and paste bone transforms" + +# Build settings — exclude the bundled addon-updater (Blender's extension system +# handles updates), runtime caches, and the updater's own backup folder. +# https://docs.blender.org/manual/en/dev/advanced/extensions/command_line_arguments.html#command-line-args-extension-build +[build] +paths_exclude_pattern = [ + "__pycache__/", + "/.git/", + "/*.zip", + "/animation_layers_updater/", +] \ No newline at end of file diff --git a/scripts/addons/Animation_Layers/subscriptions.py b/scripts/addons/Animation_Layers/subscriptions.py index 4eb2094..2e0d218 100644 --- a/scripts/addons/Animation_Layers/subscriptions.py +++ b/scripts/addons/Animation_Layers/subscriptions.py @@ -196,7 +196,10 @@ def check_handler(scene): if track_layer_synchronization(obj, nla_tracks): return - track = nla_tracks[anim_layers.nla_idx(obj)] + nla_index = anim_layers.nla_idx(obj) + if nla_index == -1: + return + track = nla_tracks[nla_index] sync_frame_range(scene, track, layer) # sync_strip_range(scene) @@ -223,8 +226,8 @@ def check_handler(scene): if obj.als.view_all_keyframes: anim_layers.hide_view_all_keyframes(obj, anim_data) check_selected_bones(obj) - - influence_check(nla_tracks[anim_layers.nla_idx(obj)]) + + influence_check(track) def track_layer_synchronization(obj, nla_tracks): '''check if track and layers are synchronized, running only when adding/removing tracks via the nla''' @@ -270,9 +273,10 @@ def active_action_update(obj, anim_data, nla_tracks): anim_data.action = None subscriptions_add(bpy.context.scene) return - if anim_data.action == nla_tracks[anim_layers.nla_idx(obj)].strips[0].action: + nla_idx = anim_layers.nla_idx(obj) + if nla_idx == -1 or not len(nla_tracks[nla_idx].strips): return - if not len(nla_tracks[anim_layers.nla_idx(obj)].strips): + if anim_data.action == nla_tracks[nla_idx].strips[0].action: return if not anim_data.action or anim_data.is_property_readonly('action'): return @@ -443,7 +447,10 @@ def influence_sync(scene, obj, nla_tracks): if action.name == scene.name + 'Action' and not len(scene.animation_data.nla_tracks) and not len(fcurves): bpy.data.actions.remove(action) - strip = nla_tracks[anim_layers.nla_idx(obj)].strips[0] + nla_index = anim_layers.nla_idx(obj) + if nla_index == -1 or not len(nla_tracks[nla_index].strips): + return + strip = nla_tracks[nla_index].strips[0] if strip.fcurves[0].mute: return strip.fcurves[0].lock = False @@ -557,7 +564,7 @@ def frameend_update_callback(): continue if len(anim_data.nla_tracks) != anim_layers.nla_layer_count(obj): continue - layer_items = [l for l in obj.Anim_Layers if l.type == 'LAYER'] + layer_items = [l for l in obj.Anim_Layers if l.type == 'LAYER' and not l.not_usable] for layer, track in zip(layer_items, anim_data.nla_tracks): if layer.custom_frame_range: continue @@ -617,15 +624,22 @@ def track_update_callback(): if not len(nla_tracks):# or len(nla_tracks[:-1]) != len(obj.Anim_Layers): return override_tracks = anim_layers.check_override_tracks(obj, anim_data) + # Pair each track with its layer row, skipping not_usable rows (layers + # from a linked source file without a track) so names don't shift onto + # the wrong row. + layer_rows = [it for it in obj.Anim_Layers if not it.not_usable] for i, track in enumerate(nla_tracks): if anim_data != current_anim_data: continue + if i >= len(layer_rows): + break + layer = layer_rows[i] #make sure there are no duplicated names - if track.name != obj.Anim_Layers[i].name: + if track.name != layer.name: #If its an override track, then make sure the reference object name is also synchronized - if obj.Anim_Layers[i].name in override_tracks: - override_tracks[obj.Anim_Layers[i].name].name = track.name - obj.Anim_Layers[i].name = track.name + if layer.name in override_tracks: + override_tracks[layer.name].name = track.name + layer.name = track.name if len(track.strips) == 1: track.strips[0].name = track.name @@ -666,9 +680,10 @@ def action_name_callback(): if not anim_layers.is_layer_row_active(obj): return layer = obj.Anim_Layers[obj.als.layer_index] - if not len(nla_tracks[anim_layers.nla_idx(obj)].strips): + nla_index = anim_layers.nla_idx(obj) + if nla_index == -1 or not len(nla_tracks[nla_index].strips): return - action = nla_tracks[anim_layers.nla_idx(obj)].strips[0].action + action = nla_tracks[nla_index].strips[0].action if action is None: return if not obj.als.auto_rename or layer.name == action.name: @@ -709,7 +724,9 @@ def influence_update_callback(): return if not len(anim_data.nla_tracks): return - i = obj.als.layer_index + i = anim_layers.nla_idx(obj) + if i == -1: + return track = anim_data.nla_tracks[i] if len(track.strips) != 1: return @@ -786,10 +803,11 @@ def slot_update_callback(): if not len(obj.Anim_Layers): return - if not len(anim_data.nla_tracks[anim_layers.nla_idx(obj)].strips): + nla_index = anim_layers.nla_idx(obj) + if nla_index == -1 or not len(anim_data.nla_tracks[nla_index].strips): return - strip = anim_data.nla_tracks[anim_layers.nla_idx(obj)].strips[0] + strip = anim_data.nla_tracks[nla_index].strips[0] anim_data.action_slot = strip.action_slot @@ -862,9 +880,10 @@ def strip_settings_callback(): # sync_strip_range() if not anim_layers.is_layer_row_active(obj): return - if not len(anim_data.nla_tracks[anim_layers.nla_idx(obj)].strips): + nla_index = anim_layers.nla_idx(obj) + if nla_index == -1 or not len(anim_data.nla_tracks[nla_index].strips): return - strip = anim_data.nla_tracks[anim_layers.nla_idx(obj)].strips[0] + strip = anim_data.nla_tracks[nla_index].strips[0] layer = obj.Anim_Layers[obj.als.layer_index] update_strip_layer_settings(strip, layer) diff --git a/scripts/addons/addon.py b/scripts/addons/addon.py deleted file mode 100644 index 28e0905..0000000 --- a/scripts/addons/addon.py +++ /dev/null @@ -1,1858 +0,0 @@ -# Code created by Siddharth Ahuja: www.github.com/ahujasid © 2025 - -import bpy -import mathutils -import json -import threading -import socket -import time -import requests -import tempfile -import traceback -import os -import shutil -import zipfile -from bpy.props import StringProperty, IntProperty, BoolProperty, EnumProperty -import io -from contextlib import redirect_stdout, suppress - -bl_info = { - "name": "Blender MCP", - "author": "BlenderMCP", - "version": (1, 2), - "blender": (3, 0, 0), - "location": "View3D > Sidebar > BlenderMCP", - "description": "Connect Blender to Claude via MCP", - "category": "Interface", -} - -RODIN_FREE_TRIAL_KEY = "k9TcfFoEhNd9cCPP2guHAHHHkctZHIRhZDywZ1euGUXwihbYLpOjQhofby80NJez" - -# Add User-Agent as required by Poly Haven API -REQ_HEADERS = requests.utils.default_headers() -REQ_HEADERS.update({"User-Agent": "blender-mcp"}) - -class BlenderMCPServer: - def __init__(self, host='localhost', port=9876): - self.host = host - self.port = port - self.running = False - self.socket = None - self.server_thread = None - - def start(self): - if self.running: - print("Server is already running") - return - - self.running = True - - try: - # Create socket - self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - self.socket.bind((self.host, self.port)) - self.socket.listen(1) - - # Start server thread - self.server_thread = threading.Thread(target=self._server_loop) - self.server_thread.daemon = True - self.server_thread.start() - - print(f"BlenderMCP server started on {self.host}:{self.port}") - except Exception as e: - print(f"Failed to start server: {str(e)}") - self.stop() - - def stop(self): - self.running = False - - # Close socket - if self.socket: - try: - self.socket.close() - except: - pass - self.socket = None - - # Wait for thread to finish - if self.server_thread: - try: - if self.server_thread.is_alive(): - self.server_thread.join(timeout=1.0) - except: - pass - self.server_thread = None - - print("BlenderMCP server stopped") - - def _server_loop(self): - """Main server loop in a separate thread""" - print("Server thread started") - self.socket.settimeout(1.0) # Timeout to allow for stopping - - while self.running: - try: - # Accept new connection - try: - client, address = self.socket.accept() - print(f"Connected to client: {address}") - - # Handle client in a separate thread - client_thread = threading.Thread( - target=self._handle_client, - args=(client,) - ) - client_thread.daemon = True - client_thread.start() - except socket.timeout: - # Just check running condition - continue - except Exception as e: - print(f"Error accepting connection: {str(e)}") - time.sleep(0.5) - except Exception as e: - print(f"Error in server loop: {str(e)}") - if not self.running: - break - time.sleep(0.5) - - print("Server thread stopped") - - def _handle_client(self, client): - """Handle connected client""" - print("Client handler started") - client.settimeout(None) # No timeout - buffer = b'' - - try: - while self.running: - # Receive data - try: - data = client.recv(8192) - if not data: - print("Client disconnected") - break - - buffer += data - try: - # Try to parse command - command = json.loads(buffer.decode('utf-8')) - buffer = b'' - - # Execute command in Blender's main thread - def execute_wrapper(): - try: - response = self.execute_command(command) - response_json = json.dumps(response) - try: - client.sendall(response_json.encode('utf-8')) - except: - print("Failed to send response - client disconnected") - except Exception as e: - print(f"Error executing command: {str(e)}") - traceback.print_exc() - try: - error_response = { - "status": "error", - "message": str(e) - } - client.sendall(json.dumps(error_response).encode('utf-8')) - except: - pass - return None - - # Schedule execution in main thread - bpy.app.timers.register(execute_wrapper, first_interval=0.0) - except json.JSONDecodeError: - # Incomplete data, wait for more - pass - except Exception as e: - print(f"Error receiving data: {str(e)}") - break - except Exception as e: - print(f"Error in client handler: {str(e)}") - finally: - try: - client.close() - except: - pass - print("Client handler stopped") - - def execute_command(self, command): - """Execute a command in the main Blender thread""" - try: - return self._execute_command_internal(command) - - except Exception as e: - print(f"Error executing command: {str(e)}") - traceback.print_exc() - return {"status": "error", "message": str(e)} - - def _execute_command_internal(self, command): - """Internal command execution with proper context""" - cmd_type = command.get("type") - params = command.get("params", {}) - - # Add a handler for checking PolyHaven status - if cmd_type == "get_polyhaven_status": - return {"status": "success", "result": self.get_polyhaven_status()} - - # Base handlers that are always available - handlers = { - "get_scene_info": self.get_scene_info, - "get_object_info": self.get_object_info, - "get_viewport_screenshot": self.get_viewport_screenshot, - "execute_code": self.execute_code, - "get_polyhaven_status": self.get_polyhaven_status, - "get_hyper3d_status": self.get_hyper3d_status, - "get_sketchfab_status": self.get_sketchfab_status, - } - - # Add Polyhaven handlers only if enabled - if bpy.context.scene.blendermcp_use_polyhaven: - polyhaven_handlers = { - "get_polyhaven_categories": self.get_polyhaven_categories, - "search_polyhaven_assets": self.search_polyhaven_assets, - "download_polyhaven_asset": self.download_polyhaven_asset, - "set_texture": self.set_texture, - } - handlers.update(polyhaven_handlers) - - # Add Hyper3d handlers only if enabled - if bpy.context.scene.blendermcp_use_hyper3d: - polyhaven_handlers = { - "create_rodin_job": self.create_rodin_job, - "poll_rodin_job_status": self.poll_rodin_job_status, - "import_generated_asset": self.import_generated_asset, - } - handlers.update(polyhaven_handlers) - - # Add Sketchfab handlers only if enabled - if bpy.context.scene.blendermcp_use_sketchfab: - sketchfab_handlers = { - "search_sketchfab_models": self.search_sketchfab_models, - "download_sketchfab_model": self.download_sketchfab_model, - } - handlers.update(sketchfab_handlers) - - handler = handlers.get(cmd_type) - if handler: - try: - print(f"Executing handler for {cmd_type}") - result = handler(**params) - print(f"Handler execution complete") - return {"status": "success", "result": result} - except Exception as e: - print(f"Error in handler: {str(e)}") - traceback.print_exc() - return {"status": "error", "message": str(e)} - else: - return {"status": "error", "message": f"Unknown command type: {cmd_type}"} - - - - def get_scene_info(self): - """Get information about the current Blender scene""" - try: - print("Getting scene info...") - # Simplify the scene info to reduce data size - scene_info = { - "name": bpy.context.scene.name, - "object_count": len(bpy.context.scene.objects), - "objects": [], - "materials_count": len(bpy.data.materials), - } - - # Collect minimal object information (limit to first 10 objects) - for i, obj in enumerate(bpy.context.scene.objects): - if i >= 10: # Reduced from 20 to 10 - break - - obj_info = { - "name": obj.name, - "type": obj.type, - # Only include basic location data - "location": [round(float(obj.location.x), 2), - round(float(obj.location.y), 2), - round(float(obj.location.z), 2)], - } - scene_info["objects"].append(obj_info) - - print(f"Scene info collected: {len(scene_info['objects'])} objects") - return scene_info - except Exception as e: - print(f"Error in get_scene_info: {str(e)}") - traceback.print_exc() - return {"error": str(e)} - - @staticmethod - def _get_aabb(obj): - """ Returns the world-space axis-aligned bounding box (AABB) of an object. """ - if obj.type != 'MESH': - raise TypeError("Object must be a mesh") - - # Get the bounding box corners in local space - local_bbox_corners = [mathutils.Vector(corner) for corner in obj.bound_box] - - # Convert to world coordinates - world_bbox_corners = [obj.matrix_world @ corner for corner in local_bbox_corners] - - # Compute axis-aligned min/max coordinates - min_corner = mathutils.Vector(map(min, zip(*world_bbox_corners))) - max_corner = mathutils.Vector(map(max, zip(*world_bbox_corners))) - - return [ - [*min_corner], [*max_corner] - ] - - - - def get_object_info(self, name): - """Get detailed information about a specific object""" - obj = bpy.data.objects.get(name) - if not obj: - raise ValueError(f"Object not found: {name}") - - # Basic object info - obj_info = { - "name": obj.name, - "type": obj.type, - "location": [obj.location.x, obj.location.y, obj.location.z], - "rotation": [obj.rotation_euler.x, obj.rotation_euler.y, obj.rotation_euler.z], - "scale": [obj.scale.x, obj.scale.y, obj.scale.z], - "visible": obj.visible_get(), - "materials": [], - } - - if obj.type == "MESH": - bounding_box = self._get_aabb(obj) - obj_info["world_bounding_box"] = bounding_box - - # Add material slots - for slot in obj.material_slots: - if slot.material: - obj_info["materials"].append(slot.material.name) - - # Add mesh data if applicable - if obj.type == 'MESH' and obj.data: - mesh = obj.data - obj_info["mesh"] = { - "vertices": len(mesh.vertices), - "edges": len(mesh.edges), - "polygons": len(mesh.polygons), - } - - return obj_info - - def get_viewport_screenshot(self, max_size=800, filepath=None, format="png"): - """ - Capture a screenshot of the current 3D viewport and save it to the specified path. - - Parameters: - - max_size: Maximum size in pixels for the largest dimension of the image - - filepath: Path where to save the screenshot file - - format: Image format (png, jpg, etc.) - - Returns success/error status - """ - try: - if not filepath: - return {"error": "No filepath provided"} - - # Find the active 3D viewport - area = None - for a in bpy.context.screen.areas: - if a.type == 'VIEW_3D': - area = a - break - - if not area: - return {"error": "No 3D viewport found"} - - # Take screenshot with proper context override - with bpy.context.temp_override(area=area): - bpy.ops.screen.screenshot_area(filepath=filepath) - - # Load and resize if needed - img = bpy.data.images.load(filepath) - width, height = img.size - - if max(width, height) > max_size: - scale = max_size / max(width, height) - new_width = int(width * scale) - new_height = int(height * scale) - img.scale(new_width, new_height) - - # Set format and save - img.file_format = format.upper() - img.save() - width, height = new_width, new_height - - # Cleanup Blender image data - bpy.data.images.remove(img) - - return { - "success": True, - "width": width, - "height": height, - "filepath": filepath - } - - except Exception as e: - return {"error": str(e)} - - def execute_code(self, code): - """Execute arbitrary Blender Python code""" - # This is powerful but potentially dangerous - use with caution - try: - # Create a local namespace for execution - namespace = {"bpy": bpy} - - # Capture stdout during execution, and return it as result - capture_buffer = io.StringIO() - with redirect_stdout(capture_buffer): - exec(code, namespace) - - captured_output = capture_buffer.getvalue() - return {"executed": True, "result": captured_output} - except Exception as e: - raise Exception(f"Code execution error: {str(e)}") - - - - def get_polyhaven_categories(self, asset_type): - """Get categories for a specific asset type from Polyhaven""" - try: - if asset_type not in ["hdris", "textures", "models", "all"]: - return {"error": f"Invalid asset type: {asset_type}. Must be one of: hdris, textures, models, all"} - - response = requests.get(f"https://api.polyhaven.com/categories/{asset_type}", headers=REQ_HEADERS) - if response.status_code == 200: - return {"categories": response.json()} - else: - return {"error": f"API request failed with status code {response.status_code}"} - except Exception as e: - return {"error": str(e)} - - def search_polyhaven_assets(self, asset_type=None, categories=None): - """Search for assets from Polyhaven with optional filtering""" - try: - url = "https://api.polyhaven.com/assets" - params = {} - - if asset_type and asset_type != "all": - if asset_type not in ["hdris", "textures", "models"]: - return {"error": f"Invalid asset type: {asset_type}. Must be one of: hdris, textures, models, all"} - params["type"] = asset_type - - if categories: - params["categories"] = categories - - response = requests.get(url, params=params, headers=REQ_HEADERS) - if response.status_code == 200: - # Limit the response size to avoid overwhelming Blender - assets = response.json() - # Return only the first 20 assets to keep response size manageable - limited_assets = {} - for i, (key, value) in enumerate(assets.items()): - if i >= 20: # Limit to 20 assets - break - limited_assets[key] = value - - return {"assets": limited_assets, "total_count": len(assets), "returned_count": len(limited_assets)} - else: - return {"error": f"API request failed with status code {response.status_code}"} - except Exception as e: - return {"error": str(e)} - - def download_polyhaven_asset(self, asset_id, asset_type, resolution="1k", file_format=None): - try: - # First get the files information - files_response = requests.get(f"https://api.polyhaven.com/files/{asset_id}", headers=REQ_HEADERS) - if files_response.status_code != 200: - return {"error": f"Failed to get asset files: {files_response.status_code}"} - - files_data = files_response.json() - - # Handle different asset types - if asset_type == "hdris": - # For HDRIs, download the .hdr or .exr file - if not file_format: - file_format = "hdr" # Default format for HDRIs - - if "hdri" in files_data and resolution in files_data["hdri"] and file_format in files_data["hdri"][resolution]: - file_info = files_data["hdri"][resolution][file_format] - file_url = file_info["url"] - - # For HDRIs, we need to save to a temporary file first - # since Blender can't properly load HDR data directly from memory - with tempfile.NamedTemporaryFile(suffix=f".{file_format}", delete=False) as tmp_file: - # Download the file - response = requests.get(file_url, headers=REQ_HEADERS) - if response.status_code != 200: - return {"error": f"Failed to download HDRI: {response.status_code}"} - - tmp_file.write(response.content) - tmp_path = tmp_file.name - - try: - # Create a new world if none exists - if not bpy.data.worlds: - bpy.data.worlds.new("World") - - world = bpy.data.worlds[0] - world.use_nodes = True - node_tree = world.node_tree - - # Clear existing nodes - for node in node_tree.nodes: - node_tree.nodes.remove(node) - - # Create nodes - tex_coord = node_tree.nodes.new(type='ShaderNodeTexCoord') - tex_coord.location = (-800, 0) - - mapping = node_tree.nodes.new(type='ShaderNodeMapping') - mapping.location = (-600, 0) - - # Load the image from the temporary file - env_tex = node_tree.nodes.new(type='ShaderNodeTexEnvironment') - env_tex.location = (-400, 0) - env_tex.image = bpy.data.images.load(tmp_path) - - # Use a color space that exists in all Blender versions - if file_format.lower() == 'exr': - # Try to use Linear color space for EXR files - try: - env_tex.image.colorspace_settings.name = 'Linear' - except: - # Fallback to Non-Color if Linear isn't available - env_tex.image.colorspace_settings.name = 'Non-Color' - else: # hdr - # For HDR files, try these options in order - for color_space in ['Linear', 'Linear Rec.709', 'Non-Color']: - try: - env_tex.image.colorspace_settings.name = color_space - break # Stop if we successfully set a color space - except: - continue - - background = node_tree.nodes.new(type='ShaderNodeBackground') - background.location = (-200, 0) - - output = node_tree.nodes.new(type='ShaderNodeOutputWorld') - output.location = (0, 0) - - # Connect nodes - node_tree.links.new(tex_coord.outputs['Generated'], mapping.inputs['Vector']) - node_tree.links.new(mapping.outputs['Vector'], env_tex.inputs['Vector']) - node_tree.links.new(env_tex.outputs['Color'], background.inputs['Color']) - node_tree.links.new(background.outputs['Background'], output.inputs['Surface']) - - # Set as active world - bpy.context.scene.world = world - - # Clean up temporary file - try: - tempfile._cleanup() # This will clean up all temporary files - except: - pass - - return { - "success": True, - "message": f"HDRI {asset_id} imported successfully", - "image_name": env_tex.image.name - } - except Exception as e: - return {"error": f"Failed to set up HDRI in Blender: {str(e)}"} - else: - return {"error": f"Requested resolution or format not available for this HDRI"} - - elif asset_type == "textures": - if not file_format: - file_format = "jpg" # Default format for textures - - downloaded_maps = {} - - try: - for map_type in files_data: - if map_type not in ["blend", "gltf"]: # Skip non-texture files - if resolution in files_data[map_type] and file_format in files_data[map_type][resolution]: - file_info = files_data[map_type][resolution][file_format] - file_url = file_info["url"] - - # Use NamedTemporaryFile like we do for HDRIs - with tempfile.NamedTemporaryFile(suffix=f".{file_format}", delete=False) as tmp_file: - # Download the file - response = requests.get(file_url, headers=REQ_HEADERS) - if response.status_code == 200: - tmp_file.write(response.content) - tmp_path = tmp_file.name - - # Load image from temporary file - image = bpy.data.images.load(tmp_path) - image.name = f"{asset_id}_{map_type}.{file_format}" - - # Pack the image into .blend file - image.pack() - - # Set color space based on map type - if map_type in ['color', 'diffuse', 'albedo']: - try: - image.colorspace_settings.name = 'sRGB' - except: - pass - else: - try: - image.colorspace_settings.name = 'Non-Color' - except: - pass - - downloaded_maps[map_type] = image - - # Clean up temporary file - try: - os.unlink(tmp_path) - except: - pass - - if not downloaded_maps: - return {"error": f"No texture maps found for the requested resolution and format"} - - # Create a new material with the downloaded textures - mat = bpy.data.materials.new(name=asset_id) - mat.use_nodes = True - nodes = mat.node_tree.nodes - links = mat.node_tree.links - - # Clear default nodes - for node in nodes: - nodes.remove(node) - - # Create output node - output = nodes.new(type='ShaderNodeOutputMaterial') - output.location = (300, 0) - - # Create principled BSDF node - principled = nodes.new(type='ShaderNodeBsdfPrincipled') - principled.location = (0, 0) - links.new(principled.outputs[0], output.inputs[0]) - - # Add texture nodes based on available maps - tex_coord = nodes.new(type='ShaderNodeTexCoord') - tex_coord.location = (-800, 0) - - mapping = nodes.new(type='ShaderNodeMapping') - mapping.location = (-600, 0) - mapping.vector_type = 'TEXTURE' # Changed from default 'POINT' to 'TEXTURE' - links.new(tex_coord.outputs['UV'], mapping.inputs['Vector']) - - # Position offset for texture nodes - x_pos = -400 - y_pos = 300 - - # Connect different texture maps - for map_type, image in downloaded_maps.items(): - tex_node = nodes.new(type='ShaderNodeTexImage') - tex_node.location = (x_pos, y_pos) - tex_node.image = image - - # Set color space based on map type - if map_type.lower() in ['color', 'diffuse', 'albedo']: - try: - tex_node.image.colorspace_settings.name = 'sRGB' - except: - pass # Use default if sRGB not available - else: - try: - tex_node.image.colorspace_settings.name = 'Non-Color' - except: - pass # Use default if Non-Color not available - - links.new(mapping.outputs['Vector'], tex_node.inputs['Vector']) - - # Connect to appropriate input on Principled BSDF - if map_type.lower() in ['color', 'diffuse', 'albedo']: - links.new(tex_node.outputs['Color'], principled.inputs['Base Color']) - elif map_type.lower() in ['roughness', 'rough']: - links.new(tex_node.outputs['Color'], principled.inputs['Roughness']) - elif map_type.lower() in ['metallic', 'metalness', 'metal']: - links.new(tex_node.outputs['Color'], principled.inputs['Metallic']) - elif map_type.lower() in ['normal', 'nor']: - # Add normal map node - normal_map = nodes.new(type='ShaderNodeNormalMap') - normal_map.location = (x_pos + 200, y_pos) - links.new(tex_node.outputs['Color'], normal_map.inputs['Color']) - links.new(normal_map.outputs['Normal'], principled.inputs['Normal']) - elif map_type in ['displacement', 'disp', 'height']: - # Add displacement node - disp_node = nodes.new(type='ShaderNodeDisplacement') - disp_node.location = (x_pos + 200, y_pos - 200) - links.new(tex_node.outputs['Color'], disp_node.inputs['Height']) - links.new(disp_node.outputs['Displacement'], output.inputs['Displacement']) - - y_pos -= 250 - - return { - "success": True, - "message": f"Texture {asset_id} imported as material", - "material": mat.name, - "maps": list(downloaded_maps.keys()) - } - - except Exception as e: - return {"error": f"Failed to process textures: {str(e)}"} - - elif asset_type == "models": - # For models, prefer glTF format if available - if not file_format: - file_format = "gltf" # Default format for models - - if file_format in files_data and resolution in files_data[file_format]: - file_info = files_data[file_format][resolution][file_format] - file_url = file_info["url"] - - # Create a temporary directory to store the model and its dependencies - temp_dir = tempfile.mkdtemp() - main_file_path = "" - - try: - # Download the main model file - main_file_name = file_url.split("/")[-1] - main_file_path = os.path.join(temp_dir, main_file_name) - - response = requests.get(file_url, headers=REQ_HEADERS) - if response.status_code != 200: - return {"error": f"Failed to download model: {response.status_code}"} - - with open(main_file_path, "wb") as f: - f.write(response.content) - - # Check for included files and download them - if "include" in file_info and file_info["include"]: - for include_path, include_info in file_info["include"].items(): - # Get the URL for the included file - this is the fix - include_url = include_info["url"] - - # Create the directory structure for the included file - include_file_path = os.path.join(temp_dir, include_path) - os.makedirs(os.path.dirname(include_file_path), exist_ok=True) - - # Download the included file - include_response = requests.get(include_url, headers=REQ_HEADERS) - if include_response.status_code == 200: - with open(include_file_path, "wb") as f: - f.write(include_response.content) - else: - print(f"Failed to download included file: {include_path}") - - # Import the model into Blender - if file_format == "gltf" or file_format == "glb": - bpy.ops.import_scene.gltf(filepath=main_file_path) - elif file_format == "fbx": - bpy.ops.import_scene.fbx(filepath=main_file_path) - elif file_format == "obj": - bpy.ops.import_scene.obj(filepath=main_file_path) - elif file_format == "blend": - # For blend files, we need to append or link - with bpy.data.libraries.load(main_file_path, link=False) as (data_from, data_to): - data_to.objects = data_from.objects - - # Link the objects to the scene - for obj in data_to.objects: - if obj is not None: - bpy.context.collection.objects.link(obj) - else: - return {"error": f"Unsupported model format: {file_format}"} - - # Get the names of imported objects - imported_objects = [obj.name for obj in bpy.context.selected_objects] - - return { - "success": True, - "message": f"Model {asset_id} imported successfully", - "imported_objects": imported_objects - } - except Exception as e: - return {"error": f"Failed to import model: {str(e)}"} - finally: - # Clean up temporary directory - with suppress(Exception): - shutil.rmtree(temp_dir) - else: - return {"error": f"Requested format or resolution not available for this model"} - - else: - return {"error": f"Unsupported asset type: {asset_type}"} - - except Exception as e: - return {"error": f"Failed to download asset: {str(e)}"} - - def set_texture(self, object_name, texture_id): - """Apply a previously downloaded Polyhaven texture to an object by creating a new material""" - try: - # Get the object - obj = bpy.data.objects.get(object_name) - if not obj: - return {"error": f"Object not found: {object_name}"} - - # Make sure object can accept materials - if not hasattr(obj, 'data') or not hasattr(obj.data, 'materials'): - return {"error": f"Object {object_name} cannot accept materials"} - - # Find all images related to this texture and ensure they're properly loaded - texture_images = {} - for img in bpy.data.images: - if img.name.startswith(texture_id + "_"): - # Extract the map type from the image name - map_type = img.name.split('_')[-1].split('.')[0] - - # Force a reload of the image - img.reload() - - # Ensure proper color space - if map_type.lower() in ['color', 'diffuse', 'albedo']: - try: - img.colorspace_settings.name = 'sRGB' - except: - pass - else: - try: - img.colorspace_settings.name = 'Non-Color' - except: - pass - - # Ensure the image is packed - if not img.packed_file: - img.pack() - - texture_images[map_type] = img - print(f"Loaded texture map: {map_type} - {img.name}") - - # Debug info - print(f"Image size: {img.size[0]}x{img.size[1]}") - print(f"Color space: {img.colorspace_settings.name}") - print(f"File format: {img.file_format}") - print(f"Is packed: {bool(img.packed_file)}") - - if not texture_images: - return {"error": f"No texture images found for: {texture_id}. Please download the texture first."} - - # Create a new material - new_mat_name = f"{texture_id}_material_{object_name}" - - # Remove any existing material with this name to avoid conflicts - existing_mat = bpy.data.materials.get(new_mat_name) - if existing_mat: - bpy.data.materials.remove(existing_mat) - - new_mat = bpy.data.materials.new(name=new_mat_name) - new_mat.use_nodes = True - - # Set up the material nodes - nodes = new_mat.node_tree.nodes - links = new_mat.node_tree.links - - # Clear default nodes - nodes.clear() - - # Create output node - output = nodes.new(type='ShaderNodeOutputMaterial') - output.location = (600, 0) - - # Create principled BSDF node - principled = nodes.new(type='ShaderNodeBsdfPrincipled') - principled.location = (300, 0) - links.new(principled.outputs[0], output.inputs[0]) - - # Add texture nodes based on available maps - tex_coord = nodes.new(type='ShaderNodeTexCoord') - tex_coord.location = (-800, 0) - - mapping = nodes.new(type='ShaderNodeMapping') - mapping.location = (-600, 0) - mapping.vector_type = 'TEXTURE' # Changed from default 'POINT' to 'TEXTURE' - links.new(tex_coord.outputs['UV'], mapping.inputs['Vector']) - - # Position offset for texture nodes - x_pos = -400 - y_pos = 300 - - # Connect different texture maps - for map_type, image in texture_images.items(): - tex_node = nodes.new(type='ShaderNodeTexImage') - tex_node.location = (x_pos, y_pos) - tex_node.image = image - - # Set color space based on map type - if map_type.lower() in ['color', 'diffuse', 'albedo']: - try: - tex_node.image.colorspace_settings.name = 'sRGB' - except: - pass # Use default if sRGB not available - else: - try: - tex_node.image.colorspace_settings.name = 'Non-Color' - except: - pass # Use default if Non-Color not available - - links.new(mapping.outputs['Vector'], tex_node.inputs['Vector']) - - # Connect to appropriate input on Principled BSDF - if map_type.lower() in ['color', 'diffuse', 'albedo']: - links.new(tex_node.outputs['Color'], principled.inputs['Base Color']) - elif map_type.lower() in ['roughness', 'rough']: - links.new(tex_node.outputs['Color'], principled.inputs['Roughness']) - elif map_type.lower() in ['metallic', 'metalness', 'metal']: - links.new(tex_node.outputs['Color'], principled.inputs['Metallic']) - elif map_type.lower() in ['normal', 'nor', 'dx', 'gl']: - # Add normal map node - normal_map = nodes.new(type='ShaderNodeNormalMap') - normal_map.location = (x_pos + 200, y_pos) - links.new(tex_node.outputs['Color'], normal_map.inputs['Color']) - links.new(normal_map.outputs['Normal'], principled.inputs['Normal']) - elif map_type.lower() in ['displacement', 'disp', 'height']: - # Add displacement node - disp_node = nodes.new(type='ShaderNodeDisplacement') - disp_node.location = (x_pos + 200, y_pos - 200) - disp_node.inputs['Scale'].default_value = 0.1 # Reduce displacement strength - links.new(tex_node.outputs['Color'], disp_node.inputs['Height']) - links.new(disp_node.outputs['Displacement'], output.inputs['Displacement']) - - y_pos -= 250 - - # Second pass: Connect nodes with proper handling for special cases - texture_nodes = {} - - # First find all texture nodes and store them by map type - for node in nodes: - if node.type == 'TEX_IMAGE' and node.image: - for map_type, image in texture_images.items(): - if node.image == image: - texture_nodes[map_type] = node - break - - # Now connect everything using the nodes instead of images - # Handle base color (diffuse) - for map_name in ['color', 'diffuse', 'albedo']: - if map_name in texture_nodes: - links.new(texture_nodes[map_name].outputs['Color'], principled.inputs['Base Color']) - print(f"Connected {map_name} to Base Color") - break - - # Handle roughness - for map_name in ['roughness', 'rough']: - if map_name in texture_nodes: - links.new(texture_nodes[map_name].outputs['Color'], principled.inputs['Roughness']) - print(f"Connected {map_name} to Roughness") - break - - # Handle metallic - for map_name in ['metallic', 'metalness', 'metal']: - if map_name in texture_nodes: - links.new(texture_nodes[map_name].outputs['Color'], principled.inputs['Metallic']) - print(f"Connected {map_name} to Metallic") - break - - # Handle normal maps - for map_name in ['gl', 'dx', 'nor']: - if map_name in texture_nodes: - normal_map_node = nodes.new(type='ShaderNodeNormalMap') - normal_map_node.location = (100, 100) - links.new(texture_nodes[map_name].outputs['Color'], normal_map_node.inputs['Color']) - links.new(normal_map_node.outputs['Normal'], principled.inputs['Normal']) - print(f"Connected {map_name} to Normal") - break - - # Handle displacement - for map_name in ['displacement', 'disp', 'height']: - if map_name in texture_nodes: - disp_node = nodes.new(type='ShaderNodeDisplacement') - disp_node.location = (300, -200) - disp_node.inputs['Scale'].default_value = 0.1 # Reduce displacement strength - links.new(texture_nodes[map_name].outputs['Color'], disp_node.inputs['Height']) - links.new(disp_node.outputs['Displacement'], output.inputs['Displacement']) - print(f"Connected {map_name} to Displacement") - break - - # Handle ARM texture (Ambient Occlusion, Roughness, Metallic) - if 'arm' in texture_nodes: - separate_rgb = nodes.new(type='ShaderNodeSeparateRGB') - separate_rgb.location = (-200, -100) - links.new(texture_nodes['arm'].outputs['Color'], separate_rgb.inputs['Image']) - - # Connect Roughness (G) if no dedicated roughness map - if not any(map_name in texture_nodes for map_name in ['roughness', 'rough']): - links.new(separate_rgb.outputs['G'], principled.inputs['Roughness']) - print("Connected ARM.G to Roughness") - - # Connect Metallic (B) if no dedicated metallic map - if not any(map_name in texture_nodes for map_name in ['metallic', 'metalness', 'metal']): - links.new(separate_rgb.outputs['B'], principled.inputs['Metallic']) - print("Connected ARM.B to Metallic") - - # For AO (R channel), multiply with base color if we have one - base_color_node = None - for map_name in ['color', 'diffuse', 'albedo']: - if map_name in texture_nodes: - base_color_node = texture_nodes[map_name] - break - - if base_color_node: - mix_node = nodes.new(type='ShaderNodeMixRGB') - mix_node.location = (100, 200) - mix_node.blend_type = 'MULTIPLY' - mix_node.inputs['Fac'].default_value = 0.8 # 80% influence - - # Disconnect direct connection to base color - for link in base_color_node.outputs['Color'].links: - if link.to_socket == principled.inputs['Base Color']: - links.remove(link) - - # Connect through the mix node - links.new(base_color_node.outputs['Color'], mix_node.inputs[1]) - links.new(separate_rgb.outputs['R'], mix_node.inputs[2]) - links.new(mix_node.outputs['Color'], principled.inputs['Base Color']) - print("Connected ARM.R to AO mix with Base Color") - - # Handle AO (Ambient Occlusion) if separate - if 'ao' in texture_nodes: - base_color_node = None - for map_name in ['color', 'diffuse', 'albedo']: - if map_name in texture_nodes: - base_color_node = texture_nodes[map_name] - break - - if base_color_node: - mix_node = nodes.new(type='ShaderNodeMixRGB') - mix_node.location = (100, 200) - mix_node.blend_type = 'MULTIPLY' - mix_node.inputs['Fac'].default_value = 0.8 # 80% influence - - # Disconnect direct connection to base color - for link in base_color_node.outputs['Color'].links: - if link.to_socket == principled.inputs['Base Color']: - links.remove(link) - - # Connect through the mix node - links.new(base_color_node.outputs['Color'], mix_node.inputs[1]) - links.new(texture_nodes['ao'].outputs['Color'], mix_node.inputs[2]) - links.new(mix_node.outputs['Color'], principled.inputs['Base Color']) - print("Connected AO to mix with Base Color") - - # CRITICAL: Make sure to clear all existing materials from the object - while len(obj.data.materials) > 0: - obj.data.materials.pop(index=0) - - # Assign the new material to the object - obj.data.materials.append(new_mat) - - # CRITICAL: Make the object active and select it - bpy.context.view_layer.objects.active = obj - obj.select_set(True) - - # CRITICAL: Force Blender to update the material - bpy.context.view_layer.update() - - # Get the list of texture maps - texture_maps = list(texture_images.keys()) - - # Get info about texture nodes for debugging - material_info = { - "name": new_mat.name, - "has_nodes": new_mat.use_nodes, - "node_count": len(new_mat.node_tree.nodes), - "texture_nodes": [] - } - - for node in new_mat.node_tree.nodes: - if node.type == 'TEX_IMAGE' and node.image: - connections = [] - for output in node.outputs: - for link in output.links: - connections.append(f"{output.name} → {link.to_node.name}.{link.to_socket.name}") - - material_info["texture_nodes"].append({ - "name": node.name, - "image": node.image.name, - "colorspace": node.image.colorspace_settings.name, - "connections": connections - }) - - return { - "success": True, - "message": f"Created new material and applied texture {texture_id} to {object_name}", - "material": new_mat.name, - "maps": texture_maps, - "material_info": material_info - } - - except Exception as e: - print(f"Error in set_texture: {str(e)}") - traceback.print_exc() - return {"error": f"Failed to apply texture: {str(e)}"} - - def get_polyhaven_status(self): - """Get the current status of PolyHaven integration""" - enabled = bpy.context.scene.blendermcp_use_polyhaven - if enabled: - return {"enabled": True, "message": "PolyHaven integration is enabled and ready to use."} - else: - return { - "enabled": False, - "message": """PolyHaven integration is currently disabled. To enable it: - 1. In the 3D Viewport, find the BlenderMCP panel in the sidebar (press N if hidden) - 2. Check the 'Use assets from Poly Haven' checkbox - 3. Restart the connection to Claude""" - } - - #region Hyper3D - def get_hyper3d_status(self): - """Get the current status of Hyper3D Rodin integration""" - enabled = bpy.context.scene.blendermcp_use_hyper3d - if enabled: - if not bpy.context.scene.blendermcp_hyper3d_api_key: - return { - "enabled": False, - "message": """Hyper3D Rodin integration is currently enabled, but API key is not given. To enable it: - 1. In the 3D Viewport, find the BlenderMCP panel in the sidebar (press N if hidden) - 2. Keep the 'Use Hyper3D Rodin 3D model generation' checkbox checked - 3. Choose the right plaform and fill in the API Key - 4. Restart the connection to Claude""" - } - mode = bpy.context.scene.blendermcp_hyper3d_mode - message = f"Hyper3D Rodin integration is enabled and ready to use. Mode: {mode}. " + \ - f"Key type: {'private' if bpy.context.scene.blendermcp_hyper3d_api_key != RODIN_FREE_TRIAL_KEY else 'free_trial'}" - return { - "enabled": True, - "message": message - } - else: - return { - "enabled": False, - "message": """Hyper3D Rodin integration is currently disabled. To enable it: - 1. In the 3D Viewport, find the BlenderMCP panel in the sidebar (press N if hidden) - 2. Check the 'Use Hyper3D Rodin 3D model generation' checkbox - 3. Restart the connection to Claude""" - } - - def create_rodin_job(self, *args, **kwargs): - match bpy.context.scene.blendermcp_hyper3d_mode: - case "MAIN_SITE": - return self.create_rodin_job_main_site(*args, **kwargs) - case "FAL_AI": - return self.create_rodin_job_fal_ai(*args, **kwargs) - case _: - return f"Error: Unknown Hyper3D Rodin mode!" - - def create_rodin_job_main_site( - self, - text_prompt: str=None, - images: list[tuple[str, str]]=None, - bbox_condition=None - ): - try: - if images is None: - images = [] - """Call Rodin API, get the job uuid and subscription key""" - files = [ - *[("images", (f"{i:04d}{img_suffix}", img)) for i, (img_suffix, img) in enumerate(images)], - ("tier", (None, "Sketch")), - ("mesh_mode", (None, "Raw")), - ] - if text_prompt: - files.append(("prompt", (None, text_prompt))) - if bbox_condition: - files.append(("bbox_condition", (None, json.dumps(bbox_condition)))) - response = requests.post( - "https://hyperhuman.deemos.com/api/v2/rodin", - headers={ - "Authorization": f"Bearer {bpy.context.scene.blendermcp_hyper3d_api_key}", - }, - files=files - ) - data = response.json() - return data - except Exception as e: - return {"error": str(e)} - - def create_rodin_job_fal_ai( - self, - text_prompt: str=None, - images: list[tuple[str, str]]=None, - bbox_condition=None - ): - try: - req_data = { - "tier": "Sketch", - } - if images: - req_data["input_image_urls"] = images - if text_prompt: - req_data["prompt"] = text_prompt - if bbox_condition: - req_data["bbox_condition"] = bbox_condition - response = requests.post( - "https://queue.fal.run/fal-ai/hyper3d/rodin", - headers={ - "Authorization": f"Key {bpy.context.scene.blendermcp_hyper3d_api_key}", - "Content-Type": "application/json", - }, - json=req_data - ) - data = response.json() - return data - except Exception as e: - return {"error": str(e)} - - def poll_rodin_job_status(self, *args, **kwargs): - match bpy.context.scene.blendermcp_hyper3d_mode: - case "MAIN_SITE": - return self.poll_rodin_job_status_main_site(*args, **kwargs) - case "FAL_AI": - return self.poll_rodin_job_status_fal_ai(*args, **kwargs) - case _: - return f"Error: Unknown Hyper3D Rodin mode!" - - def poll_rodin_job_status_main_site(self, subscription_key: str): - """Call the job status API to get the job status""" - response = requests.post( - "https://hyperhuman.deemos.com/api/v2/status", - headers={ - "Authorization": f"Bearer {bpy.context.scene.blendermcp_hyper3d_api_key}", - }, - json={ - "subscription_key": subscription_key, - }, - ) - data = response.json() - return { - "status_list": [i["status"] for i in data["jobs"]] - } - - def poll_rodin_job_status_fal_ai(self, request_id: str): - """Call the job status API to get the job status""" - response = requests.get( - f"https://queue.fal.run/fal-ai/hyper3d/requests/{request_id}/status", - headers={ - "Authorization": f"KEY {bpy.context.scene.blendermcp_hyper3d_api_key}", - }, - ) - data = response.json() - return data - - @staticmethod - def _clean_imported_glb(filepath, mesh_name=None): - # Get the set of existing objects before import - existing_objects = set(bpy.data.objects) - - # Import the GLB file - bpy.ops.import_scene.gltf(filepath=filepath) - - # Ensure the context is updated - bpy.context.view_layer.update() - - # Get all imported objects - imported_objects = list(set(bpy.data.objects) - existing_objects) - # imported_objects = [obj for obj in bpy.context.view_layer.objects if obj.select_get()] - - if not imported_objects: - print("Error: No objects were imported.") - return - - # Identify the mesh object - mesh_obj = None - - if len(imported_objects) == 1 and imported_objects[0].type == 'MESH': - mesh_obj = imported_objects[0] - print("Single mesh imported, no cleanup needed.") - else: - if len(imported_objects) == 2: - empty_objs = [i for i in imported_objects if i.type == "EMPTY"] - if len(empty_objs) != 1: - print("Error: Expected an empty node with one mesh child or a single mesh object.") - return - parent_obj = empty_objs.pop() - if len(parent_obj.children) == 1: - potential_mesh = parent_obj.children[0] - if potential_mesh.type == 'MESH': - print("GLB structure confirmed: Empty node with one mesh child.") - - # Unparent the mesh from the empty node - potential_mesh.parent = None - - # Remove the empty node - bpy.data.objects.remove(parent_obj) - print("Removed empty node, keeping only the mesh.") - - mesh_obj = potential_mesh - else: - print("Error: Child is not a mesh object.") - return - else: - print("Error: Expected an empty node with one mesh child or a single mesh object.") - return - else: - print("Error: Expected an empty node with one mesh child or a single mesh object.") - return - - # Rename the mesh if needed - try: - if mesh_obj and mesh_obj.name is not None and mesh_name: - mesh_obj.name = mesh_name - if mesh_obj.data.name is not None: - mesh_obj.data.name = mesh_name - print(f"Mesh renamed to: {mesh_name}") - except Exception as e: - print("Having issue with renaming, give up renaming.") - - return mesh_obj - - def import_generated_asset(self, *args, **kwargs): - match bpy.context.scene.blendermcp_hyper3d_mode: - case "MAIN_SITE": - return self.import_generated_asset_main_site(*args, **kwargs) - case "FAL_AI": - return self.import_generated_asset_fal_ai(*args, **kwargs) - case _: - return f"Error: Unknown Hyper3D Rodin mode!" - - def import_generated_asset_main_site(self, task_uuid: str, name: str): - """Fetch the generated asset, import into blender""" - response = requests.post( - "https://hyperhuman.deemos.com/api/v2/download", - headers={ - "Authorization": f"Bearer {bpy.context.scene.blendermcp_hyper3d_api_key}", - }, - json={ - 'task_uuid': task_uuid - } - ) - data_ = response.json() - temp_file = None - for i in data_["list"]: - if i["name"].endswith(".glb"): - temp_file = tempfile.NamedTemporaryFile( - delete=False, - prefix=task_uuid, - suffix=".glb", - ) - - try: - # Download the content - response = requests.get(i["url"], stream=True) - response.raise_for_status() # Raise an exception for HTTP errors - - # Write the content to the temporary file - for chunk in response.iter_content(chunk_size=8192): - temp_file.write(chunk) - - # Close the file - temp_file.close() - - except Exception as e: - # Clean up the file if there's an error - temp_file.close() - os.unlink(temp_file.name) - return {"succeed": False, "error": str(e)} - - break - else: - return {"succeed": False, "error": "Generation failed. Please first make sure that all jobs of the task are done and then try again later."} - - try: - obj = self._clean_imported_glb( - filepath=temp_file.name, - mesh_name=name - ) - result = { - "name": obj.name, - "type": obj.type, - "location": [obj.location.x, obj.location.y, obj.location.z], - "rotation": [obj.rotation_euler.x, obj.rotation_euler.y, obj.rotation_euler.z], - "scale": [obj.scale.x, obj.scale.y, obj.scale.z], - } - - if obj.type == "MESH": - bounding_box = self._get_aabb(obj) - result["world_bounding_box"] = bounding_box - - return { - "succeed": True, **result - } - except Exception as e: - return {"succeed": False, "error": str(e)} - - def import_generated_asset_fal_ai(self, request_id: str, name: str): - """Fetch the generated asset, import into blender""" - response = requests.get( - f"https://queue.fal.run/fal-ai/hyper3d/requests/{request_id}", - headers={ - "Authorization": f"Key {bpy.context.scene.blendermcp_hyper3d_api_key}", - } - ) - data_ = response.json() - temp_file = None - - temp_file = tempfile.NamedTemporaryFile( - delete=False, - prefix=request_id, - suffix=".glb", - ) - - try: - # Download the content - response = requests.get(data_["model_mesh"]["url"], stream=True) - response.raise_for_status() # Raise an exception for HTTP errors - - # Write the content to the temporary file - for chunk in response.iter_content(chunk_size=8192): - temp_file.write(chunk) - - # Close the file - temp_file.close() - - except Exception as e: - # Clean up the file if there's an error - temp_file.close() - os.unlink(temp_file.name) - return {"succeed": False, "error": str(e)} - - try: - obj = self._clean_imported_glb( - filepath=temp_file.name, - mesh_name=name - ) - result = { - "name": obj.name, - "type": obj.type, - "location": [obj.location.x, obj.location.y, obj.location.z], - "rotation": [obj.rotation_euler.x, obj.rotation_euler.y, obj.rotation_euler.z], - "scale": [obj.scale.x, obj.scale.y, obj.scale.z], - } - - if obj.type == "MESH": - bounding_box = self._get_aabb(obj) - result["world_bounding_box"] = bounding_box - - return { - "succeed": True, **result - } - except Exception as e: - return {"succeed": False, "error": str(e)} - #endregion - - #region Sketchfab API - def get_sketchfab_status(self): - """Get the current status of Sketchfab integration""" - enabled = bpy.context.scene.blendermcp_use_sketchfab - api_key = bpy.context.scene.blendermcp_sketchfab_api_key - - # Test the API key if present - if api_key: - try: - headers = { - "Authorization": f"Token {api_key}" - } - - response = requests.get( - "https://api.sketchfab.com/v3/me", - headers=headers, - timeout=30 # Add timeout of 30 seconds - ) - - if response.status_code == 200: - user_data = response.json() - username = user_data.get("username", "Unknown user") - return { - "enabled": True, - "message": f"Sketchfab integration is enabled and ready to use. Logged in as: {username}" - } - else: - return { - "enabled": False, - "message": f"Sketchfab API key seems invalid. Status code: {response.status_code}" - } - except requests.exceptions.Timeout: - return { - "enabled": False, - "message": "Timeout connecting to Sketchfab API. Check your internet connection." - } - except Exception as e: - return { - "enabled": False, - "message": f"Error testing Sketchfab API key: {str(e)}" - } - - if enabled and api_key: - return {"enabled": True, "message": "Sketchfab integration is enabled and ready to use."} - elif enabled and not api_key: - return { - "enabled": False, - "message": """Sketchfab integration is currently enabled, but API key is not given. To enable it: - 1. In the 3D Viewport, find the BlenderMCP panel in the sidebar (press N if hidden) - 2. Keep the 'Use Sketchfab' checkbox checked - 3. Enter your Sketchfab API Key - 4. Restart the connection to Claude""" - } - else: - return { - "enabled": False, - "message": """Sketchfab integration is currently disabled. To enable it: - 1. In the 3D Viewport, find the BlenderMCP panel in the sidebar (press N if hidden) - 2. Check the 'Use assets from Sketchfab' checkbox - 3. Enter your Sketchfab API Key - 4. Restart the connection to Claude""" - } - - def search_sketchfab_models(self, query, categories=None, count=20, downloadable=True): - """Search for models on Sketchfab based on query and optional filters""" - try: - api_key = bpy.context.scene.blendermcp_sketchfab_api_key - if not api_key: - return {"error": "Sketchfab API key is not configured"} - - # Build search parameters with exact fields from Sketchfab API docs - params = { - "type": "models", - "q": query, - "count": count, - "downloadable": downloadable, - "archives_flavours": False - } - - if categories: - params["categories"] = categories - - # Make API request to Sketchfab search endpoint - # The proper format according to Sketchfab API docs for API key auth - headers = { - "Authorization": f"Token {api_key}" - } - - - # Use the search endpoint as specified in the API documentation - response = requests.get( - "https://api.sketchfab.com/v3/search", - headers=headers, - params=params, - timeout=30 # Add timeout of 30 seconds - ) - - if response.status_code == 401: - return {"error": "Authentication failed (401). Check your API key."} - - if response.status_code != 200: - return {"error": f"API request failed with status code {response.status_code}"} - - response_data = response.json() - - # Safety check on the response structure - if response_data is None: - return {"error": "Received empty response from Sketchfab API"} - - # Handle 'results' potentially missing from response - results = response_data.get("results", []) - if not isinstance(results, list): - return {"error": f"Unexpected response format from Sketchfab API: {response_data}"} - - return response_data - - except requests.exceptions.Timeout: - return {"error": "Request timed out. Check your internet connection."} - except json.JSONDecodeError as e: - return {"error": f"Invalid JSON response from Sketchfab API: {str(e)}"} - except Exception as e: - import traceback - traceback.print_exc() - return {"error": str(e)} - - def download_sketchfab_model(self, uid): - """Download a model from Sketchfab by its UID""" - try: - api_key = bpy.context.scene.blendermcp_sketchfab_api_key - if not api_key: - return {"error": "Sketchfab API key is not configured"} - - # Use proper authorization header for API key auth - headers = { - "Authorization": f"Token {api_key}" - } - - # Request download URL using the exact endpoint from the documentation - download_endpoint = f"https://api.sketchfab.com/v3/models/{uid}/download" - - response = requests.get( - download_endpoint, - headers=headers, - timeout=30 # Add timeout of 30 seconds - ) - - if response.status_code == 401: - return {"error": "Authentication failed (401). Check your API key."} - - if response.status_code != 200: - return {"error": f"Download request failed with status code {response.status_code}"} - - data = response.json() - - # Safety check for None data - if data is None: - return {"error": "Received empty response from Sketchfab API for download request"} - - # Extract download URL with safety checks - gltf_data = data.get("gltf") - if not gltf_data: - return {"error": "No gltf download URL available for this model. Response: " + str(data)} - - download_url = gltf_data.get("url") - if not download_url: - return {"error": "No download URL available for this model. Make sure the model is downloadable and you have access."} - - # Download the model (already has timeout) - model_response = requests.get(download_url, timeout=60) # 60 second timeout - - if model_response.status_code != 200: - return {"error": f"Model download failed with status code {model_response.status_code}"} - - # Save to temporary file - temp_dir = tempfile.mkdtemp() - zip_file_path = os.path.join(temp_dir, f"{uid}.zip") - - with open(zip_file_path, "wb") as f: - f.write(model_response.content) - - # Extract the zip file with enhanced security - with zipfile.ZipFile(zip_file_path, 'r') as zip_ref: - # More secure zip slip prevention - for file_info in zip_ref.infolist(): - # Get the path of the file - file_path = file_info.filename - - # Convert directory separators to the current OS style - # This handles both / and \ in zip entries - target_path = os.path.join(temp_dir, os.path.normpath(file_path)) - - # Get absolute paths for comparison - abs_temp_dir = os.path.abspath(temp_dir) - abs_target_path = os.path.abspath(target_path) - - # Ensure the normalized path doesn't escape the target directory - if not abs_target_path.startswith(abs_temp_dir): - with suppress(Exception): - shutil.rmtree(temp_dir) - return {"error": "Security issue: Zip contains files with path traversal attempt"} - - # Additional explicit check for directory traversal - if ".." in file_path: - with suppress(Exception): - shutil.rmtree(temp_dir) - return {"error": "Security issue: Zip contains files with directory traversal sequence"} - - # If all files passed security checks, extract them - zip_ref.extractall(temp_dir) - - # Find the main glTF file - gltf_files = [f for f in os.listdir(temp_dir) if f.endswith('.gltf') or f.endswith('.glb')] - - if not gltf_files: - with suppress(Exception): - shutil.rmtree(temp_dir) - return {"error": "No glTF file found in the downloaded model"} - - main_file = os.path.join(temp_dir, gltf_files[0]) - - # Import the model - bpy.ops.import_scene.gltf(filepath=main_file) - - # Get the names of imported objects - imported_objects = [obj.name for obj in bpy.context.selected_objects] - - # Clean up temporary files - with suppress(Exception): - shutil.rmtree(temp_dir) - - return { - "success": True, - "message": "Model imported successfully", - "imported_objects": imported_objects - } - - except requests.exceptions.Timeout: - return {"error": "Request timed out. Check your internet connection and try again with a simpler model."} - except json.JSONDecodeError as e: - return {"error": f"Invalid JSON response from Sketchfab API: {str(e)}"} - except Exception as e: - import traceback - traceback.print_exc() - return {"error": f"Failed to download model: {str(e)}"} - #endregion - -# Blender UI Panel -class BLENDERMCP_PT_Panel(bpy.types.Panel): - bl_label = "Blender MCP" - bl_idname = "BLENDERMCP_PT_Panel" - bl_space_type = 'VIEW_3D' - bl_region_type = 'UI' - bl_category = 'BlenderMCP' - - def draw(self, context): - layout = self.layout - scene = context.scene - - layout.prop(scene, "blendermcp_port") - layout.prop(scene, "blendermcp_use_polyhaven", text="Use assets from Poly Haven") - - layout.prop(scene, "blendermcp_use_hyper3d", text="Use Hyper3D Rodin 3D model generation") - if scene.blendermcp_use_hyper3d: - layout.prop(scene, "blendermcp_hyper3d_mode", text="Rodin Mode") - layout.prop(scene, "blendermcp_hyper3d_api_key", text="API Key") - layout.operator("blendermcp.set_hyper3d_free_trial_api_key", text="Set Free Trial API Key") - - layout.prop(scene, "blendermcp_use_sketchfab", text="Use assets from Sketchfab") - if scene.blendermcp_use_sketchfab: - layout.prop(scene, "blendermcp_sketchfab_api_key", text="API Key") - - if not scene.blendermcp_server_running: - layout.operator("blendermcp.start_server", text="Connect to MCP server") - else: - layout.operator("blendermcp.stop_server", text="Disconnect from MCP server") - layout.label(text=f"Running on port {scene.blendermcp_port}") - -# Operator to set Hyper3D API Key -class BLENDERMCP_OT_SetFreeTrialHyper3DAPIKey(bpy.types.Operator): - bl_idname = "blendermcp.set_hyper3d_free_trial_api_key" - bl_label = "Set Free Trial API Key" - - def execute(self, context): - context.scene.blendermcp_hyper3d_api_key = RODIN_FREE_TRIAL_KEY - context.scene.blendermcp_hyper3d_mode = 'MAIN_SITE' - self.report({'INFO'}, "API Key set successfully!") - return {'FINISHED'} - -# Operator to start the server -class BLENDERMCP_OT_StartServer(bpy.types.Operator): - bl_idname = "blendermcp.start_server" - bl_label = "Connect to Claude" - bl_description = "Start the BlenderMCP server to connect with Claude" - - def execute(self, context): - scene = context.scene - - # Create a new server instance - if not hasattr(bpy.types, "blendermcp_server") or not bpy.types.blendermcp_server: - bpy.types.blendermcp_server = BlenderMCPServer(port=scene.blendermcp_port) - - # Start the server - bpy.types.blendermcp_server.start() - scene.blendermcp_server_running = True - - return {'FINISHED'} - -# Operator to stop the server -class BLENDERMCP_OT_StopServer(bpy.types.Operator): - bl_idname = "blendermcp.stop_server" - bl_label = "Stop the connection to Claude" - bl_description = "Stop the connection to Claude" - - def execute(self, context): - scene = context.scene - - # Stop the server if it exists - if hasattr(bpy.types, "blendermcp_server") and bpy.types.blendermcp_server: - bpy.types.blendermcp_server.stop() - del bpy.types.blendermcp_server - - scene.blendermcp_server_running = False - - return {'FINISHED'} - -# Registration functions -def register(): - bpy.types.Scene.blendermcp_port = IntProperty( - name="Port", - description="Port for the BlenderMCP server", - default=9876, - min=1024, - max=65535 - ) - - bpy.types.Scene.blendermcp_server_running = bpy.props.BoolProperty( - name="Server Running", - default=False - ) - - bpy.types.Scene.blendermcp_use_polyhaven = bpy.props.BoolProperty( - name="Use Poly Haven", - description="Enable Poly Haven asset integration", - default=False - ) - - bpy.types.Scene.blendermcp_use_hyper3d = bpy.props.BoolProperty( - name="Use Hyper3D Rodin", - description="Enable Hyper3D Rodin generatino integration", - default=False - ) - - bpy.types.Scene.blendermcp_hyper3d_mode = bpy.props.EnumProperty( - name="Rodin Mode", - description="Choose the platform used to call Rodin APIs", - items=[ - ("MAIN_SITE", "hyper3d.ai", "hyper3d.ai"), - ("FAL_AI", "fal.ai", "fal.ai"), - ], - default="MAIN_SITE" - ) - - bpy.types.Scene.blendermcp_hyper3d_api_key = bpy.props.StringProperty( - name="Hyper3D API Key", - subtype="PASSWORD", - description="API Key provided by Hyper3D", - default="" - ) - - bpy.types.Scene.blendermcp_use_sketchfab = bpy.props.BoolProperty( - name="Use Sketchfab", - description="Enable Sketchfab asset integration", - default=False - ) - - bpy.types.Scene.blendermcp_sketchfab_api_key = bpy.props.StringProperty( - name="Sketchfab API Key", - subtype="PASSWORD", - description="API Key provided by Sketchfab", - default="" - ) - - bpy.utils.register_class(BLENDERMCP_PT_Panel) - bpy.utils.register_class(BLENDERMCP_OT_SetFreeTrialHyper3DAPIKey) - bpy.utils.register_class(BLENDERMCP_OT_StartServer) - bpy.utils.register_class(BLENDERMCP_OT_StopServer) - - print("BlenderMCP addon registered") - -def unregister(): - # Stop the server if it's running - if hasattr(bpy.types, "blendermcp_server") and bpy.types.blendermcp_server: - bpy.types.blendermcp_server.stop() - del bpy.types.blendermcp_server - - bpy.utils.unregister_class(BLENDERMCP_PT_Panel) - bpy.utils.unregister_class(BLENDERMCP_OT_SetFreeTrialHyper3DAPIKey) - bpy.utils.unregister_class(BLENDERMCP_OT_StartServer) - bpy.utils.unregister_class(BLENDERMCP_OT_StopServer) - - del bpy.types.Scene.blendermcp_port - del bpy.types.Scene.blendermcp_server_running - del bpy.types.Scene.blendermcp_use_polyhaven - del bpy.types.Scene.blendermcp_use_hyper3d - del bpy.types.Scene.blendermcp_hyper3d_mode - del bpy.types.Scene.blendermcp_hyper3d_api_key - del bpy.types.Scene.blendermcp_use_sketchfab - del bpy.types.Scene.blendermcp_sketchfab_api_key - - print("BlenderMCP addon unregistered") - -if __name__ == "__main__": - register() diff --git a/scripts/addons/form_affinity_maya_config_pro/CHANGELOG.md b/scripts/addons/form_affinity_maya_config_pro/CHANGELOG.md index 983f7a8..d062891 100644 --- a/scripts/addons/form_affinity_maya_config_pro/CHANGELOG.md +++ b/scripts/addons/form_affinity_maya_config_pro/CHANGELOG.md @@ -2,6 +2,20 @@ All notable changes to **Maya Config Pro** are listed here. Versions match `blender_manifest.toml`. +## [1.8.3] — 2026-07-14 + +### Fixed +- **Keymaps:** Fixed crash on blend file load from stale addon keymap RNA handles; deferred `load_post` re-sync, skip modal maps in the addon layer, use Blender’s keymap import for nested operator props. + +### Changed +- **Blender support:** Added **5.2 LTS**; minimum target is now **4.5 LTS** (4.2–4.4 dropped). +- **Marking menu:** Loop/ring multi-select uses Blender 5.1+ operators; paint-mode submenu limited to mesh objects. + +## [1.8.2] — 2026-07-08 + +### Fixed +- **Quad Menu:** Space pie ortho views (Left/Right/Top/etc.) now affect only the active 3D viewport, not every viewport in multi-view layouts. + ## [1.8.1] — 2026-06-16 ### Fixed diff --git a/scripts/addons/form_affinity_maya_config_pro/INSTALL.txt b/scripts/addons/form_affinity_maya_config_pro/INSTALL.txt index 4d26e4d..f4d5ebf 100644 --- a/scripts/addons/form_affinity_maya_config_pro/INSTALL.txt +++ b/scripts/addons/form_affinity_maya_config_pro/INSTALL.txt @@ -1,4 +1,4 @@ -Maya Config Pro — Install the release ZIP (Blender 4.2+) +Maya Config Pro — Install the release ZIP (Blender 4.5+) ======================================================== This package is a Blender *extension* (blender_manifest.toml). Do not unzip diff --git a/scripts/addons/form_affinity_maya_config_pro/README.md b/scripts/addons/form_affinity_maya_config_pro/README.md index d995939..a5c3352 100644 --- a/scripts/addons/form_affinity_maya_config_pro/README.md +++ b/scripts/addons/form_affinity_maya_config_pro/README.md @@ -75,14 +75,14 @@ Maya Config Pro transforms Blender's interface and workflow to match Maya's fami This is the new modern way to install Maya Config Pro - no file copying required! #### Requirements -- Blender 4.2 LTS or newer +- Blender 4.5 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`) +2. **Install in Blender** (Blender 4.5+; 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** @@ -242,13 +242,13 @@ For older Blender versions (pre-4.2) or if you prefer the original mod approach: | 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 | +| 5.1.x | Full | Extension | +| 5.2.x LTS | Full | Extension | +| 4.2.x – 4.4.x | Unsupported | — | +| 3.0.x – 4.1.x | Legacy Only | Mod Installation | +| 2.83 – 2.93 | Legacy Only | Mod Installation | --- @@ -262,7 +262,7 @@ For older Blender versions (pre-4.2) or if you prefer the original mod approach: ### 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+ +- **Multi-Version Support:** Compatible with Blender 4.5 LTS, 5.0, 5.1, and 5.2 LTS - **No File Copying:** Everything applies at runtime, no installation directory modifications - **Safe Registration:** Error handling for all version-specific API differences diff --git a/scripts/addons/form_affinity_maya_config_pro/__init__.py b/scripts/addons/form_affinity_maya_config_pro/__init__.py index 8e6a37c..9508112 100644 --- a/scripts/addons/form_affinity_maya_config_pro/__init__.py +++ b/scripts/addons/form_affinity_maya_config_pro/__init__.py @@ -2,7 +2,7 @@ Maya Config Pro - Blender Extension A Maya-like configuration, shortcuts, and UI elements for Blender. -Version: 1.8.1 +Version: 1.8.3 Author: Form Affinity (Jesse Doyle) """ @@ -12,8 +12,8 @@ Author: Form Affinity (Jesse Doyle) bl_info = { "name": "Maya Config Pro", "author": "Form Affinity (Jesse Doyle)", - "version": (1, 8, 1), - "blender": (4, 2, 0), + "version": (1, 8, 3), + "blender": (4, 5, 0), "location": "View3D > Sidebar > Maya Config", "description": "Maya-like configuration, shortcuts, UI panels, and keymap presets", "warning": "", diff --git a/scripts/addons/form_affinity_maya_config_pro/blender_manifest.toml b/scripts/addons/form_affinity_maya_config_pro/blender_manifest.toml index 4bb7785..95f552e 100644 --- a/scripts/addons/form_affinity_maya_config_pro/blender_manifest.toml +++ b/scripts/addons/form_affinity_maya_config_pro/blender_manifest.toml @@ -3,12 +3,12 @@ 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.8.1" +version = "1.8.3" type = "add-on" maintainer = "Form Affinity" license = ["GPL-3.0-or-later"] -blender_version_min = "4.2.0" +blender_version_min = "4.5.0" website = "https://github.com/FormAffinity/MayaConfigPro" 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 index 6cab827..6d9b12a 100644 --- a/scripts/addons/form_affinity_maya_config_pro/keyconfigs/fa_hotkeys.py +++ b/scripts/addons/form_affinity_maya_config_pro/keyconfigs/fa_hotkeys.py @@ -9,14 +9,14 @@ that layer without restarting. """ import bpy +from bl_keymap_utils.io import keymap_init_from_data from ..utils import compat from ..utils import keymap_fix # Import the keyconfig data from . import fa_hotkeys_data -# Addon keymaps: (keymap, keymap_item) and created keymaps to remove for clean sync -addon_keymaps: list = [] +# Addon keymaps we created (for unregister while handles are still valid) addon_keymap_objects: list = [] # Set from __init__.register to match this add-on's module id @@ -24,6 +24,41 @@ _addon_id: str = "form_affinity_maya_config_pro" # Message bus: react to keyconfig changes from Preferences _msgbus_owner = object() +_load_post_timer = None + + +def _clear_keymap_tracking() -> None: + addon_keymap_objects.clear() + + +def _keymap_signature(km_name: str, km_args: dict) -> tuple: + return ( + km_name, + km_args.get("space_type", "EMPTY"), + km_args.get("region_type", "WINDOW"), + bool(km_args.get("modal", False)), + ) + + +def _purge_tracked_keymaps(kc) -> None: + """Remove MCP addon keymaps without stale RNA handles (safe after file load).""" + if not kc or not hasattr(fa_hotkeys_data, "keyconfig_data"): + _clear_keymap_tracking() + return + + signatures = { + _keymap_signature(name, args) + for name, args, _ in fa_hotkeys_data.keyconfig_data + if not args.get("modal", False) + } + for km in list(kc.keymaps): + sig = (km.name, km.space_type, km.region_type, km.is_modal) + if sig in signatures: + try: + kc.keymaps.remove(km) + except Exception: + pass + _clear_keymap_tracking() def set_addon_id(addon_id: str) -> None: @@ -62,97 +97,88 @@ def register_keymaps(): if not kc: return - try: - if hasattr(fa_hotkeys_data, "keyconfig_data"): - for km_name, km_args, km_content in fa_hotkeys_data.keyconfig_data: - km = kc.keymaps.new(name=km_name, **km_args) - addon_keymap_objects.append(km) + if not hasattr(fa_hotkeys_data, "keyconfig_data"): + return - 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 - - 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), - ) - - 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) - - 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}") + for km_name, km_args, km_content in fa_hotkeys_data.keyconfig_data: + if km_args.get("modal", False): + continue + try: + km = kc.keymaps.new(name=km_name, **km_args) + addon_keymap_objects.append(km) + keymap_init_from_data(km, km_content["items"], is_modal=False) + except Exception as e: + print(f"Maya Config Pro: Could not register keymap '{km_name}': {e}") -def unregister_keymaps(): +def unregister_keymaps(*, drop_stale: bool = False) -> None: """Remove all MCP addon keymap items and the keymap objects we created.""" - global addon_keymap_objects wm = bpy.context.window_manager kc = wm.keyconfigs.addon if not kc: + _clear_keymap_tracking() return - for km, kmi in list(addon_keymaps): - try: - km.keymap_items.remove(kmi) - except Exception: - pass - - addon_keymaps.clear() + if drop_stale or not addon_keymap_objects: + _purge_tracked_keymaps(kc) + return + removed_any = False for km in reversed(addon_keymap_objects): try: kc.keymaps.remove(km) + removed_any = True except Exception: pass - addon_keymap_objects.clear() + + if not removed_any: + _purge_tracked_keymaps(kc) + else: + _clear_keymap_tracking() -def sync_addon_keymaps() -> None: +def sync_addon_keymaps(*, after_file_load: bool = False) -> None: """ If "Auto-load FA Keymap" is on and the active preset is `fa_hotkeys`, register the addon keymap layer; otherwise remove it. Safe to call often (switcher, prefs, msgbus). """ prefs = _get_prefs() if not prefs or not getattr(prefs, "auto_load_keymap", False): - unregister_keymaps() + unregister_keymaps(drop_stale=after_file_load) return if is_fa_keyconfig_active(): - unregister_keymaps() + unregister_keymaps(drop_stale=after_file_load) register_keymaps() try: keymap_fix.patch_node_editor_alt_rmb("FA_HOTKEYS") except Exception: pass else: - unregister_keymaps() + unregister_keymaps(drop_stale=after_file_load) @bpy.app.handlers.persistent def _mcp_load_post_sync(_a, _b) -> None: - try: - sync_addon_keymaps() - except Exception as e: - print(f"Warning: Maya Config Pro: keymap sync after load: {e}") + global _load_post_timer + # File load invalidates stored keymap RNA handles — never touch them here. + _clear_keymap_tracking() + if _load_post_timer is not None: + try: + bpy.app.timers.unregister(_load_post_timer) + except Exception: + pass + + def _sync_after_load(): + global _load_post_timer + _load_post_timer = None + try: + sync_addon_keymaps(after_file_load=True) + except Exception as e: + print(f"Warning: Maya Config Pro: keymap sync after load: {e}") + return None + + _load_post_timer = bpy.app.timers.register(_sync_after_load, first_interval=0.0) def _msgbus_keyconfig(_): @@ -179,6 +205,13 @@ def register_keymap_listeners() -> None: def unregister_keymap_listeners() -> None: + global _load_post_timer + if _load_post_timer is not None: + try: + bpy.app.timers.unregister(_load_post_timer) + except Exception: + pass + _load_post_timer = None try: bpy.msgbus.clear_by_owner(_msgbus_owner) except Exception: 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 index fa2eaab..5f86a9c 100644 --- a/scripts/addons/form_affinity_maya_config_pro/ops/marking_menu.py +++ b/scripts/addons/form_affinity_maya_config_pro/ops/marking_menu.py @@ -8,6 +8,13 @@ from ..utils import compat from bpy.types import Menu +def _draw_multi_loop_select(layout, *, ring: bool, icon: str) -> None: + op_id = compat.mesh_multi_loop_select_op(ring=ring) + op = layout.operator(op_id, text="", icon=icon) + if op and op_id == "mesh.loop_multi_select": + op.ring = ring + + # ------------------------------------------------------------------------ # Sub Menus # ------------------------------------------------------------------------ @@ -46,10 +53,14 @@ class MCP_MT_SubMode(Menu): 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' + obj = context.object + if obj is None or obj.type != "MESH": + layout.label(text="Requires a mesh object") + return + 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): @@ -130,12 +141,8 @@ class MCP_MT_MarkingMenu(Menu): 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 + _draw_multi_loop_select(other_menu, ring=False, icon="ANCHOR_LEFT") + _draw_multi_loop_select(other_menu, ring=True, icon="ANCHOR_TOP") other_menu.operator("mesh.select_more", text="", icon="ADD") other_menu.operator("mesh.select_less", text="", icon="REMOVE") diff --git a/scripts/addons/form_affinity_maya_config_pro/ops/quadview.py b/scripts/addons/form_affinity_maya_config_pro/ops/quadview.py index 08cdd91..68d21b7 100644 --- a/scripts/addons/form_affinity_maya_config_pro/ops/quadview.py +++ b/scripts/addons/form_affinity_maya_config_pro/ops/quadview.py @@ -8,6 +8,37 @@ from ..utils import compat from bpy.types import Menu +def _set_active_viewport_ortho_axis(context, axis: str): + """Apply an axis view in orthographic mode to the invoking 3D viewport only.""" + area = context.area + if area is None or area.type != "VIEW_3D": + return {"CANCELLED"} + + space = context.space_data + if space is None or space.type != "VIEW_3D": + space = area.spaces.active + if space is None: + return {"CANCELLED"} + + region = context.region + if region is None: + region = next((r for r in area.regions if r.type == "WINDOW"), None) + if region is None: + return {"CANCELLED"} + + with context.temp_override( + window=context.window, + screen=context.screen, + area=area, + region=region, + space_data=space, + ): + bpy.ops.view3d.view_axis(type=axis) + + space.region_3d.view_perspective = "ORTHO" + return {"FINISHED"} + + # ------------------------------------------------------------------------ # Main Quad Menu # ------------------------------------------------------------------------ @@ -56,13 +87,7 @@ class MCP_OT_LeftOrtho(bpy.types.Operator): 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'} + return _set_active_viewport_ortho_axis(context, "LEFT") class MCP_OT_RightOrtho(bpy.types.Operator): @@ -72,13 +97,7 @@ class MCP_OT_RightOrtho(bpy.types.Operator): 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'} + return _set_active_viewport_ortho_axis(context, "RIGHT") class MCP_OT_BottomOrtho(bpy.types.Operator): @@ -88,13 +107,7 @@ class MCP_OT_BottomOrtho(bpy.types.Operator): 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'} + return _set_active_viewport_ortho_axis(context, "BOTTOM") class MCP_OT_TopOrtho(bpy.types.Operator): @@ -104,13 +117,7 @@ class MCP_OT_TopOrtho(bpy.types.Operator): 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'} + return _set_active_viewport_ortho_axis(context, "TOP") class MCP_OT_FrontOrtho(bpy.types.Operator): @@ -120,13 +127,7 @@ class MCP_OT_FrontOrtho(bpy.types.Operator): 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'} + return _set_active_viewport_ortho_axis(context, "FRONT") class MCP_OT_BackOrtho(bpy.types.Operator): @@ -136,13 +137,7 @@ class MCP_OT_BackOrtho(bpy.types.Operator): 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'} + return _set_active_viewport_ortho_axis(context, "BACK") # ------------------------------------------------------------------------ diff --git a/scripts/addons/form_affinity_maya_config_pro/utils/compat.py b/scripts/addons/form_affinity_maya_config_pro/utils/compat.py index e5b3290..29d1f85 100644 --- a/scripts/addons/form_affinity_maya_config_pro/utils/compat.py +++ b/scripts/addons/form_affinity_maya_config_pro/utils/compat.py @@ -1,6 +1,6 @@ """ This module provides API compatibility functions for handling differences -between Blender 4.2, 4.4, 4.5, and 5.0. +between supported Blender versions (4.5 LTS through 5.2 LTS). """ import bpy @@ -50,9 +50,9 @@ def get_tools_region_type(): In Blender 2.8+, 'TOOLS' was replaced by 'UI'. Returns: - str: 'UI' (for all supported versions 4.2+) + str: 'UI' (for all supported versions 4.5+) """ - # For Blender 4.2 and later, always use 'UI' + # For Blender 4.5 and later, always use 'UI' return 'UI' @@ -72,8 +72,16 @@ def temp_override(context, **kwargs): # Blender 3.2+ uses temp_override return context.temp_override(**kwargs) else: - # Older versions - this shouldn't happen for 4.2+ minimum + # Older versions - this shouldn't happen for 4.5+ minimum # but keeping for safety override = context.copy() override.update(kwargs) return override + + +def mesh_multi_loop_select_op(*, ring: bool) -> str: + """Operator id for loop (ring=False) or ring (ring=True) multi-select.""" + if version.is_version_at_least(5, 1, 0): + return "mesh.select_edge_ring_multi" if ring else "mesh.select_edge_loop_multi" + return "mesh.loop_multi_select" + diff --git a/scripts/addons/form_affinity_maya_config_pro/utils/version.py b/scripts/addons/form_affinity_maya_config_pro/utils/version.py index 3d303b4..3f56a23 100644 --- a/scripts/addons/form_affinity_maya_config_pro/utils/version.py +++ b/scripts/addons/form_affinity_maya_config_pro/utils/version.py @@ -1,53 +1,32 @@ """ -This module provides version detection and comparison utilities for -multi-version Blender support (4.2, 4.4, 4.5, and 5.0). +Version detection and comparison utilities for Blender 4.5 LTS through 5.2 LTS. """ 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) +VERSION_5_1 = (5, 1, 0) +VERSION_5_2 = (5, 2, 0) def get_blender_version(): - """ - Returns the current Blender version as a tuple (major, minor, patch). - - Returns: - tuple: (major, minor, patch) version numbers - """ + """Return the current Blender version as (major, minor, patch).""" 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" - """ + """Return the current Blender version as '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 - """ + """True when the running Blender version is >= major.minor.patch.""" current = get_blender_version() target = (major, minor, patch) - + if current[0] != target[0]: return current[0] > target[0] if current[1] != target[1]: @@ -56,61 +35,55 @@ def is_version_at_least(major, minor=0, patch=0): 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 - """ + """True when the running Blender version is < major.minor.patch.""" 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 + Return a coarse support bucket for the running Blender version. + + Supported targets: 4.5, 5.0, 5.1, 5.2. """ 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 + if minor < 5: + return "4.4" + return "4.5" + if major >= 5: + if minor < 1: + return "5.0" + if minor < 2: + return "5.1" + return "5.2" + return f"{major}.{minor}" def is_version_4_4(): - """Check if running Blender 4.4 (4.4.x only, not 4.5).""" + """True on Blender 4.4.x.""" version = get_blender_version() return version[0] == 4 and version[1] == 4 def is_version_4_5(): - """Check if running Blender 4.5 LTS.""" + """True on 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) + """True on Blender 5.0.x.""" + version = get_blender_version() + return version[0] == 5 and version[1] == 0 + + +def is_version_5_1(): + """True on Blender 5.1.x.""" + version = get_blender_version() + return version[0] == 5 and version[1] == 1 + + +def is_version_5_2(): + """True on Blender 5.2 LTS and newer 5.x.""" + return is_version_at_least(5, 2, 0) diff --git a/scripts/presets/interface_theme/retard.xml b/scripts/presets/interface_theme/retard.xml index 217bab3..8b113ba 100644 --- a/scripts/presets/interface_theme/retard.xml +++ b/scripts/presets/interface_theme/retard.xml @@ -321,6 +321,10 @@ @@ -440,16 +444,16 @@ header="#303030b3" header_text="#eeeeee" header_text_hi="#ffffff" - button="#30303000" - button_title="#ffffff" - button_text="#cccccc" - button_text_hi="#ffffff" - navigation_bar="#1d1d1dff" - execution_buts="#303030ff" - tab_active="#303030" - tab_inactive="#1d1d1d" - tab_back="#181818ff" - tab_outline="#3d3d3dff" + button="#00000000" + button_title="#000000" + button_text="#000000" + button_text_hi="#000000" + navigation_bar="#00000000" + execution_buts="#00000000" + tab_active="#000000" + tab_inactive="#000000" + tab_back="#00000000" + tab_outline="#00000000" > @@ -471,8 +475,8 @@ @@ -481,17 +485,17 @@ @@ -545,10 +549,10 @@ @@ -568,22 +572,22 @@ header="#303030b3" header_text="#eeeeee" header_text_hi="#ffffff" - button="#30303000" - button_title="#ffffff" - button_text="#cccccc" - button_text_hi="#ffffff" - navigation_bar="#303030ff" - execution_buts="#303030ff" - tab_active="#303030" - tab_inactive="#1d1d1d" - tab_back="#181818ff" - tab_outline="#3d3d3dff" + button="#00000000" + button_title="#000000" + button_text="#000000" + button_text_hi="#000000" + navigation_bar="#00000000" + execution_buts="#00000000" + tab_active="#000000" + tab_inactive="#000000" + tab_back="#00000000" + tab_outline="#00000000" > @@ -595,12 +599,12 @@ @@ -650,10 +654,10 @@ @@ -662,38 +666,38 @@ @@ -705,22 +709,22 @@ header="#303030b3" header_text="#eeeeee" header_text_hi="#ffffff" - button="#22222200" - button_title="#ffffff" - button_text="#cccccc" - button_text_hi="#ffffff" - navigation_bar="#1d1d1dff" - execution_buts="#303030ff" - tab_active="#303030" - tab_inactive="#1d1d1d" - tab_back="#181818ff" - tab_outline="#3d3d3dff" + button="#00000000" + button_title="#000000" + button_text="#000000" + button_text_hi="#000000" + navigation_bar="#00000000" + execution_buts="#00000000" + tab_active="#000000" + tab_inactive="#000000" + tab_back="#00000000" + tab_outline="#00000000" > @@ -728,10 +732,10 @@ @@ -748,9 +752,9 @@ face="#ffffff0a" face_select="#ff85003c" face_mode_select="#00000000" - face_dot="#ff8500" + face_dot="#000000" facedot_size="3" - freestyle_face_mark="#7fff7f33" + freestyle_face_mark="#00000000" face_retopology="#00000000" face_back="#00000000" face_front="#00000000" @@ -766,22 +770,22 @@ preview_stitch_unstitchable="#ff0000ff" preview_stitch_active="#e1d2c323" uv_shadow="#707070ff" - frame_current="#4772b3" + frame_current="#000000" metadatabg="#000000" metadatatext="#ffffff" handle_free="#000000" - handle_auto="#909000" - handle_align="#803060" + handle_auto="#000000" + handle_align="#000000" handle_sel_free="#000000" - handle_sel_auto="#f0ff40" - handle_sel_align="#f090a0" + handle_sel_auto="#000000" + handle_sel_align="#000000" handle_auto_clamped="#000000" handle_sel_auto_clamped="#000000" handle_vertex="#000000" - handle_vertex_select="#ffff00" - handle_vertex_size="5" - paint_curve_handle="#7fff7f7f" - paint_curve_pivot="#ff7f7f7f" + handle_vertex_select="#000000" + handle_vertex_size="0" + paint_curve_handle="#00000000" + paint_curve_pivot="#00000000" > @@ -815,8 +819,8 @@ @@ -839,25 +843,25 @@ text_strip="#9f926f" active_strip="#ffffff" selected_strip="#ff8f0d" - frame_current="#4772b3" - time_scrub_background="#121212ff" - time_marker_line="#ffffff4d" - time_marker_line_selected="#ffffffb3" - keyframe="#bfbfbf" - keyframe_selected="#ffbe33" - keyframe_breakdown="#b3dbe8" - keyframe_breakdown_selected="#54bfed" - keyframe_movehold="#808080" - keyframe_movehold_selected="#ffaf23" - keyframe_generated="#585858" - keyframe_generated_selected="#a28962" + frame_current="#000000" + time_scrub_background="#00000000" + time_marker_line="#00000000" + time_marker_line_selected="#00000000" + keyframe="#000000" + keyframe_selected="#000000" + keyframe_breakdown="#000000" + keyframe_breakdown_selected="#000000" + keyframe_movehold="#000000" + keyframe_movehold_selected="#000000" + keyframe_generated="#000000" + keyframe_generated_selected="#000000" keyframe_border="#000000ff" keyframe_border_selected="#000000ff" draw_action="#50c8ff" preview_back="#000000" metadatabg="#000000" metadatatext="#ffffff" - preview_range="#a14d0066" + preview_range="#00000000" row_alternate="#ffffff05" text_strip_cursor="#71a8ffff" selected_text="#ffffff4d" @@ -871,22 +875,22 @@ header="#303030b3" header_text="#eeeeee" header_text_hi="#ffffff" - button="#30303000" - button_title="#ffffff" - button_text="#cccccc" - button_text_hi="#ffffff" - navigation_bar="#1d1d1dff" - execution_buts="#303030ff" - tab_active="#303030" - tab_inactive="#1d1d1d" - tab_back="#181818ff" - tab_outline="#3d3d3dff" + button="#00000000" + button_title="#000000" + button_text="#000000" + button_text_hi="#000000" + navigation_bar="#00000000" + execution_buts="#00000000" + tab_active="#000000" + tab_inactive="#000000" + tab_back="#00000000" + tab_outline="#00000000" > @@ -894,10 +898,10 @@ @@ -906,7 +910,7 @@ @@ -964,22 +968,22 @@ header="#303030b3" header_text="#eeeeee" header_text_hi="#ffffff" - button="#30303000" - button_title="#ffffff" - button_text="#cccccc" - button_text_hi="#ffffff" - navigation_bar="#1d1d1dff" - execution_buts="#303030ff" - tab_active="#303030" - tab_inactive="#1d1d1d" - tab_back="#181818ff" - tab_outline="#3d3d3dff" + button="#00000000" + button_title="#000000" + button_text="#000000" + button_text_hi="#000000" + navigation_bar="#00000000" + execution_buts="#00000000" + tab_active="#000000" + tab_inactive="#000000" + tab_back="#00000000" + tab_outline="#00000000" > @@ -1014,13 +1018,14 @@ texture_node="#e66800" shader_node="#24b524" script_node="#084d4d" - pattern_node="#6c696f" - layout_node="#6c696f" + pattern_node="#000000" + layout_node="#000000" geometry_node="#00d6a3" attribute_node="#001566" simulation_zone="#66416233" repeat_zone="#76512f33" foreach_geometry_element_zone="#33527f33" + closure_zone="#7d7d3a33" > @@ -1054,10 +1059,10 @@ @@ -1082,22 +1087,22 @@ header="#282828b3" header_text="#eeeeee" header_text_hi="#ffffff" - button="#30303000" - button_title="#ffffff" - button_text="#cccccc" - button_text_hi="#ffffff" - navigation_bar="#1d1d1dff" - execution_buts="#303030ff" - tab_active="#303030" - tab_inactive="#1d1d1d" - tab_back="#181818ff" - tab_outline="#3d3d3dff" + button="#00000000" + button_title="#000000" + button_text="#000000" + button_text_hi="#000000" + navigation_bar="#00000000" + execution_buts="#00000000" + tab_active="#000000" + tab_inactive="#000000" + tab_back="#00000000" + tab_outline="#00000000" > @@ -1109,11 +1114,8 @@ @@ -1165,22 +1167,22 @@ header="#303030b3" header_text="#eeeeee" header_text_hi="#ffffff" - button="#1d1d1dff" - button_title="#ffffff" - button_text="#cccccc" - button_text_hi="#ffffff" - navigation_bar="#303030ff" - execution_buts="#303030ff" - tab_active="#303030" - tab_inactive="#1d1d1d" - tab_back="#181818ff" - tab_outline="#3d3d3dff" + button="#00000000" + button_title="#000000" + button_text="#000000" + button_text_hi="#000000" + navigation_bar="#00000000" + execution_buts="#00000000" + tab_active="#000000" + tab_inactive="#000000" + tab_back="#00000000" + tab_outline="#00000000" > @@ -1206,22 +1208,22 @@ header="#303030b3" header_text="#eeeeee" header_text_hi="#ffffff" - button="#30303000" - button_title="#ffffff" - button_text="#cccccc" - button_text_hi="#ffffff" - navigation_bar="#1d1d1dff" - execution_buts="#303030ff" - tab_active="#303030" - tab_inactive="#1d1d1d" - tab_back="#181818ff" - tab_outline="#3d3d3dff" + button="#00000000" + button_title="#000000" + button_text="#000000" + button_text_hi="#000000" + navigation_bar="#00000000" + execution_buts="#00000000" + tab_active="#000000" + tab_inactive="#000000" + tab_back="#00000000" + tab_outline="#00000000" > @@ -1242,25 +1244,26 @@ path_after="#0000ff" path_keyframe_before="#ffc4c4" path_keyframe_after="#c4c4ff" - frame_current="#4772b3" - time_scrub_background="#181818ff" - time_marker_line="#ffffff4d" - time_marker_line_selected="#ffffffb3" - strips="#ffffff" - strips_selected="#ff8c00" + frame_current="#000000" + time_scrub_background="#00000000" + time_marker_line="#00000000" + time_marker_line_selected="#00000000" + strips="#000000" + strips_selected="#000000" metadatabg="#000000" metadatatext="#ffffff" + preview_range="#00000000" handle_free="#000000" - handle_auto="#909000" - handle_align="#803060" + handle_auto="#000000" + handle_align="#000000" handle_sel_free="#000000" - handle_sel_auto="#f0ff40" - handle_sel_align="#f090a0" - handle_auto_clamped="#994030" - handle_sel_auto_clamped="#f0af90" + handle_sel_auto="#000000" + handle_sel_align="#000000" + handle_auto_clamped="#000000" + handle_sel_auto_clamped="#000000" handle_vertex="#000000" - handle_vertex_select="#ff8500" - handle_vertex_size="5" + handle_vertex_select="#000000" + handle_vertex_size="0" > @@ -1294,10 +1297,10 @@ @@ -1314,22 +1317,22 @@ header="#181818b3" header_text="#eeeeee" header_text_hi="#ffffff" - button="#30303000" - button_title="#ffffff" - button_text="#cccccc" - button_text_hi="#ffffff" - navigation_bar="#1d1d1dff" - execution_buts="#303030ff" - tab_active="#303030" - tab_inactive="#1d1d1d" - tab_back="#181818ff" - tab_outline="#3d3d3dff" + button="#00000000" + button_title="#000000" + button_text="#000000" + button_text_hi="#000000" + navigation_bar="#00000000" + execution_buts="#00000000" + tab_active="#000000" + tab_inactive="#000000" + tab_back="#00000000" + tab_outline="#00000000" > @@ -1348,22 +1351,22 @@ header="#181818b3" header_text="#888888" header_text_hi="#ffffff" - button="#30303000" + button="#00000000" button_title="#000000" - button_text="#cccccc" - button_text_hi="#ffffff" - navigation_bar="#1d1d1dff" - execution_buts="#303030ff" - tab_active="#303030" - tab_inactive="#1d1d1d" - tab_back="#181818ff" - tab_outline="#3d3d3dff" + button_text="#000000" + button_text_hi="#000000" + navigation_bar="#00000000" + execution_buts="#00000000" + tab_active="#000000" + tab_inactive="#000000" + tab_back="#00000000" + tab_outline="#00000000" > @@ -1384,22 +1387,22 @@ header="#303030b3" header_text="#eeeeee" header_text_hi="#ffffff" - button="#30303000" - button_title="#ffffff" - button_text="#cccccc" - button_text_hi="#ffffff" - navigation_bar="#1d1d1dff" - execution_buts="#303030ff" - tab_active="#303030" - tab_inactive="#1d1d1d" - tab_back="#181818ff" - tab_outline="#3d3d3dff" + button="#00000000" + button_title="#000000" + button_text="#000000" + button_text_hi="#000000" + navigation_bar="#00000000" + execution_buts="#00000000" + tab_active="#000000" + tab_inactive="#000000" + tab_back="#00000000" + tab_outline="#00000000" > @@ -1407,10 +1410,10 @@