From de2acdd3818c06c56506737fd3d6cb91bd5365aa Mon Sep 17 00:00:00 2001 From: D4rkst3r Date: Fri, 31 Jul 2026 09:10:54 +0200 Subject: [PATCH] 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 --- README.md | 9 +++ blender_manifest.toml | 2 +- dist/index.json | 8 +-- dist/stylized_rock_generator-2.7.0.zip | Bin 18091 -> 0 bytes dist/stylized_rock_generator-2.8.0.zip | Bin 0 -> 19166 bytes stylized_rock_generator.py | 94 ++++++++++++++++++++++++- tests/test_vertex_cavity.py | 45 ++++++++++++ 7 files changed, 152 insertions(+), 6 deletions(-) delete mode 100644 dist/stylized_rock_generator-2.7.0.zip create mode 100644 dist/stylized_rock_generator-2.8.0.zip create mode 100644 tests/test_vertex_cavity.py diff --git a/README.md b/README.md index f41c8a1..1e771ee 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,15 @@ Abgestimmt auf `A:\eco\EcoGame` (UE 5.8). Kurzfassung: Platten), `Fugenbreite` (klein = harte Fuge, flache Platte), `Platten flach` (1 = Flaeche nahezu einfarbig). Ein dichtes Zellmuster ueber die ganze Oberflaeche erschlaegt die Form und passt NICHT zu diesem Look. +- **Texturfreie Alternative — Vertex-Cavity:** Statt zu baken laesst sich die + Cavity in die **Vertex-Farben** schreiben (Attribut `Cavity`, ueberlebt den + FBX-Roundtrip verlustfrei — gemessen 0.250..0.947 vor und nach dem Import). + Das Material braucht dann **keine Textur**: + `Base Color = Farbton x VertexColor`, dazu Kantenlicht (Fresnel) und + Schattentint. Vorteil gegenueber Triplanar: die dunklen Fugen sitzen auf den + ECHTEN Kanten des Meshes statt darueberzuschweben. Grenze: die Aufloesung + haengt an der Vertex-Dichte — fuer flaechige Platten reicht sie, fuer feine + Struktur nicht. - 1024 px reicht fuer stylized Formen. - Tileable (4D-Torus) passt zum triplanar mappenden Master-Material. diff --git a/blender_manifest.toml b/blender_manifest.toml index 7cdfb78..713129d 100644 --- a/blender_manifest.toml +++ b/blender_manifest.toml @@ -1,7 +1,7 @@ schema_version = "1.0.0" id = "stylized_rock_generator" -version = "2.7.0" +version = "2.8.0" name = "Stylized Rock Generator" tagline = "Batch-Generator fuer stylized Rocks mit UE5-Export" maintainer = "D4rkst3r" diff --git a/dist/index.json b/dist/index.json index e45b176..d3cfd85 100644 --- a/dist/index.json +++ b/dist/index.json @@ -7,7 +7,7 @@ "id": "stylized_rock_generator", "name": "Stylized Rock Generator", "tagline": "Batch-Generator fuer stylized Rocks mit UE5-Export", - "version": "2.7.0", + "version": "2.8.0", "type": "add-on", "maintainer": "D4rkst3r", "license": [ @@ -23,9 +23,9 @@ "Mesh", "Modeling" ], - "archive_url": "./stylized_rock_generator-2.7.0.zip", - "archive_size": 18091, - "archive_hash": "sha256:2a3b20b6a915271e10b5246b77fc89361cab3dab2ead032aff4e4cd3526ccf33" + "archive_url": "./stylized_rock_generator-2.8.0.zip", + "archive_size": 19166, + "archive_hash": "sha256:4c05d56bd4962caf7ce2bddd086ecbf0f6e34eb7fc045f35770f8e6d5267b7ad" }, { "schema_version": "1.0.0", diff --git a/dist/stylized_rock_generator-2.7.0.zip b/dist/stylized_rock_generator-2.7.0.zip deleted file mode 100644 index 7007ff0b070e8bbb3a181a10d32c1be7c3ebf4c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18091 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 diff --git a/dist/stylized_rock_generator-2.8.0.zip b/dist/stylized_rock_generator-2.8.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..62b7260fbba5b4da9b87c134aee1dcfc69d4a2e7 GIT binary patch literal 19166 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 Th42gf8uA=w_+hoR`PKakd$Jln literal 0 HcmV?d00001 diff --git a/stylized_rock_generator.py b/stylized_rock_generator.py index bea0d64..9947c56 100644 --- a/stylized_rock_generator.py +++ b/stylized_rock_generator.py @@ -1,7 +1,7 @@ bl_info = { "name": "Stylized Rock Generator", "author": "D4rkst3r", - "version": (2, 7, 0), + "version": (2, 8, 0), "blender": (4, 2, 0), "location": "View3D > Sidebar > Rock Gen", "description": ( @@ -60,6 +60,7 @@ PRESET_KEYS = ( "shading_mode", "autosmooth_angle", "randomize_shape", "noise_scale_max", "displace_strength_max", "nonuniform_scale", "flatten_bottom", "flatten_ratio", "set_origin_bottom", "keep_size", + "bake_vertex_cavity", "cavity_strength", "cavity_blur", "cavity_gradient", "use_class_size", "base_size", ) @@ -453,6 +454,65 @@ def _apply_random_transform(context, obj, settings, rng): bpy.ops.object.transform_apply(location=False, rotation=True, scale=True) +def _bake_vertex_cavity(context, obj, settings): + """Cavity + Hoehen-Verlauf in die VERTEX-FARBEN backen. + + Warum: das Material braucht damit KEINE Textur. Base Color = Farbton x + Vertex-Farbe, dazu Kantenlicht und Schattentint im Shader - genau der + Genshin-Aufbau. Ausserdem sitzen die dunklen Fugen auf den ECHTEN Kanten + des Meshes, statt per Triplanar darueberzuschweben. + + Aufloesung haengt an der Vertex-Dichte; fuer flaechige Platten reicht das, + fuer feine Struktur nicht (dann Textur nehmen). + """ + me = obj.data + layer = me.color_attributes.get("Cavity") + if layer is None: + layer = me.color_attributes.new(name="Cavity", type='BYTE_COLOR', domain='CORNER') + me.color_attributes.active_color = layer + me.color_attributes.render_color_index = me.color_attributes.find("Cavity") + + _deselect_all(context) + context.view_layer.objects.active = obj + obj.select_set(True) + try: + bpy.ops.paint.vertex_color_set(color=(1.0, 1.0, 1.0, 1.0)) + except RuntimeError: + pass + try: + bpy.ops.paint.vertex_color_dirt( + blur_strength=1.0, + blur_iterations=settings.cavity_blur, + clean_angle=3.14159, + dirt_angle=0.0, + dirt_only=False, + normalize=True, + ) + except RuntimeError as exc: + raise RockGenError("Vertex-Cavity fehlgeschlagen: %s" % exc) + + # Staerke regeln + optionaler Hoehen-Verlauf (unten dunkler, wie in der + # Referenz). Beides direkt auf den Farbwerten, das ist schnell genug. + zs = [v.co.z for v in me.vertices] + if not zs: + return + zmin, zmax = min(zs), max(zs) + span = max(zmax - zmin, 1e-6) + amt = settings.cavity_strength + grad = settings.cavity_gradient + data = layer.data + for poly in me.polygons: + for li in poly.loop_indices: + vi = me.loops[li].vertex_index + c = data[li].color + val = 1.0 - (1.0 - c[0]) * amt # Cavity abschwaechen + if grad > 0.0: + t = (me.vertices[vi].co.z - zmin) / span + val *= (1.0 - grad) + grad * (0.35 + 0.65 * t) + val = max(0.0, min(1.0, val)) + data[li].color = (val, val, val, 1.0) + + def _apply_shading(context, obj, settings): """Setzt den Shading-Look: FLAT (facettiert), SMOOTH oder AUTO (nach Winkel).""" _deselect_all(context) @@ -607,6 +667,8 @@ def make_one_rock(context, settings, index, batch_count=1): _apply_hardsurface(context, obj, settings) _apply_random_transform(context, obj, settings, rng) _apply_shading(context, obj, settings) + if settings.bake_vertex_cavity: + _bake_vertex_cavity(context, obj, settings) if settings.set_origin_bottom: _set_origin_bottom(context, obj) if settings.assign_material: @@ -730,6 +792,27 @@ class RockGenSettings(PropertyGroup): description="Setzt den Origin auf die Unterseiten-Mitte (sauberes Aufstellen in UE)", ) + # --- Vertex-Cavity (texturfreier Weg) --- + bake_vertex_cavity: BoolProperty( + name="Cavity in Vertex-Farben", default=False, + description=("Backt Cavity/AO in die Vertex-Farben (Attribut 'Cavity'). " + "Das Material braucht dann KEINE Textur: Base Color = Farbton " + "x Vertex-Farbe, Rest ueber Kantenlicht und Schattentint"), + ) + cavity_strength: FloatProperty( + name="Cavity-Staerke", default=0.7, min=0.0, max=1.0, + description="0 = alles weiss, 1 = volle Abdunklung in den Vertiefungen", + ) + cavity_blur: IntProperty( + name="Weichzeichnen", default=1, min=0, max=5, + description="Glaettet den Cavity-Verlauf ueber benachbarte Vertices", + ) + cavity_gradient: FloatProperty( + name="Hoehen-Verlauf", default=0.35, min=0.0, max=1.0, + description=("Dunkelt den Stein nach unten hin ab (wie in der Referenz). " + "0 = aus"), + ) + # --- Material --- assign_material: BoolProperty( name="Material zuweisen", default=False, @@ -1567,6 +1650,15 @@ class VIEW3D_PT_rock_generator(Panel): sub.prop(settings, "lod_count") sub.prop(settings, "lod_ratio_step") + box = layout.box() + box.label(text="Vertex-Cavity (ohne Textur)") + box.prop(settings, "bake_vertex_cavity") + sub = box.column(align=True) + sub.enabled = settings.bake_vertex_cavity + sub.prop(settings, "cavity_strength") + sub.prop(settings, "cavity_gradient") + sub.prop(settings, "cavity_blur") + box = layout.box() box.label(text="Material") box.prop(settings, "assign_material") diff --git a/tests/test_vertex_cavity.py b/tests/test_vertex_cavity.py new file mode 100644 index 0000000..91f0a94 --- /dev/null +++ b/tests/test_vertex_cavity.py @@ -0,0 +1,45 @@ +import bpy, sys, importlib.util, os, tempfile +spec=importlib.util.spec_from_file_location("srg", r"A:\eco\stylized_rock_generator\stylized_rock_generator.py") +r=importlib.util.module_from_spec(spec); sys.modules["srg"]=r; spec.loader.exec_module(r) +try: r.unregister() +except Exception: pass +r.register() +fails=[] +for o in list(bpy.data.objects): bpy.data.objects.remove(o,do_unlink=True) +s=bpy.context.scene.rock_gen_settings +s.batch_count=1; s.subsurf_levels=4; s.use_modal=False +s.shading_mode='FLAT'; s.bake_vertex_cavity=True +s.name_prefix="Fels"; s.name_form="A"; s.name_class='M' +res=bpy.ops.object.generate_rocks_batch() +obs=[o for o in bpy.context.scene.objects if o.type=='MESH'] +ob=obs[0] +me=ob.data +names=[a.name for a in me.color_attributes] +print("FARB-ATTRIBUTE:", names) +if "Cavity" not in names: fails.append("kein_attribut") +else: + vals=[d.color[0] for d in me.color_attributes["Cavity"].data] + vals.sort() + print("CAVITY min=%.3f p10=%.3f median=%.3f max=%.3f (n=%d)" + % (vals[0], vals[len(vals)//10], vals[len(vals)//2], vals[-1], len(vals))) + if vals[-1]-vals[0] < 0.05: fails.append("kein_kontrast") +# Faceted? +sm=sum(1 for p in me.polygons if p.use_smooth) +print("Shading: smooth=%d / flat=%d" % (sm, len(me.polygons)-sm)) +# FBX-Roundtrip: ueberleben die Vertex-Farben? +tmp=tempfile.mkdtemp(); fp=os.path.join(tmp,"cav.fbx") +for o in bpy.context.selected_objects: o.select_set(False) +ob.select_set(True); bpy.context.view_layer.objects.active=ob +bpy.ops.export_scene.fbx(filepath=fp, use_selection=True, colors_type='SRGB', + mesh_smooth_type='FACE', use_triangles=True) +for o in list(bpy.data.objects): bpy.data.objects.remove(o,do_unlink=True) +bpy.ops.import_scene.fbx(filepath=fp) +imp=[o for o in bpy.data.objects if o.type=='MESH'][0] +inames=[a.name for a in imp.data.color_attributes] +print("NACH FBX-ROUNDTRIP:", inames, "Tris=%d" % sum(len(p.vertices)-2 for p in imp.data.polygons)) +if not inames: fails.append("fbx_verliert_farben") +else: + iv=[d.color[0] for d in imp.data.color_attributes[0].data] + print(" Wertebereich nach Import: %.3f .. %.3f" % (min(iv), max(iv))) +r.unregister() +print("ERGEBNIS:", "ALLE CHECKS OK" if not fails else "FEHLER: "+", ".join(fails))