import { Bounds3 } from "./Bounds.js";
import type { Renderable } from "./Renderable.js";
import { TransformNode } from "./TransformNode.js";
export interface SceneNodeOptions {
    id?: string;
    name?: string;
}
export interface AddChildOptions {
    preserveWorldTransform?: boolean;
}
export interface DisposeNodeOptions {
    recursive?: boolean;
}
export declare class SceneNode {
    readonly id: string;
    name: string;
    visible: boolean;
    layerMask: number;
    renderOrder: number;
    disposed: boolean;
    userData: Record<string, unknown>;
    renderable?: Renderable;
    readonly transform: TransformNode;
    localBounds: Bounds3 | null;
    worldBounds: Bounds3;
    readonly children: SceneNode[];
    parent: SceneNode | null;
    constructor(options?: SceneNodeOptions);
    addChild(child: SceneNode, options?: AddChildOptions): this;
    removeChild(child: SceneNode): boolean;
    removeFromParent(): boolean;
    isAncestorOf(candidate: SceneNode): boolean;
    traverse(visitor: (node: SceneNode) => void): void;
    updateWorldTransform(force?: boolean): void;
    updateWorldBounds(): Bounds3;
    setLocalBounds(bounds: Bounds3 | null): this;
    dispose(options?: DisposeNodeOptions): void;
    markWorldDirty(): void;
    protected assertAlive(): void;
}
export declare function assertCanParent(parent: SceneNode, child: SceneNode): void;
//# sourceMappingURL=SceneNode.d.ts.map