Fuer handgebaute Assets, die nicht durch einen Generator laufen (Pilze, Baumstumpf, Erzfels, Props). Panel in fuenf einklappbaren Unter-Panels statt einer langen Liste: 1 Vorbereiten - Rotation/Scale anwenden, Ursprung unten-mittig, Normalen 2 Vertex-Farben - R=Cavity / G=Teil-oder-Moos-Maske / B=Hoehe / A=1 3 Benennung - <Basis>_<NN>, Mesh-Daten ziehen mit 4 Pruefen - Asset-Check auf alles, was in UE Aerger macht 5 Export - FBX je Mesh mit colors_type='SRGB' Zwei Bugs beim Bauen gefunden und gefixt: - v.link_faces gibt es nur in bmesh, nicht auf Mesh.vertices -> lose Vertices ueber die tatsaechlich benutzten Indizes zaehlen. - bpy.ops.paint.vertex_color_set braucht den Vertex-Paint-Modus und scheitert im Object-Mode mit "poll() failed". Zusammen mit vertex_color_dirt im selben try wurde dadurch der GANZE Bake stillschweigend uebersprungen (R/G/B blieben 1.0). Initialisierung laeuft jetzt direkt ueber Python. Verifiziert am nachgebauten Pilz: Check meldet vorher Scale/Rotation/Ursprung, nach "Vorbereiten" Scale 1/1/1, Rot 0/0/0, min_z 0.0000 und "ok". Teil-Maske G=1 im Hut, 0 im Stiel. Nach FBX-Roundtrip G-Werte [0.0, 1.0] erhalten. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
60 lines
2.6 KiB
PowerShell
60 lines
2.6 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, damit geloeschte Versionen nicht im Listing haengen bleiben.
|
|
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
|
|
& $Blender --command extension server-generate --repo-dir $dist
|
|
if ($LASTEXITCODE -ne 0) { throw "server-generate fehlgeschlagen" }
|
|
|
|
Write-Host "Fertig." -ForegroundColor Green
|
|
Get-ChildItem $dist | Select-Object Name, Length | Format-Table -AutoSize
|