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;
}
