import type { Matrix4, Quaternion, Vector3 } from '@math.gl/core';
import type { TypedArray, MeshAttribute, TextureLevel } from '@loaders.gl/schema';
import { TILESET_TYPE, TILE_REFINEMENT, TILE_TYPE, Tile3D, Tileset3D } from '@loaders.gl/tiles';
import I3SNodePagesTiles from "./lib/helpers/i3s-nodepages-tiles.js";
import { LoaderWithParser } from '@loaders.gl/loader-utils';
export type COLOR = [number, number, number, number];
/**
 * Extension of SceneLayer3D JSON with postprocessed loader data
 */
export interface I3STilesetHeader extends SceneLayer3D {
    /** Not in spec, but is necessary for woking */
    url?: string;
    /** Base path that non-absolute paths in tileset are relative to. */
    basePath?: string;
    /** root node metadata */
    root: I3STileHeader;
    /** instance of the NodePages to tiles loader */
    nodePagesTile?: I3SNodePagesTiles;
    /** Type of the tileset */
    type: TILESET_TYPE.I3S;
    /** LOD metric type per I3S spec*/
    lodMetricType?: string;
    /** LOD metric value */
    lodMetricValue?: number;
    /** Loader that has to be used to load content */
    loader: LoaderWithParser;
}
/** https://github.com/Esri/i3s-spec/blob/master/docs/1.8/nodePage.cmn.md */
export type NodePage = {
    /** Array of nodes. */
    nodes: NodeInPage[];
};
/**
 * Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/mesh.cmn.md
 */
