UNPKG

@three3d/effect

Version:

@three3d/effect 提供了 ThreeJS 的特效

855 lines (800 loc) 24.9 kB
/** * ThreeJS的特效库 * * @remarks * ThreeJS 的一些特效 * * @packageDocumentation */ import { BufferGeometry } from 'three'; import { ColorRepresentation } from 'three'; import { ComputeCurveFrenetFramesOptions } from '@three3d/tools'; import { CreateLineConnectionOptions } from '@three3d/tools'; import { Curve } from 'three'; import { CurvePath } from 'three'; import type { FrenetFrames } from '@three3d/tools'; import type { IUniform } from 'three'; import { IVector3 } from '@three3d/tools'; import { LineConnectionType } from '@three3d/tools'; import type { Material } from 'three'; import type { Point_Length_FrenetFrames } from '@three3d/tools'; import type { SampleOptions } from '@three3d/tools'; import { Shader } from 'three'; import { Vector2 } from 'three'; import { Vector3 } from 'three'; import { WebGLRenderer } from 'three'; export declare function addUniformPropertiesOnMaterial<M extends Material, U extends Record<string, any>>(material: M, uniforms: U, shaderUniforms?: Record<string, IUniform<any>>): ModifiedMaterial<M, U>; export declare function addUniforms<U extends Record<string, any>>(shaderUniforms: Record<string, IUniform<any>>, uniforms: U): Record<string, IUniform<any>>; /** * 带状几何体 * @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; } export declare type BandGeometryData = ReturnType<typeof createCurveBandGeometryData>; /** * BandGeometry的选项 */ export declare 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; } /** * 连接两个 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[]; }; export declare interface CreateBandGeometryDataOptions extends Omit<BandGeometryOptions, "startLength" | "up"> { /** * 起点处的向上的方向 */ up: Vector3; /** * 上一个点的索引 * @remarks * 索引从哪里开始 */ preIndex?: number; /** * 上一个顶点 */ prePoint?: Vector3 | null; /** * 上一个点的长度 */ preLength?: number; /** * 是否拼接以前的索引 */ connectPre?: boolean | null; } /** * 根据 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[]; }; /** * 根据曲线生成 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 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[]; }; /** * 创建 onBeforeCompile 函数 * @param mender * @param uniforms * @returns */ export declare function createOnBeforeCompile<U extends Record<string, any>>(mender: OnBeforeCompile, uniforms?: U, material?: Material): (shader: Shader, renderer: WebGLRenderer) => void; /** * 根据折线生成 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[]; }; /** * 根据折线创建用于 PathGeometry 的数据 * @param points * @param options * @returns */ export declare function createPolylinePathGeometryData(points: Vector3[], options?: PathGeometryOptions | null): { color: number[]; position: number[]; lineDistance: number[]; lengths: number[]; points: Vector3[]; }; export declare type FrenetFramesOfCreateCurveBandGeometryData = FrenetFrames & { points: Vector3[]; length: number; }; /** * 获取与 target 最近的索引 * @param sortedNums - 按照从小到大顺序数字数组 * @param target - 目标值 * @returns */ export declare function getClosestIndex(sortedNums: ArrayLike<number>, target: number): number; /** * 获取曲线的点 * @param curve * @param options * @returns */ export declare function getCurvePoints(curve: Curve<Vector3>, options?: SampleOptions): Vector3[]; /** * 获取 target 附近的索引 * @param sortedNums - 按照从小到大顺序数字数组 * @param target - 目标值 * @param right - 是否获取目标值右侧的索引; * @returns 当返回 -1 时,表示没找到 */ export declare function getNearbyIndex(sortedNums: ArrayLike<number>, target: number, right?: boolean): number; /** * 获取 PathItem 的终点 * @param pathData * @returns */ export declare function getPathItemEndPoint(pathItem: PathItem): Vector3; /** * 获取 PathItem 的起始点 * @param pathData * @returns */ export declare function getPathItemStartPoint(pathItem: PathItem): Vector3; /** * 保存顶点长度的 AttributeName */ export declare const lengthAttributeName = "lineDistance"; /** * 长度连接类型 */ export declare enum LengthConnectType { /** * 保持原样 */ intact = "intact", /** * 累加 */ add = "add", /** * 累加,并将间隔计算进去 */ addGap = "addGap" } /** * lengthDrawRange 的片元着色器中增加的核心代码 */ export declare const lengthDrawRange_fragment_mainReplace = "\nuniform bool invert;\nuniform bool enableStart;\nuniform bool enableEnd;\n\nuniform float startLength;\nuniform float endLength;\nvoid main() {\n bool startDiscard = enableStart && vLineDistance < startLength;\n bool endDiscard = enableEnd && vLineDistance > endLength;\n bool isDiscard = startDiscard || endDiscard;\n if (invert){\n isDiscard = !isDiscard;\n }\n if (isDiscard) discard;\n"; /** * 针对于一切带有 lineDistance attribute 的几何体的材质的片元着色器增加的代码片段 * @remarks * 对于除 LineDashedMaterial 之外的材质的顶点着色器增加的代码 */ export declare const lengthDrawRange_fragment_pars_mainReplace = "\nvarying float vLineDistance;\n"; /** * 针对于一切带有 lineDistance attribute 的几何体的材质的 shader 的修改器 * @remarks * Mender 都是用于 `createOnBeforeCompile` 方法的 * 对于除 LineDashedMaterial 之外的材质的顶点着色器增加的代码 * @param shader */ export declare function lengthDrawRange_Mender(shader: Shader): void; /** * 针对于一切带有 lineDistance attribute 的几何体的材质的 onBeforeCompile 函数 */ export declare const lengthDrawRange_onBeforeCompile: OnBeforeCompile; /** * lengthDrawRange 增加的 uniforms */ export declare const lengthDrawRange_uniforms: { invert: boolean; enableStart: boolean; enableEnd: boolean; startLength: number; endLength: number; }; /** * 针对于一切带有 lineDistance attribute 的几何体的材质的顶点着色器增加的代码 * @remarks * 对于除 LineDashedMaterial 之外的材质的顶点着色器增加的代码 */ export declare const lengthDrawRange_vertex_mainReplace = "\nattribute float lineDistance;\nvarying float vLineDistance;\nvoid main() {\n vLineDistance = lineDistance;\n"; /** * 用于一切带有 lineDistance attribute 的几何体的材质的长度范围渲染的材质修改器 * @remarks * 材质被修改后可具备设置渲染指定长度范围内的线的功能 * @param material * @returns */ export declare function lengthDrawRangeModifier<M extends Material>(material: M): ModifiedMaterial<M, { invert: boolean; enableStart: boolean; enableEnd: boolean; startLength: number; endLength: number; }>; /** * 用于线性几何体的属性数据 */ export declare interface LineAttributesData { position: number[]; lineDistance: number[]; lengths: number[]; color?: number[]; } /** * 针对于 LineDashedMaterial 材质的 shader 的修改器 * @remarks * Mender 都是用于 `createOnBeforeCompile` 方法的 * @param shader */ export declare function lineDashedLengthDrawRange_Mender(shader: Shader): void; /** * 针对于 LineDashedMaterial 材质的 onBeforeCompile 函数 */ export declare const lineDashedLengthDrawRange_onBeforeCompile: OnBeforeCompile; /** * 用于Mesh几何体的属性数据 */ export declare interface MeshAttributesData extends LineAttributesData { normal?: number[]; uv?: number[]; index?: number[]; points: Vector3[]; } export declare const minFun_Regex: RegExp; export declare type ModifiedMaterial<M extends Material, U extends Record<string, any>> = M & { uniforms: RecordToUniforms<U>; } & U; export declare type OnBeforeCompile = Material["onBeforeCompile"]; export declare type PathData<Vec extends Vector3 | Vector2 = Vector3> = PathItem<Vec>[]; /** * 路径数据转连续曲线 * @remarks * 保证转换后的所有曲线段是首尾相接的 * @param pathData * @returns */ export declare function pathDataToContinuousCurves<Vec extends Vector3 | Vector2>(pathData: PathData<Vec>): Curve<Vec>[]; /** * 路径数据转曲线 * @remarks * 只是将 pathData 中所描述的曲线段数据转成对应的曲线; * 不保证转换后的所有曲线段是首尾相接的; * @param pathData * @returns */ export declare function pathDataToCurves<Vec extends Vector3 | Vector2>(pathData: PathData<Vec>): Curve<Vec>[]; export declare enum PathDrawType { /** * 以曲线的方式来绘制 */ curve = "curve", /** * 以折线的方式来绘制 */ polyline = "polyline", /** * 使用混合的方式来绘制 * @remarks * 会根据组成曲线的各个子曲线的具体类型来分别绘制各个子曲线 */ blend = "blend" } /** * 路径Geometry * @remarks * 可根据曲线、点来生成路径几何体; * 支持路径追加; * 支持设置起始长度 * 支持起始-终点颜色渐变 * 支持绘制的指定的长度区间 * */ export declare class PathGeometry<Options extends PathGeometryOptions> extends BufferGeometry { readonly isPathGeometry = true; constructor(options?: Options); /** * 全局选项 * @remarks * 类级别的选项,对所有后续创建的实例有效; * 优化级低于实例级别的选项 * * @defaultValue default_PathGeometryOptions */ static options: PathGeometryOptions; /** * 全局选项 */ get globalOptions(): Options; protected _options: Options | null; /** * 实例级别的选项 * @remarks * 优先级高于 类级别的选项 */ get options(): Options; set options(value: Options); /** * 路径的宽度 */ get width(): number; set width(value: number); /** * 采样长度 */ get sampleLength(): number; set sampleLength(value: number); /** * 采样数 */ get sampleNum(): number | undefined; set sampleNum(value: number | undefined); /** * 是否自动闭合 */ get autoClose(): boolean | undefined; set autoClose(value: boolean | undefined); /** * 当前是否已经闭合 */ get closed(): boolean; /** * 线的颜色 * @remarks * 顶点颜色 */ get color(): ColorRepresentation | null | undefined; set color(value: ColorRepresentation | null | undefined); /** * 线开始处的颜色 * @remarks * 用于生成路径的从开始颜色到结束颜色的过渡颜色 * * @defaultValue this.color */ get startColor(): ColorRepresentation | null; set startColor(value: ColorRepresentation | null); /** * 终点处的颜色 * @remarks * 用于生成路径的从开始颜色到结束颜色的过渡颜色 * * @defaultValue this.color */ get endColor(): ColorRepresentation | null; set endColor(value: ColorRepresentation | null); /** * 路径起始位置处的长度 */ get startLength(): number; set startLength(value: number); /** * 终点位置处的长度 */ get endLength(): number; /** * 获取顶点对应的长度的数组 */ get lineDistance(): ArrayLike<number>; /** * 获取与指定长度值最近的索引 * @param length - 目标长度值 * @returns */ getClosestIndex(length: number): number; /** * 获取目标长度值附近的索引 * @param length - 目标长度值 * @param right - 是否获取目标值右侧的索引; * @returns 当返回 -1 时,表示没找到 */ getNearbyIndex(length: number, right?: boolean): number; /** * 设置绘制的长度范围 * @param startLength * @param endLength */ setDrawLength(startLength: number, endLength?: number | null): void; protected _startDrawLength: number; /** * 开始绘制的长度范围 */ get startDrawLength(): number; set startDrawLength(value: number); protected _endDrawLength: number | null; /** * 结束绘制的长度范围 */ get endDrawLength(): number; set endDrawLength(value: number); copy(source: BufferGeometry): this; /** * 顶点个数 */ get vertexCount(): number; /** * 路径数据 */ get pathData(): PathData<Vector3>; set pathData(value: PathData<Vector3>); protected _pathData: PathData<Vector3>; get closedPathData(): PathData<Vector3>; /** * 组成路径的曲线列表 */ get curves(): Curve<Vector3>[]; set curves(value: Curve<Vector3>[]); protected _curves: Curve<Vector3>[]; /** * 表示路径的曲线 */ get curvePath(): CurvePath<Vector3>; set curvePath(value: CurvePath<Vector3>); protected _curvePath: CurvePath<Vector3>; /** * 闭合的曲线路径 */ get closedCurvePath(): CurvePath<Vector3>; /** * 生成曲线 * @returns */ generateCurvePath(): CurvePath<Vector3>; /** * 所有的顶点 */ points: Vector3[]; /** * 曲线上生成的点 */ lengths: number[]; /** * 线性几何体本身的长度 */ get length(): number; /** * curvePath 上的最后一个点 */ get lastPoint(): Vector3; /** * curvePath 上的第一个点 */ get firstPoint(): Vector3; append(pathItem: PathItem): void; set(pathItem: PathItem): void; updateGeometry(): void; /** * 追加新的属性 * @param attrs */ appendAttributes(attrs: MeshAttributesData): void; /** * 重围所有的 Attributes * @param attrs */ resetAttributes(attrs: MeshAttributesData): void; /** * position 属性中的最后一个点 */ get lastPosition(): Vector3 | null; } /** * PathGeometry 的 选项 */ export declare interface PathGeometryOptions extends SampleOptions { /** * 路径的宽度 */ width?: number; /** * 路径起始位置处的长度 */ startLength?: number; /** * 是否自动闭合 */ autoClose?: boolean; /** * 线的颜色 * @remarks * 顶点颜色 */ color?: ColorRepresentation | null; /** * 线开始处的颜色 * @remarks * 用于生成路径的从开始颜色到结束颜色的过渡颜色 * * @defaultValue this.color */ startColor?: ColorRepresentation | null; /** * 终点处的颜色 * @remarks * 用于生成路径的从开始颜色到结束颜色的过渡颜色 * * @defaultValue this.color */ endColor?: ColorRepresentation | null; } export declare type PathItem<Vec extends Vector3 | Vector2 = Vector3> = Curve<Vec> | PolylinePoints<Vec> | Vec; /** * pathItem 转 曲线 * @param item * @param lastPoint * @param continuous - 是否生成连续的曲线;如果是,则会连接 lastPoint 和 曲线开始点 * @returns */ export declare function pathItemToCurve<Vec extends Vector3 | Vector2>(item: PathItem<Vec>, lastPoint?: Vec | null, continuous?: boolean): Curve<Vec> | null; /** * pathItem 转 曲线 * @param item * @param lastPoint * @param continuous - 是否生成连续的曲线;如果是,则会连接 lastPoint 和 曲线开始点 * @returns */ export declare function pathItemToCurves<Vec extends Vector3 | Vector2>(item: PathItem<Vec>, lastPoint?: Vec | null, continuous?: boolean): Curve<Vec>[]; export declare type PolylinePoints<Vec extends Vector3 | Vector2 = Vector3> = Vec[]; export declare type RecordToUniforms<U extends Record<string, any>> = { [K in keyof U]: IUniform<U[K]>; }; /** * uvDrawRange 在片元着色器中增加的代核心代码 */ export declare const uvDrawRange_fragment_mainReplace = "\nuniform bool invert;\nuniform bool enableURange;\nuniform bool enableVRange;\n\nuniform vec2 uvMax;\nuniform vec2 uvMin;\nvoid main() {\n bool isDiscard = false;\n #if defined(USE_MAP) || defined(USE_UV)\n vec2 rangeUV; \n #ifdef USE_MAP\n rangeUV = vMapUv;\n #else\n rangeUV = vUv;\n #endif\n bool xDiscard = enableURange && ( uvMin.x > rangeUV.x || rangeUV.x > uvMax.x);\n bool yDiscard = enableVRange && (uvMin.y > rangeUV.y || rangeUV.y > uvMax.y);\n isDiscard = xDiscard || yDiscard;\n #endif\n\n if (invert){\n isDiscard = !isDiscard;\n }\n if (isDiscard) discard;\n"; /** * uvDrawRange 的 shader 的修改器 * @remarks * Mender 都是用于 `createOnBeforeCompile` 方法的 * @param shader */ export declare function uvDrawRange_Mender(shader: Shader): void; /** * uvDrawRange 用于材质的 onBeforeCompile 函数 */ export declare const uvDrawRange_onBeforeCompile: OnBeforeCompile; /** * uvDrawRange 增加的 uniforms */ export declare const uvDrawRange_uniforms: { invert: boolean; enableURange: boolean; enableVRange: boolean; uvMax: Vector2; uvMin: Vector2; }; /** * 用于实现绘制指定uv范围的材质修改器 * @remarks * 材质被修改后可具备设置绘制指定uv范围 * @param material * @returns */ export declare function uvDrawRangeModifier<M extends Material>(material: M): ModifiedMaterial<M, { invert: boolean; enableURange: boolean; enableVRange: boolean; uvMax: Vector2; uvMin: Vector2; }>; export { }