Luxar Viewer API Documentation - v2026.9.22
    Preparing search index...

    Interface WasmModule

    WASM module interface: projection, effective-radius, and decode kernels.

    This interface defines the contract between TypeScript and the WASM module. Both the compiled WASM and the TypeScript fallback implement this interface.

    interface WasmModule {
        calculate_effective_radii(
            positions: Float32Array,
            radii: Float32Array,
            displayDims: Uint32Array,
            slicePosition: Float32Array,
            spatialExtendDims: Uint8Array,
            ndim: number,
            numPoints: number,
            output: Float32Array,
        ): number;
        sort_splats_by_depth(
            centers3: Float32Array,
            modelView: Float32Array,
            ordering: Uint32Array,
            count: number,
        ): number;
        decode_quantized_u8(
            data: Uint8Array,
            minVal: number,
            maxVal: number,
            output: Float32Array,
        ): void;
        decode_quantized_u16(
            data: Uint16Array,
            minVal: number,
            maxVal: number,
            output: Float32Array,
        ): void;
        decode_log_scalar_u8(
            data: Uint8Array,
            maxLog: number,
            output: Float32Array,
        ): void;
        decode_log_scalar_u16(
            data: Uint16Array,
            maxLog: number,
            output: Float32Array,
        ): void;
        decode_geolog_scalar_u8(
            data: Uint8Array,
            minLog: number,
            maxLog: number,
            output: Float32Array,
        ): void;
        decode_geolog_scalar_u16(
            data: Uint16Array,
            minLog: number,
            maxLog: number,
            output: Float32Array,
        ): void;
        decode_linear_perchannel_u8(
            data: Uint8Array,
            colLo: Float64Array,
            colHi: Float64Array,
            colOffset: number,
            output: Float32Array,
        ): void;
        decode_linear_perchannel_u16(
            data: Uint16Array,
            colLo: Float64Array,
            colHi: Float64Array,
            colOffset: number,
            output: Float32Array,
        ): void;
        decode_log_perchannel_u8(
            data: Uint8Array,
            colLo: Float64Array,
            colHi: Float64Array,
            zeroLevel: boolean,
            colOffset: number,
            output: Float32Array,
        ): void;
        decode_log_perchannel_u16(
            data: Uint16Array,
            colLo: Float64Array,
            colHi: Float64Array,
            zeroLevel: boolean,
            colOffset: number,
            output: Float32Array,
        ): void;
        decode_signed_log_perchannel_u8(
            data: Uint8Array,
            colLo: Float64Array,
            colHi: Float64Array,
            zeroLevel: boolean,
            colOffset: number,
            output: Float32Array,
        ): void;
        decode_signed_log_perchannel_u16(
            data: Uint16Array,
            colLo: Float64Array,
            colHi: Float64Array,
            zeroLevel: boolean,
            colOffset: number,
            output: Float32Array,
        ): void;
        decode_geolog_perchannel_u8(
            data: Uint8Array,
            colLo: Float64Array,
            colHi: Float64Array,
            colOffset: number,
            output: Float32Array,
        ): void;
        decode_geolog_perchannel_u16(
            data: Uint16Array,
            colLo: Float64Array,
            colHi: Float64Array,
            colOffset: number,
            output: Float32Array,
        ): void;
        decode_lut_scalar_u8(
            indices: Uint8Array,
            lut: Float32Array,
            output: Float32Array,
        ): void;
        decode_lut_scalar_u16(
            indices: Uint16Array,
            lut: Float32Array,
            output: Float32Array,
        ): void;
        decode_lut_row_u8(
            indices: Uint8Array,
            lut: Float32Array,
            k: number,
            output: Float32Array,
        ): void;
        decode_lut_row_u16(
            indices: Uint16Array,
            lut: Float32Array,
            k: number,
            output: Float32Array,
        ): void;
        decode_broadcasted(
            value: Float32Array,
            numPoints: number,
            elementsPerPoint: number,
            output: Float32Array,
        ): void;
        extract_3d_positions(
            positionsNd: Float32Array,
            displayDims: Uint32Array,
            ndim: number,
            numPoints: number,
            output: Float32Array,
        ): void;
        mahalanobis_distance(
            diff: Float32Array,
            packedL: Float32Array,
            ndim: number,
        ): number;
        project_gsplats_nd_to_3d(
            positions: Float32Array,
            cholesky: Float32Array,
            amplitudes: Float32Array,
            colors: Float32Array,
            discreteVisibility: Uint8Array,
            slicePosition: Float32Array,
            continuousHiddenDims: Uint32Array,
            displayDims: Uint32Array,
            ndim: number,
            splatCount: number,
            colorComponents: number,
            minAmplitude: number,
            truncate: number,
            outCenters3d: Float32Array,
            outCholesky3d: Float32Array,
            outAmplitudes: Float32Array,
            outColors: Float32Array,
            outSourceIndices: Uint32Array,
        ): number;
        clip_segment_single(
            p1: Float32Array,
            p2: Float32Array,
            slicePosition: Float32Array,
            tolerance: Float32Array,
            displayDims: Uint32Array,
            ndim: number,
        ): Float32Array;
        clip_segments_batch(
            positions: Float32Array,
            segments: Uint32Array,
            slicePosition: Float32Array,
            tolerance: Float32Array,
            displayDims: Uint32Array,
            ndim: number,
            numSegments: number,
            outputVisibility: Uint8Array,
            outputT1: Float32Array,
            outputT2: Float32Array,
        ): number;
        interpolate_clipped_positions(
            positions: Float32Array,
            segments: Uint32Array,
            visibility: Uint8Array,
            t1Params: Float32Array,
            t2Params: Float32Array,
            displayDims: Uint32Array,
            ndim: number,
            numSegments: number,
            outputStart: Float32Array,
            outputEnd: Float32Array,
        ): number;
        interpolate_scalars_batch(
            values: Float32Array,
            segments: Uint32Array,
            visibility: Uint8Array,
            t1Params: Float32Array,
            t2Params: Float32Array,
            numSegments: number,
            outputStart: Float32Array,
            outputEnd: Float32Array,
        ): number;
        interpolate_colors_batch(
            colors: Float32Array,
            segments: Uint32Array,
            visibility: Uint8Array,
            t1Params: Float32Array,
            t2Params: Float32Array,
            numSegments: number,
            outputStart: Float32Array,
            outputEnd: Float32Array,
        ): number;
        calculate_segment_lengths(
            startPositions: Float32Array,
            endPositions: Float32Array,
            visibleCount: number,
            output: Float32Array,
        ): void;
        compute_joint_codes(
            segments: Uint32Array,
            visibility: Uint8Array,
            t1Params: Float32Array,
            t2Params: Float32Array,
            numSegments: number,
            numVertices: number,
            outputStart: Float32Array,
            outputEnd: Float32Array,
        ): number;
        mesh_vertex_visibility_mask(
            positions: Float32Array,
            slicePosition: Float32Array,
            tolerance: Float32Array,
            displayDims: Uint32Array,
            ndim: number,
            numVertices: number,
            output: Uint8Array,
        ): number;
        compact_visible_faces(
            faces: Uint32Array,
            vertexMask: Uint8Array,
            numFaces: number,
            output: Uint32Array,
        ): number;
    }

    Implemented by

    Index
    • Calculate effective radii for nD points when sliced.

      When an nD hypersphere is sliced by a hyperplane, the visible cross-section has a smaller radius. This function computes that effective radius.

      Parameters

      • positions: Float32Array

        Point positions [numPoints * ndim]

      • radii: Float32Array

        Original point radii [numPoints]

      • displayDims: Uint32Array

        Dimensions to display (typically [0,1,2]) [numDisplayDims]

      • slicePosition: Float32Array

        Current slice position [ndim]

      • spatialExtendDims: Uint8Array

        Which dims are spatial (1) vs discrete (0) [ndim]

      • ndim: number

        Total number of dimensions

      • numPoints: number

        Number of points

      • output: Float32Array

        Output effective radii [numPoints]

      Returns number

      Number of points with non-zero effective radius (visible points)

    • Sort splats back-to-front by camera-space depth.

      Produces the permutation consumed by the aSortedIndex instance attribute: ordering[j] is the original splat index drawn at instance slot j (slot 0 = farthest). Degenerate depth ranges (single depth plane, everything behind the camera) yield the identity ordering. Input is always projected 3D centers, so no ndim cap applies.

      Parameters

      • centers3: Float32Array

        Projected 3D splat centers [count * 3]

      • modelView: Float32Array

        Column-major 4x4 model-view matrix [16]

      • ordering: Uint32Array

        Output permutation [count]

      • count: number

        Number of splats

      Returns number

      Number of splats placed via depth keys (0 = identity fallback)

    • Decode quantized uint8 to float32. Maps [0,255] -> [minVal,maxVal]

      Parameters

      • data: Uint8Array
      • minVal: number
      • maxVal: number
      • output: Float32Array

      Returns void

    • Decode quantized uint16 to float32. Maps [0,65535] -> [minVal,maxVal]

      Parameters

      • data: Uint16Array
      • minVal: number
      • maxVal: number
      • output: Float32Array

      Returns void

    • Decode log-space quantized uint8. Result = expm1(normalized * maxLog)

      Parameters

      • data: Uint8Array
      • maxLog: number
      • output: Float32Array

      Returns void

    • Decode log-space quantized uint16. Result = expm1(normalized * maxLog)

      Parameters

      • data: Uint16Array
      • maxLog: number
      • output: Float32Array

      Returns void

    • Decode geometric-log uint8 (reserved zero level; min/max-anchored).

      Parameters

      • data: Uint8Array
      • minLog: number
      • maxLog: number
      • output: Float32Array

      Returns void

    • Decode geometric-log uint16 (reserved zero level; min/max-anchored).

      Parameters

      • data: Uint16Array
      • minLog: number
      • maxLog: number
      • output: Float32Array

      Returns void

    • Decode per-channel LINEAR (fixed-point) uint8 codes to float32. Per-column [lo, hi] scales (f64, straight from the JSON attrs); colOffset is the column phase of the first element.

      Parameters

      • data: Uint8Array
      • colLo: Float64Array
      • colHi: Float64Array
      • colOffset: number
      • output: Float32Array

      Returns void

    • Decode per-channel LINEAR (fixed-point) uint16 codes to float32.

      Parameters

      • data: Uint16Array
      • colLo: Float64Array
      • colHi: Float64Array
      • colOffset: number
      • output: Float32Array

      Returns void

    • Decode per-channel LOG uint8 codes to float32 (x = expm1(y)). zeroLevel: true = reserved zero code 0 + codes 1..255 over the nonzero-anchored scale; false = legacy all-levels mapping.

      Parameters

      • data: Uint8Array
      • colLo: Float64Array
      • colHi: Float64Array
      • zeroLevel: boolean
      • colOffset: number
      • output: Float32Array

      Returns void

    • Decode per-channel LOG uint16 codes to float32.

      Parameters

      • data: Uint16Array
      • colLo: Float64Array
      • colHi: Float64Array
      • zeroLevel: boolean
      • colOffset: number
      • output: Float32Array

      Returns void

    • Decode per-channel SIGNED-LOG uint8 codes (x = sign(y)·expm1(|y|)).

      Parameters

      • data: Uint8Array
      • colLo: Float64Array
      • colHi: Float64Array
      • zeroLevel: boolean
      • colOffset: number
      • output: Float32Array

      Returns void

    • Decode per-channel SIGNED-LOG uint16 codes to float32.

      Parameters

      • data: Uint16Array
      • colLo: Float64Array
      • colHi: Float64Array
      • zeroLevel: boolean
      • colOffset: number
      • output: Float32Array

      Returns void

    • Decode per-channel TRUE-log uint8 codes (x = exp(y); HDR colors). Reserved zero level always on (name contract — no flag).

      Parameters

      • data: Uint8Array
      • colLo: Float64Array
      • colHi: Float64Array
      • colOffset: number
      • output: Float32Array

      Returns void

    • Decode per-channel TRUE-log uint16 codes to float32.

      Parameters

      • data: Uint16Array
      • colLo: Float64Array
      • colHi: Float64Array
      • colOffset: number
      • output: Float32Array

      Returns void

    • Decode LUT indices (uint8) to scalar float values

      Parameters

      • indices: Uint8Array
      • lut: Float32Array
      • output: Float32Array

      Returns void

    • Decode LUT indices (uint16) to scalar float values

      Parameters

      • indices: Uint16Array
      • lut: Float32Array
      • output: Float32Array

      Returns void

    • Decode LUT indices (uint8) to k-element vectors

      Parameters

      • indices: Uint8Array
      • lut: Float32Array
      • k: number
      • output: Float32Array

      Returns void

    • Decode LUT indices (uint16) to k-element vectors

      Parameters

      • indices: Uint16Array
      • lut: Float32Array
      • k: number
      • output: Float32Array

      Returns void

    • Broadcast a value to all points

      Parameters

      • value: Float32Array
      • numPoints: number
      • elementsPerPoint: number
      • output: Float32Array

      Returns void

    • Extract 3D positions from nD positions using display dimension indices.

      Parameters

      • positionsNd: Float32Array

        Input nD positions [numPoints * ndim]

      • displayDims: Uint32Array

        Which dimensions to display as X,Y,Z [3 or fewer]

      • ndim: number

        Total number of dimensions

      • numPoints: number

        Number of points

      • output: Float32Array

        Output 3D positions [numPoints * 3]

      Returns void

    • Compute Mahalanobis distance for a single point using packed Cholesky factor.

      Given L (lower-triangular Cholesky of covariance), Mahalanobis distance = ||L⁻¹ · (x - μ)||

      Parameters

      • diff: Float32Array

        Difference vector (x - μ) [ndim]

      • packedL: Float32Array

        Packed Cholesky factor [packedSize]

      • ndim: number

        Dimensionality

      Returns number

      Mahalanobis distance

    • Fused nD→3D GSplat projection in a single pass: discrete-visibility gate → continuous attenuation (marginal Cholesky + shifted Gaussian) → visibility (amplitude * attenuation >= minAmplitude) → COMPACTED outputs. Replaces the former 6-call pipeline (compute_gsplats_attenuation + extract_3d_positions + compact_by_mask ×2 + extract_visible_cholesky_3d + compact_attenuated_amplitudes), eliminating ~5 passes and the repeated large-array boundary copies. Bit-identical visible set + values.

      Colors must be pre-normalized to f32 (white-filled when absent) — the kernel takes a single Float32Array because wasm-bindgen can't accept a typed-array union. Outputs are sized for the splatCount worst case; slice each to the returned visible count.

      Parameters

      • positions: Float32Array

        Splat centers [splatCount * ndim]

      • cholesky: Float32Array

        Packed Cholesky factors [splatCount * packedSize]

      • amplitudes: Float32Array

        Splat amplitudes [splatCount]

      • colors: Float32Array

        Pre-normalized RGB or RGBA [splatCount * colorComponents]

      • discreteVisibility: Uint8Array

        Precomputed discrete-dim gate [splatCount]

      • slicePosition: Float32Array

        Current slice [ndim]

      • continuousHiddenDims: Uint32Array

        Sorted continuous hidden dims [numContinuous]

      • displayDims: Uint32Array

        Display dims in requested order [2 or 3]

      • ndim: number

        Total dimensionality

      • splatCount: number

        Number of splats

      • colorComponents: number

        Color channel count (3 = RGB, 4 = RGBA); strides every color read/write

      • minAmplitude: number

        Visibility threshold

      • truncate: number

        Truncation radius in sigmas

      • outCenters3d: Float32Array

        Output visible centers [splatCount * 3] worst-case

      • outCholesky3d: Float32Array

        Output visible 3D Cholesky [splatCount * 6] worst-case

      • outAmplitudes: Float32Array

        Output visible attenuated amplitudes [splatCount] worst-case

      • outColors: Float32Array

        Output visible colors [splatCount * colorComponents] worst-case

      • outSourceIndices: Uint32Array

        Output SOURCE index per emitted splat [splatCount] worst-case. Compaction destroys the slot → source mapping, which picking needs to reach an on-disk element index (issue #1423). Pass an EMPTY array to opt out — the recording is then skipped entirely.

      Returns number

      Number of visible splats written

    • Clip a single segment to the nD slice and return interpolation parameters.

      Parameters

      • p1: Float32Array

        Start vertex position [ndim]

      • p2: Float32Array

        End vertex position [ndim]

      • slicePosition: Float32Array

        Current slice position [ndim]

      • tolerance: Float32Array

        Per-dimension tolerance [ndim]

      • displayDims: Uint32Array

        Which dimensions to display [numDisplayDims]

      • ndim: number

        Number of dimensions

      Returns Float32Array

      Float32Array [visible, t1, t2] where visible is 1.0 or 0.0

    • Batch clip all segments and output visibility mask and interpolation parameters.

      Parameters

      • positions: Float32Array

        Vertex positions [numVertices * ndim]

      • segments: Uint32Array

        Segment indices [numSegments * 2]

      • slicePosition: Float32Array

        Current slice position [ndim]

      • tolerance: Float32Array

        Per-dimension tolerance [ndim]

      • displayDims: Uint32Array

        Which dimensions to display [numDisplayDims]

      • ndim: number

        Number of dimensions

      • numSegments: number

        Number of segments

      • outputVisibility: Uint8Array

        Output visibility mask [numSegments]

      • outputT1: Float32Array

        Output t1 parameters [numSegments]

      • outputT2: Float32Array

        Output t2 parameters [numSegments]

      Returns number

      Number of visible segments

    • Interpolate clipped positions to 3D display space.

      Parameters

      • positions: Float32Array

        Vertex positions [numVertices * ndim]

      • segments: Uint32Array

        Segment indices [numSegments * 2]

      • visibility: Uint8Array

        Visibility mask [numSegments]

      • t1Params: Float32Array

        Start interpolation parameters [numSegments]

      • t2Params: Float32Array

        End interpolation parameters [numSegments]

      • displayDims: Uint32Array

        Which dimensions to display [3]

      • ndim: number

        Number of dimensions

      • numSegments: number

        Total number of segments

      • outputStart: Float32Array

        Output start positions [visibleCount * 3]

      • outputEnd: Float32Array

        Output end positions [visibleCount * 3]

      Returns number

      Number of visible segments written

    • Batch interpolate scalar attributes for visible segments.

      Parameters

      • values: Float32Array

        Per-vertex attribute values [numVertices]

      • segments: Uint32Array

        Segment indices [numSegments * 2]

      • visibility: Uint8Array

        Visibility mask [numSegments]

      • t1Params: Float32Array

        Start interpolation parameters [numSegments]

      • t2Params: Float32Array

        End interpolation parameters [numSegments]

      • numSegments: number

        Total number of segments

      • outputStart: Float32Array

        Output interpolated start values [visibleCount]

      • outputEnd: Float32Array

        Output interpolated end values [visibleCount]

      Returns number

      Number of visible segments written

    • Batch interpolate RGB color attributes for visible segments.

      Parameters

      • colors: Float32Array

        Per-vertex RGB colors [numVertices * 3]

      • segments: Uint32Array

        Segment indices [numSegments * 2]

      • visibility: Uint8Array

        Visibility mask [numSegments]

      • t1Params: Float32Array

        Start interpolation parameters [numSegments]

      • t2Params: Float32Array

        End interpolation parameters [numSegments]

      • numSegments: number

        Total number of segments

      • outputStart: Float32Array

        Output interpolated start colors [visibleCount * 3]

      • outputEnd: Float32Array

        Output interpolated end colors [visibleCount * 3]

      Returns number

      Number of visible segments written

    • Calculate 3D segment lengths for visible segments.

      Parameters

      • startPositions: Float32Array

        Clipped start positions [visibleCount * 3]

      • endPositions: Float32Array

        Clipped end positions [visibleCount * 3]

      • visibleCount: number

        Number of visible segments

      • output: Float32Array

        Output segment lengths [visibleCount]

      Returns void

    • Per-endpoint joint code: how the line shader should treat this endpoint, and — at an ordinary two-segment joint — which segment it joins.

      0 free polyline end (keep the soft cap); -1 slice-clipped (suppress the cap; no neighbour will arrive); -2 degree->=3 hub (keep the cap); +(slot + 1) joins visible segment slot at that segment's START; -(slot + 3) joins it at that segment's END. slot is a line-texture storage slot, so it survives the depth-sort worker's draw-order permutation. Purely topological — no positions, no angle: the vertex stage measures the bend in SCREEN space so it tracks the camera. See wasm/rust/src/lines_clipping.rs for the full derivation.

      Parameters

      • segments: Uint32Array

        Vertex index pairs [numSegments * 2]

      • visibility: Uint8Array

        Visibility mask [numSegments]

      • t1Params: Float32Array

        Start interpolation parameters [numSegments]

      • t2Params: Float32Array

        End interpolation parameters [numSegments]

      • numSegments: number

        Total number of segments

      • numVertices: number

        Total number of source vertices

      • outputStart: Float32Array

        Output start joint codes [visibleCount]

      • outputEnd: Float32Array

        Output end joint codes [visibleCount]

      Returns number

      Number of visible segments written

    • Compute per-vertex nD slab membership for a mesh.

      For each non-displayed ("hidden") dimension d, with sliceMin = slicePosition[d] - tolerance[d] and sliceMax = slicePosition[d] + tolerance[d], a vertex is in iff v[d] >= sliceMin && v[d] <= sliceMax for every such d. This is the p1_in branch of WasmModule.clip_segment_single applied per vertex.

      A NaN or ±Inf coordinate on any hidden dimension makes the vertex invisible (the #806 rule, shared with the lines backends).

      Unlike lines, nothing is clipped or interpolated — see WasmModule.compact_visible_faces for the whole-triangle rule and docs/specs/MESH_NODE_SPEC.md §5 for why v1 does not clip.

      The WASM implementation calls validate_ndim and therefore panics above 16 dimensions; pickBackend(ctx, ndim) routes ndim > 16 to the uncapped TypeScript backend.

      Parameters

      • positions: Float32Array

        Vertex positions [numVertices * ndim]

      • slicePosition: Float32Array

        Current slice position [ndim]

      • tolerance: Float32Array

        Per-dimension tolerance [ndim]

      • displayDims: Uint32Array

        Which dimensions are displayed [numDisplayDims]

      • ndim: number

        Number of dimensions

      • numVertices: number

        Number of vertices

      • output: Uint8Array

        Output visibility mask [numVertices] (1 = in, 0 = out)

      Returns number

      Number of visible vertices

    • Compact faces to those whose three vertices are all visible.

      Writes ORIGINAL (un-remapped) vertex indices, so a slice change rebuilds only the index buffer while the vertex attribute buffers stay uploaded in full. The authored per-face index order is preserved, so this is winding-agnostic.

      A face index >= vertexMask.length drops the whole face rather than reading out of bounds — the indices are store-supplied, and the two backends fail differently without the guard (a Rust out-of-bounds read traps with an uncatchable RuntimeError: unreachable; the TS read yields undefined).

      Parameters

      • faces: Uint32Array

        Triangle vertex indices [numFaces * 3]

      • vertexMask: Uint8Array

        Per-vertex visibility from WasmModule.mesh_vertex_visibility_mask; its LENGTH defines the valid vertex range, so pass a view sized exactly numVertices

      • numFaces: number

        Number of triangles

      • output: Uint32Array

        Output indices [numFaces * 3] worst case

      Returns number

      Number of visible faces written (slice output to 3x this)