import type { Geometry, Engine, VFXItem, SkinProps } from '@galacean/effects'; import { Texture } from '@galacean/effects'; import { Matrix4 } from './math'; import { PObject } from './object'; /** * 纹理数据模式,包含浮点和半精度浮点 */ export declare enum TextureDataMode { none = 0, float = 1, half_float = 2 } /** * 蒙皮类,支持蒙皮动画 */ export declare class PSkin extends PObject { /** * 场景树父元素 */ rootBoneItem?: VFXItem; /** * 骨骼索引 */ skeleton: number; /** * 关节索引 */ jointItem: VFXItem[]; /** * 逆绑定矩阵 */ inverseBindMatrices: Matrix4[]; /** * 动画矩阵 */ animationMatrices: Matrix4[]; /** * 纹理数据模式 */ textureDataMode: TextureDataMode; /** * 最大骨骼数目 */ maxJointCount: number; /** * 创建蒙皮对象 * @param props - 蒙皮相关数据 * @param engine - 引擎对象 * @param rootBoneItem - 场景树父元素 */ create(props: SkinProps, engine: Engine, rootBoneItem: VFXItem, maxJointCount: number): void; /** * 更新蒙皮矩阵 */ updateSkinMatrices(): void; /** * 计算 Mesh 的动画矩阵 * @param worldMatrix - 世界矩阵 * @param matrixList - 矩阵列表 * @param normalMatList - 法线矩阵列表 */ computeMeshAnimMatrices(worldMatrix: Matrix4, matrixList: Float32Array, normalMatList: Float32Array): void; /** * 更新父元素 * @param parentItem - 场景树父元素 */ updateParentItem(parentItem: VFXItem): void; /** * 获取关节点数 * @returns */ getJointCount(): number; /** * 是否纹理数据模式 * @returns */ isTextureDataMode(): boolean; /** * 销毁 */ dispose(): void; private getTextureDataMode; private getJointItems; private genNodeName; private genNodeNameDFS; } /** * Morph 动画类 * 保存了动画状态相关的数据,包括 weights 数组数据 * 增加了状态数据的检查,保证数据的正确性 * Morph 动画非常消耗内存,谨慎使用。 */ export declare class PMorph extends PObject { /** * weights 数组的长度,shader 中和更新的时候会用到 * 范围要在 `[0, 8]` 之间,否则会报错。 */ morphWeightsLength: number; /** * weights 数组的具体数据,来自动画控制器的每帧更新 * 数组的长度必须和 morphWeightsLength 相同,否则会出错。 */ morphWeightsArray: number[]; /** * 是否有 Position 相关的 Morph 动画,shader 中需要知道 */ hasPositionMorph: boolean; /** * 是否有 Normal 相关的 Morph 动画,shader 中需要知道 */ hasNormalMorph: boolean; /** * 是否有 Tangent 相关的 Morph 动画,shader 中需要知道 */ hasTangentMorph: boolean; /** * 通过 Geometry 数据创建 Morph 动画相关状态,并进行必要的正确性检查 * @param geometry - Mesh 的几何体,是否包含 Morph 动画都是可以的 * @returns 是否创建成功 */ create(geometry: Geometry): boolean; /** * 初始化 Morph target 的权重数组 * @param weights - glTF Mesh 的权重数组,长度必须严格一致 */ initWeights(weights: number[]): void; updateWeights(weights: number[]): void; /** * 当前状态是否有 Morph 动画: * 需要判断 weights 数组长度,以及 Position、Normal 和 Tangent 是否有动画 * @returns 返回是否有 Morph 动画 */ hasMorph(): boolean; /** * 两个 Morph 动画状态是否相等: * 这里只比较初始状态是否一样,不考虑 weights 数组的情况,提供给 Mesh 进行 Geometry 检查使用 * @param morph - Morph 动画状态对象 * @returns 返回两个 Morph 动画状态是否相等 */ equals(morph: PMorph): boolean; getMorphWeightsArray(): number[]; /** * 统计 Geometry 中 Attribute 名称个数: * 主要用于统计 Morph 动画中新增的 Attribute 名称的个数,会作为最终的 weights 数组长度使用 * @param attributeNameList - Attribute 名数组列表,只与 Morph Target 中的属性有关 * @param geometry - Geometry 对象,是否有 Morph 动画都可以 * @returns 存在的 Attribute 名称数目 */ getAttributeMorphCount(attributeNameList: string[], geometry: Geometry): number; /** * Morph 动画中 Position 相关的 Attribute 名称 */ private static positionNameList; /** * Morph 动画中 Normal 相关的 Attribute 名称 */ private static normalNameList; /** * Morph 动画中 Tangent 相关的 Attribute 名称 */ private static tangentNameList; } /** * 动画插值类型 */ export declare enum PAnimInterpType { linear = 0, step = 1, cubicSpline = 2 } /** * 动画路径类型 */ export declare enum PAnimPathType { translation = 0, rotation = 1, scale = 2, weights = 3 } /** * 动画纹理类 */ export declare class PAnimTexture { private engine; private isHalfFloat; private width; private height; private buffer?; private texture?; constructor(engine: Engine); /** * 创建动画纹理对象 * @param jointCount - 骨骼数目 * @param isHalfFloat - 是否半浮点精度 * @param name - 名称 */ create(jointCount: number, isHalfFloat: boolean, name: string): void; /** * 更新动画数据 * @param buffer - 新的动画数据 */ update(buffer: Float32Array): void; /** * 销毁 */ dispose(): void; /** * 获取纹理大小 * @returns */ getSize(): number; /** * 获取纹理对象 * @returns */ getTexture(): Texture; }