Files
stylized-rock-generator/build.ps1
T
D4rkst3randClaude Opus 4.8 71b9982441 Panels aufgeraeumt (alle vier Addons) + Test-Suite instandgesetzt
Panel-Umbau
-----------
Jedes Addon hatte seine Einstellungen als Kette dauerhaft offener Boxen - beim
Rock Generator 15 Stueck, man musste am ganzen Panel vorbeiscrollen, um an den
Erzeugen-Knopf zu kommen. Jetzt steht oben nur, was man bei jedem Asset anfasst
(Vorlage, Name, grosser Erzeugen-Knopf, Zufall), der Rest liegt in nummerierten,
eingeklappten Unter-Panels in der Reihenfolge des Arbeitsablaufs:

  Rock Gen    9 Unter-Panels (Benennung ... Textur-Bake)
  Tree Gen    4 (Wachstum, Blattwerk, Zusatz-Ebenen, Export)
  Grass Gen   4 (Form, Haltung, Batch, Kanal-Belegung)
  Asset Utils 5 (war schon so, dient als Vorlage)

Schalter, die ein ganzes Unter-Panel steuern (Vertex-Farben backen,
Wachstums-Stufen), sitzen jetzt als Haekchen im Panel-Kopf - Zustand sichtbar
ohne aufzuklappen.

Gemessen statt geglaubt: test_panels.py registriert alle vier Addons, laesst
jedes Panel zeichnen, prueft Tab-Zugehoerigkeit und Auf-/Zugeklappt-Absicht,
dass jeder angebotene Operator existiert - und vor allem, dass JEDE definierte
Property irgendwo erreichbar bleibt (Zweige wie base_shape='BOX' werden dabei
durchgeschaltet). Ergebnis: 0 von 122 Properties beim Umbau verloren.

Test-Suite
----------
Beim Gegenpruefen kam heraus, dass fuenf Tests still veraltet waren und eine
echte Regression nicht gemeldet haetten:

  test_rock_gen      suchte Objekte mit Praefix "Rock_" - die heissen seit dem
                     Benennungssystem "Fels_A_M_01". Fand 0 von 3.
  test_base_shapes   loeschte am Schleifenanfang ALLE Objekte, auch die eigenen
                     Kopien aus vorigen Durchlaeufen -> StructRNA removed.
  test_ecogame_tree  erwartete eine feste Namensliste ohne die spaeter
                     dazugekommenen _Leaf-Objekte.
  test_tree_addon    dito, ausserdem Zip-Version 1.22.0 fest verdrahtet.
  test_leaves        Zip-Version 1.23.0 fest verdrahtet.

Drei Muster vermieden statt nur die Symptome geflickt: neue Objekte ueber die
Differenz vorher/nachher finden statt ueber ein Namens-Praefix, Zips per glob
statt mit fester Version, Zusatz-Ebenen beim Zaehlen herausfiltern.

Neu: run_tests.ps1 faehrt die komplette Suite mit einem Befehl (-Filter fuer
einzelne). Genau das fehlte - deshalb war das Veralten nicht aufgefallen.
13 von 13 Tests bestehen.

Nebenbei
--------
build.ps1 ruft server-generate jetzt mit --html auf (browsbare index.html fuer
statisches Hosting). Nachgemessen und im README festgehalten: zwei Zips
derselben Extension-ID sind KEIN Versions-Archiv - server-generate warnt
("archive found with duplicates ... conflicting blender versions"), mehrere
Versionen einer ID gehen nur bei verschiedenen Blender-Bereichen.

Versionen: Rock 2.13.0, Tree 1.24.0, Grass 1.1.0, Asset Utils 1.1.0

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-31 12:12:38 +02:00

67 lines
3.1 KiB
PowerShell

# Baut ALLE Extensions dieses Repos und aktualisiert das Repo-Listing (index.json).
#
# Ein Blender-Extension-Repo kann MEHRERE Extensions ausliefern: "server-generate"
# scannt den dist/-Ordner und listet jedes gefundene Zip. Dadurch liefert EINE
# URL in Blender sowohl den Rock- als auch den Tree-Generator.
#
# Aufruf:
# .\build.ps1 # nutzt "blender" aus dem PATH
# .\build.ps1 -Blender "E:\...\blender.exe"
#
# Update-Workflow:
# 1. version im jeweiligen Manifest erhoehen (und bl_info 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
$dist = Join-Path $root "dist"
New-Item -ItemType Directory -Force -Path $dist | Out-Null
# name = Staging-Ordner, manifest = Quelldatei, source = Addon-Code
$extensions = @(
@{ name = "rock"; manifest = "blender_manifest.toml"; source = "stylized_rock_generator.py" },
@{ name = "tree"; manifest = "blender_manifest_tree.toml"; source = "stylized_tree_generator.py" },
@{ name = "grass"; manifest = "blender_manifest_grass.toml"; source = "stylized_grass_generator.py" },
@{ name = "utils"; manifest = "blender_manifest_utils.toml"; source = "stylized_asset_utils.py" }
)
# Alte Zips weg. WICHTIG: zwei Zips derselben Extension-ID im selben Ordner sind
# KEIN Versions-Archiv zum Zurueckrollen - server-generate warnt dann
# ("archive found with duplicates ... conflicting blender versions"). Mehrere
# Versionen einer ID sind nur erlaubt, wenn sie verschiedene Blender-Bereiche
# abdecken. Alte Version braucht man wieder: per git checkout des Zips.
Get-ChildItem $dist -Filter *.zip -ErrorAction SilentlyContinue | Remove-Item -Force
foreach ($ext in $extensions) {
$stage = Join-Path $root ("_extsrc_" + $ext.name)
if (Test-Path $stage) { Remove-Item -Recurse -Force $stage }
New-Item -ItemType Directory -Force -Path $stage | Out-Null
# Extension = Package: Manifest heisst IMMER blender_manifest.toml,
# der Addon-Code IMMER __init__.py.
Copy-Item (Join-Path $root $ext.manifest) (Join-Path $stage "blender_manifest.toml")
Copy-Item (Join-Path $root $ext.source) (Join-Path $stage "__init__.py")
Write-Host ("== build " + $ext.name + " ==") -ForegroundColor Cyan
& $Blender --command extension build --source-dir $stage --output-dir $dist
if ($LASTEXITCODE -ne 0) { throw ("build fehlgeschlagen: " + $ext.name) }
Remove-Item -Recurse -Force $stage
}
Write-Host "== server-generate (index.json) ==" -ForegroundColor Cyan
# --html erzeugt zusaetzlich eine index.html: auf einem statischen Webserver
# (z.B. nginx) laesst sich das Repo damit im Browser durchblaettern. Gitea liefert
# rohes HTML als text/plain aus, dort sieht man nur den Quelltext - schadet aber nicht.
& $Blender --command extension server-generate --repo-dir $dist --html
if ($LASTEXITCODE -ne 0) { throw "server-generate fehlgeschlagen" }
Write-Host "Fertig." -ForegroundColor Green
Get-ChildItem $dist | Select-Object Name, Length | Format-Table -AutoSize