import { Vec3, IVec3, IVec2 } from '../math/Vec3';
import { Vec2 } from '../math/Vec2';
import { AxisPlane } from './trianglution';
import { IGeometry } from '../render/geometry';
import { ArrayList } from '../struct/data/ArrayList';
export interface ILinkSideOption {
    side0: {
        x: number;
        y: number;
        z: number;
        index?: number;
    }[] | number[];
    side1: {
        x: number;
        y: number;
        z: number;
        index?: number;
    }[] | number[];
    holes0?: Array<Array<Vec3>>;
    holes1?: Array<Array<Vec3>>;
    shapeClosed?: boolean;
    autoUV?: boolean;
    uvScalars?: number[];
    segs?: [];
}
/**
 *  常用shape几何操作
 */
/**
 * @description : 缝合两个边 不提供uv生成  uv有@linkSides 生成
 * @param        { ILinkSideOption } options
 * @returns      { Array<Vec3>} 三角形数组，每三个为一个三角形
 * @example     :
 */
export declare function linkSide(options: ILinkSideOption): number[];
/**
 * 缝合shape集合
 * @param {Array<Array<Point|Vec3>} shapes  路基 点集的集合， 每个shape的点数量一致
 * @param {Boolean} sealStart 每一个shape是否是封闭的界面 默认false
 * @param {Boolean} isClosed 每一个shape是否是封闭的界面 默认false
 * @param {Boolean} isClosed2 每一个shape是否是封闭的首尾 默认false
 * @returns {Array} 返回三角形集合 如果有所用范围索引，否则返回顶点
 */
export interface ILinkSideOptions {
    shapes: Array<Array<IVec3 | any | IVec3>>;
    orgShape?: Array<IVec3 | any | IVec3>;
    orgHoles?: any;
    sealStart?: boolean;
    sealEnd?: boolean;
    shapeClosed?: boolean;
    pathClosed?: boolean;
    index?: {
        index: number;
    };
    autoIndex?: boolean;
    generateUV?: boolean;
    axisPlane?: AxisPlane;
    holes?: Array<Array<IVec3 | any | IVec3>>[];
}
/**
 * @description : 链接多个shape 生成几何体
 * @param        {ILinkSideOptions} optionsILinkSideOptions {
 *   shapes: Array<Array<IVec3 | number | any>>;
 *   sealStart?: boolean,//开始封面
 *   sealEnd?: boolean;//结束封面
 *   shapeClosed?: boolean,//shape是否闭合
 *   pathClosed?: boolean,//路径是否闭合
 *   index?: { index: number },
 *   generateUV?: boolean
 *   }
 *
 * @return       {*}
 * @example     :
 *
 */
export declare function linkSides(options: ILinkSideOptions): IGeometry;
export interface IExtrudeOptions {
    fixedY?: boolean;
    shapeClosed?: boolean;
    isClosed2?: boolean;
    textureEnable?: boolean;
    textureScale?: Vec2;
    smoothAngle?: number;
    sealStart?: boolean;
    sealEnd?: boolean;
    normal?: Vec3;
}
export interface IExtrudeOptionsEx {
    shape: Array<Vec3 | IVec3 | Vec2 | IVec2>;
    path: Array<Vec3 | IVec3>;
    ups?: Array<Vec3 | IVec3>;
    up?: Vec3 | IVec3;
    right?: Vec3;
    shapeClosed?: boolean;
    pathClosed?: boolean;
    textureEnable?: boolean;
    smoothAngle?: number;
    enableSmooth?: boolean;
    sealStart?: boolean;
    sealEnd?: boolean;
    normal?: Vec3;
    autoIndex?: boolean;
    axisPlane?: AxisPlane;
    generateUV?: boolean;
    index?: {
        index: number;
    };
    holes?: Array<Vec3 | IVec3 | Vec2 | IVec2>[];
}
/**
 * @description : 挤压形状生成几何体
 * @param        {IExtrudeOptionsEx} options
 *   IExtrudeOptionsEx {
 *    shape: Array<Vec3 | IVec3 | Vec2 | IVec2>;//shape默认的矩阵为正交矩阵
 *    path: Array<Vec3 | IVec3>;//挤压路径
 *    ups?: Array<Vec3 | IVec3>;
 *    up?: Vec3 | IVec3;
 *    shapeClosed?: boolean;//闭合为多边形 界面
 *    pathClosed?: boolean;//首尾闭合为圈
 *    textureEnable?: boolean;
 *    smoothAngle?: number;
 *    sealStart?: boolean;
 *    sealEnd?: boolean;
 *    normal?: Vec3,//面的法线
 *    autoIndex?: boolean,
 *    index?: { index: number }
 *    holes?: Array<Vec3 | IVec3 | Vec2 | IVec2>[]
 *}
 * @return       {IGeometry}
 * @example     :
 *
 */
export declare function extrude(options: IExtrudeOptionsEx): IGeometry;
/**
 * 挤压
 * @param {Polygon|Array<Point|Vec3> }  shape   多边形或顶点数组
 * @param {Path|Array<Point|Vec3> } path  路径或者或顶点数组
 * @param {Object} options {
 *      isClosed: false,闭合为多边形 界面
 *      isClosed2: false, 闭合为圈
 *      textureEnable: true, 计算纹理坐标
 *      textureScale: new Vec2(1, 1),纹理坐标缩放
 *      smoothAngle: Math.PI / 180 * 30,大于这个角度则不平滑
 *      sealStart: true, 是否密封开始面
 *      sealEnd: true,是否密封结束面}
 */
export declare function extrude_obsolete<T extends Vec3>(shape: ArrayList<T>, arg_path: Array<Vec3> | any, options?: IExtrudeOptions): {
    vertices: any[];
    index: number[] | undefined;
    uvs: any[];
};
export declare enum JoinType {
    Square = 0,
    Round = 1,
    Miter = 2,
    Bevel = 0
}
export declare enum EndType {
    Square = 0,
    Round = 1,
    Butt = 2,
    etClosedLine = 3,
    etClosedPolygon = 4,
    etOpenButt = 5,
    etOpenSquare = 6
}
export interface IExtrudeOptionsNext {
    shape: Array<Vec3>;
    path: Array<Vec3 | IVec3>;
    up?: Array<Vec3 | IVec3> | Vec3 | IVec3;
    right?: Array<Vec3> | Vec3;
    shapeClosed?: boolean;
    pathClosed?: boolean;
    textureEnable?: boolean;
    shapeCenter?: Vec3;
    smoothAngle?: number;
    enableSmooth?: boolean;
    sealStart?: boolean;
    sealEnd?: boolean;
    normal?: Vec3;
    autoIndex?: boolean;
    axisPlane?: AxisPlane;
    generateUV?: boolean;
    index?: {
        index: number;
    };
    holes?: Array<Vec3 | IVec3 | Vec2 | IVec2>[];
    jtType?: JoinType;
    etType?: EndType;
    bevelSize?: any;
}
/**
 * 将路径看做挤压操作中心
 *
 * @param shape
 * @param followPath
 * @param options
 */
export declare function extrudeNext(options: IExtrudeOptionsNext): IGeometry;
