Commit Graph
22 Commits
Author SHA1 Message Date
D4rkst3randClaude Opus 4.8 5e6b84369f UCX bei LOD-Gruppen nach dem MESH-Node benennen (Tree 1.45.0, Rock 2.20.0)
Der Legacy-Importer matcht UCX_<Mesh-Node>, nicht das LodGroup-Empty. Eine
Huelle mit dem Gruppennamen liegt in der Datei und ein Reimport nach Blender
zeigt sie an - Unreal verwirft sie aber STILL. Gemeldet von der Spielseite:
convex = 0 an 108 Stand-Baeumen und 57 Fels-Meshes; dieselbe Datei mit der
Huelle auf dem LOD0-Node liefert convex = 1.

UCX_<Basisname> stimmt nur OHNE LOD-Kette, weil der Mesh-Node dann so heisst -
deshalb waren Faell-Teile und _Pieces_All die ganze Zeit in Ordnung.

BEIDE Addons betroffen: der Fels-Export hatte den Fehler zuerst, der
Baum-Export hat ihn 1.42 von dort uebernommen.

Wie es durchrutschen konnte, ist die eigentliche Lehre: fuer 1.42 habe ich die
Konvention am Fels-Export NACHGEMESSEN statt sie zu raten - exportieren,
reimportieren, Name und Hierarchie pruefen. Das war richtig und hat trotzdem
nichts bewiesen, weil die Quelle denselben Fehler hatte. Gemessen wurde die
STRUKTUR, nicht die WIRKUNG. Eine abgeschaute Konvention ist nur so gut wie die
Quelle, von der sie stammt.

Die Tests pruefen jetzt die REGEL statt des Namens: hinter UCX_ muss ein
Mesh-Node aus derselben Datei stehen, und zwar LOD0 (hoechste Vertexzahl). Das
haette den Fehler in beiden Addons gefunden, ohne die Antwort vorher zu kennen.
Gegenproben: Baum 9 Fehler, Fels 1 Fehler.

27 Tests bestehen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-07 07:18:33 +02:00
D4rkst3randClaude Opus 4.8 74df6dfa1b Rock Gen 2.19.0: Schnellstart-Sorten + Dissolve als Bereich
Weniger einstellen muessen: oben im Panel Sorte waehlen, Haken druecken,
erzeugen. Die neun Unter-Panels bleiben fuer den Feinschliff.

  Findling     rund, weiche Kanten          ~1160 V / ~2320 Tris
  Platte       flach, liegt satt auf         ~670 V / ~1340 Tris
  Kantig       Bevel + Weighted Normal       ~350 V /  ~690 Tris
  Erzbrocken   dicht genug fuer die Maske   ~1280 V / ~2560 Tris, Slot M_Rock_Ore

dissolve_angle ist jetzt ein BEREICH statt eines festen Werts - direkt aus der
Rueckmeldung "hab ich immer auf 17-25 je nach Stein". Je Stein wird einer
gezogen; gemessen an sechs Findlingen bei 17-25 Grad: 1936-2928 Tris. Beide
Regler gleich setzen = fester Winkel wie frueher.

Zwei Sachen fielen beim Messen auf:

1) Der Dissolve-Winkel frisst deutlich Geometrie. Derselbe dichte Satz liefert
   bei niedrigem Standardwinkel ~2700 Tris, bei 17-25 Grad nur noch ~1030 und
   faellt damit unter ORE_MIN_VERTS - das Erz-Set haette seine EIGENE Warnung
   ausgeloest, sobald vorher eine Sorte mit hohem Winkel gewaehlt war. Der
   Bereich gehoert deshalb mit in DENSE_PRESET. Ueber vier Seeds und beide
   Groessenklassen nachgemessen: 0.70/0.92 haelt den Worst Case bei 847 Verts.

2) Erz-Dichte und Tri-Fenster kollidieren. Die Maske braucht ~800 Verts auch
   beim kleinen S-Brocken, das treibt einen M-Stein auf ~3400 Tris - ueber das
   Fenster 1500-3000. Deshalb entkoppelt: normale Sorten leichter (0.40/0.80),
   Erzbrocken knapper (0.45/0.82), das S+M-SET dichter (0.70/0.92), weil dort
   die kleinen Brocken die Untergrenze setzen.

