import { Box3, Color, Vector2, Vector3, Vector4, Plane, Ray, Sphere, Quaternion, Matrix4, Euler, EulerOrder } from 'three';
import { Number2, Number3, Number4, Number16 } from '../../../../../types/GlobalTypes';
import { JsConnectionPointType, PrimitiveArrayElement, VectorArrayElement } from '../../../utils/io/connections/Js';
export type RegisterableVariable = Box3 | Color | Euler | Plane | Quaternion | Matrix4 | Ray | Sphere | Vector2 | Vector3 | Vector4 | PrimitiveArray<PrimitiveArrayElement> | VectorArray<VectorArrayElement>;
export declare class PrimitiveArray<V extends PrimitiveArrayElement> {
    protected _elements: V[];
    readonly isPrimitiveArray = true;
    constructor(_elements: V[]);
    elements(): V[];
    clone(): V[];
}
export declare class VectorArray<V extends VectorArrayElement> {
    protected _elements: V[];
    readonly isVectorArray = true;
    constructor(_elements: V[]);
    elements(): V[];
    clone(): V[];
}
export declare function createVariable(type: JsConnectionPointType): Vector2 | Vector3 | Matrix4 | Box3 | Euler | Quaternion | Plane | Vector4 | Sphere | Color | Ray | PrimitiveArray<PrimitiveArrayElement> | VectorArray<VectorArrayElement> | null;
export declare function createPrimitiveArray<V extends PrimitiveArrayElement>(type: JsConnectionPointType): PrimitiveArray<V>;
export declare function createVectorArray<V extends VectorArrayElement>(type: JsConnectionPointType): VectorArray<V>;
export declare enum SerializedVariableType {
    Box3 = "Box3",
    Color = "Color",
    Euler = "Euler",
    Matrix4 = "Matrix4",
    Plane = "Plane",
    Quaternion = "Quaternion",
    Ray = "Ray",
    Sphere = "Sphere",
    Vector2 = "Vector2",
    Vector3 = "Vector3",
    Vector4 = "Vector4",
    boolean_Array = "boolean[]",
    number_Array = "number[]",
    string_Array = "string[]",
    Color_Array = "Color[]",
    Euler_Array = "Euler[]",
    Matrix4_Array = "Matrix4[]",
    Quaternion_Array = "Quaternion[]",
    Vector2_Array = "Vector2[]",
    Vector3_Array = "Vector3[]",
    Vector4_Array = "Vector4[]"
}
interface EulerSerialized {
    rotation: Number3;
    rotationOrder: EulerOrder;
}
interface SerializedDataByType {
    [SerializedVariableType.Box3]: {
        min: Number3;
        max: Number3;
    };
    [SerializedVariableType.Color]: Number3;
    [SerializedVariableType.Euler]: EulerSerialized;
    [SerializedVariableType.Matrix4]: Number16;
    [SerializedVariableType.Plane]: {
        normal: Number3;
        constant: number;
    };
    [SerializedVariableType.Quaternion]: Number4;
    [SerializedVariableType.Ray]: {
        origin: Number3;
        direction: Number3;
    };
    [SerializedVariableType.Sphere]: {
        center: Number3;
        radius: number;
    };
    [SerializedVariableType.Vector2]: Number2;
    [SerializedVariableType.Vector3]: Number3;
    [SerializedVariableType.Vector4]: Number4;
    [SerializedVariableType.boolean_Array]: boolean[];
    [SerializedVariableType.number_Array]: number[];
    [SerializedVariableType.string_Array]: string[];
    [SerializedVariableType.Color_Array]: Number3[];
    [SerializedVariableType.Euler_Array]: EulerSerialized[];
    [SerializedVariableType.Matrix4_Array]: Number16[];
    [SerializedVariableType.Quaternion_Array]: Number4[];
    [SerializedVariableType.Vector2_Array]: Number2[];
    [SerializedVariableType.Vector3_Array]: Number3[];
    [SerializedVariableType.Vector4_Array]: Number4[];
}
interface VariableByType {
    [SerializedVariableType.Box3]: Box3;
    [SerializedVariableType.Color]: Color;
    [SerializedVariableType.Euler]: Euler;
    [SerializedVariableType.Matrix4]: Matrix4;
    [SerializedVariableType.Plane]: Plane;
    [SerializedVariableType.Quaternion]: Quaternion;
    [SerializedVariableType.Ray]: Ray;
    [SerializedVariableType.Sphere]: Sphere;
    [SerializedVariableType.Vector2]: Vector2;
    [SerializedVariableType.Vector3]: Vector3;
    [SerializedVariableType.Vector4]: Vector4;
    [SerializedVariableType.boolean_Array]: PrimitiveArray<boolean>;
    [SerializedVariableType.number_Array]: PrimitiveArray<number>;
    [SerializedVariableType.string_Array]: PrimitiveArray<string>;
    [SerializedVariableType.Color_Array]: VectorArray<Color>;
    [SerializedVariableType.Euler_Array]: VectorArray<Euler>;
    [SerializedVariableType.Matrix4_Array]: VectorArray<Matrix4>;
    [SerializedVariableType.Quaternion_Array]: VectorArray<Quaternion>;
    [SerializedVariableType.Vector2_Array]: VectorArray<Vector2>;
    [SerializedVariableType.Vector3_Array]: VectorArray<Vector3>;
    [SerializedVariableType.Vector4_Array]: VectorArray<Vector4>;
}
type SerializableVariable = Box3 | Color | Euler | Matrix4 | Plane | Quaternion | Ray | Sphere | Vector2 | Vector3 | Vector4;
export interface SerializedVariable<T extends SerializedVariableType> {
    type: SerializedVariableType;
    data: SerializedDataByType[T];
}
export declare function isVariableSerializable(variable: any): variable is SerializableVariable;
export declare function serializeVariable<T extends SerializedVariableType>(variable: VariableByType[T]): SerializedVariable<T>;
export declare function deserializeVariable<T extends SerializedVariableType>(serialized: SerializedVariable<T>): VariableByType[T];
export {};
