import { Curve, Vector3 } from "three";
import { type ComputeCurveFrenetFramesOptions, type IVector3, CreateLineConnectionOptions, LineConnectionType } from "@three3d/tools";
import { PathGeometry, type PathGeometryOptions } from "./PathGeometry";
import { PathData, PathItem } from "./tools";
import type { Point_Length_FrenetFrames, FrenetFrames } from "@three3d/tools";
export declare enum PathDrawType {
    /**
     * 以曲线的方式来绘制
     */
    curve = "curve",
    /**
     * 以折线的方式来绘制
     */
    polyline = "polyline",
    /**
     * 使用混合的方式来绘制
     * @remarks
     * 会根据组成曲线的各个子曲线的具体类型来分别绘制各个子曲线
     */
    blend = "blend"
}
/**
 * BandGeometry的选项
 */
export interface BandGeometryOptions extends PathGeometryOptions, CreateLineConnectionOptions, Omit<ComputeCurveFrenetFramesOptions, "closed"> {
    /**
     * 起点处的向上的方向 { x: 0, y: 1, z: 0 }
     * @defaultValue
     */
    up?: IVector3;
    /**
     * uv的步长
     *
     * @defaultValue 1
     */
    uvStep?: number;
    /**
     * CurvePath 的绘制类型
     * @defaultValue BandDrawType.blend
     */
    drawType?: PathDrawType;
    /**
     * 被视为转角的最小角度
     */
    minCorner?: number;
}
export interface CreateBandGeometryDataOptions extends Omit<BandGeometryOptions, "startLength" | "up"> {
    /**
     * 起点处的向上的方向
     */
    up: Vector3;
    /**
     * 上一个点的索引
     * @remarks
     * 索引从哪里开始
     */
    preIndex?: number;
    /**
     * 上一个顶点
     */
    prePoint?: Vector3 | null;
    /**
     * 上一个点的长度
     */
    preLength?: number;
    /**
     * 是否拼接以前的索引
     */
    connectPre?: boolean | null;
}
/**
 * 根据曲线生成 BandGeometry 所需要的数据
 * @param curve
 * @param options
 * @returns
 */
export declare function createCurveBandGeometryData(curve: Curve<Vector3>, options: CreateBandGeometryDataOptions): {
    position: number[];
    normal: number[];
    uv: number[];
    index: number[];
    color: number[];
    lineDistance: number[];
    lengths: number[];
    points: Vector3[];
    tangents: Vector3[];
    normals: Vector3[];
    binormals: Vector3[];
};
export type FrenetFramesOfCreateCurveBandGeometryData = FrenetFrames & {
    points: Vector3[];
    length: number;
};
export declare function createCurveBandGeometryDataByFrenetFrames(frenetFrames: FrenetFramesOfCreateCurveBandGeometryData, options: CreateBandGeometryDataOptions): {
    position: number[];
    normal: number[];
    uv: number[];
    index: number[];
    color: number[];
    lineDistance: number[];
    lengths: number[];
    points: Vector3[];
    tangents: Vector3[];
    normals: Vector3[];
    binormals: Vector3[];
};
/**
 * 根据折线生成 BandGeometry 所需要的数据
 * @param points
 * @param options
 * @returns
 */
export declare function createPolylineBandGeometryData(points: Vector3[], options: CreateBandGeometryDataOptions): {
    position: number[];
    normal: number[];
    uv: number[];
    color: number[];
    index: number[];
    lineDistance: number[];
    length: number;
    lengths: number[];
    points: Vector3[];
    tangents: Vector3[];
    normals: Vector3[];
    binormals: Vector3[];
};
/**
 * 根据折线的 frenetFrames 生成 BandGeometry 所需要的数据
 * @param points
 * @param options
 * @returns
 */
export declare function createPolylineBandGeometryDataByFrenetFrames(frenetFrames: Point_Length_FrenetFrames, options: CreateBandGeometryDataOptions): {
    position: number[];
    normal: number[];
    uv: number[];
    color: number[];
    index: number[];
    lineDistance: number[];
    length: number;
    lengths: number[];
    points: Vector3[];
    tangents: Vector3[];
    normals: Vector3[];
    binormals: Vector3[];
};
export type BandGeometryData = ReturnType<typeof createCurveBandGeometryData>;
/**
 * 长度连接类型
 */
export declare enum LengthConnectType {
    /**
     * 保持原样
     */
    intact = "intact",
    /**
     * 累加
     */
    add = "add",
    /**
     * 累加，并将间隔计算进去
     */
    addGap = "addGap"
}
/**
 * 连接两个 BandGeometryData
 * @param frontData
 * @param backData
 * @param options
 * @param lengthConnectType - 长度的连接类型
 * @returns
 */