Nebenbei gefunden und behoben: der erzwungene Ursprung wurde aus der
GEMEINSAMEN Bbox aller LOD-Stufen berechnet. Eine stark dezimierte Stufe kann
tiefer reichen als LOD0 - dann sass LOD0 sieben Zentimeter ueber dem Pivot und
der Stein haette in UE geschwebt. Unreal platziert nach LOD0, also gibt LOD0
jetzt den Ursprung vor.

Neu: tests/test_schnellstart.py. 18 Tests bestehen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-03 14:21:14 +02:00
D4rkst3randClaude Opus 4.8 f996832d75 Rock Gen 2.18.0: Material-Slots, Praefix Rock, Warnung bei zu grobem Erz-Mesh
Drei Rueckmeldungen von der Spielseite abgearbeitet.

1) Fehlende Material-Slots
   "Material zuweisen" stand auf Standard AUS, deshalb kamen alle Proben mit
   mats: [] an - Unreal legt dann nur einen Default-Slot an und die
   eingefrorene Konvention M_Rock_<Sorte> greift nicht. Jetzt Standard AN.
   Normale Steine rotieren durch M_Rock_Granite/Basalt/Sandstone/Mossy, das
   Erzfels-Set bekommt einen NEUTRALEN Slot M_Rock_Ore - ein Set fuer alle
   Erzsorten, die Sorte macht die Material-Instanz.

2) Namens-Drift Fels_ statt Rock_
   War ein Versehen, keine Absicht: der Standard-Praefix stammte noch aus der
   ersten Fassung, bevor die Konvention Rock_<Set>_<Groesse>_<NN> stand. Der
   Erz-Set-Knopf setzte "Rock" schon selbst, der allgemeine Standard nicht.
   Standard ist jetzt "Rock" - keine Asset-Zwillinge, keine Migration noetig.

3) Erzfelsen mit ~870 statt ~2700 Tris
   Nachgestellt: aus den Werkseinstellungen liefert der Set-Knopf 2590-2690
   Tris, die Automatik greift also. ~870 entstehen genau dann, wenn man den
   Erz-Haken setzt und den NORMALEN Erzeugen-Knopf nimmt - Werkseinstellung ist
   Decimate 0.20/0.50 statt 0.40/0.80. Das ist eine Bedienluecke, kein Fehler
   in der Automatik: die Dichte wird bewusst nur ueber den Set-Knopf gesetzt,
   damit niemandem seine Einstellungen unterm Hintern weggezogen werden.
   Deshalb warnt der Operator jetzt, wenn mit Erz-Haken ein Mesh unter 800
   Verts entsteht, und nennt den Knopf "Smooth & dicht" beim Namen. Sonst
   faellt das erst in UE auf und sieht dort nach einem Material-Fehler aus.

Tests halten den Vertrag jetzt fest: Auslieferungszustand (assign_material an,
Praefix Rock), neutraler Erz-Slot, Sorten-Slots bei normalen Steinen.
17 Tests bestehen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-03 14:08:21 +02:00
D4rkst3randClaude Opus 4.8 a2d46424ec Rock Gen 2.17.0: Erz-Maske invertiert - Nuggets laufen auf A = 0 zu
Entscheidung der Spielseite: die A-Semantik bleibt eingefroren (1.0 = kein Erz),
der Master loest es ueber

    Erz = (1 - A) * ErzMenge

mit ErzMenge als MI-Regler, Standard 0. Normale Stein-MIs ignorieren den Kanal
damit vollstaendig, nur die Erz-MIs drehen ihn auf. Kein Re-Export des
25er-Sets noetig, keine Fallunterscheidung im Addon.

Dafuer musste die Maske umgedreht werden: bisher lag das Nugget-ZENTRUM auf
A = 1.0 - also auf demselben Wert wie "kein Erz". Unter der Master-Formel waere
das Erz damit unsichtbar gewesen und der ganze RESTLICHE Stein haette als Erz
gegolten. Jetzt laufen die Nuggets auf A = 0 zu.

