import { IChartModifierBase } from "../../Charting/ChartModifiers/ChartModifierBase";
import { IThemeProvider } from "../../Charting/Themes/IThemeProvider";
import { SciChartSurfaceBase, TSciChartConfig } from "../../Charting/Visuals/SciChartSurfaceBase";
import { TDpiChangedEventArgs } from "../../Charting/Visuals/TextureManager/DpiHelper";
import { IGenericAnimation } from "../../Core/Animations/GenericAnimation";
import { ObservableArray } from "../../Core/ObservableArray";
import { Point } from "../../Core/Point";
import { SCRTSceneWorld, TSciChart3D as TWasmContext } from "../../types/TSciChart3D";
import { TSciChartSurfaceCanvases } from "../../types/TSciChartSurfaceCanvases";
import { ICameraController } from "../CameraController";
import { I3DSurfaceOptions } from "../I3DSurfaceOptions";
import { Vector3 } from "../Vector3";
import { AxisBase3D } from "./Axis/AxisBase3D";
import { AxisCubeEntity } from "./Axis/AxisCubeEntity";
import { IRenderableSeries3D } from "./RenderableSeries/BaseRenderableSeries3D";
import { RootSceneEntity } from "./RootSceneEntity";
import { ViewportManager3DBase } from "./ViewportManager3DBase";
import { EWatermarkPosition } from "../../types/WatermarkPosition";
import { EventHandler } from "../../Core/EventHandler";
import { Thickness } from "../../Core/Thickness";
import { Rect } from "../../Core/Rect";
import { ESurfaceType } from "../../types/SurfaceType";
import { ISciChart3DDefinition } from "../../Builder/buildSurface";
import { ESciChartSurfaceType } from "../../types/SciChartSurfaceType";
import { IAxisPlane } from "./AxisPlane";
export declare type TSciChart3D = TWasmContext;
export declare type TWebAssemblyChart3D = {
    sciChart3DSurface: SciChart3DSurface;
    wasmContext: TSciChart3D;
};
export declare const sciChartConfig3D: TSciChartConfig;
/**
 * Optional parameters passed to the constructor of {@link SciChart3DSurface} to configure it
 */
export interface ISciChart3DSurfaceOptions {
    canvases?: TSciChartSurfaceCanvases;
    /**
     * The {@link ICameraController} is a 3D Camera which allows choosing perspective, orthogonal projections,
     * camera position, target, orientation such as Pitch, Yaw and Roll etc...
     * @remarks See {@link CameraController} for a concrete implementation of {@link ICameraController}
     */
    camera?: ICameraController;
    /**
     * The WorldDimensions defines the size of the world in 3D space. Series and objects can exist outside of this world
     * however the Axis cube will conform to this size.
     * @remarks See our {@link https://www.scichart.com/javascript-chart-documentation | Documentation} online to see
     * how the World Dimensions property configures the size of the chart.
     */
    worldDimensions?: Vector3;
}
/**
 * @summary The {@link SciChart3DSurface} is the root 3D Chart control in SciChart's High Performance Real-time
 * {@link https://www.scichart.com/javascript-chart-features | JavaScript 3D Chart Library}
 * @description
 * To create a 3D chart using SciChart, declare a {@link SciChart3DSurface} using {@link SciChart3DSurface.create},
 * add X,Y,Z axis via the {@link SciChart3DSurface.xAxis} {@link SciChart3DSurface.yAxis} and {@link SciChart3DSurface.zAxis} properties.
 *
 * Next, add a series or chart type by adding a {@link BaseRenderableSeries3D} to the {@link SciChart3DSurface.renderableSeries} collection.
 *
 * Position the camera in the 3D scene by adjusting the {@link SciChart3DSurface.camera} property.
 *
 * To redraw a {@link SciChart3DSurface} at any time, call {@link SciChart3DSurface.invalidateElement}, however all properties are reactive and the
 * chart will automatically redraw if data or properties change.
 * @remarks
 * {@link SciChart3DSurface | SciChartSurfaces} scale to fit the parent DIV where they are hosted. Use CSS to position the DIV.
 */
