Tree Gen 1.31.0: LOD1-3 trugen die Standposition mit (aus UE gemeldet)
Fehler: _origin_bottom_center backt zuerst die Weltmatrix ins Mesh und wendet DANN die Zentrierung an - zurueck gibt es aber nur die Zentrierung. Den Stufen 1-3 wurde nur diese aufgedrueckt, ihre Weltmatrix blieb ungebacken. Ergebnis: sie landeten bei MINUS der Standposition. Gemeldet fuer einen Baum bei x = 18 m, dessen LOD1-3 bei x = -1894 cm sassen - exakt die Standposition, in Zentimetern wegen FBX_SCALE_ALL. Jetzt backt jede Stufe erst ihre EIGENE Weltmatrix, dann kommt die gemeinsame Zentrierung aus LOD0. Warum der Test das nicht gefunden hat: er baute den Baum am URSPRUNG. Dort ist minus null eben null. Der Baum steht jetzt bewusst bei (18, -7.5), und je Stufe wird die X/Y-Mitte im reimportierten FBX gemessen - an derselben Stelle wie die Radialitaets-Pruefung. Gegenprobe gemacht: mit zurueckgedrehtem Fix meldet der Test LOD1-3 bei -17.87/7.46, also exakt minus der Standposition, und faellt mit 6 Fehlern durch. Mit Fix liegen alle Stufen bei 0.000-0.135 um den Ursprung. Ausserdem Dichte 170 -> 150. Grund: mit der REALEN Diamond-Card (6 Tris, nicht die 2-Tri-Attrappe aus meinen Sweeps) landet die Eiche bei Dichte 170 auf 4206 Tris - 2778 Krone plus 1428 Stamm - und damit ueber dem 4000er-Budget aus ASSETS.md Teil 6. Die abgenommene Krone (2778) und das dokumentierte Budget (4000) sind also nicht gleichzeitig haltbar. 150 liegt im abgesegneten Sweetspot 130-170 und haelt das Budget mit 3816. Wenn der Look bei 170 wichtiger ist, muesste das Budget auf ~4300 - das ist eine Entscheidung der Spielseite. Nebenbei: test_leaves hatte leaf_size fest auf 0.22 stehen (alter Blaettchen-Wert) und pruefte gegen ein fest verdrahtetes 2500er-Budget. Beides kommt jetzt aus den Einstellungen. 23 Tests bestehen. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -395,7 +395,7 @@ gemessen und abgenommen:
|
|||||||
| | vorher | jetzt | Wirkung |
|
| | vorher | jetzt | Wirkung |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| Groesse | 0.22 | **0.85** | Bueschel statt Bonsai |
|
| Groesse | 0.22 | **0.85** | Bueschel statt Bonsai |
|
||||||
| Dichte | 500 | **170** | wenige grosse statt viele Fussel |
|
| Dichte | 500 | **150** | wenige grosse statt viele Fussel |
|
||||||
| **Max Radius** | 0.02 | **0.04** | der Volumen-Hebel |
|
| **Max Radius** | 0.02 | **0.04** | der Volumen-Hebel |
|
||||||
| Kippung | 0.5 | **0.9** | Rotations-Chaos schliesst Sichtluecken |
|
| Kippung | 0.5 | **0.9** | Rotations-Chaos schliesst Sichtluecken |
|
||||||
|
|
||||||
@@ -454,6 +454,15 @@ radial auf allen vier Stufen**. LOD3 traegt 16 % der Cards von LOD0.
|
|||||||
|
|
||||||
Der Ursprung kommt aus **LOD0** (Unreal platziert danach); alle Stufen werden um
|
Der Ursprung kommt aus **LOD0** (Unreal platziert danach); alle Stufen werden um
|
||||||
denselben Betrag verschoben, damit der Baum beim LOD-Wechsel nicht springt.
|
denselben Betrag verschoben, damit der Baum beim LOD-Wechsel nicht springt.
|
||||||
|
|
||||||
|
> **Falle, aus UE gemeldet:** `_origin_bottom_center` backt zuerst die Weltmatrix
|
||||||
|
> ins Mesh und wendet **dann** die Zentrierung an — zurueck gibt es aber nur die
|
||||||
|
> Zentrierung. Wer den Stufen 1–3 nur diese aufdrueckt, laesst ihre Weltmatrix
|
||||||
|
> ungebacken: sie landen bei **minus der Standposition**. Gemessen an einem Baum
|
||||||
|
> bei x = 18 m: LOD1–3 bei x = −17.87. Bei einem Baum am Ursprung faellt das
|
||||||
|
> nicht auf, weil minus null eben null ist — genau deshalb steht der Baum im
|
||||||
|
> Test jetzt **bewusst nicht** am Ursprung, und die X/Y-Mitte wird je Stufe im
|
||||||
|
> reimportierten FBX gemessen.
|
||||||
Das Decimate der Rinde laeuft **vor** dem Verschmelzen — danach wuerde es die
|
Das Decimate der Rinde laeuft **vor** dem Verschmelzen — danach wuerde es die
|
||||||
Blatt-Cards mit einschmelzen, und eine halbe Card ist keine Card.
|
Blatt-Cards mit einschmelzen, und eine halbe Card ist keine Card.
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
schema_version = "1.0.0"
|
schema_version = "1.0.0"
|
||||||
|
|
||||||
id = "stylized_tree_generator"
|
id = "stylized_tree_generator"
|
||||||
version = "1.30.0"
|
version = "1.31.0"
|
||||||
name = "Stylized Tree Generator"
|
name = "Stylized Tree Generator"
|
||||||
tagline = "Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen"
|
tagline = "Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen"
|
||||||
maintainer = "D4rkst3r"
|
maintainer = "D4rkst3r"
|
||||||
|
|||||||
Vendored
+3
-3
@@ -50,17 +50,17 @@
|
|||||||
<td>34.1KB</td>
|
<td>34.1KB</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><tt><a href="./stylized_tree_generator-1.30.0.zip?repository=.%2Findex.json&blender_version_min=4.2.0">stylized_tree_generator-1.30.0</a></tt></td>
|
<td><tt><a href="./stylized_tree_generator-1.31.0.zip?repository=.%2Findex.json&blender_version_min=4.2.0">stylized_tree_generator-1.31.0</a></tt></td>
|
||||||
<td>Stylized Tree Generator</td>
|
<td>Stylized Tree Generator</td>
|
||||||
<td>Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen</td>
|
<td>Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen</td>
|
||||||
<td><a href="https://git.d4rkst3r.de/D4rkst3r/stylized-rock-generator">link</a></td>
|
<td><a href="https://git.d4rkst3r.de/D4rkst3r/stylized-rock-generator">link</a></td>
|
||||||
<td>4.2.0 - ~</td>
|
<td>4.2.0 - ~</td>
|
||||||
<td>all</td>
|
<td>all</td>
|
||||||
<td>all</td>
|
<td>all</td>
|
||||||
<td>36.0KB</td>
|
<td>36.3KB</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<center><p>Built 2026-08-06, 06:22</p></center>
|
<center><p>Built 2026-08-06, 07:20</p></center>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Vendored
+4
-4
@@ -82,7 +82,7 @@
|
|||||||
"id": "stylized_tree_generator",
|
"id": "stylized_tree_generator",
|
||||||
"name": "Stylized Tree Generator",
|
"name": "Stylized Tree Generator",
|
||||||
"tagline": "Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen",
|
"tagline": "Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen",
|
||||||
"version": "1.30.0",
|
"version": "1.31.0",
|
||||||
"type": "add-on",
|
"type": "add-on",
|
||||||
"maintainer": "D4rkst3r",
|
"maintainer": "D4rkst3r",
|
||||||
"license": [
|
"license": [
|
||||||
@@ -98,9 +98,9 @@
|
|||||||
"Mesh",
|
"Mesh",
|
||||||
"Modeling"
|
"Modeling"
|
||||||
],
|
],
|
||||||
"archive_url": "./stylized_tree_generator-1.30.0.zip",
|
"archive_url": "./stylized_tree_generator-1.31.0.zip",
|
||||||
"archive_size": 36830,
|
"archive_size": 37196,
|
||||||
"archive_hash": "sha256:d54440c3d577440ff97b0415ef101801b0b7bf50b6df05e3645cc3d1e1eb15e5"
|
"archive_hash": "sha256:2afb514c39d4378baa8885b53e117bb460987ac57178a826bc20cc8b1efd71b5"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -1,7 +1,7 @@
|
|||||||
bl_info = {
|
bl_info = {
|
||||||
"name": "Stylized Tree Generator",
|
"name": "Stylized Tree Generator",
|
||||||
"author": "D4rkst3r",
|
"author": "D4rkst3r",
|
||||||
"version": (1, 30, 0),
|
"version": (1, 31, 0),
|
||||||
"blender": (4, 2, 0),
|
"blender": (4, 2, 0),
|
||||||
"location": "View3D > Sidebar > Tree Gen",
|
"location": "View3D > Sidebar > Tree Gen",
|
||||||
"description": "Parametrischer Baum-/Palmen-/Busch-Generator (Geometry Nodes) mit Wachstums-Stufen",
|
"description": "Parametrischer Baum-/Palmen-/Busch-Generator (Geometry Nodes) mit Wachstums-Stufen",
|
||||||
@@ -1195,7 +1195,11 @@ LEAF_GROUP_NAME = "GN_TreeLeaves"
|
|||||||
# hingehoeren. Mit Bueschel-Atlanten liegen die Groessenordnungen bei
|
# hingehoeren. Mit Bueschel-Atlanten liegen die Groessenordnungen bei
|
||||||
# Size ~0.7 und Density ~90.
|
# Size ~0.7 und Density ~90.
|
||||||
LEAF_DEFAULTS = {
|
LEAF_DEFAULTS = {
|
||||||
"Density": 170.0, # Punkte pro m2 Zweigoberflaeche
|
# 150 statt der zunaechst gemessenen 170: mit der REALEN Diamond-Card
|
||||||
|
# (6 Tris, nicht 2) landet die Eiche bei 170 auf 4206 Tris und damit ueber
|
||||||
|
# dem 4000er-Budget aus ASSETS.md Teil 6 - 2778 Krone plus 1428 Stamm.
|
||||||
|
# 150 liegt im abgesegneten Sweetspot 130-170 und haelt das Budget (3816).
|
||||||
|
"Density": 150.0, # Punkte pro m2 Zweigoberflaeche
|
||||||
# DER Volumen-Hebel. Bei 0.02 trugen nur die aeussersten Zweigspitzen Laub -
|
# DER Volumen-Hebel. Bei 0.02 trugen nur die aeussersten Zweigspitzen Laub -
|
||||||
# die Krone hatte nur Kontur und war innen nackt. Bei 0.04 wachsen Bueschel
|
# die Krone hatte nur Kontur und war innen nackt. Bei 0.04 wachsen Bueschel
|
||||||
# auch am mittleren Geaest und die Krone bekommt Tiefe. Am fertigen Baum in
|
# auch am mittleren Geaest und die Krone bekommt Tiefe. Am fertigen Baum in
|
||||||
@@ -1861,7 +1865,7 @@ class TreeGenSettings(PropertyGroup):
|
|||||||
"damit mischt die Krone 4-6 Varianten statt einer"),
|
"damit mischt die Krone 4-6 Varianten statt einer"),
|
||||||
)
|
)
|
||||||
leaf_density: FloatProperty(
|
leaf_density: FloatProperty(
|
||||||
name="Dichte", default=170.0, min=0.0, max=20000.0,
|
name="Dichte", default=150.0, min=0.0, max=20000.0,
|
||||||
description=("Cards pro m2 Zweigoberflaeche. Presets mit viel Geaest (Eiche) "
|
description=("Cards pro m2 Zweigoberflaeche. Presets mit viel Geaest (Eiche) "
|
||||||
"bekommen dadurch automatisch mehr Blaetter als schlanke. 150 haelt "
|
"bekommen dadurch automatisch mehr Blaetter als schlanke. 150 haelt "
|
||||||
"auch die Eiche im 2500-Tri-Budget; der Button meldet die Summe"),
|
"auch die Eiche im 2500-Tri-Budget; der Button meldet die Summe"),
|
||||||
@@ -2147,13 +2151,24 @@ class TREEGEN_OT_export_game(Operator):
|
|||||||
% (merge.name, mitte.x, mitte.y, mitte.z))
|
% (merge.name, mitte.x, mitte.y, mitte.z))
|
||||||
lods.append(merge)
|
lods.append(merge)
|
||||||
|
|
||||||
# Ursprung aus LOD0 - Unreal platziert nach LOD0. Alle Stufen um
|
# Ursprung aus LOD0 - Unreal platziert nach LOD0. Alle Stufen
|
||||||
# denselben Betrag verschieben, damit sie deckungsgleich bleiben.
|
# bekommen DIESELBE Zentrierung, damit sie deckungsgleich bleiben.
|
||||||
|
#
|
||||||
|
# FALLE: _origin_bottom_center backt zuerst die Weltmatrix ins
|
||||||
|
# Mesh und wendet DANN die Zentrierung an - zurueck gibt es aber
|
||||||
|
# nur die Zentrierung. Wer den Stufen 1-3 nur diese aufdrueckt,
|
||||||
|
# laesst ihre Weltmatrix ungebacken: sie landen bei MINUS der
|
||||||
|
# Standposition. Gemeldet aus UE fuer einen Baum bei x = 18 m,
|
||||||
|
# dessen LOD1-3 bei x = -1894 cm sassen - exakt die
|
||||||
|
# Standposition, in Zentimetern wegen FBX_SCALE_ALL.
|
||||||
|
# Deshalb je Stufe erst die EIGENE Weltmatrix backen, dann die
|
||||||
|
# gemeinsame Zentrierung.
|
||||||
versatz = _origin_bottom_center(lods[0])
|
versatz = _origin_bottom_center(lods[0])
|
||||||
for weitere in lods[1:]:
|
for weitere in lods[1:]:
|
||||||
weitere.data.transform(versatz)
|
weitere.data.transform(weitere.matrix_world)
|
||||||
weitere.matrix_basis = Matrix.Identity(4)
|
weitere.matrix_basis = Matrix.Identity(4)
|
||||||
weitere.matrix_parent_inverse = Matrix.Identity(4)
|
weitere.matrix_parent_inverse = Matrix.Identity(4)
|
||||||
|
weitere.data.transform(versatz)
|
||||||
|
|
||||||
_deselect(context)
|
_deselect(context)
|
||||||
if s.generate_lods:
|
if s.generate_lods:
|
||||||
|
|||||||
+52
-15
@@ -8,6 +8,12 @@ Gemessen wird am reimportierten FBX, und die Kugel-Normalen werden auf JEDER
|
|||||||
Stufe geprueft: LOD1-3 haben eine eigene Card-Verteilung, die Normalen muessen
|
Stufe geprueft: LOD1-3 haben eine eigene Card-Verteilung, die Normalen muessen
|
||||||
dazu passen. Nur LOD0 zu pruefen wuerde genau das verfehlen.
|
dazu passen. Nur LOD0 zu pruefen wuerde genau das verfehlen.
|
||||||
|
|
||||||
|
WICHTIG: Der Baum steht hier NICHT am Ursprung. Eine fruehere Fassung dieses
|
||||||
|
Tests baute ihn bei (0,0,0) - und ist damit an einem Fehler vorbeigelaufen, den
|
||||||
|
die Spielseite gefunden hat: LOD1-3 landeten bei MINUS der Standposition, weil
|
||||||
|
ihre Weltmatrix nie ins Mesh gebacken wurde. Bei x = 0 faellt das nicht auf,
|
||||||
|
weil minus null eben null ist.
|
||||||
|
|
||||||
Aufruf: blender --background --factory-startup --python tests/test_baum_lod.py
|
Aufruf: blender --background --factory-startup --python tests/test_baum_lod.py
|
||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
@@ -53,11 +59,19 @@ bpy.ops.object.treegen_create()
|
|||||||
baum = [o for o in bpy.context.scene.objects
|
baum = [o for o in bpy.context.scene.objects
|
||||||
if o.type == 'MESH' and o.name.startswith("Eiche_01")
|
if o.type == 'MESH' and o.name.startswith("Eiche_01")
|
||||||
and not o.name.endswith(("_Leaf", "_Frucht"))][0]
|
and not o.name.endswith(("_Leaf", "_Frucht"))][0]
|
||||||
|
|
||||||
|
# Der Baum wird BEWUSST weit vom Ursprung gestellt - siehe Kopf der Datei.
|
||||||
|
STANDORT = (18.0, -7.5, 0.0)
|
||||||
|
baum.location = STANDORT
|
||||||
for o in bpy.context.scene.objects:
|
for o in bpy.context.scene.objects:
|
||||||
o.select_set(o is baum)
|
o.select_set(o is baum)
|
||||||
bpy.context.view_layer.objects.active = baum
|
bpy.context.view_layer.objects.active = baum
|
||||||
s.leaf_card = card
|
s.leaf_card = card
|
||||||
bpy.ops.object.treegen_leaves()
|
bpy.ops.object.treegen_leaves()
|
||||||
|
# Die Blattebene muss mit an die Standposition - sie folgt dem Stamm.
|
||||||
|
_bl = bpy.data.objects.get(baum.name + "_Leaf")
|
||||||
|
if _bl is not None:
|
||||||
|
_bl.location = STANDORT
|
||||||
|
|
||||||
for o in bpy.context.scene.objects:
|
for o in bpy.context.scene.objects:
|
||||||
o.select_set(o is baum)
|
o.select_set(o is baum)
|
||||||
@@ -86,8 +100,11 @@ meshes = [o for o in bpy.context.scene.objects if o.type == 'MESH']
|
|||||||
empties = [o for o in bpy.context.scene.objects if o.type == 'EMPTY']
|
empties = [o for o in bpy.context.scene.objects if o.type == 'EMPTY']
|
||||||
stufen = sorted(meshes, key=lambda o: o.name)
|
stufen = sorted(meshes, key=lambda o: o.name)
|
||||||
print("")
|
print("")
|
||||||
print("%-24s %7s %7s %7s %9s %s"
|
print("Baum stand bei x=%.1f, y=%.1f - die Stufen muessen trotzdem um den "
|
||||||
% ("Stufe", "Rinde", "Blatt", "Tris", "Radial", "Slots"))
|
"Ursprung liegen." % (STANDORT[0], STANDORT[1]))
|
||||||
|
print("")
|
||||||
|
print("%-24s %7s %7s %7s %9s %9s %9s"
|
||||||
|
% ("Stufe", "Rinde", "Blatt", "Tris", "Radial", "X-Mitte", "Y-Mitte"))
|
||||||
|
|
||||||
if len(stufen) != len(tg.LOD_STUFEN):
|
if len(stufen) != len(tg.LOD_STUFEN):
|
||||||
fails.append("%d LOD-Meshes, erwartet %d" % (len(stufen), len(tg.LOD_STUFEN)))
|
fails.append("%d LOD-Meshes, erwartet %d" % (len(stufen), len(tg.LOD_STUFEN)))
|
||||||
@@ -96,6 +113,7 @@ if not empties:
|
|||||||
|
|
||||||
blatt_zahlen = []
|
blatt_zahlen = []
|
||||||
rinde_zahlen = []
|
rinde_zahlen = []
|
||||||
|
spannen = []
|
||||||
for ob in stufen:
|
for ob in stufen:
|
||||||
m = ob.data
|
m = ob.data
|
||||||
rinde = sum(1 for p in m.polygons if p.material_index == 0)
|
rinde = sum(1 for p in m.polygons if p.material_index == 0)
|
||||||
@@ -126,9 +144,18 @@ for ob in stufen:
|
|||||||
treffer += 1
|
treffer += 1
|
||||||
quote = 100.0 * treffer / gesamt if gesamt else 0.0
|
quote = 100.0 * treffer / gesamt if gesamt else 0.0
|
||||||
|
|
||||||
print("%-24s %7d %7d %7d %8.0f%% %s"
|
# X/Y-Spanne dieser Stufe im FBX. Alle Stufen muessen deckungsgleich um
|
||||||
% (ob.name, rinde, laub, tris, quote,
|
# den Ursprung liegen - eine verschobene Stufe waere in UE beim
|
||||||
[x.name if x else "-" for x in m.materials]))
|
# LOD-Wechsel schlagartig woanders.
|
||||||
|
co = [ob.matrix_world @ v.co for v in m.vertices]
|
||||||
|
lo = [min(c[i] for c in co) for i in range(3)]
|
||||||
|
hi = [max(c[i] for c in co) for i in range(3)]
|
||||||
|
xm = (lo[0] + hi[0]) * 0.5
|
||||||
|
ym = (lo[1] + hi[1]) * 0.5
|
||||||
|
spannen.append((ob.name, xm, ym, lo, hi))
|
||||||
|
|
||||||
|
print("%-24s %7d %7d %7d %8.0f%% %9.3f %9.3f"
|
||||||
|
% (ob.name, rinde, laub, tris, quote, xm, ym))
|
||||||
|
|
||||||
if len(m.materials) != 2:
|
if len(m.materials) != 2:
|
||||||
fails.append("%s: %d Slots, erwartet 2" % (ob.name, len(m.materials)))
|
fails.append("%s: %d Slots, erwartet 2" % (ob.name, len(m.materials)))
|
||||||
@@ -160,18 +187,28 @@ if blatt_zahlen and blatt_zahlen[0] > 0:
|
|||||||
"teuer" % anteil)
|
"teuer" % anteil)
|
||||||
|
|
||||||
# --- Alle Stufen deckungsgleich am Ursprung ------------------------------
|
# --- Alle Stufen deckungsgleich am Ursprung ------------------------------
|
||||||
for ob in stufen:
|
# Das ist der Test fuer den aus UE gemeldeten Fehler: LOD1-3 sassen bei MINUS
|
||||||
co = [ob.matrix_world @ v.co for v in ob.data.vertices]
|
# der Standposition, weil ihre Weltmatrix nie ins Mesh gebacken wurde.
|
||||||
lo = [min(c[i] for c in co) for i in range(3)]
|
print("")
|
||||||
hi = [max(c[i] for c in co) for i in range(3)]
|
for name, xm, ym, lo, hi in spannen:
|
||||||
if abs((lo[0] + hi[0]) * 0.5) > 0.25 or abs((lo[1] + hi[1]) * 0.5) > 0.25:
|
if abs(xm) > 0.25 or abs(ym) > 0.25:
|
||||||
fails.append("%s: Bbox nicht zentriert (%.2f/%.2f)"
|
fails.append("%s: Mitte bei %.2f/%.2f statt am Ursprung - die Stufe "
|
||||||
% (ob.name, (lo[0] + hi[0]) * 0.5, (lo[1] + hi[1]) * 0.5))
|
"traegt die Standposition des Baums (%.1f/%.1f) mit"
|
||||||
# Die Stufen muessen auf derselben Hoehe stehen - sonst springt der Baum
|
% (name, xm, ym, STANDORT[0], STANDORT[1]))
|
||||||
# beim LOD-Wechsel.
|
|
||||||
if abs(lo[2]) > 0.15:
|
if abs(lo[2]) > 0.15:
|
||||||
fails.append("%s: steht %.3f m ueber/unter dem Ursprung - der Baum "
|
fails.append("%s: steht %.3f m ueber/unter dem Ursprung - der Baum "
|
||||||
"wuerde beim LOD-Wechsel springen" % (ob.name, lo[2]))
|
"wuerde beim LOD-Wechsel springen" % (name, lo[2]))
|
||||||
|
|
||||||
|
# Und die Stufen muessen ZUEINANDER passen, nicht nur je einzeln zum Ursprung.
|
||||||
|
if len(spannen) > 1:
|
||||||
|
_, x0, y0, lo0, hi0 = spannen[0]
|
||||||
|
for name, xm, ym, lo, hi in spannen[1:]:
|
||||||
|
if abs(xm - x0) > 0.30 or abs(ym - y0) > 0.30:
|
||||||
|
fails.append("%s liegt %.2f/%.2f neben LOD0 - beim LOD-Wechsel "
|
||||||
|
"wuerde der Baum springen" % (name, xm - x0, ym - y0))
|
||||||
|
print("Versatz zu LOD0: %s"
|
||||||
|
% ", ".join("%s %.3f/%.3f" % (n.split("_")[-1], x - x0, y - y0)
|
||||||
|
for n, x, y, _, _ in spannen[1:]))
|
||||||
|
|
||||||
print("")
|
print("")
|
||||||
if fails:
|
if fails:
|
||||||
|
|||||||
+13
-3
@@ -29,7 +29,11 @@ card=bpy.data.objects.new("Diamon Plane", me); bpy.context.collection.objects.li
|
|||||||
|
|
||||||
s=bpy.context.scene.tree_gen_settings
|
s=bpy.context.scene.tree_gen_settings
|
||||||
s.preset='eiche'; s.art_name="Eiche"; s.variant=1
|
s.preset='eiche'; s.art_name="Eiche"; s.variant=1
|
||||||
s.leaf_card=card; s.leaf_size=0.22 # Dichte: Default verwenden
|
# Groesse und Dichte aus den Defaults nehmen. Frueher stand hier fest
|
||||||
|
# leaf_size=0.22 - der alte Blaettchen-Wert. Zusammen mit der neuen Dichte 170
|
||||||
|
# ergab das genau die Kombination, die wir loswerden wollten: hunderte winziger
|
||||||
|
# Cards (gemessen 2778 Blatt-Tris statt ~1000).
|
||||||
|
s.leaf_card=card
|
||||||
s.make_leaf=True; s.use_growth=False
|
s.make_leaf=True; s.use_growth=False
|
||||||
r=bpy.ops.object.treegen_create()
|
r=bpy.ops.object.treegen_create()
|
||||||
names=sorted(o.name for o in bpy.context.scene.objects if o.type=='MESH')
|
names=sorted(o.name for o in bpy.context.scene.objects if o.type=='MESH')
|
||||||
@@ -41,9 +45,15 @@ def tris(n):
|
|||||||
ob=bpy.context.scene.objects[n]
|
ob=bpy.context.scene.objects[n]
|
||||||
return sum(len(p.vertices)-2 for p in ob.evaluated_get(dg).data.polygons)
|
return sum(len(p.vertices)-2 for p in ob.evaluated_get(dg).data.polygons)
|
||||||
tt,tl=tris("Eiche_01"), tris("Eiche_01_Leaf")
|
tt,tl=tris("Eiche_01"), tris("Eiche_01_Leaf")
|
||||||
print("TRIS Stamm=%d Blatt=%d Summe=%d / 2500 %s (Dichte %.0f)" % (tt,tl,tt+tl,"OK" if tt+tl<=2500 else "UEBER", s.leaf_density))
|
# Budget aus den Einstellungen holen, nicht fest verdrahten: es steht seit
|
||||||
|
# ASSETS.md Teil 6 pro Wachstumsstufe (S1 800 / S2 1200 / S3+S4 4000) und wurde
|
||||||
|
# von 2500 angehoben, weil bei ISM-Instanzen mit LOD-Kette nicht die Dreiecke
|
||||||
|
# der Engpass sind, sondern Overdraw und Schatten der Cards.
|
||||||
|
budget = s.leaf_budget
|
||||||
|
print("TRIS Stamm=%d Blatt=%d Summe=%d / %d %s (Dichte %.0f)"
|
||||||
|
% (tt,tl,tt+tl,budget,"OK" if tt+tl<=budget else "UEBER", s.leaf_density))
|
||||||
if tl==0: fails.append("blattwerk_leer")
|
if tl==0: fails.append("blattwerk_leer")
|
||||||
if tt+tl>2500: fails.append("budget")
|
if tt+tl>budget: fails.append("budget")
|
||||||
# Ursprung deckungsgleich
|
# Ursprung deckungsgleich
|
||||||
a=bpy.context.scene.objects["Eiche_01"]; b=bpy.context.scene.objects["Eiche_01_Leaf"]
|
a=bpy.context.scene.objects["Eiche_01"]; b=bpy.context.scene.objects["Eiche_01_Leaf"]
|
||||||
d=(a.location-b.location).length
|
d=(a.location-b.location).length
|
||||||
|
|||||||
Reference in New Issue
Block a user