Gemessen: ohne Erz A 1.00..1.00 und (1-A) max 0.000 - ein normaler Stein zeigt
im Master garantiert nichts. Mit Erz erreicht (1-A) 1.00, Abdeckung unveraendert
4/9/15 % bei Anteil 0.08/0.18/0.35. Die Erzstellen sitzen an denselben Punkten
wie vorher, nur andersherum kodiert.

Die Tests pruefen jetzt direkt gegen die Master-Formel statt gegen den Rohwert -
am Rohkanal ist die Richtung zu leicht zu verwechseln. Panel zeigt bei aktivem
Erz-Bake "A=Erz (0=Erz)" plus den Hinweis auf die Formel, damit das niemand
versehentlich zurueckdreht.

Nugget-Groesse bleibt wie entschieden ABSOLUT (Radius in Metern).

ACHTUNG: Erz-Assets, die mit 2.15/2.16 exportiert wurden, tragen die alte
Richtung und muessen neu exportiert werden. Steine ohne Erz-Bake sind nicht
betroffen - deren A war und ist durchgehend 1.0.

17 Tests bestehen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-03 08:38:46 +02:00
D4rkst3randClaude Opus 4.8 2bf2f907bf Rock Gen 2.16.0: Bruchstuecke (Punkt 4) + Erz-Stueck (Punkt 4a)
Kein Laufzeit-Fracturing im Spiel - die Teile werden beim Anschlagen als
Physik-Actors gespawnt, entstehen hier also als vollwertige Assets.

Knopf "In Bruchstuecke zerlegen" arbeitet auf der Auswahl: <Name>_Piece_01..NN,
2-4 Teile, Bruch-Seed, optional Mutterstein ausblenden. Jedes Teil bekommt
Vertex-Layout v2, Ursprung unten-mittig, die gleichen Material-Slots wie der
Mutterstein und beim Export eine eigene UCX-Huelle.

Punkt 4a: "Ein Stueck mit Erz" benennt ein zufaelliges Teil <Name>_Piece_Erz
und schreibt Erz-Adern in dessen A-Kanal. Alle anderen Teile behalten A = 1.0.
Ob es gespawnt wird, entscheidet die Loot-Logik im Spiel.

Zusammenpassende Bruchkanten ohne Abstimmung: Voronoi ueber Halbraeume. Fuer
jedes andere Zentrum wird an der Mittelsenkrechten geschnitten und die
abgewandte Seite verworfen - benachbarte Zellen schneiden dadurch an GENAU
derselben Ebene. Bewusst ohne das Cell-Fracture-Addon (muesste aktiviert sein,
haengt an Operator-Kontext); bmesh laeuft immer.

Die Falle, die mich mehrere Anlaeufe gekostet hat: jeder Schnitt muss SOFORT
geschlossen werden, und zwar ueber genau die Kanten aus geom_cut. Der
naheliegende Weg - am Ende alle Randkanten suchen und fuellen - erzeugte Kanten
mit vier Flaechen (hauchduenne Splitter, 0.000007 m2 gegen Median 0.0025);
raeumte man die ab, blieben Loecher. dissolve_degenerate half nicht, weil es
nach KantenLAENGE geht und ein langer duenner Splitter keine kurze Kante hat.

Aufgefallen ist das Ganze am Volumen, nicht am Auge: die Teile kamen zusammen
auf 72.7 % des Muttersteins, weil calc_volume bei offenen Meshes Unsinn
liefert. Jetzt 100.2 % bei 2, 3 und 4 Teilen, 0 offene und 0 non-manifold
Kanten. Genau dieser Vergleich steht im Test - er ist zugleich das Warnsignal
fuer kaputte Topologie.