export declare class SciChart3DSurface extends SciChartSurfaceBase {
    /**
     * USED INTERNALLY - performs a similar operation to {@link SciChart3DSurface.create} but used internally for testing
     * @param divElement The Div Element ID or reference where the {@link SciChartSurface} will reside
     * @param options Optional parameters of type {@link I3DSurfaceOptions}
     */
    static createSingle(divElement: string | HTMLDivElement, options?: I3DSurfaceOptions): Promise<TWebAssemblyChart3D>;
    /**
     * Allows setting of web URL for Wasm files, in the case you are loading SciChart outside of npm/webpack environment.
     * Note if loading from CDN the version number of wasm Url must match the version number of SciChart.js you are using.
     * @example
     * ```ts
     * // 3D Charts
     * SciChart.SciChart3DSurface.configure({
     *  wasmUrl: "https://cdn.jsdelivr.net/npm/scichart@2.2.2378/_wasm/scichart3d.wasm"
     * });
     * ```
     * @param config
     */
    static configure(config: TSciChartConfig): void;
    /**
     * Tell SciChart to load the Wasm files from CDN, rather than expecting them to be served by the host server.
     * @deprecated the method name breaks [eslint react-hooks/rules-of-hooks](https://legacy.reactjs.org/docs/hooks-rules.html).
     * To avoid this error in React, use {@link loadWasmFromCDN} instead.
     */
    static useWasmFromCDN(): void;
    /**
     * Tell SciChart to load the Wasm files from CDN, rather than expecting them to be served by the host server.
     */
    static loadWasmFromCDN(): void;
    /**
     * Tell SciChart to load the Wasm files from the local server, rather than from CDN.
     */
    static loadWasmLocal(): void;
    /**
     * Creates a {@link SciChart3DSurface} and {@link TSciChart3D | WebAssembly Context} to occupy the div by element ID in your DOM.
     * @remarks This method is async and must be awaited
     * @param divElementId The ID or reference of Div Element where the {@link SciChart3DSurface} will reside
     * @param options Optional parameters of type {@link I3DSurfaceOptions}
     */
    static create(divElementId: string | HTMLDivElement, options?: I3DSurfaceOptions): Promise<TWebAssemblyChart3D>;
    static disposeSharedWasmContext(): void;
    private static createTest;
    /**
     * @summary Gets the collection of {@link IRenderableSeries3D} - the chart types or seres on this {@link SciChart3DSurface}
     * @description A {@link SciChart3DSurface} can have zero to many {@link IRenderableSeries3D | RenderableSeries}.
     *
     * The RenderableSeries are drawn as chart types, e.g. {@link ScatterRenderableSeries3D | 3D Scatter series},
     * {@link SurfaceMeshRenderableSeries3D | Surface Mesh series}. Each RenderableSeries
     * must have a {@link BaseDataSeries3D | DataSeries}.
     *
     * Use this collection to add and remove series to the chart.
     * @remarks
     * Adding a series to the chart causes it to automatically redraw. To zoom to fit the data after adding a series, either set
     * {@link AxisCore.autoRange} or call {@link SciChart3DSurface.zoomExtents}
     */
    readonly renderableSeries: ObservableArray<IRenderableSeries3D>;
    /**
     * @summary The {@link RootSceneEntity} is a special {@link BaseSceneEntity3D} type which is the root of the entire scene in
     * in SciChart's High Performance {@link https://www.scichart.com/javascript-chart-features | JavaScript 3D Charts}
     * @remarks
     * Add and remove entities to the scene using the property {@link SciChart3DSurface.rootEntity} and calling
     * {@link RootSceneEntity.children | SceneEntity.children.add}.
     *
     * When a {@link BaseRenderableSeries3D} is added to {@link SciChart3DSurface.renderableSeries}, it's entity is automatically added to the scene.
     */
    rootEntity: RootSceneEntity;
    /**
     * The {@link AxisCubeEntity} is a 3D Scene Entity (inherits {@link BaseSceneEntity3D}) which renders the 3D X,Y,Z axis cube,
     * axis walls and labels in a {@link SciChart3DSurface}
     */
    readonly axisCubeEntity: AxisCubeEntity;
    /**
     * The {@link TSciChart3D | SciChart 3D WebAssembly Context} containing native methods and
     * access to our WebGL2 Engine and WebAssembly numerical methods
     */
    readonly webAssemblyContext3D: TSciChart3D;
    /** The position of the watermark for trials and community licenses */
    watermarkPosition: EWatermarkPosition;
    /**
     * An event handler which notifies its subscribers when a render operation starts. Use this
     * to update elements of the chart for the current render.  Any updates made here will not trigger a subsequent render.
     */
    preRender: EventHandler<void>;
    /** Whether to show errors that occur during the render process.  Defaults true. */
    showErrors: boolean;
    protected animationList: IGenericAnimation[];
    private xAxisProperty;
    private yAxisProperty;
    private zAxisProperty;
    private cameraProperty;
    private worldDimensionsProperty;
    private viewportManagerProperty;
    private readonly sciChart3DRenderer;
    private readonly gizmoEntity;
    private watermarkProperties;
    private watermarkPropertyPosition;
    private isAxisCubeRenderedProperty;
    private sceneWorldProperty;
    private isHitTestEnabledProperty;
    private visibleRangeClipMin;
    private visibleRangeClipMax;
    private xyAxisPlaneProperty;
    private zyAxisPlaneProperty;
    private zxAxisPlaneProperty;
    /**
     * Creates an instance of {@link SciChart3DSurface}
     * @param webAssemblyContext The {@link TSciChart3D | SciChart 3D WebAssembly Context} containing native methods and
     * access to our WebGL2 Engine and WebAssembly numerical methods
     * @param options Optional parameters of type {@link ISciChart3DSurfaceOptions} to configure the chart
     */
    constructor(webAssemblyContext: TSciChart3D, options?: ISciChart3DSurfaceOptions);
    /**
     * Used internally: Gets the {@link SCRTSceneWorld} object at the root of the 3d scene graph
     */
    getSceneWorld(): SCRTSceneWorld;
    /**
     * Converts a 3D Xyz coordinate in world coordinates space to a screen coordinate (2d) in pixels.
     * This allows you to get the 2D screen coordinate of any object or vertex in the 3D scene.
     * @remarks Note: Conversions to/from world/data space must be performed using the {@link AxisBase3D.getCurrentCoordinateCalculator()}
     * API, which returns {@link CoordinateCalculatorBase}. Functions {@link CoordinateCalculatorBase.getDataValue} and
     * {@link CoordinateCalculatorBase.getCoordinate} convert to/from world coords/data space
     * @param worldCoordXyz The 3D Xyz coordinate
     * @returns The 2D screen coordinate in pixels
     */
    worldToScreenCoord(worldCoordXyz: Vector3): Point;
    /**
     * @inheritdoc
     */
    delete(clearHtml?: boolean): void;
    /**
     * Gets or sets whether the Xyz gizmo is enabled - a small 3D Xyz axis on the bottom left of the 3D Chart
     */
    get enableGizmo(): boolean;
    /**
     * Gets or sets whether the Xyz gizmo is enabled - a small 3D Xyz axis on the bottom left of the 3D Chart
     */
    set enableGizmo(isEnabled: boolean);
    /**
     * Gets or sets the {@link ViewportManager3DBase | Viewport Manager} - a class that allows managing of viewport axis ranges
     */
    get viewportManager(): ViewportManager3DBase;
    /**
     * Gets or sets the {@link ViewportManager3DBase | Viewport Manager} - a class that allows managing of viewport axis ranges
     */
    set viewportManager(viewportManager: ViewportManager3DBase);
    /**
     * The WorldDimensions defines the size of the world in 3D space. Series and objects can exist outside of this world
     * however the Axis cube will conform to this size.
     * @remarks See our {@link https://www.scichart.com/javascript-chart-documentation | Documentation} online to see
     * how the World Dimensions property configures the size of the chart.
     */
    get worldDimensions(): Vector3;
    /**
     * The WorldDimensions defines the size of the world in 3D space. Series and objects can exist outside of this world
     * however the Axis cube will conform to this size.
     * @remarks See our {@link https://www.scichart.com/javascript-chart-documentation | Documentation} online to see
     * how the World Dimensions property configures the size of the chart.
     */
    set worldDimensions(worldDimensions: Vector3);
    /**
     * @deprecated.  Use zxAxisPlane.isVisible
     */
    get isZXPlaneVisible(): boolean;
    set isZXPlaneVisible(value: boolean);
    /**
     * @deprecated.  Use xyAxisPlane.isVisible
     */
    get isXYPlaneVisible(): boolean;
    set isXYPlaneVisible(value: boolean);
    /**
     * @deprecated.  Use zyAxisPlane.isVisible
     */
    get isZYPlaneVisible(): boolean;
    set isZYPlaneVisible(value: boolean);
    /** Settings for the XY Axis Plane */
    get xyAxisPlane(): IAxisPlane;
    /** Settings for the ZY Axis Plane */
    get zyAxisPlane(): IAxisPlane;
    /** Settings for the ZX Axis Plane */
    get zxAxisPlane(): IAxisPlane;
    /**
     * The {@link ICameraController} is a 3D Camera which allows choosing perspective, orthogonal projections,
     * camera position, target, orientation such as Pitch, Yaw and Roll etc...
     * @remarks See {@link CameraController} for a concrete implementation of {@link ICameraController}
     */
    get camera(): ICameraController;
    /**
     * The {@link ICameraController} is a 3D Camera which allows choosing perspective, orthogonal projections,
     * camera position, target, orientation such as Pitch, Yaw and Roll etc...
     * @remarks See {@link CameraController} for a concrete implementation of {@link ICameraController}
     */
    set camera(value: ICameraController);
    /**
     * Gets or sets the XAxis in the 3D Chart.
     * @remarks Axis types which derive from {@link AxisBase3D} or concrete type {@link NumericAxis3D} are valid
     */
    get xAxis(): AxisBase3D;
    /**
     * Gets or sets the XAxis in the 3D Chart.
     * @remarks Axis types which derive from {@link AxisBase3D} or concrete type {@link NumericAxis3D} are valid
     */
    set xAxis(xAxis: AxisBase3D);
    /**
     * Gets or sets the YAxis in the 3D Chart.
     * @remarks Axis types which derive from {@link AxisBase3D} or concrete type {@link NumericAxis3D} are valid
     */
    get yAxis(): AxisBase3D;
    /**
     * Gets or sets the YAxis in the 3D Chart.
     * @remarks Axis types which derive from {@link AxisBase3D} or concrete type {@link NumericAxis3D} are valid
     */
    set yAxis(yAxis: AxisBase3D);
    /**
     * Gets or sets the ZAxis in the 3D Chart.
     * @remarks Axis types which derive from {@link AxisBase3D} or concrete type {@link NumericAxis3D} are valid
     */
    get zAxis(): AxisBase3D;
    /**
     * Gets or sets the ZAxis in the 3D Chart.
     * @remarks Axis types which derive from {@link AxisBase3D} or concrete type {@link NumericAxis3D} are valid
     */
    set zAxis(zAxis: AxisBase3D);
    /**
     * Required to enable Hit-Test if any of the following functions are needed in SciChart3DSurface:
     *  - {@link BaseRenderableSeries3D.hitTest}
     *  - {@link TooltipModiifer3D}
     *
     *  Enabling hit-test adds minor a performance overhead for drawing and should be disabled if not required.
     * @param isEnabled
     */
    set isHitTestEnabled(isEnabled: boolean);
    /**
     * Required to enable Hit-Test if any of the following functions are needed in SciChart3DSurface:
     *  - {@link BaseRenderableSeries3D.hitTest}
     *  - {@link TooltipModiifer3D}
     *
     *  Enabling hit-test adds minor a performance overhead for drawing and should be disabled if not required.
     * @param isEnabled
     */
    get isHitTestEnabled(): boolean;
    /**
     * Called internally
     * Sets isAxisCubeRenderedProperty flag after Axis Cube is rendered
     */
    setIsAxisCubeRendered(): void;
    /**
     * Called internally
     * Gets isAxisCubeRenderedProperty flag
     */
    get isAxisCubeRendered(): boolean;
    get chartViewRect(): Rect;
    /**
     * An event handler which notifies its subscribers when a render operation starts. Use this
     * to update elements of the chart for the current render.  Any updates made here will not trigger a subsequent render.
     * @remarks this is an alias for {@link preRender}.
     */
    get preRenderAll(): EventHandler<void>;
    /**
     * @inheritDoc
     */
    invalidateElement(options?: {
        force?: boolean;
    }): void;
    /**
     * @inheritDoc
     */
    onDpiChanged(args: TDpiChangedEventArgs): void;
    /**
     * @inheritDoc
     */
    get surfaceType(): ESurfaceType;
    get isInvalidated(): boolean;
    /**
     * Called after the {@link SciChart3DSurface} has rendered.
     */
    onSciChartRendered(): void;
    /**
     * Called internally - the main drawing loop
     */
    doDrawingLoop(): void;
    /**
     * @inheritDoc
     */
    applyTheme(themeProvider: IThemeProvider): void;
    /**
     * @inheritDoc
     */
    changeViewportSize(pixelWidth: number, pixelHeight: number): void;
    /**
     * Gets the generic animations currently on the surface. Do not manipulate this array directly.
     * To add, use addAnimation.  To remove, find an animation and call .cancel() on it.
     */
    getAnimations(): ReadonlyArray<IGenericAnimation>;
    /**
     * Add a {@link GenericAnimation} to the surface.
     * Multiple animations will be run in parallel, so if you want to run one after another, use the onCompleted callback
     * to add another animation after the first completes
     */
    addAnimation(...animations: IGenericAnimation[]): void;
    /**
     * Returns true if an animation is running
     */
    get isRunningAnimation(): boolean;
    /**
     * Is being called on each render, to run animations
     * @param timeElapsed
     */
    onAnimate(timeElapsed: number): void;
    /**
     * @inheritDoc
     */
    getXAxisById(axisId: string): AxisBase3D | undefined;
    /**
     * @inheritDoc
     */
    getDefaultXAxis(): AxisBase3D | undefined;
    /**
     * @inheritDoc
     */
    getYAxisById(axisId: string): AxisBase3D | undefined;
    /**
     * @inheritDoc
     */
    getDefaultYAxis(): AxisBase3D | undefined;
    /**
     * @inheritDoc
     */
    updateWatermark(left: number, bottom: number): void;
    getSeriesViewRectPadding(scaled: boolean): Thickness;
    updateBackground(): void;
    /**
     *
     * @param fontName Register a font to be used with native text.
     * @param url
     * @returns
     */
    registerFont(fontName: string, url: string): Promise<boolean>;
    /**
     * Updates Clip Planes to do clipping
     */
    updateClipPlanes(): void;
    protected applyOptions(options: I3DSurfaceOptions): void;
    /**
     * @inheritDoc
     */
    protected attachChartModifier(chartModifier: IChartModifierBase): void;
    /**
     * @inheritDoc
     */
    protected applySciChartBackground(background: string): void;
    private detachSeries;
    private attachSeries;
    private detachAxis;
    private attachAxis;
    private childPropertyChanged;
    /**
     * Triggers the rerendering of the surface and after the chart rerendering is completed,
     * returns its serialized state retrieved with {@link SciChartSurface.toJSON}.
     *
     * @param excludeData - if set true, data values will not be included in the json.
     * @returns JSON-like object {@link ISciChart3DDefinition}
     */
    getNextState(excludeData?: boolean): Promise<{
        type: ESciChartSurfaceType.Default3D;
    } & ISciChart3DDefinition>;
    protected getOptions(): Omit<Required<Omit<I3DSurfaceOptions, never>>, "disableEngineLoop" | "isZXPlaneVisible" | "isXYPlaneVisible" | "isZYPlaneVisible">;
    /**
     * Convert the object to a definition that can be serialized to JSON, or used directly with the builder api
     * @param excludeData if set true, data values will not be included in the json.
     */
    toJSON(excludeData?: boolean): {
        type: ESciChartSurfaceType.Default3D;
    } & ISciChart3DDefinition;
}
