SlpkLayer

class SlpkLayer : Ogc3dTilesLayer

Renders an ArcGIS SLPK (I3S Scene Layer Package) opened in place from a local file — no extraction or copy, so 5-15 GB packages work on device (see ZipFileArchive).

Reuses Ogc3dTilesLayer's entire streaming/traversal/cache/GPU pipeline via its two extension points: parseRootDocument builds the Tileset tree from 3dSceneLayer.json + node pages (SceneLayerParser) instead of a tileset.json, and decodeCustomContent transcodes each node's I3S geometry buffer to a GltfModel (I3sGeometryDecoder) that the mesh path renders unchanged. The ArchiveTileByteSource makes the fetch queue read node bytes from the zip.

Scope: JVM + Android (needs java.util.zip), I3S 1.7+ mesh profiles. Create via open.

Types

Link copied to clipboard
object Companion

Properties

Link copied to clipboard
var altitudeAnchor: Position?

Geographic anchor for altitudeMode. null (default) → root tile's bounding-volume centre, resolved on first render after parse. Set explicitly when the root centre isn't representative (e.g. a long-strip drone capture whose centre is over open water; a wide-area tileset where the anchor should be near the camera).

Link copied to clipboard
var altitudeMode: AltitudeMode

How altitudeOffset is anchored.

Link copied to clipboard

Vertical correction in meters, applied along the ellipsoid normal at altitudeAnchor (or the root tile's bounding-volume centre by default). Interpretation depends on altitudeMode. Common case: the tileset's vertical datum doesn't match WGS84 ellipsoid (geoid offset, local survey datum) — a constant offset realigns it.

Link copied to clipboard
open override var displayName: String?
Link copied to clipboard
var gaussianLoader: GaussianLoader?

Gaussian-splat decoder. Defaults to GltfGaussianLoader (glb-wrapped SPZ via KHR_gaussian_splatting, plus raw .spz). Set to null to disable splat decoding or swap for a different GaussianLoader. Payloads not matching b3dm/i3dm/cmpt/pnts/glTF/tileset.json are offered to GaussianLoader.supports.

Link copied to clipboard

Per-fragment Gaussian-alpha discard threshold; raise to trim the soft splat fringe and cut blend-ROP fillrate.

Link copied to clipboard

Concurrent splat-parse cap. Each in-flight SPZ parse holds tens of MB transient (compressed buffer + decoded position/scale/rot/SH FloatArrays before GPU upload), so the general fetchConcurrency would peak at ~2 GB on a splat tileset. Mesh fetches on the same layer keep fetchConcurrency's budget — only the Gaussian branch gates here. Setter rebinds the semaphore.

Link copied to clipboard

Gaussian-splat offscreen render scale in (0, 1]. Values < 1 draw all splat tiles into a reduced-resolution target and composite-upsample — splat rendering is blended-fill bound, so 0.5 costs ~1/4 the GPU fragment work at slightly softer splat edges. 1.0 restores direct full-resolution drawing. See DrawableGaussianPass.

Link copied to clipboard
open override var isDynamic: Boolean
Link copied to clipboard
open override var isEnabled: Boolean
Link copied to clipboard
open override var isPickEnabled: Boolean
Link copied to clipboard

Whether surface shapes drape onto this layer's mesh tiles the way they drape onto terrain. Mesh content only — point clouds and Gaussian splats never receive shapes.

Link copied to clipboard
open override var maxActiveAltitude: Double
Link copied to clipboard

Hard cap on draw distance in meters. 0 disables.

Link copied to clipboard

Soft GPU-byte budget for the working set. Effective SSE drifts up past this and back down under 70 %.

Link copied to clipboard

Pixel error floor for tile refinement. Setter also resets the effective SSE so changes take effect immediately.

Link copied to clipboard
open override var minActiveAltitude: Double
Link copied to clipboard
open override var opacity: Float
Link copied to clipboard

Base pnts point size in pixels (size-attenuated by the shader). Matches CesiumJS' default; bump for sparse datasets where 1-px points are hard to see.

Link copied to clipboard
val sector: Sector?

Geographic lat/lon envelope of the tileset's root bounding volume. null until the root tileset.json has been fetched, parsed, and rendered at least once. Safe to read from any thread.

Link copied to clipboard
var shadowMode: ShadowMode

Cast + receive shadows by default. ShadowMode.RECEIVE_ONLY for unlit-from-above datasets; ShadowMode.DISABLED to skip the integration.

Link copied to clipboard

When true, REPLACE parents un-render as soon as ANY child loads (transient gaps); when false (default), parent waits for every visible sibling.

Link copied to clipboard
val source: TilesetSource
Link copied to clipboard

Global multiplier on Gaussian-splat projected size.

Link copied to clipboard
var style: TilesetStyle?

3D Tiles 1.0 declarative style; needs an Ogc3dDecoderRegistry.tilesetStyleEvaluator registered to do anything. Setter rebinds eagerly.

Functions

Link copied to clipboard
open override fun getUserProperty(key: Any): Any?
Link copied to clipboard
open override fun hasUserProperty(key: Any): Boolean
Link copied to clipboard
open override fun isWithinActiveAltitudes(rc: RenderContext): Boolean
Link copied to clipboard
open override fun putUserProperty(key: Any, value: Any): Any?
Link copied to clipboard
open override fun removeUserProperty(key: Any): Any?
Link copied to clipboard
open override fun render(rc: RenderContext)
Link copied to clipboard

Reset the permanent-failure latch so the next render retries the root fetch.

Link copied to clipboard
fun retryFailedTile(tile: Tile3d)

Reset a single tile's FAILED state so the next traversal re-fetches it.

Link copied to clipboard
fun shutdown()

Stop fetch coroutines + close the HTTP client.