Neu: tests/test_bruchstuecke.py. 17 Tests bestehen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-03 08:23:42 +02:00
D4rkst3randClaude Opus 4.8 f5b528a874 Rock Gen 2.15.0: Erzfels-Set (Punkt 5) + Smooth/dicht (Punkt 6)
Punkt 5 - EIN neutrales Erzfels-Set fuer ALLE Erzsorten
  A-Kanal traegt die Erz-Maske: sie sagt nur WO Erz sitzt. WELCHES Erz
  (Kupfer/Eisen/Gold = Tint + Gluehen) macht die Material-Instanz in UE.
  Knopf "Erzfels-Set erzeugen (S + M)" liefert Rock_Ore_S_NN und Rock_Ore_M_NN
  und setzt alle Einstellungen danach zurueck. Regler: Erz-Anteil,
  Nugget-Groesse (Radius in m), Erz-Seed.

  Nuggets statt Noise: gestreute Zentren mit weichem Abfall. Ein Noise-Feld
  gaebe wolkige Schlieren, Erz sitzt aber in abgegrenzten Einschluessen. Die
  Zentren bevorzugen Fugen - Adern folgen Rissen, und das Gluehen liest sich
  in einer Vertiefung besser.

  Ohne Erz-Bake bleibt A auf 1.0 - wie im eingefrorenen Layout v2 und wie das
  bestehende 25er-Set es traegt.

Punkt 6 vorgezogen, weil Punkt 5 davon abhaengt
  Die Maskenaufloesung haengt an der Vertex-Dichte. Bei den bisherigen
  ~150-Vert-Steinen war jedes dritte Vertex ein Nugget-Zentrum: im Render
  liefen die Nuggets zu grossen Schlieren zusammen statt einzelne Einschluesse
  zu bleiben. Bei ~1350 Verts liest es sich richtig. Deshalb gibt es jetzt
  "Smooth & dicht" (Unterteilung 5, Decimate 0.40/0.80, Auto-Smooth) und das
  Erz-Set stellt selbst darauf um. Gemessen ueber drei Seeds: 2708/2658/2716
  Tris - im Zielfenster 1500-3000. Zusaetzlich ist die Nuggetzahl auf ein
  Zentrum je ~10 Verts gedeckelt.

Nebenbei: _asset_name schrieb die Form-Bezeichnung pauschal gross, daraus wurde
"Rock_ORE_S_01" statt des vereinbarten "Rock_Ore_S_01". Einzelne Buchstaben
(Form A, B, C) werden weiter gross geschrieben, laengere Bezeichner behalten
ihre Schreibweise.

Gemessen: Erz-Anteil 0.08 -> 4 %, 0.18 -> 9 %, 0.35 -> 15 % der Oberflaeche,
A 0.00..1.00, S bis 0.80 m / M ab 1.71 m, Maske ueberlebt den FBX-Roundtrip.
Neu: tests/test_erz.py. 16 Tests bestehen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-03 08:13:31 +02:00
D4rkst3randClaude Opus 4.8 20a751edca Rock Gen 2.14.0: Export-Haertung (Wunschliste 1-3) + LOD/Vertex-Farben geklaert
Punkt 1 - Ursprung erzwingen (keine Option mehr)
  Der Export schrieb die Objekt-Transformation mit ins FBX. Dadurch trug das
  25er-Set seine Szenen-Rasterpositionen (bis 20 m) im Asset und die Steine
  schwebten im Spiel neben ihrem Platzierungspunkt. Jetzt wandert jedes Objekt
  an den Welt-Ursprung, Origin unten-mittig der Bbox. Am REIMPORTIERTEN FBX
  gemessen: Bbox-Mitte 0.000/0.000, min.Z 0.000.

Punkt 2 - flache Steine hinlegen
  Kuerzeste Bbox-Achse zeigt nach oben. Gedreht wird nur, wenn es etwas bringt:
  bei 2.53/1.40/1.54 wuerde Kippen die Form nur willkuerlich drehen.

Punkt 3 - UCX-Kollisionshuellen
  Konvexe Huelle als UCX_<Name> im selben FBX, Budget einstellbar (Default 32
  Verts). Gemessen 29-32 Verts, geschlossen, umschliesst den Stein.

Alles auf temporaeren KOPIEN - die Szene des Users bleibt unveraendert
(Test prueft Namen und Objektzahl vorher/nachher).

Offener Punkt der Spielseite beantwortet: LOD-Gruppen + Vertex-Farben gingen
NICHT. Der LOD-Zweig in make_one_rock sprang komplett am Cavity-Bake vorbei -
gemessen: kein Farbattribut auf einer der vier Stufen, dazu fehlten Origin und
Material. Jetzt wird auf LOD0 gebacken, BEVOR dupliziert wird; das Decimate
interpoliert mit, damit alle Stufen dieselbe Cavity zeigen und der LOD-Wechsel
nicht poppt. Nach Roundtrip: LOD0 40 V R 0.30..1.00, LOD1 21 V, LOD2 11 V,
LOD3 6 V - alle mit Farben.

