# Damnoen Saduak: story touchpoints, environment assets and lightweight occlusion
Inspected and revised 18 October 2026 (Asia/Bangkok). Revision 4.

## What the points represent
This is an authored miniature about Khlong Ton Khem and the wider canal community. The four areas and twelve touchpoints are narrative selections. They are attached to actual model objects, not verified geographic coordinates. The original Lad Plee/Lao Tuk Luck market remains outside this scene; it has not been relocated onto a model shop or bridge. This distinction is visible in the area text and each point's limitation.

| Area | Points to explore | Inspected evidence | Model counterpart |
| --- | --- | --- | --- |
| A — orchard and water | A1 commercial garden; A2 small waterways; A3 coconut-sugar craft | SAC, physical environment / occupations / community capital | Mixed fruit-tree silhouettes, illustrative garden rills, compact craft shelter with pan, paddle and vessels |
| B — boat trade | B1 produce boat; B2 paddle and seating; B3 encounters on water | Thongpanya pp.256–257; operator's boat categories | Low, centered produce, timber ribs, passenger seating and individually animated paddles |
| C — shops and homes | C1 raised timber structure; C2 shaded retail space; C3 sorting/display | SAC built environment; Thongpanya pp.257–259 | Posts, raised floor, hanging cloth awning, bowls/pot, jars, fruit, sacks and a weighing scale |
| D — a shared canal | D1 wake and residents; D2 change between walking/boating; D3 homes beside trade | PRD 19 Sep 2024; operator pier/service sections | Water anchor, modeled timber pier and mooring rope, canal-facing house |

