import type SpatialReference from "../geometry/SpatialReference.js";
import type Layer from "./Layer.js";
import type ElevationInfo from "../symbols/support/ElevationInfo.js";
import type { MultiOriginJSONSupportMixin } from "../core/MultiOriginJSONSupport.js";
import type { APIKeyMixin, APIKeyMixinProperties } from "./mixins/APIKeyMixin.js";
import type { CustomParametersMixin, CustomParametersMixinProperties } from "./mixins/CustomParametersMixin.js";
import type { OperationalLayer, OperationalLayerProperties } from "./mixins/OperationalLayer.js";
import type { PortalLayer, PortalLayerProperties } from "./mixins/PortalLayer.js";
import type { ScaleRangeLayer, ScaleRangeLayerProperties } from "./mixins/ScaleRangeLayer.js";
import type { SpatialReferenceProperties } from "../geometry/SpatialReference.js";
import type { ElevationInfoProperties } from "../symbols/support/ElevationInfo.js";
import type { LayerProperties } from "./Layer.js";

/** @since 5.0 */
export interface GaussianSplatLayerProperties extends LayerProperties, APIKeyMixinProperties, CustomParametersMixinProperties, ScaleRangeLayerProperties, PortalLayerProperties, OperationalLayerProperties, Partial<Pick<GaussianSplatLayer, "url">> {
  /**
   * Specifies how the Gaussian Splatting scene is placed on the vertical axis (z). This property may only be used
   * in a [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/). See the
   * [ElevationInfo sample](https://developers.arcgis.com/javascript/latest/sample-code/scene-elevationinfo/) for an example of how this property
   * may be used.
   * > [!WARNING]
   * >
   * > This property only affects [GaussianSplatLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/GaussianSplatLayer/) when using the `absolute-height` mode.
   *
   * @since 5.0
   */
  elevationInfo?: ElevationInfoProperties | null;
  /**
   * The spatial reference of the layer.
   *
   * @since 5.0
   */
  spatialReference?: SpatialReferenceProperties;
  /**
   * The title of the layer used to identify it in places such as the [LayerList](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/) widget.
   *
   * When loading a layer by service url, the title is derived from the service name.
   * When the layer is loaded from a portal item, the title of the portal item will be used instead.
   * Finally, if a layer is loaded as part of a webmap or a webscene, then the title of the layer as stored in the
   * webmap/webscene will be used.
   *
   * @since 5.0
   */
  title?: string | null;
}