Vier Fallen, die der Test aufgedeckt hat:
- Blender haengt an Kopien ".001" an; Unreal ordnet UCX ueber den EXAKTEN
  Mesh-Namen zu -> Original bekommt fuer die Exportdauer einen Hilfsnamen.
- bmesh.from_mesh bringt die Originalflaechen mit, convex_hull legt seine
  Huelle obendrauf -> 16-21 offene Kanten. Nur die PUNKTE einlesen.
- Jede Vereinfachung schneidet Ecken ab, die Huelle wird KLEINER als der Stein
  (der Spieler wuerde einsinken). Jetzt exakt so weit aufgeblasen, dass wieder
  alles hineinpasst - fuer Kollision ist minimal zu gross unkritisch.
- ob.matrix_world = Identity loescht die Transformation NICHT bei geparenteten
  Objekten; bei einer LOD-Gruppe auf (13/-7.5/2.2) landete das Mesh bei MINUS
  dieser Position. matrix_basis und matrix_parent_inverse direkt nullen.

Neu: tests/test_export_robust.py misst am reimportierten FBX statt an der
Szene - nur so faellt eine mitgeschriebene Transformation ueberhaupt auf.
15 Tests bestehen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-03 08:02:14 +02:00
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
D4rkst3randClaude Opus 4.8 512d61e370 Rock Generator 2.12.0: Vertex-Cavity auf beliebige Meshes + Teil-Maske
Der User baut Pilze von Hand (Hut und Stiel als getrennte Objekte, mit Strg+J
verbunden) und fragte, was er wegen Vertex-Farben beachten muss.

Zwei Ergaenzungen:

1) Button "Vertex-Cavity auf Auswahl": backt R=Cavity / G / B=Hoehe auf JEDES
   markierte Mesh - nicht mehr nur auf generierte Steine. Damit lassen sich
   handgebaute Assets (Pilze, Baumstumpf, Erzfels) auf dasselbe Layout bringen.

2) Option "G = Teil-Maske (Shells)": statt der Moos-Maske werden getrennte
   Mesh-Teile markiert. Der oberste/breiteste Teil bekommt G=1, der Rest 0.
   Bei Strg+J-verbundenen Assets ist die Trennung dadurch EXAKT statt ueber
   Normalen geschaetzt - beim Pilz also Hut vs Stiel. Ein Material toent beide
   unterschiedlich, ein zweiter Material-Slot entfaellt.
   Einteilige Meshes bleiben bewusst unmarkiert (G=0), damit die Maske nichts
   Falsches behauptet.

Am nachgebauten Pilz geprueft: 2 Shells erkannt, G im obersten Teil ausschliess-
lich 1.0, im Rest ausschliesslich 0.0, Maske binaer, Einzelteil-Mesh -> nur 0.0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-31 11:43:30 +02:00
D4rkst3randClaude Opus 4.8 2882c099b4 Rock Generator 2.11.0: Quader-Proportionen auf gleiches Volumen normiert
Beim Export von Form C (flache Platte) fiel auf: Fels_C_S war 1.45 m, waehrend
Fels_A_S nur 0.85 m misst - dieselbe Klasse, aber deutlich groesser, nur weil
eine Achse gestreckt ist. Damit waere die Groessen-Klasse formabhaengig gewesen.

Die Proportionen werden jetzt auf geometrisches Mittel 1.0 normiert. "M" bedeutet
bei jeder Form dasselbe Volumen; eine Platte ist dann flacher UND breiter, aber
nicht schwerer. Dass ihre laengste Kante groesser ausfaellt, ist geometrisch
zwangslaeufig und Absicht.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-31 11:35:57 +02:00
D4rkst3randClaude Opus 4.8 b16e5ab75a Rock Generator 2.10.0: Quader als Grundform (Platten und Riegel)
Auf Wunsch des Users neben Wuerfel und Ico-Sphere eine Quader-Grundform mit
frei einstellbaren Proportionen (X/Y/Z) plus Streuung je Stein. Damit entstehen
flache Platten und langgestreckte Riegel - passt besonders zum Plattenlook der
Genshin-Referenz, wo Felsen aus flachen Schichten bestehen.

