From 32317c446c2750741b7ed219c99e2a80137401ad Mon Sep 17 00:00:00 2001 From: D4rkst3r Date: Wed, 29 Jul 2026 06:45:35 +0200 Subject: [PATCH] Extension-Packaging: blender_manifest.toml + Build-Skript + dist/ (Zip + index.json) Installierbar als Remote-Extension via Gitea-Raw-URL, Updates per Klick. Co-Authored-By: Claude Opus 4.8 --- .gitignore | 3 ++ README.md | 28 +++++++++++++++++ blender_manifest.toml | 23 ++++++++++++++ build.ps1 | 40 +++++++++++++++++++++++++ dist/index.json | 31 +++++++++++++++++++ dist/stylized_rock_generator-2.0.0.zip | Bin 0 -> 9183 bytes 6 files changed, 125 insertions(+) create mode 100644 blender_manifest.toml create mode 100644 build.ps1 create mode 100644 dist/index.json create mode 100644 dist/stylized_rock_generator-2.0.0.zip diff --git a/.gitignore b/.gitignore index fa22445..562c4d8 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,9 @@ rock_presets.json *.blend1 *.blend2 +# Extension-Build-Staging (dist/ wird bewusst committet -> Hosting via Raw-URL) +_extsrc/ + # OS / Editor .DS_Store Thumbs.db diff --git a/README.md b/README.md index f801a3f..7d19af3 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,34 @@ Update: einfach die neue `.py` erneut installieren (gleicher Modulname) oder das Repo lokal ziehen und den Addon-Pfad in den Preferences auf den Repo-Ordner zeigen lassen. +## Installation als Extension (via URL, mit Auto-Update) + +Ab Blender 4.2 / 5.x als **Remote-Extension-Repository** – einmal die URL +eintragen, danach gehen Updates per Klick. + +1. Das Gitea-Repo muss **oeffentlich** sein (sonst kann Blender die Raw-URL nicht + ohne Login laden). +2. Blender → *Edit → Preferences → Get Extensions → oben rechts das Dropdown → + Repositories → „Add Remote Repository"*. +3. Als URL eintragen: + + ``` + https://git.d4rkst3r.de/D4rkst3r/stylized-rock-generator/raw/branch/main/dist/index.json + ``` + +4. „Check for Updates" aktivieren, bestaetigen. Die Extension erscheint in der + Liste → *Install*. + +**Updaten (Maintainer-Seite):** + +1. `version` in `blender_manifest.toml` (und `bl_info["version"]` in der `.py`) erhoehen. +2. `./build.ps1` (oder `blender --command extension build …` + `… server-generate …`). +3. `git add -A && git commit -m "vX.Y.Z" && git push`. +4. Nutzer: in Blender *Check for Updates* → *Update*. + +Das gebaute Zip + `index.json` liegen in `dist/` und werden bewusst mitversioniert, +damit die Raw-URL sie ausliefert. + --- ## Features diff --git a/blender_manifest.toml b/blender_manifest.toml new file mode 100644 index 0000000..d12d621 --- /dev/null +++ b/blender_manifest.toml @@ -0,0 +1,23 @@ +schema_version = "1.0.0" + +id = "stylized_rock_generator" +version = "2.0.0" +name = "Stylized Rock Generator" +tagline = "Batch-Generator fuer stylized Rocks mit UE5-Export" +maintainer = "D4rkst3r" +type = "add-on" + +website = "https://git.d4rkst3r.de/D4rkst3r/stylized-rock-generator" + +# Gueltige Add-on-Tags laut Blender-Extension-Spezifikation. +tags = ["Object", "Mesh", "Modeling"] + +blender_version_min = "4.2.0" + +license = [ + "SPDX:GPL-3.0-or-later", +] + +copyright = [ + "2026 D4rkst3r", +] diff --git a/build.ps1 b/build.ps1 new file mode 100644 index 0000000..55744c0 --- /dev/null +++ b/build.ps1 @@ -0,0 +1,40 @@ +# Baut die Extension und aktualisiert das Repo-Listing (index.json) in dist/. +# +# Aufruf: +# .\build.ps1 # nutzt "blender" aus dem PATH +# .\build.ps1 -Blender "E:\...\blender.exe" +# +# Update-Workflow: +# 1. version in blender_manifest.toml erhoehen (und bl_info/version in der .py) +# 2. .\build.ps1 +# 3. git add -A; git commit -m "vX.Y.Z"; git push +# 4. In Blender: Preferences -> Get Extensions -> Repo -> "Check for Updates" + +param( + [string]$Blender = "blender" +) + +$ErrorActionPreference = "Stop" +$root = $PSScriptRoot +$stage = Join-Path $root "_extsrc" +$dist = Join-Path $root "dist" + +if (Test-Path $stage) { Remove-Item -Recurse -Force $stage } +New-Item -ItemType Directory -Force -Path $stage | Out-Null +New-Item -ItemType Directory -Force -Path $dist | Out-Null + +# Staging: Manifest + Addon-Code als __init__.py (Extension = Package) +Copy-Item (Join-Path $root "blender_manifest.toml") (Join-Path $stage "blender_manifest.toml") +Copy-Item (Join-Path $root "stylized_rock_generator.py") (Join-Path $stage "__init__.py") + +Write-Host "== extension build ==" -ForegroundColor Cyan +& $Blender --command extension build --source-dir $stage --output-dir $dist +if ($LASTEXITCODE -ne 0) { throw "extension build fehlgeschlagen (Exit $LASTEXITCODE)" } + +Write-Host "== server-generate (index.json) ==" -ForegroundColor Cyan +& $Blender --command extension server-generate --repo-dir $dist +if ($LASTEXITCODE -ne 0) { throw "server-generate fehlgeschlagen (Exit $LASTEXITCODE)" } + +Remove-Item -Recurse -Force $stage +Write-Host "Fertig. dist/ enthaelt Zip + index.json." -ForegroundColor Green +Get-ChildItem $dist | Select-Object Name, Length | Format-Table -AutoSize diff --git a/dist/index.json b/dist/index.json new file mode 100644 index 0000000..98b9bcf --- /dev/null +++ b/dist/index.json @@ -0,0 +1,31 @@ +{ + "version": "v1", + "blocklist": [], + "data": [ + { + "schema_version": "1.0.0", + "id": "stylized_rock_generator", + "name": "Stylized Rock Generator", + "tagline": "Batch-Generator fuer stylized Rocks mit UE5-Export", + "version": "2.0.0", + "type": "add-on", + "maintainer": "D4rkst3r", + "license": [ + "SPDX:GPL-3.0-or-later" + ], + "blender_version_min": "4.2.0", + "website": "https://git.d4rkst3r.de/D4rkst3r/stylized-rock-generator", + "copyright": [ + "2026 D4rkst3r" + ], + "tags": [ + "Object", + "Mesh", + "Modeling" + ], + "archive_url": "./stylized_rock_generator-2.0.0.zip", + "archive_size": 9183, + "archive_hash": "sha256:7bcf0d9cc56015157dfa17264d9ea51e624e8c0013f84b59069bcd3386815ad6" + } + ] +} \ No newline at end of file diff --git a/dist/stylized_rock_generator-2.0.0.zip b/dist/stylized_rock_generator-2.0.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..93781ed9aa78b76de52a02020be4597b4d3a8bd3 GIT binary patch literal 9183 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