type NodeMesh = {
    /**
     * The material definition.
     */
    material: MeshMaterial;
    /** The geometry definition. */
    geometry: MeshGeometry;
    /** The attribute set definition. */
    attribute: meshAttribute;
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/meshMaterial.cmn.md */
export type MeshMaterial = {
    /** The index in layer.materialDefinitions array. */
    definition: number;
    /** Resource id for the material textures. i.e: layers/0/nodes/{material.resource}/textures/{tex_name}. Is required if material declares any textures. */
    resource?: number;
    /** Estimated number of texel for the highest resolution base color texture. */
    texelCountHint?: number;
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/meshGeometry.cmn.md */
export type MeshGeometry = {
    /** The index in layer.geometryDefinitions array */
    definition: number;
    /** The resource locator to be used to query geometry resources: layers/0/nodes/{this.resource}/geometries/{layer.geometryDefinitions[this.definition].geometryBuffers[0 or 1]}. */
    resource: number;
    /** Number of vertices in the geometry buffer of this mesh for the umcompressed mesh buffer. Please note that Draco compressed meshes may have less vertices due to de-duplication (actual number of vertices is part of the Draco binary blob). Default=0 */
    vertexCount?: number;
    /** Number of features for this mesh. Default=0. (Must omit or set to 0 if mesh doesn't use features.) */
    featureCount?: number;
};
/** https://github.com/Esri/i3s-spec/blob/master/docs/1.8/meshAttribute.cmn.md */
type meshAttribute = {
    /** The resource identifier to be used to locate attribute resources of this mesh. i.e. layers/0/nodes/<resource id>/attributes/... */
    resource: number;
};
/**
 * Texture format
 * @see https://github.com/Esri/i3s-spec/blob/master/docs/1.7/textureSetDefinitionFormat.cmn.md
 */
export type I3STextureFormat = 'jpg' | 'png' | 'ktx-etc2' | 'dds' | 'ktx2';
/** Postprocessed I3S Node */
export type I3STileHeader = I3SMinimalNodeData & {
    /** MBS per I3S spec */
    mbs: Mbs;
    /** Material definition from the layer metadata per I3S spec */
    materialDefinition?: I3SMaterialDefinition;
    /** Bounding volume converted to 3DTiles format. It is generic for `tile` module */
    boundingVolume: {
        box?: number[];
        sphere?: number[];
    };
    /** LOD metric selected for usage */
    lodMetricType?: string;
    /** LOD metric value */
    lodMetricValue?: number;
    /** Tile content type */
    type: TILE_TYPE.MESH;
    /** Tile refinement type. I3S supports only `REPLACE` */
    refine: TILE_REFINEMENT.REPLACE;
};
/**
 * Minimal I3S node data is needed for loading
 * These data can come from 3DNodeIndexDocument (I3S spec) or from `I3SNodePagesTiles` instance
 * @see https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md
 */
export type I3SMinimalNodeData = {
    /** Node ID */
    id: string;
    /** Node base path */
    url?: string;
    /** LOD selection metrics  */
    lodSelection?: LodSelection[];
    obb?: Obb;
    /** MBS per I3S spec */
    mbs?: Mbs;
    /** Geometry content URL */
    contentUrl?: string;
    /** Texture image URL */
    textureUrl?: string;
    /** Feature attributes URLs */
    attributeUrls?: string[];
    /** Material definition from I3S layer metadata */
    materialDefinition?: I3SMaterialDefinition;
    /** Texture format per I3S spec */
    textureFormat: I3STextureFormat;
    /** Loader options for texture loader. The loader might be `CompressedTextureLoader` for `dds`, BasisLoader for `ktx2` or ImageLoader for `jpg`and `png` */
    textureLoaderOptions?: {
        [key: string]: any;
    };
    /** Child Nodes references  */
    children: NodeReference[];
    /** Is the node has Draco compressed geometry */
    isDracoGeometry: boolean;
};
export type I3SParseOptions = {
    /** ArcGIS access token */
    token?: string;
    /** Is 3DSceneLayer json expected in response */
    isTileset?: string;
    /** Is 3DNodeIndexDocument json expected in response */
    isTileHeader?: string;
    /** Tile3D instance. This property used only to load tile content */
    /** Tile-specific options */
    _tileOptions?: I3STileOptions;
    /** Tileset-specific options */
    _tilesetOptions?: I3STilesetOptions;
    /** Load Draco Compressed geometry if available */
    useDracoGeometry?: boolean;
    /** Load compressed textures if available */
    useCompressedTextures?: boolean;
    /** Set false if don't need to parse textures */
    decodeTextures?: boolean;
    /** deck.gl compatible coordinate system.
     * https://github.com/visgl/deck.gl/blob/master/docs/developer-guide/coordinate-systems.md
     * Supported coordinate systems: METER_OFFSETS, LNGLAT_OFFSETS
     */
    coordinateSystem?: number;
    /** Options to colorize 3DObjects by attribute value */
    colorsByAttribute?: {
        /** Feature attribute name */
        attributeName: string;
        /** Minimum attribute value */
        minValue: number;
        /** Maximum attribute value */
        maxValue: number;
        /** Minimum color. 3DObject will be colorized with gradient from `minColor to `maxColor` */
        minColor: COLOR;
        /** Maximum color. 3DObject will be colorized with gradient from `minColor to `maxColor` */
        maxColor: COLOR;
        /** Colorization mode. `replace` - replace vertex colors with a new colors, `multiply` - multiply vertex colors with new colors */
        mode: 'multiply' | 'replace';
    };
    /** @deprecated */
    tile?: Tile3D | I3STileOptions;
    /** Tileset3D instance. This property used only to load tile content */
    /** @deprecated */
    tileset?: Tileset3D | I3STilesetOptions;
};
export type I3STileOptions = {
    isDracoGeometry: boolean;
    textureUrl?: string;
    textureFormat?: I3STextureFormat;
    textureLoaderOptions?: any;
    materialDefinition?: I3SMaterialDefinition;
    attributeUrls: string[];
    mbs: Mbs;
};
export type I3STilesetOptions = {
    store: Store;
    attributeStorageInfo: AttributeStorageInfo[];
    fields: Field[];
};
export type I3STileContent = {
    attributes: I3SMeshAttributes;
    indices: TypedArray | null;
    featureIds: number[] | TypedArray;
    vertexCount: number;
    modelMatrix: Matrix4;
    coordinateSystem: number;
    byteLength: number;
    texture: TileContentTexture;
    [key: string]: any;
};
export type TileContentTexture = ArrayBuffer | {
    compressed: boolean;
    mipmaps: boolean;
    width: number;
    height: number;
    data: TextureLevel[];
} | null;
export type BoundingVolumes = {
    mbs: Mbs;
    obb: Obb;
};
/**
 * Oriented bounding box per I3S spec
 * @see https://github.com/Esri/i3s-spec/blob/master/docs/1.7/obb.cmn.md
 */
export type Obb = {
    center: number[] | Vector3;
    halfSize: number[] | Vector3;
    quaternion: number[] | Quaternion;
};
/**
 * Minimum bounding sphere per I3S spec
 * @see https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md#properties
 */
export type Mbs = [number, number, number, number];
/** SceneLayer3D based on I3S specification - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/3DSceneLayer.cmn.md */
export type SceneLayer3D = {
    /** Unique numeric ID of the layer. */
    id: number;
    /** The relative URL to the 3DSceneLayerResource. Only present as part of the SceneServiceInfo resource. */
    href?: string;
    /** The user-visible layer type */
    layerType: '3DObject' | 'IntegratedMesh';
    /** The spatialReference of the layer including the vertical coordinate reference system (CRS). Well Known Text (WKT) for CRS is included to support custom CRS. */
    spatialReference?: SpatialReference;
    /** Enables consuming clients to quickly determine whether this layer is compatible (with respect to its horizontal and vertical coordinate system) with existing content. */
    heightModelInfo?: HeightModelInfo;
    /** The ID of the last update session in which any resource belonging to this layer has been updated. */
    version: string;
    /** The name of this layer. */
    name?: string;
    /** The time of the last update. */
    serviceUpdateTimeStamp?: {
        lastUpdate: number;
    };
    /** The display alias to be used for this layer. */
    alias?: string;
    /** Description string for this layer. */
    description?: string;
    /** Copyright and usage information for the data in this layer. */
    copyrightText?: string;
    /** Capabilities supported by this layer. */
    capabilities: string[];
    /** ZFactor to define conversion factor for elevation unit. */
    ZFactor?: number;
    /** Indicates if any styling information represented as drawingInfo is captured as part of the binary mesh representation. */
    cachedDrawingInfo?: CachedDrawingInfo;
    /** An object containing drawing information. */
    drawingInfo?: DrawingInfo;
    /** An object containing elevation drawing information. If absent, any content of the scene layer is drawn at its z coordinate. */
    elevationInfo?: ElevationInfo;
    /** PopupInfo of the scene layer. */
    popupInfo?: PopupInfo;
    /** Indicates if client application will show the popup information. Default is FALSE. */
    disablePopup: boolean;
    /**
     * The store object describes the exact physical storage of a layer and
     * enables the client to detect when multiple layers are served from
     * the same store.
     */
    store: Store;
    /** A collection of objects that describe each attribute field regarding its field name, datatype, and a user friendly name {name,type,alias}. */
    fields?: Field[];
    /** Provides the schema and layout used for storing attribute content in binary format in I3S. */
    attributeStorageInfo?: AttributeStorageInfo[];
    /** Contains the statistical information for a layer. */
    statisticsInfo?: StatisticsInfo[];
    /** The paged-access index description. */
    nodePages?: NodePageDefinition;
    /** List of materials classes used in this layer. */
    materialDefinitions?: I3SMaterialDefinition[];
    /** Defines the set of textures that can be referenced by meshes. */
    textureSetDefinitions?: TextureSetDefinition[];
    /** Define the layouts of mesh geometry and its attributes */
    geometryDefinitions?: GeometryDefinition[];
    /** 3D extent. */
    fullExtent?: FullExtent;
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/cachedDrawingInfo.cmn.md */
export type CachedDrawingInfo = {
    /** If true, the drawingInfo is captured as part of the binary scene layer representation. */
    color: boolean;
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/drawingInfo.cmn.md */
export type DrawingInfo = {
    /** An object defining the symbology for the layer. See more information about supported renderer types in ArcGIS clients. */
    renderer: any;
    /** Scale symbols for the layer. */
    scaleSymbols: boolean;
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/elevationInfo.cmn.md */
export type ElevationInfo = {
    mode: 'relativeToGround' | 'absoluteHeight' | 'onTheGround' | 'relativeToScene';
    /** Offset is always added to the result of the above logic except for onTheGround where offset is ignored. */
    offset: number;
    /** A string value indicating the unit for the values in elevationInfo */
    unit: string;
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/statisticsInfo.cmn.md */
export type StatisticsInfo = {
    /** Key indicating the resource of the statistics. */
    key: string;
    /** Name of the field of the statistical information. */
    name: string;
    /** The URL to the statistics information. */
    href: string;
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/nodePageDefinition.cmn.md */
export type NodePageDefinition = {
    /** Number of nodes per page for this layer. Must be a power-of-two less than 4096 */
    nodesPerPage: number;
    /** Index of the root node. Default = 0. */
    rootIndex?: number;
    /** Defines the meaning of nodes[].lodThreshold for this layer. */
    lodSelectionMetricType: 'maxScreenThresholdSQ';
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/materialDefinitions.cmn.md */
export type I3SMaterialDefinition = {
    /** A set of parameter values that are used to define the metallic-roughness material model from Physically-Based Rendering (PBR) methodology. When not specified, all the default values of pbrMetallicRoughness apply. */
    pbrMetallicRoughness: I3SPbrMetallicRoughness;
    /** The normal texture map. */
    normalTexture?: I3SMaterialTexture;
    /** The occlusion texture map. */
    occlusionTexture?: I3SMaterialTexture;
    /** The emissive texture map. */
    emissiveTexture?: I3SMaterialTexture;
    /** The emissive color of the material. */
    emissiveFactor?: [number, number, number];
    /** Defines the meaning of the alpha-channel/alpha-mask. */
    alphaMode: 'opaque' | 'mask' | 'blend';
    /** The alpha cutoff value of the material. */
    alphaCutoff?: number;
    /** Specifies whether the material is double sided. */
    doubleSided?: boolean;
    /** Winding order is counterclockwise. */
    cullFace?: 'none' | 'front' | 'back';
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/pbrMetallicRoughness.cmn.md */
export type I3SPbrMetallicRoughness = {
    /** The material's base color factor. default=[1,1,1,1] */
    baseColorFactor?: [number, number, number, number];
    /** The base color texture. */
    baseColorTexture?: I3SMaterialTexture;
    /** the metalness of the material. default=1.0 */
    metallicFactor: number;
    /** the roughness of the material. default=1.0 */
    roughnessFactor: number;
    /** the metallic-roughness texture. */
    metallicRoughnessTexture?: I3SMaterialTexture;
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/materialTexture.cmn.md */
export type I3SMaterialTexture = {
    /** The index in layer.textureSetDefinitions. */
    textureSetDefinitionId: number;
    /** The set index of texture's TEXCOORD attribute used for texture coordinate mapping. Default is 0. Deprecated. */
    texCoord?: number;
    /** The normal texture: scalar multiplier applied to each normal vector of the normal texture. For occlusion texture,scalar multiplier controlling the amount of occlusion applied. Default=1 */
    factor?: number;
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/attributeStorageInfo.cmn.md */
export type AttributeStorageInfo = {
    key: string;
    name: string;
    header: {
        property: string;
        valueType: string;
    }[];
    ordering?: string[];
    attributeValues?: AttributeValue;
    attributeByteCounts?: AttributeValue;
    objectIds?: AttributeValue;
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/field.cmn.md */
export type Field = {
    name: string;
    type: ESRIField;
    alias?: string;
    domain?: Domain;
};
export type ESRIField = 'esriFieldTypeDate' | 'esriFieldTypeSingle' | 'esriFieldTypeDouble' | 'esriFieldTypeGUID' | 'esriFieldTypeGlobalID' | 'esriFieldTypeInteger' | 'esriFieldTypeOID' | 'esriFieldTypeSmallInteger' | 'esriFieldTypeString';
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/popupInfo.cmn.md */
export type PopupInfo = {
    title?: string;
    description?: string;
    expressionInfos?: any[];
    fieldInfos?: FieldInfo[];
    mediaInfos?: any[];
    popupElements?: {
        text?: string;
        type?: string;
        fieldInfos?: FieldInfo[];
    }[];
};
/**
 * Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md
 */
export type Node3DIndexDocument = {
    id: string;
    version?: string;
    level?: number;
    mbs?: Mbs;
    obb?: Obb;
    lodSelection?: LodSelection[];
    children?: NodeReference[];
    neighbors?: NodeReference[];
    parentNode?: NodeReference;
    sharedResource?: Resource;
    featureData?: Resource[];
    geometryData?: Resource[];
    textureData?: Resource[];
    attributeData?: Resource[];
    created?: string;
    expires?: string;
};
/**
 * LOD selection metrics per I3S spec
 * @see https://github.com/Esri/i3s-spec/blob/master/docs/1.7/lodSelection.cmn.md
 */
export type LodSelection = {
    /**  */
    metricType?: string;
    maxError: number;
};
/**
 * Node reference per I3S spec
 * @see https://github.com/Esri/i3s-spec/blob/master/docs/1.7/nodeReference.cmn.md
 */
export type NodeReference = {
    /** Tree Key ID of the referenced node represented as string. */
    id: string;
    /** Version (store update session ID) of the referenced node. */
    version?: string;
    /** An array of four doubles, corresponding to x, y, z and radius of the minimum bounding sphere of a node. */
    mbs?: Mbs;
    /** Describes oriented bounding box. */
    obb?: Obb;
    /** Number of values per element. */
    href?: string;
    /** Number of features in the referenced node and its descendants, down to the leaf nodes. */
    featureCount?: number;
};
export type Resource = {
    href: string;
    layerContent?: string[];
    featureRange?: number[];
    multiTextureBundle?: string;
    vertexElements?: number[];
    faceElements?: number[];
    nodePath?: string;
};
export type MaxScreenThresholdSQ = {
    maxError: number;
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/node.cmn.md */
export type NodeInPage = {
    /**
     * The index in the node array. May be different than material, geometry and attribute resource id. See mesh for more information.
     */
    index: number;
    /**
     * The index of the parent node in the node array.
     */
    parentIndex?: number;
    /**
     * When to switch LoD. See https://github.com/Esri/i3s-spec/blob/master/docs/1.8/nodePageDefinition.cmn.md for more information.
     */
    lodThreshold?: number;
    /**
     * Oriented bounding box for this node.
     */
    obb: Obb;
    /**
     * index of the children nodes indices.
     */
    children?: number[];
    /**
     * The mesh for this node. WARNING: only SINGLE mesh is supported at version 1.7 (i.e. length must be 0 or 1).
     */
    mesh?: NodeMesh;
};
/**
 * https://github.com/Esri/i3s-spec/blob/master/docs/1.8/materialDefinitionInfo.cmn.md
 */
export type MaterialDefinitionInfo = {
    /** A name for the material as assigned in the creating application. */
    name?: string;
    /** Indicates the material type, chosen from the supported values. */
    type?: 'standard' | 'water' | 'billboard' | 'leafcard' | 'reference';
    /** The href that resolves to the shared resource bundle in which the material definition is contained. */
    $ref?: string;
    /** Parameter defined for the material.
     * https://github.com/Esri/i3s-spec/blob/master/docs/1.8/materialParams.cmn.md
     */
    params: {
        /** Indicates transparency of this material; 0 = opaque, 1 = fully transparent. */
        transparency?: number;
        /** Indicates reflectivity of this material. */
        reflectivity?: number;
        /** Indicates shininess of this material. */
        shininess?: number;
        /** Ambient color of this material. Ambient color is the color of an object where it is in shadow.
         * This color is what the object reflects when illuminated by ambient light rather than direct light. */
        ambient?: number[];
        /** Diffuse color of this material. Diffuse color is the most instinctive meaning of the color of an object.
         * It is that essential color that the object reveals under pure white light. It is perceived as the color
         * of the object itself rather than a reflection of the light. */
        diffuse?: number[];
        /** Specular color of this material. Specular color is the color of the light of a specular reflection
         * (specular reflection is the type of reflection that is characteristic of light reflected from a shiny
         * surface). */
        specular?: number[];
        /** Rendering mode. */
        renderMode: 'textured' | 'solid' | 'untextured' | 'wireframe';
        /** TRUE if features with this material should cast shadows. */
        castShadows?: boolean;
        /** TRUE if features with this material should receive shadows */
        receiveShadows?: boolean;
        /** Indicates the material culling options {back, front, none}. */
        cullFace?: string;
        /** This flag indicates that the vertex color attribute of the geometry should be used to color the geometry
         * for rendering. If texture is present, the vertex colors are multiplied by this color.
         * e.g. pixel_color = [interpolated]vertex_color * texel_color. Default is false. */
        vertexColors?: boolean;
        /** This flag indicates that the geometry has uv region vertex attributes. These are used for adressing
         * subtextures in a texture atlas. The uv coordinates are relative to this subtexture in this case.
         * This is mostly useful for repeated textures in a texture atlas. Default is false. */
        vertexRegions?: boolean;
        /** Indicates whether Vertex Colors also contain a transparency channel. Default is false. */
        useVertexColorAlpha?: boolean;
    };
};
/** https://github.com/Esri/i3s-spec/blob/master/docs/1.8/sharedResource.cmn.md */
export type SharedResources = {
    /** Materials describe how a Feature or a set of Features is to be rendered. */
    materialDefinitions?: {
        [key: string]: MaterialDefinitionInfo;
    };
    /** A Texture is a set of images, with some parameters specific to the texture/uv mapping to geometries. */
    textureDefinitions?: {
        [key: string]: TextureDefinitionInfo;
    };
};
/** https://github.com/Esri/i3s-spec/blob/master/docs/1.8/image.cmn.md */
type TextureImage = {
    /** A unique ID for each image. Generated using the BuildID function. */
    id: string;
    /** width of this image, in pixels. */
    size?: number;
    /** The maximum size of a single pixel in world units.
     * This property is used by the client to pick the image to load and render. */
    pixelInWorldUnits?: number;
    /** The href to the image(s), one per encoding, in the same order as the encodings. */
    href?: string[];
    /** The byte offset of this image's encodings. There is one per encoding,
     * in the same order as the encodings, in the block in which this texture image resides. */
    byteOffset?: string[];
    /** The length in bytes of this image's encodings. There is one per encoding,
     * in the same order as the encodings. */
    length?: number[];
};
export type Attribute = 'OBJECTID' | 'string' | 'double' | 'Int32' | string;
export type Extent = [number, number, number, number];
export type FeatureAttribute = {
    id: AttributeValue;
    faceRange: AttributeValue;
};
export type BuildingSceneLayerTileset = {
    header: BuildingSceneLayer;
    sublayers: BuildingSceneSublayer[];
};
export type BuildingSceneLayer = {
    id: number;
    name: string;
    version: string;
    alias?: string;
    layerType: 'Building';
    description?: string;
    copyrightText?: string;
    fullExtent: FullExtent;
    spatialReference: SpatialReference;
    heightModelInfo?: HeightModelInfo;
    sublayers: BuildingSceneSublayer[];
    filters?: Filter[];
    activeFilterID?: string;
    statisticsHRef?: string;
};
export type BuildingSceneSublayer = {
    id: number;
    name: string;
    alias?: string;
    discipline?: 'Mechanical' | 'Architectural' | 'Piping' | 'Electrical' | 'Structural';
    modelName?: string;
    layerType: 'group' | '3DObject' | 'Point';
    visibility?: boolean;
    sublayers?: BuildingSceneSublayer[];
    isEmpty?: boolean;
    url?: string;
};
type Filter = {
    id: string;
    name: string;
    description: string;
    isDefaultFilter?: boolean;
    isVisible?: boolean;
    filterBlocks: FilterBlock[];
    filterAuthoringInfo?: FilterAuthoringInfo;
};
type FilterAuthoringInfo = {
    type: string;
    filterBlocks: FilterBlockAuthoringInfo[];
};
type FilterBlockAuthoringInfo = {
    filterTypes: FilterType[];
};
type FilterType = {
    filterType: string;
    filterValues: string[];
};
type FilterBlock = {
    title: string;
    filterMode: FilterModeSolid | FilterModeWireFrame;
    filterExpression: string;
};
type Edges = {
    type: string;
    color: number[];
    size: number;
    transparency: number;
    extensionLength: number;
};
type FilterModeSolid = {
    type: 'solid';
};
type FilterModeWireFrame = {
    type: 'wireFrame';
    edges: Edges;
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/spatialReference.cmn.md */
export type SpatialReference = {
    /** The current WKID value of the vertical coordinate system. */
    latestVcsWkid: number;
    /** dentifies the current WKID value associated with the same spatial reference. */
    latestWkid: number;
    /** The WKID value of the vertical coordinate system. */
    vcsWkid: number;
    /** WKID, or Well-Known ID, of the CRS. Specify either WKID or WKT of the CRS. */
    wkid: number;
    /** WKT, or Well-Known Text, of the CRS. Specify either WKT or WKID of the CRS but not both. */
    wkt?: string;
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/fullExtent.cmn.md */
export type FullExtent = {
    /** left longitude in decimal degrees */
    xmin: number;
    /** right longitude in decimal degrees */
    xmax: number;
    /** bottom latitude in decimal degrees*/
    ymin: number;
    /** top latitude in decimal degrees*/
    ymax: number;
    /** lowest elevation in meters */
    zmin: number;
    /** highest elevation in meters */
    zmax: number;
    spatialReference?: SpatialReference;
};
/**
 * https://github.com/Esri/i3s-spec/blob/master/docs/1.8/textureDefinitionInfo.cmn.md
 */
export type TextureDefinitionInfo = {
    /** MIMEtype - The encoding/content type that is used by all images in this map */
    encoding?: string[];
    /** UV wrapping modes, from {none, repeat, mirror}. */
    wrap?: string[];
    /** TRUE if the Map represents a texture atlas. */
    atlas?: boolean;
    /** The name of the UV set to be used as texture coordinates. */
    uvSet?: string;
    /** Indicates channels description. */
    channels?: 'rbg' | 'rgba' | string;
    /** An image is a binary resource, containing a single raster that can be used to texture a feature or symbol. */
    images: TextureImage[];
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/domain.cmn.md */
type Domain = {
    type: string;
    name: string;
    description?: string;
    fieldType?: string;
    range?: [number, number];
    codedValues?: {
        name: string;
        code: string | number;
    }[];
    mergePolicy?: string;
    splitPolicy?: string;
};
/**
 * spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/store.cmn.md
 */
type Store = {
    id?: string | number;
    profile: string;
    version: number | string;
    resourcePattern?: string[];
    rootNode?: string;
    extent?: number[];
    indexCRS?: string;
    vertexCRS?: string;
    normalReferenceFrame?: string;
    lodType?: string;
    lodModel?: string;
    defaultGeometrySchema: DefaultGeometrySchema;
    nidEncoding?: string;
    textureEncoding?: string[];
    featureEncoding?: string;
    geometryEncoding?: string;
    attributeEncoding?: string;
    indexingScheme?: string;
};
/**
 * Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/defaultGeometrySchema.cmn.md
 */
type DefaultGeometrySchema = {
    geometryType?: 'triangles';
    topology: 'PerAttributeArray' | 'Indexed';
    header: HeaderAttribute[];
    ordering: string[];
    vertexAttributes: VertexAttribute;
    faces?: VertexAttribute;
    featureAttributeOrder: string[];
    featureAttributes: FeatureAttribute;
    attributesOrder?: string[];
};
/**
 * spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/headerAttribute.cmn.md
 */
export type HeaderAttribute = {
    property: HeaderAttributeProperty.vertexCount | HeaderAttributeProperty.featureCount | string;
    type: 'UInt8' | 'UInt16' | 'UInt32' | 'UInt64' | 'Int16' | 'Int32' | 'Int64' | 'Float32' | 'Float64';
};
export declare enum HeaderAttributeProperty {
    vertexCount = "vertexCount",
    featureCount = "featureCount"
}
export type VertexAttribute = {
    position: GeometryAttribute;
    normal: GeometryAttribute;
    uv0: GeometryAttribute;
    color: GeometryAttribute;
    region?: GeometryAttribute;
};
export type GeometryAttribute = {
    byteOffset?: number;
    valueType: 'UInt8' | 'UInt16' | 'Int16' | 'Int32' | 'Int64' | 'Float32' | 'Float64';
    valuesPerElement: number;
};
export type I3SMeshAttributes = {
    [key: string]: I3SMeshAttribute;
};
export interface I3SMeshAttribute extends MeshAttribute {
    type?: number;
    metadata?: any;
}
/** https://github.com/Esri/i3s-spec/blob/master/docs/1.8/heightModelInfo.cmn.md */
type HeightModelInfo = {
    heightModel: 'gravity_related_height' | 'ellipsoidal';
    vertCRS: string;
    heightUnit: 'meter' | 'us-foot' | 'foot' | 'clarke-foot' | 'clarke-yard' | 'clarke-link' | 'sears-yard' | 'sears-foot' | 'sears-chain' | 'benoit-1895-b-chain' | 'indian-yard' | 'indian-1937-yard' | 'gold-coast-foot' | 'sears-1922-truncated-chain' | 'us-inch' | 'us-mile' | 'us-yard' | 'millimeter' | 'decimeter' | 'centimeter' | 'kilometer';
};
export type TextureSetDefinitionFormats = {
    name: string;
    format: I3STextureFormat;
}[];
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/textureSetDefinition.cmn.md */
type TextureSetDefinition = {
    formats: TextureSetDefinitionFormats;
    atlas?: boolean;
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/geometryDefinition.cmn.md */
type GeometryDefinition = {
    topology?: 'triangle';
    geometryBuffers: GeometryBuffer[];
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/geometryBuffer.cmn.md */
type GeometryBuffer = {
    offset?: number;
    position?: GeometryBufferItem;
    normal?: GeometryBufferItem;
    uv0?: GeometryBufferItem;
    color?: GeometryBufferItem;
    uvRegion?: GeometryBufferItem;
    featureId?: GeometryBufferItem;
    faceRange?: GeometryBufferItem;
    compressedAttributes?: {
        encoding: string;
        attributes: string[];
    };
};
type GeometryBufferItem = {
    type: string;
    component: number;
    encoding?: string;
    binding?: string;
};
type AttributeValue = {
    valueType: string;
    encoding?: string;
    valuesPerElement?: number;
};
export type FieldInfo = {
    fieldName: string;
    visible: boolean;
    isEditable: boolean;
    label: string;
};
export type ArcGISWebSceneData = {
    header: ArcGISWebScene;
    layers: OperationalLayer[];
    unsupportedLayers: OperationalLayer[];
};
/**
 * ArcGIS WebScene spec - https://developers.arcgis.com/web-scene-specification/objects/webscene/
 */
export type ArcGISWebScene = {
    /**
     * @todo add type.
     * Spec - https://developers.arcgis.com/web-scene-specification/objects/applicationProperties/
     * Configuration of application and UI elements.
     */
    applicationProperties?: any;
    /**
     * Operational layers contain business data which are used to make thematic scenes.
     */
    operationalLayers: OperationalLayer[];
    /**
     * Basemaps give the web scene a geographic context.
     */
    baseMap: BaseMap;
    /**
     * Ground defines the main surface of the web scene, based on elevation layers.
     */
    ground: Ground;
    /**
     * An object that defines the characteristics of the vertical coordinate system used by the web scene.
     */
    heightModelInfo: HeightModelInfo;
    /**
     * Root element in the web scene specifying a string value indicating the web scene version.
     * Valid values: 1.8, 1.9, 1.10, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.20, 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, 1.27
     */
    version: string;
    /**
     * String value indicating the application which authored the webmap
     */
    authoringApp: string;
    /**
     * String value indicating the authoring App's version number.
     */
    authoringAppVersion: string;
    /**
     * A presentation consists of multiple slides, where each slide is a specific view into the web scene.
     * Spec - https://developers.arcgis.com/web-scene-specification/objects/presentation/
     * @todo Add presentation type.
     */
    presentation: ArcGISPresentation;
    /**
     * An object that provides information about the initial environment settings and viewpoint of the web scene.
     */
    initialState: InitialState;
    /**
     * An object used to specify the spatial reference of the given geometry.
     */
    spatialReference: SpatialReference;
    viewingMode: 'global' | 'local';
    /**
     * @todo add type.
     * Defines area to be clipped for display.
     */
    clippingArea?: any;
    /**
     * @todo add type.
     * Spec - https://developers.arcgis.com/web-scene-specification/objects/mapFloorInfo/
     * Contains floor-awareness information for the web scene.
     */
    mapFloorInfo?: any;
    /**
     * @todo add type.
     * Spec - https://developers.arcgis.com/web-scene-specification/objects/mapRangeInfo/
     * Map Range Information
     */
    mapRangeInfo?: any;
    /**
     * @todo add type.
     * Spec - https://developers.arcgis.com/web-scene-specification/objects/table/
     * An array of table objects.
     */
    tables?: any;
    /**
     * @todo add type.
     * Spec - https://developers.arcgis.com/web-scene-specification/objects/transportationNetwork/
     * Used to specify the transportation networks of the scene.
     */
    transportationNetworks?: any;
    /**
     * @todo add type.
     * Spec - https://developers.arcgis.com/web-scene-specification/objects/widgets/
     * The widgets object contains widgets that should be exposed to the user.
     */
    widgets?: any;
};
/**
 * Spec - https://developers.arcgis.com/javascript/latest/api-reference/esri-webscene-Presentation.html
 */
type ArcGISPresentation = {
    slides: Slide[];
};
/**
 * A slide stores a snapshot of several pre-set properties of the WebScene and SceneView,
 * such as the basemap, viewpoint and visible layers.
 * Spec - https://developers.arcgis.com/javascript/latest/api-reference/esri-webscene-Slide.html
 */
type Slide = {
    id: string;
    title: {
        text: string;
    };
    thumbnail: {
        url: string;
    };
    description: {
        text: string;
    };
    ground: {
        transparency: number;
    };
    baseMap: ArcGISBaseMap;
    visibleLayers: ArcGISVisibleLayer[];
    viewpoint: ArcGISViewPoint;
};
/**
 * The basemap of the scene. Only the base and reference layers of the basemap are stored in a slide.
 * Spec - https://developers.arcgis.com/javascript/latest/api-reference/esri-Basemap.html
 */
type ArcGISBaseMap = {
    id: string;
    title: string;
    baseMapLayers: ArcGISBaseMapLayer[];
};
/**
 * The visible layers of the scene.
 * Spec - https://developers.arcgis.com/javascript/latest/api-reference/esri-webscene-Slide.html#visibleLayers
 */
type ArcGISVisibleLayer = {
    id: string;
    sublayerIds: number[];
};
/**
 * The basemap of the scene.
 * Spec - https://developers.arcgis.com/javascript/latest/api-reference/esri-Basemap.html
 */
type ArcGISBaseMapLayer = {
    id: string;
    title: string;
    url: string;
    layerType: string;
    visibility: boolean;
};
/**
 * The viewpoint of the slide. This acts like a bookmark, saving a predefined location or point of view from which to view the scene.
 * Spec - https://developers.arcgis.com/javascript/latest/api-reference/esri-Viewpoint.html
 */
type ArcGISViewPoint = {
    scale: number;
    rotation?: number;
    /**
     * Spec - https://developers.arcgis.com/web-scene-specification/objects/viewpoint/
     */
    targetGeometry: any;
    camera: ArcGISCamera;
};
/**
 * The camera defines the position, tilt, and heading of the point from which the SceneView's visible extent is observed.
 * It is not associated with device hardware. This class only applies to 3D SceneViews.
 * Spec - https://developers.arcgis.com/javascript/latest/api-reference/esri-Camera.html
 */
export type ArcGISCamera = {
    position: {
        x: number;
        y: number;
        z: number;
    };
    spatialReference: {
        wkid: number;
        latestWkid: number;
    };
    heading: number;
    tilt: number;
};
/**
 * Operational layers contain your data. Usually, a basemap sits beneath your operational layers to give them geographic context.
 * Spec- https://developers.arcgis.com/web-scene-specification/objects/operationalLayers/
 */
export type OperationalLayer = {
    id: string;
    opacity: number;
    title: string;
    url: string;
    visibility: boolean;
    itemId: string;
    layerType: string;
    LayerDefinition: LayerDefinition;
    screenSizePerspective: boolean;
    showLabels?: boolean;
    disablePopup?: boolean;
    showLegend?: boolean;
    layers?: OperationalLayer[];
};
type LayerDefinition = {
    elevationInfo: ElevationInfo;
    drawingInfo: DrawingInfo;
};
type BaseMap = {
    id: string;
    title: string;
    baseMapLayers: BaseMapLayer[];
    elevationLayers: ElevationLayer[];
};
type BaseMapLayer = {
    id: string;
    opacity: number;
    title: string;
    url: string;
    visibility: boolean;
    layerType: string;
};
type ElevationLayer = {
    id: string;
    listMode: string;
    title: string;
    url: string;
    visibility: boolean;
    layerType: string;
};
type Ground = {
    layers: ElevationLayer[];
    transparency: number;
    navigationConstraint: NavigationConstraint;
};
type NavigationConstraint = {
    type: string;
};
type InitialState = {
    environment: Enviroment;
    viewpoint: ViewPoint;
};
type Enviroment = {
    lighting: Lighting;
    atmosphereEnabled?: string;
    starsEnabled?: string;
};
type Lighting = {
    datetime?: number;
    displayUTCOffset?: number;
};
type ViewPoint = {
    camera: Camera;
};
type Camera = {
    position: CameraPosition;
    heading: number;
    tilt: number;
};
type CameraPosition = {
    spatialReference: SpatialReference;
    x: number;
    y: number;
    z: number;
};
/**
 * Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/statsInfo.cmn.md
 */
export type StatsInfo = {
    /** Represents the count of the value. */
    totalValuesCount?: number;
    /** Minimum attribute value for the entire layer. */
    min?: number;
    /** Maximum attribute value for the entire layer. */
    max?: number;
    /** Count for the entire layer. */
    count?: number;
    /** Sum of the attribute values over the entire layer. */
    sum?: number;
    /** Representing average or mean value. For example, sum/count. */
    avg?: number;
    /** Representing the standard deviation. */
    stddev?: number;
    /**	Representing variance. For example, stats.stddev *stats.stddev. */
    variance?: number;
    /** Represents the histogram. */
    histogram?: Histogram;
    /** An array of most frequently used values within the point cloud scene layer. */
    mostFrequentValues?: ValueCount[];
};
/** Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/histogram.cmn.md */
export type Histogram = {
    /** Minimum attribute value for the entire layer. */
    minimum: number;
    /** Maximum attribute value for the entire layer. Maximum array size for stats.histo.counts is 256. */
    maximum: number;
    /** Count for the entire layer. */
    counts: number[];
};
export type ValueCount = {
    /** Type of the attribute values after decompression, if applicable. Please note that string is not supported for point cloud scene layer attributes. */
    value: number | string;
    /** Count of the number of values. May exceed 32 bits. */
    count: number;
};
export {};
//# sourceMappingURL=types.d.ts.map