import { AViewerPluginEventMap, AViewerPluginSync, ThreeViewer } from '../../viewer';
import { IObject3D, IObject3DEventMap } from '../../core';
import { ConstraintPropsType, TConstraintPropsType } from './helpers/BasicObjectConstraints';
import { UiObjectConfig } from 'uiconfig.js';
export type ObjectConstraintsPluginEventMap = AViewerPluginEventMap;
/**
 * Object Constraints Plugin
 *
 * Create sophisticated object relationships and behaviors using simple constraint-based animation system inspired by Blender's constraints.
 *
 * The ObjectConstraintsPlugin provides a powerful constraint system that allows objects to automatically follow, copy, or respond to other objects' transformations and properties. This enables complex animations and interactive behaviors without manual keyframe animation.
 */
export declare class ObjectConstraintsPlugin extends AViewerPluginSync<ObjectConstraintsPluginEventMap> {
    static readonly PluginType = "ObjectConstraintsPlugin";
    enabled: boolean;
    dependencies: never[];
    constructor(enabled?: boolean);
    addConstraint<T extends TConstraintPropsType = TConstraintPropsType>(obj: IObject3D, constraintOrType?: ObjectConstraint<T> | T, target?: string | IObject3D): ObjectConstraint<T>;
    removeConstraint(obj: IObject3D, constraint: ObjectConstraint): void;
    private _objectAdd;
    private _objectRemove;
    private _constraints;
    private _constraintTargets;
    private _constraintObjects;
    private _objectUpdate;
    private _refreshConstraint;
    private _registerConstraint;
    private _unregisterConstraint;
    private _animatableComponents;
    private _addTarget;
    private _removeTarget;
    private _setupUiConfig;
    private _cleanUpUiConfig;
    onAdded(viewer: ThreeViewer): void;
    onRemove(viewer: ThreeViewer): void;
    protected _viewerListeners: {
        preFrame: () => void;
    };
    static ConstraintTypes: Record<keyof import('./helpers/BasicObjectConstraints').ConstraintPropsTypes, {
        defaultProps: ConstraintPropsType;
        update: (obj: IObject3D, target: IObject3D | undefined, props: ConstraintPropsType, influence: number) => {
            changed: boolean;
            end?: boolean;
            change?: string;
        };
        setDirty?: (e: IObject3DEventMap["objectUpdate"], isTarget?: boolean) => boolean;
    }>;
}
export declare class ObjectConstraint<T extends TConstraintPropsType = TConstraintPropsType> {
    uuid: string;
    enabled: boolean;
    type: T;
    target: string;
    influence: number;
    props: ConstraintPropsType<T>;
    constructor(type?: T);
    update(data: {
        obj: IObject3D;
        target?: IObject3D;
    }): boolean;
    needsUpdate: boolean;
    setDirty: (e?: IObject3DEventMap["objectUpdate"], isTarget?: boolean) => boolean | undefined;
    /**
     * Refreshes the constraint, re-evaluating its target and properties.
     */
    refresh?: () => void;
    /**
     * Removes this constraint from the object it is attached to.
     * @return A function that can be called to undo the removal of the constraint.
     */
    remove?: () => void;
    /**
     * Refresh the constraint and mark it as dirty.
     * @internal
     */
    refresh2: () => void;
    typeChanged(): void;
    private _propsUi;
    uiConfig: UiObjectConfig;
}
declare module '../../assetmanager/IAssetImporter' {
    interface IImportResultUserData {
        constraints?: ObjectConstraint[];
    }
}
//# sourceMappingURL=../../src/plugins/extras/ObjectConstraintsPlugin.d.ts.map