import type { Texture, Material } from '@galacean/effects';
import { spec } from '@galacean/effects';
import type { MacroInfo } from '../index';
import type { Matrix3 } from './math';
import { Vector3, Vector4, Color } from './math';
import { PMaterialType } from './common';
import { PObject } from './object';
/**
 * 3D 材质基础类，支持公共的材质功能
 */
export declare abstract class PMaterialBase extends PObject {
    effectMaterial: Material;
    /**
     * 材质类型，主要是 pbr 和 unlit 两类
     */
    materialType: PMaterialType;
    /**
     * 顶点着色器代码
     */
    vertexShaderCode: string;
    /**
     * 片段着色器代码
     */
    fragmentShaderCode: string;
    /**
     * 深度是否写入，默认是写入
     */
    ZWrite: boolean;
    /**
     * 是否深度测试提示，默认开启
     */
    ZTest: boolean;
    /**
     * 渲染类型，默认是不透明
     */
    renderType: spec.RenderType;
    /**
     * 是否 Alpha 裁剪，默认关闭
     */
    alphaClip: boolean;
    /**
     * Alpha 测试截断值
     */
    alphaCutoff: number;
    /**
     * 面侧模式，默认是正面
     */
    renderFace: spec.RenderFace;
    /**
     * 获取着色器特性列表，根据材质状态
     * @returns 特性列表
     */
    getShaderFeatures(): string[];
    getShaderMacros(): MacroInfo[];
    /**
     * 根据材质状态，更新 GE 材质状态
     * @param material - GE 材质
     */
    updateUniforms(material: Material): void;
    /**
     * 生成顶点和片段着色器代码
     * 先获取着色器特性，再根据材质和全局状态，生成着色器代码
     * @param inFeatureList - 外部特性列表
     */
    build(inFeatureList?: string[]): void;
    getFeatureList(inFeatureList?: string[]): string[];
    getMacroList(inMacroList?: MacroInfo[]): MacroInfo[];
    /**
     * 设置材质状态，根据 GE 材质状态
     * @param material - GE 材质
     */
    setMaterialStates(material: Material): void;
    protected setFaceSideStates(material: Material): void;
    /**
     * 销毁材质，清除着色器代码
     */
    dispose(): void;
    /**
     * 是否合法，材质类型非 none
     * @returns
     */
    isValid(): boolean;
    /**
     * 是否不透明
     * @returns
     */
    isOpaque(): boolean;
    /**
     * 是否 Alpha 裁剪
     * @returns
     */
    isAlphaClip(): boolean;
    /**
     * 是否半透明
     * @returns
     */
    isTransparent(): boolean;
    /**
     * 是否正面模式
     * @returns
     */
    isFrontSide(): boolean;
    /**
     * 是否背面模式
     * @returns
     */
    isBackSide(): boolean;
    /**
     * 是否双面模式
     * @returns
     */
    isBothSide(): boolean;
}
/**
 * 无光照材质类，负责无关照或者不接受光照情况下的物体材质效果
 */
export declare class PMaterialUnlit extends PMaterialBase {
    /**
     * 基础颜色纹理
     */
    baseColorTexture?: Texture;
    /**
     * 基础颜色纹理变换
     */
    baseColorTextureTrans: Matrix3;
    /**
     * 基础颜色值，默认是白色 Color(1, 1, 1, 1)
     */
    baseColorFactor: Color;
    /**
     * 创建无光照材质，支持基础颜色纹理
     * @param material - effect 材质对象
     */
    create(material: Material): void;
    /**
     * 销毁材质
     */
    dispose(): void;
    /**
     * 获取着色器特性列表，根据材质状态
     * @returns 着色器特性列表
     */
    getShaderFeatures(): string[];
    getShaderMacros(): MacroInfo[];
    /**
     * 更新对应的 GE 材质中着色器的 Uniform 数据
     * @param material - GE 材质
     */
    updateUniforms(material: Material): void;
    /**
     * 是否有基础颜色纹理
     * @returns
     */
    hasBaseColorTexture(): boolean;
    /**
     * 获取基础颜色纹理
     * @returns
     */
    getBaseColorTexture(): Texture;
    /**
     * 设置基础颜色纹理
     * @param val - 纹理对象
     */
    setBaseColorTexture(val: Texture): void;
    /**
     * 获取基础颜色纹理
     * @returns
     */
    getBaseColorFactor(): Color;
    /**
     * 设置基础颜色值
     * @param val - 颜色值
     */
    setBaseColorFactor(val: Color | Vector4 | spec.vec4): void;
}
/**
 * PBR 材质类，负责基于物理的材质效果，也是渲染中最常用的材质。
 * 目前支持金属度/粗糙度工作流，与其他引擎中的 PBR 材质功能一致。
 */
