Skip to content

Commit 731c5a3

Browse files
TMHSDigitalclaude
andcommitted
fix(showcase): make the water-trough water read as liquid and rust its iron
The water was a flat teal panel. Larger ripples (noise scale 22 to 7) under a stronger bump (0.08 to 0.30) at roughness 0.03 catch the key as glints, and the render path enables EEVEE screen-space raytracing (4.2+) so the staves mirror in the surface. The iron gets vertically stretched rust runs that dull its metallic response. No geometry or budget change. A lower camera to show the hull straps was tried and rejected (the water dropped out of view); the hero camera is unchanged. Evidence (live, local .scratch binaries): - Blender 5.2.1 LTS and 4.5.11 LTS: default exit 0; --skip-decimate 9, --stray-vert 15, --lift-z 16, --short-legs 16, --box-ends 17, --float-strap 18, --narrow-hull 19, --open-ends 18, --slab-ends 20 on both. - --output passes framing on both (fill y 0.794). - Contact sheet: luma 0.181 / stage 0.179 / warmth +0.049 / sat 0.138. - Asset sheet: not the least-designed object in the lineup. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent c5952b8 commit 731c5a3

6 files changed

Lines changed: 42 additions & 5 deletions

File tree

18.5 KB
Loading
374 Bytes
Loading
2.16 KB
Loading

‎showcase/water-trough/README.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ The third pass darkened the grazing tint from a pale grey-blue (0.20,
138138
the surface near grazing, where that tint wins, and it read as a
139139
painted slab.
140140

141+
The fourth pass made the surface read as liquid rather than as a teal panel: larger ripples (noise scale 22 to 7) under a stronger bump (0.08 to 0.30) at roughness 0.03 catch the key as glints, and the render path turns on EEVEE screen-space raytracing (4.2+) so the staves mirror in the water. The iron gets vertically stretched rust runs that dull its metallic response. A lower camera was tried to show the hull straps and rejected: the water surface dropped out of view.
142+
141143
### Falsifiers
142144

143145
Each violates one named budget. All nine were run on 4.5.11, 5.1.2 and

‎showcase/water-trough/preview.webp‎

354 Bytes
Loading

‎showcase/water-trough/water_trough.py‎

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -756,7 +756,7 @@ def water_material(name):
756756
mat.use_nodes = True
757757
nt = mat.node_tree
758758
bsdf = nt.nodes["Principled BSDF"]
759-
bsdf.inputs["Roughness"].default_value = 0.06
759+
bsdf.inputs["Roughness"].default_value = 0.03
760760
bsdf.inputs["IOR"].default_value = 1.33
761761
# Deep body where the view looks straight down, a pale sky tint toward
762762
# grazing angles. A light placed to reflect in the surface was
@@ -774,12 +774,12 @@ def water_material(name):
774774
nt.links.new(_sock(tint.outputs, "Result_Color"), bsdf.inputs["Base Color"])
775775
coord = nt.nodes.new("ShaderNodeTexCoord")
776776
noise = nt.nodes.new("ShaderNodeTexNoise")
777-
noise.inputs["Scale"].default_value = 22.0
778-
noise.inputs["Detail"].default_value = 3.0
777+
noise.inputs["Scale"].default_value = 7.0
778+
noise.inputs["Detail"].default_value = 4.0
779779
nt.links.new(coord.outputs["Object"], noise.inputs["Vector"])
780780
bump = nt.nodes.new("ShaderNodeBump")
781-
bump.inputs["Strength"].default_value = 0.08
782-
bump.inputs["Distance"].default_value = 0.004
781+
bump.inputs["Strength"].default_value = 0.30
782+
bump.inputs["Distance"].default_value = 0.006
783783
nt.links.new(noise.outputs["Fac"], bump.inputs["Height"])
784784
nt.links.new(bump.outputs["Normal"], bsdf.inputs["Normal"])
785785
return mat
@@ -789,10 +789,41 @@ def trough_materials():
789789
"""(wood, iron, water): shared by the check, the render and inspection."""
790790
wood = wood_material("TroughWood")
791791
metal = principled("TroughIron", (0.16, 0.155, 0.15, 1.0), 0.85, 0.42, roughness_var=0.10)
792+
rust_streaks(metal)
792793
water = water_material("TroughWater")
793794
return wood, metal, water
794795

795796

797+
def rust_streaks(mat):
798+
"""Wet iron rusts in runs down the strap: rust tone and dull roughness
799+
wherever a vertically stretched noise crosses a threshold."""
800+
nt = mat.node_tree
801+
bsdf = nt.nodes["Principled BSDF"]
802+
coord = nt.nodes.new("ShaderNodeTexCoord")
803+
stretch = nt.nodes.new("ShaderNodeMapping")
804+
stretch.inputs["Scale"].default_value = (1.0, 1.0, 0.25)
805+
nt.links.new(coord.outputs["Object"], stretch.inputs["Vector"])
806+
noise = nt.nodes.new("ShaderNodeTexNoise")
807+
noise.inputs["Scale"].default_value = 26.0
808+
noise.inputs["Detail"].default_value = 5.0
809+
nt.links.new(stretch.outputs["Vector"], noise.inputs["Vector"])
810+
ramp = nt.nodes.new("ShaderNodeMapRange")
811+
ramp.inputs["From Min"].default_value = 0.46
812+
ramp.inputs["From Max"].default_value = 0.66
813+
nt.links.new(noise.outputs["Fac"], ramp.inputs["Value"])
814+
mix = nt.nodes.new("ShaderNodeMix")
815+
mix.data_type = "RGBA"
816+
nt.links.new(ramp.outputs["Result"], _sock(mix.inputs, "Factor_Float"))
817+
_sock(mix.inputs, "A_Color").default_value = bsdf.inputs["Base Color"].default_value
818+
_sock(mix.inputs, "B_Color").default_value = (0.20, 0.075, 0.028, 1.0)
819+
nt.links.new(_sock(mix.outputs, "Result_Color"), bsdf.inputs["Base Color"])
820+
metal = nt.nodes.new("ShaderNodeMapRange")
821+
metal.inputs["To Min"].default_value = 0.85
822+
metal.inputs["To Max"].default_value = 0.15
823+
nt.links.new(ramp.outputs["Result"], metal.inputs["Value"])
824+
nt.links.new(metal.outputs["Result"], bsdf.inputs["Metallic"])
825+
826+
796827
def assign_slots(obj, wood, metal, water):
797828
mats = obj.data.materials
798829
wanted = (wood, metal, water)
@@ -1549,6 +1580,10 @@ def light(name, loc, energy, size, col, rot):
15491580
scene.eevee.taa_render_samples = 64
15501581
except AttributeError:
15511582
pass
1583+
# screen-space raytracing lets the water mirror the staves above it,
1584+
# which is what makes a dark surface read as liquid (EEVEE Next, 4.2+)
1585+
if hasattr(scene.eevee, "use_raytracing"):
1586+
scene.eevee.use_raytracing = True
15521587
scene.render.resolution_x = 1280
15531588
scene.render.resolution_y = 720
15541589
scene.render.image_settings.file_format = (

0 commit comments

Comments
 (0)