Wichtiges Detail: die Proportionen werden auf die MESH-DATEN angewendet
(transform_apply), nicht auf das Objekt. Der Displace arbeitet mit globalen
Texturkoordinaten - eine Objekt-Skalierung wuerde das Rauschen mitverzerren
statt die Form zu aendern.

Gemessen bei Proportion (2.0, 1.5, 0.35): 3.43 / 2.56 / 0.79 m (Z = 23 % von X),
bei (2.2, 0.8, 0.9): 3.81 / 1.40 / 1.60 m. Der Zufalls-Button kennt die neue
Form ebenfalls. Neuer Test tests/test_base_shapes.py.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-31 10:41:16 +02:00
D4rkst3randClaude Opus 4.8 9d1660560c Rock Generator 2.9.0: Vertex-Farb-Layout v2 (kanal-getrennt)
Nach Wunschliste des Users. Attribut "Cavity" traegt jetzt drei UNABHAENGIGE
Masken statt einer eingebackenen Mischung:

  R = Cavity pur      1 = offene Flaeche, 0 = tiefe Fuge - OHNE Hoehen-Verlauf
  G = Moos/Schmutz    aus Oberseiten-Anteil + Fugennaehe + Noise, mit Reglern
                      fuer Menge, Aufbruch und Seed
  B = Hoehen-Verlauf  0 = Unterseite, 1 = oben, separat
  A = 1 (Reserve)

Der Punkt: Boden-Saum und Moosfarbe entscheidet jetzt das MATERIAL pro Instanz,
nicht mehr das Mesh. In v1 steckte der Verlauf fest in R und liess sich nicht
mehr trennen.

Gemessen: R ohne Hoehenabhaengigkeit (unten 0.62 / oben 0.59 - vorher war das
der eingebackene Verlauf), B steigt 0.08 -> 0.92, G oben 0.57 vs unten 0.20,
A konstant 1.00. Moos-Seed aendert die Verteilung. Alle drei Kanaele ueberleben
den FBX-Roundtrip.

tests/test_vertex_cavity.py prueft jeden Kanal einzeln inkl. Roundtrip.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-31 10:08:38 +02:00
D4rkst3randClaude Opus 4.8 4c8a268510 Rock Generator 2.8.1: colors_type beim FBX-Export explizit setzen
Der Export verliess sich auf den Default. Damit die Vertex-Cavity zuverlaessig in
der FBX landet, jetzt colors_type='SRGB' explizit. Verifiziert ueber einen
Roundtrip: alle 8 exportierten Felsen tragen das Attribut "Cavity" nach dem
Re-Import (Bereich 0.23..1.00).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-31 09:20:15 +02:00
D4rkst3randClaude Opus 4.8 de2acdd381 Rock Generator 2.8.0: Cavity in Vertex-Farben (texturfreier Weg)
Idee kam vom User: die Steine ueber "smart materials" in UE loesen statt ueber
gebackene Texturen. Prozedurales Noise/Voronoi im Shader waere zu teuer (laeuft
pro Pixel), aber der Kern der Idee traegt - deshalb dieser Weg:

Neue Option "Cavity in Vertex-Farben": schreibt Cavity/AO plus optionalen
Hoehen-Verlauf in das Farb-Attribut "Cavity" (vertex_color_dirt + eigene
Nachbearbeitung fuer Staerke und Verlauf). Das Material braucht damit KEINE
Textur:  Base Color = Farbton x VertexColor, dazu Kantenlicht und Schattentint.

Gegenueber Triplanar sitzen die dunklen Fugen dadurch auf den ECHTEN Kanten des
Meshes statt darueberzuschweben - genau das passiert in der Genshin-Referenz.

