Implement land, terrain, environment, and sound managers (#70)
All checks were successful
Native code generation / deterministic (push) Successful in 15m1s
Imaging and meshing gate / native (push) Successful in 5m22s
Native Rust workspace compile / compile (push) Successful in 5m10s

This commit is contained in:
2026-08-10 16:53:35 +00:00
parent 13f85bfa34
commit d537a37172
14 changed files with 4890 additions and 2028 deletions

73
docs/land.md Normal file
View File

@@ -0,0 +1,73 @@
# Land, terrain, environment, and sound
`GridClient` owns one lazily constructed `ParcelManager`, `TerrainManager`,
`EnvironmentManager`, and `SoundManager`. Cloning a manager keeps the same
registries and state; disposing it releases packet and capability
subscriptions. Incoming state is committed before an event callback is run,
and registries snapshot callbacks before invoking them so callbacks never run
under a manager lock.
## Parcels
Parcel properties received from the capability event queue retain their
request sequence, result, selection state, region-local coordinates, flags,
permissions, media settings, and 512-byte occupancy bitmap. The bitmap is
expanded to the simulator's four-metre parcel map. Overlay packets are four
fixed 1 KiB segments: they may arrive out of order, duplicate sequence IDs do
not advance completion, and the downloaded event is emitted only after all
four unique segments are present.
Requests select the reference LLUDP packet for property, access-list, dwell,
owner, update, subdivision/join, purchase, reclaim, deed, release, auction,
selection/return, and terraform operations. Remote parcel lookup and script
resource summary/detail use their named capabilities. Resource replies,
variable blocks, strings, bitmaps, and HTTP bodies are bounded before state is
published. Bulk parcel discovery is cancellation-aware and skips cells already
covered by received bitmaps.
Parcel and estate mutation methods send real protocol operations. Applications
must place user confirmation and authorization policy in front of destructive
operations. Live-grid tests must remain ignored unless explicit credentials
and opt-in configuration are supplied; the default tests use only synthetic
packets and in-memory HTTP handlers.
## Terrain and wind
`TerrainCompressor` implements the 16×16 DCT patch format, including zig-zag
coefficient order, quantization headers, normal and large-region coordinate
encodings, end markers, and bounded layer construction. `TerrainManager`
decodes land and wind layer packets, stores patches before emitting
`LandPatchReceived`, and keeps width and height independent for rectangular
variable regions. `Simulator::terrain_height_at_point` resolves a local metre
coordinate through the stored patch grid.
PBR terrain material overrides use the `ModifyRegion` capability. Exactly four
slots are accepted. Empty maps remain empty slots; non-empty maps use the
native `AssetMaterial` override codec. Capability and LLSD response bodies are
limited to 16 MiB and operations honor cancellation.
## Environment
Extended environment requests use `ExtEnvironment`; parcel operations append
the compatibility query key `parcelid`, while region operations leave the URI
unchanged. GET, POST, and DELETE implement retrieval, update, and reset.
`EnvironmentSettings` provides the legacy LLSD path. Parsed region and legacy
state is installed before update events, and all request/response bodies are
limited to 16 MiB.
## Sound
The sound manager emits typed events for attached sounds, attached gain
changes, preload queues, and positional sound triggers. UUID identity, gain,
region handle, position, and `SoundFlags` (including queueing) are retained.
Outgoing triggers validate IDs and finite values, clamp gain to the protocol
range, and select the current or explicitly supplied simulator and region
handle.
## Focused validation
The native tests cover terrain golden round trips and bounds, rectangular
region addressing, parcel bitmap and overlay correlation, capability parcel
state publication, environment LLSD shapes, sound packet identity/queueing, and
state-before-callback ordering. The translated compatibility cases cover
extended-environment HTTP selection and all four terrain-material slots.