✦ SPIELWELTENMoto Racer - Rampage ↗

Continuous limestone on the existing road cuts

Current update: The initial hard material partition below was replaced after native 21:05 review by a continuous native LayeredLit opacity blend over the complete original terrain. The last section records the current implementation; no image acceptance is claimed yet.

The actual images Docs/QA/20260915-202407-campaign/alps-02-pass0-view1.png and alps-03-pass0-view0.png were inspected. Correctly scaled and oriented scans are now visible, but they appear as isolated peeling strips against a much larger smooth green/grey wall. The surrounding terrain still uses the geographic planar colour mixture for every Alpine triangle, including the near-vertical graded road cuts.

The existing tileable AlpineLimestone_color.jpg was viewed directly. It has real warm grey-brown strata and crack detail; it is not the UV-island RockFace atlas. The material keeps this colour unchanged, with a white multiplier. This iteration does not assert a neutral-grey result by applying another speculative blue compensation.

Exact implementation scope

ChapterTerrain.BuildTile still builds the same positions, normals, UVs, quads, triangle winding and original mesh in the same order. It identifies the existing triangle faces steeper than 40°, within 10–65m horizontally of the nearest road position, and at least 1.25m above that road. The 65m boundary matches the actual end of the existing road-to-DEM grading; it is not a terrain-tile boundary or a random painted patch. Low shoulders and the natural distant geography retain their existing surface materials.

The original complete mesh stays attached to its original MeshCollider. A separate renderer copy uses exactly the same vertex data and the same triangles, partitioned into ground and rock material submeshes. No collider is split or recooked by changing its mesh, and no terrain/road position, topology, route, guardrail or tire surface changes. This adds one renderer material submesh and one owned visual mesh copy only to tiles with selected cliff triangles; it creates no additional scene objects or collider components.

The rock uses native HDRP/Lit triplanar mapping with the existing colour, OpenGL normal and roughness mask at 9m, plus existing limestone detail at 2.8m. The scale is verified against the pinned LitDataIndividualLayer.hlsl: both triplanar mappings first use world scale 1/9; independent detail ST 9/2.8 therefore yields 1/2.8. Source roughness keeps its full 0–1 range. The rock material is included in ChapterTerrain.RepresentativeMaterials for variant retention. There is no custom shader, double-sided workaround or enlarged overhead orthophoto on the selected vertical faces.

The terrain builder accumulates the actual selected area by 32m route sections. RockCuts omits a poorly seated open scan on a shallow (<approximately 35°) base only when at least 80m² of actual replacement rock terrain has already been built in that same route section. Other scanned rocks remain. This replaces isolated flaps with a coherent surface rather than removing them without a substitute. Placement RNG consumption, road clearance and all collision behavior remain intact.

Bounded checks and native control

The CPU scope check ArtSource/Alps/audit_cliff_cut.py uses the unchanged Alps02 polyline/DEM, existing 4m grid and grading formula around d=1959.939m. It is an approximation without native bank/apron triangle queries, not a rendered pass. It finds:

Managed compilation passed 92 Runtime + 21 Editor files, zero warnings/errors. The original collision mesh is preserved by construction; Root's native verification remains authoritative. Native logs include RAMPAGE_ALPINE_ROAD_CUT and replacedByCoherentTerrainCut in the scan summary. Required visual controls are the same Alps02 view1 and Alps03 view0. Native evaluation must check continuous strata, repeat visibility, grass/snow boundaries, colour and whether remaining scans integrate. The new material treatment has not yet received image acceptance.

The separately reviewed summer meadow mask was also published under Root's explicit instruction. Its production SHA is 8f214436fbcf4fb68bab779126387d662b229c4fc4cd16ed5968b501288624fe. The canonical mask generator now reapplies the explicitly approved frozen R composition only after verifying matching G/B/A; a rerun reproduced that exact hash. Winter, DEM and route sources remain unchanged.