### Evidence actually read
1. [Princess Maha Chakri Sirindhorn Anthropology Centre, community record](https://wikicommunity.sac.or.th/community/518), prepared/checked in 2023; physical environment, occupations, community capital and challenges. Supports orchard/water and timber-house themes and records coconut-sugar craft. It describes the wider community, not a per-building Ton Khem survey. Exact crop/tree inventory and workshop dimensions remain unknown.
2. [Thongpanya, KJSS 39 (2018), 254–261](https://so04.tci-thaijo.org/index.php/kjss/article/download/242495/164768/837290), especially 256–259. Qualitative historical context for garden trade, encounter, roads and tourism. It does not establish current stall contents or exact object positions.
3. [Government Public Relations Department, 19 September 2024](https://thailand.prd.go.th/en/content/category/detail/id/52/iid/325594), article paragraphs on residents, waves, noise and pollution. Used as a dated discussion point, not a claim about enforcement or water readings today.
4. [Floating Market Thai operator](https://floatingmarketthai.com/en/floating-market-damnoen-saduak/), paddle/motorboat categories and pier/canal-life sections. Establishes what this operator offers; no prices, capacities or market-wide operating rules transferred into the model.

Each point shows its own link and locator, an observation prompt and a question. Source-backed subject matter and authored geometry are separated. The research stops at sufficient evidence for these themes: there is no adequate basis to invent GPS pins for individual shops, crop counts, recipes or workshop layouts.

## Interaction reference and visual references
The user's Rubber Manufacturing `scene.js`, tag creation and update code (lines around 24–25 and 194–195), plus supplied Main shot.png and Sim Lab.png were inspected. Adapted the hierarchy: large two-line area cards with green letter badges (green palette requested after the reference), small letter/number detail tags, fine orthogonal leaders and green endpoint dots. Added optional “ป้ายจุดย่อย” to show the wider point network. Label placement avoids collisions and open panels; out-of-frame or crowded tags are suppressed. The sidebar still exposes all three points for an area. Labels follow live root transforms, rather than staying at stale boat coordinates.

All eight user attachments were visual design direction, not evidence of local history or an asset licence. They informed varied plant silhouettes, layered stalls, cloth sag, crates and vessels. No image, texture pack or commercial 3D model is copied or bundled. Medieval carts, weapon displays, conifers and winter trees were not imported into the canal context. Existing ONEP/operator visual study remains documented in revision 2.

## Environment assets built for this story
New procedural geometry is authored in `src/market-props.js`, with repeated material/primitive reuse. Six shop-front compositions distinguish produce, prepared-food utensils, coconuts, household vessels, packing/sorting, and a quieter domestic frontage. Cloth awnings have a modest sag and two-tone strips; ropes support their ends. Low-sided bowls and jars use shared low-segment lathed geometry. A single 512×128 sign atlas identifies generic shop categories; the names are illustrative, without brands or prices. Bananas and coconuts use small reusable primitives. A compact sugar-craft shelter supplies the A3 anchor; its hearth/pan arrangement is illustrative, without claiming to reconstruct a named producer.

Planting uses coconut/palm, mango-like spreading crowns, small guava-like crowns, banana-like broad leaves and papaya-like radial silhouettes; plus varied understory fans, shrub clumps, stones and differing heights/leans. Names denote stylized families, not botanically verified individual trees. The same URL seed reproduces their composition. Workshop space and the canal corridor are kept clear. Forest-style winter silhouettes are unsuitable to this subject and were omitted.

## AO choice and cost
References inspected:
- [NVIDIA GPU Gems, chapter 17, §§17.1–17.2](https://developer.nvidia.com/gpugems/gpugems/part-iii-materials/chapter-17-ambient-occlusion): accessibility can be precomputed and stored at vertices. This implementation adapts that principle, not the chapter's complete offline ray-tracing system.
- [Three.js r180 aomap shader](https://raw.githubusercontent.com/mrdoob/three.js/r180/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js): ambient occlusion modifies indirect diffuse and environment specular response. Pinned local `WebGLBindingStates.js` was also inspected for default vertex attributes.

Chosen implementation: **one-time startup baking of short-range proxy hemisphere accessibility**. Eight deterministic directions are tested at each asset vertex against a small set of local box proxies (floor/wall/awning/counter/roof). Radius is about 2 scene units. Distances soften the occlusion, stored as one normalized unsigned byte per vertex. The shader interpolates accessibility and modulates indirect diffuse plus a roughness-weighted indirect specular term. Direct sunlight and real directional shadows remain separate. The AO slider scales this contribution without rebaking or allocating a render target.

A 64×64 RGBA radial alpha map (16,384 bytes) and one instanced geometry draw add subtle tree contact grounding; this decal is an authored contact approximation, not measured AO. It moves neither with sun direction nor with imagined ground deformation. Material and texture resources are disposed on page teardown.

Why this route: there is no new full-screen depth/normal/AO/blur pipeline, no added viewport-size AO render target, and no per-frame AO ray traversal. The existing planar-water reflection remains the main extra scene pass. Static meshes retain semantic groups for selection but are merged by material; AO attributes survive merging. Highlight materials preserve the standard-material AO and timber shader hooks.

Tradeoffs: eight samples and box proxies are intentionally approximate. Vertex interpolation cannot resolve every narrow basket gap; occlusion is local, not complete-scene ray tracing. Dynamically moving objects do not occlude adjacent assets in this bake. No claim of physically calibrated illumination or zero memory cost. Numerical GPU data, measured frame timing and screenshots are recorded separately in `qa/v4` after browser testing; geometry bytes are typed-array accounting, not total GPU or browser memory.


## Traffic and dynamic water — follow-up requirements
The default scene now starts running. Overview resets the closer/lower opening framing, shows all four main area cards and hides detail tags; both label levels have toggles. Pause freezes app time, traffic and water. These are visual model states, not live traffic.

Three pooled boats (two passenger boats and a produce carrier) travel west-to-east in a dedicated illustrative lane. A seeded controller varies cruise speed, inserts short pauses, follows leaders with a 6.2-unit minimum longitudinal gap, tests padded hull occupancy before advancing, and waits for a clear entrance before respawning outside the displayed section. Two local clipping planes trim entry/exit at the model boundary. Vendors remain near their moorings and the story boat retains its own lane. Paddle strokes retract near other boats. No new boats/materials are continually allocated. No collision claim extends to actual navigation or unsimulated human behavior.

The user flagged the previous saturated white ridges as embossed. Local references inspected: `TinyWorld/little-farm.html` fsWater (around2233–2287), and `Little Chinatown/work/runtime/custom-water.js`. Their restrained Fresnel/reflection, transmission/color separation and small glints informed the new look. Their WebGPU/WGSL/TSL pipelines were not merged into this pinned WebGL2 project, and their copyrighted code/assets are not bundled. This canal remains turbid and does not claim their depth-measured refraction/clear-pond caustics.

A real 240×34 damped finite-difference wave field now propagates wind impulses, wakes and water taps. The solver runs fixed1/60-second steps with c1.25, damping1.35 and height clamp±.022 scene units. Wakes use boat displacement; taps inject a bounded balanced impulse. A shared RGBA16F texture passes height and slopes to both water shaders; CPU bilinear sampling drives hull buoyancy. Coarse analytic amplitudes are reduced to .012/.006/.002. Micro-normal slopes and bright sun glints are bounded; the old GGX white-ridge response is removed. There is no foam blanket or animated bump-map-only substitute.

The field's texture is65,280 bytes; CPU fields plus upload array total163,200 bytes. No additional full-screen target is introduced. This is a small-amplitude surface-wave model, not shallow-water discharge, measured wind/current, mass-calibrated canal hydraulics or a navigation forecast. CPU propagation/damping tests and browser GPU execution are recorded in qa/v4.


### Moored-boat water response
Stationary hulls emit staggered, low-amplitude side impulses while wind is present, with strength modulated by bobbing and rocking. Moving hulls emit bow and stern disturbances. All impulses propagate and dissipate in the shared 240×34 damped wave field; no additional full-screen render targets are used. This is authored visual behavior, not calibrated hydrodynamics. The wave regression checks propagation, damping, finite data, pause behavior and stationary-hull excitation.


### Passing-boat visibility correction — 18 October 2026
Earlier impulse positions (1.65/1.70 longitudinal, 0.50 lateral) were mostly underneath the rendered hull (half length 2.045, half width 0.615). Sources now sit outside the hull: 2.12 longitudinal and 0.78 lateral. Damping was reduced from 1.35 to 0.48 per second, allowing disturbances to travel farther before fading. Signed stern/bow forcing avoids a uniformly raised patch. Normal response, reflection distortion and bounded wave-front contrast make the actual evolving field visible. Regression now checks that a moving hull excites otherwise still water at a lateral distance of 1.8 units, and that wake energy subsequently dissipates. No foam sheet or additional screen-sized target was added. This is an authored shallow wave approximation, not a Navier–Stokes model, calibrated wake prediction, or solid-obstacle fluid simulation.