export declare function connectBandGeometryData(frontData: BandGeometryData, backData: BandGeometryData, options: CreateBandGeometryDataOptions, lengthConnectType?: LengthConnectType): {
    position: number[];
    normal: number[];
    uv: number[];
    color: number[];
    lineDistance: number[];
    index: number[];
    points: Vector3[];
    lengths: number[];
    length: number;
    tangents: Vector3[];
    normals: Vector3[];
    binormals: Vector3[];
};
/**
 * 根据 pathData 创建混合方式的 BandGeometry 所需要的数据
 * @param pathData
 * @param options
 * @param preGeoData
 * @returns
 */
export declare function createBlendBandGeometryData(pathData: PathData, options: CreateBandGeometryDataOptions, preGeoData?: BandGeometryData | null): {
    position: number[];
    normal: number[];
    uv: number[];
    index: number[];
    color: number[];
    lineDistance: number[];
    lengths: number[];
    points: Vector3[];
    tangents: Vector3[];
    normals: Vector3[];
    binormals: Vector3[];
};
/**
 * 带状几何体
 * @remarks
 * 可根据曲线、折线点来生成带状几何体；
 * 支持路径追加；
 * 支持设置起始长度
 * 支持起始-终点颜色渐变
 * 支持绘制的指定的长度区间
 * 支持设置宽度
 * 支持设置带状几何体起始位置处的向上方向
 */
export declare class BandGeometry extends PathGeometry<BandGeometryOptions> {
    readonly isBandGeometry = true;
    static options: BandGeometryOptions;
    constructor(options?: BandGeometryOptions);
    /**
     * 起点处的向上的方向 { x: 0, y: 1, z: 0 }
     * @defaultValue
     */
    get up(): IVector3;
    set up(value: IVector3);
    /**
     * 是否固定 up；保证up不变
     * @defaultValue false
     */
    get fixUp(): boolean;
    set fixUp(value: boolean);
    /**
     * 是否固定 up；保证up不变
     * @defaultValue false
     */
    get useU(): boolean;
    set useU(value: boolean);
    /**
     * uv的步长
     *
     * @defaultValue 1
     */
    get uvStep(): number;
    set uvStep(value: number);
    /**
     * CurvePath 的绘制类型
     * @defaultValue BandDrawType.blend
     */
    get drawType(): PathDrawType;
    set drawType(value: PathDrawType);
    /**
     * 线的衔接类型
     * @defaultValue LineConnectionType.round
     */
    get connectionType(): LineConnectionType;
    set connectionType(value: LineConnectionType);
    /**
     * 圆形衔接角的长度步长
     * @remarks
     * 与 smoothStepAngle 作用相同
     * smoothStepAngle 的优先级高于 smoothStepLength
     */
    get smoothStepLength(): number | undefined;
    set smoothStepLength(value: number | undefined);
    /**
     * 圆形衔接角的步长角
     * @remarks
     * 与 smoothStepLength 作用相同
     * smoothStepAngle 的优先级高于 smoothStepLength
     * @defaultValue LineConnectionType.round
     */
    get smoothStepAngle(): number | undefined;
    set smoothStepAngle(value: number | undefined);
    append(pathItem: PathItem): void;
    updateGeometry(): void;
    /**
     * 几何体的数据
     */
    get geometryData(): {
        position: number[];
        normal: number[];
        uv: number[];
        index: number[];
        color: number[];
        lineDistance: number[];
        lengths: number[];
        points: Vector3[];
        tangents: Vector3[];
        normals: Vector3[];
        binormals: Vector3[];
    } | null;
    /**
      * 未闭合的几何体的数据
      */
    get openedGeometryData(): BandGeometryData | null;
    frenetFrames: Point_Length_FrenetFrames | null;
    /**
     * 重围所有的 Attributes
     * @param attrs
     */
    resetAttributes(attrs: BandGeometryData): void;
    /**
     * 获取顶点索引对应的分段索引
     * @remarks
     * 分段指的是沿路径的方向上的分段
     * @param vertexIndex
     * @returns
     */
    getDivisionIndex(vertexIndex: number): number;
    /**
    * 设置绘制的长度范围
    * @param startLength
    * @param endLength
    */
    setDrawLength(startLength: number, endLength?: number | null): void;
}
//# sourceMappingURL=BandGeometry.d.ts.map