import { Number2 } from '../../types/GlobalTypes';
import { Object3D, LineSegments, InstancedMesh, Mesh, Points, Group, Scene } from 'three';
import type { AmbientLight, CubeCamera, DirectionalLight, HemisphereLight, LightProbe, Material, LOD, OrthographicCamera, PerspectiveCamera, PointLight, RectAreaLight, SpotLight } from 'three';
import { GroupCollectionData } from './EntityGroupCollection';
import { CoreObjectType, ObjectContent } from './ObjectContent';
import type { PhysicalCamera, ShapedAreaLight, PhysicalSpotLight } from '../render/PBR/three-gpu-pathtracer';
interface MaterialsByString {
    [propName: string]: Material;
}
export declare enum ObjectType {
    AMBIENT_LIGHT = "AmbientLight",
    AREA_LIGHT = "AreaLight",
    CUBE_CAMERA = "CubeCamera",
    DIRECTIONAL_LIGHT = "DirectionalLight",
    GROUP = "Group",
    HEMISPHERE_LIGHT = "HemisphereLight",
    INSTANCED_MESH = "InstancedMesh",
    LIGHT_PROBE = "LightProbe",
    LINE_SEGMENTS = "LineSegments",
    LOD = "LOD",
    MESH = "Mesh",
    OBJECT3D = "Object3D",
    ORTHOGRAPHIC_CAMERA = "OrthographicCamera",
    PERSPECTIVE_CAMERA = "PerspectiveCamera",
    PHYSICAL_CAMERA = "PhysicalCamera",
    PHYSICAL_SPOT_LIGHT = "PhysicalSpotLight",
    POINT_LIGHT = "PointLight",
    POINTS = "Points",
    SCENE = "Scene",
    SHAPED_AREA_LIGHT = "ShapedAreaLight",
    SPOT_LIGHT = "SpotLight",
    UNKNOWN = "Unknown",
    QUAD = "Quad"
}
export declare const OBJECT_TYPES: ObjectType[];
interface ObjectContentConstructor<T extends CoreObjectType> {
    new (arg0: any, arg1?: any, arg2?: any): ObjectContent<T>;
}
export type DefaultObjectContentConstructor = ObjectContentConstructor<CoreObjectType>;
export interface ObjectByObjectType {
    [ObjectType.AMBIENT_LIGHT]: AmbientLight;
    [ObjectType.AREA_LIGHT]: RectAreaLight;
    [ObjectType.CUBE_CAMERA]: CubeCamera;
    [ObjectType.DIRECTIONAL_LIGHT]: DirectionalLight;
    [ObjectType.GROUP]: Group;
    [ObjectType.HEMISPHERE_LIGHT]: HemisphereLight;
    [ObjectType.INSTANCED_MESH]: InstancedMesh;
    [ObjectType.LIGHT_PROBE]: LightProbe;
    [ObjectType.LINE_SEGMENTS]: LineSegments;
    [ObjectType.LOD]: LOD;
    [ObjectType.MESH]: Mesh;
    [ObjectType.OBJECT3D]: Object3D;
    [ObjectType.POINT_LIGHT]: PointLight;
    [ObjectType.POINTS]: Points;
    [ObjectType.ORTHOGRAPHIC_CAMERA]: OrthographicCamera;
    [ObjectType.PERSPECTIVE_CAMERA]: PerspectiveCamera;
    [ObjectType.PHYSICAL_CAMERA]: PhysicalCamera;
    [ObjectType.PHYSICAL_SPOT_LIGHT]: PhysicalSpotLight;
    [ObjectType.SCENE]: Scene;
    [ObjectType.SHAPED_AREA_LIGHT]: ShapedAreaLight;
    [ObjectType.SPOT_LIGHT]: SpotLight;
    [ObjectType.UNKNOWN]: null;
    [ObjectType.QUAD]: null;
}
export interface ObjectData {
    type: ObjectType;
    name: string | null;
    childrenCount: number;
    groupData: GroupCollectionData;
    verticesCount: number;
    pointsCount: number;
    primitivesCount: number;
    primitiveName: string;
}
type ObjectTypeCheckFunction = (object: ObjectContent<CoreObjectType>) => ObjectType | undefined;
export interface ObjectTypeData {
    type: ObjectType;
    checkFunc: ObjectTypeCheckFunction;
    ctor: DefaultObjectContentConstructor;
    humanName: string;
}
export declare function registerObjectType(data: ObjectTypeData): void;
export declare function objectTypeFromObject(object: ObjectContent<CoreObjectType>): ObjectType;
export declare function dataFromObject(object: ObjectContent<CoreObjectType>): ObjectTypeData;
export declare function objectConstructorByObjectType<O extends ObjectType>(objectType: O): ObjectByObjectType[O];
export declare const DEFAULT_MATERIALS: MaterialsByString;
export declare enum AttribClass {
    POINT = "point",
    VERTEX = "vertex",
    PRIMITIVE = "primitive",
    OBJECT = "object",
    CORE_GROUP = "coreGroup"
}
export declare const ATTRIBUTE_CLASSES: Array<AttribClass>;
export declare const ATTRIBUTE_CLASSES_WITHOUT_CORE_GROUP: Array<AttribClass>;
export declare const AttribClassMenuEntries: {
    name: AttribClass;
    value: number;
}[];
export declare const AttribClassMenuEntriesWithoutCoreGroup: {
    name: AttribClass;
    value: number;
}[];
export declare enum AttribType {
    NUMERIC = "numeric",
    STRING = "string"
}
export declare const ATTRIBUTE_TYPES: Array<AttribType>;
export declare const AttribTypeMenuEntries: {
    name: AttribType;
    value: number;
}[];
export declare enum AttribSize {
    FLOAT = 1,
    VECTOR2 = 2,
    VECTOR3 = 3,
    VECTOR4 = 4
}
export declare const ATTRIBUTE_SIZES: Array<AttribSize>;
export declare const ATTRIBUTE_SIZE_RANGE: Number2;
export declare enum ComponentName {
    x = "x",
    y = "y",
    z = "z",
    w = "w",
    r = "r",
    g = "g",
    b = "b"
}
export type ComponentIndex = 0 | 1 | 2 | 3;
export declare const COMPONENT_INDICES: Record<ComponentName, ComponentIndex>;
export declare const DOT = ".";
export type GroupString = string;
export {};
