import { IMaterial, IMaterialEventMap } from './IMaterial';
import { EventListener2, Object3D, Object3DEventMap, Vector3 } from 'three';
import { ChangeEvent, IUiConfigContainer, UiObjectConfig } from 'uiconfig.js';
import { IGeometry, IGeometryEventMap } from './IGeometry';
import { IImportResultUserData } from '../assetmanager';
import { GLTF } from 'three/examples/jsm/loaders/GLTFLoader.js';
import { ICamera, type ICameraSetDirtyOptions } from './ICamera';
declare module 'three' {
    interface Object3DEventMap {
        select: {
            ui?: boolean;
            focusCamera?: boolean;
            bubbleToParent?: boolean;
            object: IObject3D;
            value?: IObject3D;
            source?: string;
        };
    }
}
export interface IObject3DEventMap extends Object3DEventMap {
    dispose: {
        bubbleToParent: false;
    };
    materialUpdate: {
        material: IMaterial | IMaterial[];
    };
    objectUpdate: {
        object: IObject3D;
        change?: string;
        args?: any[];
        bubbleToParent: boolean;
    };
    textureUpdate: {};
    geometryChanged: {
        object: IObject3D;
        geometry: IGeometry | null;
        oldGeometry: IGeometry | null;
        bubbleToParent: boolean;
    };
    materialChanged: {
        object: IObject3D;
        material: IMaterial | IMaterial[] | null;
        oldMaterial: IMaterial | IMaterial[] | null;
        bubbleToParent: boolean;
    };
    geometryUpdate: {
        object: IObject3D;
        geometry: IGeometry;
        bubbleToParent: boolean;
    };
    added: {};
    removed: {};
    beforeDeserialize: {
        material: IMaterial;
    } & IMaterialEventMap['beforeDeserialize'];
    setView: {
        ui?: boolean;
        camera: ICamera;
        bubbleToParent: boolean;
    };
    activateMain: {
        ui?: boolean;
        camera?: ICamera | null;
        bubbleToParent: boolean;
    };
    cameraUpdate: {
        ui?: boolean;
        camera?: ICamera;
        bubbleToParent: boolean;
    } & ICameraSetDirtyOptions;
}
export interface ISetDirtyCommonOptions {
    /**
     * Trigger UI Config Refresh along with setDirty.
     * Default `true`. Set to `false` to prevent UI Config refresh.
     */
    refreshUi?: boolean;
    /**
     * Enable/disable frame fade using {@link FrameFadePlugin}
     * Default `true`. when the plugin is enabled and has corresponding flags enabled
     */
    frameFade?: boolean;
    /**
     * Duration for `frameFade` in ms. Check {@link FrameFadePlugin} for more details.
     */
    fadeDuration?: number;
    /**
     * Event from uiconfig.js when some value changes from the UI.
     */
    uiChangeEvent?: ChangeEvent;
}
export interface IObjectSetDirtyOptions extends ISetDirtyCommonOptions {
    bubbleToParent?: boolean;
    change?: string;
    refreshScene?: boolean;
    geometryChanged?: boolean;
    /**
     * @deprecated use {@link refreshScene} instead
     */
    sceneUpdate?: boolean;
    source?: string;
    key?: string;
    /**
     * Set to true if this is the last value in a user input chain. (like when mouse up on slider)
     */
    last?: boolean;
    /**
     * Indicates that this change in from an `undo` operation.
     */
    undo?: boolean;
}
export interface IObjectProcessor {
    processObject: (object: IObject3D) => void;
}
export interface IObject3DUserData extends IImportResultUserData {
    uuid?: string;
    /**
     * When true, this object will not be exported when exporting the scene with {@link AssetExporter.exportObject}
     */
    excludeFromExport?: boolean;
    autoCentered?: boolean;
    isCentered?: boolean;
    autoScaleRadius?: number;
    autoScaled?: boolean;
    geometriesCentered?: boolean;
    /**
     * should this object be taken into account when calculating bounding box, default true
     */
    bboxVisible?: boolean;
    /**
     * Is centered in a parent object.
     */
    pseudoCentered?: boolean;
    license?: string;
    /**
     * When false, this object will not be selectable when clicking on it.
     */
    userSelectable?: boolean;
    /**
     * For Physics plugins
     */
    physicsMass?: number;
    /**
     * see {@link GLTFAnimationPlugin}
     */
    gltfAnim_SyncMaxDuration?: boolean;
    /**
     * is it modelRoot in RootScene, used during serialization nad traversing ancestors
     */
    rootSceneModelRoot?: boolean;
    __gltfAsset?: GLTF['asset'];
    __gltfExtras?: GLTF['userData'];
    __objectSetup?: boolean;
    __meshSetup?: boolean;
    /**
     * @deprecated
     */
    dispose?: any;
    /**
     * @deprecated
     */
    setMaterial?: any;
    /**
     * @deprecated
     */
    setGeometry?: any;
    /**
     * @deprecated
     */
    setDirty?: any;
    /**
     * Used in {@link GLTFObject3DExtrasExtension} and {@link iObjectCommons.upgradeObject3D}
     */
    __keepShadowDef?: boolean;
    /**
     * Events that should be bubbled to parent root without the need to set bubbleToParent in the event.
     * todo: remove support for this
     */
    __autoBubbleToParentEvents?: string[];
    [key: string]: any;
}
export interface IObject3D<TE extends IObject3DEventMap = IObject3DEventMap> extends Object3D<TE>, IUiConfigContainer {
    assetType: 'model' | 'light' | 'camera' | 'widget';
    isLight?: boolean;
    isCamera?: boolean;
    isMesh?: boolean;
    isLine?: boolean;
    isLineSegments?: boolean;
    isScene?: boolean;
    isWidget?: boolean;
    readonly isObject3D: true;
    material?: IMaterial | IMaterial[];
    /**
     * Same as material but always returns an array.
     * To set, just set `material` property
     */
    readonly materials?: IMaterial[];
    _currentMaterial?: IMaterial | IMaterial[] | null;
    geometry?: IGeometry;
    morphTargetDictionary?: Record<string, number>;
    morphTargetInfluences?: number[];
    updateMorphTargets?(): void;
    _currentGeometry?: IGeometry | null;
    /**
     * Dispatches 'objectUpdate' event on object.
     * @param e
     */
    setDirty(e?: IObjectSetDirtyOptions): void;
    /**
     * Parent/Ancestor of this object to bubble events to. This is set internally by setupObject3D.
     */
    parentRoot?: IObject3D | null;
    uiConfig?: UiObjectConfig;
    refreshUi(): void;
    userData: IObject3DUserData;
    /**
     * Scales the object to fit the given radius.
     *
     * @param autoScaleRadius - optional (taken from userData.autoScaleRadius by default)
     * @param isCentered - optional (taken from userData.isCentered by default)
     * @param setDirty - true by default
     * @param undo - undo any previous autoScale operation
     */
    autoScale?(autoScaleRadius?: number, isCentered?: boolean, setDirty?: boolean, undo?: boolean): this;
    /**
     * Moves the bounding box center of the object to the center of the world
     *
     * @param setDirty - calls {@link setDirty} @default true
     * @param undo - undo any previous autoCenter operation
     */
    autoCenter?(setDirty?: boolean, undo?: boolean): this;
    /**
     * Moves the object pivot to the center of the bounding box.
     *
     * The object will rotate around the new pivot.
     *
     * @param setDirty - calls {@link setDirty} @default true
     * @returns undo function
     */
    pivotToBoundsCenter?(setDirty?: boolean): () => void;
    /**
     * Moves the object pivot to the given point
     *
     * The object will rotate around the new pivot.
     *
     * @param point - point to move the pivot to
     * @param setDirty - calls {@link setDirty} @default true
     * @returns undo function
     */
    pivotToPoint?(point: Vector3, setDirty?: boolean): this;
    /**
     * @deprecated use object directly
     */
    modelObject: this;
    _onGeometryUpdate?: EventListener2<'geometryUpdate', IGeometryEventMap, IGeometry>;
    objectProcessor?: IObjectProcessor;
    /**
     * @param removeFromParent - remove from parent. Default true
     */
    dispose(removeFromParent?: boolean): void;
    traverse(callback: (object: IObject3D) => void): void;
    traverseVisible(callback: (object: IObject3D) => void): void;
    traverseAncestors(callback: (object: IObject3D) => void): void;
    getObjectById<T extends IObject3D = IObject3D>(id: number): T | undefined;
    getObjectByName<T extends IObject3D = IObject3D>(name: string): T | undefined;
    getObjectByProperty<T extends IObject3D = IObject3D>(name: string, value: string): T | undefined;
    copy(source: this, recursive?: boolean, ...args: any[]): this;
    clone(recursive?: boolean): this;
    add(...object: Object3D[]): this;
    remove(...object: IObject3D[]): this;
    parent: IObject3D | null;
    children: IObject3D[];
}
//# sourceMappingURL=IObject.d.ts.map