@three3d/effect
Version:
@three3d/effect 提供了 ThreeJS 的特效
855 lines (800 loc) • 24.9 kB
TypeScript
/**
* 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 { }