/**
 * Copyright (c) 2018-2025 mol* contributors, licensed under MIT, See LICENSE file for more info.
 *
 * @author Alexander Rose <alexander.rose@weirdbyte.de>
 * @author Zhenyu Zhang <jump2cn@gmail.com>
 * @author Gianluca Tomasello <giagitom@gmail.com>
 * @author David Sehnal <david.sehnal@gmail.com>
 * @author Herman Bergwerf <post@hbergwerf.nl>
 */
import { Vec3 } from '../../../../mol-math/linear-algebra.js';
import { ParamDefinition as PD } from '../../../../mol-util/param-definition.js';
import { Mesh } from '../../../../mol-geo/geometry/mesh/mesh.js';
import { MeshBuilder } from '../../../../mol-geo/geometry/mesh/mesh-builder.js';
import { VisualContext } from '../../../visual.js';
import { Lines } from '../../../../mol-geo/geometry/lines/lines.js';
import { Cylinders } from '../../../../mol-geo/geometry/cylinders/cylinders.js';
import { Sphere3D } from '../../../../mol-math/geometry/primitives/sphere3d.js';
export declare const LinkCylinderParams: {
    linkScale: PD.Numeric;
    linkSpacing: PD.Numeric;
    linkCap: PD.BooleanParam;
    aromaticScale: PD.Numeric;
    aromaticSpacing: PD.Numeric;
    aromaticDashCount: PD.Numeric;
    dashCount: PD.Numeric;
    dashScale: PD.Numeric;
    dashCap: PD.BooleanParam;
    stubCap: PD.BooleanParam;
    radialSegments: PD.Numeric;
    colorMode: PD.Select<"default" | "interpolate">;
};
export declare const DefaultLinkCylinderProps: PD.Values<{
    linkScale: PD.Numeric;
    linkSpacing: PD.Numeric;
    linkCap: PD.BooleanParam;
    aromaticScale: PD.Numeric;
    aromaticSpacing: PD.Numeric;
    aromaticDashCount: PD.Numeric;
    dashCount: PD.Numeric;
    dashScale: PD.Numeric;
    dashCap: PD.BooleanParam;
    stubCap: PD.BooleanParam;
    radialSegments: PD.Numeric;
    colorMode: PD.Select<"default" | "interpolate">;
}>;
export type LinkCylinderProps = typeof DefaultLinkCylinderProps;
export declare const LinkLineParams: {
    linkScale: PD.Numeric;
    linkSpacing: PD.Numeric;
    aromaticDashCount: PD.Numeric;
    dashCount: PD.Numeric;
};
export declare const DefaultLinkLineProps: PD.Values<{
    linkScale: PD.Numeric;
    linkSpacing: PD.Numeric;
    aromaticDashCount: PD.Numeric;
    dashCount: PD.Numeric;
}>;
export type LinkLineProps = typeof DefaultLinkLineProps;
/** Calculate 'shift' direction that is perpendiculat to v1 - v2 and goes through v3 */
export declare function calculateShiftDir(out: Vec3, v1: Vec3, v2: Vec3, v3: Vec3 | null): Vec3;
export interface LinkBuilderProps {
    linkCount: number;
    position: (posA: Vec3, posB: Vec3, edgeIndex: number, adjust: boolean) => void;
    radius: (edgeIndex: number) => number;
    referencePosition?: (edgeIndex: number) => Vec3 | null;
    style?: (edgeIndex: number) => LinkStyle;
    ignore?: (edgeIndex: number) => boolean;
    stub?: (edgeIndex: number) => boolean;
}
export declare const EmptyLinkBuilderProps: LinkBuilderProps;
export declare const enum LinkStyle {
    Solid = 0,
    Dashed = 1,
    Double = 2,
    OffsetDouble = 3,
    Triple = 4,
    OffsetTriple = 5,
    Disk = 6,
    Aromatic = 7,
    MirroredAromatic = 8
}
/**
 * Each edge is included twice to allow for coloring/picking
 * the half closer to the first vertex, i.e. vertex a.
 */
export declare function createLinkCylinderMesh(ctx: VisualContext, linkBuilder: LinkBuilderProps, props: LinkCylinderProps, mesh?: Mesh): {
    mesh: Mesh;
    boundingSphere?: Sphere3D;
};
export interface AddLinkOptions {
    builderState: MeshBuilder.State;
    props: LinkCylinderProps;
    assignNonAdjustedPosition?: (posA: Vec3, posB: Vec3) => void;
    referencePosition?: () => Vec3 | null;
}
export interface AddLinkParams {
    linkStub: boolean;
    linkRadius: number;
    linkStyle: LinkStyle;
    a: Vec3;
    b: Vec3;
    group: number;
}
export declare function addLinkCylinderMesh(options: AddLinkOptions, params: AddLinkParams): void;
/**
 * Each edge is included twice to allow for coloring/picking
 * the half closer to the first vertex, i.e. vertex a.
 */
export declare function createLinkCylinderImpostors(ctx: VisualContext, linkBuilder: LinkBuilderProps, props: LinkCylinderProps, cylinders?: Cylinders): {
    cylinders: Cylinders;
    boundingSphere?: Sphere3D;
};
/**
 * Each edge is included twice to allow for coloring/picking
 * the half closer to the first vertex, i.e. vertex a.
 */
export declare function createLinkLines(ctx: VisualContext, linkBuilder: LinkBuilderProps, props: LinkLineProps, lines?: Lines): {
    lines: Lines;
    boundingSphere?: Sphere3D;
};
