import { Object3D } from 'three';
import { WatchCallback, WatchOptions, WatchSource } from '@vue-reactivity/watch';
import { PolyScene } from '../../../../engine/scene/PolyScene';
import { BaseSopNodeType } from '../../../../../src/engine/nodes/sop/_Base';
import { JsIConnectionPointTypeToDataTypeMap, ParamConvertibleJsType } from '../../../../engine/nodes/utils/io/connections/Js';
export interface CoreObjectHelperOptions<S extends PolyScene> {
    scene: S;
    object: Object3D;
}
interface CreateObjectOptions<S extends PolyScene> {
    scene: S;
    object: Object3D;
}
type OnAttributeChangeCallback<T> = (newValue: T, prevValue: T) => void;
export declare class CoreObjectHelper<S extends PolyScene> {
    readonly options: CoreObjectHelperOptions<S>;
    private _watchStopHandles;
    readonly scene: S;
    readonly object: Object3D;
    constructor(options: CoreObjectHelperOptions<S>);
    dispose(): void;
    onAttributeUpdate<T extends ParamConvertibleJsType>(attribName: string, attribType: T, defaultValue: JsIConnectionPointTypeToDataTypeMap[T], callback: OnAttributeChangeCallback<JsIConnectionPointTypeToDataTypeMap[T]>): void;
    watch<T, Immediate extends Readonly<boolean> = false>(source: WatchSource<T>, cb: WatchCallback<T, Immediate extends true ? T | undefined : T>, options?: WatchOptions<Immediate>): void;
}
type CreateCoreObjectHelper<S extends PolyScene, T extends CoreObjectHelper<S>> = (options: CreateObjectOptions<S>) => T;
interface ObjectFromNodeOptions {
    traverse?: boolean;
}
export declare function objectFromNode<S extends PolyScene, T extends CoreObjectHelper<S>>(node: BaseSopNodeType, objectName: string, creatFunction: CreateCoreObjectHelper<S, T>, options?: ObjectFromNodeOptions): Promise<T | undefined>;
export {};