Continuous edge blend after the 21:05 native review

Both Docs/QA/20260915-210513-campaign/alps-02-pass0-view1.png and alps-03-pass0-view0.png were inspected. The material produces continuous visible rock, but its binary triangle assignment creates an unacceptable angular boundary against grass and snow.

A source-mask audit at the exact controls, retained in ArtSource/Alps/cut-mask-edge-audit.json, also rules out simply swapping the original layered material's G source: Alps02 has only approximately 0–0.012 existing G near the boundary, but Alps03 has approximately 0.28–0.68. Replacing geographic Layer2 with tileable limestone would therefore visibly change the winter boundary even when an added cut weight was zero. This is why the current fix retains the original complete four-layer terrain underneath.

The renderer copy keeps the complete original triangle array as submesh 0 with the unchanged original material. A transparent second submesh repeats only triangles whose vertices have a nonzero cut weight. All positions, normals and original collider indices stay unchanged. There is no height offset, new collider, duplicated scene object or modification of the summer/winter masks. Original shadow/depth rendering remains on the opaque base. This incurs one additional forward material pass only over the selected cut surface.

The weight is calculated from the actual smoothed terrain mesh normals and world-space relationship to the nearest route:

Adjacent quads receive the same weights at shared coordinates. The weights are stored only on the visual copy as Color32 R; zero is exactly zero. The overlay is selected when any triangle corner is nonzero, and interpolation produces a continuous edge inside it. Weighted selected area still controls the existing ≥80m² replacement requirement for poorly seated scanned strips.

Verified native opacity mechanism

This uses HDRP/LayeredLit, not an unsupported assumption that HDRP/Lit consumes vertex alpha. The pinned sources establish the full chain:

  1. MaterialExtension.cs: VertexColorMode Multiply is value 1.
  2. LayeredLitData.hlsl GetBlendMask: _LAYER_MASK_VERTEX_COLOR_MUL multiplies the sampled mask by vertex colour.
  3. A white constant mask and two active layers give layer 1 weight w=vertex R, and layer 0 weight 1−w. Both use the same limestone colour, normal, roughness and 9m/2.8m mappings, preserving identical RGB across the blend.
  4. The two BaseColor alphas are 0 and 1, with alpha remap 0–1. LitDataIndividualLayer.hlsl returns this alpha and LayeredLitData.hlsl line 742 computes PROP_BLEND_SCALAR(alpha,weights), yielding opacity=w. The rock's RGB is not attenuated twice.
  5. The native LayeredLit Forward pass uses transparency blending. BaseUnlitAPI.SetupBaseUnlitKeywords validates the render queue and sets the transparent LessEqual depth test.

The overlay disables Z writes, its DepthOnly/ShadowCaster/MotionVectors passes, refraction and preserved specular lighting. Consequently a zero-weight edge contributes neither colour nor a remaining specular highlight. It uses identical coplanar vertices with LessEqual depth testing over the opaque base, so no speculative geometric offset is applied. Any actual depth artifacts must be judged in the next native frame before considering an offset.

The new overlay material is retained through ChapterTerrain.RepresentativeMaterials. Managed compilation passed 93 Runtime + 21 Editor files, zero warnings/errors. No Unity/Player was launched by this agent. Required native controls remain Alps02 view1 and Alps03 view0, specifically edge continuity, preservation of existing snow/geology at zero weight, limestone detail, depth artifacts and the additional forward-pass cost. The native artistic result remains pending.

Separate road-apron correction

The 22:25 native Alps02 view1 still showed a green strip across the foot of the cutting. The road apron is a separate mesh above the DEM and retained its ordinary meadow material. DressAlpineShoulder now applies the same slope/height/distance-weighted overlay to that existing apron, preserving its original vertices, indices and collider mesh. Low road edges retain zero weight. This source change requires its own subsequent native image check; the 22:25 pass predates it.