/**
 * Copyright (c) 2018-2025 mol* contributors, licensed under MIT, See LICENSE file for more info.
 *
 * @author Alexander Rose <alexander.rose@weirdbyte.de>
 */
import { Color } from '../../mol-util/color/index.js';
import { UUID } from '../../mol-util/index.js';
import { OrderedSet } from '../../mol-data/int.js';
import { Geometry } from '../../mol-geo/geometry/geometry.js';
import { Mat4 } from '../../mol-math/linear-algebra.js';
import { Sphere3D } from '../../mol-math/geometry.js';
import { Theme } from '../../mol-theme/theme.js';
import { TransformData } from '../../mol-geo/geometry/transform-data.js';
import { ParamDefinition as PD } from '../../mol-util/param-definition.js';
import { LocationIterator } from '../../mol-geo/util/location-iterator.js';
export interface Shape<G extends Geometry = Geometry> {
    /** A uuid to identify a shape object */
    readonly id: UUID;
    /** A name to describe the shape */
    readonly name: string;
    /** The data used to create the shape */
    readonly sourceData: unknown;
    /** The geometry of the shape, e.g. `Mesh` or `Lines` */
    readonly geometry: G;
    /** An array of transformation matrices to describe multiple instances of the geometry */
    readonly transforms: Mat4[];
    /** Number of groups in the geometry */
    readonly groupCount: number;
    /** Get color for a given group */
    getColor(groupId: number, instanceId: number): Color;
    /** Get size for a given group */
    getSize(groupId: number, instanceId: number): number;
    /** Get label for a given group */
    getLabel(groupId: number, instanceId: number): string;
}
export declare namespace Shape {
    function create<G extends Geometry>(name: string, sourceData: unknown, geometry: G, getColor: Shape['getColor'], getSize: Shape['getSize'], getLabel: Shape['getLabel'], transforms?: Mat4[], groupCount?: number): Shape<G>;
    function getTheme(shape: Shape): Theme;
    function groupIterator(shape: Shape): LocationIterator;
    function createTransform(transforms: Mat4[], invariantBoundingSphere: Sphere3D, cellSize: number, batchSize: number, transformData?: TransformData): TransformData;
    function createRenderObject<G extends Geometry>(shape: Shape<G>, props: PD.Values<Geometry.Params<G>>): import("../../mol-gl/render-object.js").GraphicsRenderObject<"text" | "image" | "points" | "spheres" | "cylinders" | "lines" | "mesh" | "direct-volume" | "texture-mesh">;
    interface Loci {
        readonly kind: 'shape-loci';
        readonly shape: Shape;
    }
    function Loci(shape: Shape): Loci;
    function isLoci(x: any): x is Loci;
    function areLociEqual(a: Loci, b: Loci): boolean;
    function isLociEmpty(loci: Loci): boolean;
}
export declare namespace ShapeGroup {
    interface Location {
        readonly kind: 'group-location';
        shape: Shape;
        group: number;
        instance: number;
    }
    function Location(shape?: Shape, group?: number, instance?: number): Location;
    function isLocation(x: any): x is Location;
    interface Loci {
        readonly kind: 'group-loci';
        readonly shape: Shape;
        readonly groups: ReadonlyArray<{
            readonly ids: OrderedSet<number>;
            readonly instance: number;
        }>;
    }
    function Loci(shape: Shape, groups: Loci['groups']): Loci;
    function isLoci(x: any): x is Loci;
    function areLociEqual(a: Loci, b: Loci): boolean;
    function isLociEmpty(loci: Loci): boolean;
    function size(loci: Loci): number;
    function getBoundingSphere(loci: Loci, boundingSphere?: Sphere3D): Sphere3D;
}