/**
 * * [Overview](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-GaussianSplatLayer.html#overview)
 * * [Creating a GaussianSplatLayer](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-GaussianSplatLayer.html#creating-a-gaussiansplat-layer)
 * * [Data Visualization](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-GaussianSplatLayer.html#data-visualization)
 *
 * <span id="overview"></span>
 * ## Overview
 *
 * The GaussianSplatLayer is designed for visualizing highly realistic, complex geometry of built and natural environments in a
 * [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
 * It excels at rendering high-fidelity details, making it ideal for thin and intricate structures like powerlines, guard rails,
 * and antennas in infrastructure workflows. It also captures transparency and reflections in human-made features, such as building
 * windows or metal surfaces and can accurately represent vegetation and other natural features.
 *
 * Gaussian splatting is a technique in computer graphics that renders a 3D scene from millions of individual elements called Gaussian splats.
 * They can be seen as fuzzy ellipsoids that are defined by their position, rotation, size, color, and transparency.
 * Gaussian splats are optimized during a training process. When rendered together, Gaussian splats blend to form a smooth,
 * photorealistic 3D representation.
 *
 * > [!WARNING]
 * >
 * > **Known Limitations**
 * >
 * > * Currently, Elevation Profile, Viewshed, Line of Sight, Slice and Volume Measurement are not supported.
 * > * Gaussian splat layers do not cast or receive shadows.
 * > * Gaussian splat layers are not guaranteed to always draw correctly in a local scene using WGS84 as spatial reference
 * >   (WKID 4326).
 *
 * <span id="creating-a-gaussiansplat-layer"></span>
 * ## Creating a GaussianSplatLayer
 * Gaussian splat data is generated by a highly automated process from large sets of overlapping imagery and/or from lidar surveys.
 * You can use [ArcGIS Reality Studio](https://doc.esri.com/en/arcgis-reality-studio/latest/),
 * [ArcGIS Drone2Map](https://doc.arcgis.com/en/drone2map/latest/get-started/what-is-drone2map.htm), and
 * [ArcGIS Reality for ArcGIS Pro](https://pro.arcgis.com/en/pro-app/latest/help/data/imagery/introduction-to-arcgis-reality-extension.htm)
 * to create a Gaussian splat dataset.
 *
 * From ArcGIS Pro, you can author a Gaussian splat layer and share it to ArcGIS Online or ArcGIS Enterprise 12.1 or newer.
 * In addition, you can upload a 3TZ file (3D Tiles Package).
 *
 * The Scene Service is identified by the [url](https://developers.arcgis.com/javascript/latest/references/core/layers/GaussianSplatLayer/#url) or [portalItem](https://developers.arcgis.com/javascript/latest/references/core/layers/GaussianSplatLayer/#portalItem)
 * property and can be used to create an instance of a Gaussian splat layer:
 *
 * ```js
 * let gaussianSplatLayer = new GaussianSplatLayer({
 *   url: "https://tiles.arcgis.com/tiles/V6ZHFr6zdgNZuVG0/arcgis/rest/services/Portcoast_industrial/3DTilesServer/tileset.json"
 * });
 * ```
 *
 * ```js
 * let gaussianSplatLayer = new GaussianSplatLayer({
 *  portalItem: {
 *    id: "01596d71a5ce40ec8a6f21baad6e5b6f"
 *  }
 * });
 * ```
 *
 * <span id="data-visualization"></span>
 * ## Data Visualization
 * Besides human-made structures, natural objects such as vegetation can be visualized with high fidelity. This includes details like tree leaves,
 * enabling classification of tree species or other types of vegetation.
 *
 * A Gaussian splat layer is a 3D layer that can be visualized in either a local or global scene. For example, if you create a Gaussian splat layer in a
 * projected coordinate system, you can visualize it in a local scene using the same projected coordinate system.
 * Since Gaussian splat layers support the
 * [ESRI_CRS](https://github.com/Esri/3D-tiles-layer/blob/main/ESRI_CRS/Esri_crs_extension.md) extension, you can also visualize the same Gaussian splat layer
 * in a global scene that uses the geodetic coordinate system WGS84.
 *
 * You can visualize and explore other layers such as feature, imagery, and other 3D layers together with the Gaussian splat layer in your scene.
 *
 * @since 5.0
 * @see [Sample - GaussianSplatLayer](https://developers.arcgis.com/javascript/latest/sample-code/layers-gaussiansplatlayer/)
 * @see [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/)
 * @see [Map](https://developers.arcgis.com/javascript/latest/references/core/Map/)
 */
export default class GaussianSplatLayer extends GaussianSplatLayerSuperclass {
  /** @since 5.0 */
  constructor(properties?: GaussianSplatLayerProperties);
  /**
   * Specifies how the Gaussian Splatting scene is placed on the vertical axis (z). This property may only be used
   * in a [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/). See the
   * [ElevationInfo sample](https://developers.arcgis.com/javascript/latest/sample-code/scene-elevationinfo/) for an example of how this property
   * may be used.
   * > [!WARNING]
   * >
   * > This property only affects [GaussianSplatLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/GaussianSplatLayer/) when using the `absolute-height` mode.
   *
   * @since 5.0
   */
  get elevationInfo(): ElevationInfo | null | undefined;
  set elevationInfo(value: ElevationInfoProperties | null | undefined);
  /**
   * The spatial reference of the layer.
   *
   * @since 5.0
   */
  get spatialReference(): SpatialReference;
  set spatialReference(value: SpatialReferenceProperties);
  /**
   * The title of the layer used to identify it in places such as the [LayerList](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/) widget.
   *
   * When loading a layer by service url, the title is derived from the service name.
   * When the layer is loaded from a portal item, the title of the portal item will be used instead.
   * Finally, if a layer is loaded as part of a webmap or a webscene, then the title of the layer as stored in the
   * webmap/webscene will be used.
   *
   * @since 5.0
   */
  accessor title: string | null | undefined;
  /**
   * The layer type provides a convenient way to check the type of the layer without the need to import specific layer modules.
   *
   * @since 5.0
   */
  get type(): "gaussian-splat";
  /**
   * The URL of the root json file.
   *
   * @since 5.0
   */
  accessor url: string | null | undefined;
}
declare const GaussianSplatLayerSuperclass: typeof Layer & typeof APIKeyMixin & typeof CustomParametersMixin & typeof MultiOriginJSONSupportMixin & typeof ScaleRangeLayer & typeof PortalLayer & typeof OperationalLayer