Boden-Texturen: 3-m-Kachel + Anti-Wiederholung, „Gras“ heißt jetzt „Steppe“

Sly 25.10.: Texturen wiederholen sich zu krass, „Gras“ sieht nicht nach Gras aus.
- Kachel 3 m statt 1 m; zweite Abtastung gedreht + 2,3× größer, großflächiges
  Rauschen mischt beide, zweites Rauschen variiert die Helligkeit (Spiegel Client).
- Material 0 (gras_steppe) heißt im Editor „Steppe“ (Format unverändert);
  Hilfetexte nachgezogen.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
slyphax 2026-10-25 01:05:07 +02:00
parent 9f2a32df70
commit 99a06c6cb8
6 changed files with 24 additions and 13 deletions

View file

@ -49,7 +49,7 @@ static func text() -> String:
["1 / 2 / 3 / 4", "Pinselmodus: Heben / Senken / Glätten / Malen"],
["[ / ]", "Pinselgröße: Klein (4 m) / Mittel (12 m) / Groß (32 m) zyklisch"],
["Linksklick-Ziehen", "Boden formen bzw. malen"],
["Strg+Linksklick-Ziehen", "Gegenteil: senken (bei Heben) / heben (bei Senken) / Gras zurückmalen"],
["Strg+Linksklick-Ziehen", "Gegenteil: senken (bei Heben) / heben (bei Senken) / Steppe zurückmalen"],
]))
out += _header("Datei & Undo")
out += _table(_rows([

View file

@ -1815,10 +1815,10 @@ func _enter_terrain_mode() -> void:
return
tool_mode = "terrain"
terrain_mod.terrain_panel.visible = true
help_label.text = "Linksklick-Ziehen: Boden formen oder malen · Strg+Linksklick: Gegenteil / Gras zurück ·\n1/2/3/4: Heben/Senken/Glätten/Malen · [ / ]: Pinselgröße Klein/Mittel/Groß ·\nPinselgröße & Material rechts · Rechte Maustaste: Flug · Strg+Z: letzter Strich weg"
help_label.text = "Linksklick-Ziehen: Boden formen oder malen · Strg+Linksklick: Gegenteil / Steppe zurück ·\n1/2/3/4: Heben/Senken/Glätten/Malen · [ / ]: Pinselgröße Klein/Mittel/Groß ·\nPinselgröße & Material rechts · Rechte Maustaste: Flug · Strg+Z: letzter Strich weg"
terrain_mod.terrain_edit_btn.button_pressed = true
terrain_tool.call("set_brush_mode", terrain_mod._selected_terrain_mode())
_set_status("Terrain-Modus an: LINKSKLICK-Ziehen formt den Boden, im Malen-Modus färbt er das Gelände (Gras/Sand/Fels). Regler rechts stellen Pinsel und Stärke ein.")
_set_status("Terrain-Modus an: LINKSKLICK-Ziehen formt den Boden, im Malen-Modus färbt er das Gelände (Steppe/Sand/Fels …). Regler rechts stellen Pinsel und Stärke ein.")
func _leave_terrain_mode() -> void:

View file

@ -95,7 +95,7 @@ func build() -> void:
mat_scroll.add_child(mat_grid)
terrain_palette.add_child(mat_scroll)
var mat_labels := [
"🌿 Gras", "🏖 Sand", "🪨 Fels", "🌱 Sattgras",
"🏜 Steppe", "🏖 Sand", "🪨 Fels", "🌱 Sattgras",
"🍂 Vertrocknet", "🍀 Moos", "🟫 Erde", "🛤 Pfad",
"⛏ Umgegraben", "🧱 Schotter", "🟤 Lehm", "🏜 Sand hell",
"🏜 Sand rost", "🗻 Basalt", "⛰ Geröll", "🌧 Schlamm",
@ -178,7 +178,7 @@ func build() -> void:
terrain_panel.add_child(terrain_weich_slider)
terrain_panel.add_child(_muted_label(
"Linksklick-Ziehen formt bzw. malt (je nach Werkzeug), Strg+Linksklick macht das Gegenteil — im Malen-Modus malt Strg+Klick Gras zurück. "
"Linksklick-Ziehen formt bzw. malt (je nach Werkzeug), Strg+Linksklick macht das Gegenteil — im Malen-Modus malt Strg+Klick Steppe (Grundboden) zurück. "
+ "Jeder Strich ist EIN Rückgängig-Schritt (Strg+Z). Rechte Maustaste = Flug, ESC beendet den Terrain-Modus."))
# --- Bauen (Karte t_97ea59c5): Modular-Builder-Pieces im App-Skelett ---

View file

@ -76,7 +76,7 @@ func _init() -> void:
_fill_spin(size_z_edit)
vbox.add_child(size_z_edit)
var hint := _make_label("Erlaubt: 256–4096 m. Die Karte bleibt mittig — das bestehende Terrain\nbehaftet seine Weltposition, die neue Randzone wird flach (Gras).")
var hint := _make_label("Erlaubt: 256–4096 m. Die Karte bleibt mittig — das bestehende Terrain\nbehaftet seine Weltposition, die neue Randzone wird flach (Steppe).")
hint.modulate = Color(1, 1, 1, 0.7)
vbox.add_child(hint)
@ -188,7 +188,7 @@ func _update_preview() -> void:
lines.append("Beim Verkleinern geht nichts verloren — alles liegt innerhalb der neuen Grenzen.")
elif grow:
preview_label.modulate = Color(1, 1, 1, 0.7)
lines.append("Beim Vergrößern bleibt alles erhalten — die neue Randzone wird flaches Gras.")
lines.append("Beim Vergrößern bleibt alles erhalten — die neue Randzone wird flache Steppe.")
# Spawn-Speicher-Warnung (R2-Befund): V11 verlangt ≥ 4 Punkte je Team beim
# SPEICHERN — nach dem Entfernen drohen Teams unter den Deckwert.

View file

@ -25,7 +25,7 @@ uniform float index_staerke : hint_range(0.0, 1.0) = 0.75;
// im Client. Nicht gesetzt → ausschalten (vertex_only-Modus).
uniform sampler2DArray albedo_array : source_color, filter_linear_mipmap, repeat_enable;
uniform float layer_count = 20.0;
uniform float tile_size = 1.0;
uniform float tile_size = 3.0;
uniform float texturen_an = 0.0; // 1.0 = Texturen aktiv (vom Mesh-Code gesetzt)
// Splat-Gewichtstextur (Karte t_7a0a6b79 — weiche Übergänge): je Texel die
@ -87,6 +87,20 @@ vec2 warp(vec2 g) {
return g + o * 0.9; // eine Oktave: Quest-Budget (8 Hash statt 16)
}
// Anti-Wiederholung (Karte 25.10., Sly: „Texturen wiederholen sich zu krass“):
// Kachel 3 m statt 1 m; zweite Abtastung gedreht + 2,3× größer, ein
// großflächiges Rauschen (~9 m) mischt beide, ein zweites (~30 m) variiert die
// Helligkeit leicht. 2 Albedo-Fetches je Material statt 1.
vec3 alb_anti(float id, vec2 wp) {
float T = max(tile_size, 0.05);
vec2 uv1 = wp / T;
vec2 uv2 = vec2(0.8196 * wp.x - 0.5729 * wp.y, 0.5729 * wp.x + 0.8196 * wp.y) / (T * 2.3) + vec2(0.37, 0.71);
vec3 a = texture(albedo_array, vec3(uv1, id)).rgb;
vec3 b = texture(albedo_array, vec3(uv2, id)).rgb;
vec3 col = mix(a, b, smoothstep(0.35, 0.65, vnoise(wp * 0.11)));
return col * mix(0.88, 1.08, vnoise(wp * 0.035 + vec2(17.0, 3.0)));
}
float mat_id(ivec2 p) {
return clamp(floor(texelFetch(material_map, p, 0).r * 255.0 + 0.5), 0.0, layer_count - 1.0);
}
@ -159,9 +173,7 @@ void fragment() {
float m1 = max(material_res - 1.0, 1.0);
vec2 g = clamp(warp(clamp(map_uv, 0.0, 1.0) * m1), vec2(0.0), vec2(m1));
vec3 t2 = top2(g);
vec2 uv = world_pos.xz / max(tile_size, 0.05);
vec3 alb = mix(texture(albedo_array, vec3(uv, t2.y)).rgb,
texture(albedo_array, vec3(uv, t2.x)).rgb, t2.z);
vec3 alb = mix(alb_anti(t2.y, world_pos.xz), alb_anti(t2.x, world_pos.xz), t2.z);
col = alb * col; // Tönung/Shading multipliziert (wie Client)
}
// --- Konturlinien (unverändert, Karte t_3ebe4086) ---

View file

@ -157,8 +157,7 @@ func _apply_texture_uniforms(mat: ShaderMaterial) -> void:
albedo.create_from_images(imgs)
mat.set_shader_parameter("albedo_array", albedo)
mat.set_shader_parameter("layer_count", float(imgs.size()))
mat.set_shader_parameter("tile_size",
float(arrays.tile_size) if arrays.tile_size > 0.0 else 1.0)
mat.set_shader_parameter("tile_size", 3.0) # Spiegel Client TILE_SIZE (Karte 25.10.)
mat.set_shader_parameter("texturen_an", 1.0)