import { AViewerPluginSync, ThreeViewer } from '../../viewer';
import { UiObjectConfig } from 'uiconfig.js';
import { IMaterial, PhysicalMaterial } from '../../core';
import { MaterialPreviewGenerator } from '../../three';
/**
 * Material Configurator Plugin (Base)
 *
 * This plugin allows you to create variations of materials mapped to material names or uuids in the scene.
 * These variations can be applied to the materials in the scene. (This copies the properties to the same material instances instead of assigning new materials)
 * The plugin interfaces with the picking plugin and also provides uiConfig to show and edit the variations.
 *
 * See `MaterialConfiguratorPlugin` in [plugin-configurator](https://threepipe.org/plugins/configurator/docs/index.html) for example on inheriting with a custom UI renderer.
 *
 * @category Plugins
 */
export declare class MaterialConfiguratorBasePlugin extends AViewerPluginSync<''> {
    enabled: boolean;
    static PluginType: string;
    private _picking;
    protected _previewGenerator: MaterialPreviewGenerator | undefined;
    private _uiNeedRefresh;
    constructor();
    onAdded(viewer: ThreeViewer): void;
    /**
     * Apply all variations(by selected index or first item) when a config is loaded
     */
    applyOnLoad: boolean;
    /**
     * Reapply all selected variations again.
     * Useful when the scene is loaded or changed and the variations are not applied.
     */
    reapplyAll(): void;
    fromJSON(data: any, meta?: any): this | Promise<this | null> | null;
    onRemove(viewer: ThreeViewer): void;
    findVariation(uuid?: string): MaterialVariations | undefined;
    getSelectedVariation(): MaterialVariations | undefined;
    /**
     * Apply a material variation based on index or uuid.
     * @param variations
     * @param matUuidOrIndex
     */
    applyVariation(variations: MaterialVariations, matUuidOrIndex: string | number): boolean;
    /**
     * Get the preview for a material variation
     * Should be called from preFrame ideally. (or preRender but set viewerSetDirty = false)
     * @param preview - Type of preview. Could be generate:sphere, generate:cube, color, map, emissive, etc.
     * @param material - Material or index of the material in the variation.
     * @param viewerSetDirty - call viewer.setDirty() after setting the preview. So that the preview is cleared from the canvas.
     */
    getPreview(material: IMaterial, preview: string, viewerSetDirty?: boolean): string;
    /**
     * Refreshes the UI in the next frame
     */
    refreshUi(): void;
    private _refreshUiConfig;
    protected _refreshUi(): Promise<boolean>;
    variations: MaterialVariations[];
    private _selectedMaterial;
    uiConfig: UiObjectConfig;
    removeVariationForMaterial(material: IMaterial): void;
    removeVariation(variation: MaterialVariations): void;
    addVariation(material?: IMaterial, variationKey?: string, cloneMaterial?: boolean): void;
    createVariation(material: IMaterial, variationKey?: string): MaterialVariations;
}
export interface MaterialVariations {
    /**
     * The name or the uuid of the material in the scene
     */
    uuid: string;
    /**
     * Title to show in the UI
     */
    title: string;
    preview: keyof PhysicalMaterial | 'generate:sphere' | 'generate:cube' | 'generate:cylinder';
    materials: IMaterial[];
    data?: {
        icon?: string;
        [key: string]: any;
    }[];
    selectedIndex?: number;
}
//# sourceMappingURL=MaterialConfiguratorBasePlugin.d.ts.map