Verifiziert: Attribut wird angelegt, Wertebereich 0.250..0.947 (echter Kontrast),
und es ueberlebt den FBX-Roundtrip UNVERAENDERT (gleicher Bereich nach Import).
Regler: Cavity-Staerke, Hoehen-Verlauf, Weichzeichnen.
Neuer Test tests/test_vertex_cavity.py.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-31 09:10:54 +02:00
D4rkst3randClaude Opus 4.8 1df70c9e50 Rock Generator 2.7.0: Plattenstil nach Genshin-Referenz
Der User hat Genshin-Screenshots als Stilvorlage geschickt. Auswertung: die
Felsen dort bestehen aus WENIGEN GROSSEN, fast leeren Platten mit SCHMALEN
DUNKLEN FUGEN. Das Detail steckt in der Fuge, nicht in der Flaeche.

Meine Textur machte das Gegenteil - viele kleine Zellen mit breitem Verlauf ueber
die ganze Oberflaeche. Deshalb half weder TexScale noch die Zellgroesse: beide
haben nur am Symptom gedreht, waehrend das Muster grundsaetzlich zu dicht war.

Neue Regler:
- "Fugenbreite" (Default 0.05): Breite des Uebergangs Fuge -> Flaeche. Klein =
  harte Fuge und flache Platte. War vorher fest auf 0.32 = weicher Verlauf ueber
  die ganze Zelle ("Golfball").
- "Platten flach" (Default 1.0): 1 = Flaeche nahezu einfarbig, Kontrast wandert
  komplett in die Fuge.
- "Zellgroesse" heisst jetzt "Plattengroesse" (Default 0.7 statt 2.5) - kleiner
  = GROESSERE Platten. Der alte Name war irrefuehrend.
Grundton auf helles warmes Grau, AO-Staerke 1.0 -> 0.55 (weniger Unruhe).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-31 08:46:01 +02:00
D4rkst3randClaude Opus 4.8 d58bfe05e8 Rock Generator 2.6.0: Groessen-Klassen wirken jetzt + Randomize-Bug gefixt
1) KLASSEN-GROESSE (vom User gemeldet): S und M kamen gleich gross raus.
   Ursache war eine Luecke im Design, nicht in der Bedienung: "keep_size"
   normiert die Zufalls-Streuung auf konstantes Volumen - damit wurde alles,
   was ueber scale_min/max eingestellt war, wieder herausgerechnet. Fuer die
   Groesse der KLASSE gab es schlicht keinen Regler.
   Neu: CLASS_SIZES (S=0.45, M=1.0, L=1.9, XL=3.2) plus "Groesse aus Klasse"
   und eine freie "Basis-Groesse". Die Klassengroesse ist bewusst gesetzt und
   von der Streuung getrennt; sie greift auch bei abgeschalteter Randomisierung.
   Gemessen: S 0.85 m | M 1.9 m | L 3.5 m | XL 6.0 m, Volumen-Streuung
   INNERHALB jeder Klasse bleibt bei 1.11x (nur Form).

2) BUG im Zufalls-Button (kam mit 2.5.0): jitter() schrieb einen float in die
   int-Property subsurf_levels -> TypeError, der Operator brach komplett ab.
   jitter() rundet jetzt fuer Int-Properties. Von tests/test_randomize.py
   gefangen.

Neuer Test tests/test_rock_classes.py deckt die Klassengroessen ab.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-31 02:42:17 +02:00
D4rkst3randClaude Opus 4.8 1bb547c70c Zufalls-Funktion in beiden Addons + Zusatz-Ebenen + Form-statt-Groesse
Rock Generator 2.5.0:
- "Zufaellig"-Button: wuerfelt Seed und Form-Parameter, "Streuung" steuert die
  Abweichung von den aktuellen Werten (0 = nur neuer Seed). Optional werden auch
  Basis-Form und Noise-Typ gewuerfelt. Werte werden auf ihre Grenzen geklemmt.
- Skalierung streut jetzt die FORM, nicht die Groesse: nicht-uniform ist Default,
  und "Gesamtgroesse konstant halten" normiert das geometrische Mittel auf 1.
  Gemessen ueber 6 Rocks: Volumen-Spanne 1.92x -> 1.11x. Wichtig, weil EcoGame
  die Groesse zusaetzlich ueber ScaleMin/Max streut.

