import { Color, Material, Texture } from 'three';
import { GeometryType } from '../batching/Batch.js';
import { type TreeNode } from '../tree/WorldTree.js';
import { NodeRenderView } from '../tree/NodeRenderView.js';
import { SpeckleMaterial } from './SpeckleMaterial.js';
import { type MaterialOptions } from '../../IViewer.js';
export interface RenderMaterial extends MinimalMaterial {
    id: string;
    emissive: number;
    opacity: number;
    roughness: number;
    metalness: number;
    vertexColors: boolean;
}
export interface DisplayStyle extends MinimalMaterial {
    id: string;
    lineWeight: number;
    opacity?: number;
}
export interface MinimalMaterial {
    color: number;
}
export declare enum FilterMaterialType {
    GHOST = 0,
    GRADIENT = 1,
    COLORED = 2,
    HIDDEN = 3
}
/** TO DO: This still sucks */
export interface FilterMaterial {
    filterType: FilterMaterialType;
    rampIndex?: number;
    rampIndexColor?: Color;
    rampTexture?: Texture;
}
export interface FilterMaterialOptions {
    rampIndex?: number;
    rampIndexColor?: Color;
    rampTexture?: Texture;
    rampWidth?: number;
}
export default class Materials {
    static readonly UNIFORM_VECTORS_USED = 33;
    static readonly DEFAULT_ARTIFICIAL_ROUGHNESS = 0.6; /** The inverse of "shininess" */
    private readonly materialMap;
    private meshGhostMaterial;
    private meshGradientMaterial;
    private meshTransparentGradientMaterial;
    private meshColoredMaterial;
    private meshTransparentColoredMaterial;
    private meshHiddenMaterial;
    private lineGhostMaterial;
    private lineColoredMaterial;
    private lineHiddenMaterial;
    private pointGhostMaterial;
    private pointCloudColouredMaterial;
    private pointCloudGradientMaterial;
    private textGhostMaterial;
    private textColoredMaterial;
    private textGradientMaterial;
    private textHiddenMaterial;
    private defaultGradientTextureData;
    private static readonly NullRenderMaterialHash;
    private static readonly NullRenderMaterialVertexColorsHash;
    private static readonly NullDisplayStyleHash;
    private static readonly NullTextDisplayStyle;
    private static readonly NullPointMaterialHash;
    private static readonly NullPointCloudMaterialHash;
    private static readonly NullPointCloudVertexColorsMaterialHash;
    private static readonly NullRenderMaterialInstancedHash;
    private static readonly NullRenderMaterialInstancedVertexColorHash;
    static renderMaterialFromNode(materialNode: TreeNode | null, geometryNode: TreeNode | null): RenderMaterial | null;
    static displayStyleFromNode(node: TreeNode | null): DisplayStyle | null;
    static colorMaterialFromNode(node: TreeNode | null): MinimalMaterial | null;
    static fastCopy(from: Material, to: Material): void;
    private static renderMaterialToString;
    private static displayStyleToString;
    private static minimalMaterialToString;
    private static hashCode;
    static isMaterialInstance(material: Material | FilterMaterial | RenderMaterial | DisplayStyle): material is Material;
    static isFilterMaterial(material: Material | FilterMaterial | RenderMaterial | DisplayStyle): material is FilterMaterial;
    static isRenderMaterial(materialData: Material | FilterMaterial | RenderMaterial | DisplayStyle | MaterialOptions): materialData is RenderMaterial;
    static isDisplayStyle(materialData: Material | FilterMaterial | RenderMaterial | DisplayStyle | MaterialOptions): materialData is DisplayStyle;
    static getMaterialHash(renderView: NodeRenderView, materialData?: RenderMaterial | DisplayStyle | MaterialOptions | null): number;
    static isTransparent(material: Material): boolean;
    static isOpaque(material: Material): boolean;
    static isSpeckleMaterial(material: Material): material is SpeckleMaterial & Material;
    private createDefaultMeshMaterials;
    private createLineDefaultMaterials;
    private createDefaultPointMaterials;
    private createDefaultTextMaterials;
    private createDefaultNullMaterials;
    createDefaultMaterials(): Promise<void>;
    private makeMeshMaterial;
    private makeLineMaterial;
    private makePointMaterial;
    private makeTextMaterial;
    getMaterial(hash: number, material: RenderMaterial | DisplayStyle | MinimalMaterial | null, type: GeometryType): Material;
    private getMeshMaterial;
    private getLineMaterial;
    private getPointMaterial;
    private getPointCloudMaterial;
    private getTextMaterial;
    getGhostMaterial(renderView: NodeRenderView, filterMaterial?: FilterMaterial): Material | null;
    getGradientMaterial(renderView: NodeRenderView, filterMaterial?: FilterMaterial): Material | null;
    getColoredMaterial(renderView: NodeRenderView, filterMaterial?: FilterMaterial): Material | null;
    getHiddenMaterial(renderView: NodeRenderView, filterMaterial?: FilterMaterial): Material | null;
    getFilterMaterial(renderView: NodeRenderView, filterMaterial: FilterMaterial): Material | null;
    getDataMaterial(renderView: NodeRenderView, materialData: RenderMaterial & DisplayStyle & MaterialOptions): Material;
    getFilterMaterialOptions(filterMaterial: FilterMaterial): FilterMaterialOptions | null;
    purge(): void;
}