export declare class PMaterialPBR extends PMaterialBase {
    /**
     * 基础颜色纹理
     */
    baseColorTexture?: Texture;
    /**
     * 基础颜色纹理变换
     */
    baseColorTextureTrans: Matrix3;
    /**
     * 基础颜色值，默认是白色 Color(1, 1, 1, 1)
     */
    baseColorFactor: Color;
    /**
     * 金属度粗超度纹理
     */
    metallicRoughnessTexture?: Texture;
    /**
     * 金属度粗超度纹理变换
     */
    metallicRoughnessTextureTrans: Matrix3;
    /**
     * 是否高光抗锯齿，能够明显提升高光表现效果
     */
    useSpecularAA: boolean;
    /**
     * 金属度值
     */
    metallicFactor: number;
    /**
     * 粗超度值
     */
    roughnessFactor: number;
    /**
     * 法线纹理
     */
    normalTexture?: Texture;
    /**
     * 法线纹理变换
     */
    normalTextureTrans: Matrix3;
    /**
     * 法线纹理缩放
     */
    normalTextureScale: number;
    /**
     * AO 纹理
     */
    occlusionTexture?: Texture;
    /**
     * AO 纹理变换
     */
    occlusionTextureTrans: Matrix3;
    /**
     * AO 纹理强度
     */
    occlusionTextureStrength: number;
    /**
     * 自发光纹理
     */
    emissiveTexture?: Texture;
    /**
     * 自发光纹理变换
     */
    emissiveTextureTrans: Matrix3;
    /**
     * 自发光颜色值，默认是黑色 Vector4(0, 0, 0, 0)
     */
    emissiveFactor: Color;
    /**
     * 自发光强度
     */
    emissiveIntensity: number;
    /**
     * 创建材质
     * @param material - effect 材质对象
     */
    create(material: Material): void;
    /**
     * 销毁材质
     */
    dispose(): void;
    /**
     * 获取材质特性列表
     * @returns 材质特性列表
     */
    getShaderFeatures(): string[];
    getShaderMacros(): MacroInfo[];
    /**
     * 更新关联的 GE 材质中着色器的 Uniform 数据
     * @param material - GE 材质
     */
    updateUniforms(material: Material): void;
    /**
     * 是否有基础颜色纹理
     * @returns
     */
    hasBaseColorTexture(): boolean;
    /**
     * 设置基础颜色纹理
     * @param val - 纹理
     */
    setBaseColorTexture(val: Texture): void;
    /**
     * 获取基础颜色纹理
     * @returns
     */
    getBaseColorFactor(): Color;
    /**
     * 设置基础颜色值
     * @param val - 颜色值
     */
    setBaseColorFactor(val: Color | Vector4 | spec.vec4): void;
    /**
     * 是否有金属度粗超度纹理
     * @returns
     */
    hasMetallicRoughnessTexture(): boolean;
    /**
     * 获取金属度粗超度纹理
     * @returns
     */
    getMetallicRoughnessTexture(): Texture;
    /**
     * 设置金属度粗超度纹理
     * @param val - 纹理
     */
    setMetallicRoughnessTexture(val: Texture): void;
    /**
     * 是否有法线纹理
     * @returns
     */
    hasNormalTexture(): boolean;
    /**
     * 获取法线纹理
     * @returns
     */
    getNormalTexture(): Texture;
    /**
     * 设置法线纹理
     * @param val - 纹理
     */
    setNormalTexture(val: Texture): void;
    /**
     * 是否有遮挡纹理
     * @returns
     */
    hasOcclusionTexture(): boolean;
    /**
     * 获取遮挡纹理
     * @returns
     */
    getOcclusionTexture(): Texture;
    /**
     * 设置遮挡纹理
     * @param val - 纹理
     */
    setOcclusionTexture(val: Texture): void;
    /**
     * 是否有自发光纹理
     * @returns
     */
    hasEmissiveTexture(): boolean;
    /**
     * 获取自发光纹理
     * @returns
     */
    getEmissiveTexture(): Texture;
    /**
     * 设置自发光纹理
     * @param val - 纹理
     */
    setEmissiveTexture(val: Texture): void;
    /**
     * 是否有自发光值，包含强度
     * @returns
     */
    hasEmissiveValue(): boolean;
    /**
     * 获取自发光颜色
     * @returns
     */
    getEmissiveFactor(): Color;
    /**
     * 设置自发光颜色
     * @param val - 颜色
     */
    setEmissiveFactor(val: Color | Vector3 | spec.vec3): void;
    /**
     * 获取自发光强度
     * @returns
     */
    getEmissiveIntensity(): number;
    /**
     * 设置自发光强度
     * @param val - 强度
     */
    setEmissiveIntensity(val: number): void;
}
/**
 * 材质类型，包括无光照材质和 PBR 材质
 */
export type PMaterial = PMaterialUnlit | PMaterialPBR;
/**
 * 创建插件材质对象
 * @param material - Effects 材质对象
 * @returns 材质对象
 */
export declare function createPluginMaterial(material: Material): PMaterial;