Tree Generator 1.19.0:
- "Zufaellig"-Button: neuer Seed plus Streuung auf Hoehe, Radius, Biegung,
  Ast-Anzahl/-Laenge, Kronenform und Wurzelanlauf. Preset-Charakter bleibt, weil
  relativ zu den aktuellen Werten gestreut wird (gemessen: Hoehe 6.65 -> 8.34 m).
- "_Leaf"- und "_Frucht"-Ebenen: leere Objekte mit IDENTISCHEM Ursprung neben dem
  Baum (gemessen: Abstand 0.000000), damit die Ebenen in UE deckungsgleich sitzen.

Vier Test-Suiten liegen jetzt unter tests/ statt nur im Scratchpad.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 13:30:11 +02:00
D4rkst3randClaude Opus 4.8 f5bbd1bc35 Beide Addons auf die EcoGame-Konventionen abgestimmt
Rock Generator 2.4.0:
- Benennung Fels_<Form>_<Klasse> statt Rock_000 (Praefix/Form/Klasse im Panel,
  Klasse S/M/L/XL, optionale Durchnummerierung bei Batches)
- Bake liefert jetzt <name>_albedo und <name>_normal. AO/Cavity wird per Option
  MULTIPLIKATIV ins Albedo gebacken (Staerke regelbar) - separate Roughness- und
  AO-Paesse sind Default aus, weil Roughness in EcoGame eine Zahl im Master-
  Material ist. Gemessen: Albedo-Mittelwert 0.549 -> 0.433 mit AO, Kontrast rauf.
- UV1 Lightmap Default AUS (EcoGame beleuchtet dynamisch)

Tree Generator 1.18.0:
- Benennung <Art>_<Variante>_S<Stufe>, z.B. Birke_01_S1..S4 (statt stage0..3);
  Art-Feld und Varianten-Nummer im Panel, Art leer = Preset-Name
- UV1 Lightmap Default AUS

README: Konventionen dokumentiert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 12:25:09 +02:00
D4rkst3randClaude Opus 4.8 9240cc6d80 Rock-Generator auf v2.3.0 (Zell-Look-Bake) + Listing neu gebaut
Die Zell-Look-Aenderung am Textur-Bake (Voronoi statt fBm, Grundfarbe/Zellgroesse
regelbar) war im vorigen Commit ohne Versions-Bump mitgelaufen -> Blender haette
kein Update angeboten. Version nachgezogen, Listing enthaelt jetzt
Rock 2.3.0 + Tree 1.0.0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 10:25:11 +02:00
D4rkst3randClaude Opus 4.8 a8ca7a6453 v2.2.0: Textur-Bake-Button (tileable, fuer Triplanar in UE) + UE-Material-Anleitung
- Bake BaseColor/Normal/Roughness/AO als PNG
- Nahtlos tileable via 4D-Torus-Projektion der UV (cos/sin u,v)
- Cycles-Bake mit Zustands-Restore, temporaere Bake-Plane + Cleanup
- docs/UE_Material_Triplanar.md: WorldAlignedTexture/Normal-Verdrahtung
- _deselect_all gegen transiente None-Refs nach Objekt-Removal gehaertet
- Live gegen Blender 5.1.2 getestet (4 Maps, Normal jetzt mit Struktur), Headless gruen

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 07:11:35 +02:00
D4rkst3randClaude Opus 4.8 46fc05eec4 v2.1.0: FBX-Export, Shading-Toggle, Pro-Rock-Varianz, Boden abflachen + Origin
- FBX-Export-Button (UE-ready): je Rock/LOD-Gruppe eine FBX, use_custom_props fuer LodGroup, Triangulate, EDGE/FACE-Smoothing je nach Shading
- Shading-Modus: Faceted / Smooth / Auto-Smooth-nach-Winkel
- Pro-Rock-Varianz: Noise/Displace Min-Max + nicht-uniforme Skalierung
- Boden abflachen (Bisect) + Origin unten-mittig
- Live gegen Blender 5.1.2 getestet, Headless-Test gruen

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 07:01:10 +02:00
D4rkst3randClaude Opus 4.8 32317c446c 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 <noreply@anthropic.com>
2026-07-29 06:45:35 +02:00