import { Material, IUniform } from 'three';
import { PolyScene } from '../../../../../scene/PolyScene';
import { GlParamConfig, GlParamConfigJSON } from '../../utils/GLParamConfig';
import { ParamType } from '../../../../../poly/ParamType';
import { PolyDictionary } from '../../../../../../types/GlobalTypes';
import { IUniformTexture } from '../../../../utils/code/gl/Uniforms';
export interface OnBeforeCompileData {
    vertexShader: string;
    fragmentShader: string;
    paramConfigs: readonly GlParamConfig<ParamType>[];
    additionalTextureUniforms: PolyDictionary<IUniformTexture>;
    timeDependent: boolean;
    resolutionDependent: boolean;
    raymarchingLightsWorldCoordsDependent: boolean;
}
interface CloneOptions {
    clonedParamConfigName: string;
    clonedParamConfig?: GlParamConfig<ParamType>;
}
export declare function cloneOnBeforeCompileData(data: OnBeforeCompileData, options: CloneOptions): OnBeforeCompileData;
type RemoveParamConfigField<Type> = {
    [Property in keyof Type as Exclude<Property, 'paramConfigs' | 'additionalTextureUniforms'>]: Type[Property];
};
export interface OnBeforeCompileDataJSON extends RemoveParamConfigField<OnBeforeCompileData> {
    paramConfigs: GlParamConfigJSON<ParamType>[];
}
export declare function assignUniformViaUserData(material: Material, uniformName: string, newUniform: IUniformTexture): void;
export declare class MaterialUserDataUniforms {
    static getUniforms(material: Material): PolyDictionary<IUniform> | undefined;
    static setUniforms(material: Material, uniforms: PolyDictionary<IUniform>): void;
    static removeUniforms(material: Material): PolyDictionary<IUniform<any>> | undefined;
}
export declare function assignOnBeforeCompileDataAndFunction(scene: PolyScene, material: Material, data: OnBeforeCompileData): void;
interface CopyParams {
    src: Material;
    dest: Material;
    shareCustomUniforms: boolean;
}
export declare function copyOnBeforeCompileData(scene: PolyScene, params: CopyParams): void;
export declare class OnBeforeCompileDataHandler {
    static setData(material: Material, data: OnBeforeCompileData): void;
    static addAdditionalTexture(material: Material, uniformName: string, newUniform: IUniformTexture): void;
    static getData(material: Material): OnBeforeCompileData | undefined;
    static removeData(material: Material): OnBeforeCompileData | undefined;
}
export declare class OnBeforeCompileDataConverter {
    static toJSON(onBeforeCompileData: OnBeforeCompileData): OnBeforeCompileDataJSON;
    static fromJSON(json: OnBeforeCompileDataJSON): OnBeforeCompileData;
}
export {};
